aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/kyra_v1.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/kyra/kyra_v1.h')
-rw-r--r--engines/kyra/kyra_v1.h973
1 files changed, 229 insertions, 744 deletions
diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h
index 50791c3ade..4f38ceca98 100644
--- a/engines/kyra/kyra_v1.h
+++ b/engines/kyra/kyra_v1.h
@@ -26,796 +26,281 @@
#ifndef KYRA_KYRA_V1_H
#define KYRA_KYRA_V1_H
-#include "kyra/kyra.h"
+#include "engines/engine.h"
+
+#include "common/array.h"
+#include "common/events.h"
+
#include "kyra/script.h"
-#include "kyra/screen_v1.h"
-#include "kyra/gui_v1.h"
+
+namespace Common {
+class InSaveFile;
+class OutSaveFile;
+} // end of namespace Common
+
+class KyraMetaEngine;
namespace Kyra {
-class Movie;
-class SoundDigital;
-class SeqPlayer;
-class Sprites;
-class Debugger;
-class Animator_v1;
-class TextDisplayer;
-class KyraEngine_v1;
-
-struct Character {
- uint16 sceneId;
- uint8 height;
- uint8 facing;
- uint16 currentAnimFrame;
- uint8 inventoryItems[10];
- int16 x1, y1, x2, y2;
-};
+struct GameFlags {
+ Common::Language lang;
+ Common::Platform platform;
-struct Shape {
- uint8 imageIndex;
- int8 xOffset, yOffset;
- uint8 x, y, w, h;
-};
+ bool isDemo : 1;
+ bool useAltShapeHeader : 1; // alternative shape header (uses 2 bytes more, those are unused though)
+ bool isTalkie : 1;
+ bool useHiResOverlay : 1;
+ bool useDigSound : 1;
+ bool useInstallerPackage : 1;
-struct Room {
- uint8 nameIndex;
- uint16 northExit;
- uint16 eastExit;
- uint16 southExit;
- uint16 westExit;
- uint8 itemsTable[12];
- uint16 itemsXPos[12];
- uint8 itemsYPos[12];
- uint8 needInit[12];
+ byte gameID;
};
-struct Item {
- uint8 unk1;
- uint8 height;
- uint8 unk2;
- uint8 unk3;
+enum {
+ GI_KYRA1 = 0,
+ GI_KYRA2 = 1,
+ GI_KYRA3 = 2
};
-struct SeqLoop {
- const uint8 *ptr;
- uint16 count;
+struct AudioDataStruct {
+ const char * const *_fileList;
+ const int _fileListLen;
+ const void * const _cdaTracks;
+ const int _cdaNumTracks;
};
-struct SceneExits {
- uint16 northXPos;
- uint8 northYPos;
- uint16 eastXPos;
- uint8 eastYPos;
- uint16 southXPos;
- uint8 southYPos;
- uint16 westXPos;
- uint8 westYPos;
+// TODO: this is just the start of makeing the debug output of the kyra engine a bit more useable
+// in the future we maybe merge some flags and/or create new ones
+enum kDebugLevels {
+ kDebugLevelScriptFuncs = 1 << 0, // prints debug output of o#_* functions
+ kDebugLevelScript = 1 << 1, // prints debug output of "EMCInterpreter" functions
+ kDebugLevelSprites = 1 << 2, // prints debug output of "Sprites" functions
+ kDebugLevelScreen = 1 << 3, // prints debug output of "Screen" functions
+ kDebugLevelSound = 1 << 4, // prints debug output of "Sound" functions
+ kDebugLevelAnimator = 1 << 5, // prints debug output of "ScreenAnimator" functions
+ kDebugLevelMain = 1 << 6, // prints debug output of common "KyraEngine(_v#)" functions && "TextDisplayer" functions
+ kDebugLevelGUI = 1 << 7, // prints debug output of "KyraEngine*" gui functions
+ kDebugLevelSequence = 1 << 8, // prints debug output of "SeqPlayer" functions
+ kDebugLevelMovie = 1 << 9, // prints debug output of movie specific funtions
+ kDebugLevelTimer = 1 << 10 // prints debug output of "TimerManager" functions
};
-struct BeadState {
- int16 x;
- int16 y;
- int16 width;
- int16 height;
- int16 dstX;
- int16 dstY;
- int16 width2;
- int16 unk8;
- int16 unk9;
- int16 tableIndex;
+enum kMusicDataID {
+ kMusicIntro = 0,
+ kMusicIngame,
+ kMusicFinale
};
-class KyraEngine_v1 : public KyraEngine {
- friend class MusicPlayer;
- friend class Debugger_v1;
- friend class Animator_v1;
- friend class GUI_v1;
+class Screen;
+class Resource;
+class Sound;
+class Movie;
+class TextDisplayer;
+class StaticResource;
+class TimerManager;
+class Debugger;
+
+class KyraEngine_v1 : public Engine {
+friend class Debugger;
+friend class ::KyraMetaEngine;
+friend class GUI;
public:
KyraEngine_v1(OSystem *system, const GameFlags &flags);
- ~KyraEngine_v1();
+ virtual ~KyraEngine_v1();
+
+ ::GUI::Debugger *getDebugger();
- Screen *screen() { return _screen; }
- Animator_v1 *animator() { return _animator; }
- virtual Movie *createWSAMovie();
+ virtual void pauseEngineIntern(bool pause);
- uint8 **shapes() { return _shapes; }
- Character *currentCharacter() { return _currentCharacter; }
- Character *characterList() { return _characterList; }
- uint16 brandonStatus() { return _brandonStatusBit; }
+ bool quit() const { return _quitFlag; }
- // TODO: remove me with workaround in animator.cpp l209
- uint16 getScene() { return _currentRoom; }
+ uint8 game() const { return _flags.gameID; }
+ const GameFlags &gameFlags() const { return _flags; }
- int _paletteChanged;
- int16 _northExitHeight;
+ // access to Kyra specific functionallity
+ Resource *resource() { return _res; }
+ virtual Screen *screen() = 0;
+ virtual TextDisplayer *text() { return _text; }
+ Sound *sound() { return _sound; }
+ StaticResource *staticres() { return _staticres; }
+ TimerManager *timer() { return _timer; }
- typedef void (KyraEngine_v1::*IntroProc)();
+ uint32 tickLength() const { return _tickLength; }
- // static data access
- const char * const*seqWSATable() { return _seq_WSATable; }
- const char * const*seqCPSTable() { return _seq_CPSTable; }
- const char * const*seqCOLTable() { return _seq_COLTable; }
- const char * const*seqTextsTable() { return _seq_textsTable; }
+ Common::RandomSource _rnd;
- const uint8 * const*palTable1() { return &_specialPalettes[0]; }
- const uint8 * const*palTable2() { return &_specialPalettes[29]; }
+ // input
+ void setMousePos(int x, int y);
+ Common::Point getMousePos() const;
+
+ // config specific
+ bool speechEnabled();
+ bool textEnabled();
+
+ enum kVolumeEntry {
+ kVolumeMusic = 0,
+ kVolumeSfx = 1,
+ kVolumeSpeech = 2
+ };
+
+ // volume reaches from 2 to 97
+ void setVolume(kVolumeEntry vol, uint8 value);
+ uint8 getVolume(kVolumeEntry vol);
+
+ // quit handling
+ virtual void quitGame();
+
+ // game flag handling
+ int setGameFlag(int flag);
+ int queryGameFlag(int flag) const;
+ int resetGameFlag(int flag);
+
+ // sound
+ virtual void snd_playTheme(int file, int track);
+ virtual void snd_playSoundEffect(int id, int volume=0xFF);
+ virtual void snd_playWanderScoreViaMap(int command, int restart);
+ virtual void snd_playVoiceFile(int id) = 0;
+ virtual bool snd_voiceIsPlaying();
+ virtual void snd_stopVoice();
+
+ // delay functionallity
+ virtual void delayUntil(uint32 timestamp, bool updateGameTimers = false, bool update = false, bool isMainLoop = false);
+ virtual void delay(uint32 millis, bool update = false, bool isMainLoop = false);
+ virtual void delayWithTicks(int ticks);
protected:
- virtual int go();
+ virtual int go() = 0;
virtual int init();
-public:
- // sequences
- // -> misc
- bool seq_skipSequence() const;
-protected:
- // -> demo
- void seq_demo();
-
- // -> intro
- void seq_intro();
- void seq_introLogos();
- void seq_introStory();
- void seq_introMalcolmTree();
- void seq_introKallakWriting();
- void seq_introKallakMalcolm();
-
- // -> ingame animations
- void seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly);
- void seq_brandonHealing();
- void seq_brandonHealing2();
- void seq_poisonDeathNow(int now);
- void seq_poisonDeathNowAnim();
- void seq_playFluteAnimation();
- void seq_winterScroll1();
- void seq_winterScroll2();
- void seq_makeBrandonInv();
- void seq_makeBrandonNormal();
- void seq_makeBrandonNormal2();
- void seq_makeBrandonWisp();
- void seq_dispelMagicAnimation();
- void seq_fillFlaskWithWater(int item, int type);
- void seq_playDrinkPotionAnim(int item, int unk2, int flags);
- void seq_brandonToStone();
-
- // -> end fight
- int seq_playEnd();
- void seq_playEnding();
-
- int handleMalcolmFlag();
- int handleBeadState();
- void initBeadState(int x, int y, int x2, int y2, int unk1, BeadState *ptr);
- int processBead(int x, int y, int &x2, int &y2, BeadState *ptr);
-
- // -> credits
- void seq_playCredits();
+ // quit Handling
+ bool _quitFlag;
-public:
- // delay
- void delayUntil(uint32 timestamp, bool updateGameTimers = false, bool update = false, bool isMainLoop = false);
- void delay(uint32 millis, bool update = false, bool isMainLoop = false);
- void delayWithTicks(int ticks);
- void waitForEvent();
-
- // TODO
- void registerDefaultSettings();
- void readSettings();
- void writeSettings();
-
- void snd_playSoundEffect(int track, int volume=0xFF);
- void snd_playWanderScoreViaMap(int command, int restart);
- virtual void snd_playVoiceFile(int id);
- void snd_voiceWaitForFinish(bool ingame = true);
+ // intern
+ Resource *_res;
+ Sound *_sound;
+ TextDisplayer *_text;
+ StaticResource *_staticres;
+ TimerManager *_timer;
+ EMCInterpreter *_emc;
+ Debugger *_debugger;
-protected:
- void saveGame(const char *fileName, const char *saveName);
- void loadGame(const char *fileName);
+ // config specific
+ virtual void registerDefaultSettings();
+ virtual void readSettings();
+ virtual void writeSettings();
-protected:
- // input
- void processInput();
- int processInputHelper(int xpos, int ypos);
- int clickEventHandler(int xpos, int ypos);
- void clickEventHandler2();
- void updateMousePointer(bool forceUpdate = false);
- bool hasClickedOnExit(int xpos, int ypos);
-
- bool _skipFlag;
- bool skipFlag() const { return _skipFlag; }
- void resetSkipFlag(bool removeEvent = true) { _skipFlag = false; }
-
- // scene
- // -> init
- void loadSceneMsc();
- void startSceneScript(int brandonAlive);
- void setupSceneItems();
- void initSceneData(int facing, int unk1, int brandonAlive);
- void initSceneObjectList(int brandonAlive);
- void initSceneScreen(int brandonAlive);
- void setupSceneResource(int sceneId);
-
- // -> process
- void enterNewScene(int sceneId, int facing, int unk1, int unk2, int brandonAlive);
- int handleSceneChange(int xpos, int ypos, int unk1, int frameReset);
- int processSceneChange(int *table, int unk1, int frameReset);
- int changeScene(int facing);
-
- // -> modification
- void transcendScenes(int roomIndex, int roomName);
- void setSceneFile(int roomIndex, int roomName);
-
- // -> pathfinder
- int findWay(int x, int y, int toX, int toY, int *moveTable, int moveTableSize);
- bool lineIsPassable(int x, int y);
-
- // -> item handling
- // --> misc
- void addItemToRoom(uint16 sceneId, uint8 item, int itemIndex, int x, int y);
-
- // --> drop handling
- void itemDropDown(int x, int y, int destX, int destY, byte freeItem, int item);
- int processItemDrop(uint16 sceneId, uint8 item, int x, int y, int unk1, int unk2);
- void dropItem(int unk1, int item, int x, int y, int unk2);
-
- // --> dropped item handling
- int countItemsInScene(uint16 sceneId);
- void exchangeItemWithMouseItem(uint16 sceneId, int itemIndex);
- byte findFreeItemInScene(int scene);
- byte findItemAtPos(int x, int y);
-
- // --> drop area handling
- void addToNoDropRects(int x, int y, int w, int h);
- void clearNoDropRects();
- int isDropable(int x, int y);
- int checkNoDropRects(int x, int y);
-
- // --> player items handling
- void updatePlayerItemsForScene();
-
- // --> item GFX handling
- void backUpItemRect0(int xpos, int ypos);
- void restoreItemRect0(int xpos, int ypos);
- void backUpItemRect1(int xpos, int ypos);
- void restoreItemRect1(int xpos, int ypos);
+ uint8 _configWalkspeed;
- // items
- // -> misc
- void placeItemInGenericMapScene(int item, int index);
-
- // -> mouse item
- void createMouseItem(int item);
- void destroyMouseItem();
- void setMouseItem(int item);
-
- // -> graphics effects
- void wipeDownMouseItem(int xpos, int ypos);
- void itemSpecialFX(int x, int y, int item);
- void itemSpecialFX1(int x, int y, int item);
- void itemSpecialFX2(int x, int y, int item);
- void magicOutMouseItem(int animIndex, int itemPos);
- void magicInMouseItem(int animIndex, int item, int itemPos);
- void specialMouseItemFX(int shape, int x, int y, int animIndex, int tableIndex, int loopStart, int maxLoops);
- void processSpecialMouseItemFX(int shape, int x, int y, int tableValue, int loopStart, int maxLoops);
-
- // character
- // -> movement
- void moveCharacterToPos(int character, int facing, int xpos, int ypos);
- void setCharacterPositionWithUpdate(int character);
- int setCharacterPosition(int character, int *facingTable);
- void setCharacterPositionHelper(int character, int *facingTable);
- void setCharactersPositions(int character);
-
- // -> brandon
- void setBrandonPoisonFlags(int reset);
- void resetBrandonPoisonFlags();
-
- // chat
- // -> process
- void characterSays(int vocFile, const char *chatStr, int8 charNum, int8 chatDuration);
- void waitForChatToFinish(int vocFile, int16 chatDuration, const char *str, uint8 charNum);
-
- // -> initialization
- int initCharacterChat(int8 charNum);
- void backupChatPartnerAnimFrame(int8 charNum);
- void restoreChatPartnerAnimFrame(int8 charNum);
- int8 getChatPartnerNum();
-
- // -> deinitialization
- void endCharacterChat(int8 charNum, int16 arg_4);
-
- // graphics
- // -> misc
- int findDuplicateItemShape(int shape);
- void updateKyragemFading();
-
- // -> interface
- void loadMainScreen(int page = 3);
- void redrawInventory(int page);
-public:
- void drawSentenceCommand(const char *sentence, int unk1);
- void updateSentenceCommand(const char *str1, const char *str2, int unk1);
- void updateTextFade();
+ int _configMusic;
+ bool _configSounds;
+ uint8 _configVoice;
-protected:
- // -> amulet
- void drawJewelPress(int jewel, int drawSpecial);
- void drawJewelsFadeOutStart();
- void drawJewelsFadeOutEnd(int jewel);
-
- // -> shape handling
- void setupShapes123(const Shape *shapeTable, int endShape, int flags);
- void freeShapes123();
-
- // misc (TODO)
- void startup();
- void mainLoop();
-
- int checkForNPCScriptRun(int xpos, int ypos);
- void runNpcScript(int func);
-
- void loadMouseShapes();
- void loadCharacterShapes();
- void loadSpecialEffectShapes();
- void loadItems();
- void loadButtonShapes();
- void initMainButtonList();
- void setCharactersInDefaultScene();
- void setupPanPages();
- void freePanPages();
- void closeFinalWsa();
-
- //void setTimer19();
- void setupTimers();
- void timerUpdateHeadAnims(int timerNum);
- void timerSetFlags1(int timerNum);
- void timerSetFlags2(int timerNum);
- void timerSetFlags3(int timerNum);
- void timerCheckAnimFlag1(int timerNum);
- void timerCheckAnimFlag2(int timerNum);
- void checkAmuletAnimFlags();
- void timerRedrawAmulet(int timerNum);
- void timerFadeText(int timerNum);
- void updateAnimFlag1(int timerNum);
- void updateAnimFlag2(int timerNum);
- void drawAmulet();
- void setTextFadeTimerCountdown(int16 countdown);
- void setWalkspeed(uint8 newSpeed);
-
- int buttonInventoryCallback(Button *caller);
- int buttonAmuletCallback(Button *caller);
-
- bool _skipIntroFlag;
- bool _abortIntroFlag;
- bool _menuDirectlyToLoad;
- bool _abortWalkFlag;
- bool _abortWalkFlag2;
- bool _mousePressFlag;
- uint8 *_itemBkgBackUp[2];
- uint8 *_shapes[373];
- int8 _itemInHand;
- int _mouseState;
- bool _handleInput;
- bool _changedScene;
- int _unkScreenVar1, _unkScreenVar2, _unkScreenVar3;
- int _beadStateVar;
- int _unkAmuletVar;
-
- int _malcolmFlag;
- int _endSequenceSkipFlag;
- int _endSequenceNeedLoading;
- int _unkEndSeqVar2;
- uint8 *_endSequenceBackUpRect;
- int _unkEndSeqVar4;
- int _unkEndSeqVar5;
- int _lastDisplayedPanPage;
- uint8 *_panPagesTable[20];
- Movie *_finalA, *_finalB, *_finalC;
-
- Movie *_movieObjects[10];
-
- uint16 _entranceMouseCursorTracks[8];
- uint16 _walkBlockNorth;
- uint16 _walkBlockEast;
- uint16 _walkBlockSouth;
- uint16 _walkBlockWest;
-
- int32 _scaleMode;
- int16 _scaleTable[145];
-
- Rect _noDropRects[11];
-
- int8 _birthstoneGemTable[4];
- int8 _idolGemsTable[3];
-
- int8 _marbleVaseItem;
- int8 _foyerItemTable[3];
-
- int8 _cauldronState;
- int8 _crystalState[2];
-
- uint16 _brandonStatusBit;
- uint8 _brandonStatusBit0x02Flag;
- uint8 _brandonStatusBit0x20Flag;
- uint8 _brandonPoisonFlagsGFX[256];
- uint8 _deathHandler;
- int16 _brandonInvFlag;
- uint8 _poisonDeathCounter;
- int _brandonPosX;
- int _brandonPosY;
-
- uint16 _currentChatPartnerBackupFrame;
- uint16 _currentCharAnimFrame;
-
- int8 *_sceneAnimTable[50];
-
- Item _itemTable[145];
- int _lastProcessedItem;
- int _lastProcessedItemHeight;
-
- int16 *_exitListPtr;
- int16 _exitList[11];
- SceneExits _sceneExits;
- uint16 _currentRoom;
- int _scenePhasingFlag;
-
- int _sceneChangeState;
- int _loopFlag2;
-
- int _pathfinderFlag;
- int _pathfinderFlag2;
- int _lastFindWayRet;
- int *_movFacingTable;
-
- int8 _talkingCharNum;
- int8 _charSayUnk2;
- int8 _charSayUnk3;
- int8 _currHeadShape;
- uint8 _currSentenceColor[3];
- int8 _startSentencePalIndex;
- bool _fadeText;
-
- uint8 _configTextspeed;
-
- Animator_v1 *_animator;
- SeqPlayer *_seq;
- Sprites *_sprites;
- Screen_v1 *_screen;
- Debugger *_debugger;
+ // game speed
+ virtual bool skipFlag() const = 0;
+ virtual void resetSkipFlag(bool removeEvent = true) = 0;
- EMCState _scriptMain;
-
- EMCState _npcScript;
- EMCData _npcScriptData;
-
- EMCState _scriptClick;
- EMCData _scriptClickData;
-
- Character *_characterList;
- Character *_currentCharacter;
-
- Button *_buttonList;
- GUI_v1 *_gui;
-
- struct KyragemState {
- uint16 nextOperation;
- uint16 rOffset;
- uint16 gOffset;
- uint16 bOffset;
- uint32 timerCount;
- } _kyragemFadingState;
-
- static const int8 _dosTrackMap[];
- static const int _dosTrackMapSize;
-
- // TODO: get rid of all variables having pointers to the static resources if possible
- // i.e. let them directly use the _staticres functions
- void initStaticResource();
-
- const uint8 *_seq_Forest;
- const uint8 *_seq_KallakWriting;
- const uint8 *_seq_KyrandiaLogo;
- const uint8 *_seq_KallakMalcolm;
- const uint8 *_seq_MalcolmTree;
- const uint8 *_seq_WestwoodLogo;
- const uint8 *_seq_Demo1;
- const uint8 *_seq_Demo2;
- const uint8 *_seq_Demo3;
- const uint8 *_seq_Demo4;
- const uint8 *_seq_Reunion;
-
- const char * const*_seq_WSATable;
- const char * const*_seq_CPSTable;
- const char * const*_seq_COLTable;
- const char * const*_seq_textsTable;
-
- int _seq_WSATable_Size;
- int _seq_CPSTable_Size;
- int _seq_COLTable_Size;
- int _seq_textsTable_Size;
-
- const char * const*_itemList;
- const char * const*_takenList;
- const char * const*_placedList;
- const char * const*_droppedList;
- const char * const*_noDropList;
- const char * const*_putDownFirst;
- const char * const*_waitForAmulet;
- const char * const*_blackJewel;
- const char * const*_poisonGone;
- const char * const*_healingTip;
- const char * const*_thePoison;
- const char * const*_fluteString;
- const char * const*_wispJewelStrings;
- const char * const*_magicJewelString;
- const char * const*_flaskFull;
- const char * const*_fullFlask;
- const char * const*_veryClever;
- const char * const*_homeString;
- const char * const*_newGameString;
-
- int _itemList_Size;
- int _takenList_Size;
- int _placedList_Size;
- int _droppedList_Size;
- int _noDropList_Size;
- int _putDownFirst_Size;
- int _waitForAmulet_Size;
- int _blackJewel_Size;
- int _poisonGone_Size;
- int _healingTip_Size;
- int _thePoison_Size;
- int _fluteString_Size;
- int _wispJewelStrings_Size;
- int _magicJewelString_Size;
- int _flaskFull_Size;
- int _fullFlask_Size;
- int _veryClever_Size;
- int _homeString_Size;
- int _newGameString_Size;
-
- const char * const*_characterImageTable;
- int _characterImageTableSize;
-
- const char * const*_guiStrings;
- int _guiStringsSize;
-
- const char * const*_configStrings;
- int _configStringsSize;
-
- Shape *_defaultShapeTable;
- int _defaultShapeTableSize;
-
- const Shape *_healingShapeTable;
- int _healingShapeTableSize;
- const Shape *_healingShape2Table;
- int _healingShape2TableSize;
-
- const Shape *_posionDeathShapeTable;
- int _posionDeathShapeTableSize;
-
- const Shape *_fluteAnimShapeTable;
- int _fluteAnimShapeTableSize;
-
- const Shape *_winterScrollTable;
- int _winterScrollTableSize;
- const Shape *_winterScroll1Table;
- int _winterScroll1TableSize;
- const Shape *_winterScroll2Table;
- int _winterScroll2TableSize;
-
- const Shape *_drinkAnimationTable;
- int _drinkAnimationTableSize;
-
- const Shape *_brandonToWispTable;
- int _brandonToWispTableSize;
-
- const Shape *_magicAnimationTable;
- int _magicAnimationTableSize;
-
- const Shape *_brandonStoneTable;
- int _brandonStoneTableSize;
-
- Room *_roomTable;
- int _roomTableSize;
- const char * const*_roomFilenameTable;
- int _roomFilenameTableSize;
-
- const uint8 *_amuleteAnim;
-
- const uint8 * const*_specialPalettes;
-
- const char *const *_soundFiles;
- int _soundFilesSize;
- const char *const *_soundFilesIntro;
- int _soundFilesIntroSize;
- const int32 *_cdaTrackTable;
- int _cdaTrackTableSize;
- const AudioDataStruct * _soundData;
-
- static const int8 _charXPosTable[];
- static const int8 _charYPosTable[];
-
- // positions of the inventory
- static const uint16 _itemPosX[];
- static const uint8 _itemPosY[];
-
- void setupButtonData();
- Button *_buttonData;
- Button **_buttonDataListPtr;
-
- static const uint8 _magicMouseItemStartFrame[];
- static const uint8 _magicMouseItemEndFrame[];
- static const uint8 _magicMouseItemStartFrame2[];
- static const uint8 _magicMouseItemEndFrame2[];
-
- static const uint16 _amuletX[];
- static const uint16 _amuletY[];
- static const uint16 _amuletX2[];
- static const uint16 _amuletY2[];
-protected:
- void setupOpcodeTable();
+ uint16 _tickLength;
+ uint16 _gameSpeed;
+
+ // run
+ int8 _deathHandler;
+
+ // timer
+ virtual void setupTimers() = 0;
+
+ virtual void setWalkspeed(uint8 speed) = 0;
+
+ // detection
+ GameFlags _flags;
+ int _lang;
+
+ // opcode
+ virtual void setupOpcodeTable() = 0;
+ Common::Array<const Opcode*> _opcodes;
- // Opcodes
- int o1_magicInMouseItem(EMCState *script);
- int o1_characterSays(EMCState *script);
- int o1_pauseTicks(EMCState *script);
- int o1_drawSceneAnimShape(EMCState *script);
int o1_queryGameFlag(EMCState *script);
int o1_setGameFlag(EMCState *script);
int o1_resetGameFlag(EMCState *script);
- int o1_runNPCScript(EMCState *script);
- int o1_setSpecialExitList(EMCState *script);
- int o1_blockInWalkableRegion(EMCState *script);
- int o1_blockOutWalkableRegion(EMCState *script);
- int o1_walkPlayerToPoint(EMCState *script);
- int o1_dropItemInScene(EMCState *script);
- int o1_drawAnimShapeIntoScene(EMCState *script);
- int o1_createMouseItem(EMCState *script);
- int o1_savePageToDisk(EMCState *script);
- int o1_sceneAnimOn(EMCState *script);
- int o1_sceneAnimOff(EMCState *script);
- int o1_getElapsedSeconds(EMCState *script);
- int o1_mouseIsPointer(EMCState *script);
- int o1_destroyMouseItem(EMCState *script);
- int o1_runSceneAnimUntilDone(EMCState *script);
- int o1_fadeSpecialPalette(EMCState *script);
- int o1_playAdlibSound(EMCState *script);
- int o1_playAdlibScore(EMCState *script);
- int o1_phaseInSameScene(EMCState *script);
- int o1_setScenePhasingFlag(EMCState *script);
- int o1_resetScenePhasingFlag(EMCState *script);
- int o1_queryScenePhasingFlag(EMCState *script);
- int o1_sceneToDirection(EMCState *script);
- int o1_setBirthstoneGem(EMCState *script);
- int o1_placeItemInGenericMapScene(EMCState *script);
- int o1_setBrandonStatusBit(EMCState *script);
- int o1_pauseSeconds(EMCState *script);
- int o1_getCharactersLocation(EMCState *script);
- int o1_runNPCSubscript(EMCState *script);
- int o1_magicOutMouseItem(EMCState *script);
- int o1_internalAnimOn(EMCState *script);
- int o1_forceBrandonToNormal(EMCState *script);
- int o1_poisonDeathNow(EMCState *script);
- int o1_setScaleMode(EMCState *script);
- int o1_openWSAFile(EMCState *script);
- int o1_closeWSAFile(EMCState *script);
- int o1_runWSAFromBeginningToEnd(EMCState *script);
- int o1_displayWSAFrame(EMCState *script);
- int o1_enterNewScene(EMCState *script);
- int o1_setSpecialEnterXAndY(EMCState *script);
- int o1_runWSAFrames(EMCState *script);
- int o1_popBrandonIntoScene(EMCState *script);
- int o1_restoreAllObjectBackgrounds(EMCState *script);
- int o1_setCustomPaletteRange(EMCState *script);
- int o1_loadPageFromDisk(EMCState *script);
- int o1_customPrintTalkString(EMCState *script);
- int o1_restoreCustomPrintBackground(EMCState *script);
+ int o1_getRand(EMCState *script);
int o1_hideMouse(EMCState *script);
int o1_showMouse(EMCState *script);
- int o1_getCharacterX(EMCState *script);
- int o1_getCharacterY(EMCState *script);
- int o1_changeCharactersFacing(EMCState *script);
- int o1_copyWSARegion(EMCState *script);
- int o1_printText(EMCState *script);
- int o1_random(EMCState *script);
- int o1_loadSoundFile(EMCState *script);
- int o1_displayWSAFrameOnHidPage(EMCState *script);
- int o1_displayWSASequentialFrames(EMCState *script);
- int o1_drawCharacterStanding(EMCState *script);
- int o1_internalAnimOff(EMCState *script);
- int o1_changeCharactersXAndY(EMCState *script);
- int o1_clearSceneAnimatorBeacon(EMCState *script);
- int o1_querySceneAnimatorBeacon(EMCState *script);
- int o1_refreshSceneAnimator(EMCState *script);
- int o1_placeItemInOffScene(EMCState *script);
- int o1_wipeDownMouseItem(EMCState *script);
- int o1_placeCharacterInOtherScene(EMCState *script);
- int o1_getKey(EMCState *script);
- int o1_specificItemInInventory(EMCState *script);
- int o1_popMobileNPCIntoScene(EMCState *script);
- int o1_mobileCharacterInScene(EMCState *script);
- int o1_hideMobileCharacter(EMCState *script);
- int o1_unhideMobileCharacter(EMCState *script);
- int o1_setCharactersLocation(EMCState *script);
- int o1_walkCharacterToPoint(EMCState *script);
- int o1_specialEventDisplayBrynnsNote(EMCState *script);
- int o1_specialEventRemoveBrynnsNote(EMCState *script);
- int o1_setLogicPage(EMCState *script);
- int o1_fatPrint(EMCState *script);
- int o1_preserveAllObjectBackgrounds(EMCState *script);
- int o1_updateSceneAnimations(EMCState *script);
- int o1_sceneAnimationActive(EMCState *script);
- int o1_setCharactersMovementDelay(EMCState *script);
- int o1_getCharactersFacing(EMCState *script);
- int o1_bkgdScrollSceneAndMasksRight(EMCState *script);
- int o1_dispelMagicAnimation(EMCState *script);
- int o1_findBrightestFireberry(EMCState *script);
- int o1_setFireberryGlowPalette(EMCState *script);
- int o1_setDeathHandlerFlag(EMCState *script);
- int o1_drinkPotionAnimation(EMCState *script);
- int o1_makeAmuletAppear(EMCState *script);
- int o1_drawItemShapeIntoScene(EMCState *script);
- int o1_setCharactersCurrentFrame(EMCState *script);
- int o1_waitForConfirmationMouseClick(EMCState *script);
- int o1_pageFlip(EMCState *script);
- int o1_setSceneFile(EMCState *script);
- int o1_getItemInMarbleVase(EMCState *script);
- int o1_setItemInMarbleVase(EMCState *script);
- int o1_addItemToInventory(EMCState *script);
- int o1_intPrint(EMCState *script);
- int o1_shakeScreen(EMCState *script);
- int o1_createAmuletJewel(EMCState *script);
- int o1_setSceneAnimCurrXY(EMCState *script);
- int o1_poisonBrandonAndRemaps(EMCState *script);
- int o1_fillFlaskWithWater(EMCState *script);
- int o1_getCharactersMovementDelay(EMCState *script);
- int o1_getBirthstoneGem(EMCState *script);
- int o1_queryBrandonStatusBit(EMCState *script);
- int o1_playFluteAnimation(EMCState *script);
- int o1_playWinterScrollSequence(EMCState *script);
- int o1_getIdolGem(EMCState *script);
- int o1_setIdolGem(EMCState *script);
- int o1_totalItemsInScene(EMCState *script);
- int o1_restoreBrandonsMovementDelay(EMCState *script);
int o1_setMousePos(EMCState *script);
+ int o1_setHandItem(EMCState *script);
+ int o1_removeHandItem(EMCState *script);
int o1_getMouseState(EMCState *script);
- int o1_setEntranceMouseCursorTrack(EMCState *script);
- int o1_itemAppearsOnGround(EMCState *script);
- int o1_setNoDrawShapesFlag(EMCState *script);
- int o1_fadeEntirePalette(EMCState *script);
- int o1_itemOnGroundHere(EMCState *script);
- int o1_queryCauldronState(EMCState *script);
- int o1_setCauldronState(EMCState *script);
- int o1_queryCrystalState(EMCState *script);
- int o1_setCrystalState(EMCState *script);
- int o1_setPaletteRange(EMCState *script);
- int o1_shrinkBrandonDown(EMCState *script);
- int o1_growBrandonUp(EMCState *script);
- int o1_setBrandonScaleXAndY(EMCState *script);
- int o1_resetScaleMode(EMCState *script);
- int o1_getScaleDepthTableValue(EMCState *script);
- int o1_setScaleDepthTableValue(EMCState *script);
- int o1_message(EMCState *script);
- int o1_checkClickOnNPC(EMCState *script);
- int o1_getFoyerItem(EMCState *script);
- int o1_setFoyerItem(EMCState *script);
- int o1_setNoItemDropRegion(EMCState *script);
- int o1_walkMalcolmOn(EMCState *script);
- int o1_passiveProtection(EMCState *script);
- int o1_setPlayingLoop(EMCState *script);
- int o1_brandonToStoneSequence(EMCState *script);
- int o1_brandonHealingSequence(EMCState *script);
- int o1_protectCommandLine(EMCState *script);
- int o1_pauseMusicSeconds(EMCState *script);
- int o1_resetMaskRegion(EMCState *script);
- int o1_setPaletteChangeFlag(EMCState *script);
+ int o1_setDeathHandler(EMCState *script);
+ int o1_playWanderScoreViaMap(EMCState *script);
int o1_fillRect(EMCState *script);
- int o1_dummy(EMCState *script);
- int o1_vocUnload(EMCState *script);
- int o1_vocLoad(EMCState *script);
+ int o1_blockInWalkableRegion(EMCState *script);
+ int o1_blockOutWalkableRegion(EMCState *script);
+ int o1_playSoundEffect(EMCState *script);
+
+ // items
+ int _mouseState;
+
+ virtual void setHandItem(uint16 item) = 0;
+ virtual void removeHandItem() = 0;
+
+ // game flags
+ uint8 _flagsTable[100]; // TODO: check this value
+
+ // sound
+ Common::String _speechFile;
+
+ int _curMusicTheme;
+ int _curSfxFile;
+ int16 _lastMusicCommand;
+
+ const int8 *_trackMap;
+ int _trackMapSize;
+
+ // pathfinder
+ virtual int findWay(int x, int y, int toX, int toY, int *moveTable, int moveTableSize);
+ int findSubPath(int x, int y, int toX, int toY, int *moveTable, int start, int end);
+ int getFacingFromPointToPoint(int x, int y, int toX, int toY);
+ int getOppositeFacingDirection(int dir);
+ void changePosTowardsFacing(int &x, int &y, int facing);
+ int getMoveTableSize(int *moveTable);
+ virtual bool lineIsPassable(int x, int y) = 0;
+
+ static const int8 _addXPosTable[];
+ static const int8 _addYPosTable[];
+
+ // Character
+
+ static const int8 _charAddXPosTable[];
+ static const int8 _charAddYPosTable[];
+
+ // save/load
+ int _gameToLoad;
+
+ const char *getSavegameFilename(int num);
+ bool saveFileLoadable(int slot);
+
+ struct SaveHeader {
+ Common::String description;
+ uint32 version;
+ byte gameID;
+ uint32 flags;
+
+ bool originalSave; // savegame from original interpreter
+ bool oldHeader; // old scummvm save header
+ };
+
+ enum kReadSaveHeaderError {
+ kRSHENoError = 0,
+ kRSHEInvalidType = 1,
+ kRSHEInvalidVersion = 2,
+ kRSHEIoError = 3
+ };
+
+ static kReadSaveHeaderError readSaveHeader(Common::InSaveFile *file, SaveHeader &header);
+
+ Common::InSaveFile *openSaveForReading(const char *filename, SaveHeader &header);
+ Common::OutSaveFile *openSaveForWriting(const char *filename, const char *saveName) const;
};
-} // end of namespace Kyra
+} // End of namespace Kyra
#endif