diff options
author | Filippos Karapetis | 2007-06-10 00:36:01 +0000 |
---|---|---|
committer | Filippos Karapetis | 2007-06-10 00:36:01 +0000 |
commit | 3fd5347421710bb21d47c57dca2b11c6dd9da7aa (patch) | |
tree | 2c944521efbfe00572e652a9c6c6b95bc7b693d1 /engines | |
parent | 86f6aaf206fadd6970b300c953a525804d7d84df (diff) | |
download | scummvm-rg350-3fd5347421710bb21d47c57dca2b11c6dd9da7aa.tar.gz scummvm-rg350-3fd5347421710bb21d47c57dca2b11c6dd9da7aa.tar.bz2 scummvm-rg350-3fd5347421710bb21d47c57dca2b11c6dd9da7aa.zip |
Fixed conversations in IHNM. Now, when a dialog option is selected, the protagonist will say it out properly before we hear the other character's reply. Also, added some more code for sfScriptFade and made it a stub for now, as it still needs work
svn-id: r27264
Diffstat (limited to 'engines')
-rw-r--r-- | engines/saga/interface.cpp | 5 | ||||
-rw-r--r-- | engines/saga/interface.h | 3 | ||||
-rw-r--r-- | engines/saga/puzzle.cpp | 16 | ||||
-rw-r--r-- | engines/saga/script.h | 2 | ||||
-rw-r--r-- | engines/saga/sfuncs.cpp | 34 | ||||
-rw-r--r-- | engines/saga/sthread.cpp | 5 |
6 files changed, 47 insertions, 18 deletions
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp index 7b69ac802c..7dc860f506 100644 --- a/engines/saga/interface.cpp +++ b/engines/saga/interface.cpp @@ -2027,7 +2027,7 @@ void Interface::converseClear(void) { _conversePos = -1; } -bool Interface::converseAddText(const char *text, int replyId, byte replyFlags, int replyBit) { +bool Interface::converseAddText(const char *text, int strId, int replyId, byte replyFlags, int replyBit) { int count = 0; // count how many pieces of text per string int i; int len; @@ -2058,6 +2058,7 @@ bool Interface::converseAddText(const char *text, int replyId, byte replyFlags, _converseText[_converseTextCount].text = (char *)malloc(i + 1); strncpy(_converseText[_converseTextCount].text, _converseWorkString, i); + _converseText[_converseTextCount].strId = strId; _converseText[_converseTextCount].text[i] = 0; _converseText[_converseTextCount].textNum = count; _converseText[_converseTextCount].stringNum = _converseStrCount; @@ -2187,7 +2188,7 @@ void Interface::converseSetPos(int key) { ct = &_converseText[_conversePos]; - _vm->_script->finishDialog(ct->replyId, ct->replyFlags, ct->replyBit); + _vm->_script->finishDialog(ct->strId, ct->replyId, ct->replyFlags, ct->replyBit); if (_vm->_puzzle->isActive()) _vm->_puzzle->handleReply(ct->replyId); diff --git a/engines/saga/interface.h b/engines/saga/interface.h index b537d49424..dd4aeb861d 100644 --- a/engines/saga/interface.h +++ b/engines/saga/interface.h @@ -157,6 +157,7 @@ struct InterfacePanel { struct Converse { char *text; + int strId; int stringNum; int textNum; int replyId; @@ -346,7 +347,7 @@ private: public: void converseInit(void); void converseClear(void); - bool converseAddText(const char *text, int replyId, byte replyFlags, int replyBit); + bool converseAddText(const char *text, int strId, int replyId, byte replyFlags, int replyBit); void converseDisplayText(); void converseSetTextLines(int row); void converseChangePos(int chg); diff --git a/engines/saga/puzzle.cpp b/engines/saga/puzzle.cpp index c2bfec4ebd..6ac7b64fb7 100644 --- a/engines/saga/puzzle.cpp +++ b/engines/saga/puzzle.cpp @@ -439,9 +439,9 @@ void Puzzle::solicitHint(void) { _vm->_timer->installTimerProc(&hintTimerCallback, 50000, this); _vm->_interface->converseClear(); - _vm->_interface->converseAddText(optionsStr[_lang][kROAccept], 1, 0, 0 ); - _vm->_interface->converseAddText(optionsStr[_lang][kRODecline], 2, 0, 0 ); - _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0 ); + _vm->_interface->converseAddText(optionsStr[_lang][kROAccept], 0, 1, 0, 0 ); + _vm->_interface->converseAddText(optionsStr[_lang][kRODecline], 0, 2, 0, 0 ); + _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0, 0 ); _vm->_interface->converseDisplayText(); break; @@ -458,9 +458,9 @@ void Puzzle::solicitHint(void) { case kRQSakkaDenies: _vm->_interface->converseClear(); - _vm->_interface->converseAddText(optionsStr[_lang][kROAccept], 1, 0, 0); - _vm->_interface->converseAddText(optionsStr[_lang][kRODecline], 2, 0, 0); - _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0); + _vm->_interface->converseAddText(optionsStr[_lang][kROAccept], 0, 1, 0, 0); + _vm->_interface->converseAddText(optionsStr[_lang][kRODecline], 0, 2, 0, 0); + _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0, 0); _vm->_interface->converseDisplayText(); _vm->_timer->installTimerProc(&hintTimerCallback, kPuzzleHintTime, this); @@ -546,7 +546,7 @@ void Puzzle::giveHint(void) { _hintRqState = kRQNoHint; - _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0); + _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0, 0); _vm->_interface->converseDisplayText(); _vm->_timer->removeTimerProc(&hintTimerCallback); @@ -555,7 +555,7 @@ void Puzzle::giveHint(void) { void Puzzle::clearHint(void) { _vm->_interface->converseClear(); - _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0); + _vm->_interface->converseAddText(optionsStr[_lang][kROLater], 0, 0, 0, 0); _vm->_interface->converseDisplayText(); _vm->_interface->setStatusText(" "); } diff --git a/engines/saga/script.h b/engines/saga/script.h index b358a00966..6c8d057848 100644 --- a/engines/saga/script.h +++ b/engines/saga/script.h @@ -474,7 +474,7 @@ private: void setThreadEntrypoint(ScriptThread *thread, int entrypointNumber); public: - void finishDialog(int replyID, int flags, int bitOffset); + void finishDialog(int strID, int replyID, int flags, int bitOffset); private: diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp index b087783a4c..1a439b3b76 100644 --- a/engines/saga/sfuncs.cpp +++ b/engines/saga/sfuncs.cpp @@ -1830,12 +1830,25 @@ void Script::sfPlayVoice(SCRIPTFUNC_PARAMS) { } } -void Script::finishDialog(int replyID, int flags, int bitOffset) { +void Script::finishDialog(int strID, int replyID, int flags, int bitOffset) { byte *addr; + const char *str; if (_conversingThread) { _vm->_interface->setMode(kPanelNull); + if (_vm->getGameType() == GType_IHNM) { + str = _conversingThread->_strings->getString(strID); + if (strcmp(str, "[") != 0) { + int sampleResourceId = -1; + sampleResourceId = _conversingThread->_voiceLUT->voices[strID]; + if (sampleResourceId < 0 || sampleResourceId > 4000) + sampleResourceId = -1; + + _vm->_actor->actorSpeech(_vm->_actor->_protagonist->_id, &str, 1, sampleResourceId, 0); + } + } + _conversingThread->_flags &= ~kTFlagWaiting; _conversingThread->push(replyID); @@ -1911,17 +1924,30 @@ void Script::sfScriptFade(SCRIPTFUNC_PARAMS) { int16 startingBrightness = thread->pop(); int16 endingBrightness = thread->pop(); // delay between pal changes is always 10 (not used) - - Event event; static PalEntry cur_pal[PAL_ENTRIES]; + Event event; + short delta = (startingBrightness < endingBrightness) ? +1 : -1; _vm->_gfx->getCurrentPal(cur_pal); + // TODO: This is still wrong, probably a new event type needs to be added (kEventPalFade) + warning("TODO: sfScriptFade"); + return; + + if (startingBrightness > 255) + startingBrightness = 255; + if (startingBrightness < 0 ) + startingBrightness = 0; + if (endingBrightness > 255) + endingBrightness = 255; + if (endingBrightness < 0) + endingBrightness = 0; + event.type = kEvTImmediate; event.code = kPalEvent; event.op = kEventPalToBlack; event.time = 0; - event.duration = endingBrightness - startingBrightness; + event.duration = kNormalFadeDuration - ((endingBrightness - startingBrightness) * delta); event.data = cur_pal; _vm->_events->queue(&event); diff --git a/engines/saga/sthread.cpp b/engines/saga/sthread.cpp index 4249584941..0749488aca 100644 --- a/engines/saga/sthread.cpp +++ b/engines/saga/sthread.cpp @@ -700,6 +700,7 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) { replyNum = scriptS.readByte(); flags = scriptS.readByte(); iparam1 = 0; + int strID = thread->pop(); if (flags & kReplyOnce) { iparam1 = scriptS.readSint16LE(); @@ -709,8 +710,8 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) { } } - str = thread->_strings->getString(thread->pop()); - if (_vm->_interface->converseAddText(str, replyNum, flags, iparam1)) + str = thread->_strings->getString(strID); + if (_vm->_interface->converseAddText(str, strID, replyNum, flags, iparam1)) warning("Error adding ConverseText (%s, %d, %d, %d)", str, replyNum, flags, iparam1); } break; |