aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorFlorian Kagerer2008-03-15 20:24:26 +0000
committerFlorian Kagerer2008-03-15 20:24:26 +0000
commitfd7ed046bb89f91c767b762dd1ea336b798a3bbf (patch)
treee835e3f0fd28ce533da27dea2ec606a9e55091c5 /engines/kyra
parentf88a2923cd45fa5ad597599c1fb68a9b6ecc6432 (diff)
downloadscummvm-rg350-fd7ed046bb89f91c767b762dd1ea336b798a3bbf.tar.gz
scummvm-rg350-fd7ed046bb89f91c767b762dd1ea336b798a3bbf.tar.bz2
scummvm-rg350-fd7ed046bb89f91c767b762dd1ea336b798a3bbf.zip
- some more opcodes for wsa and tim sequences
- adding some code to inputSceneChange svn-id: r31132
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/kyra_v2.cpp36
-rw-r--r--engines/kyra/kyra_v2.h5
-rw-r--r--engines/kyra/script_v2.cpp37
-rw-r--r--engines/kyra/sequences_tim.cpp20
4 files changed, 78 insertions, 20 deletions
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp
index d0af3210a8..43a94201e8 100644
--- a/engines/kyra/kyra_v2.cpp
+++ b/engines/kyra/kyra_v2.cpp
@@ -1294,26 +1294,28 @@ int KyraEngine_v2::inputSceneChange(int x, int y, int unk1, int unk2) {
}
}
+ int strId = 0;
+ int vocH = _flags.isTalkie ? 131 : -1;
+
if (_pathfinderFlag) {
- if (findItem(curScene, 13) >= 0 && _unk3 <= -3) {
- //XXX
- _pathfinderFlag = 0;
- return 0;
+ if (findItem(curScene, 13) >= 0 && _unk3 <= -3) {
+ strId = 252;
} else if (_itemInHand == 72) {
- //XXX
- _pathfinderFlag = 0;
- return 0;
+ strId = 257;
} else if (findItem(curScene, 72) >= 0 && _unk3 <= -3) {
- //XXX
- _pathfinderFlag = 0;
- return 0;
- } else if (0/*XXX*/) {
- //XXX
- _pathfinderFlag = 0;
- return 0;
+ strId = 256;
+ } else if (getInventoryItemSlot(72) != -1 && _unk3 <= -3) {
+ strId = 257;
}
}
+ if (strId) {
+ updateCharFacing();
+ objectChat(getTableString(strId, _cCodeBuffer, 1), 0, vocH, strId);
+ _pathfinderFlag = 0;
+ return 0;
+ }
+
if (ABS(_mainCharacter.x1 - x) < 4 || ABS(_mainCharacter.y1 - y) < 2)
return 0;
@@ -2111,9 +2113,9 @@ void KyraEngine_v2::setupOpcodeTable() {
OpcodeUnImpl(),
Opcode(o2_displayWsaFrame),
// 0x18
- Opcode(o2_displayWsaSequentialFrames),
+ Opcode(o2_displayWsaSequentialFramesLooping),
Opcode(o2_wsaOpen),
- OpcodeUnImpl(),
+ Opcode(o2_displayWsaSequentialFrames),
OpcodeUnImpl(),
// 0x1c
OpcodeUnImpl(),
@@ -2257,7 +2259,7 @@ void KyraEngine_v2::setupOpcodeTable() {
Opcode(o2_npcChat),
// 0x8c
Opcode(o2_deinitObject),
- OpcodeUnImpl(),
+ Opcode(o2_playTimSequence),
Opcode(o2_makeBookOrCauldronAppear),
Opcode(o2_setSpecialSceneScriptState),
// 0x90
diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h
index d3f503bc2b..221485aaa4 100644
--- a/engines/kyra/kyra_v2.h
+++ b/engines/kyra/kyra_v2.h
@@ -824,6 +824,7 @@ protected:
uint8 *tim_loadFile(const char *filename, uint8 *buffer, int32 bufferSize);
void tim_releaseBuffer(uint8 *buffer);
void tim_processSequence(uint8 *timBuffer, int loop);
+ void tim_playFullSequence(const char *filename);
int tim_o_dummy_r0(uint8 *ptr);
int tim_o_dummy_r1(uint8 *ptr);
@@ -947,8 +948,9 @@ protected:
int o2_showChapterMessage(ScriptState *script);
int o2_wsaClose(ScriptState *script);
int o2_displayWsaFrame(ScriptState *script);
- int o2_displayWsaSequentialFrames(ScriptState *script);
+ int o2_displayWsaSequentialFramesLooping(ScriptState *script);
int o2_wsaOpen(ScriptState *script);
+ int o2_displayWsaSequentialFrames(ScriptState *script);
int o2_checkForItem(ScriptState *script);
int o2_defineItem(ScriptState *script);
int o2_removeItemFromInventory(ScriptState *script);
@@ -1015,6 +1017,7 @@ protected:
int o2_initObject(ScriptState *script);
int o2_npcChat(ScriptState *script);
int o2_deinitObject(ScriptState *script);
+ int o2_playTimSequence(ScriptState *script);
int o2_makeBookOrCauldronAppear(ScriptState *script);
int o2_setSpecialSceneScriptState(ScriptState *script);
int o2_clearSpecialSceneScriptState(ScriptState *script);
diff --git a/engines/kyra/script_v2.cpp b/engines/kyra/script_v2.cpp
index 1e2d1a76d0..c926683194 100644
--- a/engines/kyra/script_v2.cpp
+++ b/engines/kyra/script_v2.cpp
@@ -190,8 +190,8 @@ int KyraEngine_v2::o2_displayWsaFrame(ScriptState *script) {
return 0;
}
-int KyraEngine_v2::o2_displayWsaSequentialFrames(ScriptState *script) {
- debugC(3, kDebugLevelScriptFuncs, "o2_displayWsaSequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script,
+int KyraEngine_v2::o2_displayWsaSequentialFramesLooping(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "o2_displayWsaSequentialFramesLooping(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script,
stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
int startFrame = stackPos(0);
int endFrame = stackPos(1);
@@ -253,6 +253,33 @@ int KyraEngine_v2::o2_wsaOpen(ScriptState *script) {
return 0;
}
+int KyraEngine_v2::o2_displayWsaSequentialFrames(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "o2_displayWsaSequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6));
+
+ uint16 frameDelay = stackPos(2) * _tickLength;
+ uint16 currentFrame = stackPos(3);
+ uint16 lastFrame = stackPos(4);
+ uint16 index = stackPos(5);
+ uint16 copyParam = stackPos(6) | 0xc000;
+
+ _wsaSlots[index]->setX(stackPos(0));
+ _wsaSlots[index]->setY(stackPos(1));
+ _wsaSlots[index]->setDrawPage(0);
+
+ _screen->hideMouse();
+
+ while (currentFrame <= lastFrame) {
+ uint32 endTime = _system->getMillis() + frameDelay;
+ _wsaSlots[index]->displayFrame(currentFrame++, copyParam);
+ _screen->updateScreen();
+ delayUntil(endTime);
+ }
+
+ _screen->showMouse();
+
+ return 0;
+}
+
int KyraEngine_v2::o2_checkForItem(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "o2_checkForItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
return findItem(stackPos(0), stackPos(1)) == -1 ? 0 : 1;
@@ -924,6 +951,12 @@ int KyraEngine_v2::o2_deinitObject(ScriptState *script) {
return 0;
}
+int KyraEngine_v2::o2_playTimSequence(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "o2_playTimSequence(%p) ('%s')", (const void *)script, stackPosString(0));
+ tim_playFullSequence(stackPosString(0));
+ return 0;
+}
+
int KyraEngine_v2::o2_makeBookOrCauldronAppear(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "o2_makeBookOrCauldronAppear(%p) (%d)", (const void *)script, stackPos(0));
seq_makeBookOrCauldronAppear(stackPos(0));
diff --git a/engines/kyra/sequences_tim.cpp b/engines/kyra/sequences_tim.cpp
index a072f2f64d..f7f62dd42a 100644
--- a/engines/kyra/sequences_tim.cpp
+++ b/engines/kyra/sequences_tim.cpp
@@ -176,6 +176,26 @@ void KyraEngine_v2::tim_processSequence(uint8 *timBuffer, int loop) {
}
+void KyraEngine_v2::tim_playFullSequence(const char *filename) {
+ uint8 *ptr = tim_loadFile(filename, 0, 0);
+ if (!ptr)
+ return;
+
+ _objectChatFinished = 0;
+
+ while (ptr && !_objectChatFinished) {
+ if (ptr)
+ tim_processSequence(ptr, 0);
+ if (_timChatText)
+ updateWithText();
+ else
+ update();
+ }
+
+ if (ptr)
+ tim_releaseBuffer(ptr);
+}
+
int KyraEngine_v2::tim_o_dummy_r0(uint8 *ptr) {
return 0;
}