diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/scumm/intern.h | 4 | ||||
-rw-r--r-- | engines/scumm/object.cpp | 6 | ||||
-rw-r--r-- | engines/scumm/script_c64.cpp | 42 | ||||
-rw-r--r-- | engines/scumm/scumm.cpp | 2 |
4 files changed, 43 insertions, 11 deletions
diff --git a/engines/scumm/intern.h b/engines/scumm/intern.h index 917275ce61..1af4f8c777 100644 --- a/engines/scumm/intern.h +++ b/engines/scumm/intern.h @@ -436,6 +436,7 @@ protected: void o_getActorMoving(); void o_animateActor(); void o_putActorAtObject(); + void o_pickupObject(); void o_lockSound(); void o_lockActor(); void o_loadActor(); @@ -446,7 +447,6 @@ protected: void o_lockRoom(); void o_cursorCommand(); void o_lights(); - void o_pickupObject(); void o_unlockActor(); void o_unlockScript(); void o_decrement(); @@ -458,7 +458,7 @@ protected: void o_setBitVar(); void o_doSentence(); void o_unknown2(); - void o_unknown3(); + void o_ifActiveOBject(); void o_getClosestObjActor(); void o_printEgo_c64(); void o_print_c64(); diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index 478bbbc2af..23fad05174 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -987,7 +987,7 @@ const byte *ScummEngine::getObjOrActorName(int obj) { byte *objptr; int i; - if (obj < _numActors) + if (obj < _numActors && !(_game.platform == Common::kPlatformC64 && _game.id == GID_MANIAC)) return derefActor(obj, "getObjOrActorName")->getActorName(); for (i = 0; i < _numNewNames; i++) { @@ -1004,7 +1004,9 @@ const byte *ScummEngine::getObjOrActorName(int obj) { if (_game.features & GF_SMALL_HEADER) { byte offset = 0; - if (_game.version <= 2) + if (_game.platform == Common::kPlatformC64 && _game.id == GID_MANIAC) + offset = *(objptr + 13); + else if (_game.version <= 2) offset = *(objptr + 14); else if (_game.features & GF_OLD_BUNDLE) offset = *(objptr + 16); diff --git a/engines/scumm/script_c64.cpp b/engines/scumm/script_c64.cpp index f7349fc311..493064ff78 100644 --- a/engines/scumm/script_c64.cpp +++ b/engines/scumm/script_c64.cpp @@ -162,7 +162,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_stopScript), OPCODE(o_stopCurrentScript), /* 64 */ - OPCODE(o_unknown3), + OPCODE(o_ifActiveOBject), OPCODE(o_stopCurrentScript), OPCODE(o_getClosestObjActor), OPCODE(o5_getActorFacing), @@ -217,7 +217,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_putActorAtObject), OPCODE(o2_setState02), /* 90 */ - OPCODE(o2_pickupObject), + OPCODE(o_pickupObject), OPCODE(o_animateActor), OPCODE(o2_panCameraTo), OPCODE(o_unlockActor), @@ -322,7 +322,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_stopScript), OPCODE(o_stopCurrentScript), /* E4 */ - OPCODE(o_unknown3), + OPCODE(o_ifActiveOBject), OPCODE(o_loadRoomWithEgo), OPCODE(o_stopCurrentScript), OPCODE(o5_getActorFacing), @@ -387,6 +387,7 @@ const char *ScummEngine_c64::getOpcodeDesc(byte i) { int ScummEngine_c64::getObjectFlag() { if (_opcode & 0x40) return _activeObject; + return fetchScriptByte(); } @@ -656,6 +657,31 @@ void ScummEngine_c64::o_putActorAtObject() { a->putActor(x, y, a->_room); } +void ScummEngine_c64::o_pickupObject() { + int obj = fetchScriptByte(); + if (obj == 0) { + obj = _activeObject; + } + + if (obj < 1) { + error("pickupObject received invalid index %d (script %d)", obj, vm.slot[_currentScript].number); + } + + if (getObjectIndex(obj) == -1) + return; + + if (whereIsObject(obj) == WIO_INVENTORY) /* Don't take an */ + return; /* object twice */ + + addObjectToInventory(obj, _roomResource); + markObjectRectAsDirty(obj); + putOwner(obj, VAR(VAR_EGO)); + putState(obj, getState(obj) | 0xA); + clearDrawObjectQueue(); + + runInventoryScript(1); +} + void ScummEngine_c64::o_badOpcode() { warning("Bad opcode 0x86 encountered"); } @@ -732,9 +758,13 @@ void ScummEngine_c64::o_unknown2() { warning("STUB: o_unknown2(%d)", var1); } -void ScummEngine_c64::o_unknown3() { - byte var1 = fetchScriptByte(); - warning("STUB: o_unknown3(%d)", var1); +void ScummEngine_c64::o_ifActiveOBject() { + byte obj = fetchScriptByte(); + + if (obj == _activeObject) + ScummEngine::fetchScriptWord(); + else + o_jumpRelative(); } void ScummEngine_c64::o_getClosestObjActor() { diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index f966aec62a..ec2d44aefd 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -1486,7 +1486,7 @@ void ScummEngine::scummInit() { } void ScummEngine_c64::scummInit() { - ScummEngine::scummInit(); + ScummEngine_v2::scummInit(); initC64Verbs(); } |