aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/scumm/intern.h4
-rw-r--r--engines/scumm/object.cpp6
-rw-r--r--engines/scumm/script_c64.cpp42
-rw-r--r--engines/scumm/scumm.cpp2
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();
}