diff --git a/Content/Data/clades.json b/Content/Data/clades.json
index d93695a..a7c0061 100644
--- a/Content/Data/clades.json
+++ b/Content/Data/clades.json
@@ -3,6 +3,7 @@
"id": "canidae",
"name": "Canidae",
"kind": "predator",
+ "description": "\"We were the first to hunt together, the first to howl in harmony, and the first to sit across from prey and call it diplomacy.\"\n\nPack-hunters who became civilization-builders, defined by social cohesion, hierarchical instinct, and supernatural scent-reading. Disproportionately represented in military, law enforcement, and governance.",
"ability_mods": { "CON": 1, "WIS": 1 },
"languages": ["common", "canid"],
"traits": [
@@ -19,6 +20,7 @@
"id": "felidae",
"name": "Felidae",
"kind": "predator",
+ "description": "\"We do not need your pack. We do not need your herd. We need only what is ours, and we will take it when you look away.\"\n\nPrecision predators built for explosive power, preternatural reflexes, and absolute independence. They dominate fields requiring solo brilliance — surgery, assassination, fine art, engineering.",
"ability_mods": { "DEX": 1, "CHA": 1 },
"languages": ["common", "felid"],
"traits": [
@@ -36,6 +38,7 @@
"id": "mustelidae",
"name": "Mustelidae",
"kind": "predator",
+ "description": "\"Small doesn't mean weak. It means you have to be smarter, meaner, and faster than everyone who thinks size is the only thing that matters.\"\n\nThe most physically diverse Clade — weasel-folk, ferret-folk, badger-folk, wolverine-folk, otter-folk — united by furnace metabolisms, ferocity wildly disproportionate to body size, and a reputation for being impossible to pin down.",
"ability_mods": { "DEX": 1, "INT": 1 },
"languages": ["common", "mustelid"],
"traits": [
@@ -52,6 +55,7 @@
"id": "ursidae",
"name": "Ursidae",
"kind": "predator",
+ "description": "\"The bear doesn't chase. The bear waits. And eventually, everything comes to the bear.\"\n\nThe largest sentient Clade. Slow to anger, slow to move, slow to decide — and catastrophically powerful when any of those things finally tips. Frequently underestimated intellectually because size reads as simplicity; in truth, Ursidae civilizations produced some of the finest philosophy, architecture, and brewing in the world.",
"ability_mods": { "DEX": -1, "CON": 2 },
"languages": ["common", "ursid"],
"traits": [
@@ -68,6 +72,7 @@
"id": "cervidae",
"name": "Cervidae",
"kind": "prey",
+ "description": "\"We were the first to know that every shadow could be death. That knowledge made us sharper than any claw.\"\n\nDeer-folk, elk-folk, moose-folk — defined by hypervigilance, explosive athleticism, and a cultural philosophy forged in millennia of being hunted. They have turned survival into a technology, a philosophy, and occasionally a weapon.",
"ability_mods": { "DEX": 1, "WIS": 1 },
"languages": ["common", "cervid"],
"traits": [
@@ -84,6 +89,7 @@
"id": "bovidae",
"name": "Bovidae",
"kind": "prey",
+ "description": "\"The wall holds because we hold it. When the wolves came, we didn't run. We stood, shoulder to shoulder, horns out, and we held.\"\n\nBull-folk, bison-folk, ram-folk, goat-folk — the heaviest prey Clade, defined by communal endurance, raw physical power, and a cultural identity built on the principle that strength means staying.",
"ability_mods": { "STR": 1, "CON": 1 },
"languages": ["common", "bovid"],
"traits": [
@@ -100,6 +106,7 @@
"id": "leporidae",
"name": "Leporidae",
"kind": "prey",
+ "description": "\"We don't fight. We outrun, outbreed, outthink, and outlast. You want to call that weakness? We'll be here when you're gone.\"\n\nThe smallest common prey Clade — rabbit-folk and hare-folk — surviving through explosive speed, prodigious reproduction, community networks, and a cultural genius for making themselves indispensable. They dominate medicine, communications, logistics, and information brokering.",
"ability_mods": { "STR": -1, "DEX": 2 },
"languages": ["common", "leporid"],
"traits": [
diff --git a/Content/Data/species.json b/Content/Data/species.json
index 97e886f..0a08fed 100644
--- a/Content/Data/species.json
+++ b/Content/Data/species.json
@@ -3,6 +3,7 @@
"id": "wolf",
"clade_id": "canidae",
"name": "Wolf-Folk",
+ "description": "\"The apex of the Canid line. Big bodies, bigger presence. Every room they enter gets smaller.\"\n\nBroad-shouldered, heavy-boned, thick through chest and thigh. Dense double-coat in timber grey to midnight black, tawny brown to arctic white; tall triangular ears; expressive tail whose carriage telegraphs status reflexively.",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
@@ -20,6 +21,7 @@
"id": "fox",
"clade_id": "canidae",
"name": "Fox-Folk",
+ "description": "\"Smaller, quicker, cleverer — and never, ever forgetting that the wolves looked down on them for it.\"\n\nLean, narrow-framed, built for speed and agility over power. Typically red-orange with cream underbelly and black stockings, but silver, cross, marble, and arctic white morphs are common. Signature bushy white-tipped tail.",
"size": "medium",
"ability_mods": { "DEX": 1 },
"base_speed_ft": 35,
@@ -37,6 +39,7 @@
"id": "coyote",
"clade_id": "canidae",
"name": "Coyote-Folk",
+ "description": "\"Adaptable. Resourceful. Everywhere you don't want them and thriving anyway.\"\n\nWiry and rangy — built like they survive on scraps and spite. Grizzled tawny-grey, sometimes sandy brown or dusty red. Lean musculature, narrow muzzle, unsettlingly direct yellow-gold gaze.",
"size": "medium",
"ability_mods": { "CHA": 1 },
"base_speed_ft": 30,
@@ -54,6 +57,7 @@
"id": "lion",
"clade_id": "felidae",
"name": "Lion-Folk",
+ "description": "\"The only Felidae who learned to be social — and they never let anyone forget they're still cats.\"\n\nPowerfully built, broad through chest and shoulder. Short tawny-gold to warm brown fur. Males sport manes ranging tawny gold to deep brown-black, framing the face and shielding the throat; the gaze of something that has never been prey.",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
@@ -71,6 +75,7 @@
"id": "leopard",
"clade_id": "felidae",
"name": "Leopard-Folk",
+ "description": "\"You won't hear them. You won't see them. And then it's too late for either.\"\n\nLean, densely muscled, compact — every ounce of weight is functional. Golden-yellow to tawny with distinctive black rosettes (melanistic individuals all-black). Powerful shoulders for climbing and grappling.",
"size": "medium",
"ability_mods": { "DEX": 1 },
"base_speed_ft": 30,
@@ -88,6 +93,7 @@
"id": "housecat",
"clade_id": "felidae",
"name": "Housecat-Folk",
+ "description": "\"Small. Overlooked. Absolutely lethal in ways you'll never trace back to them.\"\n\nFine-boned and quick, built for spaces no one else fits into. Enormous coat variety — tabby, calico, solid, tuxedo, tortoiseshell, pointed. Extremely flexible spine; can fit through any opening their skull will pass.",
"size": "small",
"ability_mods": { "INT": 1 },
"base_speed_ft": 30,
@@ -105,6 +111,7 @@
"id": "ferret",
"clade_id": "mustelidae",
"name": "Ferret-Folk",
+ "description": "\"Charming, manic, and fundamentally incapable of leaving anything alone.\"\n\nLong-bodied and slinky, built like the skeleton is a suggestion. Sable, albino, champagne, silver, dark-eyed white; mask-face markings common. The whole body moves like a sine wave; sweet-musky scent fills a room.",
"size": "small",
"ability_mods": { "CHA": 1 },
"base_speed_ft": 30,
@@ -122,6 +129,7 @@
"id": "badger",
"clade_id": "mustelidae",
"name": "Badger-Folk",
+ "description": "\"Not big. Not fast. Just absolutely unwilling to stop.\"\n\nStocky, low center of gravity, dense muscle on a compact frame with disproportionately wide shoulders. Coarse bristly fur, classic black-and-white facial striping. Heavy digging claws. Built like a bunker with teeth.",
"size": "medium",
"ability_mods": { "CON": 1 },
"base_speed_ft": 30,
@@ -139,6 +147,7 @@
"id": "wolverine",
"clade_id": "mustelidae",
"name": "Wolverine-Folk",
+ "description": "\"Nature's proof that fury is a viable survival strategy.\"\n\nDense, heavy-boned, thick through torso and limbs. Dark brown to black, often with a pale lateral stripe shoulder to hip. Frost-resistant ruff. The eyes of something that has calculated whether it can take you and decided yes.",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
@@ -156,6 +165,7 @@
"id": "brown_bear",
"clade_id": "ursidae",
"name": "Brown Bear-Folk",
+ "description": "\"The standard by which all bears measure themselves, and everyone else measures trouble.\"\n\nEnormous shoulder hump of muscle, broad everywhere — the physically largest common species in the world. Dense, coarse, shaggy fur from honey-blonde to chocolate to grizzled silver-tip. Warm in calm; terrifying when not.",
"size": "large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
@@ -173,6 +183,7 @@
"id": "polar_bear",
"clade_id": "ursidae",
"name": "Polar Bear-Folk",
+ "description": "\"Born in the white silence. Everything about them is patience and stored violence.\"\n\nSlightly leaner than brown bear-folk through the hip, broader through the chest, built for swimming and cold-weather endurance. White to cream-yellow guard hairs over a dense water-resistant undercoat; the skin beneath is black.",
"size": "large",
"ability_mods": { "WIS": 1 },
"base_speed_ft": 30,
@@ -190,6 +201,7 @@
"id": "elk",
"clade_id": "cervidae",
"name": "Elk-Folk",
+ "description": "\"Herd-builders, wall-builders, civilization-builders. The hooves that stamped order into chaos.\"\n\nTall and long-legged, powerful through the haunches and chest. Tawny brown body, darker neck, pale rump patch. Males grow impressive branching antlers — broad, branching, shed and regrown annually — used in display, defense, and cultural adornment.",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
@@ -204,6 +216,7 @@
"id": "deer",
"clade_id": "cervidae",
"name": "Deer-Folk",
+ "description": "\"Quiet, cautious, and always closer to gone than you realize.\"\n\nLean, graceful, built entirely for speed and evasion — not frail, just efficient. Reddish-brown in warm seasons, grey-brown in cold; white underbelly with a white tail-flag. Wide-set lateral eyes with peripheral vision approaching 310 degrees.",
"size": "medium",
"ability_mods": { "DEX": 1 },
"base_speed_ft": 35,
@@ -220,6 +233,7 @@
"id": "moose",
"clade_id": "cervidae",
"name": "Moose-Folk",
+ "description": "\"The exception to every rule about prey being fragile. Eight feet of 'try it.'\"\n\nMassive — thick-bodied, heavy-shouldered, long-legged — the largest Cervidae species, rivaling Ursidae in sheer mass. Dark brown to black, coarse and shaggy, with a loose dewlap at the throat. Males carry enormous palmate antlers that force doorway accommodations.",
"size": "large",
"ability_mods": { "CON": 1 },
"base_speed_ft": 30,
@@ -237,6 +251,7 @@
"id": "rabbit",
"clade_id": "leporidae",
"name": "Rabbit-Folk",
+ "description": "\"They built the warren-cities, the message networks, the emergency medical system. Underestimate them. They're counting on it.\"\n\nCompact and soft-featured, with deceptively powerful hindquarters. Enormous coat variety. Long ears (upright or lopping by lineage — culturally significant) and a constantly twitching nose.",
"size": "small",
"ability_mods": { "WIS": 1 },
"base_speed_ft": 40,
@@ -252,6 +267,7 @@
"id": "hare",
"clade_id": "leporidae",
"name": "Hare-Folk",
+ "description": "\"Not rabbits. Bigger. Wilder. Born on the surface, not in a burrow. There's a difference, and they will tell you about it.\"\n\nLeaner and rangier than rabbit-folk — longer limbs, longer ears, longer stride. Tawny brown, grey, or seasonally white. Build is more runner than burrower; ears tipped black; gaze sharp and confrontational.",
"size": "medium",
"ability_mods": { "CON": 1 },
"base_speed_ft": 45,
@@ -269,6 +285,7 @@
"id": "bull",
"clade_id": "bovidae",
"name": "Bull-Folk",
+ "description": "\"Big. Patient. And when patience runs out, apocalyptic.\"\n\nMassive, thick-necked, broad-shouldered, heavy through chest and belly — not fat, dense; everything about them says immovable. Heavy horns curving outward and up. Hooves instead of paws — hard, split, built for impact.",
"size": "large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 25,
@@ -286,6 +303,7 @@
"id": "ram",
"clade_id": "bovidae",
"name": "Ram-Folk",
+ "description": "\"Climbers, thinkers, and the reason every mountain fortress in the world was built by someone with horns.\"\n\nStocky and compact, lower center of gravity than bull-folk — powerful especially through the hindquarters. Wool (sheep lineage) or coarse hair (goat). Spiral or sweeping horns, cloven hooves, horizontal-slit pupils — distinctive and unsettling to other Clades.",
"size": "medium",
"ability_mods": { "WIS": 1 },
"base_speed_ft": 30,
@@ -303,6 +321,7 @@
"id": "bison",
"clade_id": "bovidae",
"name": "Bison-Folk",
+ "description": "\"The prairie made them. Nothing else could.\"\n\nMassive shoulder hump and enormous head, thick through chest and front; hindquarters comparatively lean. Dark brown to near-black, shaggy through head and shoulders. Short, curved, wickedly sharp horns. Everything about the front profile says battering ram.",
"size": "large",
"ability_mods": { "CON": 1 },
"base_speed_ft": 25,
diff --git a/Theriapolis.Core/Data/CladeDef.cs b/Theriapolis.Core/Data/CladeDef.cs
index 2d825d1..7adb862 100644
--- a/Theriapolis.Core/Data/CladeDef.cs
+++ b/Theriapolis.Core/Data/CladeDef.cs
@@ -16,6 +16,12 @@ public sealed record CladeDef
[JsonPropertyName("name")]
public string Name { get; init; } = "";
+ /// Codex-voice clade description: usually the doc's italicized
+ /// blockquote followed by a one-sentence summary. Surfaced on the
+ /// Step 0 card to establish the world's tone before mechanics.
+ [JsonPropertyName("description")]
+ public string Description { get; init; } = "";
+
/// STR/DEX/CON/INT/WIS/CHA → modifier (typically +1 each on two abilities).
[JsonPropertyName("ability_mods")]
public Dictionary AbilityMods { get; init; } = new();
diff --git a/Theriapolis.Core/Data/SpeciesDef.cs b/Theriapolis.Core/Data/SpeciesDef.cs
index 6b30d90..bdad4d4 100644
--- a/Theriapolis.Core/Data/SpeciesDef.cs
+++ b/Theriapolis.Core/Data/SpeciesDef.cs
@@ -18,6 +18,12 @@ public sealed record SpeciesDef
[JsonPropertyName("name")]
public string Name { get; init; } = "";
+ /// Codex-voice species description: usually the doc's italicized
+ /// blockquote followed by a one-sentence physical/cultural summary.
+ /// Surfaced on the Step 1 card.
+ [JsonPropertyName("description")]
+ public string Description { get; init; } = "";
+
/// Body size category, snake_case (small / medium / medium_large / large).
[JsonPropertyName("size")]
public string Size { get; init; } = "medium";
diff --git a/Theriapolis.Godot/Scenes/Steps/StepClade.cs b/Theriapolis.Godot/Scenes/Steps/StepClade.cs
index 01183a7..84b0894 100644
--- a/Theriapolis.Godot/Scenes/Steps/StepClade.cs
+++ b/Theriapolis.Godot/Scenes/Steps/StepClade.cs
@@ -204,9 +204,11 @@ public partial class StepClade : VBoxContainer, IStep
private static GridContainer MakeGrid()
{
- var grid = new GridContainer { Columns = 3, SizeFlagsHorizontal = SizeFlags.ShrinkCenter };
- grid.AddThemeConstantOverride("h_separation", 16);
- grid.AddThemeConstantOverride("v_separation", 16);
+ // Single-column layout: each card spans the wizard's content width
+ // and surfaces the clade's description text. Establishes the
+ // world's tone before mechanics — the trade is more scrolling.
+ var grid = new GridContainer { Columns = 1, SizeFlagsHorizontal = SizeFlags.ExpandFill };
+ grid.AddThemeConstantOverride("v_separation", 12);
return grid;
}
@@ -530,7 +532,7 @@ public partial class StepClade : VBoxContainer, IStep
private PanelContainer BuildCard(CladeDef clade, System.Action onClick)
{
var card = CodexCard.Make();
- card.CustomMinimumSize = new Vector2(200, 0);
+ card.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
card.GuiInput += (InputEvent e) =>
{
if (e is InputEventMouseButton mb && mb.Pressed && mb.ButtonIndex == MouseButton.Left)
@@ -544,6 +546,16 @@ public partial class StepClade : VBoxContainer, IStep
box.AddChild(new Label { Text = clade.Name, ThemeTypeVariation = "CardName" });
box.AddChild(new Label { Text = clade.Kind.ToUpperInvariant(), ThemeTypeVariation = "CardMeta" });
+ if (!string.IsNullOrEmpty(clade.Description))
+ {
+ box.AddChild(new Label
+ {
+ Text = clade.Description,
+ AutowrapMode = TextServer.AutowrapMode.WordSmart,
+ MouseFilter = Control.MouseFilterEnum.Pass,
+ });
+ }
+
if (clade.AbilityMods.Count > 0)
{
var modsRow = new HBoxContainer();
diff --git a/Theriapolis.Godot/Scenes/Steps/StepSpecies.cs b/Theriapolis.Godot/Scenes/Steps/StepSpecies.cs
index 677b026..afaaffd 100644
--- a/Theriapolis.Godot/Scenes/Steps/StepSpecies.cs
+++ b/Theriapolis.Godot/Scenes/Steps/StepSpecies.cs
@@ -114,9 +114,10 @@ public partial class StepSpecies : VBoxContainer, IStep
private static GridContainer MakeGrid()
{
- var grid = new GridContainer { Columns = 3, SizeFlagsHorizontal = SizeFlags.ShrinkCenter };
- grid.AddThemeConstantOverride("h_separation", 16);
- grid.AddThemeConstantOverride("v_separation", 16);
+ // Single-column layout: each card spans the wizard's content width
+ // and surfaces the species' description text. Matches StepClade.
+ var grid = new GridContainer { Columns = 1, SizeFlagsHorizontal = SizeFlags.ExpandFill };
+ grid.AddThemeConstantOverride("v_separation", 12);
return grid;
}
@@ -400,7 +401,7 @@ public partial class StepSpecies : VBoxContainer, IStep
private static Control BuildCard(SpeciesDef sp, bool selected, System.Action onClick)
{
var card = CodexCard.Make();
- card.CustomMinimumSize = new Vector2(200, 0);
+ card.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
CodexCard.SetSelected(card, selected);
card.GuiInput += (InputEvent e) =>
@@ -420,6 +421,16 @@ public partial class StepSpecies : VBoxContainer, IStep
ThemeTypeVariation = "CardMeta",
});
+ if (!string.IsNullOrEmpty(sp.Description))
+ {
+ box.AddChild(new Label
+ {
+ Text = sp.Description,
+ AutowrapMode = TextServer.AutowrapMode.WordSmart,
+ MouseFilter = Control.MouseFilterEnum.Pass,
+ });
+ }
+
if (sp.AbilityMods.Count > 0)
{
var modsRow = new HBoxContainer();