aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/saga/interface.cpp5
-rw-r--r--engines/saga/interface.h3
-rw-r--r--engines/saga/puzzle.cpp16
-rw-r--r--engines/saga/script.h2
-rw-r--r--engines/saga/sfuncs.cpp34
-rw-r--r--engines/saga/sthread.cpp5
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;