diff options
Diffstat (limited to 'engines/kyra/kyra_v1.h')
-rw-r--r-- | engines/kyra/kyra_v1.h | 973 |
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 |