diff options
Diffstat (limited to 'engines/kyra/engine/kyra_mr.h')
-rw-r--r-- | engines/kyra/engine/kyra_mr.h | 670 |
1 files changed, 670 insertions, 0 deletions
diff --git a/engines/kyra/engine/kyra_mr.h b/engines/kyra/engine/kyra_mr.h new file mode 100644 index 0000000000..83c97ebad9 --- /dev/null +++ b/engines/kyra/engine/kyra_mr.h @@ -0,0 +1,670 @@ +/* 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. + * + */ + +#ifndef KYRA_KYRA_MR_H +#define KYRA_KYRA_MR_H + +#include "kyra/engine/kyra_v2.h" +#include "kyra/graphics/screen_mr.h" +#include "kyra/script/script.h" +#include "kyra/gui/gui_mr.h" + +#include "common/hashmap.h" +#include "common/list.h" + +namespace Kyra { + +class SoundDigital; +class Screen_MR; +class MainMenu; +class WSAMovie_v2; +class TextDisplayer_MR; +struct Button; + +class KyraEngine_MR : public KyraEngine_v2 { +friend class TextDisplayer_MR; +friend class GUI_MR; +public: + KyraEngine_MR(OSystem *system, const GameFlags &flags); + ~KyraEngine_MR(); + + // Regarding pausing of the engine: + // Idle animation time, item animations and album animations should be taken + // care of, but since those would just produce minor glitches it's not that + // important. + + Screen *screen() { return _screen; } + Screen_v2 *screen_v2() const { return _screen; } + GUI *gui() const { return _gui; } + SoundDigital *soundDigital() { return _soundDigital; } + int language() const { return _lang; } + bool heliumMode() const { return _configHelium; } + + Common::Error go(); + + void playVQA(const char *name); + +private: + static const EngineDesc _mrEngineDesc; + + // config + bool _configStudio; + bool _configSkip; + bool _configHelium; + int _configVQAQuality; + + void registerDefaultSettings(); + void writeSettings(); + void readSettings(); + + void initStaticResource(); + + // -- + Screen_MR *_screen; + SoundDigital *_soundDigital; + + Common::Error init(); + + void preinit(); + void startup(); + void runStartupScript(int script, int unk1); + + void setupOpcodeTable(); + + // input + bool skipFlag() const; + void resetSkipFlag(bool removeEvent = true); + + // run + bool _menuDirectlyToLoad; + + void runLoop(); + void handleInput(int x, int y); + int inputSceneChange(int x, int y, int unk1, int unk2); + + void update(); + void updateWithText(); + void updateMouse(); + + // sound specific +private: + void playMenuAudioFile(); + + int _musicSoundChannel; + int _fadeOutMusicChannel; + const char *_menuAudioFile; + + const char *const *_soundList; + int _soundListSize; + + void snd_playWanderScoreViaMap(int track, int force); + void stopMusicTrack(); + + void fadeOutMusic(int ticks); + + void snd_playSoundEffect(int item, int volume); + + const uint8 *_sfxFileMap; + int _sfxFileMapSize; + const char *const *_sfxFileList; + int _sfxFileListSize; + + int _voiceSoundChannel; + + void playVoice(int high, int low); + void snd_playVoiceFile(int file); + bool snd_voiceIsPlaying(); + void snd_stopVoice(); + + int _curStudioSFX; + void playStudioSFX(const char *str); + + // gui + GUI_MR *_gui; + + Button *_mainButtonData; + Button *_mainButtonList; + bool _mainButtonListInitialized; + void initMainButtonList(bool disable); + + bool _enableInventory; + int buttonInventory(Button *button); + int buttonMoodChange(Button *button); + int buttonShowScore(Button *button); + int buttonJesterStaff(Button *button); + + void loadButtonShapes(); + int callbackButton1(Button *button); + int callbackButton2(Button *button); + int callbackButton3(Button *button); + + // -> main menu + void initMainMenu(); + void uninitMainMenu(); + + MainMenu *_menu; + WSAMovie_v2 *_menuAnim; + + // timer + void setupTimers(); + + void setWalkspeed(uint8); + void setCommandLineRestoreTimer(int secs); + + void timerRestoreCommandLine(int arg); + void timerRunSceneScript7(int arg); + void timerFleaDeath(int arg); + + uint32 _nextIdleAnim; + void setNextIdleAnimTimer(); + + // pathfinder + bool lineIsPassable(int x, int y); + +private: + // main menu + const char *const *_mainMenuStrings; + int _mainMenuStringsSize; + + static const char *const _mainMenuSpanishFan[]; + static const char *const _mainMenuItalianFan[]; + + // animator + uint8 *_gamePlayBuffer; + void restorePage3(); + + void clearAnimObjects(); + + void animSetupPaletteEntry(AnimObj *anim); + + 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); + + bool _loadingState; + void updateItemAnimations(); + void updateCharacterAnim(int charId); + + void updateSceneAnim(int anim, int newFrame); + void setupSceneAnimObject(int anim, uint16 flags, int x, int y, int x2, int y2, int w, int h, int unk10, int specialSize, int unk14, int shape, const char *filename); + void removeSceneAnimObject(int anim, int refresh); + + int _charBackUpWidth2, _charBackUpHeight2; + int _charBackUpWidth, _charBackUpHeight; + + void setCharacterAnimDim(int w, int h); + void resetCharacterAnimDim(); + + bool _nextIdleType; + void showIdleAnim(); + + const ItemAnimDefinition *_itemAnimDefinition; + ActiveItemAnim _activeItemAnim[10]; + int _nextAnimItem; + + // interface + uint8 *_interface; + uint8 *_interfaceCommandLine; + + void loadInterfaceShapes(); + void loadInterface(); + + void showMessage(const char *string, uint8 c0, uint8 c1); + void showMessageFromCCode(int string, uint8 c0, int); + void updateItemCommand(Item item, int str, uint8 c0); + + void updateCommandLine(); + void restoreCommandLine(); + void updateCLState(); + + int _commandLineY; + const char *_shownMessage; + bool _restoreCommandLine; + bool _inventoryState; + int _inventoryScrollSpeed; + + void showInventory(); + void hideInventory(); + + void drawMalcolmsMoodText(); + void drawMalcolmsMoodPointer(int frame, int page); + void drawJestersStaff(int type, int page); + + void drawScore(int page, int x, int y); + void drawScoreCounting(int oldScore, int newScore, int drawOld, const int x); + int getScoreX(const char *str); + + static const uint8 _inventoryX[]; + static const uint8 _inventoryY[]; + void redrawInventory(int page); + void clearInventorySlot(int slot, int page); + void drawInventorySlot(int page, Item item, int slot); + + WSAMovie_v2 *_invWsa; + int _invWsaFrame; + + // localization + uint8 *_scoreFile; + uint8 *_cCodeFile; + uint8 *_scenesFile; + uint8 *_itemFile; + uint8 *_optionsFile; + uint8 *_actorFile; + uint32 _actorFileSize; + uint8 *_sceneStrings; + + uint8 *getTableEntry(uint8 *buffer, int id); + void getTableEntry(Common::SeekableReadStream *stream, int id, char *dst); + + // items + int8 *_itemBuffer1; + int8 *_itemBuffer2; + + static const Item _trashItemList[]; + void removeTrashItems(); + + void initItems(); + + int checkItemCollision(int x, int y); + + bool dropItem(int unk1, Item item, int x, int y, int unk2); + bool processItemDrop(uint16 sceneId, Item item, int x, int y, int unk1, int unk2); + void itemDropDown(int startX, int startY, int dstX, int dstY, int itemSlot, Item item, int remove); + void exchangeMouseItem(int itemPos, int runScript); + bool pickUpItem(int x, int y, int runScript); + + bool isDropable(int x, int y); + + const uint8 *_itemMagicTable; + bool itemListMagic(Item handItem, int itemSlot); + bool itemInventoryMagic(Item handItem, int invSlot); + + const uint8 *_itemStringMap; + int _itemStringMapSize; + static const uint8 _itemStringPickUp[]; + static const uint8 _itemStringDrop[]; + static const uint8 _itemStringInv[]; + + int getItemCommandStringPickUp(uint16 item); + int getItemCommandStringDrop(uint16 item); + int getItemCommandStringInv(uint16 item); + + // -> hand item + void setItemMouseCursor(); + void setMouseCursor(Item item); + + // shapes + void initMouseShapes(); + + void loadCharacterShapes(int newShapes); + void updateMalcolmShapes(); + + int _malcolmShapeXOffset, _malcolmShapeYOffset; + + struct ShapeDesc { + uint8 width, height; + int8 xOffset, yOffset; + }; + static const ShapeDesc _shapeDescs[]; + static const int _shapeDescsSize; + + // scene animation + uint8 *_sceneShapes[20]; + + void freeSceneShapes(); + + // voice + int _currentTalkFile; + void openTalkFile(int file); + + // scene + bool _noScriptEnter; + void enterNewScene(uint16 scene, int facing, int unk1, int unk2, int unk3); + void enterNewSceneUnk1(int facing, int unk1, int unk2); + void enterNewSceneUnk2(int unk1); + int _enterNewSceneLock; + + void unloadScene(); + + void loadScenePal(); + void loadSceneMsc(); + void initSceneScript(int unk1); + void initSceneAnims(int unk1); + void initSceneScreen(int unk1); + + int runSceneScript1(int x, int y); + int runSceneScript2(); + bool _noStartupChat; + void runSceneScript4(int unk1); + void runSceneScript8(); + + int _sceneMinX, _sceneMaxX; + int _maskPageMinY, _maskPageMaxY; + + int trySceneChange(int *moveTable, int unk1, int unk2); + int checkSceneChange(); + + int8 _sceneDatPalette[45]; + int8 _sceneDatLayerTable[15]; + struct SceneShapeDesc { + // the original saves those variables, we don't, since + // they are just needed on scene load + /*int x, y; + int w, h;*/ + int drawX, drawY; + }; + SceneShapeDesc _sceneShapeDescs[20]; + + int getDrawLayer(int x, int y); + + int getScale(int x, int y); + int _scaleTable[15]; + + // character + int getCharacterWalkspeed() const; + void updateCharAnimFrame(int *table); + int8 _characterAnimTable[2]; + static const uint8 _characterFrameTable[]; + + void updateCharPal(int unk1); + int _lastCharPalLayer; + bool _charPalUpdate; + + bool checkCharCollision(int x, int y); + + int _malcolmsMood; + + void makeCharFacingMouse(); + + int findFreeInventorySlot(); + + // talk object + struct TalkObject { + char filename[13]; + int8 sceneAnim; + int8 sceneScript; + int16 x, y; + uint8 color; + uint8 sceneId; + }; + + TalkObject *_talkObjectList; + + bool talkObjectsInCurScene(); + + // chat + int chatGetType(const char *text); + int chatCalcDuration(const char *text); + + void objectChat(const char *text, int object, int vocHigh, int vocLow); + void objectChatInit(const char *text, int object, int vocHigh, int vocLow); + void objectChatPrintText(const char *text, int object); + void objectChatProcess(const char *script); + void objectChatWaitToFinish(); + + void badConscienceChat(const char *str, int vocHigh, int vocLow); + void badConscienceChatWaitToFinish(); + + void goodConscienceChat(const char *str, int vocHigh, int vocLow); + void goodConscienceChatWaitToFinish(); + + bool _albumChatActive; + void albumChat(const char *str, int vocHigh, int vocLow); + void albumChatInit(const char *str, int object, int vocHigh, int vocLow); + void albumChatWaitToFinish(); + + void malcolmSceneStartupChat(); + + byte _newSceneDlgState[40]; + int8 _conversationState[30][30]; + bool _chatAltFlag; + void setDlgIndex(int index); + void updateDlgIndex(); + + Common::SeekableReadStream *_cnvFile; + Common::SeekableReadStream *_dlgBuffer; + int _curDlgChapter, _curDlgIndex, _curDlgLang; + void updateDlgBuffer(); + void loadDlgHeader(int &vocHighBase, int &vocHighIndex, int &index1, int &index2); + + static const uint8 _vocHighTable[]; + bool _isStartupDialog; + void processDialog(int vocHighIndex, int vocHighBase, int funcNum); + + EMCData _dialogScriptData; + EMCState _dialogScriptState; + int _dialogSceneAnim; + int _dialogSceneScript; + int _dialogScriptFuncStart, _dialogScriptFuncProc, _dialogScriptFuncEnd; + + void dialogStartScript(int object, int funcNum); + void dialogEndScript(int object); + + void npcChatSequence(const char *str, int object, int vocHigh, int vocLow); + + Common::Array<const Opcode *> _opcodesDialog; + + int o3d_updateAnim(EMCState *script); + int o3d_delay(EMCState *script); + + void randomSceneChat(); + void doDialog(int dlgIndex, int funcNum); + + // conscience + bool _badConscienceShown; + int _badConscienceAnim; + bool _badConsciencePosition; + + static const uint8 _badConscienceFrameTable[]; + + void showBadConscience(); + void hideBadConscience(); + + bool _goodConscienceShown; + int _goodConscienceAnim; + bool _goodConsciencePosition; + + static const uint8 _goodConscienceFrameTable[]; + + void showGoodConscience(); + void hideGoodConscience(); + + // special script code + bool _useFrameTable; + + int o3a_setCharacterFrame(EMCState *script); + int o3a_playSoundEffect(EMCState *script); + + // special shape code + int initAnimationShapes(uint8 *filedata); + void uninitAnimationShapes(int count, uint8 *filedata); + + // unk + uint8 *_costPalBuffer; + uint8 *_paletteOverlay; + bool _useActorBuffer; + + int _currentChapter; + void changeChapter(int newChapter, int sceneId, int malcolmShapes, int facing); + + static const uint8 _chapterLowestScene[]; + + void loadCostPal(); + void loadShadowShape(); + void loadExtrasShapes(); + + uint8 *_gfxBackUpRect; + void backUpGfxRect32x32(int x, int y); + void restoreGfxRect32x32(int x, int y); + + char *_stringBuffer; + + int _score; + int _scoreMax; + + const uint8 *_scoreTable; + int _scoreTableSize; + + int8 _scoreFlagTable[26]; + bool updateScore(int scoreId, int strId); + void scoreIncrease(int count, const char *str); + + void eelScript(); + + // Album + struct Album { + uint8 *backUpPage; + uint8 *file; + WSAMovie_v2 *wsa; + uint8 *backUpRect; + + struct PageMovie { + WSAMovie_v2 *wsa; + int curFrame; + int maxFrame; + uint32 timer; + }; + + PageMovie leftPage, rightPage; + + int curPage, nextPage; + bool running; + bool isPage14; + } _album; + + static const int8 _albumWSAX[]; + static const int8 _albumWSAY[]; + + void showAlbum(); + + void loadAlbumPage(); + void loadAlbumPageWSA(); + + void printAlbumPageText(); + void printAlbumText(int page, const char *str, int x, int y, uint8 c0); + + void processAlbum(); + + void albumNewPage(); + void albumUpdateAnims(); + void albumAnim1(); + void albumAnim2(); + + void albumBackUpRect(); + void albumRestoreRect(); + void albumUpdateRect(); + + void albumSwitchPages(int oldPage, int newPage, int srcPage); + + int albumNextPage(Button *caller); + int albumPrevPage(Button *caller); + int albumClose(Button *caller); + + // save/load + Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail); + Common::Error loadGameState(int slot); + + // opcodes + int o3_getMalcolmShapes(EMCState *script); + int o3_setCharacterPos(EMCState *script); + int o3_defineObject(EMCState *script); + int o3_refreshCharacter(EMCState *script); + int o3_getMalcolmsMood(EMCState *script); + int o3_getCharacterFrameFromFacing(EMCState *script); + int o3_setCharacterFacing(EMCState *script); + int o3_showSceneFileMessage(EMCState *script); + int o3_setCharacterAnimFrameFromFacing(EMCState *script); + int o3_showBadConscience(EMCState *script); + int o3_hideBadConscience(EMCState *script); + int o3_showAlbum(EMCState *script); + int o3_setInventorySlot(EMCState *script); + int o3_getInventorySlot(EMCState *script); + int o3_addItemToInventory(EMCState *script); + int o3_addItemToCurScene(EMCState *script); + int o3_objectChat(EMCState *script); + int o3_resetInventory(EMCState *script); + int o3_removeInventoryItemInstances(EMCState *script); + int o3_countInventoryItemInstances(EMCState *script); + int o3_npcChatSequence(EMCState *script); + int o3_badConscienceChat(EMCState *script); + int o3_wipeDownMouseItem(EMCState *script); + int o3_setMalcolmsMood(EMCState *script); + int o3_updateScore(EMCState *script); + int o3_makeSecondChanceSave(EMCState *script); + int o3_setSceneFilename(EMCState *script); + int o3_removeItemsFromScene(EMCState *script); + int o3_disguiseMalcolm(EMCState *script); + int o3_drawSceneShape(EMCState *script); + int o3_drawSceneShapeOnPage(EMCState *script); + int o3_checkInRect(EMCState *script); + int o3_updateConversations(EMCState *script); + int o3_removeItemSlot(EMCState *script); + int o3_setSceneDim(EMCState *script); + int o3_setSceneAnimPosAndFrame(EMCState *script); + int o3_removeItemInstances(EMCState *script); + int o3_disableInventory(EMCState *script); + int o3_enableInventory(EMCState *script); + int o3_enterNewScene(EMCState *script); + int o3_switchScene(EMCState *script); + int o3_setMalcolmPos(EMCState *script); + int o3_stopMusic(EMCState *script); + int o3_playSoundEffect(EMCState *script); + int o3_getScore(EMCState *script); + int o3_daggerWarning(EMCState *script); + int o3_blockOutWalkableRegion(EMCState *script); + int o3_showSceneStringsMessage(EMCState *script); + int o3_showGoodConscience(EMCState *script); + int o3_goodConscienceChat(EMCState *script); + int o3_hideGoodConscience(EMCState *script); + int o3_defineSceneAnim(EMCState *script); + int o3_updateSceneAnim(EMCState *script); + int o3_runActorScript(EMCState *script); + int o3_doDialog(EMCState *script); + int o3_setConversationState(EMCState *script); + int o3_getConversationState(EMCState *script); + int o3_changeChapter(EMCState *script); + int o3_countItemInstances(EMCState *script); + int o3_dialogStartScript(EMCState *script); + int o3_dialogEndScript(EMCState *script); + int o3_customChat(EMCState *script); + int o3_customChatFinish(EMCState *script); + int o3_setupSceneAnimObject(EMCState *script); + int o3_removeSceneAnimObject(EMCState *script); + int o3_dummy(EMCState *script); + + // misc + TextDisplayer_MR *_text; + bool _wasPlayingVQA; + + // resource specific +private: + static const char *const _languageExtension[]; + static const int _languageExtensionSize; + + int loadLanguageFile(const char *file, uint8 *&buffer); +}; + +} // End of namespace Kyra + +#endif |