aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorOystein Eftevaag2007-10-13 18:47:52 +0000
committerOystein Eftevaag2007-10-13 18:47:52 +0000
commit4f93e96d5ff321ad051f0cee9c6083fe85ad1686 (patch)
treebabb7327da4e35b703453a14a87c32f077815e8c /engines/kyra
parent3f7b4e62ccb9ee97d75aecc773ff7a125903c4bd (diff)
downloadscummvm-rg350-4f93e96d5ff321ad051f0cee9c6083fe85ad1686.tar.gz
scummvm-rg350-4f93e96d5ff321ad051f0cee9c6083fe85ad1686.tar.bz2
scummvm-rg350-4f93e96d5ff321ad051f0cee9c6083fe85ad1686.zip
Implemented the o2_setCharacterAnimFrame opcode and made sure o2_delay does game updates during the delay
svn-id: r29208
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/kyra_v2.cpp20
-rw-r--r--engines/kyra/kyra_v2.h4
-rw-r--r--engines/kyra/script_v2.cpp14
3 files changed, 36 insertions, 2 deletions
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp
index ebde29f4d1..fa1394ba9c 100644
--- a/engines/kyra/kyra_v2.cpp
+++ b/engines/kyra/kyra_v2.cpp
@@ -671,6 +671,24 @@ void KyraEngine_v2::removeInputTop() {
_eventList.erase(_eventList.begin());
}
+void KyraEngine_v2::delay(uint32 amount, bool updateGame, bool isMainLoop) {
+
+ uint32 start = _system->getMillis();
+ do {
+ if (updateGame) {
+ if (_chatText)
+ updateWithText();
+ else
+ update();
+ }
+
+
+ if (amount > 0 )
+ _system->delayMillis(amount > 10 ? 10 : amount);
+
+ } while (!_skipFlag && _system->getMillis() < start + amount && !_quitFlag);
+}
+
void KyraEngine_v2::cleanup() {
delete [] _gamePlayBuffer;
delete [] _unkBuf500Bytes;
@@ -1460,7 +1478,7 @@ void KyraEngine_v2::setupOpcodeTable() {
Opcode(o2_setSceneComment),
OpcodeUnImpl(),
OpcodeUnImpl(),
- OpcodeUnImpl(),
+ Opcode(o2_setCharacterAnimFrame),
// 0x0c
OpcodeUnImpl(),
Opcode(o2_trySceneChange),
diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h
index c0cdcb0c32..a46e0a0960 100644
--- a/engines/kyra/kyra_v2.h
+++ b/engines/kyra/kyra_v2.h
@@ -540,6 +540,9 @@ protected:
void setTimer1DelaySecs(int secs);
+ // delay
+ void delay(uint32 millis, bool updateGame = false, bool isMainLoop = false);
+
// opcodes
int o2_setCharacterFacingRefresh(ScriptState *script);
int o2_defineObject(ScriptState *script);
@@ -548,6 +551,7 @@ protected:
int o2_getCharacterY(ScriptState *script);
int o2_getCharacterFacing(ScriptState *script);
int o2_setSceneComment(ScriptState *script);
+ int o2_setCharacterAnimFrame(ScriptState *script);
int o2_trySceneChange(ScriptState *script);
int o2_showChapterMessage(ScriptState *script);
int o2_wsaClose(ScriptState *script);
diff --git a/engines/kyra/script_v2.cpp b/engines/kyra/script_v2.cpp
index 5b45be410b..deea962690 100644
--- a/engines/kyra/script_v2.cpp
+++ b/engines/kyra/script_v2.cpp
@@ -90,6 +90,18 @@ int KyraEngine_v2::o2_setSceneComment(ScriptState *script) {
return 0;
}
+int KyraEngine_v2::o2_setCharacterAnimFrame(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "o2_setCharacterAnimFrame(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
+ int animFrame = stackPos(1);
+ int skipRefresh = stackPos(2);
+
+ _mainCharacter.animFrame = animFrame;
+ if (skipRefresh)
+ updateCharacterAnim(0);
+
+ return 0;
+}
+
int KyraEngine_v2::o2_trySceneChange(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "o2_trySceneChange(%p) (%d, %d, %d, %d)", (const void *)script,
stackPos(0), stackPos(1), stackPos(2), stackPos(3));
@@ -292,7 +304,7 @@ int KyraEngine_v2::o2_delay(ScriptState *script) {
//if (stackPos(1))
// sub_27100(stackPos(0) * _tickLength);
//else
- delay(stackPos(0) * _tickLength);
+ delay(stackPos(0) * _tickLength, true);
return 0;
}