Initial commit: Theriapolis baseline at port/godot branch point

Captures the pre-Godot-port state of the codebase. This is the rollback
anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md).
All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Christopher Wiebe
2026-04-30 20:40:51 -07:00
commit b451f83174
525 changed files with 75786 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
#----------------------------- Global Properties ----------------------------#
/outputDir:bin/$(Platform)
/intermediateDir:obj/$(Platform)
/platform:DesktopGL
/config:
/profile:Reach
/compress:False
#-------------------------------- References --------------------------------#
#---------------------------------- Content ---------------------------------#
# Phase 0/1: no content processed through the pipeline.
# All biome tiles are generated at runtime (TileAtlas.GeneratePlaceholders).
# Fonts, real art, and audio will be added in later phases.
+122
View File
@@ -0,0 +1,122 @@
[
{
"id": "coliseum_survivor",
"name": "Coliseum Survivor",
"flavor": "You fought in the arena — voluntary or otherwise. Your body is a map of old wounds and your instincts are sharpened by crowds that wanted your blood.",
"skill_proficiencies": ["athletics", "performance"],
"tool_proficiencies": ["gaming_set", "herbalism_kit"],
"feature_name": "Crowd Reader",
"feature_description": "Gauge the mood of any group instantly. Identify the leader, sense incoming violence, and find the quickest exit. Advantage on Insight checks in group settings.",
"suggested_personality": "Hypervigilant in open spaces. Flashbacks triggered by cheering. Distrust of spectators. Comfort only in controlled violence."
},
{
"id": "passer",
"name": "Passer",
"flavor": "You are a hybrid who presents as purebred. You've built a life on a lie, and every day is performance.",
"skill_proficiencies": ["deception", "stealth"],
"tool_proficiencies": ["perfumers_kit", "disguise_kit"],
"feature_name": "The Mask",
"feature_description": "Maintain a scent-mask and behavioral profile of your presenting clade. Casual scent checks don't detect your hybrid status. Under stress, CHA (Deception) check or the mask slips. Access to the underground passer network.",
"suggested_personality": "Constantly calculating. Genuine only with other passers. Terror of discovery beneath every interaction. Relief and grief in equal measure when the mask drops."
},
{
"id": "covenant_enforcer",
"name": "Covenant Enforcer",
"flavor": "You served the legal system that upholds the Covenant of Claws. As investigator, bailiff, or executioner, you've seen what happens when the agreement breaks.",
"skill_proficiencies": ["investigation", "intimidation"],
"tool_proficiencies": ["manacles", "vehicles_land"],
"feature_name": "Badge Authority",
"feature_description": "In regions that honor the Covenant, carry legal authority. Compel cooperation from civilians, access restricted areas, demand answers. Vanishes in lawless zones; carries enemies.",
"suggested_personality": "Haunted by cases. Black-and-white morality softened (or hardened) by experience. Instinctive distrust of charm."
},
{
"id": "herd_city_born",
"name": "Herd-City Born",
"flavor": "You grew up in one of the great prey-clade cities — massive, communal, fortified, paranoid in the bones of its architecture.",
"skill_proficiencies": ["perception", "history"],
"tool_proficiencies": ["artisans_tools", "herbalism_kit"],
"feature_name": "Safety in Numbers",
"feature_description": "Always know the nearest exit, defensible position, and rally point in any urban environment. Find safe lodging in any prey-clade community within 1 hour.",
"suggested_personality": "Agoraphobic tendencies. Deep communal loyalty. Suspicion of solitary behavior. Comfort in crowds, anxiety in open spaces."
},
{
"id": "pack_raised",
"name": "Pack-Raised",
"flavor": "You come from a traditional Canid pack structure — hierarchical, loyal, suffocating. The pack is family, employer, and identity.",
"skill_proficiencies": ["athletics", "insight"],
"tool_proficiencies": ["vehicles_land", "artisans_tools"],
"feature_name": "Pack Network",
"feature_description": "Find Canid pack-affiliated contacts in any settlement. Contacts offer basic hospitality, information, and short-term shelter. Obligations flow both ways.",
"suggested_personality": "Instinctive deference to authority or instinctive rebellion against it. Loneliness hits harder than it should. Comfort in hierarchy."
},
{
"id": "borderland_stray",
"name": "Borderland Stray",
"flavor": "You grew up in the spaces between — border towns, disputed territories, places where clade identity is fluid and survival is daily.",
"skill_proficiencies": ["survival", "deception"],
"tool_proficiencies": ["thieves_tools", "gaming_set"],
"feature_name": "No One's Territory",
"feature_description": "Navigate lawless zones. Find black-market contacts, under-the-table work, and discreet passage in any border settlement. Read danger before it arrives.",
"suggested_personality": "Pragmatic to the point of amorality. Loyalty earned, never assumed. Distrusts idealists. Sleeps light."
},
{
"id": "hybrid_underground",
"name": "Hybrid Underground",
"flavor": "You're openly hybrid, or you were raised in hybrid community spaces — the informal networks, art collectives, and mutual aid groups that exist because no one else would have you.",
"skill_proficiencies": ["performance", "persuasion"],
"tool_proficiencies": ["musical_instrument", "perfumers_kit"],
"feature_name": "Blend Network",
"feature_description": "Access to the hybrid underground: safe houses, scent-masking supply chains, identity documents, community healers who understand hybrid biology. Find the network within 24 hours in any city.",
"suggested_personality": "Defiant. Artistic. Rage just below the surface. Deep bonds with chosen family. Default distrust of purebreds softened by individual proof."
},
{
"id": "warren_runner",
"name": "Warren Runner",
"flavor": "Leporid-origin logistics and communications. You were a messenger, courier, or information carrier for the warren-networks that connect communities.",
"skill_proficiencies": ["acrobatics", "perception"],
"tool_proficiencies": ["navigators_tools", "vehicles_land"],
"feature_name": "The Network Runs",
"feature_description": "Know the fastest route between any two points in a region you've worked. Deliver messages with near-perfect reliability. Contacts in Leporid warren-networks across multiple cities.",
"suggested_personality": "Restless. Difficulty sitting still. Excellent spatial memory. Loyalty to the network above individual relationships."
},
{
"id": "rawfang_investigator",
"name": "Rawfang Investigator",
"flavor": "You hunt the worst criminals in the world — those who break the Covenant by consuming sentient flesh. This work has changed you.",
"skill_proficiencies": ["investigation", "medicine"],
"tool_proficiencies": ["alchemists_supplies", "forensic_kit"],
"feature_name": "Crime Scene Reader",
"feature_description": "Analyze a location for evidence of Covenant violation. Blood typing, scent remnants, tissue identification. Read a scene in minutes. Contacts in law enforcement and forensic communities.",
"suggested_personality": "Quiet. Dark humor as a coping mechanism. Difficulty eating meat of any kind. Insomnia. Unwavering commitment to justice."
},
{
"id": "scent_suppressed",
"name": "Scent-Suppressed",
"flavor": "You grew up on scent-suppressants — maybe your parents were progressive, maybe paranoid, maybe you're a hybrid whose scent was managed from birth. You've lived partially invisible in a world that communicates through smell.",
"skill_proficiencies": ["stealth", "insight"],
"tool_proficiencies": ["perfumers_kit", "alchemists_supplies"],
"feature_name": "Scentless",
"feature_description": "Your baseline scent is nearly undetectable. Creatures relying on scent to detect or read you do so with disadvantage. You read others by body language rather than scent.",
"suggested_personality": "Observant. Disconnected from scent-culture rituals. Feels invisible. Either grateful for the privacy or resentful of the erasure."
},
{
"id": "former_chattel",
"name": "Former Chattel",
"flavor": "Hybrid-specific. Your grandparents — or you — were property. The Imperium's shadow is long, and some regions only recently abolished hybrid ownership.",
"skill_proficiencies": ["athletics", "survival"],
"tool_proficiencies": ["artisans_tools", "herbalism_kit"],
"feature_name": "Unbreakable",
"feature_description": "Advantage on saves against exhaustion and against effects that would compel obedience or subservience. Contacts in abolitionist networks and former-chattel communities.",
"suggested_personality": "Quiet fury. Absolute refusal to be owned, controlled, or spoken for. Deep empathy for the powerless. Difficulty trusting authority."
},
{
"id": "coliseum_breeder",
"name": "Coliseum Breeder",
"flavor": "You worked the coliseum system — not as a fighter, but as the industry behind the spectacle. Trainer, handler, promoter, or medic. You know how the machine works.",
"skill_proficiencies": ["animal_handling", "medicine"],
"tool_proficiencies": ["herbalism_kit", "gaming_set"],
"feature_name": "Arena Insider",
"feature_description": "Know the coliseum circuit, active and underground. Secure fights, find fighters, negotiate purses, identify fixed matches. Know which officials take bribes.",
"suggested_personality": "Pragmatic about violence. Business-minded. Complicated relationship with ethics — kept fighters alive, but kept the system running."
}
]
+220
View File
@@ -0,0 +1,220 @@
[
{
"id": "CANID_TRADITIONALIST",
"name": "Canid Traditionalist",
"description": "Pack-loyal, distrusts non-Canidae, respects strength hierarchy. Rural wolf-folk ranchers, Old Pack sympathisers.",
"clade_bias": {
"canidae": 15,
"felidae": -10,
"mustelidae": -5,
"ursidae": 0,
"cervidae": -15,
"bovidae": -10,
"leporidae": -10
},
"hybrid_bias": -25,
"faction_affinity": {
"inheritors": 15,
"covenant_enforcers": -10,
"thorn_council": -25
}
},
{
"id": "CERVID_CAUTIOUS",
"name": "Cervid Cautious",
"description": "Default wariness of predator clades, warm to other prey, uncertain about hybrids. Herd-city shopkeepers, Cervid farmers.",
"clade_bias": {
"canidae": -15,
"felidae": -20,
"mustelidae": -10,
"ursidae": -25,
"cervidae": 15,
"bovidae": 10,
"leporidae": 5
},
"hybrid_bias": -10
},
{
"id": "URBAN_PROGRESSIVE",
"name": "Urban Progressive",
"description": "Reduced clade bias across the board, mild positive toward hybrids, dislikes extremists. Sanctum Fidelis professionals, university-educated.",
"clade_bias": {
"canidae": -2,
"felidae": -2,
"mustelidae": 2,
"ursidae": 0,
"cervidae": 2,
"bovidae": 2,
"leporidae": 2
},
"hybrid_bias": 5,
"faction_affinity": {
"covenant_enforcers": 5,
"inheritors": -20,
"thorn_council": -15
}
},
{
"id": "HYBRID_SURVIVOR",
"name": "Hybrid Survivor",
"description": "Strong positive toward hybrids, default distrust of purebreds, especially authorities. Tangles residents, underground network members.",
"clade_bias": {
"canidae": -5,
"felidae": -5,
"mustelidae": 0,
"ursidae": -5,
"cervidae": -5,
"bovidae": -5,
"leporidae": 0
},
"hybrid_bias": 25,
"faction_affinity": {
"covenant_enforcers": -20,
"inheritors": -25,
"thorn_council": -20
}
},
{
"id": "MUSTELID_PRAGMATIST",
"name": "Mustelid Pragmatist",
"description": "Judges by utility, mild distrust of large species, respects competence. Factory foremen, independent traders.",
"clade_bias": {
"canidae": 0,
"felidae": 0,
"mustelidae": 8,
"ursidae": -8,
"cervidae": -3,
"bovidae": -5,
"leporidae": 3
},
"hybrid_bias": 0
},
{
"id": "BOVID_HERD_LOYALIST",
"name": "Bovid Herd Loyalist",
"description": "Warm to other Bovidae and prey clades, wary of predators, protective of community. Herd-city elders, agricultural cooperative members.",
"clade_bias": {
"canidae": -10,
"felidae": -15,
"mustelidae": -5,
"ursidae": -15,
"cervidae": 10,
"bovidae": 15,
"leporidae": 8
},
"hybrid_bias": -8
},
{
"id": "COVENANT_FAITHFUL",
"name": "Covenant Faithful",
"description": "Treats all clades with studied neutrality, strong negative toward Covenant violators. Covenant Enforcers, Bridge-oath Keepers.",
"clade_bias": {
"canidae": 0,
"felidae": 0,
"mustelidae": 0,
"ursidae": 0,
"cervidae": 0,
"bovidae": 0,
"leporidae": 0
},
"hybrid_bias": -3,
"faction_affinity": {
"covenant_enforcers": 25,
"inheritors": -25,
"thorn_council": -25
}
},
{
"id": "FRONTIER_NIHILIST",
"name": "Frontier Nihilist",
"description": "Doesn't care what you are, only what you can do right now. Borderland strays, Tangles smugglers.",
"clade_bias": {
"canidae": 0,
"felidae": 0,
"mustelidae": 0,
"ursidae": 0,
"cervidae": 0,
"bovidae": 0,
"leporidae": 0
},
"hybrid_bias": 0
},
{
"id": "TANGLES_RESIDENT",
"name": "Tangles Resident",
"description": "Distrusts authority, accepts anyone the underground accepts, suspicious of clean-clothed visitors.",
"clade_bias": {
"canidae": -3,
"felidae": -3,
"mustelidae": 5,
"ursidae": -5,
"cervidae": -3,
"bovidae": -3,
"leporidae": 3
},
"hybrid_bias": 15,
"faction_affinity": {
"covenant_enforcers": -25,
"inheritors": -15,
"thorn_council": -10
}
},
{
"id": "INHERITOR_TRUE_BELIEVER",
"name": "Inheritor True Believer",
"description": "Predator-clade supremacist; the Covenant is a cage, the strong should rule. Inheritor cell members.",
"clade_bias": {
"canidae": 12,
"felidae": 12,
"mustelidae": 8,
"ursidae": 15,
"cervidae": -25,
"bovidae": -25,
"leporidae": -30
},
"hybrid_bias": -25,
"faction_affinity": {
"inheritors": 25,
"covenant_enforcers": -25,
"thorn_council": -25
}
},
{
"id": "THORN_COUNCIL_HARDLINER",
"name": "Thorn Council Hardliner",
"description": "Prey-clade separatist; predators are unsafe, hybrids are pawns of the old order. Thorn Council operatives.",
"clade_bias": {
"canidae": -25,
"felidae": -25,
"mustelidae": -15,
"ursidae": -30,
"cervidae": 12,
"bovidae": 12,
"leporidae": 10
},
"hybrid_bias": -15,
"faction_affinity": {
"thorn_council": 25,
"covenant_enforcers": -20,
"inheritors": -30
}
},
{
"id": "MERCHANT_NEUTRAL",
"name": "Merchant Neutral",
"description": "Coin first, opinions last. Smiles at everyone, marks up the unsteady customers.",
"clade_bias": {
"canidae": 0,
"felidae": 0,
"mustelidae": 2,
"ursidae": 0,
"cervidae": 0,
"bovidae": 0,
"leporidae": 0
},
"hybrid_bias": -2,
"faction_affinity": {
"merchant_guilds": 15
}
}
]
+287
View File
@@ -0,0 +1,287 @@
[
{
"id": "ocean",
"display_name": "Ocean",
"letter": "O",
"color": "#1a4fa8",
"placeholder_sprite": "placeholder/biome_ocean.png",
"elevation_min": 0.0,
"elevation_max": 0.349,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 10,
"is_transition": false
},
{
"id": "tundra",
"display_name": "Tundra",
"letter": "T",
"color": "#c0ccc4",
"placeholder_sprite": "placeholder/biome_tundra.png",
"elevation_min": 0.0,
"elevation_max": 0.72,
"moisture_min": 0.0,
"moisture_max": 0.48,
"temp_min": 0.0,
"temp_max": 0.28,
"priority": 2,
"is_transition": false
},
{
"id": "boreal",
"display_name": "Boreal Forest",
"letter": "B",
"color": "#3e6e52",
"placeholder_sprite": "placeholder/biome_boreal.png",
"elevation_min": 0.0,
"elevation_max": 0.65,
"moisture_min": 0.35,
"moisture_max": 0.85,
"temp_min": 0.08,
"temp_max": 0.38,
"priority": 2,
"is_transition": false
},
{
"id": "temperate_deciduous",
"display_name": "Temperate Forest",
"letter": "F",
"color": "#4e7e3e",
"placeholder_sprite": "placeholder/biome_forest.png",
"elevation_min": 0.0,
"elevation_max": 0.62,
"moisture_min": 0.42,
"moisture_max": 0.9,
"temp_min": 0.28,
"temp_max": 0.68,
"priority": 2,
"is_transition": false
},
{
"id": "temperate_grassland",
"display_name": "Grassland",
"letter": "G",
"color": "#8aaa48",
"placeholder_sprite": "placeholder/biome_grassland.png",
"elevation_min": 0.0,
"elevation_max": 0.5,
"moisture_min": 0.15,
"moisture_max": 0.58,
"temp_min": 0.28,
"temp_max": 0.72,
"priority": 1,
"is_transition": false
},
{
"id": "mountain_alpine",
"display_name": "Mountain",
"letter": "M",
"color": "#8a7a68",
"placeholder_sprite": "placeholder/biome_mountain.png",
"elevation_min": 0.62,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 0.55,
"priority": 5,
"is_transition": false
},
{
"id": "mountain_forested",
"display_name": "Mountain Forest",
"letter": "m",
"color": "#5a6848",
"placeholder_sprite": "placeholder/biome_mountain.png",
"elevation_min": 0.48,
"elevation_max": 0.72,
"moisture_min": 0.38,
"moisture_max": 0.88,
"temp_min": 0.18,
"temp_max": 0.58,
"priority": 3,
"is_transition": false
},
{
"id": "subtropical_forest",
"display_name": "Subtropical",
"letter": "S",
"color": "#3a8a3a",
"placeholder_sprite": "placeholder/biome_subtropical.png",
"elevation_min": 0.0,
"elevation_max": 0.58,
"moisture_min": 0.6,
"moisture_max": 1.0,
"temp_min": 0.62,
"temp_max": 1.0,
"priority": 4,
"is_transition": false
},
{
"id": "wetland",
"display_name": "Wetland",
"letter": "W",
"color": "#3a6838",
"placeholder_sprite": "placeholder/biome_wetland.png",
"elevation_min": 0.35,
"elevation_max": 0.44,
"moisture_min": 0.78,
"moisture_max": 1.0,
"temp_min": 0.3,
"temp_max": 0.82,
"priority": 4,
"is_transition": false
},
{
"id": "coastal",
"display_name": "Coastal",
"letter": "C",
"color": "#90b47e",
"placeholder_sprite": "placeholder/biome_coast.png",
"elevation_min": 0.35,
"elevation_max": 0.39,
"moisture_min": 0.35,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 1,
"is_transition": false
},
{
"id": "scrubland",
"display_name": "Scrubland",
"letter": "s",
"color": "#9a8848",
"placeholder_sprite": "placeholder/biome_grassland.png",
"elevation_min": 0.0,
"elevation_max": 0.58,
"moisture_min": 0.08,
"moisture_max": 0.32,
"temp_min": 0.38,
"temp_max": 0.82,
"priority": 1,
"is_transition": false
},
{
"id": "desert_cold",
"display_name": "Cold Desert",
"letter": "D",
"color": "#b8a878",
"placeholder_sprite": "placeholder/biome_tundra.png",
"elevation_min": 0.1,
"elevation_max": 0.7,
"moisture_min": 0.0,
"moisture_max": 0.18,
"temp_min": 0.0,
"temp_max": 0.42,
"priority": 2,
"is_transition": false
},
{
"id": "forest_edge",
"display_name": "Forest Edge",
"letter": "f",
"color": "#7a9858",
"placeholder_sprite": "placeholder/biome_forest.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
},
{
"id": "foothills",
"display_name": "Foothills",
"letter": "h",
"color": "#887868",
"placeholder_sprite": "placeholder/biome_mountain.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
},
{
"id": "marsh_edge",
"display_name": "Marsh Edge",
"letter": "w",
"color": "#587858",
"placeholder_sprite": "placeholder/biome_wetland.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
},
{
"id": "beach",
"display_name": "Beach",
"letter": "b",
"color": "#d4c888",
"placeholder_sprite": "placeholder/biome_coast.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
},
{
"id": "cliff",
"display_name": "Cliff",
"letter": "c",
"color": "#786860",
"placeholder_sprite": "placeholder/biome_mountain.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
},
{
"id": "tidal_flat",
"display_name": "Tidal Flat",
"letter": "t",
"color": "#8aaa80",
"placeholder_sprite": "placeholder/biome_coast.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
},
{
"id": "mangrove",
"display_name": "Mangrove",
"letter": "n",
"color": "#3a6848",
"placeholder_sprite": "placeholder/biome_wetland.png",
"elevation_min": 0.0,
"elevation_max": 1.0,
"moisture_min": 0.0,
"moisture_max": 1.0,
"temp_min": 0.0,
"temp_max": 1.0,
"priority": 0,
"is_transition": true
}
]
@@ -0,0 +1,16 @@
{
"id": "granary",
"name": "Granary",
"category": "infrastructure",
"footprint_w_tiles": 5,
"footprint_h_tiles": 5,
"min_tier_eligible": 4,
"weight": 0.4,
"doors": [
{ "x": 2, "y": 4, "facing": "S" }
],
"decos": [
{ "x": 2, "y": 2, "deco": "counter" }
],
"roles": []
}
@@ -0,0 +1,20 @@
{
"id": "house_medium",
"name": "Townhouse",
"category": "house",
"footprint_w_tiles": 6,
"footprint_h_tiles": 5,
"min_tier_eligible": 3,
"weight": 1.0,
"doors": [
{ "x": 3, "y": 4, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "hearth" },
{ "x": 4, "y": 2, "deco": "bed" },
{ "x": 4, "y": 3, "deco": "bed" }
],
"roles": [
{ "tag": "resident", "spawn_at": [2, 2], "optional": true }
]
}
@@ -0,0 +1,19 @@
{
"id": "house_small",
"name": "Cottage",
"category": "house",
"footprint_w_tiles": 5,
"footprint_h_tiles": 4,
"min_tier_eligible": 5,
"weight": 1.5,
"doors": [
{ "x": 2, "y": 3, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "hearth" },
{ "x": 3, "y": 2, "deco": "bed" }
],
"roles": [
{ "tag": "resident", "spawn_at": [2, 2], "optional": true }
]
}
@@ -0,0 +1,24 @@
{
"id": "inn_medium",
"name": "Tavern & Lodge",
"category": "inn",
"footprint_w_tiles": 10,
"footprint_h_tiles": 8,
"min_tier_eligible": 2,
"weight": 0.6,
"doors": [
{ "x": 5, "y": 7, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "hearth" },
{ "x": 8, "y": 1, "deco": "counter" },
{ "x": 2, "y": 5, "deco": "bed" },
{ "x": 4, "y": 5, "deco": "bed" },
{ "x": 6, "y": 5, "deco": "bed" },
{ "x": 8, "y": 5, "deco": "bed" }
],
"roles": [
{ "tag": "innkeeper", "spawn_at": [8, 2] },
{ "tag": "barfly", "spawn_at": [3, 3], "optional": true }
]
}
@@ -0,0 +1,21 @@
{
"id": "inn_small",
"name": "Small Inn",
"category": "inn",
"footprint_w_tiles": 8,
"footprint_h_tiles": 6,
"min_tier_eligible": 4,
"weight": 1.0,
"doors": [
{ "x": 4, "y": 5, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "hearth" },
{ "x": 6, "y": 1, "deco": "counter" },
{ "x": 2, "y": 4, "deco": "bed" },
{ "x": 5, "y": 4, "deco": "bed" }
],
"roles": [
{ "tag": "innkeeper", "spawn_at": [6, 2] }
]
}
@@ -0,0 +1,22 @@
{
"id": "magistrate",
"name": "Magistrate's Hall",
"category": "civic",
"footprint_w_tiles": 8,
"footprint_h_tiles": 7,
"min_tier_eligible": 2,
"weight": 0.3,
"doors": [
{ "x": 4, "y": 6, "facing": "S" }
],
"decos": [
{ "x": 4, "y": 1, "deco": "counter" },
{ "x": 3, "y": 1, "deco": "counter" },
{ "x": 1, "y": 5, "deco": "hearth" },
{ "x": 6, "y": 5, "deco": "sign" }
],
"roles": [
{ "tag": "magistrate", "spawn_at": [4, 2] },
{ "tag": "constable", "spawn_at": [2, 4], "optional": true }
]
}
@@ -0,0 +1,20 @@
{
"id": "shop_alchemist",
"name": "Alchemist",
"category": "shop",
"footprint_w_tiles": 5,
"footprint_h_tiles": 5,
"min_tier_eligible": 2,
"weight": 0.4,
"doors": [
{ "x": 2, "y": 4, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "counter" },
{ "x": 3, "y": 1, "deco": "counter" },
{ "x": 1, "y": 3, "deco": "hearth" }
],
"roles": [
{ "tag": "alchemist", "spawn_at": [2, 2] }
]
}
@@ -0,0 +1,20 @@
{
"id": "shop_general",
"name": "General Store",
"category": "shop",
"footprint_w_tiles": 6,
"footprint_h_tiles": 5,
"min_tier_eligible": 4,
"weight": 1.0,
"doors": [
{ "x": 3, "y": 4, "facing": "S" }
],
"decos": [
{ "x": 4, "y": 1, "deco": "counter" },
{ "x": 4, "y": 2, "deco": "counter" },
{ "x": 1, "y": 1, "deco": "sign" }
],
"roles": [
{ "tag": "shopkeeper", "spawn_at": [4, 3] }
]
}
@@ -0,0 +1,20 @@
{
"id": "shop_smithy",
"name": "Smithy",
"category": "shop",
"footprint_w_tiles": 6,
"footprint_h_tiles": 5,
"min_tier_eligible": 3,
"weight": 0.7,
"doors": [
{ "x": 3, "y": 4, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "hearth" },
{ "x": 2, "y": 1, "deco": "hearth" },
{ "x": 4, "y": 1, "deco": "counter" }
],
"roles": [
{ "tag": "smith", "spawn_at": [4, 3] }
]
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "well",
"name": "Well",
"category": "infrastructure",
"footprint_w_tiles": 3,
"footprint_h_tiles": 3,
"min_tier_eligible": 5,
"weight": 0.5,
"doors": [
{ "x": 1, "y": 2, "facing": "S" }
],
"decos": [
{ "x": 1, "y": 1, "deco": "counter" }
],
"roles": []
}
+115
View File
@@ -0,0 +1,115 @@
[
{
"id": "canidae",
"name": "Canidae",
"kind": "predator",
"ability_mods": { "CON": 1, "WIS": 1 },
"languages": ["common", "canid"],
"traits": [
{ "id": "pack_instinct", "name": "Pack Instinct", "description": "Reaction: when an ally within 10 ft. is attacked, grant them +2 AC against that attack. Uses equal to proficiency bonus per long rest." },
{ "id": "superior_scent", "name": "Superior Scent", "description": "Advantage on Perception checks that rely on smell. Detects emotional states (fear, anger, deception) within 30 ft. — interpretation requires WIS check." },
{ "id": "subsonic_communication","name": "Subsonic Communication","description": "Communicate simple messages (danger, regroup, follow, stop) to other Canidae within 60 ft. silently." }
],
"detriments": [
{ "id": "pack_dependent", "name": "Pack-Dependent", "description": "When no allied creature is within 30 ft., disadvantage on WIS saves against fear and charm." },
{ "id": "scent_overload", "name": "Scent Overload", "description": "In environments with overwhelming or chemically altered smells, all Perception checks suffer disadvantage." }
]
},
{
"id": "felidae",
"name": "Felidae",
"kind": "predator",
"ability_mods": { "DEX": 1, "CHA": 1 },
"languages": ["common", "felid"],
"traits": [
{ "id": "retractable_claws", "name": "Retractable Claws", "description": "Unarmed claw attacks deal 1d6 + DEX slashing. Claws extend or retract at will, allowing full manual dexterity when sheathed." },
{ "id": "darkvision", "name": "Darkvision", "description": "See in dim light within 60 ft. as if bright; in darkness as if dim (greyscale only)." },
{ "id": "feline_grace", "name": "Feline Grace", "description": "Half damage from falls of 30 ft. or less (none from 10 ft. or less). Advantage on Acrobatics checks to maintain balance." },
{ "id": "tail_speak", "name": "Tail-Speak", "description": "Communicate complex emotional and tactical info silently to any creature that speaks Felid, visible up to 60 ft." }
],
"detriments": [
{ "id": "solitary_instinct", "name": "Solitary Instinct", "description": "Cannot benefit from the Help action unless the helper is a Felidae or a bonded creature." },
{ "id": "prides_cost", "name": "Pride's Cost", "description": "Failing a check or save by 5 or more in front of witnesses imposes disadvantage on the next CHA check." }
]
},
{
"id": "mustelidae",
"name": "Mustelidae",
"kind": "predator",
"ability_mods": { "DEX": 1, "INT": 1 },
"languages": ["common", "mustelid"],
"traits": [
{ "id": "sinuous_frame", "name": "Sinuous Frame", "description": "Squeeze through openings sized for one size category smaller without penalty. Advantage on checks to escape grapples and restraints." },
{ "id": "burning_metabolism", "name": "Burning Metabolism", "description": "Advantage on saves vs. cold and exhaustion. Requires double rations to function (see equipment costs)." },
{ "id": "ferocity", "name": "Ferocity", "description": "When reduced below half HP, deal +1 damage on melee attacks until end of next turn. Triggers once per long rest." }
],
"detriments": [
{ "id": "high_metabolism", "name": "High Metabolism", "description": "Requires double rations daily. Without enough food, gain a level of exhaustion every 12 hours instead of 24." },
{ "id": "scent_marker", "name": "Scent Marker", "description": "Mustelid musk is unmistakable and difficult to mask. Disadvantage on Stealth checks against creatures with scent abilities unless you have a deep-cover scent-mask active." }
]
},
{
"id": "ursidae",
"name": "Ursidae",
"kind": "predator",
"ability_mods": { "DEX": -1, "CON": 2 },
"languages": ["common", "ursid"],
"traits": [
{ "id": "powerful_build", "name": "Powerful Build", "description": "Counts as one size larger for carrying capacity and grappling. Push, drag, or lift weight is doubled." },
{ "id": "thick_hide", "name": "Thick Hide", "description": "Natural AC = 11 + DEX when unarmored. Resistance to non-magical bludgeoning damage." },
{ "id": "bone_crushing_jaws", "name": "Bone-Crushing Jaws", "description": "Unarmed bite deals 1d10 + STR piercing. On a critical hit, target makes a STR save (DC = 8 + prof + STR) or is knocked prone." }
],
"detriments": [
{ "id": "lumbering", "name": "Lumbering", "description": "Disadvantage on DEX (Stealth) checks. Disadvantage on DEX saves to avoid area effects." },
{ "id": "heat_intolerance", "name": "Heat Intolerance", "description": "In temperatures above 80°F, CON save (DC 12) every 2 hours of activity or gain a level of exhaustion." }
]
},
{
"id": "cervidae",
"name": "Cervidae",
"kind": "prey",
"ability_mods": { "DEX": 1, "WIS": 1 },
"languages": ["common", "cervid"],
"traits": [
{ "id": "fleet_footed", "name": "Fleet-Footed", "description": "Base movement speed +5 ft. When you Dash, no opportunity attacks against you for that turn." },
{ "id": "antlers", "name": "Antlers", "description": "(Antlered species only.) Natural antler attack deals 1d6 + STR piercing. Antlers shed annually; cosmetic only when shed, attack still functional." },
{ "id": "wide_field_of_view", "name": "Wide Field of View", "description": "Cannot be flanked by fewer than three attackers. Advantage on Perception checks to detect movement at the periphery of vision." }
],
"detriments": [
{ "id": "flight_response", "name": "Flight Response", "description": "When suddenly threatened (surprise attack, sudden loud sound), WIS save (DC 12) or compelled to move at full speed away from the threat for one turn." },
{ "id": "delicate_frame", "name": "Delicate Frame", "description": "Hit point maximum reduced by 1 per level (minimum 1 HP per level)." }
]
},
{
"id": "bovidae",
"name": "Bovidae",
"kind": "prey",
"ability_mods": { "STR": 1, "CON": 1 },
"languages": ["common", "bovid"],
"traits": [
{ "id": "horns", "name": "Horns", "description": "Natural horn attack deals 1d8 + STR bludgeoning or piercing (shape varies by species). Horns are permanent and grow throughout life." },
{ "id": "herd_wall", "name": "Herd Wall", "description": "Adjacent to one ally: +1 AC. Adjacent to three or more: +2 AC. Stacks with other adjacency bonuses up to a maximum of +3 from all sources." },
{ "id": "unshakeable", "name": "Unshakeable", "description": "Advantage on saves against being frightened, charmed, or compelled to move from your position." }
],
"detriments": [
{ "id": "ponderous_gait", "name": "Ponderous Gait", "description": "Base movement speed is 25 ft. Disadvantage on DEX saves against effects that require quick repositioning." },
{ "id": "stubborn", "name": "Stubborn", "description": "Disadvantage on WIS saves against effects that exploit refusal to change course (feints, misdirections, lures)." }
]
},
{
"id": "leporidae",
"name": "Leporidae",
"kind": "prey",
"ability_mods": { "STR": -1, "DEX": 2 },
"languages": ["common", "leporid"],
"traits": [
{ "id": "leaping_strides", "name": "Leaping Strides", "description": "Long jump distance equal to your speed without a running start. High jump distance equal to half your speed without a running start." },
{ "id": "burrow_savvy", "name": "Burrow Savvy", "description": "Proficiency in Survival in underground or warren environments. Advantage on Perception checks underground." },
{ "id": "twitch_reflexes", "name": "Twitch Reflexes", "description": "Advantage on initiative rolls. Reaction: when targeted by a ranged attack you can see, impose disadvantage on that attack roll. Uses equal to proficiency bonus per long rest." }
],
"detriments": [
{ "id": "fragile_body", "name": "Fragile Body", "description": "Hit point maximum reduced by 1 per level (minimum 1 HP per level). Disadvantage on STR saves against effects that would knock you prone." },
{ "id": "constant_vigilance", "name": "Constant Vigilance", "description": "When in a new environment for less than 1 hour, you cannot benefit from a short rest — your nervous system refuses to settle." }
]
}
]
+486
View File
@@ -0,0 +1,486 @@
[
{
"id": "fangsworn",
"name": "Fangsworn",
"hit_die": 10,
"primary_ability": ["STR", "DEX"],
"saves": ["STR", "CON"],
"armor_proficiencies": ["light", "medium", "heavy", "shields"],
"weapon_proficiencies": ["simple", "martial", "natural"],
"tool_proficiencies": [],
"skills_choose": 2,
"skill_options": ["athletics", "intimidation", "perception", "survival", "animal_handling"],
"subclass_ids": ["pack_forged", "lone_fang"],
"starting_kit": [
{ "item_id": "rend_sword", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "chain_shirt", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "buckler", "qty": 1, "auto_equip": true, "equip_slot": "off_hand" },
{ "item_id": "healers_kit", "qty": 1, "auto_equip": false },
{ "item_id": "rations_predator", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["fighting_style", "claw_and_steel"] },
{ "level": 2, "prof": 2, "features": ["action_surge_1"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["extra_attack_2"] },
{ "level": 6, "prof": 3, "features": ["asi"] },
{ "level": 7, "prof": 3, "features": ["subclass_feature"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["indomitable_1"] },
{ "level": 10, "prof": 4, "features": ["subclass_feature"] },
{ "level": 11, "prof": 4, "features": ["extra_attack_3"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["indomitable_2"] },
{ "level": 14, "prof": 5, "features": ["asi"] },
{ "level": 15, "prof": 5, "features": ["subclass_feature"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["action_surge_2", "indomitable_3"] },
{ "level": 18, "prof": 6, "features": ["subclass_feature"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["extra_attack_4"] }
],
"feature_definitions": {
"fighting_style": { "name": "Fighting Style", "kind": "choice", "description": "Pick one combat style. Each gives a passive combat bonus.", "options": ["fang_and_blade", "shieldwall", "duelist", "great_weapon", "natural_predator"] },
"claw_and_steel": { "name": "Claw & Steel", "kind": "passive", "description": "Combine natural-weapon and manufactured-weapon attacks freely within a single Attack action — no other class can do this without specific permission." },
"action_surge_1": { "name": "Action Surge", "kind": "active", "uses_per_short_rest": 1, "description": "Once per short rest, take one additional action on your turn." },
"action_surge_2": { "name": "Action Surge (2/rest)", "kind": "active", "uses_per_short_rest": 2, "description": "Use Action Surge twice per short rest." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose a Fangsworn subclass: Pack-Forged or Lone Fang. (Phase 5: subclass mechanics deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature granted at this level. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase one ability score by 2, or two by 1 each. (Phase 5: deferred — character is locked at level 1.)" },
"extra_attack_2": { "name": "Extra Attack (2)", "kind": "passive", "description": "Two attacks per Attack action." },
"extra_attack_3": { "name": "Extra Attack (3)", "kind": "passive", "description": "Three attacks per Attack action." },
"extra_attack_4": { "name": "Extra Attack (4)", "kind": "passive", "description": "Four attacks per Attack action." },
"indomitable_1": { "name": "Indomitable", "kind": "active", "uses_per_long_rest": 1, "description": "Reroll a failed saving throw, once per long rest." },
"indomitable_2": { "name": "Indomitable (2/rest)", "kind": "active", "uses_per_long_rest": 2, "description": "Reroll a failed saving throw, twice per long rest." },
"indomitable_3": { "name": "Indomitable (3/rest)", "kind": "active", "uses_per_long_rest": 3, "description": "Reroll a failed saving throw, three times per long rest." }
}
},
{
"id": "bulwark",
"name": "Bulwark",
"hit_die": 12,
"primary_ability": ["CON"],
"saves": ["CON", "CHA"],
"armor_proficiencies": ["light", "medium", "heavy", "shields"],
"weapon_proficiencies": ["simple", "martial", "natural"],
"tool_proficiencies": [],
"skills_choose": 2,
"skill_options": ["athletics", "insight", "intimidation", "medicine", "perception"],
"subclass_ids": ["herd_wall", "antler_guard"],
"starting_kit": [
{ "item_id": "hoof_club", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "chain_mail", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "standard_shield", "qty": 1, "auto_equip": true, "equip_slot": "off_hand" },
{ "item_id": "healers_kit", "qty": 1, "auto_equip": false },
{ "item_id": "rations_predator", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["sentinel_stance", "guardians_mark"] },
{ "level": 2, "prof": 2, "features": ["shield_of_the_herd"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["extra_attack", "immovable_1"] },
{ "level": 6, "prof": 3, "features": ["subclass_feature"] },
{ "level": 7, "prof": 3, "features": ["guardians_aura_10"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["unbreakable_will"] },
{ "level": 10, "prof": 4, "features": ["subclass_feature"] },
{ "level": 11, "prof": 4, "features": ["improved_guardians_mark"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["guardians_aura_15"] },
{ "level": 14, "prof": 5, "features": ["asi"] },
{ "level": 15, "prof": 5, "features": ["subclass_feature"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["immovable_2"] },
{ "level": 18, "prof": 6, "features": ["guardians_aura_20"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["subclass_feature", "last_one_standing"] }
],
"feature_definitions": {
"sentinel_stance": { "name": "Sentinel Stance", "kind": "bonus_action", "description": "Bonus action: enter defensive stance. Speed halved, +2 AC, opportunity attacks at advantage. Ends if you move more than half speed or as a free action." },
"guardians_mark": { "name": "Guardian's Mark", "kind": "bonus_action", "description": "Bonus action: mark a creature within 30 ft. While marked, if it attacks anyone other than you, you may make a melee attack against it as a reaction (if in range)." },
"shield_of_the_herd": { "name": "Shield of the Herd", "kind": "reaction", "description": "Reaction: when an adjacent ally is targeted by an attack, become the target instead." },
"extra_attack": { "name": "Extra Attack", "kind": "passive", "description": "Two attacks per Attack action." },
"immovable_1": { "name": "Immovable", "kind": "reaction", "uses_per_long_rest": 1, "description": "Reaction: reduce incoming damage by 1d12 + CON. Once per long rest." },
"immovable_2": { "name": "Immovable (2/rest)", "kind": "reaction", "uses_per_long_rest": 2, "description": "Reaction: reduce incoming damage by 2d12 + CON. Twice per long rest." },
"guardians_aura_10": { "name": "Guardian's Aura (10 ft.)", "kind": "passive", "description": "Allies within 10 ft. gain +1 to all saves while you are conscious." },
"guardians_aura_15": { "name": "Guardian's Aura (15 ft.)", "kind": "passive", "description": "Aura range increases to 15 ft." },
"guardians_aura_20": { "name": "Guardian's Aura (20 ft.)", "kind": "passive", "description": "Aura range increases to 20 ft." },
"unbreakable_will": { "name": "Unbreakable Will", "kind": "passive", "description": "Immune to the frightened condition." },
"improved_guardians_mark":{ "name": "Improved Guardian's Mark", "kind": "passive", "description": "Marked creatures also have disadvantage on attacks against creatures other than you." },
"last_one_standing": { "name": "Last One Standing", "kind": "active", "uses_per_long_rest": 1, "description": "When every other allied creature within 60 ft. is at 0 HP or has fled: resistance to all damage, advantage on all attacks and saves, Mark applies to all hostile creatures simultaneously. 1 minute." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose a Bulwark subclass: Herd-Wall or Antler-Guard. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature granted at this level. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
},
{
"id": "feral",
"name": "Feral",
"hit_die": 12,
"primary_ability": ["STR", "CON"],
"saves": ["STR", "CON"],
"armor_proficiencies": ["light", "medium"],
"weapon_proficiencies": ["simple", "natural"],
"tool_proficiencies": [],
"skills_choose": 2,
"skill_options": ["athletics", "intimidation", "nature", "perception", "survival"],
"subclass_ids": ["blood_memory", "stampede_heart"],
"starting_kit": [
{ "item_id": "paw_axe", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "hide_vest", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "healers_kit", "qty": 1, "auto_equip": false },
{ "item_id": "rations_predator", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["feral_rage_2", "unarmored_defense"] },
{ "level": 2, "prof": 2, "features": ["ancestral_sense", "reckless_attack"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["extra_attack", "fast_movement"] },
{ "level": 6, "prof": 3, "features": ["subclass_feature"] },
{ "level": 7, "prof": 3, "features": ["instinct_awareness"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["feral_rage_3", "brutal_critical_1"] },
{ "level": 10, "prof": 4, "features": ["subclass_feature"] },
{ "level": 11, "prof": 4, "features": ["relentless_rage"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["brutal_critical_2"] },
{ "level": 14, "prof": 5, "features": ["subclass_feature"] },
{ "level": 15, "prof": 5, "features": ["persistent_rage"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["feral_rage_4", "brutal_critical_3"] },
{ "level": 18, "prof": 6, "features": ["indomitable_instinct"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["apex"] }
],
"feature_definitions": {
"feral_rage_2": { "name": "Feral Rage", "kind": "bonus_action", "uses_per_long_rest": 2, "description": "Bonus action to enter rage. Advantage on STR checks/saves, +2 melee damage (scales), resistance to bludgeoning/piercing/slashing, no concentration. 1 minute or until you choose to end it." },
"feral_rage_3": { "name": "Feral Rage (3/rest)", "kind": "bonus_action", "uses_per_long_rest": 3, "description": "Same as Feral Rage; +3 damage. Three uses per long rest." },
"feral_rage_4": { "name": "Feral Rage (4/rest)", "kind": "bonus_action", "uses_per_long_rest": 4, "description": "Same as Feral Rage; +4 damage. Four uses per long rest." },
"unarmored_defense": { "name": "Unarmored Defense", "kind": "passive", "description": "When wearing no armor, AC = 10 + DEX + CON." },
"ancestral_sense": { "name": "Ancestral Sense", "kind": "passive", "description": "While raging: advantage on Perception, cannot be surprised, scent-blindsight 10 ft." },
"reckless_attack": { "name": "Reckless Attack", "kind": "active", "description": "On your turn: advantage on melee attacks, but all attacks against you have advantage until your next turn." },
"extra_attack": { "name": "Extra Attack", "kind": "passive", "description": "Two attacks per Attack action." },
"fast_movement": { "name": "Fast Movement", "kind": "passive", "description": "+10 ft. movement while not wearing heavy armor." },
"instinct_awareness": { "name": "Instinct Awareness", "kind": "passive", "description": "Add WIS modifier to initiative rolls." },
"brutal_critical_1": { "name": "Brutal Critical (1 die)", "kind": "passive", "description": "Roll one additional damage die on critical hits." },
"brutal_critical_2": { "name": "Brutal Critical (2 dice)", "kind": "passive", "description": "Roll two additional damage dice on critical hits." },
"brutal_critical_3": { "name": "Brutal Critical (3 dice)", "kind": "passive", "description": "Roll three additional damage dice on critical hits." },
"relentless_rage": { "name": "Relentless Rage", "kind": "active", "description": "If you drop to 0 HP while raging, CON save (DC 10, increasing by 5 each time per rage). On success, drop to 1 HP." },
"persistent_rage": { "name": "Persistent Rage", "kind": "passive", "description": "Rage only ends when you choose or are unconscious. Nothing else stops it." },
"indomitable_instinct":{ "name": "Indomitable Instinct", "kind": "passive", "description": "If your total for a STR or CON check is less than your ability score, use the ability score instead." },
"apex": { "name": "Apex Predator / Apex Prey", "kind": "passive", "description": "Capstone — variant by predator/prey clade." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose Blood Memory or Stampede Heart. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
},
{
"id": "shadow_pelt",
"name": "Shadow-Pelt",
"hit_die": 8,
"primary_ability": ["DEX"],
"saves": ["DEX", "INT"],
"armor_proficiencies": ["light"],
"weapon_proficiencies": ["simple", "hand_crossbow", "short_sword", "rapier", "natural"],
"tool_proficiencies": ["thieves_tools"],
"skills_choose": 4,
"skill_options": ["acrobatics", "athletics", "deception", "insight", "intimidation", "investigation", "perception", "persuasion", "sleight_of_hand", "stealth"],
"subclass_ids": ["noseblind", "ambush_artist"],
"starting_kit": [
{ "item_id": "thorn_blade", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "studded_leather", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "claw_bow", "qty": 1, "auto_equip": false },
{ "item_id": "poultice_universal","qty": 2, "auto_equip": false },
{ "item_id": "scent_mask_basic", "qty": 1, "auto_equip": false },
{ "item_id": "rations_predator", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["expertise_2", "sneak_attack_1d6", "scent_discipline"] },
{ "level": 2, "prof": 2, "features": ["cunning_action"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["sneak_attack_3d6", "uncanny_dodge"] },
{ "level": 6, "prof": 3, "features": ["expertise_2_more"] },
{ "level": 7, "prof": 3, "features": ["evasion", "subclass_feature"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["sneak_attack_5d6"] },
{ "level": 10, "prof": 4, "features": ["asi"] },
{ "level": 11, "prof": 4, "features": ["reliable_talent", "subclass_feature"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["sneak_attack_7d6"] },
{ "level": 14, "prof": 5, "features": ["scent_ghost"] },
{ "level": 15, "prof": 5, "features": ["subclass_feature"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["sneak_attack_9d6"] },
{ "level": 18, "prof": 6, "features": ["elusive"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["kill_shot"] }
],
"feature_definitions": {
"expertise_2": { "name": "Expertise (2)", "kind": "passive", "description": "Double proficiency bonus for 2 proficient skills." },
"expertise_2_more": { "name": "Expertise (2 more)", "kind": "passive", "description": "Choose 2 more proficient skills to gain expertise." },
"sneak_attack_1d6": { "name": "Sneak Attack (1d6)", "kind": "passive", "description": "Once per turn, +1d6 damage on an attack with advantage or when an ally is within 5 ft. of the target." },
"sneak_attack_3d6": { "name": "Sneak Attack (3d6)", "kind": "passive", "description": "Sneak Attack damage scales to 3d6." },
"sneak_attack_5d6": { "name": "Sneak Attack (5d6)", "kind": "passive", "description": "Sneak Attack damage scales to 5d6." },
"sneak_attack_7d6": { "name": "Sneak Attack (7d6)", "kind": "passive", "description": "Sneak Attack damage scales to 7d6." },
"sneak_attack_9d6": { "name": "Sneak Attack (9d6)", "kind": "passive", "description": "Sneak Attack damage scales to 9d6." },
"scent_discipline": { "name": "Scent Discipline", "kind": "passive", "description": "Advantage on checks to suppress emotional scent leakage. Creatures with scent abilities must beat your DEX (Stealth) with their WIS (Perception) to read your emotional state." },
"cunning_action": { "name": "Cunning Action", "kind": "bonus_action", "description": "Bonus action: Dash, Disengage, or Hide." },
"uncanny_dodge": { "name": "Uncanny Dodge", "kind": "reaction", "description": "Reaction: halve damage from an attack you can see." },
"evasion": { "name": "Evasion", "kind": "passive", "description": "DEX saves for half damage become no damage on success, half on failure." },
"reliable_talent": { "name": "Reliable Talent", "kind": "passive", "description": "Skill rolls below 10 with proficiency are treated as 10." },
"scent_ghost": { "name": "Scent Ghost", "kind": "active", "uses_per_long_rest": 1, "description": "Suppress natural scent for 1 hour or project a false clade scent. Once per long rest." },
"elusive": { "name": "Elusive", "kind": "passive", "description": "No attack roll has advantage against you while you're conscious." },
"kill_shot": { "name": "Kill Shot", "kind": "active", "uses_per_short_rest": 1, "description": "When Sneak Attack hits, force CON save (DC = 8 + prof + DEX). On failure, double the damage." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose Noseblind or Ambush Artist. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
},
{
"id": "scent_broker",
"name": "Scent-Broker",
"hit_die": 8,
"primary_ability": ["WIS"],
"saves": ["WIS", "CHA"],
"armor_proficiencies": ["light"],
"weapon_proficiencies": ["simple", "natural"],
"tool_proficiencies": ["alchemists_supplies", "perfumers_kit"],
"skills_choose": 3,
"skill_options": ["deception", "insight", "investigation", "medicine", "perception", "persuasion", "stealth"],
"subclass_ids": ["perfumer", "tracker"],
"starting_kit": [
{ "item_id": "fang_knife", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "leather_harness", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "pheromone_vial_calm", "qty": 2, "auto_equip": false },
{ "item_id": "pheromone_vial_fear", "qty": 2, "auto_equip": false },
{ "item_id": "scent_mask_basic", "qty": 2, "auto_equip": false },
{ "item_id": "rations_prey", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["scent_literacy", "nose_for_lies"] },
{ "level": 2, "prof": 2, "features": ["pheromone_craft_2"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["deep_reading", "pheromone_craft_3"] },
{ "level": 6, "prof": 3, "features": ["subclass_feature"] },
{ "level": 7, "prof": 3, "features": ["scent_ward"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["pheromone_craft_4"] },
{ "level": 10, "prof": 4, "features": ["subclass_feature"] },
{ "level": 11, "prof": 4, "features": ["master_nose"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["pheromone_craft_5"] },
{ "level": 14, "prof": 5, "features": ["subclass_feature"] },
{ "level": 15, "prof": 5, "features": ["scent_immunity"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["grand_synthesis"] },
{ "level": 18, "prof": 6, "features": ["subclass_feature"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["olfactory_omniscience"] }
],
"feature_definitions": {
"scent_literacy": { "name": "Scent Literacy", "kind": "active", "description": "Action: read clade, emotional state, general health, and scent-mask presence on a creature within 30 ft. Detailed reads need a WIS check." },
"nose_for_lies": { "name": "Nose for Lies", "kind": "passive", "description": "When a creature within 15 ft. lies, you detect the scent shift automatically (no check). Doesn't work on creatures without mammalian scent biology." },
"pheromone_craft_2": { "name": "Pheromone Craft (2/rest)", "kind": "active", "uses_per_short_rest": 2, "description": "During a short rest, craft pheromone compounds (calm, fear, trust, mask, alert, desire). 2 uses per rest." },
"pheromone_craft_3": { "name": "Pheromone Craft (3/rest)", "kind": "active", "uses_per_short_rest": 3, "description": "3 compounds per rest." },
"pheromone_craft_4": { "name": "Pheromone Craft (4/rest)", "kind": "active", "uses_per_short_rest": 4, "description": "4 compounds per rest." },
"pheromone_craft_5": { "name": "Pheromone Craft (5/rest)", "kind": "active", "uses_per_short_rest": 5, "description": "5 compounds per rest." },
"deep_reading": { "name": "Deep Reading", "kind": "passive", "description": "Scent Literacy range extends to 60 ft. Detect recent locations, recent contacts, and substances consumed." },
"scent_ward": { "name": "Scent Ward", "kind": "active", "description": "Mask scent profiles of self + 5 allies for 8 hours (10 minutes prep)." },
"master_nose": { "name": "Master Nose", "kind": "passive", "description": "Scent range 120 ft. Track by scent (advantage on Survival). Detect invisible creatures within 30 ft. by scent." },
"scent_immunity": { "name": "Scent Immunity", "kind": "passive", "description": "Immune to scent-based effects (pheromone attacks, fear-scent, arousal-scent)." },
"grand_synthesis": { "name": "Grand Synthesis", "kind": "passive", "description": "Combine two Pheromone Craft effects into a single compound. Compound DCs +2." },
"olfactory_omniscience":{ "name": "Olfactory Omniscience", "kind": "passive", "description": "Cannot be surprised. Know exact location, clade, emotion, and health of every creature within 120 ft. Permanent ID after one encounter." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose Perfumer or Tracker. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
},
{
"id": "covenant_keeper",
"name": "Covenant-Keeper",
"hit_die": 10,
"primary_ability": ["CHA"],
"saves": ["WIS", "CHA"],
"armor_proficiencies": ["light", "medium", "heavy", "shields"],
"weapon_proficiencies": ["simple", "martial", "natural"],
"tool_proficiencies": [],
"skills_choose": 2,
"skill_options": ["athletics", "insight", "intimidation", "medicine", "persuasion", "religion"],
"subclass_ids": ["the_warden", "the_bridge"],
"starting_kit": [
{ "item_id": "rend_sword", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "chain_shirt", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "standard_shield", "qty": 1, "auto_equip": true, "equip_slot": "off_hand" },
{ "item_id": "healers_kit", "qty": 1, "auto_equip": false },
{ "item_id": "rations_predator", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["covenant_sense", "lay_on_paws"] },
{ "level": 2, "prof": 2, "features": ["fighting_style", "covenants_authority_2"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["extra_attack"] },
{ "level": 6, "prof": 3, "features": ["aura_of_the_covenant_10"] },
{ "level": 7, "prof": 3, "features": ["subclass_feature"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["covenants_authority_3"] },
{ "level": 10, "prof": 4, "features": ["aura_of_courage_10"] },
{ "level": 11, "prof": 4, "features": ["improved_covenant_strike"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["covenants_authority_4"] },
{ "level": 14, "prof": 5, "features": ["cleansing_touch"] },
{ "level": 15, "prof": 5, "features": ["subclass_feature"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["covenants_authority_5"] },
{ "level": 18, "prof": 6, "features": ["aura_30"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["subclass_feature"] }
],
"feature_definitions": {
"covenant_sense": { "name": "Covenant Sense", "kind": "passive", "description": "Detect Covenant violations within 60 ft. — active predation, consumption of sentient flesh, rawfang activity." },
"lay_on_paws": { "name": "Lay on Paws", "kind": "active", "description": "Pool of healing equal to CHA × 5. Action: touch a creature and restore HP from the pool. 5 points cures one disease or neutralizes one poison. Replenishes on long rest." },
"fighting_style": { "name": "Fighting Style", "kind": "choice", "description": "Pick a combat style.", "options": ["defense", "protection", "great_weapon"] },
"covenants_authority_2":{ "name": "Covenant's Authority (2/rest)", "kind": "active", "uses_per_long_rest": 2, "description": "Action: present authority. Compel Truth, Rebuke Predation, or Shield the Innocent. 2 uses per long rest." },
"covenants_authority_3":{ "name": "Covenant's Authority (3/rest)", "kind": "active", "uses_per_long_rest": 3, "description": "3 uses per long rest." },
"covenants_authority_4":{ "name": "Covenant's Authority (4/rest)", "kind": "active", "uses_per_long_rest": 4, "description": "4 uses per long rest." },
"covenants_authority_5":{ "name": "Covenant's Authority (5/rest)", "kind": "active", "uses_per_long_rest": 5, "description": "5 uses per long rest." },
"extra_attack": { "name": "Extra Attack", "kind": "passive", "description": "Two attacks per Attack action." },
"aura_of_the_covenant_10":{ "name": "Aura of the Covenant (10 ft.)", "kind": "passive", "description": "You and friendly creatures within 10 ft. add CHA mod to saving throws." },
"aura_of_courage_10": { "name": "Aura of Courage (10 ft.)", "kind": "passive", "description": "You and friendly creatures within 10 ft. are immune to frightened." },
"aura_30": { "name": "Aura Improvements (30 ft.)", "kind": "passive", "description": "All auras extend to 30 ft." },
"improved_covenant_strike":{ "name": "Improved Covenant Strike", "kind": "passive", "description": "Melee attacks deal +1d8 damage against creatures actively violating the Covenant." },
"cleansing_touch": { "name": "Cleansing Touch", "kind": "active", "description": "Action: end one negative condition or effect on a creature you touch. Uses equal to CHA mod per long rest." },
"subclass_select": { "name": "Oath Selection", "kind": "stub", "description": "Choose The Warden or The Bridge. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Oath Feature", "kind": "stub", "description": "Oath-specific feature. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
},
{
"id": "muzzle_speaker",
"name": "Muzzle-Speaker",
"hit_die": 8,
"primary_ability": ["CHA"],
"saves": ["DEX", "CHA"],
"armor_proficiencies": ["light"],
"weapon_proficiencies": ["simple", "natural"],
"tool_proficiencies": ["musical_instrument", "musical_instrument_2", "musical_instrument_3"],
"skills_choose": 3,
"skill_options": ["acrobatics", "animal_handling", "arcana", "athletics", "deception", "history", "insight", "intimidation", "investigation", "medicine", "nature", "perception", "performance", "persuasion", "religion", "sleight_of_hand", "stealth", "survival"],
"subclass_ids": ["warhorn", "whisperfur"],
"starting_kit": [
{ "item_id": "fang_knife", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "studded_leather", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "poultice_universal","qty": 2, "auto_equip": false },
{ "item_id": "rations_predator", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["vocalization_dice_d6", "polyglot"] },
{ "level": 2, "prof": 2, "features": ["jack_of_all_trades", "song_of_rest_d6"] },
{ "level": 3, "prof": 2, "features": ["subclass_select", "expertise_2"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["vocalization_dice_d8", "font_of_inspiration"] },
{ "level": 6, "prof": 3, "features": ["subclass_feature", "counter_vocalization"] },
{ "level": 7, "prof": 3, "features": ["song_of_rest_d8"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["vocalization_dice_d10"] },
{ "level": 10, "prof": 4, "features": ["expertise_2_more"] },
{ "level": 11, "prof": 4, "features": ["subclass_feature"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["song_of_rest_d10"] },
{ "level": 14, "prof": 5, "features": ["subclass_feature"] },
{ "level": 15, "prof": 5, "features": ["vocalization_dice_d12"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["song_of_rest_d12"] },
{ "level": 18, "prof": 6, "features": ["superior_inspiration"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["voice_of_the_world"] }
],
"feature_definitions": {
"vocalization_dice_d6": { "name": "Vocalization Dice (d6, 4/rest)", "kind": "bonus_action", "uses_per_long_rest": 4, "description": "Bonus action: expend a die to aid an ally within 60 ft.; they add the result to one attack/check/save within 10 minutes. d6 at level 1." },
"vocalization_dice_d8": { "name": "Vocalization Dice (d8)", "kind": "bonus_action", "description": "Vocalization Dice scale to d8." },
"vocalization_dice_d10": { "name": "Vocalization Dice (d10)", "kind": "bonus_action", "description": "Vocalization Dice scale to d10." },
"vocalization_dice_d12": { "name": "Vocalization Dice (d12)", "kind": "bonus_action", "description": "Vocalization Dice scale to d12." },
"polyglot": { "name": "Polyglot", "kind": "passive", "description": "Speak, read, write Common plus all Clade languages. Approximate subsonic and ultrasonic components imperfectly." },
"jack_of_all_trades": { "name": "Jack of All Trades", "kind": "passive", "description": "Add half proficiency to checks you're not proficient in." },
"song_of_rest_d6": { "name": "Song of Rest (d6)", "kind": "passive", "description": "During short rest, allies who hear you regain additional HP (d6 at level 2)." },
"song_of_rest_d8": { "name": "Song of Rest (d8)", "kind": "passive", "description": "Song of Rest scales to d8." },
"song_of_rest_d10": { "name": "Song of Rest (d10)", "kind": "passive", "description": "Song of Rest scales to d10." },
"song_of_rest_d12": { "name": "Song of Rest (d12)", "kind": "passive", "description": "Song of Rest scales to d12." },
"expertise_2": { "name": "Expertise (2)", "kind": "passive", "description": "Double proficiency bonus for 2 chosen proficient skills." },
"expertise_2_more": { "name": "Expertise (2 more)", "kind": "passive", "description": "Choose 2 more proficient skills for expertise." },
"font_of_inspiration": { "name": "Font of Inspiration", "kind": "passive", "description": "Vocalization Dice recharge on short rest." },
"counter_vocalization": { "name": "Counter-Vocalization", "kind": "reaction", "description": "Reaction: when a creature within 60 ft. uses a vocalization-based ability, expend a die to attempt to counter (CHA check vs. theirs)." },
"superior_inspiration": { "name": "Superior Inspiration", "kind": "passive", "description": "When you roll initiative with no dice remaining, regain one." },
"voice_of_the_world": { "name": "Voice of the World", "kind": "active", "uses_per_long_rest": 1, "description": "Speak one sentence understood perfectly by every sentient creature within 300 ft., regardless of language or deafness. Once per long rest." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose Warhorn or Whisperfur. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
},
{
"id": "claw_wright",
"name": "Claw-Wright",
"hit_die": 8,
"primary_ability": ["INT"],
"saves": ["INT", "CON"],
"armor_proficiencies": ["light", "medium", "shields"],
"weapon_proficiencies": ["simple", "natural", "firearms"],
"tool_proficiencies": ["tinkers_tools", "artisans_tools", "artisans_tools_2"],
"skills_choose": 3,
"skill_options": ["arcana", "investigation", "medicine", "nature", "perception", "sleight_of_hand"],
"subclass_ids": ["combat_engineer", "body_wright"],
"starting_kit": [
{ "item_id": "hoof_club", "qty": 1, "auto_equip": true, "equip_slot": "main_hand" },
{ "item_id": "studded_leather", "qty": 1, "auto_equip": true, "equip_slot": "body" },
{ "item_id": "buckler", "qty": 1, "auto_equip": true, "equip_slot": "off_hand" },
{ "item_id": "healers_kit", "qty": 1, "auto_equip": false },
{ "item_id": "rope_claw_braid", "qty": 1, "auto_equip": false },
{ "item_id": "rations_prey", "qty": 5, "auto_equip": false }
],
"level_table": [
{ "level": 1, "prof": 2, "features": ["adaptive_crafting", "field_repair"] },
{ "level": 2, "prof": 2, "features": ["gadget_pool_2"] },
{ "level": 3, "prof": 2, "features": ["subclass_select"] },
{ "level": 4, "prof": 2, "features": ["asi"] },
{ "level": 5, "prof": 3, "features": ["extra_attack", "gadget_pool_3"] },
{ "level": 6, "prof": 3, "features": ["subclass_feature", "tool_expertise"] },
{ "level": 7, "prof": 3, "features": ["flash_of_genius"] },
{ "level": 8, "prof": 3, "features": ["asi"] },
{ "level": 9, "prof": 4, "features": ["gadget_pool_4"] },
{ "level": 10, "prof": 4, "features": ["subclass_feature"] },
{ "level": 11, "prof": 4, "features": ["reliable_engineering"] },
{ "level": 12, "prof": 4, "features": ["asi"] },
{ "level": 13, "prof": 5, "features": ["gadget_pool_5"] },
{ "level": 14, "prof": 5, "features": ["subclass_feature"] },
{ "level": 15, "prof": 5, "features": ["superior_gadgets"] },
{ "level": 16, "prof": 5, "features": ["asi"] },
{ "level": 17, "prof": 6, "features": ["gadget_pool_6"] },
{ "level": 18, "prof": 6, "features": ["subclass_feature"] },
{ "level": 19, "prof": 6, "features": ["asi"] },
{ "level": 20, "prof": 6, "features": ["master_wright"] }
],
"feature_definitions": {
"adaptive_crafting": { "name": "Adaptive Crafting", "kind": "passive", "description": "Modify any tool, weapon, or equipment to function for a different Clade's body type during a short rest. Modified items grant +1 to relevant checks for the intended species." },
"field_repair": { "name": "Field Repair", "kind": "active", "description": "Action: restore 1d8 + INT HP to a construct or repair a broken object/mechanism. On creatures: emergency medical treatment — stabilize, splint, suture." },
"gadget_pool_2": { "name": "Gadget Pool (2)", "kind": "passive", "description": "Long rest: create gadgets. 2 active at a time at level 2." },
"gadget_pool_3": { "name": "Gadget Pool (3)", "kind": "passive", "description": "3 active gadgets." },
"gadget_pool_4": { "name": "Gadget Pool (4)", "kind": "passive", "description": "4 active gadgets." },
"gadget_pool_5": { "name": "Gadget Pool (5)", "kind": "passive", "description": "5 active gadgets." },
"gadget_pool_6": { "name": "Gadget Pool (6)", "kind": "passive", "description": "6 active gadgets." },
"extra_attack": { "name": "Extra Attack", "kind": "passive", "description": "Two attacks per Attack action." },
"tool_expertise": { "name": "Tool Expertise", "kind": "passive", "description": "Double proficiency with all tools you're proficient in." },
"flash_of_genius": { "name": "Flash of Genius", "kind": "reaction", "description": "Reaction: when you or a creature within 30 ft. makes a check or save, add INT mod to the roll. Uses equal to INT mod per long rest." },
"reliable_engineering":{ "name": "Reliable Engineering", "kind": "passive", "description": "Gadget save DCs +2. Damaging gadgets add INT mod." },
"superior_gadgets": { "name": "Superior Gadgets", "kind": "passive", "description": "Unlock advanced gadget tier; existing gadgets gain enhanced effects." },
"master_wright": { "name": "Master Wright", "kind": "active", "description": "Long rest: create one Masterwork item. Permanent, fits any Clade, +3 to relevant checks. Maintain up to 3." },
"subclass_select": { "name": "Subclass Selection", "kind": "stub", "description": "Choose Combat Engineer or Body-Wright. (Phase 5: deferred.)" },
"subclass_feature": { "name": "Subclass Feature", "kind": "stub", "description": "Subclass-specific feature. (Phase 5: deferred.)" },
"asi": { "name": "Ability Score Improvement", "kind": "stub", "description": "Increase ability scores. (Phase 5: deferred.)" }
}
}
]
+83
View File
@@ -0,0 +1,83 @@
{
"id": "generic_guard",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "Halt. State your business in {npc.role}.",
"options": [
{ "text": "Just passing through. Travelling to learn the country.", "next": "passes" },
{
"text": "I'm here on business with the magistrate.",
"next": "passes",
"conditions": [
{ "kind": "rep_at_least", "faction": "covenant_enforcers", "value": 0 }
]
},
{
"text": "[Persuasion DC 13] Come now, friend — do I look like trouble?",
"skill_check": { "skill": "persuasion", "dc": 13 },
"next_on_success": "passes_warmly",
"next_on_failure": "guard_suspicious",
"effects_on_success": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": 2, "faction": "covenant_enforcers", "note": "smooth talker" } }
]
},
{
"text": "[Intimidate DC 16] Stand aside.",
"skill_check": { "skill": "intimidation", "dc": 16 },
"next_on_success": "guard_steps_aside",
"next_on_failure": "guard_calls_for_help",
"effects_on_success": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -3, "faction": "covenant_enforcers", "note": "intimidated a guard" } }
],
"effects_on_failure": [
{ "kind": "rep_event", "event": { "kind": "Crime", "magnitude": -8, "faction": "covenant_enforcers", "note": "tried to bully a guard" } }
]
},
{ "text": "Apologies. Goodbye.", "next": "<end>" }
]
},
{
"id": "passes",
"speaker": "npc",
"text": "On your way then. Mind the curfew. Stranger faces have come through this season; we're keeping count.",
"options": [
{ "text": "Thank you.", "next": "<end>" }
]
},
{
"id": "passes_warmly",
"speaker": "npc",
"text": "Hah — alright, alright, on with you. Mind yourself out there.",
"options": [
{ "text": "Thank you, friend.", "next": "<end>" }
]
},
{
"id": "guard_suspicious",
"speaker": "npc",
"text": "Mm. I'll be remembering your face. Move along.",
"options": [
{ "text": "Thank you.", "next": "<end>" }
]
},
{
"id": "guard_steps_aside",
"speaker": "npc",
"text": "(They step aside, jaw tight.) Pass. Don't make me regret it.",
"options": [
{ "text": "(Walk past.)", "next": "<end>" }
]
},
{
"id": "guard_calls_for_help",
"speaker": "npc",
"text": "(They reach for a whistle.) That's enough. Constable! Constable, here!",
"options": [
{ "text": "(Back away.)", "next": "<end>" }
]
}
]
}
@@ -0,0 +1,109 @@
{
"id": "generic_merchant",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "{disposition_label} face today. What brings you to my counter, friend?",
"options": [
{
"text": "Show me what you have for sale.",
"next": "shop_open",
"effects": [{ "kind": "open_shop" }]
},
{
"text": "What's the news?",
"next": "lore"
},
{
"text": "[Persuasion DC 12] Surely a regular customer earns better prices?",
"skill_check": { "skill": "persuasion", "dc": 12 },
"next_on_success": "shopkeeper_warmed",
"next_on_failure": "shopkeeper_unmoved",
"effects_on_success": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": 2, "note": "polite haggle" } }
],
"effects_on_failure": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -1, "note": "weak pitch" } }
]
},
{
"text": "[Intimidate DC 14] Discount, or I tell people about the rats in your stockroom.",
"skill_check": { "skill": "intimidation", "dc": 14 },
"next_on_success": "shopkeeper_caves",
"next_on_failure": "shopkeeper_dismisses",
"conditions": [
{ "kind": "not_has_flag", "flag": "intimidation_used_at_npc" }
],
"effects_on_success": [
{ "kind": "set_flag", "flag": "shopkeeper_intimidated" },
{ "kind": "set_flag", "flag": "intimidation_used_at_npc" }
],
"effects_on_failure": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -3, "note": "tried to bully" } },
{ "kind": "set_flag", "flag": "intimidation_used_at_npc" }
]
},
{
"text": "Goodbye.",
"next": "<end>"
}
]
},
{
"id": "shop_open",
"speaker": "npc",
"text": "Take a look. Quality goods, fair prices.",
"options": [
{ "text": "[Browse]", "next": "intro", "effects": [{ "kind": "open_shop" }] },
{ "text": "Actually, never mind.", "next": "intro" }
]
},
{
"id": "lore",
"speaker": "npc",
"text": "Times are uneasy. Rumours of strange scents on the wind. Travellers come through asking after old names. Don't ask me which. I trade in goods, not gossip. (Well — mostly.)",
"options": [
{ "text": "Back to business.", "next": "intro" },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "shopkeeper_warmed",
"speaker": "npc",
"text": "Hah. You've a tongue, that's certain. Tell you what — pick something out, I'll knock a bit off.",
"options": [
{ "text": "Show me what you have.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "shopkeeper_unmoved",
"speaker": "npc",
"text": "Heard better lines from the rats in my stockroom. Prices are prices.",
"options": [
{ "text": "Show me what you have anyway.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "shopkeeper_caves",
"speaker": "npc",
"text": "Easy. Easy. There's no need for that. Tell you what — take a look, I'll be reasonable.",
"options": [
{ "text": "Show me what you have.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "shopkeeper_dismisses",
"speaker": "npc",
"text": "I've heard better threats from a wet matchstick. Buy something or get out.",
"options": [
{ "text": "Show me what you have.", "next": "shop_open", "effects": [{ "kind": "open_shop" }] },
{ "text": "Goodbye.", "next": "<end>" }
]
}
]
}
@@ -0,0 +1,62 @@
{
"id": "generic_villager",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "Stranger. You're a {disposition_label} sort, far as I can tell. What's on your mind?",
"options": [
{ "text": "What's it like living here?", "next": "lore_town" },
{ "text": "Heard any unusual news?", "next": "lore_news" },
{
"text": "[Insight DC 12] Are you well? You seem distracted.",
"skill_check": { "skill": "insight", "dc": 12 },
"next_on_success": "villager_confides",
"next_on_failure": "villager_brushes_off",
"effects_on_success": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": 2, "note": "noticed unease" } }
]
},
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "lore_town",
"speaker": "npc",
"text": "Quiet, mostly. We mind our pasture, the constable minds the road, magistrate minds the rest. Used to be quieter still, before the news started.",
"options": [
{ "text": "What news?", "next": "lore_news" },
{ "text": "Back.", "next": "intro" }
]
},
{
"id": "lore_news",
"speaker": "npc",
"text": "Travellers from west of here, asking after old names. Strange scents some mornings. Constable's twitchy. We don't talk about it much. You shouldn't either.",
"options": [
{ "text": "Thanks.", "next": "intro" },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "villager_confides",
"speaker": "npc",
"text": "(Quietly.) You've got an eye on you. Two days back, neighbours saw a coyote-folk on the road who didn't smell right — like a city perfume but ten years stale. Made my fur stand up.",
"options": [
{ "text": "Did you tell the constable?", "next": "intro",
"effects": [{ "kind": "set_flag", "flag": "villager_warned_about_coyote" }] },
{ "text": "Stay safe. Goodbye.", "next": "<end>" }
]
},
{
"id": "villager_brushes_off",
"speaker": "npc",
"text": "Nothing wrong. Long day, that's all.",
"options": [
{ "text": "Back.", "next": "intro" },
{ "text": "Goodbye.", "next": "<end>" }
]
}
]
}
@@ -0,0 +1,74 @@
{
"id": "millhaven_constable",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "\"Constable Aldous Fenn. Magistrate told me to expect you.\"\n\nThe coyote-folk constable has the worn calm of someone who has already had two long days this week. His Covenant brassard is impeccable; his cuffs are not. \"I'm sorry for your loss. Anything you need from the office, you ask me first.\"",
"options": [
{ "text": "Show me your file on my parents.", "next": "case_file" },
{ "text": "What's the Old Howl mine?", "next": "old_howl" },
{ "text": "I heard there's some kind of dispute on the south fence.", "next": "fence_dispute" },
{ "text": "I'll come back later.", "next": "<end>" }
]
},
{
"id": "case_file",
"speaker": "npc",
"text": "He pulls a thin folder. \"Open-field rawfang attack. No witnesses, no print pattern, no one missing from the local population. I closed it as such. Magistrate disagreed. He didn't tell me what he disagreed with.\"\n\nA pause. \"If you find something my eyes missed, I want to know. I'd rather rewrite a closed case than work the wrong one.\"",
"options": [
{ "text": "I will. Thank you.", "next": "intro" },
{ "text": "Why didn't the magistrate tell you?", "next": "magistrate_split" }
]
},
{
"id": "magistrate_split",
"speaker": "npc",
"text": "He almost smiles. \"Because the magistrate is older than me, and he learned policing in a generation that didn't trust paperwork. He's careful with what he writes down. I am too, when I have to be.\"",
"options": [
{ "text": "Understood.", "next": "intro" }
]
},
{
"id": "old_howl",
"speaker": "npc",
"text": "\"Collapsed mine, due south. Used to ship copper. The shaft fell in fifty years ago. Officially closed. Unofficially, somebody's been camping in the entrance — campfire ash and a path beaten in the brush. Brigands, I expect. Take care if you go.\"",
"options": [
{ "text": "Brigands? On their own, this close to town?", "next": "brigand_concern" },
{ "text": "Good to know.", "next": "intro" }
]
},
{
"id": "brigand_concern",
"speaker": "npc",
"text": "\"On their own, no. Some of them work to a contract. I would like to know who pays for camp ash this close to town. If you find out and choose to tell me, the office will remember.\"",
"options": [
{ "text": "I'll look.", "next": "intro" }
]
},
{
"id": "fence_dispute",
"speaker": "npc",
"text": "\"Cervid farmer named Mira and a Canid rancher named Voss. Same fence line for thirty years. This summer it became a war. Both sides are right about something. Neither will speak to me without the other in the room. I am very tired of fences.\"\n\n\"If you can mediate, I will accept any honest outcome.\"",
"options": [
{
"text": "I'll go talk to them.",
"next": "fence_accept",
"effects": [
{ "kind": "start_quest", "quest": "side_act_i_fence_lines" }
]
},
{ "text": "Not my problem.", "next": "intro" }
]
},
{
"id": "fence_accept",
"speaker": "npc",
"text": "\"Mira's farm is the second left out the south gate. Voss runs his herd along the eastern ridge. Pick a side, pick a compromise — I'll back any solution that holds for a season.\"",
"options": [
{ "text": "Understood.", "next": "<end>" }
]
}
]
}
@@ -0,0 +1,122 @@
{
"id": "millhaven_grandmother_asha",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "\"Sit, sit. The chair likes company.\"\n\nGrandmother Asha is a wolf-folk older than the timbers of her cottage. Her eyes are pale and watchful. A small fire burns even in the warm hour. \"You smell like a long road, child. What pulls you to this old door?\"",
"options": [
{ "text": "I'm here about my parents.", "next": "parents" },
{ "text": "The magistrate said you'd know things about Millhaven.", "next": "lore" },
{
"text": "[Has Briarstead Journal] My parents kept this journal. Did you know them?",
"conditions": [{ "kind": "has_item", "id": "briarstead_journal" }],
"next": "journal_recognised"
},
{ "text": "I should be on my way.", "next": "<end>" }
]
},
{
"id": "parents",
"speaker": "npc",
"text": "\"I knew them when the millpond still froze every winter. Quiet people. Good with chemistry. Your mother could tell a forged Pheromone from a real one before the salesman finished his pitch.\" Her ears flatten briefly. \"They were not killed by a wild thing. I have walked this country my whole life. I know what a real rawfang scent leaves on the wind.\"",
"options": [
{ "text": "What did the wind smell like, then?", "next": "wind_smell" },
{ "text": "What do you mean?", "next": "wind_smell" }
]
},
{
"id": "wind_smell",
"speaker": "npc",
"text": "\"Manufactured. Adrenaline without fear. Saliva without hunger. Someone deployed a pheromone compound to write the wrong story across the field.\" She watches your face for a long moment. \"You are not the first to ask. Read what they left you. Then come back and tell me whose names are on the list.\"",
"options": [
{ "text": "I'd like to ask a favour, if I may.", "next": "favour_offer",
"conditions": [{ "kind": "has_flag", "flag": "asha_offered_favour" }] },
{ "text": "Will you help me?", "next": "favour" },
{ "text": "I'll come back.", "next": "<end>" }
]
},
{
"id": "favour",
"speaker": "npc",
"text": "\"I am old, child, and the old keep accounts. There is a stone in the Old Howl mine — your magistrate told you the lane forks. Left to the farm, right to the mine. The mine has been collapsed since my mother's time. My father's Howl-stone is in there. Bring it to me, and I will tell you what I know about the people whose names you carry.\"\n\n\"You'll need to be careful. The mine has not been empty. Someone has been using it. Bring no one with you who you do not trust completely.\"",
"options": [
{
"text": "I'll fetch the stone.",
"next": "<end>",
"effects": [
{ "kind": "set_flag", "flag": "asha_offered_favour", "value": 1 },
{ "kind": "start_quest", "quest": "side_act_i_old_howl" }
]
},
{ "text": "Maybe later.", "next": "<end>" }
]
},
{
"id": "favour_offer",
"speaker": "npc",
"text": "\"The mine, the stone, my father's hand. Either you've gone, or you're remembering. Speak, then.\"",
"options": [
{
"text": "[Has Howl-stone] I brought your stone back.",
"conditions": [{ "kind": "has_item", "id": "howl_stone" }],
"next": "stone_returned",
"effects": [
{ "kind": "take_item", "id": "howl_stone", "qty": 1 },
{ "kind": "set_flag", "flag": "asha_received_howl_stone", "value": 1 },
{ "kind": "rep_event", "event": { "kind": "Aid", "magnitude": 30, "role_tag": "millhaven.grandmother_asha", "note": "returned the Howl-stone" } },
{ "kind": "give_xp", "xp": 150 }
]
},
{ "text": "Still working on it.", "next": "<end>" }
]
},
{
"id": "stone_returned",
"speaker": "npc",
"text": "She closes her hand around the stone and is silent for a long beat. The fire behind her snaps.\n\n\"Thank you, child. The Old Howl is quieter now.\" She presses something thin and folded into your palm — a name, an old address, a route. \"This is who I would speak to in Thornfield, if I were going. Don't show it to a stranger.\"\n\n\"Now ask me what you came for.\"",
"options": [
{ "text": "Tell me about the Maw.", "next": "maw_lore",
"conditions": [{ "kind": "has_item", "id": "maw_sigil" }] },
{ "text": "What do you know about Sable Vasik?", "next": "vasik_lore",
"conditions": [{ "kind": "has_flag", "flag": "asha_received_howl_stone" }] },
{ "text": "Just thank you.", "next": "<end>" }
]
},
{
"id": "vasik_lore",
"speaker": "npc",
"text": "\"That name. I have heard it twice in fifty years, and both times the speaker apologised for saying it aloud.\" She thinks. \"A Covenant-Keeper of the Bridge oath, retired thirty years. People who knew the work say the work was good. People who knew the keeper say the keeper was tired. Be careful with what tired people decide is true.\"",
"options": [
{ "text": "Thank you. Goodbye.", "next": "<end>" }
]
},
{
"id": "maw_lore",
"speaker": "npc",
"text": "\"A circle of teeth. Predators of every clade biting the same prey at the same moment. The pictograph is older than the Covenant — it used to mean a hunting truce. Whoever uses it now has read history badly, or read it too well.\"",
"options": [
{ "text": "Thank you for your help.", "next": "<end>" }
]
},
{
"id": "journal_recognised",
"speaker": "npc",
"text": "She turns the journal over in her hands as carefully as a wounded bird.\n\n\"Yes. Your parent's hand. Read the early entries first — they were a careful writer. The later entries are not as careful. Something had begun to frighten them. By the time they crossed names off this list, they were sleeping in shifts.\" Her eyes meet yours. \"I am sorry, child. I am old enough to recognise what fear looks like in handwriting.\"",
"options": [
{ "text": "Will you help me?", "next": "favour" },
{ "text": "I'll come back when I know more.", "next": "<end>" }
]
},
{
"id": "lore",
"speaker": "npc",
"text": "\"Millhaven sits where the southern road and the millrace meet. Cervid farmers and Canid ranchers, with a few of every other clade between. Most years, the grain is good and the constable is bored. This year is not most years.\"\n\n\"Ask me something specific and I'll answer the part I know.\"",
"options": [
{ "text": "What about my parents?", "next": "parents" },
{ "text": "Goodbye.", "next": "<end>" }
]
}
]
}
@@ -0,0 +1,149 @@
{
"id": "millhaven_lacroix",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "\"Evening, friend. Fen Lacroix, traveling merchant. Saw your face in the inn last night and thought I'd say hello.\"\n\nThe coyote-folk smiles too widely, talks too smoothly, and stands too close. There's a road-pack at his feet, but the only goods inside are two flat parcels that don't rattle.",
"options": [
{ "text": "What are you really doing in Millhaven?", "next": "what_doing" },
{
"text": "[Has Briarstead Journal] You were in my parents' workshop.",
"conditions": [{ "kind": "has_item", "id": "briarstead_journal" }],
"next": "accuse"
},
{ "text": "Just passing through. Goodbye.", "next": "<end>" }
]
},
{
"id": "what_doing",
"speaker": "npc",
"text": "\"Buying, selling, listening. Roads have ears, and ears get hungry.\" His smile doesn't change. \"You should be careful who you talk to. This town has a habit of remembering things badly.\"",
"options": [
{ "text": "Is that a warning?", "next": "warning" },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "warning",
"speaker": "npc",
"text": "\"It's a road-merchant's discount. Listen well or pay later.\" He starts to lift his pack.",
"options": [
{ "text": "Wait. We're not done.", "next": "accuse",
"conditions": [{ "kind": "has_item", "id": "briarstead_journal" }] },
{ "text": "Goodbye, then.", "next": "<end>" }
]
},
{
"id": "accuse",
"speaker": "npc",
"text": "His face stops smiling.\n\n\"Ah. So you read the journal already. That's quicker than they thought.\" He shifts his weight. The hand near his pack is no longer holding it.\n\n\"Three options, friend. You walk away and forget my name. You take me to your constable, and I tell him a story that won't satisfy you. Or we settle it here.\"",
"options": [
{
"text": "[Intimidate DC 14] Talk first. The story you tell me, or you don't walk out of this room.",
"skill_check": { "skill": "intimidation", "dc": 14 },
"next_on_success": "interrogate",
"next_on_failure": "fight",
"effects_on_success": [
{ "kind": "set_flag", "flag": "lacroix_interrogated", "value": 1 },
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": 4, "role_tag": "millhaven.lacroix", "note": "broke under threat" } }
],
"effects_on_failure": [
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -3, "role_tag": "millhaven.lacroix", "note": "called your bluff" } }
]
},
{
"text": "Settle it here.",
"next": "fight"
},
{
"text": "Walk away. (Both of us.)",
"next": "let_go",
"effects": [
{ "kind": "set_flag", "flag": "lacroix_let_go", "value": 1 },
{ "kind": "give_item", "id": "maw_sigil", "qty": 1 },
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": 5, "faction": "maw", "note": "let the operative go" } },
{ "kind": "rep_event", "event": { "kind": "Dialogue", "magnitude": -8, "faction": "covenant_enforcers", "note": "did not detain a known suspect" } }
]
}
]
},
{
"id": "interrogate",
"speaker": "npc",
"text": "He sits — slowly — on the edge of the bed.\n\n\"Fine. I was sent to confirm your parents' notes were destroyed. Someone wanted them dead before they finished writing. I was cleanup.\" He looks tired. \"I don't know who paid. I take a name and a wax seal and money in my hand. The seal is teeth in a circle. The Maw, they call themselves. That's all I know. Ask the people in Thornfield. Ask Sable.\"\n\nHe opens his coat slowly and produces a folded letter sealed in black wax. The mark is a circle of teeth meeting at the centre. He sets it on the bed.",
"options": [
{
"text": "Take the letter and let him go.",
"next": "<end>",
"effects": [
{ "kind": "give_item", "id": "maw_sigil", "qty": 1 },
{ "kind": "set_flag", "flag": "lacroix_climax_resolved", "value": 1 },
{ "kind": "set_flag", "flag": "act_i_briarstead_searched", "value": 1 },
{ "kind": "give_xp", "xp": 250 },
{ "kind": "rep_event", "event": { "kind": "Quest", "magnitude": 4, "faction": "covenant_enforcers", "note": "extracted intel from a Maw operative" } },
{ "kind": "rep_event", "event": { "kind": "Quest", "magnitude": -10, "faction": "maw", "note": "extracted intel from one of their operatives" } }
]
},
{
"text": "Take the letter and end this.",
"next": "kill_after_interrogate",
"effects": [
{ "kind": "give_item", "id": "maw_sigil", "qty": 1 },
{ "kind": "set_flag", "flag": "lacroix_killed", "value": 1 },
{ "kind": "set_flag", "flag": "lacroix_climax_resolved", "value": 1 },
{ "kind": "set_flag", "flag": "act_i_briarstead_searched", "value": 1 },
{ "kind": "give_xp", "xp": 200 },
{ "kind": "rep_event", "event": { "kind": "Death", "magnitude": -25, "faction": "maw", "note": "killed an operative after extraction" } },
{ "kind": "rep_event", "event": { "kind": "Crime", "magnitude": -8, "faction": "covenant_enforcers", "note": "executed a prisoner without trial" } }
]
}
]
},
{
"id": "kill_after_interrogate",
"speaker": "narration",
"text": "He doesn't fight back. He didn't think you'd actually do it.",
"options": [
{ "text": "Continue.", "next": "<end>" }
]
},
{
"id": "fight",
"speaker": "narration",
"text": "Lacroix moves first. The room is small. There is no escape — only a fight that ends one way or the other.\n\n(For Phase 6 M6, the fight is resolved narratively here as a single decisive blow; Phase 7's PoI work will replace this with the full tactical encounter the design calls for.)",
"options": [
{
"text": "[Decisive blow]",
"next": "<end>",
"effects": [
{ "kind": "give_item", "id": "maw_sigil", "qty": 1 },
{ "kind": "set_flag", "flag": "lacroix_killed", "value": 1 },
{ "kind": "set_flag", "flag": "lacroix_climax_resolved", "value": 1 },
{ "kind": "set_flag", "flag": "act_i_briarstead_searched", "value": 1 },
{ "kind": "give_xp", "xp": 250 },
{ "kind": "rep_event", "event": { "kind": "Death", "magnitude": -30, "faction": "maw", "note": "killed Lacroix in self-defence" } },
{ "kind": "rep_event", "event": { "kind": "Combat", "magnitude": 4, "faction": "covenant_enforcers", "note": "stopped a Maw operative mid-mission" } }
]
}
]
},
{
"id": "let_go",
"speaker": "npc",
"text": "He nods, slowly, and slides a folded letter across the floor with his boot. The wax seal is a circle of teeth.\n\n\"You have a long road. Keep it warm.\" He shoulders his pack and goes.\n\n(The Maw now knows you exist. They will adjust.)",
"options": [
{
"text": "Continue.",
"next": "<end>",
"effects": [
{ "kind": "set_flag", "flag": "lacroix_climax_resolved", "value": 1 },
{ "kind": "set_flag", "flag": "act_i_briarstead_searched", "value": 1 },
{ "kind": "give_xp", "xp": 150 }
]
}
]
}
]
}
@@ -0,0 +1,86 @@
{
"id": "millhaven_magistrate",
"root": "intro",
"nodes": [
{
"id": "intro",
"speaker": "npc",
"text": "\"You'll be the one I wrote to. Take a breath. There's a small letter on my desk waiting for you, and a longer story behind it.\"\n\nMagistrate Vossler is an elderly elk-folk in modest robes. The Covenant seal on his collar is old enough that the gilding has worn down. He nods at a chair without inviting you to sit.",
"options": [
{ "text": "Tell me what happened to my parents.", "next": "case" },
{ "text": "Why did you write to me, of all people?", "next": "why_you" },
{ "text": "I'd like to look around the town first.", "next": "<end>" },
{ "text": "Goodbye.", "next": "<end>" }
]
},
{
"id": "why_you",
"speaker": "npc",
"text": "\"You're the next of kin on file. They never named anyone else. The estate paperwork required your hand. The case file...\" He pauses. \"That's why I wrote you a personal letter and not a courier slip.\"",
"options": [
{ "text": "What's in the case file?", "next": "case" },
{ "text": "I'll think on it. Goodbye.", "next": "<end>" }
]
},
{
"id": "case",
"speaker": "npc",
"text": "\"The constabulary report calls it a rawfang attack. Open-field, predator profile, no witnesses. Constable Fenn ran the investigation himself. He's a good Canid — pack-trained, methodical. He believes what he wrote.\"\n\nThe magistrate folds his hands. \"I do not. The scene was wrong. Your parents had been preparing for something — papers boxed, maps annotated. I had the boxes brought here for safekeeping. I'd like you to take them with you.\"",
"options": [
{
"text": "I'll take them. What did they leave?",
"next": "hand_over",
"effects": [
{ "kind": "give_item", "id": "briarstead_journal", "qty": 1 },
{ "kind": "give_item", "id": "formula_partial", "qty": 1 },
{ "kind": "give_item", "id": "names_list", "qty": 1 },
{ "kind": "set_flag", "flag": "spoke_to_millhaven_magistrate", "value": 1 },
{ "kind": "rep_event", "event": { "kind": "Quest", "magnitude": 4, "faction": "covenant_enforcers", "note": "called on the Millhaven magistrate" } }
]
},
{ "text": "Why didn't you go to the Enforcers in the capital?", "next": "why_not_capital" }
]
},
{
"id": "why_not_capital",
"speaker": "npc",
"text": "\"Because if my hunch is right, then the wrong office in the capital will hand the file to the wrong person. I'd rather you know what they wrote down before anyone else does.\"\n\nHe sighs. \"Take the boxes. Read the journal first. The names list will mean nothing today. It will mean a great deal in a month.\"",
"options": [
{
"text": "Alright. Hand them over.",
"next": "hand_over",
"effects": [
{ "kind": "give_item", "id": "briarstead_journal", "qty": 1 },
{ "kind": "give_item", "id": "formula_partial", "qty": 1 },
{ "kind": "give_item", "id": "names_list", "qty": 1 },
{ "kind": "set_flag", "flag": "spoke_to_millhaven_magistrate", "value": 1 },
{ "kind": "rep_event", "event": { "kind": "Quest", "magnitude": 4, "faction": "covenant_enforcers", "note": "called on the Millhaven magistrate" } }
]
}
]
},
{
"id": "hand_over",
"speaker": "npc",
"text": "He brings out a small chest from behind the desk and slides it across.\n\n\"There's a journal, three sheets of formula, and a list of names. I've also kept the keys to the farmhouse — Briarstead, if you remember the road. South of town, past the millpond. Constable Fenn can show you the path; Grandmother Asha can tell you who your parents were before this happened. Do both, in either order. Then come back here and tell me what you found.\"",
"options": [
{ "text": "Where exactly is Briarstead?", "next": "directions" },
{
"text": "I'll go.",
"next": "<end>"
}
]
},
{
"id": "directions",
"speaker": "npc",
"text": "\"South gate, then the rutted lane along the millpond. Twenty minutes if you walk steadily. The lane forks at the old fence — left for the farmhouse, right for the Old Howl mine. The mine's collapsed. Don't go there alone.\"",
"options": [
{
"text": "Understood.",
"next": "<end>"
}
]
}
]
}
@@ -0,0 +1,27 @@
{
"id": "imperium_medium",
"dungeon_type": "ImperiumRuin",
"size_band": "medium",
"anchor": "",
"room_count_min": 6,
"room_count_max": 10,
"branching": "branching",
"required_roles": ["entry", "boss"],
"optional_roles": ["narrative", "loot", "dead-end"],
"loot_table_per_band": {
"t1": "loot_dungeon_imperium_t1",
"t2": "loot_dungeon_imperium_t2",
"t3": "loot_dungeon_imperium_t3"
},
"spawn_kind_distribution": {
"PoiGuard": 0.7,
"WildAnimal": 0.2,
"Brigand": 0.1
},
"level_band_to_loot_band": {
"0": "t1",
"1": "t1",
"2": "t2",
"3": "t3"
}
}
@@ -0,0 +1,25 @@
{
"id": "mine_small",
"dungeon_type": "AbandonedMine",
"size_band": "small",
"anchor": "",
"room_count_min": 3,
"room_count_max": 5,
"branching": "linear",
"required_roles": ["entry"],
"optional_roles": ["transit", "loot", "dead-end"],
"loot_table_per_band": {
"t1": "loot_dungeon_mine_t1",
"t2": "loot_dungeon_mine_t2"
},
"spawn_kind_distribution": {
"Brigand": 0.6,
"WildAnimal": 0.4
},
"level_band_to_loot_band": {
"0": "t1",
"1": "t1",
"2": "t2",
"3": "t2"
}
}
+92
View File
@@ -0,0 +1,92 @@
[
{
"id": "covenant_enforcers",
"name": "Covenant Enforcers",
"shortName": "Enforcers",
"color": "#4466BB",
"description": "The paramilitary arm of the Covenant. They enforce the Separation Accords, monitor clade mixing, and maintain order in urban centers. Loyal to the capital's governance structure.",
"opposition": {
"inheritors": -0.3,
"thorn_council": -0.3,
"hybrid_underground": -0.1,
"merchant_guilds": 0.1,
"maw": -0.5
}
},
{
"id": "inheritors",
"name": "Inheritors",
"shortName": "Inheritors",
"color": "#CC4422",
"description": "A loose alliance of predator-clade communities who believe the old ways of strength and territory are the only true order. Strong in frontier and wilderness regions.",
"opposition": {
"covenant_enforcers": -0.5,
"thorn_council": -0.2,
"hybrid_underground": -0.3,
"unsheathed": -0.3,
"maw": 0.2
}
},
{
"id": "thorn_council",
"name": "Thorn Council",
"shortName": "Thorns",
"color": "#44AA55",
"description": "A coalition of prey-clade communities and urban progressives advocating for political reform and the dismantling of clade-based hierarchy. Active in agricultural and urban regions.",
"opposition": {
"covenant_enforcers": -0.5,
"inheritors": -0.2,
"hybrid_underground": -0.1,
"unsheathed": -0.2,
"maw": 0.2
}
},
{
"id": "merchant_guilds",
"name": "Merchant Guilds",
"shortName": "Guilds",
"color": "#CC9933",
"description": "Federated trade guilds spanning every major settlement. Pragmatic, transnational, and prone to underwriting any cause that keeps shipping lanes open.",
"opposition": {
"covenant_enforcers": 0.1
}
},
{
"id": "hybrid_underground",
"name": "Hybrid Underground",
"shortName": "Underground",
"color": "#884488",
"description": "Informal mutual-aid network for hybrid-clade individuals. Smuggles scent masks, provides safe houses, runs forged-papers logistics in the cities.",
"opposition": {
"covenant_enforcers": -0.1,
"inheritors": -0.5,
"thorn_council": -0.3,
"unsheathed": 0.3
}
},
{
"id": "unsheathed",
"name": "The Unsheathed",
"shortName": "Unsheathed",
"color": "#22AABB",
"description": "Hybrid political activism movement that pushes for legal recognition through public organising. The above-ground sibling of the Underground.",
"opposition": {
"inheritors": -0.5,
"thorn_council": -0.3,
"hybrid_underground": 0.3
}
},
{
"id": "maw",
"name": "The Maw",
"shortName": "Maw",
"color": "#222222",
"description": "Hidden until Act I climax. Conspiratorial alliance of Inheritors, Thorn extremists, and Sable Vasik building The Unmaking compound. Standing with this faction is meaningful only after the player learns it exists.",
"hidden": true,
"opposition": {
"covenant_enforcers": -0.5,
"inheritors": 0.2,
"thorn_council": 0.2
}
}
]
+553
View File
@@ -0,0 +1,553 @@
[
{
"id": "fang_knife",
"name": "Fang-knife",
"kind": "weapon",
"cost_fang": 2,
"weight_lb": 0.5,
"sizes": ["small", "medium", "large"],
"properties": ["finesse", "light", "thrown"],
"proficiency": "simple",
"damage": "1d4",
"damage_type": "piercing",
"range_short_tiles": 4,
"range_long_tiles": 12,
"description": "Curved blade mimicking a canine tooth. Universal grip — works for paws, hooves, and claws."
},
{
"id": "hoof_club",
"name": "Hoof-club",
"kind": "weapon",
"cost_fang": 1,
"weight_lb": 3,
"sizes": ["medium", "large"],
"properties": [],
"proficiency": "simple",
"damage": "1d6",
"damage_type": "bludgeoning",
"description": "Thick handle with weighted head, designed for split-hoof grip. Standard prey-clade sidearm."
},
{
"id": "claw_pick",
"name": "Claw-pick",
"kind": "weapon",
"cost_fang": 3,
"weight_lb": 2,
"sizes": ["small", "medium"],
"properties": [],
"proficiency": "simple",
"damage": "1d6",
"damage_type": "piercing",
"description": "Short hafted pick that locks between extended claws. Felidae and Mustelidae weapon."
},
{
"id": "antler_staff",
"name": "Antler-staff",
"kind": "weapon",
"cost_fang": 5,
"weight_lb": 4,
"sizes": ["medium", "large"],
"properties": ["versatile"],
"proficiency": "simple",
"damage": "1d8",
"damage_versatile": "1d10",
"damage_type": "bludgeoning",
"description": "A shed antler rack mounted on a hardwood shaft. Cervidae cultural weapon."
},
{
"id": "rend_sword",
"name": "Rend-sword",
"kind": "weapon",
"cost_fang": 25,
"weight_lb": 3,
"sizes": ["medium", "large"],
"properties": ["versatile"],
"proficiency": "martial",
"damage": "1d8",
"damage_versatile": "1d10",
"damage_type": "slashing",
"description": "Curved single-edged blade with a claw-guard hilt. Standard sidearm of Canid military."
},
{
"id": "thorn_blade",
"name": "Thorn-blade",
"kind": "weapon",
"cost_fang": 30,
"weight_lb": 2,
"sizes": ["small", "medium"],
"properties": ["finesse", "light"],
"proficiency": "martial",
"damage": "1d6",
"damage_type": "piercing",
"description": "Needle-thin thrusting sword. Felidae dueling weapon — designed for precision targeting of joints and soft tissue."
},
{
"id": "gore_lance",
"name": "Gore-lance",
"kind": "weapon",
"cost_fang": 35,
"weight_lb": 6,
"sizes": ["medium", "large"],
"properties": ["heavy", "two_handed", "reach"],
"proficiency": "martial",
"damage": "1d12",
"damage_type": "piercing",
"reach_tiles": 2,
"description": "Reinforced lance designed for Bovid and Cervid charge attacks. +1d6 damage when used in a charge (20+ feet of movement)."
},
{
"id": "paw_axe",
"name": "Paw-axe",
"kind": "weapon",
"cost_fang": 20,
"weight_lb": 3,
"sizes": ["medium", "large"],
"properties": ["versatile"],
"proficiency": "martial",
"damage": "1d8",
"damage_versatile": "1d10",
"damage_type": "slashing",
"description": "Broad-headed axe with oversized grip accommodating padded paws. Ursidae and Canidae weapon."
},
{
"id": "weasel_blade",
"name": "Weasel-blade",
"kind": "weapon",
"cost_fang": 35,
"weight_lb": 1,
"sizes": ["small", "medium"],
"properties": ["finesse", "light"],
"proficiency": "martial",
"damage": "1d6",
"damage_type": "slashing",
"description": "Thin flexible blade for Mustelid proportions. No disadvantage in confined environments (tunnels, crawlspaces)."
},
{
"id": "herd_hammer",
"name": "Herd-hammer",
"kind": "weapon",
"cost_fang": 30,
"weight_lb": 10,
"sizes": ["medium", "large"],
"properties": ["heavy", "two_handed"],
"proficiency": "martial",
"damage": "2d6",
"damage_type": "bludgeoning",
"description": "Massive maul with flat striking face. Bovid siege weapon. On a critical hit, target is knocked prone automatically."
},
{
"id": "short_bow",
"name": "Short Bow",
"kind": "weapon",
"cost_fang": 15,
"weight_lb": 2,
"sizes": ["small", "medium", "large"],
"properties": ["ammunition", "two_handed"],
"proficiency": "simple",
"damage": "1d6",
"damage_type": "piercing",
"range_short_tiles": 16,
"range_long_tiles": 64,
"description": "Standard ranged weapon. 80/320 ft. range."
},
{
"id": "claw_bow",
"name": "Claw-bow",
"kind": "weapon",
"cost_fang": 35,
"weight_lb": 1.5,
"sizes": ["small", "medium"],
"properties": ["ammunition", "light"],
"proficiency": "martial",
"damage": "1d6",
"damage_type": "piercing",
"range_short_tiles": 16,
"range_long_tiles": 64,
"description": "Wrist-mounted crossbow that fires when claws are extended in a specific position. Felidae design — leaves a free hand."
},
{
"id": "hide_vest",
"name": "Hide Vest",
"kind": "armor",
"cost_fang": 5,
"weight_lb": 4,
"sizes": ["small", "medium", "large"],
"properties": [],
"armor_class": "light",
"ac_base": 11,
"ac_max_dex": -1,
"description": "Fur-lined interior for thin-coated species. Ventilated panels for thick-coated."
},
{
"id": "leather_harness",
"name": "Leather Harness",
"kind": "armor",
"cost_fang": 10,
"weight_lb": 5,
"sizes": ["small", "medium"],
"properties": [],
"armor_class": "light",
"ac_base": 11,
"ac_max_dex": -1,
"description": "Chest-and-shoulder coverage, tail-slotted. Standard Mustelid and Leporidae armor."
},
{
"id": "studded_leather",
"name": "Studded Leather",
"kind": "armor",
"cost_fang": 25,
"weight_lb": 8,
"sizes": ["small", "medium", "large"],
"properties": [],
"armor_class": "light",
"ac_base": 12,
"ac_max_dex": -1,
"description": "Reinforced with metal studs. Tail-slot, ear-cutouts."
},
{
"id": "chain_shirt",
"name": "Chain Shirt",
"kind": "armor",
"cost_fang": 30,
"weight_lb": 15,
"sizes": ["medium", "large"],
"properties": [],
"armor_class": "medium",
"ac_base": 13,
"ac_max_dex": 2,
"stealth_disadvantage": true,
"description": "Tail-slotted standard. Disadvantage on Stealth."
},
{
"id": "breastplate",
"name": "Breastplate",
"kind": "armor",
"cost_fang": 50,
"weight_lb": 18,
"sizes": ["medium", "large"],
"properties": [],
"armor_class": "medium",
"ac_base": 14,
"ac_max_dex": 2,
"description": "Covers torso only, leaves limbs free for natural weapon use. Favored by Feral class."
},
{
"id": "chain_mail",
"name": "Chain Mail",
"kind": "armor",
"cost_fang": 50,
"weight_lb": 40,
"sizes": ["medium", "large"],
"properties": [],
"armor_class": "heavy",
"ac_base": 16,
"ac_max_dex": 0,
"min_str": 13,
"stealth_disadvantage": true,
"description": "Full chain suit. Tail-slotted, ear-cutouts. STR 13 required. Overheating risk for double-coated species."
},
{
"id": "buckler",
"name": "Buckler",
"kind": "shield",
"cost_fang": 5,
"weight_lb": 3,
"sizes": ["small", "medium", "large"],
"properties": [],
"ac_base": 1,
"description": "Strapped to forearm. Allows use of the attached paw at disadvantage for fine tasks."
},
{
"id": "standard_shield",
"name": "Standard Shield",
"kind": "shield",
"cost_fang": 10,
"weight_lb": 6,
"sizes": ["small", "medium", "large"],
"properties": [],
"ac_base": 2,
"description": "Round, kite, or tower depending on Clade. Paw-grip or hoof-brace options."
},
{
"id": "tower_shield",
"name": "Tower Shield",
"kind": "shield",
"cost_fang": 30,
"weight_lb": 15,
"sizes": ["medium", "large"],
"properties": ["heavy"],
"ac_base": 3,
"min_str": 14,
"description": "Three-quarter body coverage. STR 14 required. Disadvantage on attack rolls. Provides three-quarters cover when planted."
},
{
"id": "poultice_universal",
"name": "Poultice (universal)",
"kind": "consumable",
"cost_fang": 5,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["consumable"],
"consumable_kind": "healing",
"healing": "1d4",
"description": "Topical healing compound that works on any Clade. The compromise option — heals 1d4. Single use."
},
{
"id": "poultice_canid",
"name": "Poultice (Canid-calibrated)",
"kind": "consumable",
"cost_fang": 2,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["consumable", "clade_canidae"],
"consumable_kind": "healing",
"healing": "1d6",
"description": "Optimized for Canid metabolism — heals 1d6 on Canidae, 1d4 otherwise. Single use."
},
{
"id": "healers_kit",
"name": "Healer's Kit",
"kind": "consumable",
"cost_fang": 5,
"weight_lb": 3,
"sizes": ["medium"],
"properties": ["multi_use"],
"consumable_kind": "kit",
"description": "10 uses. Stabilize creatures at 0 HP without a Medicine check. Calibrated for purebred physiology."
},
{
"id": "scent_mask_basic",
"name": "Scent-mask (basic)",
"kind": "consumable",
"cost_fang": 5,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["consumable"],
"consumable_kind": "scent_mask",
"description": "Topical compound. Suppresses natural scent for 4 hours. Breaks under heavy exertion, fear, or arousal. Casual-grade."
},
{
"id": "pheromone_vial_calm",
"name": "Pheromone Vial (calm)",
"kind": "consumable",
"cost_fang": 10,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["consumable", "thrown"],
"consumable_kind": "pheromone",
"description": "Throwable or applied. 10-foot radius. WIS save DC 12 or become docile for 1 minute (breaks on damage). Single use."
},
{
"id": "pheromone_vial_fear",
"name": "Pheromone Vial (fear)",
"kind": "consumable",
"cost_fang": 10,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["consumable", "thrown"],
"consumable_kind": "pheromone",
"description": "Throwable. 10-foot radius. Creatures must WIS save DC 12 or be frightened for 1 round. Single use."
},
{
"id": "torch_scent_neutral",
"name": "Torch (scent-neutral)",
"kind": "gear",
"cost_fang": 1,
"weight_lb": 1,
"sizes": ["medium"],
"properties": [],
"description": "Burns for 1 hour. Produces light without smoke or scent. Essential in a world where standard torches blind every nose in the party."
},
{
"id": "rope_claw_braid",
"name": "Rope (claw-braid, 50 ft.)",
"kind": "gear",
"cost_fang": 3,
"weight_lb": 5,
"sizes": ["medium"],
"properties": [],
"description": "Braided to provide grip texture for clawed paws. Advantage on Athletics checks to climb when using this rope (Felidae, Mustelidae, Canidae)."
},
{
"id": "rations_predator",
"name": "Rations (predator, 1 day)",
"kind": "gear",
"cost_fang": 0.5,
"weight_lb": 1,
"sizes": ["medium"],
"properties": ["consumable"],
"description": "Dried fish, smoked poultry, insect protein bars, pickled eggs. Balanced for Canid/Felid/Mustelid/Ursid diet."
},
{
"id": "rations_prey",
"name": "Rations (prey, 1 day)",
"kind": "gear",
"cost_fang": 0.3,
"weight_lb": 1.5,
"sizes": ["medium"],
"properties": ["consumable"],
"description": "Grain cakes, dried fruit and vegetables, nut butter, seed mix, root chips. Bulkier but cheaper."
},
{
"id": "adaptive_pack",
"name": "Size-adaptive Pack",
"kind": "gear",
"cost_fang": 15,
"weight_lb": 3,
"sizes": ["small", "medium", "large"],
"properties": ["adaptive"],
"description": "Adjustable backpack with extendable straps and modular capacity. Fits Small through Large creatures. Tail-vent standard. Raises carrying capacity."
},
{
"id": "bedroll_multi_height",
"name": "Multi-height Bedroll",
"kind": "gear",
"cost_fang": 5,
"weight_lb": 5,
"sizes": ["small", "medium", "large"],
"properties": ["adaptive"],
"description": "Expandable sleeping surface. Compressed: fits Leporidae/Mustelid. Extended: fits Ursidae. Temperature-regulating lining."
},
{
"id": "fang_caps_steel",
"name": "Fang Caps (steel)",
"kind": "natural_weapon_enhancer",
"cost_fang": 15,
"weight_lb": 0.2,
"sizes": ["small", "medium", "large"],
"properties": [],
"enhancer_slot": "fang",
"damage_bonus": 1,
"clade_fit": ["canidae", "felidae", "mustelidae"],
"description": "Steel sheaths fitted over canines. Removable. +1 damage to bite attacks."
},
{
"id": "claw_sheaths_iron",
"name": "Claw Sheaths (iron)",
"kind": "natural_weapon_enhancer",
"cost_fang": 20,
"weight_lb": 0.3,
"sizes": ["small", "medium", "large"],
"properties": [],
"enhancer_slot": "claw",
"damage_bonus": 1,
"clade_fit": ["felidae", "mustelidae", "ursidae"],
"description": "Iron caps over natural claws. +1 damage to claw attacks. Retractable models for Felidae cost 35f."
},
{
"id": "hoof_plates_iron",
"name": "Hoof Plates (iron)",
"kind": "natural_weapon_enhancer",
"cost_fang": 15,
"weight_lb": 1,
"sizes": ["medium", "large"],
"properties": [],
"enhancer_slot": "hoof",
"damage_bonus": 1,
"clade_fit": ["cervidae", "bovidae"],
"description": "Bolted or strapped to hooves. +1 damage to kick attacks."
},
{
"id": "antler_tips_steel",
"name": "Antler Tips (steel)",
"kind": "natural_weapon_enhancer",
"cost_fang": 25,
"weight_lb": 0.5,
"sizes": ["medium", "large"],
"properties": [],
"enhancer_slot": "antler",
"damage_bonus": 1,
"clade_fit": ["cervidae"],
"description": "Steel points capped over antler tines. +1 damage to antler attacks. Seasonal — must be refitted after shed cycle."
},
{
"id": "briarstead_journal",
"name": "Parents' Journal",
"kind": "gear",
"cost_fang": 0,
"weight_lb": 0.5,
"sizes": ["medium"],
"properties": ["quest"],
"description": "A leather-bound notebook your parent kept in secret. Pages of careful handwriting trace concerns about repurposed scent-pathway research and the people who might be using it."
},
{
"id": "formula_partial",
"name": "Partial Chemical Formula",
"kind": "gear",
"cost_fang": 0,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["quest"],
"description": "Three sheets of stained vellum holding fragments of an alchemical formula. Even incomplete, the structure resembles a neural-pathway compound — suppressive at low doses, weaponisable at high."
},
{
"id": "names_list",
"name": "Names on a List",
"kind": "gear",
"cost_fang": 0,
"weight_lb": 0.05,
"sizes": ["medium"],
"properties": ["quest"],
"description": "A short list of names in your parent's handwriting. Some have been crossed out. The remaining names: Dr. Marisol Venn (Thornfield), Magistrate Pell Sorvic (Sanctum Fidelis), and \"S.V.\" — no surname, no city."
},
{
"id": "maw_sigil",
"name": "Wax-Sealed Letter",
"kind": "gear",
"cost_fang": 0,
"weight_lb": 0.1,
"sizes": ["medium"],
"properties": ["quest"],
"description": "A coded letter sealed with a sigil: a circle of teeth meeting at the centre. The mark of the Maw."
},
{
"id": "howl_stone",
"name": "Howl-stone",
"kind": "gear",
"cost_fang": 0,
"weight_lb": 1.0,
"sizes": ["medium"],
"properties": ["quest"],
"description": "A polished river stone, the size of a fist, etched with a worn Canid hand-glyph. Grandmother Asha's family heirloom — its cool weight feels older than the mine it sat in."
},
{
"id": "scent_mask_military",
"name": "Scent-mask (military)",
"kind": "consumable",
"cost_fang": 25,
"weight_lb": 0.2,
"sizes": ["medium"],
"properties": ["consumable"],
"consumable_kind": "scent_mask",
"description": "Issued to scout-patrol units. Layered compound suppresses individual scent under combat exertion for up to 8 hours. Auto-passes casual scent detection."
},
{
"id": "scent_mask_deep_cover",
"name": "Scent-mask (deep cover)",
"kind": "consumable",
"cost_fang": 90,
"weight_lb": 0.3,
"sizes": ["medium"],
"properties": ["consumable", "rare"],
"consumable_kind": "scent_mask",
"description": "Black-market grade. Built to fool a Canid Superior Scent. Application takes ten minutes; effect holds 24 hours through combat, fear, and injury. Single-use."
},
{
"id": "healing_potion",
"name": "Healing potion",
"kind": "consumable",
"cost_fang": 50,
"weight_lb": 0.5,
"sizes": ["medium"],
"properties": ["consumable"],
"consumable_kind": "healing",
"healing": "2d4+2",
"description": "Sealed phial of bitter alchemical resin. Drink in a free action to restore 2d4+2 hit points. Hybrids absorb three quarters of the dose."
}
]
+120
View File
@@ -0,0 +1,120 @@
[
{
"id": "loot_brigand_low",
"drops": [
{ "item_id": "fang_knife", "qty_min": 1, "qty_max": 1, "chance": 0.55 },
{ "item_id": "rations_predator", "qty_min": 1, "qty_max": 2, "chance": 0.40 },
{ "item_id": "scent_mask_basic", "qty_min": 1, "qty_max": 1, "chance": 0.10 }
]
},
{
"id": "loot_brigand_mid",
"drops": [
{ "item_id": "rend_sword", "qty_min": 1, "qty_max": 1, "chance": 0.50 },
{ "item_id": "studded_leather", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "rations_predator", "qty_min": 2, "qty_max": 3, "chance": 0.50 },
{ "item_id": "poultice_universal", "qty_min": 1, "qty_max": 1, "chance": 0.20 }
]
},
{
"id": "loot_brigand_high",
"drops": [
{ "item_id": "paw_axe", "qty_min": 1, "qty_max": 1, "chance": 0.60 },
{ "item_id": "chain_shirt", "qty_min": 1, "qty_max": 1, "chance": 0.25 },
{ "item_id": "buckler", "qty_min": 1, "qty_max": 1, "chance": 0.30 },
{ "item_id": "healers_kit", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "rations_predator", "qty_min": 3, "qty_max": 5, "chance": 0.60 }
]
},
{
"id": "loot_wild_low",
"drops": [
{ "item_id": "rations_predator", "qty_min": 1, "qty_max": 1, "chance": 0.30 }
]
},
{
"id": "loot_wild_mid",
"drops": [
{ "item_id": "fang_caps_steel", "qty_min": 1, "qty_max": 1, "chance": 0.10 },
{ "item_id": "rations_predator", "qty_min": 1, "qty_max": 2, "chance": 0.40 }
]
},
{
"id": "loot_wild_high",
"drops": [
{ "item_id": "claw_sheaths_iron", "qty_min": 1, "qty_max": 1, "chance": 0.15 },
{ "item_id": "fang_caps_steel", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "rations_predator", "qty_min": 2, "qty_max": 4, "chance": 0.50 }
]
},
{
"id": "loot_poi_low",
"drops": [
{ "item_id": "fang_knife", "qty_min": 1, "qty_max": 1, "chance": 0.40 },
{ "item_id": "scent_mask_basic", "qty_min": 1, "qty_max": 1, "chance": 0.20 }
]
},
{
"id": "loot_poi_mid",
"drops": [
{ "item_id": "thorn_blade", "qty_min": 1, "qty_max": 1, "chance": 0.40 },
{ "item_id": "leather_harness", "qty_min": 1, "qty_max": 1, "chance": 0.30 },
{ "item_id": "poultice_universal", "qty_min": 1, "qty_max": 2, "chance": 0.30 }
]
},
{
"id": "loot_poi_high",
"drops": [
{ "item_id": "rend_sword", "qty_min": 1, "qty_max": 1, "chance": 0.50 },
{ "item_id": "chain_mail", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "standard_shield", "qty_min": 1, "qty_max": 1, "chance": 0.30 },
{ "item_id": "healers_kit", "qty_min": 1, "qty_max": 1, "chance": 0.40 }
]
},
{
"id": "loot_dungeon_imperium_t1",
"drops": [
{ "item_id": "fang_knife", "qty_min": 1, "qty_max": 2, "chance": 0.50 },
{ "item_id": "rations_predator", "qty_min": 1, "qty_max": 3, "chance": 0.40 },
{ "item_id": "scent_mask_basic", "qty_min": 1, "qty_max": 1, "chance": 0.15 },
{ "item_id": "poultice_universal", "qty_min": 1, "qty_max": 1, "chance": 0.20 }
]
},
{
"id": "loot_dungeon_imperium_t2",
"drops": [
{ "item_id": "rend_sword", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "chain_shirt", "qty_min": 1, "qty_max": 1, "chance": 0.15 },
{ "item_id": "scent_mask_basic", "qty_min": 1, "qty_max": 2, "chance": 0.30 },
{ "item_id": "healers_kit", "qty_min": 1, "qty_max": 1, "chance": 0.25 },
{ "item_id": "rations_predator", "qty_min": 2, "qty_max": 4, "chance": 0.50 }
]
},
{
"id": "loot_dungeon_imperium_t3",
"drops": [
{ "item_id": "paw_axe", "qty_min": 1, "qty_max": 1, "chance": 0.30 },
{ "item_id": "chain_mail", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "tower_shield", "qty_min": 1, "qty_max": 1, "chance": 0.15 },
{ "item_id": "healers_kit", "qty_min": 1, "qty_max": 2, "chance": 0.40 },
{ "item_id": "fang_caps_steel", "qty_min": 1, "qty_max": 1, "chance": 0.20 }
]
},
{
"id": "loot_dungeon_mine_t1",
"drops": [
{ "item_id": "fang_knife", "qty_min": 1, "qty_max": 1, "chance": 0.50 },
{ "item_id": "rations_predator", "qty_min": 1, "qty_max": 2, "chance": 0.40 },
{ "item_id": "rope_claw_braid", "qty_min": 1, "qty_max": 1, "chance": 0.20 }
]
},
{
"id": "loot_dungeon_mine_t2",
"drops": [
{ "item_id": "claw_pick", "qty_min": 1, "qty_max": 1, "chance": 0.30 },
{ "item_id": "leather_harness", "qty_min": 1, "qty_max": 1, "chance": 0.20 },
{ "item_id": "poultice_universal", "qty_min": 1, "qty_max": 2, "chance": 0.40 },
{ "item_id": "rations_predator", "qty_min": 2, "qty_max": 3, "chance": 0.50 }
]
}
]
+173
View File
@@ -0,0 +1,173 @@
{
"width": 32,
"height": 32,
"default_cell": {
"biome_type": "temperate_grassland",
"clade_affinities": ["bovid", "cervid"],
"development": "agricultural",
"covenant": "moderate",
"elevation_floor": 0.0,
"elevation_ceiling": 0.48,
"moisture_floor": 0.25,
"moisture_ceiling": 0.65,
"temp_modifier": 0.0
},
"regions": [
{
"comment": "─── NORTH: Tundra / Boreal Forest (rows 07, full width) ───",
"x": 0, "y": 0, "w": 32, "h": 5,
"biome_type": "tundra",
"clade_affinities": ["polar_ursid", "wolverine"],
"development": "wilderness",
"covenant": "nominal",
"elevation_floor": 0.08,
"elevation_ceiling": 0.58,
"moisture_floor": 0.0,
"moisture_ceiling": 0.42,
"temp_modifier": -0.18
},
{
"comment": "Boreal belt under tundra",
"x": 0, "y": 5, "w": 32, "h": 4,
"biome_type": "boreal",
"clade_affinities": ["polar_ursid", "wolverine", "mustelid"],
"development": "frontier",
"covenant": "weak",
"elevation_floor": 0.05,
"elevation_ceiling": 0.55,
"moisture_floor": 0.35,
"moisture_ceiling": 0.75,
"temp_modifier": -0.1
},
{
"comment": "─── UPPER MIDDLE: Temperate Forest (rows 914, left half cols 015) ───",
"x": 0, "y": 9, "w": 16, "h": 6,
"biome_type": "temperate_deciduous",
"clade_affinities": ["cervid", "canid", "mustelid"],
"development": "agricultural",
"covenant": "moderate",
"elevation_floor": 0.0,
"elevation_ceiling": 0.52,
"moisture_floor": 0.42,
"moisture_ceiling": 0.82,
"temp_modifier": 0.0
},
{
"comment": "─── UPPER MIDDLE: Northern Plains (rows 914, right half cols 1631) ───",
"x": 16, "y": 9, "w": 16, "h": 6,
"biome_type": "temperate_grassland",
"clade_affinities": ["canid", "equid"],
"development": "agricultural",
"covenant": "moderate",
"elevation_floor": 0.0,
"elevation_ceiling": 0.38,
"moisture_floor": 0.22,
"moisture_ceiling": 0.58,
"temp_modifier": 0.03
},
{
"comment": "─── MIDDLE LEFT: Eastern Industrial Belt (rows 1522, cols 09) ───",
"x": 0, "y": 15, "w": 10, "h": 8,
"biome_type": "temperate_deciduous",
"clade_affinities": ["canid", "mustelid", "bovid", "cervid"],
"development": "industrial",
"covenant": "strong",
"elevation_floor": 0.0,
"elevation_ceiling": 0.45,
"moisture_floor": 0.35,
"moisture_ceiling": 0.72,
"temp_modifier": 0.05
},
{
"comment": "─── MIDDLE CENTRE: Central Grasslands (rows 1522, cols 1021) ───",
"x": 10, "y": 15, "w": 12, "h": 8,
"biome_type": "temperate_grassland",
"clade_affinities": ["bovid", "cervid", "equid"],
"development": "agricultural",
"covenant": "moderate",
"elevation_floor": 0.0,
"elevation_ceiling": 0.4,
"moisture_floor": 0.2,
"moisture_ceiling": 0.55,
"temp_modifier": 0.05
},
{
"comment": "─── MIDDLE RIGHT: Western Mountains (rows 1522, cols 2231) ───",
"x": 22, "y": 15, "w": 10, "h": 8,
"biome_type": "mountain_alpine",
"clade_affinities": ["ursid", "caprid", "feline"],
"development": "frontier",
"covenant": "weak",
"elevation_floor": 0.62,
"elevation_ceiling": 1.0,
"moisture_floor": 0.25,
"moisture_ceiling": 0.72,
"temp_modifier": -0.1
},
{
"comment": "Mountain foothills transition east of mountains",
"x": 19, "y": 15, "w": 3, "h": 8,
"biome_type": "mountain_forested",
"clade_affinities": ["ursid", "cervid"],
"development": "frontier",
"covenant": "weak",
"elevation_floor": 0.42,
"elevation_ceiling": 0.72,
"moisture_floor": 0.3,
"moisture_ceiling": 0.7,
"temp_modifier": -0.05
},
{
"comment": "─── SOUTH LEFT: Southeastern Coast (rows 2331, cols 09) ───",
"x": 0, "y": 23, "w": 10, "h": 9,
"biome_type": "coastal",
"clade_affinities": ["feline", "mustelid", "canid"],
"development": "urban",
"covenant": "strong",
"elevation_floor": 0.0,
"elevation_ceiling": 0.25,
"moisture_floor": 0.4,
"moisture_ceiling": 0.8,
"temp_modifier": 0.12
},
{
"comment": "─── SOUTH RIGHT: Subtropical Lowlands / The Tangles (rows 2331, cols 1031) ───",
"x": 10, "y": 23, "w": 22, "h": 9,
"biome_type": "subtropical_forest",
"clade_affinities": ["hybrid", "feline", "reptilian", "canid"],
"development": "frontier",
"covenant": "nominal",
"elevation_floor": 0.0,
"elevation_ceiling": 0.45,
"moisture_floor": 0.62,
"moisture_ceiling": 1.0,
"temp_modifier": 0.2
},
{
"comment": "Southern wetland pockets within The Tangles",
"x": 12, "y": 25, "w": 8, "h": 5,
"biome_type": "wetland",
"clade_affinities": ["hybrid", "amphibian"],
"development": "wilderness",
"covenant": "nominal",
"elevation_floor": 0.0,
"elevation_ceiling": 0.22,
"moisture_floor": 0.78,
"moisture_ceiling": 1.0,
"temp_modifier": 0.18
},
{
"comment": "Mountain southern extension (cols 2231, rows 2327)",
"x": 22, "y": 23, "w": 10, "h": 5,
"biome_type": "mountain_alpine",
"clade_affinities": ["ursid", "caprid"],
"development": "wilderness",
"covenant": "nominal",
"elevation_floor": 0.55,
"elevation_ceiling": 1.0,
"moisture_floor": 0.22,
"moisture_ceiling": 0.65,
"temp_modifier": -0.08
}
]
}
+404
View File
@@ -0,0 +1,404 @@
{
"templates": [
{
"id": "brigand_footpad",
"name": "Brigand Footpad",
"size": "medium",
"ability_scores": { "STR": 11, "DEX": 14, "CON": 12, "INT": 10, "WIS": 10, "CHA": 9 },
"hp": 11,
"ac": 12,
"speed_ft": 30,
"attacks": [
{ "name": "Scruff-knife", "to_hit": 4, "damage": "1d4+2", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "brigand",
"default_allegiance": "hostile",
"loot_table": "loot_brigand_low",
"xp_award": 25
},
{
"id": "brigand_marauder",
"name": "Brigand Marauder",
"size": "medium",
"ability_scores": { "STR": 14, "DEX": 12, "CON": 13, "INT": 10, "WIS": 11, "CHA": 10 },
"hp": 22,
"ac": 14,
"speed_ft": 30,
"attacks": [
{ "name": "Rend-sword", "to_hit": 4, "damage": "1d8+2", "damage_type": "slashing", "reach_tiles": 1 },
{ "name": "Short Bow", "to_hit": 3, "damage": "1d6+1", "damage_type": "piercing", "range_short_tiles": 16, "range_long_tiles": 64 }
],
"behavior": "brigand",
"default_allegiance": "hostile",
"loot_table": "loot_brigand_mid",
"xp_award": 100
},
{
"id": "brigand_captain",
"name": "Brigand Captain",
"size": "medium",
"ability_scores": { "STR": 15, "DEX": 14, "CON": 14, "INT": 12, "WIS": 12, "CHA": 13 },
"hp": 38,
"ac": 16,
"speed_ft": 30,
"attacks": [
{ "name": "Paw-axe", "to_hit": 5, "damage": "1d8+3", "damage_type": "slashing", "reach_tiles": 1 },
{ "name": "Claw-bow", "to_hit": 4, "damage": "1d6+2", "damage_type": "piercing", "range_short_tiles": 16, "range_long_tiles": 64 }
],
"behavior": "brigand",
"default_allegiance": "hostile",
"loot_table": "loot_brigand_high",
"xp_award": 250
},
{
"id": "wolf_pup",
"name": "Wolf Pup",
"size": "small",
"ability_scores": { "STR": 8, "DEX": 13, "CON": 10, "INT": 3, "WIS": 12, "CHA": 6 },
"hp": 5,
"ac": 12,
"speed_ft": 35,
"attacks": [
{ "name": "Bite", "to_hit": 3, "damage": "1d4+1", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "loot_wild_low",
"xp_award": 10
},
{
"id": "wolf",
"name": "Wolf",
"size": "medium",
"ability_scores": { "STR": 12, "DEX": 15, "CON": 12, "INT": 3, "WIS": 12, "CHA": 6 },
"hp": 11,
"ac": 13,
"speed_ft": 40,
"attacks": [
{ "name": "Bite", "to_hit": 4, "damage": "2d4+2", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "loot_wild_mid",
"xp_award": 50
},
{
"id": "dire_wolf",
"name": "Dire Wolf",
"size": "large",
"ability_scores": { "STR": 17, "DEX": 15, "CON": 15, "INT": 3, "WIS": 12, "CHA": 7 },
"hp": 37,
"ac": 14,
"speed_ft": 50,
"attacks": [
{ "name": "Bite", "to_hit": 5, "damage": "2d6+3", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "loot_wild_high",
"xp_award": 200
},
{
"id": "bear_brown",
"name": "Brown Bear",
"size": "large",
"ability_scores": { "STR": 19, "DEX": 10, "CON": 16, "INT": 2, "WIS": 13, "CHA": 7 },
"hp": 50,
"ac": 11,
"speed_ft": 40,
"attacks": [
{ "name": "Bite", "to_hit": 6, "damage": "1d8+4", "damage_type": "piercing", "reach_tiles": 1 },
{ "name": "Claws", "to_hit": 6, "damage": "2d6+4", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "loot_wild_high",
"xp_award": 450
},
{
"id": "wolverine_wild",
"name": "Wolverine",
"size": "medium_large",
"ability_scores": { "STR": 14, "DEX": 13, "CON": 15, "INT": 3, "WIS": 12, "CHA": 6 },
"hp": 26,
"ac": 13,
"speed_ft": 30,
"attacks": [
{ "name": "Bite", "to_hit": 4, "damage": "1d8+2", "damage_type": "piercing", "reach_tiles": 1 },
{ "name": "Claws", "to_hit": 4, "damage": "1d6+2", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "loot_wild_mid",
"xp_award": 100
},
{
"id": "militia_patrol",
"name": "Militia Patroller",
"size": "medium",
"ability_scores": { "STR": 12, "DEX": 12, "CON": 12, "INT": 10, "WIS": 11, "CHA": 10 },
"hp": 13,
"ac": 14,
"speed_ft": 30,
"attacks": [
{ "name": "Antler-staff", "to_hit": 3, "damage": "1d8+1", "damage_type": "bludgeoning", "reach_tiles": 1 }
],
"behavior": "patrol",
"default_allegiance": "neutral",
"faction": "covenant_enforcers",
"loot_table": "",
"xp_award": 0
},
{
"id": "merchant_traveler",
"name": "Travelling Merchant",
"size": "medium",
"ability_scores": { "STR": 9, "DEX": 11, "CON": 10, "INT": 14, "WIS": 12, "CHA": 14 },
"hp": 6,
"ac": 10,
"speed_ft": 30,
"attacks": [
{ "name": "Fang-knife", "to_hit": 0, "damage": "1d4", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "patrol",
"default_allegiance": "friendly",
"faction": "merchant_guilds",
"loot_table": "",
"xp_award": 0
},
{
"id": "poi_guard_decayed",
"name": "Decayed Sentinel",
"size": "medium",
"ability_scores": { "STR": 13, "DEX": 8, "CON": 14, "INT": 3, "WIS": 6, "CHA": 5 },
"hp": 13,
"ac": 11,
"speed_ft": 25,
"attacks": [
{ "name": "Rusted Blade", "to_hit": 3, "damage": "1d6+1", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "poi_guard",
"default_allegiance": "hostile",
"loot_table": "loot_poi_low",
"xp_award": 50
},
{
"id": "poi_guard_skeletal",
"name": "Skeletal Sentinel",
"size": "medium",
"ability_scores": { "STR": 14, "DEX": 12, "CON": 14, "INT": 4, "WIS": 8, "CHA": 5 },
"hp": 22,
"ac": 13,
"speed_ft": 30,
"attacks": [
{ "name": "Bone Spear", "to_hit": 4, "damage": "1d8+2", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "poi_guard",
"default_allegiance": "hostile",
"loot_table": "loot_poi_mid",
"xp_award": 150
},
{
"id": "poi_guard_corrupted",
"name": "Corrupted Sentinel",
"size": "medium_large",
"ability_scores": { "STR": 16, "DEX": 13, "CON": 16, "INT": 5, "WIS": 10, "CHA": 6 },
"hp": 38,
"ac": 15,
"speed_ft": 30,
"attacks": [
{ "name": "Rotting Maul", "to_hit": 5, "damage": "2d6+3", "damage_type": "bludgeoning", "reach_tiles": 1 }
],
"behavior": "poi_guard",
"default_allegiance": "hostile",
"loot_table": "loot_poi_high",
"xp_award": 350
},
{
"id": "imperium_feral_canid",
"name": "Feral Canid (ruin)",
"size": "medium",
"ability_scores": { "STR": 13, "DEX": 14, "CON": 12, "INT": 4, "WIS": 11, "CHA": 5 },
"hp": 16,
"ac": 13,
"speed_ft": 35,
"attacks": [
{ "name": "Bite", "to_hit": 4, "damage": "1d6+2", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "",
"xp_award": 75
},
{
"id": "imperium_feral_felid",
"name": "Feral Felid (ruin)",
"size": "medium",
"ability_scores": { "STR": 12, "DEX": 16, "CON": 11, "INT": 4, "WIS": 12, "CHA": 5 },
"hp": 14,
"ac": 14,
"speed_ft": 40,
"attacks": [
{ "name": "Pounce-claws", "to_hit": 5, "damage": "1d6+3", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "",
"xp_award": 90
},
{
"id": "imperium_undead_thrall",
"name": "Sworn Thrall",
"size": "medium",
"ability_scores": { "STR": 14, "DEX": 10, "CON": 14, "INT": 3, "WIS": 6, "CHA": 4 },
"hp": 22,
"ac": 13,
"speed_ft": 25,
"attacks": [
{ "name": "Imperium Spear", "to_hit": 4, "damage": "1d8+2", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "poi_guard",
"default_allegiance": "hostile",
"loot_table": "loot_dungeon_imperium_t1",
"xp_award": 150
},
{
"id": "imperium_undead_overseer",
"name": "The Overseer",
"size": "medium_large",
"ability_scores": { "STR": 17, "DEX": 12, "CON": 17, "INT": 9, "WIS": 12, "CHA": 8 },
"hp": 60,
"ac": 17,
"speed_ft": 30,
"attacks": [
{ "name": "Black-Stone Halberd", "to_hit": 7, "damage": "2d10+4", "damage_type": "slashing", "reach_tiles": 2 },
{ "name": "Death's Whisper", "to_hit": 6, "damage": "2d6+2", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "poi_guard",
"default_allegiance": "hostile",
"loot_table": "loot_dungeon_imperium_t3",
"xp_award": 600
},
{
"id": "mine_collapsed_brigand",
"name": "Mine-Holed Brigand",
"size": "medium",
"ability_scores": { "STR": 13, "DEX": 13, "CON": 13, "INT": 9, "WIS": 9, "CHA": 8 },
"hp": 18,
"ac": 13,
"speed_ft": 30,
"attacks": [
{ "name": "Claw-pick", "to_hit": 4, "damage": "1d6+2", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "brigand",
"default_allegiance": "hostile",
"loot_table": "loot_dungeon_mine_t1",
"xp_award": 60
},
{
"id": "cult_thorn_acolyte",
"name": "Thorn Acolyte",
"size": "medium",
"ability_scores": { "STR": 12, "DEX": 13, "CON": 13, "INT": 12, "WIS": 14, "CHA": 11 },
"hp": 24,
"ac": 14,
"speed_ft": 30,
"attacks": [
{ "name": "Thorn-blade", "to_hit": 4, "damage": "1d8+1", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "brigand",
"default_allegiance": "hostile",
"faction": "thorn_council",
"loot_table": "loot_brigand_mid",
"xp_award": 175
},
{
"id": "cult_inheritor_initiate",
"name": "Inheritor Initiate",
"size": "medium",
"ability_scores": { "STR": 14, "DEX": 12, "CON": 14, "INT": 11, "WIS": 12, "CHA": 13 },
"hp": 30,
"ac": 15,
"speed_ft": 30,
"attacks": [
{ "name": "Sigil-blade", "to_hit": 5, "damage": "1d8+3", "damage_type": "slashing", "reach_tiles": 1 }
],
"behavior": "brigand",
"default_allegiance": "hostile",
"faction": "inheritors",
"loot_table": "loot_brigand_mid",
"xp_award": 225
},
{
"id": "cave_giant_centipede",
"name": "Giant Centipede",
"size": "small",
"ability_scores": { "STR": 8, "DEX": 16, "CON": 11, "INT": 1, "WIS": 7, "CHA": 2 },
"hp": 9,
"ac": 13,
"speed_ft": 30,
"attacks": [
{ "name": "Venomous Bite", "to_hit": 5, "damage": "1d4+3", "damage_type": "piercing", "reach_tiles": 1 }
],
"behavior": "wild_animal",
"default_allegiance": "hostile",
"loot_table": "",
"xp_award": 50
},
{
"id": "overgrown_revenant",
"name": "Settlement Revenant",
"size": "medium",
"ability_scores": { "STR": 14, "DEX": 9, "CON": 15, "INT": 4, "WIS": 7, "CHA": 5 },
"hp": 28,
"ac": 12,
"speed_ft": 25,
"attacks": [
{ "name": "Strangling Grasp", "to_hit": 4, "damage": "1d8+2", "damage_type": "bludgeoning", "reach_tiles": 1 }
],
"behavior": "poi_guard",
"default_allegiance": "hostile",
"loot_table": "loot_poi_mid",
"xp_award": 200
}
],
"spawn_kind_to_template_by_zone": {
"Brigand": ["brigand_footpad", "brigand_footpad", "brigand_marauder", "brigand_marauder", "brigand_captain"],
"WildAnimal": ["wolf_pup", "wolf", "wolf", "dire_wolf", "bear_brown"],
"Merchant": ["merchant_traveler","merchant_traveler","merchant_traveler","merchant_traveler","merchant_traveler"],
"Patrol": ["militia_patrol", "militia_patrol", "militia_patrol", "militia_patrol", "militia_patrol"],
"PoiGuard": ["poi_guard_decayed","poi_guard_skeletal","poi_guard_skeletal","poi_guard_corrupted","poi_guard_corrupted"]
},
"spawn_kind_to_template_by_dungeon_type": {
"ImperiumRuin": {
"PoiGuard": "imperium_undead_thrall",
"WildAnimal": "imperium_feral_canid",
"Brigand": "brigand_marauder",
"Boss": "imperium_undead_overseer"
},
"AbandonedMine": {
"PoiGuard": "mine_collapsed_brigand",
"WildAnimal": "dire_wolf",
"Brigand": "mine_collapsed_brigand",
"Boss": "brigand_captain"
},
"CultDen": {
"PoiGuard": "cult_thorn_acolyte",
"WildAnimal": "wolf",
"Brigand": "cult_inheritor_initiate",
"Boss": "cult_inheritor_initiate"
},
"NaturalCave": {
"PoiGuard": "dire_wolf",
"WildAnimal": "cave_giant_centipede",
"Brigand": "brigand_footpad",
"Boss": "bear_brown"
},
"OvergrownSettlement": {
"PoiGuard": "overgrown_revenant",
"WildAnimal": "wolf",
"Brigand": "brigand_marauder",
"Boss": "overgrown_revenant"
}
}
}
@@ -0,0 +1,66 @@
{
"id": "main_act_i_001_arrival",
"title": "Arrival in Millhaven",
"description": "A letter from Magistrate Vossler asks you to settle your parents' estate. Visit the magistrate, take the case file your parents left behind, and learn what they died investigating.",
"hidden": false,
"auto_start_when": [
{ "kind": "enter_anchor", "anchor": "millhaven" }
],
"entry_step": "intro",
"steps": [
{
"id": "intro",
"title": "Arrive in Millhaven",
"description": "Make your way to the magistrate's hall in Millhaven.",
"waypoint": "anchor:millhaven",
"trigger_conditions": [
{ "kind": "enter_anchor", "anchor": "millhaven" }
],
"on_enter": [
{ "kind": "set_flag", "flag": "act_i_arrived_at_millhaven" }
],
"outcomes": [
{ "next": "find_magistrate" }
]
},
{
"id": "find_magistrate",
"title": "Speak with Magistrate Vossler",
"description": "Magistrate Vossler holds the case file your parents left behind.",
"waypoint": "role:millhaven.magistrate",
"trigger_conditions": [
{ "kind": "flag_set", "flag": "spoke_to_millhaven_magistrate" }
],
"outcomes": [
{ "next": "investigate" }
]
},
{
"id": "investigate",
"title": "Investigate Briarstead",
"description": "Read the journal. Talk to Constable Fenn or Grandmother Asha. Learn who your parents were before they died — and what they were investigating.",
"waypoint": "Briarstead — south of Millhaven, past the millpond",
"trigger_conditions": [
{ "kind": "flag_set", "flag": "act_i_briarstead_searched" }
],
"outcomes": [
{
"next": "complete",
"effects": [
{ "kind": "give_xp", "xp": 200 },
{ "kind": "start_quest", "quest": "main_act_i_003_following_dead" }
]
}
]
},
{
"id": "complete",
"title": "What You Carry",
"description": "You have the journal, the formula, the names list, and — depending on how the climax went — the Maw's sigil. The road out of Millhaven leads east toward Thornfield, where the first name on the list lives.",
"completes_quest": true
}
]
}
@@ -0,0 +1,53 @@
{
"id": "main_act_i_003_following_dead",
"title": "Following the Dead",
"description": "A coyote-folk stranger named Fen Lacroix arrived in Millhaven the same day you did. He claims to be a merchant. The journal in your pack says otherwise — the people who killed your parents are checking their work, and Lacroix is here to confirm the job is done.",
"hidden": false,
"entry_step": "find_lacroix",
"steps": [
{
"id": "find_lacroix",
"title": "Confront Fen Lacroix",
"description": "Lacroix is staying at the Millhaven inn. You'll need to find him there before he reports back to whoever sent him.",
"waypoint": "role:millhaven.lacroix",
"trigger_conditions": [
{ "kind": "flag_set", "flag": "lacroix_climax_resolved" }
],
"outcomes": [
{ "next": "complete_with_kill", "when": [ { "kind": "flag_set", "flag": "lacroix_killed" } ] },
{ "next": "complete_with_intel", "when": [ { "kind": "flag_set", "flag": "lacroix_interrogated" } ] },
{ "next": "complete_with_let_go", "when": [ { "kind": "flag_set", "flag": "lacroix_let_go" } ] },
{ "next": "complete_with_kill" }
]
},
{
"id": "complete_with_kill",
"title": "Lacroix is dead",
"description": "The Maw will know one of their operatives didn't come back. They will adjust. Take what you have and head east.",
"on_enter": [
{ "kind": "give_xp", "xp": 100 }
],
"completes_quest": true
},
{
"id": "complete_with_intel",
"title": "Lacroix talked",
"description": "He gave up a name — Sable. He gave up a sigil — the Maw's. He gave up the trail east — Thornfield, Dr. Marisol Venn. The conspiracy has shape now.",
"on_enter": [
{ "kind": "give_xp", "xp": 200 }
],
"completes_quest": true
},
{
"id": "complete_with_let_go",
"title": "Lacroix walked away",
"description": "He left the sigil and a warning. Whoever sent him will know you let him live. The Maw owes you nothing now, but they remember favours like a debt.",
"on_enter": [
{ "kind": "give_xp", "xp": 50 },
{ "kind": "rep_event", "event": { "kind": "Misc", "magnitude": 8, "faction": "maw", "note": "let an operative walk" } }
],
"completes_quest": true
}
]
}
@@ -0,0 +1,33 @@
{
"id": "side_act_i_fence_lines",
"title": "Fence Lines",
"description": "Constable Fenn asked you to mediate a property dispute between Mira (Cervid farmer) and Voss (Canid rancher). Their fence has been a flashpoint for thirty years; this summer it became a war.",
"hidden": false,
"entry_step": "mediate",
"steps": [
{
"id": "mediate",
"title": "Walk the disputed fence",
"description": "Find Mira on the second left out of the south gate; find Voss along the eastern ridge. Pick an honest outcome — Constable Fenn will back any compromise that holds.",
"waypoint": "south gate, then second left",
"trigger_conditions": [
{ "kind": "flag_set", "flag": "fence_lines_resolved" }
],
"outcomes": [
{ "next": "complete",
"effects": [
{ "kind": "give_xp", "xp": 80 },
{ "kind": "rep_event", "event": { "kind": "Quest", "magnitude": 6, "faction": "covenant_enforcers", "note": "mediated the south-fence dispute" } }
]
}
]
},
{
"id": "complete",
"title": "Fence Lines Mediated",
"description": "The fence holds for now. Two families who weren't speaking are. Constable Fenn nods at you when you pass.",
"completes_quest": true
}
]
}
@@ -0,0 +1,45 @@
{
"id": "side_act_i_old_howl",
"title": "Old Howl",
"description": "Grandmother Asha asked you to retrieve her father's Howl-stone from the collapsed mine south of Millhaven. The mine has been camped recently — go armed.",
"hidden": false,
"entry_step": "find_stone",
"steps": [
{
"id": "find_stone",
"title": "Search the Old Howl mine",
"description": "Travel south past the millpond and take the right fork at the old fence. The brigands camping at the entrance won't let you pass without a fight; the back chamber holds Asha's heirloom.",
"waypoint": "Old Howl mine — right fork at the old fence",
"on_enter": [
{ "kind": "give_item", "id": "howl_stone", "qty": 1 }
],
"outcomes": [
{ "next": "return" }
]
},
{
"id": "return",
"title": "Return the Howl-stone to Asha",
"description": "Bring the Howl-stone back to Grandmother Asha in Millhaven.",
"waypoint": "role:millhaven.grandmother_asha",
"trigger_conditions": [
{ "kind": "flag_set", "flag": "asha_received_howl_stone" }
],
"outcomes": [
{
"next": "complete",
"effects": [
{ "kind": "give_xp", "xp": 100 }
]
}
]
},
{
"id": "complete",
"title": "Old Howl Returned",
"description": "Asha has her father's stone back. She'll speak openly about Sable Vasik now — that name will matter later.",
"completes_quest": true
}
]
}
+285
View File
@@ -0,0 +1,285 @@
[
{
"id": "generic_innkeeper",
"role_tag": "innkeeper",
"named": false,
"name": "Innkeeper",
"clade": "leporidae",
"species": "rabbit",
"bias_profile": "URBAN_PROGRESSIVE",
"dialogue": "generic_innkeeper",
"hp": 10,
"ac": 10,
"ability_scores": { "STR": 10, "DEX": 10, "CON": 12, "INT": 11, "WIS": 12, "CHA": 13 }
},
{
"id": "generic_shopkeeper",
"role_tag": "shopkeeper",
"named": false,
"name": "Shopkeeper",
"clade": "mustelidae",
"species": "ferret",
"bias_profile": "MERCHANT_NEUTRAL",
"faction": "merchant_guilds",
"dialogue": "generic_merchant",
"hp": 9,
"ac": 10
},
{
"id": "generic_smith",
"role_tag": "smith",
"named": false,
"name": "Blacksmith",
"clade": "ursidae",
"species": "brown_bear",
"bias_profile": "MUSTELID_PRAGMATIST",
"dialogue": "generic_merchant",
"hp": 14,
"ac": 11
},
{
"id": "generic_alchemist",
"role_tag": "alchemist",
"named": false,
"name": "Alchemist",
"clade": "felidae",
"species": "housecat",
"bias_profile": "URBAN_PROGRESSIVE",
"dialogue": "generic_merchant",
"hp": 8,
"ac": 10
},
{
"id": "generic_constable",
"role_tag": "constable",
"named": false,
"name": "Constable",
"clade": "canidae",
"species": "wolf",
"bias_profile": "COVENANT_FAITHFUL",
"faction": "covenant_enforcers",
"default_allegiance": "neutral",
"dialogue": "generic_guard",
"hp": 16,
"ac": 13
},
{
"id": "generic_magistrate",
"role_tag": "magistrate",
"named": false,
"name": "Magistrate",
"clade": "cervidae",
"species": "elk",
"bias_profile": "COVENANT_FAITHFUL",
"faction": "covenant_enforcers",
"dialogue": "generic_villager",
"hp": 12,
"ac": 11
},
{
"id": "generic_resident",
"role_tag": "resident",
"named": false,
"name": "Townsfolk",
"bias_profile": "URBAN_PROGRESSIVE",
"dialogue": "generic_villager",
"hp": 8,
"ac": 10
},
{
"id": "generic_barfly",
"role_tag": "barfly",
"named": false,
"name": "Patron",
"bias_profile": "FRONTIER_NIHILIST",
"dialogue": "generic_villager",
"hp": 8,
"ac": 10
},
{
"id": "generic_guard",
"role_tag": "guard",
"named": false,
"name": "Guard",
"clade": "ursidae",
"species": "brown_bear",
"bias_profile": "COVENANT_FAITHFUL",
"faction": "covenant_enforcers",
"default_allegiance": "neutral",
"dialogue": "generic_guard",
"hp": 18,
"ac": 14
},
{
"id": "generic_farmer",
"role_tag": "farmer",
"named": false,
"name": "Farmer",
"clade": "bovidae",
"species": "bull",
"bias_profile": "BOVID_HERD_LOYALIST",
"dialogue": "generic_villager",
"hp": 12,
"ac": 10
},
{
"id": "millhaven_magistrate",
"role_tag": "millhaven.magistrate",
"named": true,
"name": "Magistrate Vossler",
"clade": "cervidae",
"species": "elk",
"bias_profile": "COVENANT_FAITHFUL",
"faction": "covenant_enforcers",
"dialogue": "millhaven_magistrate",
"hp": 14,
"ac": 11,
"ability_scores": { "STR": 11, "DEX": 10, "CON": 12, "INT": 14, "WIS": 14, "CHA": 13 }
},
{
"id": "millhaven_constable_fenn",
"role_tag": "millhaven.constable_fenn",
"named": true,
"name": "Constable Aldous Fenn",
"clade": "canidae",
"species": "coyote",
"bias_profile": "COVENANT_FAITHFUL",
"faction": "covenant_enforcers",
"default_allegiance": "neutral",
"dialogue": "millhaven_constable",
"hp": 18,
"ac": 13,
"ability_scores": { "STR": 13, "DEX": 13, "CON": 13, "INT": 11, "WIS": 13, "CHA": 11 }
},
{
"id": "millhaven_innkeeper",
"role_tag": "millhaven.innkeeper",
"named": true,
"name": "Mara Threadwell",
"clade": "leporidae",
"species": "rabbit",
"bias_profile": "URBAN_PROGRESSIVE",
"dialogue": "millhaven_innkeeper",
"hp": 11,
"ac": 10,
"ability_scores": { "STR": 9, "DEX": 11, "CON": 13, "INT": 12, "WIS": 14, "CHA": 14 }
},
{
"id": "millhaven_general_store",
"role_tag": "millhaven.general_store_keeper",
"named": true,
"name": "Tovis Quill",
"clade": "mustelidae",
"species": "ferret",
"bias_profile": "MERCHANT_NEUTRAL",
"faction": "merchant_guilds",
"dialogue": "millhaven_general_store",
"hp": 9,
"ac": 10
},
{
"id": "millhaven_smith",
"role_tag": "millhaven.smith",
"named": true,
"name": "Garrik Ironpaw",
"clade": "ursidae",
"species": "brown_bear",
"bias_profile": "MUSTELID_PRAGMATIST",
"dialogue": "millhaven_smith",
"hp": 16,
"ac": 11
},
{
"id": "millhaven_alchemist",
"role_tag": "millhaven.alchemist",
"named": true,
"name": "Sela Whiskerbloom",
"clade": "felidae",
"species": "housecat",
"bias_profile": "URBAN_PROGRESSIVE",
"dialogue": "millhaven_alchemist",
"hp": 8,
"ac": 10
},
{
"id": "millhaven_grandmother_asha",
"role_tag": "millhaven.grandmother_asha",
"named": true,
"name": "Grandmother Asha",
"clade": "canidae",
"species": "wolf",
"bias_profile": "CANID_TRADITIONALIST",
"dialogue": "millhaven_grandmother_asha",
"hp": 9,
"ac": 9,
"ability_scores": { "STR": 8, "DEX": 9, "CON": 10, "INT": 14, "WIS": 16, "CHA": 13 }
},
{
"id": "millhaven_lacroix",
"role_tag": "millhaven.lacroix",
"named": true,
"name": "Fen Lacroix",
"clade": "canidae",
"species": "coyote",
"bias_profile": "FRONTIER_NIHILIST",
"faction": "maw",
"default_allegiance": "neutral",
"dialogue": "millhaven_lacroix",
"hp": 16,
"ac": 13,
"ability_scores": { "STR": 12, "DEX": 14, "CON": 12, "INT": 12, "WIS": 11, "CHA": 13 }
},
{
"id": "thornfield_magistrate",
"role_tag": "thornfield.magistrate",
"named": true,
"name": "Lord Inspector Halberd",
"clade": "cervidae",
"species": "moose",
"bias_profile": "COVENANT_FAITHFUL",
"faction": "covenant_enforcers",
"dialogue": "thornfield_magistrate",
"hp": 16,
"ac": 12
},
{
"id": "thornfield_innkeeper",
"role_tag": "thornfield.innkeeper",
"named": true,
"name": "Renna Stoutpaw",
"clade": "ursidae",
"species": "brown_bear",
"bias_profile": "MERCHANT_NEUTRAL",
"dialogue": "thornfield_innkeeper",
"hp": 12,
"ac": 10
},
{
"id": "thornfield_dr_venn",
"role_tag": "thornfield.dr_venn",
"named": true,
"name": "Dr. Marisol Venn",
"clade": "felidae",
"species": "leopard",
"bias_profile": "URBAN_PROGRESSIVE",
"dialogue": "thornfield_dr_venn",
"hp": 10,
"ac": 11,
"ability_scores": { "STR": 10, "DEX": 13, "CON": 12, "INT": 17, "WIS": 15, "CHA": 12 }
},
{
"id": "thornfield_general_store",
"role_tag": "thornfield.general_store_keeper",
"named": true,
"name": "Pell Marrowbright",
"clade": "leporidae",
"species": "hare",
"bias_profile": "MERCHANT_NEUTRAL",
"faction": "merchant_guilds",
"dialogue": "thornfield_general_store",
"hp": 9,
"ac": 10
}
]
@@ -0,0 +1,28 @@
{
"id": "cave.natural_chamber",
"name": "Natural Chamber",
"type": "cave",
"built_by": "none",
"size_class": "medium",
"roles_eligible": ["entry", "transit"],
"footprint_w_tiles": 10,
"footprint_h_tiles": 8,
"grid": [
"##########",
"#........#",
"#..S.....#",
"D....@...D",
"#........#",
"#........#",
"#........#",
"##########"
],
"doors": [
{ "x": 0, "y": 3, "facing": "W" },
{ "x": 9, "y": 3, "facing": "E" }
],
"encounter_slots": [
{ "x": 5, "y": 3, "kind": "WildAnimal", "weight": 1.0 }
],
"weight": 1.0
}
@@ -0,0 +1,31 @@
{
"id": "cave.wild_den",
"name": "Wild Den",
"type": "cave",
"built_by": "mustelid",
"size_class": "small",
"roles_eligible": ["dead-end", "boss"],
"footprint_w_tiles": 8,
"footprint_h_tiles": 6,
"grid": [
"########",
"#......#",
"D...@..#",
"#..@C@.#",
"#......#",
"########"
],
"doors": [
{ "x": 0, "y": 2, "facing": "W" }
],
"encounter_slots": [
{ "x": 4, "y": 2, "kind": "WildAnimal", "weight": 1.0 },
{ "x": 3, "y": 3, "kind": "WildAnimal", "weight": 1.0 },
{ "x": 5, "y": 3, "kind": "WildAnimal", "weight": 1.0 }
],
"container_slots": [
{ "x": 4, "y": 3, "loot_table_band": "t1" }
],
"narrative_text": "Bones, scraps of leather, and the lingering musk of carnivore. Recent kills. They sleep nearby.",
"weight": 1.0
}
@@ -0,0 +1,41 @@
{
"id": "imperium.boss_throne_room",
"name": "Throne Room",
"type": "imperium",
"built_by": "imperium",
"size_class": "large",
"roles_eligible": ["boss"],
"footprint_w_tiles": 14,
"footprint_h_tiles": 10,
"grid": [
"##############",
"#............#",
"#.P........P.#",
"#............#",
"D....@..@....#",
"#......@.....#",
"#............#",
"#.P...C....P.#",
"#............#",
"##############"
],
"doors": [
{ "x": 0, "y": 4, "facing": "W" }
],
"encounter_slots": [
{ "x": 5, "y": 4, "kind": "PoiGuard", "weight": 1.0 },
{ "x": 8, "y": 4, "kind": "PoiGuard", "weight": 1.0 },
{ "x": 7, "y": 5, "kind": "Boss", "weight": 1.0 }
],
"container_slots": [
{ "x": 6, "y": 7, "loot_table_band": "t3" }
],
"decos": [
{ "x": 2, "y": 2, "deco": "pillar" },
{ "x": 11, "y": 2, "deco": "pillar" },
{ "x": 2, "y": 7, "deco": "pillar" },
{ "x": 11, "y": 7, "deco": "pillar" }
],
"narrative_text": "A throne of black stone sits at the chamber's far end. The figure slumped in it has not been alive for a very long time, and yet — something behind its hollow eyes still tracks you.",
"weight": 1.0
}
@@ -0,0 +1,27 @@
{
"id": "imperium.coliseum_corridor_short",
"name": "Coliseum Corridor (Short)",
"type": "imperium",
"built_by": "imperium",
"size_class": "small",
"roles_eligible": ["transit"],
"footprint_w_tiles": 12,
"footprint_h_tiles": 6,
"grid": [
"############",
"D..........D",
"#....@.....#",
"#.....@....#",
"#..........#",
"############"
],
"doors": [
{ "x": 0, "y": 1, "facing": "W" },
{ "x": 11, "y": 1, "facing": "E" }
],
"encounter_slots": [
{ "x": 5, "y": 2, "kind": "PoiGuard", "weight": 1.0 },
{ "x": 6, "y": 3, "kind": "PoiGuard", "weight": 1.0 }
],
"weight": 1.0
}
@@ -0,0 +1,32 @@
{
"id": "imperium.entry_grand_hall",
"name": "Grand Hall",
"type": "imperium",
"built_by": "imperium",
"size_class": "medium",
"roles_eligible": ["entry"],
"footprint_w_tiles": 12,
"footprint_h_tiles": 8,
"grid": [
"############",
"#..........#",
"#.P......P.#",
"#..........D",
"#....S.....#",
"#..........D",
"#.P......P.#",
"############"
],
"doors": [
{ "x": 11, "y": 3, "facing": "E" },
{ "x": 11, "y": 5, "facing": "E" }
],
"decos": [
{ "x": 2, "y": 2, "deco": "pillar" },
{ "x": 9, "y": 2, "deco": "pillar" },
{ "x": 2, "y": 6, "deco": "pillar" },
{ "x": 9, "y": 6, "deco": "pillar" }
],
"narrative_text": "Four broken pillars frame a worn floor. The Imperium emblem inlaid in the centre has been chipped down to bare stone — defaced more than weathered.",
"weight": 1.0
}
@@ -0,0 +1,34 @@
{
"id": "imperium.pillar_room_cardinal",
"name": "Pillared Antechamber",
"type": "imperium",
"built_by": "imperium",
"size_class": "medium",
"roles_eligible": ["transit", "loot"],
"footprint_w_tiles": 10,
"footprint_h_tiles": 8,
"grid": [
"##########",
"#........#",
"#.P....P.#",
"D........D",
"#...C....#",
"#.P....P.#",
"#........#",
"##########"
],
"doors": [
{ "x": 0, "y": 3, "facing": "W" },
{ "x": 9, "y": 3, "facing": "E" }
],
"container_slots": [
{ "x": 4, "y": 4, "loot_table_band": "t2" }
],
"decos": [
{ "x": 2, "y": 2, "deco": "pillar" },
{ "x": 7, "y": 2, "deco": "pillar" },
{ "x": 2, "y": 5, "deco": "pillar" },
{ "x": 7, "y": 5, "deco": "pillar" }
],
"weight": 1.0
}
@@ -0,0 +1,32 @@
{
"id": "imperium.sarcophagus_chamber",
"name": "Sarcophagus Chamber",
"type": "imperium",
"built_by": "imperium",
"size_class": "medium",
"roles_eligible": ["transit", "loot"],
"footprint_w_tiles": 10,
"footprint_h_tiles": 8,
"grid": [
"##########",
"#........#",
"#..@..@..#",
"D........#",
"#...C....#",
"#........#",
"#........#",
"##########"
],
"doors": [
{ "x": 0, "y": 3, "facing": "W" }
],
"encounter_slots": [
{ "x": 3, "y": 2, "kind": "PoiGuard", "weight": 1.0 },
{ "x": 6, "y": 2, "kind": "PoiGuard", "weight": 1.0 }
],
"container_slots": [
{ "x": 4, "y": 4, "loot_table_band": "t2", "locked": true, "lock": "medium" }
],
"narrative_text": "Two stone sarcophagi flank a third, larger one in the center. The lid of the central tomb has been pried open from within.",
"weight": 1.0
}
@@ -0,0 +1,27 @@
{
"id": "mine.entry_shaft",
"name": "Mine Entry Shaft",
"type": "mine",
"built_by": "none",
"size_class": "small",
"roles_eligible": ["entry"],
"footprint_w_tiles": 8,
"footprint_h_tiles": 8,
"grid": [
"########",
"#......#",
"#......#",
"#..S..@D",
"#......#",
"#......#",
"#......#",
"########"
],
"doors": [
{ "x": 7, "y": 3, "facing": "E" }
],
"encounter_slots": [
{ "x": 6, "y": 3, "kind": "Brigand", "weight": 1.0 }
],
"weight": 1.0
}
@@ -0,0 +1,28 @@
{
"id": "mine.mineral_vein_room",
"name": "Mineral Vein Chamber",
"type": "mine",
"built_by": "none",
"size_class": "medium",
"roles_eligible": ["transit", "loot", "dead-end"],
"footprint_w_tiles": 10,
"footprint_h_tiles": 8,
"grid": [
"##########",
"#........#",
"#........#",
"D...C....#",
"#........#",
"#........#",
"#........#",
"##########"
],
"doors": [
{ "x": 0, "y": 3, "facing": "W" }
],
"container_slots": [
{ "x": 4, "y": 3, "loot_table_band": "t1" }
],
"narrative_text": "A dark seam in the rock catches the lantern-light: copper, maybe silver beneath. The miners who broke this open never came back to finish the job.",
"weight": 1.0
}
@@ -0,0 +1,28 @@
{
"id": "mine.tunnel_T",
"name": "Tunnel T-Junction",
"type": "mine",
"built_by": "none",
"size_class": "small",
"roles_eligible": ["transit"],
"footprint_w_tiles": 10,
"footprint_h_tiles": 6,
"grid": [
"##########",
"#........#",
"D........D",
"#...@@...#",
"#........D",
"##########"
],
"doors": [
{ "x": 0, "y": 2, "facing": "W" },
{ "x": 9, "y": 2, "facing": "E" },
{ "x": 9, "y": 4, "facing": "E" }
],
"encounter_slots": [
{ "x": 4, "y": 3, "kind": "Brigand", "weight": 1.0 },
{ "x": 5, "y": 3, "kind": "Brigand", "weight": 1.0 }
],
"weight": 1.0
}
@@ -0,0 +1,71 @@
{
"id": "millhaven",
"kind": "preset",
"anchor": "Millhaven",
"buildings": [
{
"template": "magistrate",
"offset": [-12, -12],
"role_overrides": {
"magistrate": "millhaven.magistrate",
"constable": "millhaven.constable_fenn"
}
},
{
"template": "inn_medium",
"offset": [-2, 0],
"role_overrides": {
"innkeeper": "millhaven.innkeeper",
"barfly": "millhaven.lacroix"
}
},
{
"template": "shop_general",
"offset": [10, -2],
"role_overrides": {
"shopkeeper": "millhaven.general_store_keeper"
}
},
{
"template": "shop_smithy",
"offset": [12, 8],
"role_overrides": {
"smith": "millhaven.smith"
}
},
{
"template": "shop_alchemist",
"offset": [-12, 6],
"role_overrides": {
"alchemist": "millhaven.alchemist"
}
},
{
"template": "house_medium",
"offset": [-2, 12],
"role_overrides": {
"resident": "millhaven.grandmother_asha"
}
},
{
"template": "house_medium",
"offset": [6, 12]
},
{
"template": "house_small",
"offset": [-12, -2]
},
{
"template": "house_small",
"offset": [-6, 8]
},
{
"template": "granary",
"offset": [12, -10]
},
{
"template": "well",
"offset": [3, -3]
}
]
}
@@ -0,0 +1,14 @@
{
"id": "procedural_tier1",
"kind": "procedural",
"tier": 1,
"category_weights": {
"inn": 0.10,
"shop": 0.30,
"house": 0.40,
"civic": 0.10,
"infrastructure": 0.10
},
"target_building_count": 14,
"plaza_radius_tiles": 24
}
@@ -0,0 +1,14 @@
{
"id": "procedural_tier2",
"kind": "procedural",
"tier": 2,
"category_weights": {
"inn": 0.10,
"shop": 0.30,
"house": 0.45,
"civic": 0.05,
"infrastructure": 0.10
},
"target_building_count": 12,
"plaza_radius_tiles": 22
}
@@ -0,0 +1,13 @@
{
"id": "procedural_tier3",
"kind": "procedural",
"tier": 3,
"category_weights": {
"inn": 0.12,
"shop": 0.30,
"house": 0.50,
"infrastructure": 0.08
},
"target_building_count": 8,
"plaza_radius_tiles": 16
}
@@ -0,0 +1,13 @@
{
"id": "procedural_tier4",
"kind": "procedural",
"tier": 4,
"category_weights": {
"inn": 0.15,
"shop": 0.20,
"house": 0.55,
"infrastructure": 0.10
},
"target_building_count": 5,
"plaza_radius_tiles": 12
}
@@ -0,0 +1,11 @@
{
"id": "procedural_tier5",
"kind": "procedural",
"tier": 5,
"category_weights": {
"house": 0.70,
"infrastructure": 0.30
},
"target_building_count": 3,
"plaza_radius_tiles": 8
}
@@ -0,0 +1,55 @@
{
"id": "thornfield",
"kind": "preset",
"anchor": "Thornfield",
"buildings": [
{
"template": "magistrate",
"offset": [-15, -15],
"role_overrides": {
"magistrate": "thornfield.magistrate"
}
},
{
"template": "inn_medium",
"offset": [4, -10],
"role_overrides": {
"innkeeper": "thornfield.innkeeper"
}
},
{
"template": "shop_alchemist",
"offset": [-12, 4],
"role_overrides": {
"alchemist": "thornfield.dr_venn"
}
},
{
"template": "shop_general",
"offset": [10, 6],
"role_overrides": {
"shopkeeper": "thornfield.general_store_keeper"
}
},
{
"template": "shop_smithy",
"offset": [-3, 14]
},
{
"template": "house_medium",
"offset": [12, -2]
},
{
"template": "house_medium",
"offset": [-15, 14]
},
{
"template": "house_medium",
"offset": [4, 6]
},
{
"template": "house_small",
"offset": [14, 14]
}
]
}
+302
View File
@@ -0,0 +1,302 @@
[
{
"id": "wolf",
"clade_id": "canidae",
"name": "Wolf-Folk",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "jaws_of_the_alpha", "name": "Jaws of the Alpha", "description": "Unarmed bite deals 1d8 + STR piercing (1d10 at level 5, 1d12 at level 11). On crit, target makes a STR save (DC = 8 + prof + STR) or is grappled." },
{ "id": "tireless_pursuit", "name": "Tireless Pursuit", "description": "Forced march for additional CON-mod hours before exhaustion. Advantage on CON checks vs. exhaustion from prolonged activity." },
{ "id": "howl", "name": "Howl", "description": "Action: territorial howl audible to 1 mile. Allied Canidae who hear gain advantage on next attack roll or save within 1 minute. Once per long rest." }
],
"detriments": [
{ "id": "dominance_reflex", "name": "Dominance Reflex", "description": "When publicly challenged, WIS save (DC 12) or compelled to respond with aggression or dominance display." },
{ "id": "heavy_frame", "name": "Heavy Frame", "description": "Disadvantage on DEX (Stealth) checks in enclosed or quiet environments." }
]
},
{
"id": "fox",
"clade_id": "canidae",
"name": "Fox-Folk",
"size": "medium",
"ability_mods": { "DEX": 1 },
"base_speed_ft": 35,
"traits": [
{ "id": "vulpine_agility", "name": "Vulpine Agility", "description": "Base speed 35 ft. Move through the space of any creature one size larger without penalty." },
{ "id": "clever_paws", "name": "Clever Paws", "description": "Proficiency with Thieves' Tools and one additional tool of choice." },
{ "id": "tricksters_mask", "name": "Trickster's Mask", "description": "Advantage on CHA (Deception) checks. Once per long rest, suppress natural scent for 1 hour, imposing disadvantage on tracking and identification by smell." }
],
"detriments": [
{ "id": "fragile_frame", "name": "Fragile Frame", "description": "Hit point maximum reduced by 1 per level (minimum 1 HP per level)." },
{ "id": "canid_prejudice", "name": "Canid Prejudice", "description": "Disadvantage on CHA (Persuasion) against wolf-folk until competence has been demonstrated to that individual." }
]
},
{
"id": "coyote",
"clade_id": "canidae",
"name": "Coyote-Folk",
"size": "medium",
"ability_mods": { "CHA": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "urban_adaptation", "name": "Urban Adaptation", "description": "Proficiency in Survival in urban environments. Find food, water, and shelter in any settlement within 1 hour. Advantage on checks to navigate sewers, rooftops, and alleys." },
{ "id": "scavengers_stomach", "name": "Scavenger's Stomach", "description": "Advantage on CON saves vs. ingested poisons and disease from spoiled food. Subsist on half the normal food and water requirements." },
{ "id": "opportunist", "name": "Opportunist", "description": "Reaction: when a creature within 5 ft. is hit by an ally's attack, make a single melee attack against that creature. Uses equal to proficiency bonus per long rest." }
],
"detriments": [
{ "id": "distrusted", "name": "Distrusted", "description": "Disadvantage on CHA checks to establish trust with strangers from established institutions (merchants' guilds, noble houses, military)." },
{ "id": "restless_blood", "name": "Restless Blood", "description": "Disadvantage on checks or saves involving long-duration waiting, stakeouts, or monotonous tasks." }
]
},
{
"id": "lion",
"clade_id": "felidae",
"name": "Lion-Folk",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "commanding_presence", "name": "Commanding Presence", "description": "Proficiency in Intimidation (expertise if already proficient). When intimidating, may roar — creatures within 15 ft. who hear it make a WIS save (DC = 8 + prof + CHA) or are frightened until end of next turn. Once per short rest." },
{ "id": "pride_fighter", "name": "Pride Fighter", "description": "Lion-folk can both grant and benefit from flanking. When you and an ally are adjacent to the same enemy, both gain +2 to attack rolls against that enemy." },
{ "id": "mane_guard", "name": "Mane Guard", "description": "+1 AC against attacks targeting the neck or throat." }
],
"detriments": [
{ "id": "territorial_ego", "name": "Territorial Ego", "description": "Disadvantage on CHA (Persuasion) when negotiating shared resources, territory, or leadership positions." },
{ "id": "heat_lethargy", "name": "Heat Lethargy", "description": "In temperatures above 90°F, CON save (DC 10) every hour of strenuous activity or gain a level of exhaustion." }
]
},
{
"id": "leopard",
"clade_id": "felidae",
"name": "Leopard-Folk",
"size": "medium",
"ability_mods": { "DEX": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "ambush_predator", "name": "Ambush Predator", "description": "Attacking a creature that hasn't acted yet in combat or is unaware deals +1d6 damage on the first hit (+2d6 at level 9)." },
{ "id": "arboreal_hunter", "name": "Arboreal Hunter", "description": "Climb speed equal to walking speed. Advantage on Athletics checks to climb. Move at full speed while climbing without penalty." },
{ "id": "shadow_pelt", "name": "Shadow Pelt", "description": "Advantage on Stealth checks in dim light or darkness." }
],
"detriments": [
{ "id": "lone_operator", "name": "Lone Operator", "description": "Disadvantage on group skill checks (coordinated efforts, team athletics, group stealth)." },
{ "id": "trigger_reflexes", "name": "Trigger Reflexes", "description": "When surprised by sudden movement within 5 ft., WIS save (DC 10) or reflexively lash out with a claw attack against the triggering creature." }
]
},
{
"id": "housecat",
"clade_id": "felidae",
"name": "Housecat-Folk",
"size": "small",
"ability_mods": { "INT": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "unassuming", "name": "Unassuming", "description": "Advantage on Stealth in social settings (crowds, parties, meetings). Advantage on the first Deception check in any social encounter with a new creature." },
{ "id": "tight_spaces", "name": "Tight Spaces", "description": "Squeeze through openings sized for Tiny creatures without penalty. Advantage on checks to escape grapples and restraints." },
{ "id": "nine_lives", "name": "Nine Lives", "description": "When reduced to 0 HP, can choose to drop to 1 HP instead. Once per long rest." }
],
"detriments": [
{ "id": "size_matters", "name": "Size Matters", "description": "Disadvantage on STR checks and saves against creatures two or more sizes larger. Carrying capacity halved. Heavy weapons cannot be used effectively." },
{ "id": "compulsive_curiosity", "name": "Compulsive Curiosity", "description": "When presented with a mystery, hidden space, or unknown object out of combat, WIS save (DC 12) or spend at least one action investigating." }
]
},
{
"id": "ferret",
"clade_id": "mustelidae",
"name": "Ferret-Folk",
"size": "small",
"ability_mods": { "CHA": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "weaver", "name": "Weaver", "description": "Move through any opening at least 6 inches wide. No penalty for combat in cramped spaces (tunnels, crawlspaces)." },
{ "id": "social_charm", "name": "Social Charm", "description": "Advantage on Deception and Persuasion checks against creatures who underestimate you for your size." }
],
"detriments": [
{ "id": "small_frame", "name": "Small Frame", "description": "Carrying capacity halved. Heavy weapons cannot be used effectively." }
]
},
{
"id": "badger",
"clade_id": "mustelidae",
"name": "Badger-Folk",
"size": "medium",
"ability_mods": { "CON": 1 },
"base_speed_ft": 25,
"traits": [
{ "id": "burrower", "name": "Burrower", "description": "Burrow speed of 10 ft. through loose soil, sand, or snow. Cannot burrow through stone or hardpacked earth." },
{ "id": "tenacious_grip", "name": "Tenacious Grip", "description": "Advantage on grapple attempts. Targets you grapple have disadvantage on checks to escape." }
],
"detriments": [
{ "id": "stocky_build", "name": "Stocky Build", "description": "Base speed 25 ft. Disadvantage on long-jump checks." }
]
},
{
"id": "wolverine",
"clade_id": "mustelidae",
"name": "Wolverine-Folk",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "savage_jaws", "name": "Savage Jaws", "description": "Unarmed bite deals 1d8 + STR piercing. On a critical hit, the wound bleeds: 1d4 damage at the start of the target's turn for 2 turns." },
{ "id": "indomitable_ferocity", "name": "Indomitable Ferocity", "description": "When reduced to 0 HP, drop to 1 HP instead. Once per long rest." }
],
"detriments": [
{ "id": "feared_kin", "name": "Feared Kin", "description": "Disadvantage on CHA (Persuasion) checks with non-Mustelid creatures who recognize your species. Wolverine reputation precedes you." }
]
},
{
"id": "brown_bear",
"clade_id": "ursidae",
"name": "Brown Bear-Folk",
"size": "large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "rending_claws", "name": "Rending Claws", "description": "Unarmed claw attacks deal 1d8 + STR slashing. Two-paw rend: if both claw attacks hit the same target in one Attack action, deal an extra 1d6 damage." },
{ "id": "winter_hibernation", "name": "Winter Hibernation", "description": "Once per year, enter a deep restorative sleep for 1d4 weeks. On waking, fully heal and remove all levels of exhaustion." }
],
"detriments": []
},
{
"id": "polar_bear",
"clade_id": "ursidae",
"name": "Polar Bear-Folk",
"size": "large",
"ability_mods": { "WIS": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "arctic_adaptation", "name": "Arctic Adaptation", "description": "Resistance to cold damage. Immunity to environmental cold effects. Swim speed equal to walking speed." },
{ "id": "white_pelt", "name": "White Pelt", "description": "Advantage on Stealth checks in snow, ice, or arctic terrain." }
],
"detriments": [
{ "id": "polar_appetite", "name": "Polar Appetite", "description": "Requires triple rations daily. Without them, gain a level of exhaustion every 8 hours." }
]
},
{
"id": "elk",
"clade_id": "cervidae",
"name": "Elk-Folk",
"size": "medium_large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "majestic_antlers", "name": "Majestic Antlers", "description": "Antler attack deals 1d8 + STR piercing. Charging attack: if you move at least 20 ft. straight before attacking, deal +1d6 damage and target makes a STR save (DC = 8 + prof + STR) or is knocked back 5 ft." }
],
"detriments": [
{ "id": "antler_drag", "name": "Antler Drag", "description": "During antler-shed season (1 month per year), antlers fall off — antler attack damage reduced by 1 die step until they regrow." }
]
},
{
"id": "deer",
"clade_id": "cervidae",
"name": "Deer-Folk",
"size": "medium",
"ability_mods": { "DEX": 1 },
"base_speed_ft": 35,
"traits": [
{ "id": "swift_strider", "name": "Swift Strider", "description": "Base speed 35 ft. Difficult terrain costs no extra movement when moving in a straight line." },
{ "id": "alert_eyes", "name": "Alert Eyes", "description": "You cannot be surprised while conscious." }
],
"detriments": [
{ "id": "skittish", "name": "Skittish", "description": "When taking damage from a hidden or unseen attacker, WIS save (DC 12) or use your reaction to move 10 ft. away from the attack source." }
]
},
{
"id": "moose",
"clade_id": "cervidae",
"name": "Moose-Folk",
"size": "large",
"ability_mods": { "CON": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "broad_antlers", "name": "Broad Antlers", "description": "Antler attack deals 1d10 + STR piercing. Charging attack: if you move at least 20 ft. straight before attacking, target makes a STR save (DC = 8 + prof + STR) or is knocked prone." },
{ "id": "swamp_strider", "name": "Swamp Strider", "description": "No movement penalty in marsh, mud, snow, or shallow water." }
],
"detriments": []
},
{
"id": "rabbit",
"clade_id": "leporidae",
"name": "Rabbit-Folk",
"size": "small",
"ability_mods": { "WIS": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "warren_dweller", "name": "Warren Dweller", "description": "Burrow speed 10 ft. through loose soil. Advantage on Stealth checks in your home warren. Community Resilience: once per long rest, when within 30 ft. of two or more allies, regain 1d4 + level HP." },
{ "id": "powerful_legs", "name": "Powerful Legs", "description": "Standing long jump distance equals your speed; running long jump doubles it." }
],
"detriments": [
{ "id": "small_prey", "name": "Small Prey", "description": "Carrying capacity halved. Disadvantage on STR saves against creatures two or more sizes larger." }
]
},
{
"id": "hare",
"clade_id": "leporidae",
"name": "Hare-Folk",
"size": "medium",
"ability_mods": { "CON": 1 },
"base_speed_ft": 45,
"traits": [
{ "id": "open_ground_runner", "name": "Open Ground Runner", "description": "Base speed 45 ft. (fastest of any species). When you Dash, you can move through enemies' spaces if you end your movement outside their reach." },
{ "id": "wild_born", "name": "Wild Born", "description": "Proficiency in Survival. Advantage on CON saves against environmental exposure (cold, heat, wind, rain)." },
{ "id": "jackrabbit_dodge", "name": "Jackrabbit Dodge", "description": "Reaction when targeted by a ranged attack you can see, with at least 5 ft. of movement space: impose disadvantage on the attack roll. Uses equal to proficiency bonus per long rest." }
],
"detriments": [
{ "id": "solitary_streak", "name": "Solitary Streak", "description": "Cannot benefit from Community Resilience effects. Disadvantage on checks involving group coordination." },
{ "id": "exposed", "name": "Exposed", "description": "Cannot benefit from full cover that involves enclosed spaces smaller than your body — claustrophobia is mechanical." }
]
},
{
"id": "bull",
"clade_id": "bovidae",
"name": "Bull-Folk",
"size": "large",
"ability_mods": { "STR": 1 },
"base_speed_ft": 25,
"traits": [
{ "id": "charge", "name": "Charge", "description": "If you move at least 20 ft. straight toward a target and hit with a horn attack, target takes +2d6 bludgeoning and makes a STR save (DC = 8 + prof + STR) or is knocked prone." },
{ "id": "iron_constitution", "name": "Iron Constitution", "description": "Resistance to poison damage. Advantage on saves against poison and disease." },
{ "id": "immovable_anchor", "name": "Immovable Anchor", "description": "Bonus action: plant yourself. Until the start of your next turn, cannot be moved against your will and AC +2. Speed becomes 0." }
],
"detriments": [
{ "id": "seeing_red", "name": "Seeing Red", "description": "When reduced to half HP by a melee attack, WIS save (DC 13) or compelled to attack the damaging creature on next turn, ignoring tactics." },
{ "id": "hooves_not_paws", "name": "Hooves, Not Paws", "description": "Disadvantage on checks requiring fine manual dexterity (lockpicking, surgery, calligraphy)." }
]
},
{
"id": "ram",
"clade_id": "bovidae",
"name": "Ram-Folk",
"size": "medium",
"ability_mods": { "WIS": 1 },
"base_speed_ft": 30,
"traits": [
{ "id": "mountain_born", "name": "Mountain Born", "description": "Climb speed equal to walking speed. Immune to altitude sickness. Advantage on DEX checks and saves on narrow, unstable, or steep surfaces." },
{ "id": "headbutt", "name": "Headbutt", "description": "Horn attack deals 1d10 + STR when using Charge (20-ft. run-up). Target hit must make a CON save (DC = 8 + prof + STR) or be dazed (disadvantage on next attack roll)." },
{ "id": "wool_insulation", "name": "Wool Insulation", "description": "Resistance to cold damage. Advantage on saves against cold environments." }
],
"detriments": [
{ "id": "horizontal_pupils", "name": "Horizontal Pupils", "description": "Disadvantage on Perception checks requiring depth perception at distances greater than 60 ft." },
{ "id": "herd_mentality", "name": "Herd Mentality", "description": "When 3+ visible allies are moving in a direction, WIS save (DC 10) or feel compelled to move with them." }
]
},
{
"id": "bison",
"clade_id": "bovidae",
"name": "Bison-Folk",
"size": "large",
"ability_mods": { "CON": 1 },
"base_speed_ft": 25,
"traits": [
{ "id": "stampede_engine", "name": "Stampede Engine", "description": "Charge deals an additional 1d6 damage. If three or more bison-folk charge the same target or area, all attacks gain +1d6." },
{ "id": "prairie_endurance", "name": "Prairie Endurance", "description": "March for 16 hours before exhaustion checks begin. Advantage on CON saves against effects that would slow your movement." },
{ "id": "wall_of_fur", "name": "Wall of Fur", "description": "Resistance to non-magical bludgeoning damage." }
],
"detriments": [
{ "id": "forward_weighted", "name": "Forward-Weighted", "description": "Disadvantage on DEX saves and checks that require backward movement, pivoting, or rapid direction changes." },
{ "id": "stoic_to_a_fault", "name": "Stoic to a Fault", "description": "Disadvantage on CHA (Performance) and CHA (Persuasion) checks that require emotional expressiveness." }
]
}
]
+306
View File
@@ -0,0 +1,306 @@
[
{
"id": "pack_forged",
"class_id": "fangsworn",
"name": "Pack-Forged",
"flavor": "Alone I am a fang. Together we are jaws. Canid pack-fighting adapted into formalized combat doctrine. Fights best in formation, amplifying allies and being amplified.",
"level_features": [
{ "level": 3, "features": ["packmates_howl"] },
{ "level": 7, "features": ["coordinated_takedown"] },
{ "level": 10, "features": ["rally_the_pack"] },
{ "level": 15, "features": ["wolfpack_frenzy"] },
{ "level": 18, "features": ["alphas_stand"] }
],
"feature_definitions": {
"packmates_howl": { "name": "Packmate's Howl", "kind": "stub", "description": "When you hit a creature with a melee attack, the next ally attack against that creature has advantage. (Phase 5: deferred.)" },
"coordinated_takedown": { "name": "Coordinated Takedown", "kind": "stub", "description": "+1d6 damage when you and an ally are both within 5 ft. of the same target. (Phase 5: deferred.)" },
"rally_the_pack": { "name": "Rally the Pack", "kind": "stub", "description": "Bonus action rally — 3 allies within 30 ft. gain temp HP equal to level + CHA. (Phase 5: deferred.)" },
"wolfpack_frenzy": { "name": "Wolfpack Frenzy", "kind": "stub", "description": "When you Action Surge, an ally within 10 ft. can take an additional action on their next turn. (Phase 5: deferred.)" },
"alphas_stand": { "name": "Alpha's Stand", "kind": "stub", "description": "When reduced to 0 HP, allies within 30 ft. gain advantage on attacks and saves until end of next turn. (Phase 5: deferred.)" }
}
},
{
"id": "lone_fang",
"class_id": "fangsworn",
"name": "Lone Fang",
"flavor": "The pack is a crutch. I am enough. Solo fighters and duelists — Felid tradition of individual perfection applied to warfare.",
"level_features": [
{ "level": 3, "features": ["isolation_bonus"] },
{ "level": 7, "features": ["predators_focus"] },
{ "level": 10, "features": ["uncanny_counter"] },
{ "level": 15, "features": ["no_witnesses"] },
{ "level": 18, "features": ["perfect_kill"] }
],
"feature_definitions": {
"isolation_bonus": { "name": "Isolation Bonus", "kind": "stub", "description": "+2 attack and +1 AC when no allied creature is within 10 ft. (Phase 5: deferred.)" },
"predators_focus": { "name": "Predator's Focus", "kind": "stub", "description": "Bonus action: focus a target — advantage on attacks against it for 1 minute, disadvantage on attacks against others. (Phase 5: deferred.)" },
"uncanny_counter": { "name": "Uncanny Counter", "kind": "stub", "description": "Reaction: when a creature misses you with a melee attack, attack it with advantage. (Phase 5: deferred.)" },
"no_witnesses": { "name": "No Witnesses", "kind": "stub", "description": "Regain HP equal to level + CON when you reduce a creature to 0 HP with no allies within 30 ft. (Phase 5: deferred.)" },
"perfect_kill": { "name": "Perfect Kill", "kind": "stub", "description": "Once per long rest: maximize all damage dice on a melee hit; if it kills, take another action. (Phase 5: deferred.)" }
}
},
{
"id": "herd_wall",
"class_id": "bulwark",
"name": "Herd-Wall",
"flavor": "Shoulder to shoulder. Horn to horn. They don't get through. Bovid-originated doctrine of communal defense.",
"level_features": [
{ "level": 3, "features": ["interlock_shields"] },
{ "level": 6, "features": ["stampede_redirect"] },
{ "level": 10, "features": ["unbreakable_line"] },
{ "level": 15, "features": ["fortress"] },
{ "level": 20, "features": ["the_herd_stands"] }
],
"feature_definitions": {
"interlock_shields": { "name": "Interlock Shields", "kind": "stub", "description": "Adjacent ally: both gain +1 AC (stacks with Herd Wall to max +3 from adjacency). (Phase 5: deferred.)" },
"stampede_redirect": { "name": "Stampede Redirect", "kind": "stub", "description": "Reaction: redirect a charge against an ally to yourself, gaining resistance to the damage. (Phase 5: deferred.)" },
"unbreakable_line": { "name": "Unbreakable Line", "kind": "stub", "description": "You and adjacent allies cannot be pushed/pulled/prone in Sentinel Stance. (Phase 5: deferred.)" },
"fortress": { "name": "Fortress", "kind": "stub", "description": "In Sentinel Stance: resistance to all damage except psychic. (Phase 5: deferred.)" },
"the_herd_stands": { "name": "The Herd Stands", "kind": "stub", "description": "Last One Standing also applies to allies who return to consciousness or your aura range. (Phase 5: deferred.)" }
}
},
{
"id": "antler_guard",
"class_id": "bulwark",
"name": "Antler-Guard",
"flavor": "I don't block. I make them regret swinging. Cervid tradition of active defense — punishment-based deterrence rather than passive absorption.",
"level_features": [
{ "level": 3, "features": ["retaliatory_strike"] },
{ "level": 6, "features": ["threatening_presence"] },
{ "level": 10, "features": ["braced_for_impact"] },
{ "level": 15, "features": ["wrath_of_the_cornered"] },
{ "level": 20, "features": ["no_prey_here"] }
],
"feature_definitions": {
"retaliatory_strike": { "name": "Retaliatory Strike", "kind": "stub", "description": "When taking damage from a melee attack in Sentinel Stance, deal 1d8 + CON back automatically. (Phase 5: deferred.)" },
"threatening_presence": { "name": "Threatening Presence", "kind": "stub", "description": "Hostile creatures starting their turn within 5 ft. take -2 to attack rolls against your allies. (Phase 5: deferred.)" },
"braced_for_impact": { "name": "Braced for Impact", "kind": "stub", "description": "Reaction: halve damage of a single attack but rooted (speed 0) until next turn. (Phase 5: deferred.)" },
"wrath_of_the_cornered": { "name": "Wrath of the Cornered", "kind": "stub", "description": "Below half HP: Retaliatory Strike → 2d8 + CON, affects any attacker (not just melee). (Phase 5: deferred.)" },
"no_prey_here": { "name": "No Prey Here", "kind": "stub", "description": "Last One Standing: hostile creatures in aura make WIS save or be frightened. (Phase 5: deferred.)" }
}
},
{
"id": "blood_memory",
"class_id": "feral",
"name": "Blood Memory",
"flavor": "My great-great-grandmother ate yours. I remember how it tasted. Predator-Clade Ferals who channel the deep, dark hunger.",
"level_features": [
{ "level": 3, "features": ["predatory_surge"] },
{ "level": 6, "features": ["terror_scent"] },
{ "level": 10, "features": ["taste_of_the_old_world"] },
{ "level": 14, "features": ["apex_pursuit"] }
],
"feature_definitions": {
"predatory_surge": { "name": "Predatory Surge", "kind": "stub", "description": "While raging: when you reduce a creature to 0 HP, move half-speed and make one additional melee attack. (Phase 5: deferred.)" },
"terror_scent": { "name": "Terror Scent", "kind": "stub", "description": "Prey-Clade creatures within 15 ft. save or be frightened of you each turn while raging. (Phase 5: deferred.)" },
"taste_of_the_old_world":{ "name": "Taste of the Old World", "kind": "stub", "description": "Bite hit while raging: regain HP equal to CON. (Phase 5: deferred.)" },
"apex_pursuit": { "name": "Apex Pursuit", "kind": "stub", "description": "Speed +15 ft. toward frightened creatures. Cannot end rage while one is fleeing within 60 ft. (Phase 5: deferred.)" }
}
},
{
"id": "stampede_heart",
"class_id": "feral",
"name": "Stampede Heart",
"flavor": "You call it panic. I call it a weapon. Prey-Clade Ferals who weaponize the flight response.",
"level_features": [
{ "level": 3, "features": ["trampling_charge"] },
{ "level": 6, "features": ["contagious_panic"] },
{ "level": 10, "features": ["born_to_run"] },
{ "level": 14, "features": ["the_herds_fury"] }
],
"feature_definitions": {
"trampling_charge": { "name": "Trampling Charge", "kind": "stub", "description": "Move 20+ ft. straight before melee: +1d8 bludgeoning, save or prone. (Phase 5: deferred.)" },
"contagious_panic": { "name": "Contagious Panic", "kind": "stub", "description": "Bonus action: scream/bellow/stamp. All creatures within 15 ft. save or move 15 ft. away. (Phase 5: deferred.)" },
"born_to_run": { "name": "Born to Run", "kind": "stub", "description": "While raging, base speed doubles. Move through hostile spaces as difficult terrain. (Phase 5: deferred.)" },
"the_herds_fury": { "name": "The Herd's Fury", "kind": "stub", "description": "Hit while raging: an ally within 30 ft. can use reaction to move half-speed and attack the same target. (Phase 5: deferred.)" }
}
},
{
"id": "noseblind",
"class_id": "shadow_pelt",
"name": "Noseblind",
"flavor": "In a world where scent is truth, I am the lie. Scent-warfare specialists — the CIA of Theriapolis.",
"level_features": [
{ "level": 3, "features": ["scent_forgery"] },
{ "level": 7, "features": ["olfactory_overload"] },
{ "level": 11, "features": ["read_the_room"] },
{ "level": 15, "features": ["ghost_protocol"] }
],
"feature_definitions": {
"scent_forgery": { "name": "Scent Forgery", "kind": "stub", "description": "10-min prep: produce a scent packet mimicking an individual you've been near. (Phase 5: deferred.)" },
"olfactory_overload": { "name": "Olfactory Overload", "kind": "stub", "description": "Action: scent bomb 30-ft. radius — scent abilities save or be scent-blinded for 1 minute. (Phase 5: deferred.)" },
"read_the_room": { "name": "Read the Room", "kind": "stub", "description": "1 minute observation: determine emotional state, clade, health, diet, mask use of any creature within 30 ft. (Phase 5: deferred.)" },
"ghost_protocol": { "name": "Ghost Protocol", "kind": "stub", "description": "Scent Ghost at-will; project any scent encountered. (Phase 5: deferred.)" }
}
},
{
"id": "ambush_artist",
"class_id": "shadow_pelt",
"name": "Ambush Artist",
"flavor": "The kill is over before they know it started. Pure combat application — Felid-derived ambush doctrine refined to surgical precision.",
"level_features": [
{ "level": 3, "features": ["opening_strike"] },
{ "level": 7, "features": ["vanish"] },
{ "level": 11, "features": ["death_from_above"] },
{ "level": 15, "features": ["predators_patience"] }
],
"feature_definitions": {
"opening_strike": { "name": "Opening Strike", "kind": "stub", "description": "First round of combat: if you act before your target, Sneak Attack +2d6. (Phase 5: deferred.)" },
"vanish": { "name": "Vanish", "kind": "stub", "description": "Bonus action after attack: Hide attempt with advantage even without cover. (Phase 5: deferred.)" },
"death_from_above": { "name": "Death From Above", "kind": "stub", "description": "Attack from 10+ ft. elevation: advantage and Sneak Attack +2d6. (Phase 5: deferred.)" },
"predators_patience": { "name": "Predator's Patience", "kind": "stub", "description": "Spend a round taking no actions: next attack auto-crits if it hits. (Phase 5: deferred.)" }
}
},
{
"id": "perfumer",
"class_id": "scent_broker",
"name": "Perfumer",
"flavor": "Perfume isn't cosmetics. It's espionage. Intelligence branch — create identities, destroy reputations, extract confessions.",
"level_features": [
{ "level": 3, "features": ["bespoke_identity"] },
{ "level": 6, "features": ["scent_interrogation"] },
{ "level": 10, "features": ["mass_influence"] },
{ "level": 14, "features": ["deep_cover"] },
{ "level": 18, "features": ["the_nose_behind_the_throne"] }
],
"feature_definitions": {
"bespoke_identity": { "name": "Bespoke Identity", "kind": "stub", "description": "1 hour with kit: create a complete scent identity (clade, emotional baseline, individual markers). (Phase 5: deferred.)" },
"scent_interrogation": { "name": "Scent Interrogation", "kind": "stub", "description": "5-min conversation: extract one piece of concealed info per conversation. (Phase 5: deferred.)" },
"mass_influence": { "name": "Mass Influence", "kind": "stub", "description": "Pheromone compounds affect 60-ft. radius / up to 10 creatures. (Phase 5: deferred.)" },
"deep_cover": { "name": "Deep Cover", "kind": "stub", "description": "Bespoke Identity holds under stress and combat. (Phase 5: deferred.)" },
"the_nose_behind_the_throne":{ "name": "The Nose Behind the Throne", "kind": "stub", "description": "1 hour procedure: permanently alter a creature's scent baseline. (Phase 5: deferred.)" }
}
},
{
"id": "tracker",
"class_id": "scent_broker",
"name": "Tracker",
"flavor": "I can tell you what they had for breakfast, how long ago they passed through, and whether they were scared. Field agents and manhunters.",
"level_features": [
{ "level": 3, "features": ["bloodhound"] },
{ "level": 6, "features": ["predators_mark"] },
{ "level": 10, "features": ["terrain_reader"] },
{ "level": 14, "features": ["no_trail_goes_cold"] },
{ "level": 18, "features": ["the_hunt"] }
],
"feature_definitions": {
"bloodhound": { "name": "Bloodhound", "kind": "stub", "description": "Track any creature whose scent you've encountered within 7 days. Determine trail age by scent. (Phase 5: deferred.)" },
"predators_mark": { "name": "Predator's Mark", "kind": "stub", "description": "Mark a creature for 24 hours: know direction and approximate distance. Up to 3 marks. (Phase 5: deferred.)" },
"terrain_reader": { "name": "Terrain Reader", "kind": "stub", "description": "1-min scenting: how many creatures, their clades, emotions, and whether violence occurred (within 48 hours). (Phase 5: deferred.)" },
"no_trail_goes_cold": { "name": "No Trail Goes Cold", "kind": "stub", "description": "Tracking extends to 30 days; water/fire/chemicals impose disadvantage rather than failure. (Phase 5: deferred.)" },
"the_hunt": { "name": "The Hunt", "kind": "stub", "description": "Once per long rest: know exact location of marked target for 1 hour, double speed toward them, advantage on attacks. (Phase 5: deferred.)" }
}
},
{
"id": "the_warden",
"class_id": "covenant_keeper",
"name": "The Warden",
"flavor": "I guard the line between person and prey. No one crosses it while I breathe. Enforcement branch — patrol borders, investigate rawfang activity.",
"level_features": [
{ "level": 3, "features": ["wardens_mark"] },
{ "level": 7, "features": ["judgment"] },
{ "level": 15, "features": ["relentless_pursuit"] },
{ "level": 20, "features": ["final_judgment"] }
],
"feature_definitions": {
"wardens_mark": { "name": "Warden's Mark", "kind": "stub", "description": "Bonus action: mark a suspected violator. Know direction/distance and advantage on Insight/Perception against them for 24 hours. (Phase 5: deferred.)" },
"judgment": { "name": "Judgment", "kind": "stub", "description": "Hit a marked creature: spend Covenant's Authority for additional radiant-equivalent damage. (Phase 5: deferred.)" },
"relentless_pursuit": { "name": "Relentless Pursuit", "kind": "stub", "description": "Speed +10 toward marked creature. Cannot be slowed/restrained by non-magical means. (Phase 5: deferred.)" },
"final_judgment": { "name": "Final Judgment", "kind": "stub", "description": "Reduce a marked creature to 0 HP: declare Final Judgment. They cannot be revived/healed; nearby hostiles save or are frightened. (Phase 5: deferred.)" }
}
},
{
"id": "the_bridge",
"class_id": "covenant_keeper",
"name": "The Bridge",
"flavor": "The Covenant isn't just a prohibition. It's a promise that we can live together. Diplomatic branch — heal inter-Clade tensions.",
"level_features": [
{ "level": 3, "features": ["peacemakers_presence"] },
{ "level": 7, "features": ["empathic_bond"] },
{ "level": 15, "features": ["sanctuary_aura"] },
{ "level": 20, "features": ["the_covenant_restored"] }
],
"feature_definitions": {
"peacemakers_presence": { "name": "Peacemaker's Presence", "kind": "stub", "description": "Action: 30-ft. zone of calm for 10 minutes. Aggressive creatures save or lose hostile intent. (Phase 5: deferred.)" },
"empathic_bond": { "name": "Empathic Bond", "kind": "stub", "description": "Touch a willing creature: 1 hour mutual emotional/intent awareness. (Phase 5: deferred.)" },
"sanctuary_aura": { "name": "Sanctuary Aura", "kind": "stub", "description": "Aura of the Covenant also breaks compulsion to attack. (Phase 5: deferred.)" },
"the_covenant_restored": { "name": "The Covenant Restored", "kind": "stub", "description": "Once per long rest: 60-ft. sanctified ground for 24 hours — +2 AC and saves, doubled healing, no willing harm. (Phase 5: deferred.)" }
}
},
{
"id": "warhorn",
"class_id": "muzzle_speaker",
"name": "Warhorn",
"flavor": "My voice is the tide my allies ride to victory. Battlefield support — vocalization as force multiplier.",
"level_features": [
{ "level": 3, "features": ["rally_howl"] },
{ "level": 6, "features": ["dissonance"] },
{ "level": 11, "features": ["anthem_of_the_pack"] },
{ "level": 14, "features": ["shatter_cry"] }
],
"feature_definitions": {
"rally_howl": { "name": "Rally Howl", "kind": "stub", "description": "Action: allies within 60 ft. gain temp HP equal to CHA mod + Vocalization Die roll. (Phase 5: deferred.)" },
"dissonance": { "name": "Dissonance", "kind": "stub", "description": "Action: target one creature within 60 ft. — psychic damage = 2× Vocalization Die, disadvantage on next attack. (Phase 5: deferred.)" },
"anthem_of_the_pack": { "name": "Anthem of the Pack", "kind": "stub", "description": "1-minute concentration: allies within 30 ft. add CHA mod to damage rolls. Once per long rest. (Phase 5: deferred.)" },
"shatter_cry": { "name": "Shatter-Cry", "kind": "stub", "description": "Action: 30-ft. cone, 8d6 thunder (CON save half), deafened 1 minute. Once per long rest. (Phase 5: deferred.)" }
}
},
{
"id": "whisperfur",
"class_id": "muzzle_speaker",
"name": "Whisperfur",
"flavor": "The loudest voice in the room is never the most dangerous. Infiltration and social manipulation through voice.",
"level_features": [
{ "level": 3, "features": ["suggestion"] },
{ "level": 6, "features": ["subsonic_influence"] },
{ "level": 11, "features": ["voice_thief"] },
{ "level": 14, "features": ["mass_suggestion"] }
],
"feature_definitions": {
"suggestion": { "name": "Suggestion", "kind": "stub", "description": "1-minute soft speech: implant a suggestion (WIS save, DC = 8 + prof + CHA). 2 uses per long rest. (Phase 5: deferred.)" },
"subsonic_influence": { "name": "Subsonic Influence", "kind": "stub", "description": "Project subsonic vocalizations affecting mood (calm/unease/trust/suspicion) in 30-ft. radius for 10 minutes. No save. (Phase 5: deferred.)" },
"voice_thief": { "name": "Voice Thief", "kind": "stub", "description": "After hearing a creature speak for 5 minutes, perfectly replicate their voice. (Phase 5: deferred.)" },
"mass_suggestion": { "name": "Mass Suggestion", "kind": "stub", "description": "Suggestion targets up to 5 creatures and requires only 1 round of speaking. 3 uses per long rest. (Phase 5: deferred.)" }
}
},
{
"id": "combat_engineer",
"class_id": "claw_wright",
"name": "Combat Engineer",
"flavor": "I don't fight you. I build something that fights you. Builds turrets, traps, exoskeletons.",
"level_features": [
{ "level": 3, "features": ["deployable_turret"] },
{ "level": 6, "features": ["reinforced_armor"] },
{ "level": 10, "features": ["area_denial"] },
{ "level": 14, "features": ["titan_frame"] },
{ "level": 18, "features": ["siege_engine"] }
],
"feature_definitions": {
"deployable_turret": { "name": "Deployable Turret", "kind": "stub", "description": "Short rest build: AC 15, HP = level × 5, +INT to hit, 2d6 piercing once per round, 60-ft. range. (Phase 5: deferred.)" },
"reinforced_armor": { "name": "Reinforced Armor", "kind": "stub", "description": "Long rest enhance one armor: +1 AC and resistance to one damage type for 24 hours. (Phase 5: deferred.)" },
"area_denial": { "name": "Area Denial", "kind": "stub", "description": "Short rest: deploy up to 3 traps (explosive, ensnaring, alarm). (Phase 5: deferred.)" },
"titan_frame": { "name": "Titan Frame", "kind": "stub", "description": "Long rest build a wearable exoskeleton: +4 STR, +2 AC, +1 size category. 1 hour. Once per long rest. (Phase 5: deferred.)" },
"siege_engine": { "name": "Siege Engine", "kind": "stub", "description": "Turret fires heavy ordnance: 6d10 damage, 20-ft. radius (DEX save half). 1-round reload. (Phase 5: deferred.)" }
}
},
{
"id": "body_wright",
"class_id": "claw_wright",
"name": "Body-Wright",
"flavor": "The body is a machine. I just make it run better. Field medicine, prosthetics, biological engineering.",
"level_features": [
{ "level": 3, "features": ["combat_medic"] },
{ "level": 6, "features": ["clade_calibration"] },
{ "level": 10, "features": ["prosthetic_expert"] },
{ "level": 14, "features": ["emergency_resurrection_protocol"] },
{ "level": 18, "features": ["biological_masterwork"] }
],
"feature_definitions": {
"combat_medic": { "name": "Combat Medic", "kind": "stub", "description": "Field Repair on living creatures heals 2d8 + INT, usable as bonus action. Stabilize 0-HP creature from 30 ft. with thrown kit. (Phase 5: deferred.)" },
"clade_calibration": { "name": "Clade Calibration", "kind": "stub", "description": "1 hour study: all healing/gadget effects on that creature are maximized for 24 hours. (Phase 5: deferred.)" },
"prosthetic_expert": { "name": "Prosthetic Expert", "kind": "stub", "description": "Long rest: build functional prosthetic limbs/organs/sensory augments. Can be enhanced. (Phase 5: deferred.)" },
"emergency_resurrection_protocol":{ "name": "Emergency Resurrection Protocol", "kind": "stub", "description": "Within 1 minute of death: INT check DC 20 to revive at 1 HP with 3 levels of exhaustion. Uses entire gadget pool. (Phase 5: deferred.)" },
"biological_masterwork": { "name": "Biological Masterwork", "kind": "stub", "description": "8-hour procedure: permanently modify a willing creature — natural weapon, save advantage, or sensory ability from another clade. One per creature. (Phase 5: deferred.)" }
}
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Some files were not shown because too many files have changed in this diff Show More