scummvm/engines/lilliput/script.cpp

3258 lines
81 KiB
C++
Raw Normal View History

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "lilliput/lilliput.h"
#include "lilliput/script.h"
#include "common/debug.h"
#include "common/system.h"
namespace Lilliput {
LilliputScript::LilliputScript(LilliputEngine *vm) : _vm(vm), _currScript(NULL) {
_byte129A0 = 0xFF;
_byte10806 = 0;
_byte12FE4 = 0xFF;
2012-04-12 20:53:38 +02:00
_byte16F02 = 0;
_byte16F04 = 0;
_byte1881A = 0;
_byte18823 = 0;
2012-05-11 23:32:26 +02:00
_speechDisplaySpeed = 3;
_speechTimer = 0;
_word16F00 = -1;
_word129A3 = 0;
_viewportCharacterTarget = -1;
_heroismBarX = 0;
_heroismBarBottomY = 0;
_viewportPos.x = 0;
_viewportPos.y = 0;
_word18776 = 0;
_array129A5[0] = 0;
_array129A5[1] = 1;
_array129A5[2] = 2;
_array129A5[3] = 3;
2012-04-07 18:09:30 +02:00
_savedBuffer215Ptr = NULL;
for (int i = 0; i < 20; i++) {
_array122E9[i] = 0;
_array122FD[i] = 0;
}
2012-04-08 12:54:56 +02:00
for (int i = 0; i < 32; i++)
2012-05-10 19:55:39 +02:00
_array1813BPos[i] = Common::Point(0, 0);
2012-04-08 12:54:56 +02:00
for (int i = 0; i < 40; i++) {
_characterScriptEnabled[i] = 1;
_array128EF[i] = 15;
_array10AB1[i] = 0;
_array12811[i] = 16;
2012-04-12 20:53:38 +02:00
_array12839[i] = 0xFF;
_array16123PosX[i] = 0;
_array1614BPosY[i] = 0;
_array122C1[i] = 0;
2012-04-12 20:53:38 +02:00
}
for (int i = 0; i < 640; i++) {
_array12311[i] = Common::Point(-1, -1);
2012-04-08 12:54:56 +02:00
}
2012-05-08 20:01:11 +02:00
for (int i = 0; i < 1600; i++)
_array10B51[i] = 0;
}
LilliputScript::~LilliputScript() {
}
byte LilliputScript::handleOpcodeType1(int curWord) {
2012-05-09 08:07:58 +02:00
debugC(2, kDebugScript, "handleOpcodeType1(0x%x)", curWord);
switch (curWord) {
case 0x0:
return OC_checkCharacterGoalPos();
break;
case 0x1:
return OC_comparePos();
break;
case 0x2:
return OC_sub1740A();
break;
case 0x3:
2012-05-10 08:11:45 +02:00
return OC_compareCharacterId();
break;
case 0x4:
return OC_sub17468();
break;
case 0x5:
return OC_getRandom();
break;
case 0x6:
2012-04-27 23:17:40 +02:00
return OC_for();
break;
case 0x7:
return OC_compWord18776();
break;
case 0x8:
return OC_checkSaveFlag();
break;
case 0x9:
return OC_compByte16F04();
break;
case 0xA:
return OC_sub174D8();
break;
case 0xB:
return OC_sub1750E();
break;
case 0xC:
return OC_compareCoords_1();
break;
case 0xD:
return OC_compareCoords_2();
break;
case 0xE:
return OC_sub1757C();
break;
case 0xF:
return OC_sub1759E();
break;
case 0x10:
return OC_compWord16EF8();
break;
case 0x11:
return OC_sub175C8();
break;
case 0x12:
return OC_sub17640();
break;
case 0x13:
return OC_sub176C4();
break;
case 0x14:
return OC_compWord10804();
break;
case 0x15:
return OC_sub17766();
break;
case 0x16:
return OC_sub17782();
break;
case 0x17:
return OC_sub1779E();
break;
case 0x18:
return OC_sub177C6();
break;
case 0x19:
return OC_compWord16EFE();
break;
case 0x1A:
return OC_sub177F5();
break;
case 0x1B:
return OC_CurrentCharacterVar0Equals();
break;
case 0x1C:
return OC_sub17825();
break;
case 0x1D:
return OC_sub17844();
break;
case 0x1E:
return OC_sub1785C();
break;
case 0x1F:
return OC_sub17886();
break;
case 0x20:
return OC_CompareGameVariables();
break;
case 0x21:
return OC_skipNextOpcode();
break;
case 0x22:
return OC_CurrentCharacterVar2Equals1();
break;
case 0x23:
return OC_sub178D2();
break;
case 0x24:
return OC_sub178E8();
break;
case 0x25:
return OC_sub178FC();
break;
case 0x26:
return OC_sub1790F();
break;
case 0x27:
return OC_CurrentCharacterVar1Equals();
break;
case 0x28:
return OC_sub1793E();
break;
case 0x29:
return OC_sub1795E();
break;
case 0x2A:
2012-04-30 17:57:23 +02:00
return OC_checkCharacterDirection();
break;
case 0x2B:
return OC_sub17984();
break;
case 0x2C:
return OC_checkSavedMousePos();
break;
case 0x2D:
return OC_sub179AE();
break;
case 0x2E:
return OC_sub179C2();
break;
case 0x2F:
return OC_sub179E5();
break;
case 0x30:
return OC_sub17A07();
break;
case 0x31:
2012-05-11 20:47:17 +02:00
return OC_checkViewPortCharacterTarget();
break;
default:
error("Unexpected opcode %d", curWord);
break;
}
}
void LilliputScript::handleOpcodeType2(int curWord) {
2012-05-09 08:07:58 +02:00
debugC(2, kDebugScript, "handleOpcodeType2(0x%x)", curWord);
switch (curWord) {
case 0x0:
OC_setWord18821();
break;
case 0x1:
OC_sub17A3E();
break;
case 0x2:
2012-05-11 23:32:26 +02:00
OC_sub17D57_speech1();
break;
case 0x3:
2012-05-11 23:32:26 +02:00
OC_sub17D7F_speech2();
break;
case 0x4:
2012-05-11 23:32:26 +02:00
OC_sub17DB9_speech3();
break;
case 0x5:
2012-05-11 23:32:26 +02:00
OC_sub17DF9_speech1param();
break;
case 0x6:
2012-05-11 23:32:26 +02:00
OC_sub17E07_speech4param();
break;
case 0x7:
2012-05-11 23:32:26 +02:00
OC_sub17E15_speech2param();
break;
case 0x8:
OC_sub17B03();
break;
case 0x9:
OC_getRandom_type2();
break;
case 0xA:
OC_setCharacterPosition();
break;
case 0xB:
OC_sub17A8D();
break;
case 0xC:
OC_saveAndQuit();
break;
case 0xD:
OC_sub17B93();
break;
case 0xE:
2012-05-11 23:32:26 +02:00
OC_sub17E37_speech4();
break;
case 0xF:
OC_resetByte1714E();
break;
case 0x10:
OC_deleteSavegameAndQuit();
break;
case 0x11:
OC_incByte16F04();
break;
case 0x12:
OC_sub17BA5();
break;
case 0x13:
OC_setByte18823();
break;
case 0x14:
OC_callScript();
break;
case 0x15:
OC_callScriptAndReturn();
break;
case 0x16:
OC_setCurrentScriptCharacterPos();
break;
case 0x17:
OC_resetByte16F04();
break;
case 0x18:
OC_sub17AE1();
break;
case 0x19:
OC_sub17AEE();
break;
case 0x1A:
OC_setWord10804();
break;
case 0x1B:
OC_sub17C0E();
break;
case 0x1C:
OC_sub17C55();
break;
case 0x1D:
OC_sub17C76();
break;
case 0x1E:
OC_sub17AFC();
break;
case 0x1F:
OC_sub17C8B();
break;
case 0x20:
OC_sub17CA2();
break;
case 0x21:
OC_sub17CB9();
break;
case 0x22:
OC_sub17CD1();
break;
case 0x23:
OC_resetWord16EFE();
break;
case 0x24:
OC_sub17CEF();
break;
case 0x25:
OC_IncCurrentCharacterVar1();
break;
case 0x26:
OC_sub17D23();
break;
case 0x27:
OC_sub17E6D();
break;
case 0x28:
OC_changeCurrentCharacterSprite();
break;
case 0x29:
OC_sub17E99();
break;
case 0x2A:
OC_sub17EC5();
break;
case 0x2B:
OC_setCharacterDirectionTowardsPos();
break;
case 0x2C:
OC_sub17F08();
break;
case 0x2D:
OC_sub17F4F();
break;
case 0x2E:
OC_sub17F68();
break;
case 0x2F:
OC_skipNextVal();
break;
case 0x30:
OC_sub17FD2();
break;
case 0x31:
OC_sub17FDD();
break;
case 0x32:
OC_setByte10B29();
break;
case 0x33:
OC_setCurrentCharacterVar2();
break;
case 0x34:
OC_SetCurrentCharacterVar2ToZero();
break;
case 0x35:
OC_sub1801D();
break;
case 0x36:
OC_sub1805D();
break;
case 0x37:
OC_sub18074();
break;
case 0x38:
2012-04-30 17:57:23 +02:00
OC_setCurrentCharacterDirection();
break;
case 0x39:
OC_sub18099();
break;
case 0x3A:
OC_sub180C3();
break;
case 0x3B:
2012-05-11 20:47:17 +02:00
OC_setViewPortPos();
break;
case 0x3C:
2012-05-11 20:47:17 +02:00
OC_setCurrentCharacterAltitude();
break;
case 0x3D:
OC_sub1817F();
break;
case 0x3E:
OC_sub181BB();
break;
case 0x3F:
OC_sub18213();
break;
case 0x40:
OC_sub18252();
break;
case 0x41:
OC_sub18260();
break;
case 0x42:
OC_sub182EC();
break;
case 0x43:
2012-04-22 23:07:09 +02:00
OC_PaletteFadeOut();
break;
case 0x44:
2012-04-22 23:07:09 +02:00
OC_PaletteFadeIn();
break;
case 0x45:
OC_loadAndDisplayCUBESx_GFX();
break;
case 0x46:
OC_sub1834C();
break;
case 0x47:
2012-05-01 12:18:52 +02:00
OC_setArray122C1();
break;
case 0x48:
OC_sub18367();
break;
case 0x49:
OC_sub17D04();
break;
case 0x4A:
OC_sub18387();
break;
case 0x4B:
2012-04-29 11:48:10 +02:00
OC_setDebugFlag();
break;
case 0x4C:
OC_setByte14837();
break;
case 0x4D:
OC_sub183A2();
break;
case 0x4E:
OC_sub183C6();
break;
case 0x4F:
OC_loadFile_AERIAL_GFX();
break;
case 0x50:
2012-05-11 23:32:26 +02:00
OC_sub17E22_speech1IfSoundOff();
break;
case 0x51:
OC_sub1844A();
break;
case 0x52:
OC_sub1847F();
break;
case 0x53:
OC_displayVGAFile();
break;
case 0x54:
OC_sub184D7();
break;
case 0x55:
2012-04-10 10:06:50 +02:00
OC_displayTitleScreen();
break;
case 0x56:
OC_sub1853B();
break;
case 0x57:
OC_sub1864D();
break;
case 0x58:
2012-05-11 17:01:00 +02:00
OC_initSmallAnim();
break;
case 0x59:
OC_sub18678();
break;
case 0x5A:
OC_sub18690();
break;
case 0x5B:
2012-04-30 17:57:23 +02:00
OC_setViewPortCharacterTarget();
break;
case 0x5C:
OC_sub186A1();
break;
case 0x5D:
OC_sub186E5_snd();
break;
case 0x5E:
OC_sub1870A_snd();
break;
case 0x5F:
OC_sub18725_snd();
break;
case 0x60:
OC_sub18733_snd();
break;
case 0x61:
OC_sub1873F_snd();
break;
case 0x62:
OC_sub18746_snd();
break;
case 0x63:
OC_sub1875D_snd();
break;
case 0x64:
OC_sub18764();
break;
case 0x65:
OC_sub1853B();
break;
default:
error("Unknown opcode %d", curWord);
break;
}
}
static const OpCode opCodes1[] = {
{ "OC_checkCharacterGoalPos", 1, kgetPosFromScript, kNone, kNone, kNone, kNone },
{ "OC_comparePos", 2, kGetValue1, kgetPosFromScript, kNone, kNone, kNone },
{ "OC_sub1740A", 1, kImmediateValue, kNone, kNone, kNone, kNone },
2012-05-10 08:11:45 +02:00
{ "OC_compareCharacterId", 4, kGetValue1, kImmediateValue, kCompareOperation, kImmediateValue, kNone },
{ "OC_sub17468", 2, kCompareOperation, kImmediateValue, kNone, kNone, kNone },
{ "OC_getRandom", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_for", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
{ "OC_compWord18776", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_checkSaveFlag", 0, kNone, kNone, kNone, kNone, kNone },
{ "OC_compByte16F04", 2, kCompareOperation, kImmediateValue, kNone, kNone, kNone },
{ "OC_sub174D8", 2, kGetValue1, kGetValue1, kNone, kNone, kNone },
{ "OC_sub1750E", 5, kGetValue1, kImmediateValue, kCompareOperation, kGetValue1, kImmediateValue },
{ "OC_compareCoords_1", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_compareCoords_2", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
{ "OC_sub1757C", 3, kgetPosFromScript, kCompareOperation, kImmediateValue, kNone, kNone },
{ "OC_sub1759E", 3, kGetValue1, kCompareOperation, kImmediateValue, kNone, kNone },
{ "OC_compWord16EF8", 1, kGetValue1, kNone, kNone, kNone, kNone },
{ "OC_sub175C8", 2, kImmediateValue, kGetValue1, kNone, kNone, kNone },
{ "OC_sub17640", 2, kImmediateValue, kGetValue1, kNone, kNone, kNone },
{ "OC_sub176C4", 2, kImmediateValue, kGetValue1, kNone, kNone, kNone },
{ "OC_compWord10804", 1, kGetValue1, kNone, kNone, kNone, kNone },
{ "OC_sub17766", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub17782", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub1779E", 4, kgetPosFromScript, kImmediateValue, kImmediateValue, kCompareOperation, kNone },
{ "OC_sub177C6", 1, kGetValue1, kNone, kNone, kNone, kNone },
{ "OC_compWord16EFE", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub177F5", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
{ "OC_CurrentCharacterVar0Equals", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub17825", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub17844", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub1785C", 3, kImmediateValue, kCompareOperation, kImmediateValue, kNone, kNone },
{ "OC_sub17886", 1, kgetPosFromScript, kNone, kNone, kNone, kNone },
{ "OC_CompareGameVariables", 2, kGetValue1, kGetValue1, kNone, kNone, kNone },
{ "OC_skipNextOpcode", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_CurrentCharacterVar2Equals1", 0, kNone, kNone, kNone, kNone, kNone },
{ "OC_sub178D2", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
{ "OC_sub178E8", 3, kGetValue1, kImmediateValue, kImmediateValue, kNone, kNone },
{ "OC_sub178FC", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub1790F", 1, kGetValue1, kNone, kNone, kNone, kNone },
{ "OC_CurrentCharacterVar1Equals", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub1793E", 0, kNone, kNone, kNone, kNone, kNone },
{ "OC_sub1795E", 0, kNone, kNone, kNone, kNone, kNone },
{ "OC_sub1796E", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
{ "OC_sub17984", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
{ "OC_checkSavedMousePos", 0, kNone, kNone, kNone, kNone, kNone },
{ "OC_sub179AE", 0, kNone, kNone, kNone, kNone, kNone },
{ "OC_sub179C2", 1, kgetPosFromScript, kNone, kNone, kNone, kNone },
{ "OC_sub179E5", 1, kImmediateValue, kNone, kNone, kNone, kNone },
{ "OC_sub17A07", 3, kImmediateValue, kImmediateValue, kImmediateValue, kNone, kNone },
2012-05-11 20:47:17 +02:00
{ "OC_checkViewPortCharacterTarget", 1, kGetValue1, kNone, kNone, kNone, kNone },
};
static const OpCode opCodes2[] = {
/* 0x00 */ { "OC_setWord18821", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x01 */ { "OC_sub17A3E", 3, kgetPosFromScript, kImmediateValue, kImmediateValue, kNone, kNone },
2012-05-11 23:32:26 +02:00
/* 0x02 */ { "OC_sub17D57_speech1", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x03 */ { "OC_sub17D7F_speech2", 4, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kNone },
/* 0x04 */ { "OC_sub17DB9_speech3", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone }, // todo
/* 0x05 */ { "OC_sub17DF9_speech1param", 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 },
/* 0x08 */ { "OC_sub17B03", 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 },
/* 0x0b */ { "OC_sub17A8D", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x0c */ { "OC_saveAndQuit", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x0d */ { "OC_sub17B93", 1, kImmediateValue, kNone, kNone, kNone, kNone }, // todo : jump to other opcode
2012-05-11 23:32:26 +02:00
/* 0x0e */ { "OC_sub17E37_speech4", 0, kNone, kNone, kNone, kNone, kNone }, // todo
/* 0x0f */ { "OC_resetByte1714E", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x10 */ { "OC_deleteSavegameAndQuit", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x11 */ { "OC_incByte16F04", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x12 */ { "OC_sub17BA5", 5, kGetValue1, kImmediateValue,kComputeOperation, kGetValue1, kImmediateValue },
/* 0x13 */ { "OC_setByte18823", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
/* 0x14 */ { "OC_callScript", 2, kImmediateValue, kGetValue1, kNone, kNone, kNone }, // run script
/* 0x15 */ { "OC_callScriptAndReturn", 2, kImmediateValue, kGetValue1, kNone, kNone, kNone }, // run script then stop
/* 0x16 */ { "OC_setCurrentScriptCharacterPos", 1, kgetPosFromScript, kNone, kNone, kNone, kNone },
/* 0x17 */ { "OC_resetByte16F04", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x18 */ { "OC_sub17AE1", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x19 */ { "OC_sub17AEE", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x1a */ { "OC_setWord10804", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x1b */ { "OC_sub17C0E", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x1c */ { "OC_sub17C55", 4, kGetValue1, kGetValue1, kImmediateValue, kImmediateValue, kNone },
/* 0x1d */ { "OC_sub17C76", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x1e */ { "OC_sub17AFC", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x1f */ { "OC_sub17C8B", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x20 */ { "OC_sub17CA2", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x21 */ { "OC_sub17CB9", 3, kImmediateValue, kGetValue1, kImmediateValue, kNone, kNone },
/* 0x22 */ { "OC_sub17CD1", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x23 */ { "OC_resetWord16EFE", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x24 */ { "OC_sub17CEF", 1, kImmediateValue, kNone, kNone, kNone, kNone }, // stop script
/* 0x25 */ { "OC_IncCurrentCharacterVar1", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x26 */ { "OC_sub17D23", 2, kImmediateValue, kgetPosFromScript, kNone, kNone, kNone },
/* 0x27 */ { "OC_sub17E6D", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x28 */ { "OC_sub17E7E", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x29 */ { "OC_sub17E99", 4, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue, kNone },
/* 0x2a */ { "OC_sub17EC5", 4, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue, kNone },
/* 0x2b */ { "OC_setCharacterDirectionTowardsPos", 1, kgetPosFromScript, kNone, kNone, kNone, kNone },
/* 0x2c */ { "OC_sub17F08", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x2d */ { "OC_sub17F4F", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x2e */ { "OC_sub17F68", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x2f */ { "OC_skipNextVal", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x30 */ { "OC_sub17FD2", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x31 */ { "OC_sub17FDD", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x32 */ { "OC_setByte10B29", 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_sub1801D", 5, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue },
/* 0x36 */ { "OC_sub1805D", 5, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue },
/* 0x37 */ { "OC_sub18074", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x38 */ { "OC_setCurrentCharacterDirection", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x39 */ { "OC_sub18099", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x3a */ { "OC_sub180C3", 1, kImmediateValue, kNone, kNone, kNone, kNone },
2012-05-11 20:47:17 +02:00
/* 0x3b */ { "OC_setViewPortPos", 1, kgetPosFromScript, kNone, kNone, kNone, kNone },
/* 0x3c */ { "OC_setCurrentCharacterAltitude", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x3d */ { "OC_sub1817F", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone },
/* 0x3e */ { "OC_sub181BB", 4, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue, kNone },
/* 0x3f */ { "OC_sub18213", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x40 */ { "OC_sub18252", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x41 */ { "OC_sub18260", 2, kGetValue1, kgetPosFromScript, kNone, kNone, kNone }, // TODO
/* 0x42 */ { "OC_sub182EC", 4, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kNone },
/* 0x43 */ { "OC_PaletteFadeOut", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x44 */ { "OC_PaletteFadeIn", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x45 */ { "OC_loadAndDisplayCUBESx_GFX", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x46 */ { "OC_sub1834C", 1, kImmediateValue, kNone, kNone, kNone, kNone },
2012-05-01 12:18:52 +02:00
/* 0x47 */ { "OC_setArray122C1", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x48 */ { "OC_sub18367", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x49 */ { "OC_sub17D04", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
/* 0x4a */ { "OC_sub18387", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
/* 0x4b */ { "OC_setDebugFlag", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x4c */ { "OC_setByte14837", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x4d */ { "OC_sub183A2", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x4e */ { "OC_sub183C6", 2, kImmediateValue, kImmediateValue, kNone, kNone, kNone }, // TODO
/* 0x4f */ { "OC_loadFile_AERIAL_GFX", 1, kImmediateValue, kNone, kNone, kNone, kNone },
2012-05-11 23:32:26 +02:00
/* 0x50 */ { "OC_sub17E22_speech1IfSoundOff", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x51 */ { "OC_sub1844A", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
/* 0x52 */ { "OC_sub1847F", 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
/* 0x55 */ { "OC_displayTitleScreen", 1, kImmediateValue, kNone, kNone, kNone, kNone },
/* 0x56 */ { "OC_sub1853B", 0, kNone, kNone, kNone, kNone, kNone },
/* 0x57 */ { "OC_sub1864D", 4, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue, kNone }, // TODO
2012-05-11 17:01:00 +02:00
/* 0x58 */ { "OC_initSmallAnim", 11, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue, kImmediateValue },
/* 0x59 */ { "OC_sub18678", 4, kGetValue1, kImmediateValue, kImmediateValue, kImmediateValue, kNone },
/* 0x5a */ { "OC_sub18690", 2, kGetValue1, kgetPosFromScript, kNone, kNone, kNone }, //TODO
/* 0x5b */ { "OC_setViewPortCharacterTarget", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x5c */ { "OC_sub186A1", 3, kGetValue1, kImmediateValue, kImmediateValue, kNone, kNone }, //TODO
/* 0x5d */ { "OC_sub186E5_snd", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
/* 0x5e */ { "OC_sub1870A_snd", 2, kgetPosFromScript, kImmediateValue, kNone, kNone, kNone },
/* 0x5f */ { "OC_sub18725_snd", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 0x60 */ { "OC_sub18733_snd", 1, kGetValue1, kNone, kNone, kNone, kNone },
/* 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_sub18764", 2, kGetValue1, kImmediateValue, kNone, kNone, kNone },
/* 0x65 */ { "OC_sub1853B", 0, kNone, kNone, kNone, kNone, kNone }
};
Common::String LilliputScript::getArgumentString(KValueType type, ScriptStream& script) {
Common::String str;
if(type == kImmediateValue) {
str = Common::String::format("0x%x", script.readUint16LE());
} else if (type == kGetValue1) {
int val = script.readUint16LE();
if(val < 1000) {
str = Common::String::format("0x%x", val);
} else if (val > 1004) {
str = Common::String::format("getValue1(0x%x)", val);
} else if ( val == 1000 ) {
str = Common::String("_byte129A0");
} else if( val == 1001 ) {
str = Common::String("characterIndex");
} else if( val == 1002 ) {
str = Common::String("_word16F00");
} else if( val == 1003 ) {
str = Common::String("_currentCharacterVariables[6]");
} else if( val == 1004 ) {
str = Common::String("_word10804");
}
} else if (type == kgetPosFromScript) {
int curWord = script.readUint16LE();
int tmpVal = curWord >> 8;
switch(tmpVal) {
case 0xFF:
str = "(_rulesBuffer2_13[currentCharacter],_rulesBuffer2_14[currentCharacter])";
break;
case 0xFE: {
int index = curWord & 0xFF;
assert((index >= 0) && (index < 40));
str = Common::String::format("_vm->_rulesBuffer2_13[%d],_vm->_rulesBuffer2_14[%d]", index, index);
break;
}
case 0xFD:
str = "_currentScriptCharacterPosition";
break;
case 0xFC: {
int index = curWord & 0xFF;
assert(index < 40);
str = Common::String::format("(characterPositionTileX[%d], characterPositionTileY[%d])", index, index);
break;
}
case 0xFB: {
str = "(characterPositionTileX[_word16F00], characterPositionTileY[_word16F00])";
break;
}
case 0xFA:
str = Common::String::format("(_array10999PosX[currentCharacter], _array109C1PosY[currentCharacter])");
break;
case 0xF9:
str = Common::String::format("(_currentCharacterVariables[4], _currentCharacterVariables[5])");
break;
case 0xF8: {
int index = curWord & 0xFF;
assert((index >= 0) && (index < 40));
2012-05-06 23:38:13 +02:00
str = Common::String::format("_vm->_rulesBuffer12Pos3[%d]", index);
}
case 0xF7: {
str = Common::String::format("(_characterPositionTileX[_currentCharacterVariables[6]], _characterPositionTileY[_currentCharacterVariables[6]])");
break;
}
case 0xF6:
str = "_savedMousePosDivided";
break;
default:
str = Common::String::format("(0x%x,0x%x)", curWord >> 8, curWord & 0xFF);
break;
}
} else if (type == kCompareOperation) {
int comp = script.readUint16LE();
if(comp != '<' && comp != '>')
comp = '=';
str = Common::String::format("%c", comp );
}
else if (type == kComputeOperation) {
int comp = script.readUint16LE();
str = Common::String::format("%c", comp );
}
return str;
}
void LilliputScript::disasmScript( ScriptStream script) {
while(!script.eos()) {
uint16 val = script.readUint16LE();
if (val == 0xFFF6) // end of script
return;
bool hasIf = false;
if(val != 0xFFF8) {
hasIf = true;
}
bool firstIf = true;
// check the conditions.
while (val != 0xFFF8) {
bool neg = false;
if (val >= 1000) {
val -= 1000;
// negative condition
neg = true;
}
// op code type 1
assert(val < sizeof(opCodes1)/sizeof(OpCode));
const OpCode* opCode = &opCodes1[val];
const KValueType* opArgType = &opCode->_arg1;
Common::String str;
if(firstIf) {
str = "if (";
firstIf = false;
} else {
str = " ";
}
if (neg) str += "not ";
str += Common::String(opCode->_opName);
str += "(";
for (int p = 0; p < opCode->_numArgs; p++) {
str += getArgumentString(*opArgType, script);
if(p != opCode->_numArgs - 1)
str += ", ";
opArgType++;
}
str += ")";
val = script.readUint16LE();
if(val == 0xFFF8) {
str += ")";
}
debugC(2, kDebugScriptTBC, "%s", str.c_str());
}
debugC(2, kDebugScriptTBC, "{ ");
val = script.readUint16LE();
while (val != 0xFFF7) {
// op code type 2
assert(val < sizeof(opCodes2)/sizeof(OpCode));
const OpCode* opCode = &opCodes2[val];
const KValueType* opArgType = &opCode->_arg1;
Common::String str;
str = " ";
str += Common::String(opCode->_opName);
str += "(";
for (int p = 0; p < opCode->_numArgs; p++) {
str += getArgumentString(*opArgType, script);
if (p != opCode->_numArgs - 1)
str += ", ";
if ( p < 5 )
opArgType++;
}
str += ");";
debugC(2, kDebugScriptTBC, "%s", str.c_str());
val = script.readUint16LE();
}
debugC(2, kDebugScriptTBC, "} ");
debugC(2, kDebugScriptTBC, " ");
}
}
int LilliputScript::handleOpcode(ScriptStream *script) {
2012-05-09 08:07:58 +02:00
debugC(2, kDebugScript, "handleOpcode");
_currScript = script;
uint16 curWord = _currScript->readUint16LE();
if (curWord == 0xFFF6)
return 0xFF;
for (; curWord != 0xFFF8; curWord = _currScript->readUint16LE()) {
byte mask = 0;
if (curWord > 1000) {
curWord -= 1000;
mask = 1;
}
byte result = handleOpcodeType1(curWord);
if ((result ^ mask) == 0) {
do {
curWord = _currScript->readUint16LE();
} while (curWord != 0xFFF7);
return 0;
}
}
_vm->_byte1714E = 1;
for (;;) {
curWord = _currScript->readUint16LE();
if (curWord == 0xFFF7)
return _vm->_byte1714E;
handleOpcodeType2(curWord);
}
}
void LilliputScript::runScript(ScriptStream script) {
2012-05-09 08:07:58 +02:00
debugC(1, kDebugScript, "runScript");
_byte16F05_ScriptHandler = 1;
while (handleOpcode(&script) != 0xFF)
_vm->update();
}
void LilliputScript::runMenuScript(ScriptStream script) {
debugC(1, kDebugScriptTBC, "runMenuScript");
_byte16F05_ScriptHandler = 0;
while (handleOpcode(&script) == 0)
_vm->update();
}
2012-05-10 08:11:45 +02:00
byte LilliputScript::compareValues(int var1, int oper, int var2) {
debugC(2, kDebugScript, "compareValues(%d, %c, %d)", var1, oper & 0xFF, var2);
switch (oper & 0xFF) {
case '<':
2012-05-10 08:11:45 +02:00
if (var1 < var2)
return 1;
break;
case '>':
2012-05-10 08:11:45 +02:00
if (var1 > var2)
return 1;
break;
default:
2012-05-10 08:11:45 +02:00
if (var1 == var2)
return 1;
break;
}
2012-05-10 08:11:45 +02:00
return 0;
}
void LilliputScript::computeOperation(byte *bufPtr, int oper, int var3) {
debugC(1, kDebugScriptTBC, "computeOperation(bufPtr, %c, %d)", oper & 0xFF, var3 & 0xFF);
2012-04-08 12:54:56 +02:00
switch (oper & 0xFF) {
case '=':
bufPtr[0] = var3 & 0xFF;
2012-04-08 12:54:56 +02:00
break;
case '+': {
int tmpVal = bufPtr[0] + var3;
2012-04-08 12:54:56 +02:00
if (tmpVal > 0xFF)
bufPtr[0] = 0xFF;
else
bufPtr[0] = (byte)tmpVal;
}
break;
case '-': {
int tmpVal = bufPtr[0] - var3;
2012-04-08 12:54:56 +02:00
if (tmpVal < 0)
bufPtr[0] = 0;
else
bufPtr[0] = (byte)tmpVal;
}
break;
case '*': {
int tmpVal = bufPtr[0] * var3;
2012-04-08 12:54:56 +02:00
bufPtr[0] = tmpVal & 0xFF;
}
break;
case '/': {
if (var3 != 0)
bufPtr[0] /= var3;
2012-04-08 12:54:56 +02:00
}
break;
default: {
warning("computeOperation : oper %d", oper);
if (var3 != 0) {
int tmpVal = bufPtr[0] / var3;
2012-04-08 12:54:56 +02:00
if (tmpVal < 0)
bufPtr[0] = 0xFF;
else
bufPtr[0] = 0;
}
break;
}
}
}
void LilliputScript::sub1823E(byte index, byte var1, byte *curBufPtr) {
debugC(1, kDebugScriptTBC, "sub1823E(%d, %d, curBufPtr)", index, var1);
2012-04-08 12:54:56 +02:00
assert (index < 40);
_characterScriptEnabled[index] = 1;
curBufPtr[0] = var1;
2012-04-08 12:54:56 +02:00
curBufPtr[1] = 0;
curBufPtr[2] = 0;
curBufPtr[3] = 0;
}
void LilliputScript::sub17B6C(int var1) {
debugC(1, kDebugScriptTBC, "sub17B6C(%d)", var1);
if (var1 == 0) {
int curWord = 0;
while (curWord != 0xFFF6)
curWord = _currScript->readUint16LE();
_currScript->seek(_currScript->pos() - 4);
return;
}
++var1;
int curVal = 0;
int tmpVal;
while (curVal < var1) {
tmpVal = _currScript->readUint16LE();
if (tmpVal == 0xFFF7)
++curVal;
}
_currScript->seek(_currScript->pos() - 2);
}
2012-04-12 20:53:38 +02:00
void LilliputScript::sub16C86(int index, byte *buf) {
debugC(1, kDebugScriptTBC, "sub16C86()");
2012-04-12 20:53:38 +02:00
_array12811[index] = 0;
for (int i = 0; i < 16; i++) {
_array12311[(index * 16) + i] = Common::Point(buf[(2 * i) + 1], buf[2 * i]);
2012-04-12 20:53:38 +02:00
}
}
void LilliputScript::sub16C5C(int index, byte var3) {
debugC(1, kDebugScriptTBC, "sub16C5C(%d, %d)", index, var3);
2012-04-12 20:53:38 +02:00
assert(index < 40);
_array12839[index] = var3;
byte *buf = _vm->_rulesChunk1;
if (var3 != 0) {
int count = 0;
while (count < var3) {
if ((buf[0] == 0xFF) && (buf[1] == 0xFF))
++count;
buf = &buf[2];
}
}
sub16C86(index, buf);
}
void LilliputScript::sub17D40(bool &forceReturnFl) {
debugC(1, kDebugScriptTBC, "sub17D40()");
forceReturnFl = false;
2012-05-01 23:32:44 +02:00
if ((_vm->_displayMap != 1) && (_vm->_characterRelativePositionX[_vm->_currentScriptCharacter] != 0xFF))
return;
forceReturnFl = true;
return;
}
void LilliputScript::sub189F5() {
debugC(2, kDebugScriptTBC, "sub189F5()");
int index = 0;
int var2 = 0x100;
int var1;
for (;;) {
var1 = _vm->_displayStringBuf[index];
if (var1 == 0)
break;
if (var1 == '|') {
var2 &= 0xFF;
++var2;
continue;
}
var2 += 0x100;
if ((var2 >> 8) < 61)
continue;
if ((var2 & 0xFF) == 1) {
_vm->_displayStringBuf[index - 1] = 0;
break;
}
--index;
while (_vm->_displayStringBuf[index] != ' ')
--index;
_vm->_displayStringBuf[index] = '|';
++var2;
var2 &= 0xFF;
++index;
}
}
void LilliputScript::sub189B8() {
debugC(2, kDebugScriptTBC, "sub189B8()");
sub189F5();
int index = 0;
for (;;) {
if (_vm->_displayStringBuf[index] == 0)
break;
++index;
}
2012-05-11 23:32:26 +02:00
index /= _speechDisplaySpeed;
index += 4;
2012-05-11 23:32:26 +02:00
_speechTimer = index;
_vm->displayFunction10();
_vm->displayFunction11(_vm->_displayStringBuf);
}
2012-05-09 08:07:58 +02:00
void LilliputScript::decodePackedText(char *buf) {
debugC(2, kDebugScriptTBC, "decodePackedText(buf)");
static const char *nounsArrayPtr = "I am |You are |you are |hou art |in the |is the |is a |in a |To the |to the |by |going |here |The|the|and |some |build|not |way|I |a |an |from |of |him|her|by |his |ing |tion|have |you|I''ve |can''t |up |to |he |she |down |what|What|with|are |and|ent|ian|ome|ed |me|my|ai|it|is|of|oo|ea|er|es|th|we|ou|ow|or|gh|go|er|st|ee|th|sh|ch|ct|on|ly|ng|nd|nt|ty|ll|le|de|as|ie|in|ss|''s |''t |re|gg|tt|pp|nn|ay|ar|wh|";
_vm->_displayStringIndex = 0;
_byte1881A = 0;
int index = 0;
byte var1 = 0;
for (;;) {
var1 = buf[index];
++index;
if (var1 == ']')
var1 = 0;
if (var1 < 0x80) {
if (var1 == '@') {
var1 = buf[index];
++index;
if (var1 == '#') {
_vm->prepareGoldAmount(_byte18823);
}
} else {
_vm->addCharToBuf(var1);
if (var1 == 0)
break;
}
} else {
int nounIndex = 0;
byte var3 = 0xFF - var1;
for (int i = 0; i < var3; i++) {
for (;;) {
var1 = nounsArrayPtr[nounIndex];
++nounIndex;
if (var1 == '|')
break;
}
}
for (;;) {
var1 = nounsArrayPtr[nounIndex];
++nounIndex;
if (var1 == '|')
break;
_vm->addCharToBuf(var1);
}
}
}
sub189B8();
}
int LilliputScript::sub18BB7(int index) {
debugC(2, kDebugScriptTBC, "sub18BB7(%d)", index);
2012-05-09 08:07:58 +02:00
int chunk4Index = _vm->_packedStringIndex[index];
int result = 0;
2012-05-09 08:07:58 +02:00
while (_vm->_packedStrings[chunk4Index + result] == 0x5B)
++result;
return result + 1;
}
void LilliputScript::listAllTexts() {
debugC(1, kDebugScriptTBC, "All Game Texts :");
for (int i = 0; i < _vm->_packedStringNumb; i++) {
int index = _vm->_packedStringIndex[i];
int variantCount = 0;
while (_vm->_packedStrings[index + variantCount] == 0x5B)
++variantCount ;
int it = 0;
/*if (variantCount != 0) {
for (int j = 0; j < variantCount; j++) {
decodePackedText(&_vm->_packedStrings[index + variantCount + it]);
warning("Text 0x%x variant %d : %s", i, j, _vm->_displayStringBuf);
do {
++it;
}
while (_vm->_packedStrings[index + variantCount + it] != 0x5B);
}
} else {*/
decodePackedText(&_vm->_packedStrings[index + variantCount]);
debugC(1, kDebugScriptTBC, "Text 0x%x variant 0 : %s", i, _vm->_displayStringBuf);
/* }*/
}
}
void LilliputScript::sub18B3C(int var) {
debugC(2, kDebugScriptTBC, "sub18B3C(%d)", var);
2012-05-12 09:02:01 +02:00
if (var == -1)
return;
_word18776 = var;
2012-05-09 08:07:58 +02:00
int index = _vm->_packedStringIndex[var];
int count = 0;
while (_vm->_packedStrings[index + count] == 0x5B)
++count;
int i = 0;
if (count != 0) {
int tmpVal = _vm->_rnd->getRandomNumber(count + 1);
if (tmpVal != 0) {
for (int j = 0; j < tmpVal; j++) {
do
++i;
2012-05-09 08:07:58 +02:00
while (_vm->_packedStrings[index + count + i] != 0x5B);
}
}
}
2012-05-09 08:07:58 +02:00
decodePackedText(&_vm->_packedStrings[index + count + i]);
}
int16 LilliputScript::getValue1() {
2012-05-10 08:11:45 +02:00
debugC(2, kDebugScript, "getValue1()");
int16 curWord = _currScript->readUint16LE();
2012-04-07 18:09:30 +02:00
if (curWord < 1000)
return curWord;
switch (curWord) {
case 1000:
return (int)_byte129A0;
case 1001:
2012-05-01 23:32:44 +02:00
return _vm->_currentScriptCharacter;
2012-04-07 18:09:30 +02:00
case 1002:
return _word16F00;
case 1003:
return (int)_vm->_currentCharacterVariables[6];
2012-04-07 18:09:30 +02:00
case 1004:
return _vm->_word10804;
2012-04-07 18:09:30 +02:00
default:
warning("getValue1: Unexpected large value %d", curWord);
return curWord;
}
}
Common::Point LilliputScript::getPosFromScript() {
debugC(2, kDebugScriptTBC, "getPosFromScript()");
int curWord = _currScript->readUint16LE();
int tmpVal = curWord >> 8;
switch(tmpVal) {
case 0xFF:
2012-05-01 23:32:44 +02:00
assert((_vm->_currentScriptCharacter >= 0) && (_vm->_currentScriptCharacter < 40));
return Common::Point(_vm->_rulesBuffer2_13[_vm->_currentScriptCharacter], _vm->_rulesBuffer2_14[_vm->_currentScriptCharacter]);
case 0xFE: {
int8 index = curWord & 0xFF;
assert((index >= 0) && (index < 40));
return Common::Point(_vm->_rulesBuffer2_13[index], _vm->_rulesBuffer2_14[index]);
}
case 0xFD:
return _vm->_currentScriptCharacterPos;
case 0xFC: {
int8 index = curWord & 0xFF;
assert((index >= 0) && (index < 40));
int16 x = _vm->_characterPositionX[index] >> 3;
int16 y = _vm->_characterPositionY[index] >> 3;
return Common::Point(x, y);
}
case 0xFB: {
int index = _word16F00;
assert((index >= 0) && (index < 40));
int16 x = _vm->_characterPositionX[index] >> 3;
int16 y = _vm->_characterPositionY[index] >> 3;
return Common::Point(x, y);
}
case 0xFA:
return Common::Point(_vm->_array10999PosX[_vm->_currentScriptCharacter], _vm->_array109C1PosY[_vm->_currentScriptCharacter]);
case 0xF9:
return Common::Point(_vm->_currentCharacterVariables[4], _vm->_currentCharacterVariables[5]);
case 0xF8: {
int8 index = curWord & 0xFF;
assert((index >= 0) && (index < 40));
2012-05-06 23:38:13 +02:00
return _vm->_rulesBuffer12Pos3[index];
}
case 0xF7: {
int8 index = _vm->_currentCharacterVariables[6];
assert((index >= 0) && (index < 40));
int16 x = _vm->_characterPositionX[index] >> 3;
int16 y = _vm->_characterPositionY[index] >> 3;
return Common::Point(x, y);
}
case 0xF6:
return _vm->_savedMousePosDivided;
default:
Common::Point pos = Common::Point(curWord >> 8, curWord & 0xFF);
warning("getPosFromScript - High value %d -> %d %d", curWord, pos.x, pos.y);
return pos;
}
}
2012-04-07 18:09:30 +02:00
void LilliputScript::sub130B6() {
debugC(1, kDebugScriptTBC, "sub130B6()");
2012-04-07 18:09:30 +02:00
assert(_vm->_word12F68_ERULES <= 20);
for (int i = 0; i < _vm->_word12F68_ERULES; i++) {
if (_array122E9[i] == 3)
_array122E9[i] = 2;
}
}
byte *LilliputScript::getCharacterVariablePtr() {
2012-05-10 08:11:45 +02:00
debugC(2, kDebugScript, "getCharacterVariablePtr()");
2012-04-27 22:54:43 +02:00
int8 tmpVal = (int8) (getValue1() & 0xFF);
int index = tmpVal * 32;
index += _currScript->readUint16LE();
return _vm->getCharacterVariablesPtr(index);
}
byte LilliputScript::OC_checkCharacterGoalPos() {
debugC(2, kDebugScriptTBC, "OC_checkCharacterGoalPos()");
if (_vm->_currentScriptCharacterPos == getPosFromScript()) {
return 1;
}
return 0;
}
2012-04-27 22:54:43 +02:00
byte LilliputScript::OC_comparePos() {
debugC(2, kDebugScriptTBC, "OC_comparePos()");
2012-04-27 22:54:43 +02:00
int index = getValue1();
byte d1 = _array16123PosX[index];
byte d2 = _array1614BPosY[index];
Common::Point var1 = getPosFromScript();
2012-04-27 22:54:43 +02:00
if (var1 == Common::Point(d1, d2))
2012-04-27 22:54:43 +02:00
return 1;
return 0;
}
2012-04-27 22:54:43 +02:00
byte LilliputScript::OC_sub1740A() {
debugC(1, kDebugScriptTBC, "OC_sub1740A()");
2012-04-28 01:03:11 +02:00
Common::Point var = _vm->_currentScriptCharacterPos;
if (var == Common::Point(-1, -1)) {
2012-04-28 01:03:11 +02:00
_currScript->readUint16LE();
return 0;
}
byte *isoMapBuf = getMapPtr(var);
2012-04-28 01:03:11 +02:00
int var2 = isoMapBuf[3];
int var3 = _currScript->readUint16LE();
int var4 = 8 >> var3;
if( var2 & var4 ) {
return 1;
} else {
return 0;
}
}
2012-05-10 08:11:45 +02:00
byte LilliputScript::OC_compareCharacterId() {
debugC(1, kDebugScript, "OC_compareCharacterId()");
byte *tmpArr = getCharacterVariablePtr();
byte var1 = tmpArr[0];
uint16 oper = _currScript->readUint16LE();
int16 var2 = _currScript->readUint16LE();
2012-04-08 12:54:56 +02:00
return compareValues(var1, oper, var2);
}
byte LilliputScript::OC_sub17468() {
debugC(1, kDebugScriptTBC, "OC_sub17468()");
2012-04-28 01:03:11 +02:00
int operation = _currScript->readUint16LE();
int val2 = _currScript->readUint16LE();
return compareValues(_byte16F02, operation, val2);
}
byte LilliputScript::OC_getRandom() {
debugC(1, kDebugScriptTBC, "OC_getRandom()");
2012-04-12 20:53:38 +02:00
int maxVal = _currScript->readUint16LE();
int rand = _vm->_rnd->getRandomNumber(maxVal);
_byte16F02 = (rand & 0xFF);
2012-04-12 20:53:38 +02:00
if (rand == 0)
2012-04-12 20:53:38 +02:00
return 1;
return 0;
}
2012-04-12 20:53:38 +02:00
2012-04-27 23:17:40 +02:00
byte LilliputScript::OC_for() {
debugC(1, kDebugScriptTBC, "OC_for()");
2012-04-27 22:54:43 +02:00
int var1 = _currScript->readUint16LE();
int tmpVal = _currScript->readUint16LE() + 1;
// no need to seek later, the move is already done
_currScript->writeUint16LE(tmpVal, -2);
// overwrite the recently used "variable" in the script
if (tmpVal < var1)
return 0;
2012-04-27 23:17:40 +02:00
_currScript->writeUint16LE(0, -2);
2012-04-27 22:54:43 +02:00
return 1;
}
byte LilliputScript::OC_compWord18776() {
debugC(1, kDebugScriptTBC, "OC_compWord18776()");
int var1 = _currScript->readUint16LE();
if (var1 == _word18776)
return 1;
return 0;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_checkSaveFlag() {
debugC(1, kDebugScriptTBC, "OC_checkSaveFlag()");
2012-04-08 12:54:56 +02:00
if (_vm->_saveFlag)
return 1;
return 0;
}
2012-04-08 12:54:56 +02:00
byte LilliputScript::OC_compByte16F04() {
warning("OC_compByte16F04");
byte var1 = _byte16F04;
uint16 oper = _currScript->readUint16LE();
int16 var2 = _currScript->readUint16LE();
return compareValues(var1, oper, var2);
}
byte LilliputScript::OC_sub174D8() {
debugC(1, kDebugScriptTBC, "OC_sub174D8()");
byte tmpVal = getValue1() & 0xFF;
int curWord = _currScript->readUint16LE();
if (curWord == 3000) {
int index;
for (index = 0; index < _vm->_numCharacters; index++) {
if (_vm->_rulesBuffer2_5[index] == tmpVal) {
_word16F00 = index;
return 1;
}
}
} else {
_currScript->seek(_currScript->pos() - 2);
int index = getValue1();
assert(index < 40);
if (_vm->_rulesBuffer2_5[index] == tmpVal) {
_word16F00 = index;
return 1;
}
}
return 0;
}
byte LilliputScript::OC_sub1750E() {
debugC(1, kDebugScriptTBC, "OC_sub1750E()");
byte* buf1 = getCharacterVariablePtr();
int var1 = *buf1;
int operation = _currScript->readUint16LE();
byte* buf2 = getCharacterVariablePtr();
int var2 = *buf2;
return compareValues(var1, operation, var2);
}
2012-04-26 00:21:44 +02:00
// TODO Rename function to "Check if character pos in rectangle"
byte LilliputScript::OC_compareCoords_1() {
debugC(1, kDebugScriptTBC, "OC_compareCoords_1()");
2012-04-26 00:21:44 +02:00
int index = _currScript->readUint16LE();
assert(index < 40);
2012-05-09 08:07:58 +02:00
int16 var3 = _vm->_rectXMinMax[index];
int16 var4 = _vm->_rectYMinMax[index];
Common::Point var1 = _vm->_currentScriptCharacterPos;
2012-04-26 00:21:44 +02:00
if ((var1.x < (var3 >> 8)) || (var1.x > (var3 & 0xFF)) || (var1.y < (var4 >> 8)) || (var1.y > (var4 & 0xFF)))
2012-04-26 00:21:44 +02:00
return 0;
return 1;
}
2012-04-26 00:21:44 +02:00
// TODO Rename function to "Check if character pos in rectangle"
byte LilliputScript::OC_compareCoords_2() {
debugC(1, kDebugScriptTBC, "OC_compareCoords_2()");
2012-05-09 08:07:58 +02:00
int16 index = getValue1();
Common::Point var1 = Common::Point(_array16123PosX[index], _array1614BPosY[index]);
2012-05-09 08:07:58 +02:00
index = _currScript->readUint16LE();
uint16 var3 = _vm->_rectXMinMax[index];
uint16 var4 = _vm->_rectYMinMax[index];
if ((var1.x < (var3 >> 8)) || (var1.x > (var3 & 0xFF)) || (var1.y < (var4 >> 8)) || (var1.y > (var4 & 0xFF)))
return 0;
return 1;
}
byte LilliputScript::OC_sub1757C() {
warning("OC_sub1757C");
return 0;
}
byte LilliputScript::OC_sub1759E() {
warning("OC_sub1759E");
return 0;
}
byte LilliputScript::OC_compWord16EF8() {
debugC(1, kDebugScriptTBC, "OC_compWord16EF8()");
int tmpVal = getValue1();
2012-05-01 23:32:44 +02:00
if (tmpVal == _vm->_currentScriptCharacter)
return 1;
return 0;
}
byte LilliputScript::OC_sub175C8() {
debugC(1, kDebugScriptTBC, "OC_sub175C8()");
2012-04-12 20:53:38 +02:00
byte var4 = _currScript->readUint16LE() & 0xFF;
int tmpVal = _currScript->readUint16LE();
if (tmpVal < 2000) {
_currScript->seek(_currScript->pos() - 2);
int index = getValue1();
2012-05-01 23:32:44 +02:00
int var1 = _array10B51[(_vm->_currentScriptCharacter * 40) + index];
2012-04-12 20:53:38 +02:00
if ((var1 & 0xFF) < var4)
return 0;
_word16F00 = index;
return 1;
}
if (tmpVal == 3000) {
for (int i = 0; i < _vm->_numCharacters; i++) {
2012-05-01 23:32:44 +02:00
int var1 = _array10B51[(_vm->_currentScriptCharacter * 40) + i];
2012-04-12 20:53:38 +02:00
if ((var1 & 0xFF) >= var4) {
_word16F00 = i;
return 1;
}
}
return 0;
}
tmpVal -= 2000;
byte var4b = tmpVal & 0xFF;
for (int i = 0; i < _vm->_numCharacters; i++) {
2012-05-01 23:32:44 +02:00
int var1 = _array10B51[(_vm->_currentScriptCharacter * 40) + i];
2012-04-12 20:53:38 +02:00
if ((var1 & 0xFF) >= var4) {
if (_vm->_rulesBuffer2_12[i] == var4b) {
_word16F00 = i;
return 1;
}
}
}
return 0;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_sub17640() {
debugC(1, kDebugScriptTBC, "OC_sub176C4()");
int var4 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
int index = _vm->_currentScriptCharacter * 40;
int tmpVal = _currScript->readUint16LE();
if (tmpVal >= 2000) {
int var1 = tmpVal;
if (var1 == 3000) {
for (int i = 0; i < _vm->_numCharacters; i++) {
tmpVal = _array10B51[index + i];
byte v1 = tmpVal & 0xFF;
byte v2 = tmpVal >> 8;
if ((v1 >= (var4 & 0xFF)) && (v2 < (var4 & 0xFF))) {
2012-05-12 09:02:01 +02:00
_word16F00 = i;
return 1;
}
}
return 0;
} else {
var1 -= 2000;
var4 &= ((var1 & 0xFF) << 8);
for (int i = 0; i < _vm->_numCharacters; i++) {
tmpVal = _array10B51[index + i];
byte v1 = tmpVal & 0xFF;
byte v2 = tmpVal >> 8;
2012-05-12 09:02:01 +02:00
if ((v1 >= (var4 & 0xFF)) && (v2 < (var4 & 0xFF)) && (_vm->_rulesBuffer2_12[i] != (var4 >> 8))) {
_word16F00 = i;
return 1;
}
}
return 0;
}
} else {
_currScript->seek(_currScript->pos() - 2);
2012-05-12 09:02:01 +02:00
int subIndex = getValue1();
tmpVal = _array10B51[index + subIndex];
byte v1 = tmpVal & 0xFF;
byte v2 = tmpVal >> 8;
if ((v1 < (var4 & 0xFF)) || (v2 >= (var4 & 0xFF)))
return 0;
_word16F00 = subIndex;
return 1;
}
}
2012-04-12 20:53:38 +02:00
byte LilliputScript::OC_sub176C4() {
debugC(1, kDebugScriptTBC, "OC_sub176C4()");
2012-04-12 20:53:38 +02:00
byte var4 = _currScript->readUint16LE() & 0xFF;
int tmpVal = _currScript->readUint16LE();
if (tmpVal < 2000) {
_currScript->seek(_currScript->pos() - 2);
int index = getValue1();
2012-05-01 23:32:44 +02:00
int var1 = _array10B51[(_vm->_currentScriptCharacter * 40) + index];
2012-04-12 20:53:38 +02:00
if (((var1 & 0xFF) >= var4) || ((var1 >> 8) < var4))
return 0;
_word16F00 = index;
return 1;
}
if (tmpVal == 3000) {
for (int i = 0; i < _vm->_numCharacters; i++) {
2012-05-01 23:32:44 +02:00
int var1 = _array10B51[(_vm->_currentScriptCharacter * 40) + i];
2012-04-12 20:53:38 +02:00
if (((var1 & 0xFF) < var4) && ((var1 >> 8) >= var4)) {
_word16F00 = i;
return 1;
}
}
return 0;
}
tmpVal -= 2000;
byte var4b = tmpVal & 0xFF;
for (int i = 0; i < _vm->_numCharacters; i++) {
2012-05-01 23:32:44 +02:00
int var1 = _array10B51[(_vm->_currentScriptCharacter * 40) + i];
2012-04-12 20:53:38 +02:00
if (((var1 & 0xFF) < var4) && ((var1 >> 8) >= var4)) {
if (_vm->_rulesBuffer2_12[i] == var4b) {
_word16F00 = i;
return 1;
}
}
}
return 0;
}
2012-04-12 20:53:38 +02:00
byte LilliputScript::OC_compWord10804() {
debugC(1, kDebugScriptTBC, "OC_compWord10804()");
2012-04-12 20:53:38 +02:00
byte tmpVal = getValue1();
if (tmpVal == _vm->_word10804)
2012-04-12 20:53:38 +02:00
return 1;
return 0;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_sub17766() {
debugC(1, kDebugScriptTBC, "OC_sub17766()");
byte var1 = (_currScript->readUint16LE() & 0xFF);
2012-05-01 23:32:44 +02:00
if ((var1 == _array12839[_vm->_currentScriptCharacter]) && (_array12811[_vm->_currentScriptCharacter] != 16))
return 1;
return 0;
}
byte LilliputScript::OC_sub17782() {
debugC(1, kDebugScriptTBC, "OC_sub17782()");
byte var1 = (_currScript->readUint16LE() & 0xFF);
2012-05-01 23:32:44 +02:00
if ((var1 == _array12839[_vm->_currentScriptCharacter]) && (_array12811[_vm->_currentScriptCharacter] == 16))
return 1;
return 0;
}
byte *LilliputScript::getMapPtr(Common::Point val) {
debugC(1, kDebugScriptTBC, "getMapPtr(%d %d)", val.x, val.y);
return &_vm->_bufferIsoMap[(val.y * 64 + val.x) << 2];
}
byte LilliputScript::OC_sub1779E() {
debugC(1, kDebugScriptTBC, "OC_sub1779E()");
Common::Point tmpVal = getPosFromScript();
if (tmpVal == Common::Point(-1, -1)) {
_currScript->seek(_currScript->pos() + 6);
return 0;
}
int var2 = _currScript->readUint16LE();
byte *buf = getMapPtr(tmpVal);
byte var1 = buf[var2];
var2 = _currScript->readUint16LE();
int oper = _currScript->readUint16LE();
return compareValues(var1, oper, var2);
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_sub177C6() {
debugC(1, kDebugScriptTBC, "OC_sub177C6()");
int index = getValue1();
if (_vm->_characterPositionX[index] == -1)
return 0;
return 1;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_compWord16EFE() {
debugC(1, kDebugScriptTBC, "OC_compWord16EFE()");
byte curByte = _currScript->readUint16LE() & 0xFF;
byte tmpVal = _vm->_word16EFE >> 8;
if (curByte != tmpVal)
return 0;
_word16F00 = (_vm->_word16EFE & 0xFF);
return 1;
}
byte LilliputScript::OC_sub177F5() {
debugC(1, kDebugScriptTBC, "OC_sub177F5()");
2012-04-12 20:53:38 +02:00
byte var1 = _currScript->readUint16LE() & 0xFF;
byte var2 = _currScript->readUint16LE() & 0xFF;
assert(_vm->_currentCharacterVariables != NULL);
2012-04-12 20:53:38 +02:00
if ((var1 == _vm->_currentCharacterVariables[0]) && (var2 == _vm->_currentCharacterVariables[1]))
2012-04-12 20:53:38 +02:00
return 1;
return 0;
}
byte LilliputScript::OC_CurrentCharacterVar0Equals() {
debugC(1, kDebugScriptTBC, "OC_CurrentCharacterVar0Equals()");
byte curByte = (_currScript->readUint16LE() & 0xFF);
assert(_vm->_currentCharacterVariables != NULL);
if (_vm->_currentCharacterVariables[0] == curByte)
return 1;
return 0;
}
byte LilliputScript::OC_sub17825() {
debugC(1, kDebugScriptTBC, "OC_sub17825()");
byte tmpVal = (_currScript->readUint16LE() & 0xFF);
if ((_vm->_byte16F07_menuId != 1) && (_vm->_byte16F07_menuId != 3))
return 0;
if (tmpVal == _byte12FE4)
return 1;
return 0;
}
byte LilliputScript::OC_sub17844() {
debugC(1, kDebugScriptTBC, "OC_sub17844()");
2012-04-25 08:10:26 +02:00
int tmpVal = _currScript->readUint16LE();
if ((_vm->_byte16F07_menuId == 2) || ((tmpVal & 0xFF) != _byte12FE4))
return 0;
return 1;
}
byte LilliputScript::OC_sub1785C() {
debugC(1, kDebugScriptTBC, "OC_sub1785C()");
byte curByte = (_currScript->readUint16LE() & 0xFF);
int count = 0;
for (int i = 0; i < _vm->_numCharacters; i++) {
if (curByte == *_vm->getCharacterVariablesPtr(32 * i))
++count;
}
int oper = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
return compareValues(count, oper, var2);
}
byte LilliputScript::OC_sub17886() {
debugC(1, kDebugScriptTBC, "OC_sub17886()");
Common::Point var1 = getPosFromScript();
int dx = var1.x - _viewportPos.x;
int dy = var1.y - _viewportPos.y;
if ((dx >= 0) && (dx < 8) && (dy >= 0) && (dy < 8))
return 1;
return 0;
}
byte LilliputScript::OC_CompareGameVariables() {
debugC(1, kDebugScriptTBC, "OC_CompareGameVariables()");
int var1 = getValue1();
int var2 = getValue1();
if (var1 == var2)
return 1;
return 0;
}
byte LilliputScript::OC_skipNextOpcode() {
debugC(1, kDebugScriptTBC, "OC_skipNextOpcode()");
_currScript->readUint16LE();
return 1;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_CurrentCharacterVar2Equals1() {
debugC(1, kDebugScriptTBC, "OC_CurrentCharacterVar2Equals1()");
assert(_vm->_currentCharacterVariables != NULL);
if (_vm->_currentCharacterVariables[2] == 1)
return 1;
return 0;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_sub178D2() {
debugC(1, kDebugScriptTBC, "OC_sub178D2()");
2012-04-27 08:10:55 +02:00
int index = getValue1();
assert (index < 40);
byte curByte = (_currScript->readUint16LE() & 0xFF);
if (curByte == _vm->_rulesBuffer2_12[index])
return 1;
return 0;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_sub178E8() {
debugC(1, kDebugScriptTBC, "OC_sub178E8()");
2012-04-27 08:10:55 +02:00
byte *bufPtr = getCharacterVariablePtr();
2012-04-27 08:10:55 +02:00
byte var1 = bufPtr[0];
byte curByte = (_currScript->readUint16LE() & 0xFF);
if (var1 & curByte)
return 1;
return 0;
}
2012-04-26 00:21:44 +02:00
byte LilliputScript::OC_sub178FC() {
debugC(1, kDebugScriptTBC, "OC_sub178FC()");
2012-04-26 00:21:44 +02:00
assert(_vm->_currentCharacterVariables != NULL);
2012-04-26 00:21:44 +02:00
byte curByte = (_currScript->readUint16LE() & 0xFF);
if (curByte <= _vm->_currentCharacterVariables[0])
2012-04-26 00:21:44 +02:00
return 1;
return 0;
}
2012-04-26 00:21:44 +02:00
byte LilliputScript::OC_sub1790F() {
debugC(1, kDebugScriptTBC, "OC_sub1790F()");
2012-04-26 00:21:44 +02:00
int index = getValue1();
assert(index < 40);
if (_vm->_rulesBuffer2_5[index] == 0xFF)
return 0;
_word16F00 = _vm->_rulesBuffer2_5[index];
return 1;
}
byte LilliputScript::OC_CurrentCharacterVar1Equals() {
debugC(1, kDebugScriptTBC, "OC_CurrentCharacterVar1Equals()");
assert(_vm->_currentCharacterVariables != NULL);
byte curByte = (_currScript->readUint16LE() & 0xFF);
if (_vm->_currentCharacterVariables[1] == curByte)
return 1;
return 0;
}
byte LilliputScript::OC_sub1793E() {
debugC(1, kDebugScriptTBC, "OC_sub1793E()");
2012-04-26 00:21:44 +02:00
if (_vm->_currentScriptCharacterPos == Common::Point(-1, -1))
2012-04-26 00:21:44 +02:00
return 0;
2012-05-01 23:32:44 +02:00
if (_vm->_array16E94[_vm->_currentScriptCharacter] == 0)
2012-04-26 00:21:44 +02:00
return 0;
return 1;
}
byte LilliputScript::OC_sub1795E() {
debugC(1, kDebugScriptTBC, "OC_sub1795E()");
assert(_vm->_currentCharacterVariables != NULL);
if (_vm->_currentCharacterVariables[3] == 1)
return 1;
return 0;
}
2012-04-30 17:57:23 +02:00
byte LilliputScript::OC_checkCharacterDirection() {
debugC(1, kDebugScriptTBC, "OC_checkCharacterDirection()");
int var1 = getValue1();
int var2 = _currScript->readUint16LE();
2012-04-30 17:57:23 +02:00
if (_vm->_characterDirectionArray[var1] == var2)
return 1;
return 0;
}
2012-04-27 08:10:55 +02:00
byte LilliputScript::OC_sub17984() {
debugC(1, kDebugScriptTBC, "OC_sub17984()");
int index = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
assert(index < 20);
if (_array122E9[index] == (var2 & 0xFF))
return 1;
return 0;
}
2012-04-25 08:10:26 +02:00
byte LilliputScript::OC_checkSavedMousePos() {
debugC(1, kDebugScriptTBC, "OC_checkSavedMousePos()");
2012-04-25 08:10:26 +02:00
if ((_byte129A0 != 0xFF) || (_vm->_savedMousePosDivided == Common::Point(-1, -1)))
2012-04-25 08:10:26 +02:00
return 0;
return 1;
}
2012-04-25 08:10:26 +02:00
byte LilliputScript::OC_sub179AE() {
debugC(1, kDebugScriptTBC, "OC_sub179AE()");
2012-04-25 08:10:26 +02:00
if ((_vm->_byte12FCE == 1) || (_byte129A0 == 0xFF))
return 0;
return 1;
}
2012-04-25 08:10:26 +02:00
byte LilliputScript::OC_sub179C2() {
debugC(1, kDebugScriptTBC, "OC_sub179C2()");
Common::Point var1 = getPosFromScript();
if ((_vm->_array10999PosX[_vm->_currentScriptCharacter] == var1.x)
&& (_vm->_array109C1PosY[_vm->_currentScriptCharacter] == var1.y))
return 1;
return 0;
}
byte LilliputScript::OC_sub179E5() {
debugC(1, kDebugScriptTBC, "OC_sub17A07()");
static const byte _byte179DB[10] = {0x44, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43};
int var1 = (_currScript->readUint16LE() & 0xFF) - 0x30;
if (_byte179DB[var1] == _vm->_byte16F09)
return 1;
return 0;
}
2012-04-25 08:10:26 +02:00
byte LilliputScript::OC_sub17A07() {
debugC(1, kDebugScriptTBC, "OC_sub17A07()");
2012-04-25 08:10:26 +02:00
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]) {
index = _currScript->readUint16LE();
if (_array179FD[index] == _vm->_array147D1[1]) {
index = _currScript->readUint16LE();
if (_array179FD[index] == _vm->_array147D1[2]) {
return 1;
}
}
}
}
_currScript->seek(_currScript->pos() + 6);
return 0;
}
2012-04-25 08:10:26 +02:00
2012-05-11 20:47:17 +02:00
byte LilliputScript::OC_checkViewPortCharacterTarget() {
debugC(1, kDebugScript, "OC_checkViewPortCharacterTarget()");
int var1 = getValue1();
2012-05-11 20:47:17 +02:00
if (var1 == _viewportCharacterTarget)
return 1;
return 0;
}
void LilliputScript::OC_setWord18821() {
debugC(1, kDebugScriptTBC, "OC_setWord18821()");
2012-05-11 23:32:26 +02:00
_word18821 = getValue1();
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17A3E() {
debugC(1, kDebugScriptTBC, "OC_sub17A3E()");
Common::Point var1 = getPosFromScript();
int var2 = _currScript->readUint16LE();
int var3 = _currScript->readUint16LE();
byte* mapPtr = getMapPtr(var1);
int mask = 8 >> var2;
mask = ~mask;
mapPtr[3] &= mask;
if (var3 > 0) {
mask = ~mask;
mapPtr[3] |= mask;
}
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17D57_speech1() {
debugC(1, kDebugScriptTBC, "OC_sub17D57_speech1()");
int curWord = _currScript->readUint16LE();
bool forceReturnFl = false;
sub17D40(forceReturnFl);
if (forceReturnFl)
return;
2012-05-11 23:32:26 +02:00
_talkingCharacter = _vm->_currentScriptCharacter;
sub18B3C(curWord);
}
void LilliputScript::sub18B7C(int var1, int var3) {
debugC(2, kDebugScriptTBC, "sub18B7C(%d, %d)", var1, var3);
if (var1 == 0xFFFF)
return;
_word18776 = var1;
2012-05-09 08:07:58 +02:00
int index = _vm->_packedStringIndex[var1];
2012-05-09 08:07:58 +02:00
while (_vm->_packedStrings[index] == 91)
++index;
for (int i = 0; i < var3; i++) {
int tmpVal = 93;
while (tmpVal == 93) {
2012-05-09 08:07:58 +02:00
tmpVal = _vm->_packedStrings[index];
++index;
}
}
2012-05-09 08:07:58 +02:00
if (_vm->_packedStrings[index] == 0)
return;
2012-05-09 08:07:58 +02:00
decodePackedText(&_vm->_packedStrings[index]);
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17D7F_speech2() {
debugC(1, kDebugScriptTBC, "OC_sub17D7F_speech2()");
int var1 = getCharacterVariablePtr()[0];
int var2 = (_currScript->readUint16LE() & 0xFF);
int var3 = var1 / var2;
var1 = _currScript->readUint16LE();
bool forceReturnFl = false;
sub17D40(forceReturnFl);
if (forceReturnFl)
return;
2012-05-11 23:32:26 +02:00
_talkingCharacter = _vm->_currentScriptCharacter;
sub18B7C(var1, var3);
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17DB9_speech3() {
debugC(1, kDebugScriptTBC, "OC_sub17DB9_speech3()");
int index = _currScript->readUint16LE();
int maxValue = sub18BB7(index);
int tmpVal = _currScript->readUint16LE() + 1;
int oldVal = tmpVal;
if (tmpVal >= maxValue)
tmpVal = 0;
_currScript->writeUint16LE(tmpVal, -2);
bool forceReturnFl = false;
sub17D40(forceReturnFl);
if (forceReturnFl)
return;
2012-05-11 23:32:26 +02:00
_talkingCharacter = _vm->_currentScriptCharacter;
sub18B7C(index, oldVal);
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17DF9_speech1param() {
debugC(1, kDebugScriptTBC, "OC_sub17DF9_speech1param()");
2012-05-11 23:32:26 +02:00
if (_talkingCharacter == -1) {
OC_sub17D57_speech1();
return;
}
_currScript->readUint16LE();
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17E07_speech4param() {
debugC(1, kDebugScriptTBC, "OC_sub17E07_speech4param()");
2012-05-11 23:32:26 +02:00
if (_talkingCharacter == -1) {
OC_sub17D7F_speech2();
2012-04-28 03:20:29 +02:00
return;
}
_currScript->readUint16LE();
_currScript->readUint16LE();
_currScript->readUint16LE();
_currScript->readUint16LE();
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17E15_speech2param() {
debugC(1, kDebugScriptTBC, "OC_sub17E15_speech2param()");
2012-05-11 23:32:26 +02:00
if (_talkingCharacter == -1) {
OC_sub17DB9_speech3();
2012-04-28 03:20:29 +02:00
return;
}
_currScript->readUint16LE();
_currScript->readUint16LE();
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_sub17B03() {
debugC(1, kDebugScriptTBC, "OC_sub17B03()");
2012-04-08 12:54:56 +02:00
byte *bufPtr = getCharacterVariablePtr();
2012-04-08 12:54:56 +02:00
int oper = _currScript->readUint16LE();
int var3 = _currScript->readUint16LE();
2012-04-08 12:54:56 +02:00
computeOperation(bufPtr, oper, var3);
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_getRandom_type2() {
debugC(1, kDebugScriptTBC, "OC_getRandom_type2()");
2012-04-27 22:59:48 +02:00
byte* bufPtr = getCharacterVariablePtr();
2012-04-27 22:59:48 +02:00
int maxVal = _currScript->readUint16LE();
int randomVal = _vm->_rnd->getRandomNumber(maxVal);
*bufPtr = randomVal;
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_setCharacterPosition() {
debugC(1, kDebugScriptTBC, "OC_setCharacterPosition()");
2012-04-12 20:53:38 +02:00
int index = getValue1();
Common::Point tmpVal = getPosFromScript();
2012-04-12 20:53:38 +02:00
int var2 = (tmpVal.x << 3) + 4;
int var4 = (tmpVal.y << 3) + 4;
2012-04-12 20:53:38 +02:00
assert((index >= 0) && (index < 40));
_vm->_characterPositionX[index] = var2;
_vm->_characterPositionY[index] = var4;
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_sub17A8D() {
debugC(1, kDebugScriptTBC, "OC_sub17A8D()");
int tmpVal = getValue1();
assert(tmpVal < 40);
if (tmpVal == _vm->_word10804)
2012-05-11 20:47:17 +02:00
_viewportCharacterTarget = -1;
_vm->_characterPositionX[tmpVal] = -1;
_vm->_characterPositionY[tmpVal] = -1;
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_saveAndQuit() {
warning("OC_saveAndQuit");
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub17B93() {
debugC(1, kDebugScriptTBC, "OC_sub17B93()");
int var1 = _currScript->readUint16LE();
sub17B6C(var1);
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17E37_speech4() {
warning("OC_sub17E37_speech4");
}
void LilliputScript::OC_resetByte1714E() {
debugC(1, kDebugScriptTBC, "OC_resetByte1714E()");
2012-04-28 03:20:29 +02:00
_vm->_byte1714E = 0;
}
void LilliputScript::OC_deleteSavegameAndQuit() {
warning("OC_deleteSavegameAndQuit");
}
void LilliputScript::OC_incByte16F04() {
debugC(1, kDebugScriptTBC, "OC_incByte16F04()");
++_byte16F04;
}
void LilliputScript::OC_sub17BA5() {
debugC(1, kDebugScriptTBC, "OC_sub17BA5()");
byte *tmpArr = getCharacterVariablePtr();
byte oper = (_currScript->readUint16LE() & 0xFF);
byte var3 = getCharacterVariablePtr()[0];
computeOperation(tmpArr, oper, var3);
}
void LilliputScript::OC_setByte18823() {
debugC(1, kDebugScriptTBC, "OC_setByte18823()");
byte *tmpArr = getCharacterVariablePtr();
_byte18823 = *tmpArr;
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_callScript() {
debugC(1, kDebugScriptTBC, "OC_callScript()");
int index = _currScript->readUint16LE();
int var1 = getValue1();
_vm->sub170EE(var1);
2012-05-01 23:32:44 +02:00
int tmpIndex = _vm->_currentScriptCharacter;
assert(index < _vm->_gameScriptIndexSize);
int scriptIndex = _vm->_arrayGameScriptIndex[index];
_scriptStack.push(_currScript);
if (_byte16F05_ScriptHandler == 0) {
_vm->_byte1714E = 0;
debugC(1, kDebugScriptTBC, "========================== Menu Script %d==============================", scriptIndex);
runMenuScript(ScriptStream(&_vm->_arrayGameScripts[scriptIndex], _vm->_arrayGameScriptIndex[index + 1] - _vm->_arrayGameScriptIndex[index]));
debugC(1, kDebugScriptTBC, "========================== End of Menu Script==============================");
} else {
runScript(ScriptStream(&_vm->_arrayGameScripts[scriptIndex], _vm->_arrayGameScriptIndex[index + 1] - _vm->_arrayGameScriptIndex[index]));
}
_currScript = _scriptStack.pop();
_vm->sub170EE(tmpIndex);
}
void LilliputScript::OC_callScriptAndReturn() {
debugC(1, kDebugScriptTBC, "OC_callScriptAndReturn()");
OC_callScript();
sub17B6C(0);
}
void LilliputScript::OC_setCurrentScriptCharacterPos() {
debugC(1, kDebugScriptTBC, "OC_setCurrentScriptCharacterPos()");
Common::Point pos = getPosFromScript();
_vm->_array10999PosX[_vm->_currentScriptCharacter] = pos.x;
_vm->_array109C1PosY[_vm->_currentScriptCharacter] = pos.y;
_vm->_array109E9PosX[_vm->_currentScriptCharacter] = -1;
}
void LilliputScript::OC_resetByte16F04() {
debugC(1, kDebugScriptTBC, "OC_resetByte16F04()");
_byte16F04 = 0;
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_sub17AE1() {
debugC(1, kDebugScriptTBC, "OC_sub17AE1()");
2012-04-12 20:53:38 +02:00
byte var3 = (_currScript->readUint16LE() & 0xFF);
2012-05-01 23:32:44 +02:00
sub16C5C(_vm->_currentScriptCharacter, var3);
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_sub17AEE() {
debugC(1, kDebugScriptTBC, "OC_sub17AEE()");
2012-04-12 20:53:38 +02:00
byte var3 = (_currScript->readUint16LE() & 0xFF);
2012-05-01 23:32:44 +02:00
sub16C5C(_vm->_currentScriptCharacter + 1, var3);
}
2012-04-12 20:53:38 +02:00
void LilliputScript::OC_setWord10804() {
debugC(1, kDebugScriptTBC, "OC_setWord10804()");
2012-04-07 18:09:30 +02:00
_vm->_word10804 = getValue1();
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub17C0E() {
debugC(1, kDebugScriptTBC, "OC_sub17C0E()");
2012-04-27 22:54:43 +02:00
assert(_vm->_currentCharacterVariables != NULL);
Common::Point var1 = Common::Point(_vm->_currentCharacterVariables[4], _vm->_currentCharacterVariables[5]);
byte b2 = _vm->_currentCharacterVariables[6];
2012-04-27 22:54:43 +02:00
byte *mapPtr = getMapPtr(var1);
mapPtr[b2] = _vm->_currentCharacterVariables[7];
mapPtr[3] = _vm->_currentCharacterVariables[8];
2012-04-27 22:54:43 +02:00
if (b2 == 0) {
_byte12A09 = 1;
2012-05-10 08:11:45 +02:00
_vm->displayLandscape();
2012-04-27 22:54:43 +02:00
_byte12A09 = 0;
}
}
2012-04-27 22:54:43 +02:00
void LilliputScript::OC_sub17C55() {
debugC(1, kDebugScriptTBC, "OC_sub17C55()");
2012-04-27 22:59:48 +02:00
int var1 = getValue1();
int var2 = getValue1();
int var3 = _currScript->readUint16LE();
int var4 = _currScript->readUint16LE();
_vm->_rulesBuffer2_5[var2] = var1 & 0xFF;
_vm->_rulesBuffer2_6[var2] = var3 & 0xFF;
_vm->_rulesBuffer2_7[var2] = var4 & 0xFF;
}
void LilliputScript::OC_sub17C76() {
debugC(1, kDebugScriptTBC, "OC_sub17C76()");
int var1 = getValue1();
_vm->_rulesBuffer2_5[var1] = 0xFF;
_vm->_characterPositionAltitude[var1] = 0;
_characterScriptEnabled[var1] = 1;
}
void LilliputScript::OC_sub17AFC() {
debugC(1, kDebugScriptTBC, "OC_sub17AFC()");
int var1 = getValue1();
_vm->sub170EE(var1);
}
2012-04-28 10:13:03 +02:00
void LilliputScript::sub171AF(int var1, int var2, int var4) {
debugC(2, kDebugScriptTBC, "sub171AF()");
2012-04-28 10:13:03 +02:00
int index = 0;
for (int i = 0; i < 10; i++) {
if (_vm->_array12861[index + 1] == 0xFFFF) {
_vm->_array12861[index + 1] = var1;
_vm->_array12861[index + 2] = var2;
_vm->_array12861[index + 0] = _vm->_word1289D + var4;
}
index += 3;
}
}
void LilliputScript::OC_sub17C8B() {
debugC(1, kDebugScriptTBC, "OC_sub17C8B()");
2012-04-28 10:13:03 +02:00
int var1 = 2 << 8;
int var4 = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
var2 = ((var2 & 0xFF) << 8 ) + _vm->_currentScriptCharacter;
2012-04-28 10:13:03 +02:00
sub171AF(var1, var2, var4);
}
2012-04-28 10:13:03 +02:00
void LilliputScript::OC_sub17CA2() {
debugC(1, kDebugScriptTBC, "OC_sub17CA2()");
2012-04-28 10:13:03 +02:00
int var1 = 1 << 8;
int var4 = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
var2 = ((var2 & 0xFF) << 8 ) + _vm->_currentScriptCharacter;
2012-04-28 10:13:03 +02:00
sub171AF(var1, var2, var4);
}
2012-04-28 10:13:03 +02:00
void LilliputScript::OC_sub17CB9() {
debugC(1, kDebugScriptTBC, "OC_sub17CB9()");
2012-04-28 10:13:03 +02:00
int var4 = _currScript->readUint16LE();
int var1 = getValue1();
int var2 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
var2 = ((var2 & 0xFF) << 8 ) + _vm->_currentScriptCharacter;
2012-04-28 10:13:03 +02:00
sub171AF(var1, var2, var4);
}
2012-04-28 10:13:03 +02:00
void LilliputScript::OC_sub17CD1() {
debugC(1, kDebugScriptTBC, "OC_sub17CD1()");
2012-04-28 10:13:03 +02:00
int var1 = 3 << 8;
int var4 = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
var2 = ((var2 & 0xFF) << 8 ) + _vm->_currentScriptCharacter;
2012-04-28 10:13:03 +02:00
sub171AF(var1, var2, var4);
}
void LilliputScript::OC_resetWord16EFE() {
debugC(1, kDebugScriptTBC, "OC_resetWord16EFE()");
_vm->_word16EFE = 0xFFFF;
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub17CEF() {
debugC(1, kDebugScriptTBC, "OC_sub17CEF()");
int var1 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
sub1823E(_vm->_currentScriptCharacter , var1, _vm->_currentCharacterVariables);
sub17B6C(0);
}
void LilliputScript::OC_IncCurrentCharacterVar1() {
debugC(1, kDebugScriptTBC, "OC_IncCurrentCharacterVar1()");
assert(_vm->_currentCharacterVariables != NULL);
++_vm->_currentCharacterVariables[1];
}
void LilliputScript::OC_sub17D23() {
debugC(1, kDebugScriptTBC, "OC_sub17D23()");
int var1 = _currScript->readUint16LE();
Common::Point var2 = getPosFromScript();
byte* buf = _vm->_currentCharacterVariables + 4;
computeOperation(buf, var1, var2.x);
computeOperation(buf + 1, var1, var2.y);
}
2012-04-30 17:57:23 +02:00
void LilliputScript::OC_sub17E6D() {
debugC(1, kDebugScriptTBC, "OC_sub17E6D()");
int var1 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
_vm->_rulesBuffer2_12[_vm->_currentScriptCharacter] = (var1 - 2000) & 0xFF;
}
2012-04-30 17:57:23 +02:00
void LilliputScript::OC_changeCurrentCharacterSprite() {
debugC(2, kDebugScriptTBC, "OC_changeCurrentCharacterSprite()");
int var1 = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
_vm->_characterFrameArray[_vm->_currentScriptCharacter] = var1;
_vm->_spriteSizeArray[_vm->_currentScriptCharacter] = var2;
}
byte *LilliputScript::sub173D2() {
debugC(2, kDebugScriptTBC, "sub173D2()");
int index = _currScript->readUint16LE();
return &_vm->_currentCharacterVariables[index];
}
void LilliputScript::OC_sub17E99() {
debugC(1, kDebugScriptTBC, "OC_sub17E99()");
byte *compBuf = sub173D2();
int oper = _currScript->readUint16LE();
int index = _currScript->readUint16LE();
byte *buf = sub173D2();
byte var1 = buf[0];
byte var3 = _vm->_rulesChunk11[var1 + _vm->_rulesChunk10[index]];
computeOperation(compBuf, oper, var3);
}
void LilliputScript::OC_sub17EC5() {
//debugC(1, kDebugScriptTBC, "OC_sub17EC5()");
warning("OC_sub17EC5");
/*byte *compBuf = sub173D2();
int oper = _currScript->readUint16LE();
int index = _currScript->readUint16LE();
byte *buf = sub173D2();
byte var1 = buf[0];
byte var3 = _vm->_rulesChunk11[var1 + _vm->_rulesChunk10[index]];
computeOperation(compBuf, oper, var3);*/
}
Common::Point LilliputScript::getCharacterTilePos(int index) {
debugC(2, kDebugScriptTBC, "getCharacterTilePos(%d)", index);
return Common::Point(_vm->_characterPositionX[index] >> 3, _vm->_characterPositionY[index] >> 3);
}
void LilliputScript::OC_setCharacterDirectionTowardsPos() {
debugC(1, kDebugScriptTBC, "OC_setCharacterDirectionTowardsPos()");
Common::Point pos1 = getPosFromScript();
Common::Point tilePos = getCharacterTilePos(_vm->_currentScriptCharacter);
int dir = _vm->getDirection(tilePos, pos1);
2012-05-01 23:32:44 +02:00
_vm->_characterDirectionArray[_vm->_currentScriptCharacter] = dir;
}
void LilliputScript::OC_sub17F08() {
debugC(1, kDebugScriptTBC, "OC_sub17F08()");
2012-04-30 17:57:23 +02:00
int index = getValue1();
2012-04-30 17:57:23 +02:00
static const byte _directionsArray[] = { 0, 2, 0, 1, 3, 2, 3, 1 };
2012-05-01 23:32:44 +02:00
int dx = _vm->_characterPositionX[index] - _vm->_characterDisplayX[_vm->_currentScriptCharacter];
int dy = _vm->_characterPositionY[index] - _vm->_characterDisplayY[_vm->_currentScriptCharacter];
int flag = 0;
if (dx < 0) {
dx = -dx;
flag |= 4;
}
if (dy < 0) {
dy = -dy;
flag |= 2;
}
if (dx < dy) {
flag |= 1;
}
2012-05-01 23:32:44 +02:00
_vm->_characterDirectionArray[_vm->_currentScriptCharacter] = _directionsArray[flag];
}
void LilliputScript::OC_sub17F4F() {
debugC(1, kDebugScriptTBC, "OC_sub17F4F()");
int var = getValue1();
_array10A39[_vm->_currentScriptCharacter] = var & 0xFF;
_vm->_array109E9PosX[_vm->_currentScriptCharacter] = -1;
}
2012-04-30 17:57:23 +02:00
void LilliputScript::OC_sub17F68() {
debugC(1, kDebugScriptTBC, "OC_sub17F68()");
2012-05-01 23:32:44 +02:00
if (_vm->_currentScriptCharacter != _viewportCharacterTarget)
return;
static const char _byte17F60[] = {-1, -3, -3, -6};
static const char _byte17F64[] = {-3, -6, -1, -3};
int cx = _byte17F60[_vm->_characterDirectionArray[_vm->_currentScriptCharacter]];
int cy = _byte17F64[_vm->_characterDirectionArray[_vm->_currentScriptCharacter]];
Common::Point pos = getCharacterTilePos(_vm->_currentScriptCharacter);
int newPosX = pos.x + cx;
int newPosY = pos.y + cy;
if (newPosX < 0)
newPosX = 0;
if (newPosX > 56)
newPosX = 56;
if (newPosY < 0)
newPosY = 0;
if (newPosY > 56)
newPosY = 56;
_byte12A09 = 1;
_vm->viewportScrollTo(Common::Point(newPosX, newPosY));
_byte12A09 = 0;
}
void LilliputScript::OC_skipNextVal() {
debugC(1, kDebugScriptTBC, "OC_skipNextVal()");
_currScript->readUint16LE();
}
void LilliputScript::OC_sub17FD2() {
debugC(1, kDebugScriptTBC, "OC_sub17FD2()");
int var1 = getValue1();
_vm->_currentCharacterVariables[6] = var1 & 0xFF;
}
void LilliputScript::OC_sub17FDD() {
debugC(1, kDebugScriptTBC, "OC_sub17FDD()");
int index = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
int tmpVal = (_vm->_currentScriptCharacter * 32) + index;
assert (tmpVal < 40 * 32);
2012-05-01 23:32:44 +02:00
_array10AB1[_vm->_currentScriptCharacter] = _vm->_rulesBuffer2_16[tmpVal];
_array12811[_vm->_currentScriptCharacter] = 16;
}
void LilliputScript::OC_setByte10B29() {
debugC(1, kDebugScriptTBC, "OC_setByte10B29()");
int var1 = getValue1();
_characterScriptEnabled[var1] = 1;
}
void LilliputScript::OC_setCurrentCharacterVar2() {
debugC(1, kDebugScriptTBC, "OC_setCurrentCharacterVar2()");
int curWord = _currScript->readUint16LE();
assert(_vm->_currentCharacterVariables != NULL);
_vm->_currentCharacterVariables[2] = curWord & 0xFF;
}
void LilliputScript::OC_SetCurrentCharacterVar2ToZero() {
debugC(1, kDebugScriptTBC, "OC_SetCurrentCharacterVar2ToZero()");
assert(_vm->_currentCharacterVariables != NULL);
_vm->_currentCharacterVariables[2] = 0;
}
void LilliputScript::OC_sub1801D() {
debugC(1, kDebugScriptTBC, "OC_SetCurrentCharacterVar2ToZero()");
int var1 = getValue1();
int x = _vm->_characterPositionX[var1] & 0xFFF8;
x += _currScript->readUint16LE();
_vm->_characterPositionX[var1] = x;
int y = _vm->_characterPositionY[var1] & 0xFFF8;
y += _currScript->readUint16LE();
_vm->_characterPositionY[var1] = y;
_vm->_characterPositionAltitude[var1] = _currScript->readUint16LE();
_vm->_characterDirectionArray[var1] = _currScript->readUint16LE();
}
void LilliputScript::OC_sub1805D() {
debugC(1, kDebugScriptTBC, "OC_sub1805D()");
_word129A3 = getValue1();
for (int i = 0; i < 4; i++)
_array129A5[i] = _currScript->readUint16LE() & 0xFF;
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_sub18074() {
debugC(1, kDebugScriptTBC, "OC_sub18074()");
2012-04-29 11:48:10 +02:00
int var2 = _currScript->readUint16LE();
byte var1 = (_currScript->readUint16LE() & 0xFF);
2012-05-01 23:32:44 +02:00
_vm->_rulesBuffer2_16[(_vm->_currentScriptCharacter * 32) + var2] = var1;
}
2012-04-29 11:48:10 +02:00
2012-04-30 17:57:23 +02:00
void LilliputScript::OC_setCurrentCharacterDirection() {
debugC(1, kDebugScriptTBC, "OC_setCurrentCharacterDirection()");
2012-04-29 11:48:10 +02:00
2012-05-01 23:32:44 +02:00
_vm->_characterDirectionArray[_vm->_currentScriptCharacter] = (_currScript->readUint16LE() & 0xFF);
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub18099() {
debugC(1, kDebugScriptTBC, "OC_sub18099()");
2012-04-07 18:09:30 +02:00
int index = _currScript->readUint16LE();
assert((index >= 0) && (index < 20));
int curWord = _currScript->readUint16LE();
_array122E9[index] = (curWord & 0xFF);
_array122FD[index] = (curWord >> 8);
_vm->displayInterfaceHotspots();
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub180C3() {
debugC(1, kDebugScriptTBC, "OC_sub180C3()");
2012-05-11 20:47:17 +02:00
_viewportCharacterTarget = -1;
int var1 = _currScript->readUint16LE();
static const char _byte180B3[] = { 6, 0, 0, -6 };
static const char _byte180BB[] = { 0, -6, 6, 0 };
int x = _viewportPos.x + _byte180B3[var1];
int y = _viewportPos.y + _byte180BB[var1];
if ( x < 0 )
x = 0;
if ( y < 0 )
y = 0;
if ( x > 56 )
x = 56;
if ( y > 56 )
y = 56;
_byte12A09 = 1;
_vm->viewportScrollTo(Common::Point(x, y));
_byte12A09 = 0;
}
2012-05-11 20:47:17 +02:00
void LilliputScript::OC_setViewPortPos() {
debugC(1, kDebugScript, "OC_setViewPortPos()");
2012-05-11 20:47:17 +02:00
_viewportCharacterTarget = -1;
_viewportPos = getPosFromScript();
2012-05-10 08:11:45 +02:00
_vm->displayLandscape();
2012-05-11 20:47:17 +02:00
_vm->prepareGameArea();
}
2012-05-11 20:47:17 +02:00
void LilliputScript::OC_setCurrentCharacterAltitude() {
debugC(1, kDebugScript, "OC_setCurrentCharacterAltitude()");
2012-05-01 23:32:44 +02:00
_vm->_characterPositionAltitude[_vm->_currentScriptCharacter] = (_currScript->readUint16LE() & 0xFF);
}
void LilliputScript::OC_sub1817F() {
debugC(1, kDebugScriptTBC, "OC_sub1817F()");
int var1 = _currScript->readUint16LE();
int var2 = _currScript->readUint16LE();
int b1 = var1 & 0xFF;
int b2 = var2 & 0xFF;
2012-05-10 19:55:39 +02:00
sub1818B(Common::Point(b1, b2));
}
//TODO checkme: parameter order is maybe wrong
2012-05-10 19:55:39 +02:00
void LilliputScript::sub1818B(Common::Point pos) {
debugC(2, kDebugScriptTBC, "sub1818B(%d - %d)", pos.x, pos.y);
for (int i = 0; i < _vm->_word1817B; i++) {
2012-05-10 19:55:39 +02:00
if (_array1813BPos[i].x == pos.x) {
pos.y += _array1813BPos[i].y;
if (pos.y > 0xFF)
pos.y = 0xFF;
_array1813BPos[i] = pos;
return;
}
}
2012-05-10 19:55:39 +02:00
_array1813BPos[_vm->_word1817B] = pos;
++_vm->_word1817B;
}
//TODO checkme: case 0x2D is dubious
void LilliputScript::OC_sub181BB() {
debugC(1, kDebugScriptTBC, "OC_sub181BB()");
int b = _currScript->readUint16LE();
int d = _currScript->readUint16LE() & 0xFF;
int s = _currScript->readUint16LE();
int c = _vm->_currentCharacterVariables[s];
int c2 = 0;
if ( d == 0x2D ) {
c = - 1 - c;
} else if ( d == 0x3E ) {
c = c - 0x80;
if ( c < 0 )
c = 0;
c = c * 2;
} else if ( d == 0x3C ) {
c = -1 - c;
c = c - 0x80;
if ( c < 0 )
c = 0;
c = c * 2;
}
int a = (_currScript->readUint16LE() * c) + (c & 0xFF);
b = (b & 0xFF00) + a;
2012-05-10 19:55:39 +02:00
sub1818B(Common::Point(b >> 8, b & 0xFF));
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub18213() {
debugC(1, kDebugScriptTBC, "OC_sub18213()");
int var1 = _currScript->readUint16LE();
int maxValue = 0;
int maxItem = var1 & 0xFF;
for (int i = 0; i < _vm->_word1817B; i++) {
2012-05-10 19:55:39 +02:00
if (_array1813BPos[i].y > maxValue) {
maxValue = _array1813BPos[i].y;
maxItem = _array1813BPos[i].x;
}
}
sub1823E(_vm->_currentScriptCharacter, maxItem, _vm->_currentCharacterVariables);
}
2012-04-27 08:10:55 +02:00
void LilliputScript::OC_sub18252() {
debugC(1, kDebugScriptTBC, "OC_sub18252()");
2012-04-29 11:48:10 +02:00
int index = getValue1();
assert(index < 40);
_vm->_array12299[index] = 4;
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_sub18260() {
warning("OC_sub18260()");
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_sub182EC() {
debugC(1, kDebugScriptTBC, "OC_sub182EC()");
2012-04-29 11:48:10 +02:00
byte *tmpArr = getCharacterVariablePtr();
2012-04-29 11:48:10 +02:00
byte var1 = (_currScript->readUint16LE() & 0xFF);
byte var2 = (_currScript->readUint16LE() & 0xFF);
if (var2 == 0)
tmpArr[0] = (0xFF ^ var1);
else
tmpArr[0] |= var1;
}
2012-04-22 23:07:09 +02:00
void LilliputScript::OC_PaletteFadeOut() {
2012-05-09 08:07:58 +02:00
debugC(1, kDebugScript, "OC_PaletteFadeOut()");
2012-04-27 08:10:55 +02:00
_byte12A09 = 1;
_vm->paletteFadeOut();
_byte12A09 = 0;
}
2012-04-22 23:07:09 +02:00
void LilliputScript::OC_PaletteFadeIn() {
2012-05-09 08:07:58 +02:00
debugC(1, kDebugScript, "OC_PaletteFadeIn()");
_byte12A09 = 1;
_vm->paletteFadeIn();
_byte12A09 = 0;
}
void LilliputScript::OC_loadAndDisplayCUBESx_GFX() {
2012-05-10 08:11:45 +02:00
debugC(1, kDebugScript, "OC_loadAndDisplayCUBESx_GFX()");
2012-05-10 08:11:45 +02:00
int curWord = (_currScript->readUint16LE() & 0xFF);
assert((curWord >= 0) && (curWord <= 9));
Common::String fileName = Common::String::format("CUBES%d.GFX", curWord);
2012-05-10 08:11:45 +02:00
_byte10806 = curWord + 0x30; // Useless?
_vm->_bufferCubegfx = _vm->loadVGA(fileName, 61440, false);
2012-05-10 08:11:45 +02:00
_vm->displayLandscape();
2012-05-11 20:47:17 +02:00
_vm->prepareGameArea();
}
void LilliputScript::OC_sub1834C() {
debugC(1, kDebugScriptTBC, "OC_sub1834C()");
byte curWord = _currScript->readUint16LE() & 0xFF;
assert(_vm->_currentCharacterVariables != NULL);
_vm->_currentCharacterVariables[3] = curWord;
}
2012-04-17 23:48:11 +02:00
2012-05-01 12:18:52 +02:00
void LilliputScript::OC_setArray122C1() {
debugC(1, kDebugScriptTBC, "OC_setArray122C1()");
int var1 = _currScript->readUint16LE();
2012-05-01 23:32:44 +02:00
_array122C1[_vm->_currentScriptCharacter] = var1;
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_sub18367() {
debugC(1, kDebugScriptTBC, "OC_sub18367()");
2012-04-29 11:48:10 +02:00
2012-05-01 23:32:44 +02:00
_characterScriptEnabled[_vm->_currentScriptCharacter] = 1;
_vm->_currentCharacterVariables[0] = _array122C1[_vm->_currentScriptCharacter];
_vm->_currentCharacterVariables[1] = 0;
_vm->_currentCharacterVariables[2] = 0;
_vm->_currentCharacterVariables[3] = 0;
}
2012-04-17 23:48:11 +02:00
void LilliputScript::OC_sub17D04() {
debugC(1, kDebugScriptTBC, "OC_sub17D04()");
2012-04-08 12:54:56 +02:00
2012-05-05 00:10:55 +02:00
int16 index = getValue1();
2012-04-08 12:54:56 +02:00
byte var2 = _currScript->readUint16LE() & 0xFF;
2012-05-05 00:10:55 +02:00
sub1823E(index, var2, _vm->getCharacterVariablesPtr(index * 32));
}
2012-04-08 12:54:56 +02:00
void LilliputScript::OC_sub18387() {
debugC(1, kDebugScriptTBC, "OC_sub18387()");
2012-04-29 11:48:10 +02:00
int index = getValue1();
byte var1 = _currScript->readUint16LE() & 0xFF;
assert(index < 40);
_vm->_rulesBuffer2_10[index] = var1;
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_setDebugFlag() {
debugC(1, kDebugScriptTBC, "OC_setDebugFlag()");
2012-04-29 11:48:10 +02:00
_vm->_debugFlag = 1;
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_setByte14837() {
debugC(1, kDebugScriptTBC, "OC_setByte14837()");
2012-04-29 11:48:10 +02:00
_vm->_byte14837 = 1;
}
2012-04-29 11:48:10 +02:00
void LilliputScript::OC_sub183A2() {
warning("OC_sub183A2");
}
void LilliputScript::OC_sub183C6() {
warning("OC_sub183C6");
}
void LilliputScript::OC_loadFile_AERIAL_GFX() {
debugC(1, kDebugScriptTBC, "OC_loadFile_AERIAL_GFX()");
int var1 = _currScript->readUint16LE() & 0xff;
_vm->_byte15EAD = var1;
_byte12A09 = 1;
2012-05-11 23:32:26 +02:00
_talkingCharacter = -1;
OC_PaletteFadeOut();
_vm->_word15AC2 = 1;
_vm->displayVGAFile("AERIAL.GFX");
OC_PaletteFadeIn();
_vm->displayCharactersOnMap();
_vm->_byte16F08 = 1;
_vm->_keyboard_oldIndex = 0;
_vm->_keyboard_nextIndex = 0;
_vm->_byte12A09 = 0;
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub17E22_speech1IfSoundOff() {
warning("OC_sub17E22_speech1IfSoundOff");
}
2012-05-11 23:32:26 +02:00
void LilliputScript::OC_sub1844A() {
warning("OC_sub1844A");
}
2012-04-17 23:48:11 +02:00
void LilliputScript::OC_sub1847F() {
debugC(1, kDebugScriptTBC, "OC_sub1847F()");
2012-04-17 23:48:11 +02:00
byte *buf215Ptr = getCharacterVariablePtr();
2012-04-07 18:09:30 +02:00
byte tmpVal = buf215Ptr[0];
int curWord = _currScript->readUint16LE();
assert(curWord != 0);
int var1 = tmpVal / (curWord & 0xFF);
2012-04-07 18:09:30 +02:00
int var2 = _currScript->readUint16LE();
int var4 = _currScript->readUint16LE();
2012-04-07 18:09:30 +02:00
if (_vm->_displayMap != 1) {
2012-05-09 08:07:58 +02:00
_vm->restoreSurfaceUnderMousePointer();
sub18BE6(var1 & 0xFF, var2, var4);
2012-05-09 08:07:58 +02:00
_vm->displayMousePointer();
2012-04-07 18:09:30 +02:00
}
}
void LilliputScript::sub18BE6(byte var1, int var2, int var4) {
debugC(1, kDebugScriptTBC, "sub18BE6(%d, %d, %d)", var1, var2, var4);
_vm->_displayStringIndex = 0;
_vm->_displayStringBuf[0] = 32;
_vm->_displayStringBuf[1] = 32;
_vm->_displayStringBuf[2] = 32;
_vm->_displayStringBuf[3] = 0;
_vm->prepareGoldAmount(var1);
_vm->displayString(_vm->_displayStringBuf, var2, var4);
}
void LilliputScript::OC_displayVGAFile() {
2012-05-09 08:07:58 +02:00
debugC(1, kDebugScript, "OC_displayVGAFile()");
_byte12A09 = 1;
2012-05-09 08:07:58 +02:00
_vm->paletteFadeOut();
int curWord = _currScript->readUint16LE();
2012-05-09 08:07:58 +02:00
int index = _vm->_packedStringIndex[curWord];
Common::String fileName = Common::String((const char *)&_vm->_packedStrings[index]);
2012-05-11 23:32:26 +02:00
_talkingCharacter = -1;
_vm->displayVGAFile(fileName);
2012-05-09 08:07:58 +02:00
_vm->paletteFadeIn();
}
2012-04-17 23:48:11 +02:00
void LilliputScript::OC_sub184D7() {
warning("OC_sub184D7");
}
2012-04-17 23:48:11 +02:00
2012-04-10 10:06:50 +02:00
void LilliputScript::OC_displayTitleScreen() {
2012-05-09 23:13:15 +02:00
debugC(1, kDebugScript, "OC_displayTitleScreen()");
_vm->_byte184F4 = (_currScript->readUint16LE() & 0xFF);
_vm->_sound_byte16F06 = _vm->_byte184F4;
2012-04-10 10:06:50 +02:00
// TODO: Rewrite keyboard handling (this code was in a separated function)
_vm->_keyboard_nextIndex = 0;
_vm->_keyboard_oldIndex = 0;
//
2012-04-10 00:57:59 +02:00
_vm->_mouseButton = 0;
_vm->_byte16F09 = 0;
2012-05-09 23:13:15 +02:00
while(!_vm->_shouldQuit) {
2012-05-11 17:01:00 +02:00
_vm->displaySmallAnims();
_vm->update();
if (_vm->_keyboard_nextIndex != _vm->_keyboard_oldIndex) {
_vm->_byte16F09 = _vm->_keyboard_getch();
_vm->_keyboard_getch();
break;
}
2012-04-10 00:57:59 +02:00
if (_vm->_mouseButton & 1)
break;
if ((_vm->_byte184F4 != 0) && (_vm->_sound_byte16F06 == 0))
break;
}
2012-04-10 00:57:59 +02:00
_vm->_mouseButton = 0;
}
2012-04-07 18:09:30 +02:00
void LilliputScript::OC_sub1853B() {
debugC(1, kDebugScriptTBC, "OC_sub1853B()");
2012-04-07 18:09:30 +02:00
2012-04-22 23:07:09 +02:00
OC_PaletteFadeOut();
_vm->_displayMap = 0;
_heroismLevel = 0;
2012-04-07 18:09:30 +02:00
sub130B6();
_vm->displayFunction12();
2012-04-22 23:07:09 +02:00
OC_PaletteFadeIn();
2012-04-07 18:09:30 +02:00
_byte12A09 = 0;
_vm->_soundHandler->contentFct5();
}
2012-04-07 18:09:30 +02:00
void LilliputScript::OC_sub1864D() {
debugC(1, kDebugScriptTBC, "OC_sub1864D()");
byte *tmpArr = getCharacterVariablePtr();
int var1 = (_currScript->readUint16LE() & 0xFF);
int var3 = ((70 * tmpArr[0]) / (_currScript->readUint16LE() & 0xFF) & 0xFF);
int var2 = _currScript->readUint16LE();
int var4 = _currScript->readUint16LE();
_vm->displayFunction18(var1, var2, var3, var4);
}
2012-05-11 17:01:00 +02:00
void LilliputScript::OC_initSmallAnim() {
debugC(1, kDebugScript, "OC_initSmallAnim()");
2012-05-09 23:13:15 +02:00
int index = _currScript->readUint16LE();
assert (index < 4);
2012-05-11 17:01:00 +02:00
_vm->_smallAnims[index]._active = true;
_vm->_smallAnims[index]._pos.x = _currScript->readSint16LE();
_vm->_smallAnims[index]._pos.y = _currScript->readSint16LE();
for (int i = 0; i < 8; i++)
2012-05-11 17:01:00 +02:00
_vm->_smallAnims[index]._frameIndex[i] = _currScript->readUint16LE();
}
void LilliputScript::OC_sub18678() {
debugC(1, kDebugScriptTBC, "OC_initArr18578()");
_savedBuffer215Ptr = getCharacterVariablePtr();
_heroismBarX = _currScript->readUint16LE();
_heroismBarBottomY = _currScript->readUint16LE();
}
2012-04-17 23:48:11 +02:00
void LilliputScript::OC_sub18690() {
warning("OC_sub18690");
}
2012-04-17 23:48:11 +02:00
2012-04-30 17:57:23 +02:00
void LilliputScript::OC_setViewPortCharacterTarget() {
debugC(1, kDebugScriptTBC, "OC_setViewPortCharacterTarget()");
2012-04-07 18:09:30 +02:00
_viewportCharacterTarget = getValue1();
}
void LilliputScript::OC_sub186A1() {
warning("OC_sub186A1");
}
void LilliputScript::OC_sub186E5_snd() {
debugC(1, kDebugScriptTBC, "OC_sub186E5_snd()");
int index = getValue1();
assert(index < 40);
2012-05-09 23:13:15 +02:00
Common::Point var4 = Common::Point(0xFF, index & 0xFF);
int var1 = (_currScript->readUint16LE() & 0xFF);
_vm->_soundHandler->contentFct2(var1, _viewportPos, Common::Point(_array16123PosX[index], _array1614BPosY[index]), var4);
}
void LilliputScript::OC_sub1870A_snd() {
debugC(1, kDebugScriptTBC, "OC_sub1870A_snd()");
Common::Point var3 = getPosFromScript();
Common::Point var4 = var3;
Common::Point var2 = _viewportPos;
2012-04-07 18:09:30 +02:00
int var1 = (_currScript->readUint16LE() & 0xFF);
2012-05-09 23:13:15 +02:00
_vm->_soundHandler->contentFct2(var1, var2, var3, var4);
}
void LilliputScript::OC_sub18725_snd() {
debugC(1, kDebugScriptTBC, "OC_sub18725_snd()");
int var4 = getValue1() | 0xFF00;
_vm->_soundHandler->contentFct3();
}
void LilliputScript::OC_sub18733_snd() {
debugC(1, kDebugScriptTBC, "OC_sub18733_snd()");
Common::Point var4 = getPosFromScript();
_vm->_soundHandler->contentFct3();
}
void LilliputScript::OC_sub1873F_snd() {
debugC(1, kDebugScriptTBC, "OC_sub1873F_snd()");
_vm->_soundHandler->contentFct4();
}
void LilliputScript::OC_sub18746_snd() {
2012-05-09 23:13:15 +02:00
debugC(1, kDebugScript, "OC_sub18746_snd()");
2012-05-09 23:13:15 +02:00
Common::Point var4 = Common::Point(-1, -1);
Common::Point var2 = _viewportPos;
int var1 = _currScript->readSint16LE() & 0xFF;
warning("OC_sub18746_snd: unknown value for var3");
Common::Point var3 = Common::Point(-1, -1);
2012-05-09 23:13:15 +02:00
_vm->_soundHandler->contentFct2(var1, var2, var3, var4);
}
void LilliputScript::OC_sub1875D_snd() {
debugC(1, kDebugScriptTBC, "OC_sub1875D_snd()");
_vm->_soundHandler->contentFct6();
}
void LilliputScript::OC_sub18764() {
debugC(1, kDebugScriptTBC, "OC_sub18764()");
int index = getValue1();
int var1 = _currScript->readUint16LE();
assert(index < 40);
_array128EF[index] = var1 & 0xFF;
}
} // End of namespace