Skip to content
Drenn1 edited this page Dec 22, 2016 · 3 revisions

This is a list of programming errors in the Oracle games. All offsets given are for the US Ages rom.

Table of Contents

Spirit's Grave and the Chest Game (Ages)

After buying all of the items from the secret shop (which triggers the chest game), map $1b in dungeon 1 becomes corrupted.

Cause

The programmers forgot a ret opcode in that room's "tile replacement" function, causing code meant for dungeon 1 to continue and execute code meant for the chest game.

See the tileReplacement_group4Map1b function (04:6576).

Text Warping (Both games)

https://www.youtube.com/watch?v=eaCbXa5lM7Q

Certain warps cause Link to walk outside of the screen instead of warping him instantly. By activating a textbox on the same frame Link activates the warp, the game will perform a normal screen transition instead of a warp, which will take him to the wrong room (unless the warp would send him to the same place, ie. the Maku Tree <-> Lynna City warp).

In Seasons, this glitch is not known to be exploitable anywhere. However, hacking the Pirate Skull to take him out of the desert demonstrates that the glitch still exists. (Activating a text warp from Horon Village to the Maku Tree takes you to the Lost Woods.)

In Ages, this can be used to trigger a glitch called Veran Warp, which is caused by a lack of bounds checking on the map screen. Its effects are numerous, from giving you extra keys in Jabu-Jabu's belly, to re-locking doors in dungeon 1, to spawning the final boss Veran (where its name came from).

Cause

For some reason, the game checks whether a textbox is active, and does not allow this kind of warp to activate if it is. Normal screen transitions are apparently exempt from this check. Removing the check fixes the bug, although it's unclear whether it served a purpose.

The check is at 01:6103.

Raft oddity (Ages)

There is code at 05:55bc which makes no sense:

ld a,(w1Companion.id)
or SPECIALOBJECTID_RAFT
jr z,@updateDirectionIfNotUsingItem
jr @updateDirection
The jr z line will never jump because SPECIALOBJECTID_RAFT is nonzero ($13).

They likely meant to write this:

ld a,(w1Companion.id)
cp SPECIALOBJECTID_RAFT
jr z,@updateDirectionIfNotUsingItem
jr @updateDirection
The only difference the latter code makes is that Link is prevented from changing directions on a raft while swinging his sword or using other items.

Double-length doorway centering code (Ages)

When Link warps through time, the game tries to check whether he warped onto a 2-tile wide doorway, such as the main building in past Symmetry City. If he did, the code would adjust his position to be in the center of the 2-tile wide door.

However, the code doesn't work, due to what is presumably a typo. Changing the opcode at 05:4db7 from ld a,e to ld e,a results in it working properly. (Although if a time portal is created, it doesn't get centered with him.)

The relevant subfunction starts at 05:4db3.

Time warping outside of Wing Dungeon (Ages)

If you attempt to warp to the present on the screen with the entrance to Wing Dungeon, but then get forced back (due to warping into a wall), the room layout buffer at $cf00 becomes corrupted. Side-effects include Link not being able to enter the dungeon, the grass having no effect, the ground being undiggable, and all tiles turning into walls after using the Cane of Somaria on them.

Cause

When a failed timewarp occurs, the buffer with the original room layout gets stored somewhere (so that tile changes are remembered, ensuring that an infinite timewarp loop doesn't occur). The corresponding screen in the present of d2 appears to have some special code relating to the collapsed cave, which uses this same buffer, causing the stored room layout to get overwritten. Thus, the game thinks the room is full of wall tiles.