diff options
| author | Eugene Sandulenko | 2015-12-24 14:12:19 +0100 | 
|---|---|---|
| committer | Eugene Sandulenko | 2015-12-27 15:41:01 +0100 | 
| commit | f76eb1831cce8177a3cc477fb1e5d4954635f982 (patch) | |
| tree | 8143b0b71bbcdbc36c5b7d8ec9008719ce73ebed | |
| parent | 88faad5d08bc10272f04ebc1ce122b8b446d31a8 (diff) | |
| download | scummvm-rg350-f76eb1831cce8177a3cc477fb1e5d4954635f982.tar.gz scummvm-rg350-f76eb1831cce8177a3cc477fb1e5d4954635f982.tar.bz2 scummvm-rg350-f76eb1831cce8177a3cc477fb1e5d4954635f982.zip | |
WAGE: Implemented object taking logic
| -rw-r--r-- | engines/wage/entities.cpp | 37 | ||||
| -rw-r--r-- | engines/wage/entities.h | 14 | ||||
| -rw-r--r-- | engines/wage/script.cpp | 31 | ||||
| -rw-r--r-- | engines/wage/script.h | 1 | ||||
| -rw-r--r-- | engines/wage/world.cpp | 4 | ||||
| -rw-r--r-- | engines/wage/world.h | 1 | 
6 files changed, 76 insertions, 12 deletions
| diff --git a/engines/wage/entities.cpp b/engines/wage/entities.cpp index e6ce4e9e5a..15fbbb99a7 100644 --- a/engines/wage/entities.cpp +++ b/engines/wage/entities.cpp @@ -192,6 +192,9 @@ Chr::Chr(String name, Common::SeekableReadStream *data) {  	_weaponSound1 = readPascalString(data);  	_weaponSound2 = readPascalString(data); + +	for (int i = 0; i < NUMBER_OF_ARMOR_TYPES; i++) +		_armor[i] = NULL;  }  WeaponArray *Chr::getWeapons() { @@ -202,4 +205,38 @@ WeaponArray *Chr::getWeapons() {  	return list;  } +int Chr::wearObjIfPossible(Obj *obj) { +	switch (obj->_type) { +	case Obj::HELMET: +		if (_armor[HEAD_ARMOR] == NULL) { +			_armor[HEAD_ARMOR] = obj; +			return Chr::HEAD_ARMOR; +		} +		break; +	case Obj::CHEST_ARMOR: +		if (_armor[BODY_ARMOR] == NULL) { +			_armor[BODY_ARMOR] = obj; +			return Chr::BODY_ARMOR; +		} +		break; +	case Obj::SHIELD: +		if (_armor[SHIELD_ARMOR] == NULL) { +			_armor[SHIELD_ARMOR] = obj; +			return Chr::SHIELD_ARMOR; +		} +		break; +	case Obj::SPIRITUAL_ARMOR: +		if (_armor[MAGIC_ARMOR] == NULL) { +			_armor[MAGIC_ARMOR] = obj; +			return Chr::MAGIC_ARMOR; +		} +		break; +	default: +		return -1; +	} + +	return -1; +} + +  } // End of namespace Wage diff --git a/engines/wage/entities.h b/engines/wage/entities.h index eb3609c7ff..28ce42a365 100644 --- a/engines/wage/entities.h +++ b/engines/wage/entities.h @@ -60,7 +60,7 @@ typedef Common::Array<Weapon *> WeaponArray;  class Context {  public: -	enum StatVariables { +	enum StatVariable {  	/** The base physical accuracy of the player. */  		PHYS_ACC_BAS = 0,  	/** The current physical accuracy of the player. */ @@ -141,7 +141,9 @@ public:  	enum ChrArmorType {  		HEAD_ARMOR = 0,  		BODY_ARMOR = 1, -		SHIELD_ARMOR = 2 +		SHIELD_ARMOR = 2, +		MAGIC_ARMOR = 3, +		NUMBER_OF_ARMOR_TYPES = 4  	};  	Chr(String name, Common::SeekableReadStream *data); @@ -201,7 +203,7 @@ public:  	Scene *_currentScene;  	Common::List<Obj> _inventory; -	Obj *_armor[3]; +	Obj *_armor[NUMBER_OF_ARMOR_TYPES];  	Context _context; @@ -276,6 +278,7 @@ public:  	bool hasNativeWeapon2() {  		return (_nativeWeapon2.size() > 0 && _operativeVerb2.size() > 0);  	} +	int wearObjIfPossible(Obj *obj);  };  class Weapon { @@ -301,7 +304,7 @@ public:  	Obj() : _currentOwner(NULL), _currentScene(NULL) {}  	Obj(String name, Common::SeekableReadStream *data); -	enum ObjectTypes { +	enum ObjectType {  		REGULAR_WEAPON = 1,  		THROW_WEAPON = 2,  		MAGICAL_OBJECT = 3, @@ -313,7 +316,7 @@ public:  		IMMOBILE_OBJECT = 9  	}; -	enum AttackTypes { +	enum AttackType {  		CAUSES_PHYSICAL_DAMAGE = 0,  		CAUSES_SPIRITUAL_DAMAGE = 1,  		CAUSES_PHYSICAL_AND_SPIRITUAL_DAMAGE = 2, @@ -350,7 +353,6 @@ public:  		if (currentScene != NULL)  			_currentOwner = NULL;  	} -  };  class Scene : public Designed { diff --git a/engines/wage/script.cpp b/engines/wage/script.cpp index 5ef1b6e209..dcb993a2a9 100644 --- a/engines/wage/script.cpp +++ b/engines/wage/script.cpp @@ -178,16 +178,14 @@ bool Script::execute(World *world, int loopCount, String *inputText, Designed *i  			delete weapons;  		} -/*  	// TODO: weapons, offer, etc... -	} else if (inputClick instanceof Obj) { -		Obj obj = (Obj) inputClick; -		if (obj.getType() != Obj.IMMOBILE_OBJECT) { +	} else if (_inputClick->_classType == OBJ) { +		Obj *obj = (Obj *)_inputClick; +		if (obj->_type != Obj::IMMOBILE_OBJECT) {  			takeObj(obj);  		} else { -			appendText(obj.getClickMessage()); +			appendText(obj->_clickMessage);  		} -*/  	}  	return _handled; @@ -737,6 +735,27 @@ bool Script::evalClickCondition(Operand *lhs, const char *op, Operand *rhs) {  	return false;  } +void Script::takeObj(Obj *obj) { +	if (_world->_player->_inventory.size() >= _world->_player->_maximumCarriedObjects) { +		appendText("Your pack is full, you must drop something."); +	} else { +		_world->move(obj, _world->_player); +		int type = _world->_player->wearObjIfPossible(obj); +		if (type == Chr::HEAD_ARMOR) { +			appendText(String("You are now wearing the ") + obj->_name + "."); +		} else if (type == Chr::BODY_ARMOR) { +			appendText(String("You are now wearing the ") + obj->_name + "."); +		} else if (type == Chr::SHIELD_ARMOR) { +			appendText(String("You are now wearing the ") + obj->_name + "."); +		} else if (type == Chr::MAGIC_ARMOR) { +			appendText(String("You are now wearing the ") + obj->_name + "."); +		} else { +			appendText(String("You now have the ") + obj->_name + "."); +		} +		appendText(obj->_clickMessage); +	} +} +  void Script::processMove() {  	warning("STUB: processMove");  } diff --git a/engines/wage/script.h b/engines/wage/script.h index b9249c33c6..77b6d7d17e 100644 --- a/engines/wage/script.h +++ b/engines/wage/script.h @@ -150,6 +150,7 @@ private:  	bool eval(Operand *lhs, const char *op, Operand *rhs);  	Operand *convertOperand(Operand *operand, int type);  	bool evalClickCondition(Operand *lhs, const char *op, Operand *rhs); +	void takeObj(Obj *obj);  	void processMove();  	void processLet(); diff --git a/engines/wage/world.cpp b/engines/wage/world.cpp index 96f3faf618..b404736d00 100644 --- a/engines/wage/world.cpp +++ b/engines/wage/world.cpp @@ -350,4 +350,8 @@ Common::String *World::loadStringFromDITL(Common::MacResManager *resMan, int res  	return NULL;  } +void World::move(Obj *obj, Chr *chr) { +	warning("STUB: World::move()"); +} +  } // End of namespace Wage diff --git a/engines/wage/world.h b/engines/wage/world.h index 8e45dcbee5..15a65d8681 100644 --- a/engines/wage/world.h +++ b/engines/wage/world.h @@ -60,6 +60,7 @@ public:  	bool loadWorld(Common::MacResManager *resMan);  	void loadExternalSounds(String fname);  	Common::String *loadStringFromDITL(Common::MacResManager *resMan, int resourceId, int itemIndex); +	void move(Obj *obj, Chr *chr);  	String _name;  	String _aboutMessage; | 
