D&D: give Human +1 to all stats and rebalance races to +6 net

Human was mechanically blank (all-zero mods, "not yet implemented"
passive). Wire the Standard Human flavor: +1 to every ability score,
no setup-wizard choice so !setup stays uniform across races.

That put Human at +6 net with no downside, ahead of every other race.
Retune the rest to +6 net as well, keeping their negatives intact so
each stays a spiky specialist rather than a flat generalist.
This commit is contained in:
prosolis
2026-05-14 19:11:19 -07:00
parent 0d666beea3
commit 9f762787f6
2 changed files with 13 additions and 13 deletions

View File

@@ -52,8 +52,8 @@ type DnDRaceInfo struct {
Key DnDRace Key DnDRace
Display string Display string
// Stat modifiers applied at setup-confirm time. STR/DEX/CON/INT/WIS/CHA. // Stat modifiers applied at setup-confirm time. STR/DEX/CON/INT/WIS/CHA.
// Human's "+1 to any" is not yet implemented in Phase 1 — Human gets +0 // Human takes the Standard Human flavor: +1 to every stat, no setup-wizard
// across the board and we'll add the floating bonus in a later phase. // choice (keeps !setup uniform across races).
Mods [6]int Mods [6]int
Passive string Passive string
} }
@@ -72,13 +72,13 @@ type DnDClassInfo struct {
} }
var dndRaces = []DnDRaceInfo{ var dndRaces = []DnDRaceInfo{
{RaceHuman, "Human", [6]int{0, 0, 0, 0, 0, 0}, "Versatile (floating +1 bonus not yet implemented)"}, {RaceHuman, "Human", [6]int{1, 1, 1, 1, 1, 1}, "Versatile: +1 to every ability score"},
{RaceElf, "Elf", [6]int{0, 2, -1, 1, 1, 0}, "Darkvision; immune to sleep effects"}, {RaceElf, "Elf", [6]int{0, 3, -1, 2, 2, 0}, "Darkvision; immune to sleep effects"},
{RaceDwarf, "Dwarf", [6]int{1, -1, 2, 0, 1, -1}, "Poison resistance; bonus vs. underground enemies"}, {RaceDwarf, "Dwarf", [6]int{2, -1, 3, 1, 2, -1}, "Poison resistance; bonus vs. underground enemies"},
{RaceHalfling, "Halfling", [6]int{0, 2, 0, 0, 1, 0}, "Lucky: once per combat, reroll a natural 1"}, {RaceHalfling, "Halfling", [6]int{0, 3, 1, 0, 2, 0}, "Lucky: once per combat, reroll a natural 1"},
{RaceOrc, "Orc", [6]int{3, -1, 2, -1, -1, -1}, "Rage: once per combat, +50% damage for one turn"}, {RaceOrc, "Orc", [6]int{5, -1, 4, -1, -1, 0}, "Rage: once per combat, +50% damage for one turn"},
{RaceTiefling, "Tiefling", [6]int{0, 1, 0, 1, 0, 2}, "Fire resistance; bonus on CHA checks"}, {RaceTiefling, "Tiefling", [6]int{0, 2, 0, 2, 0, 2}, "Fire resistance; bonus on CHA checks"},
{RaceHalfElf, "Half-Elf", [6]int{0, 1, 0, 1, 0, 2}, "Two bonus skill proficiencies"}, {RaceHalfElf, "Half-Elf", [6]int{0, 2, 0, 1, 1, 2}, "Two bonus skill proficiencies"},
} }
var dndClasses = []DnDClassInfo{ var dndClasses = []DnDClassInfo{

View File

@@ -106,16 +106,16 @@ func TestComputeAC(t *testing.T) {
} }
func TestApplyRaceMods(t *testing.T) { func TestApplyRaceMods(t *testing.T) {
// Elf: STR +0, DEX +2, CON -1, INT +1, WIS +1, CHA +0 // Elf: STR +0, DEX +3, CON -1, INT +2, WIS +2, CHA +0
base := [6]int{10, 10, 10, 10, 10, 10} base := [6]int{10, 10, 10, 10, 10, 10}
got := applyRaceMods(RaceElf, base) got := applyRaceMods(RaceElf, base)
want := [6]int{10, 12, 9, 11, 11, 10} want := [6]int{10, 13, 9, 12, 12, 10}
if got != want { if got != want {
t.Errorf("applyRaceMods(Elf) = %v, want %v", got, want) t.Errorf("applyRaceMods(Elf) = %v, want %v", got, want)
} }
// Orc: STR +3, DEX -1, CON +2, INT -1, WIS -1, CHA -1 // Orc: STR +5, DEX -1, CON +4, INT -1, WIS -1, CHA +0
got = applyRaceMods(RaceOrc, base) got = applyRaceMods(RaceOrc, base)
want = [6]int{13, 9, 12, 9, 9, 9} want = [6]int{15, 9, 14, 9, 9, 10}
if got != want { if got != want {
t.Errorf("applyRaceMods(Orc) = %v, want %v", got, want) t.Errorf("applyRaceMods(Orc) = %v, want %v", got, want)
} }