Patch
notes.
Every release, documented. Current version: v2.4.4
v2.x releases
Simulate waves — real survival
Try/catch wrapper surfaces errors inline rather than silently doing nothing. Wave base calculation fixed for first-run state. Player can now die during simulation — shows inline death result with partial XP/gold rather than crashing.
Retire button crash fix
Undefined trinityRank variable caused the retire overlay to crash silently before the DOM element was appended. Fixed with proper variable declaration.
Simulate waves — survival check
Simulation now plays out for real. Each wave calculates HP loss based on enemy attack, defense stat, lifesteal, and the 10% between-wave restore. If you die on wave 3 of 5 the simulation stops, applies partial gains, and shows a death result with a Play Again button.
Simulate waves on map screen
Moved wave simulation from the Cosmic menu to the wave selection screen. Type a wave count, hit Simulate — XP, gold, and auto-equipped loot apply immediately to your current run.
Cosmic Alignment system
Full Trinity Force redesign. Six alignments (Inferno, Storm, Void, Nature, Order, Chaos) chosen once per season. Node trees per class unlock progressively by rank. Mutations every 10 Trinity levels — locked for the season. Ascension converts rank into permanent stat boosts with a full rank reset. Trinity XP earned from total damage dealt — intentionally slow progression. Extreme difficulty replaces Infinite (25 waves, boss every 5 waves, all loot tiers). Batch level-up screen — all pending points on one screen, tap repeatedly to invest.
Basic attack rate limiting
Manual taps on the attack slot are now rate-limited to the exact same interval as auto-toggle. Spamming the button provides no advantage over enabling auto — both fire at identical speed.
Attack speed overhaul
Base attack speed raised from 1.0 to 2.0 (500ms between hits). Auto-toggle now uses a self-scheduling setTimeout that recalculates speed on every single hit — gear upgrades, buffs, and skill investments take effect immediately. Minimum interval lowered to 100ms for max-speed builds. Rogue class bonus raised from 0.03 to 0.05 per level.
Level-up popup pauses combat
G.combatActive set to false the moment a level-up triggers — not just when the popup opens. Previously there was a 900ms window where stopEnemyAutoAttack had run but combatActive was still true, allowing enemy hits to land during the delay.
Zindigon loading screen
Branded loading screen added matching zindigon.com — animated dot grid, mint glow, film grain, Z mark SVG, Instrument Serif title. Dismisses on auth ready with a 6 second failsafe for slow connections.
Basic attacks self-scheduling
Replaced fixed setInterval with a self-scheduling setTimeout. Timer starts before fireAbility runs, so processing time (particles, sound, DOM updates) no longer stacks on top of the intended interval. Auto toggle now matches manual spam speed exactly.
Dark/light element removal
All remaining dark and light element logic removed — canvas draw branches, sound cases, particle color map entries. Sound key map now routes by imbue instead of class name, covering all new imbue types.
Mage particle crash — root cause
Particle spawn code used ab.class ('mage') as the element color key. elementParticleColor('mage') returned undefined, producing 'undefinedff' as a canvas color string — an invalid value that throws a silent error and permanently corrupts the 2D context for the session. Fixed by using ab.imbue (fire/water/grass) as the key. All new imbue types and class names added as fallbacks.
Arrow particle canvas corruption
Arrow particle handler was placed inside particles.filter(), which expects true/false returns. The handler called ctx.restore() without a matching save and returned undefined (falsy). Each arrow fired unbalanced the canvas save/restore stack — corrupting the context after a few shots. Moved to drawParticlesLayer where it belongs.
Canvas sizing + onEnemyDeath safety
Triple requestAnimationFrame chain ensures layout is fully settled before canvas measures dimensions. ResizeObserver added as permanent safety net. onEnemyDeath wrapped in try/catch — forces Next Wave button visible on error so players can't get permanently stuck.
Classes start at level 3
All classes previously started at classLv 1 but skills require classLv 3+. New players opened the loadout picker and saw nothing available. Fixed by starting all classes at level 3. Loadout picker also now always shows currently equipped abilities regardless of level requirement.
Enemy scaling — power curve
Replaced 1.18^level exponential (which produced 644M HP enemies at level 100) with lv^1.85 for HP and lv^1.4 for attack. Enemy level range widens from ±5 to ±12 as player level increases. Result: 8-35 hits to kill across all stages with a gradual difficulty increase.
Auto-slots persist between enemies
Root cause: stopAllAutoSlots(save=true) was called multiple times in the kill chain. The second call found G.autoSlots empty and overwrote the saved state with []. Fixed to only save when slots are actually running. All interruptions (vendor, item drop, level-up popup) now save and restore auto-slot state.
Damage variance + color coded numbers
Every hit rolls 80-120% of average damage. Number colors: white = normal, blue = near-max roll (top 13%), red = crit, gold = max roll + crit simultaneously. Enemy levels now roll between playerLevel-2 and playerLevel+8.
True idle mode
Next Wave button always visible, never hidden — dimmed when unavailable. All five bottom bar buttons always present. Ability slots stay on between waves — saved and restored across vendors, item drops, and level-up popups. Auto-wave toggle fires immediately and persists across the entire run.
Full class overhaul — 85 abilities
Each class now has 2 basics, 5 skills to choose from, and 3 ultimates per imbue path. New passive buff system — abilities trigger timed stat boosts displayed as countdown timers on the arena (Phoenix Surge, Storm King, Absolute Zero, Shadow Realm, etc). Arrow projectile animation for rogue bow. Enemy lunge animation on attack. SE helper removed from class selection screen.
Gear upgrading + extended boss milestones
Equipment can be upgraded +1 to +5 via the gear inspection modal (50→150→400→900→1800g). Each upgrade adds +15% to all stats. At +5, a star bonus rolls on one random stat for an extra 25-50% boost — rerollable for 2500g. Boss milestones extended to 50M total damage with exclusive titles: Decimator (10M), Dragonslayer (30M), World Ender (50M).
XP system rework
XP per kill = wave × 12. XP to level up = playerLevel × 80. Result: always roughly 7 kills to level regardless of wave — consistent pacing throughout the run. Boss XP = wave × 12 × 5, worth almost a full level on its own.
Title tutorial popup
Players who have titles but haven't selected one see a one-time popup on login explaining what they have and how to equip it. Also fires mid-run when a new milestone title is earned.
Enemy level scales with player
Enemies roll between playerLevel-2 and playerLevel+5 instead of wave-based scaling. Restarting on a new difficulty no longer gives you trivially easy enemies. Enrage chance increases when enemies are higher level than you.
Enemy death flow stabilization
Three separate code paths could trigger onEnemyDeath simultaneously (fireAbility timeout, tickStatusEffects DOT, level-up popup). G.enemy nulled immediately at start of death function. G._enemyDeathInProgress flag prevents reentrance. stopAllAutoAttacks stub replaced with v2.0 equivalent. Stale G.enemy.gold reference after null fixed.
Launch stabilization
isSlotUnlocked checked G.startingClass (removed in v2.0) instead of G.playerClass — froze auto-attack loop for all players. Duplicate ABILITIES and CLASS_NAMES declarations removed (SyntaxError). Stray comment line produced bare 'in' token JavaScript error. All three shipped as hotfixes within hours of v2.0.0 launch.
The Great Restructure
Complete rebuild of the game's core systems. Three playable classes — Mage (Fire/Water/Grass imbues, Spell Vamp), Warrior (Poison/Electric/Ice, sword and shield, Offhand slot, 10% DR), Rogue (Dual Daggers or Bow, Poison/Electric/Ice). Imbue system replaces Super Effective — Burn DOT, Poison DOT (stackable), Electric AOE DOT, Ice slow and freeze, Water slow and weaken, Grass heal on hit. Defense replaces Armor and Magic Resist. New creature-based enemy roster: Wolf, Bear, Troll (regen), Harpy (slows), Golem (armored), Giant, Wraith (poison immune), Dragon, Unicorn. Enraged variants resist specific imbues. Title system — Season 1 awards granted, leaderboard wiped for Season 2.
v1.x releases
Balance & polish pass
Enemy attack decoupled from HP scaling — enemies stay tanky but no longer one-shot. Boss XP added. Wave boss made optional with a fight-or-skip prompt. Vendor refresh button (30g base, doubles each use). Loot rarity scales with player level and wave. NVE damage added alongside SE. Brutes resist all elements. Ability descriptions rewritten for clarity. Orb saving fixed.
Original release series
Initial public launch. Element system (Fire/Water/Grass/Dark/Light), wave-based progression, JSONBin leaderboard, boss damage race, milestone rewards, Trinity Force artifact shop, vendor system, skill tree, class XP, password reset, Supabase migration.