Combat System

Turn-based fights with elemental damage, armor, and soft-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

net_factor = 1 + (weakness% - reduction%) / 100 elem_damage ×= net_factor // clamped ≥ 0

Each element's damage is modified by the defender's reduction (decreases damage) and weakness (increases damage) for that element. 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 damage Base multiplier of 2.0x, plus any crit_multiplier_bonus from gear and skills. Checked on every attack.
Dodge Avoids all damage Checked before block. If the defender dodges, no damage is dealt and no other effects trigger.
Block 50% damage reduction Shield block_chance (1–10%). Checked after dodge fails. Halves the final damage.
Reflect Bounces % back Per-element. Proportional to that element's share of total damage. Reflect damage ignores armor.
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 at 50% damage Procs per attack based on weapon's summon chance. Single-element. Max 1 summon attribute per weapon, max 1 proc per side per round.
Enemies use gear too: Enemies benefit from all item attributes — dodge, block, reflect, HoT, life leech, and summon — just like the player. Boss enemies always have full equipment in all 6 slots.

7. Fight Flow

  1. Initiative roll — determine who attacks first this fight (persists all rounds).
  2. Each round:
    1. HoT heals — both sides heal from Heal over Time before attacks.
    2. First attacker swings — the full attack sequence (below) plays out.
    3. Second attacker swings — if still alive, the other side attacks.
  3. Per attack: Check dodge → calculate damage through pipeline → check crit → check block → apply reflect → apply life leech → check summon proc.
  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.

8. 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.

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.

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