Undertale is a 2D role-playing video game created by indie developer Toby Fox. Undertale has three main endings: Neutral, True Pacifist, and Genocide. This TAS achieves the Genocide ending, which can be considered the "bad ending" to the game. In this ending, the player must complete the kill requirements in each area and then kill each area's boss. The TAS is optimized for Z/Enter presses and then time.
For the TAS to sync, you must check Runtime > Time tracking > clock_gettime(). You may also need to install extra dependencies by entering this command into a terminal:
sudo apt-get install libopenal1:i386 libssl1.0.0:i386 libglu1-mesa:i386
In addition, libTAS 1.4.1 has an audio bug where music files may not play at the correct speed. This commit fixes the issue and is what I used to encode the TAS.
The TAS was made on version 1.0 of Undertale, which doesn't have a Linux release, meaning it can't be TASed in libTAS by default. Fortunately, Undertale is a GameMaker game, which can relatively easily be ported to Linux with the following steps:
  • Download Windows Undertale v1.0 on a Windows machine in Steam by right-clicking on Undertale in your games library -> Properties -> Betas, then selecting old_version_100 in the list.
  • Once downloaded, the game can be found in C:\Program Files (x86)\Steam\steamapps\common\UNDERTALE. It comes as a packed .exe file, so unpack it using 7zip, WinRAR, or similar programs. You should get the .ogg music files, UNDERTALE.exe, data.win, and a few other files.
  • From the extracted files, rename data.win to game.unx
  • Create a folder to put the game files into. You can call it whatever you want, for example "Undertale v1.0 Linux". Inside this folder, create a folder named "assets" (without the quotes) and move all the extracted files into this folder.
  • Copy this file (TASVideos mirror) into the "Undertale v1.0 Linux" folder. This file is the "runner" file, essentially the Linux version of the UNDERTALE.exe file found on the Windows version. It executes the code found in the data.win (or game.unx) file.
  • You should now have the following folder structure: the "Undertale v1.0 Linux" folder, which contains the runner file and the assets folder, which contains all the extracted files (most importantly game.unx and the .ogg files). Copy the "Undertale v1.0 Linux" folder to your Linux machine and start the game by executing the "runner" file via the command "/path/to/runner" (no quotes, and use the actual path). You may need to make it executable first via the command "sudo chmod +x /path/to/runner" (no quotes, and use the actual path).
  • If you've run this movie once and got to the black screen, you may get the same black screen when you run it again, even with Prevent writing to disk checked. Go to /home/<Your Username>/.config/UNDERTALE and empty it.

Game objectives

  • Emulator used: libTAS v1.4.1 (32-bit)
  • Plays on version v1.0
  • Reaches the Genocide ending
  • Avoids taking damage, unless it saves Z/Enter presses or time

Comments

The idea behind the Z Button Challenge may be familiar to many due to Super Mario 64's infamous "A Button Challenge". These kinds of challenges simply involve completing the game while avoiding using a certain controller element as much as possible. In the case of this TAS, said controller element is the Z/Enter buttons. These 2 buttons have the same function, which is moving forwards in menus and advancing textboxes. Because the 2 buttons do the same thing, they will henceforth be referred to as just the Z button or Z press. The Z button is the most important button in the game, along with the arrow keys.
First, it's important to accurately define a Z press and the concept of half Z presses. A Z press has three parts to it: when Z is pressed, when Z is held, and when Z is released, and together, this forms one complete Z press. Usually, it's the pressing that's useful, because that's the only part that advances textboxes and menus. However, sometimes it's sufficient to just use the holding part (the "half Z press"), which allows us to close the "You Won" or "But nobody came" text at the end of battles. Now if we map out the required Z presses to kill a one-hit enemy, it would look like this: We need to press Z to advance to the monster select menu, we need to press Z again to start the attack, we need to press Z again to attack, and we merely need to hold Z to close the "You Won" text. So, how many Z presses is that total? The naïve answer would be four, three to kill the enemy and one to close the "You Won" text. However, we can do better. We can actually do it in three by simply holding out the third Z press to be used for the half Z press, because the half Z press only requires Z to be held, not actually pressed. In this fashion, closing the "You Won" text doesn't add any additional Z presses to the run, since the final Z press just leeches off of a previous Z press. So in conclusion, since that last Z press counts in some contexts but adds no additional Z presses in other contexts, we refer to it as a half Z press.
This TAS features complex and unintuitive routing, and heavy usage of RNG manipulation and complex glitches. The run involves following the Genocide Route normally in Ruins, followed by doing a complex series of glitches to obtain the Punch Card, an extremely glitchy item which is normally unobtainable in Genocide. Afterwards we complete the Genocide requirements in Snowdin, Waterfall, and Hotland/Core, the latter of which has some more amusing routing involving a detour to New Home. Finally, the Sans battle (a major source of Z presses) can be completely skipped with the Punch Card Exploit (explained below, this is the main reason we obtain the Punch Card earlier) and the run can be completed, with the Fallen Human destroying the world. This TAS is special because it's the first real use of Genocide Punch Card (GPC), the latest major glitch discovery in Undertale speedrunning as of the time of writing. For a TAS optimized for time, GPC is currently not worth it, mainly because it's 1.0-exclusive and thus can't take advantage of the shorter Japanese text in newer versions of the game.

Tricks Used

Wall Humping

Wall humping is a movement technique where the player oscillates between facing up and facing down each frame. This technique is performed by holding Up and Down simultaneously while against the bottom side of a wall. This can be useful in certain circumstances such as when you are moving left or right but need to be facing up or down. In rooms where the player is in contact with and between two horizontal walls, this technique will cause the player to move at double speed, as the two walls both move the player simultaneously.
Menu buffering is a movement technique where the player opens the menu and presses an arrow key on the same frame. This type of movement does not count as a step for random encounters and is not considered movement by blue lasers. Although menu buffering causes the player to move at half speed (alternating between the menu buffer and closing the menu), this technique can save time in certain circumstances where additional steps are not desirable.

Punch Card Exploit (PCE)

Although the punch card can be used to trigger many different exploits, PCE refers specifically to a glitch where the player menu buffers onto a cutscene trigger, uses the punch card from the item menu, then closes the punch card to regain movement in the cutscene. The reason this glitch happens is because there is one frame between using the punch card from the item menu and the punch card opening where the player has full control, and it is during this one frame that the cutscene trigger is activated. Because most cutscenes only lock movement at the very start of the cutscene, the punch card's own ability to unlock movement after being closed is enough to skip the entire cutscene. There is a variation of PCE called PCE slide where instead of menu buffering onto the cutscene trigger, the player uses the one frame of full control to walk onto the cutscene trigger, which also triggers the cutscene.

Wrong Warp

In Undertale speedrunning, wrong warping refers to entering a room and being placed at the default location in that room rather than the door the player entered from. When the player touches a room transition, the variable global.interact is normally set to 3. Then once the player reaches the next room, the game checks if global.interact is set to 3 and if it is, the game runs the code that places the player at the appropriate door marker. However, if global.interact is not 3, the player is not moved from the default location in the room. This default location is manually assigned per room by the game developer and is often closer to the middle of the room than the door marker is. There are several methods of triggering a wrong warp, all of which achieve the same result: setting global.interact to 0 (the value for full player control) while transitioning to the next room.

Text Corruption

Text corruption is a glitch which allows changing cutscene text in some, but not all cutscenes that have multiple sets of textboxes. Certain text boxes, such as dropping an item, use a variable called global.msc. When a textbox is created, the object creating the textbox assigns a value to global.msc, which is then used to lookup which set of text to display. By creating such a textbox between the cutscene's sets of textboxes, global.msc is changed to something unexpected, and so the following sets of textboxes will display the textbox that corresponds to the current global.msc value instead of the cutscene text that is meant to play.

Choicer Overflow

Choicer overflow in the context of Undertale speedrunning refers to a glitch that involves using multiple choicers at once to advance text beyond its normal limits. Choicers are types of textboxes that give the player a choice between two different options. These choicers also use the variable global.msc. If the set of text that is playing includes a choicer, global.msc is incremented by 1, which normally contains the post-choicer text, if any, as well as potentially other code that accompanies the selected choice. If another choicer is then activated, the value global.msc is incremented a second time and the corresponding set of text is displayed. This can be done repeatedly to advance global.msc to a particular value, as long as there are enough choicers available.

Persistence Glitch

The persistence glitch is the newest type of glitch in Undertale speedrunning. Rooms have a property called persistence, which saves the state of each object in the room. This property is set when entering a battle and then unset once the player returns. However, by leaving the room on the frame before a battle starts, the room persistence is never unset. This glitch is used to store choicers in persistent rooms, which can then be used for choicer overflow to obtain the Punch Card.

Text Storage/Overflow

Text storage (also called overflow) is a type of glitch where the player regains movement while text is on the screen, often by using the Punch Card's 1 frame of full control to interact with a sign or NPC. This can be useful in different ways, as some text can be used to set global.interact to 0 upon closing the textbox. Text storage is necessary to regain movement during the exclamation mark that appears above the player's head as part of the transition to a random encounter, as using the Punch Card to do this doesn't work. Text storage can also be used to store the text in a persistent room for later.

Phasing Storage

Phasing storage is a glitch where the player enters a persistent room and has disabled collision, meaning you can walk through walls and completely avoid cutscene triggers and other objects. It can be triggered by entering a persistent room while also having phasing (disabled collision) enabled. In normal rooms this does nothing because there's a line of code that runs at the start of each room to disable phasing, but in persistent rooms this code never runs.

RNG Manipulation

Undertale's RNG is determined by a seed that advances each time RNG is called. By calling RNG a different number of times, different outcomes can be achieved. Text calls RNG twice per character per frame and so changing how many frames text is displayed is the most common method of RNG manipulation. RNG is manipulated for various reasons such as getting particular monsters in random encounters and determining which step count random encounters will occur on. One thing to note is that the function randomize() is called upon loading into the game and this function sets the RNG seed based on the system time. However, after this initial seed, RNG is no longer affected by system time until the save file is reloaded or the game is restarted. RNG manipulation is used throughout the run and for the most part this is accomplished by delaying clearing text by anywhere between 1 and about 25 frames. Usually, the unlikelier an event is, the more frames it costs to manipulate RNG. While this does lose a small amount of time each time it's done, the various timesaves afforded by manipulating RNG more than make up for the few frames lost in the process.

Area comments

We start the game by sitting through the entire intro, because it automatically progresses to the Undertale logo screen afterwards. This saves 1 Z press over skipping the intro with Z. We also do some RNG manipulation in the name selection screen to get a certain "fun value". This value is randomly assigned at the start of every run, and determines what special events can occur during the run, such as special phone calls, NPCs, or other secrets. We want a fun value in the range 40-45, as this corresponds to the phone call from Sans in Snowdin asking if your refrigerator is running. This phone call is useful because it has a choicer, and will be used later to aid in getting the Punch Card.

Ruins

Ruins is the first section of the game. We begin with the first Flowey encounter where the speed of the friendliness pellet is RNG manipulated to be as fast as possible. A few rooms later, the first glitch in the run is performed. By interacting with the sign next to the door and entering the door at the same time, global.interact is set to 3 by the door, then to 1 by the sign, causing a wrongwarp. Doing so allows hitting the second switch without hitting the first switch, saving a Z press. Additionally, doing the room in the wrong order this way messes with the cutscene since Toriel is still waiting for you to hit the first switch, meaning you're unable to progress. Fortunately, hitting the switch updates the game's plot value, which tracks how far you've progressed through the game. Most cutscenes destroy themselves upon entering the room if the plot value is too high, so leaving and reentering the room will cause the cutscene to despawn. This also skips the extra dialogue at the end of the room, saving more Z presses. A few more rooms later, we run into First Froggit. It allows you to get LV 2 and increase your ATK/HP/EXP stats, but there is an issue. The game doesn't consider this a kill for the purpose of the Ruins kill counter, which means that you can choose to flee instead. Killing costs 1 extra Z press over fleeing, so we flee. The extra EXP we could gain by killing him is not useful later.
The kill requirement for the Ruins is 20, so we kill 20 Whimsuns, as it is the only 1-shot enemy in the Ruins. 1-shot enemies are good because they can be killed in 3 Z presses each, which is the minimum. Switching rooms after every kill causes the step count required to get an encounter to be much lower. Reading a sign in the room with the 20th kill skips the third phone call event. After 20 kills, we advance through the rest of the Ruins, holding Z for long periods of time to avoid additional Z presses exiting "But nobody came" encounters.
In the Three Rocks Room, we execute a glitch known as TAS RTA Rock Skip. By interacting with the rock on the same frame the step count to get a random encounter is reached, the battle transition will start once we close the text, which also starts the rock moving cutscene. Once the rock stops moving, we regain movement again (still during the battle transition) and walk into the rock again, which starts the second part of the rock cutscene. Then after exiting the "But nobody came" encounter, we regain movement and thus have text storage. We use this text storage to get persistence glitch off of a second "But nobody came" encounter. Then, in the pitfall maze room we fall into a pit and interact with the sign on the same frame. The pits work by enabling phasing, locking movement, and moving you manually, but by closing the sign text, we regain movement. Thus, we can go back into the persistent room while having phasing enabled, which triggers phasing storage, allowing us to completely bypass the rest of the rock cutscene and saving 1 Z press.
Napstablook disappears after 20 kills. For some of the "But nobody came" encounters, skipping it via menu-buffering is slightly faster than sitting through it.
Near the end we pick up the Toy Knife, a stronger weapon used during a large chunk of the run. The toy knife is barely seen during normal speedruns due to it being quite out of the way, but it is very good in the context of the Z button challenge due to it being a single-hit weapon, meaning it requires only 1 Z press to perform the attack.
Sleeping in the bed reduces the number of textboxes to mash during Toriel's chair dialogue. Toriel is a 1-shot.

Snowdin

Near the start of Snowdin, there's a movement optimization known as "gamer pixel" where you slide across the wall collision on the top or bottom side of the small bridge to stop a pixel further to the left than normal. This causes Sans to stop his walking animation earlier, saving 4 frames.
The kill requirement for Snowdin is 16, but there are also 4 enemies that are required to keep Genocide mode active even though the game doesn’t track them for the kill count; Doggo, Greater Dog and Dogi (Dogamy + Dogaressa). Snowdrake is also a required kill, but the game counts him. It's worth noting that most monster dialogue that appears before the monster's turn starts will automatically close after a certain period of time. This can be seen during Snowdrake's attack and later during the Papyrus battle and the Waterfall grind.
In Box Road we do a glitch called Box Storage, which works similarly to TAS RTA Rock Skip. By interacting with the box on the same frame the step count to get a random encounter is reached, the battle transition will start once we close the text, which also opens the box. By closing the box, we regain movement during the battle transition. As the soul starts flashing, the game locks movement a second time for some reason, but equipping the Toy Knife just beforehand bypasses the issue. We can then use this encounter to get persistence glitch. Technically it's possible to get persistence in fewer Z presses, but this requires getting a second random encounter here. We need that second random encounter for the next glitch, and we also need the Lesser Dog encounter (always the third Snowdin encounter) for later, so we have to get persistence using just one encounter.
Directly afterwards, we trigger the second Sans/Papyrus cutscene on the same frame as an encounter, causing both to start at the same time. Doing this allows the player to skip some text and retain movement during the cutscene after killing Ice Cap. An invisible wall blocks you from getting close to Sans and Papyrus, so we can't just skip the cutscene. By using the stick (which is automatically in your inventory after equipping the Toy Knife) before the second set of text starts, you can regain movement afterwards again, since that set of text usually locks movement. We use the Z presses used to mash the first set of text to also use the stick. It's possible to grind out encounters during this cutscene, but as mentioned we need the Lesser Dog encounter for later. At the end of the cutscene, we use the last few Z presses mashing text to use the stick again, which gives us text storage. This allows us to skip the fun-value dependent Sans phone call at the end of the room. This allows us to keep it active for later, as its trigger only disappears once you've completely mashed through it.
We go through the rest of Snowdin, making sure to keep Genocide active by killing all the scripted dog enemies. It’s faster to take intentional damage on Doggo in order to make his turn faster. Killing Dogaressa first saves a turn due to reducing Dogamy’s defense, this does not occur if you kill Dogamy first. For Greater Dog we can manipulate an attack that can be cancelled early.
The next sections revolve around a flag known as the "redemption flag", which when set aborts Genocide. This flag is set if you exit certain battles without having killed the enemies in it, which (normally) means you spared or fled from the enemy.
Due to not having exhausted the Snowdin kill count, the Papyrus fight occurs in its Neutral form instead of its Genocide form. The Genocide requirements only require that Papyrus is killed, not that he is killed in his Genocide form, so we just kill Papyrus in his Neutral form. This technicality is only present on version 1.0 and is the only reason we are playing on this version; on all other versions, triggering the Neutral Papyrus battle will set redemption flag (even if you kill him).
At the beginning of the Papyrus battle, Papyrus throws his blue attack at you. This attack spawns blue bones at random intervalls of 5-25 frames, and the faster the bones spawn, the fewer bones will spawn, making the attack even faster. With RNG manipulation, using the stick text during the second Sans/Papyrus cutscene to not lose time, I spawned 11 bones, at 6, 6, 11, 7, 5, 6, 10, 8, 11, 7, and 9 frames (all out of 25). The probability of that is 1 in 133000.
Since most battle text before the enemy's turn automatically closes after a certain period of time, we also get to take our sweet time reading Papyrus's text.

Waterfall

Near the beginning of Waterfall, we execute a glitch called Sea-Grass Skip (SGS). This skip is performed by using an item after triggering the cutscene where Undyne sees the player moving in the grass. Then by closing this text, we regain movement. This saves Z presses because it also skips Monster Kid's dialogue at the end of the cutscene.
The kill requirement for Waterfall is 18, with the only required enemies being Shyren and Glad Dummy (both count for the kill counter).
The base steps counter is extremely high in the first possible room (340), but is only 20 upon entering for the first time (This changes after the first encounter, Aaron). Since Aaron requires at least two turns to kill, we skip this fight by triggering a room transition on the same frame as the encounter. The same is done with Woshua for the same reason in the next room. Afterwards, we kill 12 Moldsmals due to Moldsmal being a 1-shot. Temmie is also a 1-shot, but due to only appearing randomly after several scripted encounters later (which would need to be skipped) and due to Moldsmal appearing as a double encounter, killing Moldsmals is fastest.
Right before the first spears chase with Undyne, we walk on the plank across the water, which triggers an autosave. Autosaves are created at certain points throughout the game, but don't actually affect the save file you load from the main menu. Rather, they are more a safety save in case you die and didn't have a recent save file, in which case you'll reload to the autosave. It's important to note that at the point of this autosave, we're still on the Genocide route, with the redemption flag not being set.
Directly after completing Spears 1, we turn around and take the Purple Dude to before the plank on the water, go to Snowdin, and flee from Lesser Dog. This sets redemption flag and aborts Genocide, which causes the Nice Cream Guy in Waterfall to respawn. Here are the conditions for Nice Cream Guy to despawn and/or respawn, in this order:
  • If Doggo has been killed while on the Genocide route, Nice Cream Guy despawns.
  • If redemption flag is set, Nice Cream Guy respawns.
  • If the Snowdin kill count is exhausted, Nice Cream Guy despawns.
Since we never exhausted the Snowdin kill count, Nice Cream Guy is back. Buying a Nice Cream from him allows us to get a Punch Card from the box.

Back in Snowdin

We now head all the way back to the beginning of Snowdin, wrongwarping past the plank on the water instead of taking the purple dude and wrongwarping past the Sans phone call to keep it active. We then enter the persistent Box Road, where we overflow the box and leave with the choicer up. This choicer storage in a persistent room will allow us to do choicer overflow with it later. At the same time, we leave the room on the same frame we get an encounter, which also stores the exclamation mark in the persistent room. This will also be useful later.
The next trick is the most difficult trick ever done in Undertale, and as the time of writing it's one of two tricks that has been pulled off in a TAS, but not RTA (the other being 4-cycle Mad Dummy). In the next room, we PCE the Sans phone call and leave the room on the right and re-enter it. The reason is that the trigger is several pixels wide, and if we PCE it from the right we can PCE it multiple precious pixels closer to the sentry station. Next we overflow the camera behind the sentry station and use the text to regain movement during a random encounter. Then we PCE the Sans call trigger and close the punch card on the frame the soul starts flashing, since that locks movement. We walk to the sentry station and overflow it, then interact with the camera as soon as we can reach it, which happens be on the last frame before the battle starts. Everything I just described from the Sans call PCE is frame- and pixel-perfect. After fleeing the battle, we have movement and 3 different textboxes (the Sans phone call, the sentry station text, and the camera text). We then grind out another random encounter. We use the camera text to regain movement during the transition, open the punch card, and use the Z presses from opening the punch card to close the sentry station text. Doing so allows us to regain movement for 1 frame while the punch card is up, which we use to move into the room transition and get persistence glitch while the punch card and the Sans call is up. Because the Sans call has a choicer, we've just set up a second choicer storage. We then die to the encounter. This reloads the autosave made before the first Undyne spears chase, where the redemption flag wasn't set and Genocide was not yet aborted. However, since persistent rooms stay persistent so long as the game is not closed, the 2 choicers stored in the Sans call room and in Box Road are both still there.
We now head all the way back to the beginning of Snowdin (again), grinding out a Moldsmal encounter first. On the way, we interact with the Old Tutu, which sets global.msc to a certain value corresponding to the tutu. It just so happens that the global.msc values directly after the Old Tutu correspond to the punch card box next to Nice Cream Guy. The first global.msc value checks if there are punch cards in the box. If there are, it prompts a choier which can be used to get a punch card from the next global.msc value. Otherwise, it just shows text that there are no punch cards in the box, without a choicer. The second global.msc value simply shows text that you got the punch card and puts a punch card in your inventory, without checking if there are actually punch cards in the box.
Once at the Sans call room, we close the stored punch card sprite to regain movement and activate the choicer, which increments global.msc to the value corresponding to punch card box. Because the box is empty, it doesn't prompt its own choicer. It's important that we regain movement and exit the room while the Sans call is still playing and without mashing all the way to the "Click" text at the end of the phone call. The reason is that the Sans call is technically divided up into 3 sets of textboxes: the "Ring..." text, the Sans dialogue including the choicer, and the "Click" text. All three textboxes set global.msc to a different value, and only the last textbox gives us movement. This means that if we were to completely mash through the phone call to regain movement instead of using the stored punch card sprite, global.msc would be set to the punch card box by the choicer and then to a different value by the "Click" text, ruining the trick.
In Box Road, we use the choicer stored there to increment global.msc again, from the value corresponding to the punch card box to the next value after it. As explained above, this value simply shows the "You got the Punch Card" text and gives us a punch card. This is what the entire setup ever since Box Storage has been leading up to.
At the same time, we enter a battle with Moldsmal. Recall that when we exited the room last time, we got an encounter on the same frame, meaning the exclamation mark was stored in the persistent room. When we reenter the room, it's still there and thus starts a battle. Normally, the battle to start is determined as soon as the exclamation mark appears, but since the exclamation mark is already there, the code to determine the battle doesn't run. Instead it just starts whatever the previous battle was, which was Moldsmal back in Waterfall.
After exiting the battle, we instantly get another random encounter. This time, it's because the step count to get an encounter only gets reset to 0 upon entering an unpersistent room that can spawn encounters. Because our step count is high enough from walking all the way through the Sans call room and parts of the Doggo and ice rooms, we get an encounter as soon as we regain movement after the Moldsmal battle. This is also the reason we menu-buffered through parts of the Doggo and ice rooms; we would have otherwise gotten an encounter in the Sans call room. The battle text would have also reset global.msc, which would have ruined getting the punch card.
Next, we complete the Snowdin kill requirements. Since Ice Caps die in 1 hit, we grind out all Ice Caps in the ice room. With best-case RNG, switching rooms is slower than staying in the same room. In addition, by getting an encounter at the same time as going onto the ice, we can regain movement during the battle transition. This allows us to already start grinding out the next encounter during the battle transition. For the 16th kill, exiting and reentering the room is faster again. After completing the kill count, we can finally leave Snowdin.

The rest of Watefall

Since the autosave was made before the first Undyne spears chase, we have to do it again. This time, we can PCE slide the Monster Kid cutscene at the end to skip it.
After walking through all of Waterfall and killing Shyren and Glad Dummy in the process, we get to Undyne the Undying. Fighting her with the Toy Knife takes multiple extra turns over fighting her with the Ballet Shoes, but since the Toy Knife is a single hit weapon and the Ballet Shoes a triple-hit weapon and picking up and equipping the Ballet Shoes also costs 7 extra Z presses, the Toy Knife is still better.

Hotland and Core

Alphys’s Lab features a glitch known as dogfood storage. By using the bag of dog food and the north wall, it is possible to stand on top of the trigger for the Mettaton cutscene without triggering it until the movement keys are released. By opening and closing the menu and then interacting with the dog bag, closing the dogfood text gives movement during the cutscene. We use the Z presses used to progress Mettaton's first textbox to close the dogfood text, interact with the fridge, and mash through to the last textbox, which triggers text corruption, shortening Mettaton's second set of text to the last line of the fridge text. This saves Z presses overall by reducing the number of textboxes to mash away. Watching the entire cutscene is required as this sets flags to enable the Genocide version of Hotland and Core, with disabled puzzles and no phone calls from Alphys.
We skip Tsundereplane in the vent room by entering the transition on the same frame we get an encounter, as Plane takes 2 turns to kill with the Toy Knife. Killing the Royal Guards and Muffet is required to keep Genocide active (they count towards the kill count). Walking all the way through Core saves the Z press used to go through the Core elevator. Fleeing Astigmatism instead of skipping him avoids a 1.0-exclusive crash later in New Home. Finally, we PCE the Mettaton NEO fight and the Alphys cutscene in the following room to get to New Home. Skipping these cutscenes allows us to complete the Hotland/Core kill requirement later instead of now.

New Home

In New Home, our goal is to run into as many Monstertale encounters as possible. The reason is that Monstertale (shown during the Neutral/Pacifist route) and Floweytale (shown during the Genocide route) share the same triggers, meaning that once a Monstertale encounter is cleared, the corresponding Floweytale encounter is too. The difference between the two (aside from a different story) is that most Monstertale encounters can be cleared in 1 Z press, while Floweytale encounters have about 5-20 lines of dialogue each, all of which need to be cleared using Z presses. Unfortunately, we can't get past the encounters in the long room, because the first one has Shyren in it. Shyren is a redemption flag monster, and sets the redemption flag if a battle with her is exited without having killed her. Since it's impossible to kill Shyren in her Monstertale encounter, it will unavoidably set redemption flag, aborting Genocide. This means we'll have to get through all the Floweytale encounters in the long room later.
In addition, we get the Worn Dagger, which is a much stronger single-hit weapon than the Toy Knife and allows us to kill some Core enemies in one hit.

Core grind

We head back to Core, wrongwarping into Mettaton's room to avoid triggering the Mettaton battle cutscene.
The kill requirement in Hotland/Core is 40, 4 of which have already been killed in Hotland. First we equip the Worn Dagger in battle, as it only takes 3 Z presses to do so as opposed to the 4 it does in the overworld. Initially, the only enemies we're able to kill in one hit are Whimsalot and Final Froggit, so we manipulate the RNG to only get those encounters. The first 5 Core encounters are scripted, and encounters 3, 4, and 5 have enemies other than Whimsalot and Final Froggit in them, so we skip them by entering the room transition on the same frame as the encounter. Once we get to LV 14, we're also able to kill Astigmatism in 1 hit. Near the end of the grind, we visit Warrior's Path to kill the first encounter there, as it's a scripted Whimsalot + Final Froggit.
We PCE Mettaton's trigger and drop the Toy Knife, triggering text corruption. The menuing during the battle transition is purely for show. Mettaton NEO dies in 1 hit.

New Home (again)

We go through New Home, with most of the Floweytale encounters being gone as explained earlier. The encounters in the long room are all still there though, and you can really see how many extra Z presses the Floweytale encounters take. In total, Shyren setting redemption flag costs us 66 Z presses in this section.
Sans is not a requirement to get the Genocide ending, and can be completely skipped via a PCE. His battle takes hundreds of Z presses to complete, and he is the main reason we went to such lengths to get the Punch Card. The rest of the run involves mashing through dialogue as the player kills Asgore and Flowey, and finally the Fallen Human destroys the world.

Other comments

Unoptimal parts

As of the time of writing, the TAS is still optimal in terms of Z press count. In terms of time, about 10 seconds can be saved by equipping the Worn Dagger in the overworld during the wrongwarp into Mettaton's room instead of in battle. The last Z press to use items in the overworld is to close the equip text, but by equipping it during the wrongwarp the room transition will close the text for us.

Special thanks

Special thanks goes to RichConnerGMN, who inspired me to make the TAS and helped with routing.

Screenshots


feos: Added annotations to the file, with steps to recreate the runner which we reuploaded on tasvideos for posterity.
feos: Replacing with the movie with proper time.
Samsara: Normally I don't claim submissions this fast, but I just had to after seeing this!!!
Samsara: Gosh, this took a while, huh?
After a nightmarish process to legitimize this run, including retroactively releasing a libTAS build specifically to be able to sync this run, I think it's safe to say that we can finally do something with it. Rejected.
Okay, jokes aside, let's actually talk about the run. The feedback, now that there actually is some, looks to be pretty good! Definitely better received than the Neutral submission, and consistently so over the (checks watch... oh god they don't make watches for months) severals of months this has been on the workbench. For me, the amount of "oh my god what's happening" was more than enough to keep me interested all the way through, so I can only echo the positive feedback here. It's very technical, very clearly showing through pure "oh my god what's happening" that every step is taken, no matter how long, even if it only saves a single press in the end. We love technical here, we love that kind of insane dedication just to make one number tick ever so slightly downward.
I'm going to be accepting this to Moons as a new category. Note that, at this time, I'm not entirely sure whether or not we'll be accepting and publishing a secondary "minimum Z press" branch alongside this one, assuming one even comes along (TPE, perhaps?). "Worst" case (which is still far better than what worst case used to be!), we have a single branch for minimum Z press runs that can be freely obsoleted by another route if it's determined to be more entertaining by the audience, while the others remain showcased in Playground. Also, remind me to put the Neutral submission in Playground.
Quick reminder to potential improvements given the category: Since the primary goal of the run is to minimize Z/Enter presses, time-based obsoletion will only come into play if the number of Z/Enter presses remains the same. We prioritize better completion of the category over time, meaning a longer run with less Z/Enter presses will obsolete this. That's probably straightforward enough to not need explanation, but hey, sometimes I just like talking about TASes.
Excellent work, and sorry it took so long for this to be processed!
feos: Discussed the branch label with Samsara, we agreed that telling what the button does provides more helpful info to the user seeing this for the first time, also allows to avoid listing buttons that do the same thing. The purpose of the keys Z and Enter is to work as a generic "action" button, so you have to avoid having to hit it, hence unique route decisions.
Also put the in-game goal first.
feos: Let's pub!


Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
duuuuude5 wrote:
gotcha https://tasvideos.org/UserFiles/Info/637784959862978855
It says
Copy this file into the "Undertale v1.0 Linux" folder.
but doesn't explain what file.
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.
Player (200)
Joined: 9/24/2021
Posts: 20
Location: Germany
Sorry about that, I had just copied the instructions from the submission text, which had a link to the file under the text "this file". I fixed that here https://tasvideos.org/UserFiles/Info/637787275127056453 (also added the instructions to get the runner file from original source in there)
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
On Windows, install gamemaker studio 1.4.1567 with a license they don't give out anymore, although it's untested at the moment if 1.4 versions might still open with a gamemaker studio 2 license. Then you can either create a game for Linux using that gamemaker version and take the runner file from the game you made, or you can find the runner at: %appdata%\GameMaker-Studio\Linux\runner.zip
How do I create a game to get the runner to appear? There's still a direct download for http://store.yoyogames.com/downloads/gm-studio/GMStudio-Installer-1.4.1567.exe as well as http://store.yoyogames.com/downloads/gm-studio/GMStudio-Installer-1.4.9999.exe (also https://www.yoyogames.com/download/studio/free) but even if I register on their site, the former fails to recognize my email and the latter says I don't have a license for version 1.4. When using the runner from discord I get
./runner: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
even tho it's there in usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 EDIT: Turns out you can just launch libtas with steam libs and the game will run fine
~/.steam/bin/steam-runtime/run.sh libTAS
But I'm getting Error nut->time_base.den is (0) when trying to dump video. EDIT: And fixed too, fps was somehow set to 0 in video config.
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.
Player (200)
Joined: 9/24/2021
Posts: 20
Location: Germany
feos wrote:
On Windows, install gamemaker studio 1.4.1567 with a license they don't give out anymore, although it's untested at the moment if 1.4 versions might still open with a gamemaker studio 2 license. Then you can either create a game for Linux using that gamemaker version and take the runner file from the game you made, or you can find the runner at: %appdata%\GameMaker-Studio\Linux\runner.zip
How do I create a game to get the runner to appear? There's still a direct download for http://store.yoyogames.com/downloads/gm-studio/GMStudio-Installer-1.4.1567.exe as well as http://store.yoyogames.com/downloads/gm-studio/GMStudio-Installer-1.4.9999.exe (also https://www.yoyogames.com/download/studio/free) but even if I register on their site, the former fails to recognize my email and the latter says I don't have a license for version 1.4.
I can't give you exact answer because I don't have access to gamemaker studio myself, but i've asked colinator about this. He's probably asleep right now though so it might take some hours to get an answer lol. As I've said though, you apparently need that 1.4 licence you're talking about to open GM Studio, which yoyogames doesn't give out anymore.
feos wrote:
When using the runner from discord I get
./runner: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
even tho it's there in usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
This means you're missing the dependency libssl1.0.0, which other versions of undertale need too iirc (specifically version 1.0.0). Install it with
sudo apt-get install libssl1.0.0:i386
. On newer linux distributions this package is no longer in the default repositories, but you should still be able to get it with the following steps: Add
deb http://security.debian.org/debian-security jessie/updates main
to the end of your /etc/apt/sources.list file, which if you don't know how to add stuff, these commands should work:
sudo nano /etc/apt/sources.list
Navigate to the end of the file, then paste in
deb http://security.debian.org/debian-security jessie/updates main
on the last line (in the terminal you can paste with Ctrl+Shift+V) Close and save the file with Ctrl+X, Y, Enter Then run
sudo apt update
Finally install the libssl1.0.0 package like I said above. If you want, this is the command I had to use to install more dependencies on my linux system:
sudo apt install libxxf86vm1:i386 libglu1-mesa:i386 libopenal1:i386 libssl1.0.0:i386 libxrandr2:i386 libfreetype6:i386 libfontconfig1:i386 libresample-dev:i386 libc6-dev:i386 linux-libc-dev:i386 libswresample3:i386
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
I generated the same runner!
  1. Launch GameMaker Studio 1.4.1567 - New - Create
  2. Rightclick Rooms - Create Room - Hit the green checkmark to save the empty room
  3. Target - Ubuntu (Linux)
  4. File - Preferences - Linux - enter host name and user name
  5. File - Create Application - Save where you want
  6. I get a fail on log creation and hit Don't Send
  7. I get Compile Failed dialog, but the app zip was created fine, so I close the form
  8. Open the zip - there's your runner
CRC32: F01B9BF3 MD5: 2471AD9378435654599D07EDBE6E3799 SHA-1: 79D9029C7390A2B9A798BAE3E58CF9B9AB55BB2E
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.
Judge, Moderator, Player (200)
Joined: 7/15/2021
Posts: 112
Location: United States
feos wrote:
When using the runner from discord I get
./runner: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
even tho it's there in usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 EDIT: Turns out you can just launch libtas with steam libs and the game will run fine
~/.steam/bin/steam-runtime/run.sh libTAS
For future reference (and who knows, maybe using the Steam runtime is better), you can debug these kinds of errors by running strace, e.g. strace ./runner. It will show all syscalls that the binary makes, including every filename it looks for to find the library. To show only syscalls related to files, pass --trace=file, e.g. strace --trace=file ./runner. And for better usability, you can pass -o to redirect the strace output to a file, e.g. strace --trace=file -o output.txt ./runner.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
Variable framerate in ltm is now supported. Displayed framerate for such movies is an approximation to make the parser's job easier, not intended for humans. Also this submission is finally ready to be judged by the merits of this branch, all the technical obstacles should be gone by now.
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.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
I just tried building https://github.com/clementgallet/libTAS/commit/818b78dad5f335c85cd4011247609d8865117f51 but it didn't sync on that commit, only on 1.4.1 stable.
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.
Player (200)
Joined: 9/24/2021
Posts: 20
Location: Germany
Strange, I'll try installing that commit again myself and seeing if i can get it to work
Player (200)
Joined: 9/24/2021
Posts: 20
Location: Germany
Alright, I think I figured out what the problem is. The tas does in fact desync on that commit. However, all you need to fix the issue is to replace the file that was changed in the commit (al.cpp) onto the original 1.4.1 release. Sorry for not mentioning that, I compiled that version of libtas with the audio patch quite a while ago and had forgotten about this lol I assume this is because the same change that causes the tas to desync on 1.4.2 happened before the audio bug was fixed, and is thus in this commit as well and desyncs the TAS. Here are the steps I took to make a version of libtas that this tas syncs on and has the audio patch: Download the source code for 1.4.1 from the releases page Download the file that was changed for the audio fix: https://raw.githubusercontent.com/clementgallet/libTAS/818b78dad5f335c85cd4011247609d8865117f51/src/library/audio/openal/al.cpp and replace 1.4.1's src/library/audio/openal/al.cpp with that file you downloaded Build and install it like normal, there are instructions on the libtas github page (you probably need to build it with the dual-arch feature, since Undertale is a 32-bit game)
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
Syncs on this semi-official release that I made specifically for this submission. https://github.com/vadosnaprimer/libTAS/releases/tag/v1.4.1a
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.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2238)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
It's been... Just a bit of time, shall we say, since this was submitted. A slight bit of time, perhaps. Couple days, maybe? I dunno, I lost all grasp on time millennia ago. Since submission, a lot has changed regarding the site. Notably... The site itself, but also the evolution of how content is treated and accepted. I'd like a fresh set of perspectives on this run, some new feedback (and even the repetition old feedback from people who already posted) to determine how to handle this run. Was it enjoyable? Does it differ enough from the published Genocide run? Is it something worth showcasing? That last one's a trick question. The answer is yes. But still, there's been enough time since submission and enough changes to the site that it's worth essentially starting over on feedback. please do not take another 7 months ._.
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.
AntyMew
It/Its
Encoder, Player (35)
Joined: 10/22/2014
Posts: 425
For starters, if anyone more knowledgeable with Undertale than I can correct me on any information, please do. My understanding of the newer glitches comes from the submission notes and from talking to OceanBagel on the TASVideos discord. It's worth noting that the most distinguishing trick in this run, obtaining the punch card in Genocide, has apparently not yet been fully optimized and compared to the route used in the published Genocide TAS. As stated earlier in the thread, the difference is about 90 seconds with the proof-of-concept punch card route TAS, in favor of the published TAS. 90 seconds is a lot to make up, but feasibly could be. So hypothetically, this TAS could end up very similar to a future Genocide TAS, placing it in a similar situation to the Neutral ending submission with the same goal. I'm not too familiar with the recent changes to the site guidelines, so I'm not sure if this could be grounds for rejection or future obsoletion. It's just food for thought. As-is, this TAS is an incredible display of Undertale's glitchy mayhem, which is normally never seen to this extent in the relatively glitch-free Genocide route. And that on top of using a trick which has never been reproduced in RTA? Easy yes vote.
Just a Mew! 〜 It/She ΘΔ 〜
Joined: 9/8/2021
Posts: 5
AntyMew wrote:
90 seconds is a lot to make up, but feasibly could be.
Hello there, I am the creator of the original Genocide Punch Card TAS. Most of that time is purely from the Japanese text. If optimized just a bit more and disregarding the Japanese this route would beat the current TAS. However, it would need to beat it by more than 30 seconds due to using a new skip that saves that much time. As for the submission, I'm biased as it uses strat that's considered a meme in the community that's attributed to me (the noclip in the triple rock room near the beginning of the room).
Post subject: Movie published
TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15579
Location: 127.0.0.1
This movie has been published. The posts before this message apply to the submission, and posts after this message apply to the published movie. ---- [4708] Windows Undertale "Genocide ending, minimum confirms" by duuuuude5 in 1:22:29.95