diff options
Diffstat (limited to 'engines/titanic')
-rw-r--r-- | engines/titanic/core/game_object.cpp | 6 | ||||
-rw-r--r-- | engines/titanic/core/game_object.h | 2 | ||||
-rw-r--r-- | engines/titanic/messages/messages.h | 2 | ||||
-rw-r--r-- | engines/titanic/sound/sound.cpp | 10 | ||||
-rw-r--r-- | engines/titanic/sound/sound.h | 5 | ||||
-rw-r--r-- | engines/titanic/true_talk/script_handler.cpp | 2 | ||||
-rw-r--r-- | engines/titanic/true_talk/script_handler.h | 2 | ||||
-rw-r--r-- | engines/titanic/true_talk/true_talk_manager.cpp | 69 | ||||
-rw-r--r-- | engines/titanic/true_talk/true_talk_manager.h | 38 |
9 files changed, 119 insertions, 17 deletions
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index 7cfcd338f6..b27b461b48 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -353,7 +353,7 @@ void CGameObject::petFn3(CTreeItem *item) { pet->fn3(item); } -void CGameObject::playMovie(uint startFrame, uint endFrame, int val3) { +void CGameObject::playMovie(uint startFrame, uint endFrame, uint flags) { _frameNumber = -1; if (!_surface) { if (!_resource.empty()) @@ -367,9 +367,9 @@ void CGameObject::playMovie(uint startFrame, uint endFrame, int val3) { if (movie) movie->_gameObject = this; - _surface->playMovie(startFrame, endFrame, val3, val3 != 0); + _surface->playMovie(startFrame, endFrame, flags, flags != 0); - if (val3 & 0x10) + if (flags & 0x10) getGameManager()->_gameState.addMovie(_surface->_movie); } } diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index 4d2dca6860..87cc2baa7e 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -316,7 +316,7 @@ public: /** * Play the movie specified in _resource */ - void playMovie(uint startFrame, uint endFrame, int val3); + void playMovie(uint startFrame, uint endFrame, uint flags); /** * Play an arbitrary clip diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h index aeb82d5448..561120de34 100644 --- a/engines/titanic/messages/messages.h +++ b/engines/titanic/messages/messages.h @@ -341,7 +341,7 @@ MESSAGE1(CTranslateObjectMsg, Point, delta, Point()); MESSAGE3(CTransportMsg, CString, roomName, "", int, value1, 0, int, value2, 0); MESSAGE1(CTriggerAutoMusicPlayerMsg, int, value, 0); MESSAGE1(CTriggerNPCEvent, int, value, 0); -MESSAGE4(CTrueTalkGetAnimSetMsg, int, value1, 0, int, value2, 0, int, value3, 0, int, value4, 0); +MESSAGE4(CTrueTalkGetAnimSetMsg, int, value1, 0, uint, index, 0, uint, startFrame, 0, uint, endFrame, 0); MESSAGE2(CTrueTalkGetAssetDetailsMsg, CString, filename, "", int, numValue, 0); MESSAGE2(CTrueTalkGetStateValueMsg, int, value1, 0, int, value2, -1000); MESSAGE2(CTrueTalkNotifySpeechEndedMsg, int, value1, 0, int, value2, 0); diff --git a/engines/titanic/sound/sound.cpp b/engines/titanic/sound/sound.cpp index 3e4f154c35..cf7689d937 100644 --- a/engines/titanic/sound/sound.cpp +++ b/engines/titanic/sound/sound.cpp @@ -25,6 +25,11 @@ namespace Titanic { +int CSoundItem::fn1() { + // TODO + return 0; +} + CSound::CSound(CGameManager *owner) : _gameManager(owner) { } @@ -123,4 +128,9 @@ void CSound::removeOldest() { } } +CSoundItem *CSound::getTrueTalkSound(CDialogueFile *dialogueFile, int index) { + warning("TODO: CSound::getTrueTalkSound"); + return nullptr; +} + } // End of namespace Titanic z diff --git a/engines/titanic/sound/sound.h b/engines/titanic/sound/sound.h index dfbee0a9dd..33996de1ca 100644 --- a/engines/titanic/sound/sound.h +++ b/engines/titanic/sound/sound.h @@ -27,6 +27,7 @@ #include "titanic/sound/sound_manager.h" #include "titanic/core/list.h" #include "titanic/core/view_item.h" +#include "titanic/true_talk/dialogue_file.h" namespace Titanic { @@ -45,6 +46,8 @@ public: _field20(0), _field24(0), _field28(0) {} CSoundItem(const CString &name) : ListItem(), _name(name), _soundHandle(0), _field1C(0), _field20(0), _field24(0), _field28(0) {} + + int fn1(); }; class CSoundItemList : public List<CSoundItem> { @@ -116,6 +119,8 @@ public: void fn2(int handle); void fn3(int handle, int val2, int val3); void managerProc8(int v) { _soundManager.proc8(v); } + + CSoundItem *getTrueTalkSound(CDialogueFile *dialogueFile, int index); }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/script_handler.cpp b/engines/titanic/true_talk/script_handler.cpp index eb7979e1e5..a46a03301c 100644 --- a/engines/titanic/true_talk/script_handler.cpp +++ b/engines/titanic/true_talk/script_handler.cpp @@ -29,7 +29,7 @@ namespace Titanic { CScriptHandler::CScriptHandler(CTitleEngine *owner, int val1, int val2) { } -void CScriptHandler::setup(TTNamedScript *npcScript, TTRoomScript *roomScript, uint charId) { +void CScriptHandler::setup(TTRoomScript *roomScript, TTNamedScript *npcScript, uint charId) { // TODO } diff --git a/engines/titanic/true_talk/script_handler.h b/engines/titanic/true_talk/script_handler.h index 1959468ed0..8d5c78dbc3 100644 --- a/engines/titanic/true_talk/script_handler.h +++ b/engines/titanic/true_talk/script_handler.h @@ -40,7 +40,7 @@ public: /** * Set the character and room */ - void setup(TTNamedScript *npcScript, TTRoomScript *roomScript, uint charId); + void setup(TTRoomScript *roomScript, TTNamedScript *npcScript, uint charId); void processInput(TTNamedScript *npcScript, TTRoomScript *roomScript, const TTString &line); diff --git a/engines/titanic/true_talk/true_talk_manager.cpp b/engines/titanic/true_talk/true_talk_manager.cpp index 6552a5db5c..9e7fb773e5 100644 --- a/engines/titanic/true_talk/true_talk_manager.cpp +++ b/engines/titanic/true_talk/true_talk_manager.cpp @@ -44,7 +44,7 @@ CTrueTalkNPC *CTrueTalkManager::_currentNPC; CTrueTalkManager::CTrueTalkManager(CGameManager *owner) : _gameManager(owner), _scripts(&_titleEngine), _currentCharId(0), - _dialogueFile(nullptr), _dialogueIndex(0) { + _dialogueFile(nullptr), _dialogueId(0) { } CTrueTalkManager::~CTrueTalkManager() { @@ -210,10 +210,10 @@ void CTrueTalkManager::start(CTrueTalkNPC *npc, uint id, CViewItem *view) { loadAssets(npc, charId); _currentNPC = npc; - _titleEngine._scriptHandler->setup(npcScript, roomScript, charId); + _titleEngine._scriptHandler->setup(roomScript, npcScript, charId); _currentNPC = nullptr; - setDialogue(npcScript, roomScript, view); + setDialogue(npc, roomScript, view); } TTNamedScript *CTrueTalkManager::getTalker(const CString &name) const { @@ -282,7 +282,7 @@ void CTrueTalkManager::loadAssets(CTrueTalkNPC *npc, int charId) { if (!detailsMsg._filename.empty()) { _dialogueFile = new CDialogueFile(detailsMsg._filename, 20); - _dialogueIndex = detailsMsg._numValue + 1; + _dialogueId = detailsMsg._numValue + 1; } } @@ -298,13 +298,25 @@ void CTrueTalkManager::processInput(CTrueTalkNPC *npc, CTextInputMsg *msg, CView _currentNPC = nullptr; loadAssets(npc, npcScript->charId()); - setDialogue(npcScript, roomScript, view); + setDialogue(npc, roomScript, view); } _currentNPC = nullptr; } -void CTrueTalkManager::setDialogue(TTNamedScript *npcScript, TTRoomScript *roomScript, CViewItem *view) { +void CTrueTalkManager::setDialogue(CTrueTalkNPC *npc, TTRoomScript *roomScript, CViewItem *view) { + // Get the dialog text + CString dialogStr = readDialogueString(); + if (dialogStr.empty()) + return; + + TTTalker *talker = new TTTalker(this, npc); + _talkers.push_back(talker); + + bool isParrot = npc->getName() == "parrot"; + + + warning("TODO: CTrueTalkManager::setDialogue"); } @@ -320,7 +332,7 @@ CString CTrueTalkManager::readDialogueString() { // Open a text entry from the dialogue file for access DialogueResource *textRes = _dialogueFile->openTextEntry( - _titleEngine._indexes[idx] - _dialogueIndex); + _titleEngine._indexes[idx] - _dialogueId); if (!textRes) continue; @@ -351,4 +363,47 @@ CString CTrueTalkManager::readDialogueString() { return result; } +int CTrueTalkManager::readDialogSound() { + _field18 = 0; + + for (uint idx = 0; idx < _titleEngine._indexes.size(); ++idx) { + CSoundItem *soundItem = _gameManager->_sound.getTrueTalkSound( + _dialogueFile, _titleEngine._indexes[idx] - _dialogueId); + if (soundItem) { + _field18 = soundItem->fn1(); + } + } + + return _field18; +} + +void CTrueTalkManager::triggerNPC(CTrueTalkNPC *npc) { + CTrueTalkSelfQueueAnimSetMsg queueSetMsg; + if (queueSetMsg.execute(npc)) { + if (_field18 > 300) { + CTrueTalkQueueUpAnimSetMsg upMsg(_field18); + upMsg.execute(npc); + } + } else { + CTrueTalkGetAnimSetMsg getAnimMsg; + if (_field18 > 300) { + do { + getAnimMsg.execute(npc); + if (!getAnimMsg._endFrame) + break; + + npc->playMovie(getAnimMsg._startFrame, getAnimMsg._endFrame, 0); + getAnimMsg._endFrame = 0; + + uint numFrames = getAnimMsg._endFrame - getAnimMsg._startFrame; + int64 val = (numFrames * 1000) * 0x88888889; + uint diff = (val >> (32 + 5)) - 500; + _field18 += diff; + + getAnimMsg._index++; + } while (_field18 > 0); + } + } +} + } // End of namespace Titanic diff --git a/engines/titanic/true_talk/true_talk_manager.h b/engines/titanic/true_talk/true_talk_manager.h index 3843483e5a..c11c34f326 100644 --- a/engines/titanic/true_talk/true_talk_manager.h +++ b/engines/titanic/true_talk/true_talk_manager.h @@ -34,8 +34,28 @@ namespace Titanic { class CGameManager; class CTreeItem; class CViewItem; +class CTrueTalkManager; class CTrueTalkNPC; +class TTTalker : public ListItem { +public: + CTrueTalkManager *_owner; + CTrueTalkNPC *_npc; + CString _string1; + int _field20; + int _field24; + int _field28; +public: + TTTalker() : _owner(nullptr), _npc(nullptr), + _field20(0), _field24(0), _field28(0) {} + TTTalker(CTrueTalkManager *owner, CTrueTalkNPC *npc) : + _owner(owner), _npc(npc), _field20(0), _field24(0), _field28(0) {} + +}; + +class TTTalkerList : public List<TTTalker> { +}; + class CTrueTalkManager { private: CGameManager *_gameManager; @@ -43,7 +63,9 @@ private: TTScripts _scripts; int _currentCharId; CDialogueFile *_dialogueFile; - int _dialogueIndex; + int _dialogueId; + int _field18; + TTTalkerList _talkers; private: /** * Loads the statics for the class @@ -80,12 +102,22 @@ private: */ void loadAssets(CTrueTalkNPC *npc, int charId); - void setDialogue(TTNamedScript *npcScript, TTRoomScript *roomScript, CViewItem *view); + void setDialogue(CTrueTalkNPC *npc, TTRoomScript *roomScript, CViewItem *view); /** - * Read in a string from the resource + * Read in text from the dialogue file */ CString readDialogueString(); + + /** + * Read in the sound from the dialogue file + */ + int readDialogSound(); + + /** + * Triggers animation for the NPC + */ + void triggerNPC(CTrueTalkNPC *npc); public: static int _v1; static int _v2; |