Full notes
Full Usurper Reborn update
Read the full published notes in a cleaner layout. The original post stays linked below.
What changed
- Balance
- Gameplay
- Fixes
- Store
- Maps
- Compatibility
v0.60.10 Patch Notes
A hotfix on top of v0.60.9 bundling 17 player-reported bug fixes and one diagnostic addition. Heavy focus on combat polish: status effects no longer leak past the end of a fight, monster abilities address the correct target when hitting a companion, weapon enchant procs attribute the attacker by name, defensive-ability follow-ups now correctly damage companions, and a long-standing audit gap (every monster shipped with MonsterClass.Normal regardless of its family) has been closed -- Turn Undead, Holy enchant scaling, Divine Smite, and ~20 other class-keyed mechanics actually work for the first time. Plus a meaningful Love Street rebalance and several quality-of-life UX fixes.
Combat
Hidden status auto-crit now fires on basic [A]ttack. Cyclebreaker Temporal Feint / Abysswarden Umbral Step / Assassin shadow / Assassin vanish / Bard Blood Pact / universal [H]ide all set the Hidden status which is supposed to guarantee a crit on the next attack. Power Strike and class abilities consumed it correctly, but a plain [A]ttack follow-up in multi-monster combat silently dropped the auto-crit and let Hidden tick down without firing. Now mirrors the Power Strike pattern: Hidden is consumed and the guaranteed crit lands.
Action-preventing statuses cleared on combat end (player + teammates). Stunned / Paralyzed / Sleeping / Frozen / Slow were never scrubbed when a fight ended. If a late-fight stun hadn't fully ticked, your teammate carried it into the next fight and lost their first turn to a leak. The end-of-combat cleanup now strips those across the player and every alive teammate, with the same scrub mirrored at combat start as defense in depth. DoT statuses (Poisoned / Bleeding / Burning / Diseased) are deliberately left alone since they have separate persistent fields for out-of-combat tracking.
Monsters now carry the correct MonsterClass. MonsterGenerator set FamilyName ("Undead", "Demonic", etc.) but never assigned MonsterClass -- every monster shipped with the default Normal. The Turn Undead spell's gate read MonsterClass != Undead, which was always true, so Turn Undead concluded EVERY monster was "non-undead" and printed the unaffected message. Same audit gap silently broke Holy enchant 2x vs undead, Paladin alignment damage bonus, Sunforged Blade, Divine Smite, fire-vulnerability checks, and ~20 other class-keyed mechanics. Monsters now get the right classification at generation time. Turn Undead correctly damages Ghouls / Zombies / Wights / Wraiths / Liches. Existing already-spawned monsters on your current floor stay misclassified (their state was already serialized), but every new spawn from this point forward gets the right class.
Monster defensive self-buff abilities now correctly fall through to a normal attack against companions. Abilities like Incorporeal / Vanish / Phase / Flight / Invisibility / TreeMeld are self-buffs that don't damage anyone -- the design is that they layer ON TOP of the monster's normal swing. The player-targeted path handled this correctly (phase out, then normal attack hits the player). The companion-targeted path unconditionally returned after the ability resolved, so for every defensive-self-buff ability the monster picked, the companion took zero damage that turn while the player got hit normally. Now matches the player path -- the monster phases out AND swings at the companion.
Monster ability messages now address the correct target. When a spider's WebTrap landed on a companion, the line read "the spider traps you in sticky webbing!" addressing the player even though the actual target was the companion. Affected ~30 monster abilities total (WebTrap, PetrifyingGaze, Silence, Enfeeble, Devour, Paralyze, Hellfire, Corruption, Burn, Sleep, Charm, RootEntangle, Terror, Nightmare, etc.). The function now derives target pronouns from target is Player and threads them through every ability message. WebTrap on Mira now reads "the spider traps Mira in sticky webbing!"
Monster status applications on a teammate now surface the resist outcome. WebTrap and similar status abilities print a flavor line up front and only AFTER that roll the chance to actually apply the status. WebTrap is 45%, so over half the time the flavor reads as if the bind landed but the stun didn't -- and the next round the teammate acts normally and you think the engine ignored the stun. The companion-side resist chain also lacked the Cyclebreaker and Paladin class passive resists the player path has. Both fixed: chain now mirrors the player path (immunity, Cyclebreaker, Paladin, Calm Waters, roll), and a new "shrugs off" line prints when the chance roll fails so you see WHY the teammate can still act. Player-side gets the same shrug-off line for symmetry.
- Monster-attack damage display now coherent. Bug report quote"The angel swings wild! 0 damage vs 143 defense. 1 damage got through." Three layered issues feeding one confusing output. The post-multiplier monsterAttack could truncate to 0 via Earthbind Totem or Easy difficulty multiplier; the tier-flavor message read that as Miss ("swings wildly!"); the defense-calc line printed unconditionally ("[0 damage vs 143 defense]"); the minimum damage floor still landed 1 damage. Three messages contradicting each other. Fix: clamp monsterAttack to >= 1 after multipliers; gate the defense line to only fire when armor actually reduced damage; add a brief pause between a defensive self-buff ability and the followup basic attack so they read as separate beats.
Weapons, Enchants, and Equip UX
Two-handed weapons no longer get silently swapped out when picking off-hand for a one-handed item. You could pick a dagger, choose Off-Hand as the slot, and the game silently auto-unequipped your two-handed staff to inventory before slotting the dagger -- with the "Moved Quarterstaff to inventory" line printed in gray and easy to miss. The auto-unequip was originally a sword-and-board convenience (2H weapon + grab a shield = one click). Now shields keep that one-click swap, but one-handed weapons going to off-hand while you're wielding a 2H get a clear refusal naming both weapons. Defense in depth: the equip prompts now annotate the Off-Hand line with (unavailable while wielding two-handed) so you see the constraint before picking the slot.
Per-weapon enchant procs no longer leak across hands while dual-wielding. Three weapon-source enchant categories were querying equipment incorrectly: Mana Steal and Lifedrinker were summing across ALL slots, so an off-hand Siphoning dagger procced on every main-hand swing too. Elemental enchants (Fire / Frost / Lightning / Poison / Holy / Shadow) were the inverse -- they hardcoded MainHand, so off-hand elemental enchants never procced at all and main-hand enchants procced on off-hand strikes too. Now each strike only proc's the enchants on the weapon that actually swung. Off-hand fire / frost / lightning enchants will proc on off-hand strikes for the first time.
Frostbite enchant applies real Slow instead of a permanent Defence shave. Magic Shop description was "+20 power + chance to slow enemies." Actual implementation ran target.Defence -= 3 per proc -- a permanent stat mutation that stacked every proc, no slow status applied. Now applies the real Slow status (halves the target's attack count per round). The Shaman Frostbrand totem ability gets the same fix (its proc code was copy-pasted from the broken Frostbite implementation).
Weapon enchant proc messages now attribute the attacker. Fire and lightning already differentiated player vs teammate ("Flames erupt from {name}'s weapon!"), but frost / poison / holy / shadow didn't. So when a teammate's weapon procced one of those four enchants, the message read with no attribution and you might assume your own enchant was leaking across characters. Now all six enchant types include the attacker's name when a teammate procs: "Frost spreads from Lyris's strike!", "Shadows coil from Aldric's blade!", etc.
Dual-wield ability follow-up strike no longer prints "Off-hand strike at You!"Pure text bug -- the damage path was unaffected (the enemy took the hit correctly). Affected every melee class ability that triggers an off-hand follow-up while dual-wielding (Holy Shite, Backstab, Power Strike, Riptide Strike, etc).
Companions and Teammates
Team NPC combat-loot equip didn't persist across relog. When you passed loot to a non-companion team NPC during combat, the gear stayed on a combat-side reference and never propagated to the canonical NPC -- so on next save, the stale equipment was persisted and the equip reverted. Equipping the same NPCs from the Team Corner or the in-dungeon party menu worked fine. The combat-loot path now uses the right sync method based on whether the teammate is a companion (Aldric / Mira / Lyris / Vex / Melodia) or a Team Corner NPC. Equipment now sticks across logout in both cases.
Cleric / Paladin "examine feature" bonus now heals the whole party. When a Cleric or Paladin examined a class-specific dungeon feature, the reward was a self-heal of MaxHP/4 -- effectively a no-op since Clerics are back-row and rarely need healing. Every other class's reward is high-utility for that class (Magician/Sage mana, Warrior attack buff, Assassin poison vials, Ranger gold + potion, Bard song charges). Cleric/Paladin's feature.divine_presence now radiates MaxHP/4 to every alive teammate. Each ally heals based on their own MaxHP. Solo cleric still gets the same self-heal as before.
Love Street
Three-layer rebalance. A single visit to the most expensive Love Street partner could roll up to +650 darkness, with paired chivalry penalty knocking another -325 off your alignment -- swinging a balanced character ~975 points toward Dark in one 100,000-gold transaction. Two visits could move a Saint character into Dark Lord territory for 200,000 gold total. Fix: (1) Prices doubled across all Courtesans and Gigolos. The top tier (Loretta / Banco) goes from 100,000 to 200,000 gold. (2) Darkness ranges cut sharply per tier; the top bracket goes from 150-650 to 40-120 darkness per visit. (3) New 2-visit daily cap (Courtesan + Gigolo visits counted together). Combined max alignment shift from Love Street is now ~360 net points per day, comparable to the murder cap's 750+375 ceiling. The new cap appears as "Visits remaining today: X/2" at the top of both menus.
Dungeons
- Crypt rooms no longer appear in non-tomb-themed floors. Bug report quote"should the epitaphs and stuff from the crypt level seep through to the sewer theme?" The standard room pool had two Crypt rooms hardcoded for every theme, so a Sewers floor (levels 11-20) consistently surfaced two "Flooded Tomb" rooms whose description bridged the theme awkwardly ("the sewers broke through into this ancient crypt long ago"). Crypt rooms now only appear in Catacombs and AncientRuins floors -- the two themes where tomb content lands naturally. Other themes get Chamber/Alcove rooms instead. Existing already-generated Sewer floors stay as-is; new generations from this point forward use the corrected pool.
Music Shop
Performance buff message and /health line now say what the song actually does. Bug report quote: "The game says +15% for 5 combats but doesn't write what's that 15%. The game should write 15% defense for 5 combats instead." Each song affects a different stat (War March = attack damage, Iron Lullaby = defense, Fortune's Tune = gold from kills, Battle Hymn = both attack and defense), but the post-purchase message and the /health Active Buffs line both just said "+15%" with no context. Now reads "The War March stirs something in you. (+15% attack damage for 5 combats)" at buy time and "War March: +15% attack damage (5 combats)" in /health.
Diagnostic
Save-seal-audit logging (online mode only). After a player reported all their seals reset post-v0.60.9 deploy, code review ruled out the obvious suspects (the v0.60.9 map-reveal seal-discovery fix; the v0.60.8 Dungeon Reset Scroll). The actual cause is likely upstream -- a save fires without the per-session story state propagated, so the empty process-wide fallback singleton's seal list gets persisted. This release adds runtime audit logging at the save path: every online save now logs a SAVE_SEAL_AUDIT line with username, session context state, cycle, seal count, and seal list. If a save ever fires with SessionContext.Current == null, a loud SUSPICIOUS_FALLBACK_SAVE warning fires. The next time the bug triggers, we'll catch it mid-write. The affected player's seals were manually restored in the live DB before this build. Real fix lands in a follow-up once the audit catches the contamination path.
Beta is live. Bug reports and feedback always welcome. Press the! key in-game or type /bug to report. See you in there.
Source
Changelog.gg summarizes and formats this update. How we read updates.
