diff options
author | Johannes Schickel | 2008-05-02 16:34:46 +0000 |
---|---|---|
committer | Johannes Schickel | 2008-05-02 16:34:46 +0000 |
commit | aaad3ccb3e6220af43449d1e6592bb7cd1990bfe (patch) | |
tree | 51e2752285564c9b03af73c920b987a134b11b4f | |
parent | e7fec26e03b862959d5799ce7811a2fdb68f5cae (diff) | |
download | scummvm-rg350-aaad3ccb3e6220af43449d1e6592bb7cd1990bfe.tar.gz scummvm-rg350-aaad3ccb3e6220af43449d1e6592bb7cd1990bfe.tar.bz2 scummvm-rg350-aaad3ccb3e6220af43449d1e6592bb7cd1990bfe.zip |
Added missing file.
svn-id: r31828
-rw-r--r-- | engines/kyra/kyra_hof.h | 987 |
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 + |