Combat System

Turn-based fights with elemental damage, armor, and capped stats

Contents

1. Hit Points

Player HP

player_hp = 350 + level × 150

At level 1 your hero has 500 HP. Every level adds a flat 150.

LevelHP
1500
101,850
507,850
10015,350
20030,350
50075,350
1000150,350

Enemy HP

enemy_hp = (350 + difficulty × 150) × 0.25

Enemies use the same base formula as players, but their HP is multiplied by 0.25 — making them significantly squishier than the player at equal level/difficulty.

DifficultyEnemy HP
1125
10463
501,963
1003,838
2007,588
50018,838
100037,588

2. Base Damage

base_damage = 20 + level × 3

Both players and enemies use the same base damage formula. This is added to weapon damage to form total attack power.

LevelBase Damage
123
1050
50170
100320
200620
5001,520
10003,020

3. Damage Pipeline

Every attack passes through a multi-step damage pipeline. Understanding each step is key to gearing effectively.

Tip: Damage is computed per-element. If your weapon deals fire and physical damage, each component runs through the pipeline separately and the results are summed.

Step 1: Level Scaling

scaling = (attacker_level + 50) / (defender_level + 50)

Adjusts damage based on level difference. Fighting enemies above your level reduces your damage; below your level increases it. The +50 offset prevents extreme swings at low levels.

Step 2: Base Damage

base = total_item_damage × scaling

Total item damage is your weapon's min-max damage (scaled by item level) plus your level-based base damage, multiplied by the level scaling factor.

Step 3: Elemental Distribution

elem_damage = base × attribute_percentage // per element

Players always have a base of 100% physical. Elemental damage attributes add on top — they don't redistribute from physical. A weapon with 12% fire elemental_damage deals 100% physical + 12% fire = 112% total. Each element's share then runs through the reduction/weakness pipeline separately.

Step 4: Flat Elemental Damage

elem_damage += flat_elemental_damage // added per-element

Flat elemental damage bonuses from gear are added on top, per element, before any reductions apply.

Step 5: Reduction & Weakness

eff_reduction% = min(raw_reduction%, 99) net_factor = 1 + (weakness%eff_reduction%) / 100 elem_damage ×= net_factor // floor 0

Each element's damage is modified by the defender's effective reduction (decreases damage) and weakness (increases damage) for that element. Reduction is hard-capped at 99% per element — at least 1% of post-weakness damage always gets through. See Caps. 30% reduction with 0% weakness = 0.70x damage. 0% reduction with 30% weakness = 1.30x damage.

Key: Stacking resist in one element creates weakness to another via weakness pairs. This is intentional — there is no "safe" element to stack without trade-offs.

Step 6: Flat Reduction

elem_damage -= flat_reduction // per-element, floor 0

Flat reduction absorbs a fixed amount of damage per element after percentage modifiers but before armor. Unlike percentage reduction, flat reduction does not create elemental weakness.

Step 7: Armor

damage_after_armor = total × ad / (ad + total_armor) // where ad = 1000 + defender_level × 20

Armor provides diminishing returns damage reduction. See the Armor Formula section below for the full breakdown.

Step 8: Variance

final = damage_after_armor × gaussian(1.0, 0.1) // clamped [0.7, 1.3]

A gaussian roll with mean 1.0 and sigma 0.1, clamped between 0.7 and 1.3, adds slight variance to every hit. Most hits land near 1.0x but occasional high/low rolls create drama.

Step 9: Minimum Damage

final = max(1, final)

Every hit always deals at least 1 damage. No attack can be fully nullified by armor or reductions.

4. Armor Formula

damage_after_armor = damage × ad / (ad + armor) // ad = 1000 + defender_level × 20

Armor uses a hyperbolic formula that provides diminishing returns. The ad (armor divisor) value scales with defender level, meaning higher-level defenders need more armor to achieve the same reduction percentage.

Player Armor Effectiveness

Player armor from equipment is multiplied by an effectiveness factor before entering the formula. This reduces the raw armor value to prevent over-stacking.

Difficulty RangeEffectiveness
0 – 1490.50
150 – 2490.49
250 – 4990.48
500 – 7490.47
750 – 9990.46
1000+0.45
PvP: In PvP brawls, both players use a flat 0.25 armor effectiveness. This makes fights faster and more offense-oriented.

Armor Reduction Curve

The chart below shows how much damage armor absorbs at different defender levels. Higher-level defenders have a larger ad divisor, so they need proportionally more armor to reach the same reduction.

0% 20% 40% 60% 80% 100% 0 10k 20k 30k 40k 50k Total Armor Reduction % Level 50 Level 200 Level 500
Damage reduction % vs. total armor at different defender levels

At level 50 (ad=2000), 10,000 armor absorbs ~83% of damage. At level 500 (ad=11,000), the same armor only absorbs ~48%. Gear must scale with level to maintain the same protection.

5. Initiative

initiative = level + random(1, 20) // enemy gets +2 bonus

At the start of each fight, both sides roll initiative. The combatant with higher initiative attacks first each round. Ties go to the player.

Note: Enemies receive a +2 initiative bonus to slightly offset the player's natural advantage of attacking first on ties.

6. Combat Mechanics

Mechanic Effect Details
Critical Hit 2.0x base (physical only) Base multiplier of 2.0x, plus crit_multiplier_bonus from gear. Only applies to the physical portion of damage. A weapon dealing 60% fire + 40% physical with a 3.0x crit multiplies only the 40% physical part by 3.0x.
Dodge Avoids all damage Checked before block. If dodged, can trigger a counterattack.
Block 50% damage reduction Shield block_chance (5–20%). Checked after dodge fails. Can trigger shield stun.
Reflect Excludes + bounces % back Per-element, pre-pipeline. Reflected portion is excluded from incoming damage AND dealt back to the attacker. Amplified by Elemental Damage Boost. See below.
Elemental Dmg Boost Amplifies elemental output Per non-physical element (5–20% per attr). Applied to outgoing damage after calc_damage, before crit. Also amplifies reflect (both exclusion and reflected damage). Softcapped at 150%.
Heal over Time Heals HP per round Applied at the start of each round, before any attacks. Both sides benefit from their own HoT.
Life Leech Heals % of damage dealt floor(damage × leech% / 100). Only triggers on successful hits (not dodged/blocked to 0).
Summon Extra attack (item_level × 2) Procs per attack based on weapon's summon chance (20–50%). Single-element. Amplified by Elemental Damage Boost. Max 1 summon attribute per weapon, max 1 proc per side per round.

Reflect Exclusion Model

Reflect operates pre-pipeline — before the defender's resist, weakness, and armor are applied. The reflected portion is simultaneously excluded from the incoming hit and dealt back to the attacker.

effective_reflect = base_reflect × (1 + boost / 100) excluded = raw_elem_dmg × effective_reflect / 100 reflected_to_attacker = excluded remaining_to_defender = raw_elem_dmgexcluded // enters resist/weakness/armor pipeline

Resist and reflect stack multiplicatively: 20% exclusion + 30% resist = 44% total reduction for that element. This gives two distinct paths to elemental mitigation.

Enemies use gear too: All combat mechanics are symmetric. Enemies benefit from dodge, block, reflect, HoT, life leech, summon, elemental boost, stun, and counterattack — just like the player. Boss enemies always have full equipment in all 6 slots.

7. Shield Stun

When the defender blocks an attack, there is a chance to stun the attacker. Stun has two effects: an immediate shield bash and the attacker skips their next attack.

Trigger

effective_stun_rate = block_chance × stun_chance / 100

Stun chance comes from the stun_chance armor attribute (2–10% per attr, all armor slots) and the Resilience skill (+1.0% per pick). No softcap on stun_chance — block_chance is already softcapped, and the multiplicative gate limits effective rates.

Shield Bash

The bash uses the shield's effective armor value as its damage input. Resistance attributes on the shield add elemental damage to the bash — a fire-resistant shield hits with fire, an ice-resistant shield hits with ice, and so on.

bash_damage_input = shield_base_armor × (10 + item_level)
PropertyBash
Damage inputShield effective armor
Elemental distributionPhysical 100% base + shield reduction attributes add elemental %
Flat elemental damageShield flat_reduction attributes add flat elemental damage
Elemental boostYes (uses blocker's elemental_damage_boost)
CritYes (uses blocker's crit chance and multiplier)
Life leechYes
SummonNo
Enemy can dodgeNo (reactive hit)
Enemy can blockYes
Enemy reflectYes

Stun Effect

The stunned enemy skips their next attack opportunity. Stunned enemies still receive HoT healing.

Stun creates a self-limiting steady state: stunned rounds have no enemy attack, so no chance to trigger more stuns.

stunned_fraction = S / (1 + S) // where S = effective stun rate per enemy attack

At 22.7% block × 55.1% stun = 12.5% effective stun rate: 11.1% of rounds are stunned, enemy attacks in 88.9% of rounds.

8. Dodge Counterattack

When the defender dodges an attack, there is a chance to immediately counterattack with a full weapon strike.

Trigger

effective_counter_rate = dodge_chance × counterattack_chance / 100

Counterattack chance comes from the counterattack_chance armor attribute (2–10% per attr, all armor except shield) and the Evasion skill (+1.0% per pick). No softcap on counterattack_chance.

Counter Strike

PropertyCounterattack
Damage inputFull weapon damage (same as normal attack)
Elemental distributionSame as normal attack
Flat elemental damageYes
CritYes
Life leechYes
SummonYes
Enemy can dodgeNo (too fast to react — prevents infinite chains)
Enemy can blockYes (blocking a counter can trigger stun)
Enemy reflectYes
Composition: A counterattack can be blocked by the enemy, and blocking a counter can trigger the enemy's own stun. However, a counterattack cannot be dodged, so it cannot trigger a counter-of-counter.

9. Momentum

When a counterattack lands, the attacker gains a Momentum buff — a burst of speed that grants one bonus weapon attack per round for a short duration.

Activation

Duration & Cooldown

ParameterValue
Duration3 rounds of bonus attacks (including the proc round)
Cooldown10 rounds after the buff expires before it can proc again

Bonus Attack

PropertyMomentum Attack
Damage inputFull weapon damage (same as normal attack)
CritYes
Life leechYes
SummonYes
Enemy can dodgeYes
Enemy can blockYes
Triggers counter on dodge?No (prevents infinite chains)
Triggers stun on block?No

Stun Interaction

If the Momentum holder is stunned, the bonus attack is skipped for that round. However, the Momentum timer still ticks down — stun effectively wastes a round of the buff.

Timing: The bonus attack fires at the end of each round, after both sides have taken their normal attacks but before Heal over Time. It appears as a third strike in the round.

10. Fight Flow

  1. Initiative roll — determine who attacks first this fight (persists all rounds).
  2. Each round:
    1. First attacker swings — the full attack sequence (below) plays out. If stunned from the previous round, their attack is skipped.
    2. Second attacker swings — if still alive, the other side attacks. If stunned, skipped.
    3. Momentum bonus attacks — if either side has an active Momentum buff, they get one extra weapon attack (no counter/stun chain).
    4. HoT heals — both sides heal from Heal over Time.
  3. Per attack:
    1. Check if attacker is stunned → if yes, skip attack (stun consumed)
    2. Pre-pipeline: reflect exclusion (boosted by defender's elemental boost)
    3. Check dodge → if dodged, roll counterattack
    4. Calculate damage through pipeline (boost → physical-only crit → elemental distribution → resist/weakness → flat reduction → armor → variance)
    5. Check block → if blocked (50% damage), roll stun → shield bash
    6. Apply damage → life leech → check summon proc (boosted by elemental boost)
  4. Fight ends when either side's HP drops to 0 or below, or the round cap is reached.
  5. Round cap: 500 rounds (PvE) / 50 rounds (PvP). If the cap is hit, the player (or challenger in PvP) loses — stalemate counts as a loss.
Stalemate warning: If both sides have high sustain (life leech + HoT + armor), fights can drag on. The 500-round cap exists to prevent infinite fights. Building pure defense without enough damage can lead to stalemate losses.

11. Soft Caps

Several combat stats use soft caps to prevent extreme stacking. Above a threshold, each additional bracket of effective value costs increasingly more raw stat points.

Chance Stats (Crit, Dodge, Block)

Threshold: 50%. Bracket size: 10%.

Raw ValueEffective ValueRatio
0 – 50%0 – 50%1:1 (no penalty)
50 – 70%50 – 60%2:1
70 – 100%60 – 70%3:1
100 – 140%70 – 80%4:1
140 – 190%80 – 90%5:1
190 – 250%90 – 100%6:1

Getting from 50% to 60% effective costs 20 raw points. Getting from 80% to 90% costs 50 raw points. Reaching 100% effective requires 250 raw points — five times the no-penalty threshold.

Resistance % (per element)

Hard cap: 99%. No soft cap — every point of raw reduction applies 1:1 up to the cap. Capped per element independently (Physical, Earth, Fire, Ice, Magic, Energy).

Raw ValueEffective ValueNotes
0 – 99%0 – 99%1:1 (no penalty)
99% +99% (hard cap)— no benefit from extra raw

The hard cap applies symmetrically to both players and enemies. At 99% effective resistance, at least 1% of post-weakness damage always gets through. Stacking beyond 99% raw has no benefit.

Flat reduction (absolute points per hit) is not capped — it already has a natural per-hit floor at 0 and doesn't benefit unboundedly from stacking.

Crit Multiplier

Base multiplier: 2.0x. Threshold: 5.0x (300 raw units above base). Bracket: 1.0x (100 raw units). Same diminishing pattern as chance stats.

Soft Cap Curve

0% 20% 40% 60% 80% 100% 0 40 80 120 160 200 Raw Value (%) Effective % threshold Effective 1:1 (no cap)
Effective value vs. raw value for chance stats (crit/dodge/block)

Below 50% raw, the curve follows the 1:1 diagonal exactly. Above the threshold, each successive bracket requires more raw stat for less effective gain. At 200% raw, you only get ~91.7% effective — still short of the theoretical 100% cap.

Elemental Damage Boost (per element)

Threshold: 150%. Bracket size: 50%. Applied per element independently. Same diminishing pattern as chance stats.

Natural drop dilution keeps boost well below the softcap for most players. The cap primarily prevents extreme attune-smithing abuse.

Uncapped Stats

Stun chance and counterattack chance have no softcap. Their primary trigger stats (block and dodge) are already softcapped, and the multiplicative gate limits effective rates. Even at 50% block × 100% stun, effective stun rate is 50%. Double-softcapping would make these builds unviable.

UI indicator: In-game, stats that exceed the soft cap threshold show red arrow indicators in the stats panel. More arrows = deeper into diminishing returns.

↑ Back to top