WIP: in-flight combat/expedition/flavor changes

Bundle of uncommitted working-tree edits across combat engine, expedition
cycle, flavor pools, and TwinBee/zone narration. Includes new files:
combat_debug.go, dnd_boss_consumables.go, dnd_dex_floor.go, plus
CHANGES_24H.md and REBALANCE_NOTES.md scratch notes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
prosolis
2026-05-12 21:59:19 -07:00
parent 2b86f3df16
commit 4e412219f3
49 changed files with 1381 additions and 444 deletions

View File

@@ -29,7 +29,7 @@ type DnDMonsterTemplate struct {
var dndBestiary = map[string]DnDMonsterTemplate{
"goblin": {
ID: "goblin", Name: "Goblin",
CR: 0.25, HP: 7, AC: 13, Attack: 6, AttackBonus: 4, Speed: 14,
CR: 0.25, HP: 7, AC: 13, Attack: 1, AttackBonus: 4, Speed: 14,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Nimble Escape", Phase: "any", ProcChance: 0.20, Effect: "stun"},
XPValue: 30,
@@ -37,7 +37,7 @@ var dndBestiary = map[string]DnDMonsterTemplate{
},
"skeleton": {
ID: "skeleton", Name: "Skeleton",
CR: 0.25, HP: 13, AC: 13, Attack: 8, AttackBonus: 4, Speed: 10,
CR: 0.25, HP: 13, AC: 13, Attack: 1, AttackBonus: 4, Speed: 10,
BlockRate: 0.10,
// Skeletons are immune to poison; we'd model that with a future
// CombatModifiers.PoisonImmunity flag. For Phase 7, no ability.
@@ -46,7 +46,7 @@ var dndBestiary = map[string]DnDMonsterTemplate{
},
"orc_grunt": {
ID: "orc_grunt", Name: "Orc Grunt",
CR: 0.5, HP: 15, AC: 13, Attack: 10, AttackBonus: 5, Speed: 11,
CR: 0.5, HP: 15, AC: 13, Attack: 2, AttackBonus: 5, Speed: 11,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Aggressive", Phase: "opening", ProcChance: 0.30, Effect: "enrage"},
XPValue: 100,
@@ -54,7 +54,7 @@ var dndBestiary = map[string]DnDMonsterTemplate{
},
"troll": {
ID: "troll", Name: "Troll",
CR: 5, HP: 84, AC: 15, Attack: 22, AttackBonus: 7, Speed: 8,
CR: 5, HP: 84, AC: 15, Attack: 8, AttackBonus: 7, Speed: 8,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Regeneration", Phase: "any", ProcChance: 0.50, Effect: "lifesteal"},
XPValue: 1800,
@@ -62,7 +62,7 @@ var dndBestiary = map[string]DnDMonsterTemplate{
},
"wyvern": {
ID: "wyvern", Name: "Wyvern",
CR: 6, HP: 110, AC: 13, Attack: 28, AttackBonus: 7, Speed: 16,
CR: 6, HP: 110, AC: 13, Attack: 10, AttackBonus: 7, Speed: 16,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Poison Sting", Phase: "decisive", ProcChance: 0.60, Effect: "poison"},
XPValue: 2300,
@@ -70,7 +70,7 @@ var dndBestiary = map[string]DnDMonsterTemplate{
},
"ancient_dragon": {
ID: "ancient_dragon", Name: "Ancient Dragon",
CR: 20, HP: 367, AC: 22, Attack: 65, AttackBonus: 14, Speed: 18,
CR: 20, HP: 367, AC: 22, Attack: 33, AttackBonus: 11, Speed: 18,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Frightful Presence", Phase: "opening", ProcChance: 0.80, Effect: "stun"},
XPValue: 25000,
@@ -89,7 +89,7 @@ var _ = func() bool {
tier1 := map[string]DnDMonsterTemplate{
"goblin_sneak": {
ID: "goblin_sneak", Name: "Goblin Sneak",
CR: 0.25, HP: 7, AC: 13, Attack: 6, AttackBonus: 4, Speed: 14,
CR: 0.25, HP: 7, AC: 13, Attack: 1, AttackBonus: 4, Speed: 14,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Pack Tactics", Phase: "any", ProcChance: 0.25, Effect: "advantage"},
XPValue: 30,
@@ -97,7 +97,7 @@ var _ = func() bool {
},
"goblin_archer": {
ID: "goblin_archer", Name: "Goblin Archer",
CR: 0.25, HP: 7, AC: 13, Attack: 5, AttackBonus: 4, Speed: 14,
CR: 0.25, HP: 7, AC: 13, Attack: 1, AttackBonus: 4, Speed: 14,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Scurry", Phase: "any", ProcChance: 0.30, Effect: "evade"},
XPValue: 30,
@@ -105,7 +105,7 @@ var _ = func() bool {
},
"hobgoblin_grunt": {
ID: "hobgoblin_grunt", Name: "Hobgoblin Grunt",
CR: 0.5, HP: 11, AC: 18, Attack: 9, AttackBonus: 3, Speed: 11,
CR: 0.5, HP: 11, AC: 18, Attack: 2, AttackBonus: 3, Speed: 11,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Martial Advantage", Phase: "any", ProcChance: 0.30, Effect: "bonus_damage"},
XPValue: 100,
@@ -113,7 +113,7 @@ var _ = func() bool {
},
"worg": {
ID: "worg", Name: "Worg",
CR: 0.5, HP: 26, AC: 13, Attack: 10, AttackBonus: 5, Speed: 17,
CR: 0.5, HP: 26, AC: 13, Attack: 2, AttackBonus: 5, Speed: 17,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Knock Prone", Phase: "any", ProcChance: 0.25, Effect: "stun"},
XPValue: 100,
@@ -121,7 +121,7 @@ var _ = func() bool {
},
"goblin_shaman": {
ID: "goblin_shaman", Name: "Goblin Shaman",
CR: 1, HP: 22, AC: 11, Attack: 12, AttackBonus: 4, Speed: 12,
CR: 1, HP: 22, AC: 11, Attack: 2, AttackBonus: 4, Speed: 12,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Burning Hands", Phase: "opening", ProcChance: 0.50, Effect: "aoe_fire"},
XPValue: 200,
@@ -129,7 +129,7 @@ var _ = func() bool {
},
"hobgoblin_warchief": {
ID: "hobgoblin_warchief", Name: "Hobgoblin Warchief",
CR: 2, HP: 52, AC: 18, Attack: 18, AttackBonus: 5, Speed: 11,
CR: 2, HP: 52, AC: 18, Attack: 4, AttackBonus: 5, Speed: 11,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Leadership Aura", Phase: "any", ProcChance: 0.40, Effect: "ally_buff"},
XPValue: 450,
@@ -137,7 +137,7 @@ var _ = func() bool {
},
"zombie": {
ID: "zombie", Name: "Zombie",
CR: 0.25, HP: 22, AC: 10, Attack: 5, AttackBonus: 3, Speed: 6,
CR: 0.25, HP: 22, AC: 10, Attack: 1, AttackBonus: 3, Speed: 6,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Undead Fortitude", Phase: "decisive", ProcChance: 0.50, Effect: "survive_at_1"},
XPValue: 50,
@@ -145,7 +145,7 @@ var _ = func() bool {
},
"shadow": {
ID: "shadow", Name: "Shadow",
CR: 0.5, HP: 16, AC: 12, Attack: 9, AttackBonus: 4, Speed: 12,
CR: 0.5, HP: 16, AC: 12, Attack: 2, AttackBonus: 4, Speed: 12,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Strength Drain", Phase: "any", ProcChance: 0.35, Effect: "stat_drain"},
XPValue: 100,
@@ -153,7 +153,7 @@ var _ = func() bool {
},
"specter": {
ID: "specter", Name: "Specter",
CR: 1, HP: 22, AC: 12, Attack: 10, AttackBonus: 4, Speed: 14,
CR: 1, HP: 22, AC: 12, Attack: 2, AttackBonus: 4, Speed: 14,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Life Drain", Phase: "any", ProcChance: 0.40, Effect: "lifesteal"},
XPValue: 200,
@@ -161,7 +161,7 @@ var _ = func() bool {
},
"wight": {
ID: "wight", Name: "Wight",
CR: 3, HP: 45, AC: 14, Attack: 14, AttackBonus: 4, Speed: 12,
CR: 3, HP: 45, AC: 14, Attack: 6, AttackBonus: 4, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Life Drain", Phase: "any", ProcChance: 0.45, Effect: "lifesteal"},
XPValue: 700,
@@ -169,7 +169,7 @@ var _ = func() bool {
},
"flameskull": {
ID: "flameskull", Name: "Flameskull",
CR: 4, HP: 40, AC: 13, Attack: 18, AttackBonus: 5, Speed: 15,
CR: 4, HP: 40, AC: 13, Attack: 7, AttackBonus: 5, Speed: 15,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Fireball", Phase: "decisive", ProcChance: 0.55, Effect: "aoe_fire"},
XPValue: 1100,
@@ -177,7 +177,7 @@ var _ = func() bool {
},
"boss_grol_unbroken": {
ID: "boss_grol_unbroken", Name: "Grol the Unbroken",
CR: 3, HP: 65, AC: 17, Attack: 22, AttackBonus: 5, Speed: 12,
CR: 3, HP: 65, AC: 17, Attack: 6, AttackBonus: 5, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Surprise Attack", Phase: "opening", ProcChance: 1.0, Effect: "bonus_damage"},
XPValue: 700,
@@ -185,7 +185,7 @@ var _ = func() bool {
},
"boss_valdris_unburied": {
ID: "boss_valdris_unburied", Name: "Valdris the Unburied",
CR: 5, HP: 97, AC: 17, Attack: 28, AttackBonus: 7, Speed: 12,
CR: 5, HP: 97, AC: 17, Attack: 8, AttackBonus: 7, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Corrupting Touch", Phase: "any", ProcChance: 0.50, Effect: "max_hp_drain"},
XPValue: 1800,
@@ -209,7 +209,7 @@ var _ = func() bool {
tier2 := map[string]DnDMonsterTemplate{
"dire_wolf": {
ID: "dire_wolf", Name: "Dire Wolf",
CR: 1, HP: 37, AC: 14, Attack: 10, AttackBonus: 5, Speed: 16,
CR: 1, HP: 37, AC: 14, Attack: 2, AttackBonus: 5, Speed: 16,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Pack Tactics", Phase: "any", ProcChance: 0.30, Effect: "advantage"},
XPValue: 200,
@@ -217,7 +217,7 @@ var _ = func() bool {
},
"bandit_captain": {
ID: "bandit_captain", Name: "Bandit Captain",
CR: 2, HP: 65, AC: 15, Attack: 14, AttackBonus: 5, Speed: 12,
CR: 2, HP: 65, AC: 15, Attack: 4, AttackBonus: 5, Speed: 12,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Parry", Phase: "any", ProcChance: 0.35, Effect: "block"},
XPValue: 450,
@@ -225,7 +225,7 @@ var _ = func() bool {
},
"owlbear": {
ID: "owlbear", Name: "Owlbear",
CR: 3, HP: 59, AC: 13, Attack: 16, AttackBonus: 7, Speed: 12,
CR: 3, HP: 59, AC: 13, Attack: 6, AttackBonus: 7, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Grapple", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 700,
@@ -233,7 +233,7 @@ var _ = func() bool {
},
"dryad_corrupted": {
ID: "dryad_corrupted", Name: "Corrupted Dryad",
CR: 2, HP: 22, AC: 11, Attack: 11, AttackBonus: 4, Speed: 12,
CR: 2, HP: 22, AC: 11, Attack: 4, AttackBonus: 4, Speed: 12,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Fey Charm", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 450,
@@ -241,7 +241,7 @@ var _ = func() bool {
},
"displacer_beast": {
ID: "displacer_beast", Name: "Displacer Beast",
CR: 3, HP: 85, AC: 13, Attack: 14, AttackBonus: 6, Speed: 14,
CR: 3, HP: 85, AC: 13, Attack: 6, AttackBonus: 6, Speed: 14,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Displacement", Phase: "opening", ProcChance: 0.50, Effect: "evade"},
XPValue: 700,
@@ -249,7 +249,7 @@ var _ = func() bool {
},
"green_hag": {
ID: "green_hag", Name: "Green Hag",
CR: 3, HP: 82, AC: 17, Attack: 15, AttackBonus: 5, Speed: 12,
CR: 3, HP: 82, AC: 17, Attack: 6, AttackBonus: 5, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Invisible Passage", Phase: "any", ProcChance: 0.35, Effect: "evade"},
XPValue: 700,
@@ -257,7 +257,7 @@ var _ = func() bool {
},
"kuo_toa": {
ID: "kuo_toa", Name: "Kuo-toa",
CR: 0.25, HP: 18, AC: 13, Attack: 5, AttackBonus: 3, Speed: 10,
CR: 0.25, HP: 18, AC: 13, Attack: 1, AttackBonus: 3, Speed: 10,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Sticky Shield", Phase: "any", ProcChance: 0.25, Effect: "block"},
XPValue: 30,
@@ -265,7 +265,7 @@ var _ = func() bool {
},
"kuo_toa_whip": {
ID: "kuo_toa_whip", Name: "Kuo-toa Whip",
CR: 1, HP: 65, AC: 11, Attack: 11, AttackBonus: 3, Speed: 10,
CR: 1, HP: 65, AC: 11, Attack: 2, AttackBonus: 3, Speed: 10,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Divine Eminence", Phase: "decisive", ProcChance: 0.50, Effect: "bonus_damage"},
XPValue: 200,
@@ -273,7 +273,7 @@ var _ = func() bool {
},
"water_elemental": {
ID: "water_elemental", Name: "Water Elemental",
CR: 5, HP: 114, AC: 14, Attack: 26, AttackBonus: 7, Speed: 12,
CR: 5, HP: 114, AC: 14, Attack: 8, AttackBonus: 7, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Whelm", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 1800,
@@ -281,7 +281,7 @@ var _ = func() bool {
},
"merrow": {
ID: "merrow", Name: "Merrow",
CR: 2, HP: 45, AC: 13, Attack: 13, AttackBonus: 5, Speed: 12,
CR: 2, HP: 45, AC: 13, Attack: 4, AttackBonus: 5, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Harpoon Pull", Phase: "opening", ProcChance: 0.40, Effect: "stun"},
XPValue: 450,
@@ -289,7 +289,7 @@ var _ = func() bool {
},
"aboleth_thrall": {
ID: "aboleth_thrall", Name: "Aboleth Thrall",
CR: 3, HP: 60, AC: 12, Attack: 14, AttackBonus: 5, Speed: 11,
CR: 3, HP: 60, AC: 12, Attack: 6, AttackBonus: 5, Speed: 11,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Psychic Bond", Phase: "any", ProcChance: 0.35, Effect: "reveal_action"},
XPValue: 700,
@@ -297,7 +297,7 @@ var _ = func() bool {
},
"boss_hollow_king": {
ID: "boss_hollow_king", Name: "The Hollow King",
CR: 6, HP: 142, AC: 15, Attack: 30, AttackBonus: 7, Speed: 13,
CR: 6, HP: 142, AC: 15, Attack: 10, AttackBonus: 7, Speed: 13,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Root Surge", Phase: "any", ProcChance: 0.45, Effect: "stun"},
XPValue: 2300,
@@ -305,7 +305,7 @@ var _ = func() bool {
},
"boss_dreaming_aboleth": {
ID: "boss_dreaming_aboleth", Name: "The Dreaming Aboleth",
CR: 10, HP: 135, AC: 17, Attack: 36, AttackBonus: 9, Speed: 10,
CR: 10, HP: 135, AC: 17, Attack: 16, AttackBonus: 9, Speed: 10,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Enslave", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 5900,
@@ -329,7 +329,7 @@ var _ = func() bool {
tier3 := map[string]DnDMonsterTemplate{
"poltergeist": {
ID: "poltergeist", Name: "Poltergeist",
CR: 2, HP: 22, AC: 12, Attack: 10, AttackBonus: 4, Speed: 12,
CR: 2, HP: 22, AC: 12, Attack: 4, AttackBonus: 4, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Telekinetic Thrust", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 450,
@@ -337,7 +337,7 @@ var _ = func() bool {
},
"banshee": {
ID: "banshee", Name: "Banshee",
CR: 4, HP: 58, AC: 12, Attack: 14, AttackBonus: 4, Speed: 12,
CR: 4, HP: 58, AC: 12, Attack: 7, AttackBonus: 4, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Wail", Phase: "decisive", ProcChance: 0.20, Effect: "execute"},
XPValue: 1100,
@@ -345,7 +345,7 @@ var _ = func() bool {
},
"wraith": {
ID: "wraith", Name: "Wraith",
CR: 5, HP: 67, AC: 13, Attack: 21, AttackBonus: 6, Speed: 16,
CR: 5, HP: 67, AC: 13, Attack: 8, AttackBonus: 6, Speed: 16,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Life Drain", Phase: "any", ProcChance: 0.40, Effect: "max_hp_drain"},
XPValue: 1800,
@@ -353,7 +353,7 @@ var _ = func() bool {
},
"vampire_spawn": {
ID: "vampire_spawn", Name: "Vampire Spawn",
CR: 5, HP: 82, AC: 15, Attack: 16, AttackBonus: 6, Speed: 12,
CR: 5, HP: 82, AC: 15, Attack: 8, AttackBonus: 6, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Bite (Life Drain)", Phase: "any", ProcChance: 0.40, Effect: "self_heal"},
XPValue: 1800,
@@ -361,7 +361,7 @@ var _ = func() bool {
},
"revenant": {
ID: "revenant", Name: "Revenant",
CR: 5, HP: 136, AC: 13, Attack: 25, AttackBonus: 7, Speed: 12,
CR: 5, HP: 136, AC: 13, Attack: 8, AttackBonus: 7, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Vengeful Regeneration", Phase: "any", ProcChance: 0.50, Effect: "regenerate"},
XPValue: 1800,
@@ -369,7 +369,7 @@ var _ = func() bool {
},
"boss_aldric_blackspire": {
ID: "boss_aldric_blackspire", Name: "Lord Aldric Blackspire",
CR: 13, HP: 144, AC: 16, Attack: 38, AttackBonus: 9, Speed: 14,
CR: 13, HP: 144, AC: 16, Attack: 21, AttackBonus: 9, Speed: 14,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Charm", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 10000,
@@ -377,7 +377,7 @@ var _ = func() bool {
},
"magmin": {
ID: "magmin", Name: "Magmin",
CR: 0.5, HP: 9, AC: 14, Attack: 7, AttackBonus: 3, Speed: 10,
CR: 0.5, HP: 9, AC: 14, Attack: 2, AttackBonus: 3, Speed: 10,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Death Burst", Phase: "decisive", ProcChance: 1.00, Effect: "death_aoe"},
XPValue: 100,
@@ -385,7 +385,7 @@ var _ = func() bool {
},
"azer": {
ID: "azer", Name: "Azer",
CR: 2, HP: 39, AC: 17, Attack: 11, AttackBonus: 5, Speed: 12,
CR: 2, HP: 39, AC: 17, Attack: 4, AttackBonus: 5, Speed: 12,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Fire Aura", Phase: "any", ProcChance: 0.50, Effect: "retaliate"},
XPValue: 450,
@@ -393,7 +393,7 @@ var _ = func() bool {
},
"salamander": {
ID: "salamander", Name: "Salamander",
CR: 5, HP: 90, AC: 15, Attack: 22, AttackBonus: 7, Speed: 12,
CR: 5, HP: 90, AC: 15, Attack: 8, AttackBonus: 7, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Constrict", Phase: "any", ProcChance: 0.40, Effect: "stun"},
XPValue: 1800,
@@ -401,7 +401,7 @@ var _ = func() bool {
},
"fire_elemental": {
ID: "fire_elemental", Name: "Fire Elemental",
CR: 5, HP: 102, AC: 13, Attack: 20, AttackBonus: 6, Speed: 14,
CR: 5, HP: 102, AC: 13, Attack: 8, AttackBonus: 6, Speed: 14,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Fire Form", Phase: "any", ProcChance: 0.50, Effect: "retaliate"},
XPValue: 1800,
@@ -409,7 +409,7 @@ var _ = func() bool {
},
"helmed_horror": {
ID: "helmed_horror", Name: "Helmed Horror",
CR: 4, HP: 60, AC: 20, Attack: 16, AttackBonus: 6, Speed: 12,
CR: 4, HP: 60, AC: 20, Attack: 7, AttackBonus: 6, Speed: 12,
BlockRate: 0.25,
Ability: &MonsterAbility{Name: "Spell Immunity", Phase: "any", ProcChance: 1.00, Effect: "spell_resist"},
XPValue: 1100,
@@ -417,7 +417,7 @@ var _ = func() bool {
},
"boss_emberlord_thyrak": {
ID: "boss_emberlord_thyrak", Name: "Emberlord Thyrak",
CR: 9, HP: 178, AC: 18, Attack: 34, AttackBonus: 8, Speed: 11,
CR: 9, HP: 178, AC: 18, Attack: 14, AttackBonus: 8, Speed: 11,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Forge Breath", Phase: "any", ProcChance: 0.30, Effect: "aoe"},
XPValue: 5000,
@@ -443,7 +443,7 @@ var _ = func() bool {
// ── Underdark ────────────────────────────────────────────────────
"drow": {
ID: "drow", Name: "Drow",
CR: 0.25, HP: 13, AC: 15, Attack: 5, AttackBonus: 4, Speed: 12,
CR: 0.25, HP: 13, AC: 15, Attack: 1, AttackBonus: 4, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Drow Poison", Phase: "any", ProcChance: 0.30, Effect: "stun"},
XPValue: 50,
@@ -451,7 +451,7 @@ var _ = func() bool {
},
"drow_elite_warrior": {
ID: "drow_elite_warrior", Name: "Drow Elite Warrior",
CR: 5, HP: 71, AC: 18, Attack: 18, AttackBonus: 7, Speed: 12,
CR: 5, HP: 71, AC: 18, Attack: 8, AttackBonus: 7, Speed: 12,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Parry", Phase: "any", ProcChance: 0.35, Effect: "block"},
XPValue: 1800,
@@ -459,7 +459,7 @@ var _ = func() bool {
},
"drow_mage": {
ID: "drow_mage", Name: "Drow Mage",
CR: 7, HP: 45, AC: 12, Attack: 22, AttackBonus: 5, Speed: 12,
CR: 7, HP: 45, AC: 12, Attack: 12, AttackBonus: 5, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Lightning Bolt", Phase: "decisive", ProcChance: 0.45, Effect: "aoe"},
XPValue: 2900,
@@ -467,7 +467,7 @@ var _ = func() bool {
},
"mind_flayer": {
ID: "mind_flayer", Name: "Mind Flayer",
CR: 7, HP: 71, AC: 15, Attack: 26, AttackBonus: 7, Speed: 12,
CR: 7, HP: 71, AC: 15, Attack: 12, AttackBonus: 7, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Mind Blast", Phase: "opening", ProcChance: 0.55, Effect: "stun"},
XPValue: 2900,
@@ -475,7 +475,7 @@ var _ = func() bool {
},
"hook_horror": {
ID: "hook_horror", Name: "Hook Horror",
CR: 3, HP: 75, AC: 15, Attack: 14, AttackBonus: 6, Speed: 10,
CR: 3, HP: 75, AC: 15, Attack: 6, AttackBonus: 6, Speed: 10,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Pack Tactics", Phase: "any", ProcChance: 0.30, Effect: "advantage"},
XPValue: 700,
@@ -483,7 +483,7 @@ var _ = func() bool {
},
"roper": {
ID: "roper", Name: "Roper",
CR: 5, HP: 93, AC: 20, Attack: 22, AttackBonus: 7, Speed: 4,
CR: 5, HP: 93, AC: 20, Attack: 8, AttackBonus: 7, Speed: 4,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Reel", Phase: "any", ProcChance: 0.50, Effect: "stun"},
XPValue: 1800,
@@ -491,7 +491,7 @@ var _ = func() bool {
},
"boss_ilvaras_xunyl": {
ID: "boss_ilvaras_xunyl", Name: "Ilvaras Xunyl, Drow High Priestess",
CR: 12, HP: 162, AC: 16, Attack: 38, AttackBonus: 9, Speed: 12,
CR: 12, HP: 162, AC: 16, Attack: 19, AttackBonus: 9, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Divine Word", Phase: "decisive", ProcChance: 0.40, Effect: "execute"},
XPValue: 8400,
@@ -500,7 +500,7 @@ var _ = func() bool {
// ── Feywild Crossing ─────────────────────────────────────────────
"redcap": {
ID: "redcap", Name: "Redcap",
CR: 3, HP: 45, AC: 13, Attack: 16, AttackBonus: 6, Speed: 14,
CR: 3, HP: 45, AC: 13, Attack: 6, AttackBonus: 6, Speed: 14,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Outsize Strength", Phase: "any", ProcChance: 0.40, Effect: "bonus_damage"},
XPValue: 700,
@@ -508,7 +508,7 @@ var _ = func() bool {
},
"will_o_wisp": {
ID: "will_o_wisp", Name: "Will-o'-Wisp",
CR: 2, HP: 22, AC: 19, Attack: 9, AttackBonus: 4, Speed: 14,
CR: 2, HP: 22, AC: 19, Attack: 4, AttackBonus: 4, Speed: 14,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Consume Life", Phase: "any", ProcChance: 0.40, Effect: "lifesteal"},
XPValue: 450,
@@ -516,7 +516,7 @@ var _ = func() bool {
},
"quickling": {
ID: "quickling", Name: "Quickling",
CR: 1, HP: 10, AC: 16, Attack: 8, AttackBonus: 5, Speed: 18,
CR: 1, HP: 10, AC: 16, Attack: 2, AttackBonus: 5, Speed: 18,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Blur", Phase: "any", ProcChance: 0.50, Effect: "evade"},
XPValue: 200,
@@ -524,7 +524,7 @@ var _ = func() bool {
},
"night_hag": {
ID: "night_hag", Name: "Night Hag",
CR: 5, HP: 112, AC: 17, Attack: 21, AttackBonus: 7, Speed: 12,
CR: 5, HP: 112, AC: 17, Attack: 8, AttackBonus: 7, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Etherealness", Phase: "any", ProcChance: 0.30, Effect: "evade"},
XPValue: 1800,
@@ -532,7 +532,7 @@ var _ = func() bool {
},
"fomorian": {
ID: "fomorian", Name: "Fomorian",
CR: 8, HP: 149, AC: 14, Attack: 30, AttackBonus: 9, Speed: 12,
CR: 8, HP: 149, AC: 14, Attack: 13, AttackBonus: 9, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Evil Eye", Phase: "any", ProcChance: 0.45, Effect: "stun"},
XPValue: 3900,
@@ -540,7 +540,7 @@ var _ = func() bool {
},
"boss_thornmother": {
ID: "boss_thornmother", Name: "The Thornmother",
CR: 11, HP: 187, AC: 17, Attack: 32, AttackBonus: 8, Speed: 12,
CR: 11, HP: 187, AC: 17, Attack: 18, AttackBonus: 8, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Beguiling Bargain", Phase: "opening", ProcChance: 0.50, Effect: "stun"},
XPValue: 7200,
@@ -549,7 +549,7 @@ var _ = func() bool {
// ── Dragon's Lair ────────────────────────────────────────────────
"kobold": {
ID: "kobold", Name: "Kobold",
CR: 0.125, HP: 5, AC: 12, Attack: 4, AttackBonus: 4, Speed: 12,
CR: 0.125, HP: 5, AC: 12, Attack: 1, AttackBonus: 4, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Pack Tactics", Phase: "any", ProcChance: 0.40, Effect: "advantage"},
XPValue: 25,
@@ -557,7 +557,7 @@ var _ = func() bool {
},
"guard_drake": {
ID: "guard_drake", Name: "Guard Drake",
CR: 2, HP: 52, AC: 14, Attack: 12, AttackBonus: 5, Speed: 12,
CR: 2, HP: 52, AC: 14, Attack: 4, AttackBonus: 5, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Draconic Loyalty", Phase: "any", ProcChance: 1.00, Effect: "fear_immune"},
XPValue: 450,
@@ -565,7 +565,7 @@ var _ = func() bool {
},
"kobold_scale_sorcerer": {
ID: "kobold_scale_sorcerer", Name: "Kobold Scale Sorcerer",
CR: 1, HP: 27, AC: 15, Attack: 11, AttackBonus: 4, Speed: 12,
CR: 1, HP: 27, AC: 15, Attack: 2, AttackBonus: 4, Speed: 12,
BlockRate: 0.05,
Ability: &MonsterAbility{Name: "Chromatic Orb", Phase: "decisive", ProcChance: 0.50, Effect: "bonus_damage"},
XPValue: 200,
@@ -573,7 +573,7 @@ var _ = func() bool {
},
"dragonborn_cultist": {
ID: "dragonborn_cultist", Name: "Dragonborn Cultist",
CR: 4, HP: 71, AC: 16, Attack: 17, AttackBonus: 6, Speed: 12,
CR: 4, HP: 71, AC: 16, Attack: 7, AttackBonus: 6, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Draconic Gift", Phase: "opening", ProcChance: 0.50, Effect: "aoe"},
XPValue: 1100,
@@ -581,7 +581,7 @@ var _ = func() bool {
},
"young_red_dragon": {
ID: "young_red_dragon", Name: "Young Red Dragon",
CR: 10, HP: 178, AC: 18, Attack: 36, AttackBonus: 10, Speed: 16,
CR: 10, HP: 178, AC: 18, Attack: 16, AttackBonus: 10, Speed: 16,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Fire Breath", Phase: "any", ProcChance: 0.30, Effect: "aoe_fire"},
XPValue: 5900,
@@ -589,7 +589,7 @@ var _ = func() bool {
},
"boss_infernax": {
ID: "boss_infernax", Name: "Infernax the Undying",
CR: 24, HP: 546, AC: 22, Attack: 65, AttackBonus: 14, Speed: 18,
CR: 24, HP: 546, AC: 22, Attack: 38, AttackBonus: 11, Speed: 18,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Frightful Presence", Phase: "opening", ProcChance: 0.80, Effect: "stun"},
XPValue: 62000,
@@ -598,7 +598,7 @@ var _ = func() bool {
// ── Abyss Portal ─────────────────────────────────────────────────
"quasit": {
ID: "quasit", Name: "Quasit",
CR: 1, HP: 7, AC: 13, Attack: 6, AttackBonus: 4, Speed: 14,
CR: 1, HP: 7, AC: 13, Attack: 2, AttackBonus: 4, Speed: 14,
BlockRate: 0.0,
Ability: &MonsterAbility{Name: "Invisibility", Phase: "any", ProcChance: 0.40, Effect: "evade"},
XPValue: 200,
@@ -606,7 +606,7 @@ var _ = func() bool {
},
"vrock": {
ID: "vrock", Name: "Vrock",
CR: 6, HP: 104, AC: 15, Attack: 25, AttackBonus: 6, Speed: 12,
CR: 6, HP: 104, AC: 15, Attack: 10, AttackBonus: 6, Speed: 12,
BlockRate: 0.10,
Ability: &MonsterAbility{Name: "Stunning Screech", Phase: "opening", ProcChance: 0.50, Effect: "stun"},
XPValue: 2300,
@@ -614,7 +614,7 @@ var _ = func() bool {
},
"hezrou": {
ID: "hezrou", Name: "Hezrou",
CR: 8, HP: 136, AC: 16, Attack: 30, AttackBonus: 7, Speed: 13,
CR: 8, HP: 136, AC: 16, Attack: 13, AttackBonus: 7, Speed: 13,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Stench", Phase: "any", ProcChance: 0.50, Effect: "debuff"},
XPValue: 3900,
@@ -622,7 +622,7 @@ var _ = func() bool {
},
"nalfeshnee": {
ID: "nalfeshnee", Name: "Nalfeshnee",
CR: 13, HP: 184, AC: 18, Attack: 42, AttackBonus: 10, Speed: 12,
CR: 13, HP: 184, AC: 18, Attack: 21, AttackBonus: 10, Speed: 12,
BlockRate: 0.15,
Ability: &MonsterAbility{Name: "Horror Nimbus", Phase: "opening", ProcChance: 0.55, Effect: "stun"},
XPValue: 10000,
@@ -630,7 +630,7 @@ var _ = func() bool {
},
"marilith": {
ID: "marilith", Name: "Marilith",
CR: 16, HP: 189, AC: 18, Attack: 50, AttackBonus: 11, Speed: 12,
CR: 16, HP: 189, AC: 18, Attack: 26, AttackBonus: 11, Speed: 12,
BlockRate: 0.25,
Ability: &MonsterAbility{Name: "Reactive Parry", Phase: "any", ProcChance: 0.50, Effect: "block"},
XPValue: 15000,
@@ -638,7 +638,7 @@ var _ = func() bool {
},
"boss_belaxath": {
ID: "boss_belaxath", Name: "Belaxath the Undivided",
CR: 19, HP: 262, AC: 19, Attack: 58, AttackBonus: 12, Speed: 14,
CR: 19, HP: 262, AC: 19, Attack: 31, AttackBonus: 11, Speed: 14,
BlockRate: 0.20,
Ability: &MonsterAbility{Name: "Lightning Discharge", Phase: "decisive", ProcChance: 0.40, Effect: "aoe"},
XPValue: 22000,