diff options
| -rw-r--r-- | engines/agos/agos.h | 199 | ||||
| -rw-r--r-- | engines/agos/icons.cpp | 2 | ||||
| -rw-r--r-- | engines/agos/script.cpp | 252 | ||||
| -rw-r--r-- | engines/agos/script_e1.cpp | 35 | ||||
| -rw-r--r-- | engines/agos/script_e2.cpp | 76 | ||||
| -rw-r--r-- | engines/agos/script_ff.cpp | 170 | ||||
| -rw-r--r-- | engines/agos/script_pp.cpp | 126 | ||||
| -rw-r--r-- | engines/agos/script_s1.cpp | 243 | ||||
| -rw-r--r-- | engines/agos/script_s2.cpp | 82 | ||||
| -rw-r--r-- | engines/agos/script_ww.cpp | 87 | 
10 files changed, 646 insertions, 626 deletions
diff --git a/engines/agos/agos.h b/engines/agos/agos.h index e7ef5d3964..1f2e854b64 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -1021,9 +1021,6 @@ public:  	void o_print();  	void o_message();  	void o_msg(); -	void o_addTextBox(); -	void o_setShortText(); -	void o_setLongText();  	void o_end();  	void o_done();  	void o_process(); @@ -1081,24 +1078,8 @@ public:  	void o_getOValue();  	void o_setOValue();  	void o_ink(); -	void o_screenTextBox(); -	void o_screenTextMsg(); -	void o_playEffect(); -	void o_getDollar2(); -	void o_isAdjNoun(); -	void o_b2Set(); -	void o_b2Clear(); -	void o_b2Zero(); -	void o_b2NotZero(); -	void o_lockZones(); -	void o_unlockZones(); -	void o_getPathPosn(); -	void o_scnTxtLongText(); -	void o_mouseOn(); -	void o_unloadZone(); -	void o_unfreezeZones(); - -	// Opcodes, Elvira 1 only + +	// Opcodes, Elvira 1  	void oe1_present();  	void oe1_notPresent();  	void oe1_worn(); @@ -1125,6 +1106,7 @@ public:  	void oe1_pName();  	void oe1_pcName();  	void oe1_cFlag(); +	void oe1_rescan();  	void oe1_setUserItem();  	void oe1_getUserItem();  	void oe1_whereTo(); @@ -1134,6 +1116,8 @@ public:  	void oe1_clearUserItem();  	void oe1_findMaster();  	void oe1_nextMaster(); +	void oe1_animate(); +	void oe1_stopAnimate();  	void oe1_menu();  	void oe1_enableInput();  	void oe1_setTime(); @@ -1149,7 +1133,7 @@ public:  	void oe1_printPlayerHit();  	void oe1_printMonsterHit(); -	// Opcodes, Elvira 2 only +	// Opcodes, Elvira 2  	void oe2_moveDirn();  	void oe2_doClass();  	void oe2_pObj(); @@ -1170,12 +1154,21 @@ public:  	void oe2_ifExitOpen();  	void oe2_ifExitClosed();  	void oe2_ifExitLocked(); +	void oe2_getDollar2();  	void oe2_unk177();  	void oe2_unk178(); +	void oe2_isAdjNoun(); +	void oe2_b2Set(); +	void oe2_b2Clear(); +	void oe2_b2Zero(); +	void oe2_b2NotZero(); -	// Opcodes, Waxworks only +	// Opcodes, Waxworks  	void oww_moveDirn();  	void oww_goto(); +	void oww_addTextBox(); +	void oww_setShortText(); +	void oww_setLongText();  	void oww_whereTo();  	void oww_menu();  	void oww_textMenu(); @@ -1185,82 +1178,90 @@ public:  	void oww_boxLongText();  	void oww_printBox();  	void oww_boxPObj(); - -	// Opcodes, Simon 1 only -	void o1_printLongText(); -	void o1_rescan(); -	void o1_animate(); -	void o1_stopAnimate(); -	void o1_playTune(); -	void o1_screenTextPObj(); -	void o1_mouseOff(); -	void o1_loadBeard(); -	void o1_unloadBeard(); -	void o1_loadStrings(); -	void o1_specialFade(); - -	// Opcodes, Simon 2 and later -	void o2_printLongText(); -	void o2_rescan(); -	void o2_animate(); -	void o2_stopAnimate(); -	void o2_playTune(); -	void o2_screenTextPObj(); -	void o2_mouseOff(); -	void o2_isShortText(); -	void o2_clearMarks(); -	void o2_waitMark(); - -	// Opcodes, Feeble Files only -	void o3_chance(); -	void o3_jumpOut(); -	void o3_addTextBox(); -	void o3_printLongText(); -	void o3_addBox(); -	void o3_oracleTextDown(); -	void o3_oracleTextUp(); -	void o3_ifTime(); -	void o3_setTime(); -	void o3_saveUserGame(); -	void o3_loadUserGame(); -	void o3_listSaveGames(); -	void o3_checkCD(); -	void o3_screenTextBox(); -	void o3_isAdjNoun(); -	void o3_hyperLinkOn(); -	void o3_hyperLinkOff(); -	void o3_checkPaths(); -	void o3_screenTextPObj(); -	void o3_mouseOff(); -	void o3_loadVideo(); -	void o3_playVideo(); -	void o3_centreScroll(); -	void o3_resetPVCount(); -	void o3_setPathValues(); -	void o3_stopClock(); -	void o3_restartClock(); -	void o3_setColour(); -	void o3_b3Set(); -	void o3_b3Clear(); -	void o3_b3Zero(); -	void o3_b3NotZero(); - -	// Opcodes, Puzzle Pack only -	void o4_iconifyWindow(); -	void o4_restoreOopsPosition(); -	void o4_loadMouseImage(); -	void o4_message(); -	void o4_setShortText(); -	void o4_loadHiScores(); -	void o4_checkHiScores(); -	void o4_sync(); -	void o4_saveUserGame(); -	void o4_loadUserGame(); -	void o4_saveOopsPosition(); -	void o4_resetGameTime(); -	void o4_resetPVCount(); -	void o4_setPathValues(); -	void o4_restartClock(); +	void oww_lockZones(); +	void oww_unlockZones(); + +	// Opcodes, Simon 1 +	void oww_printLongText(); +	void os1_animate(); +	void os1_playTune(); +	void os1_screenTextBox(); +	void os1_screenTextMsg(); +	void os1_playEffect(); +	void os1_screenTextPObj(); +	void os1_getPathPosn(); +	void os1_scnTxtLongText(); +	void os1_mouseOn(); +	void os1_mouseOff(); +	void os1_loadBeard(); +	void os1_unloadBeard(); +	void os1_unloadZone(); +	void os1_loadStrings(); +	void os1_unfreezeZones(); +	void os1_specialFade(); + +	// Opcodes, Simon 2 +	void os2_printLongText(); +	void os2_rescan(); +	void os2_animate(); +	void os2_stopAnimate(); +	void os2_playTune(); +	void os2_screenTextPObj(); +	void os2_mouseOff(); +	void os2_isShortText(); +	void os2_clearMarks(); +	void os2_waitMark(); + +	// Opcodes, Feeble Files +	void off_chance(); +	void off_jumpOut(); +	void off_addTextBox(); +	void off_printLongText(); +	void off_addBox(); +	void off_oracleTextDown(); +	void off_oracleTextUp(); +	void off_ifTime(); +	void off_setTime(); +	void off_saveUserGame(); +	void off_loadUserGame(); +	void off_listSaveGames(); +	void off_checkCD(); +	void off_screenTextBox(); +	void off_isAdjNoun(); +	void off_hyperLinkOn(); +	void off_hyperLinkOff(); +	void off_checkPaths(); +	void off_screenTextPObj(); +	void off_mouseOff(); +	void off_loadVideo(); +	void off_playVideo(); +	void off_centreScroll(); +	void off_resetPVCount(); +	void off_setPathValues(); +	void off_stopClock(); +	void off_restartClock(); +	void off_setColour(); +	void off_b3Set(); +	void off_b3Clear(); +	void off_b3Zero(); +	void off_b3NotZero(); + +	// Opcodes, Puzzle Pack +	void opp_iconifyWindow(); +	void opp_restoreOopsPosition(); +	void opp_loadMouseImage(); +	void opp_message(); +	void opp_setShortText(); +	void opp_loadHiScores(); +	void opp_checkHiScores(); +	void opp_sync(); +	void opp_saveUserGame(); +	void opp_loadUserGame(); +	void opp_saveOopsPosition(); +	void opp_resetGameTime(); +	void opp_resetPVCount(); +	void opp_setPathValues(); +	void opp_restartClock();  protected:  	void drawImages(VC10_state *state); diff --git a/engines/agos/icons.cpp b/engines/agos/icons.cpp index d2ae7a078f..d04076aa8a 100644 --- a/engines/agos/icons.cpp +++ b/engines/agos/icons.cpp @@ -58,7 +58,7 @@ void AGOSEngine::loadIconData() {  		error("Out of icon memory");  	memcpy(_iconFilePtr, src, 43 * 336); -	o_unfreezeZones(); +	os1_unfreezeZones();  }  // Thanks to Stuart Caie for providing the original diff --git a/engines/agos/script.cpp b/engines/agos/script.cpp index 3ebe92518e..6a6a488ed0 100644 --- a/engines/agos/script.cpp +++ b/engines/agos/script.cpp @@ -95,8 +95,6 @@ void AGOSEngine::setupCommonOpcodes(OpcodeProc *op) {  	op[80] = &AGOSEngine::o_is;  	op[82] = &AGOSEngine::o_debug;  	op[87] = &AGOSEngine::o_comment; -	op[88] = &AGOSEngine::o_haltAnimation; -	op[89] = &AGOSEngine::o_restartAnimation;  	op[90] = &AGOSEngine::o_getParent;  	op[91] = &AGOSEngine::o_getNext;  	op[92] = &AGOSEngine::o_getChildren; @@ -516,44 +514,6 @@ void AGOSEngine::o_msg() {  	showMessageFormat("%s", getStringPtrByID(getNextStringID()));  } -void AGOSEngine::o_addTextBox() { -	// 65: add hit area -	uint id = getVarOrWord(); -	uint x = getVarOrWord(); -	uint y = getVarOrWord(); -	uint w = getVarOrWord(); -	uint h = getVarOrWord(); -	uint number = getVarOrByte(); -	if (number < _numTextBoxes) -		defineBox(id, x, y, w, h, (number << 8) + 129, 208, _dummyItem2); -} - -void AGOSEngine::o_setShortText() { -	// 66: set item name -	uint var = getVarOrByte(); -	uint stringId = getNextStringID(); -	if (var < _numTextBoxes) { -		_shortText[var] = stringId; -	} -} - -void AGOSEngine::o_setLongText() { -	// 67: set item description -	uint var = getVarOrByte(); -	uint stringId = getNextStringID(); -	if (getFeatures() & GF_TALKIE) { -		uint speechId = getNextWord(); -		if (var < _numTextBoxes) { -			_longText[var] = stringId; -			_longSound[var] = speechId; -		} -	} else { -		if (var < _numTextBoxes) { -			_longText[var] = stringId; -		} -	} -} -  void AGOSEngine::o_end() {  	// 68: exit interpreter  	shutdown(); @@ -1084,218 +1044,6 @@ void AGOSEngine::o_ink() {  	setTextColor(getVarOrByte());  } -void AGOSEngine::o_screenTextBox() { -	// 161: setup text -	TextLocation *tl = getTextLocation(getVarOrByte()); - -	tl->x = getVarOrWord(); -	tl->y = getVarOrByte(); -	tl->width = getVarOrWord(); -} -	 -void AGOSEngine::o_screenTextMsg() { -	// 162: print string -	uint vgaSpriteId = getVarOrByte(); -	uint color = getVarOrByte(); -	uint stringId = getNextStringID(); -	const byte *string_ptr = NULL; -	uint speechId = 0; -	TextLocation *tl; - -	if (stringId != 0xFFFF) -		string_ptr = getStringPtrByID(stringId); - -	if (getFeatures() & GF_TALKIE) { -		if (getGameType() == GType_FF || getGameType() == GType_PP) -			speechId = (uint16)getVarOrWord(); -		else -			speechId = (uint16)getNextWord(); -	} - -	if (getGameType() == GType_FF || getGameType() == GType_PP) -		vgaSpriteId = 1; - -	tl = getTextLocation(vgaSpriteId); -	if (_speech && speechId != 0) -		playSpeech(speechId, vgaSpriteId); -	if (((getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || getGameType() == GType_FF) && -		speechId == 0) { -		stopAnimateSimon2(2, vgaSpriteId + 2); -	} - -	if (string_ptr != NULL && (speechId == 0 || _subtitles)) -		printScreenText(vgaSpriteId, color, (const char *)string_ptr, tl->x, tl->y, tl->width); - -} - -void AGOSEngine::o_playEffect() { -	// 163: play sound -	uint soundId = getVarOrWord(); - -	if (getGameId() == GID_SIMON1DOS) -		playSting(soundId); -	else -		_sound->playEffects(soundId); -} - -void AGOSEngine::o_getDollar2() { -	// 164 -	_showPreposition = true; - -	setup_cond_c_helper(); - -	_objectItem = _hitAreaObjectItem; - -	if (_objectItem == _dummyItem2) -		_objectItem = me(); - -	if (_objectItem == _dummyItem3) -		_objectItem = derefItem(me()->parent); - -	if (_objectItem != NULL) { -		_scriptNoun2 = _objectItem->noun; -		_scriptAdj2 = _objectItem->adjective; -	} else { -		_scriptNoun2 = -1; -		_scriptAdj2 = -1; -	} - -	_showPreposition = false; -} - -void AGOSEngine::o_isAdjNoun() { -	// 165: item unk1 unk2 is -	Item *item = getNextItemPtr(); -	int16 a = getNextWord(), b = getNextWord(); -	setScriptCondition(item->adjective == a && item->noun == b); -} - -void AGOSEngine::o_b2Set() { -	// 166: set bit2 -	uint bit = getVarOrByte(); -	_bitArrayTwo[bit / 16] |= (1 << (bit & 15)); -} - -void AGOSEngine::o_b2Clear() { -	// 167: clear bit2 -	uint bit = getVarOrByte(); -	_bitArrayTwo[bit / 16] &= ~(1 << (bit & 15)); -} - -void AGOSEngine::o_b2Zero() { -	// 168: is bit2 clear -	uint bit = getVarOrByte(); -	setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) == 0); -} - -void AGOSEngine::o_b2NotZero() { -	// 169: is bit2 set -	uint bit = getVarOrByte(); -	setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0); -} - -void AGOSEngine::o_lockZones() { -	// 175: vga pointer op 1 -	_vgaMemBase = _vgaMemPtr; -} - -void AGOSEngine::o_unlockZones() { -	// 176: vga pointer op 2 -	_vgaMemPtr = _vgaFrozenBase; -	_vgaMemBase = _vgaFrozenBase; -} - -void AGOSEngine::o_getPathPosn() { -	// 178: path find -	uint x = getVarOrWord(); -	uint y = getVarOrWord(); -	uint var_1 = getVarOrByte(); -	uint var_2 = getVarOrByte(); - -	const uint16 *p; -	uint i, j; -	uint prev_i; -	uint x_diff, y_diff; -	uint best_i = 0, best_j = 0, best_dist = 0xFFFFFFFF; -	uint maxPath = (getGameType() == GType_FF || getGameType() == GType_PP) ? 100 : 20; - -	if (getGameType() == GType_FF || getGameType() == GType_PP) { -		x += _scrollX; -		y += _scrollY; -	} else if (getGameType() == GType_SIMON2) { -		x += _scrollX * 8; -	} - -	int end = (getGameType() == GType_FF) ? 9999 : 999; -	prev_i = maxPath + 1 - readVariable(12); -	for (i = maxPath; i != 0; --i) { -		p = (const uint16 *)_pathFindArray[maxPath - i]; -		if (!p) -			continue; -		for (j = 0; readUint16Wrapper(&p[0]) != end; j++, p += 2) { -			x_diff = ABS((int16)(readUint16Wrapper(&p[0]) - x)); -			y_diff = ABS((int16)(readUint16Wrapper(&p[1]) - 12 - y)); - -			if (x_diff < y_diff) { -				x_diff /= 4; -				y_diff *= 4; -			} -			x_diff += y_diff /= 4; - -			if (x_diff < best_dist || x_diff == best_dist && prev_i == i) { -				best_dist = x_diff; -				best_i = maxPath + 1 - i; -				best_j = j; -			} -		} -	} - -	writeVariable(var_1, best_i); -	writeVariable(var_2, best_j); -} - -void AGOSEngine::o_scnTxtLongText() { -	// 179: conversation responses and room descriptions -	uint vgaSpriteId = getVarOrByte(); -	uint color = getVarOrByte(); -	uint stringId = getVarOrByte(); -	uint speechId = 0; -	TextLocation *tl; - -	const char *string_ptr = (const char *)getStringPtrByID(_longText[stringId]); -	if (getFeatures() & GF_TALKIE) -		speechId = _longSound[stringId]; - -	if (getGameType() == GType_FF || getGameType() == GType_PP) -		vgaSpriteId = 1; -	tl = getTextLocation(vgaSpriteId); - -	if (_speech && speechId != 0) -		playSpeech(speechId, vgaSpriteId); -	if (string_ptr != NULL && _subtitles) -		printScreenText(vgaSpriteId, color, string_ptr, tl->x, tl->y, tl->width); -} - -void AGOSEngine::o_mouseOn() { -	// 180: force mouseOn -	scriptMouseOn(); -} - -void AGOSEngine::o_unloadZone() { -	// 184: clear vgapointer entry -	uint a = getVarOrWord(); -	VgaPointersEntry *vpe = &_vgaBufferPointers[a]; - -	vpe->sfxFile = NULL; -	vpe->vgaFile1 = NULL; -	vpe->vgaFile2 = NULL; -} - -void AGOSEngine::o_unfreezeZones() { -	// 186: vga pointer op 3 -	unfreezeBottom(); -} -  // -----------------------------------------------------------------------  byte AGOSEngine::getByte() { diff --git a/engines/agos/script_e1.cpp b/engines/agos/script_e1.cpp index a58125b85f..8eb9759809 100644 --- a/engines/agos/script_e1.cpp +++ b/engines/agos/script_e1.cpp @@ -130,7 +130,7 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {  	op[162] = &AGOSEngine::oe1_cFlag; -	op[164] = &AGOSEngine::o1_rescan; +	op[164] = &AGOSEngine::oe1_rescan;  	op[176] = &AGOSEngine::oe1_setUserItem;  	op[177] = &AGOSEngine::oe1_getUserItem; @@ -153,8 +153,8 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {  	op[224] = &AGOSEngine::o_picture;  	op[225] = &AGOSEngine::o_loadZone; -	op[226] = &AGOSEngine::o1_animate; -	op[227] = &AGOSEngine::o1_stopAnimate; +	op[226] = &AGOSEngine::oe1_animate; +	op[227] = &AGOSEngine::oe1_stopAnimate;  	op[228] = &AGOSEngine::o_killAnimate;  	op[229] = &AGOSEngine::o_defWindow;  	op[230] = &AGOSEngine::o_window; @@ -187,7 +187,7 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {  	op[260] = &AGOSEngine::oe1_ifTime;  	op[261] = &AGOSEngine::o_here;  	op[262] = &AGOSEngine::o_doClassIcons; -	op[263] = &AGOSEngine::o1_playTune; +	op[263] = &AGOSEngine::os1_playTune;  	op[266] = &AGOSEngine::o_setAdjNoun;  	op[267] = &AGOSEngine::oe1_zoneDisk;  	op[268] = &AGOSEngine::o_saveUserGame; @@ -406,6 +406,11 @@ void AGOSEngine::oe1_cFlag() {  		setScriptCondition((c->flags & (1 << bit)) != 0);  } +void AGOSEngine::oe1_rescan() { +	// 164: restart subroutine +	setScriptReturn(-10); +} +  void AGOSEngine::oe1_setUserItem() {  	// 176: set user item  	Item *i = getNextItemPtr(); @@ -508,6 +513,28 @@ void AGOSEngine::oe1_nextMaster() {  		_objectItem = nextMaster(item, ad, no);  } +void AGOSEngine::oe1_animate() { +	// 226: animate +	uint vgaSpriteId = getVarOrWord(); +	uint windowNum = getVarOrByte(); +	uint x = getVarOrWord(); +	uint y = getVarOrWord(); +	uint palette = getVarOrWord(); + +	if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE) && vgaSpriteId >= 400) { +		_lastVgaWaitFor = 0; +	} + +	_lockWord |= 0x40; +	animate(windowNum, vgaSpriteId / 100, vgaSpriteId, x, y, palette); +	_lockWord &= ~0x40; +} + +void AGOSEngine::oe1_stopAnimate() { +	// 227: stop animate +	stopAnimateSimon1(getVarOrWord()); +} +  void AGOSEngine::oe1_menu() {  	// 233: agos menu  	uint b = getVarOrWord(); diff --git a/engines/agos/script_e2.cpp b/engines/agos/script_e2.cpp index 5c88e335a5..3e5fe1d430 100644 --- a/engines/agos/script_e2.cpp +++ b/engines/agos/script_e2.cpp @@ -46,16 +46,16 @@ void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) {  	op[73] = &AGOSEngine::oe2_pObj;  	op[74] = &AGOSEngine::oe1_pName;  	op[75] = &AGOSEngine::oe1_pcName; -	op[83] = &AGOSEngine::o1_rescan; +	op[83] = &AGOSEngine::oe1_rescan;  	op[89] = &AGOSEngine::oe1_loadGame;  	op[94] = &AGOSEngine::oe1_findMaster;  	op[95] = &AGOSEngine::oe1_nextMaster; -	op[98] = &AGOSEngine::o1_animate; -	op[99] = &AGOSEngine::o1_stopAnimate; +	op[98] = &AGOSEngine::oe1_animate; +	op[99] = &AGOSEngine::oe1_stopAnimate;  	op[113] = &AGOSEngine::oe2_drawItem;  	op[123] = &AGOSEngine::oe1_setTime;  	op[124] = &AGOSEngine::oe1_ifTime; -	op[127] = &AGOSEngine::o1_playTune; +	op[127] = &AGOSEngine::os1_playTune;  	op[144] = &AGOSEngine::oe2_setDoorOpen;  	op[145] = &AGOSEngine::oe2_setDoorClosed;  	op[146] = &AGOSEngine::oe2_setDoorLocked; @@ -74,14 +74,14 @@ void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) {  	op[171] = &AGOSEngine::oe2_ifExitOpen;  	op[172] = &AGOSEngine::oe2_ifExitClosed;  	op[173] = &AGOSEngine::oe2_ifExitLocked; -	op[175] = &AGOSEngine::o_getDollar2; +	op[175] = &AGOSEngine::oe2_getDollar2;  	op[177] = &AGOSEngine::oe2_unk177;  	op[178] = &AGOSEngine::oe2_unk178; -	op[179] = &AGOSEngine::o_isAdjNoun; -	op[180] = &AGOSEngine::o_b2Set; -	op[181] = &AGOSEngine::o_b2Clear; -	op[182] = &AGOSEngine::o_b2Zero; -	op[183] = &AGOSEngine::o_b2NotZero; +	op[179] = &AGOSEngine::oe2_isAdjNoun; +	op[180] = &AGOSEngine::oe2_b2Set; +	op[181] = &AGOSEngine::oe2_b2Clear; +	op[182] = &AGOSEngine::oe2_b2Zero; +	op[183] = &AGOSEngine::oe2_b2NotZero;  }  // ----------------------------------------------------------------------- @@ -285,6 +285,31 @@ void AGOSEngine::oe2_ifExitLocked() {  	setScriptCondition(getExitState(i, n, d) == 3);  } +void AGOSEngine::oe2_getDollar2() { +	// 175 +	_showPreposition = true; + +	setup_cond_c_helper(); + +	_objectItem = _hitAreaObjectItem; + +	if (_objectItem == _dummyItem2) +		_objectItem = me(); + +	if (_objectItem == _dummyItem3) +		_objectItem = derefItem(me()->parent); + +	if (_objectItem != NULL) { +		_scriptNoun2 = _objectItem->noun; +		_scriptAdj2 = _objectItem->adjective; +	} else { +		_scriptNoun2 = -1; +		_scriptAdj2 = -1; +	} + +	_showPreposition = false; +} +  void AGOSEngine::oe2_unk177() {  	// 177: set unknown vga event  	uint a = getVarOrByte(); @@ -297,4 +322,35 @@ void AGOSEngine::oe2_unk178() {  	debug(0, "oe2_unk178: stub (%d)", a);  } +void AGOSEngine::oe2_isAdjNoun() { +	// 179: item unk1 unk2 is +	Item *item = getNextItemPtr(); +	int16 a = getNextWord(), b = getNextWord(); +	setScriptCondition(item->adjective == a && item->noun == b); +} + +void AGOSEngine::oe2_b2Set() { +	// 180: set bit2 +	uint bit = getVarOrByte(); +	_bitArrayTwo[bit / 16] |= (1 << (bit & 15)); +} + +void AGOSEngine::oe2_b2Clear() { +	// 181: clear bit2 +	uint bit = getVarOrByte(); +	_bitArrayTwo[bit / 16] &= ~(1 << (bit & 15)); +} + +void AGOSEngine::oe2_b2Zero() { +	// 182: is bit2 clear +	uint bit = getVarOrByte(); +	setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) == 0); +} + +void AGOSEngine::oe2_b2NotZero() { +	// 183: is bit2 set +	uint bit = getVarOrByte(); +	setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0); +} +  } // End of namespace AGOS diff --git a/engines/agos/script_ff.cpp b/engines/agos/script_ff.cpp index 0c6d7ac00c..1b07f48fcb 100644 --- a/engines/agos/script_ff.cpp +++ b/engines/agos/script_ff.cpp @@ -33,66 +33,66 @@ namespace AGOS {  void AGOSEngine::setupFeebleOpcodes(OpcodeProc *op) {  	setupCommonOpcodes(op); -	op[23] = &AGOSEngine::o3_chance; -	op[37] = &AGOSEngine::o3_jumpOut; -	op[65] = &AGOSEngine::o3_addTextBox; -	op[66] = &AGOSEngine::o_setShortText; -	op[67] = &AGOSEngine::o_setLongText; -	op[70] = &AGOSEngine::o3_printLongText; -	op[83] = &AGOSEngine::o2_rescan; -	op[98] = &AGOSEngine::o2_animate; -	op[99] = &AGOSEngine::o2_stopAnimate; -	op[107] = &AGOSEngine::o3_addBox; -	op[122] = &AGOSEngine::o3_oracleTextDown; -	op[123] = &AGOSEngine::o3_oracleTextUp; -	op[124] = &AGOSEngine::o3_ifTime; -	op[131] = &AGOSEngine::o3_setTime; -	op[132] = &AGOSEngine::o3_saveUserGame; -	op[133] = &AGOSEngine::o3_loadUserGame; -	op[134] = &AGOSEngine::o3_listSaveGames; -	op[135] = &AGOSEngine::o3_checkCD; -	op[161] = &AGOSEngine::o3_screenTextBox; -	op[162] = &AGOSEngine::o_screenTextMsg; -	op[164] = &AGOSEngine::o_getDollar2; -	op[165] = &AGOSEngine::o3_isAdjNoun; -	op[166] = &AGOSEngine::o_b2Set; -	op[167] = &AGOSEngine::o_b2Clear; -	op[168] = &AGOSEngine::o_b2Zero; -	op[169] = &AGOSEngine::o_b2NotZero; -	op[171] = &AGOSEngine::o3_hyperLinkOn; -	op[172] = &AGOSEngine::o3_hyperLinkOff; -	op[173] = &AGOSEngine::o3_checkPaths; -	op[175] = &AGOSEngine::o_lockZones; -	op[176] = &AGOSEngine::o_unlockZones; -	op[177] = &AGOSEngine::o3_screenTextPObj; -	op[178] = &AGOSEngine::o_getPathPosn; -	op[179] = &AGOSEngine::o_scnTxtLongText; -	op[180] = &AGOSEngine::o_mouseOn; -	op[181] = &AGOSEngine::o3_mouseOff; -	op[182] = &AGOSEngine::o3_loadVideo; -	op[183] = &AGOSEngine::o3_playVideo; -	op[184] = &AGOSEngine::o_unloadZone; -	op[186] = &AGOSEngine::o_unfreezeZones; -	op[187] = &AGOSEngine::o3_centreScroll; -	op[188] = &AGOSEngine::o2_isShortText; -	op[189] = &AGOSEngine::o2_clearMarks; -	op[190] = &AGOSEngine::o2_waitMark; -	op[191] = &AGOSEngine::o3_resetPVCount; -	op[192] = &AGOSEngine::o3_setPathValues; -	op[193] = &AGOSEngine::o3_stopClock; -	op[194] = &AGOSEngine::o3_restartClock; -	op[195] = &AGOSEngine::o3_setColour; -	op[196] = &AGOSEngine::o3_b3Set; -	op[197] = &AGOSEngine::o3_b3Clear; -	op[198] = &AGOSEngine::o3_b3Zero; -	op[199] = &AGOSEngine::o3_b3NotZero; +	op[23] = &AGOSEngine::off_chance; +	op[37] = &AGOSEngine::off_jumpOut; +	op[65] = &AGOSEngine::off_addTextBox; +	op[66] = &AGOSEngine::oww_setShortText; +	op[67] = &AGOSEngine::oww_setLongText; +	op[70] = &AGOSEngine::off_printLongText; +	op[83] = &AGOSEngine::os2_rescan; +	op[98] = &AGOSEngine::os2_animate; +	op[99] = &AGOSEngine::os2_stopAnimate; +	op[107] = &AGOSEngine::off_addBox; +	op[122] = &AGOSEngine::off_oracleTextDown; +	op[123] = &AGOSEngine::off_oracleTextUp; +	op[124] = &AGOSEngine::off_ifTime; +	op[131] = &AGOSEngine::off_setTime; +	op[132] = &AGOSEngine::off_saveUserGame; +	op[133] = &AGOSEngine::off_loadUserGame; +	op[134] = &AGOSEngine::off_listSaveGames; +	op[135] = &AGOSEngine::off_checkCD; +	op[161] = &AGOSEngine::off_screenTextBox; +	op[162] = &AGOSEngine::os1_screenTextMsg; +	op[164] = &AGOSEngine::oe2_getDollar2; +	op[165] = &AGOSEngine::off_isAdjNoun; +	op[166] = &AGOSEngine::oe2_b2Set; +	op[167] = &AGOSEngine::oe2_b2Clear; +	op[168] = &AGOSEngine::oe2_b2Zero; +	op[169] = &AGOSEngine::oe2_b2NotZero; +	op[171] = &AGOSEngine::off_hyperLinkOn; +	op[172] = &AGOSEngine::off_hyperLinkOff; +	op[173] = &AGOSEngine::off_checkPaths; +	op[175] = &AGOSEngine::oww_lockZones; +	op[176] = &AGOSEngine::oww_unlockZones; +	op[177] = &AGOSEngine::off_screenTextPObj; +	op[178] = &AGOSEngine::os1_getPathPosn; +	op[179] = &AGOSEngine::os1_scnTxtLongText; +	op[180] = &AGOSEngine::os1_mouseOn; +	op[181] = &AGOSEngine::off_mouseOff; +	op[182] = &AGOSEngine::off_loadVideo; +	op[183] = &AGOSEngine::off_playVideo; +	op[184] = &AGOSEngine::os1_unloadZone; +	op[186] = &AGOSEngine::os1_unfreezeZones; +	op[187] = &AGOSEngine::off_centreScroll; +	op[188] = &AGOSEngine::os2_isShortText; +	op[189] = &AGOSEngine::os2_clearMarks; +	op[190] = &AGOSEngine::os2_waitMark; +	op[191] = &AGOSEngine::off_resetPVCount; +	op[192] = &AGOSEngine::off_setPathValues; +	op[193] = &AGOSEngine::off_stopClock; +	op[194] = &AGOSEngine::off_restartClock; +	op[195] = &AGOSEngine::off_setColour; +	op[196] = &AGOSEngine::off_b3Set; +	op[197] = &AGOSEngine::off_b3Clear; +	op[198] = &AGOSEngine::off_b3Zero; +	op[199] = &AGOSEngine::off_b3NotZero;  }  // -----------------------------------------------------------------------  // Feeble Files Opcodes  // ----------------------------------------------------------------------- -void AGOSEngine::o3_chance() { +void AGOSEngine::off_chance() {  	// 23  	uint a = getVarOrWord(); @@ -112,13 +112,13 @@ void AGOSEngine::o3_chance() {  		setScriptCondition(false);  } -void AGOSEngine::o3_jumpOut() { +void AGOSEngine::off_jumpOut() {  	// 37  	getVarOrByte();  	setScriptReturn(1);  } -void AGOSEngine::o3_addTextBox() { +void AGOSEngine::off_addTextBox() {  	// 65: add hit area  	uint flags = kBFTextBox | kBFBoxItem;  	uint id = getVarOrWord(); @@ -139,14 +139,14 @@ void AGOSEngine::o3_addTextBox() {  		defineBox(id, x, y, w, h, flags + (num << 8), 208, _dummyItem2);  } -void AGOSEngine::o3_printLongText() { +void AGOSEngine::off_printLongText() {  	// 70: show string from array  	int num = getVarOrByte();  	const char *str = (const char *)getStringPtrByID(_longText[num]);  	sendInteractText(num, "%d. %s\n", num, str);  } -void AGOSEngine::o3_addBox() { +void AGOSEngine::off_addBox() {  	// 107: add item hitarea  	uint flags = 0;  	uint id = getVarOrWord(); @@ -176,17 +176,17 @@ void AGOSEngine::o3_addBox() {  	defineBox(id, x, y, w, h, flags, verb, item);  } -void AGOSEngine::o3_oracleTextDown() { +void AGOSEngine::off_oracleTextDown() {  	// 122: oracle text down  	oracleTextDown();  } -void AGOSEngine::o3_oracleTextUp() { +void AGOSEngine::off_oracleTextUp() {  	// 123: oracle text up  	oracleTextUp();  } -void AGOSEngine::o3_ifTime() { +void AGOSEngine::off_ifTime() {  	// 124: if time  	time_t t; @@ -200,13 +200,13 @@ void AGOSEngine::o3_ifTime() {  		setScriptCondition(false);  } -void AGOSEngine::o3_setTime() { +void AGOSEngine::off_setTime() {  	// 131  	time(&_timeStore);  	_timeStore -= _gameStoppedClock;  } -void AGOSEngine::o3_saveUserGame() { +void AGOSEngine::off_saveUserGame() {  	// 132: save game  	_noOracleScroll = 0;  	_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true); @@ -214,17 +214,17 @@ void AGOSEngine::o3_saveUserGame() {  	_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);  } -void AGOSEngine::o3_loadUserGame() { +void AGOSEngine::off_loadUserGame() {  	// 133: load game  	loadGame(readVariable(55));  } -void AGOSEngine::o3_listSaveGames() { +void AGOSEngine::off_listSaveGames() {  	// 134: dummy opcode?  	listSaveGames(1);  } -void AGOSEngine::o3_checkCD() { +void AGOSEngine::off_checkCD() {  	// 135: switch CD  	uint disc = readVariable(97); @@ -240,7 +240,7 @@ void AGOSEngine::o3_checkCD() {  	debug(0, "Switch to CD number %d", disc);  } -void AGOSEngine::o3_screenTextBox() { +void AGOSEngine::off_screenTextBox() {  	// 161: setup text  	TextLocation *tl = getTextLocation(getVarOrByte()); @@ -249,7 +249,7 @@ void AGOSEngine::o3_screenTextBox() {  	tl->width = getVarOrWord();  } -void AGOSEngine::o3_isAdjNoun() { +void AGOSEngine::off_isAdjNoun() {  	// 165: item unk1 unk2 is  	Item *item = getNextItemPtr();  	int16 a = getNextWord(), b = getNextWord(); @@ -261,17 +261,17 @@ void AGOSEngine::o3_isAdjNoun() {  		setScriptCondition(false);  } -void AGOSEngine::o3_hyperLinkOn() { +void AGOSEngine::off_hyperLinkOn() {  	// 171: oracle hyperlink on  	hyperLinkOn(getVarOrWord());  } -void AGOSEngine::o3_hyperLinkOff() { +void AGOSEngine::off_hyperLinkOff() {  	// 172: oracle hyperlink off  	hyperLinkOff();  } -void AGOSEngine::o3_checkPaths() { +void AGOSEngine::off_checkPaths() {  	// 173 check paths  	int i, count;  	const uint8 *pathVal1 = _pathValues1; @@ -307,7 +307,7 @@ void AGOSEngine::o3_checkPaths() {  	_variableArray2[52] = result;  } -void AGOSEngine::o3_screenTextPObj() { +void AGOSEngine::off_screenTextPObj() {  	// 177: inventory descriptions  	uint vgaSpriteId = getVarOrByte();  	uint color = getVarOrByte(); @@ -336,29 +336,29 @@ void AGOSEngine::o3_screenTextPObj() {  	}  } -void AGOSEngine::o3_mouseOff() { +void AGOSEngine::off_mouseOff() {  	// 181: force mouseOff  	scriptMouseOff();  	clearName();  } -void AGOSEngine::o3_loadVideo() { +void AGOSEngine::off_loadVideo() {  	// 182: load video file  	const byte *filename = getStringPtrByID(getNextStringID());  	_moviePlay->load((const char *)filename);  } -void AGOSEngine::o3_playVideo() { +void AGOSEngine::off_playVideo() {  	// 183: play video  	_moviePlay->play();  } -void AGOSEngine::o3_centreScroll() { +void AGOSEngine::off_centreScroll() {  	// 187  	centreScroll();  } -void AGOSEngine::o3_resetPVCount() { +void AGOSEngine::off_resetPVCount() {  	// 191  	if (getBitFlag(83)) {  		_PVCount1 = 0; @@ -369,7 +369,7 @@ void AGOSEngine::o3_resetPVCount() {  	}  } -void AGOSEngine::o3_setPathValues() { +void AGOSEngine::off_setPathValues() {  	// 192  	uint8 a = getVarOrByte();  	uint8 b = getVarOrByte(); @@ -388,19 +388,19 @@ void AGOSEngine::o3_setPathValues() {  	}  } -void AGOSEngine::o3_stopClock() { +void AGOSEngine::off_stopClock() {  	// 193: pause clock  	_clockStopped = time(NULL);  } -void AGOSEngine::o3_restartClock() { +void AGOSEngine::off_restartClock() {  	// 194: resume clock  	if (_clockStopped != 0)  		_gameStoppedClock += time(NULL) - _clockStopped;  	_clockStopped = 0;  } -void AGOSEngine::o3_setColour() { +void AGOSEngine::off_setColour() {  	// 195: set palette colour  	uint c = getVarOrByte() * 4;  	uint r = getVarOrByte(); @@ -414,25 +414,25 @@ void AGOSEngine::o3_setColour() {  	_paletteFlag = 2;  } -void AGOSEngine::o3_b3Set() { +void AGOSEngine::off_b3Set() {  	// 196: set bit3  	uint bit = getVarOrByte();  	_bitArrayThree[bit / 16] |= (1 << (bit & 15));  } -void AGOSEngine::o3_b3Clear() { +void AGOSEngine::off_b3Clear() {  	// 197: clear bit3  	uint bit = getVarOrByte();  	_bitArrayThree[bit / 16] &= ~(1 << (bit & 15));  } -void AGOSEngine::o3_b3Zero() { +void AGOSEngine::off_b3Zero() {  	// 198: is bit3 clear  	uint bit = getVarOrByte();  	setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) == 0);  } -void AGOSEngine::o3_b3NotZero() { +void AGOSEngine::off_b3NotZero() {  	// 199: is bit3 set  	uint bit = getVarOrByte();  	setScriptCondition((_bitArrayThree[bit / 16] & (1 << (bit & 15))) != 0); diff --git a/engines/agos/script_pp.cpp b/engines/agos/script_pp.cpp index ca8e8a64a1..10dd82af08 100644 --- a/engines/agos/script_pp.cpp +++ b/engines/agos/script_pp.cpp @@ -32,61 +32,61 @@ namespace AGOS {  void AGOSEngine::setupPuzzleOpcodes(OpcodeProc *op) {  	setupCommonOpcodes(op); -	op[23] = &AGOSEngine::o3_chance; -	op[30] = &AGOSEngine::o4_iconifyWindow; -	op[32] = &AGOSEngine::o4_restoreOopsPosition; -	op[38] = &AGOSEngine::o4_loadMouseImage; -	op[63] = &AGOSEngine::o4_message; -	op[65] = &AGOSEngine::o3_addTextBox; -	op[66] = &AGOSEngine::o4_setShortText; -	op[67] = &AGOSEngine::o_setLongText; -	op[70] = &AGOSEngine::o3_printLongText; -	op[83] = &AGOSEngine::o2_rescan; -	op[98] = &AGOSEngine::o2_animate; -	op[99] = &AGOSEngine::o2_stopAnimate; -	op[105] = &AGOSEngine::o4_loadHiScores; -	op[106] = &AGOSEngine::o4_checkHiScores; -	op[107] = &AGOSEngine::o3_addBox; -	op[120] = &AGOSEngine::o4_sync; -	op[122] = &AGOSEngine::o3_oracleTextDown; -	op[123] = &AGOSEngine::o3_oracleTextUp; -	op[124] = &AGOSEngine::o3_ifTime; -	op[131] = &AGOSEngine::o3_setTime; -	op[132] = &AGOSEngine::o4_saveUserGame; -	op[133] = &AGOSEngine::o4_loadUserGame; -	op[134] = &AGOSEngine::o3_listSaveGames; -	op[161] = &AGOSEngine::o3_screenTextBox; -	op[162] = &AGOSEngine::o_screenTextMsg; -	op[164] = &AGOSEngine::o_getDollar2; -	op[165] = &AGOSEngine::o3_isAdjNoun; -	op[171] = &AGOSEngine::o3_hyperLinkOn; -	op[172] = &AGOSEngine::o3_hyperLinkOff; -	op[173] = &AGOSEngine::o4_saveOopsPosition; -	op[175] = &AGOSEngine::o_lockZones; -	op[176] = &AGOSEngine::o_unlockZones; -	op[177] = &AGOSEngine::o3_screenTextPObj; -	op[178] = &AGOSEngine::o_getPathPosn; -	op[179] = &AGOSEngine::o_scnTxtLongText; -	op[180] = &AGOSEngine::o_mouseOn; -	op[181] = &AGOSEngine::o3_mouseOff; -	op[184] = &AGOSEngine::o_unloadZone; -	op[186] = &AGOSEngine::o_unfreezeZones; -	op[187] = &AGOSEngine::o4_resetGameTime; -	op[188] = &AGOSEngine::o2_isShortText; -	op[189] = &AGOSEngine::o2_clearMarks; -	op[190] = &AGOSEngine::o2_waitMark; -	op[191] = &AGOSEngine::o4_resetPVCount; -	op[192] = &AGOSEngine::o4_setPathValues; -	op[193] = &AGOSEngine::o3_stopClock; -	op[194] = &AGOSEngine::o4_restartClock; -	op[195] = &AGOSEngine::o3_setColour; +	op[23] = &AGOSEngine::off_chance; +	op[30] = &AGOSEngine::opp_iconifyWindow; +	op[32] = &AGOSEngine::opp_restoreOopsPosition; +	op[38] = &AGOSEngine::opp_loadMouseImage; +	op[63] = &AGOSEngine::opp_message; +	op[65] = &AGOSEngine::off_addTextBox; +	op[66] = &AGOSEngine::opp_setShortText; +	op[67] = &AGOSEngine::oww_setLongText; +	op[70] = &AGOSEngine::off_printLongText; +	op[83] = &AGOSEngine::os2_rescan; +	op[98] = &AGOSEngine::os2_animate; +	op[99] = &AGOSEngine::os2_stopAnimate; +	op[105] = &AGOSEngine::opp_loadHiScores; +	op[106] = &AGOSEngine::opp_checkHiScores; +	op[107] = &AGOSEngine::off_addBox; +	op[120] = &AGOSEngine::opp_sync; +	op[122] = &AGOSEngine::off_oracleTextDown; +	op[123] = &AGOSEngine::off_oracleTextUp; +	op[124] = &AGOSEngine::off_ifTime; +	op[131] = &AGOSEngine::off_setTime; +	op[132] = &AGOSEngine::opp_saveUserGame; +	op[133] = &AGOSEngine::opp_loadUserGame; +	op[134] = &AGOSEngine::off_listSaveGames; +	op[161] = &AGOSEngine::off_screenTextBox; +	op[162] = &AGOSEngine::os1_screenTextMsg; +	op[164] = &AGOSEngine::oe2_getDollar2; +	op[165] = &AGOSEngine::off_isAdjNoun; +	op[171] = &AGOSEngine::off_hyperLinkOn; +	op[172] = &AGOSEngine::off_hyperLinkOff; +	op[173] = &AGOSEngine::opp_saveOopsPosition; +	op[175] = &AGOSEngine::oww_lockZones; +	op[176] = &AGOSEngine::oww_unlockZones; +	op[177] = &AGOSEngine::off_screenTextPObj; +	op[178] = &AGOSEngine::os1_getPathPosn; +	op[179] = &AGOSEngine::os1_scnTxtLongText; +	op[180] = &AGOSEngine::os1_mouseOn; +	op[181] = &AGOSEngine::off_mouseOff; +	op[184] = &AGOSEngine::os1_unloadZone; +	op[186] = &AGOSEngine::os1_unfreezeZones; +	op[187] = &AGOSEngine::opp_resetGameTime; +	op[188] = &AGOSEngine::os2_isShortText; +	op[189] = &AGOSEngine::os2_clearMarks; +	op[190] = &AGOSEngine::os2_waitMark; +	op[191] = &AGOSEngine::opp_resetPVCount; +	op[192] = &AGOSEngine::opp_setPathValues; +	op[193] = &AGOSEngine::off_stopClock; +	op[194] = &AGOSEngine::opp_restartClock; +	op[195] = &AGOSEngine::off_setColour;  }  // -----------------------------------------------------------------------  // Puzzle Pack Opcodes  // ----------------------------------------------------------------------- -void AGOSEngine::o4_iconifyWindow() { +void AGOSEngine::opp_iconifyWindow() {  	// 30  	getNextItemPtr();  	if (_clockStopped != 0) @@ -95,7 +95,7 @@ void AGOSEngine::o4_iconifyWindow() {  	_system->setFeatureState(OSystem::kFeatureIconifyWindow, true);  } -void AGOSEngine::o4_restoreOopsPosition() { +void AGOSEngine::opp_restoreOopsPosition() {  	// 32: restore oops position  	uint i; @@ -117,14 +117,14 @@ void AGOSEngine::o4_restoreOopsPosition() {  	}  } -void AGOSEngine::o4_loadMouseImage() { +void AGOSEngine::opp_loadMouseImage() {  	// 38: load mouse image  	getNextItemPtr();  	getVarOrByte();  	loadMouseImage();  } -void AGOSEngine::o4_message() { +void AGOSEngine::opp_message() {  	// 63: show string nl  	if (getBitFlag(105)) { @@ -136,7 +136,7 @@ void AGOSEngine::o4_message() {  	}  } -void AGOSEngine::o4_setShortText() { +void AGOSEngine::opp_setShortText() {  	// 66: set item name  	uint var = getVarOrByte();  	uint stringId = getNextStringID(); @@ -147,18 +147,18 @@ void AGOSEngine::o4_setShortText() {  	}  } -void AGOSEngine::o4_loadHiScores() { +void AGOSEngine::opp_loadHiScores() {  	// 105: load high scores  	getVarOrByte();  } -void AGOSEngine::o4_checkHiScores() { +void AGOSEngine::opp_checkHiScores() {  	// 106: check high scores  	getVarOrByte();  	getVarOrByte();  } -void AGOSEngine::o4_sync() { +void AGOSEngine::opp_sync() {  	// 120: sync  	uint a = getVarOrWord();  	if (a == 8001 || a == 8101 || a == 8201 || a == 8301 || a == 8401) { @@ -167,7 +167,7 @@ void AGOSEngine::o4_sync() {  	sendSync(a);  } -void AGOSEngine::o4_saveUserGame() { +void AGOSEngine::opp_saveUserGame() {  	// 132: save game  	if (_clockStopped != 0)  		_gameTime += time(NULL) - _clockStopped; @@ -183,7 +183,7 @@ void AGOSEngine::o4_saveUserGame() {  	//saveHiScores()  } -void AGOSEngine::o4_loadUserGame() { +void AGOSEngine::opp_loadUserGame() {  	// 133: load usergame  	// NoPatience or Jumble @@ -196,7 +196,7 @@ void AGOSEngine::o4_loadUserGame() {  	loadGame(1);  } -void AGOSEngine::o4_saveOopsPosition() { +void AGOSEngine::opp_saveOopsPosition() {  	// 173: save oops position  	if (!isVgaQueueEmpty()) {  		_oopsValid = true; @@ -208,18 +208,18 @@ void AGOSEngine::o4_saveOopsPosition() {  	}  } -void AGOSEngine::o4_resetGameTime() { +void AGOSEngine::opp_resetGameTime() {  	// 187: reset game time  	_gameTime = 0;  } -void AGOSEngine::o4_resetPVCount() { +void AGOSEngine::opp_resetPVCount() {  	// 191  	_PVCount = 0;  	_GPVCount = 0;  } -void AGOSEngine::o4_setPathValues() { +void AGOSEngine::opp_setPathValues() {  	// 192  	_pathValues[_PVCount++] = getVarOrByte();  	_pathValues[_PVCount++] = getVarOrByte(); @@ -227,7 +227,7 @@ void AGOSEngine::o4_setPathValues() {  	_pathValues[_PVCount++] = getVarOrByte();  } -void AGOSEngine::o4_restartClock() { +void AGOSEngine::opp_restartClock() {  	// 194: resume clock  	if (_clockStopped != 0)  		_gameTime += time(NULL) - _clockStopped; diff --git a/engines/agos/script_s1.cpp b/engines/agos/script_s1.cpp index ea45b0f497..a8015f923e 100644 --- a/engines/agos/script_s1.cpp +++ b/engines/agos/script_s1.cpp @@ -32,62 +32,53 @@ namespace AGOS {  void AGOSEngine::setupSimon1Opcodes(OpcodeProc *op) {  	setupCommonOpcodes(op); -	op[65] = &AGOSEngine::o_addTextBox; -	op[66] = &AGOSEngine::o_setShortText; -	op[67] = &AGOSEngine::o_setLongText; -	op[70] = &AGOSEngine::o1_printLongText; -	op[83] = &AGOSEngine::o1_rescan; -	op[98] = &AGOSEngine::o1_animate; -	op[99] = &AGOSEngine::o1_stopAnimate; -	op[127] = &AGOSEngine::o1_playTune; -	op[161] = &AGOSEngine::o_screenTextBox; -	op[162] = &AGOSEngine::o_screenTextMsg; -	op[163] = &AGOSEngine::o_playEffect; -	op[164] = &AGOSEngine::o_getDollar2; -	op[165] = &AGOSEngine::o_isAdjNoun; -	op[166] = &AGOSEngine::o_b2Set; -	op[167] = &AGOSEngine::o_b2Clear; -	op[168] = &AGOSEngine::o_b2Zero; -	op[169] = &AGOSEngine::o_b2NotZero; -	op[175] = &AGOSEngine::o_lockZones; -	op[176] = &AGOSEngine::o_unlockZones; -	op[177] = &AGOSEngine::o1_screenTextPObj; -	op[178] = &AGOSEngine::o_getPathPosn; -	op[179] = &AGOSEngine::o_scnTxtLongText; -	op[180] = &AGOSEngine::o_mouseOn; -	op[181] = &AGOSEngine::o1_mouseOff; -	op[182] = &AGOSEngine::o1_loadBeard; -	op[183] = &AGOSEngine::o1_unloadBeard; -	op[184] = &AGOSEngine::o_unloadZone; -	op[185] = &AGOSEngine::o1_loadStrings; -	op[186] = &AGOSEngine::o_unfreezeZones; -	op[187] = &AGOSEngine::o1_specialFade; +	op[65] = &AGOSEngine::oww_addTextBox; +	op[66] = &AGOSEngine::oww_setShortText; +	op[67] = &AGOSEngine::oww_setLongText; +	op[70] = &AGOSEngine::oww_printLongText; +	op[83] = &AGOSEngine::oe1_rescan; +	op[88] = &AGOSEngine::o_haltAnimation; +	op[89] = &AGOSEngine::o_restartAnimation; +	op[98] = &AGOSEngine::os1_animate; +	op[99] = &AGOSEngine::oe1_stopAnimate; +	op[127] = &AGOSEngine::os1_playTune; +	op[161] = &AGOSEngine::os1_screenTextBox; +	op[162] = &AGOSEngine::os1_screenTextMsg; +	op[163] = &AGOSEngine::os1_playEffect; +	op[164] = &AGOSEngine::oe2_getDollar2; +	op[165] = &AGOSEngine::oe2_isAdjNoun; +	op[166] = &AGOSEngine::oe2_b2Set; +	op[167] = &AGOSEngine::oe2_b2Clear; +	op[168] = &AGOSEngine::oe2_b2Zero; +	op[169] = &AGOSEngine::oe2_b2NotZero; +	op[175] = &AGOSEngine::oww_lockZones; +	op[176] = &AGOSEngine::oww_unlockZones; +	op[177] = &AGOSEngine::os1_screenTextPObj; +	op[178] = &AGOSEngine::os1_getPathPosn; +	op[179] = &AGOSEngine::os1_scnTxtLongText; +	op[180] = &AGOSEngine::os1_mouseOn; +	op[181] = &AGOSEngine::os1_mouseOff; +	op[182] = &AGOSEngine::os1_loadBeard; +	op[183] = &AGOSEngine::os1_unloadBeard; +	op[184] = &AGOSEngine::os1_unloadZone; +	op[185] = &AGOSEngine::os1_loadStrings; +	op[186] = &AGOSEngine::os1_unfreezeZones; +	op[187] = &AGOSEngine::os1_specialFade;  }  // -----------------------------------------------------------------------  // Simon 1 Opcodes  // ----------------------------------------------------------------------- -void AGOSEngine::o1_printLongText() { -	// 70: show string from array -	const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]); -	showMessageFormat("%s\n", str); -} - -void AGOSEngine::o1_rescan() { -	// 83: restart subroutine -	setScriptReturn(-10); -} - -void AGOSEngine::o1_animate() { -	// 98: start vga +void AGOSEngine::os1_animate() { +	// 98: animate  	uint vgaSpriteId = getVarOrWord();  	uint windowNum = getVarOrByte();  	uint x = getVarOrWord();  	uint y = getVarOrWord();  	uint palette = getVarOrWord(); -	if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE) && vgaSpriteId >= 400) { +	if (getFeatures() & GF_TALKIE && vgaSpriteId >= 400) {  		_lastVgaWaitFor = 0;  	} @@ -96,12 +87,7 @@ void AGOSEngine::o1_animate() {  	_lockWord &= ~0x40;  } -void AGOSEngine::o1_stopAnimate() { -	// 99: kill sprite -	stopAnimateSimon1(getVarOrWord()); -} - -void AGOSEngine::o1_playTune() { +void AGOSEngine::os1_playTune() {  	// 127: deals with music  	int music = getVarOrWord();  	int track = getVarOrWord(); @@ -122,7 +108,61 @@ void AGOSEngine::o1_playTune() {  	}  } -void AGOSEngine::o1_screenTextPObj() { +void AGOSEngine::os1_screenTextBox() { +	// 161: setup text +	TextLocation *tl = getTextLocation(getVarOrByte()); + +	tl->x = getVarOrWord(); +	tl->y = getVarOrByte(); +	tl->width = getVarOrWord(); +} +	 +void AGOSEngine::os1_screenTextMsg() { +	// 162: print string +	uint vgaSpriteId = getVarOrByte(); +	uint color = getVarOrByte(); +	uint stringId = getNextStringID(); +	const byte *string_ptr = NULL; +	uint speechId = 0; +	TextLocation *tl; + +	if (stringId != 0xFFFF) +		string_ptr = getStringPtrByID(stringId); + +	if (getFeatures() & GF_TALKIE) { +		if (getGameType() == GType_FF || getGameType() == GType_PP) +			speechId = (uint16)getVarOrWord(); +		else +			speechId = (uint16)getNextWord(); +	} + +	if (getGameType() == GType_FF || getGameType() == GType_PP) +		vgaSpriteId = 1; + +	tl = getTextLocation(vgaSpriteId); +	if (_speech && speechId != 0) +		playSpeech(speechId, vgaSpriteId); +	if (((getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || getGameType() == GType_FF) && +		speechId == 0) { +		stopAnimateSimon2(2, vgaSpriteId + 2); +	} + +	if (string_ptr != NULL && (speechId == 0 || _subtitles)) +		printScreenText(vgaSpriteId, color, (const char *)string_ptr, tl->x, tl->y, tl->width); + +} + +void AGOSEngine::os1_playEffect() { +	// 163: play sound +	uint soundId = getVarOrWord(); + +	if (getGameId() == GID_SIMON1DOS) +		playSting(soundId); +	else +		_sound->playEffects(soundId); +} + +void AGOSEngine::os1_screenTextPObj() {  	// 177: inventory descriptions  	uint vgaSpriteId = getVarOrByte();  	uint color = getVarOrByte(); @@ -163,12 +203,88 @@ void AGOSEngine::o1_screenTextPObj() {  	}  } -void AGOSEngine::o1_mouseOff() { +void AGOSEngine::os1_getPathPosn() { +	// 178: path find +	uint x = getVarOrWord(); +	uint y = getVarOrWord(); +	uint var_1 = getVarOrByte(); +	uint var_2 = getVarOrByte(); + +	const uint16 *p; +	uint i, j; +	uint prev_i; +	uint x_diff, y_diff; +	uint best_i = 0, best_j = 0, best_dist = 0xFFFFFFFF; +	uint maxPath = (getGameType() == GType_FF || getGameType() == GType_PP) ? 100 : 20; + +	if (getGameType() == GType_FF || getGameType() == GType_PP) { +		x += _scrollX; +		y += _scrollY; +	} else if (getGameType() == GType_SIMON2) { +		x += _scrollX * 8; +	} + +	int end = (getGameType() == GType_FF) ? 9999 : 999; +	prev_i = maxPath + 1 - readVariable(12); +	for (i = maxPath; i != 0; --i) { +		p = (const uint16 *)_pathFindArray[maxPath - i]; +		if (!p) +			continue; +		for (j = 0; readUint16Wrapper(&p[0]) != end; j++, p += 2) { +			x_diff = ABS((int16)(readUint16Wrapper(&p[0]) - x)); +			y_diff = ABS((int16)(readUint16Wrapper(&p[1]) - 12 - y)); + +			if (x_diff < y_diff) { +				x_diff /= 4; +				y_diff *= 4; +			} +			x_diff += y_diff /= 4; + +			if (x_diff < best_dist || x_diff == best_dist && prev_i == i) { +				best_dist = x_diff; +				best_i = maxPath + 1 - i; +				best_j = j; +			} +		} +	} + +	writeVariable(var_1, best_i); +	writeVariable(var_2, best_j); +} + +void AGOSEngine::os1_scnTxtLongText() { +	// 179: conversation responses and room descriptions +	uint vgaSpriteId = getVarOrByte(); +	uint color = getVarOrByte(); +	uint stringId = getVarOrByte(); +	uint speechId = 0; +	TextLocation *tl; + +	const char *string_ptr = (const char *)getStringPtrByID(_longText[stringId]); +	if (getFeatures() & GF_TALKIE) +		speechId = _longSound[stringId]; + +	if (getGameType() == GType_FF || getGameType() == GType_PP) +		vgaSpriteId = 1; +	tl = getTextLocation(vgaSpriteId); + +	if (_speech && speechId != 0) +		playSpeech(speechId, vgaSpriteId); +	if (string_ptr != NULL && _subtitles) +		printScreenText(vgaSpriteId, color, string_ptr, tl->x, tl->y, tl->width); +} + +void AGOSEngine::os1_mouseOn() { +	// 180: force mouseOn +	scriptMouseOn(); +} + +void AGOSEngine::os1_mouseOff() {  	// 181: force mouseOff  	scriptMouseOff();  } -void AGOSEngine::o1_loadBeard() { +void AGOSEngine::os1_loadBeard() {  	// 182: load beard  	if (_beardLoaded == false) {  		_beardLoaded = true; @@ -178,7 +294,7 @@ void AGOSEngine::o1_loadBeard() {  	}  } -void AGOSEngine::o1_unloadBeard() { +void AGOSEngine::os1_unloadBeard() {  	// 183: unload beard  	if (_beardLoaded == true) {  		_beardLoaded = false; @@ -188,7 +304,17 @@ void AGOSEngine::o1_unloadBeard() {  	}  } -void AGOSEngine::o1_loadStrings() { +void AGOSEngine::os1_unloadZone() { +	// 184: unload zone +	uint a = getVarOrWord(); +	VgaPointersEntry *vpe = &_vgaBufferPointers[a]; + +	vpe->sfxFile = NULL; +	vpe->vgaFile1 = NULL; +	vpe->vgaFile2 = NULL; +} + +void AGOSEngine::os1_loadStrings() {  	// 185: load sound files  	_soundFileId = getVarOrWord();  	if (getPlatform() == Common::kPlatformAmiga && getFeatures() & GF_TALKIE) { @@ -200,7 +326,12 @@ void AGOSEngine::o1_loadStrings() {  	}  } -void AGOSEngine::o1_specialFade() { +void AGOSEngine::os1_unfreezeZones() { +	// 186: freeze zone +	unfreezeBottom(); +} + +void AGOSEngine::os1_specialFade() {  	// 187: fade to black  	uint i; diff --git a/engines/agos/script_s2.cpp b/engines/agos/script_s2.cpp index 04fdca01b1..b185616e6b 100644 --- a/engines/agos/script_s2.cpp +++ b/engines/agos/script_s2.cpp @@ -30,49 +30,51 @@ namespace AGOS {  void AGOSEngine::setupSimon2Opcodes(OpcodeProc *op) {  	setupCommonOpcodes(op); -	op[65] = &AGOSEngine::o_addTextBox; -	op[66] = &AGOSEngine::o_setShortText; -	op[67] = &AGOSEngine::o_setLongText; -	op[70] = &AGOSEngine::o2_printLongText; -	op[83] = &AGOSEngine::o2_rescan; -	op[98] = &AGOSEngine::o2_animate; -	op[99] = &AGOSEngine::o2_stopAnimate; -	op[127] = &AGOSEngine::o2_playTune; -	op[161] = &AGOSEngine::o_screenTextBox; -	op[162] = &AGOSEngine::o_screenTextMsg; -	op[163] = &AGOSEngine::o_playEffect; -	op[164] = &AGOSEngine::o_getDollar2; -	op[165] = &AGOSEngine::o_isAdjNoun; -	op[166] = &AGOSEngine::o_b2Set; -	op[167] = &AGOSEngine::o_b2Clear; -	op[168] = &AGOSEngine::o_b2Zero; -	op[169] = &AGOSEngine::o_b2NotZero; -	op[175] = &AGOSEngine::o_lockZones; -	op[176] = &AGOSEngine::o_unlockZones; -	op[177] = &AGOSEngine::o2_screenTextPObj; -	op[178] = &AGOSEngine::o_getPathPosn; -	op[179] = &AGOSEngine::o_scnTxtLongText; -	op[180] = &AGOSEngine::o_mouseOn; -	op[181] = &AGOSEngine::o2_mouseOff; -	op[184] = &AGOSEngine::o_unloadZone; -	op[186] = &AGOSEngine::o_unfreezeZones; -	op[188] = &AGOSEngine::o2_isShortText; -	op[189] = &AGOSEngine::o2_clearMarks; -	op[190] = &AGOSEngine::o2_waitMark; +	op[65] = &AGOSEngine::oww_addTextBox; +	op[66] = &AGOSEngine::oww_setShortText; +	op[67] = &AGOSEngine::oww_setLongText; +	op[70] = &AGOSEngine::os2_printLongText; +	op[83] = &AGOSEngine::os2_rescan; +	op[88] = &AGOSEngine::o_haltAnimation; +	op[89] = &AGOSEngine::o_restartAnimation; +	op[98] = &AGOSEngine::os2_animate; +	op[99] = &AGOSEngine::os2_stopAnimate; +	op[127] = &AGOSEngine::os2_playTune; +	op[161] = &AGOSEngine::os1_screenTextBox; +	op[162] = &AGOSEngine::os1_screenTextMsg; +	op[163] = &AGOSEngine::os1_playEffect; +	op[164] = &AGOSEngine::oe2_getDollar2; +	op[165] = &AGOSEngine::oe2_isAdjNoun; +	op[166] = &AGOSEngine::oe2_b2Set; +	op[167] = &AGOSEngine::oe2_b2Clear; +	op[168] = &AGOSEngine::oe2_b2Zero; +	op[169] = &AGOSEngine::oe2_b2NotZero; +	op[175] = &AGOSEngine::oww_lockZones; +	op[176] = &AGOSEngine::oww_unlockZones; +	op[177] = &AGOSEngine::os2_screenTextPObj; +	op[178] = &AGOSEngine::os1_getPathPosn; +	op[179] = &AGOSEngine::os1_scnTxtLongText; +	op[180] = &AGOSEngine::os1_mouseOn; +	op[181] = &AGOSEngine::os2_mouseOff; +	op[184] = &AGOSEngine::os1_unloadZone; +	op[186] = &AGOSEngine::os1_unfreezeZones; +	op[188] = &AGOSEngine::os2_isShortText; +	op[189] = &AGOSEngine::os2_clearMarks; +	op[190] = &AGOSEngine::os2_waitMark;  }  // -----------------------------------------------------------------------  // Simon 2 Opcodes  // ----------------------------------------------------------------------- -void AGOSEngine::o2_printLongText() { +void AGOSEngine::os2_printLongText() {  	// 70: show string from array  	const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]);  	writeVariable(51, strlen(str) / 53 * 8 + 8);  	showMessageFormat("%s\n", str);  } -void AGOSEngine::o2_rescan() { +void AGOSEngine::os2_rescan() {  	// 83: restart subroutine  	if (_exitCutscene) {  		if (getBitFlag(9)) { @@ -85,7 +87,7 @@ void AGOSEngine::o2_rescan() {  	setScriptReturn(-10);  } -void AGOSEngine::o2_animate() { +void AGOSEngine::os2_animate() {  	// 98: start vga  	uint zoneNum = getVarOrWord();  	uint vgaSpriteId = getVarOrWord(); @@ -99,14 +101,14 @@ void AGOSEngine::o2_animate() {  	_lockWord &= ~0x40;  } -void AGOSEngine::o2_stopAnimate() { +void AGOSEngine::os2_stopAnimate() {  	// 99: kill sprite  	uint a = getVarOrWord();  	uint b = getVarOrWord();  	stopAnimateSimon2(a, b);  } -void AGOSEngine::o2_playTune() { +void AGOSEngine::os2_playTune() {  	// 127: deals with music  	int music = getVarOrWord();  	int track = getVarOrWord(); @@ -128,7 +130,7 @@ void AGOSEngine::o2_playTune() {  		midi.startTrack(track);  } -void AGOSEngine::o2_screenTextPObj() { +void AGOSEngine::os2_screenTextPObj() {  	// 177: inventory descriptions  	uint vgaSpriteId = getVarOrByte();  	uint color = getVarOrByte(); @@ -177,7 +179,7 @@ void AGOSEngine::o2_screenTextPObj() {  						speechId = 51;  						break;  					default: -						error("o2_screenTextPObj: invalid case %d", speechIdOffs); +						error("os2_screenTextPObj: invalid case %d", speechIdOffs);  					}  				}  			} @@ -213,26 +215,26 @@ void AGOSEngine::o2_screenTextPObj() {  	}  } -void AGOSEngine::o2_mouseOff() { +void AGOSEngine::os2_mouseOff() {  	// 181: force mouseOff  	scriptMouseOff();  	changeWindow(1);  	showMessageFormat("\xC");  } -void AGOSEngine::o2_isShortText() { +void AGOSEngine::os2_isShortText() {  	// 188: string2 is  	uint i = getVarOrByte();  	uint str = getNextStringID();  	setScriptCondition(str < _numTextBoxes && _shortText[i] == str);  } -void AGOSEngine::o2_clearMarks() { +void AGOSEngine::os2_clearMarks() {  	// 189: clear_op189_flag  	_marks = 0;  } -void AGOSEngine::o2_waitMark() { +void AGOSEngine::os2_waitMark() {  	// 190  	uint i = getVarOrByte();  	if (!(_marks & (1 << i))) diff --git a/engines/agos/script_ww.cpp b/engines/agos/script_ww.cpp index b544383841..8946f4b2fa 100644 --- a/engines/agos/script_ww.cpp +++ b/engines/agos/script_ww.cpp @@ -45,20 +45,20 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) {  	op[39] = &AGOSEngine::oe1_weigh;  	op[54] = &AGOSEngine::oww_moveDirn;  	op[55] = &AGOSEngine::oww_goto; -	op[65] = &AGOSEngine::o_addTextBox; -	op[66] = &AGOSEngine::o_setShortText; -	op[67] = &AGOSEngine::o_setLongText; -	op[70] = &AGOSEngine::o1_printLongText; -	op[83] = &AGOSEngine::o1_rescan; +	op[65] = &AGOSEngine::oww_addTextBox; +	op[66] = &AGOSEngine::oww_setShortText; +	op[67] = &AGOSEngine::oww_setLongText; +	op[70] = &AGOSEngine::oww_printLongText; +	op[83] = &AGOSEngine::oe1_rescan;  	op[85] = &AGOSEngine::oww_whereTo;  	op[89] = &AGOSEngine::oe1_loadGame;  	op[94] = &AGOSEngine::oe1_findMaster;  	op[95] = &AGOSEngine::oe1_nextMaster; -	op[98] = &AGOSEngine::o1_animate; -	op[99] = &AGOSEngine::o1_stopAnimate; +	op[98] = &AGOSEngine::oe1_animate; +	op[99] = &AGOSEngine::oe1_stopAnimate;  	op[105] = &AGOSEngine::oww_menu;  	op[106] = &AGOSEngine::oww_textMenu; -	op[127] = &AGOSEngine::o1_playTune; +	op[127] = &AGOSEngine::os1_playTune;  	op[144] = &AGOSEngine::oe2_setDoorOpen;  	op[145] = &AGOSEngine::oe2_setDoorClosed;  	op[146] = &AGOSEngine::oe2_setDoorLocked; @@ -67,19 +67,19 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) {  	op[149] = &AGOSEngine::oe2_ifDoorClosed;  	op[150] = &AGOSEngine::oe2_ifDoorLocked;  	op[162] = &AGOSEngine::oww_screenTextMsg; -	op[175] = &AGOSEngine::o_getDollar2; -	op[179] = &AGOSEngine::o_isAdjNoun; -	op[180] = &AGOSEngine::o_b2Set; -	op[181] = &AGOSEngine::o_b2Clear; -	op[182] = &AGOSEngine::o_b2Zero; -	op[183] = &AGOSEngine::o_b2NotZero; +	op[175] = &AGOSEngine::oe2_getDollar2; +	op[179] = &AGOSEngine::oe2_isAdjNoun; +	op[180] = &AGOSEngine::oe2_b2Set; +	op[181] = &AGOSEngine::oe2_b2Clear; +	op[182] = &AGOSEngine::oe2_b2Zero; +	op[183] = &AGOSEngine::oe2_b2NotZero;  	op[184] = &AGOSEngine::oww_boxMessage;  	op[185] = &AGOSEngine::oww_boxMsg;  	op[186] = &AGOSEngine::oww_boxLongText;  	op[187] = &AGOSEngine::oww_printBox;  	op[188] = &AGOSEngine::oww_boxPObj; -	op[189] = &AGOSEngine::o_lockZones; -	op[190] = &AGOSEngine::o_unlockZones; +	op[189] = &AGOSEngine::oww_lockZones; +	op[190] = &AGOSEngine::oww_unlockZones;  }  // ----------------------------------------------------------------------- @@ -102,6 +102,50 @@ void AGOSEngine::oww_goto() {  	setItemParent(me(), derefItem(item));  } +void AGOSEngine::oww_addTextBox() { +	// 65: add hit area +	uint id = getVarOrWord(); +	uint x = getVarOrWord(); +	uint y = getVarOrWord(); +	uint w = getVarOrWord(); +	uint h = getVarOrWord(); +	uint number = getVarOrByte(); +	if (number < _numTextBoxes) +		defineBox(id, x, y, w, h, (number << 8) + 129, 208, _dummyItem2); +} + +void AGOSEngine::oww_setShortText() { +	// 66: set item name +	uint var = getVarOrByte(); +	uint stringId = getNextStringID(); +	if (var < _numTextBoxes) { +		_shortText[var] = stringId; +	} +} + +void AGOSEngine::oww_setLongText() { +	// 67: set item description +	uint var = getVarOrByte(); +	uint stringId = getNextStringID(); +	if (getFeatures() & GF_TALKIE) { +		uint speechId = getNextWord(); +		if (var < _numTextBoxes) { +			_longText[var] = stringId; +			_longSound[var] = speechId; +		} +	} else { +		if (var < _numTextBoxes) { +			_longText[var] = stringId; +		} +	} +} + +void AGOSEngine::oww_printLongText() { +	// 70: show string from array +	const char *str = (const char *)getStringPtrByID(_longText[getVarOrByte()]); +	showMessageFormat("%s\n", str); +} +  void AGOSEngine::oww_whereTo() {  	// 85: where to  	Item *i = getNextItemPtr(); @@ -159,4 +203,15 @@ void AGOSEngine::oww_boxPObj() {  		boxTextMsg((const char *)getStringPtrByID(subObject->objectFlagValue[0]));  } +void AGOSEngine::oww_lockZones() { +	// 189: lock zone +	_vgaMemBase = _vgaMemPtr; +} + +void AGOSEngine::oww_unlockZones() { +	// 190: unlock zone +	_vgaMemPtr = _vgaFrozenBase; +	_vgaMemBase = _vgaFrozenBase; +} +  } // End of namespace AGOS  | 
