Submission #5456: keylie, pirohiko, KadMony & eddie's SNES Final Fantasy VI "game end glitch" in 24:33.26

(Link to video)
Super Nintendo Entertainment System
game end glitch
lsnes rr2-β23
88541
60.0988138974405
23594
Unknown
keylie, pirohiko, KadMony
(Additionally: eddie)
Final Fantasy III (U) (V1.0) [!].smc
Submitted by keylie on 4/6/2017 10:37:18 AM
Submission Comments
  • Emulator: lsnes rr2-beta23
  • Rom: Final Fantasy III (U) (V1.0)
  • Aims for fastest time
  • Uses game-breaking glitch
  • Abuses programming errors
  • Features mid-frame resets
  • Corrupts save data
  • Manipulates luck
This is an improvement of 30127 frames from the previously published TAS, using mid-frame resets to skip another portion of the game and to speed up the fights. Like the previous TAS, it uses the 52 game-over glitch to trigger the ending. The mechanics of this glitch were described in the previous TAS, so we will only detail the improvements of the present TAS. Comments are embedded in the above video and are available here.

Early Narshe escape

When Terra wakes up in Arvis house and leaves the house to escape through the caves, there is a invisible NPC placed in front of the backdoor to prevent Terra from entering the house again. The flag for this NPC is located at bit 1 of address $1F41. However, this flag is not set before the Whelk fight, where there is a save point. Also, there is another save point in the caves after leaving Arvis. So by overwriting the NPC flag from the second save by the value of the first save, we obtain a save where we can go back and enter Arvis house. This gives us access to the whole Narshe town and we can leave the town.

Dead party

To get faster gameovers, we will also build a dead party. In the first save, we have a 3-characters party, so we take this opportunity to let Terra die before saving. This was not a trivial task, because enemies are obviously weak in the very beginning of the game. Also, we absolutely need Terra to get the fast Whelk kill. Several options were considered, but in the end it was faster to let Terra die during Whelk fight and backtrack to the save point.
By the way, we used the non-assisted setup for the Whelk fight by leaving Battle Speed at 3. This is the slowest setting where Whelk shell takes 2 rounds before going inside. This gives us time to manipulate our damage as well as giving Whelk two attacks to kill Terra.
In the second save point, we have a solo Terra party, so we combine the two saves to get a solo dead Terra party. Actually, Terra's HP are not relevant to consider her dead, what matters is the Wound status. This trick was done in the continuation of the Arvis NPC trick, to save time in resets and to remove the save overwriting dialogs.
However, we had to be sure to be able to leave the cave without a single fight. Luckily, it was barely possible when the danger value was minimal, so we triggered a fight just before the second save point.

Details of the combined save

Save      | Terra status ($0014) | Party ($0250-$025F) | Arvis NPC ($0941) | Map/Coords ($0964/$09C0)
--
Whelk     | 88 (Wound+Magitek)   | Terra/Vicks/Wedge   | 00                | Cave before Whelk
Arvis     | 00                   | Terra               | 01                | Cave after Arvis
Combined  | 88 (Wound+Magitek)   | Terra               | 00                | Cave after Arvis
After all the mid-frame resets, we needed to get a valid savefile, which is tested by the game using a checksum system. To trigger a checksum collision, we carefully chose the name of Terra, so that after the last partial save overwrite, we ended up with a savefile with a correct checksum.

Triggering the ending

Like the previous TAS, we will manipulate the event pointer to be $1860 in RAM, which correspond to the lower byte of the money value. By buying and selling items, we set this byte to be C4 (C3-C7 works). Instruction C4 is:
C4 t1 t2 t3 t4 t5 addr -> if(t1 || t2 || t3 || t4 || t5) jump to addr; else continue;
tx are 2 bytes values referring to bits starting at $1E80, addr is 3 bytes

So addr is located at $186B-186D, which corresponds the item ids in slots 2-4 of the inventory. We placed a Leather Hat, a Mithril Pike (bought in Narshe) and a Buckler in these slots, so the memory looks like this:
|     Gold     |   Game Time  | Step counter |                  Inventory
| C4 | xx | xx | xx | xx | xx | xx | xx | xx | xx | xx |   69    |   1D    |   5A    |
                                                       | Leather | Mithril | Buckler |
                                                       |   Hat   |  Pike   |         |
When this C4 instruction is executed, it jumps to address $5A1D69 + $CA0000 = $241D69 if any of the tx is true. We didn't have to manipulate a tx, it was very likely that one will be good.
Address $241D69 is located in RAM, in the middle of the window colors configuration. We can now write our code to trigger the ending using colors. The code to input was carefully chosen to minimize the change of color values, and the result code is:
       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
$1D6x xx xx xx xx xx xx xx xx xx CD xx xx xx xx xx xx
$1D7x xx xx xx xx xx xx xx xx xx C3 xx xx xx xx xx xx
$1D8x xx xx xx xx xx B2 0C 53 00 B2 52 13 00 xx xx xx
Instructions are:
CD t1 t2 t3 t4 t5 t6 addr -> if(t1 && t2 && t3 && t4 && t5 && t6) jump to addr; else continue;
C3 t1 t2 t3 t4 addr       -> if(t1 || t2 || t3 || t4) jump to addr; else continue;
B2 aaaaaa                 -> call subroutine $aaaaaa + $CA0000

The first two instructions CD and C3 are just used to advance to the right location, where is actual relevant code is faster to input. In both cases, the test condition failed (which is surprising for the second one). The first B2 instruction jumps to address $CA530C which is the very end of the world destruction sequence that loads the World of Ruin maps. It was necessary to avoid a softlock during the game ending. The last instruction jumps to $CA1352 which is the beginning of the ending sequence.

Small tricks

Monster-in-a-box

If the first death is against the monster-in-a-box inside the Beginner's room in Narshe, it will increment the stack size by 9, which is equivalent to three deaths.

Fast preemptive runaway

During certain preemptive/side attacks, the party might not escape quickly, usually when there are more characters than enemies. However, by choosing Def. with Terra at the very beginning of the fight, it delays the escape script so that all characters have the time to escape. This saves 2 seconds per fight.

Suggested screenshots

Frames 99730

Fog: Judging.
Fog: This is definitely a big jump in improvement compared to the previous publication, and even to the previously rejected submission with the different method of ending the game (without the rests, but using possibly invalid SRAM). However, it's still the same method as before with the 52 game-overs, meaning a significant portion of the run is quite honestly boring to viewers. Because the time that was saved compared to the previous publication was during regular gameplay, even more of the run is considered to be of boring gameplay. Unfortunately, due to the nature of the glitch, this is ultimately unavoidable.
Until such a method is found to trigger the game end is found which doesn't rely on the 52 game-overs, and doesn't rely on possibly invalid RAM, this category will still remain in the Vault. Accepting as an improvement to the previous publication.
Spikestuff: Publishing
Last Edited by adelikat on 10/21/2023 6:57 PM
Page History Latest diff List referrers