diff options
author | Max Horn | 2009-03-20 16:33:58 +0000 |
---|---|---|
committer | Max Horn | 2009-03-20 16:33:58 +0000 |
commit | 6f4b5671245827866aa4fb59fdb9c602cfe3d482 (patch) | |
tree | d39ebc076ada919bc6078d2ef165f5ffea59f799 /engines | |
parent | ed292fb498bc14f4482a82ba5a40a4bf3c7870f1 (diff) | |
download | scummvm-rg350-6f4b5671245827866aa4fb59fdb9c602cfe3d482.tar.gz scummvm-rg350-6f4b5671245827866aa4fb59fdb9c602cfe3d482.tar.bz2 scummvm-rg350-6f4b5671245827866aa4fb59fdb9c602cfe3d482.zip |
SCUMM: Split intern.h into multiple headers
svn-id: r39567
Diffstat (limited to 'engines')
47 files changed, 1360 insertions, 1085 deletions
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index fdb066a4a3..9c805f4a59 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -23,7 +23,6 @@ * */ - #include "common/system.h" // for setFocusRectangle/clearFocusRectangle #include "scumm/scumm.h" #include "scumm/actor.h" @@ -31,11 +30,11 @@ #include "scumm/boxes.h" #include "scumm/charset.h" #include "scumm/costume.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/saveload.h" +#include "scumm/scumm_v7.h" #include "scumm/he/sound_he.h" #include "scumm/he/sprite_he.h" #include "scumm/usage_bits.h" diff --git a/engines/scumm/akos.cpp b/engines/scumm/akos.cpp index 39de31b5c9..610218985c 100644 --- a/engines/scumm/akos.cpp +++ b/engines/scumm/akos.cpp @@ -23,15 +23,14 @@ * */ - #include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/akos.h" #include "scumm/bomp.h" #include "scumm/imuse/imuse.h" #include "scumm/imuse_digi/dimuse.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/util.h" #include "scumm/he/wiz_he.h" diff --git a/engines/scumm/boxes.cpp b/engines/scumm/boxes.cpp index 1e632a034e..2753b55b3c 100644 --- a/engines/scumm/boxes.cpp +++ b/engines/scumm/boxes.cpp @@ -23,11 +23,10 @@ * */ - #include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/boxes.h" -#include "scumm/intern.h" +#include "scumm/scumm_v6.h" #include "scumm/util.h" #include "common/util.h" diff --git a/engines/scumm/camera.cpp b/engines/scumm/camera.cpp index 0af1e8645e..b675714959 100644 --- a/engines/scumm/camera.cpp +++ b/engines/scumm/camera.cpp @@ -22,11 +22,10 @@ * */ - #include "scumm/scumm.h" -#include "scumm/intern.h" #include "scumm/actor.h" #include "scumm/charset.h" +#include "scumm/scumm_v7.h" namespace Scumm { diff --git a/engines/scumm/cursor.cpp b/engines/scumm/cursor.cpp index 1dcb96d1e8..64829114ca 100644 --- a/engines/scumm/cursor.cpp +++ b/engines/scumm/cursor.cpp @@ -27,12 +27,13 @@ #include "graphics/cursorman.h" #include "scumm/bomp.h" #include "scumm/charset.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" #include "scumm/object.h" #include "scumm/he/resource_he.h" #include "scumm/saveload.h" #include "scumm/scumm.h" +#include "scumm/scumm_v2.h" +#include "scumm/scumm_v5.h" namespace Scumm { diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 3bd3220d81..c73a21e067 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -35,9 +35,9 @@ #include "scumm/detection.h" #include "scumm/detection_tables.h" -#include "scumm/scumm.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v8.h" #include "engines/metaengine.h" diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h index 9632886a8b..672b131229 100644 --- a/engines/scumm/detection_tables.h +++ b/engines/scumm/detection_tables.h @@ -32,8 +32,6 @@ #include "scumm/detection.h" #include "scumm/scumm.h" -//#include "scumm/intern.h" -//#include "scumm/he/intern_he.h" #include "scumm/scumm-md5.h" diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 948d73b7f5..62e18561d3 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -23,14 +23,14 @@ */ #include "common/system.h" -#include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/charset.h" -#include "scumm/intern.h" #ifdef ENABLE_HE #include "scumm/he/intern_he.h" #endif #include "scumm/resource.h" +#include "scumm/scumm_v5.h" +#include "scumm/scumm_v6.h" #include "scumm/usage_bits.h" #include "scumm/he/wiz_he.h" #include "scumm/util.h" diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h index 7abd6f924b..dcc1740d0e 100644 --- a/engines/scumm/he/intern_he.h +++ b/engines/scumm/he/intern_he.h @@ -27,6 +27,7 @@ #define SCUMM_HE_INTERN_HE_H #include "scumm/intern.h" +#include "scumm/scumm_v6.h" #ifdef ENABLE_HE #include "scumm/he/floodfill_he.h" #include "scumm/he/wiz_he.h" diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp index d97b6b7183..81bce5916b 100644 --- a/engines/scumm/imuse_digi/dimuse.cpp +++ b/engines/scumm/imuse_digi/dimuse.cpp @@ -22,13 +22,13 @@ * $Id$ */ - #include "common/system.h" #include "common/timer.h" #include "scumm/actor.h" -#include "scumm/saveload.h" #include "scumm/intern.h" +#include "scumm/saveload.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/imuse_digi/dimuse.h" #include "scumm/imuse_digi/dimuse_bndmgr.h" diff --git a/engines/scumm/imuse_digi/dimuse_script.cpp b/engines/scumm/imuse_digi/dimuse_script.cpp index 340e3dcc8a..640e6971f9 100644 --- a/engines/scumm/imuse_digi/dimuse_script.cpp +++ b/engines/scumm/imuse_digi/dimuse_script.cpp @@ -27,7 +27,7 @@ #include "common/timer.h" #include "scumm/actor.h" -#include "scumm/intern.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/imuse_digi/dimuse.h" #include "scumm/imuse_digi/dimuse_bndmgr.h" diff --git a/engines/scumm/imuse_digi/dimuse_track.cpp b/engines/scumm/imuse_digi/dimuse_track.cpp index 051e6eb572..6ded6d23b2 100644 --- a/engines/scumm/imuse_digi/dimuse_track.cpp +++ b/engines/scumm/imuse_digi/dimuse_track.cpp @@ -22,11 +22,10 @@ * $Id$ */ - #include "common/timer.h" #include "scumm/actor.h" -#include "scumm/intern.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/imuse_digi/dimuse.h" #include "scumm/imuse_digi/dimuse_bndmgr.h" diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp index 73ac38b814..389fcf091a 100644 --- a/engines/scumm/input.cpp +++ b/engines/scumm/input.cpp @@ -38,9 +38,9 @@ #include "scumm/he/intern_he.h" #include "scumm/he/logic_he.h" #endif -#include "scumm/scumm.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v8.h" #include "scumm/sound.h" -#include "scumm/intern.h" #ifdef _WIN32_WCE diff --git a/engines/scumm/insane/insane.cpp b/engines/scumm/insane/insane.cpp index 77a01d54d0..93f565941d 100644 --- a/engines/scumm/insane/insane.cpp +++ b/engines/scumm/insane/insane.cpp @@ -29,9 +29,9 @@ #include "common/system.h" -#include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/file.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/imuse/imuse.h" diff --git a/engines/scumm/insane/insane.h b/engines/scumm/insane/insane.h index 50d8d057cf..c2c964b311 100644 --- a/engines/scumm/insane/insane.h +++ b/engines/scumm/insane/insane.h @@ -26,8 +26,6 @@ #if !defined(SCUMM_INSANE_H) && defined(ENABLE_SCUMM_7_8) #define SCUMM_INSANE_H -#include "engines/engine.h" -#include "scumm/intern.h" #include "scumm/nut_renderer.h" #include "scumm/smush/smush_player.h" diff --git a/engines/scumm/insane/insane_ben.cpp b/engines/scumm/insane/insane_ben.cpp index 85771da93f..0c7a3e250e 100644 --- a/engines/scumm/insane/insane_ben.cpp +++ b/engines/scumm/insane/insane_ben.cpp @@ -28,6 +28,7 @@ #include "engines/engine.h" #include "scumm/insane/insane.h" +#include "scumm/scumm_v7.h" namespace Scumm { diff --git a/engines/scumm/insane/insane_enemy.cpp b/engines/scumm/insane/insane_enemy.cpp index 6f8bb1f0ca..bd02cae32c 100644 --- a/engines/scumm/insane/insane_enemy.cpp +++ b/engines/scumm/insane/insane_enemy.cpp @@ -28,6 +28,7 @@ #include "engines/engine.h" #include "scumm/insane/insane.h" +#include "scumm/scumm_v7.h" namespace Scumm { diff --git a/engines/scumm/insane/insane_iact.cpp b/engines/scumm/insane/insane_iact.cpp index b6ce1091e8..f620994195 100644 --- a/engines/scumm/insane/insane_iact.cpp +++ b/engines/scumm/insane/insane_iact.cpp @@ -23,14 +23,8 @@ * */ - - -#include "engines/engine.h" - -#include "scumm/scumm.h" - +#include "scumm/scumm_v7.h" #include "scumm/smush/smush_player.h" - #include "scumm/insane/insane.h" namespace Scumm { diff --git a/engines/scumm/insane/insane_scenes.cpp b/engines/scumm/insane/insane_scenes.cpp index 95741e145c..0b28d46b19 100644 --- a/engines/scumm/insane/insane_scenes.cpp +++ b/engines/scumm/insane/insane_scenes.cpp @@ -29,7 +29,7 @@ #include "common/config-manager.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/insane/insane.h" diff --git a/engines/scumm/intern.h b/engines/scumm/intern.h index 1381a036b8..56defe508c 100644 --- a/engines/scumm/intern.h +++ b/engines/scumm/intern.h @@ -30,10 +30,6 @@ namespace Scumm { -class Insane; -class SmushMixer; -class SmushPlayer; - // 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 @@ -42,1021 +38,6 @@ class SmushPlayer; # define _OPCODE(ver, x) { &ver::x, "" } #endif -class ScummEngine_v5 : public ScummEngine { -protected: - typedef void (ScummEngine_v5::*OpcodeProcV5)(); - struct OpcodeEntryV5 { - OpcodeProcV5 proc; - const char *desc; - }; - - const OpcodeEntryV5 *_opcodesV5; - - uint16 _cursorImages[4][17]; - byte _cursorHotspots[2 * 4]; - - struct { - int x, y, w, h; - byte *buffer; - uint16 xStrips, yStrips; - bool isDrawn; - } _flashlight; - - char _saveLoadVarsFilename[256]; - -public: - ScummEngine_v5(OSystem *syst, const DetectorResult &dr); - - void clearFlashlight(); - - virtual void resetCursors(); - -protected: - virtual void setupOpcodes(); - virtual void executeOpcode(byte i); - virtual const char *getOpcodeDesc(byte i); - - virtual void scummLoop_handleActors(); - - virtual void setupScummVars(); - virtual void resetScummVars(); - virtual void decodeParseString(); - - virtual void saveOrLoad(Serializer *s); - - virtual void readMAXS(int blockSize); - - int getWordVararg(int *ptr); - void saveVars(); - void loadVars(); - void saveIQPoints(); - void loadIQPoints(); - - virtual int getVar(); - virtual int getVarOrDirectByte(byte mask); - virtual int getVarOrDirectWord(byte mask); - - virtual void animateCursor(); - - virtual void setBuiltinCursor(int index); - void redefineBuiltinCursorFromChar(int index, int chr); - void redefineBuiltinCursorHotspot(int index, int x, int y); - - void drawFlashlight(); - - /* Version 5 script opcodes */ - void o5_actorFollowCamera(); - void o5_actorFromPos(); - void o5_actorOps(); - void o5_add(); - void o5_and(); - void o5_animateActor(); - void o5_breakHere(); - void o5_chainScript(); - void o5_cursorCommand(); - void o5_cutscene(); - void o5_debug(); - void o5_decrement(); - void o5_delay(); - void o5_delayVariable(); - void o5_divide(); - void o5_doSentence(); - void o5_drawBox(); - void o5_drawObject(); - void o5_endCutscene(); - void o5_equalZero(); - void o5_expression(); - void o5_faceActor(); - void o5_findInventory(); - void o5_findObject(); - void o5_freezeScripts(); - void o5_getActorCostume(); - void o5_getActorElevation(); - void o5_getActorFacing(); - void o5_getActorMoving(); - void o5_getActorRoom(); - void o5_getActorScale(); - void o5_getActorWalkBox(); - void o5_getActorWidth(); - void o5_getActorX(); - void o5_getActorY(); - void o5_getAnimCounter(); - void o5_getClosestObjActor(); - void o5_getDist(); - void o5_getInventoryCount(); - void o5_getObjectOwner(); - void o5_getObjectState(); - void o5_getRandomNr(); - void o5_getStringWidth(); - void o5_getVerbEntrypoint(); - void o5_ifClassOfIs(); - void o5_ifNotState(); - void o5_ifState(); - void o5_increment(); - void o5_isActorInBox(); - void o5_isEqual(); - void o5_isGreater(); - void o5_isGreaterEqual(); - void o5_isLess(); - void o5_isNotEqual(); - void o5_isScriptRunning(); - void o5_isSoundRunning(); - void o5_jumpRelative(); - void o5_lessOrEqual(); - void o5_lights(); - void o5_loadRoom(); - void o5_loadRoomWithEgo(); - void o5_matrixOps(); - void o5_move(); - void o5_multiply(); - void o5_notEqualZero(); - void o5_oldRoomEffect(); - void o5_or(); - void o5_beginOverride(); - void o5_panCameraTo(); - void o5_pickupObject(); - void o5_pickupObjectOld(); - void o5_print(); - void o5_printEgo(); - void o5_pseudoRoom(); - void o5_putActor(); - void o5_putActorAtObject(); - void o5_putActorInRoom(); - void o5_systemOps(); - void o5_resourceRoutines(); - void o5_roomOps(); - void o5_saveLoadGame(); - void o5_saveLoadVars(); - void o5_saveRestoreVerbs(); - void o5_setCameraAt(); - void o5_setClass(); - void o5_setObjectName(); - void o5_setOwnerOf(); - void o5_setState(); - void o5_setVarRange(); - void o5_soundKludge(); - void o5_startMusic(); - void o5_startObject(); - void o5_startScript(); - void o5_startSound(); - void o5_stopMusic(); - void o5_stopObjectCode(); - void o5_stopObjectScript(); - void o5_stopScript(); - void o5_stopSound(); - void o5_stringOps(); - void o5_subtract(); - void o5_verbOps(); - void o5_wait(); - void o5_walkActorTo(); - void o5_walkActorToActor(); - void o5_walkActorToObject(); -}; - -/** - * Engine for version 4 SCUMM games; GF_SMALL_HEADER is always set for these. - */ -class ScummEngine_v4 : public ScummEngine_v5 { -public: - ScummEngine_v4(OSystem *syst, const DetectorResult &dr); - - virtual void resetScumm(); - -protected: - virtual void readResTypeList(int id); - virtual void readIndexFile(); - virtual void loadCharset(int no); - virtual void resetRoomObjects(); - virtual void readMAXS(int blockSize); - virtual void readGlobalObjects(); - - virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); -}; - -/** - * Engine for version 3 SCUMM games; GF_SMALL_NAMES is always set for these. - */ -class ScummEngine_v3 : public ScummEngine_v4 { -public: - - /** - * Prepared savegame used by the orginal save/load dialog. - * Must be valid as long as the savescreen is active. As we are not - * notified when the savescreen is closed, memory is only freed on a game - * reset, at the destruction of the engine or when the original save/load - * dialog is entered the next time. - */ - Common::SeekableReadStream *_savePreparedSavegame; - - void prepareSavegame(); - bool savePreparedSavegame(int slot, char *desc); - - -public: - ScummEngine_v3(OSystem *syst, const DetectorResult &dr); - ~ScummEngine_v3(); - - virtual void resetScumm(); - -protected: - virtual void readRoomsOffsets(); - virtual void loadCharset(int no); - - virtual void processKeyboard(Common::KeyState lastKeyHit); -}; - -/** - * Engine for old format version 3 SCUMM games; GF_OLD_BUNDLE is always set for these. - */ -class ScummEngine_v3old : public ScummEngine_v3 { -public: - ScummEngine_v3old(OSystem *syst, const DetectorResult &dr); - -protected: - virtual void readResTypeList(int id); - virtual void readIndexFile(); - virtual void setupRoomSubBlocks(); - virtual void resetRoomSubBlocks(); - virtual void resetRoomObjects(); -}; - -/** - * Engine for version 2 SCUMM games. - */ -class ScummEngine_v2 : public ScummEngine_v3old { -protected: - typedef void (ScummEngine_v2::*OpcodeProcV2)(); - struct OpcodeEntryV2 { - OpcodeProcV2 proc; - const char *desc; - }; - - const OpcodeEntryV2 *_opcodesV2; - - struct V2MouseoverBox { - Common::Rect rect; - byte color; - byte hicolor; - }; - - V2MouseoverBox _mouseOverBoxesV2[7]; - int8 _mouseOverBoxV2; - - char _sentenceBuf[256]; - - int _activeInventory; - int _activeObject; - int _activeVerb; - -public: - ScummEngine_v2(OSystem *syst, const DetectorResult &dr); - - virtual void resetScumm(); - - void checkV2MouseOver(Common::Point pos); - void checkV2Inventory(int x, int y); - void redrawV2Inventory(); - -protected: - virtual void setupOpcodes(); - virtual void executeOpcode(byte i); - virtual const char *getOpcodeDesc(byte i); - - virtual void setupScummVars(); - virtual void resetScummVars(); - virtual void decodeParseString(); - - virtual void processKeyboard(Common::KeyState lastKeyHit); - - virtual void readIndexFile(); - void readClassicIndexFile(); // V1 - void readEnhancedIndexFile(); // V2 - virtual void readGlobalObjects(); - virtual void loadCharset(int no); - - virtual void runInputScript(int clickArea, int val, int mode); - virtual void runInventoryScript(int i); - - virtual int getVar(); - - void getResultPosIndirect(); - virtual void getResultPos(); - virtual int readVar(uint var); - virtual void writeVar(uint var, int value); - - virtual void ifStateCommon(byte type); - virtual void ifNotStateCommon(byte type); - virtual void setStateCommon(byte type); - virtual void clearStateCommon(byte type); - - virtual void resetSentence(); - void setUserState(byte state); - - virtual void handleMouseOver(bool updateInventory); - virtual void checkExecVerbs(); - void initV2MouseOver(); - void initNESMouseOver(); - - virtual void setBuiltinCursor(int index); - - void runObject(int obj, int entry); - - /* Version 2 script opcodes */ - void o2_actorFromPos(); - void o2_actorOps(); - void o2_add(); - void o2_addIndirect(); - void o2_assignVarByte(); - void o2_assignVarWordIndirect(); - void o2_beginOverride(); - void o2_chainScript(); - void o2_clearState01(); - void o2_clearState02(); - void o2_clearState04(); - void o2_clearState08(); - void o2_cursorCommand(); - void o2_cutscene(); - void o2_delay(); - void o2_doSentence(); - void o2_drawObject(); - void o2_drawSentence(); - void o2_dummy(); - void o2_endCutscene(); - void o2_findObject(); - void o2_getActorWalkBox(); - void o2_getActorX(); - void o2_getActorY(); - void o2_getBitVar(); - void o2_getObjPreposition(); - void o2_ifClassOfIs(); - void o2_ifNotState01(); - void o2_ifNotState02(); - void o2_ifNotState04(); - void o2_ifNotState08(); - void o2_ifState01(); - void o2_ifState02(); - void o2_ifState04(); - void o2_ifState08(); - void o2_isGreater(); - void o2_isGreaterEqual(); - void o2_isLess(); - void o2_isLessEqual(); - void o2_lights(); - void o2_loadRoomWithEgo(); - void o2_setBoxFlags(); - void o2_panCameraTo(); - void o2_pickupObject(); - void o2_putActor(); - void o2_putActorAtObject(); - void o2_putActorInRoom(); - void o2_resourceRoutines(); - void o2_restart(); - void o2_roomOps(); - void o2_getActorElevation(); - void o2_setActorElevation(); - void o2_setBitVar(); - void o2_setCameraAt(); - void o2_setObjPreposition(); - void o2_setOwnerOf(); - void o2_setState01(); - void o2_setState02(); - void o2_setState04(); - void o2_setState08(); - void o2_startScript(); - void o2_stopScript(); - void o2_subtract(); - void o2_subIndirect(); - void o2_switchCostumeSet(); - void o2_verbOps(); - void o2_waitForActor(); - void o2_waitForMessage(); - void o2_waitForSentence(); - void o2_walkActorTo(); - void o2_walkActorToObject(); - - byte VAR_SENTENCE_VERB; - byte VAR_SENTENCE_OBJECT1; - byte VAR_SENTENCE_OBJECT2; - byte VAR_SENTENCE_PREPOSITION; - byte VAR_BACKUP_VERB; - - byte VAR_CLICK_AREA; - byte VAR_CLICK_VERB; - byte VAR_CLICK_OBJECT; -}; - -/** - * Engine for Apple II and Commodore 64 versions of Maniac Mansion - */ -class ScummEngine_v0 : public ScummEngine_v2 { -protected: - typedef void (ScummEngine_v0::*OpcodeProcC64)(); - struct OpcodeEntryC64 { - OpcodeProcC64 proc; - const char *desc; - }; - - const OpcodeEntryC64 *_opcodesC64; - - int _currentMode; -public: - ScummEngine_v0(OSystem *syst, const DetectorResult &dr); - - virtual void resetScumm(); - -protected: - virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); - - virtual void setupOpcodes(); - virtual void executeOpcode(byte i); - virtual const char *getOpcodeDesc(byte i); - - virtual void setupScummVars(); - virtual void resetScummVars(); - virtual void decodeParseString(); - - virtual void processInput(); - - virtual void saveOrLoad(Serializer *s); - - virtual void checkExecVerbs(); - virtual void handleMouseOver(bool updateInventory); - void resetVerbs(); - void setNewKidVerbs(); - void drawSentence(); - - void switchActor(int slot); - - virtual int getVarOrDirectWord(byte mask); - virtual uint fetchScriptWord(); - - virtual void ifStateCommon(byte type); - virtual void ifNotStateCommon(byte type); - virtual void setStateCommon(byte type); - virtual void clearStateCommon(byte type); - - virtual void resetSentence(); - - int getObjectFlag(); - - /* Version C64 script opcodes */ - void o_setState08(); - void o_clearState08(); - void o_stopCurrentScript(); - void o_loadSound(); - void o_getActorMoving(); - void o_animateActor(); - void o_putActorAtObject(); - void o_pickupObject(); - void o_setObjectName(); - void o_lockSound(); - void o_lockCostume(); - void o_loadCostume(); - void o_loadRoom(); - void o_loadRoomWithEgo(); - void o_lockScript(); - void o_loadScript(); - void o_lockRoom(); - void o_cursorCommand(); - void o_lights(); - void o_unlockCostume(); - void o_unlockScript(); - void o_decrement(); - void o_nop(); - void o_getActorBitVar(); - void o_setActorBitVar(); - void o_getBitVar(); - void o_setBitVar(); - void o_doSentence(); - void o_unknown2(); - void o_ifActiveObject(); - void o_getClosestObjActor(); - void o_printEgo_c64(); - void o_print_c64(); - void o_unlockRoom(); - void o_unlockSound(); - void o_cutscene(); - void o_endCutscene(); - void o_beginOverride(); - void o_isEqual(); - void o_isGreater(); - void o_isGreaterEqual(); - void o_isLess(); - void o_isLessEqual(); - void o_isNotEqual(); - void o_notEqualZero(); - void o_equalZero(); - void o_jumpRelative(); - void o_setOwnerOf(); -}; - -class ScummEngine_v6 : public ScummEngine { - friend class Insane; - -protected: - typedef void (ScummEngine_v6::*OpcodeProcV6)(); - struct OpcodeEntryV6 { - OpcodeProcV6 proc; - const char *desc; - }; - - enum ArrayType { - kBitArray = 1, - kNibbleArray = 2, - kByteArray = 3, - kStringArray = 4, - kIntArray = 5, - kDwordArray = 6 - }; - -#include "common/pack-start.h" // START STRUCT PACKING - - struct ArrayHeader { - int16 dim1; - int16 type; - int16 dim2; - byte data[1]; - } PACKED_STRUCT; - -#include "common/pack-end.h" // END STRUCT PACKING - - const OpcodeEntryV6 *_opcodesV6; - - struct TextObject { - int16 xpos, ypos; - byte color; - byte charset; - byte text[256]; - }; - - /** BlastObjects to draw */ - struct BlastObject { - uint16 number; - Common::Rect rect; - uint16 scaleX, scaleY; - uint16 image; - uint16 mode; - }; - - int _blastObjectQueuePos; - BlastObject _blastObjectQueue[200]; - - struct BlastText : TextObject { - Common::Rect rect; - bool center; - }; - - int _blastTextQueuePos; - BlastText _blastTextQueue[50]; - - // Akos Class - struct { - int16 cmd; - int16 actor; - int16 param1; - int16 param2; - } _akosQueue[32]; - int16 _akosQueuePos; - - byte _curActor; - int _curVerb; - int _curVerbSlot; - - bool _forcedWaitForMessage; - -public: - ScummEngine_v6(OSystem *syst, const DetectorResult &dr); - - virtual void resetScumm(); - -protected: - virtual void setupOpcodes(); - virtual void executeOpcode(byte i); - virtual const char *getOpcodeDesc(byte i); - - virtual void scummLoop_handleActors(); - virtual void processKeyboard(Common::KeyState lastKeyHit); - - virtual void setupScummVars(); - virtual void decodeParseString(int a, int b); - virtual void readArrayFromIndexFile(); - - virtual byte *getStringAddress(int i); - virtual void readMAXS(int blockSize); - - virtual void palManipulateInit(int resID, int start, int end, int time); - virtual void drawDirtyScreenParts(); - - int getStackList(int *args, uint maxnum); - int popRoomAndObj(int *room); - - ArrayHeader *getArray(int array); - byte *defineArray(int array, int type, int dim2, int dim1); - int findFreeArrayId(); - void nukeArray(int array); - virtual int readArray(int array, int index, int base); - virtual void writeArray(int array, int index, int base, int value); - void shuffleArray(int num, int minIdx, int maxIdx); - - virtual void setDefaultCursor(); - void setCursorTransparency(int a); - void setCursorHotspot(int x, int y); - - virtual void setCursorFromImg(uint img, uint room, uint imgindex); - void useIm01Cursor(const byte *im, int w, int h); - void useBompCursor(const byte *im, int w, int h); - void grabCursor(int x, int y, int w, int h); - - void enqueueText(const byte *text, int x, int y, byte color, byte charset, bool center); - void drawBlastTexts(); - void removeBlastTexts(); - - void enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth, - int objectHeight, int scaleX, int scaleY, int image, int mode); - void drawBlastObjects(); - void drawBlastObject(BlastObject *eo); - void removeBlastObjects(); - void removeBlastObject(BlastObject *eo); - - virtual void clearDrawQueues(); - -public: - bool akos_increaseAnims(const byte *akos, Actor *a); - bool akos_increaseAnim(Actor *a, int i, const byte *aksq, const uint16 *akfo, int numakfo); -protected: - void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2); - virtual void akos_processQueue(); - - virtual void processActors(); - - int getSpecialBox(int x, int y); - - int getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f); - - /* Version 6 script opcodes */ - void o6_setBlastObjectWindow(); - void o6_pushByte(); - void o6_pushWord(); - void o6_pushByteVar(); - void o6_pushWordVar(); - void o6_invalid(); - void o6_byteArrayRead(); - void o6_wordArrayRead(); - void o6_byteArrayIndexedRead(); - void o6_wordArrayIndexedRead(); - void o6_dup(); - void o6_pop(); - void o6_not(); - void o6_eq(); - void o6_neq(); - void o6_gt(); - void o6_lt(); - void o6_le(); - void o6_ge(); - void o6_add(); - void o6_sub(); - void o6_mul(); - void o6_div(); - void o6_land(); - void o6_lor(); - void o6_writeByteVar(); - void o6_writeWordVar(); - void o6_byteArrayWrite(); - void o6_wordArrayWrite(); - void o6_byteArrayIndexedWrite(); - void o6_wordArrayIndexedWrite(); - void o6_byteVarInc(); - void o6_wordVarInc(); - void o6_byteArrayInc(); - void o6_wordArrayInc(); - void o6_byteVarDec(); - void o6_wordVarDec(); - void o6_byteArrayDec(); - void o6_wordArrayDec(); - void o6_if(); - void o6_ifNot(); - void o6_jump(); - void o6_startScript(); - void o6_startScriptQuick(); - void o6_startObject(); - void o6_drawObject(); - void o6_drawObjectAt(); - void o6_stopObjectCode(); - void o6_endCutscene(); - void o6_cutscene(); - void o6_stopMusic(); - void o6_freezeUnfreeze(); - void o6_cursorCommand(); - void o6_breakHere(); - void o6_ifClassOfIs(); - void o6_setClass(); - void o6_getState(); - void o6_setState(); - void o6_setOwner(); - void o6_getOwner(); - void o6_startSound(); - void o6_stopSound(); - void o6_startMusic(); - void o6_stopObjectScript(); - void o6_panCameraTo(); - void o6_actorFollowCamera(); - void o6_setCameraAt(); - void o6_loadRoom(); - void o6_stopScript(); - void o6_walkActorToObj(); - void o6_walkActorTo(); - void o6_putActorAtXY(); - void o6_putActorAtObject(); - void o6_faceActor(); - void o6_animateActor(); - void o6_doSentence(); - void o6_pickupObject(); - void o6_loadRoomWithEgo(); - void o6_getRandomNumber(); - void o6_getRandomNumberRange(); - void o6_getActorMoving(); - void o6_isScriptRunning(); - void o6_getActorRoom(); - void o6_getObjectX(); - void o6_getObjectY(); - void o6_getObjectOldDir(); - void o6_getObjectNewDir(); - void o6_getActorWalkBox(); - void o6_getActorCostume(); - void o6_findInventory(); - void o6_getInventoryCount(); - void o6_getVerbFromXY(); - void o6_beginOverride(); - void o6_endOverride(); - void o6_setObjectName(); - void o6_isSoundRunning(); - void o6_setBoxFlags(); - void o6_createBoxMatrix(); - void o6_resourceRoutines(); - void o6_roomOps(); - void o6_actorOps(); - void o6_verbOps(); - void o6_getActorFromXY(); - void o6_findObject(); - void o6_pseudoRoom(); - void o6_getActorElevation(); - void o6_getVerbEntrypoint(); - void o6_arrayOps(); - void o6_saveRestoreVerbs(); - void o6_drawBox(); - void o6_getActorWidth(); - void o6_wait(); - void o6_getActorScaleX(); - void o6_getActorAnimCounter(); - void o6_soundKludge(); - void o6_isAnyOf(); - void o6_systemOps(); - void o6_isActorInBox(); - void o6_delay(); - void o6_delaySeconds(); - void o6_delayMinutes(); - void o6_stopSentence(); - void o6_printLine(); - void o6_printText(); - void o6_printDebug(); - void o6_printSystem(); - void o6_printActor(); - void o6_printEgo(); - void o6_talkActor(); - void o6_talkEgo(); - void o6_dimArray(); - void o6_dummy(); - void o6_startObjectQuick(); - void o6_startScriptQuick2(); - void o6_dim2dimArray(); - void o6_abs(); - void o6_distObjectObject(); - void o6_distObjectPt(); - void o6_distPtPt(); - virtual void o6_kernelSetFunctions(); - void o6_delayFrames(); - void o6_pickOneOf(); - void o6_pickOneOfDefault(); - void o6_jumpToScript(); - void o6_isRoomScriptRunning(); - void o6_kernelGetFunctions(); - void o6_getAnimateVariable(); - void o6_drawBlastObject(); - void o6_getActorLayer(); - void o6_stampObject(); - void o6_bor(); - void o6_band(); - void o6_stopTalking(); - void o6_findAllObjects(); - void o6_pickVarRandom(); - void o6_getDateTime(); - void o6_getPixel(); - void o6_setBoxSet(); - void o6_shuffle(); - - byte VAR_VIDEONAME; - byte VAR_RANDOM_NR; - byte VAR_STRING2DRAW; - - byte VAR_TIMEDATE_YEAR; - byte VAR_TIMEDATE_MONTH; - byte VAR_TIMEDATE_DAY; - byte VAR_TIMEDATE_HOUR; - byte VAR_TIMEDATE_MINUTE; - byte VAR_TIMEDATE_SECOND; -}; - -#ifdef ENABLE_SCUMM_7_8 -class ScummEngine_v7 : public ScummEngine_v6 { - friend class SmushPlayer; - friend class Insane; -public: - ScummEngine_v7(OSystem *syst, const DetectorResult &dr); - ~ScummEngine_v7(); - - -protected: - int _smushFrameRate; - - /** - * Flag which signals that the SMUSH video playback should end now - * (e.g. because it was aborted by the user or it's simply finished). - */ - bool _smushVideoShouldFinish; - - bool _smushActive; - - Insane *_insane; - -public: - SmushMixer *_smixer; - SmushPlayer *_splayer; - - - struct LangIndexNode { - char tag[12+1]; - int32 offset; - }; - -protected: - int _verbLineSpacing; - bool _existLanguageFile; - char *_languageBuffer; - LangIndexNode *_languageIndex; - int _languageIndexSize; - char _lastStringTag[12+1]; - -#if defined(__SYMBIAN32__) || defined (_WIN32_WCE) // for some reason VC6 cannot find the base class TextObject - struct SubtitleText { - int16 xpos, ypos; - byte color; - byte charset; - byte text[256]; - bool actorSpeechMsg; - }; -#else - struct SubtitleText : TextObject { - bool actorSpeechMsg; - }; -#endif - - int _subtitleQueuePos; - SubtitleText _subtitleQueue[20]; - -public: - void processSubtitleQueue(); - void addSubtitleToQueue(const byte *text, const Common::Point &pos, byte color, byte charset); - void clearSubtitleQueue(); - virtual void CHARSET_1(); - -protected: - virtual int runDialog(Dialog &dialog); - - virtual void scummLoop_handleSound(); - virtual void scummLoop_handleDrawing(); - virtual void processKeyboard(Common::KeyState lastKeyHit); - - virtual void setupScumm(); - - virtual void setupScummVars(); - virtual void resetScummVars(); - - virtual void akos_processQueue(); - - virtual void saveOrLoad(Serializer *s); - - virtual void readMAXS(int blockSize); - virtual void readGlobalObjects(); - virtual void readIndexBlock(uint32 blocktype, uint32 itemsize); - - virtual void setCameraAt(int pos_x, int pos_y); - virtual void setCameraFollows(Actor *a, bool setCamera = false); - virtual void moveCamera(); - virtual void panCameraTo(int x, int y); - - virtual int getObjectIdFromOBIM(const byte *obim); - - virtual void actorTalk(const byte *msg); - virtual void translateText(const byte *text, byte *trans_buff); - virtual void loadLanguageBundle(); - void playSpeech(const byte *ptr); - - virtual void drawVerb(int verb, int mode); - - - virtual void o6_kernelSetFunctions(); -}; - -class ScummEngine_v8 : public ScummEngine_v7 { -protected: - typedef void (ScummEngine_v8::*OpcodeProcV8)(); - struct OpcodeEntryV8 { - OpcodeProcV8 proc; - const char *desc; - }; - - const OpcodeEntryV8 *_opcodesV8; - - struct ObjectNameId { - char name[40]; - int id; - }; - int _objectIDMapSize; - ObjectNameId *_objectIDMap; - - int _keyScriptKey, _keyScriptNo; - -public: - ScummEngine_v8(OSystem *syst, const DetectorResult &dr); - ~ScummEngine_v8(); - -protected: - virtual void setupOpcodes(); - virtual void executeOpcode(byte i); - virtual const char *getOpcodeDesc(byte i); - - virtual void printString(int m, const byte *msg); - - virtual void scummLoop_handleSaveLoad(); - - virtual void setupScummVars(); - virtual void resetScummVars(); - virtual void decodeParseString(int m, int n); - virtual void readArrayFromIndexFile(); - - virtual void readMAXS(int blockSize); - virtual void readGlobalObjects(); - - virtual uint fetchScriptWord(); - virtual int fetchScriptWordSigned(); - - virtual int readVar(uint var); - virtual void writeVar(uint var, int value); - - virtual int getObjectIdFromOBIM(const byte *obim); - - virtual void processKeyboard(Common::KeyState lastKeyHit); - - void desaturatePalette(int hueScale, int satScale, int lightScale, int startColor, int endColor); - - - /* Version 8 script opcodes */ - void o8_mod(); - void o8_wait(); - - void o8_dimArray(); - void o8_dim2dimArray(); - void o8_arrayOps(); - void o8_blastText(); - - void o8_cursorCommand(); - void o8_resourceRoutines(); - void o8_roomOps(); - void o8_actorOps(); - void o8_cameraOps(); - void o8_verbOps(); - - void o8_systemOps(); - void o8_startVideo(); - void o8_kernelSetFunctions(); - void o8_kernelGetFunctions(); - - void o8_getActorChore(); - void o8_getActorZPlane(); - - void o8_drawObject(); - void o8_getObjectImageX(); - void o8_getObjectImageY(); - void o8_getObjectImageWidth(); - void o8_getObjectImageHeight(); - - void o8_getStringWidth(); - - byte VAR_LANGUAGE; -}; - -#endif - } // End of namespace Scumm #endif diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index 87d9278023..b5b309863f 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -23,13 +23,13 @@ * */ -#include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/bomp.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" #include "scumm/object.h" #include "scumm/resource.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v8.h" #include "scumm/usage_bits.h" #include "scumm/util.h" diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp index a4ba9b25c4..aa722ae7ab 100644 --- a/engines/scumm/palette.cpp +++ b/engines/scumm/palette.cpp @@ -22,13 +22,12 @@ * */ - #include "common/system.h" #include "common/util.h" -#include "scumm/scumm.h" -#include "scumm/intern.h" #include "scumm/resource.h" +#include "scumm/scumm.h" +#include "scumm/scumm_v8.h" #include "scumm/util.h" namespace Scumm { diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp index 87ded6723b..1f4c743e90 100644 --- a/engines/scumm/resource.cpp +++ b/engines/scumm/resource.cpp @@ -23,7 +23,6 @@ * */ - #include "common/str.h" #include "scumm/charset.h" @@ -31,11 +30,12 @@ #include "scumm/file.h" #include "scumm/imuse/imuse.h" #include "scumm/imuse_digi/dimuse.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/scumm.h" +#include "scumm/scumm_v5.h" +#include "scumm/scumm_v8.h" #include "scumm/sound.h" #include "scumm/util.h" #include "scumm/verbs.h" diff --git a/engines/scumm/resource_v2.cpp b/engines/scumm/resource_v2.cpp index 76e451183f..184f3d94df 100644 --- a/engines/scumm/resource_v2.cpp +++ b/engines/scumm/resource_v2.cpp @@ -26,8 +26,7 @@ #include "scumm/file.h" -#include "scumm/scumm.h" -#include "scumm/intern.h" +#include "scumm/scumm_v2.h" #include "scumm/resource.h" namespace Scumm { diff --git a/engines/scumm/resource_v3.cpp b/engines/scumm/resource_v3.cpp index ddcba30232..420f71cf03 100644 --- a/engines/scumm/resource_v3.cpp +++ b/engines/scumm/resource_v3.cpp @@ -24,8 +24,7 @@ */ -#include "scumm/scumm.h" -#include "scumm/intern.h" +#include "scumm/scumm_v3.h" #include "scumm/file.h" #include "scumm/util.h" diff --git a/engines/scumm/resource_v4.cpp b/engines/scumm/resource_v4.cpp index 29d7c5d25d..ae4f4536bc 100644 --- a/engines/scumm/resource_v4.cpp +++ b/engines/scumm/resource_v4.cpp @@ -24,8 +24,7 @@ */ -#include "scumm/scumm.h" -#include "scumm/intern.h" +#include "scumm/scumm_v4.h" #include "scumm/file.h" #include "scumm/resource.h" #include "scumm/util.h" diff --git a/engines/scumm/room.cpp b/engines/scumm/room.cpp index 6fedb34b47..8623669dcc 100644 --- a/engines/scumm/room.cpp +++ b/engines/scumm/room.cpp @@ -27,13 +27,12 @@ #include "common/system.h" #include "scumm/actor.h" #include "scumm/boxes.h" -#include "scumm/intern.h" #ifdef ENABLE_HE #include "scumm/he/intern_he.h" #endif #include "scumm/object.h" #include "scumm/resource.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v3.h" #include "scumm/sound.h" #include "scumm/util.h" diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 55880766d9..da104db20c 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -34,12 +34,12 @@ #include "scumm/charset.h" #include "scumm/imuse_digi/dimuse.h" #include "scumm/imuse/imuse.h" -#include "scumm/intern.h" #include "scumm/he/intern_he.h" #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/saveload.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/he/sprite_he.h" #include "scumm/verbs.h" diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp index 856149d102..5730374a7d 100644 --- a/engines/scumm/script.cpp +++ b/engines/scumm/script.cpp @@ -29,11 +29,10 @@ #include "common/util.h" #include "scumm/actor.h" -#include "scumm/intern.h" #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/util.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v2.h" #include "scumm/verbs.h" namespace Scumm { diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp index 127b453fc6..309ecfe372 100644 --- a/engines/scumm/script_v0.cpp +++ b/engines/scumm/script_v0.cpp @@ -28,7 +28,7 @@ #include "scumm/charset.h" #include "scumm/intern.h" #include "scumm/object.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v0.h" #include "scumm/verbs.h" namespace Scumm { diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp index 1506e7b411..a06b4c7f2d 100644 --- a/engines/scumm/script_v2.cpp +++ b/engines/scumm/script_v2.cpp @@ -28,7 +28,7 @@ #include "scumm/charset.h" #include "scumm/intern.h" #include "scumm/object.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v2.h" #include "scumm/sound.h" #include "scumm/util.h" #include "scumm/verbs.h" diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index a6c8df2031..d77ef5aea5 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -28,7 +28,8 @@ #include "scumm/charset.h" #include "scumm/intern.h" #include "scumm/object.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v3.h" +#include "scumm/scumm_v5.h" #include "scumm/sound.h" #include "scumm/util.h" #include "scumm/verbs.h" diff --git a/engines/scumm/script_v6.cpp b/engines/scumm/script_v6.cpp index 5d318c4572..255e6f0c63 100644 --- a/engines/scumm/script_v6.cpp +++ b/engines/scumm/script_v6.cpp @@ -38,6 +38,8 @@ #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/scumm.h" +#include "scumm/scumm_v6.h" +#include "scumm/scumm_v7.h" #include "scumm/smush/smush_player.h" #include "scumm/sound.h" #include "scumm/util.h" diff --git a/engines/scumm/script_v8.cpp b/engines/scumm/script_v8.cpp index ec464feef9..1969a3be85 100644 --- a/engines/scumm/script_v8.cpp +++ b/engines/scumm/script_v8.cpp @@ -23,7 +23,6 @@ * */ - #include "common/config-manager.h" #include "common/system.h" @@ -35,7 +34,7 @@ #include "scumm/intern.h" #include "scumm/object.h" #include "scumm/resource.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v8.h" #include "scumm/sound.h" #include "scumm/util.h" #include "scumm/verbs.h" diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index cb24c38099..1ab4d50d3d 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -23,7 +23,6 @@ * */ - #include "common/config-manager.h" #include "common/md5.h" #include "common/events.h" @@ -46,7 +45,6 @@ #include "scumm/smush/smush_mixer.h" #include "scumm/smush/smush_player.h" #include "scumm/insane/insane.h" -#include "scumm/intern.h" #include "scumm/he/animation_he.h" #include "scumm/he/intern_he.h" #include "scumm/he/logic_he.h" @@ -58,7 +56,8 @@ #include "scumm/player_v2a.h" #include "scumm/player_v3a.h" #include "scumm/he/resource_he.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v8.h" #include "scumm/sound.h" #include "scumm/imuse/sysex.h" #include "scumm/he/sprite_he.h" diff --git a/engines/scumm/scumm_v0.h b/engines/scumm/scumm_v0.h new file mode 100644 index 0000000000..c9837028da --- /dev/null +++ b/engines/scumm/scumm_v0.h @@ -0,0 +1,141 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V0_H +#define SCUMM_SCRIPT_V0_H + +#include "scumm/scumm_v2.h" + +namespace Scumm { + +/** + * Engine for Apple II and Commodore 64 versions of Maniac Mansion + */ +class ScummEngine_v0 : public ScummEngine_v2 { +protected: + typedef void (ScummEngine_v0::*OpcodeProcC64)(); + struct OpcodeEntryC64 { + OpcodeProcC64 proc; + const char *desc; + }; + + const OpcodeEntryC64 *_opcodesC64; + + int _currentMode; +public: + ScummEngine_v0(OSystem *syst, const DetectorResult &dr); + + virtual void resetScumm(); + +protected: + virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); + + virtual void setupOpcodes(); + virtual void executeOpcode(byte i); + virtual const char *getOpcodeDesc(byte i); + + virtual void setupScummVars(); + virtual void resetScummVars(); + virtual void decodeParseString(); + + virtual void processInput(); + + virtual void saveOrLoad(Serializer *s); + + virtual void checkExecVerbs(); + virtual void handleMouseOver(bool updateInventory); + void resetVerbs(); + void setNewKidVerbs(); + void drawSentence(); + + void switchActor(int slot); + + virtual int getVarOrDirectWord(byte mask); + virtual uint fetchScriptWord(); + + virtual void ifStateCommon(byte type); + virtual void ifNotStateCommon(byte type); + virtual void setStateCommon(byte type); + virtual void clearStateCommon(byte type); + + virtual void resetSentence(); + + int getObjectFlag(); + + /* Version C64 script opcodes */ + void o_setState08(); + void o_clearState08(); + void o_stopCurrentScript(); + void o_loadSound(); + void o_getActorMoving(); + void o_animateActor(); + void o_putActorAtObject(); + void o_pickupObject(); + void o_setObjectName(); + void o_lockSound(); + void o_lockCostume(); + void o_loadCostume(); + void o_loadRoom(); + void o_loadRoomWithEgo(); + void o_lockScript(); + void o_loadScript(); + void o_lockRoom(); + void o_cursorCommand(); + void o_lights(); + void o_unlockCostume(); + void o_unlockScript(); + void o_decrement(); + void o_nop(); + void o_getActorBitVar(); + void o_setActorBitVar(); + void o_getBitVar(); + void o_setBitVar(); + void o_doSentence(); + void o_unknown2(); + void o_ifActiveObject(); + void o_getClosestObjActor(); + void o_printEgo_c64(); + void o_print_c64(); + void o_unlockRoom(); + void o_unlockSound(); + void o_cutscene(); + void o_endCutscene(); + void o_beginOverride(); + void o_isEqual(); + void o_isGreater(); + void o_isGreaterEqual(); + void o_isLess(); + void o_isLessEqual(); + void o_isNotEqual(); + void o_notEqualZero(); + void o_equalZero(); + void o_jumpRelative(); + void o_setOwnerOf(); +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm_v2.h b/engines/scumm/scumm_v2.h new file mode 100644 index 0000000000..6b7fff3cb9 --- /dev/null +++ b/engines/scumm/scumm_v2.h @@ -0,0 +1,201 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V2_H +#define SCUMM_SCRIPT_V2_H + +#include "scumm/scumm_v3.h" + +namespace Scumm { + +/** + * Engine for version 2 SCUMM games. + */ +class ScummEngine_v2 : public ScummEngine_v3old { +protected: + typedef void (ScummEngine_v2::*OpcodeProcV2)(); + struct OpcodeEntryV2 { + OpcodeProcV2 proc; + const char *desc; + }; + + const OpcodeEntryV2 *_opcodesV2; + + struct V2MouseoverBox { + Common::Rect rect; + byte color; + byte hicolor; + }; + + V2MouseoverBox _mouseOverBoxesV2[7]; + int8 _mouseOverBoxV2; + + char _sentenceBuf[256]; + + int _activeInventory; + int _activeObject; + int _activeVerb; + +public: + ScummEngine_v2(OSystem *syst, const DetectorResult &dr); + + virtual void resetScumm(); + + void checkV2MouseOver(Common::Point pos); + void checkV2Inventory(int x, int y); + void redrawV2Inventory(); + +protected: + virtual void setupOpcodes(); + virtual void executeOpcode(byte i); + virtual const char *getOpcodeDesc(byte i); + + virtual void setupScummVars(); + virtual void resetScummVars(); + virtual void decodeParseString(); + + virtual void processKeyboard(Common::KeyState lastKeyHit); + + virtual void readIndexFile(); + void readClassicIndexFile(); // V1 + void readEnhancedIndexFile(); // V2 + virtual void readGlobalObjects(); + virtual void loadCharset(int no); + + virtual void runInputScript(int clickArea, int val, int mode); + virtual void runInventoryScript(int i); + + virtual int getVar(); + + void getResultPosIndirect(); + virtual void getResultPos(); + virtual int readVar(uint var); + virtual void writeVar(uint var, int value); + + virtual void ifStateCommon(byte type); + virtual void ifNotStateCommon(byte type); + virtual void setStateCommon(byte type); + virtual void clearStateCommon(byte type); + + virtual void resetSentence(); + void setUserState(byte state); + + virtual void handleMouseOver(bool updateInventory); + virtual void checkExecVerbs(); + void initV2MouseOver(); + void initNESMouseOver(); + + virtual void setBuiltinCursor(int index); + + void runObject(int obj, int entry); + + /* Version 2 script opcodes */ + void o2_actorFromPos(); + void o2_actorOps(); + void o2_add(); + void o2_addIndirect(); + void o2_assignVarByte(); + void o2_assignVarWordIndirect(); + void o2_beginOverride(); + void o2_chainScript(); + void o2_clearState01(); + void o2_clearState02(); + void o2_clearState04(); + void o2_clearState08(); + void o2_cursorCommand(); + void o2_cutscene(); + void o2_delay(); + void o2_doSentence(); + void o2_drawObject(); + void o2_drawSentence(); + void o2_dummy(); + void o2_endCutscene(); + void o2_findObject(); + void o2_getActorWalkBox(); + void o2_getActorX(); + void o2_getActorY(); + void o2_getBitVar(); + void o2_getObjPreposition(); + void o2_ifClassOfIs(); + void o2_ifNotState01(); + void o2_ifNotState02(); + void o2_ifNotState04(); + void o2_ifNotState08(); + void o2_ifState01(); + void o2_ifState02(); + void o2_ifState04(); + void o2_ifState08(); + void o2_isGreater(); + void o2_isGreaterEqual(); + void o2_isLess(); + void o2_isLessEqual(); + void o2_lights(); + void o2_loadRoomWithEgo(); + void o2_setBoxFlags(); + void o2_panCameraTo(); + void o2_pickupObject(); + void o2_putActor(); + void o2_putActorAtObject(); + void o2_putActorInRoom(); + void o2_resourceRoutines(); + void o2_restart(); + void o2_roomOps(); + void o2_getActorElevation(); + void o2_setActorElevation(); + void o2_setBitVar(); + void o2_setCameraAt(); + void o2_setObjPreposition(); + void o2_setOwnerOf(); + void o2_setState01(); + void o2_setState02(); + void o2_setState04(); + void o2_setState08(); + void o2_startScript(); + void o2_stopScript(); + void o2_subtract(); + void o2_subIndirect(); + void o2_switchCostumeSet(); + void o2_verbOps(); + void o2_waitForActor(); + void o2_waitForMessage(); + void o2_waitForSentence(); + void o2_walkActorTo(); + void o2_walkActorToObject(); + + byte VAR_SENTENCE_VERB; + byte VAR_SENTENCE_OBJECT1; + byte VAR_SENTENCE_OBJECT2; + byte VAR_SENTENCE_PREPOSITION; + byte VAR_BACKUP_VERB; + + byte VAR_CLICK_AREA; + byte VAR_CLICK_VERB; + byte VAR_CLICK_OBJECT; +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm_v3.h b/engines/scumm/scumm_v3.h new file mode 100644 index 0000000000..4529b90fe1 --- /dev/null +++ b/engines/scumm/scumm_v3.h @@ -0,0 +1,83 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V3_H +#define SCUMM_SCRIPT_V3_H + +#include "scumm/scumm_v4.h" + +namespace Scumm { + +/** + * Engine for version 3 SCUMM games; GF_SMALL_NAMES is always set for these. + */ +class ScummEngine_v3 : public ScummEngine_v4 { +public: + + /** + * Prepared savegame used by the orginal save/load dialog. + * Must be valid as long as the savescreen is active. As we are not + * notified when the savescreen is closed, memory is only freed on a game + * reset, at the destruction of the engine or when the original save/load + * dialog is entered the next time. + */ + Common::SeekableReadStream *_savePreparedSavegame; + + void prepareSavegame(); + bool savePreparedSavegame(int slot, char *desc); + + +public: + ScummEngine_v3(OSystem *syst, const DetectorResult &dr); + ~ScummEngine_v3(); + + virtual void resetScumm(); + +protected: + virtual void readRoomsOffsets(); + virtual void loadCharset(int no); + + virtual void processKeyboard(Common::KeyState lastKeyHit); +}; + +/** + * Engine for old format version 3 SCUMM games; GF_OLD_BUNDLE is always set for these. + */ +class ScummEngine_v3old : public ScummEngine_v3 { +public: + ScummEngine_v3old(OSystem *syst, const DetectorResult &dr); + +protected: + virtual void readResTypeList(int id); + virtual void readIndexFile(); + virtual void setupRoomSubBlocks(); + virtual void resetRoomSubBlocks(); + virtual void resetRoomObjects(); +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm_v4.h b/engines/scumm/scumm_v4.h new file mode 100644 index 0000000000..de72c05c1e --- /dev/null +++ b/engines/scumm/scumm_v4.h @@ -0,0 +1,56 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V4_H +#define SCUMM_SCRIPT_V4_H + +#include "scumm/scumm_v5.h" + +namespace Scumm { + +/** + * Engine for version 4 SCUMM games; GF_SMALL_HEADER is always set for these. + */ +class ScummEngine_v4 : public ScummEngine_v5 { +public: + ScummEngine_v4(OSystem *syst, const DetectorResult &dr); + + virtual void resetScumm(); + +protected: + virtual void readResTypeList(int id); + virtual void readIndexFile(); + virtual void loadCharset(int no); + virtual void resetRoomObjects(); + virtual void readMAXS(int blockSize); + virtual void readGlobalObjects(); + + virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm_v5.h b/engines/scumm/scumm_v5.h new file mode 100644 index 0000000000..763a6ee2af --- /dev/null +++ b/engines/scumm/scumm_v5.h @@ -0,0 +1,207 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V5_H +#define SCUMM_SCRIPT_V5_H + +#include "scumm/scumm.h" + +namespace Scumm { + +class ScummEngine_v5 : public ScummEngine { +protected: + typedef void (ScummEngine_v5::*OpcodeProcV5)(); + struct OpcodeEntryV5 { + OpcodeProcV5 proc; + const char *desc; + }; + + const OpcodeEntryV5 *_opcodesV5; + + uint16 _cursorImages[4][17]; + byte _cursorHotspots[2 * 4]; + + struct { + int x, y, w, h; + byte *buffer; + uint16 xStrips, yStrips; + bool isDrawn; + } _flashlight; + + char _saveLoadVarsFilename[256]; + +public: + ScummEngine_v5(OSystem *syst, const DetectorResult &dr); + + void clearFlashlight(); + + virtual void resetCursors(); + +protected: + virtual void setupOpcodes(); + virtual void executeOpcode(byte i); + virtual const char *getOpcodeDesc(byte i); + + virtual void scummLoop_handleActors(); + + virtual void setupScummVars(); + virtual void resetScummVars(); + virtual void decodeParseString(); + + virtual void saveOrLoad(Serializer *s); + + virtual void readMAXS(int blockSize); + + int getWordVararg(int *ptr); + void saveVars(); + void loadVars(); + void saveIQPoints(); + void loadIQPoints(); + + virtual int getVar(); + virtual int getVarOrDirectByte(byte mask); + virtual int getVarOrDirectWord(byte mask); + + virtual void animateCursor(); + + virtual void setBuiltinCursor(int index); + void redefineBuiltinCursorFromChar(int index, int chr); + void redefineBuiltinCursorHotspot(int index, int x, int y); + + void drawFlashlight(); + + /* Version 5 script opcodes */ + void o5_actorFollowCamera(); + void o5_actorFromPos(); + void o5_actorOps(); + void o5_add(); + void o5_and(); + void o5_animateActor(); + void o5_breakHere(); + void o5_chainScript(); + void o5_cursorCommand(); + void o5_cutscene(); + void o5_debug(); + void o5_decrement(); + void o5_delay(); + void o5_delayVariable(); + void o5_divide(); + void o5_doSentence(); + void o5_drawBox(); + void o5_drawObject(); + void o5_endCutscene(); + void o5_equalZero(); + void o5_expression(); + void o5_faceActor(); + void o5_findInventory(); + void o5_findObject(); + void o5_freezeScripts(); + void o5_getActorCostume(); + void o5_getActorElevation(); + void o5_getActorFacing(); + void o5_getActorMoving(); + void o5_getActorRoom(); + void o5_getActorScale(); + void o5_getActorWalkBox(); + void o5_getActorWidth(); + void o5_getActorX(); + void o5_getActorY(); + void o5_getAnimCounter(); + void o5_getClosestObjActor(); + void o5_getDist(); + void o5_getInventoryCount(); + void o5_getObjectOwner(); + void o5_getObjectState(); + void o5_getRandomNr(); + void o5_getStringWidth(); + void o5_getVerbEntrypoint(); + void o5_ifClassOfIs(); + void o5_ifNotState(); + void o5_ifState(); + void o5_increment(); + void o5_isActorInBox(); + void o5_isEqual(); + void o5_isGreater(); + void o5_isGreaterEqual(); + void o5_isLess(); + void o5_isNotEqual(); + void o5_isScriptRunning(); + void o5_isSoundRunning(); + void o5_jumpRelative(); + void o5_lessOrEqual(); + void o5_lights(); + void o5_loadRoom(); + void o5_loadRoomWithEgo(); + void o5_matrixOps(); + void o5_move(); + void o5_multiply(); + void o5_notEqualZero(); + void o5_oldRoomEffect(); + void o5_or(); + void o5_beginOverride(); + void o5_panCameraTo(); + void o5_pickupObject(); + void o5_pickupObjectOld(); + void o5_print(); + void o5_printEgo(); + void o5_pseudoRoom(); + void o5_putActor(); + void o5_putActorAtObject(); + void o5_putActorInRoom(); + void o5_systemOps(); + void o5_resourceRoutines(); + void o5_roomOps(); + void o5_saveLoadGame(); + void o5_saveLoadVars(); + void o5_saveRestoreVerbs(); + void o5_setCameraAt(); + void o5_setClass(); + void o5_setObjectName(); + void o5_setOwnerOf(); + void o5_setState(); + void o5_setVarRange(); + void o5_soundKludge(); + void o5_startMusic(); + void o5_startObject(); + void o5_startScript(); + void o5_startSound(); + void o5_stopMusic(); + void o5_stopObjectCode(); + void o5_stopObjectScript(); + void o5_stopScript(); + void o5_stopSound(); + void o5_stringOps(); + void o5_subtract(); + void o5_verbOps(); + void o5_wait(); + void o5_walkActorTo(); + void o5_walkActorToActor(); + void o5_walkActorToObject(); +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm_v6.h b/engines/scumm/scumm_v6.h new file mode 100644 index 0000000000..8d6d81b4d1 --- /dev/null +++ b/engines/scumm/scumm_v6.h @@ -0,0 +1,350 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V6_H +#define SCUMM_SCRIPT_V6_H + +#include "scumm/scumm.h" + +namespace Scumm { + +class ScummEngine_v6 : public ScummEngine { +protected: + typedef void (ScummEngine_v6::*OpcodeProcV6)(); + struct OpcodeEntryV6 { + OpcodeProcV6 proc; + const char *desc; + }; + + enum ArrayType { + kBitArray = 1, + kNibbleArray = 2, + kByteArray = 3, + kStringArray = 4, + kIntArray = 5, + kDwordArray = 6 + }; + +#include "common/pack-start.h" // START STRUCT PACKING + + struct ArrayHeader { + int16 dim1; + int16 type; + int16 dim2; + byte data[1]; + } PACKED_STRUCT; + +#include "common/pack-end.h" // END STRUCT PACKING + + const OpcodeEntryV6 *_opcodesV6; + + struct TextObject { + int16 xpos, ypos; + byte color; + byte charset; + byte text[256]; + }; + + /** BlastObjects to draw */ + struct BlastObject { + uint16 number; + Common::Rect rect; + uint16 scaleX, scaleY; + uint16 image; + uint16 mode; + }; + + int _blastObjectQueuePos; + BlastObject _blastObjectQueue[200]; + + struct BlastText : TextObject { + Common::Rect rect; + bool center; + }; + + int _blastTextQueuePos; + BlastText _blastTextQueue[50]; + + // Akos Class + struct { + int16 cmd; + int16 actor; + int16 param1; + int16 param2; + } _akosQueue[32]; + int16 _akosQueuePos; + + byte _curActor; + int _curVerb; + int _curVerbSlot; + + bool _forcedWaitForMessage; + +public: + ScummEngine_v6(OSystem *syst, const DetectorResult &dr); + + virtual void resetScumm(); + +protected: + virtual void setupOpcodes(); + virtual void executeOpcode(byte i); + virtual const char *getOpcodeDesc(byte i); + + virtual void scummLoop_handleActors(); + virtual void processKeyboard(Common::KeyState lastKeyHit); + + virtual void setupScummVars(); + virtual void decodeParseString(int a, int b); + virtual void readArrayFromIndexFile(); + + virtual byte *getStringAddress(int i); + virtual void readMAXS(int blockSize); + + virtual void palManipulateInit(int resID, int start, int end, int time); + virtual void drawDirtyScreenParts(); + + int getStackList(int *args, uint maxnum); + int popRoomAndObj(int *room); + + ArrayHeader *getArray(int array); + byte *defineArray(int array, int type, int dim2, int dim1); + int findFreeArrayId(); + void nukeArray(int array); + virtual int readArray(int array, int index, int base); + virtual void writeArray(int array, int index, int base, int value); + void shuffleArray(int num, int minIdx, int maxIdx); + + virtual void setDefaultCursor(); + void setCursorTransparency(int a); + void setCursorHotspot(int x, int y); + + virtual void setCursorFromImg(uint img, uint room, uint imgindex); + void useIm01Cursor(const byte *im, int w, int h); + void useBompCursor(const byte *im, int w, int h); + void grabCursor(int x, int y, int w, int h); + + void enqueueText(const byte *text, int x, int y, byte color, byte charset, bool center); + void drawBlastTexts(); + void removeBlastTexts(); + + void enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth, + int objectHeight, int scaleX, int scaleY, int image, int mode); + void drawBlastObjects(); + void drawBlastObject(BlastObject *eo); + void removeBlastObjects(); + void removeBlastObject(BlastObject *eo); + + virtual void clearDrawQueues(); + +public: + bool akos_increaseAnims(const byte *akos, Actor *a); + bool akos_increaseAnim(Actor *a, int i, const byte *aksq, const uint16 *akfo, int numakfo); +protected: + void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2); + virtual void akos_processQueue(); + + virtual void processActors(); + + int getSpecialBox(int x, int y); + + int getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f); + + /* Version 6 script opcodes */ + void o6_setBlastObjectWindow(); + void o6_pushByte(); + void o6_pushWord(); + void o6_pushByteVar(); + void o6_pushWordVar(); + void o6_invalid(); + void o6_byteArrayRead(); + void o6_wordArrayRead(); + void o6_byteArrayIndexedRead(); + void o6_wordArrayIndexedRead(); + void o6_dup(); + void o6_pop(); + void o6_not(); + void o6_eq(); + void o6_neq(); + void o6_gt(); + void o6_lt(); + void o6_le(); + void o6_ge(); + void o6_add(); + void o6_sub(); + void o6_mul(); + void o6_div(); + void o6_land(); + void o6_lor(); + void o6_writeByteVar(); + void o6_writeWordVar(); + void o6_byteArrayWrite(); + void o6_wordArrayWrite(); + void o6_byteArrayIndexedWrite(); + void o6_wordArrayIndexedWrite(); + void o6_byteVarInc(); + void o6_wordVarInc(); + void o6_byteArrayInc(); + void o6_wordArrayInc(); + void o6_byteVarDec(); + void o6_wordVarDec(); + void o6_byteArrayDec(); + void o6_wordArrayDec(); + void o6_if(); + void o6_ifNot(); + void o6_jump(); + void o6_startScript(); + void o6_startScriptQuick(); + void o6_startObject(); + void o6_drawObject(); + void o6_drawObjectAt(); + void o6_stopObjectCode(); + void o6_endCutscene(); + void o6_cutscene(); + void o6_stopMusic(); + void o6_freezeUnfreeze(); + void o6_cursorCommand(); + void o6_breakHere(); + void o6_ifClassOfIs(); + void o6_setClass(); + void o6_getState(); + void o6_setState(); + void o6_setOwner(); + void o6_getOwner(); + void o6_startSound(); + void o6_stopSound(); + void o6_startMusic(); + void o6_stopObjectScript(); + void o6_panCameraTo(); + void o6_actorFollowCamera(); + void o6_setCameraAt(); + void o6_loadRoom(); + void o6_stopScript(); + void o6_walkActorToObj(); + void o6_walkActorTo(); + void o6_putActorAtXY(); + void o6_putActorAtObject(); + void o6_faceActor(); + void o6_animateActor(); + void o6_doSentence(); + void o6_pickupObject(); + void o6_loadRoomWithEgo(); + void o6_getRandomNumber(); + void o6_getRandomNumberRange(); + void o6_getActorMoving(); + void o6_isScriptRunning(); + void o6_getActorRoom(); + void o6_getObjectX(); + void o6_getObjectY(); + void o6_getObjectOldDir(); + void o6_getObjectNewDir(); + void o6_getActorWalkBox(); + void o6_getActorCostume(); + void o6_findInventory(); + void o6_getInventoryCount(); + void o6_getVerbFromXY(); + void o6_beginOverride(); + void o6_endOverride(); + void o6_setObjectName(); + void o6_isSoundRunning(); + void o6_setBoxFlags(); + void o6_createBoxMatrix(); + void o6_resourceRoutines(); + void o6_roomOps(); + void o6_actorOps(); + void o6_verbOps(); + void o6_getActorFromXY(); + void o6_findObject(); + void o6_pseudoRoom(); + void o6_getActorElevation(); + void o6_getVerbEntrypoint(); + void o6_arrayOps(); + void o6_saveRestoreVerbs(); + void o6_drawBox(); + void o6_getActorWidth(); + void o6_wait(); + void o6_getActorScaleX(); + void o6_getActorAnimCounter(); + void o6_soundKludge(); + void o6_isAnyOf(); + void o6_systemOps(); + void o6_isActorInBox(); + void o6_delay(); + void o6_delaySeconds(); + void o6_delayMinutes(); + void o6_stopSentence(); + void o6_printLine(); + void o6_printText(); + void o6_printDebug(); + void o6_printSystem(); + void o6_printActor(); + void o6_printEgo(); + void o6_talkActor(); + void o6_talkEgo(); + void o6_dimArray(); + void o6_dummy(); + void o6_startObjectQuick(); + void o6_startScriptQuick2(); + void o6_dim2dimArray(); + void o6_abs(); + void o6_distObjectObject(); + void o6_distObjectPt(); + void o6_distPtPt(); + virtual void o6_kernelSetFunctions(); + void o6_delayFrames(); + void o6_pickOneOf(); + void o6_pickOneOfDefault(); + void o6_jumpToScript(); + void o6_isRoomScriptRunning(); + void o6_kernelGetFunctions(); + void o6_getAnimateVariable(); + void o6_drawBlastObject(); + void o6_getActorLayer(); + void o6_stampObject(); + void o6_bor(); + void o6_band(); + void o6_stopTalking(); + void o6_findAllObjects(); + void o6_pickVarRandom(); + void o6_getDateTime(); + void o6_getPixel(); + void o6_setBoxSet(); + void o6_shuffle(); + + byte VAR_VIDEONAME; + byte VAR_RANDOM_NR; + byte VAR_STRING2DRAW; + + byte VAR_TIMEDATE_YEAR; + byte VAR_TIMEDATE_MONTH; + byte VAR_TIMEDATE_DAY; + byte VAR_TIMEDATE_HOUR; + byte VAR_TIMEDATE_MINUTE; + byte VAR_TIMEDATE_SECOND; +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm_v7.h b/engines/scumm/scumm_v7.h new file mode 100644 index 0000000000..fdc1d6de9c --- /dev/null +++ b/engines/scumm/scumm_v7.h @@ -0,0 +1,144 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V7_H +#define SCUMM_SCRIPT_V7_H + +#ifdef ENABLE_SCUMM_7_8 + +#include "scumm/scumm_v6.h" + +namespace Scumm { + +class Insane; +class SmushMixer; +class SmushPlayer; + +class ScummEngine_v7 : public ScummEngine_v6 { + friend class SmushPlayer; + friend class Insane; +public: + ScummEngine_v7(OSystem *syst, const DetectorResult &dr); + ~ScummEngine_v7(); + + +protected: + int _smushFrameRate; + + /** + * Flag which signals that the SMUSH video playback should end now + * (e.g. because it was aborted by the user or it's simply finished). + */ + bool _smushVideoShouldFinish; + + bool _smushActive; + + Insane *_insane; + +public: + SmushMixer *_smixer; + SmushPlayer *_splayer; + + + struct LangIndexNode { + char tag[12+1]; + int32 offset; + }; + +protected: + int _verbLineSpacing; + bool _existLanguageFile; + char *_languageBuffer; + LangIndexNode *_languageIndex; + int _languageIndexSize; + char _lastStringTag[12+1]; + +#if defined(__SYMBIAN32__) || defined (_WIN32_WCE) // for some reason VC6 cannot find the base class TextObject + struct SubtitleText { + int16 xpos, ypos; + byte color; + byte charset; + byte text[256]; + bool actorSpeechMsg; + }; +#else + struct SubtitleText : TextObject { + bool actorSpeechMsg; + }; +#endif + + int _subtitleQueuePos; + SubtitleText _subtitleQueue[20]; + +public: + void processSubtitleQueue(); + void addSubtitleToQueue(const byte *text, const Common::Point &pos, byte color, byte charset); + void clearSubtitleQueue(); + virtual void CHARSET_1(); + +protected: + virtual int runDialog(Dialog &dialog); + + virtual void scummLoop_handleSound(); + virtual void scummLoop_handleDrawing(); + virtual void processKeyboard(Common::KeyState lastKeyHit); + + virtual void setupScumm(); + + virtual void setupScummVars(); + virtual void resetScummVars(); + + virtual void akos_processQueue(); + + virtual void saveOrLoad(Serializer *s); + + virtual void readMAXS(int blockSize); + virtual void readGlobalObjects(); + virtual void readIndexBlock(uint32 blocktype, uint32 itemsize); + + virtual void setCameraAt(int pos_x, int pos_y); + virtual void setCameraFollows(Actor *a, bool setCamera = false); + virtual void moveCamera(); + virtual void panCameraTo(int x, int y); + + virtual int getObjectIdFromOBIM(const byte *obim); + + virtual void actorTalk(const byte *msg); + virtual void translateText(const byte *text, byte *trans_buff); + virtual void loadLanguageBundle(); + void playSpeech(const byte *ptr); + + virtual void drawVerb(int verb, int mode); + + + virtual void o6_kernelSetFunctions(); +}; + + +} // End of namespace Scumm + +#endif // ENABLE_SCUMM_7_8 + +#endif diff --git a/engines/scumm/scumm_v8.h b/engines/scumm/scumm_v8.h new file mode 100644 index 0000000000..abd53b44ff --- /dev/null +++ b/engines/scumm/scumm_v8.h @@ -0,0 +1,127 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCUMM_SCRIPT_V8_H +#define SCUMM_SCRIPT_V8_H + +#ifdef ENABLE_SCUMM_7_8 + +#include "scumm/scumm_v7.h" + +namespace Scumm { + +class ScummEngine_v8 : public ScummEngine_v7 { +protected: + typedef void (ScummEngine_v8::*OpcodeProcV8)(); + struct OpcodeEntryV8 { + OpcodeProcV8 proc; + const char *desc; + }; + + const OpcodeEntryV8 *_opcodesV8; + + struct ObjectNameId { + char name[40]; + int id; + }; + int _objectIDMapSize; + ObjectNameId *_objectIDMap; + + int _keyScriptKey, _keyScriptNo; + +public: + ScummEngine_v8(OSystem *syst, const DetectorResult &dr); + ~ScummEngine_v8(); + +protected: + virtual void setupOpcodes(); + virtual void executeOpcode(byte i); + virtual const char *getOpcodeDesc(byte i); + + virtual void printString(int m, const byte *msg); + + virtual void scummLoop_handleSaveLoad(); + + virtual void setupScummVars(); + virtual void resetScummVars(); + virtual void decodeParseString(int m, int n); + virtual void readArrayFromIndexFile(); + + virtual void readMAXS(int blockSize); + virtual void readGlobalObjects(); + + virtual uint fetchScriptWord(); + virtual int fetchScriptWordSigned(); + + virtual int readVar(uint var); + virtual void writeVar(uint var, int value); + + virtual int getObjectIdFromOBIM(const byte *obim); + + virtual void processKeyboard(Common::KeyState lastKeyHit); + + void desaturatePalette(int hueScale, int satScale, int lightScale, int startColor, int endColor); + + + /* Version 8 script opcodes */ + void o8_mod(); + void o8_wait(); + + void o8_dimArray(); + void o8_dim2dimArray(); + void o8_arrayOps(); + void o8_blastText(); + + void o8_cursorCommand(); + void o8_resourceRoutines(); + void o8_roomOps(); + void o8_actorOps(); + void o8_cameraOps(); + void o8_verbOps(); + + void o8_systemOps(); + void o8_startVideo(); + void o8_kernelSetFunctions(); + void o8_kernelGetFunctions(); + + void o8_getActorChore(); + void o8_getActorZPlane(); + + void o8_drawObject(); + void o8_getObjectImageX(); + void o8_getObjectImageY(); + void o8_getObjectImageWidth(); + void o8_getObjectImageHeight(); + + void o8_getStringWidth(); + + byte VAR_LANGUAGE; +}; + +} // End of namespace Scumm + +#endif // ENABLE_SCUMM_7_8 + +#endif diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp index 55cdc2a25e..b663c707dd 100644 --- a/engines/scumm/smush/smush_player.cpp +++ b/engines/scumm/smush/smush_player.cpp @@ -37,6 +37,7 @@ #include "scumm/imuse_digi/dimuse.h" #include "scumm/imuse/imuse.h" #include "scumm/scumm.h" +#include "scumm/scumm_v7.h" #include "scumm/sound.h" #include "scumm/util.h" #include "scumm/smush/channel.h" diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index f5cbd6aab9..9dfef573f9 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -27,16 +27,16 @@ #include "common/config-manager.h" -#include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/charset.h" #include "scumm/dialogs.h" #include "scumm/file.h" #include "scumm/imuse_digi/dimuse.h" -#include "scumm/intern.h" #ifdef ENABLE_HE #include "scumm/he/intern_he.h" #endif +#include "scumm/scumm.h" +#include "scumm/scumm_v8.h" #include "scumm/verbs.h" #include "scumm/he/sound_he.h" diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp index 203629def7..0cf5d07211 100644 --- a/engines/scumm/vars.cpp +++ b/engines/scumm/vars.cpp @@ -26,7 +26,8 @@ #include "common/config-manager.h" #include "scumm/scumm.h" -#include "scumm/intern.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v8.h" #include "scumm/he/intern_he.h" #include "scumm/he/logic_he.h" #include "sound/mididrv.h" diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp index 0a61d10166..e62d9406d3 100644 --- a/engines/scumm/verbs.cpp +++ b/engines/scumm/verbs.cpp @@ -23,14 +23,13 @@ * */ - #include "scumm/actor.h" #include "scumm/charset.h" #include "scumm/he/intern_he.h" -#include "scumm/intern.h" #include "scumm/object.h" #include "scumm/resource.h" -#include "scumm/scumm.h" +#include "scumm/scumm_v0.h" +#include "scumm/scumm_v7.h" #include "scumm/verbs.h" namespace Scumm { |