Submission #6538: Jigwally's NES L'Empereur "save glitch" in 01:52.08

Nintendo Entertainment System
save glitch
BizHawk 2.3.2
6736
60.0988138974405
50644
Unknown
L'Empereur (U) [!].nes
Submitted by Jigwally on 10/23/2019 2:43:41 AM
Submission Comments
  • Major skip glitch
  • Uses a game restart sequence
  • Corrupts save data
  • Abuses opposite D-Pad presses (U+D/L+R)
  • Heavy luck manipulation
  • Genre: Strategy
I have a feeling this will be too boring to be published but I had a lot of fun with it. This is my first time doing something this technical & I took the game apart quite a bit.
This TAS uses a mid-frame reset to corrupt the save file in a way that it can be used to trigger the game's ending as quickly as possible.
There is an array of Officers beginning at 6005. Each officer is part of a linked list: the first attribute of each Officer is a 16-bit pointer to another Officer (or null, if they're the last in the list), which are dereferenced one after the other in order to loop through officer lists. By resetting in the space between the low and high byte being overwritten by new save data, I can create a glitched pointer which causes incorrect data in the officer array to be interpreted as an officer.
The other issue is that the game has a checksum for sensing corrupt files, so we have to bypass it by making sure that the corrupt file sums to the same value as the original save. This is easier to resolve if the glitch is performed on an officer with a lower RAM adress (60XX-62XX), because all of these officers belong to France, so it limits the amount of changes that can randomly happen to relevant RAM during any AI turns.
Scenario 4 is chosen because all of Napoleon's relatives become player-controlled, which allows me to execute the glitch in a single in-game month.
The route is as follows:
NATIONAL PHASE:
  • Deploy Jerome to Bordeaux, & send Dombrowski to Paris. This is done to ensure that both Mobrogue and Dombrowski are in player-controlled cities.
CITY PHASE, PART 1:
  • BORDEAUX: Save the game, then give a speech - by sheer coincidence this caused game RAM to go up exactly how much I needed it to match the checksum (51).
  • PARIS: Move four officers to another city. The purpose of this is to cause Ney's "next officer" stat to change from 61F4 (Lannes) to 67C1 (Dombrowski).
  • CITY 3: Save the game, then mid-frame reset so that the officer pointer is now 61C1 - This creates a glitched officer starting at Mobrogue's men/horses stat.
CITY PHASE, PART 2:
  • BORDEAUX: Assign 156 men to Mobrogue. Because the RAM address we're writing to is shared by the glitched officer, this causes a new officer to appear in Paris at 9C, which contains PAD1/PAD2 input.
  • PARIS: Rest, triggering the random Ball event, & perform input on PAD1/PAD2 equivalent to 6FE5. The Ball is a random event that assigns a random amount of morale, training and experience to each officer in the city.
At this point our officer list contains:
61C1 -> 009C -> 6FE5 -> ???? (keeps following values until it finds zero)
What we want from the ball is to have the glitched officer at 6FE5 to be assigned exactly 3 experience, because its experience stat is located at 6FEB (game state) and 3 is the flag for the game ending.
Because we are randomly assigning stat boosts to some critical memory regions, we also have to make sure the event we manipulate doesn't crash the game in the process.
IMPROVEMENTS:
There could possibly be a route in which the AI commander performs an action that fixes the checksum exactly for us, preventing me from having to take a turn to do it; however it already took me a really long time testing RNG branches to even come up with this & that's way too complex to work out unless I find some way to automate the testing process. I am happy with this run for now.
Because all we need is a link leading to 9C, there could very well be a faster solution that traverses some less obvious path through the RAM data, but I searched for a while & this was the only one I could find that worked. I haven't gone very far in investigating the Japanese release but there could very well be an exclusive solution.
I can almost certainly perform this same type of glitch on other Koei games, although some of the ones I've looked at use dual checksums which complicate the bypass process.

Memory: Judging
Memory: Optimization appears fine though it can be hard to tell due to the nature of the glitch.
This game has multiple different scenarios that change starting conditions and other mechanics. However, all scenarios share the same ending so I think only one variant of this branch needs to exist. I do not see the need for this save glitch to be replicated in other scenarios, but I could be wrong. In my opinion other scenarios would best be represented if they do not use this glitch and are entertaining enough to be accepted to Moons.
Audience response was fairly mixed. There were some people that felt the TAS was boring and others that were very entertained. There was 84% support in the votes (12 yes, 3 meh, 1 no). I personally felt the TAS was a little dull but I'm not super against the movie. I could see this movie being moons but if ratings swing the other way I could easily see this being sent to Vault later on.
Accepting to Moons.
fsvgm777: Processing.
Last Edited by adelikat on 11/1/2023 10:44 PM
Page History Latest diff List referrers