Skip to main content
Core

# TDGS CHARACTER CREATION - AI REFERENCE

Document 13 | Structured specification for AI parsing

## SEVEN STEPS

CHARACTER_CREATION_STEPS = [ "1. Choose Race", "2. Generate Stats", "3. Roll Luck", "4. Choose Class(es)", "5. Apply Class Bonuses", "6. Calculate Derived Values", "7. Finishing Touches" ]

## STEP 1: CHOOSE RACE

RACE_DETERMINES = [ "stat_ranges", // Min and max starting values per stat "size", // How big you are "innate_traits" // Natural abilities, weapons, armor ] // See Document 11 (Races) for race structure and templates // Race sets boundaries; everything else works within them

## STEP 2: GENERATE STATS (ROLLING)

ROLLING_METHOD: dice: "4d6 drop lowest" baseline: 12 // 4d6 drop lowest averages 12.25, not 10 function roll_stat(racial_min, racial_max): roll = sum(sorted(roll_d6() for _ in range(4))[1:]) // 4d6 drop lowest delta = roll - 12 racial_avg = (racial_min + racial_max) / 2 final = racial_avg + delta return clamp(final, racial_min, racial_max) // Example: Human STR (range 6-14, avg 10) // Roll 15 -> Delta +3 -> 10 + 3 = 13 ? // Roll 8 -> Delta -4 -> 10 - 4 = 6 ? // Roll 5 -> Delta -7 -> 10 - 7 = 3 -> capped to 6 HEROIC_POOL_ROLLING: dice: "2d6 drop lowest" optional: true can_exceed_racial_range: true distribution: "any stats"

## STEP 2: GENERATE STATS (POINT BUY)

POINT_BUY_METHOD: base_pool: "Sum of all racial stat averages (8 stats)" heroic_pool: "2d6 drop lowest (optional, GM discretion)" total: base_pool + heroic_pool POINT_BUY_RULES: base_pool: stays_in_racial_range: true heroic_pool: can_exceed_racial_range: true cost: "1:1" // Example: Human // Base Pool = 10 x 8 = 80 points // Heroic Pool = 2d6 drop lowest = 1-6 points // Heroic points can push stats above racial max (14) // Example: Dragon // Base Pool = 40+20+45+20+20+30+20+27 = 222 points

## STEP 3: ROLL LUCK

LUCK_GENERATION: dice: "d20" outcomes: 1: -1 // 5% chance 2-19: 0 // 90% chance 20: +1 // 5% chance // Exception: If race grants LUK range (e.g., Leprechaun +2 to +6), // use delta method for that range instead of d20 function roll_luck(has_racial_luk_range=false, racial_luk_range=null): if has_racial_luk_range: return roll_stat_with_delta(racial_luk_range) roll = roll_d20() if roll == 1: return -1 if roll == 20: return 1 return 0

## STEP 4: CHOOSE CLASS

CLASS_PROVIDES = [ "abilities", // Skills, Spells, Traits "tier_unlocks", // Access to higher-tier abilities "stat_bonuses" // Bonuses from training (Step 5) ] CLASS_REQUIREMENTS: type: "soft" // Guidance, not gates // A STR 6 character CAN take Fighter; they'll struggle // TDGS allows bad decisions; math handles consequences STARTING_LEVEL: default: 1 override: "GM discretion for experienced campaigns" MULTICLASSING: allowed: true requires: "GM permission and XP" typical: "Single class at Level 1" // See Document 10 (Classes) for class structure and templates

## STEP 5: APPLY CLASS BONUSES

CLASS_BONUSES: timing: "After stat generation, before derived values" can_exceed_racial_range: true // Training exceeds natural limits // Example: // Base STR (from rolling): 12 // Fighter 1 grants: +1 STR // Apparent STR: 13

## STEP 6: DERIVED VALUES

DERIVED_VALUES: HP = apparent_CON x 5 Knockout = HP x 0.05 // Round down; unconscious when HP <= Knockout POWER_TIER: base = (STR + DEX + CON + INT + WIS + CHA + REF + MOV) / 8 apparent = (apparent_stats) / 8 rounding: "down" luck_included: false // At creation, Base and Apparent Power Tier are often same // They diverge as equipment is acquired // Example: Human Fighter // Stats: STR 13, DEX 10, CON 12, INT 10, WIS 10, CHA 10, REF 10, MOV 10 // HP = 12 x 5 = 60 // Knockout = 60 x 0.05 = 3 // Base Power Tier = 85 / 8 = 10

## STEP 7: FINISHING TOUCHES

FINISHING_TOUCHES = [ "equipment", // Setting-dependent "name", "background", "personality", "goals", "appearance" ] EQUIPMENT: source: "Content-dependent (setting)" examples: medieval_fantasy: ["swords", "shields"] scifi: ["pistols", "neural jacks"] post_apocalypse: ["scrap", "scavenged gear"] determined_by: "GM/setting"

## QUICK REFERENCE

// ROLLING STATS for each of 8 stats: roll = 4d6_drop_lowest() delta = roll - 12 stat = racial_avg + delta stat = clamp(stat, racial_min, racial_max) heroic_pool = 2d6_drop_lowest() // Optional // Distribute heroic points; can exceed racial range // POINT BUY base_pool = sum(racial_averages) heroic_pool = 2d6_drop_lowest() // Optional // Spend 1:1; base in range, heroic can exceed // LUCK roll_d20: 1=-1, 2-19=0, 20=+1 // Unless race grants LUK range // DERIVED VALUES HP = apparent_CON x 5 Knockout = HP x 0.05 Power_Tier = sum(8_stats) / 8 // No LUK

## EXAMPLE: HUMAN FIGHTER

// Step 1: Race race = "Human" stat_ranges = { STR: [6, 14], DEX: [6, 14], CON: [6, 14], INT: [6, 14], WIS: [6, 14], CHA: [6, 14], REF: [6, 14], MOV: [8, 12] } // Step 2: Generate Stats (Rolling) rolls = {STR: 14, DEX: 11, CON: 15, INT: 9, WIS: 12, CHA: 10, REF: 13, MOV: 8} deltas = {STR: +2, DEX: -1, CON: +3, INT: -3, WIS: 0, CHA: -2, REF: +1, MOV: -4} stats = {STR: 12, DEX: 9, CON: 13, INT: 7, WIS: 10, CHA: 8, REF: 11, MOV: 8} // MOV capped from 6 to 8 heroic_pool = 5 // Rolled 2d6 drop lowest: (2, 5) -> keep 5 stats.STR += 3 // Now 15 stats.CON += 2 // Now 15 // Step 3: Roll Luck luck_roll = 7 // d20 result LUK = 0 // 2-19 = 0 // Step 4: Choose Class class = "Fighter" // Recommended STR 10+, have STR 12 ? // Gain: Power Strike +1, Shield Use +1, Armor Training (Trait) // Step 5: Apply Class Bonuses // Fighter 1 grants no stat bonuses in this example final_stats = {STR: 15, DEX: 9, CON: 15, INT: 7, WIS: 10, CHA: 8, REF: 11, MOV: 8, LUK: 0} // Step 6: Derived Values HP = 15 x 5 = 75 Knockout = 75 x 0.05 = 3 Base_Power_Tier = (15+9+15+7+10+8+11+8) / 8 = 83 / 8 = 10 // Step 7: Finishing Touches name = "Garrett Cole" background = "Former town guard" personality = "Cautious, protective" goals = "Earn enough gold to buy a farm"

## KEY CONSTANTS

STAT_GENERATION: ROLL_DICE = "4d6 drop lowest" ROLL_BASELINE = 12 HEROIC_DICE = "2d6 drop lowest" LUCK_GENERATION: DICE = "d20" UNLUCKY_ROLL = 1 LUCKY_ROLL = 20 DERIVED_VALUES: HP_MULTIPLIER = 5 KNOCKOUT_MULTIPLIER = 0.05 POWER_TIER_DIVISOR = 8 POWER_TIER_STAT_COUNT = 8 // Excludes LUK

## DESIGN NOTES

DESIGN_PRINCIPLES: - Baseline 12 (not 10) because 4d6 drop lowest averages 12.25 - Heroic Pool represents the spark that makes heroes exceptional - Class requirements are soft; TDGS allows bad decisions - Race sets boundaries; class bonuses can exceed them - LUK is special: rolled separately, never bought - Same system works for Goblins and Gods (delta method scales) - Equipment is content-dependent, not system-defined - Stats are capability; choices are character