From bcfbf5df47664f8caae8a1fbfcb8ffc831a2d8e0 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Tue, 29 May 2012 22:54:02 +0200 Subject: LILLIPUT: Fix bug in OC_sub17A07 and renderCharacters, implement OC_startSpeechWithoutSpeeker Some renaming, too --- engines/lilliput/lilliput.cpp | 24 +++++----- engines/lilliput/lilliput.h | 2 +- engines/lilliput/script.cpp | 100 +++++++++++++++++++++++------------------- engines/lilliput/script.h | 8 ++-- 4 files changed, 69 insertions(+), 65 deletions(-) (limited to 'engines') diff --git a/engines/lilliput/lilliput.cpp b/engines/lilliput/lilliput.cpp index a31688c7dd..55de37ec58 100644 --- a/engines/lilliput/lilliput.cpp +++ b/engines/lilliput/lilliput.cpp @@ -184,7 +184,7 @@ LilliputEngine::LilliputEngine(OSystem *syst, const LilliputGameDescription *gd) _characterRelativePositionY[i] = -1; _characterDisplayX[i] = 0; _characterDisplayY[i] = 0; - _array12299[i] = 0xFF; + _array12299[i] = -1; _array109E9PosX[i] = -1; _array10A11PosY[i] = -1; _array16E94[i] = 0; @@ -1329,7 +1329,7 @@ void LilliputEngine::renderCharacters(byte *buf, Common::Point pos) { if ((flag & 1) == 1) frame += _spriteSizeArray[index]; - if (_array12299[index] != 0xFF) { + if (_array12299[index] != -1) { frame = _array12299[index] + 82; --_array12299[index]; frame = -frame; @@ -1801,7 +1801,7 @@ byte LilliputEngine::sub16722(int index, Common::Point var1) { } byte LilliputEngine::sub16729(int index, Common::Point var1) { - debugC(2, kDebugEngineTBC, "sub16729(%d, %d - %d)", index, var1.x, var1.y); + debugC(2, kDebugEngine, "sub16729(%d, %d - %d)", index, var1.x, var1.y); int param4x = ((index | 0xFF00) >> 8); int param1 = var1.y; @@ -1810,19 +1810,15 @@ byte LilliputEngine::sub16729(int index, Common::Point var1) { } byte LilliputEngine::sub1675D(int index, Common::Point var1) { - debugC(2, kDebugEngineTBC, "sub1675D(%d, %d - %d)", index, var1.x, var1.y); + debugC(2, kDebugEngine, "sub1675D(%d, %d - %d)", index, var1.x, var1.y); int var2 = _scriptHandler->_array10A39[index]; - int var1h = _scriptHandler->_array16123PosX[var2]; - int var1l = _scriptHandler->_array1614BPosY[var2]; - int var3 = _array109E9PosX[index]; - - if ((var3 != 0xFF) && (var3 == _array10999PosX[index])) { - var3 = _array10A11PosY[index]; - if (var3 == _array109C1PosY[index]) { - _array109E9PosX[index] = var1h; - _array10A11PosY[index] = var1l; - } + int8 var1h = _scriptHandler->_array16123PosX[var2]; + int8 var1l = _scriptHandler->_array1614BPosY[var2]; + + if ((_array109E9PosX[index] != -1) && (_array109E9PosX[index] == _array10999PosX[index]) && (_array10A11PosY[index] == _array109C1PosY[index])) { + _array109E9PosX[index] = var1h; + _array10A11PosY[index] = var1l; } _array10999PosX[index] = var1h; diff --git a/engines/lilliput/lilliput.h b/engines/lilliput/lilliput.h index 49892d88c3..1006c34a1b 100644 --- a/engines/lilliput/lilliput.h +++ b/engines/lilliput/lilliput.h @@ -205,7 +205,7 @@ public: int16 _characterRelativePositionY[40]; int16 _characterDisplayX[40]; int16 _characterDisplayY[40]; - byte _array12299[40]; + int8 _array12299[40]; int16 _array109E9PosX[40]; int16 _array10A11PosY[40]; byte _array16E94[40]; diff --git a/engines/lilliput/script.cpp b/engines/lilliput/script.cpp index de250c802c..b34acdec84 100644 --- a/engines/lilliput/script.cpp +++ b/engines/lilliput/script.cpp @@ -264,7 +264,7 @@ void LilliputScript::handleOpcodeType2(int curWord) { OC_sub17E07_speech4param(); break; case 0x7: - OC_sub17E15_speech2param(); + OC_startSpeechIfSilent(); break; case 0x8: OC_ComputeCharacterVariable(); @@ -393,7 +393,7 @@ void LilliputScript::handleOpcodeType2(int curWord) { OC_sub17FDD(); break; case 0x32: - OC_setByte10B29(); + OC_setCharacterScriptEnabled(); break; case 0x33: OC_setCurrentCharacterVar2(); @@ -495,7 +495,7 @@ void LilliputScript::handleOpcodeType2(int curWord) { OC_displayVGAFile(); break; case 0x54: - OC_sub184D7(); + OC_startSpeechWithoutSpeeker(); break; case 0x55: OC_displayTitleScreen(); @@ -543,7 +543,7 @@ void LilliputScript::handleOpcodeType2(int curWord) { OC_sub1875D_snd(); break; case 0x64: - OC_setArray128E(); + OC_setArray128EF(); break; case 0x65: OC_initGameAreaDisplay(); @@ -616,7 +616,7 @@ static const OpCode opCodes2[] = { /* 0x04 */ { "OC_sub17DB9_speech3", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone }, // todo /* 0x05 */ { "OC_startSpeechIfMute", 1, kImmediateValue, kNone, kNone, kNone, kNone }, /* 0x06 */ { "OC_sub17E07_speech4param", 4, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kNone }, // pb -/* 0x07 */ { "OC_sub17E15_speech2param", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone }, +/* 0x07 */ { "OC_startSpeechIfSilent", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone }, /* 0x08 */ { "OC_ComputeCharacterVariable", 4, kGetValue1, kImmediateValue, kComputeOperation, kImmediateValue, kNone }, /* 0x09 */ { "OC_getRandom_type2", 3, kGetValue1, kImmediateValue, kImmediateValue, kNone, kNone }, /* 0x0a */ { "OC_setCharacterPosition", 2, kGetValue1, kgetPosFromScript, kNone, kNone, kNone }, @@ -659,7 +659,7 @@ static const OpCode opCodes2[] = { /* 0x2f */ { "OC_skipNextVal", 1, kImmediateValue, kNone, kNone, kNone, kNone }, /* 0x30 */ { "OC_setCurrentCharacterVar6", 1, kGetValue1, kNone, kNone, kNone, kNone }, /* 0x31 */ { "OC_sub17FDD", 1, kImmediateValue, kNone, kNone, kNone, kNone }, -/* 0x32 */ { "OC_setByte10B29", 1, kGetValue1, kNone, kNone, kNone, kNone }, +/* 0x32 */ { "OC_setCharacterScriptEnabled", 1, kGetValue1, kNone, kNone, kNone, kNone }, /* 0x33 */ { "OC_setCurrentCharacterVar2", 1, kImmediateValue, kNone, kNone, kNone, kNone }, /* 0x34 */ { "OC_SetCurrentCharacterVar2ToZero", 0, kNone, kNone, kNone, kNone, kNone }, /* 0x35 */ { "OC_setCharacterProperties", 5, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue }, @@ -693,7 +693,7 @@ static const OpCode opCodes2[] = { /* 0x51 */ { "OC_sub1844A", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone }, /* 0x52 */ { "OC_displayNumericCharacterVariable", 5, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue }, /* 0x53 */ { "OC_displayVGAFile", 1, kImmediateValue, kNone, kNone, kNone, kNone }, -/* 0x54 */ { "OC_sub184D7", 1, kImmediateValue, kNone, kNone, kNone, kNone }, // TODO +/* 0x54 */ { "OC_startSpeechWithoutSpeeker", 1, kImmediateValue, kNone, kNone, kNone, kNone }, // TODO /* 0x55 */ { "OC_displayTitleScreen", 1, kImmediateValue, kNone, kNone, kNone, kNone }, /* 0x56 */ { "OC_initGameAreaDisplay", 0, kNone, kNone, kNone, kNone, kNone }, /* 0x57 */ { "OC_displayCharacterStatBar", 6, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue}, @@ -709,7 +709,7 @@ static const OpCode opCodes2[] = { /* 0x61 */ { "OC_sub1873F_snd", 1, kgetPosFromScript, kNone, kNone, kNone, kNone }, /* 0x62 */ { "OC_sub18746_snd", 1, kImmediateValue, kNone, kNone, kNone, kNone }, /* 0x63 */ { "OC_sub1875D_snd", 0, kNone, kNone, kNone, kNone, kNone }, -/* 0x64 */ { "OC_setArray128E", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone }, +/* 0x64 */ { "OC_setArray128EF", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone }, /* 0x65 */ { "OC_initGameAreaDisplay", 0, kNone, kNone, kNone, kNone, kNone } }; @@ -1849,7 +1849,7 @@ byte LilliputScript::OC_checkLastInterfaceHotspotIndexMenu13() { } byte LilliputScript::OC_checkLastInterfaceHotspotIndexMenu2() { - debugC(1, kDebugScriptTBC, "OC_checkLastInterfaceHotspotIndexMenu2()"); + debugC(1, kDebugScript, "OC_checkLastInterfaceHotspotIndexMenu2()"); int8 hotspotIndex = (_currScript->readUint16LE() & 0xFF); @@ -2000,12 +2000,12 @@ byte LilliputScript::OC_CurrentCharacterVar3Equals1() { } byte LilliputScript::OC_checkCharacterDirection() { - debugC(1, kDebugScriptTBC, "OC_checkCharacterDirection()"); + debugC(1, kDebugScript, "OC_checkCharacterDirection()"); - int var1 = getValue1(); - int var2 = _currScript->readUint16LE(); + int16 index = getValue1(); + byte expectedVal = (_currScript->readUint16LE() & 0xFF); - if (_vm->_characterDirectionArray[var1] == var2) + if (_vm->_characterDirectionArray[index] == expectedVal) return 1; return 0; } @@ -2025,7 +2025,7 @@ byte LilliputScript::OC_checkLastInterfaceHotspotIndex() { } byte LilliputScript::OC_checkSavedMousePos() { - debugC(1, kDebugScriptTBC, "OC_checkSavedMousePos()"); + debugC(1, kDebugScript, "OC_checkSavedMousePos()"); if ((_vm->_byte129A0 != -1) || (_vm->_savedMousePosDivided == Common::Point(-1, -1))) return 0; @@ -2066,24 +2066,29 @@ byte LilliputScript::OC_checkKeyPressed() { } byte LilliputScript::OC_sub17A07() { - debugC(1, kDebugScriptTBC, "OC_sub17A07()"); + debugC(1, kDebugScript, "OC_sub17A07()"); - static const byte _array179FD[10] = {11, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + static const byte array179FD[10] = {11, 2, 3, 4, 5, 6, 7, 8, 9, 10}; if (_vm->_byte16F07_menuId == 6) { - int index = _currScript->readUint16LE(); - if (_array179FD[index] == _vm->_array147D1[0]) { + uint16 index = _currScript->readUint16LE(); + if (array179FD[index] == _vm->_array147D1[0]) { index = _currScript->readUint16LE(); - if (_array179FD[index] == _vm->_array147D1[1]) { + if (array179FD[index] == _vm->_array147D1[1]) { index = _currScript->readUint16LE(); - if (_array179FD[index] == _vm->_array147D1[2]) { + if (array179FD[index] == _vm->_array147D1[2]) { return 1; } - } - } - } - - _currScript->seek(_currScript->pos() + 6); + } else + // skip last index check + _currScript->seek(_currScript->pos() + 2); + } else + // skip two last index checks + _currScript->seek(_currScript->pos() + 4); + } else + // skip the three index checks + _currScript->seek(_currScript->pos() + 6); + return 0; } @@ -2228,8 +2233,8 @@ void LilliputScript::OC_sub17E07_speech4param() { } -void LilliputScript::OC_sub17E15_speech2param() { - debugC(1, kDebugScriptTBC, "OC_sub17E15_speech2param()"); +void LilliputScript::OC_startSpeechIfSilent() { + debugC(1, kDebugScript, "OC_startSpeechIfSilent()"); if (_talkingCharacter == -1) { OC_sub17DB9_speech3(); @@ -2446,12 +2451,12 @@ void LilliputScript::OC_sub17C55() { } void LilliputScript::OC_sub17C76() { - debugC(1, kDebugScriptTBC, "OC_sub17C76()"); + debugC(1, kDebugScript, "OC_sub17C76()"); - int var1 = getValue1(); - _vm->_rulesBuffer2_5[var1] = -1; - _vm->_characterPositionAltitude[var1] = 0; - _characterScriptEnabled[var1] = 1; + int index = getValue1(); + _vm->_rulesBuffer2_5[index] = -1; + _vm->_characterPositionAltitude[index] = 0; + _characterScriptEnabled[index] = 1; } @@ -2715,11 +2720,11 @@ void LilliputScript::OC_sub17FDD() { _array12811[_vm->_currentScriptCharacter] = 16; } -void LilliputScript::OC_setByte10B29() { - debugC(1, kDebugScriptTBC, "OC_setByte10B29()"); +void LilliputScript::OC_setCharacterScriptEnabled() { + debugC(1, kDebugScript, "OC_setCharacterScriptEnabled()"); - int var1 = getValue1(); - _characterScriptEnabled[var1] = 1; + int16 index = getValue1(); + _characterScriptEnabled[index] = 1; } void LilliputScript::OC_setCurrentCharacterVar2() { @@ -2922,10 +2927,10 @@ void LilliputScript::OC_sub18213() { } void LilliputScript::OC_sub18252() { - debugC(1, kDebugScriptTBC, "OC_sub18252()"); + debugC(1, kDebugScript, "OC_sub18252()"); - int index = getValue1(); - assert(index < 40); + int16 index = getValue1(); + assert((index >0) && (index < 40)); _vm->_array12299[index] = 4; } @@ -3039,10 +3044,10 @@ void LilliputScript::OC_sub183A2() { } void LilliputScript::OC_disableInterfaceHotspot() { - debugC(1, kDebugScriptTBC, "OC_disableInterfaceHotspot()"); + debugC(1, kDebugScript, "OC_disableInterfaceHotspot()"); int index = _currScript->readUint16LE(); - _array122FD[index] = (_currScript->readUint16LE() & 0xff); + _array122FD[index] = (_currScript->readUint16LE() & 0xFF); _interfaceHotspotStatus[index] = kHotspotDisabled; _vm->displayInterfaceHotspots(); @@ -3051,7 +3056,7 @@ void LilliputScript::OC_disableInterfaceHotspot() { void LilliputScript::OC_loadFile_AERIAL_GFX() { debugC(1, kDebugScriptTBC, "OC_loadFile_AERIAL_GFX()"); - int var1 = _currScript->readUint16LE() & 0xff; + int var1 = _currScript->readUint16LE() & 0xFF; _vm->_byte15EAD = var1; _vm->_refreshScreenFlag = true; @@ -3131,8 +3136,11 @@ void LilliputScript::OC_displayVGAFile() { _vm->paletteFadeIn(); } -void LilliputScript::OC_sub184D7() { - warning("OC_sub184D7"); +void LilliputScript::OC_startSpeechWithoutSpeeker() { + debugC(1, kDebugScript, "OC_startSpeechWithoutSpeeker()"); + + int16 speechId = _currScript->readUint16LE(); + startSpeech(speechId); } void LilliputScript::OC_displayTitleScreen() { @@ -3314,8 +3322,8 @@ void LilliputScript::OC_sub1875D_snd() { _vm->_soundHandler->contentFct6(); } -void LilliputScript::OC_setArray128E() { - debugC(1, kDebugScript, "OC_setArray128E()"); +void LilliputScript::OC_setArray128EF() { + debugC(1, kDebugScript, "OC_setArray128EF()"); int index = getValue1(); int val = _currScript->readUint16LE(); diff --git a/engines/lilliput/script.h b/engines/lilliput/script.h index ca2087682e..757ce91ab5 100644 --- a/engines/lilliput/script.h +++ b/engines/lilliput/script.h @@ -200,7 +200,7 @@ private: void OC_sub17DB9_speech3(); void OC_startSpeechIfMute(); void OC_sub17E07_speech4param(); - void OC_sub17E15_speech2param(); + void OC_startSpeechIfSilent(); void OC_ComputeCharacterVariable(); void OC_getRandom_type2(); void OC_setCharacterPosition(); @@ -243,7 +243,7 @@ private: void OC_skipNextVal(); void OC_setCurrentCharacterVar6(); void OC_sub17FDD(); - void OC_setByte10B29(); + void OC_setCharacterScriptEnabled(); void OC_setCurrentCharacterVar2(); void OC_SetCurrentCharacterVar2ToZero(); void OC_setCharacterProperties(); @@ -278,7 +278,7 @@ private: void OC_sub1844A(); void OC_displayNumericCharacterVariable(); void OC_displayVGAFile(); - void OC_sub184D7(); + void OC_startSpeechWithoutSpeeker(); void OC_displayTitleScreen(); void OC_initGameAreaDisplay(); void OC_displayCharacterStatBar(); @@ -294,7 +294,7 @@ private: void OC_sub1873F_snd(); void OC_sub18746_snd(); void OC_sub1875D_snd(); - void OC_setArray128E(); + void OC_setArray128EF(); }; } // End of namespace Lilliput -- cgit v1.2.3