diff options
Diffstat (limited to 'engines')
| -rw-r--r-- | engines/agos/agos.cpp | 6 | ||||
| -rw-r--r-- | engines/agos/agos.h | 4 | ||||
| -rw-r--r-- | engines/agos/debug.h | 10 | ||||
| -rw-r--r-- | engines/agos/items.cpp | 56 | ||||
| -rw-r--r-- | engines/agos/verb.cpp | 11 | 
5 files changed, 72 insertions, 15 deletions
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 68ed28354b..5cb721534f 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -1380,11 +1380,13 @@ startOver:  void AGOSEngine::hitarea_stuff_helper() {  	time_t cur_time; -	if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP) { +	if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || +		getGameType() == GType_PP) {  		if (_variableArray[254] || _variableArray[249]) {  			hitarea_stuff_helper_2();  		} -	} else { +	} else if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW ||  +		getGameType() == GType_SIMON1) {  		uint subr_id = (uint16)_variableArray[254];  		if (subr_id != 0) {  			Subroutine *sub = getSubroutineByID(subr_id); diff --git a/engines/agos/agos.h b/engines/agos/agos.h index 2b6e726c38..1a64adeea4 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -1054,6 +1054,7 @@ public:  	void oe1_pobj();  	void oe1_pName();  	void oe1_pcName(); +	void oe1_cFlag();  	void oe1_means();  	void oe1_setUserItem();  	void oe1_getUserItem(); @@ -1061,9 +1062,12 @@ public:  	void oe1_findMaster();  	void oe1_nextMaster();  	void oe1_setTime(); +	void oe1_bitClear(); +	void oe1_bitSet();  	void oe1_bitTest();  	void oe1_zoneDisk();  	void oe1_printStats(); +	void oe1_setStore();  	// Opcodes, Elvira 2 only  	void oe2_loadUserGame(); diff --git a/engines/agos/debug.h b/engines/agos/debug.h index 6bedf95c72..7b076f813e 100644 --- a/engines/agos/debug.h +++ b/engines/agos/debug.h @@ -168,7 +168,7 @@ static const char *const elvira1_opcodeNameTable[300] = {  	NULL,  	NULL,  	/* 112 */ -	"I|PRINT_OBJ", +	"IW|PRINT_OBJ",  	NULL,  	"I|PRINT_NAME",  	"I|PRINT_CNAME", @@ -230,7 +230,7 @@ static const char *const elvira1_opcodeNameTable[300] = {  	/* 160 */  	NULL,  	NULL, -	NULL, +	"IWJ|IS_CFLAG",  	NULL,  	/* 164 */  	"|RESCAN", @@ -341,9 +341,9 @@ static const char *const elvira1_opcodeNameTable[300] = {  	NULL,  	"IW|SET_CLASS",  	"IW|UNSET_CLASS", -	NULL, +	"WW|CLEAR_BIT",  	/* 252 */ -	NULL, +	"WW|SET_BIT",  	"WWJ|BIT_TEST",  	NULL,  	"W|WAIT_SYNC", @@ -380,7 +380,7 @@ static const char *const elvira1_opcodeNameTable[300] = {  	/* 280 */  	"II|SET_PARENT_SPECIAL",  	"|CLEAR_TIMERS", -	NULL, +	"IW|SET_STORE",  	"WJ|IS_BOX",  }; diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp index 9d170b4bc9..edf3e2a26c 100644 --- a/engines/agos/items.cpp +++ b/engines/agos/items.cpp @@ -260,6 +260,8 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {  	op[152] = &AGOSEngine::o_debug; +	op[162] = &AGOSEngine::oe1_cFlag; +  	op[164] = &AGOSEngine::o1_rescan;  	op[165] = &AGOSEngine::oe1_means; @@ -300,6 +302,8 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {  	op[249] = &AGOSEngine::o_setClass;  	op[250] = &AGOSEngine::o_unsetClass; +	op[251] = &AGOSEngine::oe1_bitClear; +	op[252] = &AGOSEngine::oe1_bitSet;  	op[253] = &AGOSEngine::oe1_bitTest;  	op[259] = &AGOSEngine::oe1_setTime; @@ -1365,9 +1369,11 @@ void AGOSEngine::o_loadUserGame() {  }  void AGOSEngine::o_stopTune() { -	// 134: dummy opcode? -	midi.stop(); -	_lastMusicPlayed = -1; +	// 134: stop tune +	if (getGameType() == GType_SIMON2) { +		midi.stop(); +		_lastMusicPlayed = -1; +	}  }  void AGOSEngine::o_pauseGame() { @@ -1904,9 +1910,10 @@ void AGOSEngine::oe1_doClass() {  void AGOSEngine::oe1_pobj() {  	// 112: print object  	SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2); +	getVarOrWord(); -	if (subObject != NULL && subObject->objectFlags & kOFText) -		showMessageFormat("%s", (const char *)getStringPtrByID(subObject->objectFlagValue[0])); +	if (subObject != NULL) +		showMessageFormat("%s", (const char *)getStringPtrByID(subObject->objectName));  }  void AGOSEngine::oe1_pName() { @@ -1923,8 +1930,19 @@ void AGOSEngine::oe1_pcName() {  	showMessageFormat("%s", name.c_str());  } +void AGOSEngine::oe1_cFlag() { +	// 162: check container flag +	SubContainer *c = (SubContainer *)findChildOfType(getNextItemPtr(), 7); +	uint bit = getVarOrWord(); + +	if (c == NULL) +		setScriptCondition(false); +	else +		setScriptCondition((c->flags & (1 << bit)) != 0); +} +  void AGOSEngine::oe1_means() { -	// TODO +	// 165: TODO  }  void AGOSEngine::oe1_setUserItem() { @@ -1983,6 +2001,22 @@ void AGOSEngine::oe1_nextMaster() {  		_objectItem = nextMaster(levelOf(me()), item, ad, no);  } +void AGOSEngine::oe1_bitClear() { +	// 251: set bit off +	int var = getVarOrWord(); +	int bit = getVarOrWord(); + +	writeVariable(var, _variableArray[var] & ~(1 << bit)); +} + +void AGOSEngine::oe1_bitSet() { +	// 252: set bit on +	int var = getVarOrWord(); +	int bit = getVarOrWord(); + +	writeVariable(var, _variableArray[var] | (1 << bit)); +} +  void AGOSEngine::oe1_bitTest() {  	// 253: bit test  	int var = getVarOrWord(); @@ -2006,6 +2040,16 @@ void AGOSEngine::oe1_printStats() {  	// 270: print stats  } +void AGOSEngine::oe1_setStore() { +	// 282: set store +	Item *item = getNextItemPtr(); + +	if (getVarOrWord() == 1) +		_subjectItem = item; +	else +		_objectItem = item; +} +  // -----------------------------------------------------------------------  // Elvira 2 Opcodes  // ----------------------------------------------------------------------- diff --git a/engines/agos/verb.cpp b/engines/agos/verb.cpp index 7242cdb901..e3c06bc8a7 100644 --- a/engines/agos/verb.cpp +++ b/engines/agos/verb.cpp @@ -744,10 +744,17 @@ void AGOSEngine::boxController(uint x, uint y, uint mode) {  		if (getGameType() == GType_PP) {  			_variableArray[400] = x;  			_variableArray[401] = y; -		} else { +		} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2 || +			getGameType() == GType_FF) {  			_variableArray[1] = x;  			_variableArray[2] = y; -		} +		} else if (getGameType() == GType_ELVIRA1) { +			if (best_ha->verb & 0x4000) { +				if (_variableArray[500] == 0) { +					_variableArray[500] = best_ha->verb & 0xBFFF; +				} +			} +		}   	}  	if (best_ha->flags & kBFNoTouchName) {  | 
