diff options
author | Vhati | 2019-01-05 04:42:21 -0500 |
---|---|---|
committer | Filippos Karapetis | 2019-01-05 22:26:24 +0200 |
commit | b28ac82fcba4ff9aed2690428311166df4915d7e (patch) | |
tree | 026c122755e525c1c710f04988afaa79982caec8 /engines | |
parent | b94ef3dab08fb123dd54e80a4ba17a19840e2b09 (diff) | |
download | scummvm-rg350-b28ac82fcba4ff9aed2690428311166df4915d7e.tar.gz scummvm-rg350-b28ac82fcba4ff9aed2690428311166df4915d7e.tar.bz2 scummvm-rg350-b28ac82fcba4ff9aed2690428311166df4915d7e.zip |
SCI32: Cleanup QFG4 script patches
Trivially revises comments and var names for consistency.
Changes hardcoded selector bytes to macros.
Confirms early patches against editions not tested at the time.
Combines two TRAP array patches (commits 6c44106, aceb528) into one.
Diffstat (limited to 'engines')
-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 }, |