Magic & spells
Affinity, the notch ladder, and every spell it reaches
Magic is not a spell list you learn — it is one charge whose depth is set by how much affinity you are carrying for the element you are casting. Hold aim to take the cast stance, hold attack to charge (it spends mood), release to cast. How far the bar got decides which version of the spell you throw.
Elemental magic comes in VERSIONS: every equipped item granting an element's affinity (the held caster wand + a worn matching amulet) LENGTHENS that element's charge bar, and the bar is cut into NOTCHES — each notch reached loads a categorically bigger spell (fire: a few small flames -> more -> big ones -> a fire beam blast). Rung 3 rides the EMPOWER numbers above (the old pairing bonus became the "big" notch); rung 4 is each element's blast form. With conflicting affinities equipped, the scroll wheel swaps which element is loaded while the cast is ready (the bar recolors per element).
Affinity: what you need to cast
Affinity is counted per element, from everything equipped at that moment. Each point lengthens that element's bar by 2 notches, to a ceiling of 4.
| Source | How it counts | Element | Affinity | Notes |
|---|
| Energy Longsword | Held caster | Energy | +1 | Only while it is the weapon in your hands. |
| Fire Wand | Held caster | Fire | +1 | Only while it is the weapon in your hands. |
| Frost Wand | Held caster | Ice | +1 | Only while it is the weapon in your hands. |
| Mending Wand | Held caster | Healing | +1 | Only while it is the weapon in your hands. |
| Storm Wand | Held caster | Lightning | +1 | Only while it is the weapon in your hands. |
| Ankh | Worn (necklace) | Healing | +1 | Counts while worn, whatever you are holding. |
| Blue Cape | Worn (back) | Ice | +1 | Counts while worn, whatever you are holding. |
| Court's Cloak | Worn (back) | Holy | +1 | Counts while worn, whatever you are holding. |
| Fire Amulet | Worn (necklace) | Fire | +1 | Counts while worn, whatever you are holding. |
| Green Cape | Worn (back) | Lightning | +1 | Counts while worn, whatever you are holding. |
| Ice Amulet | Worn (necklace) | Ice | +1 | Counts while worn, whatever you are holding. |
| Lightning Amulet | Worn (necklace) | Lightning | +1 | Counts while worn, whatever you are holding. |
| Red Cape | Worn (back) | Fire | +1 | Counts while worn, whatever you are holding. |
| Valkyrie Helm | Worn (head) | Holy | +1 | A partial affinity: deepens an element you already hold, and grants it too. |
| Elemental bond (cherub) | Pet | Any bonded element | +bond | Stands with you whatever you hold; stands taller while your mood is at its ceiling. |
| Arcane Confluence (cherub) | Pet | The element you are charging | +notches | Lends only to the bar you are actually charging. |
| Ribbon Staff | Held caster (generalist) | Every element you already know | +mood × 2 | Deepens what you know and can never grant a new element — bare, it gives you nothing and casts blind. |
A worn piece counts whatever you are holding, so a fire wand with a fire amulet is affinity 2 — a full four-notch bar and the blast form. A fire wand with an ice amulet is two separate affinities of 1: both bars exist, and the scroll wheel swaps which element is loaded while the cast is ready.
What each affinity point buys
| Affinity | Notches on the bar | Deepest spell reachable | Surplus |
|---|
| 1 | 2 | up to rung 2 | — |
| 2 | 4 | the blast (rung 4) | — |
| 3 | 4 | the blast (rung 4) | charge 15% faster |
| 4 | 4 | the blast (rung 4) | charge 30% faster |
Affinity beyond the ladder's depth has no rung left to unlock, so it pays out as SPEED instead: this much faster charge per surplus point (Player. cast_affinity_ease). Only reachable by stacking an elemental bond, a cape and an amulet on one element — deep standing in an element, rewarded.
Casters
A release below 35% of the bar fizzles — and still spends the mood.
Fire — every number
| Constant | Value | What it is |
|---|
FIRE_BEAM_BLAST_DMG | 250 | AoE damage to everything else in the blast |
FIRE_BEAM_BLAST_RADIUS | 4.5 | Impact fireball AoE |
FIRE_BEAM_DMG | 450 | Direct-hit damage on the aimed foe |
FIRE_BEAM_HEAD | 2 | Head scale |
FIRE_BEAM_HITSTUN | 16 | — |
FIRE_BEAM_KB | 7 | — |
FIRE_BEAM_RADIUS | 0.3 | Beam body radius |
FIRE_BEAM_RANGE | 24 | Fire rung 4 — the fire beam blast: a heavy traveling head (the ice beam's grammar, slower and fatter) that detonates where it lands. |
FIRE_BEAM_SPEED | 46 | M/s the fire head travels (heavier than ice) |
FRIENDLY_FIRE_DAMAGE_MULT | 0.35 | Damage multiplier applied when a player's strike lands on another player. Knockback is not scaled — it still displaces + disrupts them at full force, which is the whole point (space around your greatsword-wielding teammate). |
WAND_EMPOWER_FIRE_COUNT_ADD | 2 | Extra orbiting will-o-wisps in the halo |
WAND_EMPOWER_FIRE_DUR | 8 | Empowered halo lifetime (vs the plain 5.5) |
WAND_EMPOWER_FIRE_R0 | 1.4 | Fatter orbit ring radius (vs 1.1) |
WAND_EMPOWER_FIRE_R_AMP | 0.5 | Bigger radius breathing (vs 0.35) |
WAND_FIRE_COUNT_MAX | 4 | — |
WAND_FIRE_COUNT_MIN | 1 | Fire wand: charge scales the walking will-o-wisp count (half -> min, full -> max). |
WAND_FIRE_FLOOR_COUNT | 5 | Fire rung 3 — floor fire: a marching line/fan of live_fire patches walking out along the aim from the muzzle (sits between the bolt halo and the beam in power — a direct floor-ignite, not via wisplet contact). |
WAND_FIRE_FLOOR_DUR | 4.5 | Live_fire patch lifetime (s) |
WAND_FIRE_FLOOR_SIZE | 1.1 | Live_fire patch size |
WAND_FIRE_FLOOR_SPREAD | 0.22 | Fan half-angle (rad) the line splays with distance |
WAND_FIRE_FLOOR_STEP | 1.7 | Metres between successive patches |
WAND_FIRE_T1_COUNT | 2 | Fire rung 1 keeps the halo small — "first its a few small fire". |
Ice — every number
| Constant | Value | What it is |
|---|
FROST_PLATFORM_LIFE | 9 | Seconds the ice holds before it thaws |
FROST_PLATFORM_RADIUS | 2.4 | Frost platform. A beam that lands over water freezes a walkable ice slab at the water surface for a while. |
FROST_PLATFORM_THICK | 0.35 | Collision box thickness under the surface |
ICE_PATCH_LIFE | 7 | — |
ICE_PATCH_RADIUS | 2.6 | Ice patch (frost beam miss): the slippery splat. |
WAND_EMPOWER_ICE_PATCH_MULT | 1.5 | Bigger miss-splat + slick radius |
WAND_ICE_BOLT_CHILL_DUR | 2.5 | Chill window a landed shard re-arms (stacks) |
WAND_ICE_BOLT_DMG_MAX | 100 | — |
WAND_ICE_BOLT_DMG_MIN | 50 | — |
WAND_ICE_BOLT_HITSTUN | 6 | — |
WAND_ICE_BOLT_HIT_RADIUS | 0.7 | — |
WAND_ICE_BOLT_KB | 2 | — |
WAND_ICE_BOLT_PATCH_SCALE | 0.5 | Miss splat is small (vs the beam's) |
WAND_ICE_BOLT_RANGE | 22 | Small straight chilling shards fired at the aim point (heal_bolt/telekinesis travel model — raycast per tick, no tunnelling). Light damage + a chill stack; a floor miss drops a small ice_patch. Rung 1 = one bolt, rung 2 = a 3-bolt volley. |
WAND_ICE_BOLT_SPEED | 34 | — |
WAND_ICE_BOLT_SPREAD | 0.14 | Volley half-spread (rad) |
WAND_ICE_BOLT_VOLLEY | 3 | Rung-2 shard count |
Lightning — every number
| Constant | Value | What it is |
|---|
HOLY_BOW_PERFECT_WINDOW | 0.06 | Crest grace (s): a release here is the perfect shot |
PARRY_WINDOW_FRAMES | 4 | First N frames of holding block = the parry window (active from frame 0 — the guard itself is live the same tick the input is read, ground_state polls and swaps state with no startup; the 0.04s enter blend is cosmetic only). 6 -> 4: parry is the instant read, "after frame 3-4 it's a normal block". |
PROJECTILE_PARRY_WINDOW_FRAMES | 10 | Projectiles get A wider window. A melee parry is a read of the swing's windup — the animation tells you when the blow lands, so 4 frames is fair. An incoming glob/missile/rock tells you nothing but its own closing distance, and 4 frames is 0.07s of a flight measured in whole seconds: the mechanic existed but was effectively unhittable. 10 frames (~0.17s) is the reactive-deflect window; the projectile also flashes as it enters it (see SpiderWebGlob._parry_tell) so the timing is teachable. Still a read, not a hold: past the window the same guard only blocks. |
TECH_WINDOW | 0.18 | Impact tech: the parry input pressed just before a wall bounce / wall splat / spiral-knockdown ground impact recovers you actionable — land into a tech (direction held = tech roll that way), or rebound gracefully off the wall. Wall break is never techable. A press arms a short window; a whiffed press locks re-arming briefly so mashing isn't free (the Smash lockout rule). |
WAND_STORMCLOUD_ACQUIRE | 2.4 | Free cloud grabs a foe once this near the point |
WAND_STORMCLOUD_FREE_CHASE | 1.4 | M/s drift + hunt when cast on free aim |
WAND_STORMCLOUD_FREE_TURN | 1.1 | Wide, sluggish turn (rad/s) |
WAND_STORMCLOUD_LIFE | 9 | Rung 3 — storm cloud: the wisp's KIND_THUNDER cloud cast as a player spell with a strike budget. A locked target is chased with better steering; free aim drifts to the point then hunts nearest sluggishly. (storm_cloud.gd wall-block fix serves both.) |
WAND_STORMCLOUD_LOCK_CHASE | 3.4 | M/s chase of a locked target (clearly faster) |
WAND_STORMCLOUD_LOCK_TURN | 3.2 | Crisp turn onto the locked target |
WAND_STORMCLOUD_PERIOD | 1.6 | Telegraph window per strike |
WAND_STORMCLOUD_STRIKES | 3 | Bolts before it dissipates |
WAND_STORMCLOUD_STRIKE_RADIUS | 1.8 | — |
Healing — every number
| Constant | Value | What it is |
|---|
HEALTH_REGEN_BATTLE_RANGE | 12 | A hunting enemy within this range counts as still-in-battle and holds regen off, even if it hasn't landed a hit yet (a standoff isn't safe). |
HEALTH_REGEN_DELAY | 5 | Seconds after taking a wound before the trickle resumes — the "out of battle" grace. |
HEALTH_REGEN_PER_SEC | 3 | Health slowly knits back outside battle, but only up to a ceiling set by the player's own sanity: a frayed mind can't fully mend, so half sanity heals you back to half health. Sanity and health share STAT_MAX, so the sanity value IS the ceiling in health units (sanity 50 -> health regens to 50). Slow trickle (stat units/sec) — a reward for disengaging, not a reason to turtle. |
HEAL_BOLT_RANGE | 24 | The heal self-cast is gone: heal fires a squishy green bubble along the aim ray that heals whatever it hits — enemies included. A longer charge casts a bigger, slower one. Hitting the ground pops a green healing ring (glyph disc + a rising aura cylinder) that HoTs everything standing inside, friend or foe — so self/AoE healing mid-combat means holding the ground you cast on. |
HEAL_BOLT_R_MAX | 0.62 | ... at rung 4 |
HEAL_BOLT_R_MIN | 0.22 | Bubble radius at rung 1 |
HEAL_BOLT_SPEED_MAX | 16 | Rung-1 bolt speed ... |
HEAL_BOLT_SPEED_MIN | 7 | ... rung 4 (bigger = slower) |
HEAL_RING_HPS_MAX | 10 | ... rung 4 |
HEAL_RING_HPS_MIN | 4 | HoT per second inside at rung 1 ... |
HEAL_RING_LEAVE_ABOVE | 0.9 | — |
HEAL_RING_LIFE | 7 | Seconds the ring stays up |
HEAL_RING_RADIUS_MAX | 3.6 | ... rung 4 |
HEAL_RING_RADIUS_MIN | 1.8 | Ring radius at rung 1 ... |
HEAL_RING_SEEK_BELOW | 0.5 | Wounded enemies contest rings ("damaged enemies may attempt to use it"): below SEEK_BELOW health they path to a ring within SEEK_RANGE and camp it until LEAVE_ABOVE (or the ring dies). |
HEAL_RING_SEEK_RANGE | 15 | — |
HEAL_RING_TICK | 0.5 | Seconds between HoT payouts |
LAND_ENEMY_HEALTH_MULT | 1.5 | Rank-and-file land encounters need enough body to express their movesets. Fish derive their own much lighter length-based health curve instead. |
LAYER_BOSS_HEALTH_PER | 0.35 | — |
LIMP_HEAL_FRAC | 0.8 | ...and the limp clears (pool resets with it) while health sits above this fraction of max — healing past it cures the leg. Nothing persists a revive. |
LOW_HEALTH_SANITY_MULT | 1.25 | Sanity drains this much faster while health is low. |
WAND_HEAL_MAX | 46 | — |
WAND_HEAL_MIN | 22 | Heal wand: base heal (hud stat units) at half/full charge, degraded by the caster's sanity (a frayed mind heals worse), and the full-charge AoE splash. |
WAND_HEAL_SANITY_FLOOR | 0.45 | Sanity floor on heal efficiency — even at zero sanity a heal lands this fraction. |
WAND_HEAL_SPLASH | 20 | Full-charge splash to everyone near the recipient |
WAND_HEAL_SPLASH_RADIUS | 4 | — |
The spell objects
| Spell | What it is | Script |
|---|
| Beam Visual | Shared energy-blast beam. | res://combat/wands/beam_visual.gd |
| Energy Beam | Sustained energy beam | res://combat/wands/energy_beam.gd |
| Fire Beam | Fire beam blast — the fire ladder's top notch. | res://combat/wands/fire_beam.gd |
| Frost Platform | Walkable frozen water. | res://combat/wands/frost_platform.gd |
| Heal Bolt | Heal bolt | res://combat/wands/heal_bolt.gd |
| Healing Ring | Healing ring | res://combat/wands/healing_ring.gd |
| Ice Beam | Frost wand — ice beam | res://combat/wands/ice_beam.gd |
| Ice Bolt | Ice bolt. | res://combat/wands/ice_bolt.gd |
| Ice Patch | Ice patch. | res://combat/wands/ice_patch.gd |
| Lightning Beam | Lightning beam: the storm ladder's travelling shot, replacing the old flat billboard bolt. | res://combat/wands/lightning_beam.gd |
| Lightning Bolt | Storm wand bolt | res://combat/wands/lightning_bolt.gd |
| Lightning Mark | Apex lightning mark | res://combat/wands/lightning_mark.gd |
| Wind Cutter | Wind cutter. | res://combat/wands/wind_cutter.gd |
| Live Fire | Live fire — a ground fire patch the wisp ignites. | res://enemies/wisp/live_fire.gd |
| Storm Cloud | The wisp's chasing spell clouds. | res://enemies/wisp/storm_cloud.gd |
| Wisp | The wisp: a floating luminous monster — "just a bright light", a stack of angle-responsive lens flares (enemies/wisp/wisp_body.gd) with sparkles falling off it. | res://enemies/wisp/wisp.gd |
| Wisp Body | The wisp's whole body: a stack of billboarded flare quads (core disc, halo ring, cross streaks, outer glow) wearing enemies/wisp/wisp_flare.gdshader — each layer with its own angle_gain/phase/freq so the stack re-weights as the camera circles it | res://enemies/wisp/wisp_body.gd |
| Wisplet | One will-o-wisp-let — a mini wisp body orbiting the parent Wisp in an authored pattern (Wisp.WILLO_PATTERNS: count, spin speed, radius pulsing in and out, lifetime). | res://enemies/wisp/wisplet.gd |