How Stolen Realm works under the hood — damage, stats, loot, enemy scaling, events. Every value verified against the game’s runtime data.
How Stolen Realm actually works under the hood — every value verified against the game's runtime data (Steam build 20244830), not guides or tooltips. Where the community wiki or our own earlier notes disagreed with the game, the game won; see About This Data at the bottom.
Each point in an attribute gives (runtime values from GS 1.asset):
| Stat | Effect | Formula | Constant |
|---|---|---|---|
| Might | Ability Power | +1% per point | AbilityPwrPerMight = 1 |
| Might | Armor / Magic Armor | +1% per point | ArmorPercPerMight = 1 |
| Might | Summon Damage | +1% per point | AbilityPwrPerMightSummon = 1 |
| Dexterity | Crit Damage | BaseCritDamage + (Dex − 8) × 1.5 | CritDamagePerDex = 1.5 |
| Dexterity | Crit Rating | +1 per point | CritRatingPerDex = 1 |
| Dexterity | Movement Points | min(3, floor(Dex / 25)) bonus MP | interval 25 |
| Vitality | Max Health | (Vit − 8) × 5 flat + (Vit − 8) × 1% | 5 / 1% |
| Intelligence | Max Mana | (Int − 8) × 5 flat + (Int − 8) × 1% | 5 / 1% |
| Intelligence | Summon Health | +1% per point | SummonLifePerInt = 1 |
| Intelligence | Range | min(3, floor(Int / 25)) bonus range | interval 25 |
| Reflex | Dodge Rating | +1 per point | DodgeRatingPerReflex = 1 (summons 0.5) |
| Reflex | Dodge Counter Chance | (Ref − 8) × 1% | 1 |
| Reflex | Opportunity Attack Damage | (Ref − 8) × 1% bonus | 1 |
| Reflex | Extra Counter Attacks | 1 + min(5, floor(Ref / 25)) | interval 25 |
| Recovery | Health Regen | Recovery × 0.5% Max Health per turn | 0.5 |
| Recovery | Mana Regen | Recovery × 0.5% Max Mana per turn | 0.5 |
Monk passives (Strength/Speed ×1.33) modify the attribute values themselves, not these per-point constants. The (stat − 8) offset applies to players only — AI gets 0.
BaseCritChance = 2%, BaseCritDamage = 50%, BaseDexterity = 5, BaseReflex = 5, BaseRecovery = 0, NumStatsPerNewLevel = 5 attribute points per level-up.
BaseHealth = ceil(100 + (Level−1) × 15) // 100 base, +15% of base per level
BaseMana = ceil(100 + (Level−1) × 15)
MaxHealth = (BaseHealth + 5×(Vit−8) + items) × (1 + (Vit−8)×0.01)
MaxMana = (BaseMana + 5×(Int−8) + items) × (1 + (Int−8)×0.01)
Level 1 at 8 Vit = 100 HP; level 30 at 8 Vit = 535 HP before gear.
CritChance = 2% + curve(floor(CritRating)), linear between curve points:
| Crit Rating | 0 | 1 | 50 | 300 | 900 |
|---|---|---|---|---|---|
| Bonus crit % | 0 | 4 | 30 | 100 | 300 |
Examples: rating 1 (9 Dex) → 6% | rating 52 → ≈33% | rating 300 → guaranteed crits. Stealth grants 100% crit chance on the next attack.
DodgeChance = curve(floor(DodgeRating)), linear between points, hard-capped at 75%:
| Dodge Rating | 0 | 1 | 100 | 300 |
|---|---|---|---|---|
| Dodge % | 0 | 4 | 60 | 92 (capped at 75) |
A dodged attack deals no damage and applies no effects. Dodge Counter Chance rolls a counter-attack after a successful dodge.
Recovery × 0.5% of Max Health and Max ManapercentHealthRegenAfterBattle = 5)XP(level) = 1000 × 1.2^(level−2) cumulative — ExperienceBasePerLevel = 1000, exponent 1.2, MaxLevel = 30:
| Lv | XP Needed | XP Total | Lv | XP Needed | XP Total |
|---|---|---|---|---|---|
| 2 | 1,000 | 1,000 | 17 | 15,408 | 87,450 |
| 3 | 1,200 | 2,200 | 18 | 18,489 | 105,939 |
| 4 | 1,440 | 3,640 | 19 | 22,187 | 128,126 |
| 5 | 1,729 | 5,369 | 20 | 26,624 | 154,750 |
| 6 | 2,074 | 7,443 | 21 | 31,949 | 186,699 |
| 7 | 2,489 | 9,932 | 22 | 38,338 | 225,037 |
| 8 | 2,986 | 12,918 | 23 | 46,006 | 271,043 |
| 9 | 3,584 | 16,502 | 24 | 55,207 | 326,250 |
| 10 | 4,300 | 20,802 | 25 | 66,248 | 392,498 |
| 11 | 5,160 | 25,962 | 26 | 79,497 | 471,995 |
| 12 | 6,192 | 32,154 | 27 | 95,397 | 567,392 |
| 13 | 7,431 | 39,585 | 28 | 114,476 | 681,868 |
| 14 | 8,917 | 48,502 | 29 | 137,371 | 819,239 |
| 15 | 10,700 | 59,202 | 30 | 164,845 | 984,084 |
| 16 | 12,840 | 72,042 |
Damage = (BaseDamage + FlatDamage) × ElementalMods × Multiplier1 × Multiplier2
× Multiplier3 × Multiplier4 × DamageModifier × CritMultiplier
Order verified in code — flat damage is added before any multipliers:
Source.SpellPower("Fire") × 1.1); see each skill's expressions on the Skills pagesDamageFlat{Type} bonuses, added per element first(1 + DamageMod{Type}/100)DamageMod + DamageModBasic (basic/opportunity/counter attacks only) + ManaPowerMod (mana-costing skills) + Opportunity/Counter attack mods + Ambush (target has no allies within 3 hexes) + Call of the Grave (+20% vs targets below 50% HP) + Marked Prey (+20% per stack) + per-hex range bonusesRandom(0–100) < CritChance + target.CritChanceTargetCritMultiplier = 1 + (CritDamage + CritDamage{Type} + CritDamageTree{Tree} + target.CritDamageTarget + AdditionalCritDamage) / 100CritDamage = 50 + (Dex − 8) × 1.5; AI crits are a flat 50%Applied in order: General Reduction → Resistances → Armor.
General reduction (one additive group): × (1 − (DamageReduction + Resilience + TakeCover) / 100) — Take Cover adds 35 when the attacker is more than 2 hexes away.
Resistances: × (1 − Resist{Type}/100) for Fire/Cold/Lightning/Physical; Shadow and Holy both use ResistDivine. Resist cap is 75% base, raisable by effects to a hard 95% (MaxResist attribute).
Armor (last):
Physical: max(damage × 0.10, damage − Armor / 10)
Magic: max(damage × 0.10, damage − MagicArmor / 10)
10 armor absorbs 1 damage; armor can block at most 90% of a hit (maxArmorReductionPercent = 90). Shadow damage ignores Armor and Magic Armor entirely.
How it works under the hood: the shapeshift skill applies a status whose ModelChangeCharacter points to a hidden player-form character, and that form's own skill list replaces your skill bar while active. All forms are dispellable, and every shapeshifter gets a free Dismiss Shapeshift skill. Nine forms exist:
| Form | Source | Lasts | Skill bar while shifted | Extras |
|---|---|---|---|---|
| Werewolf | Nature tier 3 | 3 turns | Melee Attack (hits 2×, Bleeding per hit) · Blood Howl · Cursed Bite | +10% Max Health |
| Dire Werewolf | Nature tier 5 (replaces Werewolf) | 3 turns | Melee Attack (hits 3×, Bleeding per hit) · Dire Howl · Dire Bite | +20% Max Health |
| Red Dragonkin | Nature tier 5 — Shapeshift Dragonkin grants all three; pick one per cast | 3 turns | Flame Slash · Fire Breath (cone) · Sun Fire (AoE + Heat) | Armor + fire resistance; basic attack deals Fire |
| Blue Dragonkin | (same skill) | 3 turns | Ice Slash · Frost Breath (cold DoT) · Frozen Orb (AoE + 5 Chill) | Armor + cold resistance; basic attack deals Cold |
| Green Dragonkin | (same skill) | 3 turns | Thunder Slash · Lightning Breath (cone) · Thunder Blast (AoE) | Armor + lightning resistance; basic attack deals Lightning |
| Black Dragonkin | Dragonkin Black fortune (Taste for Blood — Samara path) | 3 turns | Shadow Claw · Shadow Breath (cone) · Abyssal Night (shadow AoE) | Armor + Damage Reduction; basic attack deals Shadow |
| White Dragonkin | Dragonkin White fortune | 3 turns | Holy Slash (damages enemies, heals allies) · Breath of Life (cone, damage + heal) · Celestial Light (holy AoE + Blind) | Armor + Damage Reduction |
| Vampire Bat | Vampirism fortune | 1 turn | Mana Steal | +4 free movement points; immune to attacks of opportunity |
| Box | Jack in the Box encounter (enemy-applied!) | 1 turn | none | Rooted + Silenced + takes double damage — a polymorph debuff wearing the shapeshift system as a costume |
Notes from the data:
AttackPower × 0.8 physical to everything within 2 hexes and debuffs targets so all attackers lifesteal 4% against them for 2 turns; Cursed Bite deals weapon damage and cuts healing received by 50% for 2 turns. Dire versions hit harder.basicAttackDamageType field ships copy-paste values for Green/Black, another small dev-data error).1. ItemBaseDmg = ceil(BaseDmgPerType × DamageRatio × (1 + (level−1)×0.23) × (1 + rarity×0.10))
2. WeaponDamage = ItemBaseDmg × (1 + WeaponDamageMod/100) + AdditionalWeaponDamage
3. WeaponDamageAll = ceil(sum of all equipped weapons)
4. AttackPower = WeaponDamageAll × (1 + AbilityPower/100) // AbilityPower = Might × 1%
5. Tooltip range = WeaponDamage ± 15% (min ×0.85, max ×1.15, floored)
SpellPower = AttackPower — Might scales spells and attacks identically.
Example — level 80 Medusa Staff (Legendary, ratio 1.3), 300 Might: ItemBaseDmg = ceil(12 × 1.3 × (1 + 79×0.23) × 1.4) = 419 → AttackPower = 419 × (1 + 300/100) = 1676
WeaponDamageBaseByType)| Type | Base | Type | Base |
|---|---|---|---|
| 1H Sword / 1H Axe / 1H Mace | 8 | Bow / 2H Gun | 14 |
| 2H Sword / 2H Axe / 2H Mace / Polearm | 16 | Staff | 12 |
| 1H Gun | 7 | Wand / Fist Weapon | 6 |
ItemStatsPerLevel = 0.23, ItemStatsPerRarity = 0.10, ItemArmorPerLevel = 0.23, DamageRangePercent = 0.15. Rarity indexes: Common 0 → Legendary 4.
Rare+ items can roll a Tier modifier (MinimumTierRarity = 2):
| Tier | Color | Effect (non-weapon) | Unlock | World drop % | Shop % | Cost |
|---|---|---|---|---|---|---|
| I | Green | all stats +50%, +2 attribute pts | lv 30 | 10 at 30 → 100 at 60+ | 2 at 30, 10 at 50, 25 at 70+ | ×2 |
| II | Cyan | all stats +100%, +3 attribute pts | lv 60 | 10 at 60 → 100 at 80+ | 2 at 60, 10 at 80+ | ×4 |
| III | Red | all stats +150%, +4 attribute pts | lv 80 | 10 at 80 → 100 at 100 | 2 at 80+ | ×8 |
Weapons get the stat boost only (no attribute points). Drop chances interpolate linearly between listed levels. Battle modifiers: 1–6 active, unlock at 30, 5000g reset.
For each player, every dead enemy rolls loot (highest point value first: Boss 7 > Champion 5 > Elite 3 > Soldier 2 > Fodder 1):
Drop chance modifier: Difficulty.LootMod × (1 + quest modifiers/100) × character loot modifier, plus each enemy mod's loot bonus. Items are created at min(30, game level). In endgame mode, bosses roll their personal loot twice. Each player receives an independent distribution.
Epic never drops from world loot — for any enemy type. Epics come from personal and group tables, shops, gambling, and crafting only.
| Enemy type | World loot can be |
|---|---|
| Fodder, Soldier | Common, Uncommon |
| Elite | + Rare |
| Champion | + Legendary (Epic skipped) |
| Boss | + Mythic (unused — no Mythic items exist) |
500g × level (15,000g at level 30)min(30, random(player level −1 … +2))IslandLevel × 100ItemGoldRatioBase = 4 × type multipliers; two-handers ×2EnemyTypeStatSets)| Type | Base HP | Weapon Dmg | Spell Power | Mana | Point Value |
|---|---|---|---|---|---|
| Fodder | 13 | 7.2 | 7.2 | 20 | 1 |
| Soldier | 18 | 7.2 | 7.2 | 18 | 2 |
| Elite | 36 | 8.1 | 8.1 | 36 | 3 |
| Champion | 54 | 9 | 9 | 54 | 5 |
| Boss | 97 | 10.25 | 10.25 | 87 | 7 |
Each enemy multiplies these by its own stat ratios (see the Enemies page — e.g. Medusa: HP ×2.5 → 242.5 base).
HP = baseHealth × healthRatio × levelCurve(level) × partyMult(players) × difficulty × bossMult
Level curve (linear between points; roguelike uses its own curve):
| Lv | 1 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | 0.7 | 1.8 | 3.8 | 8 | 18 | 30 | 60 | 90 | 132 | 186 | 264 |
Past 30: 264 × 1.05^(level−30) + 24×(level−30).
Damage = baseDmg × dmgCurve(level) × partyMult(players) × skillRatio × difficulty × bossMult
| Lv | 1 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | 0.6 | 1.2 | 2 | 4.2 | 7.2 | 9.36 | 13.2 | 16.8 | 22.8 | 28.8 | 34 |
Past 30: 34 × 1.025^(level−30) + 2×(level−30).
| Players | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Enemy HP × | 0.8 | 1.65 | 2.4 | 3.15 | 3.9 | 4.75 |
| Enemy Dmg × | 0.7 | 1.0 | 1.4 | 1.8 | 2.0 | 2.0 |
(Roguelike HP: 0.8 / 1.55 / 2.3 / 3.0 / 3.75 / 4.5; damage identical.) Player summons use their own curves: HP ×1.5→6.5, damage ×1→25 over levels 1–30.
A global −25% baseline is added to every difficulty's HP/Dmg percent (HealthMod = 1 + (perc − 25)/100), giving effective enemy multipliers:
| Difficulty | Effective HP× | Effective Dmg× | Gold | Loot | Boss HP |
|---|---|---|---|---|---|
| Casual | ×0.25 | ×0.25 | — | — | — |
| Adventurer | ×0.75 | ×0.75 | — | — | −20% |
| Classic | ×1.00 | ×1.00 | +25% | +25% | −15% |
| Veteran+ | higher | higher | see odin_extracted/settings/difficulty_settings.json |
An enemy needs island level ≥ MinLevel to appear (its MaxLevel is ignored by the spawn code — enemies keep appearing and scaling forever). Per-enemy skill tuning (cooldown/mana/damage-multiplier overrides) is on the Enemies page.
Events use a recency-weighted randomizer — there is no "must exhaust the deck" rule:
ChanceRatio (1.0 for nearly everything; Battle filler 5.0; Mistress of Chaos 0.2–0.5)Only a handful of events are time-gated (all Night): Brawler's Brew, Petrified Party, Shrine to the Reaper, The Pale Knight, Wrath of the Righteous (plus a few night-flagged chain steps where time doesn't apply). Every other event spawns day or night.
Events roll a D20 (+ stat bonus if offered, clamped −2…+2; the game picks your best eligible stat) against a RollLimit.
Party scaling (only for events with rollBonusTypes set): smaller parties get easier checks —
| Party Size | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Roll limit modifier | −2 | −2 | −1 | −1 | 0 | 0 |
Fortune events with scaling (full-party limit shown): Archery Competition 12, Dwarven Tomb 16, Edwin's Demise 12, Sword in the Stone 18 (so solo Sword in the Stone needs 16). Without scaling: Entangled Boar 11, Magic Mirror 18, Strange Crystal victories 16, Taste for Blood 14, Fortune Teller 11, Librarian 10, Mad Mage 3 → 8.
Event availability is controlled by plain data (no hidden binary conditions): requiredStatusesToSpawn, per-option requiredStatuses / hideIfHasStatuses, and quest statuses that force events (ForcedNextEvent, ForcedEventBeforeBoss). Notable verified chains — full details on the Events page:
Max(0, 5 − (TurnCount−1)) × 100%)Everything on this page comes from the game's own runtime data (resources.assets, scene files) and code (decompiled Assembly-CSharp), extracted July 2026 and verified with in-data anchors (Medusa's 10% staff drop, Bottled Anger's ±20/−10 effects, Fireball's 2 AP / range 7 / SpellPower("Fire") × 1.1). Constants come from serialized assets, never from decompiled default values — an earlier version of this document made that mistake and published wrong numbers; on the six stat-scaling values where we "corrected" the community wiki, the wiki was right.
Cut, disabled, and debug content lives on the Cut Content page. Extraction methodology (tools, pitfalls, replication steps): docs/REVERSE_ENGINEERING.md in the repository.