diff options
Diffstat (limited to 'engines/scumm')
-rw-r--r-- | engines/scumm/script_v4.cpp | 75 | ||||
-rw-r--r-- | engines/scumm/script_v5.cpp | 76 | ||||
-rw-r--r-- | engines/scumm/scumm_v4.h | 1 | ||||
-rw-r--r-- | engines/scumm/scumm_v5.h | 1 |
4 files changed, 78 insertions, 75 deletions
diff --git a/engines/scumm/script_v4.cpp b/engines/scumm/script_v4.cpp index 630c09642e..5691f6707c 100644 --- a/engines/scumm/script_v4.cpp +++ b/engines/scumm/script_v4.cpp @@ -42,6 +42,9 @@ void ScummEngine_v4::setupOpcodes() { OPCODE(0x50, o4_pickupObject); OPCODE(0xd0, o4_pickupObject); + + OPCODE(0x5c, o4_oldRoomEffect); + OPCODE(0xdc, o4_oldRoomEffect); } void ScummEngine_v4::o4_pickupObject() { @@ -67,4 +70,76 @@ void ScummEngine_v4::o4_pickupObject() { runInventoryScript(1); } +void ScummEngine_v4::o4_oldRoomEffect() { + int a; + + _opcode = fetchScriptByte(); + if ((_opcode & 0x1F) == 3) { + a = getVarOrDirectWord(PARAM_1); + +#if 1 + if (_game.platform == Common::kPlatformFMTowns && _game.version == 3) { + // FIXME / TODO: OK the first thing to note is: at least in Zak256, + // maybe also in other games, this opcode does a bit more. I added + // some stubs here, but somebody with a full IDA or more knowledge + // about this will have to fill in the gaps. At least now we know + // that something is missing here :-) + + if (a == 4) { + //printf("o5_oldRoomEffect ODDBALL: _opcode = 0x%x, a = 0x%x\n", _opcode, a); + // No idea what byte_2FCCF is, but it's a globale boolean flag. + // I only add it here as a temporary hack to make the pseudo code compile. + // Maybe it is just there as a reentry protection guard, given + // how it is used? It might also correspond to _screenEffectFlag. + int byte_2FCCF = 0; + + // For now, we force a redraw of the screen background. This + // way the Zak end credits seem to work mostly correct. + VirtScreen *vs = &_virtscr[kMainVirtScreen]; + restoreBackground(Common::Rect(0, vs->topline, vs->w, vs->topline + vs->h)); + vs->setDirtyRange(0, vs->h); + updateDirtyScreen(kMainVirtScreen); + + if (byte_2FCCF) { + // Here now "sub_1C44" is called, which sets byte_2FCCF to 0 then + // calls yet another sub (which also reads byte_2FCCF): + + byte_2FCCF = 0; + //call sub_0BB3 + + + // Now sub_085C is called. This is quite simply: it sets + // 0xF000 bytes. starting at 0x40000 to 0. No idea what that + // buffer is, maybe a screen buffer, though. Note that + // 0xF000 = 320*192. + // Maybe this is also the charset mask being cleaned? + + // call sub_085C + + + // And then sub_1C54 is called, which is almost identical to + // the above sub_1C44, only it sets byte_2FCCF to 1: + + byte_2FCCF = 1; + // call sub_0BB3 + + } else { + // Here only sub_085C is called (see comment above) + + // call sub_085C + } + return; + } +#endif + + } + if (a) { + _switchRoomEffect = (byte)(a & 0xFF); + _switchRoomEffect2 = (byte)(a >> 8); + } else { + fadeIn(_newEffect); + } + } +} + } // End of namespace Scumm diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index 12ee82438c..97c79a367a 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -155,7 +155,7 @@ void ScummEngine_v5::setupOpcodes() { OPCODE(0x5a, o5_add); OPCODE(0x5b, o5_divide); /* 5C */ - OPCODE(0x5c, o5_oldRoomEffect); +// OPCODE(0x5c, o5_oldRoomEffect); OPCODE(0x5d, o5_setClass); OPCODE(0x5e, o5_walkActorTo); OPCODE(0x5f, o5_isActorInBox); @@ -315,7 +315,7 @@ void ScummEngine_v5::setupOpcodes() { OPCODE(0xda, o5_add); OPCODE(0xdb, o5_divide); /* DC */ - OPCODE(0xdc, o5_oldRoomEffect); +// OPCODE(0xdc, o5_oldRoomEffect); OPCODE(0xdd, o5_setClass); OPCODE(0xde, o5_walkActorTo); OPCODE(0xdf, o5_isActorInBox); @@ -2968,76 +2968,4 @@ void ScummEngine_v5::decodeParseString() { _string[textSlot].saveDefault(); } -void ScummEngine_v5::o5_oldRoomEffect() { - int a; - - _opcode = fetchScriptByte(); - if ((_opcode & 0x1F) == 3) { - a = getVarOrDirectWord(PARAM_1); - -#if 1 - if (_game.platform == Common::kPlatformFMTowns && _game.version == 3) { - // FIXME / TODO: OK the first thing to note is: at least in Zak256, - // maybe also in other games, this opcode does a bit more. I added - // some stubs here, but somebody with a full IDA or more knowledge - // about this will have to fill in the gaps. At least now we know - // that something is missing here :-) - - if (a == 4) { - //printf("o5_oldRoomEffect ODDBALL: _opcode = 0x%x, a = 0x%x\n", _opcode, a); - // No idea what byte_2FCCF is, but it's a globale boolean flag. - // I only add it here as a temporary hack to make the pseudo code compile. - // Maybe it is just there as a reentry protection guard, given - // how it is used? It might also correspond to _screenEffectFlag. - int byte_2FCCF = 0; - - // For now, we force a redraw of the screen background. This - // way the Zak end credits seem to work mostly correct. - VirtScreen *vs = &_virtscr[kMainVirtScreen]; - restoreBackground(Common::Rect(0, vs->topline, vs->w, vs->topline + vs->h)); - vs->setDirtyRange(0, vs->h); - updateDirtyScreen(kMainVirtScreen); - - if (byte_2FCCF) { - // Here now "sub_1C44" is called, which sets byte_2FCCF to 0 then - // calls yet another sub (which also reads byte_2FCCF): - - byte_2FCCF = 0; - //call sub_0BB3 - - - // Now sub_085C is called. This is quite simply: it sets - // 0xF000 bytes. starting at 0x40000 to 0. No idea what that - // buffer is, maybe a screen buffer, though. Note that - // 0xF000 = 320*192. - // Maybe this is also the charset mask being cleaned? - - // call sub_085C - - - // And then sub_1C54 is called, which is almost identical to - // the above sub_1C44, only it sets byte_2FCCF to 1: - - byte_2FCCF = 1; - // call sub_0BB3 - - } else { - // Here only sub_085C is called (see comment above) - - // call sub_085C - } - return; - } -#endif - - } - if (a) { - _switchRoomEffect = (byte)(a & 0xFF); - _switchRoomEffect2 = (byte)(a >> 8); - } else { - fadeIn(_newEffect); - } - } -} - } // End of namespace Scumm diff --git a/engines/scumm/scumm_v4.h b/engines/scumm/scumm_v4.h index 3300019c67..6942b73682 100644 --- a/engines/scumm/scumm_v4.h +++ b/engines/scumm/scumm_v4.h @@ -52,6 +52,7 @@ protected: virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); /* Version 4 script opcodes */ + void o4_oldRoomEffect(); void o4_pickupObject(); }; diff --git a/engines/scumm/scumm_v5.h b/engines/scumm/scumm_v5.h index 4ff8b26ecc..c84b6ca74a 100644 --- a/engines/scumm/scumm_v5.h +++ b/engines/scumm/scumm_v5.h @@ -156,7 +156,6 @@ protected: void o5_move(); void o5_multiply(); void o5_notEqualZero(); - void o5_oldRoomEffect(); void o5_or(); void o5_beginOverride(); void o5_panCameraTo(); |