Table of Contents
Table of contents
- Table of Contents
- General Emulator Information
- Citra Accuracy and Movie Creation Discussion
- Movie Execution Description
- Run Creation and Special Thanks
- Suggested Screenshots
General Emulator Information
- Emulator: Citra
- Version Used for Movie Creation: Custom Fork Built Off of Canary 2007
- Version Used for Dump: Nightly 1747 (01/19/2022)
- Required Emulator Settings:
- System -> Language -> English
- System -> CPU Clock Speed: 100%
- Audio -> Emulation -> HLE (fast)
- Recommended Emulator Settings
- Graphics -> Advanced -> Enable Hardware Renderer
- Graphics -> Advanced -> Enable Hardware Shader
- Graphics -> Advanced -> Accurate Multiplication
- Full List of My Settings
Citra Accuracy and Movie Creation Discussion
This TAS is notable due to the fact that it is, at least to the best of my knowledge, the first completed full-game 3DS TAS. With this in mind, I feel that it is necessary to dedicate a not insignificant portion of this description discussing the challenges of creating a competent TAS using Citra emulator, but also making a case as to why my TAS should be considered for publication by the TASVideos judges despite Citra being a mostly unproven emulator when it comes to its TAS prowess. I apologize for how wordy this section is. However, I found it essential that I provided substantial evidence and explanation as to why my submission ought to be seriously considered for publication on TASVideos as I anticipate this submission could potentially create some amount of controversy amongst site users and judges as it is the first of its kind. Therefore, if you are not interested at all in the technical aspects that went into creating this movie and simply want a description of what happens in the movie, see the "Movie Execution Description" section below or use the table of contents above to be directed to it. This section will outline the variety of testing I have conducted during the process of creating this movie, my findings based on observations during my testing, and the conclusion that I have come to about the stability and legitimacy of my movie established by my findings. Let's dive in.
Citra is to my knowledge the only functioning Nintendo 3DS emulator that is actively being developed. The emulator project has received consistent support since the dev team was founded in April of 2014, as can be seen on the official Citra website. In December of that year, the first game was successfully booted, which just so happened to be The Legend of Zelda: Ocarina of Time 3D. In a matter of a few months, Ocarina of Time 3D could be seen running at nearly full speed. This is likely do in part to the fact that Ocarina of Time 3D was released fairly close to the launch of the 3DS and therefore does not push the system to its limits. Nonetheless, this evidence suggests that Ocarina of Time 3D has been one of the most stable 3DS games on Citra since its release, and its stability was clearly an early priority to the dev team early on. This trend of stability continues to this day. The game's listing in the Citra game compatibility list states: "The Legend of Zelda: Ocarina of Time works flawlessly in Citra. The graphics and audio are considered perfect, and the game performs well even on lower-end hardware. This game requires ‘Accurate Multiplication’ to be enabled on graphical options to function correctly." (More on the last bit later.)
However, the stability and consistency of the game in and of itself means nothing when discussing the creation of a TAS movie if the movie creation tools supported by the emulator used lack equal amounts of stability and consistency. During the creation of this movie, I used a custom fork of Citra Canary 2007 which incorporates all currently developed TAS tools and features, many of which were created by TASVideos member zhupengfei as well as a few additions that I have personally made. As stated by zhupengfei in a post of theirs on the TASVideos forums, "Citra should roughly follow the Laws of TAS on savestates." which to my knowledge was the last barrier crossed in order to make a TASVideos compliant movie possible with Citra. I have reviewed the previously mentioned Laws of TAS as well as the criteria required for emulator approval as defined by TASVideos, and below I will outline why I believe Citra meets these requirements and guidelines. I will also be discussing any grey areas or discrepancies that may initially seem to be of concern as well as explain why they do not affect the possibility of competent movie creation using Citra in general and/or how they did not affect the creation or competence of this particular movie.
Citra can record movie files and does support movie playback. There is also read only functionality that can be toggled.
Citra does support savestates, and movie files do not desync while using savestates. Changes in emulation speed and loading/writing savestates are not written into the movie. When a savestate is loaded, the movie automatically rewinds to the time of the state being loaded. I did not experience a single desync while recording, loading savestates, etc., nor did I experience a desync during movie playback on any machine or any operating system I played it on.
The Citra dev team has always made it a priority to make the emulation accurate. This requirement is somewhat subjective, but I personally have found Citra to be very accurate during my time creating this movie.
- Although I cannot guarantee that this movie will sync on future version of Citra, I am certain that it will sync with a every version of Citra since Nightly 1652 which was released on December 5, 2020 based on my testing. Hopefully this will continue as the emulator continues to be updated.
- System hardware, operating system, and other environmental changes do not seem to affect emulation stability, accuracy, or the ability to sync this movie based on my testing.
- Due to Citra being open source and the code being publicly available, I would imagine that the emulator will still be around indefinitely.
- Movie files on Citra can currently only be played from power-on. This makes tampering with when movies begin impossible currently.
- Citra movie files store the player's input, not the emulation results. Because of this, only the input and the game are required to reproduce the playing session.
- The movie file will display the time of the full movie in seconds as well as the author and re-record count prior to playing the movie.
- The movie file indicates the length of the movie by storing the number of times the emulator polls for control stick inputs throughout the movie in the movie metadata. This number can then be converted into seconds by dividing it by 234. This number is derived using the base clock speed of the arm processor that the 3DS is based on. This input count value can be found by opening the movie file in a hex editor and locating the 4 bytes starting at 0x54, meaning that access to Citra or a game file are not necessary to verify the length of movies. This value is store in little endian, so you need to read the last byte starting at 0x57 first. If this value is edited so that it no longer matches the actual number of input polls recorded, Citra will give an error upon attempting to play the movie, as the length indicated in the metadata does not does not match the actual length of the movie.
Other Movie Information
- The number of rerecords and the author are stored as metadata in the movie file and are displayed prior to playing the movie.
- All information contained within the movie file are parseable and can technically be interpreted without access to the game or the emulator. In order prevent dominating this description with documenting the movie file format, I am linking a separate pastebin that goes into thorough detail on the file format. Suffice to say, the file format is documented and understood.
- Citra is available for Windows, Linux, and MacOS. Specifically, this movie has been tested on each of these operating systems and is confirmed to sync based on my testing.
- The source code for Citra is readily available and can be customized for by anyone with the skills to do so.
Possible to Make AVI
- It is possible to dump movie files as an AVI on Citra. Likewise, lossless video codecs are natively available for dumping on all operating systems.
- Citra has proper audio/video sync. If the host computer is not fast enough to render at 100% speed, it is still possible to force the emulator to render all frames without skipping or duplicating frames.
- The amount of audio stream generated per each video frame is consistent regardless of system load.
Frame Count Display
Citra does not display frame count during movie recording or playback, but instead displays the input count, which is the value Citra movie files uses to calculate the final time, but is not nearly as useful as a frame count. I created a fork of Citra where I fixed this issue and hope to merge it into the master branch eventually, but for the time being this is less accessible than it could be. My Citra fork can be found here. I can provide a build of this fork to anyone who doesn't feel like building it themselves.
Edit: A proper frame counter has been merged into Citra Nightly releases as of 3/5/2022.
Savestates as they are currently implemented are stable and consistent. I have never once had a savestate corrupt, fail to load, show any signs of discontinuity, or desync this TAS. There is however one notable annoyance when it comes to savestates as they are currently implemented in Citra in relation to rerecording. In the build of Citra I used, loading a savestate prevents any input from being registered on the frame after the savestate was created on. However, I discovered very late into the creation of this movie that this actually only occurs when using an XInput controller as I was. Gamecube Controllers with an official Nintendo adapter and keyboard inputs usually do not have this problem. I assume this has something to do with how SDL is implemented, but I have not figured out how to fix it yet. Although annoying, this does not technically limit what someone with patience can produce using Citra movie recording and rerecording tools when working with a game that runs at 30 frames per seconds. This unfortunately would make creating an optimal TAS of a game running at 60 FPS a lot more difficult. For the sake of this movie, using careful planning, I feel strongly that this never limited the level optimization that I was able to achieve. On several occasions, this issue caused me to have to redo very small sets of inputs, but again, using careful planning, I rarely had to redo work because of this. Later in production of this movie, I used Joy2Key to basically eliminate this issue for any input that wasn't an analog circle pad input.
One feature that is currently lacking that also involves savestates is the ability to bind saving and loading specific savestate slots to different hotkey. Citra currently has 10 savestate slots that can be utilized, but there are only hotkeys assigned to saving to the oldest slot and loading to the newest slot. This means that users have to perform menuing every time they want to save or load a savestate that is not either the oldest or newest. I am not particularly code savvy, but I imagine that this could be implement fairly easily in the future. For the time being, I have written an AutoHotkey script which performs the menuing for loading and saving to different slots. Obviously, natively implemented hotkeys would be ideal, but my solution isn't really any difference in practice, so this was not an issue at all for me, personally. I will provide the script used for this if requested.
Lack of Input Plugin
Perhaps the biggest technical hurdle that I encountered during the creation of this movie was the lack of any TAS input plugin that I could utilize. As annoying as this is, it basically only ever affected me when needing to record analog stick inputs with precise angles. This would also likely make gyroscope and accelerometer inputs difficult to TAS, although not impossible. For the purpose of this TAS I utilized the Ryochan7 branch of DS4Windows with a DualSense 5 controller which allowed me to view real-time controller readings for all analog inputs (see below). Because of this, when it came to precise control stick inputs, I could manually perform inputs on my controller, check DS4Windows to ensure I had the exact angle I wanted, and begin advancing frames, making sure that I did not lose the angle I was holding. I was also able to change control stick dead zones, max output, and sensitivity on the fly using the axis config menus in DS4Windows when needing to achieve control stick positions that required the analog stick at partial ranges as opposed to the effect you would get when holding the analog stick at the edge of its range, touching its outer boundary. It is an understatement that the lack of a TAS input plugin in Citra is currently a huge turnoff for potential TASers. However, I am confident that even without said plugin available, I was still able to match the level of optimization I would have been able to accomplish with said plugin available.
Citra TAS tools are still a work in progress, but to quote the TASVideos Laws of TAS directly, "Do you have to follow all laws? No. Are all laws equally vital and important? No. However, the more successful emulators follow these laws and the less successful ones don't." I feel confident that these issues with Citra movie creation will be fixed eventually and the emulator will be more user friendly for TAS creation. However, for the sake of this movie, I felt that I had all of the tools reasonably necessary in order to not compromise on optimization at any point.
It should be noted that there are no official numbered releases of Citra. Instead, the nightly builds that are pushed relatively frequently are the main Citra releases. As stated by the Citra website on the manual download page, "The nightly build of Citra contains already reviewed and tested features." I used a custom build of Citra based on Canary 2007 for the creation of this movie due to the fact that rerecording with savestates and separate read/write modes had not yet been merged to the nightly releases prior the creation of this movie. As of February 18, 2022, these features have been merged to the Nightly releases, so all Citra builds are up to date on current TAS tools. I have confirmed that this movie will sync with every nightly release since Citra Nightly 1652 which was released on December 5, 2020 including the most recent preview release, Citra Nightly 1737 released on December 12, 2021. On top of this, I specifically went out of my way to try and make this movie desync. Based on my testing, the settings listed under "Required Emulator Settings" at the top of my submission description should be the only settings that affect this movie's ability to sync. Moreover, all of those settings listed should already be set as such by default on Citra. Note that this testing was done across multiple Nightly releases of Citra from release 1652 to the current release on 3 different computers running Windows 10. I also tested to make sure this movie would sync on recent Citra releases on both MacOS and Linux. A complete set of screenshots containing all of my relevant configuration settings can be found here in case there are any issues syncing despite my testing.
In order to get this movie to sync, you must clear all save data prior to playing the .ctm file. This must be done every time you are trying to play this movie after having opened the game at least once. This can be done by right clicking the Ocarina of Time 3D .cia or .3dsx in the Citra main menu and selecting "Open Save Data Location." From here, you need to navigate back one folder to the Title ID folder which should be named 00033500 and remove the "data" folder. This can be done either by deleting it or by moving it elsewhere if you would like to backup save data. You should not remove the metadata file located at this directory, however.
Once the movie has reached the final input and enters "Movie Finished Mode," a dialog box will appear saying that the movie has completed playing, and the emulation will pause. In order to unpause the movie to allow the credits to play, you have to opt to continue emulation by selecting Emulation -> Continue. This confused me at first because I was trying to use Tools -> Frame Advance -> Enable Frame Advance to unpause, but this will not unpause the movie file.
Finally, I would like to go over some notes on my dump of the video. Specifically, for the video included in this submission I have encoded the video at 9x native resolution (3600x2160) with a few custom textures. Right off the bat, I can say that based on my testing, none of these settings/changes affect this movie's ability to sync. So why the changes?
- The resolution change is simple. This game looks way better with an upscaled resolution. In fact, I'd say it actually looks quite gorgeous. For me, personally, this enhanced the entertainment and quality of the final dump.
- Next, the custom textures. One of the downsides of using higher internal resolutions in Citra is that a few UI textures in this game start to develop some ugly lines around them. The worst offenders are UI textures that are symmetrical and are therefore implemented by mirroring half of the texture for each side. These types of textures, as shown in the images below, develop very noticeable lines down the middle of them where the two mirrored symmetrical halves meet. To solve this visual issue, I dumped the game textures and located all of the textures related to the UI that would appear in this movie. I then took these textures and upscaled them by 8x with no filtering. That means that these textures should have basically no visual differences from their originals, they're just bigger with a higher internal resolution. I must reiterate to make sure I am understood, though; these upscaled textures have absolutely no filtering or interpolation. When compared side by side to the original textures used by the game at scale, it should be very difficult to tell them apart. Moreover, as stated before, these custom textures do not cause syncing issues and solve what I find to be a very distracting visual issue. It should also be noted that the addition of these custom textures prevents a known issue where UI elements are not visible, specifically items and inventory within the pause menus. Normally, this can be resolved by enabling Accurate Multiplication in the Advanced tab of Citra's graphics configuration, but this does the job just as well. This is why I have made this change despite the TASVideos [MovieRules#:~:text=Cosmetic%20hacks%20are%20not%20allowed%20by%20themselves.|Movie Rules] stating, "Cosmetic hacks are not allowed by themselves." The custom textures used may be provided upon request.
Menus prior to texture replacement
Menus after texture replacement
I dumped this video using (Nightly 1747, as dumping with the latest Canary builds will pause the emulation once the movie is completed, and I have not found a way to unpause the emulation after this happens to allow the credits to play. Video dumping options between the latest Nightly and Canary builds are identical as far as I am aware. Pretty much any Citra version released after December 5, 2020 should sync. I recommend setting ffv1 as the encoder. It is probably overkill, but I personally used a video bitrate of 1,000,000 bps and an audio bitrate of 500,000 bps. I also used a custom screen layout as none of the default layouts appealed to me. In order to apply this custom layout, this information must replace the relevant fields in the file titled "qt-config.ini" located by default in Users\*user*\AppData\Roaming\Citra\config. This layout will force a resolution of 3840x1968, however, and all number values need to be increased or decreased depending on the desired resolution. I can create more layouts for other resolutions if need be.
Emulation Viability Conclusion
With everything outlined above, I feel very confident that for the application of my movie and this submission that Citra emulator provides adequate tools to create a competent and optimized TAS movie and adheres closely enough to the TASVideos Laws of TAS and to the Emulator Guidelines to be considered for publication from a technical standpoint. If this movie is to be considered for publication, I feel fairly certain that the TASVideos judges and staff will likely have an easier time with this publication process than some of the other Zelda TAS's of the past (not a high bar to clear considering how these ones went (1) (2). Of course, the movie still needs to adhere to the Movie Guidelines and Movie Rules which I hope will be demonstrated by watching my movie and reviewing the remaining portion of this description.
Movie Execution Description
General Movie Information
- TAS Timing = 23:31.286
- RTA Timing = 23:19.055
- Frame Count = 84439
- Rerecord Count = 18959
- Frame Rate = 59.83122493939037 frames per second
- Input Poll Count (used to find TAS Time) = 330241
The goal of this movie is to complete the Legend of Zelda: Ocarina of Time 3D as fast as possible with no other restrictions. This speedrun category is commonly known as Any% because there is no required completion percentage in the category rules. As there are no restriction, this movie will heavily rely on glitches and sequences breaking to skip significant portions of the intended game route. Throughout this description of this movie, I will be using a lot of technical language to describe glitches and techniques used. Detailed explanations of many of this language is documented on ZSR for those who want to learn or better understand what is occurring throughout this movie.
Before any movement begins, the first bit of tech already becomes relevant. You should notice that the text speed is fast. Like really fast. This is known as "quick text" and it's not as simple as it looks. Advancing text in Ocarina of Time 3D is unlike any other 3D Zelda. Normally text in this game will not advance nearly this quickly and will take the time to reveal several characters every few frames until all of the text that will be displayed in that box is visible. Once all of the text is visible, the textbox can be advanced so that the next one can begin. However, there is one frame before any of the text is visible where the player can input a B button press that will cause all of the text to be displayed immediately. This allows the textbox to be advanced instantly so that the next textbox can play. Due to the fact that each instance of quick text is frame perfect, it can be assumed that a player will not be able to successfully achieve quick text on every textbox throughout the run when playing in real time. This means that this TAS movie will already be able to save a substantial amount of time over a real-time speedrun before movement even begins. This will also apply throughout the rest of the movie. An oddity with this is that quick text is impossible for any text that occurs within a shop or when the text is displayed on a solid white background as can be seen with the very first textbox of this movie. As this movie does not enter any shops, this oddity does not occur very much in this submission. Because of quick text, language, and therefore version, choice is largely unimportant. I chose the USA version of the game in English because it's the language I speak and it made my preferred filename slightly faster to input.
The only thing we need to accomplish in Kokiri Forest before leaving is picking up the Kokiri Sword. It should be fairly obvious that sidehopping is generally a pretty fast way to get around in this game. I also utilize a few twisted backflips in this section. These are done by holding a direction just outside the dead zone on the control stick, generally known as ESS position, and then hold a different direction using the full range of the control stick one frame later and performing a backflip. Using these allows you to skip a few angle changes. Obviously while sidehopping, it is important to try to get the best line around corners as possible. Because changing angles during a sidehop change takes a few frames, movement prioritizes cutting corners as close as possible and avoiding angle changes as much as possible. A great example of this can be seen in the boulder "maze" just before collecting the Kokiri Sword.
As pictured above, typical RTA movement would turn two extra times in this area as depicted by the blue arrows. The blue path would also be used if the run needed to collect some rupees as there are 7 on this path. The path in red is utilized by this movie for two reasons. The first is that it cuts down on two angle changes which saves a few frames on its own. I'm using this example to visualize optimal sidehop movement, however, the main reason this particular path is used, is that TAS sidehopping movement is so fast that you can actually catch up to the boulder almost immediately. The yellow X indicates where Link will collide with the boulder if using optimal movement. There is no space next to the boulder to get around it, so the best option is just to go the other way, which would be faster anyways so it all works out very nicely. There are only a few frames of leeway to make it to the intersection before the sword chest before the boulder blocks the path so this movement is close to not being possible. It should be noted that an additional angle change is required just before reaching the sword chest because if you cut a more direct line to the chest, Link would end up reading the sign. Based on my timing, it is still faster to do this angle change than it would be to finish the movement with a roll or substitute some sidehops with some backwalking.
After leaving the crawlspace from the sword maze, I make use of what is known as a twisted backflip to get on top of the fence. This technique has already been used once before in this movie before this point to get on top of the slope leading to the sword maze. This technique can be used to backflip or sidehop in a certain direction, but maintain an angle facing a different direction. This cuts down on more angle changing and can be used to direct your momentum in ways not normally possible. In this case, it is used simply to cut out some extra angle changing.
Escaping the forest requires the use of a technique known as a triple slash clip (TSC). If Link swings his sword 3 times in quick succession and then immediately sheaths it, he will take a big step backwards almost instantly. This can be used to clip through many acute angles. In this case it is used to clip behind the Kokiri guard. However, this particular TSC is tricky due to the fact that putting away the sword with the A button will usually result in talking to the guard which will cause Link not to clip. To get around this, I perform a trick known as inverted camera to keep my camera facing away from the guard, but still have Link facing the correct angle in order to perform the clip. If the guard in not within the camera's view, Link will not talk to the guard, making this possible.
Path to Zelda
Once in Hyrule Field, the long-term routing of this movie starts to be become very important. Once Link is able to move, the in-game time begins to progress as it day slowly starts to turn to night. There are two necessary cutoffs that need to be made in relation to time of day. 1.) Link must make it into the Hyrule Market before the drawbridge blocks access at nighttime and 2.) Link has to make it to Talon at Hyrule Castle with the Pocket Egg so that he can immediately wake him as soon as the egg hatches at the break of dawn. Everything in-between these points prioritize minimizing the amount of time that the in game time of day is not ticking. This means that I have avoided the amount of time spent reading text boxes, waiting for loading zone times, watching cutscenes, etc. as all of these things halt the passage of in game time of day. The items below will go over the reasoning behind many of the choices I made during this portion of the movie.
- Because Link only needs to make it to the Hyrule Market before night, there is potentially time to kill in Hyrule Field. It is actually possible to grab a Deku Nut drop by rolling into a tree in the southern forest in Hyrule Field. because the movement time needed to collect the Deku Nuts would already be spent waiting for the Pocket Egg to hatch later, this would be the best time to collect Deku Nuts. However, I ended up finding that it was faster to skip Deku Nuts altogether as they would only be useful in one instance later on.
- Movement through Hyrule Market is a few frames faster at night due to less NPCs obstructing Link's path. This can be visualized in the comparison images below. During the day, Link needs to keep some distance from these NCPs to avoid speaking to them. I could have waited outside Hyrule Market for it to turn night to take advantage of this small time saver. However, this would have required me to wait approximately 24 additional seconds in Hyrule Field. Moving to Talon perfectly without waiting will get Link there approximately 20 seconds early. Because of this, there is not enough time to wait for night to enter the market and still make it to Talon on time. In order to make this potential timesave possible, I would have to find a way to save roughly 4 seconds during all of my movement used throughout the Hyrule Castle grounds. Try as I might, I was not able to accomplish this.
- In order to make Malon appear in the Hyrule Castle grounds, the player has to reload the area once. The two easiest ways to do this are to simply leave and reenter the area using the Hyrule Market loading zone or to get caught by one of the castle guards. Getting caught by the guard ends up being a little faster over leaving and reentering due to less loading occurring. Remember, I am trying to reduce the amount of time that in game time of day is not passing so even though it takes longer to walk to the nearest guard, get caught, then run toward Malon than it does to quickly leave and reenter the area, as long as I can make it to Talon before day all that matters is time of day. There is, however, a method to reload the area that is faster than either of these, specifically around 2 seconds faster than getting caught. This is by reloading the area by triggering a void out. This method will skip the textbox you have to clear from getting caught and the extra loading zone needed to leave and reenter. This method requires getting out of bounds to fall off the map and is far more difficult than the other two routes. In order to get out of bounds, I have to utilize a collision oddity that can be found in several places throughout this game known as an invisible seam. An invisible seam is created when there is a vertical wall located somewhere below Link. Usually these occur in places where two planes meet on the ground Link is standing on but this is not always necessary. That being said, this technique is very situational. You will see these utilized several times throughout this movie, but that does not mean this can be done anywhere. Invisible seams only exist at very specific locations and are often very hard to find/discover. These invisible seams are incredibly small and incredibly steep. Think of it as if Link is walking perpendicularly on top of a razor thin wall. A tightrope of sorts, but also an invisible tightrope. It is possible to get on top of one of these seams by walking very slowly above the position where it is located, usually in a very specific direction, or sometimes by performing a spin attack in a specific position. The invisible seam here is very difficult to locate without the use of a spin attack, and even though a spin attack is slower by a few frames, I will need to wait for morning later anyways. Once I get on the seam, I need to strafe to the side at a very specific angle at basically the slowest speed possible in order to "climb" this seam. Minor changes in angle or moving too fast will cause Link to abruptly fall. All invisible seams have a limit to how high up they go, so they cannot be used to gain infinite height based on the community's current understanding. However, in this particular location, it does give Link enough height in order to sidehop on top of the out of bounds wall. From here it is possible to walk to the edge of the map, fall, and void out, reloading the area.
Anything else done in this section including the Forward Extended Super Slide (FESS) through Hyrule Field and the second invisible seam walk to get out of bounds in the Hyrule Castle grounds are simply for show and don't actually save time as I need to wait for the Pocket Egg to hatch anyways. I also grab a heart drop from a nearby bush while waiting. While making this movie, I was not sure if it would be useful to have extra health later on and figured it would be good to have just in case.
After waking Talon, I continue to push the box to enter the Castle Courtyard. You can skip pushing both boxes with a good jump and a well-timed jumpslash. The guards in the Castle Courtyard cannot catch Link unless he is on the ground for more than one frame. By sidehopping frame-perfectly, I can prevent the guards from ever being able to trigger the "detected" state. The next cutscene with Zelda really shows off just how fast text can be in a TAS setting.
Path to Magic
The next major item I made my way towards is acquiring the magic meter. Normally getting magic requires going to Lost Woods to get Saria's Song, getting the Goron Bracelet from Goron City, picking up the Bomb Bag from Dodongo's Cavern, and finally climbing Death Mountain Trail to get to the Magic Fairy Fountain. This movie will make use of several glitches in order to circumvent all of these steps. This route makes its way to Goron City through Kakariko Village and Death Mountain Trail. A FESS is once again used to move quickly up the trail into Goron City. Once in Goron City, the movie collects a Deku Stick from a pot and uses it to open the shortcut to Lost Woods using a glitch known as Quick Putaway (QPA). This shortcut will be used later in the route to save overworld movement, but it will not be utilized at this moment. The shortcut can be opened now without glitches by lighting a Deku Stick off of a torch inside of Darunia's throne room and using it to activate the bomb flowers in front of the shortcut entrance, but the method used here saves a lot of movement.
A glitch is then used to unload the collision for the statue blocking the entrance to Death Mountain Crater by loading and unloading the throne room in a very specific way. The hallway here has three distinct states or "zones" based on the loading plane that handles switching rooms between the main room and the throne room. Those three "zones consist of the space where only the main room is loaded, the space where both the main room and the throne room are loaded, and the space where only the throne room is loaded. The diagram below visualizes where these different "zones" are located and the path by which this movie navigates from one location to the next.
This allows this route to exit the crater at the top of Death Mountain Trail, skipping the boulders that block the path up Death Mountain Trail that normally must be destroyed with explosives. I also make sure to grab another stick before leaving the throne room as I will be needing at least one to save some time before I have another opportunity to pick up more.
The countdown on the heat death timer in Death Mountain Crater is determined by how much health Link has upon entering the area. Each quarter heart is equal to 2 seconds, or each heart is the equivalent of 8 seconds. This means that by entering the crater with 2 hearts gives me enough time to make it to the exit without dying. Once outside and at the top of Death Mountain Trail, the goal is to enter the fairy fountain. The weak wall in front of the entrance usually needs to be destroyed with a bomb or the hammer as adult, but because this movie collects neither of those items, I will instead be using another implementation of the TSC glitch to clip through the wall. Due to how shallow the corner being clipped into is, Link needs to swing his sword at a different angle for the first two slashes so that they connect with the wall and push Link back into the corner. Otherwise, slashing the sword will have Link take a few steps forward, and he will not clip due to being too far away from the corner upon putting away the sword. This means that Link needs to change angles for the final slash. This technique is known as Redirected TSC (RTSC).
Path to Farore's Wind
The only reason why this movie needs to collect magic is so that later it can collect and use Farore's Wind. Normally the usefulness Farore's Wind is limited and pretty much only for cutting down on backtracking. However, for the sake of this route, it is arguably the most important item. More on that later, first, the movie has to get to Farore's Wind. This route will get to the fairy fountain where this item is obtained by going from Zora's River to Zora's Domain to Zora's Fountain. The fastest way to begin this path is to utilize a savewarp to quickly return to Link's house in Kokiri Forest. Getting to upper Zora's River glitchlessly will require explosives to blow up the boulders at the bottom of the river, but this run will take the Lost Woods shortcut to skip the boulders using a technique known as a Navi dive. This technique involves Link falling off of a ledge while talking to Navi to unload the collision of water. In this case, it allows this route to reach the Zora's River shortcut without a diving upgrade. Because Link needs to talk to Navi, and Navi will not talk to Link until he has been in an area for 30 seconds, there is some downtime to set the trick up. These 30 seconds are not ticking down while navigating menus, text, cutscenes, etc. Because The owl Gaepora is now waiting in the Lost Woods now that Zelda's Lullaby is in Link's inventory, I want to skip these text boxes to have the Navi timer go uninterrupted. The trigger for talking to Gaepora cannot activate while Link is pulling out an item such as a stick or a sword. By alternating between stick and sword and not allowing a window for the trigger to activate, the owl text can be circumvented. The Navi dive is then achieved by talking to Navi while Link takes a step back after performing a jumpslash onto the stone monument above the shortcut.
Normally, it is required to give King Zora Ruto's Letter to access Zora's Fountain which in turn requires a dive upgrade i.e., the silver scale, but a TSC in one of the room's corners can skip this detour. This is also the easiest most traditional TSC used throughout this run, only requiring the correct initial angle to perform it as opposed to the one used to clip into the magic fairy fountain which required a precise angle change or the one used to escape Kokiri Forest which required a specific camera angle.
In Zora's Fountain, this route once again requires a way to get around the fact that Link has not obtained explosives. There is a very large invisible seam close to the entrance of this fairy fountain. With enough height on this seam, Link can perform a sidehop at a precise angle to clip through a corner above the fairy fountain entrance to enter the loading zone. This is also perhaps one of the better invisible seams to use to visualize how they are somehow created by or are related to walls that are beneath Link, as mentioned previously. The walls in the tunnel underneath the entrance to the fairy fountain create this particular seam. The image below shows what those walls would look like if they were extended upwards through the ground. The transparent red area that I have mapped out doesn't necessarily give an accurate depiction of how high this seam can go; it is simply meant to show the general areas along the ground where the seam could potentially be interacted with.
I also perform a type of movement here known as a Water Extended Superslide (WESS). This works the same as the previously mentioned FESS, except instead of using damage as the initial source of velocity, getting jumpslash recoil and falling into water is what provides the speed.
Setting a Farore's Wind Warp Point
A little more setup is required before this moving to the end of the game. Specifically, Link must cast Farore's Wind in Goron City after entering from Death Mountain Trail. After a savewarp, this movie makes its way through the lost woods to the Goron City shortcut opened previously, being sure not to activate the owl trigger still present in the Lost Woods. This movement is fairly basic, except for entering Death Mountain Trail with a jumpslash. This makes it so that Link is closer to the entrance to Goron City after spawning in Death Mountain Trail.
Farore's Wind normally cannot be used outside of a dungeon. The item will be "greyed out" on your equip buttons and will not doing anything if you try to use it while equipped. However, by replacing a useable item that isn't "greyed out" on one of your equip buttons (Zelda's Letter in this case) with an un-useable item (Farore's Wind), the un-usable item can be used for one frame upon exiting the item menu. This occurs because the "usability" of items equipped is not updated for one frame after existing the menu. This means that the opposite would also be true; switching an un-useable item with a useable item will cause the useable item to be un-useable for one frame after exiting the menu. This technique is known as Restricted Items (RI).
One more savewarp and everything has now been set up to beat the game. This route begins to make its way to the Deku Tree. Don't blink in this dungeon or you'll miss it. This movie immediately finds an invisible seam in the middle of the room and climbs it all the way to the top of the dungeon. The webs at the top mostly only have collision on one side, so it is possible to sidehop through them from the back. Up at the top, it is then possible to climb another invisible seam through the ceiling and out of bounds. A sidehop with a good angle sets Link up to go straight into the loading zone to the boss room. In Ocarina of Time 3D, every loading zone present on the current map are loaded at all times, so it is possible to interact with a loading zone even if the room leading to it is not loaded. This trick allows this run to skip getting the Deku Shield which saves collecting rupees (which wouldn't actually lose time) and going into the Kokiri Shop to pick one up. Below is a visualization of what the trajectory this movement looks like.
Gohma normally requires Deku Nuts, Fairy Slingshot, Fairy Bow, or the Hookshot to stun, and this movie has collected none of those items up to this point. However, by getting QPA by using Gohma as a damage source, it is possible to use the glitched damage of a Deku stick to act link slingshot damage and stun Gohma. By performing another Deku Stick jumpslash at a close range causes what is known as broken Deku Stick glitch where Link continues to hold a Deku Stick after it has already been broken. When this stick breaks, the amount of sticks displayed in the inventory will go down by one, but if that number is greater than 0, Link will be able to continuously swing and deal damage with that broken stick. This is why I collected two Deku Sticks on my way to the Deku Tree instead of just getting one. The reason why I would want to use a Deku Stick over using Kokiri Sword is that the Deku Sticks always deal 2 damage regardless of what type of attack being used. Kokiri Sword on the other hand will deal 1 damage for all attacks except for a jumpslash which deals 2 damage. In order to stun-lock Gohma into a one cycle fight, Link needs to be doing normal slashes, as jumpslashes are too slow. Because of this, Kokiri Sword would require twice as many attacks to damage Gohma as a Deku Stick does. However, I perform the final blow with a Kokiri Sword jumpslash. This is necessary because I need to remove the Deku Stick from Link's hand in order to perform the final glitch of the run. This also does not lose time over using a Deku Stick slash because jumpslashes are only slow if you need to wait for Link to stand back up after performing the attack. Because it is the final blow, the time it takes to stand back up is irrelevant.
The final glitch in this run is known as a Restricted Items Wrong Warp (RIWW). By using RI to pull up the Farore's Wind menu at same time that Link enters a blue warp, it is possible to return to the previously set Farore's Wind warp point as the blue warp takes Link out of the dungeon. Normally Farore's Wind cannot be used in boss rooms which is why RI is required. The way that the blue warps at the end of dungeons function in this game basically has two parts. The game first takes Link to a new area. In this case, the warp is supposed to take Link to the Kokiri Forest. The game then adds some value to that entrance that Link was warped to in order to get the scene setup for whatever cutscene is supposed to play upon loading into that area. For the Deku Tree blue warp, the game adds a value of 5 to the Kokiri Forest entrance it takes you to. However, by using Farore's Wind before the blue warp can take Link to Kokiri Forest, it is still possible to get the game to add 5 to the entrance Link is traveling to. In this case, the game tries to add a value of 5 to the entrance where Farore's Wind was previously set in Goron City, which prompts the game to play cutscene #1 for Goron City. The reason why the game adds 5 specifically when trying to play the cutscene #1 in any given area is because there are 4 states for each area by default. These are 0.) child day, 1.) child night, 2.) adult day, 3.) Adult night, and then the values for cutscenes come: 4.) cutscene #0, 5.) cutscene #1. So, if the game tries to add 5 to the Goron City entrance where Farore's Wind was previously set to play cutscene #1...
...It ends up playing the credits cutscene.
The image below shows that the value for the Goron City entrance from Death Mountain Trail is 014D. By Adding a value of 5 to this we get a value of 0152. If this added up to be 0153, then it would overflow to the next area and try to play the cutscene #1 associated with Zora's Domain because that is the next entry in the entrance table and it begins at 0153. There is no cutscene #1 in Zora's Domain, so this would crash the game. Luckily, this is not the case, and Link is effectively warped into the end credits cutscene. Part of the reason why this happens is because the end credits cutscene in this game is not one long cutscene but is actually comprised of many small scenes. Every time the cutscene moves to a new map, that is a different cutscene. Each of those individual scenes used for the credits are associated with whatever area they take place in. Therefore, because Goron City has a scene used in the end credits, it is possible to wrong warp straight into that particular scene using the warp point previously set. This obviously skips a substantial portion of the game as intended. There are no more inputs after the wrong warp required to reach the end of the credits. Therefore, timing ends on the input for returning to the warp point.
There has always been a bit of controversy surrounding credits warp in Ocarina of Time amongst viewers. Not a lot anymore, but it's there. Ocarina of Time 3D has some justification for why this is definitely considered beating the game, that being that credits warp unlocks Master Quest. Master Quest unlocks upon completing the normal quest and watching to the end of the credits. I decided not to include the "You unlocked Master Quest" message that appears in my upload of this movie because I feel the "The End" screen is a more fitting conclusion.
RTA Record Comparison
The current RTA record for this category is 27:50 by pal62 which makes my TAS approximately 4 minutes and 31 seconds faster. The RTA record in question is actually pretty optimized and has seen a fair amount of competition over the years. Obviously, it isn't exactly fair to compare an RTA run to a TAS. However, seeing as there is no previous TAS to compare against, I figured I would show here that I am saving time at very regular intervals to prove that this is in fact competent super-play. You can see the full breakdown below:
|Leave Link's House||2:37.050||2:43.900||-0:06.850|
|Enter Castle Courtyard||4:29.400||4:46.300||-0:16.900|
|Enter Death Mountain Trail||1:28.045||1:43.367||-0:15.322|
|Death Mountain Trail||0:34.450||0:49.300||-0:14.850|
|Fairy Fountain Savewarp||1:43.150||1:55.200||-0:12.050|
|Enter Zora's River||1:06.867||1:27.733||-0:20.866|
|Enter Zora's Fountain||1:02.950||1:20.433||-0:17.483|
|Fairy Fountain Savewarp 2||1:30.917||1:52.700||-0:21.783|
|Goron City Savewarp||1:22.000||1:42.200||-0:20.200|
|Enter Deku Tree||0:50.533||1:00.00||-0:09.470|
|Enter Deku Tree Boss||0:21.750||1:03.133||-0:41.383|
|Return Farore's Wind||0:49.667||0:59.250||-0:09.583|
Some notable timesaves are in Goron City and Deku Tree where I make use of alternate routes using techniques that would be very difficult/inconsistent in real time, those being the QPA to open the Goron City shortcut and the big invisible seam climb in the middle of Deku Tree. It should also be noted that I am also saving substantial amounts of time during segments that are comprised almost entirely of text such as the "Leave Link's House" and "Zelda's Courtyard" segments. This shows just how much time perfect textboxes can save over what can reasonably be expected from a human.
- The majority of improvements that could likely be made to this movie are probably simply due to coming up with more creative movement in several areas. I feel that I did a very good job exploring and timing many different options, but OoT and OoT3D are so complex by nature that there's always a feeling that there's a better way that you just haven't thought of yet. In the case of this movie, I feel this would be minimal, mostly because I feel very confident in my extensive knowledge of the possibilities this game presents.
- The biggest improvements that I feel could be made are on the 3 invisible seams that this route has to climb towards the end of the run (the first two in at Hyrule Castle do not waste time if they aren't optimal). I do not think I can realistically make any of these seam climbs faster without proper memory viewer functionality. I cannot overstate how precise and complicated these seams are to TAS. Not to mention, the understanding that the community has concerning these seams is still very much lacking. In particular, the video below is ridiculously precise to pull off. I spent about two weeks just attempting to quickly get onto that seam, and this is the best thing I could come up with. With a faster setup, this could save a few frames over talking to the Kakariko guard to open the gate.
- A few frames could probably be saved if Link had time to make it through the Hyrule Market at night time. This would require all of the Hyrule Field and Hyrule Castle movement to be done substantially faster though.
- On Death Mountain Trail, I believe that it would save time to FESS to the left of the rolling Goron before entering Goron City. I tried for a pretty long time to make this happen, but I'm just not sure it's possible. This would likely be a very small timesave if it saves time at all.
- This run also completes the game without opening any doors, as defined in this submission, which qualifies as Any% No Doors. Challenge runs which aim to complete different categories of Ocarina of Time 3D and its N64 counterpart without opening any doors have been being theorized, routed, TASed, and speedran for years now, so it's very cool that the fastest Any% completion of this game also fits this challenge criteria.
- This run does not collect any rupees throughout its duration.
- I originally thought this movie met the requirements to be considered low%, as many key item are not obtained in this movie. However, upon publicly premiering this TAS, I was informed that it is possible to skip collecting Deku Sticks and the Kokiri Emerald (which is collected upon doing the wrong warp at the end) if the Master Sword is obtained instead. This lowers the number of items needed to complete the game by 1. The full list of items collected in this movies that count toward the community's definition for low% is as follows:
- Kokiri Sword
- Fairy Ocarina
- Weird Egg
- Zelda's Letter
- Zelda's Lullaby
- Deku Stick
- Farore's Wind
- Kokiri Emerald
Run Creation and Special Thanks
This game is incredibly important to me. I've had more than my fair share of RTA experience with it, but I have been itching to TAS it for nearly 10 years now. I have been actively researching the progress of TAS tools for 3DS emulation for a very long time, and it's wild to think the tools are finally available to make this possible. As such, this is the first TAS I have ever seriously worked on or completed. As stated previously, I believe this is the first completed full-game TAS of a 3DS title. As such, a not insignificant amount of time was spent testing and figuring out the quirks of Citra. I am very happy that I was able to produce a movie that I feel is very high quality given how new the tools are and considering this is the first full-game TAS I have completed.
Huge thanks to every N64 Ocarina of Time TAS author. These games have a lot of differences, but I was still constantly using OoT N64 TAS's for inspiration during the creation of this movie. I would especially like to thank the following people:
- SwordlessLink, homerfunky, omgatree, Bloobiebla, thewayfaringfox, and MrGrunz for creating high quality TAS's in the past. I used just about every available Ocarina of Time N64 TAS as a reference at some point or another
- Kaztalek for helping me film the intro video and for motivating me to never accept mediocrity.
- Samplename_ for giving me encouragement, answering some minor TASing questions, and watching my WIPs
- NEVERDOORS for inspiring me with their very high-quality movies, especially their Ocarina of Time N64 All Dungeons No Doors TAS, as well as by answering a few questions I had throughout the making of this movie. They also proofread all of my author notes here, which was immensely helpful, and I am very grateful for it.
- Pal62 for helping me learn more about a trick that unfortunately did not end up being faster in this TAS and for pushing the limits of what an Any% speedruns looks like RTA. I was constantly referencing his any% record throughout the creation of this movie.
- Gamestabled, Erinexplosives, PurplePhoton for watching my WIPs as I excitedly explained why I thought certain segments are cool.
- Yashichi, Psymarth, and Lioncache for also watching my WIPs and for helping me get started with better understanding some of the Citra and TASVidoes source code.
- CasualPokePlayer, adelikat, and anyone else from the TASVideos team who assisted me in adding 3DS support to TASVideos. I fumbled a lot here, so this submission likely would not be possible without the help they gave me.
- zfg1 for streaming the premier of this TAS. I put a substantial amount of work into the presentation of this TAS, so using his stream as a platform was an incredible way to show off Citra TASing to viewers for the first time ever.
- Gymnast86 for being Gymnast86
Note: the frame counts listed here, are actually 1 frame before the screenshots posted. However, to use the built-in Citra screenshot tool, you need to take a screenshot the frame before the frame you want to capture. This means that the frames listed below are the frames at which I hit the hotkey to take a screenshot.
- Frame Count = 68428
- Input Count = 267622
- Frame Count = 76809
- Input Count = 300400
- Frame Count = 79374
- Input Count = 310431
feos: Claiming for judging.
feos: Incredible work on all fronts! It took a while to swallow but in the end there's not much I can say in this note, since everything looks solved. Accepting!