aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJohannes Schickel2008-05-02 16:34:46 +0000
committerJohannes Schickel2008-05-02 16:34:46 +0000
commitaaad3ccb3e6220af43449d1e6592bb7cd1990bfe (patch)
tree51e2752285564c9b03af73c920b987a134b11b4f /engines
parente7fec26e03b862959d5799ce7811a2fdb68f5cae (diff)
downloadscummvm-rg350-aaad3ccb3e6220af43449d1e6592bb7cd1990bfe.tar.gz
scummvm-rg350-aaad3ccb3e6220af43449d1e6592bb7cd1990bfe.tar.bz2
scummvm-rg350-aaad3ccb3e6220af43449d1e6592bb7cd1990bfe.zip
Added missing file.
svn-id: r31828
Diffstat (limited to 'engines')
-rw-r--r--engines/kyra/kyra_hof.h987
1 files changed, 987 insertions, 0 deletions
diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h
new file mode 100644
index 0000000000..73257920a0
--- /dev/null
+++ b/engines/kyra/kyra_hof.h
@@ -0,0 +1,987 @@
+/* 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 KYRA_KYRA_HOF_H
+#define KYRA_KYRA_HOF_H
+
+#include "kyra/kyra_v2.h"
+#include "kyra/script.h"
+#include "kyra/script_tim.h"
+#include "kyra/screen_hof.h"
+#include "kyra/text_hof.h"
+#include "kyra/gui_v2.h"
+
+#include "common/list.h"
+#include "common/func.h"
+
+namespace Kyra {
+
+enum kSequences {
+ kSequenceVirgin = 0,
+ kSequenceWestwood,
+ kSequenceTitle,
+ kSequenceOverview,
+ kSequenceLibrary,
+ kSequenceHand,
+ kSequencePoint,
+ kSequenceZanfaun,
+
+ kSequenceFunters,
+ kSequenceFerb,
+ kSequenceFish,
+ kSequenceFheep,
+ kSequenceFarmer,
+ kSequenceFuards,
+ kSequenceFirates,
+ kSequenceFrash,
+
+ kSequenceArraySize
+};
+
+enum kNestedSequences {
+ kSequenceFiggle = 0,
+ kSequenceOver1,
+ kSequenceOver2,
+ kSequenceForest,
+ kSequenceDragon,
+ kSequenceDarm,
+ kSequenceLibrary2,
+ kSequenceLibrary3,
+ kSequenceMarco,
+ kSequenceHand1a,
+ kSequenceHand1b,
+ kSequenceHand1c,
+ kSequenceHand2,
+ kSequenceHand3,
+ kSequenceHand4
+};
+
+enum kSequencesDemo {
+ kSequenceDemoVirgin = 0,
+ kSequenceDemoWestwood,
+ kSequenceDemoTitle,
+ kSequenceDemoHill,
+ kSequenceDemoOuthome,
+ kSequenceDemoWharf,
+ kSequenceDemoDinob,
+ kSequenceDemoFisher
+};
+
+enum kNestedSequencesDemo {
+ kSequenceDemoWharf2 = 0,
+ kSequenceDemoDinob2,
+ kSequenceDemoWater,
+ kSequenceDemoBail,
+ kSequenceDemoDig
+};
+
+class WSAMovieV2;
+class KyraEngine_HoF;
+class TextDisplayer_HoF;
+class Debugger_v2;
+
+struct TIM;
+
+typedef int (KyraEngine_HoF::*SeqProc)(WSAMovieV2*, int, int, int);
+
+struct FrameControl {
+ uint16 index;
+ uint16 delay;
+};
+
+struct ActiveWSA {
+ int16 flags;
+ WSAMovieV2 *movie;
+ uint16 startFrame;
+ uint16 endFrame;
+ uint16 frameDelay;
+ SeqProc callback;
+ uint32 nextFrame;
+ uint16 currentFrame;
+ uint16 lastFrame;
+ uint16 x;
+ uint16 y;
+ const FrameControl *control;
+ uint16 startupCommand;
+ uint16 finalCommand;
+};
+
+struct ActiveText {
+ uint16 strIndex;
+ uint16 x;
+ uint16 y;
+ int duration;
+ uint16 width;
+ uint32 startTime;
+ int16 textcolor;
+};
+
+struct Sequence {
+ uint16 flags;
+ const char * wsaFile;
+ const char * cpsFile;
+ uint8 startupCommand;
+ uint8 finalCommand;
+ int16 stringIndex1;
+ int16 stringIndex2;
+ uint16 startFrame;
+ uint16 numFrames;
+ uint16 frameDelay;
+ uint16 xPos;
+ uint16 yPos;
+ uint16 duration;
+};
+
+struct NestedSequence {
+ uint16 flags;
+ const char * wsaFile;
+ uint16 startframe;
+ uint16 endFrame;
+ uint16 frameDelay;
+ uint16 x;
+ uint16 y;
+ const FrameControl *wsaControl;
+ uint16 startupCommand;
+ uint16 finalCommand;
+};
+
+struct HofSeqData {
+ const Sequence *seq;
+ int numSeq;
+ const NestedSequence *seqn;
+ int numSeqn;
+};
+
+struct ItemAnimData_v1 {
+ int16 itemIndex;
+ uint16 y;
+ const uint16 *frames;
+};
+
+struct ItemAnimData_v2 {
+ int16 itemIndex;
+ uint8 numFrames;
+ const FrameControl *frames;
+};
+
+struct ActiveItemAnim {
+ uint16 currentFrame;
+ uint32 nextFrame;
+};
+
+class KyraEngine_HoF : public KyraEngine_v2 {
+friend class Debugger_v2;
+friend class TextDisplayer_HoF;
+friend class GUI_v2;
+public:
+ KyraEngine_HoF(OSystem *system, const GameFlags &flags);
+ ~KyraEngine_HoF();
+
+ Screen *screen() { return _screen; }
+ Screen_v2 *screen_v2() const { return _screen; }
+ virtual TextDisplayer *text() { return _text; }
+ int language() const { return _lang; }
+protected:
+ // KyraEngine_v2 API
+ int getFirstSpecialSceneScript() const { return 8; }
+
+ // intro/outro
+ void seq_playSequences(int startSeq, int endSeq = -1);
+
+ int seq_introWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introTitle(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introOverview(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introLibrary(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introHand(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introPoint(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introZanfaun(WSAMovieV2 *wsaObj, int x, int y, int frm);
+
+ int seq_introOver1(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introOver2(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introForest(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introDragon(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introDarm(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introLibrary2(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introMarco(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introHand1a(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introHand1b(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introHand1c(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introHand2(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_introHand3(WSAMovieV2 *wsaObj, int x, int y, int frm);
+
+ int seq_finaleFunters(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFerb(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFish(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFheep(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFarmer(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFuards(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFirates(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm);
+
+ int seq_finaleFiggle(WSAMovieV2 *wsaObj, int x, int y, int frm);
+
+ int seq_demoVirgin(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoTitle(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoHill(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoOuthome(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoWharf(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoDinob(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoFisher(WSAMovieV2 *wsaObj, int x, int y, int frm);
+
+ int seq_demoWharf2(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoDinob2(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoWater(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoBail(WSAMovieV2 *wsaObj, int x, int y, int frm);
+ int seq_demoDig(WSAMovieV2 *wsaObj, int x, int y, int frm);
+
+ void seq_sequenceCommand(int command);
+ void seq_loadNestedSequence(int wsaNum, int seqNum);
+ void seq_nestedSequenceFrame(int command, int wsaNum);
+ void seq_animatedSubFrame(int srcPage, int dstPage, int delaytime,
+ int steps, int x, int y, int w, int h, int openClose, int directionFlags);
+ bool seq_processNextSubFrame(int wsaNum);
+ void seq_resetActiveWSA(int wsaNum);
+ void seq_unloadWSA(int wsaNum);
+ void seq_processWSAs();
+ void seq_cmpFadeFrame(const char *cmpFile);
+ void seq_playTalkText(uint8 chatNum);
+ void seq_resetAllTextEntries();
+ uint32 seq_activeTextsTimeLeft();
+ void seq_waitForTextsTimeout();
+ int seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width);
+ void seq_processText();
+ char *seq_preprocessString(const char *str, int width);
+ void seq_printCreditsString(uint16 strIndex, int x, int y, const uint8 *colorMap, uint8 textcolor);
+ void seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width,
+ WSAMovieV2 * wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos);
+ void seq_finaleActorScreen();
+ void seq_displayScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData = 0, const char *const *specialData = 0);
+ void seq_scrollPage();
+ void seq_showStarcraftLogo();
+
+ void seq_init();
+ void seq_uninit();
+
+ int init();
+ int go();
+
+ Screen_HoF *_screen;
+ TextDisplayer_HoF *_text;
+ Debugger_v2 *_debugger;
+ TIMInterpreter *_tim;
+
+ uint8 *_mouseSHPBuf;
+
+ static const int8 _dosTrackMap[];
+ static const int _dosTrackMapSize;
+
+ const AudioDataStruct *_soundData;
+
+protected:
+ // game initialization
+ void startup();
+ void runLoop();
+ void cleanup();
+
+ void registerDefaultSettings();
+ void writeSettings();
+ void readSettings();
+ uint8 _configTextspeed;
+
+ // 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();
+
+ void setupTimers();
+ void setupOpcodeTable();
+
+ void loadMouseShapes();
+ void loadItemShapes();
+
+ // run
+ bool _runFlag;
+ bool _showCredits;
+
+ void update();
+ void updateWithText();
+
+ Common::Functor0Mem<void, KyraEngine_HoF> _updateFunctor;
+
+ void updateMouse();
+
+ void dinoRide();
+
+ int _mouseState;
+
+ int checkInput(Button *buttonList, bool mainLoop = false);
+ void handleInput(int x, int y);
+ bool handleInputUnkSub(int x, int y);
+
+ int inputSceneChange(int x, int y, int unk1, int unk2);
+
+ // gfx/animation specific
+ uint8 *_screenBuffer;
+ bool _inventorySaved;
+ void backUpPage0();
+ void restorePage0();
+
+ uint8 *_gfxBackUpRect;
+
+ void backUpGfxRect24x24(int x, int y);
+ void restoreGfxRect24x24(int x, int y);
+ void backUpGfxRect32x32(int x, int y);
+ void restoreGfxRect32x32(int x, int y);
+
+ uint8 *_sceneShapeTable[50];
+
+ WSAMovieV2 *_wsaSlots[10];
+
+ void freeSceneShapePtrs();
+
+ struct ShapeDesc {
+ uint8 unk0, unk1, unk2, unk3, unk4;
+ uint16 width, height;
+ int16 xAdd, yAdd;
+ };
+
+ ShapeDesc *_shapeDescTable;
+
+ void loadCharacterShapes(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];
+
+ int _layerFlagTable[16]; // seems to indicate layers where items get destroyed when dropped to (TODO: check this!)
+
+ char _newShapeFilename[13];
+ int _newShapeLastEntry;
+ int _newShapeWidth, _newShapeHeight;
+ int _newShapeXAdd, _newShapeYAdd;
+ int _newShapeFlag;
+ uint8 *_newShapeFiledata;
+ int _newShapeCount;
+ int _newShapeAnimFrame;
+ int _newShapeDelay;
+
+ int initNewShapes(uint8 *filedata);
+ void processNewShapes(int allowSkip, int resetChar);
+ void resetNewShapes(int count, uint8 *filedata);
+
+ // animator
+ uint8 *_gamePlayBuffer;
+ void restorePage3();
+
+ AnimObj _animObjects[42];
+ void clearAnimObjects();
+
+ void refreshAnimObjects(int force);
+
+ void drawAnimObjects();
+ void drawSceneAnimObject(AnimObj *obj, int x, int y, int drawLayer);
+ void drawCharacterAnimObject(AnimObj *obj, int x, int y, int drawLayer);
+
+ void updateItemAnimations();
+
+ void updateCharFacing();
+ void updateCharacterAnim(int);
+ void updateSceneAnim(int anim, int newFrame);
+
+ void addItemToAnimList(int item);
+ void deleteItemAnimEntry(int item);
+
+ int _animObj0Width, _animObj0Height;
+ void setCharacterAnimDim(int w, int h);
+ void resetCharacterAnimDim();
+
+ // scene
+ const char *_sceneCommentString;
+ uint8 _scenePal[688];
+
+ 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 fadeScenePal(int srcIndex, int delay);
+
+ 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
+ bool lineIsPassable(int x, int y);
+
+ // item
+ void setMouseCursor(uint16 item);
+
+ uint8 _itemHtDat[176];
+ uint16 _hiddenItems[20];
+
+ int checkItemCollision(int x, int y);
+ void updateWaterFlasks();
+
+ bool dropItem(int unk1, uint16 item, int x, int y, int unk2);
+ bool processItemDrop(uint16 sceneId, uint16 item, int x, int y, int unk1, int unk2);
+ void itemDropDown(int startX, int startY, int dstX, int dstY, int itemSlot, uint16 item);
+ void exchangeMouseItem(int itemPos);
+ bool pickUpItem(int x, int y);
+
+ bool isDropable(int x, int y);
+
+ static const byte _itemStringMap[];
+ static const int _itemStringMapSize;
+
+ static const int16 _flaskTable[];
+ bool itemIsFlask(int item);
+
+ // inventory
+ static const int _inventoryX[];
+ static const int _inventoryY[];
+ static const uint16 _itemMagicTable[];
+
+ int getInventoryItemSlot(uint16 item);
+ void removeItemFromInventory(int slot);
+ bool checkInventoryItemExchange(uint16 item, int slot);
+ void drawInventoryShape(int page, uint16 item, int slot);
+ void clearInventorySlot(int slot, int page);
+ void redrawInventory(int page);
+ void scrollInventoryWheel();
+ int findFreeVisibleInventorySlot();
+
+ ActiveItemAnim _activeItemAnim[15];
+ int _nextAnimItem;
+
+ // gui
+ bool _menuDirectlyToLoad;
+ GUI_v2 *_gui;
+
+ void loadButtonShapes();
+ void setupLangButtonShapes();
+ uint8 *_buttonShapes[19];
+
+ void initInventoryButtonList();
+ Button *_inventoryButtons;
+ Button *_buttonList;
+
+ int scrollInventory(Button *button);
+ int buttonInventory(Button *button);
+ int bookButton(Button *button);
+ int cauldronButton(Button *button);
+ int cauldronClearButton(Button *button);
+
+ // book
+ static const int _bookPageYOffset[];
+ static const byte _bookTextColorMap[];
+
+ int _bookMaxPage;
+ int _bookNewPage;
+ int _bookCurPage;
+ int _bookBkgd;
+ bool _bookShown;
+
+ void loadBookBkgd();
+ void showBookPage();
+ void bookLoop();
+
+ void bookDecodeText(uint8 *text);
+ void bookPrintText(int dstPage, const uint8 *text, int x, int y, uint8 color);
+
+ int bookPrevPage(Button *button);
+ int bookNextPage(Button *button);
+ int bookClose(Button *button);
+
+ // cauldron
+ uint8 _cauldronState;
+ int16 _cauldronUseCount;
+ int16 _cauldronTable[25];
+ int16 _cauldronStateTables[23][7];
+
+ static const int16 _cauldronProtectedItems[];
+ static const int16 _cauldronBowlTable[];
+ static const int16 _cauldronMagicTable[];
+ static const int16 _cauldronMagicTableScene77[];
+ static const uint8 _cauldronStateTable[];
+
+ void resetCauldronStateTable(int idx);
+ bool addToCauldronStateTable(int data, int idx);
+
+ void setCauldronState(uint8 state, bool paletteFade);
+ void clearCauldronTable();
+ void addFrontCauldronTable(int item);
+ void cauldronItemAnim(int item);
+ void cauldronRndPaletteFade();
+ bool updateCauldron();
+ void listItemsInCauldron();
+
+ // 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;
+
+ uint8 *getTableEntry(uint8 *buffer, int id);
+ char *getTableString(int id, 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);
+
+ // - Just used in French version
+ int getItemCommandStringDrop(uint16 item);
+ int getItemCommandStringPickUp(uint16 item);
+ int getItemCommandStringInv(uint16 item);
+ // -
+
+ char _internStringBuf[200];
+ static const char *_languageExtension[];
+ static const char *_scriptLangExt[];
+
+ // character
+ int8 _deathHandler;
+ bool _useCharPal;
+ int _charPalEntry;
+ uint8 _charPalTable[16];
+ void updateCharPal(int unk1);
+ void setCharPalEntry(int entry, int value);
+
+ int getCharacterWalkspeed() const;
+ void updateCharAnimFrame(int num, int *table);
+
+ bool checkCharCollision(int x, int y);
+
+ static const int _characterFrameTable[];
+
+ // text
+ void showMessageFromCCode(int id, int16 palIndex, int);
+ void showMessage(const char *string, int16 palIndex);
+ void showChapterMessage(int id, int16 palIndex);
+
+ void updateCommandLineEx(int str1, int str2, int16 palIndex);
+
+ const char *_shownMessage;
+
+ byte _messagePal[3];
+ bool _fadeMessagePalette;
+ void fadeMessagePalette();
+
+ // chat
+ int _vocHigh;
+
+ const char *_chatText;
+ int _chatObject;
+ bool _chatIsNote;
+ uint32 _chatEndTime;
+ int _chatVocHigh, _chatVocLow;
+
+ EMCData _chatScriptData;
+ EMCState _chatScriptState;
+
+ int chatGetType(const char *text);
+ int chatCalcDuration(const char *text);
+
+ void objectChat(const char *text, int object, int vocHigh = -1, int vocLow = -1);
+ void objectChatInit(const char *text, int object, int vocHigh = -1, int vocLow = -1);
+ void objectChatPrintText(const char *text, int object);
+ void objectChatProcess(const char *script);
+ void objectChatWaitToFinish();
+
+ void startDialogue(int dlgIndex);
+
+ void zanthSceneStartupChat();
+ void zanthRandomIdleChat();
+ void updateDlgBuffer();
+ void loadDlgHeader(int &csEntry, int &vocH, int &scIndex1, int &scIndex2);
+ void processDialogue(int dlgOffset, int vocH = 0, int csEntry = 0);
+ void npcChatSequence(const char *str, int objectId, int vocHigh = -1, int vocLow = -1);
+ void setNewDlgIndex(int dlgIndex);
+
+ int _npcTalkChpIndex;
+ int _npcTalkDlgIndex;
+ uint8 _newSceneDlgState[32];
+ int8 **_conversationState;
+ uint8 *_dlgBuffer;
+
+ // Talk object handling
+ void initTalkObject(int index);
+ void deinitTalkObject(int index);
+
+ struct TalkObject {
+ char filename[13];
+ int8 scriptId;
+ int16 x, y;
+ int8 color;
+ };
+ TalkObject *_talkObjectList;
+
+ struct TalkSections {
+ TIM *STATim;
+ TIM *TLKTim;
+ TIM *ENDTim;
+ };
+ TalkSections _currentTalkSections;
+
+ char _TLKFilename[13];
+
+ // tim
+ void playTim(const char *filename);
+
+ int t2_initChat(const TIM *tim, const uint16 *param);
+ int t2_updateSceneAnim(const TIM *tim, const uint16 *param);
+ int t2_resetChat(const TIM *tim, const uint16 *param);
+ int t2_playSoundEffect(const TIM *tim, const uint16 *param);
+
+ Common::Array<const TIMOpcode*> _timOpcodes;
+
+ // sound
+ int _oldTalkFile;
+ int _currentTalkFile;
+ void openTalkFile(int newFile);
+ int _lastSfxTrack;
+
+ virtual void snd_playVoiceFile(int id);
+ void snd_loadSoundFile(int id);
+
+ void playVoice(int high, int low);
+ void snd_playSoundEffect(int track, int volume=0xFF);
+
+ // timer
+ void timerFadeOutMessage(int);
+ void timerCauldronAnimation(int);
+ void timerFunc4(int);
+ void timerFunc5(int);
+ void timerBurnZanthia(int);
+
+ void setTimer1DelaySecs(int secs);
+
+ uint32 _nextIdleAnim;
+ int _lastIdleScript;
+
+ void setNextIdleAnimTimer();
+ void showIdleAnim();
+ void runIdleScript(int script);
+
+ void setWalkspeed(uint8 speed);
+
+ // delay
+ void delay(uint32 millis, bool updateGame = false, bool isMainLoop = false);
+
+ // ingame static sequence handling
+ void seq_makeBookOrCauldronAppear(int type);
+ void seq_makeBookAppear();
+
+ struct InventoryWsa {
+ int x, y, x2, y2, w, h;
+ int page;
+ int curFrame, lastFrame, specialFrame;
+ int sfx;
+ int delay;
+ bool running;
+ uint32 timer;
+ WSAMovieV2 *wsa;
+ } _invWsa;
+
+ // TODO: move inside KyraEngine_HoF::InventoryWsa?
+ void loadInvWsa(const char *filename, int run, int delay, int page, int sfx, int sFrame, int flags);
+ void closeInvWsa();
+
+ void updateInvWsa();
+ void displayInvWsaLastFrame();
+
+ // opcodes
+ int o2_setCharacterFacingRefresh(EMCState *script);
+ int o2_setCharacterPos(EMCState *script);
+ int o2_defineObject(EMCState *script);
+ int o2_refreshCharacter(EMCState *script);
+ int o2_setSceneComment(EMCState *script);
+ int o2_setCharacterAnimFrame(EMCState *script);
+ int o2_setCharacterFacing(EMCState *script);
+ int o2_customCharacterChat(EMCState *script);
+ int o2_soundFadeOut(EMCState *script);
+ int o2_showChapterMessage(EMCState *script);
+ int o2_restoreTalkTextMessageBkgd(EMCState *script);
+ int o2_wsaClose(EMCState *script);
+ int o2_meanWhileScene(EMCState *script);
+ int o2_backUpScreen(EMCState *script);
+ int o2_restoreScreen(EMCState *script);
+ int o2_displayWsaFrame(EMCState *script);
+ int o2_displayWsaSequentialFramesLooping(EMCState *script);
+ int o2_wsaOpen(EMCState *script);
+ int o2_displayWsaSequentialFrames(EMCState *script);
+ int o2_displayWsaSequence(EMCState *script);
+ int o2_addItemToInventory(EMCState *script);
+ int o2_drawShape(EMCState *script);
+ int o2_addItemToCurScene(EMCState *script);
+ int o2_checkForItem(EMCState *script);
+ int o2_loadSoundFile(EMCState *script);
+ int o2_removeItemSlotFromInventory(EMCState *script);
+ int o2_defineItem(EMCState *script);
+ int o2_removeItemFromInventory(EMCState *script);
+ int o2_countItemInInventory(EMCState *script);
+ int o2_countItemsInScene(EMCState *script);
+ int o2_wipeDownMouseItem(EMCState *script);
+ int o2_getElapsedSecs(EMCState *script);
+ int o2_getTimerDelay(EMCState *script);
+ //int o2_playSoundEffect(EMCState *script);
+ int o2_delaySecs(EMCState *script);
+ int o2_delay(EMCState *script);
+ int o2_setTimerDelay(EMCState *script);
+ int o2_setScaleTableItem(EMCState *script);
+ int o2_setDrawLayerTableItem(EMCState *script);
+ int o2_setCharPalEntry(EMCState *script);
+ int o2_loadZShapes(EMCState *script);
+ int o2_drawSceneShape(EMCState *script);
+ int o2_drawSceneShapeOnPage(EMCState *script);
+ int o2_disableAnimObject(EMCState *script);
+ int o2_enableAnimObject(EMCState *script);
+ int o2_loadPalette384(EMCState *script);
+ int o2_setPalette384(EMCState *script);
+ int o2_restoreBackBuffer(EMCState *script);
+ int o2_backUpInventoryGfx(EMCState *script);
+ int o2_disableSceneAnim(EMCState *script);
+ int o2_enableSceneAnim(EMCState *script);
+ int o2_restoreInventoryGfx(EMCState *script);
+ int o2_setSceneAnimPos2(EMCState *script);
+ int o2_update(EMCState *script);
+ int o2_fadeScenePal(EMCState *script);
+ int o2_enterNewSceneEx(EMCState *script);
+ int o2_switchScene(EMCState *script);
+ int o2_getShapeFlag1(EMCState *script);
+ int o2_setPathfinderFlag(EMCState *script);
+ int o2_getSceneExitToFacing(EMCState *script);
+ int o2_setLayerFlag(EMCState *script);
+ int o2_setZanthiaPos(EMCState *script);
+ int o2_loadMusicTrack(EMCState *script);
+ int o2_playWanderScoreViaMap(EMCState *script);
+ int o2_playSoundEffect(EMCState *script);
+ int o2_setSceneAnimPos(EMCState *script);
+ int o2_blockInRegion(EMCState *script);
+ int o2_blockOutRegion(EMCState *script);
+ int o2_setCauldronState(EMCState *script);
+ int o2_showItemString(EMCState *script);
+ int o2_getRand(EMCState *script);
+ int o2_isAnySoundPlaying(EMCState *script);
+ int o2_setDeathHandlerFlag(EMCState *script);
+ int o2_setDrawNoShapeFlag(EMCState *script);
+ int o2_setRunFlag(EMCState *script);
+ int o2_showLetter(EMCState *script);
+ int o2_fillRect(EMCState *script);
+ int o2_waitForConfirmationClick(EMCState *script);
+ int o2_encodeShape(EMCState *script);
+ int o2_defineRoomEntrance(EMCState *script);
+ int o2_runTemporaryScript(EMCState *script);
+ int o2_setSpecialSceneScriptRunTime(EMCState *script);
+ int o2_defineSceneAnim(EMCState *script);
+ int o2_updateSceneAnim(EMCState *script);
+ int o2_addToSceneAnimPosAndUpdate(EMCState *script);
+ int o2_useItemOnMainChar(EMCState *script);
+ int o2_startDialogue(EMCState *script);
+ int o2_zanthRandomChat(EMCState *script);
+ int o2_setupDialogue(EMCState *script);
+ int o2_getDlgIndex(EMCState *script);
+ int o2_defineRoom(EMCState *script);
+ int o2_addCauldronStateTableEntry(EMCState *script);
+ int o2_setCountDown(EMCState *script);
+ int o2_getCountDown(EMCState *script);
+ int o2_pressColorKey(EMCState *script);
+ int o2_objectChat(EMCState *script);
+ int o2_chapterChange(EMCState *script);
+ int o2_getColorCodeFlag1(EMCState *script);
+ int o2_setColorCodeFlag1(EMCState *script);
+ int o2_getColorCodeFlag2(EMCState *script);
+ int o2_setColorCodeFlag2(EMCState *script);
+ int o2_getColorCodeValue(EMCState *script);
+ int o2_setColorCodeValue(EMCState *script);
+ int o2_countItemInstances(EMCState *script);
+ int o2_removeItemFromScene(EMCState *script);
+ int o2_initObject(EMCState *script);
+ int o2_npcChat(EMCState *script);
+ int o2_deinitObject(EMCState *script);
+ int o2_playTimSequence(EMCState *script);
+ int o2_makeBookOrCauldronAppear(EMCState *script);
+ int o2_setSpecialSceneScriptState(EMCState *script);
+ int o2_clearSpecialSceneScriptState(EMCState *script);
+ int o2_querySpecialSceneScriptState(EMCState *script);
+ int o2_resetInputColorCode(EMCState *script);
+ int o2_setHiddenItemsEntry(EMCState *script);
+ int o2_getHiddenItemsEntry(EMCState *script);
+ int o2_mushroomEffect(EMCState *script);
+ int o2_customChat(EMCState *script);
+ int o2_customChatFinish(EMCState *script);
+ int o2_setupSceneAnimation(EMCState *script);
+ int o2_stopSceneAnimation(EMCState *script);
+ int o2_disableTimer(EMCState *script);
+ int o2_enableTimer(EMCState *script);
+ int o2_setTimerCountdown(EMCState *script);
+ int o2_processPaletteIndex(EMCState *script);
+ int o2_updateTwoSceneAnims(EMCState *script);
+ int o2_getRainbowRoomData(EMCState *script);
+ int o2_drawSceneShapeEx(EMCState *script);
+ int o2_getBoolFromStack(EMCState *script);
+ int o2_getSfxDriver(EMCState *script);
+ int o2_getVocSupport(EMCState *script);
+ int o2_getMusicDriver(EMCState *script);
+ int o2_setVocHigh(EMCState *script);
+ int o2_getVocHigh(EMCState *script);
+ int o2_zanthiaChat(EMCState *script);
+ int o2_isVoiceEnabled(EMCState *script);
+ int o2_isVoicePlaying(EMCState *script);
+ int o2_stopVoicePlaying(EMCState *script);
+ int o2_getGameLanguage(EMCState *script);
+ int o2_demoFinale(EMCState *script);
+ int o2_dummy(EMCState *script);
+
+ // opcodes temporary
+ // TODO: rename it from temporary to something more appropriate
+ int o2t_defineNewShapes(EMCState *script);
+ int o2t_setCurrentFrame(EMCState *script);
+ int o2t_playSoundEffect(EMCState *script);
+ int o2t_fadeScenePal(EMCState *script);
+ int o2t_setShapeFlag(EMCState *script);
+
+ // script
+ void runStartScript(int script, int unk1);
+ void loadNPCScript();
+
+ bool _noScriptEnter;
+
+ EMCData _npcScriptData;
+
+ EMCData _temporaryScriptData;
+ EMCState _temporaryScriptState;
+ bool _temporaryScriptExecBit;
+ Common::Array<const Opcode*> _opcodesTemporary;
+
+ void runTemporaryScript(const char *filename, int allowSkip, int resetChar, int newShapes, int shapeUnload);
+
+ // pathfinder
+ uint8 *_unkBuf500Bytes;
+ uint8 *_unkBuf200kByte;
+ bool _chatAltFlag;
+
+ // sequence player
+ ActiveWSA *_activeWSA;
+ ActiveText *_activeText;
+
+ const char *const *_sequencePakList;
+ int _sequencePakListSize;
+ const char *const *_ingamePakList;
+ int _ingamePakListSize;
+
+ const char *const *_musicFileListIntro;
+ int _musicFileListIntroSize;
+ const char *const *_musicFileListFinale;
+ int _musicFileListFinaleSize;
+ const char *const *_musicFileListIngame;
+ int _musicFileListIngameSize;
+ const uint8 *_cdaTrackTableIntro;
+ int _cdaTrackTableIntroSize;
+ const uint8 *_cdaTrackTableIngame;
+ int _cdaTrackTableIngameSize;
+ const uint8 *_cdaTrackTableFinale;
+ int _cdaTrackTableFinaleSize;
+ const char *const *_sequenceSoundList;
+ int _sequenceSoundListSize;
+ const char *const *_ingameSoundList;
+ int _ingameSoundListSize;
+ const uint16 *_ingameSoundIndex;
+ int _ingameSoundIndexSize;
+ const char *const *_sequenceStrings;
+ int _sequenceStringsSize;
+ const uint16 *_ingameTalkObjIndex;
+ int _ingameTalkObjIndexSize;
+ const char *const *_ingameTimJpStr;
+ int _ingameTimJpStrSize;
+ const HofSeqData *_sequences;
+ const ItemAnimData_v2 *_itemAnimData;
+ int _itemAnimDataSize;
+ const ItemAnimData_v1 *_demoAnimData;
+ int _demoAnimSize;
+
+ int _sequenceStringsDuration[33];
+
+ static const uint8 _seqTextColorPresets[];
+ char *_seqProcessedString;
+ WSAMovieV2 *_seqWsa;
+
+ bool _abortIntroFlag;
+ int _menuChoice;
+
+ uint32 _seqFrameDelay;
+ uint32 _seqStartTime;
+ uint32 _seqEndTime;
+ int _seqFrameCounter;
+ int _seqScrollTextCounter;
+ int _seqWsaCurrentFrame;
+ bool _seqSpecialFlag;
+ bool _seqSubframePlaying;
+ uint8 _seqTextColor[2];
+ uint8 _seqTextColorMap[16];
+
+ const SeqProc *_callbackS;
+ const SeqProc *_callbackN;
+
+ static const uint8 _rainbowRoomData[];
+
+ // color code related vars
+ int _colorCodeFlag1;
+ int _colorCodeFlag2;
+ uint8 _presetColorCode[7];
+ uint8 _inputColorCode[7];
+ uint32 _scriptCountDown;
+ int _dbgPass;
+
+ // save/load specific
+ void saveGame(const char *fileName, const char *saveName);
+ void loadGame(const char *fileName);
+};
+
+} // end of namespace Kyra
+
+#endif
+