diff options
Diffstat (limited to 'engines/scumm')
-rw-r--r-- | engines/scumm/intern.h | 3 | ||||
-rw-r--r-- | engines/scumm/script_c64.cpp | 47 | ||||
-rw-r--r-- | engines/scumm/vars.cpp | 9 | ||||
-rw-r--r-- | engines/scumm/verbs.cpp | 5 |
4 files changed, 44 insertions, 20 deletions
diff --git a/engines/scumm/intern.h b/engines/scumm/intern.h index 16a8adc231..917275ce61 100644 --- a/engines/scumm/intern.h +++ b/engines/scumm/intern.h @@ -412,6 +412,7 @@ protected: virtual const char *getOpcodeDesc(byte i); virtual void setupScummVars(); + virtual void initScummVars(); virtual void decodeParseString(); void initC64Verbs(); @@ -453,6 +454,8 @@ protected: void o_nop(); void o_getActorBitVar(); void o_setActorBitVar(); + void o_getBitVar(); + void o_setBitVar(); void o_doSentence(); void o_unknown2(); void o_unknown3(); diff --git a/engines/scumm/script_c64.cpp b/engines/scumm/script_c64.cpp index 2e8ff5f4d6..f7349fc311 100644 --- a/engines/scumm/script_c64.cpp +++ b/engines/scumm/script_c64.cpp @@ -73,7 +73,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_getActorBitVar), /* 1C */ OPCODE(o5_startSound), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifState04), /* 20 */ @@ -98,7 +98,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_ifState08), /* 30 */ OPCODE(o_loadActor), - OPCODE(o2_getBitVar), + OPCODE(o_getBitVar), OPCODE(o2_setCameraAt), OPCODE(o_lockScript), /* 34 */ @@ -113,7 +113,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_stopCurrentScript), /* 3C */ OPCODE(o5_stopSound), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifState02), /* 40 */ @@ -153,7 +153,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_getActorBitVar), /* 5C */ OPCODE(o5_startSound), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifState04), /* 60 */ @@ -178,7 +178,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_ifState08), /* 70 */ OPCODE(o_lights), - OPCODE(o2_getBitVar), + OPCODE(o_getBitVar), OPCODE(o_nop), OPCODE(o5_getObjectOwner), /* 74 */ @@ -193,7 +193,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_stopCurrentScript), /* 7C */ OPCODE(o5_isSoundRunning), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifNotState02), /* 80 */ @@ -233,7 +233,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_getActorBitVar), /* 9C */ OPCODE(o5_startSound), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifNotState04), /* A0 */ @@ -258,7 +258,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_ifNotState08), /* B0 */ OPCODE(o_loadActor), - OPCODE(o2_getBitVar), + OPCODE(o_getBitVar), OPCODE(o2_setCameraAt), OPCODE(o_unlockScript), /* B4 */ @@ -273,7 +273,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_stopCurrentScript), /* BC */ OPCODE(o5_stopSound), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifNotState02), /* C0 */ @@ -313,7 +313,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_getActorBitVar), /* DC */ OPCODE(o5_startSound), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifNotState04), /* E0 */ @@ -338,7 +338,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_ifNotState08), /* F0 */ OPCODE(o_lights), - OPCODE(o2_getBitVar), + OPCODE(o_getBitVar), OPCODE(o_nop), OPCODE(o5_getObjectOwner), /* F4 */ @@ -353,7 +353,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o_stopCurrentScript), /* FC */ OPCODE(o5_isSoundRunning), - OPCODE(o2_setBitVar), + OPCODE(o_setBitVar), OPCODE(o2_walkActorTo), OPCODE(o2_ifState02) }; @@ -687,6 +687,29 @@ void ScummEngine_c64::o_getActorBitVar() { warning("STUB: o_getActorBitVar(%d, %d)", flag, mask); } +void ScummEngine_c64::o_setBitVar() { + int var = getVarOrDirectByte(PARAM_1); + byte mask = getVarOrDirectByte(PARAM_2); + byte mod = getVarOrDirectByte(PARAM_3); + + if (mod) + _scummVars[var] |= (1 << mask); + else + _scummVars[var] &= ~(1 << mask); + + debug(0, "o_setBitVar (%d, %d %d)", var, mask, mod); +} + +void ScummEngine_c64::o_getBitVar() { + getResultPos(); + int var = getVarOrDirectByte(PARAM_1); + byte mask = getVarOrDirectByte(PARAM_2); + + setResult((_scummVars[var] & (1 << mask)) ? 1 : 0); + + debug(0, "o_getBitVar (%d, %d %d)", var, mask, _scummVars[var] & (1 << mask)); +} + void ScummEngine_c64::o_print_c64() { _actorToPrintStrFor = fetchScriptByte(); decodeParseString(); diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp index 879524f519..c1a7bff5de 100644 --- a/engines/scumm/vars.cpp +++ b/engines/scumm/vars.cpp @@ -543,12 +543,13 @@ void ScummEngine_v8::setupScummVars() { } #endif -void ScummEngine_v2::initScummVars() { +void ScummEngine_c64::initScummVars() { + _activeVerb = 13; - if (_game.platform == Common::kPlatformC64 && _game.id == GID_MANIAC) { - VAR(VAR_EGO) = 3; - } + VAR(VAR_EGO) = 3; +} +void ScummEngine_v2::initScummVars() { // This needs to be at least greater than 40 to get the more // elaborate version of the EGA Zak into. I don't know where // else it makes any difference. diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp index 3740ccbd50..d77f332f4e 100644 --- a/engines/scumm/verbs.cpp +++ b/engines/scumm/verbs.cpp @@ -521,13 +521,10 @@ void ScummEngine_c64::checkExecVerbs() { return; } - // HACK: Reset value - VAR(VAR_EGO) = 3; - int object = findObject(_virtualMouse.x, _virtualMouse.y); if (object) { _activeObject = object; - if (_currentMode == 3 && _activeVerb == 13) { + if (_currentMode == 3) { int x, y, dir; a = derefActor(VAR(VAR_EGO), "checkExecVerbs"); getObjectXYPos(object, x, y, dir); |