diff options
-rw-r--r-- | saga/actor.cpp | 4 | ||||
-rw-r--r-- | saga/actor.h | 2 | ||||
-rw-r--r-- | saga/script.h | 2 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 44 |
4 files changed, 42 insertions, 10 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp index 5b0baf10b3..fc89d06934 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -1749,7 +1749,7 @@ void Actor::nonActorSpeech(const char **strings, int stringsCount, int speechFla _activeSpeech.slowModeCharIndex = 0; } -void Actor::simulSpeech(const char *string, uint16 *actorIds, int actorIdsCount, int speechFlags) { +void Actor::simulSpeech(const char *string, uint16 *actorIds, int actorIdsCount, int speechFlags, int sampleResourceId) { int i; if (_vm->getGameType() == GType_IHNM) { @@ -1769,7 +1769,7 @@ void Actor::simulSpeech(const char *string, uint16 *actorIds, int actorIdsCount, _activeSpeech.strings[0] = string; _activeSpeech.stringsCount = 1; _activeSpeech.speechFlags = speechFlags; - _activeSpeech.sampleResourceId = -1; + _activeSpeech.sampleResourceId = sampleResourceId; _activeSpeech.playing = false; _activeSpeech.slowModeCharIndex = 0; diff --git a/saga/actor.h b/saga/actor.h index 73b584f37b..d1d53e73d7 100644 --- a/saga/actor.h +++ b/saga/actor.h @@ -486,7 +486,7 @@ public: // speech void actorSpeech(uint16 actorId, const char **strings, int stringsCount, uint16 sampleResourceId, int speechFlags); void nonActorSpeech(const char **strings, int stringsCount, int speechFlags); - void simulSpeech(const char *string, uint16 *actorIds, int actorIdsCount, int speechFlags); + void simulSpeech(const char *string, uint16 *actorIds, int actorIdsCount, int speechFlags, int sampleResourceId); void setSpeechColor(int speechColor, int outlineColor) { _activeSpeech.speechColor[0] = speechColor; _activeSpeech.outlineColor[0] = outlineColor; diff --git a/saga/script.h b/saga/script.h index 7e8973e1f5..1639249a57 100644 --- a/saga/script.h +++ b/saga/script.h @@ -509,7 +509,7 @@ private: void sfCheckUserInterrupt(SCRIPTFUNC_PARAMS); void sfScriptWalkRelative(SCRIPTFUNC_PARAMS); void sfScriptMoveRelative(SCRIPTFUNC_PARAMS); - void SF_simulSpeech2(SCRIPTFUNC_PARAMS); + void sfSimulSpeech2(SCRIPTFUNC_PARAMS); void sfPlacard(SCRIPTFUNC_PARAMS); void sfPlacardOff(SCRIPTFUNC_PARAMS); void sfSetProtagState(SCRIPTFUNC_PARAMS); diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index 3b8dd9a3a9..9ef537e1c3 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -97,7 +97,7 @@ void Script::setupScriptFuncList(void) { OPCODE(sfCheckUserInterrupt), OPCODE(sfScriptWalkRelative), OPCODE(sfScriptMoveRelative), - OPCODE(SF_simulSpeech2), + OPCODE(sfSimulSpeech2), OPCODE(sfPlacard), OPCODE(sfPlacardOff), OPCODE(sfSetProtagState), @@ -808,6 +808,7 @@ void Script::sfSimulSpeech(SCRIPTFUNC_PARAMS) { int i; uint16 actorsIds[ACTOR_SPEECH_ACTORS_MAX]; const char *string; + int16 sampleResourceId = -1; stringId = thread->pop(); actorsCount = thread->pop(); @@ -820,7 +821,14 @@ void Script::sfSimulSpeech(SCRIPTFUNC_PARAMS) { string = thread->_strings->getString(stringId); - _vm->_actor->simulSpeech(string, actorsIds, actorsCount, 0); + if (thread->_voiceLUT->voices) { + sampleResourceId = thread->_voiceLUT->voices[stringId]; + if (sampleResourceId <= 0 || sampleResourceId > 4000) + sampleResourceId = -1; + } + + _vm->_actor->simulSpeech(string, actorsIds, actorsCount, 0, sampleResourceId); + thread->wait(kWaitTypeSpeech); } // Script function #36 (0x24) ? @@ -1118,11 +1126,35 @@ void Script::sfScriptMoveRelative(SCRIPTFUNC_PARAMS) { } // Script function #47 (0x2F) -void Script::SF_simulSpeech2(SCRIPTFUNC_PARAMS) { - for (int i = 0; i < nArgs; i++) - thread->pop(); +void Script::sfSimulSpeech2(SCRIPTFUNC_PARAMS) { + int16 stringId; + int16 actorsCount; + int16 speechFlags; + int i; + uint16 actorsIds[ACTOR_SPEECH_ACTORS_MAX]; + const char *string; + int16 sampleResourceId = -1; + + stringId = thread->pop(); + actorsCount = thread->pop(); + speechFlags = thread->pop(); + + if (actorsCount > ACTOR_SPEECH_ACTORS_MAX) + error("sfSimulSpeech2 actorsCount=0x%X exceed ACTOR_SPEECH_ACTORS_MAX", actorsCount); + + for (i = 0; i < actorsCount; i++) + actorsIds[i] = thread->pop(); + + string = thread->_strings->getString(stringId); + + if (thread->_voiceLUT->voices) { + sampleResourceId = thread->_voiceLUT->voices[stringId]; + if (sampleResourceId <= 0 || sampleResourceId > 4000) + sampleResourceId = -1; + } - error(0, "STUB: SF_simulSpeech2(), %d args", nArgs); + _vm->_actor->simulSpeech(string, actorsIds, actorsCount, speechFlags, sampleResourceId); + thread->wait(kWaitTypeSpeech); } static TEXTLIST_ENTRY *placardTextEntry; |