/* ScummVM - Scumm Interpreter * Copyright (C) 2004 Ivan Dubrov * Copyright (C) 2004-2006 The ScummVM project * * 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. * * $URL$ * $Id$ * */ #ifndef GOB_INTERPRET_H #define GOB_INTERPRET_H #include "gob/goblin.h" namespace Gob { // This is to help devices with small memory (PDA, smartphones, ...) // to save abit of memory used by opcode names in the Scumm engine. #ifndef REDUCE_MEMORY_USAGE # define _OPCODE(ver, x) { &ver::x, #x } #else # define _OPCODE(ver, x) { &ver::x, "" } #endif class Inter { public: uint8 _terminate; int16 *_breakFromLevel; int16 *_nestLevel; uint32 _soundEndTimeKey; int16 _soundStopVal; void initControlVars(char full); int16 load16(); char evalExpr(int16 *pRes); bool evalBoolResult(); void renewTimeInVars(); void storeMouse(); void storeKey(int16 key); void funcBlock(int16 retFlag); void callSub(int16 retFlag); virtual int16 loadSound(int16 slot) = 0; virtual void animPalette() = 0; Inter(GobEngine *vm); virtual ~Inter() {}; protected: struct OpFuncParams { char cmdCount; int16 counter; int16 retFlag; }; struct OpGobParams { int16 extraData; int32 *retVarPtr; Goblin::Gob_Object *objDesc; }; bool _break; int16 _animPalLowIndex[8]; int16 _animPalHighIndex[8]; int16 _animPalDir[8]; char _pasteBuf[300]; byte _pasteSizeBuf[300]; int16 _pastePos; // The busy-wait detection in o1_keyFunc breaks fast scrolling in Ween bool _noBusyWait; GobEngine *_vm; virtual void setupOpcodes() = 0; virtual void executeDrawOpcode(byte i) = 0; virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms) = 0; virtual void executeGoblinOpcode(int i, OpGobParams ¶ms) = 0; virtual const char *getOpcodeDrawDesc(byte i) = 0; virtual const char *getOpcodeFuncDesc(byte i, byte j) = 0; virtual const char *getOpcodeGoblinDesc(int i) = 0; virtual void checkSwitchTable(char **ppExec) = 0; void o_drawNOP() {} bool o_funcNOP(OpFuncParams ¶ms) { return false; } void o_gobNOP(OpGobParams ¶ms) {} }; class Inter_v1 : public Inter { public: Inter_v1(GobEngine *vm); virtual ~Inter_v1() {}; virtual int16 loadSound(int16 slot); virtual void animPalette(); protected: typedef void (Inter_v1::*OpcodeDrawProcV1)(); typedef bool (Inter_v1::*OpcodeFuncProcV1)(OpFuncParams &); typedef void (Inter_v1::*OpcodeGoblinProcV1)(OpGobParams &); struct OpcodeDrawEntryV1 { OpcodeDrawProcV1 proc; const char *desc; }; struct OpcodeFuncEntryV1 { OpcodeFuncProcV1 proc; const char *desc; }; struct OpcodeGoblinEntryV1 { OpcodeGoblinProcV1 proc; const char *desc; }; const OpcodeDrawEntryV1 *_opcodesDrawV1; const OpcodeFuncEntryV1 *_opcodesFuncV1; const OpcodeGoblinEntryV1 *_opcodesGoblinV1; static const int _goblinFuncLookUp[][2]; virtual void setupOpcodes(); virtual void executeDrawOpcode(byte i); virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms); virtual void executeGoblinOpcode(int i, OpGobParams ¶ms); virtual const char *getOpcodeDrawDesc(byte i); virtual const char *getOpcodeFuncDesc(byte i, byte j); virtual const char *getOpcodeGoblinDesc(int i); virtual void checkSwitchTable(char **ppExec); void o1_loadMult(); void o1_playMult(); void o1_freeMultKeys(); void o1_initCursor(); void o1_initCursorAnim(); void o1_clearCursorAnim(); void o1_setRenderFlags(); void o1_loadAnim(); void o1_freeAnim(); void o1_updateAnim(); void o1_initMult(); void o1_freeMult(); void o1_animate(); void o1_loadMultObject(); void o1_getAnimLayerInfo(); void o1_getObjAnimSize(); void o1_loadStatic(); void o1_freeStatic(); void o1_renderStatic(); void o1_loadCurLayer(); void o1_playCDTrack(); void o1_getCDTrackPos(); void o1_stopCD(); void o1_loadFontToSprite(); void o1_freeFontToSprite(); bool o1_callSub(OpFuncParams ¶ms); bool o1_printTotText(OpFuncParams ¶ms); bool o1_loadCursor(OpFuncParams ¶ms); bool o1_switch(OpFuncParams ¶ms); bool o1_repeatUntil(OpFuncParams ¶ms); bool o1_whileDo(OpFuncParams ¶ms); bool o1_if(OpFuncParams ¶ms); bool o1_evaluateStore(OpFuncParams ¶ms); bool o1_loadSpriteToPos(OpFuncParams ¶ms); bool o1_printText(OpFuncParams ¶ms); bool o1_loadTot(OpFuncParams ¶ms); bool o1_palLoad(OpFuncParams ¶ms); bool o1_keyFunc(OpFuncParams ¶ms); bool o1_capturePush(OpFuncParams ¶ms); bool o1_capturePop(OpFuncParams ¶ms); bool o1_animPalInit(OpFuncParams ¶ms); bool o1_drawOperations(OpFuncParams ¶ms); bool o1_setcmdCount(OpFuncParams ¶ms); bool o1_return(OpFuncParams ¶ms); bool o1_renewTimeInVars(OpFuncParams ¶ms); bool o1_speakerOn(OpFuncParams ¶ms); bool o1_speakerOff(OpFuncParams ¶ms); bool o1_putPixel(OpFuncParams ¶ms); bool o1_goblinFunc(OpFuncParams ¶ms); bool o1_createSprite(OpFuncParams ¶ms); bool o1_freeSprite(OpFuncParams ¶ms); bool o1_returnTo(OpFuncParams ¶ms); bool o1_loadSpriteContent(OpFuncParams ¶ms); bool o1_copySprite(OpFuncParams ¶ms); bool o1_fillRect(OpFuncParams ¶ms); bool o1_drawLine(OpFuncParams ¶ms); bool o1_strToLong(OpFuncParams ¶ms); bool o1_invalidate(OpFuncParams ¶ms); bool o1_setBackDelta(OpFuncParams ¶ms); bool o1_playSound(OpFuncParams ¶ms); bool o1_stopSound(OpFuncParams ¶ms); bool o1_loadSound(OpFuncParams ¶ms); bool o1_freeSoundSlot(OpFuncParams ¶ms); bool o1_waitEndPlay(OpFuncParams ¶ms); bool o1_playComposition(OpFuncParams ¶ms); bool o1_getFreeMem(OpFuncParams ¶ms); bool o1_checkData(OpFuncParams ¶ms); bool o1_prepareStr(OpFuncParams ¶ms); bool o1_insertStr(OpFuncParams ¶ms); bool o1_cutStr(OpFuncParams ¶ms); bool o1_strstr(OpFuncParams ¶ms); bool o1_istrlen(OpFuncParams ¶ms); bool o1_setMousePos(OpFuncParams ¶ms); bool o1_setFrameRate(OpFuncParams ¶ms); bool o1_animatePalette(OpFuncParams ¶ms); bool o1_animateCursor(OpFuncParams ¶ms); bool o1_blitCursor(OpFuncParams ¶ms); bool o1_loadFont(OpFuncParams ¶ms); bool o1_freeFont(OpFuncParams ¶ms); bool o1_readData(OpFuncParams ¶ms); bool o1_writeData(OpFuncParams ¶ms); bool o1_manageDataFile(OpFuncParams ¶ms); void o1_setState(OpGobParams ¶ms); void o1_setCurFrame(OpGobParams ¶ms); void o1_setNextState(OpGobParams ¶ms); void o1_setMultState(OpGobParams ¶ms); void o1_setOrder(OpGobParams ¶ms); void o1_setActionStartState(OpGobParams ¶ms); void o1_setCurLookDir(OpGobParams ¶ms); void o1_setType(OpGobParams ¶ms); void o1_setNoTick(OpGobParams ¶ms); void o1_setPickable(OpGobParams ¶ms); void o1_setXPos(OpGobParams ¶ms); void o1_setYPos(OpGobParams ¶ms); void o1_setDoAnim(OpGobParams ¶ms); void o1_setRelaxTime(OpGobParams ¶ms); void o1_setMaxTick(OpGobParams ¶ms); void o1_getState(OpGobParams ¶ms); void o1_getCurFrame(OpGobParams ¶ms); void o1_getNextState(OpGobParams ¶ms); void o1_getMultState(OpGobParams ¶ms); void o1_getOrder(OpGobParams ¶ms); void o1_getActionStartState(OpGobParams ¶ms); void o1_getCurLookDir(OpGobParams ¶ms); void o1_getType(OpGobParams ¶ms); void o1_getNoTick(OpGobParams ¶ms); void o1_getPickable(OpGobParams ¶ms); void o1_getObjMaxFrame(OpGobParams ¶ms); void o1_getXPos(OpGobParams ¶ms); void o1_getYPos(OpGobParams ¶ms); void o1_getDoAnim(OpGobParams ¶ms); void o1_getRelaxTime(OpGobParams ¶ms); void o1_getMaxTick(OpGobParams ¶ms); void o1_manipulateMap(OpGobParams ¶ms); void o1_getItem(OpGobParams ¶ms); void o1_manipulateMapIndirect(OpGobParams ¶ms); void o1_getItemIndirect(OpGobParams ¶ms); void o1_setPassMap(OpGobParams ¶ms); void o1_setGoblinPosH(OpGobParams ¶ms); void o1_getGoblinPosXH(OpGobParams ¶ms); void o1_getGoblinPosYH(OpGobParams ¶ms); void o1_setGoblinMultState(OpGobParams ¶ms); void o1_setGoblinUnk14(OpGobParams ¶ms); void o1_setItemIdInPocket(OpGobParams ¶ms); void o1_setItemIndInPocket(OpGobParams ¶ms); void o1_getItemIdInPocket(OpGobParams ¶ms); void o1_getItemIndInPocket(OpGobParams ¶ms); void o1_setGoblinPos(OpGobParams ¶ms); void o1_setGoblinState(OpGobParams ¶ms); void o1_setGoblinStateRedraw(OpGobParams ¶ms); void o1_decRelaxTime(OpGobParams ¶ms); void o1_getGoblinPosX(OpGobParams ¶ms); void o1_getGoblinPosY(OpGobParams ¶ms); void o1_clearPathExistence(OpGobParams ¶ms); void o1_setGoblinVisible(OpGobParams ¶ms); void o1_setGoblinInvisible(OpGobParams ¶ms); void o1_getObjectIntersect(OpGobParams ¶ms); void o1_getGoblinIntersect(OpGobParams ¶ms); void o1_setItemPos(OpGobParams ¶ms); void o1_loadObjects(OpGobParams ¶ms); void o1_freeObjects(OpGobParams ¶ms); void o1_animateObjects(OpGobParams ¶ms); void o1_drawObjects(OpGobParams ¶ms); void o1_loadMap(OpGobParams ¶ms); void o1_moveGoblin(OpGobParams ¶ms); void o1_switchGoblin(OpGobParams ¶ms); void o1_loadGoblin(OpGobParams ¶ms); void o1_writeTreatItem(OpGobParams ¶ms); void o1_moveGoblin0(OpGobParams ¶ms); void o1_setGoblinTarget(OpGobParams ¶ms); void o1_setGoblinObjectsPos(OpGobParams ¶ms); void o1_initGoblin(OpGobParams ¶ms); void manipulateMap(int16 xPos, int16 yPos, int16 item); }; class Inter_v2 : public Inter_v1 { public: Inter_v2(GobEngine *vm); virtual ~Inter_v2() {}; virtual int16 loadSound(int16 search); virtual void animPalette(); protected: typedef void (Inter_v2::*OpcodeDrawProcV2)(); typedef bool (Inter_v2::*OpcodeFuncProcV2)(OpFuncParams &); typedef void (Inter_v2::*OpcodeGoblinProcV2)(OpGobParams &); struct OpcodeDrawEntryV2 { OpcodeDrawProcV2 proc; const char *desc; }; struct OpcodeFuncEntryV2 { OpcodeFuncProcV2 proc; const char *desc; }; struct OpcodeGoblinEntryV2 { OpcodeGoblinProcV2 proc; const char *desc; }; const OpcodeDrawEntryV2 *_opcodesDrawV2; const OpcodeFuncEntryV2 *_opcodesFuncV2; const OpcodeGoblinEntryV2 *_opcodesGoblinV2; static const int _goblinFuncLookUp[][2]; virtual void setupOpcodes(); virtual void executeDrawOpcode(byte i); virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms); virtual void executeGoblinOpcode(int i, OpGobParams ¶ms); virtual const char *getOpcodeDrawDesc(byte i); virtual const char *getOpcodeFuncDesc(byte i, byte j); virtual const char *getOpcodeGoblinDesc(int i); virtual void checkSwitchTable(char **ppExec); void o2_playMult(); void o2_setRenderFlags(); void o2_multSub(); void o2_initMult(); void o2_loadMultObject(); void o2_renderStatic(); void o2_loadCurLayer(); void o2_playCDTrack(); void o2_waitCDTrackEnd(); void o2_stopCD(); void o2_readLIC(); void o2_freeLIC(); void o2_getCDTrackPos(); void o2_loadFontToSprite(); void o2_totSub(); void o2_switchTotSub(); void o2_copyVars(); void o2_pasteVars(); void o2_loadMapObjects(); void o2_freeGoblins(); void o2_moveGoblin(); void o2_writeGoblinPos(); void o2_stopGoblin(); void o2_setGoblinState(); void o2_placeGoblin(); void o2_initScreen(); void o2_scroll(); void o2_setScrollOffset(); void o2_playImd(); void o2_getImdInfo(); void o2_openItk(); void o2_closeItk(); void o2_setImdFrontSurf(); void o2_resetImdFrontSurf(); bool o2_evaluateStore(OpFuncParams ¶ms); bool o2_printText(OpFuncParams ¶ms); bool o2_animPalInit(OpFuncParams ¶ms); bool o2_goblinFunc(OpFuncParams ¶ms); bool o2_createSprite(OpFuncParams ¶ms); bool o2_stopSound(OpFuncParams ¶ms); bool o2_loadSound(OpFuncParams ¶ms); bool o2_getFreeMem(OpFuncParams ¶ms); bool o2_checkData(OpFuncParams ¶ms); bool o2_readData(OpFuncParams ¶ms); bool o2_writeData(OpFuncParams ¶ms); void o2_loadInfogramesIns(OpGobParams ¶ms); void o2_playInfogrames(OpGobParams ¶ms); void o2_handleGoblins(OpGobParams ¶ms); }; class Inter_Bargon : public Inter_v2 { public: Inter_Bargon(GobEngine *vm); virtual ~Inter_Bargon() {}; protected: typedef void (Inter_Bargon::*OpcodeDrawProcBargon)(); typedef bool (Inter_Bargon::*OpcodeFuncProcBargon)(OpFuncParams &); typedef void (Inter_Bargon::*OpcodeGoblinProcBargon)(OpGobParams &); struct OpcodeDrawEntryBargon { OpcodeDrawProcBargon proc; const char *desc; }; struct OpcodeFuncEntryBargon { OpcodeFuncProcBargon proc; const char *desc; }; struct OpcodeGoblinEntryBargon { OpcodeGoblinProcBargon proc; const char *desc; }; const OpcodeDrawEntryBargon *_opcodesDrawBargon; const OpcodeFuncEntryBargon *_opcodesFuncBargon; const OpcodeGoblinEntryBargon *_opcodesGoblinBargon; static const int _goblinFuncLookUp[][2]; virtual void setupOpcodes(); virtual void executeDrawOpcode(byte i); virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms); virtual void executeGoblinOpcode(int i, OpGobParams ¶ms); virtual const char *getOpcodeDrawDesc(byte i); virtual const char *getOpcodeFuncDesc(byte i, byte j); virtual const char *getOpcodeGoblinDesc(int i); void oBargon_intro0(OpGobParams ¶ms); void oBargon_intro1(OpGobParams ¶ms); void oBargon_intro2(OpGobParams ¶ms); void oBargon_intro3(OpGobParams ¶ms); void oBargon_intro4(OpGobParams ¶ms); void oBargon_intro5(OpGobParams ¶ms); void oBargon_intro6(OpGobParams ¶ms); void oBargon_intro7(OpGobParams ¶ms); void oBargon_intro8(OpGobParams ¶ms); void oBargon_intro9(OpGobParams ¶ms); }; } // End of namespace Gob #endif // GOB_INTERPRET_H