diff options
author | Johannes Schickel | 2008-04-22 22:36:09 +0000 |
---|---|---|
committer | Johannes Schickel | 2008-04-22 22:36:09 +0000 |
commit | 18ed600abea41fee47f92fa798f6fe49c5c37d25 (patch) | |
tree | 31039990e9742c7975f0f7b16c55a42569abf244 /engines/kyra/script_v3.cpp | |
parent | d1d227db831306027ac36b0898f34582dab420d8 (diff) | |
download | scummvm-rg350-18ed600abea41fee47f92fa798f6fe49c5c37d25.tar.gz scummvm-rg350-18ed600abea41fee47f92fa798f6fe49c5c37d25.tar.bz2 scummvm-rg350-18ed600abea41fee47f92fa798f6fe49c5c37d25.zip |
Implemented some kyra3 dialog support.
- Room enter talks by malcolm should be working now
- Zanthia should say now some lines after landing
svn-id: r31660
Diffstat (limited to 'engines/kyra/script_v3.cpp')
-rw-r--r-- | engines/kyra/script_v3.cpp | 92 |
1 files changed, 77 insertions, 15 deletions
diff --git a/engines/kyra/script_v3.cpp b/engines/kyra/script_v3.cpp index 3c27152bcf..19ff1c1a8f 100644 --- a/engines/kyra/script_v3.cpp +++ b/engines/kyra/script_v3.cpp @@ -58,8 +58,8 @@ int KyraEngine_v3::o3_defineObject(ScriptState *script) { stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7)); TalkObject &obj = _talkObjectList[stackPos(0)]; strcpy(obj.filename, stackPosString(1)); - obj.unkD = stackPos(2); - obj.unkE = stackPos(3); + obj.sceneAnim = stackPos(2); + obj.sceneScript = stackPos(3); obj.x = stackPos(4); obj.y = stackPos(5); obj.color = stackPos(6); @@ -173,6 +173,15 @@ int KyraEngine_v3::o3_defineItem(ScriptState *script) { return freeItem; } +int KyraEngine_v3::o3_npcChatSequence(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_npcChatSequence(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); + const int id = stackPos(0); + const char *str = (const char*)getTableEntry(_sceneStrings, id); + if (str) + npcChatSequence(str, stackPos(1), _vocHigh, id); + return 0; +} + int KyraEngine_v3::o3_queryGameFlag(ScriptState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_queryGameFlag(%p) (%d)", (const void *)script, stackPos(0)); return queryGameFlag(stackPos(0)); @@ -328,6 +337,13 @@ int KyraEngine_v3::o3_checkInRect(ScriptState *script) { } } +int KyraEngine_v3::o3_setSceneDim(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setSceneDim(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); + _sceneMinX = stackPos(0); + _sceneMaxX = stackPos(1); + return 0; +} + int KyraEngine_v3::o3_update(ScriptState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_update(%p) (%d)", (const void *)script, stackPos(0)); for (int times = stackPos(0); times != 0; --times) { @@ -528,6 +544,17 @@ int KyraEngine_v3::o3_runActorScript(ScriptState *script) { return 0; } +int KyraEngine_v3::o3_setDlgIndex(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setDlgIndex(%p) (%d)", (const void *)script, stackPos(0)); + setDlgIndex(stackPos(0)); + return 0; +} + +int KyraEngine_v3::o3_getDlgIndex(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getDlgIndex(%p) ()", (const void *)script); + return _mainCharacter.dlgIndex; +} + int KyraEngine_v3::o3_defineScene(ScriptState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_defineScene(%p) (%d, '%s', %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7)); @@ -575,6 +602,18 @@ int KyraEngine_v3::o3_countItemInstances(ScriptState *script) { return count; } +int KyraEngine_v3::o3_dialogStartScript(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_dialogStartScript(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); + dialogStartScript(stackPos(0), stackPos(1)); + return 0; +} + +int KyraEngine_v3::o3_dialogEndScript(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_dialogEndScript(%p) (%d)", (const void *)script, stackPos(0)); + dialogEndScript(stackPos(0)); + return 0; +} + int KyraEngine_v3::o3_setSpecialSceneScriptState(ScriptState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setSpecialSceneScriptState(%p) (%d)", (const void *)script, stackPos(0)); _specialSceneScriptState[stackPos(0)] = 1; @@ -663,17 +702,30 @@ int KyraEngine_v3::o3t_setCurrentFrame(ScriptState *script) { return 0; } -int KyraEngine_v3::o3t_playSoundEffect(ScriptState *script) { - debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3t_playSoundEffect(%p) (%d)", (const void *)script, stackPos(0)); - playSoundEffect(stackPos(0), 200); +#pragma mark - + +int KyraEngine_v3::o3d_updateAnim(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3d_updateAnim(%p) (%d)", (const void *)script, stackPos(0)); + if (_dialogSceneAnim >= 0) + updateSceneAnim(_dialogSceneAnim, stackPos(0)); return 0; } -int KyraEngine_v3::o3t_getMalcolmShapes(ScriptState *script) { - debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3t_getMalcolmShapes(%p) ()", (const void *)script); - return _malcolmShapes; +int KyraEngine_v3::o3d_delay(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3d_delay(%p) (%d)", (const void *)script, stackPos(0)); + const uint32 endTime = _system->getMillis() + stackPos(0) * _tickLength; + while (_system->getMillis() < endTime) { + if (_chatText) + updateWithText(); + else + update(); + _system->delayMillis(10); + } + return 0; } +#pragma mark - + typedef Common::Functor1Mem<ScriptState*, int, KyraEngine_v3> OpcodeV3; #define SetOpcodeTable(x) table = &x; #define Opcode(x) table->push_back(new OpcodeV3(this, &KyraEngine_v3::x)) @@ -730,7 +782,7 @@ void KyraEngine_v3::setupOpcodeTable() { // 0x24 OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(o3_npcChatSequence); Opcode(o3_queryGameFlag); // 0x28 Opcode(o3_resetGameFlag); @@ -769,7 +821,7 @@ void KyraEngine_v3::setupOpcodeTable() { Opcode(o3_dummy); // 0x44 Opcode(o3_dummy); - OpcodeUnImpl(); + Opcode(o3_setSceneDim); OpcodeUnImpl(); Opcode(o3_dummy); // 0x48 @@ -831,9 +883,9 @@ void KyraEngine_v3::setupOpcodeTable() { Opcode(o3_runActorScript); OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(o3_setDlgIndex); // 0x78 - OpcodeUnImpl(); + Opcode(o3_getDlgIndex); Opcode(o3_defineScene); OpcodeUnImpl(); OpcodeUnImpl(); @@ -855,10 +907,10 @@ void KyraEngine_v3::setupOpcodeTable() { // 0x88 Opcode(o3_countItemInstances); Opcode(o3_dummy); - OpcodeUnImpl(); + Opcode(o3_dialogStartScript); Opcode(o3_dummy); // 0x8c - OpcodeUnImpl(); + Opcode(o3_dialogEndScript); Opcode(o3_dummy); Opcode(o3_dummy); Opcode(o3_setSpecialSceneScriptState); @@ -907,11 +959,21 @@ void KyraEngine_v3::setupOpcodeTable() { // 0x00 Opcode(o3t_defineNewShapes); Opcode(o3t_setCurrentFrame); - Opcode(o3t_playSoundEffect); + Opcode(o3_playSoundEffect); Opcode(o3_dummy); // 0x0a OpcodeUnImpl(); Opcode(o3_getRand); + Opcode(o3_getMalcolmShapes); + Opcode(o3_dummy); + + SetOpcodeTable(_opcodesDialog); + // 0x00 + Opcode(o3d_updateAnim); + Opcode(o3d_delay); + Opcode(o3_getRand); + Opcode(o3_queryGameFlag); + // 0x04 Opcode(o3_dummy); } |