- 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