diff --git a/client/tests/unit/test_content_db.gd b/client/tests/unit/test_content_db.gd index f321786..0c11ea1 100644 --- a/client/tests/unit/test_content_db.gd +++ b/client/tests/unit/test_content_db.gd @@ -130,3 +130,17 @@ func test_blurb_content_carries_no_mechanics(): "nightsight", "claws", "keen_scent"]: assert_false(db.races[id].has(banned), "%s.json leaks the mechanic '%s' — that lives in Races" % [id, banned]) + + +func test_every_race_and_calling_carries_a_fragment(): + # The DM origin panel (M4-b) composes race.fragment + calling.fragment. A + # missing one degrades to the blurb at runtime rather than crashing — but it + # must never SHIP missing, so the suite is where it fails. + for id in Races.IDS: + assert_true(db.race(id).has("fragment"), "race %s has no fragment" % id) + assert_ne(str(db.race(id).get("fragment", "")).strip_edges(), "", + "race %s has an empty fragment" % id) + for id in Callings.IDS: + assert_true(db.calling(id).has("fragment"), "calling %s has no fragment" % id) + assert_ne(str(db.calling(id).get("fragment", "")).strip_edges(), "", + "calling %s has an empty fragment" % id) diff --git a/content/world/callings/bloodsworn.json b/content/world/callings/bloodsworn.json index ff30160..093a493 100644 --- a/content/world/callings/bloodsworn.json +++ b/content/world/callings/bloodsworn.json @@ -1 +1 @@ -{ "id": "bloodsworn", "name": "Bloodsworn", "blurb": "You made a bargain with one of the Seven and it was accepted. The power is real. So is the ledger, and it is not settled." } +{ "id": "bloodsworn", "name": "Bloodsworn", "blurb": "You made a bargain with one of the Seven and it was accepted. The power is real. So is the ledger, and it is not settled.", "fragment": "something answered when you called it, and it has been keeping accounts ever since." } diff --git a/content/world/callings/bonesetter.json b/content/world/callings/bonesetter.json index 0ad877f..a58459a 100644 --- a/content/world/callings/bonesetter.json +++ b/content/world/callings/bonesetter.json @@ -1 +1 @@ -{ "id": "bonesetter", "name": "Bonesetter", "blurb": "The Warden is distant and does not explain himself. Still — you set the bone, you say the words, and often enough the rot does not take. Often enough." } +{ "id": "bonesetter", "name": "Bonesetter", "blurb": "The Warden is distant and does not explain himself. Still — you set the bone, you say the words, and often enough the rot does not take. Often enough.", "fragment": "you set the bone, you say the words over it, and you have stopped claiming to know which one matters." } diff --git a/content/world/callings/cutpurse.json b/content/world/callings/cutpurse.json index 697a3f6..296da5e 100644 --- a/content/world/callings/cutpurse.json +++ b/content/world/callings/cutpurse.json @@ -1 +1 @@ -{ "id": "cutpurse", "name": "Cutpurse", "blurb": "Purses, locks, confidences — you have taken all three. The trick was never the hands. It was knowing which pocket was worth it." } +{ "id": "cutpurse", "name": "Cutpurse", "blurb": "Purses, locks, confidences — you have taken all three. The trick was never the hands. It was knowing which pocket was worth it.", "fragment": "quick fingers, quicker exits, and a knife for the rest." } diff --git a/content/world/callings/hedge_mage.json b/content/world/callings/hedge_mage.json index 26ff24b..b884056 100644 --- a/content/world/callings/hedge_mage.json +++ b/content/world/callings/hedge_mage.json @@ -1 +1 @@ -{ "id": "hedge_mage", "name": "Hedge-Mage", "blurb": "No tower took you. What you know, you got from a book you should not have had and a teacher who is not alive to confirm it." } +{ "id": "hedge_mage", "name": "Hedge-Mage", "blurb": "No tower took you. What you know, you got from a book you should not have had and a teacher who is not alive to confirm it.", "fragment": "what you know came out of a stolen book, and there is no one left to tell you what you got wrong." } diff --git a/content/world/callings/reaver.json b/content/world/callings/reaver.json index 24b3fc2..07c0a10 100644 --- a/content/world/callings/reaver.json +++ b/content/world/callings/reaver.json @@ -1 +1 @@ -{ "id": "reaver", "name": "Reaver", "blurb": "They hire you when they want a door opened and do not care about the door. You do not wear plate. You have never needed it." } +{ "id": "reaver", "name": "Reaver", "blurb": "They hire you when they want a door opened and do not care about the door. You do not wear plate. You have never needed it.", "fragment": "they point you at a door and pay you not to care what is behind it." } diff --git a/content/world/callings/sellsword.json b/content/world/callings/sellsword.json index 2aff2e5..ed41905 100644 --- a/content/world/callings/sellsword.json +++ b/content/world/callings/sellsword.json @@ -1 +1 @@ -{ "id": "sellsword", "name": "Sellsword", "blurb": "You fight for money. You are good at it, and the work has never once run out." } +{ "id": "sellsword", "name": "Sellsword", "blurb": "You fight for money. You are good at it, and the work has never once run out.", "fragment": "you sell the swing and let the man paying keep the reasons." } diff --git a/content/world/callings/trapper.json b/content/world/callings/trapper.json index 3031d0a..9cc8690 100644 --- a/content/world/callings/trapper.json +++ b/content/world/callings/trapper.json @@ -1 +1 @@ -{ "id": "trapper", "name": "Trapper", "blurb": "You worked the treelines until the treelines ran out of anything worth taking. A snare does the waiting for you, and you have learned to wait." } +{ "id": "trapper", "name": "Trapper", "blurb": "You worked the treelines until the treelines ran out of anything worth taking. A snare does the waiting for you, and you have learned to wait.", "fragment": "you learned to sit still in the wet dark until something else made the mistake." } diff --git a/content/world/races/beastfolk.json b/content/world/races/beastfolk.json index 4dde59a..dde61e4 100644 --- a/content/world/races/beastfolk.json +++ b/content/world/races/beastfolk.json @@ -1 +1 @@ -{ "id": "beastfolk", "name": "Beastfolk", "blurb": "Claws you did not ask for and a nose you cannot switch off. Every gate you pass, someone decides what you are before you speak." } +{ "id": "beastfolk", "name": "Beastfolk", "blurb": "Claws you did not ask for and a nose you cannot switch off. Every gate you pass, someone decides what you are before you speak.", "fragment": "You were born with claws the Margreave never learned to ignore, and you have spent your life being looked at a beat too long." } diff --git a/content/world/races/dwarf.json b/content/world/races/dwarf.json index 1a5bc4b..7de1a3e 100644 --- a/content/world/races/dwarf.json +++ b/content/world/races/dwarf.json @@ -1 +1 @@ -{ "id": "dwarf", "name": "Dwarf", "blurb": "You have drunk worse and survived worse. The rot that takes other men tends to think better of it." } +{ "id": "dwarf", "name": "Dwarf", "blurb": "You have drunk worse and survived worse. The rot that takes other men tends to think better of it.", "fragment": "You came up in stone and cold water, among folk who bury their dead deep and do not speak of them again." } diff --git a/content/world/races/elf.json b/content/world/races/elf.json index 6755cb9..719f958 100644 --- a/content/world/races/elf.json +++ b/content/world/races/elf.json @@ -1 +1 @@ -{ "id": "elf", "name": "Elf", "blurb": "You see in the dark and you notice things. Neither has made you popular in a town that would rather not be noticed." } +{ "id": "elf", "name": "Elf", "blurb": "You see in the dark and you notice things. Neither has made you popular in a town that would rather not be noticed.", "fragment": "You come from a people the Margreave tolerates from a distance, and you have never been in a room where that was not clear." } diff --git a/content/world/races/human.json b/content/world/races/human.json index 373054e..d483ad0 100644 --- a/content/world/races/human.json +++ b/content/world/races/human.json @@ -1 +1 @@ -{ "id": "human", "name": "Human", "blurb": "Short-lived, adaptable, everywhere. The Margreave is mostly yours, for whatever that has been worth." } +{ "id": "human", "name": "Human", "blurb": "Short-lived, adaptable, everywhere. The Margreave is mostly yours, for whatever that has been worth.", "fragment": "You were born in one of the Margreave's thousand small towns, and it let you go without asking where." }