{
 "globals": {
  "K": [
   0.599,
   0.87,
   1.141,
   1.433,
   1.839,
   2.497,
   3.33,
   4.458,
   5.672,
   9.38
  ],
  "skill_lv_gate": [
   1,
   10,
   20,
   30,
   40,
   50,
   60,
   70,
   85,
   99
  ],
  "flat_scale": {
   "_doc": "flat per 1% at K=1, piecewise-linear in base level",
   "points": [
    [
     1,
     0.1
    ],
    [
     20,
     0.2
    ],
    [
     50,
     0.4
    ],
    [
     80,
     0.6
    ],
    [
     99,
     0.75
    ],
    [
     150,
     0.9
    ],
    [
     200,
     1.2
    ]
   ]
  },
  "anim_lock": 0.6,
  "ult": {
   "pct": 600,
   "cd": 120,
   "brk_mult": 1.8,
   "vs_broken": 0.5,
   "unlock_base_lv": 15
  },
  "break": {
   "gauge": {
    "normal": 100,
    "miniboss": 400,
    "boss": 1200
   },
   "fill_per_100pct": 10,
   "auto_fill": 2,
   "broken_s": 8,
   "immune_s": 4,
   "dmg_taken": 0.2,
   "def_mult": 0.5
  },
  "stack": {
   "per_stack": 0.012,
   "max": 15,
   "linger_s": 5
  },
  "wheel_mod_per_rank": 0.03,
  "wheel_extra_hit": 0.25,
  "wheel_area_node": 0.2,
  "crit": {
   "cd_curve": 200,
   "cd_max_bonus": 1.5,
   "base_mult": 1.5,
   "sc_base": 10,
   "sc_per_luk": 0.1,
   "sc_cap": 50,
   "sc_mult": 1.5,
   "mon_cres": {
    "vit": 0.5,
    "lv": 0.5,
    "miniboss": 1.5,
    "boss": 2.0
   },
   "weapon_refine_cd": 3,
   "mon_luk_shield_cap": 10
  },
  "hp_mult": {
   "_doc": "proposed rule: mini-boss HP = mini_curve(lv) x median field-mob HP of its level band; boss = boss_x_mini x that. Curve keyed by the mini-boss level (x = player level of the band it serves).",
   "mini_curve": [
    [
     1,
     10
    ],
    [
     20,
     11.12
    ],
    [
     50,
     21.66
    ],
    [
     80,
     20.03
    ],
    [
     99,
     12.35
    ],
    [
     150,
     24.02
    ],
    [
     200,
     18
    ]
   ],
   "boss_x_mini": 4
  },
  "pipeline": {
   "_doc": "budget target multiplier per damage pipeline: magic kits have no useful auto-attack",
   "phys": 1.0,
   "magic": 1.25
  },
  "k_class_doc": "flat per 1% = K[sLv] x k_class(job, default 1.0; Draconia: Wanderer 1.00, Grenadier 1.03) x flat_scale(baseLv)",
  "hp_curve": {
   "_doc": "NEW config knob proposed: mob_hp_rate_by_lv; multiplies mob_hp_rate (5) by mob level",
   "points": [
    [
     1,
     1.0
    ],
    [
     20,
     2.544
    ],
    [
     40,
     0.8
    ],
    [
     50,
     0.277
    ],
    [
     80,
     0.292
    ],
    [
     99,
     0.46
    ],
    [
     150,
     0.326
    ],
    [
     200,
     0.46
    ]
   ]
  },
  "_doc": "Combat v2 globals (docs/COMBAT_V2_DESIGN.md). Single source for tools/balance/sim.py AND scripts/server/combat_v2.gd. Owner rules 2026-09-29: no RSL (VIT = crit res), monster crits on.",
  "mon_crit": {
   "_doc": "monster crit on players (Boss 2026-09-29): chance %, mult; extra damage (mult-1) scaled by res_curve/(res_curve + player CRIT RES)",
   "field": {
    "chance": 3.0,
    "mult": 1.5
   },
   "mini": {
    "chance": 8.0,
    "mult": 1.75
   },
   "boss": {
    "chance": 12.0,
    "mult": 2.0
   },
   "res_curve": 200
  },
  "player_cres": {
   "_doc": "player CRIT RES rating = vit*VIT + armor_refine*armor refine total + gear crit_res",
   "vit": 1,
   "armor_refine": 1
  },
  "magic_curve": {
   "_doc": "x class_power of magic kits by base level (sim --fit-all)",
   "points": [
    [
     20,
     1.222
    ],
    [
     50,
     0.96
    ],
    [
     80,
     0.822
    ],
    [
     99,
     0.922
    ],
    [
     150,
     1.211
    ]
   ]
  },
  "mob_min_delay": 0.3,
  "role_bonus": {
   "_doc": "owner 2026-09-30: small survivability bump of the fragile roles (Max HP %, flat DEF); combat_v2.gd role_bonus, sim.py Char.role_bonus",
   "aoe": {
    "hp": 20,
    "def": 10
   },
   "ranged": {
    "hp": 10,
    "def": 5
   },
   "support": {
    "hp": 10,
    "def": 5
   }
  },
  "mini_boss": {
   "_doc": "owner 2026-09-30: an equal-level well-geared player (best % potion of the level) beats a mini-boss alone; MVP / bosses stay party content. Attack delay floor (s) + damage rate by the mini-boss level, fitted by sim.py so every class survives 1.2x the named mini-boss fight drinking its level's potion at 50% efficiency (combat_v2.gd mini_cfg, sim.py mob_dps)",
   "min_delay": 1.0,
   "dmg_curve": [
    [
     20,
     0.38
    ],
    [
     51,
     0.2
    ],
    [
     79,
     0.33
    ],
    [
     91,
     0.5
    ],
    [
     140,
     0.9
    ]
   ]
  },
  "haste": {
   "_doc": "owner 2026-09-30: auto-attacks are capped at auto_min_delay s (ASPD 200 - 50 x delay); every ASPD point above the cap (AGI, gear, ASPD potions) gives per_aspd % Haste, at most max %: v2 skill cooldowns x (1 - Haste) (ultimates excluded) and the after-skill lock anim_lock -> lock_min at full Haste (combat_v2.gd haste, sim.py Char.haste); ASPD potions count potion_mult of their rate (Berserk 20% -> 10%: a potion adds <= +10% DPS)",
   "auto_min_delay": 0.25,
   "per_aspd": 2.5,
   "max": 25,
   "lock_min": 0.3,
   "potion_mult": 0.5
  },
  "element_floor": 0.5,
  "cast_interrupt": false,
  "awaken_pve": {
   "_doc": "owner 2026-09-30 (x1.3 of the first draft: a game-changer / future PvP comeback tool): server/awaken.gd. Gauge 0..gauge_max fills while fighting (dealt_per_hit per landed hit, <= dealt_max_per_s; taken_per_pct per 1% Max HP lost, <= taken_max_per_s: ~70-90 s of fighting); full -> the 'awaken' command: dur s awakened, gauge 0. Awakened: damage +dmg_pct% (ATK / MATK), crit multiplier +crit_dmg_pct%, damage taken -taken_pct%, v2 cooldowns -cdr_pct% (x Haste, total cut <= cdr_cap_pct%, ultimates excluded), basic hits -> gold shockwave wave_pct% of the hit to other monsters within wave_r m, move speed +move_speed (owner: +50%; the higher of it and a mount / Increase AGI, no stacking), immune to 'immune'. awaken_pvp = the PvP numbers (same for now). sim.py awaken_rows (average effect, class spread)",
   "gauge_max": 100,
   "dur": 15.0,
   "fill": {
    "dealt_per_hit": 1.0,
    "dealt_max_per_s": 1.1,
    "taken_per_pct": 0.5,
    "taken_max_per_s": 0.4
   },
   "dmg_pct": 26.0,
   "crit_dmg_pct": 39.0,
   "taken_pct": 19.5,
   "cdr_pct": 39.0,
   "cdr_cap_pct": 50.0,
   "wave_pct": 39.0,
   "wave_r": 3.0,
   "move_speed": 0.5,
   "immune": [
    "stun",
    "frozen",
    "sleep",
    "knockback"
   ],
   "_doc_class_mult": "damage factor per class by base level (sim.py --fit-awaken): the cooldown cut helps skill-heavy kits more than auto-attack kits, this evens every class's awakened burst to the all-class mean",
   "class_mult": {
    "defend_counter": [
     [
      50,
      1.009
     ],
     [
      99,
      0.962
     ],
     [
      150,
      1.08
     ]
    ],
    "magic_control": [
     [
      50,
      0.947
     ],
     [
      99,
      1.002
     ],
     [
      150,
      0.879
     ]
    ],
    "hunt": [
     [
      50,
      1.12
     ],
     [
      99,
      1.063
     ],
     [
      150,
      1.22
     ]
    ],
    "musician": [
     [
      50,
      0.906
     ],
     [
      99,
      0.898
     ],
     [
      150,
      0.89
     ]
    ],
    "shadow_assassin": [
     [
      50,
      1.108
     ],
     [
      99,
      1.077
     ],
     [
      150,
      1.142
     ]
    ],
    "samurai": [
     [
      50,
      1.006
     ],
     [
      99,
      1.014
     ],
     [
      150,
      1.006
     ]
    ],
    "flying_sword": [
     [
      50,
      0.924
     ],
     [
      99,
      1.05
     ],
     [
      150,
      0.98
     ]
    ],
    "flamethrower": [
     [
      50,
      0.98
     ],
     [
      99,
      0.945
     ],
     [
      150,
      1.053
     ]
    ],
    "fire_mage": [
     [
      50,
      1.044
     ],
     [
      99,
      1.016
     ],
     [
      150,
      0.867
     ]
    ]
   }
  },
  "awaken_pvp": {
   "_doc": "PvP numbers of the awakening (identical to awaken_pve for now; tune separately)",
   "gauge_max": 100,
   "dur": 15.0,
   "fill": {
    "dealt_per_hit": 1.0,
    "dealt_max_per_s": 1.1,
    "taken_per_pct": 0.5,
    "taken_max_per_s": 0.4
   },
   "dmg_pct": 26.0,
   "crit_dmg_pct": 39.0,
   "taken_pct": 19.5,
   "cdr_pct": 39.0,
   "cdr_cap_pct": 50.0,
   "wave_pct": 39.0,
   "wave_r": 3.0,
   "move_speed": 0.5,
   "immune": [
    "stun",
    "frozen",
    "sleep",
    "knockback"
   ],
   "_doc_class_mult": "damage factor per class by base level (sim.py --fit-awaken): the cooldown cut helps skill-heavy kits more than auto-attack kits, this evens every class's awakened burst to the all-class mean",
   "class_mult": {
    "defend_counter": [
     [
      50,
      1.009
     ],
     [
      99,
      0.962
     ],
     [
      150,
      1.08
     ]
    ],
    "magic_control": [
     [
      50,
      0.947
     ],
     [
      99,
      1.002
     ],
     [
      150,
      0.879
     ]
    ],
    "hunt": [
     [
      50,
      1.12
     ],
     [
      99,
      1.063
     ],
     [
      150,
      1.22
     ]
    ],
    "musician": [
     [
      50,
      0.906
     ],
     [
      99,
      0.898
     ],
     [
      150,
      0.89
     ]
    ],
    "shadow_assassin": [
     [
      50,
      1.108
     ],
     [
      99,
      1.077
     ],
     [
      150,
      1.142
     ]
    ],
    "samurai": [
     [
      50,
      1.006
     ],
     [
      99,
      1.014
     ],
     [
      150,
      1.006
     ]
    ],
    "flying_sword": [
     [
      50,
      0.924
     ],
     [
      99,
      1.05
     ],
     [
      150,
      0.98
     ]
    ],
    "flamethrower": [
     [
      50,
      0.98
     ],
     [
      99,
      0.945
     ],
     [
      150,
      1.053
     ]
    ],
    "fire_mage": [
     [
      50,
      1.044
     ],
     [
      99,
      1.016
     ],
     [
      150,
      0.867
     ]
    ]
   }
  },
  "_doc_v3": "balance v3 (docs/COMBAT_V2_DESIGN.md 13): element_floor = lowest element damage rate of a player hit with v2 on (combat_v2.gd element_pct); cast_interrupt false = monster hits do not interrupt v2 skill casts (combat_v2.gd cast_interruptible); awaken_pve / awaken_pvp = the awakening (server/awaken.gd). Zone rules (dungeon threat / HP, shooters, EXP): sim.py --zones, tools/balance/zone_patch_data.py"
 },
 "area": {
  "single": {
   "af": 1.0,
   "pack": 1
  },
  "line": {
   "af": 1.6,
   "pack": 3
  },
  "cone": {
   "af": 1.6,
   "pack": 3
  },
  "circle_s": {
   "af": 1.8,
   "pack": 3,
   "_doc": "r < 3"
  },
  "circle": {
   "af": 2.2,
   "pack": 5,
   "_doc": "3 <= r < 5"
  },
  "circle_l": {
   "af": 2.6,
   "pack": 5,
   "_doc": "r >= 5"
  }
 },
 "job_slots": {
  "_doc": "Boss 2026-09-29: slot 1 free; 2: Base Lv50 + quest + 1,000,000 G; 3: Lv99 + mini-boss quest + 5,000,000 G; 4: Lv150 + boss quest + 20,000,000 G. Switch out of combat, 10 s cooldown.",
  "slots": [
   {
    "lv": 1,
    "quest": "",
    "gold": 0
   },
   {
    "lv": 50,
    "quest": "jobslot_2",
    "gold": 1000000
   },
   {
    "lv": 99,
    "quest": "jobslot_3",
    "gold": 5000000
   },
   {
    "lv": 150,
    "quest": "jobslot_4",
    "gold": 20000000
   }
  ],
  "switch_cd": 10.0,
  "combat_s": 5.0,
  "launch": [
   "defend_counter",
   "magic_control",
   "hunt",
   "musician",
   "shadow_assassin",
   "samurai",
   "flying_sword",
   "flamethrower",
   "fire_mage"
  ],
  "locked": [],
  "migrate": {
   "swordman": "defend_counter",
   "knight": "defend_counter",
   "mage": "magic_control",
   "wizard": "magic_control",
   "archer": "hunt",
   "hunter": "hunt",
   "acolyte": "musician",
   "priest": "musician",
   "thief": "shadow_assassin",
   "assassin": "shadow_assassin"
  },
  "pick_default": "defend_counter"
 },
 "v2_replaces": {
  "bash": "dc_shield_rush",
  "magnum_break": "dc_whirl_guard",
  "lure_chain": "dc_lure_chain",
  "pierce": "dc_storm_thrust",
  "brandish_spear": "dc_storm_thrust",
  "spear_boomerang": "dc_shield_rush",
  "bowling_bash": "dc_whirl_guard",
  "spear_stab": "dc_storm_thrust",
  "cold_bolt": "mc_frost_surge",
  "fire_bolt": "mc_thunder_strike",
  "lightning_bolt": "mc_thunder_strike",
  "soul_strike": "mc_frost_surge",
  "napalm_beat": "mc_thunder_strike",
  "fire_ball": "mc_wind_spiral",
  "thunderstorm": "mc_wind_spiral",
  "jupitel_thunder": "mc_thunder_strike",
  "storm_gust": "mc_ice_storm",
  "meteor_storm": "mc_wind_spiral",
  "heavens_drive": "mc_ice_storm",
  "lord_of_vermilion": "mc_ult",
  "water_ball": "mc_frost_surge",
  "frost_diver": "mc_ice_storm",
  "double_strafe": "hu_spiral_shot",
  "arrow_shower": "hu_rain_heaven",
  "blitz_beat": "hu_sky_pierce",
  "freezing_trap": "hu_gale_snipe",
  "claymore_trap": "hu_rain_heaven",
  "heal": "mu_dawn_dance",
  "magnus_exorcismus": "mu_carnival",
  "turn_undead": "mu_ode_waves",
  "holy_light": "mu_meteor_notes",
  "sonic_blow": "as_shadow_flurry",
  "grimtooth": "as_grim_talon",
  "venom_dust": "as_venom_mist",
  "venom_splasher": "as_venom_burst",
  "envenom": "as_shadow_flurry"
 },
 "roles": {
  "st": {
   "dps": 1.1,
   "aoe_ratio": [
    1.1,
    1.6
   ],
   "clear_x": 0.8
  },
  "bruiser": {
   "dps": 1.0,
   "aoe_ratio": [
    1.4,
    1.9
   ],
   "clear_x": 0.65
  },
  "ranged": {
   "dps": 1.0,
   "aoe_ratio": [
    1.4,
    1.9
   ],
   "clear_x": 0.65
  },
  "aoe": {
   "dps": 0.92,
   "aoe_ratio": [
    1.6,
    2.4
   ],
   "clear_x": 0.45
  },
  "support": {
   "dps": 0.7,
   "aoe_ratio": [
    1.3,
    2.0
   ],
   "clear_x": 0.8
  },
  "melee": {
   "dps": 1.0,
   "aoe_ratio": [
    1.4,
    1.9
   ],
   "clear_x": 0.65
  }
 }
}
