Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
Welcome to Another RPG Engine, an RPG engine made in Twine. This engine is designed for deterministic multi-character battles, like you might see in RPG Maker or Japanese-style RPGs. I created a simple game with this engine called <i><a href="http://ifdb.tads.org/viewgame?id=3tr86wsqcmmoq8yk" target="_blank">Cartoon Battle</a></i> that I encourage you to try. I may make more complex games using this engine in the future!
The source code will show you how it all works, and it's relatively straightforward to plug in more content through the database passages. Twine 2's commenting system and general organization is pretty messy, though, so I've included this tutorial to provide more detailed information on anything you might be confused by.
Discuss the game on Reddit <a href="https://www.reddit.com/r/twinegames/comments/9magje/rpg_engine_and_example_game_feedback_wanted/" target="_blank">here</a>
Download the source code <a href="http://www.setschoolmw.com/twine/rpgengine/rpgengine.zip">here</a> (direct download link)
You can try out an example battle by [[clicking here|Preparation][$scenario = "gf1"]]. You'll be up against the Mystery Twins from <i>Cartoon Battle</i>. You can check out the [[Party Picker]] if you'd like to change your puppets.
Current difficulty: <<print $difficulty>>
You can test difficulty modes through this toggle:
[[Hard|Start][$difficulty = "hard"]]: smart targeting will only target vulnerable characters
[[Medium|Start][$difficulty = "medium"]]: smart targeting will preferentially target vulnerable characters, but other targets can be considered
[[Easy|Start][$difficulty = "easy"]]: disables smart targeting<<specialcheck>>
<<victorycheck>>
<span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<include commands>>
<br/>
<<if Story.title == 'Another RPG Engine'>>
<br/>
<br/>
[[Quit and return to the landing|Start][$inbattle = false]]
<</if>>
</span><div class="commandcontainer">
<<for _i, _puppet range $puppets>>
<div class="commands">
<<if _puppet.dead is true>>
/* If puppet is defeated, display no commands. */
<<elseif _puppet.stunned is true>>
<div class="noact">
Stunned!
</div>
<<elseif _puppet.petrified is true>>
<div class="noact">
Petrified!
</div>
<<elseif _puppet.asleep is true>>
<div class="noact">
Asleep!
</div>
<<elseif _puppet.isDone is true>>
<div class="noact">
Done!
</div>
<<else>>
<<act `[$puppets[_i],"$puppets["+_i+"]"]`>><br />
<<rest `[$puppets[_i],"$puppets["+_i+"]"]`>><br />
<<items `[$puppets[_i],"$puppets["+_i+"]"]`>><br />
<<if $B.surrender is true>>
<<spare `[$puppets[_i],"$puppets["+_i+"]"]`>><br/>
<</if>>
<</if>>
</div>
<</for>>
</div>
<br/>
<center><span class="battlebtn"><<button "end turn" "end of round">><<set $B.turn = "enemy">><</button>></span></center><<widget "victorymessage">>
<<set _m = random(1,4)>>
<<switch _m>>
<<case 1>>
You win!
<<case 2>>
Victory!
<<case 3>>
You've won!
<<case 4>>
You are victorious! /* this is a reference to an old game, cookies if you recognize it */
<</switch>>
<</widget>>
<<widget "backbtn">>
<span class="btn back right">[[Back|Battle!][$B.targeting = null; $action = null; $B.instant = false; $target = [null,null]; $removed_effects = [];]]</span>
<</widget>>
<<widget "act">>
<<if _puppet.down is true>>
<<if $args[0][0].en >= $struggleCost>>
[[Struggle|confirm phase][$subject = $args[0]; $action = {name: "struggle", cost: $struggleCost}; $target = [null,null] ]]
<<else>>
<b>Exhausted!</b>
<</if>>
<<else>>
[[Act|actions][$subject = $args[0]]]
<</if>>
<</widget>>
<<widget "rest">>
[[Rest|confirm phase][$subject = $args[0]; $action = {name: "rest", cost: 0}; $target = [null,null] ]]
<</widget>>
<<widget "items">>
<<if $B.embargo is true>>
<span class="embargo">
Nope!
</span>
<<else>>
[[Item|items][$subject = $args[0]]]
<</if>>
<</widget>>
<<widget "spare">>[[Spare|confirm phase][$subject = $args[0]; $action = {name: "spare", cost: 0}]]<</widget>>
<<widget "victorycheck">>
<<set _victory to 0>>
<<set _defeat to 0>>
<<for _enemy range $enemies>>
<<if _enemy.dead>>
<<set _victory++>>
<</if>>
<</for>>
<<if _victory eq $enemies.length>>
<<goto "Victory">>
<</if>>
<<for _puppet range $puppets>>
<<if _puppet.dead>>
<<set _defeat++>>
<</if>>
<</for>>
<<if _defeat eq $puppets.length>>
<<goto "Defeat">>
<</if>>
<</widget>>
<<widget "removeEffect">>
/* DEPRECIATED as of v0.91. Use Actor.removeEffect instead. */
<<set _actor = $args[0]>>
<<set _effect = $args[1]>>
<<if _actor.stasis is false or $args.includes("pierce")>>
<<set _effect.duration = 0>>
<<effectmanager _actor>>
<</if>>
<</widget>>
<<widget "check">>
<<print '<<if '+$args[0]+' < 0>>\n
<<set '+$args[0]+' to 0>>\n
<</if>>'>>
<</widget>>
<<widget "chain">>
<<for _i, _a range $args>>
<<if def $args[_i] and $args[_i] isnot null and $args[_i][1] isnot null>>
<<set $args[_i][0] = State.getVar($args[_i][1])>>
<</if>>
<</for>>
<</widget>>
<<widget "endofbattle">>
<<set $inbattle to false>>
<<set $subject = [null,null]>>
<<set $target = [null,null]>>
<<unset $actor>>
<<refreshPuppets>>
<<setInv>>
<</widget>>
<<widget "find">>
/* args0 is target array, args1 is attribute, args2 is key value */
/* Note that if your key is a string, it must be in quotes in the final code, which means you must send it to the widget with an extra pair of literal quotes (preceeded by the escape slash) */
<<print '<<set _pos = '+$args[0]+'.map(function(x) { return(x.'+$args[1]+') }).indexOf('+$args[2]+')>>'>>
<</widget>><<set _class = "actors enemies">>
<<if $scenario is "su1">>
<<set _class += " reverse">>
<</if>>
<div @class="_class" id="enemies">
<<for _i, _enemy range $enemies>>
/* Some enemies have special name displays */
<<if def _enemy.fullname>>
<<set _name = _enemy.fullname>>
<<else>>
<<set _name = _enemy.name>>
<</if>>
<<if _enemy.boss is true>>
<<set _class = "actor full">>
<<else>>
<<set _class = "actor">>
<</if>>
<div class="actor">
<<if _enemy.dead is true>>
<font color="gray">_name</font><br/>
<br />
<<else>>
<<if ($B.targeting == "enemy" or $B.targeting == "all") and not _enemy.untargetable and not _enemy.protected>>
<<capture _i>>
[[_name|confirm phase][$target = [$enemies[_i],"$enemies["+_i+"]"]; $B.targeting = null]]
<</capture>>
<<else>>
<span class="actorname">_name</span>
<</if>>
<<capture _i>><<status `[$enemies[_i],"$enemies["+_i+"]"]`>><</capture>>
<br />
HP: _enemy.hp<<if _enemy.healing>> / _enemy.maxhp<</if>>
<</if>>
</div>
<</for>>
</div>
<<if def $C.gum2 and $C.gum2.shemad is true>><center><i>"...to <b>KILL YOU!</b>"</i></center><<run $enemies[0].addEffect("Frenzy",3,20)>><<set $C.gum2.shemad to null>><br/><</if>>
<br/>
/* puppets */
<div class="actors" id="puppets">
<<for _i, _puppet range $puppets>>
<div class="actor">
<<if _puppet.dead is true>>
<font color="gray">_puppet.name</font><br/>
<br/>
<br/>
<<else>>
<<if ($B.targeting == "ally" or $B.targeting == "all") and !($subject[0].name == _puppet.name and def $B.selftargeting)>>
<<capture _i>>
[[_puppet.name|confirm phase][$target = [$puppets[_i],"$puppets["+_i+"]"]; $B.targeting = null]]
<</capture>>
<<else>>
<span class="actorname">_puppet.name</span>
<</if>>
<<capture _i>><<status `[$puppets[_i],"$puppets["+_i+"]"]`>><</capture>>
<br />
HP: _puppet.hp<br />
EN: _puppet.en / 10
<</if>>
</div>
<</for>>
</div><<if def $actor and $actor[0] isnot null>>
<div class="statusname">$actor[0].name</div>
<div style="float: right;">
<<link "<">>
<<set $stScreen-->>
<<if $stScreen < 1>>
<<set $stScreen = 2>>
<</if>>
<<replace "#status">><<include "status">><</replace>>
<</link>>
<<link ">">>
<<set $stScreen++>>
<<if $stScreen > 2>>
<<set $stScreen = 1>>
<</if>>
<<replace "#status">><<include "status">><</replace>>
<</link>>
</div>
<br/>
<<if $stScreen == 1>>
<<for _k, _v range $actor[0].stats>>
<span class="statname"><<print _k>>:</span>
<<stat _k>>
<br/>
<</for>>
<<elseif $stScreen == 2>>
<div style="font-size: 12px;">AILMENT TOLERANCE</div><br/>
<<for _k, _v range $actor[0].tolerances>>
<<print _k>>
<<tol _v>>
<br/>
<</for>>
<</if>>
<br/>
<<effectinfo>>
<</if>><span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<backbtn>><br/><br/>
<<actionlist $subject[0]>>
</span><span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<backbtn>>
<<itemlist>>
</span><span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<backbtn>>
Select a target.
</span>
<<if $B.targeting == "enemy">>
<<find "$enemies" "martyr" "true">>
<<if _pos > -1>>
<<set $target = [$enemies[_pos],"$enemies["+_pos+"]"]>>
<<set $B.targeting to null>>
<<goto "confirm phase">>
<</if>>
<</if>><span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<backbtn>>
$subject[0].name will
<<if $action.name is "rest">>
<b>rest</b> this turn.
<<elseif $action.name is "struggle">>
spend $struggleCost Energy to get back on their feet.
<<elseif $action.item is true>>
use <<switch $action.name.first().toLowerCase()>><<case 'a' 'e' 'i' 'o' 'u'>>an<<default>>a<</switch>> $action.name.
<<elseif $action.name is "spare">>
accept the enemy's surrender.
<<else>>
use <b>$action.name</b><<if $target[0] isnot null>> on <b>$target[0].name</b><</if>>.
<</if>>
[[Confirm?|action phase]]<br />
<span class="preview">
<<if $action.preview instanceof Function>>
<<print $action.preview()>>
<<else>>
<<print $action.preview>>
<</if>>
</span>
</span><span id="content">
<<if $action.name == "spare">>
<<run $target[0].surrender()>>
<</if>>
<<include "action effects">>
/* Variable cleanup. Due to the way goto works, this will work even for invisible actions. */
<<set $element to null>>
/* If target was an enemy (i.e. an attacking skill was used), subject is marked as attacker. (This is for enemies that target the last puppet to attack them.) */
<<if $target[0] instanceof Enemy>>
<<set $attacker = $puppets.indexOf($subject[0])>>
<</if>>
/* If action was an item, decrement item stock and reset item flag */
<<if $action.item == true>>
<<set _n = `'${State.variables.action.name}'`>>
<<find "$inv" "name" _n>>
<<if _pos > -1>>
<<set $inv[_pos].stock -= 1>>
<<else>>
<<print "ERROR: Item not found in inventory\n">>
<</if>>
<</if>>
/* isDone logic; checks for confounding factors */
<<if $B.instant is true>>
<<set $B.instant to false>>
<<elseif $subject[0].inspired is true>>
<<set $subject[0].inspired to false>>
<<else>>
<<set $subject[0].isDone to true>>
<</if>>
/* Subtract action cost */
<<if $action.name isnot "Focus">>
<<set $subject[0].en -= $action.cost>>
<</if>>
/* Archer's mark attacks */
<<markAttack>>
<<if $B.surrender && def $action.name>>
<<run $enemy_to_spare.surrenderCheck()>>
<</if>>
<br/>
<center><span class="btn">[[Continue...|Battle!]]</span></center>
</span><<nobr>>
<<switch $scenario>>
<<case "at1">>
<<goto "AT1 win">>
<<case "gf1">>
<<goto "GF1 win">>
<<case "gum1">>
<<goto "GUM1 win">>
<<case "su1">>
<<goto "SU1 win">>
<<case "gf2">>
<<goto "GF2 win">>
<<case "gum2">>
<<goto "GUM2 win">>
<<case "su2">>
<<goto "SU2 win">>
<</switch>>
<<endofbattle>>
<</nobr>>You win!
[[Return to hub|Hub][$enemies = null]]All your puppets were defeated! Without them, you can't battle. You'll have to try again.
>[[Retry this battle|Preparation]]
>[[Return to the hub with your shame|Hub]]
<<endofbattle>><span id="content">
<<for _enemy range $enemies>>
<<if !_enemy.dead && _enemy.deathMessage == "special">>
<<if _enemy.name is "Marceline">>
<<include "Marceline Defeat">>
<<elseif _enemy.name is "Nicole">>
<<include "Nicole Defeat">>
<<elseif _enemy.name is "Rose" && $B.stage == 1>>
<<include "Rose stage 2">>
<<elseif _enemy.name is "Rose" && $B.stage == 2>>
<<include "Rose stage 3">>
<</if>>
<<break>>
<</if>>
<</for>>
</span><span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<backbtn>>
<<if isNaN($action.cost)>>
You need to input a number.<br/>
<<elseif $action.cost < $B.mincost>>
Spell requires at least $B.mincost Energy.<br/>
<<elseif $subject[0].en < $action.cost>>
Not enough Energy!<br/>
<</if>>
How much Energy do you want to put into $action.name? (Minimum $B.mincost)<br />
<<textbox "$action.cost" $B.mincost "spell check" autofocus>><br/>
(Press Enter to confirm.)<br/>
</span><<run $action.cost *= 1>>
<<if ($action.cost < $B.mincost) or ($subject[0].en < $action.cost) or isNaN($action.cost)>>
<<goto "spell phase">>
<<else>>
<<run $action.spellMod()>>
<<if $action.phase != "confirm phase">>
<<set $B.targeting = $action.target>>
<<goto "targeting phase">>
<<else>>
<<print '<<goto \"'+$action.phase+'\">>'>>
<</if>>
<</if>>/* Widget for display of player actions. */
/* Sacrifice's HP cost is set in StoryInit. Currently it is 50. */
//actions
/* Individual action widgets take cost, damage multiplier, and other relevant variables as arguments so they can be displayed in the description. Values are given in "Database: Actions". */
/* Self-targetting and AoE abilities must set target to null to make certain other things line up. */
<<widget "actionlist">>
<<set _char = $args[0]>>
<<for _action range _char.actions>>
<b><<if $args[0].en < _action.cost or $tutorial is true or (_action.name is "Sacrifice" and $SacrificeUsed is true)>>
/* If insufficient energy, just display the action name (no link). */
_action.name
<<elseif $args[0].dizzy is true and _action.basic isnot true>>
/* If dizzy and action not basic, display the name as crossed out followed by a gray "Dizzy!" message. */
<del>_action.name</del> <span class="dizzy">Dizzy!</span>
<<elseif $args[0].hp <= _action.hpcost>>
/* If puppet has insufficient HP for an HP-consuming skill, the name is crossed out. */
<del>_action.name</del> Not enough HP!
<<else>>
<<capture _action>>
<<link "_action.name">>
<<set $action = clone(_action)>>
<<set $B.targeting = _action.target>>
<<set $B.selftargeting = _action.self>>
<<set $B.instant = _action.instant>>
<<if _action.phase is "confirm phase">>
<<set $target = [null,null]>>
<<set $B.targeting = null>>
<<elseif _action.phase is "spell phase">>
<<set $B.mincost = _action.cost>>
<<set $B.targeting = null>>
<</if>>
<<print '<<goto "'+_action.phase+'">>'>>
<</link>>
<</capture>>
<</if>>
</b> <<if _action.name isnot "Procure">>(<<print _action.cost>><<if _action.phase is "spell phase">>+<</if>>)<</if>><<if _action.instant>><span class="right">[Instant] </span><</if>> <<if _action.basic>><span class="right">[Basic] </span><</if>><br />
<div><<print _action.info>></div>
<div class="actdesc"><<print _action.desc>></div>
<br/>
<</for>>
<</widget>><span id="status">
<<include status>>
</span>
<span id="content">
<<include actorlist>>
<<if $B.turn eq "player">>
/* If the turn reads "player", it's because the enemy round just finished. Run end of turn for enemies. */
<<endofround $enemies>>
<<newturn>>
<<if _message>>
[[(Continue...)|Battle!]]
<<else>>
<<goto "Battle!">>
<</if>>
<<elseif $B.turn eq "enemy">>
/* If the turn reads "enemy", the player turn just finished. Run end of turn for player. */
<<endofround $puppets>>
<<if _message>>
[[(Continue...)|enemy phase]]
<<else>>
<<goto "enemy phase">>
<</if>>
<</if>>
</span>/* Not currently implemented; too complex. Preserved for posterity. */
<<if $effects_to_remove <= 0>>
<<set $ready to true>>
<<goto "confirm phase">>
<</if>>
<span id="status">
<<include status>>
</span>
<span id="content">
<<backbtn>>
<<switch $action.name>>
<<case "Restoration">>
<<if $target[0].effects.length = 0>>
<<print $target[0].name+" has no effects! Go back.\n">>
<<else>>
<<set _count to 0>>
<<print $target[0].name+"\'s ailments:\n">>
<<for _i, _effect range $target[0].effects>>
<<if _effect.buff is false>>
<<capture _i>>
[[_effect.name|neutralize phase][$removed_effects.push(_i); $effects_to_remove -= 1]]
<</capture>>
<<else>>
<<set _count++>>
<</if>>
<</for>>
<<if _count eq $target[0].effects.length>>
<<print "...None! Go back.">>
<</if>>
<</if>>
<<case "Neutralize">>
<<if $target[0].effects.length = 0>>
<<print $target[0].name+" has no effects! Go back.\n">>
<<else>>
<<set _count to 0>>
<<print $target[0].name+"\'s buffs:\n">>
<<for _i, _effect range $target[0].effects>>
<<if _effect.buff is true>>
<<capture _i>>
[[_effect.name|neutralize phase][$removed_effects.push(_i); $effects_to_remove -= 1]]
<</capture>>
<<if _i < $target[0].effects.length>>
<<print ", ">>
<</if>>
<<else>>
<<set _count++>>
<</if>>
<</for>>
<<if _count eq $target[0].effects.length>>
<<print "...None! Go back.">>
<</if>>
<</if>>
<</switch>>
</span>/* Widgets for use and display of items. For item data, see the item database JavaScript file. */
/* Set Inventory: sets initial inventory items and stock. Run in StoryInit. */
<<widget "setInv">>
<<set $inv = [
new Item("Antidote",5),
new Item("Fire Extinguisher",5),
new Item("Canned Air",5),
new Item("Healing Crystal",5),
new Item("Nanites",5),
new Item("Painkiller",5),
new Item("Asprin",5),
new Item("Panacea",1),
new Item("Bottled Chi",3),
new Item("Stimulant",3),
new Item("Adrenaline",2),
new Item("Stoneskin",2),
new Item("Nootropic",2),
new Item("Throwing Knife",5),
new Item("Grenade",1),
new Item("Flamethrower",1),
new Item("Gas Bomb",1),
new Item("Calamity Bomb",1),
new Item("Flashbang",1)
]>>
<</widget>>
/* Restock: sets starting inventory values for each battle. */
/* Depreciated in Cartoon Battle; setInv is used instead. */
<<widget "restock">>
<<for _item range $inv>>
<<switch _item.name>>
<<case "Antidote" "Fire Extinguisher" "Canned Air" "Healing Crystal" "Nanites" "Painkiller" "Asprin">>
<<set _item.stock = 2>>
<<case "Panacea">>
<<set _item.stock = 1>>
<<case "Bottled Chi">>
<<set _item.stock = 1>>
<<case "Adrenaline" "Stoneskin" "Nootropic">>
<<set _item.stock = 1>>
<<case "Stimulant">>
<<set _item.stock = 2>>
<<case "Throwing Knife">>
<<set _item.stock = 2>>
<<case "Grenade">>
<<set _item.stock = 1>>
<<case "Flamethrower" "Gas Bomb" "Calamity Bomb" "Flashbang">>
<<set _item.stock = 0>>
<</switch>>
<<for>>
<</widget>>
<<widget "itemlist">>
<<for _item range $inv>>
<<if _item.usable == 0 || _item.usable == 1>>
<b>
<<if _item.stock > 0 and $tutorial isnot true>>
<<capture _item>>
<<link _item.name>>
<<set $action = clone(_item.action)>>
<<set $B.targeting = $action.target>>
<<set $B.selftargeting = $action.self>>
<<set $B.instant = $action.instant>>
<<if $action.phase is "confirm phase">>
<<set $target = [null,null]>>
<<set $B.targeting = null>>
<</if>>
<<print '<<goto "'+$action.phase+'">>'>>
<</link>>
<</capture>>
<<else>>
_item.name
<</if>>
</b>
(Stock: _item.stock)<br/>
<<print _item.info>><br/>
<span class="actdesc"><<print _item.desc>></span><br/>
<br/>
<</if>>
<</for>>
<</widget>>
<<widget "addItem">>
<<if $args.length < 1>>
ERROR: No item name passed to addItem<br/>
<<else>>
<<set _n = `'${State.variables.args[0]}'`;
<<find "$inv" "name" _n>>
<<if _pos > -1>>
<<run $inv[_pos].stock++>>
<<else>>
<<run $inv.push(new Item(name))>>
<</if>>
<</if>>
<</widget>>/* Old passage for the "Procure" skill, which allowed Rogue and Witch to expend Energy to buy items in battle. It was dummied out before the JavaScript overhaul, so it is unlikely to work in the current version without tweaking.
/* Procure costs use the "cost" attribute of Item objects, defined in the database JS. */
<<set $target = [null,null]>>
<span id="content">
<<backbtn>>
<<for _key, _item range $inv>>
<b>
<<if $subject[0].en >= _item.cost>>
<<capture _key, _item>>
<<set _linktext = "Procure "+_key>>
[[_linktext|confirm phase][$item_to_procure = _key; $action.cost = _item.cost]]
<</capture>>
<<else>>
<del>_key</del>
<</if>>
</b>
(Cost: <<print _item.cost>>)<br/>
<</for>>
</span>/* This passage allows you to define encounters -- that is, unique parties of enemies. To define individual enemies and characters, see the database JS files. */
<<widget "call">>
/* The order characters are added to the array matters: they are displayed in that order from left to right when the stat blocks instantiate. */
<<switch $args[0]>>
<<case "tutorial">>
/* Dummy enemies for the tutorial. */
<<set $enemies to [new Enemy(), new Enemy(), new Enemy()]>>
<<run $enemies[0].addEffect(new Effect("Stunned",1,0))>>
<<run $enemies[1].addEffect(new Effect("Pain",3,10))>>
<<run $enemies[2].addEffect(new Effect("SPC Boost",3,10))>>
<<case "at1">>
/* Currently Bubblegum's name is too long and makes her box wider than normal. That's fitting though, maybe I should let it stay. */
<<set $enemies to [new Enemy("Jake"), new Enemy("Princess Bubblegum"), new Enemy("Finn")]>>
<<case "gf1">>
<<set $enemies to [new Enemy("Dipper"), new Enemy("Mabel")]>>
<<case "gum1">>
<<set $enemies to [new Enemy("Gumball"), new Enemy("Anais"), new Enemy("Darwin")]>>
<<set $B.anais_trap = false>>
<<case "su1">>
<<set $enemies to [new Enemy("Pearl"), new Enemy("Garnet"), new Enemy("Amethyst"), new Enemy("Steven")]>>
<<set $B.bully = true>>
<<case "at2">>
<<set $enemies to [new Enemy("Marceline")]>>
<<case "gf2">>
<<set $enemies to [new Enemy("Bill")]>>
<<case "gum2">>
<<set $enemies to [new Enemy("Nicole")]>>
<<case "su2">>
<<set $enemies to [new Enemy("Rose")]>>
<<set $B.stage = 1>>
<<default>>
/* Dummy enemy so the format doesn't break. */
<<set $enemies to [new Enemy("bad call",1,0,0,0,'X')]>>
<</switch>>
<</widget>><span id="status">
<<include status>>
</span>
<span id="content">
<<for _e, _enemy range $enemies>>
<<if !_enemy.dead>>
<<set $subject = [$enemies[_e],"$enemies["+_e+"]"]>>
<<set $target = [null,null]>>
<<for _k, _effect range _enemy.effects>>
<<if _effect.topDec>>
<<run _enemy.removeEffect(_k,'pierce')>>
<</if>>
<</for>>
<<if _enemy.stunned>>
<<set $action = {useText: null,
actText: "_enemy.name is stunned!",
act: null}>>
<<run _enemy.decCD()>>
<<elseif _enemy.down>>
<<set $action = {useText: null,
actText: "_enemy.name struggles back to _enemy.their feet.",
act: null}>>
<<for _k, _effect range _enemy.effects>>
<<if _effect.name is "Knocked Down">>
<<run _enemy.removeEffect(_k,'pierce')>>
<</if>>
<</for>>
<<else>>
<<run _enemy.decCD()>>
<<set $action = null>>
<<run _enemy.actions()>>
<</if>>
<<include "action effects">><br/>
<<hunterCheck>>
<</if>>
<</for>>
<center><span class="btn">[[Continue...|end of round][$B.turn = "player"]]</span></center>
</span>/* Handles effect applications. */
<<widget "addeffect">>
/* Sets power for relevant effects and avoids duplicating an effect if it's already in the array. */
/* args0 is target, args1 is effect name, args2 is duration, args3 is inflictor (where applicable). If you want the power to be a flat value, pass a number instead and it will be used as an override. */
<<set _target = $args[0]>> /* for clarity */
<<set _subject = $args[3]>>
<<if _target.dead isnot true>>
/* No point in applying effect if target defeated. */
/* Create a temporary effect object with only the name. This gives us access to flags such as buff and statmod. */
<<set _E = new Effect($args[1])>>
<<set _found to false>>
<<set _continue to true>>
<<set _msg to false>>
<<if _E.unblockable isnot true>>
<<if _target.stasis is true>>
<<set _continue to false>>
<</if>>
<<if _continue is true and _target.chi is true and _target != _subject>>
/* self-inflicted statuses ignore Chi Shield */
<<if _E.buff>>
/* If applied effect is a buff, all is well, skip ahead */
<<set _continue to true>>
<<else>>
_target.name's Chi Shield protected _target.them from the ailment.
<<set _continue to false>>
<</if>>
<<elseif _continue is true and _target.roseshield is true>>
<<if _E.dot>>
Rose's shield protected her from the ailment.
<<set _continue to false>>
<</if>>
<</if>>
<</if>> /* end unblockable effect if */
<<if _continue is true and (_target.tolerances.has(_E.name) || (_E.name == "Forsaken" && _target.tolerances.has("Curse")))>>
<<if _target.getTol(_E.name) == 'immune'>>
_target.name is immune to _E.name.
<<set _continue to false>>
<<else>>
<<if _target.getTol(_E.name) > 0>>
_target.name's tolerance to _E.name was weakened.
<<set _continue to false>>
<<run _target.decTol(_E.name)>>
<<else>>
<<set _continue to true>>
<<run _target.resetTol(_E.name)>>
<</if>>
<</if>>
<</if>>
<<if _continue is true>>
/* First, calculate effect power. */
/* debuff effects are calculated on first application (do not change if target SPC changes) */
<<if $args[3] instanceof Number>>
<<set $power = $args[3]>>
<<else>>
<<if _E.statmod and _E.name isnot "Knocked Down">>
<<if _E.buff is false>>
<<effectcalc "debuff">>
<<else>>
<<effectcalc "buff">>
<</if>>
/* DoT damage is calculated every time it activates, so only attacker's side is applied to effect power here. */
<<elseif _E.dot>>
<<set $power = [_subject.get("Special"),$action.effweight]>>
<<elseif _E.name == "Thorns">>
<<set $power = Math.round(($base+_subject.get("Special"))*_E.weight)>>
/* Everything else has no numerical component, but we'll set power to a number to prevent possible glitches. */
<<else>>
<<set $power = 0>>
<</if>>
<</if>>
/* Then check for stackable effects. */
<<if _E.stackable>>
<<print _target.addEffect(new Effect(_E.name,$args[2],$power))>>
<<elseif _E.exclusive>>
<<for _j, _effect range _target.effects>>
/* remove all stance effects */
<<if _effect.exclusive>>
<<run _target.removeEffect(_j,'pierce')>>
<</if>>
<</for>>
<<if _E.name is "Protector">>
<<print _target.addEffect(new Protector(_E.name,$args[2],$power,$target[1]))>>
<<set $target[0].protected to true>>
<<set _p = "\'"+_target.name+"\'">> /* necessary to work with the find widget */
<<set $target[0].protectedBy = _p>>
<<else>>
<<if _E.name is "Martyr">>
<<if _target instanceof Puppet>>
<<set _party = $puppets>>
<<elseif _target instanceof Enemy>>
<<set _party = $enemies>>
<</if>>
<<find "_party" "martyr" "true">>
<<if _pos > -1>>
<<set _act = _party[_pos]>>
<<find "_act.effects" "name" "\'Martyr\'">>
<<run _act.removeEffect(_pos,'pierce')>>
<</if>>
<</if>>
<<print _target.addEffect(new Effect(_E.name,$args[2],$power))>>
<</if>>
/* Stunned gets a special case to check for Alert */
<<elseif _E.name is "Stunned">>
<<if _target.alert is false>>
<<print _target.addEffect(new Effect(_E.name,$args[2],$power))>>
<<else>>
_target.name saw it coming and wasn't stunned!
<</if>>
<<else>>
<<for _k, _effect range _target.effects>>
<<if _effect.name is _E.name>>
/* if effect is already applied, increase its duration */
<<if $args[2] > _effect.duration>>
<<set _effect.duration = $args[2]>>
<<print _effect.addText(_target.name)>>
<<set _msg = true>>
<</if>>
<<if _E.dot>>
<<set _E = new DoT(_E.name,$args[2],$power[0],$power[1])>>
<<if _effect.damage(_target) < _E.damage(_target)>>
<<set _effect.power to $power[0]>>
<<set _effect.weight to $power[1]>>
<<if !_msg>>
<<print _effect.addText(_target.name)>>
<<set _msg = true>>
<</if>>
<</if>>
<<else>>
<<if $power > _effect.power>>
/* if the new application has higher power than the original effect, overwrite original power */
<<run _effect.onRemove(_target); _effect.power = $power; _effect.onApply(_target)>>
<<if !_msg>>
<<print _effect.addText(_target.name)>>
<<set _msg = true>>
<</if>>
<</if>>
<</if>>
<<set _found to true>>
<<break>> /* Since the effect was found, we don't need to continue the loop. */
<</if>>
<</for>>
<<if _found is false>>
/* if the effect isn't there already, add it */
<<if _E.dot>>
<<print _target.addEffect(new DoT(_E.name,$args[2],$power[0],$power[1]))>>
<<elseif _E.name is "Off-Balance">>
/* if already knocked down, can't be off-balance */
<<if _target.down is false>>
<<print _target.addEffect(new Effect(_E.name,$args[2],$power))>>
<<else>>
_target.name would have been pushed off-balance, but they're already knocked down!
<</if>>
<<elseif _E.name is "Knocked Down">>
<<print _target.addEffect(new Effect(_E.name,$args[2],$power))>>
/* Being knocked down also removes off-balance: */
<<for _k, _effect range _target.effects>>
<<if _effect.name is "Off-Balance">>
<<run _target.removeEffect(_k)>>
<</if>>
<</for>>
<<else>>
<<print _target.addEffect(new Effect(_E.name,$args[2],$power))>>
<</if>>
<</if>>
<</if>>
<</if>>
<br/>
<</if>>
<</widget>><<set $B = {turn: "player", event: false, surrender: false, kills: [], specialdeath: 0}>>
<<setInv>>
<<if $scenario == "gf2">>
<<run inv().addItem("Smelling Salts",5)>>
<<run inv().addItem("Anti-Mineral Water",5)>>
<</if>>
<<call $scenario>>
<<refreshPuppets>>
<<set $inbattle to true>>
<<goto "Battle!">>/* A clean version of the spell check passage for if you want to add your own spells. */
<<run $action.cost *= 1>>
<<if ($action.cost < $B.mincost) or ($subject[0].en < $action.cost) or isNaN($action.cost)>>
<<goto "spell phase">>
<<else>>
<<switch $action.name>>
<<case "an action">>
<<if $action.cost < 10>>
/* normal effect */
<<else>>
<<set $action = "supercharge">>
/* supercharged effect */
<</if>>
<</switch>>
<<switch $action.name>>
<<case "mass action">>
<<goto "confirm phase">>
<<default>>
<<goto "targeting phase">>
<</switch>>
<</if>><<widget "endofround">>
<<for _actor range $args[0]>>
<<for _k, _effect range _actor.effects>>
/* DoT check */
<<if _effect.dot is true>>
<<set _message to true>>
<<set $dmg = _effect.damage(_actor)>>
<<print _effect.msg(_actor)>>
<br/>
<<run _actor.setHP(-$dmg)>>
<<set $target[0] = _actor>>
<<deathcheck>>
<</if>>
/* decrementor */
<<if !_effect.topDec>>
<<if _effect.duration >= 1 and !(_actor.stasis is true and _effect.name != "Stasis")>>
<<set _effect.duration -= 1>>
<</if>>
<<if _effect.duration == 0>>
<<set _m = _actor.removeEffect(_k,'pierce')>>
<<if _m.length > 0>>
<<print _m>>
<<set _message to true>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<</widget>>/* Determines effects to be removed by Neutralize and Restoration. */
/* Because these actions are so similar, the same widget can be used for both. */
<<widget "neutralize">>
<<if $target[0].stasis isnot true>>
/* Stasis blocks any effect changes, so it blocks this too. */
<<set _effects to $target[0].effects>> /* This is done just so you don't have to write out the longer name */
<<for _i = (_effects.length-1); _i >= 0; _i-->>
/* Loop runs over the effects array starting from the END and working backwards. This is why we can't use a "range" loop, because that only goes forwards. */
<<if $effects_to_remove <= 0>>
<<break>>
/* The number of effects removed by Neutralize/Restoration varies depending on energy invested. If there are more effects than the spell can remove, we end the function here. Otherwise the spell would clear all effects regardless of strength! */
<</if>>
<<if $target[0] instanceof Puppet is true>>
<<if _effects[_i].buff isnot true and _effects[_i].sticky isnot true>>
/* Because there are fewer buffs than debuffs, a single "buff" flag is used to distinguish them. We only want Restoration to remove debuffs, so it will only trigger the removal code if the effect's buff flag is NOT true. */
/* You may also want some effects to be irremovable. This is the purpose of the "sticky" flag, which is set in the story JavaScript. */
<<run $removed_effects.push(_i)>>
/* This stores the index of the effect that will be removed. In the action phase, every effect keyed to the values in this array will be cleared. */
<<set $effects_to_remove -= 1>>
<</if>>
<<elseif $target[0] instanceof Enemy is true>>
<<if _effects[_i].buff is true and _effects[_i].sticky isnot true>>
<<run $removed_effects.push(_i)>>
<<set $effects_to_remove -= 1>>
<</if>>
<</if>>
<</for>>
<</if>>
<</widget>><<widget "damagecalc">>
<<set _w = $action.weight>>
/* Do we use Attack or Special? */
<<if $action.item is true>>
<<set _atk to $subject[0].get("Special")>>
<<else>>
<<set _atk to $subject[0].get("Attack")>>
<</if>>
/* Piercing? */
<<if $action.pierce is true>>
<<set _def to 0>>
<<else>>
<<set _def to $target[0].get("Defense")>>
<</if>>
/* Special formulas for specific actions */
<<switch $action.name>>
<<case "Exacerbate">>
<<for _effect range $target[0].effects>>
<<if _effect.buff isnot true>>
<<set _w += 0.25>>
<</if>>
<</for>>
<<case "Downfall">>
<<for _effect range $target[0].effects>>
<<if _effect.buff is true>>
<<set _w += 0.2>>
<</if>>
<</for>>
<</switch>>
/* base damage: */
<<switch $formula>>
<<case "subtractive">>
<<set $dmg to (($base+$damper*_atk)*_w)-$damper*_def>>
<<case "bonfire">>
<<set $dmg to ($base+$damper*(_atk-_def))*_w>>
<<case "rpgmaker">>
<<set $dmg to (_atk*4-_def*2)*$damper*_w>>
<<case "divisive">>
<<set $dmg to ($base*(_atk/_def))*_w>>
<<default>>
/* add your own here! */
/* You can also make additional cases if you want a unique formula for an attack. Just remember to reset the $formula variable after so you don't get cross-over! */
<</switch>>
/* Find element factor, and multiply it to damage */
<<if def $action.element>>
<<set _factor = $target[0].elements.get($action.element)>>
<</if>>
<<if ndef _factor>>
<<set _factor = 1>>
<</if>>
<<set $dmg *= _factor>>
/* Element message */
<<if _factor > 1>>
<<set _elntmsg to "Super effective! ">>
<<elseif _factor < 1 and _factor > 0>>
<<set _elntmsg to "Not very effective... ">>
<<elseif _factor == 0>>
<<set _elntmsg to "No effect! ">>
<<elseif _factor < 0>>
<<set _elntmsg to "Absorbed! ">>
<</if>>
/* Miscellaneous factors */
<<if $subject[0].berserker is true>>
<<set $dmg *= (1+$berserk_factor)>>
<</if>>
<<if $target[0].berserker is true>>
<<set $dmg *= (1+$berserk_factor)>>
<</if>>
<<if $subject[0].defender is true>>
<<set $dmg *= $defend_factor>>
<</if>>
<<if $target[0].defender is true>>
<<set $dmg *= $defend_factor>>
<</if>>
<<if $target[0].shield is true>>
<<set $dmg *= (1-$SHIELD_FACTOR)>>
<</if>>
<<if $target[0].roseshield is true>>
<<set $dmg *= (1-$ROSE_SHIELD_FACTOR)>>
<</if>>
/* Round to integer and check against minimum */
<<set $dmg = Math.round($dmg)>>
<<if _factor < 0>>
/* do nothing */
<<elseif $dmg < $min_dmg>>
<<set $dmg = $min_dmg>>
<</if>>
<</widget>>
<<widget "echodamage">>
<<if $args[0] instanceof Actor>>
<<set $target[0] = $args[0]>>
<</if>>
<<if !$args.includes("nocalc")>>
<<damagecalc>>
<</if>>
<<if $target[0].dead is false>>
<<if $target[0].thorns is true>>
$target[0].name's thorny bubble pops like a balloon under your attack, leaving target().them unharmed!<br/>
<<find "$target[0].effects" "name" '\"Thorns\"'>>
<<set $dmg = $target[0].effects[_pos].power - subject().get("Defense")>>
$subject[0].name is pricked by the thorns, taking $dmg damage!<br/>
<<run subject().setHP(-$dmg)>>
<<deathcheck subject()>>
<<elseif $target[0].bubbled is true>>
$target[0].name's bubble pops like a balloon under your attack, leaving target().them unharmed!<br/>
<<for _k _effect range $target[0].effects>>
<<if _effect.name == "Bubble">>
<<run target().removeEffect(_k,"pierce")>>
<<break>>
<</if>>
<</for>>
<<else>>
<<if def _elntmsg>><b><<print _elntmsg>></b><</if>>
<<if _factor < 0>>
$target[0] feeds on the energy, and recovers <<print $dmg*-1>> HP.
<<else>>
$target[0].name takes $dmg damage!
<</if>><br />
<<set $target[0].setHP(-$dmg)>>
<<deathcheck>>
<<if $target[0].dead is false and $target[0].offbalance is true and _factor > 0>>
<<addeffect $target[0] "Knocked Down" -1>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "effectcalc">>
<<switch $args[0]>>
<<case "debuff">>
<<set $power = Math.round(($effbase+$effdamper*(_subject.get("Special")-_target.get("Special")))*$action.effweight)>>
<<if $power < $min_debuff>>
<<set $power = $min_debuff>>
<</if>>
<<case "buff">>
<<set $power = Math.round(($effbase+$effdamper*(_subject.get("Special")))*$action.effweight)>>
<<if $power < $min_buff>>
<<set $power = $min_buff>>
<</if>>
<</switch>>
<</widget>>
<<widget "DoT">>
/* DEPRECIATED as of v0.91. DoT handling is now tied to effect cases in the database. */
/* Calculates damage from damage-over-time effects. */
/* args0 is subject; args1 effect index */
<<if $args[1] is "test">>
<<set _name to $args[2]>>
<<set _weight to $args[3]>>
<<set _power to $args[4]>>
<<else>>
<<set _name to $args[0].effects[$args[1]].name>>
<<set _weight to $args[0].effects[$args[1]].weight>>
<<set _power to $args[0].effects[$args[1]].power>>
<</if>>
<<switch _name>>
<<case "Burning" "Perdition">>
/* effect base vs. defender's DEF */
<<set _dmg = _weight*($base+($damper*(_power - $args[0].get("Defense"))))>>
<<case "Poisoned">>
/* effect base vs. defender's SPC */
<<set _dmg = _weight*($base+($damper*(_power - $args[0].get("Special"))))>>
<<case "Doom">>
/* Effect base, unblockable. There is no refuge. */
<<set _dmg = _weight*($base+($damper*(_power))>>
<<case "proportional">>
<<set _dmg = $args[0].maxhp*_weight>>
<<case "fixed">>
<<set _dmg = _power>>
<</switch>>
<<set _dmg = Math.round(_dmg)>>
<<if _dmg < $min_DoT>>
<<set _dmg = $min_DoT>>
<</if>>
<<if $args[2] is "test">>
/* do nothing; _dmg will be preserved for later use */
<<elseif $args[2] is "status">>
<<print _dmg>>
<<else>>
<<set $dmg to _dmg>>
<</if>>
<</widget>>/* Widgets for enemy targeting AI. You could define these as JavaScript functions, but I prefer to define them as widgets for the functionality of printing text directly to the page. */
<<widget "enemytarget">>
<<set _continue to true>>
/* Priority 1: Martyr takes all hits */
<<find "$puppets" "martyr" "true">>
/* Note that this assumes only one Martyr can be active at a time. If multiple are active, this will only find the first in the array. */
<<if _pos > -1>> /* will be -1 if nothing found */
<<set $target = [$puppets[_pos],"$puppets["+_pos+"]"]>>
<<set _continue to false>>
<</if>>
<<if _continue is true>>
/* Priority 2: aggro enemies bypass normal targeting */
<<if $subject[0].aggro and def $attacker>>
<<set $target = [$puppets[$attacker],"$puppets["+$attacker+"]"]>> /* always targets the puppet that attacked last */
<<if $target[0].dead isnot true>>
<<set _continue to false>>
<</if>>
/* Note that this bypasses untargetable as well */
<</if>>
<<if _continue is true>>
/* mercy setting */
<<if $subject[0].mercy < 1 or $args.includes("smart")>>
/* if enemy's mercy is below 1, they will always use smart targeting */
<<set _mercy = 2>>
<<else>>
/* 1 in (mercy) chance of random targeting, to give players a break */
<<set _mercy = random(1,$subject[0].mercy)>>
<</if>>
<<set _hitlist = []>>
/* smart targeting */
<<if $difficulty is "hard">>
<<if _mercy > 1>>
<<if not $args.includes("ignore downed")>>
/* This clause makes enemies preferentially target off-balance and downed puppets. */
<<for _i, _puppet range $puppets>>
<<if _puppet.dead isnot true and _puppet.untargetable isnot true>>
<<if _puppet.offbalance or _puppet.down>>
/* if effect found, add their address to the hitlist */
<<run _hitlist.push(_i)>>
<<if _puppet.firefly is true>>
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</if>>
<</for>>
<</if>>
<<if $args.includes("debuff")>>
/* Debuffing attacks will preferentially target puppets with lowered Special, as they will be more strongly affected */
<<for _i, _puppet range $puppets>>
<<if _puppet.dead isnot true and _puppet.untargetable isnot true>>
<<if !_puppet.chi && !_puppet.stasis && (_puppet.get("Special") < _puppet.getBase("Special"))>>
/* if spc-reducing debuff found, add to hitlist */
<<run _hitlist.push(_i)>>
<<if _puppet.firefly is true>>
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</if>>
<</for>>
<</if>>
<<if _hitlist.length > 0>>
<<set _continue to false>>
<</if>>
<</if>>
/* normal targeting */
<<if _continue is true>>
<<for _i, _puppet range $puppets>>
<<if _puppet.dead isnot true and _puppet.untargetable isnot true>>
<<run _hitlist.push(_i)>>
<<if _puppet.firefly is true>>
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</for>>
<</if>>
<<elseif $difficulty is "medium">>
<<for _i, _puppet range $puppets>>
<<if _puppet.dead isnot true and _puppet.untargetable isnot true>>
<<run _hitlist.push(_i)>>
<<if _puppet.firefly is true>>
<<run _hitlist.push(_i)>>
<</if>>
/* smart targeting */
<<if _mercy > 1>>
<<if not $args.includes("ignore downed")>>
/* This clause makes enemies preferentially target off-balance and downed puppets. */
<<if _puppet.offbalance or _puppet.down>>
/* if effect found, add their address to the hitlist */
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<<if $args.includes("debuff")>>
/* Debuffing attacks will preferentially target puppets with lowered Special, as they will be more strongly affected */
<<if !_puppet.chi && && !_puppet.stasis && (_puppet.get("Special") < _puppet.getBase("Special"))>>
/* if spc-reducing debuff found, add to hitlist */
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</if>>
<</if>> /* end mercy if */
<</for>>
<<elseif $difficulty is "easy">>
<<for _i, _puppet range $puppets>>
<<if _puppet.dead isnot true and _puppet.untargetable isnot true>>
<<run _hitlist.push(_i)>>
<<if _puppet.firefly is true>>
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</for>>
<</if>> /* end difficulty if */
<<if def _hitlist and _hitlist.length > 0>>
<<set _n = random(0,_hitlist.length-1)>>
<<set _t = _hitlist[_n]>>
<<set $target = [$puppets[_t],"$puppets["+_t+"]"]>>
<<else>>
/* If a target wasn't found, only possibilities are that everyone's dead or untargetable. */
<<set _k = 0>>
<<for _puppet range $puppets>>
<<if _puppet.dead>>
<<set _k++>>
<</if>>
<</for>>
<<if _k eq $puppets.length>>
/* everyone's dead, just stop and the game over message will display next passage */
<<else>>
/* everyone's untargetable, run the check again without untargetable protection */
<<set _hitlist = []>> /* reset hitlist */
<<for _i, _puppet range $puppets>>
<<if _puppet.dead isnot true>>
<<run _hitlist.push(_i)>>
<<if _puppet.firefly is true>>
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</for>>
<<if def _hitlist and _hitlist.length > 0>>
<<set _n = random(0,_hitlist.length-1)>>
<<set _t = _hitlist[_n]>>
<<set $target = [$puppets[_t],"$puppets["+_t+"]"]>>
<<else>>
<<print "ERROR: No target found\n">>
<</if>>
<</if>>
<</if>>
/* protection check */
<<if $target[0] isnot null and $target[0].protected>>
<<find "$puppets" "name" $target[0].protectedBy>>
<<if _pos eq -1>>
<<set _targetingMsg = "ERROR: Protected character with no protector\n">>
<<print "ERROR: Protected character with no protector\n">>
<<else>>
<<set _targetingMsg = $puppets[_pos].name+" took the hit for "+$target[0].name+"!\n">>
<<print $puppets[_pos].name+" took the hit for "+$target[0].name+"!\n">>
<<set $target to [$puppets[_pos],"$puppets["+_pos+"]"]>>
<</if>>
<</if>>
<</if>>
<</if>>
<<unset _hitlist>>
<</widget>>
<<widget "allytarget">>
<<set _hitlist = []>>
<<for _i, _enemy range $enemies>>
<<if !($args.includes("noself") && _enemy == subject())>>
<<if !_enemy.dead>>
<<if $args.includes("buff")>>
<<if !_enemy.stasis>>
<<run _hitlist.push(_i)>>
<</if>>
<<else>>
<<run _hitlist.push(_i)>>
<</if>>
<</if>>
<</if>>
<</for>>
<<if _hitlist.length > 0>>
<<set _n = random(0,_hitlist.length-1)>>
<<set _t = _hitlist[_n]>>
<<set $target to [$enemies[_t],"$enemies["+_t+"]"]>>
<<unset _hitlist>>
<</if>>
<</widget>>
<<widget "dispeltarget">>
<<set _threshold to $args[0]>>
<<set _go to false>>
<<set _continue to true>>
<<set _temp to 0>>
<<if !$args.includes("mass")>>
/* Martyr check */
<<find "$puppets" "martyr" "true">>
<<if _pos >= 0>> /* will be -1 if nothing found */
<<for _effect range _puppet.effects>> /* Search for buffs */
<<if _effect.buff is true and _effect.sticky isnot true>>
<<if _effect.name is "Blessing">>
<<set _temp += 3>> /* Blessings are higher priority to dispel */
<<else>>
<<set _temp += 1>>
<</if>>
<</if>>
<</for>>
<<if _temp < _threshold>>
<<set $target = [$puppets[_pos],"$puppets["+_pos+"]"]>>
<<set _continue to false>>
<<set _go to true>>
<<else>>
<<set _continue to false>>
<</if>>
<</if>>
<</if>>
<<if _continue is true>>
/* In order to pass, there must not have been a martyr */
<<set _hitlist to []>>
<<for _i, _puppet range $puppets>>
<<if !$args.includes("mass")>>
<<set _temp to 0>>
<</if>>
<<for _effect range _puppet.effects>> /* Search for buffs */
<<if _effect.buff is true and _effect.sticky isnot true>>
<<if _effect.name is "Blessing">>
<<set _temp += 3>> /* Blessings are higher priority to dispel */
<<else>>
<<set _temp += 1>>
<</if>>
<</if>>
<</for>>
<<if $args[1] isnot "mass">>
<<if _temp >= _threshold>>
<<run _hitlist.push(_i)>> /* If someone has a buff, make them a possible target */
<</if>>
<</if>>
<</for>>
<<if (!$args.includes("mass") and _hitlist.length == 0) or ($args.includes("mass") and _temp < _threshold)>>
<<set _go to false>> /* If no one has any buffs, there's no point in using this; reroll */
<<else>>
<<set _go to true>>
<<if $args[1] isnot "mass">> /* mass dispel doesn't need to pick a target */
<<set _n = random(0,(_hitlist.length-1))>>
<<set _t = _hitlist[_n]>>
<<set $target = [$puppets[_t],"$puppets["+_t+"]"]>>
/* Protection check. Comment this out if you do not want Protectors to protect against dispels. */
<<if $target[0] isnot null and $target[0].protected>>
<<find "$puppets" "name" $target[0].protectedBy>>
<<if _pos eq -1>>
<<set _targetingMsg = "ERROR: Protected character with no protector\n">>
<<print "ERROR: Protected character with no protector\n">>
<<else>>
<<set _targetingMsg = $puppets[_pos].name+" took the hit for "+$target[0].name+"!\n">>
<<print $puppets[_pos].name+" took the hit for "+$target[0].name+"!\n">>
<<set $target to [$puppets[_pos],"$puppets["+_pos+"]"]>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "multihit">>
<<set _hits = $args[0]>>
<<for _h = 1; _h <= _hits; _h++>>
<<if $args[1] is "spread">> /* careful, this means you have to call enemytarget outside this widget if this isn't a spread attack */
<<enemytarget "ignore downed">>
<</if>>
<<echodamage>>
<</for>>
<</widget>><<set _initiative = -1>>
/* The -1 is necessary if you want a Speed of 0 to be possible. */
<<for _i, _party range $actors>>
<<for _j, _actor range _party>>
<<if not _actor.dead and not _actor.stunned>>
/* If you have more paralysis effects, you'll need to add each here. Consider adding a convenient "can't act" attribute flipped by all of them if this becomes prohibitive.
<<if not _actor.isDone and _actor.speed > _initiative>>
/* (not _actor.isDone) prevents us from selecting characters who have already acted this round. They'll be skipped over, and the next-fastest character will get the initiative. */
<<set _subj = [_i,_j]>>
<<set _initiative = _actor.speed>>
/* This sets the current character's Speed as the new bar to clear. If no one's faster, no one else will pass the if check above and this character will remain the current subject. If someone else is faster, they'll become the subject and the _initiative variable will be updated to match their Speed. This ensures that subject status will be granted to the fastest character. */
<<elseif not _actor.isDone and _actor.speed == _initiative>>
/* You'll need a handler for this case, or else the character with the higher index order will get the initiative in the case of a match. This handler can be anything, including nothing at all. If you want to be nice, you could automatically give the player the initiative in the case of a tie. Here I've provided the fairest possible option: a coin flip. */
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _subj = [_i,_j]>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<if ndef _subj>>
(You should write an error message here.)
<<else>>
<<if _subj[0] == $actors.indexOf($puppets)>>
<<set $subject = [$puppets[_j],"$puppets["+_j+"]"]>>
<<elseif _subj[0] == $actors.indexOf($enemies)>>
<<set $subject = [$enemies[_j],"$enemies["+_j+"]"]>>
<<set $B.turn = "enemy">>
<<else>>
(You should write an error message here.)
<</if>>
<</if>><<for _party range $actors>>
<<for _actor range _party>>
<<if not _actor.dead and not _actor.stunned>>
<<set _actor.initiative = _actor.speed>>
<<set _variance = random(-$VARIANCE_BOUND,$VARIANCE_BOUND)>>
<<set _variance /= 100>>
/* Twine's random() function requires integer bounds, but we (presumably) plan to vary characters' Speed stats by a small proportion. We can do this by setting $VARIANCE_BOUND to an integer percentage value (probably in StoryInit) and dividing by 100 to get the decimal value. */
<<set _actor.initiative += _actor.speed * _variance>>
<</if>>
<</for>>
<</for>>
<<set _initiative = -1>>
/* The -1 is necessary if you want a Speed of 0 to be possible. */
<<for _i, _party range $actors>>
<<for _j, _actor range _party>>
<<if not _actor.dead and not _actor.stunned>>
<<if not _actor.isDone and _actor.initiative > _initiative>>
/* (not _actor.isDone) prevents us from selecting characters who have already acted this round. They'll be skipped over, and the next-fastest character will get the initiative. */
<<set _subj = [_i,_j]>>
<<set _initiative = _actor.initiative>>
/* This sets the current character's Speed as the new bar to clear. If no one's faster, no one else will pass the if check above and this character will remain the current subject. If someone else is faster, they'll become the subject and the _initiative variable will be updated to match their Speed. This ensures that subject status will be granted to the fastest character. */
<<elseif not _actor.isDone and _actor.initiative == _initiative>>
/* You'll need a handler for this case, or else the character with the higher index order will get the initiative in the case of a match. This handler can be anything, including nothing at all. If you want to be nice, you could automatically give the player the initiative in the case of a tie. Here I've provided the fairest possible option: a coin flip. */
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _subj = [_i,_j]>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<if ndef _subj>>
(You should write an error message here.)
<<else>>
<<if _subj[0] == $actors.indexOf($puppets)>>
<<set $subject = [$puppets[_j],"$puppets["+_j+"]"]>>
<<elseif _subj[0] == $actors.indexOf($enemies)>>
<<set $subject = [$enemies[_j],"$enemies["+_j+"]"]>>
<<set $B.turn = "enemy">>
<<else>>
(You should write an error message here.)
<</if>>
<</if>>/* initiative gain */
/* Note this model assumes everyone's "initiative" attribute is set to 0 at battle start. */
<<for _party range $actors>>
<<for _actor range _party>>
<<if not _actor.dead>>
<<set _actor.initiative += _actor.speed>>
<</if>>
<</for>>
<</for>>
/* initiative comparison */
<<set _initiative = -1>>
<<for _i, _party range $actors>>
<<for _j, _actor range _party>>
<<if not _actor.dead>>
<<if _actor.initiative > _initiative>>
<<set _subj = [_i,_j]>>
<<set _initiative = _actor.initiative>>
<<elseif _actor.initiative == _initiative>>
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _subj = [_i,_j]>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<if ndef _subj>>
(You should write an error message here.)
<<else>>
<<if _subj[0] == $actors.indexOf($puppets)>>
<<set $subject = [$puppets[_j],"$puppets["+_j+"]"]>>
<<elseif _subj[0] == $actors.indexOf($enemies)>>
<<set $subject = [$enemies[_j],"$enemies["+_j+"]"]>>
<<set $B.turn = "enemy">>
<<else>>
(You should write an error message here.)
<</if>>
<<set $subject[0].initiative = 0>>
<</if>>/* Note that this assumes everyone's "initiative" attribute is set to 0 at battle start. */
<<set _threshold = $ACTION_THRESHOLD>> /* You would set $ACTION_THRESHOLD to some constant in StoryInit. */
<<set _pastThreshold = false>>
/* check for characters already at threshold */
<<for _party range $actors>>
<<if _pastThreshold>>
<<break>>
<</if>>
<<for _actor range _party>>
<<if not _actor.dead>>
<<if _actor.initiative >= _threshold>>
<<set _pastThreshold = true>>
<<break>>
<</if>>
<</if>>
<</for>>
<</for>>
/* initiative gain */
<<for not _pastThreshold>>
<<for _party range $actors>>
<<for _actor range _party>>
<<if not _actor.dead>>
<<set _actor.initiative += 20 + 0.2 * _actor.speed>>
/* This is the Bonfire formula, but you can add your own */
<<if _actor.initiative >= _threshold>>
<<set _pastThreshold = true>>
<</if>>
<</if>>
<</for>>
<</for>>
<</for>>
/* initiative comparison */
<<for _i, _party range $actors>>
<<for _j, _actor range _party>>
<<if not _actor.dead>>
<<if _actor.initiative > _threshold>>
<<set _subj = [_i,_j]>>
<<set _threshold = _actor.initiative>>
<<elseif _actor.initiative == _threshold>>
<<if def _subj>>
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _subj = [_i,_j]>>
<</if>>
<<else>>
<<set _subj = [_i,_j]>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<if ndef _subj>>
(You should write an error message here.)
<<else>>
<<if _subj[0] == $actors.indexOf($puppets)>>
<<set $subject = [$puppets[_j],"$puppets["+_j+"]"]>>
<<elseif _subj[0] == $actors.indexOf($enemies)>>
<<set $subject = [$enemies[_j],"$enemies["+_j+"]"]>>
<<set $B.turn = "enemy">>
<<else>>
(You should write an error message here.)
<</if>>
<<set $subject[0].initiative -= $ACTION_THRESHOLD>>
<</if>>/* Note that you will need to come up with a method for determining everyone's starting initiative; that is not modeled here. */
<<set _threshold = 0>>
<<set _pastThreshold = false>>
/* check for characters already at threshold */
<<for _party range $actors>>
<<if _pastThreshold>>
<<break>>
<</if>>
<<for _actor range _party>>
<<if not _actor.dead>>
<<if _actor.initiative <= _threshold>>
<<set _pastThreshold = true>>
<<break>>
<</if>>
<</if>>
<</for>>
<</for>>
/* initiative gain */
<<for not _pastThreshold>>
<<for _party range $actors>>
<<for _actor range _party>>
<<if not _actor.dead>>
<<set _actor.initiative -= 1>>
<<if _actor.initiative <= _threshold>>
<<set _pastThreshold = true>>
<</if>>
<</if>>
<</for>>
<</for>>
<</for>>
/* initiative comparison */
<<for _i, _party range $actors>>
<<for _j, _actor range _party>>
<<if not _actor.dead>>
<<if _actor.initiative < _threshold>>
<<set _subj = [_i,_j]>>
<<set _threshold = _actor.initiative>> /* This is only necessary if it is possible to overshoot the threshold */
<<elseif _actor.initiative == _threshold>>
<<if def _subj>>
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _subj = [_i,_j]>>
<</if>>
<<else>>
<<set _subj = [_i,_j]>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<if ndef _subj>>
(You should write an error message here.)
<<else>>
<<if _subj[0] == $actors.indexOf($puppets)>>
<<set $subject = [$puppets[_j],"$puppets["+_j+"]"]>>
<<elseif _subj[0] == $actors.indexOf($enemies)>>
<<set $subject = [$enemies[_j],"$enemies["+_j+"]"]>>
<<set $B.turn = "enemy">>
<<else>>
(You should write an error message here.)
<</if>>
<</if>>/* Turn preview for the ranked order model. Run this at the start of each round. */
<<set $turn_preview = []>>
<<set _count = 0>>
<<for _party range $actors>>
<<for _actor range _party>>
<<if not _actor.dead and not _actor.stunned>>
<<run _count++>>
<</if>>
<</for>>
<</for>>
<<for $turn_preview.length < _count>>
<<set _initiative = -1>>
<<for _i, _party range $actors>>
<<for _j, _actor range _party>>
<<if not _actor.dead and not _actor.stunned>>
<<if not $turn_preview.includes(_actor.name) and _actor.initiative > _initiative>>
<<set _next = _actor.name>>
<<set _initiative = _actor.initiative>>
<<elseif not $turn_preview.includes(_actor.name) and _actor.initiative == _initiative>>
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _next = _actor.name>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<run $turn_preview.push(_next)>>
<</for>>
/* You can then draw from $turn_preview to list the characters. The array is already sorted, so you can just use a for loop to display the characters in the order of their action. Exactly how this is implemented is left up to you. */
/* You will still need to run the regular program to choose the active character thanks to Twine breaking object references. Otherwise, you could just add each _actor to the array and draw from there. */
/* Known bug: in case of equal initiatives, the coin flip may go differently here than it does in the actual selection. */<<set $turn_preview = []>>
<<set _preview = clone($actors)>>
/* This is only a simulation, so we make a clone of the current state of $actors to work with. */
<<for _i = 0; _i < $PREVIEW_PROGNOSIS; _i++>>
/* $PREVIEW_PROGNOSIS is how many turns in advance you would like to calculate. I don't recommend making this very high. */
/* initiative gain */
<<for _party range _preview>>
<<for _actor range _party>>
<<if not _actor.dead>>
<<set _actor.initiative += _actor.speed>>
<</if>>
<</for>>
<</for>>
/* initiative comparison */
<<set _initiative = -1>>
<<for _i, _party range _preview>>
<<for _j, _actor range _party>>
<<if not _actor.dead>>
<<if _actor.initiative > _initiative>>
<<set _next = _actor>>
<<set _initiative = _actor.initiative>>
<<elseif _actor.initiative == _initiative>>
<<set _r = random(1,2)>>
<<if _r == 1>>
<<set _next = _actor>>
<</if>>
<</if>>
<</if>>
<</for>>
<</for>>
<<run $turn_preview.push(_actor)>>
<<set _next.initiative = 0>>
<</for>>
/* Preview code for threshold model is similar; just update the body code to match. */
/* You MUST run this after every action if it is to be accurate, especially if you have actions that can modify initiative values. It is for this reason that I recommend a low prognosis value, so as to not cause your player's processor to melt. *//* Within the status pane, include this line: */
Ticks until next turn: <<print $actor[0].initiative>>
/* Creating a visual representation (such as in Becoming) will require skill in CSS and is beyond the scope of this help. */<<widget "XP_to_next">>
/* Calculates the XP required for the next level. Pokemon's formulas are the default; change as necessary. */
<<set _char = $args[0]>>
<<if _char.levelRate is "fast" or _char.name is "Fighter">>
/* This conditional demonstrates how you can set XP formulas as general attributes or make them unique for specific characters. */
<<set _toNext = (4*(_char.level)^3)/5>>
<<elseif _char.levelRate is "medium" or _char.name is "Rogue">>
<<set _toNext = _char.level^3>>
<<elseif _char.levelRate is "slow" or _char.name is "Mage">>
<<set _toNext = (5*(_char.level)^3)/4>>
<<else>>
/* display an error or default formula here */
<</if>>
<<set _toNext = Math.floor(_toNext)>>
<</widget>>
<<widget "levelcheck">>
<<set _keepGoing = true>>
<<for _keepGoing>>
<<set _keepGoing to false>>
<<for _puppet range $puppets>>
<<XP_to_next _puppet>>
<<if _puppet.level <= $LEVEL_CAP and _puppet.XP >= _toNext>>
<<LevelUp _puppet>>
<<set _keepGoing = true>>
/* This is needed if you want it to be possible for characters to level up multiple times within the same widget call. This ensures the whole check will be done again to check if the puppet's XP matches the requirement for the next level too. */
<</if>>
<</for>>
<</for>>
<</widget>>
<<widget "LevelUp">>
/* To implement this, you will need to enable the level up code detailed in the story JavaScript. */
<<set _char = $args[0]>>
<<set _char.level++>>
_char.name has reached Level <<print _char.level>>!<br/>
<<for _key, _rate range _char.growthRates>>
<<run _char.getBase(_key) += _rate>>
<<print _key>> +<<print _rate>> = <<print _char.getBase(_key)>><br/>
<</for>>
/* You could also make the growth rate a formula that changes based on level. You could calculate it through a similar widget to the XP_to_next widget. */
<<switch _char.level>>
<<case 2>>
<<run _char.actions.push($Level_2_Skill)>>
Learned \"<<print $Level_2_Skill.name>>\"!<br/>
/* and so on */
<</switch>>
<<if (_char.level % $num) == 0>>
/* This is a handler for if you want to provide a special bonus at certain intervals. For instance, Dungeons & Dragons provides a stat point every 4 levels. This if case will trigger every $num levels. */
<</if>>
<br/>
<</widget>>
<<widget "LevelUp_WithLookupTable">>
<<set _char = $args[0]>>
<<set _char.level++>>
_char.name has reached Level <<print _char.level>>!<br/>
<<set _gain = _char.StatTable()>>
/* Where StatTable is a function containing a switch statement that returns a Map of gain rates for each level case. */
/* e.g.
this.StatTable = () => {
switch (this.level) {
case 2:
return new Map([
["StatA",num],
["StatB",num],
["New Skill",$Level_2_Skill]
(...)
])];
break;
case 3:
return new Map([
(...)
])];
break;
(etc.)
}
}
*/
/* You would set this in the puppet database. The advantage to this is that it handles all the processing at once on startup, reducing the time necessary to operate this widget. */
<<for _key, _value range _gain>>
<<if _key == "New Skill">>
<<run _char.actions.push(_value)>>
Learned \"<<print $Level_2_Skill.name>>\"!<br/>
<<else>>
<<run _char.getBase(_key) += _value>>
<<print _key>> +<<print _rate>> = <<print _char.getBase(_key)>><br/>
<</if>>
<</for>>
<br/>
<</widget>>/* Presumably the player would get here by clicking a link from a menu passage of some kind. We'll assume this link set the $subject variable to the character in question. */
<<set $subject[0] = $puppets[0]>>
<<set $subject[0].statPoints = 3>>
<<set _curr = new Map()>>
<<run _curr.set("points",$subject[0].statPoints)>>
<<for _key, _value range $subject[0].stats>>
<<run _curr.set(_key,_value.Base)>>
<</for>>
<div id="stats">
<<include "statblock">>
</div>
/* This is for a regular stat point system. For a more complex point-buy system, you'd just use the "getStatCost" function and check stat points/XP against that instead of 0. */
<br/>Leaving this screen will make stat investments permanent!
/* Presumably you would have a link back to the menu or whatever here */Current stat points: $subject[0].statPoints / <<print _curr.get("points")>><br/>
<<for _key, _value range $subject[0].stats>>
<<capture _key, _value>>
<span class="statname"><<print _key>>:</span> _value.Base
<<if $subject[0].statPoints > 0>>
[<<link "+">>
<<replace "#stats">>
<<run _value.Base++>>
<<run $subject[0].statPoints-->>
<<include "statblock">>
<</replace>>
<</link>>]
<</if>>
<<if $subject[0].statPoints > 0 and _value.Base > _curr.get(_key)>> / <</if>>
<<if $subject[0].statPoints < _curr.get("points") and _value.Base > _curr.get(_key)>>
[<<link "-">>
<<replace "#stats">>
<<run _value.Base-->>
<<run $subject[0].statPoints++>>
<<include "statblock">>
<</replace>>
<</link>>]
<</if>>
<br/>
<</capture>>
<</for>>/* Where the action actually happens. Kept separate from action phase for modularity purposes. */
<<switch $action.name>>
<<case "rest" "struggle" "Reload" "Procure">>
/* These actions display no action text and take the player immediately back to the battle hub. */
<<switch $action.name>>
<<case "rest">>
<<if $subject[0].winded is true>>
<<for _k, _effect range $subject[0].effects>>
<<if _effect.name is "Winded">>
<<print subject().removeEffect(_k)>>
<</if>>
<</for>>
<</if>>
<<case "struggle">>
<<for _k, _effect range $subject[0].effects>>
<<if _effect.name is "Knocked Down">>
<<print subject().removeEffect(_k)>>
<</if>>
<</for>>
<<case "Reload">>
<<find "$subject[0].actions" "name" "\'Reload\'">>
<<set $subject[0].actions[_pos] = new Action("Crossbow")>>
<<case "Procure">>
<<run $inv.get($item_to_procure).stock += 1>>
<</switch>>
<<goto "Battle!">>
<<default>>
/* Flavor text relating to the action. It is a div element, making it a separate block from the gameplay effects. By default, it has a bottom margin of 1em to create a separator between flavor text and gameplay text. */
<div id="actFlavor">
/* First is action use text. A regular action takes the form "Actor uses..." Items take the form "Actor uses a/n..." This is a div element, which means it creates an automatic line break. */
<<if $action.useText !== null>>
/* Set useText to null to bypass this element. This is useful if you only want one of the two areas to display. */
<div id="useText">
<<if $action.useText instanceof Function>>
<<print $action.useText()>>
<<else>>
<<print $action.useText>>
<</if>>
</div>
<</if>>
<<include "battle interruptions">>
/* Then descriptive text. This is a div element, so it creates an automatic line break. */
<<if $action.actText !== null>>
/* Set actText to null to bypass this element. This is useful if you only want one of the two areas to display. */
<div id="actText">
<<if $action.actText instanceof Function>>
<<print $action.actText()>>
<<else>>
<<print $action.actText>>
<</if>>
</div>
<</if>>
</div> /* close flavor text div */
/* Then effects. */
<<if $action.act !== null>>
<div id="actEffect">
<<if def _targetingMsg>>
/* This section covers text that has to be generated elsewhere for various reasons, such as the alert for a Protector covering another character. */
<<print _targetingMsg>>
<<unset _targetingMsg>>
<</if>>
<<if $action.act instanceof Function>>
<<print $action.act()>>
<<else>>
<<print $action.act>>
<</if>>
</div> /* close action effects div */
<</if>>
<</switch>>/* Refreshes puppets to resting states. Use this to tidy up any flags or changes that might occur in battle. */
<<widget "refreshPuppets">>
<<for _puppet range $puppets>>
<<set _puppet.hp = _puppet.maxhp>>
<<set _puppet.en = 5>>
<<set _puppet.isDone = false>>
<<set _puppet.inspired = false>>
<<for _k, _effect range _puppet.effects>>
<<run _puppet.removeEffect(_k,"pierce")>>
<</for>>
<<find "_puppet.actions" "name" "\'Reload\'">>
<<if _pos > -1>>
<<set _puppet.actions[_pos] = new Action("Crossbow")>>
<</if>>
<</for>>
<</widget>><<widget "deathcheck">>
<<if $args.length > 0>>
<<set _targ = $args[0]>>
<<else>>
<<set _targ = target()>>
<</if>>
<<if _targ.hp <= 0 and _targ.dead is false>>
<<set _targ.hp = 0>>
<<for _k _effect range _targ.effects>>
<<run _targ.removeEffect(_k,'pierce')>>
<</for>>
<<if _targ instanceof Enemy>>
<<run $B.kills.push(_targ.name)>>
<</if>>
<<if _targ.deathMessage is "special">>
<<goto "specialdeath">>
<<else>>
<<set _targ.dead to true>>
<<print _targ.deathMessage>>
<</if>>
<<if _targ.protected is true>>
<<if _targ instanceof Puppet>>
<<find "$puppets" "name" _targ.protectedBy>>
<<if _pos > -1>>
<<set _p = _pos>>
<<set _a = "$puppets["+_pos+"].effects">>
<<find _a "name" "\'Protector\'">>
<<print $puppets[_p].removeEffect(_pos,'pierce')>>
<</if>>
<<elseif _targ instanceof Enemy>>
<<find "$enemies" "name" _targ.protectedBy>>
<<if _pos > -1>>
<<set _p = _pos>>
<<set _a = "$enemies["+_pos+"].effects">>
<<find _a "name" "\'Protector\'">>
<<print $enemies[_p].removeEffect(_pos,'pierce')>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "deathcheckOLD">>
/* Old death check method that runs over all characters. Necessary if you plan to inflict damage without specifying a target. */
<<for _enemy range $enemies>>
<<if _enemy.hp <= 0 and _enemy.dead is false>>
<<set _enemy.hp = 0>>
<<run $B.kills.push(_enemy.name)>>
<<if _enemy.deathMessage is "special">>
<<print "\n\n...">>
<<set $B.specialdeath++>>
<<else>>
<<set _enemy.dead to true>>
<<print _enemy.deathMessage>>
<<for _effect range _enemy.effects>>
<<set _effect.duration to 0>>
<</for>>
<<effectmanager _enemy>> /* to strip effect flags, just in case they can still interfere during the turn */
<</if>>
<</if>>
<</for>>
<<for _puppet range $puppets>>
<<if _puppet.hp <= 0 and _puppet.dead is false>>
<<set _puppet.hp = 0>>
<<set _puppet.dead to true>>
<<print _puppet.deathMessage>>
<<for _effect range _puppet.effects>>
<<set _effect.duration to 0>>
<</for>>
<<effectmanager _puppet>>
<</if>>
<</for>>
<</widget>><span id="status"><<include "party manager reserve">></span><span id="content"><center>Active puppets:</center>
<<nobr>>
<div class="actors" id="puppets">
<<include "party manager puppets">>
</div>
<</nobr>>
A list of all available puppets is on the right. To swap out an active puppet, click on them and then on the puppet you want to add.
<<return>>
</span><<for _i, _puppet range $puppets>>
<div class="actor" @id="_i">
<center>
<<capture _i>>
<<link _puppet.name>>
<<if def _s>><<run $('#' + _s).removeClass("selected")>><</if>>
<<set _s = _i>>
<<run $('#' + _i).addClass("selected")>>
<<replace "#status">><<include "party manager reserve">><</replace>>
<</link>>
<</capture>>
</center><br/>
<<for _k, _v range _puppet.stats>>
<span class="statname"><<print _k>>:</span>
<<print _puppet.get(_k)>>
<br/>
<</for>>
</div>
<</for>><center>Reserve Puppets:</center><br/>
<<for _i, _puppet range $Reserve_Puppets>>
<span class="statname">
<<if def _s>>
<<capture _puppet, _i>>
<<link _puppet.name>>
<<run $Reserve_Puppets[_i] = $puppets[_s]>>
<<set $puppets[_s] = _puppet>>
<<unset _s>>
<<replace "#puppets">><<include "party manager puppets">><</replace>>
<<replace "#status">><<include "party manager reserve">><</replace>>
<</link>>
<</capture>>
<<else>>
_puppet.name
<</if>>
</span><br/><br/>
<</for>><div style="display: flex; justify-content: space-evenly"><b>[[Home|Start]]</b> [[Installation]] [[Documentation]] [[Design]] [[Additional Features]] <span><b>Version: $version</b> ([[Changelog]])</span></div><<widget "status">>
<span class="right">
<<link "[*]">>
<<if $args[0] eq $actor>>
<<set $actor = [null,null]>>
<<else>>
<<set $actor to $args[0]>>
<<set $stScreen = 1>>
<</if>>
<<replace "#status">><<include "status">><</replace>>
<</link>>
</span>
<</widget>>
<<widget "effectinfo">>
<<for _k, _effect range $actor[0].effects>>
<<if _effect.invisible isnot true>>
<div class="effectinfo">
<u>_effect.name</u>
<<if _effect.duration >= 0>>
<span class="duration">_effect.duration turns</span>
<</if>><br/>
<span class="effectdesc">
<<print _effect.info()>>
</span>
</div><br/>
<</if>>
<</for>>
<</widget>>
<<widget "stat">>
/* Designed by greyelf */
/* Check that a Stat Name was passed to the widget. */
<<if $args.length is 0>>
ERROR
<<else>>
<<set _current to $actor[0].get($args[0]) >>
<<set _base to $actor[0].getBase($args[0]) + $actor[0].getBonus($args[0]) >>
/* Check if the Stat has been raised. */
<<if _current > _base >>
@@.stat-raised;_current@@
/* Check if the Stat has been lowered. */
<<elseif _current < _base >>
@@.stat-lowered;_current@@
/* The Stat has not changed. */
<<else>>
_current
<</if>>
<</if>>
<</widget>>
<<widget "res">>
/* Check that an argument was passed to the widget. */
<<if $args.length is 0>>
ERROR
<<else>>
<<set _r = $actor[0].elements.get($args[0])>>
<<set _r = Math.round((_r - 1) * -100)>>
/* Weakpoint? */
<<if _r < 0 >>
@@.stat-lowered;<<print _r>>%@@
/* Absorbance? */
<<elseif _r > 100 >>
<<run _r -= 100>>
@@.green;+<<print _r>>%@@
/* Resistance? */
<<elseif _r > 0 >>
@@.stat-raised;<<print _r>>%@@
<<else>>
<<print _r>>%
<</if>>
<</if>>
<</widget>>
<<widget "tol">>
<<if $args.length is 0>>
ERROR
<<else>>
/* Unlike other status widgets, this is passed the value, not the key. */
<<set _v = $args[0]>>
<span class="duration">
/* Immunity? */
<<if _v.immune>>
IMMUNE
/* Tolerance? */
<<elseif _v.cur > 0>>
<<print _v.cur>>
/* Tolerance exhausted? */
<<elseif _v.cur == 0>>
Vulnerable!
<</if>>
</span>
<</if>>
<</widget>>
<<widget "statOOB">>
/* For displaying stats outside of battle. Base and equipment mods are displayed separately here. If you wish for effect mods to persist outside of battle, you could include them as well. */
<<if $args.length is 0>>
ERROR
<<else>>
<<set _mod to $actor[0].getBonus($args[0]) >>
<<set _base to $actor[0].getBase($args[0])>>
<<print _base>>
/* Check if equipment mod is positive. */
<<if _mod > 0 >>
@@.green;<<print "\+"+_mod>>@@
/* Check if equipment mod is negative. */
<<elseif _mod < 0 >>
@@.stat-lowered;<<print "-"+_mod>>@@
<<elseif _mod == 0>>
/* display nothing */
<</if>>
<</if>>
<</widget>>/* Widgets for special attacks that occur at nonstandard times. In the default engine, this contains Archer's mark and Hunter attacks. */
<<widget "hunterCheck">>
/* Called in the enemy phase, after every enemy's action. */
<<if $target[0] instanceof Puppet is true>>
<<find "$puppets" "hunter" "true">>
<<if _pos > -1>>
<<if $puppets[_pos].dead isnot true and $puppets[_pos].noact isnot true>>
<<set $target[0] to $subject[0]>>
<<set $subject[0] to $puppets[_pos]>>
<<set $action = new Action("Hunter Counter")>>
<<include "action effects">>
<br/>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "markAttack">>
/* Called in the action phase, after action is finished. */
<<if $subject[0].name isnot "Archer" and $target[0] instanceof Enemy>>
<<set _hitlist = []>>
<<for _enemy range $enemies>>
<<if _enemy.marked is true>>
<<run _hitlist.push(_enemy)>>
<</if>>
<</for>>
<<if _hitlist.length > 0>>
<<find "$puppets" "name" "\'Archer\'">>
<<if _pos > -1>>
<<if !$puppets[_pos].dead && !$puppets[_pos].noact && $puppets[_pos].en > 0>>
<br/>
<<set _subj = $subject[0]; _tar = $target[0]; _temp = $action>>
<<set $subject[0] = $puppets[_pos]>>
<<set $action = new Action("Mark Shot")>>
<<include "action effects">>
<<if $puppets[_pos].en <= 0>>
<<for _enemy range $enemies>>
<<for _k, _effect range _enemy.effects>>
<<if _effect.name == "Marked">>
<<run _enemy.removeEffect(_k,"pierce")>>
<</if>>
<</for>>
<</for>>
<</if>>
<<set $subject[0] = _subj; $target[0] = _tar; $action = _temp>>
<</if>>
<<else>>
ERROR: Mark without Archer<br/>
<</if>>
<</if>>
<</if>>
<</widget>><<widget "newturn">>
<<set $SacrificeUsed to false>>
<<for _puppet range $puppets>>
<<set _puppet.isDone to false>>
<<for _k, _effect range _puppet.effects>>
<<if _effect.topDec>>
<<print _puppet.removeEffect(_k,"pierce")>>
<</if>>
<</for>>
<<if _puppet.winded is false>>
<<set _puppet.en += $ENregen>>
<</if>>
<</for>>
<</widget>>/* Special scenarios that interrupt the normal display, such as the Crystal Gems defending Steven. By default, this has margins both above and below to make it its own block (see story stylesheet). You may want to adjust this if you plan to make an interruption at a different point. */
/* You may wish to make separate passages for each of these, but the example will be stored here. */
<<if $scenario == "su1" and !$B.event and $B.turn == "player" and ($target[0] instanceof Enemy)>>
/* When vs. the Crystal Gems, the Gems will take hits for Steven if you try to attack him. */
<<if target[0].name == "Steven">>
<<if $enemies[1].dead is false>>
/* Garnet is the first to defend him */
@@.interruption;
$enemies[1].name's head snaps towards you and she jumps in the way of your attack, leaving Steven unharmed.@@
<<set _t to 1>>
<<elseif $enemies[0].dead is false>>
/* If Garnet is poofed, Pearl plays defense */
@@.interruption;
$enemies[0].name screams, "STEVEN!!!" and throws herself into your attack without hesitation.@@
<<set _t to 0>>
<<elseif $enemies[2].dead is false>>
/* If Garnet and Pearl are poofed, Amethyst plays defense */
@@.interruption;
$enemies[2].name yells, "Pick on someone your own size!" and throws herself in front of Steven.@@
<<set _t to 2>>
<<else>>
<<set _t to 3>> /* this is Steven's index; he is vulnerable */
<</if>>
<<set $target to [$enemies[_t],"$enemies["+_t+"]"]>>
<<else>>
<<set $B.bully to false>> /* If you didn't target Steven, lose out on Bully achievement */
<</if>>
<<elseif $scenario == "gf2">>
<<if $action.name == "Shatter" && !$B.event>>
@@.interruption;
Bill looks at you for a second, then giggles like a little boy.<br/>
<br/>
"Oh, aren't you SO smug, sitting there with your protection magic! You think you've got me all figured out, huh!" He raises a hand, and pinches his fingers together. "Oh, it's just ADORABLE you think that can save you! HILARIOUS! I'm a DEMON of the MINDSCAPE, kid! Your pathetic mortal magic is NOTHING to me! <b><i>KNEEL AND SUFFER!</b></i>"@@
<<set $B.event = true>>
<</if>>
<</if>><<widget "specialcheck">>
/* Called at the battle screen, checks for special circumstances e.g. avengeance effects */
<<if $B.specialdeath > 0>>
<<run $B.specialdeath-->>
<<goto "specialdeath">>
<</if>>
<<switch $scenario>>
<<case "gf1">>
<<if $enemies.length > 1>> /* This checks that a transformation hasn't already happened */
<<if $enemies[0].dead>> /* If Dipper is defeated first, see Mega Mabel cutscene */
<<goto "Mega Mabel">>
<<elseif $enemies[1].dead>> /* If Mabel is defeated first, see Big Dipper cutscene */
<<goto "Big Dipper">>
<</if>>
<</if>>
<<case "at1">>
<<if $enemies[0].dead is true and $enemies[2].dead is true and $B.event is false>>
<<goto "Bubblegum shift">>
<</if>>
<<case "gum1">>
<<if $B.event is false>>
<<if $enemies[0].dead is true and $enemies[1].dead is true>>
<<goto "Darwin last survivor">>
<<elseif $enemies[1].dead is true and $enemies[2].dead is true>>
<<goto "Gumball last survivor">>
<<elseif $enemies[0].dead is true and $enemies[2].dead is true>>
<<goto "Anais last survivor">>
<</if>>
<</if>>
<<case "su1">>
<<if $enemies[0].dead is true and $enemies[1].dead is true and $enemies[2].dead is true and $B.event is false>>
<<goto "Steven alone">>
<</if>>
<</switch>>
<</widget>><span id="content">Welcome. You are here because you want to fight beloved cartoon characters in thrilling tactical battles. How wonderful! Here you can do that to your heart's content.
(Don't worry, everything is totally safe. Oh, it can still <i>hurt</i>. It can hurt a lot. But everyone will be made good as new as soon as the battle's over, and that makes it all fine, we're sure.)
Would you like to hear the rules of the game before you begin?
>[[Yes!|Tutorial]]
>[[No, I wanna jump straight in!|Hub]]
<span class="actdesc">Version $version [Hopefully now functional!]
Made in <a href="https://www.reddit.com/r/twinegames/comments/9magje/rpg_engine_and_example_game_feedback_wanted/" target="_blank">Another RPG Engine</a>
Characters and franchises featured herein are the properties of their respective creators.</span>
</span><span id="content"><<nobr>>
<div class="actors" id="puppets">
<<for _i, _puppet range $puppets>>
<div class="actor">
<span class="actorname">_puppet.name</span>
<br />
HP: _puppet.hp<br />
EN: _puppet.en / 10
</div>
<</for>>
</div>
<</nobr>>
Of course we do not expect you to go into battle on your own, small child! That would be reckless endangerment. No, no, we have created puppets to help you play. You may not recognize their faces, but you know them well; they are the essence at the core of all warriors, reborn and remasked time and again but always the same underneath. The [[Fighter][$subject[0] = $Fighter]], the [[Rogue][$subject[0] = $Rogue]], and the [[Mage][$subject[0] = $Mage]].
Though they are originals, time has also refined them to birth new roles you may like to try out: The [[Archer][$subject[0] = $Archer]] , the [[Cleric][$subject[0] = $Cleric]], and the [[Witch][$subject[0] = $Witch]]... and their sometimes friend, the [[Bard][$subject[0] = $Bard]].
See how readily they move, as if they were part of your own body. Is it not intoxicating to have such power at your fingertips?
Your puppets each have different roles, and bring different skills to the arena. Click on their names to learn more about them. Or, should you wish to learn about the general rules of battle, [[click here.|Battle Mechanics]]
[[Return to the hub|Hub]]
</span>
<<set $tutorial to true>><span id="content"><<print '<img src="'+setup.Path+'AT_logo.png" class="logo" />'>>
Upon closer inspection, you see there are actually two gates here.
The one on the left is clearly labeled "Round One". Around the edges is a pattern of what appears to be stylized bubblegum and cotton candy, full of lumpy purple blobs and wispy, flowing pink.
The one on the right is in deep shadow, even though you can't see any visible light sources. Bats perch under a stony overhang that, unlike the rest of the stone here, looks craggy and weathered with age, like the stone you'd see in a creepy old cave. The bats are nearly invisible, except for their red eyes that glow like coals within the blackness. Occasionally they shuffle and shift their weight, but they make no other sound or movement.
>[[Enter the "Round One" gate|AT1 landing][$C.at1 = {choice: "", scene: 0, human: ""}]]<br/>
><<if $P.at < 1>>The second gate is firmly shut.<<else>>The second gate will open sometime in the future, maybe.<</if>>
<<back>>
</span><span id="content"><<print '<img src="'+setup.Path+'GF_logo.png" class="logo" />'>>
Upon closer inspection, you see there are actually two gates here.
The one on the left is set into a country scene looking down on a little valley hamlet, surrounded by looming mountains that are almost but not quite bridged by two rocky overhangs. The colors are slightly faded, giving the impression of a sunset. On either side of the gate, in a starkly different style, are minimalist renditions of a pine tree and a shooting star. The gate is labeled "Round One".
The one on the right is painted over with a golden triangle inlaid with a huge, slitted eye. <<if $P.gf < 1>>Looking at it makes you uncomfortable.<<else>>You can't shake the feeling that it's looking at you.<</if>> The wall around the gate is strangely plain, but if you look closely, you can see warping and twisting in the stone, little bumps and ridges at odds with the perfect smoothness everywhere else.
>[[Enter the "Round One" gate|GF1 landing][$C.gf1 = {choice: "", scene: 0}]]<br/>
><<if $P.gf < 1>>The second gate is firmly shut.<<else>>The second gate will open sometime in the future, maybe.<</if>>
<<back>>
</span><span id="content"><<print '<img src="'+setup.Path+'TAWOG_logo.png" class="logo" />'>>
Upon closer inspection, you see there are actually two gates here.
The one on the left is clearly labeled "Round One". It and the surroundings are covered with a bizarre collage of images in countless clashing styles. There even appears to be what looks like CGI in there. The chaos should make the whole thing an impossible mess, but somehow it just... works.
The one on the right is an ordinary, rectangular door, like one you might see in a house. Approaching it fills you with a dread you can't quite place.
>[[Enter the "Round One" gate|GUM1 landing][$C.gum1 = {scene: 0}]]<br/>
><<if $P.gum < 1>>The second gate is firmly shut.<<else>>/*[[Swallow your fear and open the house door|GUM2 landing][$C.gum2 = {scene: 0, fite: 0}]]*/<</if>>
<<back>>
</span><span id="content"><<print '<img src="'+setup.Path+'SU_logo.png" class="logo" />'>>
Upon closer inspection, you see there are actually two gates here.
The one on the left is clearly labeled "Round One". It is arched, and colored a pleasant sky blue. In the center is a five-pointed white star, each arm inset with a beautiful gem. You identify them as a pearl, an amethyst, a ruby, a sapphire, and a rose quartz.
The one on the right looks similar, but there is only a rose quartz, smack in the center of the star. Fluffy pink clouds are painted on the wall around it. <<if $P.su > 0>>From somewhere far above, rose petals flutter slowly to the ground.<</if>>
>[[Enter the "Round One" gate|SU1 landing][$C.su1 = {scene: 0, fite: 0}; $answer = null; $steven_defeated = false]]<br/>
><<if $P.su < 1>>The second gate is firmly shut.<<else>>The rose quartz is shining brightly. You can enter... as soon as the battle is designed.<</if>>
<<back>>
</span><span id="status"><<include "status">></span><span id="content"><<nobr>>
<<call "tutorial">>
<span class="actors enemies">
<<for _i, _enemy range $enemies>>
<div class="actor">
<span class="actorname">_enemy.name</span>
<<capture _i>><<status `[$enemies[_i],"$enemies["+_i+"]"]`>><</capture>>
<br />
HP: _enemy.hp
</div>
<</for>>
</span>
<br />
<div class="actors">
<<for _i, _puppet range $puppets>>
<div class="actor">
<span class="actorname">_puppet.name</span>
<<capture _i>><<status `[$puppets[_i],"$puppets["+_i+"]"]`>><</capture>>
<br/>
HP: 1000
<br />
EN: 5 / 10
</div>
<</for>>
</div>
<div class="actors">
<<for _puppet range $puppets>>
<div class="commands">
<b>
Act<br/>
Rest<br/>
Item<br/>
</b>
</div>
<</for>>
</div><</nobr>>
The battle screen looks something like what you see above. Enemies will be displayed at the top of the screen, and your puppets will be displayed below them. At any time, you can click the [*] to the right of someone's name to see information about their status and current status effects.
HP are your Hit Points. When a puppet or enemy reaches 0 HP, they are defeated! Unlike in some games you may be familiar with, there is no way to recover HP or revive defeated puppets, so don't be reckless. 1000 HP may seem like a lot, but it's all you're going to get.
EN stands for Energy. This represents a puppet's stamina or magical reserves. Taking an action costs Energy, but your puppets will gain 2 points of Energy at the beginning of every round. Certain items and actions will allow them to recover Energy during their turn, as well.
Every round, you can tell your puppets to <b>act</b>, <b>rest</b>, or use an <b>item</b>. Acting will allow them to choose an action from the action menu; for a list of each puppet's actions, see their individual passages. Resting will skip their turn, but costs no Energy and removes Winded status if they are afflicted.
You can command your puppets in any order, but you can't take back an action once it's confirmed. If an ability is tagged [Instant], it won't end the puppet's turn.
Damage from attacking skills is calculated through the formula
<div class="formula" id="thing">[($base + Attacker's Attack) * weight] - Defender's Defense</div>
where attack weight is determined by the specific skill used to attack. Note that this formula uses subtractive defense, which means that small changes to any one of these values can make a big difference to the final damage output. If you find yourself barely scratching an enemy, try decreasing their Defense or using an attack with a higher weight.
Would you like to learn more about [[status effects?|Effect Mechanics]]
Would you like to learn more about [[items?|Item Mechanics]]
<<back>></span><span id="content">/*(Thinking I could try adding images to these, D&D-style portraits, but it's hard to find appropriately gender-neutral ones.)
*/<b>The Rogue</b> is a master of poisons, trickery, and subterfuge. They are sometimes referred to as the Controller or the Saboteur. They have the weakest Attack of the three puppets, making them unsuited to direct damage, but do not let that lull you into a false sense of security. Their true strength lies in their ability to impede and disable their opponents, facilitated by their exceptional Special stat.
The Rogue possesses an ability for every status ailment, and unlike Mage's Curse spell, many of them inflict damage too. By choosing your ailments with care, you can set up even the most powerful enemies for a humiliating fall. However, it pays to plan in advance: these techniques have high Energy costs, and unlike Mage, Rogue cannot easily recover it.
<<back>>
<i>Tips:
"Something in your eye" can really help you in a tight spot, but use it wisely: after an enemy is stunned, they will become Alert and immune to future stuns for a long while!
If you find yourself frustrated with Rogue's poor damage output, try Poison Prick. Damage-over-time effects are as strong as regular attacks here, and poison damage draws from Rogue's hefty Special rather than their Attack.
An ounce of prevention is worth a pound of cure quite literally here. Panaceas are handy, but very expensive. You'll free Rogue up for more actions if you proactively protect your puppets with Bottled Chi instead.</i>
Rogue's abilities are:
<<find "$All_Puppets" "name" "\'Rogue\'">>
<<actionlist $All_Puppets[_pos]>>
</span><span id="content"><b>The Fighter</b> is a stalwart. You may know them as the Tank or the Knight. They are not the strongest or the most adaptable, but they are the most reliable. Magic can run dry and sabotage can fail, but not much can stop Fighter from hacking away at the enemy a little at a time. Even a god may die from a thousand cuts.
But Fighter's greatest strength is not their offense, but their defense. With the highest Defense of the puppets, they can shrug off blows that would send the others reeling. They're not so selfish to hog this safety for themselves: With their Protector and Martyr abilities, they can turn their defense into a weapon, giving you the power to control the flow of battle and protect your more fragile puppets. Just remember that while Fighter is tough, they're not invincible.
<<back>>
<i>Tips:
Fighter can't hold multiple stances at once. You'll only get the bonus from Defender if you attack!
Martyr is a good panic button, but you shouldn't use it if you don't have to. Without Protector's Defense bonus, Fighter will lose a lot more of their very limited HP. It'll benefit you in the long run if you can find a way to structure your tactic to use Protector instead.
Against particularly nasty foes, it may be worth it to use Meditate even if Fighter doesn't have any ailments. An ounce of prevention is worth a pound of cure.</i>
Fighter's abilities are:
<b>Firefly</b>
Passive. Enemies are twice as likely to target Fighter as other puppets.
<<find "$All_Puppets" "name" "\'Fighter\'">>
<<actionlist $All_Puppets[_pos]>>
</span><span id="content"><b>The Mage</b> is power embodied. They represent humanity's endless yearning, those dreams that lie just beyond the edge of the possible. You may know them as the Damager or the Black Mage, but there are elements of the Controller mixed in there as well. The Mage can be many things; magic does not play by the rules, after all.
Mage's strength is raw power. Possessing the highest Attack of the puppets, they can cut through enemies' defensive walls as if they were butter. In addition, they possess the special ability to supercharge their spells with additional Energy points, making their spells true terrors to behold. Against a fully-charged Blast, an enemy's Defense becomes all but meaningless.
<<back>>
<i>Tips:
With Focus and Favor, Mage can be used as a battery to charge up other puppets. In most cases you'll be better off pouring that energy into a spell, but it can be a lifesaver in some scenarios.
Mage's spells are highly inefficient if you only use them at their base cost, but become very powerful the more you invest. Try saving up to get the most out of your spells.
Do you wonder what might happen if you poured all 10 points of Energy into a spell? It may produce some interesting results...</i>
Mage's abilities are:
<<find "$puppets" "name" "\'Mage\'">>
<<actionlist $puppets[_pos]>>
</span><span id="content">Lucky you! MegaCorp® has generously provided you with many useful items to help you in your battles. (MegaCorp®, like your puppets, is one of those archetypes in the collective unconscious. You tend to find a MegaCorp® anywhere someone needs an allegory for modern corporate culture. The ® is mandatory.)
Items can be used by anyone, but have a limited stock. Your inventory is restocked at the start of every battle, and you can see the default amounts below.
Item effects are controlled by the Special stat. This includes both status effects and direct damage! The damage from attack items is calculated the same way as regular attacks, but with Special in place of Attack.
Though you start with few items, Rogue can add more with their Procure ability. (Don't think too much about where they're getting them from -- it is the role of the Rogue to find items, and in this realm the rules of the roles are more powerful than any logic.) Some of them are very expensive, though, and Rogue can't use the item in the same turn!
<<back>>
A list of items you'll have access to, and the default stock, is below:
<i><<itemlist>></i>
</span><span id="content">Direct attacks aren't the only thing you'll need to watch out for in the arena. Some abilities will produce effects that change what combatants can do or how they're affected by the flow of battle. Some of these effects are positive, and some are not.
All effects are powered by the Special stat. Special can protect you from some effects too.
<b><u>Control Effects</u></b>
Control effects restrict what you can do on a given turn. In addition, enemies are more likely to target off-balance and knocked-down puppets.
<i><b>Dizzy</b>
Can only use items and actions tagged [Basic].
<b>Stunned</b>
Can't act at all. However, it doesn't automatically end your turn: if cured, you can still act. This only lasts one turn, at which point it is replaced by <b>Alert</b>.
<b>Off-Balance</b>
Doesn't do anything on its own, but getting hit by a direct attack will turn this into Knocked Down.
<b>Knocked Down</b>
Prevents the use of normal actions and cuts Defense by half. Lasts until you expend 2 EN to right yourself.
<b>Winded</b>
Stops natural EN regeneration. This can be cured by resting.</i>
<b><u>Damage over Time</u></b>
Damage-over-time effects inflict damage at the end of every round. This damage is calculated by the formula:
<div class="formula">($base + $damper * (Attacker's Special - Defender's Defense)) * (ability weight)</div>
where ability weight is unique to the ability used to attach the effect. In addition, this damage never goes below 5. This damage is recalculated on every application; though the attacker's component remains fixed, alterations to the defender's defense stat will affect the results.
Notice that this uses the same base as the damage formula for regular attacks! Don't underestimate these effects.
<i><b>Burning</b>
This is the basic damage-over-time effect. You're on fire, so it's physical damage, ergo Defense protects you.
<b>Poisoned</b>
This checks against the defender's Special rather than their Defense. Knowledge of poisons helps you mitigate them, so it's a battle of wits.
<b>Perdition</b>
As Burning, but never wears off.</i>
<b><u>Stat Modifiers</u></b>
Stat modifiers change the subject's Attack, Defense, or Special stats, either positively or negatively. Unlike other effects, multiple copies of these effects can be applied to the same combatant. Their power is calculated by the formula
<div class="formula">($effbase + $damper * (Attacker's Special - Defender's Special)) * (ability weight)</div>
where ability weight is unique to the ability used to attach the effect. Boost effects are not affected by the target's Special.
<i><b>Injury, Pain, and Headache</b>
These effects reduce <b>Attack</b>, <b>Defense</b>, and <b>Special</b>, respectively.
<b>ATK Boost, DEF Boost, and SPC Boost</b>
These do exactly what they say on the tin.
<b>Blessing and Curse</b>
Blessing boosts all stats; Curse reduces all stats. By default, they produce a weaker effect than the individual effects, but Mage can make them much stronger. Unlike the basic effects, these cannot be stacked.
<b>Forsaken</b>
Massively reduces Defense. Unlike other debuffs, this can make the stat go into the negatives, causing the enemy to take more damage from attacks.
<b>Shield</b>
Reduces incoming damage by a flat <<print $SHIELD_FACTOR*100>>%.</i>
<b><u>Protection Effects</u></b>
These effects protect you from other effects.
<i><b>Alert</b>
Protects against Stunned.
<b>Chi Shield</b>
Protects against all negative effects.
<b>Stasis</b>
Prevents addition, removal, or decay of all other effects.</i>
<b><u>Stances</u></b>
Stances change the way you interact with battle and your opponents. They usually only last one round, and, with the exception of Hidden, only one can be active at a time.
<i><b>Berserker</b>
Increases both damage dealt and damage received by <<print $berserk_factor*100>>%.
<b>Defender</b>
Reduces both damage dealt and damage received by <<print $berserk_factor*100>>%.
<b>Protector</b>
Gain a small Defense boost and take all direct hits targeted at an ally. (Area attacks will still hit everyone.)
<b>Martyr</b>
Forces all direct attacks to target you.
<b>Hidden</b>
Can't be targeted by direct attacks. (You're still vulnerable to area attacks.) This doesn't work if you're the only possible target.</i>
<<back>></span><span id="content">Mabel looks on anxiously as Dipper falls to the ground, placed in stasis by the arena regulations. She laughs suddenly, with a nervous edge. "He'll be fine! Right? They told us that, at the beginning, that like, no one can die here, right? So he'll be fine, he's definitely fine. You're not scaring me." Her manic grin comes back. "And now that he's not crampin' my style, it's time to have some REAL fun!"
She throws her arms to the sky, and you watch as her feet slowly leave the ground. There is a flash, and suddenly her skirt has become a glorious battle gown, sparkling with gemstones embroidered in a tapestry of stampeding unicorns.
Rainbow-colored sparks fly from Mabel's hands as she looks down on you with the face of a mad god.
"Mega Mabel... ACTIVATE!!!"
<span class="btn">[[Continue...|Battle!]]</span></span>
<<run $enemies[1].changeInto("Mega Mabel")>>
<<set $B.event to true>><span id="content">"Mabel! No!!" Dipper rushes over to Mabel's unconscious body, but she has already been placed in stasis as per the arena regulations. "Wh-what happened? What did you do to her?! You said we wouldn't be hurt!" he yells through teary eyes.
Hyperventilating, Dipper desperately flips through his journal, looking increasingly panicked. "A-ah... ah...!" Finally, he slams his hand down on a page near the end. "I don't care about the danger! I have to! I have to save Mabel!" He inhales, and screams it all out in a single breath: "TIER BANKOROK MANTORK PARGON PARGON PARGON <i>PARGON!!!</i>"
Purple runes crackle at his feet. He gasps sharply, and his head snaps back for a moment before hanging forward limply.
You count a breath, and then his head rises again, slowly. His expression is... surprisingly calm compared to the panic he showed just before. He is smiling placidly, and there is something in his eyes that you can't quite place.
"Ha ha," Dipper laughs quietly. "This doesn't feel bad at all! I don't know what the journal was talking about." With a speed that startles you, he flings the book over his shoulder without even a second glance.
He stretches languidly, and you hear joints pop. "I don't need that old thing to beat you, anyway." He looks straight at you, and can't shake the distinct feeling that there is something <i>else</i> behind those eyes now.
And... was his shadow always that big?
<span class="btn">[[Continue...|Battle!]]</span></span>
<<run $enemies[0].changeInto("Big Dipper")>>
<<set $B.event to true>><span id="content">Princess Bubblegum looks dispassionately at her fallen comrades and sighs. "Oh, well. I can't expect them to do everything, I suppose." She flicks a switch on her gun, which starts humming loudly. "I'll just have to finish this myself."
<span class="btn">[[Continue...|Battle!]]</span></span>
<<run $enemies[1].changeInto("PB alone")>>
<<set $B.event to true>><span id="content">Darwin cries out in grief and fury. "Gumball! Anais!" he screams shrilly, shaking his fists at the heavens while his eyes blaze with inner fire. "I will avenge youuuu!!"
<div id="actEffect"><<addeffect $enemies[2] "ATK Boost" 3 10>>
<<addeffect $enemies[2] "DEF Boost" 3 10>>
<<addeffect $enemies[2] "SPC Boost" 3 10>></div>
<span class="btn">[[Continue...|Battle!]]</span></span>
<<set $B.event to true>><span id="content">Gumball flicks his eyes over the fallen bodies of his siblings, chewing his lip thoughtfully. "So, uh," he says, burying his hands in his pockets. "You know, I've always been in favor of living to fight another day. I think we can all see where this is going, so let's skip the part where I get beaten up and just call it a win for you, deal?"
<b><i>You can accept Gumball's surrender with the "Spare" command from the battle menu.</i>
<span class="btn">[[Continue...|Battle!]]</span></span>
/* the cutscene for refusing is in the action phase */
<<set $B.surrender to true>>
<<set $enemy_to_spare to "Gumball">>
<<set $B.event to true>><span id="content">Anais turns to her right, and stares at Gumball sprawled in stasis. She looks to her right, and sees Darwin crumpled in a ball. Then she looks at you.
"Okay, soooo..." she begins, sucking air through her teeth. "You know, I was only really going along with this because of them. I know, I know, I shouldn't have let them suck me in, but, well, brothers, what can you do." She shrugs and gives a little laugh. "Now that they're out of it, why don't we be sensible people and just agree to end it here, okay? I'll tell them I totally put up a good fight and we can all go home in one piece." She extends a hand. "Let's shake on it, alright?"
<b><i>You can accept Anais' surrender with the "Spare" command from the battle menu.</i></b>
<span class="btn">[[Continue...|Battle!]]</span></span>
/* the cutscene for refusing is in the action phase */
<<set $B.surrender to true>>
<<set $enemy_to_spare to "Anais">>
<<set $B.event to true>><span id="content">"Ohhh nooooo!" Steven wails. Before you can react, he dashes forward and scoops the fallen gems into his shirt. He looks up at you, arms nearly overflowing with shimmering stones. "U-um, that was a cool fight, even if we lost. You're pretty strong." He shifts his weight, and the gems sparkle enticingly.
Steven sniffles and looks around, clearly feeling awkward. "So... is it over now? Do we get to go home?" He looks at you again, lip wobbling like he's about to cry. "...You're not going to hurt me, right?"
<b><i>You can accept Steven's surrender with the "Spare" command from the battle menu.</i></b>
<span class="btn">[[Continue...|Battle!]]</span></span>
<<set $B.surrender to true>>
<<set $enemy_to_spare to "Steven">>
<<set $B.event to true>>
<<run $enemies[3].removeEffect(0)>> /* this will remove the Guarded marker */<span id="content"><<nobr>>/*<i>[[Notes for testers]]</i>
<i><<link "Debug: open all doors">><<set $P to {at: 2, gf: 2, gum: 2, su: 2}>><<goto "Hub">><</link>></i>*/
<<if $C.su1.thief is true>>Oh, darn it! The gems vanished into thin air! Looks like you can't take any souvenirs from battles.<br/><br/>
<<unset $C.su1.thief>><</if>><</nobr>><i>Current difficulty: <<print $difficulty>>
You can test difficulty modes through this toggle:
[[Hard|Hub][$difficulty = "hard"]]: smart targeting will only target vulnerable characters
[[Medium|Hub][$difficulty = "medium"]]: smart targeting will preferentially target vulnerable characters, but other targets can be considered
[[Easy|Hub][$difficulty = "easy"]]: disables smart targeting</i>
You're sitting in a waiting room -- or standing, if you prefer. It's almost offensively boring, the only furniture being a single bench along the back wall. The bench is plain, polished wood, with no pits or scratches but also no decoration or adornment to speak of. It is not notably comfortable or uncomfortable, just kind of... benchy. The floor and walls are smooth stone, the generic kind that has no interesting patterns or irregularities, just flat grey lifelessness. It's mildly cold to the touch, but the room itself is of an unobjectionable temperature.
You really want to fight something.
To the side is a screen explaining [[how things work in the arena.|Tutorial]]
Behind you is a wall where you may peruse your [[achievements]].
Your puppets stand vacantly beside you, silent and still with no battle to fight. You can only take three with you, but [[you can pick which ones.|Party Manager]]
Along the far wall, spread out in a semicircle, are four perfectly circular gates, each with a colorful logo flying above:
<<nobr>>
<div class="logogrid">
<div class="logoitem a">
[img[setup.Path + "AT_logo.png"][Adventure Time][$scenario = "at1"]]
</div>
<div class="logoitem b">
[img[setup.Path + "GF_logo.png"]["Gravity Falls"][$scenario = "gf1"]]
</div>
<div class="logoitem c">
[img[setup.Path + "TAWOG_logo.png"]["The Amazing World of Gumball"][$scenario = "gum1"]]
</div>
<div class="logoitem d">
[img[setup.Path + "SU_logo.png"]["Steven Universe"][$scenario = "su1"]]
</div>
</div>
<</nobr>>
</span>
<<set $tutorial to false>><span id="content">These foes are from the world of <b><i>Adventure Time</i></b>.
<h4>Princess Bubblegum</h4><br/>The ruler of the Candy Kingdom, a strange civilization whose inhabitants she grew in her lab. She herself was born from the Mother Gum, a hive mind formed after the reintroduction of magic to the world. She has lived for the better part of a millennium, and in that time has gained unparalleled knowledge of science and machinery. Though she prefers to let her underlings handle most difficult jobs, she's no stranger to getting her hands dirty. She won't have her entire kingdom at her disposal in the arena, but commanding is a skill you never forget, and she can push her allies to heights they would never achieve on their own.
<u>Abilities Witnessed:</u>
<h2>Finn the Human</h2>
Finn is the last of his kind: Most humans perished following the disaster that returned magic to the world, but he, somehow, survived. He was found and adopted by Jake's family, and trained to hunt the fiercest of monsters. He lives on the outskirts of the Candy Kingdom, and is employed by Princess Bubblegum to defend the kingdom from threats when he's not searching for adventure on his own. Though young, reckless and, shall we say, not the sharpest tool in the shed, his strength is not to be underestimated -- not many monsters get to make that mistake twice.
<h2>Jake the Dog</h2>
A talking dog with the magical power to change his shape. He and Finn were raised together as family, and he always tags along on Finn's adventures as the semi-responsible big brother. His shapeshifting powers have given his body a rubber-like texture that lets him shrug off most attacks (but his pain sense remains as acute as ever, alas).
<<back>></span><<include "Gate">>
You find yourself in a field of grass, on what appears to be a pleasant summer day. The sun beats down from behind fluffy white clouds, sailing idly through a brilliant blue sky.
Your attention is drawn to three figures opposite you. Despite the apparent space of the field, they're close enough that you can see their features, which you immediately notice are... weird.
Well, the one on the right looks normal enough: a light-skinned boy of about 11 or 12, dressed in a plain blue shirt and pants and wearing a frog-green backpack. His eyes light up when he sees you, and... oh no, what is that on his <i>head?</i> You thought it was a helmet or a hat or something, but no, it's... you're pretty sure it's <i>a bear's skinned face</i>, with the fur bleached white. His face is poking out from where the mouth should be -- the whole thing is wrapped around his head like a second skin. Oh geez. You take that back about him being normal. And you really hope that thing doesn't have fleas.
And the figure next to him... she's tall and thin, with a straight, poised posture and long, pink dress that puts you in mind of a princess. The gold tiara on her head is probably another clue. She almost looks like a normal person, except her skin is... pink. Not the pink of a flush or a sunburn, but the bright, artificial pink of bubblegum. Upon closer inspection, you see her "hair" isn't what you thought it was, either -- you can't see any individual strands, just a solid mass of purplish-pink... <i>something</i>, molded into the shape of what human hair should look like. It's so long, almost down to her ankles. If she notices you staring, she doesn't comment. She just hangs back slightly, staring at you with a placid smile that does nothing to reassure you.
To the left is what appears to be a dog. It certainly has floppy ears, a snout, short yellow fur, and a round, almost spherical belly; everything you'd expect from a dog. But it's also walking upright, with noodly, very human-like arms, and is staring at you with a curious intelligence.
"Hey!" it -- he? -- says suddenly, pointing at you with those thin, snakelike arms. He has five fingers, you notice. "That guy looks like you, Finn! D'you think it's another human?"<<nobr>>
<<if $achievements.get("Bubblegum Chewer") < 1>>
<<run $achievements.set("Bubblegum Chewer",1)>>
<</if>>
<<if $achievements.get("Scourge of Ooo") < 1>>
<<run $achievements.set("Scourge of Ooo",1)>>
<</if>>
<</nobr>>You step through the gate. There is a flash of light, and then...
...<<set $C.at1.introductions to true>><<include "AT1 hub">>
<<if $choice is "what">><b>"What?"</b>
"Uh." The dog coughs and looks embarrassed. "Sorry, that was probably a weird thing to say. Uh..."
"Oh, please forgive our lack of manners!" the princess chirps, voice bubbly. "We are just so excited to find another human! Let me introduce myself."<<elseif $choice is "who">><b>"Who are you guys?"</b>
"Oh, where are my manners?" the princess chirps, voice bubbly. "I haven't introduced myself!"<</if>> She spreads her arms wide, as if she is addressing the whole world. "I am Princess Bubblegum, ruler of the Candy Kingdom, and these are my friends, Jake the Dog and Finn the Human!"
"Ooh! Ooh! That's me!" the boy squeaks, jumping up and waving his hand. The dog -- Jake? -- just continues staring at you.
"They defend my kingdom from the evils that threaten it, of which there are, sadly, many." She looks around. "Unfortunately, we appear to have been... hm... misplaced. This area seems to be caught in some sort of dimensional loop; no matter how far I travel, I always find myself coming back to the same place. We know not how we got here, but we are apparently supposed to face some mysterious opponent."<<if $C.at1.human is "">>
"Areyouahumanareyouareyou?!" the boy shouts out in one breath. He looks like he was going to burst if he had to hold the question in any longer. "Everyone says there are no more humans but you look like me so maybe that's not true hey are there more where you come from?"<</if>><<if $C.at1.scene < 1>>"Huh?"
"YOU'RE DARN RIGHT WE'LL FIGHT YOU! YEAH!!" The boy whoops and draws an old, rusty sword that's nearly as tall as he is, stabbing it into the air. "Hey Jake! WHAT TIME IS IT?"
"Wait, Finn, don't you wanna know--"
"We can ask questions after it has been subdued," the princess says matter-of-factly, pulling bug-eyed green goggles over her face. "This must be the opponent we were meant to fight." She draws some kind of mad science ray gun from her pack, and thrusts her arms towards the sky dramatically. "Jake the magic dog and Finn the human boy! Prove your strength as champions by defending me from this miscreant!"
"So we're just gonna..."
"BATTLE TIME, JAKE!" The boy whoops again.
The dog shrugs, and shifts his feet. "Eh, well, who am I to argue?"<<elseif $C.at1.choice is "eat">>You reach out and grab the bubblegum woman's hair. It's firm under your fingers, but you tear off a piece easily. She seems too stunned to do anything but watch as you place it in your mouth and chew slowly.
Mmm. Like you thought, it really is bubblegum. The taste is strong, with a fruity undertone. It's quite tough, and chewing it gives your jaw a good workout. When the flavor starts to fade, you experimentally blow a bubble. It almost covers your vision before it pops, splattering pink everywhere.
The princess and the dog are still just staring at you in shock, but the boy looks absolutely furious, his face flushing beet red. He shoves you almost hard enough to make you fall, and your puppets flow in between you to form a defensive perimeter.
"YOU MONSTER!" he shrieks, his voice a comically high whine. "I won't let you touch her ever again!!"
"It's not that big of a deal, Finn," the princess says calmly. "I'll regrow it in no time."
The boy doesn't seem to hear her. He just screams and draws an old, rusty sword that's nearly as tall as he is. The princess sighs softly and draws some kind of mad science ray gun from her pack. "Oh well. I suppose this will be a good test run. And this is probably our mystery opponent, anyway." She raises her arms to the sky dramatically. "To arms, everyone!"<<elseif $C.at1.choice is "respectable">>In a flash, the boy has drawn an old, rusty sword that's nearly as tall as he is. "ALRIGHT!!" he whoops. "Hey Jake! WHAT TIME IS IT?"
"Battle time!" the dog replies with a grin, and before your eyes, you see his whole body... <i>stretch</i>, as if it's made of rubber. His legs elongate until he is wobbling comically like a clown on stilts, and uses his long legs to step easily over to the boy, at which point he shrinks down again in an instant. It happens so fast you wonder if you hallucinated the whole thing.
The princess steps back and nods to herself. "I see." She draws some kind of mad science ray gun from her pack, and thrusts her arms towards the sky dramatically. "Jake the magic dog and Finn the human boy! Prove your strength as champions by defending me from this miscreant!"<<else>>In a flash, the boy has drawn an old, rusty sword that's nearly as tall as he is. "YOU'RE DARN RIGHT WE'LL FIGHT YOU!!" he says with a whoop.
The princess steps back and nods to herself. "I see. You must be the opponent we are meant to fight." She draws some kind of mad science ray gun from her pack, and thrusts her arms towards the sky dramatically. "Jake the magic dog and Finn the human boy! Prove your strength as champions by defending me from this miscreant!"<</if>>
<center><span class="btn">[[Begin!|Preparation][$scenario = "at1"]]</span></center><<set $C.at1.asked_abt_humans to true>><<include "AT1 hub">>
<<if $C.at1.choice is "alt">><b>"Why do you want to meet a human so bad?"</b><<else>><b>"What happened to the humans?"</b><</if>>
Princess Bubblegum shakes her head gravely, losing her smile for the first time. "Alas, they did not adapt well to the return of magic. It was a rather cataclysmic event, according to what records I have found. Following the destruction of their civilization, humans were hunted by vampires and other monsters, until eventually they were no more." She pauses and looks thoughtful. "I once had a... friend..." Her voice deepened there, and there is a meaningful pause before she continues, "...who helped protect humans from those monsters. She told me that one plucky group escaped the mainland and set sail for parts unknown, hoping to find another land where they could be safe. But that was a long time ago, and we have not heard or seen of humans since..." Her face brightens again. "Until now!"You're standing in a grassy field, on what appears to be a pleasant summer day. The sun beats down from behind fluffy white clouds, sailing idly through a brilliant blue sky.
You're sharing this space with three very weird figures: a talking yellow dog with human hands; a tall, smiling princess you suspect is made out of bubblegum; and a human boy, ordinary except for the fact he's wearing a bear pelt for a hat.<<nobr>>
<<set $C.at1.scene++>>
<</nobr>><<set $C.at1.human = "yes">><<include "AT1 hub">>
<b>"Yes, I am a human."</b>
"Wow! Cool!!" The boy jumps up and down with excitement. "Where did you come from? Are there more of you? Can I go there?"
Behind him, the princess' expression shifts subtly. She is looking at you much more intently now, like you're some sort of curiosity that belongs in a museum... or a lab.<<set $C.at1.human = "no">><<include "AT1 hub">>
<<if $C.at1.choice is "backpedal">><b>"Uh, wait, did you say 'human'? Sorry, I thought you meant... uh... 'hoo-man'. I am definitely not a human."</b><<else>><b>"No, I am not a human."</b><</if>>
All three of them look disappointed, especially the boy. "Aw," he says.
"Ah well," the dog says, patting him on the back. "Maybe next time."<<set $C.at1.asked_abt_kingdom to true>><<include "AT1 hub">>
<b>"...Candy Kingdom?"</b>
"Yes!" Bubblegum says without missing a beat. "I built the Candy Kingdom and the candy people with my own hands! They're very sweet -- so sweet that everyone wants a piece of them! That's why I need champions like these boys to protect it."<br/>
>[[fite me|AT1 fite]]<br/>
<<if passage() is "AT1 landing">>
>[[What?|AT1 Introductions][$C.at1.choice = "what"]]<br/>
<</if>>
<<if $C.at1.introductions isnot true>>
>[[Who are you guys?|AT1 Introductions][$C.at1.choice = "who"]]<br/>
<</if>>
<<if passage() is "AT1 Introductions">>
>[[Oh. I'm that opponent.|AT1 fite][$C.at1.choice = "respectable"]]<br/>
<</if>>
<<if $C.at1.confirmed_otherworld is true>>
>[[I brought you here. I'm your opponent. Fight me.|AT1 fite][$C.at1.choice = "respectable"]]<br/>
<</if>>
<<if $C.at1.introductions is true>>
<<if passage() isnot "AT1 Introductions">>
>[[I'm the opponent you need to fight.|AT1 fite][$C.at1.choice = "respectable"]]<br/>
<</if>>
<<if $C.at1.asked_abt_humans isnot true>>
>[[What happened to the humans?]]<br/>
<</if>>
<<if $C.at1.asked_abt_kingdom isnot true>>
>[[...Candy Kingdom?]]<br/>
<</if>>
<</if>>
<<if $C.at1.human is "">>
>[[Yes, I am a human.]]<br/>
>[[No, I am not a human.]]<br/>
<<elseif $C.at1.asked_abt_humans isnot true>>
>[[Why do you want to meet a human so bad?|What happened to the humans?][$C.at1.choice = "alt"]]<br/>
<</if>>
<<if $C.at1.human is "yes">>
<<if $C.at1.confirmed_otherworld isnot true>>
>[[Sorry to disappoint you, but I'm not from your world.]]<br/>
<</if>>
>[[Uh, wait, did you say "human"? Sorry, I thought you meant... uh... "hoo-man". I am definitely not a human.|No, I am not a human.][$C.at1.choice = "backpedal"]]<br/>
<</if>>
>[[(Eat some of the bubblegum woman's hair.)|AT1 fite][$C.at1.choice = "eat"; $C.at1.scene = 1]]<<if tags().includes("AT1")>>
<<include "AT1 choices">>
<<elseif tags().includes("GF1")>>
<<include "GF1 choices">>
<<elseif tags().includes("GUM1")>>
<<include "GUM1 choices">>
<<elseif tags().includes("SU1")>>
<<include "SU1 choices">>
<<elseif tags().includes("AT2")>>
<<include "AT2 choices">>
<<elseif tags().includes("GF2")>>
<<include "GF2 choices">>
<<elseif tags().includes("GUM2")>>
<<include "GUM2 choices">>
<<elseif tags().includes("SU2")>>
<<include "SU2 choices">>
<</if>><<set $C.at1.confirmed_otherworld to true>><<include "AT1 hub">>
<b>"Sorry to disappoint you, but I'm not from your world."</b>
The princess strokes her chin. "A dimensional traveler, then?" she says, not even fazed. "Why, that's even more fascinating! Do you know what brought us here? Perhaps you can help us track down this opponent we're supposed to fight."<<back>><br/><br/>
Go on. Bask in your glory.<br/><br/>
<<for _key, _value range $achievements>>
<<achievement _key>>
<</for>>Finn sits up slowly, groaning and rubbing his head. Jake doesn't get up at all, preferring instead to moan from the ground while waving his arms melodramatically.
Princess Bubblegum just brushes some dirt off her dress, hardly fazed at all. "Hm!" she chirps. "So it's true what we were told -- despite the intensity of that battle, I feel as good as new!" She taps her chin, staring off into space. "A simulated combat environment with no real-world consequences... the possibilities are <i>fascinating!</i> Finn, I could train you against all kinds of monsters here, and you wouldn't have to worry about getting hurt! How strong could you become, I wonder...? This necessitates further study! We must return sometime!"
"U-uh, maybe later, PB." Finn has scuttled away to hide behind Princess Bubblegum, and now looks at you with abject terror. "I just wanna go home now."
Bubblegum makes a disappointed <i>hrrm</i> noise, but says, "Yes, I suppose we have other work to do." She waves at you, similing brightly. "Farewell, mysterious and terrifying stranger!"
>[[Return to the hub|Hub]]
<<if $P.at < 1>><<set $P.at = 1>><</if>><<widget "achievement">>
<<set _key = $args[0]>>
<<set _value = $achievements.get(_key)>>
<b><<if _value < 2>>??????<<else>>_key<</if>></b><br/>
<<if _value eq 0>>
<<switch _key>>
<<case "Bubblegum Chewer" "Scourge of Ooo">>
<i>Enter the Adventure Time gate to learn a hint.</i>
<<case "Mystery Solver" "Tree Feller" "Star Crusher">>
<i>Enter the Gravity Falls gate to learn a hint.</i>
<<case "Watterson Wrecker" "Thinner Than Water" "Princess With A Thousand Enemies" "Thicker Than Blood">>
<i>Enter the Amazing World of Gumball gate to learn a hint.</i>
<<case "Gem Smasher" "Pearl Connoisseur" "Garnet Collector" "Amethyst Curator">>
<i>Enter the Steven Universe gate to learn a hint.</i>
<<case "Widowmaker">>
<i>Enter the second Adventure Time gate to learn a hint.</i>
<<case "Demonologist">>
<i>Enter the second Gravity Falls gate to learn a hint.</i>
<<case "Orphaner">>
<i>Enter the second Amazing World of Gumball gate to learn a hint.</i>
<<case "Tyrant">>
<i>Enter the second Steven Universe gate to learn a hint.</i>
<<case "Bully">>
<i>This achievement is a secret.</i>
/*<<case "Gladiator" "Independent" "Does It Make A Sound?" "The Redemption" "Alone Together">>*/
<<default>>
<i>This achievement isn't available yet.</i>
<</switch>>
<<else>>
<<switch _key>>
<<case "Bubblegum Chewer">>
Defeat Princess Bubblegum and associates.
<<case "Scourge of Ooo">>
Defeat Princess Bubblegum before either Finn or Jake.
<<case "Mystery Solver">>
Defeat the Mystery Twins.
<<case "Tree Feller">>
Defeat Big Dipper.
<<case "Star Crusher">>
Defeat Mega Mabel.
<<case "Watterson Wrecker">>
Defeat the Wattersons.
<<case "Thinner Than Water">>
Witness cowardice.
<<case "Thicker Than Blood">>
Witness loyalty.
<<case "Princess With A Thousand Enemies">>
Witness cunning.
<<case "Gem Smasher">>
Defeat the Crystal Gems.
<<case "Pearl Connoisseur">>
When fighting the Crystal Gems, save Pearl for last.
<<case "Garnet Collector">>
When fighting the Crystal Gems, save Garnet for last.
<<case "Amethyst Curator">>
When fighting the Crystal Gems, save Amethyst for last.
<<case "Bully">>
Defeat the Crystal Gems entirely by forcing them to defend Steven. You meanie.
<<case "Widowmaker">>
Defeat Marceline.
<<case "Demonologist">>
Defeat Bill Cipher.
<<case "Orphaner">>
Defeat Nicole.
<<case "Tyrant">>
Defeat Rose Quartz.
<<case "Gladiator">>
Win the final challenge.
<<case "Independent">>
Bonnibel Bubblegum was your last opponent.
<<case "Does It Make A Sound?">>
Dipper was your last opponent.
<<case "The Redemption">>
Gumball was your last opponent.
<<case "Alone Together">>
Stevonnie was your last opponent.
<<case "Last One Standing">>
Win a match with only one puppet remaining.
<<case "Tactician">>
Win a match will all puppets intact.
<</switch>>
<</if>>
<br/><br/>
<</widget>>
<<widget "achievementcheck">>
<<set _end = $B.kills.length-1>>
<<switch $scenario>>
<<case "at1">>
<<if $achievements.get("Bubblegum Chewer") < 2>>
<<run $achievements.set("Bubblegum Chewer",2)>>
<i>Achievement Unlocked:</i> <<achievement "Bubblegum Chewer">>
<</if>>
<<if $achievements.get("Scourge of Ooo") < 2>>
<<if $B.kills[0] is "Princess Bubblegum">>
<<run $achievements.set("Scourge of Ooo",2)>>
<i>Achievement Unlocked:</i> <<achievement "Scourge of Ooo">>
<</if>>
<</if>>
<<case "gf1">>
<<if $achievements.get("Mystery Solver") < 2>>
<<run $achievements.set("Mystery Solver",2)>>
<i>Achievement Unlocked:</i> <<achievement "Mystery Solver">>
<</if>>
<<if $achievements.get("Tree Feller") < 2>>
<<if $B.kills[_end] is "Big Dipper">>
<<run $achievements.set("Tree Feller",2)>>
<i>Achievement Unlocked:</i> <<achievement "Tree Feller">>
<</if>>
<</if>>
<<if $achievements.get("Star Crusher") < 2>>
<<if $B.kills[_end] is "Mega Mabel">>
<<run $achievements.set("Star Crusher",2)>>
<i>Achievement Unlocked:</i> <<achievement "Star Crusher">>
<</if>>
<</if>>
<<case "gum1">>
<<if $achievements.get("Watterson Wrecker") < 2>>
<<run $achievements.set("Watterson Wrecker",2)>>
<i>Achievement Unlocked:</i> <<achievement "Watterson Wrecker">>
<</if>>
<<if $achievements.get("Thinner Than Water") < 2>>
<<if $B.kills[_end] is "Gumball">>
<<run $achievements.set("Thinner Than Water",2)>>
<i>Achievement Unlocked:</i> <<achievement "Thinner Than Water">>
<</if>>
<</if>>
<<if $achievements.get("Princess With A Thousand Enemies") < 2>>
<<if $B.kills[_end] is "Anais" and $anais_trap is true>>
<<run $achievements.set("Princess With A Thousand Enemies",2)>>
<i>Achievement Unlocked:</i> <<achievement "Princess With A Thousand Enemies">>
<</if>>
<</if>>
<<if $achievements.get("Thicker Than Blood") < 2>>
<<if $B.kills[_end] is "Darwin">>
<<run $achievements.set("Thicker Than Blood",2)>>
<i>Achievement Unlocked:</i> <<achievement "Thicker Than Blood">>
<</if>>
<</if>>
<<case "su1">>
<<if $achievements.get("Gem Smasher") < 2>>
<<run $achievements.set("Gem Smasher",2)>>
<i>Achievement Unlocked:</i> <<achievement "Gem Smasher">>
<</if>>
<<if $achievements.get("Bully") < 2>>
<<if $B.bully is true>>
<<run $achievements.set("Bully",2)>>
<i>Achievement Unlocked:</i> <<achievement "Bully">>
<</if>>
<</if>>
<<if $achievements.get("Pearl Connoisseur") < 2>>
<<if $B.kills[_end] is "Pearl">>
<<run $achievements.set("Pearl Connoisseur",2)>>
<i>Achievement Unlocked:</i> <<achievement "Pearl Connoisseur">>
<</if>>
<</if>>
<<if $achievements.get("Garnet Collector") < 2>>
<<if $B.kills[_end] is "Garnet">>
<<run $achievements.set("Garnet Collector",2)>>
<i>Achievement Unlocked:</i> <<achievement "Garnet Collector">>
<</if>>
<</if>>
<<if $achievements.get("Amethyst Curator") < 2>>
<<if $B.kills[_end] is "Amethyst">>
<<run $achievements.set("Amethyst Curator",2)>>
<i>Achievement Unlocked:</i> <<achievement "Amethyst Curator">>
<</if>>
<</if>>
<<case "gf2">>
<<if $achievements.get("Demonologist") < 2>>
<<run $achievements.set("Demonologist",2)>>
<i>Achievement Unlocked:</i> <<achievement "Demonologist">>
<</if>>
<<case "gum2">>
<<if $achievements.get("Orphaner") < 2>>
<<run $achievements.set("Orphaner",2)>>
<i>Achievement Unlocked:</i> <<achievement "Orphaner">>
<</if>>
<<case "su2">>
<<if $achievements.get("Tyrant") < 2>>
<<run $achievements.set("Tyrant",2)>>
<i>Achievement Unlocked:</i> <<achievement "Tyrant">>
<</if>>
<</switch>>
<<if $achievements.get("Last One Standing") < 2>>
<<set _d = 0>>
<<for _puppet range $puppets>>
<<if _puppet.dead>>
<<set _d++>>
<</if>>
<</for>>
<<if _d eq 2>>
<<run $achievements.set("Last One Standing",2)>>
<i>Achievement Unlocked:</i> <<achievement "Last One Standing">>
<</if>>
<</if>>
<<if $achievements.get("Tactician") < 2>>
<<set _d = 0>>
<<for _puppet range $puppets>>
<<if _puppet.dead>>
<<set _d++>>
<</if>>
<</for>>
<<if _d eq 0>>
<<run $achievements.set("Tactician",2)>>
<i>Achievement Unlocked:</i> <<achievement "Tactician">>
<</if>>
<</if>>
<</widget>>You're standing in a clearing, in a forest at dusk. Tall trees, an even mix of deciduous and coniferous, spread out in all directions as far as you can see. Their leaves rustle just on the edge of hearing as a faint breeze blows past, making the shadows dance as the sun twinkles in and out from behind the canopy.
Across from you are two <<if $C.gf1.introductions isnot true>>maybe-twins, a boy hunched over a huge journal and a cheerful girl in a bedazzled sweater.<<else>>twins: Dipper, a boy hunched over a huge journal, and Mabel, a cheerful girl in a bedazzled sweater.<</if>><<nobr>>
<<set $C.gf1.scene++>><</nobr>><<include "Gate">>
You find yourself in a forest at dusk. Tall trees, an even mix of deciduous and coniferous, spread out in all directions as far as you can see. Their leaves rustle just on the edge of hearing as a faint breeze blows past, making the shadows dance as the sun twinkles in and out from behind the canopy.
"I'm telling you, something is <i>definitely</i> weird here!"
Two kids, a boy and a girl, step out from the trees, and stop dead when they see you.
They look almost identical -- siblings, you think, if not twins. Both have pale skin, chocolate-brown hair, and hazel eyes that gawk at you from pudgy faces. Both look around 12 years old, if you had to guess.
The boy is the one who spoke. He's clutching a big, hard-bound book that's almost the size of his torso. There's no title, just a gold plate in the shape of a six-fingered hand, inset with the number "3". He's wearing a navy blue jacket over a thick red shirt, and his mousy hair peeks out from under a white-and-blue baseball cap with a pine tree on the front. He stares at you like he's trying to figure you out, gears clearly whirring behind his eyes.
The girl is -- you only took your eyes off her for a moment, but she's already walked straight up to puppets without a hint of fear, braces glinting in her toothy grin. Where the boy is hunched and withdrawn, she seems to fill and illuminate the whole space. Even her wardrobe choices are literally brighter than his -- she wears a neon pink sweater covered in glittering pins and stickers, most prominently a bright yellow shooting star leaving a rainbow trail. Her long hair is kept back with a pink headband.
She raps her knuckles on Fighter's helmet and giggles at the ringing noise it makes. "Mabel! What are you doing?!" the boy cries out, voice quavering with panic.<<nobr>>
<<if $achievements.get("Mystery Solver") < 1>>
<<run $achievements.set("Mystery Solver",1)>>
<</if>>
<<if $achievements.get("Tree Feller") < 1>>
<<run $achievements.set("Tree Feller",1)>>
<</if>>
<<if $achievements.get("Star Crusher") < 1>>
<<run $achievements.set("Star Crusher",1)>>
<</if>>
<</nobr>><br/>
>[[fite me|GF1 fite]]<br/>
<<if $C.gf1.introductions isnot true>>
<<if $C.gf1.mabeldone isnot true>>
>[[Who are you guys?|GF1 introductions][$C.gf1.mabeldone = true]]<br/>
<<else>>
>[[Who are you guys, anyway?|GF1 introductions][$C.gf1.mabeldone = true]]<br/>
<</if>>
<<elseif $C.gf1.introductions is true>>
>[[I'm the one you need to fight.|GF1 fite][$C.gf1.choice = "respectable"]]<br/>
>[[What do you think this is, an escape-the-room puzzle? This is an RPG! Fight me already!|GF1 fite][$C.gf1.choice = "meta"]]<br/>
<<if $C.gf1.asked_abt_origins isnot true>>
>[[Where are you from?]]<br/>
<</if>>
<</if>>
<<if passage() is "These are my puppets. They help me fight things.">>
>[[Things like you. Fight me!|GF1 fite]]<br/>
<</if>>
<<if passage() is "You know, I think I don't actually know what these puppets are myself. Something about... archetypes? I don't get it.">>
>[[You know the best way to learn about them? Fight them!|GF1 fite]]<br/>
<</if>>
<<if $C.gf1.mabeldone isnot true>>
>[[Stop doing that.]]<br/>
>[[(Wait and see what the girl does next)]]<br/>
<</if>>
<<if $C.gf1.puppets_explained is "asked">>
<<if passage() is "GF1 introductions">>
>[[Wait, what do you mean "more"?]]<br/>
<</if>>
>[[These are my puppets. They help me fight things.]]<br/>
>[[You know, I think I don't actually know what these puppets are myself. Something about... archetypes? I don't get it.]]<br/>
<</if>>
<<if passage() is "(Wait and see what the girl does next)" and $C.gf1.mabeldone is true>>
>[[Yes.]]<br/>
>[[No.]]<br/>
<</if>>
<<if passage() is "Yes." or passage() is "No.">>
>[[Sure. You just need to fight me.|GF1 fite][$C.gf1.choice = "respectable"]]<br/>
<</if>><<if $B.kills[1] is "Mega Mabel">>The twins' eyes snap open, and they stagger to their feet. Mabel sways as if from vertigo while Dipper frantically pats himself down for injuries. "What was that?!" he says. "The voice was totally lying! That <i>hurt!</i> I th-thought we were goners, for real!"
"Oh, don't be a baby," Mabel says. "I had to keep it up after you tapped out early! I was all like--" She waves her arms around excitedly. "--ZOOM, POP, BOOM, rainbows everywhere! It was totally awesome, we gotta try again so you can see!"
"Nope. Noooo thanks," Dipper says emphatically, tapping on the return portal behind him. "Let's get out of here before anything else happens."
"Okay fiiiine," Mabel whines. "If you <i>really</i> think swindling tourists is better than cool no-consequence magic battles..."
"<i>Mabel.</i>"
She looks back at you with a smirk and shrugs, as if to say, <i>Brothers, am I right?</i> and hops into the portal.<<elseif $B.kills[1] is "Big Dipper">>The twins' eyes snap open, and they stagger to their feet. Mabel groans and stretches, while Dipper sways as if from vertigo, clutching his head.
"What... what just happened?" he says. "I remember... I read that spell in the journal and then... it's all just a haze..."
"Aw," Mabel says, booping him on the nose. "Did you do something big and dramatic for me, little bro? That's so sweet!"
"How are you so calm about this?!" Dipper squeaks. He flushes red, clearly embarassed. "I thought... I thought you might actually be..."
"Dipper, I'm fine," Mabel says, more seriously. "We're not dead, just like it said! You gotta learn to trust mysterious disembodied voices more."
"Well I don't wanna do it again! We may not be dead but it still <i>hurt!</i>" He shoots you a nervous glance, then backs away towards the return portal. "Let's just go home."
Mabel heaves a dramatic sigh, but smiles good naturedly. "Alright, I <i>guess</i> we could go back to our very important job helping Gruncle Stan swindle more tourists." She looks back at you over her shoulder and waves. "Well, <i>I</i> had fun, anyway! Let's do this again sometime!"<</if>>
>[[Return to the hub|Hub]]
<<if $P.gf < 1>><<set $P.gf = 1>><</if>><<if $C.gf1.mabeldone isnot true>>The girl yelps and leaps away with strength that would impress a frog and bounds back to the boy.
"Mabel, what did you do?!" the boy screams, clutching his book like a life preserver. "You should know better than to poke random things!"
"Okay, okay!" The girl grins nervously and puts her hands up. "We're really sorry and if you let us go we promise we'll never poke you again, okay?"
To your frustration, your puppets won't move, since you're not in a battle yet. You step forward menacingly, hoping that'll suffice.
"Dipperrrr," the girl hisses from the side of her mouth. "Please tell me the journal has something on this!"<<elseif $C.gf1.choice is "respectable">>"Wait, what?"
The girl <i>hmms</i> to herself. "Not what I was expecting, but whatever! I'm tired of these stupid woods!"
"Hold on, hold on!" the boy says, waving his hands. "Doesn't any of this sound fishy to you? Something's trying to pit us against each other! If we work together, we can find another way out--"
"BORING!" the girl says. "C'mon, Dip, they said it wouldn't even hurt! Maybe it'll even be fun!"
You step forward menacingly.<<elseif $C.gf1.choice is "meta">>The boy boggles. "Wh... what are you talking about?"
"So we just have to fight you and then we can go home?" the girl says. "Alright, deal!"
"Hold on, Mabel, they never actually said that! And what do you mean, 'RPG'? Like... a video game? Are we in a video game? Is that what this is???" He clutches at his head, clearly at a loss.
"You can overthink this later! See if the journal has anything we can use!"<<else>>"What? No!" the boy shouts. "Why would we want to fight you?"
"Wait a minute!" the girl says. "I bet this is the guy we're supposed to fight!"
"That's crazy!" the boy says, his voice cracking. "They've got those weird... creepy... things! With swords! How are we supposed to fight that?"
"Oh, come on! We've fought gnomes and werewolves and ghosts and you're scared of some guys from the Renaissance fair? See what the journal says!"<</if>>
"U-uh, uh..." The boy cracks the book open, and looks shocked at what he sees. "What? This wasn't here before!"
The girl butts in to read over his shoulder, much to his annoyance. "'Since you're pathetic normal humans who wouldn't stand a chance in a fair fight--' Wow, rude," she reads, "'--the arena has changed the rules to give you a fighting chance! Anything you imagine will become real, like when you fought in the Dreamscape!'" Her eyes light up. "Woah, I take that back! That's super cool!"
The boy squints at the page and continues reading. "'And for Dipper, since we know you'll need a little help in that area--' Hey, what's that's supposed to mean?!" He grumbles to himself and keeps reading. "'--since we know you'll need a little help in that area, you'll find some new spells in your journal to do the heavy lifting for you, no original thought required!' Oh, come on! I... I can be creative!"
The girl does a twirl, and shooting stars appear from nowhere to trail behind her. She laughs in delight. "Well you better do it fast, Dip-Dop! This fight is officially <i>on!</i>"
<center><span class="btn">[[Begin!|Preparation][$scenario = "gf1"]]</span></center><<include "GF1 hub">>
<<if $C.gf1.scene < 2>>The girl taps on Fighter's breastplate, and the boy cringes with every motion. "Mabel, that thing looks dangerous! Get back!"
"C'mon, Dip, they're not even moving!" she shouts back. She stares up at Fighter again, trying to peek through their helment. "Are they even alive?"<<elseif $C.gf1.scene == 2>>The girl stands on her toes to grab at Fighter's helment, but sits back and harumphs when it doesn't move. She glares at Fighter a moment longer before appearing to get bored. She walks over to Rogue next, and looks over their assortment of belts and pouches.
The boy bites his nails.<<elseif $C.gf1.scene == 3>>The girl stares straight into Rogue's hood. You doubt she can see much through the shadow, but her gaze doesn't break as she slowly extends a finger forward. She jerks back as soon as it touches Rogue's leather armor, as if she expected Rogue to snap her up like a bear trap, but nothing happens. She creeps back, and once again maintains what passes for eye contact as her hand carefully moves to unlatch a pouch.
The boy yelps and covers his eyes, but nothing happens. The girl discovers with obvious disappointment that the pouches remain firmly sealed to anyone who isn't Rogue.<<elseif $C.gf1.scene == 4>>The girl walks over to Mage next. "Hey, what are you supposed to be? Some creepy old wizard?"
"Mabelll, get away from there..." the boy whines.<<elseif $C.gf1.scene == 5>>When she doesn't get a response, the girl pokes and grabs at Mage's robe. "Ooh, this is so soft!" she croons. "Where'd you get it?"
The boy looks like he wants to be in a bunker.<<elseif $C.gf1.scene == 6>>"Hmmm..." The girl narrows her eyes, and stares up into the shadow under Mage's hat. Slowly and deliberately, she reaches up, grasps the brim of the hat, and yanks it off in a single swift motion.
Both of the kids are stunned into silence at the sight of Mage's bald, smooth head and blank stare. When nothing happens, the girl gingerly places the hat back and steps away, grinning awkwardly.<<elseif $C.gf1.scene == 7>>And now the girl has turned her attention to you. She looks into your eyes, and clearly sees that unlike the puppets, you're staring back at her.
"So what are you doing here with these weirdos? Can you talk?"<<set $C.gf1.mabeldone to true>><</if>><<include "GF1 hub">><<set $C.gf1.introductions to true>>
<b>"Who are you guys?"</b>
<<if ndef $C.gf1.canspeak>>"They talk!" the girl exclaims with a laugh.
<</if>>"Oh. I'm Dipper, and this is Mabel. We're twins," the boy explains.
"The Mystery Twins!" Mabel says, grinning.
"I thought you hated that?"
"Eh, I'm warming up to it."
The boy -- Dipper -- looks at you again. "We... uh... we can't remember how we got here, exactly. But a voice told us we had to fight someone to get back home, and also that the fight wouldn't hurt us or something?" He scratches his head. "Maybe we need to think outside the box. I've tried searching for a way out, but these woods just seem to go on forever. Maybe if we put our heads together, we can find a way out."<<if $C.gf1.puppets_explained isnot "explained">>
Mabel points at your puppets. "And hey, what are those things? Are they more haunted mannequins?"
Dipper taps a finger against the cover of his journal. "I'd actually like to know that too. It's my mission to record every weird thing in this town!" He adds self-consciously, "U-uh, if you don't mind."<<set $C.gf1.puppets_explained to "asked">><</if>><<set $C.gf1.canspeak to "yes">><<include "GF1 hub">>
<b>"Yes."</b>
"Ha! It speaks!" the girl shouts. "Are you really shy, or do you just like watching people like a creeper?"
"Mabel, be nice," the boy says. He looks a little more relaxed now that you've spoken. "Do you know if there's any way we can get out of here?" he says to you.<<set $C.gf1.canspeak to "no">><<include "GF1 hub">>
<b>"No."</b>
The girl nods and says, "Oh, well that settles that then!" Her face scrunches up. "Heeeey, wait a minute..."
The boy guffaws loudly, and looks relaxed for the first time you've seen him. "Okay, so you have a sense of humor. Do you know how we can get out of here?"<<set $C.gf1.asked_abt_origins to true>><<include "GF1 hub">>
<b>"Whare are you from?"</b>
"California," the boy says immediately, with just a hint of irritation. "But if you mean where we <i>just</i> came from... uh, it's a place called Gravity Falls, Oregon."
"Our folks wanted us to get out of the house over the summer, so they sent us over to our Gruncle Stan's!" She snorts. "We have to help him run the Mystery Shack -- that's his tourist trap. You won't believe the kind of stuff people will buy!"
"But there's also some stuff in Gravity Falls that's...weird. I mean, like..." The boy lowers his voice, like he's sharing a grave secret. "...<i>conspiracy</i> weird. I could never find anything in California, but in the past month alone I've practically been tripping over--" He waves his hands excitedly. "--monsters, cryptids, even a mind demon! There's something in that town that's like a magnet for weirdness." His eyes unfocus, and he starts tapping his chin. "I feel like I'm so close to figuring it out, but there's still something missing. Something that ties it all together... What could it be?"
The girl cuts him off with a sharp, "Nerd out later, Dipper! Right now we gotta focus on getting out of <i>here!</i>"The world shifts back, and the Wattersons are inexplicably standing upright, in the same positions as before. They sway a little, as if from vertigo.
"Wait," Anais says, "weren't we just, like, knocked unconscious or something? What just happened?"
Gumball scoffs and waves a hand dismissively. "Pfft! Everyone knows that battles in RPGs never count, duh!"
Anais screws up her face. "...What?"
"See, this is why you need to play more video games!"
"Oh, so you knew we were in a video game after all?" Darwin says pleasantly.
Gumball waves a hand imperiously. "I mean, obviously! We even had to take turns to fight each other!"
"Of course! You wanted to take us to another video game world, but you knew we'd be suspicious, so you added this guy to pin the blame on! Very clever, Gumball!" His voice and smile don't falter once.
"Yeah!" Gumball nods sagely, then his eyes bulge open with realization. "Hey, wait, no -- it wasn't me this time!"
Darwin rolls his eyes and barely contains a laugh. "Sure it wasn't."
"Oh come on!" Gumball makes a show of sighing loudly. "You trap your family in a video game <i>one time</i>...!"
"...What RPGs are <i>you</i> playing?" Anais says suddenly, still scrunching her face in confusion.
"Uh, all of them? When you beat people in RPGs they always just run away in the cutscene afterwards, it's really annoying!" Gumball steps towards the exit portal, and the others follow.
"You need to play better games! In the ones I play the guys totally die afterwards!"
"Okay okay, let's play them all again and tally up all the battles but I'm telling you, they totally don't..."
They keep bickering like that until the portal closes behind them. They don't even spare you a single glance.
>[[Return to the hub|Hub]]
<<if $P.gum < 1>><<set $P.gum = 1>><</if>><<if $steven_defeated isnot true>>Steven ducks his head and sprints away, not even sparing you a single glance. He doesn't drop a single gem.<<else>>Even though the battle is over, Steven remains unconscious. His belly rises and falls slowly, the gem in his flesh sparkling with every movement. He could almost be sleeping -- though from the expression on his face, he'd have to be having a nightmare.
The gems have fallen out of his hands and onto the ground. They appear totally inanimate.<</if>><<nobr>>
<<if $P.su < 1>><<set $P.su = 1>><</if>>
<<set $C.su1.postbattle to true>>
<</nobr>><<set $C.gf1.mabeldone = true>><<set $C.gf1.canspeak to "yes">><<include "GF1 hub">>
<b>"Stop doing that."</b>
The girl zips back to the boy's side with impressive speed. Even he seems surprised, wobbling a little as she presses up to him. "Sorry! Sorry!" the girl says, smiling wide and laughing nervously. "They were just, you know, haha, soooo cool and interesting! Can't really blame me for wanting to check 'em out, right? Right? Hahaha!"
The boy takes a half-step back, and pulls the girl with him. "Yeah, sorry, we didn't mean to bother you and your... uh..." His eyes flick over the puppets anxiously. "...weird... mannequin... things..." He clears his throat. "B-but, uh, we're kind of... stuck here? We've tried to get back home, but these woods always lead back to this clearing. If you know a way out, we won't bother you again. Promise."
His eyes drift to the puppets again, and his finger rubs along the cover of the book he's holding. You think you see him lick his lips for a split second. "Although... could you tell me what those things are? I've seen haunted mannequins before, but these don't look quite the same..." He adds self-consciously, "U-uh, if you don't mind."<<set $C.gf1.puppets_explained to "asked">><<set $C.gf1.puppets_explained to "explained">><<include "GF1 hub">>
<b>"These are my puppets. They help me fight things."</b>
The boy is scribbling furiously in his journal. You didn't even see him open it. "Uh-huh," he says, not even looking up. "What kinds of things?"<<set $C.gf1.puppets_explained to "explained">><<include "GF1 hub">>
<b>"You know, I think I don't actually know what these puppets are myself. Something about... archetypes? I don't get it."</b>
The boy is scribbling furiously in his journal. You didn't even see him open it. "Interesting. <i>Verrry</i> interesting." He looks up and steps forward, inspecting the puppets without a trace of his previous fear. "Archetypes... hm... Now that you mention it, these look kind of like <i>Dungeons, Dungeons, and More Dungeons</i> characters. A fighter, a rogue, and a wizard, right? Or, no, I think that could be a sorceror... Everyone lumps them together, but they're actually really different!" He scribbles more notes. "Are you saying those characters were brought to life? Like Rumble Skirmish..." He looks up at nothing in particular, and starts clicking his pen unsconsciously. "I wonder... are these events all happening independently, or is there a singlular force behind all of it? Something with an interest in making characters real? Hmm. Hmm." Click. Click. "I have to know more..." From behind him, the girl rolls her eyes at you with a playful smirk.<<include "GF1 hub">>
<b>"Wait, what do you mean 'more'?"</b>
"Oh, we found some evil wax mannequins in our gruncle's shack a while back," the girl says as nonchalantly if she were discussing the weather. "They tried to kill Gruncle Stan, then they tried to kill us when we found out, so we killed them."
"I lured Wax Sherlock Holmes outside to get melted by the summer sun!" the boy says proudly.<<if $C.gum1.choice is "reveal">>"VINDICATION!" the cat screams, jumping in the air.
The rabbit raises an eyebrow. "Wow, Gumball really wasn't the cause of our problems today? I am shocked and amazed."
"Hey, don't be mean, Anais!" the fish insists. "Gumball is only the cause of our problems on <i>some</i> days!"
"Wow, I can just feel the love radiating off you," the cat drawls sarcastically.
"So are we really fighting this guy?" the fish says, raising his fists.
"Yeah!" The cat looks at you with fire in his eyes. "Let's show 'em what happens when you mess with the Wattersons!"<<elseif $C.gum1.choice is "respectable">>The cat pumps his fist. "Oh yeah! Knew it! Point for Gumball!"
"Do we really have to fight?" the fish says with a pout. "Maybe they're a sad and hurting soul who just needs a friend!"
"Yes, I agree," the rabbit says. "Getting into fights based on voices in your head is crazy. Like, literally."
"Hey, it's probably like, the will of the universe." The cat presses a hand to his breast. "I am merely its conduit."
The rabbit palms her face. "Alright, let's just get this over with."<<else>>"Wait, what?" the rabbit says, eyes boggling.
"Aha! See?" The cat points at you triumphantly. "THEY brought US here to fight in some weird gladiator game! Not me this time!"
"Or you shifted us into a world full of weird gladiator people," the rabbit shoots back.
"Uh, guys? Are we fighting them or what?" the fish says, looking nervous.
The cat snaps his fingers. "Oh, actually...! Do you remember, when we got here, we got that feeling we had to fight someone?"
"Ooohhh yeah!" the fish says, realization dawning. "If we fight this guy we can go back!"
The rabbit boggles at them. "So you're just going to do what a voice in your head tells you to?"
"Hey, it's probably like, the will of the universe." The cat presses a hand to his breast. "I am merely its conduit."
The rabbit palms her face. "Alright, let's just get this over with."<</if>>
<center><span class="btn">[[Begin!|Preparation][$scenario = "gum1"]]</span></center><br/>
>[[fite me|GUM1 fite]]<br/>
<<if $C.gum1.introductions is 2>>
>[[Yup, I'm your opponent. It me.|GUM1 fite][$C.gum1.choice = "respectable"]]<br/>
<</if>>
<<if $C.gum1.this_time is true>>
>[[I brought you here. To fight me. Stop talking and fight me already.|GUM1 fite][$C.gum1.choice = "reveal"]]<br/>
<</if>>
<<if ndef $C.gum1.introductions>>
>[[Uh, what are you?]]<br/>
>[[Who are you guys?|GUM1 introductions]]<br/>
<<elseif $C.gum1.introductions is 1>>
>[[Okay, WHO are you?|GUM1 introductions][$C.gum1.choice = "rude"]]<br/>
<</if>>
<<if passage() is "GUM1 landing">>
>[['This time'?]]<br/>
<<elseif $C.gum1.this_time isnot true>>
>[[What did you mean, 'this time'?|'This time'?][$C.gum1.choice = "alt"]]<br/>
<</if>>
<<if ndef $C.gum1.climb_attempt>>
>[[(Climb over the fence)]]<br/>
<</if>><<include "Gate">>
You find yourself in what appears to be a normal suburban backyard. A slotted wooden fence surrounds a square plot of bright green, slightly overgrown grass. A small toolshed, the wood somewhat warped, sits in one corner.
Your attention is drawn to three... beings...? that have just appeared in front of you. They all look like animals, but in the shape and stature of people... or so you think, but the more you look the more bizarre that shape and stature seems to be. They look like bobblehead dolls, huge round heads stuck on tiny square bodies and stubby limbs. Somehow, this doesn't seem to bother them at all, and to your amazement they're able to stand up straight as if their heads couldn't crush their entire bodies with their weight.
From left to right, they are... you're <i>pretty</i> sure they're a cat, a rabbit, and a... goldfish? You weren't looking closely at first, but now, yep, that is a person-sized fish with arms and legs. It... he? even has a tail, but no ventral or pectoral fins -- perhaps the human limbs took the place of those in whatever accident of magic or mad science that created this thing. His body is almost perfectly round, not the elegant serpentine form of an adult goldfish, giving the impression of a baby goldfish blown up to tremendous size. You wonder if he's a juvenile who will mature later, or if he's meant to look like this. He wears sneakers and long green socks, and... unfortunately, that just draws your attention to the fact that he doesn't appear to be wearing anything else. Eh, well, you suppose that's not really an issue with fish...
The rabbit is smaller than the others, though this is accomplished by downsizing its... her? body to even smaller proportions rather than shrinking that massive head. Her ears are so big she could probably hide in them. Her fur is bright pink, the color of bubblegum. She wears a white blouse, its neatness comically undercut by just how absurdly tiny it is on her. She's looking around with an odd, almost exasperated expression.
The last one you're pretty sure is a cat, but his fur is a bright neon blue you've never seen on any animal. Does he... dye it? Is that a thing cat-people do? You have no idea. Thankfully, unlike the fish he's wearing a full outfit of clothes, though pretty ordinary ones. You think his head is bigger than the others, even the fish, if that's even possible. His mouth nearly splits his face and his eyes must be the size of --
"Oh my gosh, why is this creeper staring at us?!" he yells, jolting you out of your thoughts. His voice is nasally and just beginning to deepen; you place his age somewhere between 10 and 12. He huffs and yells to the general area, "MOOO~OOM, there's a creepy stranger in the yard!"
"Uhh... Gumball?" The fish moves his head -- his giant, giant head -- around the cat, and points at one fence of the yard with apprehension. "I don't think she can hear you..."
As one, the animal-people turn to face the fence opposite the shed. You don't understand the significance, but their faces immediately turn grave.
To your surprise, the rabbit follows this with a nonchalant, "Oh. So you've got us stuck in another dimension again. Thanks, Gumball." Her voice is higher than the others', almost squeaky; between that and her smaller size, you guess she's younger than the other two. You guess. Maybe animal-people get smaller and higher-pitched as they age. You're not sure if you can assume anything here.
The blue cat sputters and acts affronted. "It wasn't me this time! Honest!"
It's only now that you notice there are no roads or landmarks past the fence, just a blank green expanse, and the vague suggestion of houses on the horizon. It's like the <i>idea</i> of a suburb, but only as a backdrop for this single yard.<<nobr>>
<<if $achievements.get("Watterson Wrecker") < 1>>
<<run $achievements.set("Watterson Wrecker",1)>>
<</if>>
<<if $achievements.get("Thicker Than Blood") < 1>>
<<run $achievements.set("Thicker Than Blood",1)>>
<</if>>
<<if $achievements.get("Thinner Than Water") < 1>>
<<run $achievements.set("Thinner Than Water",1)>>
<</if>>
<<if $achievements.get("Princess With A Thousand Enemies") < 1>>
<<run $achievements.set("Princess With A Thousand Enemies",1)>>
<</if>>
<</nobr>>You're standing in a suburban backyard with no suburb and no house to be the backyard of. It's a clear, sunny day.
Across from you is a blue cat person<<if $C.gum1.introductions is 2>> ("Gumball", apparently)<</if>>, a pink rabbit person<<if $C.gum1.introductions is 2>> ("Anais")<</if>>, and a goldfish person<<if $C.gum1.introductions is 2>> ("Darwin") <</if>>who for some reason feels the need to wear socks but not anything else.<<nobr>>
<<set $C.gum1.scene++>><</nobr>><<set $C.gum1.introductions to 1>><<include "GUM1 hub">>
<b>"Uh, what are you?"</b>
The boy snorts and looks taken aback. "'What are we?' Uh, people, duh? Why, what are <i>you</i>, with that weird lump in the middle of your face? Your tiny, tiny face? Ugh, it's making me cringe the more I look at it! Only a really dumb tiny brain would fit in there -- OH WAIT."
"Gumball, be nice!" the fish admonishes. "They're probably some poor alien who's lost and scared!"
"Guys, they're obviously a human," the rabbit says. "I know there aren't many in Elmore, but surely you've seen them in books?"
"Oh, now I remember!" the fish says, eyes going wide. "But I thought they were extinct!"
The rabbit's eye twitches. "Darwin, they're the dominant species on the planet."
"Then why don't we ever see any?"
"I still can't get over that head," the cat says, gawking at you like you're a zoo attraction. "It's so... <i>wrong</i>."
"The head is very disturbing," the rabbit agrees.<<set $C.gum1.climb_attempt to true>><<include "GUM1 hub">>
You try to climb over the fence, but when you try to hook your foot into the slots, it hits something. You try again and clearly see that it appears to be stopped by thin air. Well, no matter... the fence is short enough you can probably jump it. You step back, crouch, and...
Yep. Definitely an invisible wall. The boy clicks his tongue as you groan on the ground. "Don't you play video games?" he says. "You should know easily-hopped fences <i>always</i> have invisible walls!"
"Wait, we're in a video game?" the fish says, having a little trouble keeping up. "Again?"
"I hate to say this, but that's actually looking pretty likely," the rabbit says with some annoyance. "Would explain why everything past the fence looks like a bad background render," she adds, squinting into the distance.<<set $C.gum1.this_time to true>><<include "GUM1 hub">>
<<if $C.gum1.choice is "alt">><b>"What did you mean, 'this time'?"</b><<else>><b>"'This time'?"</b><</if>>
"Oh, come on!" the cat throws his hands in the air. "Now random strangers are judging me too?"
"He got a cursed video game that trapped us inside," the rabbit explains nonchalantly, like that's an everyday occurance. "We had to beat it to get free."
"Oh! Oh!" the fish waves his hand excitedly. "And when we tried to throw out our old puppets, he got us trapped in the puppet dimension!"
"Hey, that one was all you!" the cat snaps back. "I <i>told</i> you to throw them out, but <i>noooo</i>, you just had to play with them and get possessed!"
"For once I'm glad I have no idea what you're talking about," the rabbit sighs.<<include "GUM1 hub">>
<<if $C.gum1.choice is "rude">><b>"Okay, WHO are you?"</b>
"See, was that so hard?" the cat croons with mock sweetness.<<else>><b>"Who are you guys?"</b><</if>>
"I'm Darwin!" the goldfish chirps enthusiastically. "This is Anais--" He points to the rabbit, who nods curtly. "--and this is my best friend Gumball!" he finishes, motioning to the blue cat.
"We're the Watterson family," Gumball says, inspecting his nails like you're not worth his attention. "You might've have heard of us."
"Hey, hey, they might have heard of <i>you</i>," Anais says, waving her hands defensively. "Don't drag me into your Dangerous Duo stuff!"
"Too bad, you're here now!" Gumball replies smugly, then leans down to grin at her. "Embraaace the dangerousity, Anais! You know you want to!"
"Anyway," Anais says, pushing him away, "this <i>looks</i> like our backyard, but our house isn't here, and our neighborhood doesn't seem to be either. I speculate we're in some sort of pocket dimension." She glares accusingly at the empty expanse. "A low-budget one."
Gumball snaps his fingers, and everyone looks to him. "Oh! Do you remember, when we got here, we heard something, like... we were supposed to fight someone?" He turns his eyes to you, and your puppets, then smiles mischeviously. "<i>Hmmm.</i>"<<nobr>>
<<set $C.gum1.introductions to 2>>
<</nobr>>You're standing in a battlefield covered in giant weapons and, strangely, giant strawberries as well.
In the rosy light of dawn you can see four figures: a porcelain doll of a woman with a pearl in her forehead, a short and stocky woman with an amethyst in her heart, and a stoic, imposing woman with garnets in her hands. A small boy with a <<if $C.su1.introductions is true>>rose quartz<<else>>pink gem<</if>> in his gut peeks out behind them and waves at you. He's the only one with what you'd describe as normal human body proportions.<<nobr>>
<<set $C.su1.scene++>><</nobr>><<include "Gate">>
You find yourself in a battlefield.
It's very old, its battle long over, but it has left unmistakable scars, stark lines cut into the turf that may never heal.
The titanic weapons littering the place are another clue. From the thick vines crawling around them you'd guess this battlefield is a century old at least, but the weapons remain the deep, shiny black of unrusted metal. A special alloy, perhaps? You've heard of stainless steel, but you're pretty sure even that doesn't last forever.
The place is also filled with strawberries. <i>Gigantic</i> strawberries, both growing off the vines and buried in the dirt. Were they once harvested by the giants who fought with those weapons?
In the rosy light of dawn, you see four figures approach from behind a giant sword. One of them, a short and pudgy little boy, is running ahead and jumping over the vines like he's having the time of his life, laughing and giggling. His hair is dark and curly, and his skin is light brown. He's wearing a bright red T-shirt with a yellow five-pointed star on the chest. When he jumps, the shirt flutters up to reveal a round pink gemstone embedded in his stomach, where his bellybutton should be.
The other three are much taller, of adult proportions. No -- strike that. As they get closer, you see their proportions are subtly inhuman -- too long in some areas, too wide in others. They watch the boy carefully as he horses around.
You see one pull him back when he wanders too far off the path, murmuring something you can't hear. She's very tall -- you think her legs must take up at least half her total height -- and thin as a reed. Her arms and legs are all sharp angles and long proportions, almost putting you in mind of a stick figure, though her hands look normal enough. Well, except for... her skin is as white as porcelain, completely devoid of color. The rest of her has color, at least -- her hair is peach-pink, and brushed back into a conical shape, looking much like the strawberries littering the battlefield. She is wearing a pale blue leotard emblazoned with that same yellow star, flared at the waist with yellow shorts beneath. A huge silk bow is tied around her torso, the same blue as her dress. Her nose is sharp and pointed, reminiscent of a bird's beak... and on her forehead, set into her skin like it's meant to be there: a large, oblong white pearl.
Another one is watching the boy as well, though where the white one frets, she just laughs and cheers him on. This one is almost her polar opposite: almost half her height, but filled out with stocky arms and legs. This one's skin is purple, and her grey-blue hair is an absolute mane, wider than her own body and nearly touching the ground. This one's face is squashed and round, with a pig-like nose that snorts loudly when she laughs. She's wearing black pants with star patterns cut into the shins, and a sleeveless grey shirt with one strap hung low down her arm. The shirt's neckline dips low to reveal the top of a dark purple gem on her chest -- an amethyst.
You realize with a start that the last figure has been watching you this whole time. Her eyes are hidden by reflective sunglasses that drop over her eyes like icicles, but you can feel her gaze all the same. This one is almost entirely leg -- her thighs are enormous, so huge you wouldn't be surprised if they could kick through solid steel. They're split almost but not quite down the middle, one side maroon and the other pitch black. Her torso is comically small in comparison, nearly spherical, bulbous like some kind of robot. She has a star symbol there, too -- but it's white, and surrounded by a pink outline that gives the impression of a powerful supernova. Her hair is a gigantic afro, so cubical it could have been hewn from stone. Her arms are incredibly thin, even stickier than the white woman, jutting from bulbous red shoulder pads to end in oddly-proportioned hands, the fingers too long and too big. Dark red gems -- garnets -- are set into each palm. Her exposed skin -- or what you assume is exposed skin -- is a similar color, the deep maroon of fired earth.
"This place is dangerous for humans," she says sharply, jolting you out of your thoughts. "You shouldn't be here." The others turn to look at her, then you.<<nobr>>
<<if $achievements.get("Gem Smasher") < 1>>
<<run $achievements.set("Gem Smasher",1)>>
<</if>>
<<if $achievements.get("Pearl Connoiseur") < 1>>
<<run $achievements.set("Pearl Connoiseur",1)>>
<</if>>
<<if $achievements.get("Garnet Collector") < 1>>
<<run $achievements.set("Garnet Collector",1)>>
<</if>>
<<if $achievements.get("Amethyst Curator") < 1>>
<<run $achievements.set("Amethyst Curator",1)>>
<</if>>
<</nobr>><br/>
<<if ndef $C.su1.postbattle>>
>[[fite me|prefite]]<br/>
<<if $C.su1.introductions isnot true>>
>[[Who are you guys?|SU1 introductions]]<br/>
<</if>>
<<if $C.su1.introductions is true>>
<<if $C.su1.asked_abt_steven isnot true>>
>[[So is the kid your... son? Nephew? ...Pet?]]<br/>
<</if>>
<<if $C.su1.asked_abt_steven is true and $C.su1.asked_abt_rose isnot true>>
>[[Why isn't your leader with you?]]<br/>
<</if>>
>[[I'm what you're supposed to fight!]]<br/>
<<if ndef $C.su1.reveal>>
>[[I am the villain you have been seeking for so long -- the beastmaster of the gem monsters! Tremble before me!]]<br/>
<</if>>
<<if passage() is "I am the villain you have been seeking for so long -- the beastmaster of the gem monsters! Tremble before me!">>
>[[Oh really? Should I tell him what you've been hiding from him? Should I tell him what those 'monsters' REALLY are?]]<br/>
<</if>>
<<if ndef $C.su1.homeworld>>
>[[HA! You fell for my trap! I'm a Homeworld soldier, and now I'm going to shatter you traitors!]]<br/>
<</if>>
<</if>>
<<if $C.su1.fite >= 2>>
>[[What do you think this is, a dating sim? Stop talking and fight me already!|prefite][$C.su1.choice = "meta"]]<br/>
<</if>>
<<if $C.su1.fite >= 4>>
>[[Hey!! I'm not fragile! I'll prove it!! FIGHT ME!!!|prefite]]<br/>
<</if>>
<<if $C.su1.steven_grabbable is true>>
>[[(Attack the small child.)|SU1 fite][$C.su1.choice = "evil"]]<br/>
<</if>>
<<else>>
>[[Return to the hub|Hub]]<br/>
<<if $steven_defeated is true>>
<<if ndef $C.su1.thief>>
>[[(Take the gems for yourself)]]<br/>
<</if>>
<<if ndef $C.su1.pry_gem>>
>[[(Pry the rose quartz from Steven's belly)]]<br/>
<</if>>
<<if ndef $C.su1.shattering>>
>[[(Shatter the gems)]]<br/>
<</if>>
<</if>>
<</if>><<set $C.su1.fite++>><<include "SU1 hub">>
<<if $C.su1.choice is "meta">><b>"What do you think this is, a dating sim? Stop talking and fight me already!"</b><<else>><b>"fite me"</b><</if>>
<<switch $C.su1.fite>>
<<case 1>>They all look confused for a moment. Then <<Garnet>> says, "No."<<case 2>><<Pearl "capital">> just laughs, a little strangely. "Why would we fight you? We don't want to hurt you!"
"Yeah!" <<Steven>> chimes in. "I don't wanna see you guys have to fight! Are... are you upset? Did we do something wrong? I'm sure we can work something out!"<<case 3>><<Amethyst "capital">> snorts, and gives you a smirk. "Dude, I like your attitude, so I'm just gonna be nice and tell ya: you wouldn't last five minutes against us." She leans her head back into her hands. "We're pretty awesome."
<<Steven "capital">> steps forward, arms outstrenched. "We don't need to fight!" he says cheerily. "C'mon, let's talk it out! I'm sure we can be friends!"<<set $C.su1.steven_grabbable to true>><<case 4>>"We already told you, we're not going to fight you!" <<Pearl>> says, with more exasperation this time. Her gaze softens, and she looks at you with infuriating pity. "Humans are such poor, fragile creatures... I could never forgive myself if something happened to you!" She shakes her head. "This place must be doing something to your mind. Come with us and we can help you back home."
<<Garnet "capital">> grumbles something to herself and places a hand to her forehead.<<default>><<goto "SU1 fite">><</switch>><<if $C.su1.choice is "evil">>Your puppets won't attack outside of a battle, but that limitation doesn't apply to you. You lunge forward to grab the little boy--
You don't even see what happens. You just feel a <i>woosh</i> of air, and suddenly <<Garnet>> is standing where the boy was. You barrel into her awkwardly, and she shoves you away, so hard you're sent sprawling. "Steven, get back!" she snaps. "This person is dangerous!" He warbles and looks like he's about to cry, but obediently hides behind her.
"Alright, that's it!" <<Amethyst>> snarls, her previous amiability wiped off her face in an instant. In a sharp motion she reaches into the gem in her chest, and pulls out a black three-tailed whip tipped with purple crystals. "You mess with Steven, you mess with ALL of us!"
You look over, and <<Pearl>> has already drawn a spear from somewhere. The shaft is white as ivory, and the head is tipped with a sea-blue glass blade. Her expression toward you is cold now. "We'll try not to hurt you..." she says, leveling her spear, "...too much!"
<<Garnet "capital">> flicks her wrists, and with a flash of light, her hands are suddenly encased in huge metal gauntlets. "Gems, to battle!"<<else>><<Pearl "capital">> puts her hands on her hips. "For the last time," she says crossly, "there will be no fighting here! Now come along and--"
"Okay," <<Garnet>> says flatly.
<<Pearl "capital">>'s eyes go wide and she wobbles for a moment, before sputtering, "Wha -- huh -- buh, but Garnet, you said you didn't want to fight them!"
"I don't." She sighs. "But I've checked every possibility, and it always ends in us fighting. They just... really want to fight us." She shrugs. "There's no other way out of this, so..." She crouches into a battle stance, and with a flash of light, her hands are suddenly encased in huge metal gauntlets.
"Awright!" <<Amethyst>> yells, and places a hand to her chest. Her gem glows, and she pulls from it a black three-tailed whip, tipped with purple crystals. "Let's show this joker who's boss!"
"But Garnet, they're only humans!" <<Pearl>> protests, panic edging into her voice. "If we use our powers against them, they could be permanently injured!"
"Ooh! Ooh!" <<Steven "capital">> hops from one foot to the other, stars in his eyes. "Gem fight! Gem fight! Oh this is gonna be so cool!"
"Steven, they're not gems, they're humans!" <<Pearl>> huffs. "This could be really dangerous!"
"They're tougher than they look," <<Garnet>> says, not taking her eyes off of you. "You can be gentle if you like, but we're still fighting them! That's an order!"
<<Pearl "capital">> looks defeated. "If you say so..." In a flowing, elegant motion, she leans back, and a turquoise blade sprouts from the gem on her forehead. She pulls it out and twirls it, revealing it to be a spear. "But let's keep this orderly, okay?"<</if>>
<center><span class="btn">[[Begin!|Preparation][$scenario = "su1"]]</span></center><<include "SU1 hub">>
<b>"Who are you guys?"</b>
"We are the Crystal Gems." The red woman raises her palms, giving you a clear view of the gemstones. "Garnet."
The purple woman pulls her shirt down slightly, showing off the gem in her chest. "Amethyst."
The white woman takes a deep, elegant bow, prominently displaying the pearl on her forehead. "And Pearl."
"And Steven!" the boy chirps, running up to you and spreading his arms like a superhero. His childish exclamation is jarring after the measured, almost melodious voices of the women. He lifts his shirt to give you a clear view of his gem, which you can now recognize as a rose quartz. "I'm a Crystal Gem too!" He makes it sound like that's the greatest thing in the entire world.
Pearl smiles and pats him on the head. "Yes, that's right, Steven!" she says in the tone of a proud parent. Steven glows under her praise.
"We are sworn to protect humanity and the planet Earth," the woman identified as Garnet explains. "We were called here to face a terrible danger... but we have not found it yet. You should return to safety, before it finds you!"<<nobr>>
<<set $C.su1.introductions to true>>
<<set $C.su1.steven_grabbable to true>>
<</nobr>><<set $C.su1.asked_abt_steven to true>><<include "SU1 hub">>
<b>"So is the kid your... son? Nephew? ...Pet?"</b>
Pearl visibly bristles are your question. "Steven is the son of our leader, Rose Quartz," she says flatly, as if reading off a script. "He inherited her gem and her powers, but has an organic body. We are training him so he can assist us in our mission."<<set $C.su1.asked_abt_rose to true>><<include "SU1 hub">>
<b>"Why isn't your leader with you?"</b>
Something complex flashes across each of the gems' faces, and none of them seem able to meet your gaze.
"That information isn't relevant to this situation," Garnet says, eventually. "It is imperative you let us escort you away from this area."<<include "SU1 hub">>
<b>"I'm what you're supposed to fight!"</b>
"You aren't," Garnet says immediately. Amethyst snorts with laughter, and even Pearl can't hold back a chuckle.
"You must be thinking of someone else," Pearl tells you condescendingly. "Or someone is playing a very mean joke on you! We have no quarrel with humans."<<set $C.su1.fite++>><<include "SU1 hub">>
<b>"I am the villain you have been seeking for so long -- the beastmaster of the gem monsters! Tremble before me!"</b>
The gems' mouths hang open, too baffled to even speak. The boy laps it up though, gasping with theatrically perfect shock. "You mean -- all this time -- a <i>person</i> was controlling the monsters?! Oh no! Why would you do that???"
"They're lying, Steven," Pearl tells him with clear annoyance. "The--" and there's an odd hesitation before she says, "--monsters can't be controlled. Certainly not by a human! They're just telling stories." She glares pointedly at you. "We're not going to fight them."<<set $C.su1.reveal to "attempted">><<include "SU1 hub">>
<b>"Oh really? Should I tell him what you've been hiding from him? Should I tell him what those 'monsters' //really// are?"</b>
In an instant, a spear is in Pearl's hands. "HOW DO YOU KNOW TH--"
"PEARL!" Garnet yells sharply, jarring Pearl like she's been physically struck. "They're just saying stuff to get a rise out of us! Don't fall for it!"
Steven, unconcerned, looks up at you with stars in his eyes. "You know more about the gem monsters? Tell me, tell me, I wanna know!"
Pearl and Amethyst share a glance, filled with utter panic. Even Garnet looks tense.
<i>Were</i> you bluffing? Or do you really know? Type your answer in the field below, and press "Enter" to say it...
<<textbox "$answer" "" "Mystery of the Gem Monsters">>
<i>[You only get one shot at this. A simple answer will suffice.]</i><<include "SU1 hub">>
<b>"<<print $answer>>"</b>
<<set $answer = $answer.toLowerCase()>>
<<if $answer.includes("corrupted gems") or $answer.includes("used to be gems") or $answer.includes("corrupted by the diamonds")>><<set $C.su1.reveal to "success">>The gems gasp in unison, unable to hide their shock. Steven's eyes go wide.
"Y-y-you're lying!" Pearl says, very slightly more on the ball this time. "Yes, you're lying! Steven, they're just trying to--"
"Oh, I thought it might be something like that."
The nonchalance in Steven's voice freezes Pearl mid-rant. Pearl's face fights through a series of expressions before settling on abject confusion. "Wh... what do you mean?" she asks him.
Steven lifts a finger to his chin thoughtfully. "I mean... I was thinking about it, and they all have gems just like you, and they all have magic powers just like you... It makes sense!" He shrugs and smiles innocently.
Pearl casts for help, but the others avert their gazes and look awkward. Finally, she sighs and pats Steven on the head. "I'm sorry we didn't tell you. It's just..." She threads her fingers together and looks away. "We'll explain everything after this, okay?"
Steven nods, and Pearl pointedly pulls him away from you.<<set $C.su1.steven_grabbable to false>>
"Hey, so quick question, <i>how the heck do you know that?!</i>" Amethyst yells, pulling her hair for effect.
"Doesn't matter," Garnet says before you can respond. "Human, if you know what it is we do, then you know this place is dangerous. Let us escort you to safety."<<else>>Steven tilts his head. "Huh? I don't get it." The gems visibly relax, and Pearl snatches him away before you can do any more damage.<<set $C.su1.steven_grabbable to false>>
"See, Steven, this is why you shouldn't trust strangers," Pearl admonishes gently, extending a finger like a teacher.
"Aww." Steven pouts. "I just want to know more about gem stuff! Will <i>you</i> tell me?"
"Yes, later," Pearl promises. She looks at you and her expression is pleasant again, but this time the smile looks fixed. "Now then, where were we?"<<set $C.su1.reveal to "failed">><</if>><<set $C.su1.fite++>><<include "SU1 hub">>
<b>"<<print passage()>>"</b>
Pearl and Amethyst actually look thrown, but Garnet shuts you down with a flat, "No, you're not."
"Huh? 'Home world'? What are they talking about?" Steven says, scratching his head.
"Nothing you need to worry about, Steven," Pearl says quickly.
"W-wait," Amethyst says, not taking her eyes off of you. Her easy confidence has vanished, replaced with obvious apprehension. "Are you sure, Garnet? How do you know? I-I mean, those things back there, they haven't been talking at all, maybe they're robots or something?"
Garnet lets out a surprisingly emotional huff, clearly exasperated. "Alright, then. If you're from Homeworld, show us your gem."
You can't, of course.
Garnet smirks infuriatingly. "See? Just a pretender."<<set $C.su1.homeworld to true>><<set $C.su1.thief to true>>You quickly scoop the gems up into your pack. You notice that Garnet's gems have changed colors, into the brighter red of a ruby and the deep blue of a sapphire. Interesting, but not a problem -- they'll still fetch a pretty penny!<<set $C.su1.pry_gem to true>>You inspect Steven's belly carefully. The gem does appear to be real; it has the luster of a true quartz, not the hollow transparency of a glass fake, and feels sturdy enough when you tap it. The flesh around it seems totally normal -- there is none of the scarring or inflamation you would expect if the gem had been artificially grafted to his body. Try as you might, you can't see any gap at all between his skin and the gem, in fact; the two appear totally seamless. The gem really does seem to be a natural part of him, strange as that may be.
Not that that's your concern. You order Rogue to hand you a chisel and a scalpel -- you're not sure which one is more appropriate here.
Unfortunately, you quickly find it to be a moot point. Your scalpel glides off Steven's skin and even hair like it's made of rubber, and your chisel can't make even the smallest fracture in the gem no matter how hard you hammer. Seems like hurting people outside of battle is against the arena's rules. You grudgingly concede defeat.Do you have a preference?
>[[Shatter Pearl|The Shattering][$C.su1.choice = "Pearl"]]
>[[Shatter Garnet|The Shattering][$C.su1.choice = "Garnet"]]
>[[Shatter Amethyst|The Shattering][$C.su1.choice = "Amethyst"]]
>[[Shatter Steven|The Shattering][$C.su1.choice = "Steven"]]
>[[Shatter them all!|The Shattering][$C.su1.choice = "all"]]<<set $C.su1.shattering to true>>You gleefully grab hold of Fighter's warhammer. Though you heave with the effort, you successfully lift it, and bring it crashing down on--
As soon as it touches the gem, the hammer is flung back with a comical <i>boi-oi-oooing!</i> noise.
Oh, right. Killing people is against the rules.<<back>>
Tell me if your experience significantly diverges from the intended "feel" of the fights.
Battles in general are supposed to be pretty involved affairs; major set pieces rather than speedbumps. They should take pretty long to win but not so long you get bored.
<b>Adventure Time:</b> Intended as a "flunky boss" setup. Bubblegum is the major opponent, but you are intended to defeat the weaker Finn and Jake before taking her on.
<ul><li>Bubblegum provides a support role by using a powerful full-party buff every 3 rounds and safeguarding Finn and Jake from status effects. She may also afflict you with status effects or throw a grenade, which requires 1 turn of preparation first. Occasionally she may use a regular attack, which is very weak and intended as a breather. After Finn and Jake go down, she switches to using a stronger self-buff and stops using the status ailment safeguard.</li>
<li>Jake is a dual-class rogue/tank. He uses some of Rogue's stun and debuff abilities, as well as Fighter's protection abilities. He has a special ability where he can spend a turn growing big, then attack for double damage.</li>
<li>Finn just attacks every turn. Occasionally he may charge like Fighter can.</li></ul>
<b>Gravity Falls:</b> Only two opponents, so they are intended to be slightly tougher individually to make up for it. Key feature is that the twins evolve into a stronger form after you defeat one. This is meant to be a "pick your poison" scenario, with each one emphasizing their most dangerous characteristics in their evolved forms. Currently these stronger forms only change attacks, not stats, but that may change if you feel they don't pack enough punch as-is.
<ul><li>Dipper is support role. Since there's no healing this means buffs, and inflicting debuffs on you. He can also dispel your buffs, but he's not supposed to do this if you have no buffs to dispel; please tell me if you see any weird behavior with that. He is meant to become more well-rounded in his Big Dipper form, with an additional attack spell and a greater chance of using attack abilities, but still having a focus on buffs and debuffs.</li>
<li>Mabel is the attacker. She has attacks for inflicting damage-over-time as well as two that are just pure damage. She can also inflict Dizzy, but I am not sure if that is too close to a rogue-ish role, and I might give that capacity to Dipper. Her Mega Mabel form makes her attacks target the whole party (though they are made weaker to compensate), and makes her single-target attack stronger. I may nerf this, as full-party Dizzy in particular is pretty devastating and can shut you down for pretty much the whole battle.</li></ul>
<b>Amazing World of Gumball:</b> Intended to be wacky and highly luck-based, but still relatively easy overall. Each character displays special behavior if they're the only one remaining.
<ul><li>Gumball is the rogue. Can debuff, stun, and hide. He's where the luck comes in: his special ability is to use a random item, which can do nothing, attack a single target, give him a buff, hurt everyone including his allies, or be a really strong attack against you.</li>
<li>Anais is effectively the mage. Her behavior is very simple: she spends a turn making a bomb, then she uses it. She can use the same bomb items as you: grenade, flamethrower, gas bomb, calamity bomb, and a chaff grenade that inflicts Dizzy. She rarely uses a weak regular attack as a breather. Her Defense is extremely poor, so players are encouraged to target her first.</li>
<li>Darwin is a dual-class fighter/rogue. He has some of the debuff abilities Gumball lacks, and can also protect others (or he will once I figure out how to implement it).</li></ul>
<b>Steven Universe:</b> This is intended to be the hardest battle, on account of them having actual battle experience and such. Currently this is not actually true, because I'm getting most of their abilities from the actual Steven Universe video game, where they had far fewer abilities than I've given the other characters. (Possibly they have more in Save the Light, idk buy my a PS4 for Christmas so I can find out.) Gimmick is that they have Steven as an additional fighter, but he just gives out weak buffs. It shouldn't be possible to harm Steven at all until all the gems are defeated; area attacks should skip him and there should be a special event where the gems take hits for him if you try to target him directly.
<ul><li>Steven either buffs one gem (in their weak stat because I think that's cute), or gives them a bubble shield that completely nullifies one hit. (Little exploit: that's one <i>hit</i>, not one action, so Rogue's multi-hit attacks can break it and still do damage.)</li>
<li>Garnet is the fighter. She punches you a lot and can inflict a defense debuff and that's pretty much it.</li>
<li>Pearl is...a dual-class fighter/rogue maybe? She inflicts damage-over-time and stun, and has multi-hit and piercing attacks.</li>
<li>Amethyst is supposed to be a mage/rogue hybrid but I'm not too sure if I've got the mage part down yet. Her regular attack hits everyone, she can inflict an attack debuff, and she has a slightly stronger attack that automatically knocks someone down. I think she needs more attacks. Poison or another debuff would be good for taking advantage of her high Special but I can't think of any thematically fitting attacks. halp?</li></ul>
You can also tell me your experience with the pre-battle cutscenes. If you're familiar with the shows, were the characters in-character? If not, did you feel you were adequately orientated? Are there any other dialogue choices you'd have liked to make?
Also, help me test damage formula balance. Play with both of these models and tell me which one feels better.
Current damage formula:
<div class="formula" id="thing"><<switch $formula>><<case "base weighted">>[($base + Attacker's Attack) * weight] - Defender's Defense<<case "base unweighted">>$base + (weight * Attacker's Attack) - Defender's Defense<</switch>></div>
<<link "Use base unweighted formula">><<set $formula = "base unweighted">><<set $knife_weight = 0.2>><<replace "#thing">><<switch $formula>><<case "base weighted">>[($base + Attacker's Attack) * weight] - Defender's Defense<<case "base unweighted">>$base + (weight * Attacker's Attack) - Defender's Defense<</switch>><</replace>><</link>>
<<link "Use base weighted formula">><<set $formula = "base weighted">><<set $knife_weight = 0.8>><<replace "#thing">><<switch $formula>><<case "base weighted">>[($base + Attacker's Attack) * weight] - Defender's Defense<<case "base unweighted">>$base + (weight * Attacker's Attack) - Defender's Defense<</switch>><</replace>><</link>>/* Story-based widgets, e.g. text modifiers and cutscene triggers. */
<<widget "Pearl">>
<<if $C.su1.introductions is true>>
Pearl
<<else>>
<<if $args[0] is "capital">>T<<else>>t<</if>>he pearl woman
<</if>>
<</widget>>
<<widget "Garnet">>
<<if $C.su1.introductions is true>>
Garnet
<<else>>
<<if $args[0] is "capital">>T<<else>>t<</if>>he garnet woman
<</if>>
<</widget>>
<<widget "Amethyst">>
<<if $C.su1.introductions is true>>
Amethyst
<<else>>
<<if $args[0] is "capital">>T<<else>>t<</if>>he amethyst woman
<</if>>
<</widget>>
<<widget "Steven">>
<<if $C.su1.introductions is true>>
Steven
<<else>>
<<if $args[0] is "capital">>T<<else>>t<</if>>he little boy
<</if>>
<</widget>>
<<widget "Nicole">>
<<if $C.gum2.introductions > 0>>
<<set _text to "Nicole">>
<<else>>
<<set _text to "the woman">>
<<if $args[0] is "cap">><<set _text = _text.toUpperFirst()>><</if>>
<</if>>
<<print _text>>
<</widget>>
<<widget "Rose">>
<<if $C.su2.intro>>
<<set _text to "Rose">>
<<else>>
<<set _text to "the woman">>
<<if $args[0] is "cap">><<set _text = _text.toUpperFirst()>><</if>>
<</if>>
<<print _text>>
<</widget>>
<<widget typewriter>>
<!-- Create a SPAN with an ID -->
<span id="typewriter"></span>
<!-- In SugarCube, arrays start at 0 -->
<<set _textArrayLength to 0>>
<!-- Repeat every second -->
<<repeat $args[1]>>
<!-- Test if textArrayLength is greater than length of $args[0] -->
<<if _textArrayLength gte $args[0].length>>
<<stop>>
<<else>>
<!-- Append the current position to the existing characters -->
<<append "#typewriter">>$args[0][_textArrayLength]<</append>>
<!-- Update the length -->
<<set _textArrayLength++>>
<</if>>
<</repeat>>
<</widget>>As you pass through, the feeling suddenly crystalizes: it's the dread of seeing your parent when you know you've been naughty.
<<include "Gate">>
You find yourself in the parlor of what appears to be a typical suburban home. A nondescript carpet lines the floor, and a wide couch sits facing a large TV. The wallpaper suggests something vaguely floral.
Standing across from you is another anthropomorphic blue cat, but this one looks nothing like Gumball. This cat-person is much taller -- you think adult height, if those standards even apply here -- and she wears a white blouse with a gray skirt. Her eyes bore into you with frightening intensity; you feel like a frightened, helpless little kid, all your power and securities stripped away and leaving only the weaknesses at your core. Then the gaze is gone, and you let out a breath you didn't know you were holding. The woman does the same to all your puppets, eyes flicking over each of them in turn. The whole process happens almost instantly, but it feels so much longer.
"Oh, um, hello." She smiles and says it in a friendly voice, but her body language still betrays clear tension and suspicion. "You'll have to forgive the state of the house. I wasn't expecting visitors today! Could you just leave those, uh..." She looks over your puppets again, pointedly lingering on their prominent belts of weaponry. "...things... by the door, please? Someone could get hurt."<<nobr>>
<<if $achievements.get("Orphaner") < 1>>
<<run $achievements.set("Orphaner",1)>>
<</if>>
<</nobr>><br/>
<<if $C.gum2.postbattle isnot true>>
>[[fite me|GUM2 prefite][$C.gum2.choice = "fite me"]]<br/>
<<if passage() is "GUM2 landing">>
>[[Yeah, that's the idea. Fight me!|GUM2 prefite][$C.gum2.choice = "Yeah, that's the idea. Fight me!"]]<br/>
<</if>>
>[[I'm a gladiator from another world. Fight me!|GUM2 prefite][$C.gum2.choice = "I'm a gladiator from another world. Fight me!"; $C.gum2.alien = true]]<br/>
<<if $C.gum2.fite > 0>>
>[[I fought your kids already, you know.]]<br/>
<</if>>
<<if $C.gum2.threat isnot true>>
>[[I'm buddies with your boss. Fight me or you're fired!][$C.gum2.choice = "I'm buddies with your boss. Fight me or you're fired!"; $C.gum2.threat = true]]<br/>
<</if>>
<<if $C.gum2.insult>>
>[[H-hey! Just so you know, I don't design the rooms, okay? It's the arena master who's lazy!]]
<</if>>
<<if ndef $C.gum2.introductions>>
>[[Who are you?|GUM2 introductions][$C.gum2.choice = "Who are you?"]]<br/>
<<elseif $C.gum2.introductions is 1>>
>[[Watterson? You're the mother, then?][$C.gum2.choice = "Watterson? You're the mother, then?"]]<br/>
<</if>>
<<if $C.gum2.fite > 1>>
>[[(Admit defeat and return to the hub)]]
<</if>>
<<else>>
<<if ndef $C.gum2.woah and ndef $C.gum2.checked>>
>[[Woah, is she dead?]]<br/>
<</if>>
<<if ndef $C.gum2.checked>>
>[[(Check her pulse)]]<br/>
<</if>>
>[[Return to the hub|Hub]]<br/>
<</if>>You're in a suburban home. You're sharing the space with <<if $C.gum2.introductions isnot 2>><<if $C.gum2.introductions is 1>>Nicole, <</if>>a woman who appears to be the same "species" as Gumball: an anthropomorphic cat with neon blue fur.<<else>>Nicole, Gumball's mother. She appears to be the same "species" as him: an anthropomorphic cat with neon blue fur.<</if>><<nobr>>
<<set $C.gum2.scene++>><</nobr>><<if $C.gum2.fite > 9>><<include "GUM2 prefite">>
It doesn't look like she's in the mood to answer any of your questions anymore.<<else>><<include "GUM2 hub">><<set $C.gum2.introductions to 1>>
<b>"Who are you?"</b>
"Oh, where are my manners?" the woman says with a little laugh. "I'm Nicole. Nicole Watterson." She smiles, but it doesn't reach her eyes. "Now... may I ask who <i>you</i> are, by any chance?"<</if>><<if $C.gum2.fite > 9>><<include "GUM2 prefite">>
It doesn't look like she's in the mood to answer any of your questions anymore.<<else>><<include "GUM2 hub">><<set $C.gum2.introductions to 2>>
<b>"<<print passage()>>"</b>
Nicole chuckles. "Ah, sounds like you've met my sons. Don't worry, I'll sort them out if they've been causing trouble."<</if>><<set $C.gum2.fite++>><<include "GUM2 hub">>
<b>"<<print $C.gum2.choice>>"</b>
<<nobr>>
<<switch $C.gum2.fite>>
<<case 1>>
<<Nicole "cap">> stares at you in bafflement for a second, then shakes her head with a soft chuckle. "Oh, you're one of <i>those</i>," she says, voice dripping with poorly-disguised contempt. "Sorry, but I don't do that anymore. I have to set a good example for my family."
<<case 2>>
"No," <<Nicole>> says.
<<case 3>>
<<Nicole "cap">> closes her eyes and takes a deep breath, and the tension flows out of her body.
<<case 4>>
<<Nicole "cap">> ignores you and walks away. There is a hard <i>thunk</i> noise when she tries to walk through the doorway to the kitchen, and she recoils, touching her head. "What the-- is there an <i>invisible wall</i> here?!" she shouts with clear agitation. She reaches out a hand, and it stops in the doorway where there should only be empty space. You see muscles strain in her arm as she pushes agaist the wall, but it does not budge. Finally, she yells in frustration, and her arm snaps back and forward with lightning speed in a perfect palm strike. The impact rattles everything in the house, but nothing else happens. She clenches her fist and grits her teeth--<br/>
<br/>
And breathes out, becoming calm as a stream again. "Ah. I see what's going on here. You've trapped me here, in an attempt to force me into doing what you want. Very clever, but I think you'll find that two can play at that game." She smiles.
<<case 5>>
<<Nicole "cap">> ignores you and goes to sit down on the couch, pointedly worming her way into the cushions and sighing contentedly. She reaches a hand out automatically, and her eyes snap into focus again when she finds herself clutching air. "What -- oh, where did they put the remote this time? Ugh..."
<<case 6>>
<<Nicole "cap">> ignores you and starts tearing out couch cushions with mounting frustration. There's no remote to be found. She huffs.
<<case 7>>
<<Nicole "cap">>'s face twitches, then she stands up straight and lets out a long breath. She smiles. "Ah well, remotes promote laziness anyway! I can just turn it on manually." She walks over and taps the power button at the base of the TV, but nothing happens. Her brow creases and she presses it again. Still nothing. She grumbles something to herself.
<<case 8>>
With a grunt, <<Nicole>> kneels down and twists around to look behind the TV. She's still for a moment, then mutters, "What...?" She reaches a hand behind the TV, where there should be a tangle of wires and cords, but you don't hear her hit anything. Curious, you bend over to look yourself, and see that there's nothing in the space at all: no wires are coming out of the TV at all, and the wall does not even appear to have an outlet.<br/>
<br/>
<<Nicole "cap">> gets up slowly. She looks around the room slowly, her brow creased with suspicion. Just when you think she's about to do something, she sighs loudly and shrugs. "Well, that's weird," she says.
<<case 9>>
<<Nicole "cap">> sits down carefully in the middle of the room, crosses her legs, sits up straight, and closes her eyes. You hear her breathing, slowly and deliberately.
<<default>>
<<Nicole "cap">> hums a low, droning noise from where she sits in her meditation pose, breathing in and out slowly and deliberately.
<</switch>>
<</nobr>><<if $C.gum2.fite < 8 and $C.gum2.alien isnot true>><<goto "GUM2 fite">><<else>><<include "GUM2 hub">>
<b>"<<print passage()>>"</b>
<<nobr>>
<<if $C.gum2.alien is true>>
"Ah, but didn't you say you were from another world?" <<Nicole>> says with a knowing smile, almost but not quite keeping the triumph out of her voice. "You ought to be more careful with your web of lies, sweetie."
<<else>>
"Hmm, you know, something makes me doubt that," <<Nicole>> says with an easy smile. "Maybe it's the fact that the remote seems to have winked out of existence. Or the fact that all our wiring seems to have disappeared. Or, hmm, maybe it's the fact you were too lazy to make even a <i>single other room</i> when you designed this pitiful replica of my house." She sniffs. "Honestly, I think I'm more offended by your lack of work ethic than the fact you kidnapped me."
<<set $C.gum2.insult to true>>
<</if>>
<</nobr>>
<</if>><<include "GUM2 hub">>
<b>"<<print passage()>>"</b>
"Oh! I'm so terribly sorry," is what Nicole tells you, but her grin says something entirely different. "Pass it along then, will you? There's no excuse for poor craftsmanship!"<<set $C.gum2.insult to null>><<Nicole>> narrows her eyes at you, expression cold. "So that's how it is," she mutters.
Her feet shift into a balanced stance, and she raises her arm with perfect form. "I hope you know what you're getting into, because I'm not going to hold back!"
<center><span class="btn">[[Begin!|Preparation][$scenario = "gum2"]]</span></center>Yeah, you're getting nowhere with this. Why would someone <i>not</i> want to fight? This is new territory, and it scares and confuses you. You sigh, and open a return portal back to the hub. Maybe if you try again later, with her memories reset, you'll have better luck.
[[(next)|Hub]]<<include "GUM2 hub">>
<b>"<<print passage()>>"</b>
You instantly have her full attention.
"...Excuse me?"
Her voice is a dead calm that sends chills down your spine.
<<nobr>>
>[[S-sorry, you must have misheard me. What I meant to say was...|GUM2 hub]]<br/>
>[[Yeah, you heard me. I pounded their stupid faces into the dirt. Their tears were delicious.]]
<<nobr>><b>"<<print passage()>>"</b>
<<if $C.gum2.fite >= 9>><<Nicole "cap">> rises to her feet. She<<else>><<Nicole "cap">><</if>> is shaking with rage.
<<nobr>>
>[[Especially that brat, Gumball. Did you know he tried to run away with his tail between his legs? I'd like to say he cried for you, but he was too much of a coward to even do that.|road to rage][$C.gum2.choice = "Especially that brat, Gumball. Did you know he tried to run away with his tail between his legs? I'd like to say he cried for you, but he was too much of a coward to even do that."]]<br/>
>[[Especially that freak, Darwin. He tried so hard to save them, but in the end he couldn't even save himself. Isn't that funny?|road to rage][$C.gum2.choice = "Especially that freak, Darwin. He tried so hard to save them, but in the end he couldn't even save himself. Isn't that funny?"]]<br/>
>[[Especially that know-it-all, Anais. She thought she knew how to stop me. Spoiler alert: she didn't.|road to rage][$C.gum2.choice = "Especially that know-it-all, Anais. She thought she knew how to stop me. Spoiler alert: she didn't."]]<br/>
<</nobr>><b>"<<print $C.gum2.choice>>"</b>
<<Nicole "cap">> is breathing heavily and staring at you with utter hatred.
>[[And you know what the best thing is? I can keep summoning them here for as long as I want! I think after I've beat you, I'll go back and fight them again. And again. And again!]]<b>"<<print passage()>>"</b>
"No, you won't." <<Nicole "cap">> has suddenly become as still as a statue.
>[[Oh? And why's that?]]<b>"<<print passage()>>"</b>
<<timed 500ms>><<typewriter "\"Because I... " "125ms">><<next 2625ms>><<typewriter "am going...\"" "125ms">><<next 3500ms>><<set $C.gum2.shemad to true>><<set $scenario to "gum2">><<goto "Preparation">><</timed>>Nicole is still unconscious. She is lying on her side, her eyes half-lidded. She is not moving.<<nobr>>
<<if $P.gum < 2>><<set $P.gum = 2>><</if>>
<<set $C.gum2.postbattle to true>>
<</nobr>><b>"<<print passage()>>"</b>
There is a faint sound like the clearing of a throat, and you get a sudden urge to look at your dialogue options again.You press a finger to Nicole's neck. After a moment, you feel a faint pulse. Now that you're up close, you can also tell that she's still breathing. She does not move, otherwise.<span id="content"><b>The Bard</b> has a little bit of everything. Traditionally, they are a storyteller who often finds -- or inserts -- themselves at the center of those very stories. Their traveling lifestyle requires a diverse set of skills, and their wit and mockery often gets them into trouble. They have some of Rogue's cunning, Fighter's skill, and Mage's esoteric knowledge... but not all of it. They are the jack-of-all-trades, a dabbler in everything but a master of nothing -- except, perhaps, adaptability.
Bard can mimic the basic functionality of all three specialists, but lacks access to their more advanced techniques. They're useful if you find a specialist unsuited for a particular challenge, but do not wish to forgo all their abilities entirely. Their own specialty is the power of word itself: their jokes and stories are so compelling they can become true, to an extent. They can weave these tales quickly, but the results are only as resilient as the spoken word: that is to say, not very much.
<<back>>
<i>Tips:
Bard's debuffs are less powerful than Rogue's, even without accounting for their lower Special. The key is that they cost only half the Energy. Basic debuffs can be applied multiple times, so if you use them continuously you can rack up an appreciable effect.
Though it uses the same variable cost feature as Mage's spells, Shout doesn't do anything special at 10 EN. That's the price of forgoing a specialty! A 10-point Shout will still be quite powerful, however.
The one thing Bard can't do at all is pierce armor. Against a tough foe, you'll want to keep Fighter in the party.</i>
Bard's abilities are:
<<find "$All_Puppets" "name" "\'Bard\'">>
<<actionlist $All_Puppets[_pos]>>
</span><span id="status"><<include "party manager reserve">></span><span id="content"><center>Active puppets:</center>
<<nobr>>
<div class="actors" id="puppets">
<<include "party manager puppets">>
</div>
<</nobr>>
A list of all available puppets is on the right. To swap out an active puppet, click on them and then on the puppet you want to add.
[[Return to the Hub|Hub]]
</span><span id="content">The <b>Archer</b> is a killer. They are the relentless hunter, the merciless assassin, the unerring sniper. They only know how to do one thing, but they know it well: utter devastation.
Archer's potential is even greater than Mage's. They can invest extra Energy to power up their attacks just like Mage, but their bow is even deadlier than Mage's Blast. And if that's still not enough, they need not restrict their attacks to just their own turn: with their ability to mark an enemy for death, they can keep attacking continuously until they are completely exhausted. The price for all this is that they don't know how to do anything else, including replenishing their own stock of arrows. Archer is powerful, but will burn out without support.
<<back>>
<i>Tips:
Archer has good synergy with Witch and Mage. Energy transfers can keep Archer going strong, and their high-weight abilities let them get the most out of Blessing and Frenzy.
Unlike Mark, Hunter attacks don't consume Energy. It might be wise to switch if you're low on Energy but still want to keep Archer active.
Archer's spell-like abilities don't have supercharges. Don't complain, a 10-point Shot is already as strong as Indignant Variati!</i>
Archer's abilities are:
<<find "$All_Puppets" "name" "\'Archer\'">>
<<actionlist $All_Puppets[_pos]>>
</span><span id="content">The <b>Cleric</b> is a true protector. They are an unwavering pillar of support to all who need them, their faith and optimism a greater shield than the mightiest armor. Though they're not the sharpest tool in the shed, there is very little that can truly bring them down.
Cleric's Defense rating is gargantuan, reducing most attacks against them to mere blemishes. Unfortunately, they can only chip away at enemies at the same rate. They won't be bringing down any titans on their own, but they can greatly extend the survivability of those who can. Their Assured Aegis lets them protect a puppet even when they can't be there themselves, and with the Defense bonus from Protector they become virtually invincible, stonewalling the enemy's offense completely.
<<back>>
<i>Tips:
Assured Aegis always protects to exactly the same degree, meaning it isn't hampered by Cleric's poor Special. This is a very good thing!
Downfall can rack up pretty good damage against a sufficiently buffed foe, but its high cost makes it prohibitive as a regular attack. For best use, save it for emergencies, such as if Mage or Witch goes down and the enemy's still buffing themselves to high heaven.
Beware of armor piercing attacks! Cleric has no more HP than anyone else, so they'll be hurt just as badly as your squishies. If you want to use Cleric for those battles, armor piercing enemies should be your priority targets.</i>
Cleric's abilities are:
<b>Firefly</b>
Passive. Enemies are twice as likely to target Cleric as other puppets.
<<find "$All_Puppets" "name" "\'Cleric\'">>
<<actionlist $All_Puppets[_pos]>>
</span><span id="content">The <b>Witch</b> is a master of the arcane. Rogue may have knowledge of the mundane and Mage may be learned in the fantastic, but Witch has both and far more besides. The title is feared, hated, respected and loved throughout history, and for good reason. The Witch is who you turn to when no one else is able -- or willing -- to help.
Witch's magic is subtler than Mage's, but perhaps more versatile. They are unparalleled in their capacity for effect manipulation, making the flow of magic dance to their tune. Their effect removal is one Energy point more efficient than Mage's, and they possess the unique ability to lock a battler's effects in place, keeping them active far past their normal expiration date. But magic's not all they can do: they'll surprise you with knowledge of devices and potions that put Rogue to shame. Of course, nothing comes without a price... their role is one for the shadows, and as such their ability for direct action is limited. They have almost nothing in the way of attacks, and are unlikely to defeat any opponents on their own.
<<back>>
<i>Tips:
Witch has good synergy with Archer. Energy transfers can keep Archer going, and their high-weight abilities put Frenzy to good use. The Pain from Witch's Pox is also to their benefit, especially if you can chain it against a Marked enemy.
Though some of Witch's abilities are superficially similar to Mage's, they have different effects when supercharged.</i>
Witch's abilities are:
<<find "$All_Puppets" "name" "\'Witch\'">>
<<actionlist $All_Puppets[_pos]>>
</span><<include "Gate">>
You find yourself in an idyllic garden. It looks like something from Paradise: the sun shines brightly but not blindingly, sparkling off a crystal-clear brook and turning it to a river of dazzling gemstones. The brook bubbles quietly, a pleasant sound on the edge of hearing, and the bright green grass feels soft and springy under your feet. In the distance, the sky is not blue but a pleasant rose pink, fluffy pale clouds stretching into the distance.
It's only after taking this all in that you realize you can't feel any heat from the sun.
A large woman is in front of you, laid back on the grass and smiling. As soon as your eyes land on her, her eyelids flick open. She turns to face you, smiles, and rises to her feet. You expect her to have trouble with the enormous size of her dress and the thickness of her limbs, but she moves with perfect grace. She almost seems to float in the way she lifts herself up so effortlessly, as if gravity is only a passing suggestion to her.
You take her in as she stands in front of you -- and there is a lot to take in. Everything about her is larger than life. Her hair is a reddish, searingly bright pink, curled into voluminous rolls that make it look like her head is wreathed in clouds. Her smiling, rounded face is pale, but not the surreal porcelain of that "Pearl" woman -- it looks like a real human flesh tone. Her arms, clasped gracefully in front of her waist, are surprisingly large. They're almost the polar opposite of the impossible stick limbs of the gems you encountered before, the mass distributed just like a human's would be. She wears a wide ball gown, making her look even more expansive than she already is. It is white, studded with pink frills and lace.
A five-pointed star has been cut out of the dress over her stomach. There is a rose quartz gemstone where her bellybutton should be.
"Hello!" the woman says. "I was told you to expect you." You have to pause to take in the beauty of her voice. It is a sweet, melodic lilt, never rising to a sharp or unpleasant volume yet still projecting with perfect clarity. It's a voice with <i>gravity</i>, a voice that draws you in because, unlike you, it is perfectly confident in what and where it is. The voice of a leader, but a gentle and patient one.
She sweeps an arm out, gesturing at the idyllic landscape, and grins. "How do you like it here? Pretty neat, huh?"<<nobr>>
<<if $achievements.get("Tyrant") < 1>>
<<run $achievements.set("Tyrant",1)>>
<</if>>
<</nobr>><br/>
<<if $C.su2.rebel_reveal == "success" && passage() == "Mystery of the Rebellion">>
>[[Yes.|SU2 homeworld loyalist][$choice = "Yes."]]<br/>
<</if>>
<<if $C.su2.fite >= 1>>
>[[I want to see how strong you are. Isn't that reason enough?]]<br/> /* Last Scenario~ */
>[[Weren't you told you had to fight me? Stop being difficult!]]<br/>
>[[But I need to beat you to complete my achievement wall!]]<br/>
<</if>>
<<if $C.su2.fite >= 5>>
>[[(Give her your strongest puppy eyes)]]<br/>
<</if>>
>[[fite me|SU2 prefite][$C.su2.fite++; $choice = "fite me"]]<br/>
<<if $C.su2.fite >= 2>>
>[[I'm not cute! I'm strong and cool! I'll prove it!! FIGHT ME!!]]<br/>
<</if>>
>[[I'm a gladiator fighting the strongest warriors across dimensions. Fight me!|SU2 prefite][$C.su2.fite++; $choice = "I'm a gladiator fighting the strongest warriors across dimensions. Fight me!"]]<br/>
<<if $C.su2.intro>>
<<if !$C.su2.soldier>>
>[[You were a great general, Rose. I respected your tactics. But this is how soft you've become? Disgusting. Fight me to regain your honor!][$C.su2.soldier = true]]<br/>
<</if>>
<<if !$C.su2.threat>>
>[[I fought your Crystal Gems already, you know.][$C.su2.threat = 1]]<br/>
<<elseif $C.su2.threat == 1>>
>[[Ahem, perhaps you did not understand. I BEAT the Crystal Gems. I beat them hard.][$C.su2.threat = 2; $C.su2.valid = true]]
<</if>>
<<if !$C.su2.opinion>>
>[[This place is pretty neat.]]<br/>
>[[I've seen better.]]<br/>
<</if>>
<<if !$C.su2.sun>>
>[[Why can't I feel the sunlight?]]<br/>
<<elseif passage() == "Why can't I feel the sunlight?">>
>[[It's creepy. Turn it off.|SU2 blackout][$choice = "It's creepy. Turn it off."]]<br/>
<<elseif !$C.su2.nosun>>
>[[You can't have a sun with no warmth. It's creepy. Turn it off.|SU2 blackout][$choice = "You can't have a sun with no warmth. It's creepy. Turn it off."]]<br/>
<</if>>
<<if !$C.su2.intro>>
>[[Who are you?]]<br/>
<</if>>
<<if !$C.su2.reveal_rebel && $C.su2.reveal != "success">>
>[[Prepare to die, rebel scum!]]<br/>
<<elseif def $C.su2.reveal_rebel && $C.su2.reveal_rebel == "success">>
<<if !$C.su2.avenger>>
>[[I will avenge Pink Diamond, traitor!]]<br/>
<</if>>
>[[It's not about Pink Diamond or Homeworld. You had a duty, and you broke it. That's unforgivable.|SU2 homeworld loyalist][$choice = "It's not about Pink Diamond or Homeworld. You had a duty, and you broke it. That's unforgivable."]]<br/>
<</if>>
<<if !$C.su2.reveal>>
>[[Spare me the pleasantries. I know you you really are!]]<br/>
<<elseif $C.su2.reveal == "success">>
>[[Don't play dumb! I'll prove you're Pink Diamond! I'll poof you and see your gem for myself!]]<br/>
<</if>><<include "SU2 hub">>
<b>"<<print $choice>>"</b>
<<nobr>>
<<switch $C.su2.fite>>
<<case 1>>
She laughs in your face. "Now why would I want to do that? It's so much more interesting to get to know you!"
<<case 2>>
"No!" She grins infuriatingly. "Aw, your widdle face! How could I hurt something so cute?"
<<case 3>>
She taps a finger to her chin. "Hmm... Okay, how about this?" She raises a finger, like a teacher calling for attention. "I can tell you really want to fight. But, I really want to talk to you first! So I'm going to make you work for it a little. Let's make a compromise: if you can give me a good reason to fight, I will. But I'll need something more than just 'fight me'."
<<default>>
"You have to give me a bit more than that, remember?" She waves a finger like she's reprimanding you, but she's still smiling and clearly enjoying herself.<br/><br/>
<<if !$C.su2.intro>>
"For instance, we haven't even been introduced! Don't you want to know who you're fighting? It's just poor strategy to charge in without knowing anything about your enemy."
<<elseif !$C.su2.opinion>>
"For instance, you haven't even told me what you think of this place! I set it up for you, you know! Do you like it?"
<<elseif !$C.su2.valid>>
"For instance, I still don't know <i>why</i> you want to fight me so bad! Could you tell me?"
<<elseif $C.su2.valid>>
<<goto "SU2 fite">>
<</if>>
<</switch>>
<</nobr>><<include "SU2 hub">><<set $C.su2.simulation = true; $C.su2.opinion = true>>
<b>"<<print passage()>>"</b>
She grins even wider. "It really is! This is my own room. It changes to make anything I want it to." She waves a hand, and a large and colorful bird appears beside her in a poof of pink cloud. It squawks and flares its wings, displaying a shimmering kaleidescope of colors.
She waves her hand again, and with another pink poof, the bird disappears. "It's all just a simulation, of course, but it's still a nice place to come when I want to relax. I can visit all the places I love, even the ones that are no longer..." You see her ever-present smile start to falter, but she recovers quickly, and shakes her head to clear it. "It's really nice."<<include "SU2 hub">><<set $C.su2.simulation = true; $C.su2.opinion = true>>
<b>"<<print passage()>>"</b>
She just laughs, but not unkindly. "Oh, I'm sure you have! The world is such a big and wonderful place. Would you like something different? The room can make anything I want it to."
She waves a hand, and a large and colorful bird appears beside her in a poof of pink cloud. It squawks and flares its wings, displaying a shimmering kaleidescope of colors. She waves her hand again, and with another pink poof, the bird disappears.
"It's all just a simulation, of course, but it's still a nice place to come when I want to relax. I can visit all the places I love, even the ones that are no longer..." You see her ever-present smile start to falter, but she recovers quickly, and shakes her head to clear it. "It's really nice."<<include "SU2 hub">><<set $C.su2.simulation = true; $C.su2.sun = true>>
<b>"<<print passage()>>"</b>
Her mouth quirks. You get the sense she's not very pleased you pointed this out. "Eheh, you noticed that? It's a limitation of the system, I'm afraid. My room can create any light-based image, even add tactile contour like our body projections, but energy projection like heat and sunlight... that's a bit trickier." She laughs and runs a hand through her hair awkwardly. "Hahaha, sorry, that was probably too technical. What I mean is, the room just can't do that! Sorry. But it should adjust environmental conditions to the ideal set point for any organic life inside, so you should still be comfortable. Um, I hope."<<include "SU2 hub">>
The woman grins proudly. "I'm Rose Quartz, leader of the Crystal Gems! It's so nice to meet you!"<<nobr>>
<<set $C.su2.intro = true>>
<</nobr>><<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She actually looks thrown for a second, but recovers quickly. She waggles a finger at you, grinning. "Ah-ah-ah, that's a human expression! Homeworld gems say 'clod'. If you're going to pretend to be one, you should get it right!"
<<nobr>>
>[[Prepare to die, rebel clod!]]
<</nobr>><<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She tilts her head to the side and blinks, then laughs. "And here I thought I was Rose Quartz! Okay, then, who am I?"
<i>Do</i> you know? Type your answer in the field below, and press "Enter" to say it...
<<textbox "$answer" "" "Mystery of Rose's Identity">>
<i>[You only get one shot at this. You must give a full name, but it does not need to be case sensitive.]</i>You're standing in an idyllic garden filled with pink clouds, yet you can't feel the sun on your face. <<if $C.su2.intro>>Rose Quartz, the self-professed leader of the Crystal Gems you fought earlier,<<else>>A large, pink-haired gem woman<</if>> is talking with you.<<nobr>>
<<set $C.su2.scene++>><</nobr>><<Rose 'cap'>> puts her fingers to her lips and whistles. Suddenly a glowing portal of bright pink light appears to her side, and from it jumps an equally pink lion. You tense, but the lion just kneels to her, baring its mane. <<Rose 'cap'>> stretches down and reaches <i>into</i> the mane, as if it's a portal of its own.
When she withdraws her arm, she is holding a magnificent broadsword, colored a deep purplish-pink and inlaid with a spiraling pattern of thorny vines. She twirls it in a circle, smiling delightedly.
"That will be all, my lion," <<Rose>> says, placing a hand lightly against the lion's head. It bows again, then turns and roars. The roar manifests as a physical cone of force that slams against nothing to open another portal in midair. The lion jumps through, and the portal is gone just as suddenly as it appeared.
"Don't worry, you won't be fighting both of us." <<Rose 'cap'>> grins hugely. "After all, I want this to be a fair fight!"
<center><span class="btn">[[Begin!|Preparation][$scenario = "su2"]]</span></center><<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She just laughs harder.<<include "SU2 hub">><<set $C.su2.nosun = true>>
<b>"<<print $choice>>"</b>
She sighs. "I guess you're right." She waves her hand, and the sky above you disappears, sun and all, to be replaced by an endless expanse of pale pink clouds. Everything is still perfectly visible, lit by an ever-present glow with no clear source.<b>"<<print $choice>>"</b>
She gives you a sidelong glance. "...You are a very strange human," she says eventually. To your surprise, the next thing she does is smirk. "I rather strongly suspect you're just trying to mess with me, but..." She laughs, and turns to face you head-on. "Well, why not? If you want to fight that bad, I'll indulge you."
<<include "SU2 fite">><<include "SU2 hub">>
<b>"<<print passage()>>"</b>
"Nope!" She grins infuriatingly. "Come on, you must have a better reason!"<<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She laughs. "Do <i>you</i> listen to every disembodied voice you hear? I don't have to do what it says, and you don't either! We're all free to make our own choices! That's what makes this world so wonderful."<<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She laughs. "Is that what you want, or what someone else told you to want? You don't have to live by anyone else's rules! You're free to just be you! That's what makes this world so beautiful."You give her the best puppy eyes you can muster. It feels like your eyes are going to pop out of your sockets. "<i>Please?</i>" you beg.
This is so degrading.
<<Rose 'cap'>> makes a full-face gasp, cradling her face in her hands as stars shimmer in her dinner-plate eyes. "Ohhh, you're so adorable! How can I say no to that?"
<<include "SU2 fite">><<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She applauds enthusiastically, stars in her eyes like you're a pet that's just done a wonderful trick. "Flattery and trash talk all in one, wow! I'm impressed!" She looks serious for a second, scrutinizing you. "But... hm..." She grins again. "Fighting isn't all there is to life, you know! The war's over. I don't need to be a soldier anymore. I don't think there's any shame in that." Her smile turns more genuine. "Strength is more than just being able to beat everyone. If you open up a little, you can learn to be strong in the real way. That's what's important."<<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She gets stars in her eyes. "Aren't they amazing?"<<include "SU2 hub">>
<b>"<<print passage()>>"</b>
<<Rose 'cap'>>'s expression remains just as radiant, if not (is it possible?) even moreso. "Yes, you must be amazing too!" The way she looks at you turns just a tad bit more respectful, you think, and she gives you a slight nod. "I suppose if you could hold your own against them, then maybe fighting you wouldn't be like kicking a puppy. We can battle now, if you want. But I'd still like to talk a little longer!"<<include "SU2 hub">><<set $C.su2.avenger = true>>
<b>"<<print passage()>>"</b>
She looks at you for a very long time. An uncomfortably long time. Her gaze is sharply and uncharacteristically cold, like sizing up an enemy.
Eventually, she speaks. "...You say this, and yet you still haven't attacked me." Her tone is soft and contemplative, as if she's talking to herself as much as you. Suddenly it's like a switch has been flipped, and her face regains the light and warmth it had before. "Oh, I get it now. You can't initiate the battle yourself, can you? You're just saying these... silly things to goad me into attacking you." She laughs, but it's a bit forced. From her expression, you almost get the sense she's looking at something else. "Well, sorry, but I'm not going to attack a human just for talking about stuff they don't understand. Try something different."She raises an eyebrow. "Ohhh, I get it now. That's a pretty roundabout way to get me to fight you, but..." She laughs. "I think I'll take it. Points for novelty!"
<<include "SU2 fite">>Another RPG Engine contains a lot of components. To use them all together, you will need a special compiler.
I use Tweego, which has installation instructions here.
Once you have everything set, you can open your comand prompt (search "cmd" in Windows) and use the "tweego" command to compile Twine stories. If you place the engine story file ("0 rpgengine") in a folder with JavaScript, CSS, and twee files, and target that folder with the "tweego" command, they will all be bundled together. The default download package has already lumped these into a "src" folder for you.
Tweego can compile multiple story files at once, so I recommend creating a separate Twine story file for your actual story, and including it in the same directory. This allows you to neatly compartmentalize your story work and your game work, and also makes it much easier to add any patches and updates to the engine, as you can just overwrite the engine's story file instead of having to manually copy-and-paste every passage into your story. In the final product, everything will become part of the same story, so feel free to reference passages from the engine in your main story -- they won't seem to go anywhere, but they'll match up when the whole thing compiles.
However, there are a few rules that you must keep in mind:
<b>If there is a conflict in the data between two story files</b>, such as passages with the same names, <b>the last file compiled will overwrite the first.</b> Tweego will compile files in the same order they are seen in the directory, which generally means in alphabetical order. This is the purpose of sticking the "0" on the engine's file name, as that forces it to the top of any alphabetical list and causes any conflicts to be overwritten by your other story files.
Generally, this is likely what you want, but <b>be careful if you have any passages with the same names</b>. If anything in the engine gets overwritten, the whole thing could break. This probably won't be a problem for most passages, but <b>be aware that the engine uses the special passages StoryInit, PassageReady, and PassageDone.</b> You will likely want to use these passages for your own purposes in your story. To avoid a conflict, I recommend storing these passages as raw twee files in the "passages" folder. This is already done for you in the default package. You can add any unique features you want for your own story to those files, and they'll be added when the project compiles without disrupting the core code.
The same logic applies if you wish to modify anything in the engine. To avoid losing your work by accidentally overwriting the file when downloading a new version, outsource any custom passages to twee files.
Finally, note that the story's JavaScript and CSS pages are compiled along with any JS and CSS files in the directory. This means that if you compile a story, save it to the src directory, and compile it again, the supporting code will be duplicated. This will create errors. To avoid this, you will need to blank the JavaScript and CSS pages in the story; or, better yet, do all your Twine editing in the raw file and only test the compiled version.
<b>Summary:</b>
* Download Tweego here and set it up here.
* You can compile multiple story and twee files at once, but later conflicts will overwrite earlier ones.
* Outsource customized engine passages to twee files to avoid losing your work on a version update.
* Blank the story JavaScript and stylesheet before compiling a story file./* Applies the effects of status effects. Always run at the end of addeffect. Also contains a reaper, so run it whenever an effect is removed as well. */
<<widget "effectmanager">>
<<set _member = $args[0]>>
<<set _temp = new Map()>>
<<for _k, _v range _member.stats>>
<<run _temp.set(_k,0)>>
<</for>>
<<for _j, _effect range _member.effects>>
<<switch _effect.name>>
<<case "Chi Shield">>
<<set _member.chi to true>>
<<case "Alert">>
<<set _member.alert to true>>
<<case "Stunned">>
<<set _member.stunned to true>>
<<set _member.noact to true>>
<<case "Burning">>
<<set _member.burning to true>>
<<case "Poisoned">>
<<set _member.poisoned to true>>
<<case "Doom">>
<<set _member.doom to true>>
<<case "Dizzy">>
<<set _member.dizzy to true>>
<<case "Winded">>
<<set _member.winded to true>>
<<case "Off-Balance">>
<<set _member.offbalance to true>>
<<case "Petrified">>
<<set _member.petrified to true>>
<<set _member.noact to true>>
<<case "Asleep">>
<<set _member.asleep to true>>
<<set _member.noact to true>>
<<case "Berserker">>
<<set _member.berserker to true>>
<<case "Defender">>
<<set _member.defender to true>>
<<case "Martyr">>
<<set _member.martyr to true>>
<<case "Hidden">>
<<set _member.untargetable to true>>
<<case "Hunter">>
<<set _member.hunter to true>>
<<case "Trickster">>
<<set _member.trickster to true>>
<<case "Bubble">>
<<set _member.bubbled to true>>
<<case "Marked">>
<<set _member.marked to true>>
<<case "Shield">>
<<set _member.shield to true>>
<<case "Stasis">>
<<set _member.stasis to true>>
<<case "Guarded">>
<<set _member.guarded to true>>
<<default>>
<</switch>>
<<if _effect.statmod is true>>
<<switch _effect.name>>
<<case "Injury">>
<<set _temp.set("Attack",_temp.get("Attack") - _effect.power)>>
<<case "Pain">>
<<set _temp.set("Defense",_temp.get("Defense") - _effect.power)>>
<<case "Headache">>
<<set _temp.set("Special",_temp.get("Special") - _effect.power)>>
<<case "Knocked Down">>
<<set _temp.set("Defense",_temp.get("Defense") - Math.round(_member.getBase("Defense")/2))>>
<<set _member.down to true>>
<<set _member.noact to true>>
<<case "Curse">>
<<set _member.curse to true>>
<<set _temp.set("Attack",_temp.get("Attack") - _effect.power)>>
<<set _temp.set("Defense",_temp.get("Defense") - _effect.power)>>
<<set _temp.set("Special",_temp.get("Special") - _effect.power)>>
<<case "Forsaken">>
<<set _temp.set("Defense",_temp.get("Defense") - _effect.power)>>
<<set _member.forsaken to true>>
<<case "ATK Boost">>
<<set _temp.set("Attack",_temp.get("Attack") + _effect.power)>>
<<case "DEF Boost">>
<<set _temp.set("Defense",_temp.get("Defense") + _effect.power)>>
<<case "SPC Boost">>
<<set _temp.set("Special",_temp.get("Special") + _effect.power)>>
<<case "Blessing">>
<<set _member.blessing to true>>
<<set _temp.set("Attack",_temp.get("Attack") + _effect.power)>>
<<set _temp.set("Defense",_temp.get("Defense") + _effect.power)>>
<<set _temp.set("Special",_temp.get("Special") + _effect.power)>>
<<case "Protector">>
<<set _member.protector to true>>
<<set _temp.set("Defense",_temp.get("Defense") + _effect.power)>>
<<case "Frenzy">>
<<set _temp.set("Attack",_temp.get("Attack") + _effect.power)>>
<<set _temp.set("Defense",_temp.get("Defense") - Math.round(_effect.power/2))>>
<</switch>>
<</if>>
/* Reaper: remove expired effects and undo their effects. */
<<if _effect.duration == 0>>
<<switch _effect.name>>
<<case "Chi Shield">>
<<set _member.chi to false>>
<<case "Alert">>
<<set _member.alert to false>>
<<case "Stunned">>
<<set _member.stunned to false>>
<<set _member.noact to false>>
/* when stun wears off, become Alert */
<<set _alert to true>>
<<case "Burning">>
<<set _member.burning to false>>
<<case "Poisoned">>
<<set _member.poisoned to false>>
<<case "Doom">>
<<set _member.doom to false>>
<<case "Dizzy">>
<<set _member.dizzy to false>>
<<case "Winded">>
<<set _member.winded to false>>
<<case "Off-Balance">>
<<set _member.offbalance to false>>
<<case "Petrified">>
<<set _member.petrified to false>>
<<set _member.noact to false>>
<<case "Asleep">>
<<set _member.asleep to false>>
<<set _member.noact to false>>
<<case "Martyr">>
<<set _member.martyr to false>>
<<case "Berserker">>
<<set _member.berserker to false>>
<<case "Defender">>
<<set _member.defender to false>>
<<case "Hidden">>
<<set _member.untargetable to false>>
<<case "Hunter">>
<<set _member.hunter to false>>
<<case "Trickster">>
<<set _member.trickster to false>>
<<case "Bubble">>
<<set _member.bubbled to false>>
<<case "Marked">>
<<set _member.marked to false>>
<<case "Shield">>
<<set _member.shield to false>>
<<case "Stasis">>
<<set _member.stasis to false>>
<<case "Guarded">>
<<set _member.guarded to false>>
<<default>>
<</switch>>
<<if _effect.statmod is true>>
<<switch _effect.name>>
<<case "Injury">>
<<set _temp.set("Attack",_temp.get("Attack") + _effect.power)>>
<<case "Pain">>
<<set _temp.set("Defense",_temp.get("Defense") + _effect.power)>>
<<case "Headache">>
<<set _temp.set("Special",_temp.get("Special") + _effect.power)>>
<<case "Knocked Down">>
<<set _temp.set("Defense",_temp.get("Defense") + Math.round(_member.getBase("Defense")/2))>>
<<set _member.down to false>>
<<set _member.noact to false>>
<<case "Curse">>
<<set _member.curse to false>>
<<set _temp.set("Attack",_temp.get("Attack") + _effect.power)>>
<<set _temp.set("Defense",_temp.get("Defense") + _effect.power)>>
<<set _temp.set("Special",_temp.get("Special") + _effect.power)>>
<<case "Forsaken">>
<<set _temp.set("Defense",_temp.get("Defense") + _effect.power)>>
<<set _member.forsaken to false>>
<<case "ATK Boost">>
<<set _temp.set("Attack",_temp.get("Attack") - _effect.power)>>
<<case "DEF Boost">>
<<set _temp.set("Defense",_temp.get("Defense") - _effect.power)>>
<<case "SPC Boost">>
<<set _temp.set("Special",_temp.get("Special") - _effect.power)>>
<<case "Blessing">>
<<set _member.blessing to false>>
<<set _temp.set("Attack",_temp.get("Attack") - _effect.power)>>
<<set _temp.set("Defense",_temp.get("Defense") - _effect.power)>>
<<set _temp.set("Special",_temp.get("Special") - _effect.power)>>
<<case "Protector">>
<<set _member.protector to false>>
<<set _temp.set("Defense",_temp.get("Defense") - _effect.power)>>
<<set _x = State.getVar(_effect.target)>>
<<set _x.protected to false>>
<<set _x.protectedBy to null>>
<<case "Frenzy">>
<<set _temp.set("Attack",_temp.get("Attack") - _effect.power)>>
<<set _temp.set("Defense",_temp.get("Defense") + Math.round(_effect.power/2))>>
<</switch>>
<</if>>
<<if _mask != true>>
<<print _effect.removeText(_member.name)>>
<<set _mask = false>>
<</if>>
<<run _member.effects.deleteAt(_j)>>
<<if _alert is true>>
<<if _member.boss is true>>
/* boss enemies are Alert for longer, for balance purposes */
<<addeffect _member "Alert" 7>>
<<else>>
<<addeffect _member "Alert" 3>>
<</if>>
<</if>>
<</if>>
<</for>>
/* stat mods */
<<for _k, _v range _temp>>
<<run _member.setTemp(_k,_v)>>
<</for>>
<<set _shieldBreak to false>>
<</widget>><<include "Gate">>
You arrive in a dark place. This is a cramped, windowless area, closer to a cavern than a room, lit only by flickering candlelight. Under the shadows, you think you can see scrawled pictures around the walls, but you cannot make out any details. Hints of civilization are dotted around the edges: crooked shelves, populated with weathered books and scrolls. In the center, ringed in candles and thus the only thing clearly visible, is a stone pyramid surrounded by an intricate, blood-red pentagram.
You feel like you're being watched.
<<include "GF2 choices">>You are in a dark room. There are earthen walls, shelves filled with strange books, and a pentagram ringed with candles.<<if $C.gf2.scrolls>>
You have a note that says:
<center><b><<if $C.gf2.hints == 3>>SDRAWKCAB EGASSEM<<else>>19-4-18-1-23-11-3-1-2 5-7-1-19-19-5-13<</if>></b></center><</if>>
You can't shake the feeling that you're being watched.<<nobr>>
<<set $C.gf2.scene++>><</nobr>><br/>
<<nobr>>
<<if passage() == "(YOU THINK TOUCHING THE PENTAGRAM IS A VERY GOOD IDEA)">>
>[[(YOU THINK YOU SHOULD TRY AN INCANTATION)]]<br/>
<<else>>
>[[fite me?]]<br/>
<<if $C.gf2.scene > 0>>
>[[(BEHIND YOU)]]<br/>
>[[(LOOK AT THE PUPPETS TOUCH THEM FEEL THEM)]]<br/>
<</if>>
<<if $C.gf2.scrolls>>
<<if $C.gf2.scene >= 5 && !$C.gf2.hints>>
>[[(YOU RECOGNIZE THE CIPHER)][$C.gf2.hints = 1]]<br/>
<<elseif $C.gf2.scene >= 8 && $C.gf2.hints == 1>>
>[[(YOU KNOW WHAT THE CODE IS)][$C.gf2.hints = 2]]<br/>
<<elseif $C.gf2.scene >= 12 && $C.gf2.hints == 2>>
>[[(OH YOUR GOD IT SAYS "SDRAWKCAB EGASSEM" GET ON WITH IT ALREADY)][$C.gf2.hints = 3]]<br/>
<</if>>
<</if>>
>[[(YOU THINK TOUCHING THE PENTAGRAM IS A VERY GOOD IDEA)]]<br/>
>[[(YOU SAW SOMETHING ON THE WALLS)][$C.gf2.walls = true]]<br/>
>[[(YOU WANT TO READ THE SCROLLS)][$C.gf2.scrolls = true]]</br>
<</if>>
<</nobr>><b>"<<print passage()>>"</b>
There is no response.<b><<print passage()>></b>
You whirl around.
You weren't entirely sure what you were expecting to find, but "nothing" wasn't it. There is only a wall, no different from the others in the room. Your shadow dances across it.
You still feel like you're being watched.<b><<print passage()>></b>
You snap your head towards your puppets, glaring at them suspiciously. Are they what's watching you? No, that can't be. They're not sapient... are they? You look each of them straight in the eye, just to be sure, but you see only their usual glassy stillness. They continue staring straight ahead, dead to the world until the next battle.
...You're pretty sure.<b><<print passage()>></b>
You pick up a candle and hold it closer to the wall.
Under the light, you can see more clearly the pictures you glimpsed in shadow. It appears to be illustrating a narrative of some kind, the scenes wrapping around the cavern in sequence before ending at the same place. The story seems to center on one figure: a large, golden triangle with one great big eye. The triangle is placed almost reverentially in the pictures, like a ruler looking down on the people. In the first scene it is surrounded by even stranger figures, shapes that seem to twist under your gaze even as you look at them. In the second, he appears in what looks to be a small village, surrounded by wilderness with only a few people, who bow down to him. In the third, he sits on a throne in a regal hall, and now it is not just farmhands but kings who bow to him. In the fourth his eye has starkly changed to a bright red, and the people around him are fleeing and crying as destruction rains from the blackened heavens. Then he is in that strange, twisted place again, and the cycle starts anew. In ever picture he (when did you start thinking of it as a "he"?) is in the exact same position, his expression never changing.
And in every picture, you feel like that eye is staring into your soul.<b><<print passage()>></b>
You look through the books on the shelves. You fear they'll crumble under your touch like you've seen old books do in movies, but you can handle them without issue.
Most of them are in languages you can't understand -- you don't even recognize the alphabet in some of them. The only thing you can find in English is a torn sheet off to one side. At the top are two columns, headed BEHOLDING? and SPIRAL?. Phrases such as "being watched", "reality distortion", and "fear" are scribbled under each in messy handwriting, some of them crossed out. At the bottom the lists trail off, to be replaced only with the word "BOTH?" In another corner of the paper, you see another list of words: DREAMS, POSSESSION, FIRE, CONTRACTS, and the phrase "What does it mean?"
Towards the bottom are two remarkably detailed pictures. One is of a thin, startlingly handsome man with well-combed blond hair, an eyepatch, and a devilish smile, wearing a top hat and a 20's-style suit with overalls. The other is of a dark-skinned man who is impossibly fat, almost spherical, wearing the same clothes but with a much haughtier, nastier expression, almost like a cat staring down a mouse. Instead of an eyepatch, he has only unblemished skin where his right eye should be. The handsome man is crossed out, with a harsh NO! scratched into the paper; the rotund man is circled and captioned with a large YES!, underlined several times.
In the center, separated from the rest of the scribbles in a neat hand, is written:
<center><b>19-4-18-1-23-11-3-1-2 5-7-1-19-19-5-13</b></center>
Next to it is a small drawing of a triangle with a single large eye. Though it only has one eye to begin with, you feel like it's winking at you.<b><<print passage()>></b>
Of course! The message is written in a numerical substitution cipher!
...What is that, again?<b><<print passage()>></b>
That's right! In a numerical substitution cipher, letters are encoded into numbers, so that A becomes 1, B becomes 2, and so on. You knew that! YOU TOTALLY DIDN'T, AND YOU FEEL BAD FOR LYING.
...Something doesn't feel right here.<b><<print passage()>></b>
You look at the note again, and suddenly the code seems so simple. You can see the real message now: the letters matching the numbers flicker across the page like a ghostly afterimage, yet clear as day to you. IT'S SO SIMPLE, YOU FEEL REALLY DUMB FOR NOT FIGURING IT OUT.
...Were you always this hard on yourself?<b><<print passage()>></b>
You gingerly tap a foot against the edge of the pentagram.
Nothing happens.
You poke a finger into it. Still nothing. Finally, throwing caution to the wind, you step inside completely, and slam your hands against the strange pyramid.
The candles barely even flicker.<<include "GF2 Hub">>
<b><<print passage()>></b>
Type your answer in the field below, and press "Enter" to say it...
<<textbox "$answer" "" "(SAY THE WORDS)">>
<i>[You can retry if you fail. Case does not matter here.]</i><b>"<<print $answer>>"</b>
<<nobr>>
<<set $answer = $answer.toUpperCase()>>
<<if $answer == "SDRAWKCAB EGASSEM" || $answer == "SDRAWKCAB EGASSEM!">>
<<goto "The Summoning">>
<<elseif $answer.includes("SDRAWKCAB EGASSEM")>>
You feel a lurch. The air shifts and the candles flicker wildly --<br/>
<br/>
-- but nothing else happens. The strange feeling stops, and the room is normal again. Maybe YOU WERE CLOSE, BUT ADDED SOMETHING THAT SHOULDN'T BE THERE.
<<else>>
Nothing happens. Looks like no dark magic is happening here today. (YOU THINK YOU SHOULD INVESTIGATE THE ROOM MORE.)
<</if>>
<</nobr>><b>"SDRAWKCAB EGASSEM!"</b>
You feel a lurch, and all color goes out of the world. The candle flames freeze, looking now like glass.
There is a <i>crack</i>, and then a horrible straining screeching sound, like someone is running nails along the chalkboard of the universe. Your eyes water as space <i>folds</i> in front of you, twisting and warping and peeling back the curtain to show something you cannot even begin to comprehend.
Then in a flash, it's over, and standing in the horrible twisting space's place is a great pyramid like the one in the pentagram -- but it looks <i>flattened</i> somehow, like a drawing instead of a real thing. It, alone in the room, is positively <i>glowing</i> with color, radiating a brilliant golden aura.
Its surface shifts, and you realize what you thought were just strange markings were, in fact, an eyelid. It peels open audibly, then blinks a few times. The eye underneath is an ever stronger yellow than the body, its pupil slitted like a cat's.
<b><i>~WELL WELL WELL!~</i></b> You flinch. The voice isn't like physical speech. You can feel the words drilling themselves directly into your brain and echoing there, like holding a phone too close to your ear. <<if $C.gf2.scene > 5>><b><i>~TOOK YA LONG ENOUGH!~</b></i><<else>><b><i>~THAT WAS QUICK! AREN'T YOU A SMART KIDDO?~</b></i><</if>>
It -- he? -- grows thin, noodly arms and legs, pure black lines with no detail, like a child's drawing. Out of nowhere a little top hat, equally flat, pops into his hand, and he places it on his... head? With exaggerated courtesy, he bows -- or at least makes an adequate approximation -- and extends a hand. <b><i>~BILL CIPHER, MASTER OF THE MIND, ATCHER SERVICE!~</b></i>
<<nobr>>
>[[(SHAKE HIS HAND)]]<br/>
><<if $C.gf2.hints>><del>How stupid do you think I am?</del><<else>>[[How stupid do you think I am?]]<</if>><br/>
><<if $C.gf2.hints >= 2>><del>What are you?</del><<else>>[[What are you?|GF2 intro]]<</if>><br/>
><<if $C.gf2.hints >= 3>><del>fite me</del><<else>>[[fite me|GF2 fite me]]<</if>><br/>
<</nobr>>You take the offered hand. Though it's stick-thin, you have no trouble grasping it. The handshake is firm. A ghostly blue flame erupts from your clasped hands and you start, but it doesn't hurt.
Bill cackles. <b><i>~I'M SO GLAD WE COULD MAKE A DEAL!~</i></b>
You make to release his hand, but his grip is firm. The blue flame goes out, but otherwise, nothing happens.
There is an awkward silence.
Bill stares at you, an unreadable expression in his pulsating eye. <b><i>~WHAT ARE YOU?!~</i></b> he snaps, suddenly irate. <b><i>~LIKE STARING INTO THE ABYSS -- THERE'S NOTHING THERE! YOU'RE EMPTY!~</i></b> His hand shoots back, so suddenly it almost takes your skin off with it. He furrows his brow... or, where his brow would be? It just looks like he's drawn a cartoonish angry expression over his eye. Then he looks down, at the pyramid, and suddenly he's calm again.
<b><i>~WELL, SINCE I HAVE MY PHYSICAL BODY RIGHT HERE, IT DOESN'T REALLY MATTER!~</i></b> he says, cackling. <b><i>~I'LL JUST HAVE TO BE A LITTLE MORE DIRECT!~</i></b>
<<include "GF2 fite">><b>"<<print passage()>>"</b>
Bill laughs maniacally. <b><i>~CONSIDERING YOU SUMMONED ME -- PRETTY STUPID!~</i></b> He withdraws his hand and floats back, over the pyramid. <b><i>~NOT THAT IT MATTERS! GETTING A DEAL OUT OF YOU WAS JUST GRAVY! WITH MY PHYSICAL BODY HERE...~</i></b>
<<include "GF2 fite">>Bill spreads his arms, and adopts <<if $C.gf2.walls>>the same eerily neutral expression he wore in the wall paintings<<else>>an eerily neutral expression<</if>>. He seems to fall back, into the stone pyramid...
Your head feels foggy and you blink, and suddenly the world is back in color. The stone pyramid in front of you... is also in color now. You watch as the gray granite is covered in a golden sheen. The surface begins to move, and Bill's eye pops open. He begins to levitate, and his limbs pop out again -- but they look much realer now, thick like tendrils.
"Ohhhh it's <i>so nice</i> to have a body! You mortals don't know how good you have it!" The voice is physical now, with more cadence but still a strange buzzing undercurrent. Slowly, his pupil turns down to look at you. "Weirdo! Why don't you give me something to the tune of <i><b>screaming in agony.</b></i>"
<i>Bill is a tough opponent! To even the playing field a little, MegaCorp® has generously provided you with two additional items for this battle only. Make sure to use them with the [Items] command!</i>
<center><span class="btn">[[Begin!|Preparation][$scenario = "gf2"]]</span></center><b>"What are you?"</b>
<b><i>~YOU SUMMONED ME AND YOU DIDN'T EVEN KNOW THAT? WOW! DID YOU EVEN HAVE ANY IDEA WHAT YOU WERE DOING, OR WERE YOU JUST POKING STUFF TO SEE WHAT WOULD HAPPEN?~</i></b>
He floats back, until he's right over the pyramid. <b><i>~WELL! SINCE I'M FEELING GENEROUS TODAY, I THINK I'LL GIVE YOU A LITTLE LESSON!~</i></b> He sweeps his arm out, and the shadows cast by the candles suddenly come alive, swirling around behind him into frightening shapes. <b><i>~I'M A DEMON OF THE MINDSCAPE! I LIVE IN YOUR DREAMS, YOUR NIGHTMARES! IN THE REALM OF THE MIND, I AM SUPREME!~</i></b> He lets his arms droop, and the shadows are suddenly back to normal. He lets his eye droop, looking almost sad. <b><i>~BUT I CAN'T EXIST OUTSIDE OF IT! CAN'T TAKE PHYSICAL FORM, CAN'T EXPERIENCE ALL THE JOYS AND WONDERS OF YOUR WORLD! IT'S A TRAGEDY!~</i></b> His eye pops open again, and he looks down at the pyramid. <b><i>~THAT IS, UNTIL NOW! I GOT MY PHYSICAL BODY RIGHT HERE, AND WITH IT I CAN BRING ALL MY POWERS INTO THE REAL WORLD! OH, IT'LL BE SUCH FUN!~</i></b>
<<include "GF2 fite">><b>"fite me"</b>
Bill actually looks taken aback. He stares at you in silence for a second, blinking once.
<b><i>~YOU... ARE CHALLENGING ME? ME, BILL CIPHER?~</i></b> He floats back, clutches his belly, and laughs. It's a sharp, rising, bellowing laugh that rings in your ears. <b><i>~OH! YOUR ARROGANCE! YOUR HUBRIS! IT COMES OFF YOU IN WAVES! I LOVE IT!~</i></b> He glances down, at the stone pyramid. <b><i>~ALRIGHT! LET'S DANCE!~</i></b>
<<include "GF2 fite">>Bill floats in front of you, stock still. His eye is wide. He stays in that position for several long seconds. He darts his eye around the room, before settling it on you.
"...Well... done, human! You have passed my trial! Yes! That's what this was! I let you win! Were I to fight with my true power, you would not have lasted a second! AhaHAHAHAHAHA!"
He glows, and the edges of his body grow fuzzy, like two images overlayed on top of each other. Instantly, his expression becomes panicked, eye bulging out further than you thought possible. "No!" he screams. "I don't wanna go back! I'm not done here! I worked too hard for this! Nooo<i>ooooo<b>OOOOOOOO!!~</b></i>
There is that same eye-watering twisting of space, and when you blink, there is only a blank stone pyramid again.
>[[Return to the hub|Hub]]<<if tags().includes("GF2")>>
<<include "GF2 Hub">>
<</if>>
<<if tags().includes("win")>>
<<achievementcheck>><<victorymessage>><br/><br/>
<</if>><<if $inbattle>>
<<chain $subject $target $actor>>
<<for _puppet range $puppets>>
<<if _puppet.en < 0>>
<<set _puppet.en = 0>>
<<elseif _puppet.en > 10>>
<<set _puppet.en = 10>>
<</if>>
<</for>>
<</if>><<include "SU2 hub">>
<b>"<<print passage()>>"</b>
She applauds enthusiastically, stars in her eyes like you're a pet that's just done a wonderful trick. "Yes, like that! Good job!" Her mouth shifts into a smirk, and she gives you a little laugh. "But I must say, you look a little <i>human</i> for a Homeworld soldier. Do you even know who I was rebelling against?" She grins hugely, clearly expecting you to flub the question.
<i>Do</i> you know? Type your answer in the field below, and press "Enter" to say it...
<<textbox "$answer" "" "Mystery of the Rebellion">>
<i>[You only get one shot at this. You must give the full name of the specific individual, but it does not need to be case sensitive.]</i><b>"<<print $answer>>"</b>
<<nobr>>
<<set $C.su2.reveal_rebel to "failure">>
<<set $answer = $answer.toLowerCase()>>
<<if $answer.includes("pink diamond")>>
<<set $C.su2.reveal_rebel to "success">>
This time it takes her longer than a second to recover from her shock. But to your surprise, she just grins even wider when she does.<br/>
<br/>
"Well, aren't you a smart one! Who told you? Haha, no, no--" She waves a hand playfully. "--I shouldn't ask." Her smile becomes just a few watts less radiant, and she pauses before continuing more seriously, "But if you know that, then you know I did it all for you. Yes, you, personally! If Pink Diamond's colonization had continued, well... you wouldn't be here. You wouldn't be able to make all the wonderful and beautiful choices that make you who you are." She turns her head slightly to give you a sidelong glance. "I don't know who filled your head with these ideas, human, but you must understand this empire has no love for you. Would you still take vengeance on me, knowing that?"
<<elseif $answer.includes("diamond authority")>>
She just laughs at you, not exactly unkindly, but like you're a puppy who's just made an embarrassing mishap. "Well, <i>duh</i>," she says with an exaggerated roll of her eyes, "that's pretty obvious! But if you don't know <i>which</i> diamond, I think you don't actually know what you're talking about, haha!"
<<elseif $answer.includes("homeworld")>>
She just laughs at you, not exactly unkindly, but like you're a puppy who's just made an embarrassing mishap. "Well, <i>duh</i>," she says with an exaggerated roll of her eyes, "that's pretty obvious! But if you don't know any more details than that, I think you don't actually know what you're talking about, haha!"
<<elseif $answer.includes("crystal gems")>>
Her eyes boggle, and she looks genuinely baffled. Then she laughs uproariously. "What -- what are you -- the Crystal Gems <i>were</i> the rebels! What in the stars is Homeworld telling people these days?" She laughs for a little while longer, then gets control of herself. "Sorry, but I think you got your stories mixed up!"
<<else>>
"Nope!" She just grins wider at your frustration, then chuckles. "Don't feel bad! Not many humans know the details, and that's okay. It happened a very long time ago. But we can talk about something else, if you like!"
<</if>>
<</nobr>><b>"<<print $answer>>"</b>
<<nobr>>
<<set $C.su2.reveal to "failure">>
<<set $answer = $answer.toLowerCase()>>
<<if $answer.includes("pink diamond")>>
<<set $C.su2.reveal to "success">>
She just tilts her head even more. Then she tilts her head back. She pauses a second before breaking out in hysterical laughter.<br/>
<br/>
"What -- that is -- that has to be the craziest thing I've ever heard! What, you think -- are you saying she shapeshifted into me? You -- you really don't know anything about gems! You can't just pretend to be any gem you want! That would defeat the whole point of Homeworld's system! Do you have any idea how <i>big</i> Pink Diamond was?" She holds her head, staring off into the distance and laughing as she calculates something. "The degree of shapeshifting you'd have to do -- even if, ha, a <i>diamond</i> would <i>ever</i> deign to pretend to be a gem as <i>dirt-common</i> as me -- even if! I'm, what, half her size? Less? No one could hold that level of mass change, not even a diamond!" She throws her head back and laughs uproariously.<br/>
<br/>
"Homeworld's really come up with some crazy propaganda, huh," she says eventually, still laughing to herself.
<<else>>
She just tilts her head even more. Then she tilts her head back. Then she laughs. "Sorry, I don't know what you're talking about! But we can talk about something else, if you like!
<</if>>
<</nobr>>You expect Rose to charge forward again, but instead she steps back, raising her sword in a defensive stance. "Heh," she says. "You're stronger than you look. I'll have to start taking this seriously."
Out of nowhere, a shield appears on her arm in a burst of sparkles. It is a translucent bright pink, like it's made of stained glass. It is inlaid with a crest of vines, spiraling towards a stylized rose in the center. Rose raises it and her sword close to her body, a far cry from the loose, easy stance she had before. Her expression hardens, and she looks truly serious for the first time since the fight began.
[[(Continue...)|Battle!]]
<<run $enemies[0].changeInto("Rose 2")>>
<<set $B.stage = 2>>Rose reels from the last blow, staggering back and letting her shield arm flail out.
Sloppy! You order your puppets to charge at the opening. Rose recovers just in time and the attack glances off her shield, but it's an awkward deflection. She's panting heavily, and you see genuine panic in her eyes.
Before you can attack again, Rose leaps into the air. You expect her to come crashing down again like she did in her two-handed style, but instead she floats away, trying to gain distance. She drops to the ground quickly and grasps her sword with both hands. She twirls it in a full circle, then with a great cry, stabs it into the ground.
The sword is suddenly wrapped in vines, bursting forth from the crack in the earth and still growing faster than you thought possible. They snap forward, reaching unerringly for your puppets like the tendrils of some horrid beast. The vines latch on, digging their huge thorns deep into your puppets' bodies.
Rose flicks her arm, and her shield has suddenly grown to enormous size. She hunches down beneath it, staring at you and panting.
She must be near her limit. Your puppets are injured by the vines, but they can still move. Finish this!
[[(Continue...)|Battle!]]
<<run $enemies[0].changeInto("Rose 3")>>
<<run $enemies[0].addEffect(new Effect("Rose's Shield",-1,0))>>
<<for _puppet range $puppets>>
<<if !_puppet.dead>>
<<run _puppet.addEffect(new Effect("Rose's Thorns",-1,0))>>
<</if>>
<</for>>
<<set $B.stage = 3>>Rose's gem twirls once before landing on the ground with a <i>thump</i>. It is perfectly symmetrical, just as flat on the other side as the front.
>[[(Steal the gem)|SU2 end]]
>[[(Shatter her)|SU2 end]]
>[[(Leave)|SU2 end]]Before you can do anything, the rose quartz slowly starts to levitate in the air. It glows brightly, and there is a sudden flash of light. You blink, and the light solidifies into the form of Rose, still panting. She wipes her brow and grins.
"Whew! Looks like I overdid it a little, haha! It's just been so long since I've really had to fight like that!" She looks absolutely giddy. "Well! You beat me! That's amazing! I've never met a human who could do that! You should be really proud of yourself!" She waves you goodbye, smiling like the sun, as the constructed world fades away.
>[[Return to the hub|Hub]]<<set $version = '0.59'>>
<<set $base = 40>> /* base constant for dmg formula */
<<set $damper = 1>> /* damping factor for dmg formula */
<<set $effbase = 20>> /* base constant for stat mods */
<<set $effdamper = 0.5>> /* damping factor for stat mods */
<<set $min_dmg = 1>> /* minimum damage */
<<set $min_DoT = 1>> /* minimum DoT damage */
<<set $min_buff = 0>> /* minimum buff effect */
<<set $min_debuff = 3>> /* minimum debuff effect */
<<set $difficulty to "hard">>
/*
Hard: smart targeting will only target vulnerable characters
Medium: smart targeting gives preference to vulnerable characters
Easy: no smart targeting
*/
<<set $formula to "subtractive">>
/*
Can choose between multiple premade damage formulas here.
subtractive: (base + damper * a.get("Attack")) * weight - damper * b.get("Defense")
bonfire: (base + damper * (a.get("Attack") - b.get("Defense"))) * weight
rpgmaker: (a.get("Attack") * 4 - b.get("Defense") * 2) * damper * weight
divisive: (base * (a.get("Attack")/b.get("Defense"))) * weight
*/
/* An array of all the elements that will appear in your game, in the order you wish for them to be displayed on the elemental resistances screen. The Actor constructor will automatically initialize everyone's values for these strings to 1. Note that any use of these elements must be set to EXACTLY the same string, case-sensitive. */
/* Initializing constants that will be used in actions and etc. */
<<set $PUPPET_HP = 1000>>
<<set $knife_weight = 0.8>> /* weight for all basic multi-hit attacks; localized here for easy testing */
<<set $pierce_weight = 0.8>> /* weight for all basic piercing attacks; localized here for easy testing */
<<set $boost_time = 3>>
<<set $SACRIFICE_HP = 50>>
<<set $LIFEGIVER_HP = 100>>
<<set $HUNTER_WEIGHT = 0.8>>
<<set $ENregen = 2>>
<<set $struggleCost = 2>>
<<set $berserk_factor = 0.5>>
<<set $defend_factor = 0.5>>
<<set $SHIELD_FACTOR = 0.3>>
<<set $ROSE_SHIELD_FACTOR = 0.6>>
/* Define the starting party here. */
<<set $puppets = [new Puppet("Rogue"),new Puppet("Fighter"),new Puppet("Mage")]>>
/* Define any reserve characters you want players to swap out here. */
<<set $Reserve_Puppets = [new Puppet("Bard"),new Puppet("Archer"),new Puppet("Cleric"),new Puppet("Witch")]>>
<<set $All_Puppets = $puppets.concat($Reserve_Puppets)>>
<<setInv>>
<<set $B = {}>>
/* This is a controller object. Use it to store any variables you don't want to persist after battles. Then, instead of having to remember and reset every variable, just reset this to a blank object. */
/* Initializing miscellaneous variables. */
<<set $actor = [null,null]>>
<<set $subject = [null,null]>>
<<set $target = [null,null]>>
<<set $action to null>>
<<set $effects_to_remove to 0>>
<<set $removed_effects = []>>
<<set $mincost to 0>>
<<set $tutorial to false>>
<<set $inbattle to false>>
<<set $achievements to new Map([
["Bubblegum Chewer", 0],
["Scourge of Ooo", 0],
["Mystery Solver", 0],
["Tree Feller", 0],
["Star Crusher", 0],
["Watterson Wrecker", 0],
["Thinner Than Water", 0],
["Thicker Than Blood", 0],
["Princess With A Thousand Enemies", 0],
["Gem Smasher", 0],
["Pearl Connoisseur", 0],
["Garnet Collector", 0],
["Amethyst Curator", 0],
["Bully", 0],
["Widowmaker", 0],
["Demonologist", 0],
["Orphaner", 0],
["Tyrant", 0],
["Gladiator", 0],
["Independent", 0],
["Does It Make A Sound?", 0],
["The Redemption", 0],
["Alone Together", 0],
["Last One Standing", 1],
["Tactician", 1]
])>>
/* ["Invincible", {at1: false, at2: false, gf1: false, gf2: false, gum1: false, gum2: false, su1: false, su2: false, champ: false}] */
<<set $P to {at: 0, gf: 0, gum: 0, su: 0}>>
/* Progress controller. Tracks fights player has cleared. */
<<set $C to {at1: {}, gf1: {}, gum1: {}, su1: {}}>>
/* Scene controller. */Your attack pushes Marceline straight into a pool of sunlight, and she bursts into flames before she can escape.<<timed 4s>> She wails a blood-curdling shriek as she flails helplessly, the flames crisping her pale skin black like parchment as you watch.<<next>> She screams and screams and screams until suddenly -<<next>>
Silence.<<next 3s>>
<<set _enemy.dead to true>>The flames go out all at once. Nothing remains but a pile of ash.<<next 3s>>
[[(Continue...)|Battle!]]<</timed>>You hear a wet <i>crunching</i> noise, and Nicole's legs buckle underneath her. She gasps sharply, but manages to catch herself.<<timed 5s>>
"That's nothing," she says with chilling calmness. "I can still fight."<<next 4s>>
She stands up, and her legs immediately give out again.<<next 5s>>
Terror flashes across her eyes, but her stare passes straight through you. "Wait. H-hold on. Just... just let me get up again."<<next>>
She forces herself upright, but you can see immediately it's not going to last. Her whole body is quivering like a reed in the wind. She falls again, landing heavily on her arm. She splays out on the ground, clutching her stomach. You hear her coughing, thick, wet noises coming from her throat.<<next 6s>>
"Everyone is... depending on me... I can't... I won't..."<<next 4s>>
She stands upright. Her leg trembles and you wait for the inevitable, but this time she stays standing. She goes still as a statue, staring at something you can't see.<<next 5s>>
She grits her teeth.<<next 3s>>
"I<<next 1s>> won't<<next>> lose.<<next 2s>>
"I<<next 1s>> won't<<next>> lose.<<next 2s>>
"I<<next 1500ms>> won't<<next 3s>>..."
<<set _enemy.dead to true>>Nicole collapses!
[[(Continue...)|Battle!]]<</timed>>