Fix inventory display in C64 maniac

svn-id: r21003
This commit is contained in:
Travis Howell 2006-03-02 05:04:40 +00:00
parent 2584f0d69f
commit 2c9f041178
4 changed files with 43 additions and 11 deletions

View file

@ -436,6 +436,7 @@ protected:
void o_getActorMoving(); void o_getActorMoving();
void o_animateActor(); void o_animateActor();
void o_putActorAtObject(); void o_putActorAtObject();
void o_pickupObject();
void o_lockSound(); void o_lockSound();
void o_lockActor(); void o_lockActor();
void o_loadActor(); void o_loadActor();
@ -446,7 +447,6 @@ protected:
void o_lockRoom(); void o_lockRoom();
void o_cursorCommand(); void o_cursorCommand();
void o_lights(); void o_lights();
void o_pickupObject();
void o_unlockActor(); void o_unlockActor();
void o_unlockScript(); void o_unlockScript();
void o_decrement(); void o_decrement();
@ -458,7 +458,7 @@ protected:
void o_setBitVar(); void o_setBitVar();
void o_doSentence(); void o_doSentence();
void o_unknown2(); void o_unknown2();
void o_unknown3(); void o_ifActiveOBject();
void o_getClosestObjActor(); void o_getClosestObjActor();
void o_printEgo_c64(); void o_printEgo_c64();
void o_print_c64(); void o_print_c64();

View file

@ -987,7 +987,7 @@ const byte *ScummEngine::getObjOrActorName(int obj) {
byte *objptr; byte *objptr;
int i; int i;
if (obj < _numActors) if (obj < _numActors && !(_game.platform == Common::kPlatformC64 && _game.id == GID_MANIAC))
return derefActor(obj, "getObjOrActorName")->getActorName(); return derefActor(obj, "getObjOrActorName")->getActorName();
for (i = 0; i < _numNewNames; i++) { for (i = 0; i < _numNewNames; i++) {
@ -1004,7 +1004,9 @@ const byte *ScummEngine::getObjOrActorName(int obj) {
if (_game.features & GF_SMALL_HEADER) { if (_game.features & GF_SMALL_HEADER) {
byte offset = 0; 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); offset = *(objptr + 14);
else if (_game.features & GF_OLD_BUNDLE) else if (_game.features & GF_OLD_BUNDLE)
offset = *(objptr + 16); offset = *(objptr + 16);

View file

@ -162,7 +162,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o2_stopScript), OPCODE(o2_stopScript),
OPCODE(o_stopCurrentScript), OPCODE(o_stopCurrentScript),
/* 64 */ /* 64 */
OPCODE(o_unknown3), OPCODE(o_ifActiveOBject),
OPCODE(o_stopCurrentScript), OPCODE(o_stopCurrentScript),
OPCODE(o_getClosestObjActor), OPCODE(o_getClosestObjActor),
OPCODE(o5_getActorFacing), OPCODE(o5_getActorFacing),
@ -217,7 +217,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o_putActorAtObject), OPCODE(o_putActorAtObject),
OPCODE(o2_setState02), OPCODE(o2_setState02),
/* 90 */ /* 90 */
OPCODE(o2_pickupObject), OPCODE(o_pickupObject),
OPCODE(o_animateActor), OPCODE(o_animateActor),
OPCODE(o2_panCameraTo), OPCODE(o2_panCameraTo),
OPCODE(o_unlockActor), OPCODE(o_unlockActor),
@ -322,7 +322,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o2_stopScript), OPCODE(o2_stopScript),
OPCODE(o_stopCurrentScript), OPCODE(o_stopCurrentScript),
/* E4 */ /* E4 */
OPCODE(o_unknown3), OPCODE(o_ifActiveOBject),
OPCODE(o_loadRoomWithEgo), OPCODE(o_loadRoomWithEgo),
OPCODE(o_stopCurrentScript), OPCODE(o_stopCurrentScript),
OPCODE(o5_getActorFacing), OPCODE(o5_getActorFacing),
@ -387,6 +387,7 @@ const char *ScummEngine_c64::getOpcodeDesc(byte i) {
int ScummEngine_c64::getObjectFlag() { int ScummEngine_c64::getObjectFlag() {
if (_opcode & 0x40) if (_opcode & 0x40)
return _activeObject; return _activeObject;
return fetchScriptByte(); return fetchScriptByte();
} }
@ -656,6 +657,31 @@ void ScummEngine_c64::o_putActorAtObject() {
a->putActor(x, y, a->_room); 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() { void ScummEngine_c64::o_badOpcode() {
warning("Bad opcode 0x86 encountered"); warning("Bad opcode 0x86 encountered");
} }
@ -732,9 +758,13 @@ void ScummEngine_c64::o_unknown2() {
warning("STUB: o_unknown2(%d)", var1); warning("STUB: o_unknown2(%d)", var1);
} }
void ScummEngine_c64::o_unknown3() { void ScummEngine_c64::o_ifActiveOBject() {
byte var1 = fetchScriptByte(); byte obj = fetchScriptByte();
warning("STUB: o_unknown3(%d)", var1);
if (obj == _activeObject)
ScummEngine::fetchScriptWord();
else
o_jumpRelative();
} }
void ScummEngine_c64::o_getClosestObjActor() { void ScummEngine_c64::o_getClosestObjActor() {

View file

@ -1486,7 +1486,7 @@ void ScummEngine::scummInit() {
} }
void ScummEngine_c64::scummInit() { void ScummEngine_c64::scummInit() {
ScummEngine::scummInit(); ScummEngine_v2::scummInit();
initC64Verbs(); initC64Verbs();
} }