Emulator information

  • Emulator: BizHawk
  • Emulator version: 2.4.1
  • Profile: N64 Tool-assisted Speedruns
  • Core type: Pure interpreter
  • Video plugin: GLideN64 (default settings)
  • Video resolution: 320x240
  • Controllers: 1 and 3

Game information

Game version: JPN 1.0

Run goal

The goal of this TAS is to beat The Legend of Zelda: Ocarina of Time as fast as possible, without any restriction. This category is widely known as any%, and takes advantage of the Stale Reference Manipulation glitch to achieve Arbitrary Code Execution and reach the credits.
The Japanese version of the game was used because of faster text. The version 1.0 was chosen because the setup to manipulate the memory requires this version of the game.

Introduction

We all thought Ganondoor would remain the fastest way to beat the game... but we were wrong !
Since the last official submission on this website, the Get Item Manipulation glitch was found in 2015, which saved a little more than a minute according to this unofficial TAS, but was not possible to do on Nintendo 64 under normal circumstances and required the usage of Rice video plugin to work on emulator. This route remained the same for years until a new major glitch has been found: the Stale Reference Manipulation glitch, or SRM for short. This glitch enables us to achieve Arbitrary Code Execution, or ACE for short, to warp straight to the credits. After this glitch was applied to any% mainly thanks to MrCheeze's work, I made a TAS of it which ended up with a time of 6:54.27. However, there was one big problem with it: the route I used was intended to be used by speedrunners. Therefore, the advantages that TAS has over real-time speedrunning could not be exploited to save even more time. Moreover, I used the Mupen64 emulator which is banned from this website, because I was expecting this category to evolve since ACE was fairly new. Immediately after I published my TAS, Tharo contacted me and was motivated to work on a route that would take advantage of TAS powers to reach credits faster by using controller 1 and 3 inputs. After some failed attempts, we successfully found a setup that worked and avoided the game over, which itself saves about 12 seconds ! This time, I tried the Bizhawk emulator for the run to be publishable on this site since it is a big improvement. The final time for this run is 6:37.33, which is 16.94 seconds faster than my previous TAS, and 13 minutes and 32 seconds faster than the previous official submission on this website. Although the bk2 file indicates 9,432 re-records, it is actually much more than that because I reproduced some inputs from my previous TAS, which has 20,793 re-records. I think this new TAS also has around 20,000 re-records in reality.

The SRM glitch

In October 2019, Glitches0and0stuff noticed a weird behaviour of boomerang when changing rooms while it is grabbing an object. We can observe that the object the boomerang is holding changed and was replaced by a door. Similar instances were also observed with bomchus in the past, notably one back in 2007, over 12 years earlier. However, what changed over 12 years in the Ocarina of Time community is our tools to analyse the game that became way more sophisticated and enabled much deeper look into the memory of the game to understand this glitch. Interestingly, it was noticed that this glitch enables to write some data in some memory locations based on how it set up. By manipulating the structure of the memory, we can take advantage of this glitch to write specific data into a specific location to give special effects to objects. Only two weeks after Glitches0and0stuff's video, he found an interesting application that consists in editing the chest contents. Two more weeks later, the first instance of ACE was achieved, and another month later, Total Control ACE was achieved which truly broke all limits of the game.

Route description

This part has been written by Tharo and is going to explain in detail how this route exploits the SRM glitch to reach the credits:
Actor
A dynamic, interactive game entity whose state may evolve during gameplay. For example: Link, Kokiri Children, Rocks and Signs
Actor Heap
The dynamic memory arena in which Actor Instances and Overlays, and possibly other data can be found
Actor Instance
Data pertaining to a particular instance of an actor, one of these is loaded for each actor and contains data common to all actors (position, rotation, flags, etc.) and specific data (i.e. in Link, information for his shield hitbox)
Actor Overlay
The file in which an actor's code and data that is the same for all actors of that type is stored. Only one of these is allocated for all actors of the same type.
MIPS
The CPU Architecture of the Nintendo 64. It defines the assembly instruction set used by the CPU.
Culling
Actors that are sufficiently far off camera will not update or draw.
Wonder Item
An actor present in Kokiri Forest responsible for handling giving you blue rupees for jumping the platforms in time.
Cutscene Pointer
A reference to tell the game where the data for the cutscene currently being played is located.
Stale Reference Manipulation (SRM)
A use-after-free bug which allows us to continue writing data to actors that are no longer loaded. There are several ways in which this can be achieved but in this run we only use held actor SRM. If an actor is grabbed by link but is culled and subsequently unloaded, the reference to this actor is not invalidated and data such as position and rotation values are still written to where this actor used to be located in memory. If something new loads into the space the grabbed actor's instance used to occupy, those values still being written will corrupt the newly loaded entity in possibly useful ways.
Throughout the run, actions are performed to set up the game's dynamic memory arena in an effort to line up a MIPS branch instruction with the rotation value written with SRM in order to redirect it to a location in memory where we can write our own code. By shuffling different actors around in memory with the methods described below, we can align where we write with SRM with actor overlay code and modify that code to our benefit.
By collecting permanent rupees in Kokiri Forest, more free space will be available leading to different permutations of heap entities.
There is a loading transition between the Deku Tree clearing and the Kokiri village which unloads actors in one area and loads new actors for the other. This can be exploited to shuffle actors around in memory even further. By traversing this loading transition several times with a combination of charging a spin attack (which loads its own actor)/not charging a spin attack and looking towards Mido/looking away from Mido (as some allocations are sensitive to camera angle) we can move everything into the correct positions in memory for later.
Getting Walking While Talking off the crawlspace and sign, we load the circle of rocks near Mido's House. We cancel Return A by slashing our sword and recoiling off a rock, making the camera begin to zoom out towards the crawlspace. Before it gets too far away, we pick up the rock which culls soon after due to the camera getting too far away. The rock we pick up is the one that results in the grabbed actor reference eventually lining up the way we want.
With the culled rock held we make our way blind through the loading transition, which unloads the rock and allows new entities to allocate into this space, achieving SRM.
We traverse the loading plane once more to return to the village area and shield-drop the rock in the angle range 0x821A to 0x8245 to corrupt a branch instruction in the Wonder Item actor overlay to point into Link's actor instance.
We point the branch instruction to direct execution onto two adjacent 16-bit values, both of which we manipulate into a single valid MIPS instruction beforehand. These values are the "movement angle", the angle Link last moved towards, and the "target angle", the angle link last targeted or used a spin attack towards.
We manipulate these angles such that they form 080475E4, which is `J 0x8011D790`, or "Jump to 0x8011D790"
Located at address 0x8011D790 is the most recently polled inputs from each controller, with some additional status information. Only controllers 1 and 3 are polled by the retail releases of the game, controller 3 being available to delete save data in the event of a corruption by an input code. Each controller is 6 bytes long, 4 of which are the inputs themselves. Since MIPS instructions are all 4 bytes long and must start at an address that is a multiple of 4, we can only trivially form two instructions from both Controller 1 and Controller 3's input as they are the only ones that align properly, so not being able to use Controller 2 and 4 is not especially impactful.
With controller 1, we perform arithmetic on the N64's GP Register (Global Pointer) which goes unused by the game due to the settings it was compiled with. This gives us a useful temporary space in which to load values to and then store them where we want on the next frame. However, we can only hold one temporary value at a time and not all load/store instructions are available with the possible inputs we can form with controller button presses.
With controller 3, we run another jump instruction to safely resume game execution to prevent crashing on invalid instructions following our carefully crafted controller input values.
The controller inputs we perform at this stage are as follows:
Controllers (FORMAT: Number: Buttons, (StickX, StickY) ; Hex Value ; MIPS Instruction)
Frame 1: (Loads the first value to store to the Cutscene Pointer)
1: Z, D-Down, R, C-Up, C-Down, (-16, -16) ; 0x241CF0F0 ; ADDIU gp r0 0xF0F0 ; Adds the value 0xF0F0 to zero and stores the result in GP
3: D-Up, C-Left, C-Right, (94, -69) ; 0x08035EBB ; J 0x800D7AEC ; Jump to 0x800D7AEC
Frame 2: (Stores lower half to cutscene pointer)
1: A, Z, D-Down, D-Left, L, R, C-Up, C-Down (29, 106) ; 0xA63C1D6A ; SH gp 0x1D6A(s1) ; Stores the value in GP to s1 + 0x1D6A
3: D-Up, C-Left, C-Right, (94, -69) ; 0x08035EBB ; J 0x800D7AEC ; Jump to 0x800D7AEC
Frame 3: (Loads the second value to store to the Cutscene Pointer)
1: Z, D-Down, R, C-Up, C-Down, (-128, 55) ; 0x241C8037 ; ADDIU gp r0 0x8037 ; Adds the value 0x8037 to zero and stores the result in GP
3: D-Up, C-Left, C-Right, (94, -69) ; 0x08035EBB ; J 0x800D7AEC ; Jump to 0x800D7AEC
Frame 4: (Store upper half to cutscene pointer)
1: A, Z, D-Down, D-Left, L, R, C-Up, C-Down (29, 104) ; 0xA63C1D68 ; SH gp 0x1D68(s1) ; Stores the value in GP to s1 + 0x1D68
3: D-Up, C-Left, C-Right, (94, -69) ; 0x08035EBB ; J 0x800D7AEC ; Jump to 0x800D7AEC
Frame 5: (loads the cutscene value to store to current cutscene)
1: Z, D-Down, R, C-Up, C-Down, (-1, -3) ; 0x241CFFFD ; ADDIU gp r0 0xFFFD ; Adds the value 0xFFFD to zero and stores the result in GP
3: D-Up, C-Left, C-Right, (94, -69) ; 0x08035EBB ; J 0x800D7AEC ; Jump to 0x800D7AEC
Frame 6: (stores cutscene value to current cutscene)
1: A, Z, D-Down, L, R, C-Up, C-Down (-91, -38) ; 0xA43CA5DA ; SH gp 0xA5DA(at) ; Stores the value in GP to at + 0xA5DA
3: D-Up, C-Left, C-Right, (94, -69) ; 0x08035EBB ; J 0x800D7AEC ; Jump to 0x800D7AEC
The registers at and s1, at the time of jumping to controller inputs, have the values:
- at = FFFFFFFF 80120000 | Intermediate value for accessing game save data beginning at 8011A5D0
- s1 = FFFFFFFF 801C84A0 | Pointer to the "Global Context", containing information about the current state of the game.
At address 0x800D7AEC is code to restore the stack pointer by the required amount and a jump to the return address register to resume normal execution.
The code we execute here is to load two halves of the address at which one of the two Kokiri Forest credits cutscenes is at and store them to the Cutscene Pointer. Once this is done, we store 0xFFFD to the "current cutscene" value, causing the credits to immediately play, ending the run.

Rupee route

In order to perform SRM, the sword, the shield and Deku nuts are needed. The shield and Deku nuts must be bought for 55 rupees. To collect this amount, a route has to be chosen with some constraints. First of all, as Tharo explained in the previous section, this route requires to collect all permanent rupees in the Kokiri area in order to set up the memory. These rupees themselves make 22 rupees. Another constraint is that we also have some rupees that are directly on the way and that require extremely little to no time to get. These rupees make another 15 rupees. Therefore, we already have 37 rupees collected normally. The remaining 18 rupees have to be collected among rupees that can be reached without loosing a significant amount of time. The map below (taken from https://www.vgmaps.com/Atlas/N64/ and edited by me) sums up the situation.
We see an interesting option here. We can manipulate bushes so that they always give 3 rupees (1/16 chance). Fortunately, 18 is a multiple of 3 so 6 perfect bushes just fulfils the rupee requirement. Moreover, they are also on the way to the hidden permanent blue rupee located in the sign.
When Tharo was adapting MrCheeze's route for this TAS, I suggested him to research for a way to skip the permanent blue rupee on the bridge, as well as the permanent blue rupee behind Mido's house. The reason is because both of these rupees take too much time to collect. Notably, it is possible to compensate these 10 rupees by taking the blue rupee near the bush in the sword area and the blue rupee in the shop. Unfortunately, no setup was found after researching with simulation tools. I even suggested to check the versions 1.1 and 1.2 of the game to see if they are different enough to permit a setup, but it turns out they are not different enough to have different setups.

Section by section

Filename:
From my previous TAS, we notice that I no longer put a special filename. This is because Tharo's adaptation of the route bypassed this requirement.
Link's house -> Crawlspace:
This section is very straight-forward since it has been optimised since years. I only had to redo inputs from my previous TAS for this part.
Crawlspace -> Sword:
We notice here that I did different movements than traditional TASes to reach the blue rupee. These differences did not end up saving time since going any faster would result in link hitting the rolling rock. However, I managed to save 6 frames over MrGrunz and Bloobiebla's TAS from the blue rupee until the sword chest. This improvement comes from the fact that I somehow got a good positioning before the last turn that enabled me to not have to walk for 6 frames before the last sidehop to reach the chest.
Sword -> Crawlspace:
After the sword the movement remains the same in my previous TAS until the crawlspace, which ties traditional TASes as well.
Rupee collection:
This section is one of the hardest of the run. Although I explained earlier which rupees should be collected, it was also needed to find the order in which they should be collected. The beginning is straight-forward since Link is just in front of the bushes and the hidden permanent rupee. RNG was manipulated such that 3 rupees always spawn. We notice that, like in my previous TAS, I was able to cut 3 bushes with a single slash and 2 of them spawned 3 rupees. Unfortunately, I was not able to find a good reachable RNG for which I wouldn't have to cut that extra bush (because cutting a bush creates a lag of 3 frames). I was neither able to reproduce such luck elsewhere that would cut 2 bushes. Overall, I manipulated the RNG better than in my previous TAS, which lead to faster movements and saved about 19 frames.
After the bushes are cut and the hidden blue rupee taken, I tried a new route I did not try on my previous TAS: instead of going for the blue rupee behind Mido's house first and then the blue rupee on the bridge, I was thinking of doing the opposite. My motive was that I thought that it could be possible to WESS after collecting the bridge rupee to clip inside the house and get the last permanent blue rupee from out of bounds. This house clip has been known for quite some years, but was only used to get to Lost Woods faster. The advantage of this new route is that we can get to this rupee faster and we also avoid a ledge grab.
To take the blue rupee on the bridge, there is a clip found many years ago that speedrunners have always been using, but never used in TAS because of the time it takes to take it. By jumpslashing at a specific frame, Link is popped on top of the bridge because he is close enough of the floor. After that, something interesting is done to grab the blue rupee optimally: there is a girl next to the blue rupee, consequently, if you press A to sidehop to the stone to WESS just after collecting the rupee, Link will instead talk to the girl because the rupee hitbox is located within the range where Link can talk. To counter this problem, I take advantage of how forward slashing works (holding the joystick to the front of Link and pressing Z and B). This type of slash makes Link go backward for 1 frame, and suddenly forward with high speed for a brief amount of time. The frame where Link goes backward is enough to grab the rupee, and the forward boost makes link go forward enough to be outside the range of the girl. This method is much faster than walking to the blue rupee, turning and walking to exit the range. That trick was also done in my previous TAS. After that, I keep the same angle and do a twisted sidehop in order to sidehop diagonally and jumpslash at the perfect frame to barely hit the stone and barely enter in the water to perform the WESS.
Clipping inside the house with WESS speed is more precise than with SuperSlide or HESS speed since it is a much lower speed. It requires not only a good angle, but also a good positioning that is gotten by changing angle at the correct moment and is more precise than it looks. Once we clip inside the house, getting to the rupee is tricky. The wall where we normally ledge grab extends inside the house as well and normally requires grabbing it. However, the house collision also extends behind this wall on the left side of the house (see the screenshots below).
This house collision is very helpful because it causes an unwanted effect which is, if you have sufficient speed, it is possible that the house collision pushes link out of bounds and completely ignores the wall collision. Sidehopping gives sufficient speed for this. Similarly to the bridge clip, since Link is close enough of the floor above him, he is popped up and we then collect the rupee without grabbing any ledge.
The last rupees are then collected and something interesting happened when I was doing the last sidehop to go the shop. Thanks to the very good positioning I had on the stones, I was able to land extremely close to the shop loading zone. So close that doing a vertical slash forward was the fastest way to enter in it and was 3 frames faster than anything else. Until this point (since the hidden blue rupee in the sign), about 131 frames have been saved compared to my previous TAS: 74 frames come from the new rupee collection order and about 57 come from avoiding to call Navi, because this new any% route does not need to go to first person during ACE anymore.
Shop -> Deku tree area:
After buying Deku nuts and the shield and exiting the shop, I do another WESS to get to Mido that I took from my previous TAS since it was already optimal. This WESS does not save a big amount of time, but it is still faster and very cool too. Unfortunately, we cannot skip Mido like in MrGrunz and Bloobiebla's TAS because later in the run, during the Walking While Talking glitch that will be performed later, Mido's collision will remain and there is no way to skip Mido while holding a rock.
Once we get past this guy, we start the heap manipulation to setup the memory. For that, we need to cross several times the transition between the forest area and the Deku tree area. A map of transitions and area can be found below:
However, we need to cross them in a special way: during some transitions, it is necessary to have Mido unloaded or loaded. When he needs to be loaded, the camera should be directed towards the forest, and directed towards the Deku tree otherwise. Moreover, during some transitions, it is also necessary to cross the transition while charging a spin attack, in order to cross the transition with this actor loaded. However, while making my previous TAS, I noticed that if Link does a forward slash, the actor spawns and link can walk for just one frame before starting to charge the sword. So when a transition should be crossed using a spin attack, I get Link close enough of the transition, do the forward slash, and during that frame of walking, cross the transition and immediately release B. By doing this, Link will still crouch and the memory set correctly, but Link will not spin attack, which saves time.
Once I reach the last transition from the forest area to the Deku tree area, I perform a glitch called Return A which will be useful later. It is done by pressing Z, R and C-up at the same frame and having a damage source hit the shield at the first possible frame. We can also note that from the shop until the last transition, 3 frames have been lost compared to my previous TAS although I kept the exact same inputs. This is likely due to emulation differences during the transition from Deku area to the Forest area that is longer on Bizhawk.
Deku babas -> Crawlspace:
The goal is now to get to the crawlspace for the next glitch that will come. In order to get there, the first idea is to go there normally by sidehopping. However, in TAS, we can take advantage of the damage source from the Deku baba to perform an A-Slide which gives link a speed of -18 to get to the platform near Mido faster (for reference, walking speed is 5.5 as child and sidehop speed is 8.5). The disadvantage of A-Slide is that the angle can be changed in a limited way without loosing speed, and requires loosing speed to change even further than a certain limit, +2 of speed every walking frame to be exact. Normally, we can also perform an HESS out of a Deku baba as well because of its special way to deal damage. The advantage of HESS is that we can change angle and thus reach the crawlspace extremely fast. However, the Return A glitch gets cancelled if Link takes damage at low speed (has the knockback animation), which is a necessary step to perform an HESS, and can therefore not be done.
Because of the limited angle change A-Slide offers, I can keep the maximum speed until the corner, and then I change my angle in a first time without loosing speed, and walk for one frame to trade 2 of speed for a better angle (so we now have a speed of -16) and we keep the speed thanks to Z-Sliding until the very edge of the platform. Once we reach the end of the platform, we have no choice to sidehop until our goal. It should be noted that we also cannot enter in the water as it also cancels the Return A glitch, so we cannot do a WESS neither to reach the crawlspace faster. We might notice that I used a slightly different path in this version of the TAS than in my previous one because I did not try this path before, but it ended up being tied.
Crawlspace -> Rocks:
After Link exits the crawlspace, we have little time to sidehop to the sign and read it while throwing a Deku nut. This glitch is known as Walking While Talking. Under normal circumstances, doing this glitch would stick the camera to the sign as seen in this video. Because of the camera position, the rocks next to Mido's house cannot load and so, cannot be picked up. Thankfully, the Return A glitch we did earlier enable the camera to continue following Link. Now, we target the sign in order to change Link's angle to backflip through the fence. You may notice that I paused before the backflip. That is because if I press A without having paused beforehand, Link will try to read the sign no matter the distance and will softlock the game. Once we get past the fence, the goal is to get to these rocks, however, for memory to be set up correctly, it necessary that the sign regenerate before these rocks load. A sign regenerates either by playing Zelda's lullaby, which we cannot do here, or either by getting far enough of it. Normally, going directly to the rocks would load them before the sign regenerates, which will result in ACE failing. However, when making my previous TAS, with some camera manipulation, I managed to somehow regenerate the sign before rocks load while still going straight into them, which saves a good amount of time. When we reach the rocks, I have to slash and pick up one rock in particular that is located exactly where we want in memory. Slashing a rock or falling from a ledge has the effect of cancelling the Return A glitch while keeping the Walking While Talking glitch, so the camera will behave like normal and try to stick to the sign. Because of this, the camera gets too far away of the rocks to remain loaded, however, I pressed A to pick up the rock just before they unload, so we are now carrying an unloaded rock. On this section, I saved 9 frames compared to my previous TAS because I somehow got a better sidehop angle which got Link closer of the rock, so it could be slashed earlier.
Rocks -> Deku tree area:
The next step to achieve ACE is to bring Link to the Deku tree area while holding the unloaded rock. For that we might think of several paths. It should be noted that Link can also jump, but not very high. In my previous TAS, I used a path that seemed to be the most optimal, however, I somehow forgot to consider the possibility of jumping to land on the wonder item platform near Mido which seems to be a faster path to the Deku tree area. Finally, I tried this possibility and it ended up being 56 frames quicker.
To navigate blindly through the forest, I used Link's position at some checkpoints and found the angle that had to be held to go straight to the checkpoint. The map below shows the path of both TAS including jumping parts and checkpoints I used.
Reaching credits:
Once Link reaches the Deku tree area transition, the camera snaps back towards Link. However, this does not completely cancel the Walking While Talking glitch because the effect of the Z button (i.e. targeting) is disabled. The next step consists of going back to the Forest area and dropping the rock at a certain angle range (explained earlier by Tharo). The range is pretty big and was obtained easily. In addition, 11 frames have been saved from the previous TAS on this small section because of better movement that turned the camera faster towards the wonder item actor. After that, a value that stores the last target angle has to be set to a single possible value which is 75E4 (or 30180 in decimal). For reference, there are 2^16, or 65536 angle values that Link can have. Since Z targeting no longer works, the only way to set the value is to charge a spin attack (without necessarily attacking). With precise movement prior to slashing the sword, I was able to manipulate the camera in a way that made this value reachable. The last step is now to look at the wonder item actor with an angle of 0804 (or 2052 in decimal). Looking at the wonder item with any other angle will result in a crash. After the spin, the wonder item is not yet looked at which lets time to set up the angle. The map below shows where it is located.
Unfortunately, there was no possible joystick angle that resulted in the desired Link angle directly. But fortunately, once the camera starts to turn towards the wonder item, there was still 3 visual frames (9 frames) before the wonder item runs the code. On the first frame the camera turned, I was able to find a joystick angle that worked just fine and thus, did not loose time. Once the wonder item is looked at, I use the controller 1 and 3 and followed what Tharo wrote for joystick values and buttons to press which lead to credits.
On a funny note, I threw a Deku nut just one frame before the wonder item code started to give the allusion of using Deku nuts to wrong warp to credits, similarly to how Sheik uses Deku nuts to disappear.

And that's how you save Hyrule in just 3 minutes !

Special thanks

First of all, big thanks to the analysers of this game for understanding the power of SRM that made this route possible and for finding an application of SRM for any%. These are, but not only limited to, Glitches0and0stuff, Fig, Tharo, MrCheeze, blini, natalyahasdied and probably even more.
Special thanks to MrCheeze for finding the initial setup for ACE used in my previous TAS.
Special thanks to Tharo for adapting MrCheeze's route for TAS to reach the credits faster.

Suggested screenshots

Frame 15759:
Frame 16698:
Frame 20301:
Feel free to propose more and vote for the best one !

Note: Screenshots were taken with the lowest resolution: 320x240 because it is the only one that syncs. Higher resolution should be provided if published.

All images used in this submission can be seen in their original size by following this link: https://imgur.com/a/7BxEaV6

Memory: Claiming for judgment
Memory: There are no signs of any mistakes.
The movie was entertaining, featuring some interesting movement but the main draw is obviously the game end glitch.
There were questions as to whether or not this should obsolete the current run. This run visits a fair amount of fewer areas than the current run and there’s some different glitches exploited.
Accepting to Moons as a new branch.
Memory: Adding geg branch label.
Spikestuff: Publishing.


Spikestuff
They/Them
Editor, Publisher, Expert player (2656)
Joined: 10/12/2011
Posts: 6449
Location: The land down under.
HA
WebNations/Sabih wrote:
+fsvgm777 never censoring anything.
Disables Comments and Ratings for the YouTube account. Something better for yourself and also others.
homerfunky
He/Him
Experienced player (513)
Joined: 2/18/2015
Posts: 28
Location: France
Is it normal that the publication does not feature "Executes arbitrary code" while the run executes arbitrary code to reach the credits ?
EZGames69
He/They
Publisher, Reviewer, Expert player (4469)
Joined: 5/29/2017
Posts: 2765
If some tags or flags do not exist on a publication, assume it was a mistake unless said otherwise.
[14:15] <feos> WinDOES what DOSn't 12:33:44 PM <Mothrayas> "I got an oof with my game!" Mothrayas Today at 12:22: <Colin> thank you for supporting noble causes such as my feet MemoryTAS Today at 11:55 AM: you wouldn't know beauty if it slapped you in the face with a giant fish [Today at 4:51 PM] Mothrayas: although if you like your own tweets that's the online equivalent of sniffing your own farts and probably tells a lot about you as a person MemoryTAS Today at 7:01 PM: But I exert big staff energy honestly lol Samsara Today at 1:20 PM: wouldn't ACE in a real life TAS just stand for Actually Cease Existing
Samsara
She/They
Senior Judge, Site Admin, Expert player (2241)
Joined: 11/13/2006
Posts: 2823
Location: Northern California
Slowking wrote:
But I still think that is a weird decision to slap the fastest completion with extra labels. The fastest completion should always be any% (or how it is here, no label) and everything else should have qualifying labels why it is deliberatly slower than the fastest run. Not just because most communities handle it that way (although why you need to do it differently than everybody else I don't know). But also for the sake of consistency. If somebody wants to obsolete Grunz's and Bloob' run, how should they know what they are allowed to do? They clearly can't use the fastest route. That would make it "game end glitch". What can they actually do to obsolete that run in a nameless, not clearly defined category? Can you make clear rules what would obsolete Grunz's and Bloob's run and if so why not give it a label instead of giving one to the fastest run?
To put it as simply and bluntly as possible, the reason "game end glitch" is always a separate category on TASvideos is so there are... For lack of a better term, "normal" TASes of games still published and easily available to watch. We are not SRC, nor are we any RTA community. We have to define a wide, generalized set of rules that apply to every single game that could end up getting published here. We can't make exceptions for anything just because the specific RTA community does it, because the specific RTA community doesn't have thousands of other games to worry about at the same time. In that way, giving the branch to GEG makes so much more sense, since it's clear that GEG can and will only ever compete with itself, as it should. [4032] NES Super Mario Bros. 3 "game end glitch" by Masterjun & ais523 in 00:00.78 [3922] NES Super Mario Bros. 3 "warps" by Lord_Tom, Maru & Tompa in 10:24.34 If GEG was explicitly treated as any%, the latter run would not be published right now. The current high bar of the publication history that includes the most iconic TAS of all time, the one that literally started the site, would have been obsoleted by less than a second of a title screen followed by immediate credits. Several incredibly entertaining runs would suffer the same fate. A precedent would be set that GEG can obsolete different branches, so we'd be inundated with new, extremely similar runs, just that the subframe input also codes in 100% completion or whatever. Heat death of the site soon follows. Probably.
homerfunky wrote:
Is it normal that the publication does not feature "Executes arbitrary code" while the run executes arbitrary code to reach the credits ?
Another oversight that's now fixed. Thanks for pointing it out.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Site Admin, Skilled player (1255)
Joined: 4/17/2010
Posts: 11495
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
To clarify, a movie class that effectively makes branches compete with one another is Major skip glitch. And there are several applications of it that will be put as branch labels. That was the community agreement back in 2014. http://tasvideos.org/MovieClassGuidelines.html#MajorSkipGlitch http://tasvideos.org/Movies-C3041Y.html
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
evilas
They/Them
Joined: 7/31/2009
Posts: 68
So, could what the RTA community calls a "Defeat Ganon (SRM)" run be something that obsoletes the old Grunz & Bloob run? It uses SRM to warp to ganondorf instead of the credits, and you can do it with or without ACE. (with ACE I think it's basically the same as this run only you warp to the Ganon fight instead of the credits)
Over a decade on this site, holy shit
evilas
They/Them
Joined: 7/31/2009
Posts: 68
Sorry for doubleposting but,
Samsara wrote:
To put it as simply and bluntly as possible, the reason "game end glitch" is always a separate category on TASvideos is so there are... For lack of a better term, "normal" TASes of games still published and easily available to watch. We are not SRC, nor are we any RTA community. We have to define a wide, generalized set of rules that apply to every single game that could end up getting published here. We can't make exceptions for anything just because the specific RTA community does it, because the specific RTA community doesn't have thousands of other games to worry about at the same time. In that way, giving the branch to GEG makes so much more sense, since it's clear that GEG can and will only ever compete with itself, as it should. [4032] NES Super Mario Bros. 3 "game end glitch" by Masterjun & ais523 in 00:00.78 [3922] NES Super Mario Bros. 3 "warps" by Lord_Tom, Maru & Tompa in 10:24.34 If GEG was explicitly treated as any%, the latter run would not be published right now. The current high bar of the publication history that includes the most iconic TAS of all time, the one that literally started the site, would have been obsoleted by less than a second of a title screen followed by immediate credits. Several incredibly entertaining runs would suffer the same fate. A precedent would be set that GEG can obsolete different branches, so we'd be inundated with new, extremely similar runs, just that the subframe input also codes in 100% completion or whatever. Heat death of the site soon follows. Probably.
Why would that be? Why not call the fastest category "any%" and the categories that do more interesting stuff by actual category names? If GEG is treated as any%, then you can easily publish the other one as "no GEG", nothing else changes. The only difference is which one you consider "default". EDIT: why not have category names for all of them? Why not call Bloob and Grunz's run "no SRM"?
Over a decade on this site, holy shit
Samsara
She/They
Senior Judge, Site Admin, Expert player (2241)
Joined: 11/13/2006
Posts: 2823
Location: Northern California
To me, it's a matter of what's purely possible in-game. I.E, the branchless run should be the extent of what is possible without outside interference. When you introduce ACE, save or memory corruption into the equation (that is, adding in things explicitly done with the console hardware that isn't necessarily relevant to the game), it makes more sense to branch it as such to make sure it doesn't compete with what can be considered a more standard any% run. As long as stale reference manipulation (explaining it so that people don't confuse SRM with SRAM) is completely possible within the bounds of the game (no ACE whatsoever), yes it could theoretically obsolete the branchless run, but we would have to see it and decide for ourselves in order to be 100% certain of that. If it ends up being too similar to this run, it may not be published due to the redundancy clause.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
evilas
They/Them
Joined: 7/31/2009
Posts: 68
Samsara wrote:
To me, it's a matter of what's purely possible in-game. I.E, the branchless run should be the extent of what is possible without outside interference. When you introduce ACE, save or memory corruption into the equation (that is, adding in things explicitly done with the console hardware that isn't necessarily relevant to the game), it makes more sense to branch it as such to make sure it doesn't compete with what can be considered a more standard any% run. As long as stale reference manipulation (explaining it so that people don't confuse SRM with SRAM) is completely possible within the bounds of the game (no ACE whatsoever), yes it could theoretically obsolete the branchless run, but we would have to see it and decide for ourselves in order to be 100% certain of that. If it ends up being too similar to this run, it may not be published due to the redundancy clause.
If the dividing line is whether or not you use ACE, then GEG is not a good branch name for this run imo, considering you can do a credits warp that looks just as "game ending glitch"-y without using ACE?
Over a decade on this site, holy shit
Editor, Reviewer, Skilled player (1361)
Joined: 9/12/2016
Posts: 1646
Location: Italy
feos wrote:
To clarify, a movie class that effectively makes branches compete with one another is Major skip glitch. And there are several applications of it that will be put as branch labels. That was the community agreement back in 2014. http://tasvideos.org/MovieClassGuidelines.html#MajorSkipGlitch http://tasvideos.org/Movies-C3041Y.html
Thanks, I forgot to mention that. The movie tags make it much simpler to understand it for the casual watchers.
evilas wrote:
Why would that be? Why not call the fastest category "any%" and the categories that do more interesting stuff by actual category names? If GEG is treated as any%, then you can easily publish the other one as "no GEG", nothing else changes. The only difference is which one you consider "default". EDIT: why not have category names for all of them? Why not call Bloob and Grunz's run "no SRM"?
It looks like my post was buried and remained unnoticed. Please, try reading my post and see if it answers. But I'll try to explain it again: we actually don't label branches, but we label each movie publication independently, because we want to make it clear to casual watchers about what are the movie contents. Instead, for denoting the difference of the branch goal we use movie tags, from which you can tell which new submission could obsolete which movie. In most of the cases these tags are "uses major skip glitch" vs "forgoes using major skip glitch", like for the movie in this case. Additionally, the fastest-completion movie is denoted with the relative flag: For this reason, we usually don't use a label that consists in "no that glitch", because that doesn't tell what the movie contains. Instead, we leave the label blank in order to denote that that movie beats the game without showcasing any glitch in particular, and/or follows a restriction that makes it closer to the most common way of playing the game. Regarding the "any%" naming, we don't use it because it doesn't tell what kind of movie contents are featured. Also, when a new faster branch is introduced due to a newly discovered glitch, the "any%" naming would become misleading for the previous movie, as the fastest way to beat the game would effectively have changed. We can't rely on a label whose meaning may change depending on external factors. Additionally, the "any%" meaning is technically inapplicable for most games, as most games don't have any kind of in-game percentage. We use the "fastest-completion" wording instead, and we denote it with the relative movie flag , not with labels.
evilas wrote:
If the dividing line is whether or not you use ACE, then GEG is not a good branch name for this run imo, considering you can do a credits warp that looks just as "game ending glitch"-y without using ACE?
The dividing line is using major skip glitches or not, which is an objective yardstick that can't cause any confusion. Any movie that skips more than 50% of the supposedly mandatory game contents, will be denoted with that movie tag: http://tasvideos.org/Movies-C3041Y.html
my personal page - my YouTube channel - my GitHub - my Discord: thunderaxe31 <Masterjun> if you look at the "NES" in a weird angle, it actually clearly says "GBA"
evilas
They/Them
Joined: 7/31/2009
Posts: 68
ok, sorry, I now read your previous post
ThunderAxe31 wrote:
For the case of this game, it's very simple: just beat the game without using arbitrary code execution, as it's the currently known way of skipping more than half of the game. I hope this clears it a bit, but if you still have doubts, feel free to point them out.
But the thing about it is, this is just not true! The old TAS, without stale reference manipulation, absolutely beat the game with VERY little of the game beaten. It used an extremely major skip to warp directly from the end of the first level to the final boss, and was labelled as such! It just was also left branchless, whereas this is branched!
ThunderAxe31 wrote:
Instead, we leave the label blank in order to denote that that movie beats the game without showcasing any glitch in particular, and/or follows a restriction that makes it closer to the most common way of playing the game.
Again, this isn't how you're implementing it! The other one is branchless just because of historical reasons and I don't think it should be. If you want to let people know what the movie is about, I think it should be branched as "defeat Ganon", to clarify that this is what people are signing up for. There's 4 ways a TAS can beat the game quickly: 1) use ACE to warp to the credits 2) use ACE to warp to the final boss 3) use non-ACE methods to warp to the credits 4) use non-ACE methods to warp to the final boss Which one(s) would you consider branchless? EDIT: In case it wasn't clear, my point was that I don't think OoT can have a branchless category anymore. "Defeat Ganon" seems like the best way to solve this imo
Over a decade on this site, holy shit
Editor, Reviewer, Skilled player (1361)
Joined: 9/12/2016
Posts: 1646
Location: Italy
evilas wrote:
ThunderAxe31 wrote:
For the case of this game, it's very simple: just beat the game without using arbitrary code execution, as it's the currently known way of skipping more than half of the game. I hope this clears it a bit, but if you still have doubts, feel free to point them out.
But the thing about it is, this is just not true! The old TAS, without stale reference manipulation, absolutely beat the game with VERY little of the game beaten. It used an extremely major skip to warp directly from the end of the first level to the final boss, and was labelled as such! It just was also left branchless, whereas this is branched!
Sorry, I completely forgot that the labelless movie also performs major skips. Indeed, in this case we can distinguish the two run goals only by looking at which one skips right to the credits via a glitch.
evilas wrote:
ThunderAxe31 wrote:
Instead, we leave the label blank in order to denote that that movie beats the game without showcasing any glitch in particular, and/or follows a restriction that makes it closer to the most common way of playing the game.
Again, this isn't how you're implementing it! The other one is branchless just because of historical reasons and I don't think it should be. If you want to let people know what the movie is about, I think it should be branched as "defeat Ganon", to clarify that this is what people are signing up for.
Sorry again, I was just explaining what are the policies in general. I'm not following the OoT scene closely, so I wasn't implying that the labelless movie is the most common way to play the game. If you think that it isn't the case here, then we can discuss for adding a proper label to that movie.
evilas wrote:
There's 4 ways a TAS that doesn't ban stale reference manipulation can beat the game quickly: 1) use ACE to warp to the credits 2) use ACE to warp to the final boss 3) use non-ACE methods to warp to the credits 4) use non-ACE methods to warp to the final boss Which one(s) would you consider branchless?
Mind that obsoletion management and movie labelling are two separate issues. The judges define the requirements for obsoleting a movie, while the publishers define the label that explains the movie contents. To answer you question more extensively, see from the Publisher Guidelines:
There are cases where some branch is unique in not setting any unique conditions. There is nothing special to put in its label, since it explicitly avoids external goals, and the game doesn't have any internal conditions. We refer to such runs as the trunk and leave their labels blank. Remember that this is not related to "any%" or "default goal", because these things are complicated, relative, and not always clear. Also note how "trunk" and "branches" are metaphors for a concept in the real world: they describe a tree. We try to structure runs of the same game in a similar manner.
my personal page - my YouTube channel - my GitHub - my Discord: thunderaxe31 <Masterjun> if you look at the "NES" in a weird angle, it actually clearly says "GBA"
evilas
They/Them
Joined: 7/31/2009
Posts: 68
ThunderAxe31 wrote:
Sorry, I completely forgot that the labelless movie also performs major skips. Indeed, in this case we can distinguish the two run goals only by looking at which one skips right to the credits via a glitch.
Ok, thank you, that's along the lines of what I was asking.
I'm not following the OoT scene closely, so I wasn't implying that the labelless movie is the most common way to play the game. If you think that it isn't the case here, then we can discuss for adding a proper label to that movie.
Yeah, I think leaving the old TAS label-less creates confusion. When it was created, it may have had the sole goal of "complete the game as fast as possible", but if you look at how OoT has changed in the past year or so, that's no longer the case. I think the best label you could find for it is "Defeat Ganon", or some other "defeat the final boss" style text. I say "Defeat Ganon" because that's what the RTA category is called.
Mind that obsoletion management and movie labelling are two separate issues. The judges define the requirements for obsoleting a movie, while the publishers define the label that explains the movie contents.
This is interesting, so basically if I'm understanding it right, the 4 ways to complete the game I mentioned could in theory be considered 4 different branches? I can see how that could be the case, with publication or lack thereof being dependent on how distinct the runs are from each other. In that case yes, I would suggest, at least for now, the "Defeat Ganon" label for the old publication.
Over a decade on this site, holy shit
Editor, Reviewer, Skilled player (1361)
Joined: 9/12/2016
Posts: 1646
Location: Italy
evilas wrote:
This is interesting, so basically if I'm understanding it right, the 4 ways to complete the game I mentioned could in theory be considered 4 different branches? I can see how that could be the case, with publication or lack thereof being dependent on how distinct the runs are from each other.
Well, technically yes, we consider them as different goals, but we can allow only one of them for publication, as we try to avoid redundant movie contents as much as possible, so only the fastest of those 4 would be acceptable. See from the Judge Guidelines:
Sum-up
  • Quantity is not quality.
    • Keep the number of different branches per game minimal. A run for a proposed new branch for a game should offer compelling differences relative to previously published runs of that game.
    • Avoid making decisions that undermine this guideline (or other guidelines) now or in the future. For example, don't publish an arbitrarily rule-restricted movie just because there are too few movies for that game; doing so may lead to impossible-to-solve "why A but not B" debates later.
  • Hard work should have a reasonable chance of being published. More on this below.
  • Satisfy the audience's expectations.
evilas wrote:
In that case yes, I would suggest, at least for now, the "Defeat Ganon" label for the old publication.
But a glitchless movie would also be (potentially) acceptable, and that would also defeat Ganon. How would do you distinguish between all the three branches? An hypothetical glitchless movie could be labelled as just "glitchless". Like I wrote before, we usually don't use that kind of labels, but sometimes it's the best option available. We also have a few published movies that have it: [3636] DS Pokémon: Diamond Version "glitchless" by Fortranm & mkdasher in 3:09:07.20 [3964] PSX Tomb Raider II: Starring Lara Croft "glitchless" by Troye in 1:26:53.12
my personal page - my YouTube channel - my GitHub - my Discord: thunderaxe31 <Masterjun> if you look at the "NES" in a weird angle, it actually clearly says "GBA"
evilas
They/Them
Joined: 7/31/2009
Posts: 68
ThunderAxe31 wrote:
But a glitchless movie would also be (potentially) acceptable, and that would also defeat Ganon. How would do you distinguish between all the three branches? An hypothetical glitchless movie could be labelled as just "glitchless". Like I wrote before, we usually don't use that kind of labels, but sometimes it's the best option available. We also have a few published movies that have it: [3636] DS Pokémon: Diamond Version "glitchless" by Fortranm & mkdasher in 3:09:07.20 [3964] PSX Tomb Raider II: Starring Lara Croft "glitchless" by Troye in 1:26:53.12
If there were a TAS that specifically did a glitchless movie, that would be something that would stand out about it, in its own right, because the default expectation for Ocarina of Time is that there will be major skips and heavy glitch abuse. I'm thinking of something like Mario 64, where the expectation of major glitches being used is so prevalent that not using them is in and of itself a noteworthy thing, and as a result all of the movies have some sort of branch: [2062] N64 Super Mario 64 "70 stars, no Backwards Long Jump" by Jesus, Kaylee, MICKEY_Vis11189, MoltovM, Nahoc, snark, sonicpacker, ToT, CeeSammerZ, coin2884, Eru, Goronem, Mokkori, Nekuran, Nothing693 & pasta in 42:58.52 [2208] N64 Super Mario 64 "all 120 stars" by mkdasher, Nahoc, sonicpacker, Jesus, Kaylee, MoltovM, SilentSlayers, snark, ToT, Bauru, Eru, Goronem, Mokkori, Nothing693 & pasta in 1:20:41.52 [3264] N64 Super Mario 64 "1 key" by Tyler Kehne, mkdasher, sonicpacker, snark, SilentSlayers, ToT, Plush, Gaehne D, Eru & sm64expert in 04:21.30 what's notable about the 70 stars one is the fact that it specifies the lack of a glitch. Hmm, how about "Warp to Ganon"? It describes what the old run is doing differently from a glitchless playthrough, or a playthrough that would reach Ganon "normally" (however you define that term I guess).
Over a decade on this site, holy shit
Emulator Coder, Judge, Experienced player (732)
Joined: 2/26/2020
Posts: 791
Location: California
"Warp to Ganon" could just be simplified to "warp glitch" really
evilas
They/Them
Joined: 7/31/2009
Posts: 68
CasualPokePlayer wrote:
"Warp to Ganon" could just be simplified to "warp glitch" really
Wouldn't a credits warp be just a different kind of warp glitch, tho? "warp glitch" is far too generic
Over a decade on this site, holy shit
Emulator Coder, Judge, Experienced player (732)
Joined: 2/26/2020
Posts: 791
Location: California
evilas wrote:
CasualPokePlayer wrote:
"Warp to Ganon" could just be simplified to "warp glitch" really
Wouldn't a credits warp be just a different kind of warp glitch, tho? "warp glitch" is far too generic
At that point it would be game end glitch, which oh this movie is that.
evilas
They/Them
Joined: 7/31/2009
Posts: 68
CasualPokePlayer wrote:
evilas wrote:
CasualPokePlayer wrote:
"Warp to Ganon" could just be simplified to "warp glitch" really
Wouldn't a credits warp be just a different kind of warp glitch, tho? "warp glitch" is far too generic
At that point it would be game end glitch, which oh this movie is that.
if "defeat Ganon" is too generic because a glitchless run would also defeat Ganon, then "warp glitch" is also similarly generic bc this run also uses a warp glitch. Game end glitches are achieved through warp glitches in this game, so if your goal is specificity, then you need to specify "warp to Ganon"
Over a decade on this site, holy shit
Reviewer, Active player (288)
Joined: 12/14/2006
Posts: 717
"warp to Ganon" doesn't work because other categories, such as [3537] N64 The Legend of Zelda: Ocarina of Time "No Doors, All Dungeons" by NEVERDOORS in 2:24:37.03 can also warp to Ganon. There is no label you can give it that doesn't include other categories unless you want to have an extremely complicated label that general audiences wouldn't understand, hence the lack of label.