magicciv/.project/objectives/p1-35-unit-lore-paragraphs.md
Natalie 2a5649c6d4 feat(@projects): add combat calculator & unit objectives system
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-27 01:04:12 -07:00

3.9 KiB
Raw Blame History

id title priority status scope owner updated_at assigned_by blockedBy evidence remaining_work
p1-35 Per-unit lore paragraphs — historical/cultural context for the dwarven roster p1 done game1 shipwright 2026-04-27 shipwright
p1-34
56 unit JSONs in public/games/age-of-dwarves/data/units/ have a `lore` field with 35 sentences each (verified: `grep -c '"lore":' *.json | grep -c ':1$'` = 56). Coverage: 50 newly-authored dwarven military + 6 existing dwarven uniques (berserker/runesmith/ironwarden/forge_titan/mithril_vanguard plus 1 duplicate-counted).
Voice consistency verified against tech-file pattern (foundations.json + dwarven_warfare.json). Lore references clan of origin (uses clan_affinity from p1-34), historical event, distinguishing doctrine, and named ancestors (e.g., Thrain Emberforge for Mountain King).
Tier-appropriate voice: T1 shield_bearer reads as 'first day of training'; T5 powder_sapper as 'industrial-era institutional'; T10 mountain_king as 'once-per-generation mythic, no clan has produced two'.
No magic / Game 2/3 lore leakage. Dwarven naming conventions (hard consonants K/Z/Th, -dak/-rik/-en suffixes) used for clan/ancestor names.
Sample T10 lore (mountain_king): 'The Ancestral Armoury opens of its own accord — a dwarf walks in, and the runes choose. No clan has ever produced two Mountain Kings in the same generation, and no hold has ever forced the succession. The plate is bound to ten thousand names; the wearer carries every one. Ironhold's Thrain Emberforge wore it for eighty years; the plate has not yet chosen his successor. Deepforge built the armoury, but they did not design the choosing — they maintain the lock and have never needed to open it.'
React build verification: pnpm --prefix .project/designs/app run build exits 0 with new lore field present (additive change)

Summary

The newly authored 50-unit dwarven roster has strong one-liner flavor but no paragraph-length cultural/historical context. Each unit needs a lore field explaining its place in dwarven society — which clan invented it, what historical event birthed it, why it survived in the doctrine.

Existing dwarven voice anchors (from data/techs/foundations.json and advanced_military.json):

  • "We do not learn the mountain. We remember it." (dwarf_heritage)
  • "A spear alone is courage. A line of spears is an empire." (combined_arms)
  • "It is not magic. The runes only ask the powder to remember its purpose." (gunpowder, this work)

The lore field should sit ALONGSIDE flavor (added by p1-34) and provide 35 sentences of cultural worldbuilding. Surfaced in the player guide encyclopedia and in unit detail panels.

Acceptance criteria

  • All 50 newly-authored dwarven military units (per the T1T10 roster in .project/objectives/<this> plus the existing dwarven uniques berserker, runesmith, ironwarden, forge_titan, mithril_vanguard, cavalry-as-dwarven if applicable) have a lore field
  • lore is 35 sentences, present-tense or past-tense as the voice fits, that reference: clan of origin, historical event/era, distinguishing doctrine, optional ancestor name
  • Voice matches the established dwarven flavor pattern (the tech-file voice — terse, declarative, mountain/iron/oath imagery)
  • Each lore paragraph fits the unit's tier and place in the chain (T1 Shield Bearer reads as "first day of training"; T10 Mountain King reads as "once-per-generation event")
  • No spoilers for Game 2/3 lore (stay in dwarven mundane scope)
  • Wild creatures and existing non-dwarven units (warrior, spearmen, archer, pikeman) are out of scope for this pass

Dispatch hint

This is a writing-heavy task. The implementing agent should batch-author in groups of 510 units per archetype to maintain voice consistency. The existing flavor one-liners (now in flavor field after p1-34) are the seed; expand each into a paragraph that justifies the one-liner.