diff options
Diffstat (limited to 'engines/kyra/kyra_v2.h')
-rw-r--r-- | engines/kyra/kyra_v2.h | 375 |
1 files changed, 370 insertions, 5 deletions
diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index a002baec19..c87eeb66d4 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -26,6 +26,10 @@ #ifndef KYRA_KYRA_V2_H #define KYRA_KYRA_V2_H +#include "kyra/kyra.h" +#include "kyra/script.h" +#include "kyra/screen_v2.h" + namespace Kyra { enum kSequences { @@ -82,12 +86,25 @@ class KyraEngine_v2 : public KyraEngine { public: KyraEngine_v2(OSystem *system, const GameFlags &flags); ~KyraEngine_v2(); + + virtual Screen *screen() { return _screen; } + Screen_v2 *screen_v2() { return _screen; } + + Movie *createWSAMovie(); +protected: + // Main menu code, also used for Kyra 3 + static const char *_mainMenuStrings[]; - int go(); - -private: - void setupOpcodeTable() {} + virtual void gui_initMainMenu() {} + int gui_handleMainMenu(); + virtual void gui_updateMainMenuAnimation(); + void gui_drawMainMenu(const char * const *strings, int select); + void gui_drawMainBox(int x, int y, int w, int h, int fill); + bool gui_mainMenuGetInput(); + + void gui_printString(const char *string, int x, int y, int col1, int col2, int flags, ...); + // intro void seq_playSequences(int startSeq, int endSeq = -1); int seq_introWestwood(int seqNum); int seq_introTitle(int seqNum); @@ -111,11 +128,14 @@ private: void seq_setChatEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 unk1); void mainMenu(); + int init(); + int go(); + + Screen_v2 *_screen; ActiveWSA *_activeWSA; ActiveChat *_activeChat; - uint8 *_gameShapes[50]; uint8 *_mouseSHPBuf; static const char *_introSoundList[]; @@ -124,6 +144,351 @@ private: static const int _introStringsSize; int _introStringsDuration[21]; + +protected: + // game initialization + void startup(); + void runLoop(); + void cleanup(); + + void setupTimers(); + void setupOpcodeTable(); + + void loadMouseShapes(); + void loadItemShapes(); + + // run + int update(); + void updateMouse(); + + int checkInput(void *p); + void handleInput(int x, int y); + + int inputSceneChange(int x, int y, int unk1, int unk2); + + // gfx/animation specific + uint8 *_gamePlayBuffer; + void restorePage3(); + + uint8 *_screenBuffer; + uint8 *_maskPage; + uint8 *_gfxBackUpRect; + + uint8 *getShapePtr(int index) { return _defaultShapeTable[index]; } + uint8 *_defaultShapeTable[250]; + uint8 *_sceneShapeTable[50]; + + WSAMovieV2 *_wsaSlots[10]; + + void freeSceneShapePtrs(); + + struct ShapeDesc { + uint8 unk0, unk1, unk2, unk3, unk4; + uint16 unk5, unk7; + int16 xAdd, yAdd; + }; + + ShapeDesc *_shapeDescTable; + + struct SceneAnim { + uint16 flags; + int16 x, y; + int16 x2, y2; + int16 width, height; + uint16 unkE; + uint16 specialSize; + uint16 unk12; + int16 shapeIndex; + uint16 wsaFlag; + char filename[14]; + }; + + SceneAnim _sceneAnims[10]; + WSAMovieV2 *_sceneAnimMovie[10]; + bool _specialSceneScriptState[10]; + ScriptState _sceneSpecialScripts[10]; + uint32 _sceneSpecialScriptsTimer[10]; + int _lastProcessedSceneScript; + bool _specialSceneScriptRunFlag; + + void updateSpecialSceneScripts(); + void freeSceneAnims(); + + int _loadedZTable; + void loadZShapes(int shapes); + void loadInventoryShapes(); + + void resetScaleTable(); + void setScaleTableItem(int item, int data); + int getScale(int x, int y); + uint16 _scaleTable[15]; + + void setDrawLayerTableEntry(int entry, int data); + int getDrawLayer(int x, int y); + int _drawLayerTable[15]; + + // animator + struct AnimObj { + uint16 index; + uint16 type; + uint16 enabled; + uint16 needRefresh; + uint16 unk8; + uint16 animFlags; + uint16 flags; + int16 xPos1, yPos1; + uint8 *shapePtr; + uint16 shapeIndex1; + uint16 animNum; + uint16 shapeIndex3; + uint16 shapeIndex2; + uint16 unk1E; + uint8 unk20; + uint8 unk21; + uint8 unk22; + uint8 unk23; + int16 xPos2, yPos2; + int16 xPos3, yPos3; + int16 width, height; + int16 width2, height2; + AnimObj *nextObject; + }; + + AnimObj _animObjects[42]; + void clearAnimObjects(); + + AnimObj *_animList; + bool _drawNoShapeFlag; + AnimObj *initAnimList(AnimObj *list, AnimObj *entry); + AnimObj *addToAnimListSorted(AnimObj *list, AnimObj *entry); + AnimObj *deleteAnimListEntry(AnimObj *list, AnimObj *entry); + + void drawAnimObjects(); + void drawSceneAnimObject(AnimObj *obj, int x, int y, int drawLayer); + void drawCharacterAnimObject(AnimObj *obj, int x, int y, int drawLayer); + + void refreshAnimObjects(int force); + void refreshAnimObjectsIfNeed(); + + void updateCharacterAnim(int); + void updateSceneAnim(int anim, int newFrame); + + // scene + struct SceneDesc { + char filename[10]; + uint16 exit1, exit2, exit3, exit4; + uint8 flags; + uint8 sound; + }; + + SceneDesc *_sceneList; + const char *_sceneCommentString; + uint16 _sceneExit1, _sceneExit2, _sceneExit3, _sceneExit4; + int _sceneEnterX1, _sceneEnterY1, _sceneEnterX2, _sceneEnterY2, + _sceneEnterX3, _sceneEnterY3, _sceneEnterX4, _sceneEnterY4; + int _specialExitCount; + uint16 _specialExitTable[25]; + bool checkSpecialSceneExit(int num, int x, int y); + uint8 _scenePal[688]; + bool _overwriteSceneFacing; + + void enterNewScene(uint16 newScene, int facing, int unk1, int unk2, int unk3); + void enterNewSceneUnk1(int facing, int unk1, int unk2); + void enterNewSceneUnk2(int unk1); + void unloadScene(); + + void loadScenePal(); + void loadSceneMsc(); + + void startSceneScript(int unk1); + void runSceneScript2(); + void runSceneScript4(int unk1); + void runSceneScript7(); + + void initSceneAnims(int unk1); + void initSceneScreen(int unk1); + + int trySceneChange(int *moveTable, int unk1, int updateChar); + int checkSceneChange(); + + // pathfinder + int _movFacingTable[600]; + int findWay(int curX, int curY, int dstX, int dstY, int *moveTable, int moveTableSize); + bool lineIsPassable(int x, int y); + bool directLinePassable(int x, int y, int toX, int toY); + + int pathfinderUnk1(int *moveTable); + int pathfinderUnk2(int index, int v1, int v2); + int pathfinderUnk3(int tableLen, int x, int y); + int pathfinderUnk4(int index, int v); + void pathfinderUnk5(int *moveTable, int unk1, int x, int y, int moveTableSize); + + int _pathfinderUnkTable1[400]; + int _pathfinderUnkTable2[200]; + + // item + uint8 _itemHtDat[176]; + + struct Item { + uint16 id; + uint16 sceneId; + int16 x; + int8 y; + uint16 unk7; + }; + Item *_itemList; + + int findFreeItem(); + int findItem(uint16 sceneId, int id); + void resetItemList(); + + int _itemInHand; + int _handItemSet; + + // inventroy + static int _inventoryX[]; + static int _inventoryY[]; + + // localization + void loadCCodeBuffer(const char *file); + void loadOptionsBuffer(const char *file); + void loadChapterBuffer(int chapter); + uint8 *_optionsBuffer; + uint8 *_cCodeBuffer; + + uint8 *_chapterBuffer; + int _currentChapter; + int _newChapterFile; + + const uint8 *getTableEntry(const uint8 *buffer, int id); + const char *getTableString(int id, const uint8 *buffer, int decode); + const char *getChapterString(int id); + int decodeString1(const char *src, char *dst); + void decodeString2(const char *src, char *dst); + + void changeFileExtension(char *buffer); + + char _internStringBuf[200]; + static const char *_languageExtension[]; + static const char *_scriptLangExt[]; + + // character + struct Character { + uint16 sceneId; + uint16 unk2; + uint8 height; + uint8 facing; + uint16 animFrame; + uint8 unk8; + uint8 unk9; + uint8 unkA; + uint16 inventory[20]; + int16 x1, y1; + int16 x2, y2; + }; + + Character _mainCharacter; + bool _useCharPal; + int _charPalEntry; + uint8 _charPalTable[16]; + void updateCharPal(int unk1); + + void moveCharacter(int facing, int x, int y); + int updateCharPos(int *table); + void updateCharPosWithUpdate(); + void updateCharAnimFrame(int num, int *table); + + int checkCharCollision(int x, int y); + + int _mainCharX, _mainCharY; + int _charScaleX, _charScaleY; + + static int _characterFrameTable[]; + + // text + void showMessageFromCCode(int id, int16 palIndex, int); + void showMessage(const char *string, int16 palIndex); + void showChapterMessage(int id, int16 palIndex); + + const char *_shownMessage; + + byte _messagePal[3]; + int _msgUnk1; + + // timer + void timerFunc2(int); + void timerFunc3(int); + void timerFunc4(int); + void timerFunc5(int); + void timerFunc6(int); + + void setTimer1DelaySecs(int secs); + + // opcodes + int o2_setCharacterFacingRefresh(ScriptState *script); + int o2_defineObject(ScriptState *script); + int o2_refreshCharacter(ScriptState *script); + int o2_getCharacterX(ScriptState *script); + int o2_getCharacterY(ScriptState *script); + int o2_getCharacterFacing(ScriptState *script); + int o2_setSceneComment(ScriptState *script); + int o2_showChapterMessage(ScriptState *script); + int o2_wsaClose(ScriptState *script); + int o2_displayWsaFrame(ScriptState *script); + int o2_displayWsaSequentialFrames(ScriptState *script); + int o2_wsaOpen(ScriptState *script); + int o2_defineItem(ScriptState *script); + int o2_queryGameFlag(ScriptState *script); + int o2_resetGameFlag(ScriptState *script); + int o2_setGameFlag(ScriptState *script); + int o2_hideMouse(ScriptState *script); + int o2_addSpecialExit(ScriptState *script); + int o2_showMouse(ScriptState *script); + int o2_setScaleTableItem(ScriptState *script); + int o2_setDrawLayerTableItem(ScriptState *script); + int o2_drawSceneShapeOnPage(ScriptState *script); + int o2_restoreBackBuffer(ScriptState *script); + int o2_getRand(ScriptState *script); + int o2_encodeShape(ScriptState *script); + int o2_defineRoomEntrance(ScriptState *script); + int o2_setSpecialSceneScriptRunTime(ScriptState *script); + int o2_defineSceneAnim(ScriptState *script); + int o2_updateSceneAnim(ScriptState *script); + int o2_defineRoom(ScriptState *script); + int o2_setSpecialSceneScriptState(ScriptState *script); + int o2_clearSpecialSceneScriptState(ScriptState *script); + int o2_querySpecialSceneScriptState(ScriptState *script); + int o2_dummy(ScriptState *script); + + // script + void runStartScript(int script, int unk1); + void loadNPCScript(); + + bool _noScriptEnter; + + ScriptData _npcScriptData; + + ScriptData _sceneScriptData; + ScriptState _sceneScriptState; + + // pathfinder + int _pathfinderFlag; + + // unk + struct Object { + char filename[13]; + uint8 scriptId; + int16 x, y; + int8 unk12; + }; + Object *_objectList; + + uint8 *_unkBuf500Bytes; + uint8 *_unkBuf200kByte; + bool _unkFlag1; + int _unk3, _unk4, _unk5; + bool _unkSceneScreenFlag1; + bool _unkHandleSceneChangeFlag; }; } // end of namespace Kyra |