This page contains notes for the game Spy Fox in Dry Cereal.
Spy Fox in Dry Cereal The Plot: William the Kid has nearly completed his dastardly plan to cow-nap all the worlds supply of milk! The Mission: The super-suave agent, SPY Fox, must find Mr. Udderly, rescue all the cows, and stop.
This gives a brief technical rundown of the programming issues that prevent some of the game's dialogue from playing, as well as whatever hacks people have managed to cobble together to fix them.
All offsets apply to the original U.S. release of the game (MD5 hash e01f959bdd49d5b0c8660fd8a14d4799). All changes are pre-encrypted (Humongous games xor the main data file by 69).
To do: make these not completely half-assed |
Cause unknown; changing offset 24D1C6 from 6A to 68Survival island evolve oswajanie. appears to fix (changes pushWordVar() to pushWord(), definitely not correct!).
The game runs code equivalent to the following when the drachmas are used on the Chicken Knuckles sign:
Script 231 handles the logic for buying the Chicken Knuckles (and trying to buy them again afterwards). The problem is that the part of the script that handles the initial purchase also sets var252 to 1, meaning that the script will never get called again after it's already run.
To fix, change offset 242BD2 from 71 to 70, changing the condition from (var252 0 && script231 is not running) to (var252 0 script231 is not running).
The first time Fox boards the ship, the game runs script 223 to handle the change to the ocean room. Subsequent exits use a different script, but script 223 contains the logic and dialogue to handle them itself. Possibly someone just put the lines in the wrong script, thinking it was the one that was used, and the problem was never noticed.
Changing B3FF60 from 8E to B6 will run script 223 every time Fox boards.
Don't know what happened here. The logic is in script 225, which is only called when Drydock sticks up the map. Change B3FF60 from 8E to 88 to put it in place of the boarding animation (which it handles perfectly).
Seems to have been a simple design error. Changing offset E7DD28 from 34 A3 to 35 05 negates the check for whether Fox is standing by the lever and changes the jump offset so that the move-to-lever animation will play immediately afterward. This will cause Fox's move-to-lever animation to always play when the lever is clicked (as long as the piranha pool isn't already frozen). Of course, this looks silly if he's already standing by the lever.
The incorrect line of dialogue is actually duplicated and the original isn't in the game at all, so fixing that is out of the question. Dunno what makes the script bug out at the end, but changing 12F1B76 from 34 to 35 (ifNot() -> if()) will force the lines to play when they're supposed to, although the game won't proceed to random dialogue afterwards.
Who knows why this wasn't used. To replace the regular dialogue with this set, change offset 12E9F5A from 9E to 9F, which calls script 246 in place of 247.
A simple error. The game generates a random number from 1-6 and writes the result to memory. It's supposed to push it onto the stack and then go through a series of 'if (number 1) { playline1 } else if (number 2) { playline2 }..' statements, but instead it pushes a constant 0x01, meaning the first line plays every time.
The remaining five can be heard by changing the data at offset 18ACFFC from
69 68 69 6B 69 6A 69 6D 69 6C 69 6F 69 6F 8A 69 E9 2A 69 29 69 68
to
69 6B 69 6A 69 6D 69 6C 69 6F 68 6C 69 8A 69 E9 2A 69 29 6A 69 29
The fix is so long because the script pushes a byte and pushing the correct memory location requires pushing a word, so this hack removes 1 as a possible outcome of the random number selection in order to get the needed extra byte. This obviously means the first line won't play.
Some issue with actor numbers or something. Can be more or less restored by changing offset 365FC66 from 6A 69 29 to 68 68 69 (although this causes the line to get attributed to the wrong actor, so the subtitles will be white instead of the correct blue color). Like the Beet Bliss hack, this changes a pushWordVar() to a pushWord(), so it's not a proper fix.
Seems to be a simple case of checking the wrong element of an array. Element 9 is set when the missile button is pressed, but the game checks element 2. Fix by changing 40953E9 from 6B to 60.
This page contains notes for the game Spy Fox in Dry Cereal.
Spy Fox in Dry Cereal The Plot: William the Kid has nearly completed his dastardly plan to cow-nap all the worlds supply of milk! The Mission: The super-suave agent, SPY Fox, must find Mr. Udderly, rescue all the cows, and stop.
This gives a brief technical rundown of the programming issues that prevent some of the game's dialogue from playing, as well as whatever hacks people have managed to cobble together to fix them.
All offsets apply to the original U.S. release of the game (MD5 hash e01f959bdd49d5b0c8660fd8a14d4799). All changes are pre-encrypted (Humongous games xor the main data file by 69).
To do: make these not completely half-assed |
Cause unknown; changing offset 24D1C6 from 6A to 68Survival island evolve oswajanie. appears to fix (changes pushWordVar() to pushWord(), definitely not correct!).
The game runs code equivalent to the following when the drachmas are used on the Chicken Knuckles sign:
Script 231 handles the logic for buying the Chicken Knuckles (and trying to buy them again afterwards). The problem is that the part of the script that handles the initial purchase also sets var252 to 1, meaning that the script will never get called again after it's already run.
To fix, change offset 242BD2 from 71 to 70, changing the condition from (var252 0 && script231 is not running) to (var252 0 script231 is not running).
The first time Fox boards the ship, the game runs script 223 to handle the change to the ocean room. Subsequent exits use a different script, but script 223 contains the logic and dialogue to handle them itself. Possibly someone just put the lines in the wrong script, thinking it was the one that was used, and the problem was never noticed.
Changing B3FF60 from 8E to B6 will run script 223 every time Fox boards.
Don't know what happened here. The logic is in script 225, which is only called when Drydock sticks up the map. Change B3FF60 from 8E to 88 to put it in place of the boarding animation (which it handles perfectly).
Seems to have been a simple design error. Changing offset E7DD28 from 34 A3 to 35 05 negates the check for whether Fox is standing by the lever and changes the jump offset so that the move-to-lever animation will play immediately afterward. This will cause Fox's move-to-lever animation to always play when the lever is clicked (as long as the piranha pool isn't already frozen). Of course, this looks silly if he's already standing by the lever.
The incorrect line of dialogue is actually duplicated and the original isn't in the game at all, so fixing that is out of the question. Dunno what makes the script bug out at the end, but changing 12F1B76 from 34 to 35 (ifNot() -> if()) will force the lines to play when they're supposed to, although the game won't proceed to random dialogue afterwards.
Who knows why this wasn't used. To replace the regular dialogue with this set, change offset 12E9F5A from 9E to 9F, which calls script 246 in place of 247.
A simple error. The game generates a random number from 1-6 and writes the result to memory. It's supposed to push it onto the stack and then go through a series of 'if (number 1) { playline1 } else if (number 2) { playline2 }..' statements, but instead it pushes a constant 0x01, meaning the first line plays every time.
The remaining five can be heard by changing the data at offset 18ACFFC from
69 68 69 6B 69 6A 69 6D 69 6C 69 6F 69 6F 8A 69 E9 2A 69 29 69 68
to
69 6B 69 6A 69 6D 69 6C 69 6F 68 6C 69 8A 69 E9 2A 69 29 6A 69 29
The fix is so long because the script pushes a byte and pushing the correct memory location requires pushing a word, so this hack removes 1 as a possible outcome of the random number selection in order to get the needed extra byte. This obviously means the first line won't play.
Some issue with actor numbers or something. Can be more or less restored by changing offset 365FC66 from 6A 69 29 to 68 68 69 (although this causes the line to get attributed to the wrong actor, so the subtitles will be white instead of the correct blue color). Like the Beet Bliss hack, this changes a pushWordVar() to a pushWord(), so it's not a proper fix.
Seems to be a simple case of checking the wrong element of an array. Element 9 is set when the missile button is pressed, but the game checks element 2. Fix by changing 40953E9 from 6B to 60.