diff options
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 373 |
1 files changed, 179 insertions, 194 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 82e58de9fe..250aefb556 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -106,7 +106,7 @@ static const char *const selectorNameTable[] = { "handsOn", // system selector "localize", // Freddy Pharkas "put", // Police Quest 1 VGA - "say", // Quest For Glory 1 VGA + "say", // Quest For Glory 1 VGA, QFG4 "script", // Quest For Glory 1 VGA "solvePuzzle", // Quest For Glory 3 "timesShownID", // Space Quest 1 VGA @@ -119,14 +119,14 @@ static const char *const selectorNameTable[] = { "loop", // Laura Bow 1 Colonel's Bequest, QFG4 "setLoop", // Laura Bow 1 Colonel's Bequest, QFG4 "ignoreActors", // Laura Bow 1 Colonel's Bequest - "at", // Longbow + "at", // Longbow, QFG4 "owner", // Longbow #ifdef ENABLE_SCI32 "newWith", // SCI2 array script "scrollSelections", // GK2 "posn", // SCI2 benchmarking script "detailLevel", // GK2 benchmarking - "view", // RAMA benchmarking, GK1 + "view", // RAMA benchmarking, GK1, QFG4 "fade", // Shivers "handleEvent", // Shivers "test", // Torin @@ -137,7 +137,7 @@ static const char *const selectorNameTable[] = { "set", // Torin "clear", // Torin "masterVolume", // SCI2 master volume reset - "data", // Phant2 + "data", // Phant2, QFG4 "format", // Phant2 "setSize", // Phant2 "setCel", // Phant2, GK1 @@ -160,6 +160,7 @@ static const char *const selectorNameTable[] = { "state", // RAMA "getSubscriberObj", // RAMA "cue", // QFG4 + "heading", // QFG4 "moveSpeed", // QFG4 "setLooper", // QFG4 "setSpeed", // QFG4 @@ -248,6 +249,7 @@ enum ScriptPatcherSelectors { SELECTOR_state, SELECTOR_getSubscriberObj, SELECTOR_cue, + SELECTOR_heading, SELECTOR_moveSpeed, SELECTOR_setLooper, SELECTOR_setSpeed, @@ -1339,7 +1341,7 @@ static const uint16 gk1Day9VineSwingSignature[] = { 0x39, 0x08, // pushi $8 0x39, 0x10, // pushi $10 0x78, // push1 - 0x81, 0x5b, // lsg global[$5b] + 0x81, 0x5b, // lag global[$5b] 0x4a, SIG_UINT16(0x000c), // send $c SIG_END }; @@ -1364,7 +1366,7 @@ static const uint16 gk1Day9VineSwingPatch[] = { 0x39, 0x10, // pushi $10 0x78, // push1 0x7c, // pushSelf - 0x81, 0x5b, // lsg global[$5b] + 0x81, 0x5b, // lag global[$5b] 0x4a, SIG_UINT16(0x000e), // send $c PATCH_END }; @@ -2492,7 +2494,7 @@ static const uint16 kq6PatchInventoryStackFix[] = { 0x12, // and 0x2f, 0x02, // bt [not first refresh] - saves 3 bytes in total 0x65, 0x1e, // aTop curIcon - 0x00, // neg (either 2000 or 0000 in acc, this will create dfff or ffff) - saves 2 bytes + 0x00, // bnot (neg, either 2000 or 0000 in acc, this will create dfff or ffff) - saves 2 bytes 0x12, // and 0x65, 0x30, // aTop state 0x38, // pushi "show" @@ -8002,64 +8004,51 @@ static const SciScriptPatcherEntry qfg3Signatures[] = { #pragma mark - #pragma mark Quest for Glory 4 -// The 'Trap::init' code incorrectly creates an int array for string data. -// Applies to at least: English CD +// Cranium's TRAP screen in room 380 incorrectly creates an int array for +// string data. +// +// Applies to at least: English CD, English floppy, German floppy +// Responsible method: trap::init() in script 83 +// Fixes bug: #10766 static const uint16 qfg4TrapArrayTypeSignature[] = { - 0x38, SIG_SELECTOR16(new), // pushi new - 0x78, // push1 - 0x38, SIG_UINT16(0x80), // pushi $80 (128) + 0x38, SIG_SELECTOR16(new), // pushi new + 0x78, // push1 SIG_MAGICDWORD, - 0x51, 0x0b, // class $b (IntArray) - 0x4a, SIG_UINT16(0x06), // send 6 + 0x38, SIG_UINT16(0x0080), // pushi 128d (array size) + 0x51, SIG_ADDTOOFFSET(+1), // class IntArray (CD=0x0b. floppy=0x0a) + 0x4a, SIG_UINT16(0x0006), // send 6 SIG_END }; static const uint16 qfg4TrapArrayTypePatch[] = { - PATCH_ADDTOOFFSET(+4), // pushi $92 (new), push1 - 0x38, PATCH_UINT16(0x100), // pushi $100 (256) - 0x51, 0x0d, // class $d (ByteArray) - PATCH_END -}; - -// The 'Trap::init' code incorrectly creates an int array for string data. -// Applies to at least: English floppy, German floppy -static const uint16 qfg4TrapArrayTypeFloppySignature[] = { - 0x38, SIG_SELECTOR16(new), // pushi new - 0x78, // push1 - 0x38, SIG_UINT16(0x80), // pushi $80 (128) - SIG_MAGICDWORD, - 0x51, 0x0a, // class $a (IntArray) - 0x4a, SIG_UINT16(0x06), // send 6 - SIG_END -}; - -static const uint16 qfg4TrapArrayTypeFloppyPatch[] = { - PATCH_ADDTOOFFSET(+4), // pushi $92 (new), push1 - 0x38, PATCH_UINT16(0x100), // pushi $100 (256) - 0x51, 0x0c, // class $c (ByteArray) + PATCH_ADDTOOFFSET(+4), + 0x38, PATCH_UINT16(0x0100), // pushi 256d (array size) + 0x51, PATCH_GETORIGINALBYTEADJUST(8, +2), // class ByteArray (CD=0x0d, floppy=0x0c) PATCH_END }; // QFG4 has custom video benchmarking code inside a subroutine, which is called -// by 'glryInit::init', that needs to be disabled; see sci2BenchmarkSignature -// Applies to at least: English CD, German Floppy +// by 'glryInit::init', that needs to be disabled. See: sci2BenchmarkSignature. +// +// Applies to at least: English CD, English floppy, German Floppy +// Responsible method: localproc_0010() in script 1 static const uint16 qfg4BenchmarkSignature[] = { - 0x38, SIG_SELECTOR16(new), // pushi new - 0x76, // push0 - 0x51, SIG_ADDTOOFFSET(+1), // class View - 0x4a, SIG_UINT16(0x04), // send 4 - 0xa5, 0x00, // sat 0 - 0x39, SIG_SELECTOR8(view), // pushi $e (view) + 0x38, SIG_SELECTOR16(new), // pushi new + 0x76, // push0 + 0x51, SIG_ADDTOOFFSET(+1), // class View + 0x4a, SIG_UINT16(0x0004), // send 4 + 0xa5, 0x00, // sat temp[0] + 0x39, SIG_SELECTOR8(view), // pushi view SIG_MAGICDWORD, - 0x78, // push1 - 0x38, SIG_UINT16(0x270f), // push $270f (9999) + 0x78, // push1 + 0x38, SIG_UINT16(0x270f), // pushi $270f (9999) SIG_END }; static const uint16 qfg4BenchmarkPatch[] = { - 0x35, 0x01, // ldi 0 - 0xa1, 0xbf, // sag $bf (191) - 0x48, // ret + 0x35, 0x01, // ldi 0 + 0xa1, 0xbf, // sag global[191] + 0x48, // ret PATCH_END }; @@ -8068,9 +8057,9 @@ static const uint16 qfg4BenchmarkPatch[] = { // // We delay a bit, so that hero::cycler should always be set. // -// Applies to: English CD, English floppy, German floppy -// Responsible method: sFallsBackSide::changeState (script 803) -// Fixes bug #9801 +// Applies to at least: English CD, English floppy, German floppy +// Responsible method: sFallsBackSide::changeState in script 803 +// Fixes bug: #9801 static const uint16 qfg4SlidingDownSlopeSignature[] = { 0x87, 0x01, // lap param[1] 0x65, SIG_ADDTOOFFSET(+1), // aTop state @@ -8150,10 +8139,10 @@ static const uint16 qfg4SlidingDownSlopePatch[] = { // the walkable polygon is valid, and the pathfinding algorithm can // work properly. // -// Applies to: English CD, English floppy, German floppy -// -// Fixes bug #10693 -static const uint16 qg4InnPathfindingSignature[] = { +// Applies to at least: English CD, English floppy, German floppy +// Responsible method: rm320::init() in script 320 +// Fixes bug: #10693 +static const uint16 qfg4InnPathfindingSignature[] = { SIG_MAGICDWORD, 0x38, SIG_UINT16(0x0154), // pushi x = 340 0x39, 0x77, // pushi y = 119 @@ -8172,7 +8161,7 @@ static const uint16 qg4InnPathfindingSignature[] = { SIG_END }; -static const uint16 qg4InnPathfindingPatch[] = { +static const uint16 qfg4InnPathfindingPatch[] = { PATCH_ADDTOOFFSET(+30), 0x38, PATCH_UINT16(0x013f), // pushi x = 319 (was 324) 0x39, 0x77, // pushi y = 119 @@ -8199,18 +8188,18 @@ static const uint16 qg4InnPathfindingPatch[] = { // unreachable. // // Applies to at least: English CD, English floppy, German floppy -// Responsible method: Glory::save() +// Responsible method: Glory::save() in script 0 // Fixes bug: #10758 -static const uint16 qg4AutosaveSignature[] = { - 0x30, SIG_ADDTOOFFSET(+2), // bnt [end the loop] +static const uint16 qfg4AutosaveSignature[] = { + 0x30, SIG_ADDTOOFFSET(+2), // bnt ?? [end the loop] 0x78, // push1 - 0x39, 0x79, // pushi data + 0x39, SIG_SELECTOR8(data), // pushi data 0x76, // push0 - SIG_ADDTOOFFSET(+2), // CD="lag global29", floppy="lat temp6" - 0x4a, SIG_UINT16(0x0004), // send 04 + SIG_ADDTOOFFSET(+2), // CD="lag global[29]", floppy="lat temp[6]" + 0x4a, SIG_UINT16(0x0004), // send 4d 0x36, // push SIG_MAGICDWORD, - 0x43, 0x3f, SIG_UINT16(0x0002), // callk CheckFreeSpace[3f], 02 + 0x43, 0x3f, SIG_UINT16(0x0002), // callk 2d (CheckFreeSpace) 0x18, // not 0x2f, 0x05, // bt 05 [skip other OR condition] 0x8d, 0x09, // lst temp[9] (savegame file count) @@ -8219,7 +8208,7 @@ static const uint16 qg4AutosaveSignature[] = { SIG_END }; -static const uint16 qg4AutosavePatch[] = { +static const uint16 qfg4AutosavePatch[] = { 0x32, // ... // jmp [end the loop] PATCH_END }; @@ -8229,10 +8218,10 @@ static const uint16 qg4AutosavePatch[] = { // property. This leads to arithmetic crashes later. We change it to // Actor::setLooper(). // -// Applies to at least: English CD, English floppy +// Applies to at least: English CD, English floppy, German floppy // Responsible method: // Script 440 -// sToWater::changeState() +// sToWater::changeState(3) // Script 530, 535 // sGlideFromTuff::changeState(1) // sGoGlide::changeState(2) @@ -8251,38 +8240,35 @@ static const uint16 qg4AutosavePatch[] = { // sFromEast::changeState(0) // sFromWest::changeState(0) // Fixes bug: #10777 -static const uint16 qg4SetLooperSignature1[] = { +static const uint16 qfg4SetLooperSignature1[] = { SIG_MAGICDWORD, 0x38, SIG_SELECTOR16(setLoop), // pushi setLoop - 0x78, // push 1 + 0x78, // push1 0x51, 0x5a, // class Grooper SIG_END }; -static const uint16 qg4SetLooperPatch1[] = { +static const uint16 qfg4SetLooperPatch1[] = { 0x38, PATCH_SELECTOR16(setLooper), // pushi setLooper PATCH_END }; // As above, except it's an exported subclass of Grooper: stopGroop. // -// Applies to at least: English CD, English floppy -// Responsible method: -// Script 10 -// sJumpWater::changeState(3) -// sToJump::changeState(2) +// Applies to at least: English CD, English floppy, German floppy +// Responsible method: sJumpWater::changeState(3), sToJump::changeState(2) in script 10 // Fixes bug: #10777 -static const uint16 qg4SetLooperSignature2[] = { +static const uint16 qfg4SetLooperSignature2[] = { SIG_MAGICDWORD, 0x38, SIG_SELECTOR16(setLoop), // pushi setLoop 0x78, // push1 0x7a, // push2 0x39, 0x1c, // pushi 28d 0x78, // push1 - 0x43, 0x02, SIG_UINT16(0x0004), // callk 04 (ScriptID 28 1) + 0x43, 0x02, SIG_UINT16(0x0004), // callk 4d (ScriptID 28 1) SIG_END }; -static const uint16 qg4SetLooperPatch2[] = { +static const uint16 qfg4SetLooperPatch2[] = { 0x38, PATCH_SELECTOR16(setLooper), // pushi setLooper PATCH_END }; @@ -8303,10 +8289,10 @@ static const uint16 qfg4MoonriseSignature[] = { 0x81, 0x7a, // lag global[122] 0xa5, 0x00, // sat temp[0] 0x89, 0x7b, // lsg global[123] - 0x35, 0x06, // ldi 6 + 0x35, 0x06, // ldi 6d 0x1c, // ne? 0x2f, 0x06, // bt 6d [skip remaining OR conditions] - 0x89, 0x78, // lsg 120d + 0x89, 0x78, // lsg global[120] 0x34, SIG_UINT16(0x01f4), // ldi 500d 0x1e, // gt? 0x31, 0x02, // bnt 2d [skip the if block] @@ -8316,7 +8302,7 @@ static const uint16 qfg4MoonriseSignature[] = { static const uint16 qfg4MoonrisePatch[] = { 0x35, 0x00, // ldi 0 (reset the is-night var) 0xa3, 0x05, // sal local[5] - 0x33, 0x0f, // jmp 15d (skip waste bytes) + 0x33, 0x0f, // jmp 15d [skip waste bytes] PATCH_END }; @@ -8351,29 +8337,29 @@ static const uint16 qfg4MoonrisePatch[] = { // sprite never would've been scheduled separately in the first place. // // Applies to at least: English CD, English floppy, German floppy -// Responsible method: rm320::init() +// Responsible method: rm320::init() in script 320 // Fixes bug: #10753 static const uint16 qfg4AbsentInnkeeperSignature[] = { - SIG_MAGICDWORD, // (Block 10, partway through.) + SIG_MAGICDWORD, // (block 10, partway through) 0x31, 0x1c, // bnt 28d [block 11] 0x89, 0x7b, // lsg global[123] 0x35, 0x03, // ldi 3d 0x24, // le? - // (~~ Junk begins ~~) + // (~~ junk begins ~~) 0x2f, 0x0f, // bt 15d [after the calle] 0x39, 0x03, // pushi 3d 0x89, 0x7b, // lsg global[123] 0x39, 0x04, // pushi 4d 0x39, 0x05, // pushi 5d - 0x46, SIG_UINT16(0xfde7), SIG_UINT16(0x0005), SIG_UINT16(0x0006), // calle proc64999_5(global[123], 4, 5) 06 - // (~~ Junk ends ~~) + 0x46, SIG_UINT16(0xfde7), SIG_UINT16(0x0005), SIG_UINT16(0x0006), // calle 6d (proc64999_5(global[123], 4, 5)) + // (~~ junk ends ~~) 0x31, 0x04, // bnt 4d [block 11] 0x35, 0x0a, // ldi 10d - 0x33, 0x29, // jmp 41d (done, local[2]=acc) + 0x33, 0x29, // jmp 41d [done, local[2]=acc] // - SIG_ADDTOOFFSET(+25), // (...Block 11...) (Patch ends after this.) - SIG_ADDTOOFFSET(+14), // (...Block 12...) - SIG_ADDTOOFFSET(+2), // (...Else 0...) + SIG_ADDTOOFFSET(+25), // (...block 11...) (patch ends after this) + SIG_ADDTOOFFSET(+14), // (...block 12...) + SIG_ADDTOOFFSET(+2), // (...else 0...) 0xa3, 0x02, // sal local[2] (all blocks set acc and jmp here) PATCH_END }; @@ -8386,38 +8372,38 @@ static const uint16 qfg4AbsentInnkeeperPatch[] = { // (*snip*) 0x31, 0x07, // bnt 7d [block 11] 0x35, 0x0a, // ldi 10d - 0x33, 0x3a, // jmp 58d (done, local[2]=acc) + 0x33, 0x3a, // jmp 58d [done, local[2]=acc] // 0x34, PATCH_UINT16(0x0000), // ldi 0 (waste 3 bytes) // (14 freed bytes remain.) - // (Use 7 freed bytes to prepend block 11.) - // (And shift all of block 11 up by 7 bytes.) - // (Use that new gap below to prepend block 12.) + // (use 7 freed bytes to prepend block 11) + // (and shift all of block 11 up by 7 bytes) + // (use that new gap below to prepend block 12) // - // (Block 11. Prepend a time check.) + // (block 11, prepend a time check) 0x89, 0x7b, // lsg global[123] 0x35, 0x05, // ldi 5d 0x24, // le? 0x31, 0x19, // bnt 25d [block 12] - // (Block 11 original ops shift up.) + // (block 11, original ops shift up) 0x78, // push1 - 0x38, PATCH_UINT16(0x0084), // pushi 132 - 0x45, 0x04, PATCH_UINT16(0x0002), // callb proc0_4(132) 02 + 0x38, PATCH_UINT16(0x0084), // pushi 132d + 0x45, 0x04, PATCH_UINT16(0x0002), // callb 2d (proc0_4(132)) 0x31, 0x0f, // bnt 15d [next block] 0x78, // push1 - 0x38, PATCH_UINT16(0x0086), // pushi 134 - 0x45, 0x04, PATCH_UINT16(0x0002), // callb proc0_4(134) 02 + 0x38, PATCH_UINT16(0x0086), // pushi 134d + 0x45, 0x04, PATCH_UINT16(0x0002), // callb 2d (proc0_4(134)) 0x18, // not 0x31, 0x04, // bnt 4d [block 12] 0x35, 0x0b, // ldi 11d - 0x33, 0x17, // jmp 23d (done, local[2]=acc) + 0x33, 0x17, // jmp 23d [done, local[2]=acc] // - // (Block 12. Prepend a time check.) + // (block 12, prepend a time check) 0x89, 0x7b, // lsg global[123] 0x35, 0x05, // ldi 5d 0x24, // le? 0x31, 0x0e, // bnt 14d [else block] - // (Block 12 original ops continue here.) + // (block 12, original ops continue here) PATCH_END }; @@ -8507,16 +8493,16 @@ static const uint16 qfg4SetScalerPatch[] = { // Fixes bug: #10756 static const uint16 qfg4CrestBookshelfCDSignature[] = { SIG_MAGICDWORD, - 0x4a, SIG_UINT16(0x003e), // send 3e + 0x4a, SIG_UINT16(0x003e), // send 62d 0x36, // push SIG_ADDTOOFFSET(+5), // ... 0x38, SIG_SELECTOR16(handsOn), // pushi handsOn (begin clobbering) 0x76, // push0 0x81, 0x01, // lag global[1] (Glory) - 0x4a, SIG_UINT16(0x0004), // send 04 + 0x4a, SIG_UINT16(0x0004), // send 4d 0x38, SIG_SELECTOR16(dispose), // pushi dispose 0x76, // push0 - 0x54, SIG_UINT16(0x0004), // self 04 + 0x54, SIG_UINT16(0x0004), // self 4d SIG_END }; @@ -8527,7 +8513,7 @@ static const uint16 qfg4CrestBookshelfCDPatch[] = { 0x72, PATCH_UINT16(0x01a4), // lofsa sLeaveSecretly 0x36, // push 0x81, 0x02, // lag global[2] (rm663) - 0x4a, PATCH_UINT16(0x0006), // send 06 + 0x4a, PATCH_UINT16(0x0006), // send 6d 0x34, PATCH_UINT16(0x0000), // ldi 0 (waste 3 bytes) PATCH_END }; @@ -8535,16 +8521,16 @@ static const uint16 qfg4CrestBookshelfCDPatch[] = { // Applies to at least: English floppy, German floppy static const uint16 qfg4CrestBookshelfFloppySignature[] = { SIG_MAGICDWORD, - 0x4a, SIG_UINT16(0x003e), // send 3e + 0x4a, SIG_UINT16(0x003e), // send 62d 0x36, // push SIG_ADDTOOFFSET(+5), // ... 0x38, SIG_SELECTOR16(handsOn), // pushi handsOn (begin clobbering) 0x76, // push0 0x81, 0x01, // lag global[1] (Glory) - 0x4a, SIG_UINT16(0x0004), // send 04 + 0x4a, SIG_UINT16(0x0004), // send 4d 0x38, SIG_SELECTOR16(dispose), // pushi dispose 0x76, // push0 - 0x54, SIG_UINT16(0x0004), // self 04 + 0x54, SIG_UINT16(0x0004), // self 4d SIG_END }; @@ -8555,7 +8541,7 @@ static const uint16 qfg4CrestBookshelfFloppyPatch[] = { 0x72, PATCH_UINT16(0x018c), // lofsa sLeaveSecretly 0x36, // push 0x81, 0x02, // lag global[2] (rm663) - 0x4a, PATCH_UINT16(0x0006), // send 06 + 0x4a, PATCH_UINT16(0x0006), // send 6d 0x34, PATCH_UINT16(0x0000), // ldi 0 (waste 3 bytes) PATCH_END }; @@ -8588,8 +8574,8 @@ static const uint16 qfg4CrestBookshelfMotionPatch[] = { PATCH_END }; -// The castle's great hall has a doorMat region that intermittently sends hero -// back to the room they just left (the barrel room) the instant they arrive. +// The castle's great hall (630) has a doorMat region that intermittently sends +// hero back to the room they just left (barrel room) the instant they arrive. // // Entry from room 623 starts hero at (0, 157), the edge of the doorMat. We // shrink the region by 2 pixels. Then sEnterTheRoom moves hero safely across. @@ -8598,12 +8584,12 @@ static const uint16 qfg4CrestBookshelfMotionPatch[] = { // Does not apply to English floppy 1.0. It lacked a western doorMat entirely. // // Applies to at least: English CD, English floppy, German floppy -// Responsible method: vClosentDoor::init() +// Responsible method: vClosentDoor::init() in script 630 // Fixes bug: #10731 static const uint16 qfg4GreatHallEntrySignature[] = { SIG_MAGICDWORD, 0x76, // push0 (point 0) - 0x38, SIG_UINT16(0x0088), // pushi 136 + 0x38, SIG_UINT16(0x0088), // pushi 136d SIG_ADDTOOFFSET(+10), // ... 0x76, // push0 0d (point 3) 0x38, SIG_UINT16(0x00b4), // pushi 180d @@ -8661,7 +8647,7 @@ static const uint16 qfg4GreatHallEntryPatch[] = { // Fixes bug: #10138, #10419, #10710, #10814 static const uint16 qfg4ConditionalVoidSignature[] = { SIG_MAGICDWORD, - 0x43, 0x0a, SIG_UINT16(0x00002), // callk 02 (SetNowSeen stackedView) + 0x43, 0x0a, SIG_UINT16(0x00002), // callk 2d (SetNowSeen(stackedView)) 0x36, // push (void func didn't set acc!) 0x35, 0x01, // ldi 1d 0x14, // or (whatever that was, make it non-zero) @@ -8670,7 +8656,7 @@ static const uint16 qfg4ConditionalVoidSignature[] = { static const uint16 qfg4ConditionalVoidPatch[] = { PATCH_ADDTOOFFSET(+4), // - 0x78, // push1 (Feed OR a literal 1) + 0x78, // push1 (feed OR a literal 1) PATCH_END }; @@ -8694,10 +8680,10 @@ static const uint16 qfg4ConditionalVoidPatch[] = { // Fixes bug: #10751 static const uint16 qfg4GraveyardRopeSignature1[] = { SIG_MAGICDWORD, // (rope1 properties) - SIG_UINT16(0x0064), // x = 100 - SIG_UINT16(0xfff6), // y = -10 + SIG_UINT16(0x0064), // x = 100d + SIG_UINT16(0xfff6), // y = -10d SIG_ADDTOOFFSET(+24), // ... - SIG_UINT16(0x01f6), // view = 502 + SIG_UINT16(0x01f6), // view = 502d SIG_ADDTOOFFSET(+8), // ... SIG_UINT16(0x6000), // signal = 0x6000 SIG_END @@ -8711,10 +8697,10 @@ static const uint16 qfg4GraveyardRopePatch1[] = { static const uint16 qfg4GraveyardRopeSignature2[] = { SIG_MAGICDWORD, // (rope2 properties) - SIG_UINT16(0x007f), // x = 127 - SIG_UINT16(0xfffb), // y = -5 + SIG_UINT16(0x007f), // x = 127d + SIG_UINT16(0xfffb), // y = -5d SIG_ADDTOOFFSET(+24), // ... - SIG_UINT16(0x01f6), // view = 502 + SIG_UINT16(0x01f6), // view = 502d SIG_ADDTOOFFSET(+8), // ... SIG_UINT16(0x6000), // signal = 0x6000 SIG_END @@ -8737,16 +8723,16 @@ static const uint16 qfg4DoubleDoorSoundSignature[] = { 0x35, 0x04, // ldi 4d (state 4) SIG_ADDTOOFFSET(+3), // ... SIG_MAGICDWORD, - 0x39, 0x33, // pushi play + 0x39, SIG_SELECTOR8(play), // pushi play 0x76, // push0 0x72, SIG_UINT16(0x0376), // lofsa doorSound - 0x4a, SIG_UINT16(0x0004), // send 04 + 0x4a, SIG_UINT16(0x0004), // send 4d SIG_END }; static const uint16 qfg4DoubleDoorSoundPatch[] = { PATCH_ADDTOOFFSET(+5), - 0x33, 0x07, // jmp 7d (skip waste bytes) + 0x33, 0x07, // jmp 7d [skip waste bytes] PATCH_END }; @@ -8770,9 +8756,9 @@ static const uint16 qfg4SafeDoorEastSignature[] = { SIG_MAGICDWORD, // (else block, right door) 0x78, // push1 0x38, SIG_UINT16(0x00d7), // pushi 215d - 0x45, 0x04, SIG_UINT16(0x0002), // callb 02 (proc0_4(215), test right door oiled flag) + 0x45, 0x04, SIG_UINT16(0x0002), // callb 2d (proc0_4(215), test right door oiled flag) 0x18, // not - 0x31, SIG_ADDTOOFFSET(+1), // bnt [end the else block] + 0x31, SIG_ADDTOOFFSET(+1), // bnt ?? [end the else block] // 0x35, 0x00, // ldi 0 0xa3, 0x02, // sal local[2] @@ -8785,9 +8771,9 @@ static const uint16 qfg4SafeDoorEastPatch[] = { // 0x78, // push1 0x38, PATCH_UINT16(0x00d7), // pushi 215d - 0x45, 0x04, PATCH_UINT16(0x0002), // callb 02 (proc0_4(215)) + 0x45, 0x04, PATCH_UINT16(0x0002), // callb 2d (proc0_4(215)) 0x18, // not - 0x31, PATCH_GETORIGINALBYTEADJUST(10, -4), // bnt [end the else block] + 0x31, PATCH_GETORIGINALBYTEADJUST(10, -4), // bnt ?? [end the else block] PATCH_END }; @@ -8796,21 +8782,21 @@ static const uint16 qfg4SafeDoorEastPatch[] = { // respective doors properly from the outside. We switch the flags inside. // // Applies to at least: English CD, English floppy, German floppy -// Responsible method: Script 643 - vBackDoor::doVerb(32), vLeftDoor::doVerb(32) +// Responsible method: vBackDoor::doVerb(32), vLeftDoor::doVerb(32) in script 643 // Fixes bug: #10829 static const uint16 qfg4SafeDoorOilSignature[] = { 0x35, 0x20, // ldi 32d (vBackDoor::doVerb(oil), right door) SIG_ADDTOOFFSET(+5), // ... SIG_MAGICDWORD, 0x38, SIG_UINT16(0x00d6), // pushi 214d - 0x45, 0x02, SIG_UINT16(0x0002), // callb 02 (proc0_2(214), set left oiled flag!?) + 0x45, 0x02, SIG_UINT16(0x0002), // callb 2d (proc0_2(214), set left oiled flag!?) SIG_ADDTOOFFSET(+152), // ... 0x35, 0x20, // ldi 32d (vLeftDoor::doVerb(oil), left door) SIG_ADDTOOFFSET(+5), // ... 0x38, SIG_UINT16(0x00d7), // pushi 215d - 0x45, 0x02, SIG_UINT16(0x0002), // callb 02 (proc0_2(215), set right oiled flag!?) + 0x45, 0x02, SIG_UINT16(0x0002), // callb 2d (proc0_2(215), set right oiled flag!?) SIG_END }; @@ -8822,11 +8808,11 @@ static const uint16 qfg4SafeDoorOilPatch[] = { PATCH_END }; -// Waking after a dream by the staff in town prevents the room from creating a -// doorMat at nightfall, if hero rests repeatedly. The town gate closes at -// night. Without the doorMat, hero isn't prompted to climb over the gate. -// Instead, hero casually walks south and gets stuck in the next room behind -// the closed gate. +// Waking after a dream by the staff in town (room 270) prevents the room from +// creating a doorMat at nightfall, if hero rests repeatedly. The town gate +// closes at night. Without the doorMat, hero isn't prompted to climb over the +// gate. Instead, hero casually walks south and gets stuck in the next room +// behind the closed gate. // // Since hero wakes in the morning, sAfterTheDream disposes any existing // doorMat. It neglects to reset local[2], which toggles rm270::doit()'s @@ -8846,47 +8832,47 @@ static const uint16 qfg4SafeDoorOilPatch[] = { // Fixes bug: #10830 static const uint16 qfg4DreamGateSignature[] = { SIG_MAGICDWORD, - 0x39, 0x43, // pushi heading + 0x39, SIG_SELECTOR8(heading), // pushi heading 0x76, // push0 0x72, SIG_ADDTOOFFSET(+2), // lofsa fSouth - 0x4a, SIG_UINT16(0x0004), // send 04 + 0x4a, SIG_UINT16(0x0004), // send 4d 0x31, 0x1a, // bnt 26d [skip disposing/nulling] (no heading) // 0x38, SIG_SELECTOR16(dispose), // pushi dispose 0x76, // push0 - 0x39, 0x43, // pushi heading + 0x39, SIG_SELECTOR8(heading), // pushi heading 0x76, // push0 0x72, SIG_ADDTOOFFSET(+2), // lofsa fSouth - 0x4a, SIG_UINT16(0x0004), // send 04 (accumulate heading) - 0x4a, SIG_UINT16(0x0004), // send 04 (dispose heading) + 0x4a, SIG_UINT16(0x0004), // send 4d (accumulate heading) + 0x4a, SIG_UINT16(0x0004), // send 4d (dispose heading) // - 0x39, 0x43, // pushi heading + 0x39, SIG_SELECTOR8(heading), // pushi heading 0x78, // push1 0x76, // push0 0x72, SIG_ADDTOOFFSET(+2), // lofsa fSouth - 0x4a, SIG_UINT16(0x0006), // send 06 (set fSouth's heading to null) + 0x4a, SIG_UINT16(0x0006), // send 6d (set fSouth's heading to null) SIG_END }; static const uint16 qfg4DreamGatePatch[] = { 0x3f, 0x01, // link 1d (cache heading for reuse) - 0x39, 0x43, // pushi heading + 0x39, PATCH_SELECTOR8(heading), // pushi heading 0x76, // push0 0x72, PATCH_GETORIGINALUINT16(4), // lofsa fSouth - 0x4a, PATCH_UINT16(0x0004), // send 04 + 0x4a, PATCH_UINT16(0x0004), // send 4d 0xa5, 0x00, // sat temp[0] 0x31, 0x13, // bnt 19d [skip disposing/nulling] (no heading) // 0x38, PATCH_SELECTOR16(dispose), // pushi dispose 0x76, // push0 0x85, 0x00, // lat temp[0] - 0x4a, PATCH_UINT16(0x0004), // send 04 (dispose heading) + 0x4a, PATCH_UINT16(0x0004), // send 4d (dispose: heading:) // - 0x39, 0x43, // pushi heading + 0x39, PATCH_SELECTOR8(heading), // pushi heading 0x78, // push1 0x76, // push0 0x72, PATCH_GETORIGINALUINT16(4), // lofsa fSouth - 0x4a, PATCH_UINT16(0x0006), // send 06 (set fSouth's heading to null) + 0x4a, PATCH_UINT16(0x0006), // send 6d (set fSouth's heading to null) // 0x76, // push0 0xab, 0x02, // ssl local[2] (let doit() watch for nightfall) @@ -8918,7 +8904,7 @@ static const uint16 qfg4RestartSignature[] = { 0x35, 0x01, // ldi 1d 0xb1, 0x90, // sagi (global[144 + 1] = 0) SIG_ADDTOOFFSET(+40), // ... - 0x38, SIG_UINT16(0x013b), // pushi 315 + 0x38, SIG_UINT16(0x013b), // pushi 315d SIG_ADDTOOFFSET(+2), // ldi ?? (array index here was typoed) 0xb1, 0x90, // sagi (global[144 + ?] = 315) @@ -8939,7 +8925,7 @@ static const uint16 qfg4RestartPatch[] = { 0xad, 0x00, // sst temp[0] // 0x8d, 0x00, // lst temp[0] (global[144 + n+1] = n*45) - 0x35, 0x08, // ldi 8 + 0x35, 0x08, // ldi 8d 0x22, // lt? 0x31, 0x0c, // bnt 12d [end the loop] 0x8d, 0x00, // lst temp[0] @@ -8983,29 +8969,29 @@ static const uint16 qfg4RestartPatch[] = { 0xed, 0x00, // -st temp[0] 0x35, 0x00, // ldi 0 0x20, // ge? - 0x31, 0x07, // bnt 7d (end the loop) + 0x31, 0x07, // bnt 7d [end the loop] 0x85, 0x00, // lat temp[0] 0xb8, PATCH_UINT16(0x016f), // ssgi 367d (global[367 + n] = pop()) 0x33, 0xf2, // jmp [-14] (loop) // (that loop freed +52 bytes) // (reset properties for a few items) - 0x33, 0x1f, // jmp 31d (skip subroutine declaration) + 0x33, 0x1f, // jmp 31d [skip subroutine declaration] 0x38, PATCH_SELECTOR16(loop), // pushi loop 0x78, // push1 - 0x8f, 0x02, // lsp[2] (loop varies) + 0x8f, 0x02, // lsp param[2] (loop varies) 0x38, PATCH_SELECTOR16(cel), // pushi cel 0x78, // push1 - 0x8f, 0x03, // lsp[3] (cel varies) + 0x8f, 0x03, // lsp param[3] (cel varies) 0x38, PATCH_SELECTOR16(value), // pushi value (weight) 0x78, // push1 0x7a, // push2 (these items all weigh 2) // - 0x39, 0x4b, // pushi at + 0x39, PATCH_SELECTOR8(at), // pushi at 0x78, // push1 - 0x8f, 0x01, // lsp[1] + 0x8f, 0x01, // lsp param[1] 0x81, 0x09, // global[9] (gloryInv) - 0x4a, PATCH_UINT16(0x0006), // send 06 + 0x4a, PATCH_UINT16(0x0006), // send 6d // 0x4a, PATCH_UINT16(0x0012), // send 18d 0x48, // ret @@ -9028,7 +9014,7 @@ static const uint16 qfg4RestartPatch[] = { 0x39, 0x09, // pushi 9d (cel) 0x40, PATCH_UINT16(0xffbc), PATCH_UINT16(0x0006), // call 6d [-68] - 0x33, 0x0a, // jmp 10d (skip waste bytes) + 0x33, 0x0a, // jmp 10d [skip waste bytes] PATCH_END }; @@ -9094,7 +9080,7 @@ static const uint16 qfg4RopeScalerPatch[] = { // Fixes bug: #10824 static const uint16 qfg4Tarot3QueenSignature[] = { SIG_MAGICDWORD, - 0x34, SIG_UINT16(0x03f1), // ldi 1009d (Queen of Cups) + 0x34, SIG_UINT16(0x03f1), // ldi 1009d ("Queen of Cups") 0xa3, 0x00, // sal local[0] SIG_ADDTOOFFSET(+46), // ... 0x39, 0x1f, // pushi 31d (say: 1 6 31 0 self) @@ -9102,7 +9088,7 @@ static const uint16 qfg4Tarot3QueenSignature[] = { }; static const uint16 qfg4Tarot3QueenPatch[] = { - 0x34, PATCH_UINT16(0x03ed), // ldi 1005d (Queen of Swords) + 0x34, PATCH_UINT16(0x03ed), // ldi 1005d ("Queen of Swords") PATCH_END }; @@ -9116,7 +9102,7 @@ static const uint16 qfg4Tarot3QueenPatch[] = { // Fixes bug: #10823 static const uint16 qfg4Tarot3DeathSignature[] = { SIG_MAGICDWORD, - 0x34, SIG_UINT16(0x03fa), // ldi 1018d (The Devil) + 0x34, SIG_UINT16(0x03fa), // ldi 1018d ("The Devil") 0xa3, 0x00, // sal local[0] SIG_ADDTOOFFSET(+46), // ... 0x39, 0x23, // pushi 35d (say: 1 6 35 0 self) @@ -9124,7 +9110,7 @@ static const uint16 qfg4Tarot3DeathSignature[] = { }; static const uint16 qfg4Tarot3DeathPatch[] = { - 0x34, PATCH_UINT16(0x03fd), // ldi 1021d (Death) + 0x34, PATCH_UINT16(0x03fd), // ldi 1021d ("Death") PATCH_END }; @@ -9162,7 +9148,7 @@ static const uint16 qfg4Tarot3TwoOfCupsSignature[] = { }; static const uint16 qfg4Tarot3TwoOfCupsPatch[] = { - 0x33, 0x31, // jmp 49d (skip subroutine declaration) + 0x33, 0x31, // jmp 49d [skip subroutine declaration] 0x38, PATCH_SELECTOR16(moveSpeed), // pushi moveSpeed 0x78, // push1 0x76, // push0 @@ -9198,7 +9184,7 @@ static const uint16 qfg4Tarot3TwoOfCupsPatch[] = { 0x38, PATCH_UINT16(0x00d2), // pushi 210d (setMotion, x arg) // 0x8b, 0x00, // lsl local[0] (test the card's View number) - 0x34, PATCH_UINT16(0x03ff), // ldi 1023 (Two of Cups is special) + 0x34, PATCH_UINT16(0x03ff), // ldi 1023d ("Two of Cups" is special) 0x1a, // eq? 0x31, 0x04, // bnt 4d [regular y arg] 0x39, 0x66, // pushi 102d (setMotion, special y arg) @@ -9218,7 +9204,7 @@ static const uint16 qfg4Tarot3TwoOfCupsPatch[] = { 0x39, 0x32, // pushi 50d (setMotion, y arg) 0x41, 0x9b, PATCH_UINT16(0x0006), // call 6d [-101] - 0x33, 0x0c, // jmp 12d (skip to the original toss that ends this switch) + 0x33, 0x0c, // jmp 12d [skip to the original toss that ends this switch] PATCH_END }; @@ -9238,7 +9224,7 @@ static const uint16 qfg4Tarot3TwoOfCupsPatch[] = { static const uint16 qfg4Tarot3PrioritySignature[] = { 0x78, // push1 (setPri: 1, "Eight of Swords", West, V) SIG_ADDTOOFFSET(+14), // ... - 0x39, 0x20, // pushi 32 (say cond:32) + 0x39, 0x20, // pushi 32d (say cond:32) SIG_ADDTOOFFSET(+68), // ... 0x76, // push0 (setPri: 0, "Strength", West, H) SIG_ADDTOOFFSET(+84), // ... @@ -9247,8 +9233,8 @@ static const uint16 qfg4Tarot3PrioritySignature[] = { 0x76, // push0 (setPri: 0, "Death", South, H) SIG_ADDTOOFFSET(+12), // ... SIG_MAGICDWORD, - 0x39, 0x06, // pushi 6 (say verb:6) - 0x39, 0x23, // pushi 36 (say cond:35) + 0x39, 0x06, // pushi 6d (say verb:6) + 0x39, 0x23, // pushi 36d (say cond:35) SIG_END }; @@ -9286,9 +9272,9 @@ static const uint16 qfg4Tarot5PrioritySignature[] = { 0x78, // push1 (setPri: 1, "Six of Swords") SIG_MAGICDWORD, 0x83, 0x01, // lal local[1] (card obj) - 0x4a, SIG_UINT16(0x0006), // send 06 + 0x4a, SIG_UINT16(0x0006), // send 6d SIG_ADDTOOFFSET(+9), // ... - 0x39, 0x44, // pushi 68 (say cond:68) + 0x39, 0x44, // pushi 68d (say cond:68) SIG_END }; @@ -9319,7 +9305,7 @@ static const uint16 qfg4TentacleWriggleSignature[] = { 0x72, SIG_ADDTOOFFSET(+2), // loffsa tentacle 0x36, // push 0x72, SIG_ADDTOOFFSET(+2), // loffsa tentacle - 0x4a, SIG_UINT16(0x0008), // send 08 + 0x4a, SIG_UINT16(0x0008), // send 8d SIG_END }; @@ -9330,7 +9316,7 @@ static const uint16 qfg4TentacleWrigglePatch[] = { 0x35, 0x00, // ldi 0 (erase 2 bytes) 0x35, 0x00, // ldi 0 (erase 2 bytes) PATCH_ADDTOOFFSET(+3), // ... - 0x4a, PATCH_UINT16(0x0006), // send 06 + 0x4a, PATCH_UINT16(0x0006), // send 6d PATCH_END }; @@ -9371,20 +9357,20 @@ static const uint16 qfg4PitRopeFighterSignature[] = { SIG_MAGICDWORD, 0x38, SIG_SELECTOR16(cue), // pushi cue 0x76, // push0 - 0x54, SIG_UINT16(0x0004), // self 04 + 0x54, SIG_UINT16(0x0004), // self 4d 0x32, SIG_ADDTOOFFSET(+2), // jmp ?? [end the switch] SIG_END }; static const uint16 qfg4PitRopeFighterPatch[] = { PATCH_ADDTOOFFSET(+271), // ... (2 + 269) - 0x31, 0x1b, // bnt 26d (skip the say w/o ending the switch) + 0x31, 0x1b, // bnt 26d [skip the say w/o ending the switch] PATCH_ADDTOOFFSET(+21), // ... (8 + 13) 0x76, // push0 (null caller, so say won't cue crossByHand) PATCH_ADDTOOFFSET(+5), // ... // (no jmp, self-cue becomes cycles) 0x35, 0x20, // ldi 32d - 0x65, PATCH_GETORIGINALBYTE(1)+6, // aTop cycles (property offset = @state + 6d) + 0x65, PATCH_GETORIGINALBYTEADJUST(1, +6), // aTop cycles (property offset = @state + 6d) 0x33, 0x04, // jmp 4d [skip waste bytes, end the switch] PATCH_END }; @@ -9489,41 +9475,40 @@ static const uint16 qfg4PitRopeMagePatch2[] = { // script, description, signature patch static const SciScriptPatcherEntry qfg4Signatures[] = { - { true, 0, "prevent autosave from deleting save games", 1, qg4AutosaveSignature, qg4AutosavePatch }, + { true, 0, "prevent autosave from deleting save games", 1, qfg4AutosaveSignature, qfg4AutosavePatch }, { true, 0, "fix inventory leaks across restarts", 1, qfg4RestartSignature, qfg4RestartPatch }, { true, 1, "disable volume reset on startup", 1, sci2VolumeResetSignature, sci2VolumeResetPatch }, { true, 1, "disable video benchmarking", 1, qfg4BenchmarkSignature, qfg4BenchmarkPatch }, - { true, 7, "fix consecutive moon rises", 1, qfg4MoonriseSignature, qfg4MoonrisePatch }, - { true, 10, "fix setLooper calls (2/2)", 2, qg4SetLooperSignature2, qg4SetLooperPatch2 }, + { true, 7, "fix consecutive moonrises", 1, qfg4MoonriseSignature, qfg4MoonrisePatch }, + { true, 10, "fix setLooper calls (2/2)", 2, qfg4SetLooperSignature2, qfg4SetLooperPatch2 }, { true, 31, "fix setScaler calls", 1, qfg4SetScalerSignature, qfg4SetScalerPatch }, { true, 41, "fix conditional void calls", 3, qfg4ConditionalVoidSignature, qfg4ConditionalVoidPatch }, { true, 83, "fix incorrect array type", 1, qfg4TrapArrayTypeSignature, qfg4TrapArrayTypePatch }, - { true, 83, "fix incorrect array type (floppy)", 1, qfg4TrapArrayTypeFloppySignature, qfg4TrapArrayTypeFloppyPatch }, { true, 270, "fix town gate after a staff dream", 1, qfg4DreamGateSignature, qfg4DreamGatePatch }, - { true, 320, "fix pathfinding at the inn", 1, qg4InnPathfindingSignature, qg4InnPathfindingPatch }, + { true, 320, "fix pathfinding at the inn", 1, qfg4InnPathfindingSignature, qfg4InnPathfindingPatch }, { true, 320, "fix talking to absent innkeeper", 1, qfg4AbsentInnkeeperSignature, qfg4AbsentInnkeeperPatch }, - { true, 440, "fix setLooper calls (1/2)", 1, qg4SetLooperSignature1, qg4SetLooperPatch1 }, + { true, 440, "fix setLooper calls (1/2)", 1, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, { true, 475, "fix tarot 3 queen card", 1, qfg4Tarot3QueenSignature, qfg4Tarot3QueenPatch }, { true, 475, "fix tarot 3 death card", 1, qfg4Tarot3DeathSignature, qfg4Tarot3DeathPatch }, { true, 475, "fix tarot 3 two of cups placement", 1, qfg4Tarot3TwoOfCupsSignature, qfg4Tarot3TwoOfCupsPatch }, - { true, 475, "fix tarot 3 card priority", 1, qfg4Tarot3PrioritySignature, qfg4Tarot3PriorityPatch }, - { true, 475, "fix tarot 5 card priority", 1, qfg4Tarot5PrioritySignature, qfg4Tarot5PriorityPatch }, + { true, 475, "fix tarot 3 card priority", 1, qfg4Tarot3PrioritySignature, qfg4Tarot3PriorityPatch }, + { true, 475, "fix tarot 5 card priority", 1, qfg4Tarot5PrioritySignature, qfg4Tarot5PriorityPatch }, { false, 500, "CD: fix rope during Igor rescue (1/2)", 1, qfg4GraveyardRopeSignature1, qfg4GraveyardRopePatch1 }, { false, 500, "CD: fix rope during Igor rescue (2/2)", 1, qfg4GraveyardRopeSignature2, qfg4GraveyardRopePatch2 }, - { true, 530, "fix setLooper calls (1/2)", 4, qg4SetLooperSignature1, qg4SetLooperPatch1 }, - { true, 535, "fix setLooper calls (1/2)", 4, qg4SetLooperSignature1, qg4SetLooperPatch1 }, - { true, 541, "fix setLooper calls (1/2)", 5, qg4SetLooperSignature1, qg4SetLooperPatch1 }, - { true, 542, "fix setLooper calls (1/2)", 5, qg4SetLooperSignature1, qg4SetLooperPatch1 }, - { true, 543, "fix setLooper calls (1/2)", 5, qg4SetLooperSignature1, qg4SetLooperPatch1 }, - { true, 545, "fix setLooper calls (1/2)", 5, qg4SetLooperSignature1, qg4SetLooperPatch1 }, + { true, 530, "fix setLooper calls (1/2)", 4, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, + { true, 535, "fix setLooper calls (1/2)", 4, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, + { true, 541, "fix setLooper calls (1/2)", 5, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, + { true, 542, "fix setLooper calls (1/2)", 5, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, + { true, 543, "fix setLooper calls (1/2)", 5, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, + { true, 545, "fix setLooper calls (1/2)", 5, qfg4SetLooperSignature1, qfg4SetLooperPatch1 }, { true, 630, "fix great hall entry from barrel room", 1, qfg4GreatHallEntrySignature, qfg4GreatHallEntryPatch }, { true, 633, "fix stairway pathfinding", 1, qfg4StairwayPathfindingSignature, qfg4StairwayPathfindingPatch }, { true, 643, "fix iron safe's east door sending hero west", 1, qfg4SafeDoorEastSignature, qfg4SafeDoorEastPatch }, - { true, 643, "fix iron safe's door oil flags", 1, qfg4SafeDoorOilSignature, qfg4SafeDoorOilPatch }, + { true, 643, "fix iron safe's door oil flags", 1, qfg4SafeDoorOilSignature, qfg4SafeDoorOilPatch }, { true, 645, "fix extraneous door sound in the castle", 1, qfg4DoubleDoorSoundSignature, qfg4DoubleDoorSoundPatch }, { false, 663, "CD: fix crest bookshelf", 1, qfg4CrestBookshelfCDSignature, qfg4CrestBookshelfCDPatch }, - { false, 663, "Floppy: fix crest bookshelf", 1, qfg4CrestBookshelfFloppySignature, qfg4CrestBookshelfFloppyPatch }, - { true, 663, "CD/Floppy: fix crest bookshelf motion", 1, qfg4CrestBookshelfMotionSignature, qfg4CrestBookshelfMotionPatch }, + { false, 663, "Floppy: fix crest bookshelf", 1, qfg4CrestBookshelfFloppySignature, qfg4CrestBookshelfFloppyPatch }, + { true, 663, "CD/Floppy: fix crest bookshelf motion", 1, qfg4CrestBookshelfMotionSignature, qfg4CrestBookshelfMotionPatch }, { true, 710, "fix tentacle wriggle cycler", 1, qfg4TentacleWriggleSignature, qfg4TentacleWrigglePatch }, { true, 710, "fix tentacle retraction for fighter", 1, qfg4PitRopeFighterSignature, qfg4PitRopeFighterPatch }, { true, 710, "fix tentacle retraction for mage (1/2)", 1, qfg4PitRopeMageSignature1, qfg4PitRopeMagePatch1 }, |