From 3ceb1482dbc8559dde0346f3c38b93be6bc1f976 Mon Sep 17 00:00:00 2001 From: Chris Apers Date: Sun, 15 Feb 2009 18:53:27 +0000 Subject: Quick dirty hack to make the engine run again on PalmOS svn-id: r38278 --- engines/cine/script.h | 14 +- engines/cine/script_fw.cpp | 326 +++++++++++++++++---------------- engines/cine/script_os.cpp | 438 +++++++++++++++++++++++---------------------- 3 files changed, 399 insertions(+), 379 deletions(-) (limited to 'engines') diff --git a/engines/cine/script.h b/engines/cine/script.h index 19576e4c1a..0559720ecd 100644 --- a/engines/cine/script.h +++ b/engines/cine/script.h @@ -147,10 +147,10 @@ private: ScriptVars &_globalVars; ///< Global variables reference FWScriptInfo *_info; ///< Script info - static const Opcode _opcodeTable[]; - static const unsigned int _numOpcodes; - protected: + static Opcode *_opcodeTable; + static unsigned int _numOpcodes; + int o1_modifyObjectParam(); int o1_getObjectParam(); int o1_addObjectParam(); @@ -278,6 +278,8 @@ protected: public: int16 _index; ///< Index in script table + static void setupTable(); + FWScript(const RawScript &script, int16 index); // FWScript(const RawObjectScript &script, int16 index); FWScript(const FWScript &src); @@ -298,13 +300,15 @@ public: */ class OSScript : public FWScript { private: - static const Opcode _opcodeTable[]; - static const unsigned int _numOpcodes; + static Opcode *_opcodeTable; + static unsigned int _numOpcodes; protected: void load(const ScriptVars &labels, const ScriptVars &local, uint16 compare, uint16 pos); public: + static void setupTable(); + OSScript(const RawScript &script, int16 index); OSScript(RawObjectScript &script, int16 index); OSScript(const OSScript &src); diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index e90dd6f151..b4c4d72701 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -48,164 +48,172 @@ ScriptVars globalVars(NUM_MAX_VAR + 1); uint16 compareVars(int16 a, int16 b); -const Opcode FWScript::_opcodeTable[] = { - /* 00 */ - { &FWScript::o1_modifyObjectParam, "bbw" }, - { &FWScript::o1_getObjectParam, "bbb" }, - { &FWScript::o1_addObjectParam, "bbw" }, - { &FWScript::o1_subObjectParam, "bbw" }, - /* 04 */ - { &FWScript::o1_mulObjectParam, "bbw" }, - { &FWScript::o1_divObjectParam, "bbw" }, - { &FWScript::o1_compareObjectParam, "bbw" }, - { &FWScript::o1_setupObject, "bwwww" }, - /* 08 */ - { &FWScript::o1_checkCollision, "bwwww" }, - { &FWScript::o1_loadVar, "bc" }, - { &FWScript::o1_addVar, "bc" }, - { &FWScript::o1_subVar, "bc" }, - /* 0C */ - { &FWScript::o1_mulVar, "bc" }, - { &FWScript::o1_divVar, "bc" }, - { &FWScript::o1_compareVar, "bc" }, - { &FWScript::o1_modifyObjectParam2, "bbb" }, - /* 10 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_loadMask0, "b" }, - /* 14 */ - { &FWScript::o1_unloadMask0, "b" }, - { &FWScript::o1_addToBgList, "b" }, - { &FWScript::o1_loadMask1, "b" }, - { &FWScript::o1_unloadMask1, "b" }, - /* 18 */ - { &FWScript::o1_loadMask4, "b" }, - { &FWScript::o1_unloadMask4, "b" }, - { &FWScript::o1_addSpriteFilledToBgList, "b" }, - { &FWScript::o1_op1B, "" }, - /* 1C */ - { 0, 0 }, - { &FWScript::o1_label, "l" }, - { &FWScript::o1_goto, "b" }, - { &FWScript::o1_gotoIfSup, "b" }, - /* 20 */ - { &FWScript::o1_gotoIfSupEqu, "b" }, - { &FWScript::o1_gotoIfInf, "b" }, - { &FWScript::o1_gotoIfInfEqu, "b" }, - { &FWScript::o1_gotoIfEqu, "b" }, - /* 24 */ - { &FWScript::o1_gotoIfDiff, "b" }, - { &FWScript::o1_removeLabel, "b" }, - { &FWScript::o1_loop, "bb" }, - { 0, 0 }, - /* 28 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 2C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 30 */ - { 0, 0 }, - { &FWScript::o1_startGlobalScript, "b" }, - { &FWScript::o1_endGlobalScript, "b" }, - { 0, 0 }, - /* 34 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 38 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_loadAnim, "s" }, - /* 3C */ - { &FWScript::o1_loadBg, "s" }, - { &FWScript::o1_loadCt, "s" }, - { 0, 0 }, - { &FWScript::o1_loadPart, "s" }, - /* 40 */ - { &FWScript::o1_closePart, "" }, - { &FWScript::o1_loadNewPrcName, "bs" }, - { &FWScript::o1_requestCheckPendingDataLoad, "" }, - { 0, 0 }, - /* 44 */ - { 0, 0 }, - { &FWScript::o1_blitAndFade, "" }, - { &FWScript::o1_fadeToBlack, "" }, - { &FWScript::o1_transformPaletteRange, "bbwww" }, - /* 48 */ - { 0, 0 }, - { &FWScript::o1_setDefaultMenuBgColor, "b" }, - { &FWScript::o1_palRotate, "bbb" }, - { 0, 0 }, - /* 4C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_break, "" }, - /* 50 */ - { &FWScript::o1_endScript, "x" }, - { &FWScript::o1_message, "bwwww" }, - { &FWScript::o1_loadGlobalVar, "bc" }, - { &FWScript::o1_compareGlobalVar, "bc" }, - /* 54 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 58 */ - { 0, 0 }, - { &FWScript::o1_declareFunctionName, "s" }, - { &FWScript::o1_freePartRange, "bb" }, - { &FWScript::o1_unloadAllMasks, "" }, - /* 5C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 60 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_setScreenDimensions, "wwww" }, - /* 64 */ - { &FWScript::o1_displayBackground, "" }, - { &FWScript::o1_initializeZoneData, "" }, - { &FWScript::o1_setZoneDataEntry, "bw" }, - { &FWScript::o1_getZoneDataEntry, "bb" }, - /* 68 */ - { &FWScript::o1_setPlayerCommandPosY, "b" }, - { &FWScript::o1_allowPlayerInput, "" }, - { &FWScript::o1_disallowPlayerInput, "" }, - { &FWScript::o1_changeDataDisk, "b" }, - /* 6C */ - { 0, 0 }, - { &FWScript::o1_loadMusic, "s" }, - { &FWScript::o1_playMusic, "" }, - { &FWScript::o1_fadeOutMusic, "" }, - /* 70 */ - { &FWScript::o1_stopSample, "" }, - { &FWScript::o1_op71, "bw" }, - { &FWScript::o1_op72, "wbw" }, - { &FWScript::o1_op73, "wbw" }, - /* 74 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_playSample, "bbwbww" }, - /* 78 */ - { &FWScript::o1_playSample, "bbwbww" }, - { &FWScript::o1_disableSystemMenu, "b" }, - { &FWScript::o1_loadMask5, "b" }, - { &FWScript::o1_unloadMask5, "b" } -}; -const unsigned int FWScript::_numOpcodes = ARRAYSIZE(FWScript::_opcodeTable); + +Opcode *FWScript::_opcodeTable = 0; +unsigned int FWScript::_numOpcodes = 0; + +void FWScript::setupTable() { + static const Opcode opcodeTable[] = { + /* 00 */ + { &FWScript::o1_modifyObjectParam, "bbw" }, + { &FWScript::o1_getObjectParam, "bbb" }, + { &FWScript::o1_addObjectParam, "bbw" }, + { &FWScript::o1_subObjectParam, "bbw" }, + /* 04 */ + { &FWScript::o1_mulObjectParam, "bbw" }, + { &FWScript::o1_divObjectParam, "bbw" }, + { &FWScript::o1_compareObjectParam, "bbw" }, + { &FWScript::o1_setupObject, "bwwww" }, + /* 08 */ + { &FWScript::o1_checkCollision, "bwwww" }, + { &FWScript::o1_loadVar, "bc" }, + { &FWScript::o1_addVar, "bc" }, + { &FWScript::o1_subVar, "bc" }, + /* 0C */ + { &FWScript::o1_mulVar, "bc" }, + { &FWScript::o1_divVar, "bc" }, + { &FWScript::o1_compareVar, "bc" }, + { &FWScript::o1_modifyObjectParam2, "bbb" }, + /* 10 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_loadMask0, "b" }, + /* 14 */ + { &FWScript::o1_unloadMask0, "b" }, + { &FWScript::o1_addToBgList, "b" }, + { &FWScript::o1_loadMask1, "b" }, + { &FWScript::o1_unloadMask1, "b" }, + /* 18 */ + { &FWScript::o1_loadMask4, "b" }, + { &FWScript::o1_unloadMask4, "b" }, + { &FWScript::o1_addSpriteFilledToBgList, "b" }, + { &FWScript::o1_op1B, "" }, + /* 1C */ + { 0, 0 }, + { &FWScript::o1_label, "l" }, + { &FWScript::o1_goto, "b" }, + { &FWScript::o1_gotoIfSup, "b" }, + /* 20 */ + { &FWScript::o1_gotoIfSupEqu, "b" }, + { &FWScript::o1_gotoIfInf, "b" }, + { &FWScript::o1_gotoIfInfEqu, "b" }, + { &FWScript::o1_gotoIfEqu, "b" }, + /* 24 */ + { &FWScript::o1_gotoIfDiff, "b" }, + { &FWScript::o1_removeLabel, "b" }, + { &FWScript::o1_loop, "bb" }, + { 0, 0 }, + /* 28 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 2C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 30 */ + { 0, 0 }, + { &FWScript::o1_startGlobalScript, "b" }, + { &FWScript::o1_endGlobalScript, "b" }, + { 0, 0 }, + /* 34 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 38 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_loadAnim, "s" }, + /* 3C */ + { &FWScript::o1_loadBg, "s" }, + { &FWScript::o1_loadCt, "s" }, + { 0, 0 }, + { &FWScript::o1_loadPart, "s" }, + /* 40 */ + { &FWScript::o1_closePart, "" }, + { &FWScript::o1_loadNewPrcName, "bs" }, + { &FWScript::o1_requestCheckPendingDataLoad, "" }, + { 0, 0 }, + /* 44 */ + { 0, 0 }, + { &FWScript::o1_blitAndFade, "" }, + { &FWScript::o1_fadeToBlack, "" }, + { &FWScript::o1_transformPaletteRange, "bbwww" }, + /* 48 */ + { 0, 0 }, + { &FWScript::o1_setDefaultMenuBgColor, "b" }, + { &FWScript::o1_palRotate, "bbb" }, + { 0, 0 }, + /* 4C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_break, "" }, + /* 50 */ + { &FWScript::o1_endScript, "x" }, + { &FWScript::o1_message, "bwwww" }, + { &FWScript::o1_loadGlobalVar, "bc" }, + { &FWScript::o1_compareGlobalVar, "bc" }, + /* 54 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 58 */ + { 0, 0 }, + { &FWScript::o1_declareFunctionName, "s" }, + { &FWScript::o1_freePartRange, "bb" }, + { &FWScript::o1_unloadAllMasks, "" }, + /* 5C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 60 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_setScreenDimensions, "wwww" }, + /* 64 */ + { &FWScript::o1_displayBackground, "" }, + { &FWScript::o1_initializeZoneData, "" }, + { &FWScript::o1_setZoneDataEntry, "bw" }, + { &FWScript::o1_getZoneDataEntry, "bb" }, + /* 68 */ + { &FWScript::o1_setPlayerCommandPosY, "b" }, + { &FWScript::o1_allowPlayerInput, "" }, + { &FWScript::o1_disallowPlayerInput, "" }, + { &FWScript::o1_changeDataDisk, "b" }, + /* 6C */ + { 0, 0 }, + { &FWScript::o1_loadMusic, "s" }, + { &FWScript::o1_playMusic, "" }, + { &FWScript::o1_fadeOutMusic, "" }, + /* 70 */ + { &FWScript::o1_stopSample, "" }, + { &FWScript::o1_op71, "bw" }, + { &FWScript::o1_op72, "wbw" }, + { &FWScript::o1_op73, "wbw" }, + /* 74 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_playSample, "bbwbww" }, + /* 78 */ + { &FWScript::o1_playSample, "bbwbww" }, + { &FWScript::o1_disableSystemMenu, "b" }, + { &FWScript::o1_loadMask5, "b" }, + { &FWScript::o1_unloadMask5, "b" } + }; + + FWScript::_opcodeTable = (Opcode *)opcodeTable; + FWScript::_numOpcodes = ARRAYSIZE(opcodeTable); +} FWScriptInfo *scriptInfo; ///< Script factory RawScriptArray scriptTable; ///< Table of script bytecode @@ -216,8 +224,10 @@ void setupOpcodes() { static FWScriptInfo fw; static OSScriptInfo os; if (g_cine->getGameType() == Cine::GType_FW) { + FWScript::setupTable(); scriptInfo = &fw; } else { + OSScript::setupTable(); scriptInfo = &os; } } diff --git a/engines/cine/script_os.cpp b/engines/cine/script_os.cpp index 792e75b42f..28bb70c36c 100644 --- a/engines/cine/script_os.cpp +++ b/engines/cine/script_os.cpp @@ -38,222 +38,228 @@ namespace Cine { -const Opcode OSScript::_opcodeTable[] = { - /* 00 */ - { &FWScript::o1_modifyObjectParam, "bbw" }, - { &FWScript::o1_getObjectParam, "bbb" }, - { &FWScript::o1_addObjectParam, "bbw" }, - { &FWScript::o1_subObjectParam, "bbw" }, - /* 04 */ - { &FWScript::o1_mulObjectParam, "bbw" }, - { &FWScript::o1_divObjectParam, "bbw" }, - { &FWScript::o1_compareObjectParam, "bbw" }, - { &FWScript::o1_setupObject, "bwwww" }, - /* 08 */ - { &FWScript::o1_checkCollision, "bwwww" }, - { &FWScript::o1_loadVar, "bc" }, - { &FWScript::o1_addVar, "bc" }, - { &FWScript::o1_subVar, "bc" }, - /* 0C */ - { &FWScript::o1_mulVar, "bc" }, - { &FWScript::o1_divVar, "bc" }, - { &FWScript::o1_compareVar, "bc" }, - { &FWScript::o1_modifyObjectParam2, "bbb" }, - /* 10 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_loadMask0, "b" }, - /* 14 */ - { &FWScript::o1_unloadMask0, "b" }, - { &FWScript::o1_addToBgList, "b" }, - { &FWScript::o1_loadMask1, "b" }, - { &FWScript::o1_unloadMask1, "b" }, - /* 18 */ - { &FWScript::o1_loadMask4, "b" }, - { &FWScript::o1_unloadMask4, "b" }, - { &FWScript::o1_addSpriteFilledToBgList, "b" }, - { &FWScript::o1_op1B, "" }, /* TODO: Name this opcode properly. */ - /* 1C */ - { 0, 0 }, - { &FWScript::o1_label, "l" }, - { &FWScript::o1_goto, "b" }, - { &FWScript::o1_gotoIfSup, "b" }, - /* 20 */ - { &FWScript::o1_gotoIfSupEqu, "b" }, - { &FWScript::o1_gotoIfInf, "b" }, - { &FWScript::o1_gotoIfInfEqu, "b" }, - { &FWScript::o1_gotoIfEqu, "b" }, - /* 24 */ - { &FWScript::o1_gotoIfDiff, "b" }, - { &FWScript::o1_removeLabel, "b" }, - { &FWScript::o1_loop, "bb" }, - { 0, 0 }, - /* 28 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 2C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 30 */ - { 0, 0 }, - { &FWScript::o1_startGlobalScript, "b" }, - { &FWScript::o1_endGlobalScript, "b" }, - { 0, 0 }, - /* 34 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 38 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_loadAnim, "s" }, - /* 3C */ - { &FWScript::o1_loadBg, "s" }, - { &FWScript::o2_loadCt, "s" }, - { 0, 0 }, - { &FWScript::o2_loadPart, "s" }, - /* 40 */ - { 0, 0 }, /* o1_closePart, triggered by some scripts (STARTA.PRC 4 for ex.) */ - { &FWScript::o1_loadNewPrcName, "bs" }, - { &FWScript::o1_requestCheckPendingDataLoad, "" }, - { 0, 0 }, - /* 44 */ - { 0, 0 }, - { &FWScript::o1_blitAndFade, "" }, - { &FWScript::o1_fadeToBlack, "" }, - { &FWScript::o1_transformPaletteRange, "bbwww" }, - /* 48 */ - { 0, 0 }, - { &FWScript::o1_setDefaultMenuBgColor, "b" }, - { &FWScript::o1_palRotate, "bbb" }, - { 0, 0 }, - /* 4C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_break, "" }, - /* 50 */ - { &FWScript::o1_endScript, "x" }, - { &FWScript::o1_message, "bwwww" }, - { &FWScript::o1_loadGlobalVar, "bc" }, - { &FWScript::o1_compareGlobalVar, "bc" }, - /* 54 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 58 */ - { 0, 0 }, - { &FWScript::o1_declareFunctionName, "s" }, - { &FWScript::o1_freePartRange, "bb" }, - { &FWScript::o1_unloadAllMasks, "" }, - /* 5C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - /* 60 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o1_setScreenDimensions, "wwww" }, - /* 64 */ - { &FWScript::o1_displayBackground, "" }, - { &FWScript::o1_initializeZoneData, "" }, - { &FWScript::o1_setZoneDataEntry, "bw" }, - { &FWScript::o1_getZoneDataEntry, "bb" }, - /* 68 */ - { &FWScript::o1_setPlayerCommandPosY, "b" }, - { &FWScript::o1_allowPlayerInput, "" }, - { &FWScript::o1_disallowPlayerInput, "" }, - { &FWScript::o1_changeDataDisk, "b" }, /* Same as opcodes 0x95 and 0xA9. */ - /* 6C */ - { 0, 0 }, - { &FWScript::o1_loadMusic, "s" }, - { &FWScript::o1_playMusic, "" }, - { &FWScript::o1_fadeOutMusic, "" }, - /* 70 */ - { &FWScript::o1_stopSample, "" }, - { &FWScript::o1_op71, "bw" }, /* TODO: Name this opcode properly. */ - { &FWScript::o1_op72, "wbw" }, /* Same as opcode 0x73. TODO: Name this opcode properly. */ - { &FWScript::o1_op72, "wbw" }, /* Same as opcode 0x72. */ - /* 74 */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o2_playSample, "bbwbww" }, - /* 78 */ - { &FWScript::o2_playSampleAlt, "bbwbww" }, - { &FWScript::o1_disableSystemMenu, "b" }, - { &FWScript::o1_loadMask5, "b" }, - { &FWScript::o1_unloadMask5, "b" }, /* Last opcode used by Future Wars. */ - /* 7C */ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { &FWScript::o2_addSeqListElement, "bbbbwww" }, - /* 80 */ - { &FWScript::o2_removeSeq, "bb" }, - { &FWScript::o2_op81, "" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_modifySeqListElement, "bbwwb" }, - { &FWScript::o2_isSeqRunning, "bb" }, - /* 84 */ - { &FWScript::o2_gotoIfSupNearest, "b" }, - { &FWScript::o2_gotoIfSupEquNearest, "b" }, - { &FWScript::o2_gotoIfInfNearest, "b" }, - { &FWScript::o2_gotoIfInfEquNearest, "b" }, - /* 88 */ - { &FWScript::o2_gotoIfEquNearest, "b" }, - { &FWScript::o2_gotoIfDiffNearest, "b" }, - { 0, 0 }, - { &FWScript::o2_startObjectScript, "b" }, - /* 8C */ - { &FWScript::o2_stopObjectScript, "b" }, - { &FWScript::o2_op8D, "wwwwwwww" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_addBackground, "bs" }, - { &FWScript::o2_removeBackground, "b" }, - /* 90 */ - { &FWScript::o2_loadAbs, "bs" }, - { &FWScript::o2_loadBg, "b" }, - { 0, 0 }, - { 0, 0 }, - /* 94 */ - { 0, 0 }, - { &FWScript::o1_changeDataDisk, "b" }, /* Same as opcodes 0x6B and 0xA9. */ - { 0, 0 }, - { 0, 0 }, - /* 98 */ - { 0, 0 }, - { 0, 0 }, - { &FWScript::o2_wasZoneChecked, "b" }, - { &FWScript::o2_op9B, "wwwwwwww" }, /* TODO: Name this opcode properly. */ - /* 9C */ - { &FWScript::o2_op9C, "wwww" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_useBgScroll, "b" }, - { &FWScript::o2_setAdditionalBgVScroll, "c" }, - { &FWScript::o2_op9F, "ww" }, /* TODO: Name this opcode properly. */ - /* A0 */ - { &FWScript::o2_addGfxElementType20, "ww" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_removeGfxElementType20, "ww" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_addGfxElementType21, "ww" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_removeGfxElementType21, "ww" }, /* TODO: Name this opcode properly. */ - /* A4 */ - { &FWScript::o2_loadMask22, "b" }, /* TODO: Name this opcode properly. */ - { &FWScript::o2_unloadMask22, "b" }, /* TODO: Name this opcode properly. */ - { 0, 0 }, - { 0, 0 }, - /* A8 */ - { 0, 0 }, - { &FWScript::o1_changeDataDisk, "b" } /* Same as opcodes 0x6B and 0x95. */ -}; -const unsigned int OSScript::_numOpcodes = ARRAYSIZE(OSScript::_opcodeTable); +Opcode *OSScript::_opcodeTable = 0; +unsigned int OSScript::_numOpcodes = 0; + +void OSScript::setupTable() { + static const Opcode opcodeTable[] = { + /* 00 */ + { &FWScript::o1_modifyObjectParam, "bbw" }, + { &FWScript::o1_getObjectParam, "bbb" }, + { &FWScript::o1_addObjectParam, "bbw" }, + { &FWScript::o1_subObjectParam, "bbw" }, + /* 04 */ + { &FWScript::o1_mulObjectParam, "bbw" }, + { &FWScript::o1_divObjectParam, "bbw" }, + { &FWScript::o1_compareObjectParam, "bbw" }, + { &FWScript::o1_setupObject, "bwwww" }, + /* 08 */ + { &FWScript::o1_checkCollision, "bwwww" }, + { &FWScript::o1_loadVar, "bc" }, + { &FWScript::o1_addVar, "bc" }, + { &FWScript::o1_subVar, "bc" }, + /* 0C */ + { &FWScript::o1_mulVar, "bc" }, + { &FWScript::o1_divVar, "bc" }, + { &FWScript::o1_compareVar, "bc" }, + { &FWScript::o1_modifyObjectParam2, "bbb" }, + /* 10 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_loadMask0, "b" }, + /* 14 */ + { &FWScript::o1_unloadMask0, "b" }, + { &FWScript::o1_addToBgList, "b" }, + { &FWScript::o1_loadMask1, "b" }, + { &FWScript::o1_unloadMask1, "b" }, + /* 18 */ + { &FWScript::o1_loadMask4, "b" }, + { &FWScript::o1_unloadMask4, "b" }, + { &FWScript::o1_addSpriteFilledToBgList, "b" }, + { &FWScript::o1_op1B, "" }, /* TODO: Name this opcode properly. */ + /* 1C */ + { 0, 0 }, + { &FWScript::o1_label, "l" }, + { &FWScript::o1_goto, "b" }, + { &FWScript::o1_gotoIfSup, "b" }, + /* 20 */ + { &FWScript::o1_gotoIfSupEqu, "b" }, + { &FWScript::o1_gotoIfInf, "b" }, + { &FWScript::o1_gotoIfInfEqu, "b" }, + { &FWScript::o1_gotoIfEqu, "b" }, + /* 24 */ + { &FWScript::o1_gotoIfDiff, "b" }, + { &FWScript::o1_removeLabel, "b" }, + { &FWScript::o1_loop, "bb" }, + { 0, 0 }, + /* 28 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 2C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 30 */ + { 0, 0 }, + { &FWScript::o1_startGlobalScript, "b" }, + { &FWScript::o1_endGlobalScript, "b" }, + { 0, 0 }, + /* 34 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 38 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_loadAnim, "s" }, + /* 3C */ + { &FWScript::o1_loadBg, "s" }, + { &FWScript::o2_loadCt, "s" }, + { 0, 0 }, + { &FWScript::o2_loadPart, "s" }, + /* 40 */ + { 0, 0 }, /* o1_closePart, triggered by some scripts (STARTA.PRC 4 for ex.) */ + { &FWScript::o1_loadNewPrcName, "bs" }, + { &FWScript::o1_requestCheckPendingDataLoad, "" }, + { 0, 0 }, + /* 44 */ + { 0, 0 }, + { &FWScript::o1_blitAndFade, "" }, + { &FWScript::o1_fadeToBlack, "" }, + { &FWScript::o1_transformPaletteRange, "bbwww" }, + /* 48 */ + { 0, 0 }, + { &FWScript::o1_setDefaultMenuBgColor, "b" }, + { &FWScript::o1_palRotate, "bbb" }, + { 0, 0 }, + /* 4C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_break, "" }, + /* 50 */ + { &FWScript::o1_endScript, "x" }, + { &FWScript::o1_message, "bwwww" }, + { &FWScript::o1_loadGlobalVar, "bc" }, + { &FWScript::o1_compareGlobalVar, "bc" }, + /* 54 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 58 */ + { 0, 0 }, + { &FWScript::o1_declareFunctionName, "s" }, + { &FWScript::o1_freePartRange, "bb" }, + { &FWScript::o1_unloadAllMasks, "" }, + /* 5C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + /* 60 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o1_setScreenDimensions, "wwww" }, + /* 64 */ + { &FWScript::o1_displayBackground, "" }, + { &FWScript::o1_initializeZoneData, "" }, + { &FWScript::o1_setZoneDataEntry, "bw" }, + { &FWScript::o1_getZoneDataEntry, "bb" }, + /* 68 */ + { &FWScript::o1_setPlayerCommandPosY, "b" }, + { &FWScript::o1_allowPlayerInput, "" }, + { &FWScript::o1_disallowPlayerInput, "" }, + { &FWScript::o1_changeDataDisk, "b" }, /* Same as opcodes 0x95 and 0xA9. */ + /* 6C */ + { 0, 0 }, + { &FWScript::o1_loadMusic, "s" }, + { &FWScript::o1_playMusic, "" }, + { &FWScript::o1_fadeOutMusic, "" }, + /* 70 */ + { &FWScript::o1_stopSample, "" }, + { &FWScript::o1_op71, "bw" }, /* TODO: Name this opcode properly. */ + { &FWScript::o1_op72, "wbw" }, /* Same as opcode 0x73. TODO: Name this opcode properly. */ + { &FWScript::o1_op72, "wbw" }, /* Same as opcode 0x72. */ + /* 74 */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o2_playSample, "bbwbww" }, + /* 78 */ + { &FWScript::o2_playSampleAlt, "bbwbww" }, + { &FWScript::o1_disableSystemMenu, "b" }, + { &FWScript::o1_loadMask5, "b" }, + { &FWScript::o1_unloadMask5, "b" }, /* Last opcode used by Future Wars. */ + /* 7C */ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { &FWScript::o2_addSeqListElement, "bbbbwww" }, + /* 80 */ + { &FWScript::o2_removeSeq, "bb" }, + { &FWScript::o2_op81, "" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_modifySeqListElement, "bbwwb" }, + { &FWScript::o2_isSeqRunning, "bb" }, + /* 84 */ + { &FWScript::o2_gotoIfSupNearest, "b" }, + { &FWScript::o2_gotoIfSupEquNearest, "b" }, + { &FWScript::o2_gotoIfInfNearest, "b" }, + { &FWScript::o2_gotoIfInfEquNearest, "b" }, + /* 88 */ + { &FWScript::o2_gotoIfEquNearest, "b" }, + { &FWScript::o2_gotoIfDiffNearest, "b" }, + { 0, 0 }, + { &FWScript::o2_startObjectScript, "b" }, + /* 8C */ + { &FWScript::o2_stopObjectScript, "b" }, + { &FWScript::o2_op8D, "wwwwwwww" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_addBackground, "bs" }, + { &FWScript::o2_removeBackground, "b" }, + /* 90 */ + { &FWScript::o2_loadAbs, "bs" }, + { &FWScript::o2_loadBg, "b" }, + { 0, 0 }, + { 0, 0 }, + /* 94 */ + { 0, 0 }, + { &FWScript::o1_changeDataDisk, "b" }, /* Same as opcodes 0x6B and 0xA9. */ + { 0, 0 }, + { 0, 0 }, + /* 98 */ + { 0, 0 }, + { 0, 0 }, + { &FWScript::o2_wasZoneChecked, "b" }, + { &FWScript::o2_op9B, "wwwwwwww" }, /* TODO: Name this opcode properly. */ + /* 9C */ + { &FWScript::o2_op9C, "wwww" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_useBgScroll, "b" }, + { &FWScript::o2_setAdditionalBgVScroll, "c" }, + { &FWScript::o2_op9F, "ww" }, /* TODO: Name this opcode properly. */ + /* A0 */ + { &FWScript::o2_addGfxElementType20, "ww" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_removeGfxElementType20, "ww" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_addGfxElementType21, "ww" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_removeGfxElementType21, "ww" }, /* TODO: Name this opcode properly. */ + /* A4 */ + { &FWScript::o2_loadMask22, "b" }, /* TODO: Name this opcode properly. */ + { &FWScript::o2_unloadMask22, "b" }, /* TODO: Name this opcode properly. */ + { 0, 0 }, + { 0, 0 }, + /* A8 */ + { 0, 0 }, + { &FWScript::o1_changeDataDisk, "b" } /* Same as opcodes 0x6B and 0x95. */ + }; + OSScript::_opcodeTable = (Opcode *)opcodeTable; + OSScript::_numOpcodes = ARRAYSIZE(opcodeTable); +} /*! \brief Contructor for global scripts * \param script Script bytecode reference -- cgit v1.2.3