mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-16 08:52:42 +00:00
UX S6: race truth-up — wire Tiefling fire resist + best-fit hints
R22: replace race copy that promised mechanics the engine doesn't deliver. - Tiefling: wire FireResist as a CombatModifier. Enemy main attack is halved when monster is FireAttacker-tagged; aoe_fire abilities are halved unconditionally; fire-tagged traps deal half damage to Tieflings. DnDMonsterTemplate carries FireAttacker; toCombatStats propagates it. Hand-authored fire entries tagged in dnd_bestiary.go (flameskull, magmin, azer, salamander, fire_elemental, emberlord_thyrak, young_red_dragon, infernax, belaxath). - Open5e tuned generator derives FireAttacker from the highest-AvgDamage attack's DamageType (threshold AvgDamage>=5). 19 tuned monsters tag. Regenerated bestiary_tuned_data.go. - Elf: drop "immune to sleep" (no sleep mechanic); reframe as keen senses + trance flavor. - Half-Elf: drop "two bonus skill proficiencies" (no skill system); reframe as adaptable cross-cultural know-how. - Tiefling copy: drop "bonus on CHA checks" (no checks); keep fire resistance with flavor framing. R23: DnDRaceInfo grows a BestFit field; renderRaceMenu emits an "_best with: …_" hint per race so spiky stat spreads (Orc -1/-1/-1) read as specialist picks rather than a brick of penalties. R24: dnd.go header comment for the caster classes now reflects the shipped state (Playable=true, spell lists populated) instead of the pre-Open5e scaffold language. Tests: TestApplyRacePassives gains a FireResist column; new TestTieflingFireResistance asserts ~0.5x ratio over a 300-trial sweep against a FireAttacker enemy. Full suite green.
This commit is contained in:
@@ -75,10 +75,9 @@ func clampNonNeg(x int) int {
|
||||
}
|
||||
|
||||
// applyRacePassives sets the combat-impacting flags from the player's race.
|
||||
// Races whose passives apply to skill checks or non-combat scenarios
|
||||
// (Tiefling fire resist, Elf sleep immunity, Half-Elf bonus profs, Human
|
||||
// floating +1) are handled in their respective phases and have no combat
|
||||
// hook in Phase 3.
|
||||
// Elf "trance" (resilience flavor), Half-Elf "adaptable" (cross-cultural know-
|
||||
// how), and the Human floating +1 are non-combat or stat-only and have no
|
||||
// engine hook here.
|
||||
func applyRacePassives(stats *CombatStats, mods *CombatModifiers, c *DnDCharacter) {
|
||||
switch c.Race {
|
||||
case RaceHalfling:
|
||||
@@ -87,6 +86,11 @@ func applyRacePassives(stats *CombatStats, mods *CombatModifiers, c *DnDCharacte
|
||||
mods.RageReady = true
|
||||
case RaceDwarf:
|
||||
mods.PoisonResist = true
|
||||
case RaceTiefling:
|
||||
// Fiendish heritage: incoming fire damage is halved by the combat
|
||||
// engine (enemy attack path + aoe_fire ability) and by the trap
|
||||
// resolver (fire-tagged traps).
|
||||
mods.FireResist = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user