Undertale, the critically acclaimed indie RPG, has captivated players with its engaging storyline, memorable characters, and unique gameplay mechanics. One of the most distinctive aspects of Undertale is its boss battles, which deviate from traditional turn-based combat. In this blog post, we'll dive into the script behind Undertale's boss battles, exploring the code that brings these encounters to life.
START Battle Load BossData (HP, Attack, Defense, Name, Dialog) PlayerTurn = TRUELOOP while (Boss.HP > 0 AND Player.HP > 0): IF PlayerTurn: Display "ACT", "FIGHT", "ITEM", "MERCY" HandlePlayerChoice() ApplyEffects() PlayerTurn = FALSE ELSE: ChooseBossAttack() StartBulletPattern() ApplyDamageToPlayer() PlayerTurn = TRUE END LOOP
IF Player.HP <= 0: GameOver() ELSE: SpareOrKillCheck() END
[Scene: A dark room. Sans is lounging against a wall.]
Player: [Approach Sans]
Sans: What's up? You're not from around here, are you?
[Battle begins]
Sans: Alright, you wanna fight? I'll give you a show.
[Player's turn]
Choose:
1. Fight
2. Spare
3. Act friendly
[Based on player's choice, the outcome changes]
if global.flags["toriel_spared"] and global.flags["undyne_spared"]: asgore.dialogue = "You remind me of someone I loved." asgore.attack_power -= 2
And for the Genocide Route, the boss scripts must detect global.kill_count >= area_threshold. For example, Sans’s final judgment script:
if global.kill_count >= 20 and global.area == "Last Corridor":
sans.prepare_battle()
sans.dialogue = "you've been busy, huh?"
global.genocide_sans_trigger = True
[Scene Setup: The player has entered Papyrus's lair. The room is somewhat Spartan, with bones scattered around. Papyrus, a skeleton with a enthusiastic demeanor, greets the player.] Undertale Boss Battles Script
Papyrus: OH! YOU'RE IN MY LAIR! I wasn’t expecting anyone to, uh, come in here and stuff. I guess I should… get this over with!
[Music: FIGHT! (Papyrus) starts playing.]
Papyrus: I’LL FIGHT YOU! pumps fist I’VE BEEN PRACTICING MY FIGHTING SKILLS! cracks knuckles YOU WON'T BE GOING ANYWHERE! Undertale Boss Battles Script: A Look into the
function fight() let baseDamage = 10 + (player.lv * 4); let defenseFactor = boss.defense / 10; let damage = Math.floor(baseDamage / defenseFactor);// Random variation ±2 damage += Math.floor(Math.random() * 5) - 2; boss.hp -= Math.max(1, damage);
showText(
* You attack. $damage damage.);
// Sans special: if you attack, he dodges. if (boss.name === "Sans") damage = 0;Script Example [Scene: A dark room