UNDERTALE is the indie RPG where no one has to die.
UNDERTALE To niezależna gra RPG w której nikt nie musi ginąć. Inspirowana grami: EarthBound, Yume Nikki, i Cave Story, it received critical acclaim for its interesting characters, interconnected soundtrack, and twists on standard RPG tropes. Supported by a devoted fan base, for a time, it was hard to avoid this game.
...and don't even get us STARTED on uploading audio tracks to BrawlCustomMusic!
Please don't upload these huge sprite sheets online.
Just 'cause most weird things here ARE used, I'd rather them be seen in context first.
wait like a year 1st...
if you're just ripping normally seen sprites for spriter's resource or smth idc if you use these 2 make it easier tho
Games made with GameMaker, like Undertale, store all of their sprites in big PNG spritesheets, instead of each sprite or character being stored as an individual file. So if one were to upload sprite sheets, the easiest thing to do would be to upload all of the sheets as-is...which would leave all of the spoiler-y sprites on the same sheet as well.
The odd filename was chosen to force it to the top of an alphabetical file listing and make its presence more obvious...which does no good, as the file listing is only visible if the sprites are separated by their internal names. Oops. This was replaced in later versions.
you know what i
HATE?
that's
bepis
THE TASTE
the smell
the texture
hey...
your
drooling...
Version 1.001 replaces the no-spritesheet request with this vaguely erotic note about "bepis" that is a reference to a man in Moonside from EarthBound who hates the food the player likes. Toby Fox is a fan of EarthBound, and Undertale takes inspiration from the game heavily. Bepis is a silly misspelling of "Pepsi", as well as a word the developers think is silly.
The lack of any real meaning to this new text and the fact that it replaces the earlier request can be taken as permission to begin posting spritesheets, as supported by this forlorn-looking email.
abc_123_a.oggHello. He-he-he-he-have some respect and don't spoil the game. It's impossible to have mysteries nowadays, because of nosy people like you. Please keep all of this between us. If you post it online, I won't make any more secrets. No one will be impressed. It will be your fault! He-he-he-he-ha-he-he-ha-he-he.
This is a sound file of eight text-to-speech voices telling people not to post the game's secrets online. Who in their right mind would do tha— wait a minute...
The odd filename was chosen to force it to the top of an alphabetical file listing and make its presence more obvious. All other OGG-format music and sound effect files present in the game's folder are prefixed with either "mus_" or "snd_".
This file was updated in v1.001, taking out pretty much everything that was in the original audio file and replacing it with incoherent laughing courtesy of the initial eight text-to-speech voices, though the laughing from the last voice at the end of the original file was still kept.
Part of this game's charm is the mystery of how many options or secrets there are. If you are reading this, please don't post this message or this information anywhere. Or doing secrets will become pointless.
By the way, most of the seemingly unused text/files are used.
If you can find the in-game context for an asset, you can show it off. But if you can't, it probably means you haven't looked hard enough. Anything truly unused I'll probably post myself, later.
Living in a world like this, where people can simply cheat out the answers from the code... your impatience has REALLY damaged you, hasn't it?
This notice is put into the attention_hackerz_no_2 script, where the messages are set into variables called demonx, demony, demonz and demond, respectively. The messages are, obviously, used to warn crackers. Due to the naming of the script, the messages are put at the start of the internal strings list, increasing the chance for them to be read.
In 1.001, however, it has been changed to this:
Greetings.
You have made yourself completely clear.
Understood.
I, your humble servant, will follow you to the utmost...
The variables have been renamed to demona, demonb, demonc and demond, too. Curiously, the first line from the version 1.00 message is still present along with its associated variable, but has been moved into scr_namingscreen_check, which is the script that handles naming easter eggs.
Curiously, in 1.05, the copy in scr_namingscreen_check seems to have been changed.
v1.001
v1.05
Part of this game's charm is the mystery of how many options or secrets there are. If you are reading this, please don't post this message or this information anywhere. Or doing secrets will become pointless.
For some reason, this change appears to have been exclusive to the Mac and Windows versions, with the Linux version and the console ports still having the "Part of this game's charm" message. Version 1.06's Windows and Mac releases seem to blank out the message, although some versions of 1.08 Windows and Mac seem to have the message "..." instead, while others seemingly return to the "Part of this game's charm" message. In particular, the Mac non-DRM release seems to return to the original message, while the Windows Steam and non-DRM releases have "...".
* (It's a picture of a dog juggling several balls.) * (You feel satisfaction that your hard work reverse engineering the encryption of the Xbox One has paid off.)
gml_Object_obj_xbox_controller_connect_Create_0 in the Xbox One (v1.12X+) version contains this congratulation for dataminers, appropriately stored in a variable named unusedstring. Toby's foresight is appreciated, considering how difficult Xbox One's security was to crack.
Note that there's no new line after the first sentence in the original string.
(Source: luigiutmc, original TCRF research (actual location))
If the code "ball" is typed on the title screen, a jingle will play. The jingle itself is named snd_ballchime.ogg. In a 2025 interview with Famitsu, Toby would reveal that this jingle was originally made for a canceled, Panel de Pon-inspired project a friend of his was working on.
At the very end of the ACT menu strings is this yet again generic error message, a placeholder for the ACT options of the fight against Asriel's true form.
Gaster (who has 666 for an enemy ID) has a complete set of stats in the code, all ridiculously high (to the point an enemy given these stats is borderline impossible to damage and getting hit insta-kills Frisk) and consisting only of numerous 6s. His EXP and GOLD are set to negative numbers, meaning the player should actually lose EXP and GOLD if they somehow won. They are as follows:
Gaster also would have had a 666% chance to award an item with the ID 666 (which of course doesn't exist, as the item IDs only go up to 64) after battle... which would've worked if the item drop mechanic was even functional.
Sans' battle has some unused attacks. They, along with used attacks, are handled in the obj_sansb_body object.
Vertical Platforms - The attack is handled by obj_vplatgen. It has bones along the bottom, with platforms randomly placed and scaled scrolling from top to bottom. Some platforms wave from left to right slightly as well. To dodge, you are to stay on the platforms and not fall to the bottom into the bones. There are 3 variations to this attack, controlled by obj_vplatgen's (0-indexed) type variable, type 1 to type 2 are simply sped up versions of type 0. Type 2 is directly accessible as attack type (variable a_type) 9 in obj_sansb_body. There's also a unused 6th Alarm event to the generator objects, which spawns randomly positioned bones in the middle of the screen to dodge every 50 frames. Because the platforms are randomly generated in size and position, it can be impossible to avoid getting hit.
Vertical and Horizontal Bones - Fixed bullet patterns with bones coming from positions vertically and horizontally. To dodge, you must maneuver around the bones. Accessible as attack type 10 in obj_sansb_body. There also exists a variant, accessible as attack type 11 in obj_sansb_body, which is faster and has a different pattern. There is also a "hell" variation of the first kind of the attack, accessible by setting the hell variable in obj_sansb_body to true, which is harder.
Random Gaster Blasters Variant - The sprites for the blasters are squished to be thin, much like one of the final version's variants, although this time the blasters spawn and shoot faster. This can be seen if a obj_gasterbl_gen is spwaned with type 0, which is not utilized by any coded attack in obj_sansb_body.
Final Attacks Variants - There is also "hell" variants of some of the final attacks. The attack where you have to short hop in between a gap in bones (attack type 1) and the one where you hop over a small white bone with a long blue one right after (attack type 3) is faster when the hell variable in obj_sansb_body is set to true. The platforming attack with bones and platforms scrolling across the screen horizontally has a variant where the platforms scroll slower, which is type 0 of obj_3platgen.
Worth to note that there exists an unused pitch for Megalovania in the code, which is also demonstrated in the video in result of the usage of the skip debug variable. Here's the related code, in the Create event of obj_sansb:
Watch on YouTubeThe Mettaton EX battle has some unused attacks. These can be seen if obj_mettattackgen is spawned with the respective attack types set in a global variable called global.attacktype.
To do:
Explain better
Attack type 1 - Columns of boxes
Attack type 2 - Columns of boxes weaving from left to right
Attack type 3 - Some arms weaving from left to right?
Attack type 4 - Literally just legs
Attack type 5 - Activated legs weaving from left to right
Attack type 6 - Boxes and bombs scattered everywhere
Attack type 7 - Boxes and bombs scattered everywhere, but faster
Attack type 8 - Tightened bullet board, bombs appear from left and right
Attack type 9 - Less tightened bullet board, bombs appear from left, center and right
Attack type 10 - Columns of boxes and bombs approaching fast. The pattern is replayed after a while
Attack type 11 - Columns of blocks that go upwards when shot
Attack type 12 - Columns of blocks that go upwards when shot, plus sparkle bullets which only appear in the Alphys Lost Soul fight in the final game
Attack type 13 - A lot of mini Mettatons throwing hearts
Attack type 14 - Another lot of mini Mettatons throwing hearts
Attack type 15 - Mini Mettatons throwing sparkles
Attack type 16 - Mini Mettatons throwing sparkles again
Attack type 50 - Some arms with moving yellow block?
Attack type 51 - Fast disco ball
Attack type 52 - Boxes and bombs scattered everywhere, again; also kinda fast
In the internal monster setup code, there are mentions of item rewards and the chance for an item to drop. This never happens within the game, leaving these global variables unused: itemrewardid and itemrewardchance. Below is an example of the variables in the code.
scr_getvapordata contains a piece of ASCII pixel art of Toriel's death sprite, spr_torielboss_kneelsmile2, (mostly) composed of 0s (representing black) and 1s (representing white). Along with other data contained in the script, this was meant to be interpreted by an old version of the game's sprite duster, obj_vaporized, which produces dust particles according to it; the final game instead uses obj_vaporized_new like all monsters other than Undyne and Glad Dummy. (The following representation of the data cuts it to lines with 72 characters each, which is half of 144, the original sprite's width.)
Two events in the game attempt to rename or delete the game's executable undertale.exe, but fail because they target the save file directory (where file0 is) rather than the executable's folder. This can be proven by placing a duplicate undertale.exe in the save directory.
Firstly, the game's executable is attempted to be renamed to flowey.exe on the first Neutral Route playthrough after Flowey absorbs the six human souls when Asgore is defeated and crashes the game. The game renames itself back to undertale.exe once Flowey is defeated. It was likely to give an immersion that Flowey has conquered the game's world so much that he can even mess with your game's executable file.
In obj_asgore_lastcutscene:
if (global.osflavor == 1)
{
if (file_exists("undertale.exe"))
file_rename("undertale.exe", "flowey.exe");
}
In obj_flowey_master:
if (global.osflavor == 1)
{
if (file_exists("flowey.exe"))
file_rename("flowey.exe", "undertale.exe");
}
The game attempts to delete itself when the screen shakes at the end of a Genocide Route after Chara destroys the game's world. In addition to the game's INI and save files, the game tries to find various common name cases for the Undertale executable and tries to delete it.
In obj_gameshake:
if (global.osflavor == 1)
{
if (file_exists("undertale.exe"))
file_delete("undertale.exe");
if (file_exists("undertale.EXE"))
file_delete("undertale.EXE");
if (file_exists("Undertale.exe"))
file_delete("Undertale.exe");
if (file_exists("UNDERTALE.exe"))
file_delete("UNDERTALE.exe");
}
Hidden under the MTT Hotel outside image in the respective room (room_fire_hotelfront_2) is an early version of the hotels outside, being made up of tiles instead of being one image. The ground tiles are placeholders, using the ice cave ground, a tile that was used as a placeholder throughout the entirety of Hotland.
Hidden in the right side of the room for CORE's entrance (room_fire_precore) is what seems to be a placeholder version of the entrance. Although cut off and using Hotland's tiles, the placeholder version seems to resemble the version seen in some concept art.
Hidden out of bounds in room_water11 is an unused alternate path to room_water12. The doors in this area take you to the inaccessible island with an echo flower that can be seen in that room.
The Annoying Dog can be sold for 999G and haggled up to 1251G (the highest sale price of any item in the game!), but it will disappear if taken out of the room it spawns in, so this can never be seen on a normal playthrough.
Mettaton EX's battle theme, Death By Glamour, is played at 0.95x speed after the pre-battle intro cutscene, but plays at 0.97x speed instead if Mettaton's dialogue is skipped; this is the value set in scr_battlegroup, the script that defines all of the encounters in the game. The version in the OST plays at full 1x speed, matching neither of these.
When you save in the Xbox One version, the game stores the value of flag 299 (the amount of coins you donated to the casino Dog Shrine) to global.xbox_coins_donated, then writes the latter into the save file. This appears to be completely unnecessary, as the game accesses flag 299 all the time, leaving the global variable unused.
The room in the Ruins where the Toy Knife can be found is internally called room_ruins18OLD. This is the only instance of a room labelled as old being used, and there's no non-old version of the room.
In the room of Hotland where you need to press 3 switches but Alphys calls you right before hitting the third switch, the variable that controls the dialog box moving with the player is named donkeykongismyfavoritemarvelsuperhero. This variable was referenced in the first 10th Anniversary livestream by the line "My Favorite M**vel Superhero's D**key Kong!" in a remixed version of the Wrong Number Song.
There are alternate file names for some sounds and music in the game's code, in the format music/*.ogg, from the phase of development where the game used GameMaker 8 and played external sounds and music through an extension. When the game was migrated to use GameMaker: Studio, it was changed to use GameMaker's native sound system for that instead. So to not change already existing code using the sound extension, compatibility scripts were made, one being caster_load, which converts the filenames that were originally used to pointers to GameMaker sounds by calling scr_getmusindex.
As with the demo, music/sound files have some metadata. The ENCODER field seems to be always overwritten by GameMaker: Studio, but there's still some information from FL Studio's LAME encoder.
(all OGG files, v1.08)
Name
encoder
(all OGG files, v1.11)
Name
encoder
(all WAV files, v1.08)
Name
ISFT
abc_123_a.ogg (v1.001+)
Name
encoded_by
TBPM
date
snd_ballchime.ogg
Name
encoded_by
TBPM
date
mus_computer.ogg
Name
SOFTWARE
mus_wrongworld.ogg ("Wrong Enemy ?!")
Name
encoded_by
TBPM
date
mus_mysteriousroom2.ogg ("Premonition")
Name
ENCODED BY
BPM (BEATS PER MINUTE)
DATE
mus_express_myself.ogg ("Last Goodbye")
Name
encoded_by
TBPM
date
snd_hit, snd_victor
Name
IART
ICRD
INAM
snd_spearappear
Name
ICRD
snd_wrongvictory
Name
ICRD
The "Snoopy, Come Home" metadata refers to the fact that both snd_hit and snd_victor are sampled from the song "Snoopy, Come Home", which is the title song for the 1972 movie with the same name. Toby seemingly took the song from an online rip of the original vinyl, without changing the metadata.
Mettaton EX has an "essay" question where you can type in text and have him comment on it. Under normal circumstances, typing "x" or "z" ends the essay; despite this, Mettaton has comments defined for several words which contain these letters:
sexy
foxy
tantaliz (covers both "tantalizing" and "tantalize")
It is in fact possible to type these, but it requires holding down the corresponding alternate key (Enter for Z and Shift for X) before typing the letters, making it unlikely that a casual player would do this. The console ports of the game make these words much easier to type, as they use an on-screen keyboard.