diff options
| author | Paul Gilbert | 2015-02-19 21:12:33 -0500 | 
|---|---|---|
| committer | Paul Gilbert | 2015-02-19 21:12:33 -0500 | 
| commit | b66bf1a838b01181c93b19e214c59c810e05955d (patch) | |
| tree | 106d47ce5f8ff68fa04e26b8f9276d2156ef34d8 | |
| parent | 7c3f373b9b935b71b3006f203a1f75442818673a (diff) | |
| download | scummvm-rg350-b66bf1a838b01181c93b19e214c59c810e05955d.tar.gz scummvm-rg350-b66bf1a838b01181c93b19e214c59c810e05955d.tar.bz2 scummvm-rg350-b66bf1a838b01181c93b19e214c59c810e05955d.zip | |
XEEN: Implemented stopAttack
| -rw-r--r-- | engines/xeen/combat.cpp | 106 | ||||
| -rw-r--r-- | engines/xeen/combat.h | 2 | 
2 files changed, 103 insertions, 5 deletions
| diff --git a/engines/xeen/combat.cpp b/engines/xeen/combat.cpp index 7ed349906d..a9ead958a8 100644 --- a/engines/xeen/combat.cpp +++ b/engines/xeen/combat.cpp @@ -568,15 +568,113 @@ void Combat::attackMonster(int monsterId) {  } -bool Combat::stopAttack(const Common::Point &diffPt) { +int Combat::stopAttack(const Common::Point &diffPt) {  	Map &map = *_vm->_map; +	Party &party = *_vm->_party; +	Direction dir = party._mazeDirection; +	const Common::Point &mazePos = party._mazePosition;  	if (map._isOutdoors) { +		if (diffPt.x > 0) { +			for (int x = 1; x <= diffPt.x; ++x) { +				int v = map.mazeLookup(Common::Point(mazePos.x + x, mazePos.y), 0, 8); +				if (v) +					return 0; +			} +			return (dir == DIR_EAST) ? diffPt.x + 1 : 1; + +		} else if (diffPt.x < 0) { +			for (int x = diffPt.x; x < 0; ++x) { +				int v = map.mazeLookup(Common::Point(mazePos.x + x, mazePos.y), 4); +				switch (v) { +				case 0: +				case 2: +				case 4: +				case 5: +				case 8: +				case 11: +				case 13: +				case 14: +					break; +				default: +					return 0; +				} +			} +			return dir == DIR_WEST ? diffPt.x * -1 + 1 : 1; +		 +		} else if (diffPt.y <= 0) { +			for (int y = diffPt.y; y < 0; ++y) { +				int v = map.mazeLookup(Common::Point(mazePos.x, mazePos.y + y), 4); +				switch (v) { +				case 0: +				case 2: +				case 4: +				case 5: +				case 8: +				case 11: +				case 13: +				case 14: +					break; +				default: +					return 0; +				} +			} +			return party._mazeDirection == DIR_SOUTH ? diffPt.y * -1 + 1 : 1; -	} +		} else { +			for (int y = 1; y <= diffPt.y; ++y) { +				int v = map.mazeLookup(Common::Point(mazePos.x, mazePos.y + y), 4); +				switch (v) { +				case 0: +				case 2: +				case 4: +				case 5: +				case 8: +				case 11: +				case 13: +				case 14: +					break; +				default: +					return 0; +				} +			} +			return dir == DIR_NORTH ? diffPt.y + 1 : 1; +		} +	} else { +		// Indoors +		if (diffPt.x > 0) { +			for (int x = 1; x <= diffPt.x; ++x) { +				int v = map.mazeLookup(Common::Point(mazePos.x + x, mazePos.y), 0, 8); +				if (v) +					return 0; +			} +			return dir == DIR_EAST ? diffPt.x + 1 : 1; -	// TODO -	return false; +		} else if (diffPt.x < 0) { +			for (int x = diffPt.x; x < 0; ++x) { +				int v = map.mazeLookup(Common::Point(mazePos.x + x, mazePos.y), 0, 0x800); +				if (v) +					return 0; +			} +			return dir == DIR_WEST ? diffPt.x * -1 + 1 : 1; +		 +		} else if (diffPt.y <= 0) { +			for (int y = diffPt.y; y < 0; ++y) { +				int v = map.mazeLookup(Common::Point(mazePos.x, mazePos.y + y), 0, 0x8000); +				if (v) +					return 0; +			} +			return dir == DIR_SOUTH ? diffPt.y * -1 + 1 : 1; + +		} else { +			for (int y = 1; y <= diffPt.y; ++y) { +				int v = map.mazeLookup(Common::Point(mazePos.x, mazePos.y + y), 0, 0x80); +				if (v) +					return 0; +			} +			return dir == DIR_NORTH ? diffPt.y + 1 : 1; +		} +	}  }  /** diff --git a/engines/xeen/combat.h b/engines/xeen/combat.h index 5ff6beb16b..b9293233e7 100644 --- a/engines/xeen/combat.h +++ b/engines/xeen/combat.h @@ -99,7 +99,7 @@ public:  	void monsterOvercome(); -	bool stopAttack(const Common::Point &diffPt); +	int stopAttack(const Common::Point &diffPt);  public:  	Combat(XeenEngine *vm); | 
