diff options
| author | Sven Hesse | 2009-07-05 21:40:51 +0000 | 
|---|---|---|
| committer | Sven Hesse | 2009-07-05 21:40:51 +0000 | 
| commit | edfaf7bc3c770c008be81f9ccb26835185d7d7d5 (patch) | |
| tree | 6504408a41c6c7041e604aa6cff0f3c80a10f420 | |
| parent | 29e97533c1b884e231feb01ed99fd8ae17a3564d (diff) | |
| download | scummvm-rg350-edfaf7bc3c770c008be81f9ccb26835185d7d7d5.tar.gz scummvm-rg350-edfaf7bc3c770c008be81f9ccb26835185d7d7d5.tar.bz2 scummvm-rg350-edfaf7bc3c770c008be81f9ccb26835185d7d7d5.zip  | |
Added an enum for the hotspot states
svn-id: r42155
| -rw-r--r-- | engines/gob/hotspots.cpp | 122 | ||||
| -rw-r--r-- | engines/gob/hotspots.h | 23 | ||||
| -rw-r--r-- | engines/gob/inter_v2.cpp | 10 | ||||
| -rw-r--r-- | engines/gob/inter_v6.cpp | 11 | 
4 files changed, 111 insertions, 55 deletions
diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp index f2116209d7..f97e2a7f9c 100644 --- a/engines/gob/hotspots.cpp +++ b/engines/gob/hotspots.cpp @@ -119,7 +119,7 @@ bool Hotspots::Hotspot::isActiveInput() const {  	if (isEnd())  		return false; -	if ((getState() & 0xC) != 0x8) +	if (!isFilledEnabled())  		return false;  	if (!isInput()) @@ -128,6 +128,22 @@ bool Hotspots::Hotspot::isActiveInput() const {  	return true;  } +bool Hotspots::Hotspot::isFilled() const { +	return getState() & kStateFilled; +} + +bool Hotspots::Hotspot::isFilledEnabled() const { +	return (getState() & kStateFilledDisabled) == kStateFilled; +} + +bool Hotspots::Hotspot::isFilledNew() const { +	return getState() == kStateFilled; +} + +bool Hotspots::Hotspot::isDisabled() const { +	return getState() & kStateDisabled; +} +  bool Hotspots::Hotspot::isIn(uint16 x, uint16 y) const {  	if (x < left)  		return false; @@ -156,6 +172,14 @@ bool Hotspots::Hotspot::buttonMatch(MouseButtons button) const {  	return false;  } +void Hotspots::Hotspot::disable() { +	id |= (kStateDisabled << 12); +} + +void Hotspots::Hotspot::enable() { +	id &= ~(kStateDisabled << 12); +} +  Hotspots::Hotspots(GobEngine *vm) : _vm(vm) {  	_hotspots = new Hotspot[kHotspotCount]; @@ -203,9 +227,10 @@ uint16 Hotspots::add(const Hotspot &hotspot) {  		if (! (spot.isEnd() || (spot.id == hotspot.id)))  			continue; -		// When updating, keep bit 0x4000 intact +		// When updating, keep disabled state intact  		uint16 id = hotspot.id; -		if ((spot.id & 0xBFFF) == (hotspot.id & 0xBFFF)) +		if ((spot.id     & ~(kStateDisabled << 12)) == +		     (hotspot.id & ~(kStateDisabled << 12)))  			id = spot.id;  		// Set @@ -276,7 +301,7 @@ void Hotspots::recalculate(bool force) {  		// Re-read the flags too, if applicable  		uint16 flags = 0; -		if (spot.getState() == 0xA) +		if (spot.getState() == (kStateFilled | kStateType2))  			flags = _vm->_game->_script->readValExpr();  		// Apply backDelta, if needed @@ -301,7 +326,7 @@ void Hotspots::recalculate(bool force) {  		spot.right  = left + width  - 1;  		spot.bottom = top  + height - 1; -		if (spot.getState() == 0xA) +		if (spot.getState() == (kStateFilled | kStateType2))  			spot.flags = flags;  		// Return @@ -327,10 +352,10 @@ void Hotspots::push(uint8 all, bool force) {  		if ( (all == 1) ||  		     // Don't save the global ones  		    ((all == 0) && (spot.id >= 20)) || -		     // Only save the ones with the correct state -		    ((all == 2) && ((spot.getState() == 0xD) || -		                    (spot.getState() == 0x4) || -		                    (spot.getState() == 0xE)))) { +		     // Only save disabled ones +		    ((all == 2) && ((spot.getState() == (kStateFilledDisabled | kStateType1)) || +		                    (spot.getState() == (kStateDisabled)) || +		                    (spot.getState() == (kStateFilledDisabled | kStateType2))))) {  			size++;  		} @@ -355,10 +380,10 @@ void Hotspots::push(uint8 all, bool force) {  		if ( (all == 1) ||  		     // Don't save the global ones  		    ((all == 0) && (spot.id >= 20)) || -		     // Only save the ones with the correct state -		    ((all == 2) && ((spot.getState() == 0xD) || -		                    (spot.getState() == 0x4) || -		                    (spot.getState() == 0xE)))) { +		     // Only save disabled ones +		    ((all == 2) && ((spot.getState() == (kStateFilledDisabled | kStateType1)) || +		                    (spot.getState() == (kStateDisabled)) || +		                    (spot.getState() == (kStateFilledDisabled | kStateType2))))) {  			memcpy(destPtr, &spot, sizeof(Hotspot));  			destPtr++; @@ -412,8 +437,8 @@ bool Hotspots::isValid(uint16 key, uint16 id, uint16 index) const {  	if (key == 0)  		return false; -	if (!(id & 0x8000)) -			return false; +	if (!(Hotspot::getState(id) & kStateFilled)) +		return false;  	return true;  } @@ -449,7 +474,8 @@ void Hotspots::enter(uint16 index) {  	Hotspot &spot = _hotspots[index]; -	if ((spot.getState() == 0xA) || (spot.getState() == 0x9)) +	if ((spot.getState() == (kStateFilled | kStateType1)) || +	    (spot.getState() == (kStateFilled | kStateType2)))  		WRITE_VAR(17, -(spot.id & 0x0FFF));  	if (spot.funcEnter != 0) @@ -466,7 +492,8 @@ void Hotspots::leave(uint16 index) {  	Hotspot &spot = _hotspots[index]; -	if ((spot.getState() == 0xA) || (spot.getState() == 0x9)) +	if ((spot.getState() == (kStateFilled | kStateType1)) || +	    (spot.getState() == (kStateFilled | kStateType2)))  		WRITE_VAR(17, spot.id & 0x0FFF);  	if (spot.funcLeave != 0) @@ -482,7 +509,7 @@ uint16 Hotspots::checkMouse(Type type, uint16 &id, uint16 &index) const {  		for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  			Hotspot &spot = _hotspots[i]; -			if (spot.getState() & 0x4) +			if (spot.isDisabled())  				continue;  			if (spot.getType() > kTypeMove) @@ -507,7 +534,7 @@ uint16 Hotspots::checkMouse(Type type, uint16 &id, uint16 &index) const {  		for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  			Hotspot &spot = _hotspots[i]; -			if (spot.getState() & 0x4) +			if (spot.isDisabled())  				continue;  			if (spot.getWindow() != 0) @@ -1048,9 +1075,13 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,  	right  = left + width  - 1;  	bottom = top  + height - 1; -	// Removing 0x4 from the state -	if ((type == 11) || (type == 12)) { -		uint8 wantedState = (type == 11) ? 0xE : 0xD; +	// Enabling the hotspots again +	if ((type == kTypeEnable2) || (type == kTypeEnable1)) { +		uint8 wantedState = 0; +		if (type == kTypeEnable2) +			wantedState = kStateFilledDisabled | kStateType2; +		else +			wantedState = kStateFilledDisabled | kStateType1;  		_vm->_game->_script->skip(6); @@ -1058,7 +1089,7 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,  			Hotspot &spot = _hotspots[j];  			if (spot.getState() == wantedState) { -				spot.id       &= 0xBFFF; +				spot.enable();  				spot.funcEnter = _vm->_game->_script->pos();  				spot.funcLeave = _vm->_game->_script->pos();  			} @@ -1085,7 +1116,7 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,  		funcLeave = _vm->_game->_script->pos();  		_vm->_game->_script->skipBlock(); -		key   = i + 0xA000; +		key   = i + ((kStateFilled | kStateType2) << 12);  		flags = type + (window << 8);  		break; @@ -1101,7 +1132,7 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,  		_vm->_game->_script->skipBlock();  		if (key == 0) -			key = i + 0xA000; +			key = i + ((kStateFilled | kStateType2) << 12);  		flags = type + (window << 8) + (flags << 4);  		break; @@ -1167,10 +1198,10 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,  		funcLeave = _vm->_game->_script->pos();  		_vm->_game->_script->skipBlock(); -		flags = 2 + (window << 8) + (flags << 4); +		flags = ((uint16) kTypeClick) + (window << 8) + (flags << 4);  		break; -	case 21: +	case kTypeClickEnter:  		key    = _vm->_game->_script->readInt16();  		ids[i] = _vm->_game->_script->readInt16();  		flags  = _vm->_game->_script->readInt16() & 3; @@ -1180,11 +1211,11 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,  		funcLeave = 0; -		flags = 2 + (window << 8) + (flags << 4); +		flags = ((uint16) kTypeClick) + (window << 8) + (flags << 4);  		break;  	} -	add(i + 0x8000, left, top, right, bottom, +	add(i | (kStateFilled << 12), left, top, right, bottom,  			flags, key, funcEnter, funcLeave, funcPos);  } @@ -1257,7 +1288,7 @@ void Hotspots::evaluate() {  				for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  					Hotspot &spot = _hotspots[i]; -					if ((spot.getState() & 0xC) != 0x8) +					if (!spot.isFilledEnabled())  						continue;  					if ((spot.getType() & 1) != 0) @@ -1285,7 +1316,7 @@ void Hotspots::evaluate() {  				for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  					Hotspot &spot = _hotspots[i]; -					if ((spot.getState() & 0xC) != 0x8) +					if (!spot.isFilledEnabled())  						continue;  					if ((spot.key == key) || (spot.key == 0x7FFF)) { @@ -1299,7 +1330,7 @@ void Hotspots::evaluate() {  					for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  						Hotspot &spot = _hotspots[i]; -						if ((spot.getState() & 0xC) != 0x8) +						if (!spot.isFilledEnabled())  							continue;  						if ((spot.key & 0xFF00) != 0) @@ -1322,7 +1353,7 @@ void Hotspots::evaluate() {  					for (int i = endIndex; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  						Hotspot &spot = _hotspots[i]; -						if (spot.getState() != 0x8) +						if (!spot.isFilledNew())  							continue;  						collStackPos++; @@ -1335,7 +1366,7 @@ void Hotspots::evaluate() {  						if (VAR(16) != 0)  							break; -						if (Hotspot::getState(id) == 0x8) +						if (Hotspot::getState(id) == kStateFilled)  							WRITE_VAR(16, ids[id & 0xFFF]);  						else  							WRITE_VAR(16, id & 0xFFF); @@ -1378,7 +1409,7 @@ void Hotspots::evaluate() {  						for (int i = endIndex; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  							Hotspot &spot = _hotspots[i]; -							if (spot.getState() == 0x8) { +							if (spot.isFilledNew()) {  								if (++counter == descIndex) {  									id    = spot.id;  									index = i; @@ -1393,7 +1424,7 @@ void Hotspots::evaluate() {  						for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  							Hotspot &spot = _hotspots[i]; -							if (spot.getState() == 0x8) { +							if (spot.isFilledNew()) {  								id    = spot.id;  								index = i;  								break; @@ -1418,7 +1449,7 @@ void Hotspots::evaluate() {  		_vm->_inter->storeMouse(); -		if (Hotspot::getState(id) == 0x8) +		if (Hotspot::getState(id) == kStateFilled)  			WRITE_VAR(16, ids[id & 0xFFF]);  		else  			WRITE_VAR(16, id & 0xFFF); @@ -1442,7 +1473,7 @@ void Hotspots::evaluate() {  			if (spot.isEnd())  				continue; -			if ((spot.getState() & 0xC) != 0x8) +			if (!spot.isFilledEnabled())  				continue;  			if (!spot.isInput()) @@ -1507,7 +1538,7 @@ void Hotspots::evaluate() {  		_vm->_inter->storeMouse();  		if (VAR(16) == 0) { -			if (Hotspot::getState(id) == 0x8) +			if (Hotspot::getState(id) == kStateFilled)  				WRITE_VAR(16, ids[id & 0xFFF]);  			else  				WRITE_VAR(16, id & 0xFFF); @@ -1516,13 +1547,14 @@ void Hotspots::evaluate() {  		_vm->_game->_script->setFinished(true);  	for (int i = 0; i < count; i++) -		remove(i + 0x8000); +		remove(i + (kStateFilled << 12));  	for (int i = 0; i < kHotspotCount; i++) {  		Hotspot &spot = _hotspots[i]; -		if ((spot.getState() == 0xA) || (spot.getState() == 0x9)) -			spot.id |= 0x4000; +	if ((spot.getState() == (kStateFilled | kStateType1)) || +	    (spot.getState() == (kStateFilled | kStateType2))) +			spot.disable();  	}  } @@ -1533,7 +1565,7 @@ int16 Hotspots::findCursor(uint16 x, uint16 y) const {  	for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {  		Hotspot &spot = _hotspots[i]; -		if ((spot.getWindow() != 0) || (spot.getState() & 0x4)) +		if ((spot.getWindow() != 0) || spot.isDisabled())  			continue;  		if (!spot.isIn(x, y)) @@ -1576,7 +1608,7 @@ uint16 Hotspots::findClickedInput(uint16 index) const {  		if (spot.getWindow() != 0)  			continue; -		if (spot.getState() & 0x4) +		if (spot.isDisabled())  			continue;  		if (!spot.isIn(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY)) @@ -1669,7 +1701,7 @@ void Hotspots::updateAllTexts(const InputDesc *inputs) const {  		if (spot.isEnd())  			continue; -		if ((spot.getState() & 0xC) != 0x8) +		if (!spot.isFilledEnabled())  			continue;  		if (!spot.isInput()) diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h index 1801a10591..79a80526de 100644 --- a/engines/gob/hotspots.h +++ b/engines/gob/hotspots.h @@ -49,7 +49,18 @@ public:  		kTypeInput3NoLeave     =  7,  		kTypeInput3Leave       =  8,  		kTypeInputFloatNoLeave =  9, -		kTypeInputFloatLeave   = 10 +		kTypeInputFloatLeave   = 10, +		kTypeEnable2           = 11, +		kTypeEnable1           = 12, +		kTypeClickEnter        = 21 +	}; + +	enum State { +		kStateFilledDisabled = 0xC, +		kStateFilled         = 0x8, +		kStateDisabled       = 0x4, +		kStateType2          = 0x2, +		kStateType1          = 0x1  	};  	Hotspots(GobEngine *vm); @@ -68,7 +79,7 @@ public:  	/** Push the current hotspots onto the stack.  	 * -	 *  @param all   0: Don't push global ones; 1: Push all; 2: Push only the ones with the correct state +	 *  @param all   0: Don't push global ones; 1: Push all; 2: Push only the disabled ones  	 *  @param force Force a push although _shouldPush is false  	 */  	void push(uint8 all, bool force = false); @@ -115,12 +126,20 @@ private:  		bool isInput() const;  		bool isActiveInput() const; +		bool isFilled() const; +		bool isFilledEnabled() const; +		bool isFilledNew() const; +		bool isDisabled() const; +  		/** Are the specified coordinates in the hotspot? */  		bool isIn(uint16 x, uint16 y) const;  		/** Does the specified button trigger the hotspot? */  		bool buttonMatch(MouseButtons button) const;  		static uint8 getState(uint16 id); + +		void disable(); +		void enable();  	};  	struct StackEntry { diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 746816303c..20f812bb88 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -1213,13 +1213,15 @@ bool Inter_v2::o2_addHotspot(OpFuncParams ¶ms) {  bool Inter_v2::o2_removeHotspot(OpFuncParams ¶ms) {  	int16 id = _vm->_game->_script->readValExpr(); +	uint8 stateType1 = Hotspots::kStateFilledDisabled | Hotspots::kStateType1; +	uint8 stateType2 = Hotspots::kStateFilledDisabled | Hotspots::kStateType2; -	if (id == -2) -		_vm->_game->_hotspots->removeState(0xD); +	if      (id == -2) +		_vm->_game->_hotspots->removeState(stateType1);  	else if (id == -1) -		_vm->_game->_hotspots->removeState(0xE); +		_vm->_game->_hotspots->removeState(stateType2);  	else -		_vm->_game->_hotspots->remove(0xE000 + id); +		_vm->_game->_hotspots->remove((stateType2 << 12) + id);  	return false;  } diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp index 67bf87a7da..aa4721ff0a 100644 --- a/engines/gob/inter_v6.cpp +++ b/engines/gob/inter_v6.cpp @@ -355,6 +355,9 @@ bool Inter_v6::o6_palLoad(OpFuncParams ¶ms) {  bool Inter_v6::o6_removeHotspot(OpFuncParams ¶ms) {  	int16 id; +	uint8 stateType1    = Hotspots::kStateFilledDisabled | Hotspots::kStateType1; +	uint8 stateType2    = Hotspots::kStateFilledDisabled | Hotspots::kStateType2; +	uint8 stateDisabled = Hotspots::kStateDisabled;  	id = _vm->_game->_script->readValExpr(); @@ -369,14 +372,14 @@ bool Inter_v6::o6_removeHotspot(OpFuncParams ¶ms) {  		_vm->_game->_hotspots->push(2);  		break;  	case 3: -		_vm->_game->_hotspots->removeState(0xD); -		_vm->_game->_hotspots->removeState(0x4); +		_vm->_game->_hotspots->removeState(stateType1); +		_vm->_game->_hotspots->removeState(stateDisabled);  		break;  	case 4: -		_vm->_game->_hotspots->removeState(0xE); +		_vm->_game->_hotspots->removeState(stateType2);  		break;  	default: -		_vm->_game->_hotspots->remove(0xE000 + id); +		_vm->_game->_hotspots->remove((stateType2 << 12) + id);  		break;  	}  | 
