Table of Contents
Anti-cheat
Throughout the series, anti-cheat has gone and went 2(?) times. This page will cover both.
Originals
During the original series run, anti-cheat was largely not present, until the release of Catto Boi: The Quest for the Frozen Tuna.
The game included an anti-cheat script (under the name of scr_AntiCheat). Below is the code of that script.
function scr_AntiCheat()
{
if (global.Score > 30000)
{
global.canMove = false;
audio_stop_all();
widget_set_owner(string(int64(window_handle())));
widget_set_caption("fuckwit.");
show_message("hey there.");
show_message("you hacked this game to get an impossibly high score, didn't you?");
show_message("I'm not stupid " + global.Username + ". I can clearly see the score counter at the top left");
show_message("it says " + string(global.Score) + ". that amount is ridiculous.");
show_message("you must be really sad if you're hacking a simple game like this to get an impossible score... haha");
show_message("I wonder what else you hacked?");
if (global.Lives > 9)
{
show_message("jeez. " + string(global.Lives) + " lives is a lot. 9 was already too much, why did you have to go and add more?");
}
show_message("is " + global.levelName + " the correct name of the current level still?");
show_message("who knows...");
show_message("I really don't think you deserve to play this game again anyway, so now you won't be able to");
show_message("let this be a lesson for you when cheating in video games.");
window_set_visible_w(false);
instance_create_depth(x, y, depth, obj_666);
scr_writePostBadEnd(true);
scr_LockedForever();
}
}
The script executes when the obj_ToLoadScreen (responsible for setting level variables, fading out to the loading screen, etc) collides with the player (obj_Player) object.
// gml_Object_obj_ToLoadScreen_Collision_obj_Player
mask_index = spr_empty;
scr_AntiCheat();
instance_create_depth(x, y, depth, obj_FadeOut);
global.canMove = false;
alarm[0] = 10;
if (global.Level == 1)
{
...
} ...
This script was exclusive to this game; no games after Frozen Tuna included it, probably because its inclusion made no sense in a single player game. The script stayed in the game for the rest of the original series; no update was ever implemented to remove it. It can be easily removed by using UndertaleModTool.
Remakes
The remakes did not include an anti-cheat script embedded in the game itself; rather the save was encrypted by the Utils.dll extension.
On August 20th, 2025, the Utils.dll extension was superseded and replaced by the Cat.dll extension, and on top of that, save encryption was removed. All the games (besides Forever (?)) received the update and a devlog detailing the change. Below is a table of what version numbers for each game correspond to the update.
| Utils removal version number | |
|---|---|
| CTA 1 | 2.0.0.16 |
| CTA 2 | 2.0.0.11 |
| CTA 3 | 2.0.1.5 |
| CTA 4 | 2.0.0.14 |
| CTA 5 | 2.0.0.8 |