aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/script_v3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/kyra/script_v3.cpp')
-rw-r--r--engines/kyra/script_v3.cpp104
1 files changed, 99 insertions, 5 deletions
diff --git a/engines/kyra/script_v3.cpp b/engines/kyra/script_v3.cpp
index e309b1ee1c..3c27152bcf 100644
--- a/engines/kyra/script_v3.cpp
+++ b/engines/kyra/script_v3.cpp
@@ -190,6 +190,18 @@ int KyraEngine_v3::o3_setGameFlag(ScriptState *script) {
return 1;
}
+int KyraEngine_v3::o3_setHandItem(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setHandItem(%p) (%d)", (const void *)script, stackPos(0));
+ setHandItem(stackPos(0));
+ return 0;
+}
+
+int KyraEngine_v3::o3_removeHandItem(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_removeHandItem(%p) ()", (const void *)script);
+ removeHandItem();
+ return 0;
+}
+
int KyraEngine_v3::o3_getHandItem(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getHandItem(%p) ()", (const void *)script);
return _itemInHand;
@@ -235,6 +247,33 @@ int KyraEngine_v3::o3_badConscienceChat(ScriptState *script) {
return 0;
}
+int KyraEngine_v3::o3_wipeDownMouseItem(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o3_wipeDownMouseItem(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
+ _screen->hideMouse();
+ const int x = stackPos(1) - 12;
+ const int y = stackPos(2) - 19;
+
+ if (_itemInHand >= 0) {
+ backUpGfxRect32x32(x, y);
+ uint8 *shape = getShapePtr(_itemInHand+248);
+ for (int curY = y, height = 20; height > 0; height -= 2, curY += 2) {
+ restoreGfxRect32x32(x, y);
+ _screen->setNewShapeHeight(shape, height);
+ uint32 waitTime = _system->getMillis() + _tickLength;
+ _screen->drawShape(0, shape, x, curY, 0, 0);
+ _screen->updateScreen();
+ delayUntil(waitTime);
+ }
+ restoreGfxRect32x32(x, y);
+ _screen->resetShapeHeight(shape);
+ }
+
+ _screen->showMouse();
+ removeHandItem();
+
+ return 0;
+}
+
int KyraEngine_v3::o3_delay(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_delay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
const uint32 delayTime = stackPos(0) * _tickLength;
@@ -455,6 +494,40 @@ int KyraEngine_v3::o3_updateSceneAnim(ScriptState *script) {
return 0;
}
+int KyraEngine_v3::o3_runActorScript(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_runActorScript(%p) ()", (const void *)script);
+ ScriptData data;
+ ScriptState state;
+ memset(&data, 0, sizeof(data));
+ memset(&state, 0, sizeof(state));
+
+ _res->exists("_ACTOR.EMC", true);
+ _scriptInterpreter->loadScript("_ACTOR.EMC", &data, &_opcodes);
+ _scriptInterpreter->initScript(&state, &data);
+ _scriptInterpreter->startScript(&state, 0);
+
+ state.regs[4] = _itemInHand;
+ state.regs[0] = _mainCharacter.sceneId;
+
+ int vocHigh = _vocHigh;
+ _vocHigh = 200;
+ _useActorBuffer = true;
+
+ while (_scriptInterpreter->validScript(&state))
+ _scriptInterpreter->runScript(&state);
+
+ _useActorBuffer = false;
+ _vocHigh = vocHigh;
+ _scriptInterpreter->unloadScript(&data);
+
+ if (queryGameFlag(0x218)) {
+ resetGameFlag(0x218);
+ enterNewScene(78, -1, 0, 0, 0);
+ }
+
+ return 0;
+}
+
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));
@@ -481,6 +554,27 @@ int KyraEngine_v3::o3_defineScene(ScriptState *script) {
return 0;
}
+int KyraEngine_v3::o3_countItemInstances(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_countItemInstances(%p) (%d)", (const void *)script, stackPos(0));
+ int count = 0;
+ const int16 item = stackPos(0);
+
+ for (int i = 0; i < 10; ++i) {
+ if (_mainCharacter.inventory[i] == item)
+ ++count;
+ }
+
+ if (_itemInHand == item)
+ ++count;
+
+ for (int i = 0; i < 50; ++i) {
+ if (_itemList[i].id == item)
+ ++count;
+ }
+
+ return count;
+}
+
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;
@@ -641,8 +735,8 @@ void KyraEngine_v3::setupOpcodeTable() {
// 0x28
Opcode(o3_resetGameFlag);
Opcode(o3_setGameFlag);
- OpcodeUnImpl();
- OpcodeUnImpl();
+ Opcode(o3_setHandItem);
+ Opcode(o3_removeHandItem);
// 0x2c
Opcode(o3_getHandItem);
Opcode(o3_hideMouse);
@@ -651,7 +745,7 @@ void KyraEngine_v3::setupOpcodeTable() {
// 0x30
Opcode(o3_showMouse);
Opcode(o3_badConscienceChat);
- OpcodeUnImpl();
+ Opcode(o3_wipeDownMouseItem);
Opcode(o3_dummy);
// 0x34
OpcodeUnImpl();
@@ -734,7 +828,7 @@ void KyraEngine_v3::setupOpcodeTable() {
Opcode(o3_updateSceneAnim);
Opcode(o3_dummy);
// 0x74
- OpcodeUnImpl();
+ Opcode(o3_runActorScript);
OpcodeUnImpl();
OpcodeUnImpl();
OpcodeUnImpl();
@@ -759,7 +853,7 @@ void KyraEngine_v3::setupOpcodeTable() {
Opcode(o3_dummy);
Opcode(o3_dummy);
// 0x88
- OpcodeUnImpl();
+ Opcode(o3_countItemInstances);
Opcode(o3_dummy);
OpcodeUnImpl();
Opcode(o3_dummy);