M6.14: Single-column card layout with clade/species descriptions
Switch Step 0 (Clade) and Step 1 (Species) from a 3-column card grid to a 1-column layout, with each card carrying a codex-voice description paragraph between the meta line and the trait chips. Rationale: establish the world's tone before mechanics — the player reads who Canidae or Wolf-Folk *are* before evaluating ability mods and trait pills. Trade is more vertical scrolling, but the card content was already going wider than three columns comfortably allowed once the parchment theme bumped padding. Schema: CladeDef and SpeciesDef gain a Description field (string, empty default). Populated for all 7 clades and 19 species, sourced from the doc's italicized blockquote + a one-sentence summary of the prose paragraph that follows. Empty descriptions fall through silently — a species without a description still renders, just without the paragraph. UI: MakeGrid in both steps becomes Columns = 1 with ExpandFill; BuildCard sets card.SizeFlagsHorizontal = ExpandFill (replaces the fixed CustomMinimumSize 200) and prepends the autowrap description label after the meta line. Hybrid mode stacks sire and dam single- column grids vertically — same logic as before, just one card wide each. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
"id": "canidae",
|
"id": "canidae",
|
||||||
"name": "Canidae",
|
"name": "Canidae",
|
||||||
"kind": "predator",
|
"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 },
|
"ability_mods": { "CON": 1, "WIS": 1 },
|
||||||
"languages": ["common", "canid"],
|
"languages": ["common", "canid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
@@ -19,6 +20,7 @@
|
|||||||
"id": "felidae",
|
"id": "felidae",
|
||||||
"name": "Felidae",
|
"name": "Felidae",
|
||||||
"kind": "predator",
|
"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 },
|
"ability_mods": { "DEX": 1, "CHA": 1 },
|
||||||
"languages": ["common", "felid"],
|
"languages": ["common", "felid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
@@ -36,6 +38,7 @@
|
|||||||
"id": "mustelidae",
|
"id": "mustelidae",
|
||||||
"name": "Mustelidae",
|
"name": "Mustelidae",
|
||||||
"kind": "predator",
|
"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 },
|
"ability_mods": { "DEX": 1, "INT": 1 },
|
||||||
"languages": ["common", "mustelid"],
|
"languages": ["common", "mustelid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
@@ -52,6 +55,7 @@
|
|||||||
"id": "ursidae",
|
"id": "ursidae",
|
||||||
"name": "Ursidae",
|
"name": "Ursidae",
|
||||||
"kind": "predator",
|
"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 },
|
"ability_mods": { "DEX": -1, "CON": 2 },
|
||||||
"languages": ["common", "ursid"],
|
"languages": ["common", "ursid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
@@ -68,6 +72,7 @@
|
|||||||
"id": "cervidae",
|
"id": "cervidae",
|
||||||
"name": "Cervidae",
|
"name": "Cervidae",
|
||||||
"kind": "prey",
|
"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 },
|
"ability_mods": { "DEX": 1, "WIS": 1 },
|
||||||
"languages": ["common", "cervid"],
|
"languages": ["common", "cervid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
@@ -84,6 +89,7 @@
|
|||||||
"id": "bovidae",
|
"id": "bovidae",
|
||||||
"name": "Bovidae",
|
"name": "Bovidae",
|
||||||
"kind": "prey",
|
"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 },
|
"ability_mods": { "STR": 1, "CON": 1 },
|
||||||
"languages": ["common", "bovid"],
|
"languages": ["common", "bovid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
@@ -100,6 +106,7 @@
|
|||||||
"id": "leporidae",
|
"id": "leporidae",
|
||||||
"name": "Leporidae",
|
"name": "Leporidae",
|
||||||
"kind": "prey",
|
"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 },
|
"ability_mods": { "STR": -1, "DEX": 2 },
|
||||||
"languages": ["common", "leporid"],
|
"languages": ["common", "leporid"],
|
||||||
"traits": [
|
"traits": [
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
"id": "wolf",
|
"id": "wolf",
|
||||||
"clade_id": "canidae",
|
"clade_id": "canidae",
|
||||||
"name": "Wolf-Folk",
|
"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",
|
"size": "medium_large",
|
||||||
"ability_mods": { "STR": 1 },
|
"ability_mods": { "STR": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
"id": "fox",
|
"id": "fox",
|
||||||
"clade_id": "canidae",
|
"clade_id": "canidae",
|
||||||
"name": "Fox-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "DEX": 1 },
|
"ability_mods": { "DEX": 1 },
|
||||||
"base_speed_ft": 35,
|
"base_speed_ft": 35,
|
||||||
@@ -37,6 +39,7 @@
|
|||||||
"id": "coyote",
|
"id": "coyote",
|
||||||
"clade_id": "canidae",
|
"clade_id": "canidae",
|
||||||
"name": "Coyote-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "CHA": 1 },
|
"ability_mods": { "CHA": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -54,6 +57,7 @@
|
|||||||
"id": "lion",
|
"id": "lion",
|
||||||
"clade_id": "felidae",
|
"clade_id": "felidae",
|
||||||
"name": "Lion-Folk",
|
"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",
|
"size": "medium_large",
|
||||||
"ability_mods": { "STR": 1 },
|
"ability_mods": { "STR": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -71,6 +75,7 @@
|
|||||||
"id": "leopard",
|
"id": "leopard",
|
||||||
"clade_id": "felidae",
|
"clade_id": "felidae",
|
||||||
"name": "Leopard-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "DEX": 1 },
|
"ability_mods": { "DEX": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -88,6 +93,7 @@
|
|||||||
"id": "housecat",
|
"id": "housecat",
|
||||||
"clade_id": "felidae",
|
"clade_id": "felidae",
|
||||||
"name": "Housecat-Folk",
|
"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",
|
"size": "small",
|
||||||
"ability_mods": { "INT": 1 },
|
"ability_mods": { "INT": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -105,6 +111,7 @@
|
|||||||
"id": "ferret",
|
"id": "ferret",
|
||||||
"clade_id": "mustelidae",
|
"clade_id": "mustelidae",
|
||||||
"name": "Ferret-Folk",
|
"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",
|
"size": "small",
|
||||||
"ability_mods": { "CHA": 1 },
|
"ability_mods": { "CHA": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -122,6 +129,7 @@
|
|||||||
"id": "badger",
|
"id": "badger",
|
||||||
"clade_id": "mustelidae",
|
"clade_id": "mustelidae",
|
||||||
"name": "Badger-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "CON": 1 },
|
"ability_mods": { "CON": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -139,6 +147,7 @@
|
|||||||
"id": "wolverine",
|
"id": "wolverine",
|
||||||
"clade_id": "mustelidae",
|
"clade_id": "mustelidae",
|
||||||
"name": "Wolverine-Folk",
|
"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",
|
"size": "medium_large",
|
||||||
"ability_mods": { "STR": 1 },
|
"ability_mods": { "STR": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -156,6 +165,7 @@
|
|||||||
"id": "brown_bear",
|
"id": "brown_bear",
|
||||||
"clade_id": "ursidae",
|
"clade_id": "ursidae",
|
||||||
"name": "Brown Bear-Folk",
|
"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",
|
"size": "large",
|
||||||
"ability_mods": { "STR": 1 },
|
"ability_mods": { "STR": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -173,6 +183,7 @@
|
|||||||
"id": "polar_bear",
|
"id": "polar_bear",
|
||||||
"clade_id": "ursidae",
|
"clade_id": "ursidae",
|
||||||
"name": "Polar Bear-Folk",
|
"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",
|
"size": "large",
|
||||||
"ability_mods": { "WIS": 1 },
|
"ability_mods": { "WIS": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -190,6 +201,7 @@
|
|||||||
"id": "elk",
|
"id": "elk",
|
||||||
"clade_id": "cervidae",
|
"clade_id": "cervidae",
|
||||||
"name": "Elk-Folk",
|
"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",
|
"size": "medium_large",
|
||||||
"ability_mods": { "STR": 1 },
|
"ability_mods": { "STR": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -204,6 +216,7 @@
|
|||||||
"id": "deer",
|
"id": "deer",
|
||||||
"clade_id": "cervidae",
|
"clade_id": "cervidae",
|
||||||
"name": "Deer-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "DEX": 1 },
|
"ability_mods": { "DEX": 1 },
|
||||||
"base_speed_ft": 35,
|
"base_speed_ft": 35,
|
||||||
@@ -220,6 +233,7 @@
|
|||||||
"id": "moose",
|
"id": "moose",
|
||||||
"clade_id": "cervidae",
|
"clade_id": "cervidae",
|
||||||
"name": "Moose-Folk",
|
"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",
|
"size": "large",
|
||||||
"ability_mods": { "CON": 1 },
|
"ability_mods": { "CON": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -237,6 +251,7 @@
|
|||||||
"id": "rabbit",
|
"id": "rabbit",
|
||||||
"clade_id": "leporidae",
|
"clade_id": "leporidae",
|
||||||
"name": "Rabbit-Folk",
|
"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",
|
"size": "small",
|
||||||
"ability_mods": { "WIS": 1 },
|
"ability_mods": { "WIS": 1 },
|
||||||
"base_speed_ft": 40,
|
"base_speed_ft": 40,
|
||||||
@@ -252,6 +267,7 @@
|
|||||||
"id": "hare",
|
"id": "hare",
|
||||||
"clade_id": "leporidae",
|
"clade_id": "leporidae",
|
||||||
"name": "Hare-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "CON": 1 },
|
"ability_mods": { "CON": 1 },
|
||||||
"base_speed_ft": 45,
|
"base_speed_ft": 45,
|
||||||
@@ -269,6 +285,7 @@
|
|||||||
"id": "bull",
|
"id": "bull",
|
||||||
"clade_id": "bovidae",
|
"clade_id": "bovidae",
|
||||||
"name": "Bull-Folk",
|
"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",
|
"size": "large",
|
||||||
"ability_mods": { "STR": 1 },
|
"ability_mods": { "STR": 1 },
|
||||||
"base_speed_ft": 25,
|
"base_speed_ft": 25,
|
||||||
@@ -286,6 +303,7 @@
|
|||||||
"id": "ram",
|
"id": "ram",
|
||||||
"clade_id": "bovidae",
|
"clade_id": "bovidae",
|
||||||
"name": "Ram-Folk",
|
"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",
|
"size": "medium",
|
||||||
"ability_mods": { "WIS": 1 },
|
"ability_mods": { "WIS": 1 },
|
||||||
"base_speed_ft": 30,
|
"base_speed_ft": 30,
|
||||||
@@ -303,6 +321,7 @@
|
|||||||
"id": "bison",
|
"id": "bison",
|
||||||
"clade_id": "bovidae",
|
"clade_id": "bovidae",
|
||||||
"name": "Bison-Folk",
|
"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",
|
"size": "large",
|
||||||
"ability_mods": { "CON": 1 },
|
"ability_mods": { "CON": 1 },
|
||||||
"base_speed_ft": 25,
|
"base_speed_ft": 25,
|
||||||
|
|||||||
@@ -16,6 +16,12 @@ public sealed record CladeDef
|
|||||||
[JsonPropertyName("name")]
|
[JsonPropertyName("name")]
|
||||||
public string Name { get; init; } = "";
|
public string Name { get; init; } = "";
|
||||||
|
|
||||||
|
/// <summary>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.</summary>
|
||||||
|
[JsonPropertyName("description")]
|
||||||
|
public string Description { get; init; } = "";
|
||||||
|
|
||||||
/// <summary>STR/DEX/CON/INT/WIS/CHA → modifier (typically +1 each on two abilities).</summary>
|
/// <summary>STR/DEX/CON/INT/WIS/CHA → modifier (typically +1 each on two abilities).</summary>
|
||||||
[JsonPropertyName("ability_mods")]
|
[JsonPropertyName("ability_mods")]
|
||||||
public Dictionary<string, int> AbilityMods { get; init; } = new();
|
public Dictionary<string, int> AbilityMods { get; init; } = new();
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ public sealed record SpeciesDef
|
|||||||
[JsonPropertyName("name")]
|
[JsonPropertyName("name")]
|
||||||
public string Name { get; init; } = "";
|
public string Name { get; init; } = "";
|
||||||
|
|
||||||
|
/// <summary>Codex-voice species description: usually the doc's italicized
|
||||||
|
/// blockquote followed by a one-sentence physical/cultural summary.
|
||||||
|
/// Surfaced on the Step 1 card.</summary>
|
||||||
|
[JsonPropertyName("description")]
|
||||||
|
public string Description { get; init; } = "";
|
||||||
|
|
||||||
/// <summary>Body size category, snake_case (small / medium / medium_large / large).</summary>
|
/// <summary>Body size category, snake_case (small / medium / medium_large / large).</summary>
|
||||||
[JsonPropertyName("size")]
|
[JsonPropertyName("size")]
|
||||||
public string Size { get; init; } = "medium";
|
public string Size { get; init; } = "medium";
|
||||||
|
|||||||
@@ -204,9 +204,11 @@ public partial class StepClade : VBoxContainer, IStep
|
|||||||
|
|
||||||
private static GridContainer MakeGrid()
|
private static GridContainer MakeGrid()
|
||||||
{
|
{
|
||||||
var grid = new GridContainer { Columns = 3, SizeFlagsHorizontal = SizeFlags.ShrinkCenter };
|
// Single-column layout: each card spans the wizard's content width
|
||||||
grid.AddThemeConstantOverride("h_separation", 16);
|
// and surfaces the clade's description text. Establishes the
|
||||||
grid.AddThemeConstantOverride("v_separation", 16);
|
// 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;
|
return grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -530,7 +532,7 @@ public partial class StepClade : VBoxContainer, IStep
|
|||||||
private PanelContainer BuildCard(CladeDef clade, System.Action<string> onClick)
|
private PanelContainer BuildCard(CladeDef clade, System.Action<string> onClick)
|
||||||
{
|
{
|
||||||
var card = CodexCard.Make();
|
var card = CodexCard.Make();
|
||||||
card.CustomMinimumSize = new Vector2(200, 0);
|
card.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||||||
card.GuiInput += (InputEvent e) =>
|
card.GuiInput += (InputEvent e) =>
|
||||||
{
|
{
|
||||||
if (e is InputEventMouseButton mb && mb.Pressed && mb.ButtonIndex == MouseButton.Left)
|
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.Name, ThemeTypeVariation = "CardName" });
|
||||||
box.AddChild(new Label { Text = clade.Kind.ToUpperInvariant(), ThemeTypeVariation = "CardMeta" });
|
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)
|
if (clade.AbilityMods.Count > 0)
|
||||||
{
|
{
|
||||||
var modsRow = new HBoxContainer();
|
var modsRow = new HBoxContainer();
|
||||||
|
|||||||
@@ -114,9 +114,10 @@ public partial class StepSpecies : VBoxContainer, IStep
|
|||||||
|
|
||||||
private static GridContainer MakeGrid()
|
private static GridContainer MakeGrid()
|
||||||
{
|
{
|
||||||
var grid = new GridContainer { Columns = 3, SizeFlagsHorizontal = SizeFlags.ShrinkCenter };
|
// Single-column layout: each card spans the wizard's content width
|
||||||
grid.AddThemeConstantOverride("h_separation", 16);
|
// and surfaces the species' description text. Matches StepClade.
|
||||||
grid.AddThemeConstantOverride("v_separation", 16);
|
var grid = new GridContainer { Columns = 1, SizeFlagsHorizontal = SizeFlags.ExpandFill };
|
||||||
|
grid.AddThemeConstantOverride("v_separation", 12);
|
||||||
return grid;
|
return grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,7 +401,7 @@ public partial class StepSpecies : VBoxContainer, IStep
|
|||||||
private static Control BuildCard(SpeciesDef sp, bool selected, System.Action<string> onClick)
|
private static Control BuildCard(SpeciesDef sp, bool selected, System.Action<string> onClick)
|
||||||
{
|
{
|
||||||
var card = CodexCard.Make();
|
var card = CodexCard.Make();
|
||||||
card.CustomMinimumSize = new Vector2(200, 0);
|
card.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||||||
CodexCard.SetSelected(card, selected);
|
CodexCard.SetSelected(card, selected);
|
||||||
|
|
||||||
card.GuiInput += (InputEvent e) =>
|
card.GuiInput += (InputEvent e) =>
|
||||||
@@ -420,6 +421,16 @@ public partial class StepSpecies : VBoxContainer, IStep
|
|||||||
ThemeTypeVariation = "CardMeta",
|
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)
|
if (sp.AbilityMods.Count > 0)
|
||||||
{
|
{
|
||||||
var modsRow = new HBoxContainer();
|
var modsRow = new HBoxContainer();
|
||||||
|
|||||||
Reference in New Issue
Block a user