github binary-knight/usurper-reborn v0.65.3
v0.65.3 Release Notes

latest releases: v0.65.5, v0.65.4
12 days ago

Release Notes - v0.65.3 (Countdown)

Fifth release of the Beta -> 1.0 "Countdown" cycle. The headline is two Power Strike fixes and a high-severity economy exploit. Power Strike: (1) the tactical [P] Power Attack was silently dropping every weapon enchantment, and (2) the Power Strike class ability did less damage than a plain auto-attack while wielding a two-handed weapon (the original report), because the basic attack got the two-handed damage bonus and the ability did not. The exploit (GitHub issue #112): unequipping reforged gear reset its quality and let players compound weapon power and gold into the billions. The release also includes the audit-driven shield/quality fixes and a broad consolidation of item conversion code to stop this class of bug recurring.

It also folds in a batch of fixes from a player's 15-hour playthrough notes: party XP silently stranded on a dead teammate's slot, the inn arm-wrestling daily limit not resetting when you sleep in single-player, no way to read or scroll merc contracts and a long quest list, no on-screen combat round counter or buff indicator (most glaring on a Bard), dungeon "[X] Examine" features so frequent they became autopilot busywork (now much rarer and worth more), companions/team NPCs not healing in town (resting now heals the whole party), and no way to inspect Black Market gear before buying (added).

Finally, a data-driven early-game survivability pass: a full-month read of live death data (after fixing a telemetry bug that was hiding most deaths) showed new-player permadeaths clustering at levels 1-3 and Barbarian as the deadliest class, so early floors now ramp instead of cliff and Barbarian gets a small innate heal-on-kill before its level-36 Bloodlust unlocks. No global nerf, no blanket dungeon change. Two smaller items from the same notes were already fixed in the working tree (the "look to redraw" prompt was dropped in v0.64.2; the two-handed Power Strike ability is the fix above) and the bed-upgrade label now names "fertility".

Power Attack now triggers weapon enchantments (life steal, elemental procs) like a normal swing

A player implied there was an unfixed Power Strike problem. An audit (with a combat-reviewer pass) confirmed one: the tactical [P] Power Attack was silently dropping every weapon enchantment. A normal attack runs your on-hit effects (life steal / Lifedrinker, fire/frost/lightning/poison/holy/shadow procs, the Sunforged holy bonus vs undead and demons, poison coating, and the Mystic Shaman weapon-enchant rider). Power Attack ran none of them, on either the main hit or the dual-wield off-hand follow-up. So spending 15 stamina on Power Attack actually gave up all of that proc damage and healing that a free basic swing would have triggered, which is exactly why it could feel weaker than it should. (The "Power Strike" class ability on the quickbar was unaffected; it already procced enchants. This was specifically the [P] tactical action.)

The cause was a fix that had only ever landed on the basic-attack path (and an unused legacy code path), never on the live Power Attack. Fix: the entire on-hit effect pipeline is now a single shared routine that the basic attack and the Power Attack (both hits) call, so the two can never drift apart again. As part of the same fix, the Power Attack now also correctly skips its on-hit procs when a swing is evaded (passes harmlessly through an Incorporeal/Phase-type enemy), matching the basic attack. Build clean, full test suite (845 tests) passing, combat-reviewer verified.

This also explains an older report of a "Power Strike bug with two-handed weapons." A two-handed wielder never makes a dual-wield off-hand swing, so their whole Power Attack is the single main-hand hit, and that hit was the one dropping every enchant. Two-handed weapons also tend to carry the biggest single enchantments (a life-steal greatsword, an elemental maul), so the lost procs were most glaring there. With this fix, a two-handed Power Attack procs its enchantments just like a normal swing. (Separately confirmed working and unchanged: the two-handed damage bonus still applies to Power Attack, and a two-handed weapon never triggers a phantom off-hand strike.)

Power Strike (the class ability) no longer does less damage than a basic attack with a two-handed weapon

The original report: while wielding a two-handed weapon, the Power Strike ability dealt less damage than a normal auto-attack, even with training points specced into it, to the point that the player pulled their points back out of Power Strike and into auto-attack. (This is the trainable class ability, distinct from the tactical [P] Power Attack covered above.)

Cause: two-handed weapons get a flat damage bonus per swing to compensate for having no off-hand or shield. A normal attack applied that bonus, but the class ability's damage was computed without it, and the ability also draws a smaller share of raw weapon power than a normal swing. For a two-handed build that combination meant a free swing could out-damage the ability, which is backwards: an ability that costs stamina and a cooldown should be worth using. Fix: physical weapon-strike abilities now get the same two-handed bonus a normal attack does, so Power Strike (and other physical melee/ranged abilities) reliably beats a basic swing for two-handed builds, at every level. Magical abilities (holy smite, lightning bolt, and the like) are excluded because they scale off the caster's stats, not weapon power. The two-handed bonus value is now a single shared constant used by both the basic attack and the ability path. Applied consistently to single-target, multi-monster, and player-versus-player combat. A combat-reviewer pass confirmed the magnitude is proportionate (it matches what the basic attack already receives) and does not reintroduce the endgame one-shot risk an earlier balance pass addressed.

Unequipping reforged gear no longer resets its quality (and the reforge gold/power exploit it enabled)

A player reported (issue #112) that unequipping a reforged piece of gear reset its quality all the way back down to normal while keeping its stats, and that this enabled two exploits: repeatedly reforging a weapon, unequipping it, and reforging again would compound its weapon power past a billion, and the gear's gold value grew exponentially along with it, letting a low-level character make billions of gold cheaply. A follow-up noted a related problem: unequipping certain items also dropped stats outright (a shield lost its Constitution and block; another item lost its agility).

Both problems shared one root cause. The equipped form of an item (which tracks its quality/rarity and its full stat list) was being converted to a plain backpack item when unequipped, and that conversion was lossy. Rarity had nowhere to live on a backpack item, so re-equipping rebuilt the item as the lowest quality. Reforging gives a chance to upgrade rarity, and each upgrade grants a flat boost to all stats including weapon power, but only while the item is below the top rarity. Because unequipping reset the rarity, the player could re-collect that upgrade boost on every reforge-unequip-reforge cycle, compounding power and value without limit. Separately, two of the unequip paths used a hand-written conversion that only copied a subset of stats, so agility, charisma, stamina, block chance, the minimum-level requirement, and the entire list of bonus effects (constitution, intelligence, every enchantment and proc) were dropped on unequip.

Fix: items now carry their rarity, so it survives the unequip and re-equip round trip (and saving, loading, the home chest, trades, and being handed to a companion). With rarity preserved, a maxed-out item correctly stops qualifying for the reforge upgrade boost, so power and value no longer compound, which closes both exploit paths. The lossy unequip conversions were replaced with the complete one, so unequipping no longer drops any stat. The item-quality display also now honors the real stored rarity instead of guessing from the item's name and power, so reforged quality reads correctly in the backpack. Note: an item whose value was already inflated by this exploit in an earlier save is not retroactively reduced; the fix stops any further inflation. A save-state-review confirmed the rarity field round-trips on every save path (single-player and online, player inventory, home chest, and companion/NPC bags) and that older saves load safely (an item with no stored rarity loads as normal quality, and its displayed quality still falls back to the name/power heuristic). Two new round-trip tests lock the contract; full suite (847 tests) passing.

Audit follow-up: shields keep their block value on re-equip, and reforged quality survives every equip path

A comprehensive audit of the issue #112 fix surfaced a related defect the original fix exposed. A shield stores its block value in a dedicated field (separate from regular armor), but several "put an item back on" code paths were reading the wrong field to restore it -- they read the regular-armor value, which is zero for a properly-formed shield. The old unequip code happened to mask this by stuffing the block value into the regular-armor field; routing unequip through the complete converter (the issue #112 fix) made the mismatch visible, so a shield could come back with no block value after being taken off and put back on. The same family of code paths also reset an item's quality to normal when re-equipping it from certain screens (the player's inventory, the home equip screen, the magic shop, and a shared equip helper), which was both a cosmetic quality reset and a second way to re-arm the reforge exploit (equip a reforged weapon through one of those screens and its quality dropped, re-enabling the upgrade boost).

Fix: every place that puts an item back on now reads the shield's block value from the correct field (and also recovers older saves that stored it the legacy way), and every such path now preserves the item's quality instead of resetting it to normal. The companion equipment save/load was also routed through the same single converter so companion-held gear keeps its quality and full stats too.

Root-cause cleanup (done, not deferred): the item-to-equipment reconstruction logic was duplicated across many places, which is why fields kept going missing from one copy at a time (enchantments in a prior release, then block value, quality, block-chance, and stamina here). All of those copies were consolidated onto a single shared converter, so the next field added to an item is carried everywhere automatically. While doing this, the audit also found that two of the dungeon-loot equip paths had separately drifted to drop the two world-boss item perks (the bonus-damage-vs-bosses and the defensive perk) when equipping such an item straight from the drop screen; routing them through the shared converter restores those too. Build clean; 849/849 tests pass (two new tests lock the shared converter's behavior).

Party XP no longer gets stranded on a dead teammate's slot

A player set a custom party XP split, a teammate died, and 33% of every kill's XP kept getting allocated to the now-empty slot, quietly lost, with the Party Management screen even showing "[R] Auto-redistribute on death: On." The redistribution code was genuinely broken: it had three overlapping paths with slightly different slot-to-teammate mappings, one of which reclaimed XP from the wrong end (it kept the dead teammate's slot and zeroed a living teammate's slot), and none of them actually consulted the auto-redistribute toggle.

Fix: one shared, correct slot-mapping that exactly matches how XP is actually paid out, plus a single reclaim routine that honors the toggle. With auto-redistribute ON, a dead/departed teammate's share is split evenly among the player and surviving teammates; with it OFF, the player banks the whole share. Either way nothing strands on an empty slot and no XP is silently lost. The Party Management screen now also self-heals an orphaned slot the moment you open it, so you see the corrected split immediately instead of after the next fight. combat-reviewer verified (no double-count, slot-walk parity with the payout path, totals always sum to 100, single-player and online co-op both correct).

Inn arm-wrestling daily limit now resets when you sleep (single-player)

A player hit the 3/3 daily arm-wrestling cap, slept to the next day, and it still showed 3/3 until they fully restarted the game. Every other inn activity (drinking, duels, meals) tracks its daily count on the persisted character and gets cleared by the daily reset; arm wrestling alone used a separate transient counter on the inn screen object that the daily reset never touched (so it only cleared when the screen was recreated on reload). Arm wrestling now uses the same persisted, daily-reset counter as everything else, so sleeping to morning refreshes it.

Merc contracts are readable, and the quest list scrolls

Two related quality-of-life fixes. (1) A player picked up a Sellsword Hall contract, saw "1/4," and couldn't find where to read what it actually wanted: it wasn't in the inventory and there was no /contracts command. Merc contracts have always lived in the quest list (with their objective and progress), so /contracts (and /contract) are now aliases for the quest list. (2) The quest list truncated at 8 with an "...and N more quests" line you couldn't scroll past (the only key wiped and redrew the screen). It now paginates with [N]ext / [P]rev / [B]ack so every quest and contract is viewable, and merc contracts are tagged so they stand out.

Combat round counter and active-buff line

A player (on a Bard) noted combat showed no information about active buffs or debuffs and no round counter. Debuffs and DoTs were already shown; the gap was the timed buffs that only folded silently into your attack/defense numbers, like a Bard's Inspiring Tune, music-shop songs, Well-Rested, food buffs, Bloodlust, and status immunity. Combat now shows a round number and, when any are active, a compact buff line listing those buffs and how many rounds/combats remain. Added to the standard, compact/BBS, and screen-reader combat displays (and the graphical client's per-round emit now carries the round number).

Early-game survivability pass (Barbarian + onboarding)

Driven by a full-month read of the live death data (see the telemetry-fix note below for why we couldn't see this before). Two real, targeted signals, not a global difficulty problem: new characters were burning all three resurrections at levels 1-3, and Barbarian had the most deaths of any class (avg ~level 13). The cause of the Barbarian deaths: its only self-heal (Bloodlust, heal-on-kill) doesn't unlock until level 36, so for the entire window where it actually dies the class has zero sustain and leans entirely on a companion healer ("losing Aldric was basically game over"). Two surgical fixes, no global nerf and no blanket easier-dungeons:

  • Early floors ramp instead of cliff. Floor 1 was already softened to 50% monster stats, but floor 2 snapped straight back to full strength, a wall for a fresh character. Floors 1-3 now ramp at 50% / 65% / 80%. It keys on the absolute floor, so a high-level player replaying low floors gains nothing (those fights were already trivial), and it's invisible to anyone who blows through the early floors.
  • Barbarian innate heal-on-kill before level 36. A small heal on each kill (4 + level, capped at 25 HP) that fades out exactly when the real Bloodlust ability comes online, so it never stacks. It only triggers on an actual kill (it can't save a losing fight), is clamped to missing HP, and applies to the player only. Gives the class its own sustain identity early without touching any damage/defense formula.

Deliberately not changed: no global class nerf (wrong direction, makes deaths worse), no blanket dungeon nerf (over-corrects for the ~79% who never die), and the Bard "too strong" outlier is a separate concern. combat-reviewer verified (correct kill-site placement, no stacking with Bloodlust, clean level handoff at 36, overheal-clamped, no formula change, attacker-gated so teammate kills don't heal the player).

Combat telemetry no longer hides deaths

While investigating the above, the live combat_events table reported only 3 deaths when character saves recorded 63. Cause: the table was pruned to 7 days AND capped at 1000 rows with the cap applied to all outcomes, so the flood of victories (deaths are ~0.3% of combats) evicted the rare death rows almost immediately. The prune now keeps deaths on a long 90-day window and exempts them from the row cap entirely (the cap applies only to victory/fled), and overall retention was raised to 14 days / 5000 non-death rows. Deaths are rare and tiny in volume, so keeping them all is cheap, and balance decisions can finally be made on real numbers instead of a table that lied.

Black Market: inspect rotating gear before buying

A player liked the Black Market's rotating gear but had no way to see what an item actually did before spending the gold. You can now inspect any gear slot from the market with [X#] (e.g. X4): it shows the item's combat stats, attribute bonuses, and its enchantments/procs (the "what does it do" part), its level requirement, and the price. The market now also stays open after an inspect or a purchase so you can browse and buy several items in one visit instead of being dropped back to the alley after each action.

Resting heals your companions and team, not just you

A player asked how to heal companions in town and couldn't find a way: a night at the Inn (and resting at Home) topped up the player but left companions and team NPCs wounded, so the only fix was to walk into the dungeon and hand-feed them potions. Resting now heals the whole party (active companions plus NPC teammates on your team or in your dungeon party) to full HP and mana, with a line confirming it. Potions were already refilled on rest; this adds the HP/mana restore alongside it.

Dungeon features are rarer and worth more

A player noted that examining the interactable features ([X]) on nearly every room had turned into autopilot busywork ("X, 1, X, 1...") and suggested cutting their frequency and roughly doubling the payout so the ones you find feel rewarding. Done: most rooms now have nothing to examine, a minority have one feature, and only occasionally two (about a two-thirds cut from the old 1-to-3 per room). To compensate, each feature's gold/xp/heal reward is doubled. The bump applies to the gold/xp/heal payouts only; permanent stat grants, potions, and alignment shifts are unchanged so the change can't be farmed. Net effect: far less filler between fights, and a feature worth stopping for when one shows up.

Home bed upgrade now says what it does

A player noted the bed upgrade row in the home renovation menu just read "[No penalty]" without explaining what the penalty was. The bed governs childbirth/fertility chance, but the label never said so. The labels now read "Normal fertility" / "No fertility penalty" / "+X% fertility" so you can tell what the upgrade actually buys before you pay. Text-only change, all five languages.

Files Changed

  • Scripts/Core/GameConfig.cs -- Version 0.65.3
  • Scripts/Systems/CombatEngine.cs -- extracted the basic-attack post-hit on-hit-effect block (ApplyPostHitEnchantments + the Mystic Shaman weapon-enchant rider + Stormstrike mana + Frostbrand slow + Ancestral Guidance) into a shared ApplyPlayerSwingOnHitEffects helper, and wired the live [P] Power Attack (ExecutePowerAttackMultiMonster) main hit and dual-wield off-hand follow-up to call it, gated on the swing landing (so an evaded Incorporeal/Phase swing procs nothing); the basic attack now calls the same helper, so the two paths can no longer drift apart. The power_strike class ability and the dead single-monster ExecutePowerAttack were already correct and were not touched
  • Scripts/Core/Items.cs -- added a Rarity field to the Item class so rarity survives the equip<->unequip round trip (issue #112)
  • Scripts/Core/Character.cs -- ConvertEquipmentToItem now carries Rarity onto the produced backpack item
  • Scripts/Systems/InventorySystem.cs -- both Item->Equipment re-equip builders now read the item's stored Rarity (instead of hardcoding Common) and set the previously-missing StaminaBonus/BlockChance; HandleUnequipItem and UnequipAll now use the complete ConvertEquipmentToLegacyItem converter instead of a hand-rolled subset that dropped Agility/Charisma/Stamina/BlockChance/MinLevel and the entire LootEffects list (issue #112)
  • Scripts/Systems/LootGenerator.cs -- GetItemRarity now returns the higher of the stored rarity and the name/power heuristic, so a reforged item's quality reads correctly in the backpack while loot without a stored rarity still falls back to the heuristic
  • Scripts/Systems/SaveDataStructures.cs -- InventoryItemData gains a Rarity field; FromItem/ToItem carry it (this is the single full-fidelity converter the save/chest/trade/NPC-bag paths now all share)
  • Scripts/Systems/SaveSystem.cs -- player-inventory, home-chest, and NPC-bag save maps consolidated onto InventoryItemData.FromItem (carries Rarity + every stat)
  • Scripts/Core/GameEngine.cs -- player-inventory, home-chest, and NPC-bag load maps consolidated onto InventoryItemData.ToItem
  • Scripts/Systems/OnlineStateManager.cs / Scripts/Systems/WorldSimService.cs -- online world_state NPC-bag save/restore consolidated onto FromItem/ToItem, closing the "stash a reforged item in an NPC bag, relog, take it back as normal quality to re-arm the reforge boost" laundering vector
  • Tests/SaveRoundTripTests.cs -- new Item_RoundTrip_PreservesRarityAndStats and Item_RoundTrip_DefaultsRarityToCommonForLegacySaves (847 tests pass)
  • Scripts/Systems/InventorySystem.cs -- (audit follow-up) both re-equip builders now restore a shield's block value from item.ShieldBonus via Math.Max(item.ShieldBonus, item.Armor) instead of reading item.Armor (which is 0 for a correctly-formed shield), fixing the shield-block loss the #112 unequip change exposed
  • Scripts/Locations/HomeLocation.cs -- (audit follow-up) Home equip builder: same shield-block fix, plus now carries BlockChance and the item's Rarity (was hardcoded Common -- a rarity-laundering vector)
  • Scripts/Locations/MagicShopLocation.cs -- (audit follow-up) enchant/decurse equip builder: same shield-block fix + carries Rarity (was Common)
  • Scripts/Locations/BaseLocation.cs -- (audit follow-up) shared equip builder: shield-block Math.Max legacy recovery + carries Rarity (was Common)
  • Scripts/Systems/CompanionSystem.cs -- (audit follow-up) companion-bag ItemToData/DataToItem now delegate to the canonical InventoryItemData.FromItem/ToItem, so companion gear round-trips Rarity + all stats and the duplicated maps can't drift
  • Scripts/Core/Character.cs -- (consolidation) new shared BuildEquipmentFromItem helper (inverse of ConvertEquipmentToItem) + public ApplyItemLootEffectsToEquipment; single source of truth for every Item->Equipment reconstruction and for the LootEffects transfer
  • Scripts/Systems/InventorySystem.cs / Scripts/Locations/HomeLocation.cs / Scripts/Locations/MagicShopLocation.cs / Scripts/Locations/BaseLocation.cs -- (consolidation) the five re-equip builders now call Character.BuildEquipmentFromItem instead of each maintaining its own field map + LootEffects switch
  • Scripts/Systems/CombatEngine.cs -- (consolidation) the three dungeon-loot equip paths now call Character.ApplyItemLootEffectsToEquipment; two of them had dropped the BossSlayer / TitanResolve world-boss flags and now carry them
  • Tests/SaveRoundTripTests.cs -- two more tests: BuildEquipmentFromItem_PreservesShieldBlockRarityAndEffects and BuildEquipmentFromItem_RecoversLegacyShieldBlockFromArmor (849 tests pass)
  • Scripts/Core/GameConfig.cs -- new shared TwoHandedDamageBonus constant (the two-handed +45% bonus, previously hardcoded in the basic-attack path)
  • Scripts/Systems/CombatEngine.cs -- (Power Strike ability 2H fix) physical (non-magical) weapon-strike abilities now apply TwoHandedDamageBonus when the actor wields a two-handed weapon, in the multi-monster, single-monster, and PvP ability-damage paths; GetWeaponConfigDamageModifier now reads the shared constant instead of a hardcoded value (combat-reviewer verified SHIP)
  • Localization/{en,es,fr,it,hu}.json -- (bed label) home.bonus_bed_none and home.bonus_bed_no_penalty reworded to name "fertility" so the home bed upgrade row says what it does before purchase
  • Scripts/Systems/CombatEngine.cs -- (XP redistribute) replaced the buggy RedistributeDeadTeammateXP (reclaimed from the wrong end) with shared BuildSlotLiveMap + ReclaimOrphanedXP honoring AutoRedistributeXP; AutoDistributeTeamXP rewritten to use them; new public ReclaimOrphanedTeamXP entry point; (combat HUD) DisplayCombatStatus/DisplayCombatStatusBBS/DisplayCombatStatusScreenReader gained a round param + round line; new read-only BuildPlayerBuffSummary renders a timed-buff line in all three modes; electron combat_status emit now carries the round (combat-reviewer verified SHIP)
  • Scripts/Locations/DungeonLocation.cs -- (XP redistribute) Party Management screen calls CombatEngine.ReclaimOrphanedTeamXP on open so an orphaned slot self-heals immediately
  • Scripts/Locations/InnLocation.cs -- (daily reset) arm wrestling now uses the persisted, daily-reset Character.ArmWrestlesToday in single-player too (removed the transient _armWrestlesToday field the daily reset never cleared), so sleeping refreshes the 3/day cap
  • Scripts/Locations/BaseLocation.cs -- (quest readability) /contracts + /contract aliases for the quest list; ShowActiveQuests rewritten with [N]/[P]/[B] pagination (was an 8-item truncation with no scroll) and a [Contract] tag on merc contracts
  • Localization/{en,es,fr,it,hu}.json -- (quest readability) base.quest_contract_tag, base.quest_pager_nav; (combat HUD) combat.round_label, combat.buffs_label, combat.buff_song, combat.buff_meal, combat.buff_rested, combat.buff_bloodlust, combat.buff_immune, combat.buff_immune_perm, combat.buff_dodge
  • Tests/CharacterTests.cs -- two new tests (ReclaimOrphanedTeamXP_RedistributeOn_SplitsDeadShareAndStrandsNothing, ReclaimOrphanedTeamXP_RedistributeOff_BanksOnPlayer); 851 tests pass
  • Scripts/Systems/DungeonGenerator.cs -- (feature density) GenerateRoomFeatures per-room feature count changed from random.Next(1,4) (1-3, avg 2) to a 50%-none / 37%-one / 13%-two distribution (avg ~0.6, ~2/3 cut)
  • Scripts/Systems/DiscoverySystem.cs -- (feature reward) Discovery Gold/Xp payouts multiplied by GameConfig.DungeonFeatureRewardMultiplier
  • Scripts/Systems/FeatureInteractionSystem.cs -- (feature reward) legacy filler-feature CalculateScaledReward (gold/xp/heal) multiplied by GameConfig.DungeonFeatureRewardMultiplier
  • Scripts/Core/GameConfig.cs -- new DungeonFeatureRewardMultiplier = 2.0 constant
  • Scripts/Systems/CompanionSystem.cs -- (party healing) new RestoreAllPartyHP(player) restores active companions + NPC teammates (team / dungeon party) to full HP/mana on rest
  • Scripts/Locations/InnLocation.cs -- (party healing) Inn sleep calls RestoreAllPartyHP + confirmation line
  • Scripts/Locations/HomeLocation.cs -- (party healing) Home rest calls RestoreAllPartyHP + confirmation line
  • Localization/{en,es,fr,it,hu}.json -- new companion.party_rested
  • Scripts/Locations/DarkAlleyLocation.cs -- (Black Market) VisitBlackMarket wrapped in a loop (stays open after inspect/purchase); new [X#]/[I#] inspect path + ShowBlackMarketItemDetail (stats, attribute bonuses, LootEffects enchants, level req, price)
  • Localization/{en,es,fr,it,hu}.json -- new ui.stat_type, dark_alley.bm_inspect_hint, dark_alley.bm_inspect_header, dark_alley.bm_inspect_enchants, dark_alley.bm_inspect_price
  • Scripts/Systems/MonsterGenerator.cs -- (early-floor ramp) floor-1-only 0.5x stat block generalized to floors 1-3 (0.5 / 0.65 / 0.8), keyed on dungeon floor, Math.Max stat floors preserved
  • Scripts/Systems/CombatEngine.cs -- (Barbarian sustain) innate heal-on-kill else if after the existing Bloodlust block at both PvE kill sites (ApplyAoEDamage + ApplySingleMonsterDamage), gated to Barbarian below L36, attacker == player, capped + overheal-clamped
  • Scripts/Core/GameConfig.cs -- new Floor2MonsterStatMultiplier/Floor3MonsterStatMultiplier/EarlyFloorSofteningMaxFloor and BarbarianInnateBloodlust* constants
  • Localization/{en,es,fr,it,hu}.json -- new combat.barbarian_innate_bloodlust
  • Scripts/Systems/SqlSaveBackend.cs -- (telemetry fix) PruneCombatEvents rewritten: row cap applies to non-death outcomes only (deaths never evicted), deaths kept 90 days, non-deaths 14 days / 5000 rows
  • Scripts/Systems/WorldSimService.cs -- (telemetry fix) prune call updated to daysToKeep: 14, maxRows: 5000, deathDaysToKeep: 90

Don't miss a new usurper-reborn release

NewReleases is sending notifications on new releases.