The pieces finally meet: procgen dungeons + the baked EoB atlas pipeline + the Vigor combat engine become one game. Three fixed pre-baked floors (seeds 7 → 69 → 59, 208 frames), monsters/loot/encounters rerolled per run and composited over the empty scenes; the Ember Sovereign waits at the bottom. - game-wasm: run state machine in Rust (manifest nav graph as dungeon truth, seeded spawning by theme/depth, embedded combat-core Encounter, vigor/fatigue persistence between fights, rest/potions/relics/flee, permadeath + victory). 8 native tests incl. a whole-run bot and a ScriptedPlayer boss-winnability probe used for tuning. - game-web: no-framework front-end — title/death/victory screens, baked frames with screen-blend monster portraits, combat overlay (dual vigor bars, cast telegraphs, cooldown sweeps, floaters), minimap with fog, all SFX synthesized in WebAudio. - balance: floor-scaled levels with a hero's edge over trash, no packs on floor 1, boss tuned by sim sweep (~35%/55% win at skill 50/80). - campaign atlases now versioned (tools/.gitignore exception); boss portrait added to the Z-Image roster. Verified end-to-end in-browser: an autopilot beat the full game through the real UI (10 fights, 2 flees, Sovereign down), and died plenty before that. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
374 lines
No EOL
7.4 KiB
JSON
374 lines
No EOL
7.4 KiB
JSON
{
|
|
"_comment": "REIKHELM: DESCENT combat table - combat/configs/default.json plus the run boss. Magnitudes are displayed units; ratios are basis points; durations are ticks.",
|
|
"tick_rate": 10,
|
|
"global_cooldown": 15,
|
|
"damage_variance_bp": 1500,
|
|
"regen": {
|
|
"dazed_regen_bp": 5000,
|
|
"floor_per_sec": 1
|
|
},
|
|
"stagger": {
|
|
"daze_threshold_bp": 13000,
|
|
"unconscious_threshold_bp": 20000,
|
|
"daze_duration": 8,
|
|
"revive_daze": 12,
|
|
"fatigue_ratio_bp": 2300
|
|
},
|
|
"competency": {
|
|
"level_per_point_bp": 200
|
|
},
|
|
"fizzle": {
|
|
"base_bp": 200,
|
|
"per_gap_bp": 150,
|
|
"max_bp": 9000
|
|
},
|
|
"cost_model": {
|
|
"base_fill_self": 0,
|
|
"base_fill_touch": 1,
|
|
"base_fill_melee": 1,
|
|
"base_fill_projectile": 2,
|
|
"base_fill_beam": 3,
|
|
"base_fill_aoe": 4,
|
|
"fatigue_ratio_bp": 2300,
|
|
"difficulty_per_fill_bp": 10000
|
|
},
|
|
"con_curve": [
|
|
{
|
|
"delta": -8,
|
|
"mult_bp": 4000
|
|
},
|
|
{
|
|
"delta": -5,
|
|
"mult_bp": 6000
|
|
},
|
|
{
|
|
"delta": -2,
|
|
"mult_bp": 8500
|
|
},
|
|
{
|
|
"delta": 0,
|
|
"mult_bp": 10000
|
|
},
|
|
{
|
|
"delta": 2,
|
|
"mult_bp": 11500
|
|
},
|
|
{
|
|
"delta": 5,
|
|
"mult_bp": 15000
|
|
},
|
|
{
|
|
"delta": 8,
|
|
"mult_bp": 19000
|
|
}
|
|
],
|
|
"abilities": [
|
|
{
|
|
"id": "auto_attack",
|
|
"name": "Auto-Attack",
|
|
"school": "martial",
|
|
"delivery": "melee",
|
|
"effects": [
|
|
{
|
|
"kind": "fill_damage",
|
|
"magnitude_bp": 560,
|
|
"cost_fill": 0
|
|
}
|
|
],
|
|
"cooldown": 10,
|
|
"cost_override": {
|
|
"fill": 0,
|
|
"fatigue": 1
|
|
}
|
|
},
|
|
{
|
|
"id": "quick_jab",
|
|
"name": "Quick Jab",
|
|
"school": "martial",
|
|
"delivery": "melee",
|
|
"effects": [
|
|
{
|
|
"kind": "fill_damage",
|
|
"magnitude_bp": 1100,
|
|
"cost_fill": 5
|
|
}
|
|
],
|
|
"cooldown": 20
|
|
},
|
|
{
|
|
"id": "heavy_strike",
|
|
"name": "Heavy Strike",
|
|
"school": "martial",
|
|
"delivery": "melee",
|
|
"effects": [
|
|
{
|
|
"kind": "fill_damage",
|
|
"magnitude_bp": 2800,
|
|
"cost_fill": 14
|
|
}
|
|
],
|
|
"cooldown": 45
|
|
},
|
|
{
|
|
"id": "fireball",
|
|
"name": "Fireball",
|
|
"school": "invocation",
|
|
"delivery": "projectile",
|
|
"effects": [
|
|
{
|
|
"kind": "fill_damage",
|
|
"magnitude_bp": 2800,
|
|
"cost_fill": 14
|
|
}
|
|
],
|
|
"potency_bp": 10000,
|
|
"cast_time": 12,
|
|
"cooldown": 40
|
|
},
|
|
{
|
|
"id": "curse_of_weariness",
|
|
"name": "Curse of Weariness",
|
|
"school": "affliction",
|
|
"delivery": "projectile",
|
|
"effects": [
|
|
{
|
|
"kind": "ceiling_damage",
|
|
"magnitude_bp": 1250,
|
|
"cost_fill": 10
|
|
}
|
|
],
|
|
"cast_time": 8,
|
|
"cooldown": 40
|
|
},
|
|
{
|
|
"id": "venom",
|
|
"name": "Venom",
|
|
"school": "affliction",
|
|
"delivery": "touch",
|
|
"effects": [
|
|
{
|
|
"kind": "dot",
|
|
"per_tick_bp": 260,
|
|
"duration": 20,
|
|
"cost_fill": 10
|
|
}
|
|
],
|
|
"cooldown": 30
|
|
},
|
|
{
|
|
"id": "enervate",
|
|
"name": "Enervate",
|
|
"school": "affliction",
|
|
"delivery": "projectile",
|
|
"effects": [
|
|
{
|
|
"kind": "regen_sabotage",
|
|
"reduce_bp": 6000,
|
|
"duration": 30,
|
|
"cost_fill": 10
|
|
}
|
|
],
|
|
"cast_time": 6,
|
|
"cooldown": 35
|
|
},
|
|
{
|
|
"id": "second_wind",
|
|
"name": "Second Wind",
|
|
"school": "restoration",
|
|
"delivery": "self_cast",
|
|
"effects": [
|
|
{
|
|
"kind": "recovery",
|
|
"magnitude_bp": 700,
|
|
"cost_fill": 3
|
|
}
|
|
],
|
|
"cooldown": 65
|
|
},
|
|
{
|
|
"id": "mend",
|
|
"name": "Mend",
|
|
"school": "restoration",
|
|
"delivery": "self_cast",
|
|
"effects": [
|
|
{
|
|
"kind": "hot",
|
|
"per_tick_bp": 70,
|
|
"duration": 15,
|
|
"cost_fill": 6
|
|
}
|
|
],
|
|
"cast_time": 10,
|
|
"cooldown": 45
|
|
},
|
|
{
|
|
"id": "guard",
|
|
"name": "Guard",
|
|
"school": "martial",
|
|
"delivery": "self_cast",
|
|
"effects": [
|
|
{
|
|
"kind": "mitigation_buff",
|
|
"stage": "active_defense",
|
|
"amount_bp": 8000,
|
|
"duration": 3,
|
|
"cost_fill": 0
|
|
}
|
|
],
|
|
"cooldown": 15,
|
|
"cost_override": {
|
|
"fill": 0,
|
|
"fatigue": 2
|
|
}
|
|
}
|
|
],
|
|
"stat_blocks": {
|
|
"duelist": {
|
|
"name": "Duelist",
|
|
"team": 0,
|
|
"level": 10,
|
|
"max_vigor": 150,
|
|
"regen_idle_per_sec": 9,
|
|
"regen_combat_per_sec": 5,
|
|
"armor_bp": 2500,
|
|
"competency": {
|
|
"martial": 50,
|
|
"restoration": 30
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"quick_jab",
|
|
"heavy_strike",
|
|
"second_wind",
|
|
"guard"
|
|
]
|
|
},
|
|
"battlemage": {
|
|
"name": "Battlemage",
|
|
"team": 0,
|
|
"level": 10,
|
|
"max_vigor": 100,
|
|
"regen_idle_per_sec": 12,
|
|
"regen_combat_per_sec": 7,
|
|
"armor_bp": 500,
|
|
"competency": {
|
|
"invocation": 50,
|
|
"affliction": 40,
|
|
"restoration": 25,
|
|
"martial": 15
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"fireball",
|
|
"curse_of_weariness",
|
|
"second_wind",
|
|
"guard"
|
|
]
|
|
},
|
|
"golem": {
|
|
"name": "Golem",
|
|
"team": 1,
|
|
"level": 10,
|
|
"max_vigor": 260,
|
|
"regen_idle_per_sec": 6,
|
|
"regen_combat_per_sec": 3,
|
|
"armor_bp": 3500,
|
|
"competency": {
|
|
"martial": 40
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"heavy_strike"
|
|
]
|
|
},
|
|
"rat": {
|
|
"name": "Dire Rat",
|
|
"team": 1,
|
|
"level": 8,
|
|
"max_vigor": 45,
|
|
"regen_idle_per_sec": 16,
|
|
"regen_combat_per_sec": 9,
|
|
"armor_bp": 0,
|
|
"competency": {
|
|
"martial": 20
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"quick_jab"
|
|
]
|
|
},
|
|
"skeleton": {
|
|
"name": "Skeleton Knight",
|
|
"team": 1,
|
|
"level": 10,
|
|
"max_vigor": 90,
|
|
"regen_idle_per_sec": 8,
|
|
"regen_combat_per_sec": 4,
|
|
"armor_bp": 1000,
|
|
"competency": {
|
|
"martial": 35
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"quick_jab",
|
|
"heavy_strike"
|
|
]
|
|
},
|
|
"troll": {
|
|
"name": "Cave Troll",
|
|
"team": 1,
|
|
"level": 10,
|
|
"max_vigor": 190,
|
|
"regen_idle_per_sec": 8,
|
|
"regen_combat_per_sec": 4,
|
|
"armor_bp": 2000,
|
|
"competency": {
|
|
"martial": 30,
|
|
"restoration": 20
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"heavy_strike",
|
|
"second_wind"
|
|
]
|
|
},
|
|
"wraith": {
|
|
"name": "Wraith",
|
|
"team": 1,
|
|
"level": 10,
|
|
"max_vigor": 110,
|
|
"regen_idle_per_sec": 12,
|
|
"regen_combat_per_sec": 7,
|
|
"armor_bp": 500,
|
|
"competency": {
|
|
"affliction": 45,
|
|
"martial": 15
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"curse_of_weariness",
|
|
"enervate",
|
|
"venom"
|
|
]
|
|
},
|
|
"boss": {
|
|
"name": "The Ember Sovereign",
|
|
"team": 1,
|
|
"level": 12,
|
|
"max_vigor": 220,
|
|
"regen_idle_per_sec": 6,
|
|
"regen_combat_per_sec": 4,
|
|
"armor_bp": 1000,
|
|
"competency": {
|
|
"martial": 45,
|
|
"invocation": 40,
|
|
"restoration": 25
|
|
},
|
|
"loadout": [
|
|
"auto_attack",
|
|
"heavy_strike",
|
|
"fireball"
|
|
]
|
|
}
|
|
}
|
|
} |