This is a list of bugs / exploits in the Oracle games. All offsets given are for the US Ages rom.
- 1 Ages and Seasons
- 2 Ages only
- 2.1 Portal duplication
- 2.2 Spirit's Grave and the chest game
- 2.3 Time warping outside of Wing Dungeon
- 2.4 Raft oddity
- 2.5 Double-length doorway centering code
- 2.6 Cane of somaria + Expert's Ring
- 2.7 Ramlock
- 2.8 Veran fight bug
- 2.9 Raft dismount storage
- 3 Seasons only
Ages and Seasons
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).
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
When there are a great number of objects on the screen at the time Link activates a screen transition, it is possible to prevent some objects on the next screen from loading. This occurs because objects are not unloaded until a screen transition is completed. If the number of objects of a given type between both screens is greater than about 16 (14 for interactions), there will not be enough memory for all of them to load.
There is a similar glitch in Link's Awakening, but it is much easier to perform in that game. This is because the Oracles have 4 types of objects which can each have (roughly) 16 instances, while Link's Awakening can only have 16 objects of any kind.
Also known as deloading.
Despawning is very difficult to exploit, but hack authors may want to be cautious about how many objects of a certain type they put in one room.
- Deloading the villagers near Lynna Village using the Bomber's ring and Peace ring (to help with timing) can cause their ball to disappear. This results in some minor music corruption since they try to reference an object that doesn't exist. In particular, the vibrato goes crazy for a short while.
- Whirlpool effects in Ages are implemented through a part object. If the object can be prevented from spawning, Link will be able to pass through whirlpools. This is theoretically doable by digging up 16 items with the shovel before doing a screen transition.
Maple's item drops
Maple is bugged such that, when deciding what items Link should drop, bombs and seeds do not check the correct treasure indices. The end result is that, in order for these items to drop, Link must have a different item:
- Ember seeds require the sword
- Scent seeds require the boomerang
- Pegasus seeds require the rod of seasons
- Gale seeds require the magnet gloves
- Mystery seeds require item 0x09, which isn't an item that goes in the inventory; so Link will never drop mystery seeds?
- Bombs require the switch hook
This means pegasus and gale seeds never drop in ages, while bombs never drop from Link in Seasons (they still drop from Maple).
Note that obtaining the corresponding item isn't sufficient for a seed type to drop, since it also checks that Link has a certain quantity of the item, which will be zero before it is actually obtained. So, obtaining the rod of seasons, by itself, does not make pegasus seeds available from maple.
The relevant function is called
_mapleCheckLinkCanDropItem (05:6bb4) in the disassembly.
Bipin & Blossom's son crash
When the child first decides on what his career will be (in stage 7), if you leave the house without talking to him and come back later, he may change occupations.
If this happens while he is a singer, the game will crash.
This can be done with time-portals created by the tune of currents or tune of ages (not tune of echoes).
Whenever interactions are disabled (this can happen when opening a textbox or playing an instrument), and there's an existing time portal on-screen, the time-portal will duplicate itself if there is a free object slot before it.
This could potentially be used for despawning.
It isn't clear why the game creates new time-portals - the function that does this is at
02:7a3a. It is prevented from doing so as long as the existing portal is active, because it constantly resets a counter (address
$cddd). Once the portal is deactivated, the counter may reach zero, and it attempts to create a new portal.
However, the newly created time-portal tries to delete itself if an existing time-portal is already on-screen. There is a fault in this code; it only checks the first time-portal it sees. If the first time-portal it sees is itself, it does not see any problem, so it does not delete itself. The result: if the time-portal is created using an object slot before any existing time-portal, it will not delete itself.
The portal's code is at
This glitch is very difficult to perform multiple times, because the newly-created time-portal always tries to use the first free object slot. You need to create interactions temporarily before triggering the duplication.
Spirit's Grave and the chest game
After buying all of the items from the secret shop (which triggers the chest game), map
$1b in dungeon 1 becomes corrupted.
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.
This room's tile replacement function starts at
tileReplacement_group4Map1b in the disassembly).
Time warping outside of Wing Dungeon
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.
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.
There is code at
05:55bc which makes no sense (code snippet from the disassembly):
ld a,(w1Companion.id) or SPECIALOBJECTID_RAFT jr z,@updateDirectionIfNotUsingItem jr @updateDirection
jr z line will never jump because
SPECIALOBJECTID_RAFT is nonzero (
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
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
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
Cane of somaria + Expert's Ring
If you swing the Cane of Somaria and cancel the animation with the expert's ring (or fist ring?), the cane's sprite becomes glitched.
Whatever the heck this is. It seems like he ended Ramrock's scent seed phase at the same time he bumped into Ramrock? After this, he couldn't even open the inventory menu.
Veran fight bug
It seems that if you switch hook Veran as you take damage, she emerges immediately without going through the switch hook animation.
Raft dismount storage
If you get caught by a gale seed on the same frame you mount a raft, Link enters a glitched state. Link will be on the raft, but spinning as if he were caught by the gale seed. If Link dismounts the raft before the gale seed menu appears, he can partially walk through a wall in the direction he moved.
If you grab a rooster on the same frame you get grabbed by a gale seed, the rooster will follow Link through screen transitions.
This can be used to spawn multiple roosters and despawn the cutscene trigger in front of Onox's castle.
Grab the rooster through a wall
By using a technique known as Wall Clipping - which allows Link to get a few pixels closer to a wall than normal by walking into it from the side - Link can grab the chicken in Mt. Cucco through a wall.
If syger is killed on the same frame he goes into his "ball" form, something goes wrong, and an enemy slot's memory is not cleared properly. This causes a future enemy's "default" state to be 0x0a. All that really matters is that it is nonzero; if state is never zero, then health is never initialized, meaning the enemy will die immediately.