systemText
Every sentence the engine produces. The engine holds no prose of its own.
The engine emits a key and its facts. These decide the words, in any language. 200 keys, 54 of them fragments.
Two tiers, and why they differ
A fragment is a piece another message interpolates, such as the word that fills
{outcome} in an attack line. Nothing sensible can stand in for a missing one and the sentence around it would render with a hole, so fragments are required in the document, and a world that omits one will not load. A message stands on its own and carries a default, so you write only what you want to change.A value is a string, or a pool reference for weighted, condition gated variation.
"narrative": {
"systemText": {
"combat.died": "{name} falls.",
"move.blocked": { "pool": "blocked_lines" }
}
}Placeholders below are the ones a message cannot lose. Dropping one stops the world loading. A new world already has every required fragment. Starting from an existing ruleset brings the rest across.
| Key | Tier | Must keep | What it says | Default |
|---|---|---|---|---|
grammar.and | fragment | Joins the last two items of a list. | and | |
grammar.or | fragment | Joins alternatives, as in a gate's unmet requirements. | or | |
grammar.list.separator | fragment | Between all but the last two items of a list. | , | |
grammar.list.pair | fragment | {first}{last}{conjunction} | A list of exactly two. | {first} {conjunction} {last} |
grammar.list.many | fragment | {head}{last}{conjunction} | A list of three or more; `head` is already joined. | {head} {conjunction} {last} |
grammar.article.consonant | fragment | {noun} | Indefinite article before a consonant. | a {noun} |
grammar.article.vowel | fragment | {noun} | Indefinite article before a vowel. | an {noun} |
grammar.count | fragment | {number}{noun} | A counted noun, as in "three hounds". | {number} {noun} |
grammar.plural | fragment | {noun} | How a counted noun is made plural when the content declares no plural of its own. | {noun}s |
grammar.smallNumbers | fragment | Number words from zero upward, space separated. Counts past the end of this ladder are written as digits. | no one two three four five six seven eight nine ten | |
unit.round | fragment | One round of combat, singular. | round | |
unit.rounds | fragment | Rounds of combat, plural. | rounds | |
direction.north | fragment | Bearing word, interpolated into `{direction}`. | north | |
direction.south | fragment | Bearing word. | south | |
direction.east | fragment | Bearing word. | east | |
direction.west | fragment | Bearing word. | west | |
direction.northeast | fragment | Bearing word. | northeast | |
direction.northwest | fragment | Bearing word. | northwest | |
direction.southeast | fragment | Bearing word. | southeast | |
direction.southwest | fragment | Bearing word. | southwest | |
direction.here | fragment | Bearing to the tile you are standing on. | right here | |
direction.nearby | fragment | Bearing too close or too diagonal to name. | nearby | |
roll.line | fragment | {total}{parts} | A roll shown as its arithmetic, so a player can learn the system. | {total} ({parts}){versus}{swing} |
roll.versus | fragment | {difficulty} | The number a roll was measured against. | vs {difficulty} |
roll.swing | fragment | {swing} | Advantage or disadvantage on a roll. | [{swing}] |
combat.outcome.critical | fragment | How a critical reads in an attack line. | a critical hit | |
combat.outcome.success | fragment | How a success reads in an attack line. | a hit | |
combat.outcome.failure | fragment | How a failure reads in an attack line. | a miss | |
combat.outcome.fumble | fragment | How a fumble reads in an attack line. | a fumble | |
combat.attack.unnamed | fragment | Stands in when an attack names no ability. | attacks | |
combat.check.unnamed | fragment | Stands in when a check names neither skill nor attribute. | check | |
combat.damaged.resisted | fragment | {raw} | Appended when resistance or vulnerability changed the number. | ({raw} before resistance) |
combat.attacked | message | {attacker}{target}{roll}{outcome} | One attack, with its arithmetic. | {attacker} — {ability} on {target}: {roll} — {outcome}. |
combat.checked | message | {who}{roll} | A skill or attribute check. | {who} — {what}: {roll}. |
combat.saved | message | {who}{roll} | A saving throw. | {who} — {save} save: {roll}. |
combat.damaged | message | {who}{amount} | Damage taken. | {who} takes {amount}{type} damage{resisted}. |
combat.healed | message | {who}{amount} | A resource restored. | {who} recovers {amount}. |
combat.died | message | {who} | A creature dies. | {who} falls. |
combat.conditionApplied | message | {who}{condition} | A condition takes hold. | {who} is {condition}. |
combat.conditionExpired | message | {who}{condition} | A condition runs out. | {who} is no longer {condition}. |
combat.conditionResisted | message | {who}{condition} | A condition is saved against. | {who} shrugs off {condition}. |
combat.reacted | message | {who} | A reaction fires. | {who} reacts. |
combat.started | message | {who} | A fight starts, listing who is in it. | Combat begins — {who}. |
combat.ended.victory | message | The party won. | The fight is over. | |
combat.ended.fled | message | The party escaped. | You are not followed. | |
combat.ended.defeat | message | The party lost. | The party falls. | |
combat.round | message | {round} | A new round begins. | — round {round} — |
combat.turn | message | {who} | Whose turn it is. | {who}'s turn. |
move.blocked | message | {what} | Something stopped a step: a wall, or somebody standing there. | Blocked by {what}. |
move.blocked.edge | fragment | What stopped a step when it was the end of the map rather than any terrain. | the edge of the world | |
item.taken | message | {items} | Picked up. | Taken: {items}. |
item.lost | message | {items} | Gone from the party's hands. | Lost: {items}. |
item.dropped | message | {who}{items} | A body's spoils, named so they get picked up. | {who} leaves {items} behind. |
trade.bought | message | {items}{who}{price} | A purchase. | Bought {items} from {who} for {price}. |
trade.sold | message | {items}{who}{price} | A sale. | Sold {items} to {who} for {price}. |
currency.gained | message | {amount} | Coin arriving any way other than a sale. | You are {amount} the richer. |
currency.lost | message | {amount} | Coin leaving any way other than a purchase. | You are {amount} the poorer. |
trap.sprung | message | {who}{trap} | A trap fires. | {who} sets off {trap}! |
trap.disarmed | message | {who}{trap} | A trap is made safe. | {who} disarms the {trap}. |
discovered.trap | message | {what} | A trap is noticed before it fires. | You spot {what}. |
discovered.place | message | {what} | A hidden place is found. | You find {what}. |
progress.xp | message | {who}{amount} | Experience awarded. | {who} gains {amount} experience. |
progress.level | message | {who}{level} | A level gained. | {who} reaches level {level}. |
gate.opened.bypass | fragment | Appended when a gate was forced rather than opened. | — forced | |
gate.opened.ability | fragment | Appended when an ability opened a gate. | — by power | |
gate.blocked.missing | fragment | {what} | Appended to a blocked gate, listing what would open it. | You would need {what}. |
gate.opened | message | {gate} | A gate gives way. | {gate} opens{how}. |
gate.blocked | message | {gate} | A gate holds. | {gate} will not open.{missing} |
requirement.item | fragment | {item} | An item a requirement asks for. | the {item} |
requirement.skill | fragment | {skill}{rank} | A skill rank a requirement asks for. | {skill} {rank} |
requirement.quest | fragment | {quest}{status} | A quest state a requirement asks for. | {quest} {status} |
requirement.faction | fragment | {faction} | Reputation a requirement asks for. | standing with the {faction} |
requirement.level | fragment | {level} | A level a requirement asks for. | level {level} |
requirement.ability | fragment | {ability} | An ability a requirement asks for. | the {ability} ability |
lore.learned | message | {lore} | The party works something out. Nobody asked them to, so it is a note, not a quest. | You note it down: {lore} |
lore.learned.sourced | message | {lore}{source} | The same, when the entry records where it came from. | You note it down: {lore} ({source}) |
quest.offered | message | {who}{quest} | Somebody offers a job. | {who} has work for you: {quest}. |
quest.started | message | {quest}{description} | A job taken, with what it asks of you. | New quest: {quest} — {description} |
quest.started.plain | message | {quest} | A job taken that has no description. | New quest: {quest}. |
quest.stage | message | {stage} | A quest moves on, when the stage wrote no journal prose. | {stage} |
quest.stage.journal | message | {stage}{journal} | A quest moves on, with the stage's own journal line. | {stage} — {journal} |
quest.objective | message | {objective} | One objective done. | Objective complete: {objective} |
quest.completed | message | {quest} | A job finished. | Quest complete: {quest}. |
quest.failed | message | {quest}{reason} | A job lost. | Quest failed: {quest} — {reason}. |
quest.failed.abandoned | fragment | Why a quest was lost: the party walked away from it. | abandoned | |
quest.failed.conditions | fragment | Why a quest was lost: its `failWhen` became true. | conditions changed | |
quest.failed.timedOut | fragment | Why a quest was lost: its deadline ran out. | too much time passed | |
quest.failed.expired | fragment | Why a quest was lost: its time ran out while you were elsewhere. | time ran out | |
party.stance | message | {stance} | The party changes how carefully it moves. | You move at a {stance}. |
party.following | message | The party closes up. | The others fall in behind you. | |
party.spread | message | The party stops following. | The party spreads out. | |
time.dayBroke | message | {day} | A new day. | Day {day} breaks. |
reputation.improved | fragment | Which way standing moved. | improved | |
reputation.worsened | fragment | Which way standing moved. | worsened | |
reputation.changed | message | {faction}{direction}{delta} | Standing with a faction moved. | {faction}: {direction} ({delta}). |
deed.witness | fragment | One witness. | witness | |
deed.witnesses | fragment | Several witnesses. | witnesses | |
deed.unseen | message | A deed nobody witnessed. | Nobody saw that. | |
deed.witnessed | message | {witnesses} | A deed that was seen. | {witnesses} to that. |
game.victory | message | The game is won. | You have won. | |
game.defeat | message | The game is lost. | Your party is dead. | |
sense.nearness.faint | fragment | How a weak or stale impression is introduced. | Faintly | |
sense.nearness.close | fragment | How a strong impression is introduced. | Close by | |
sense.nearness.far | fragment | How a middling impression is introduced. | Somewhere | |
sense.unnamed | fragment | Stands in when a sense declares no name. | sense | |
perception.investigating | message | {who} | A creature goes to look at what it noticed. | {who} casts about, and starts toward something. |
perception.lostInterest | message | {who} | A creature gives up looking. | {who} loses the thread of it. |
sense.empty | message | Using a sense that turns nothing up, when the sense has no name. | You stop. Nothing reaches you. | |
sense.empty.named | message | {sense} | Using a sense that turns nothing up. Always says something. | You stop. Nothing reaches you by {sense}. |
sense.impression | message | {nearness}{sense} | Noticing something, when the sense wrote no phrasing of its own. | {nearness}, something you can {sense}. |
look.creatures | message | {what} | Who else is here. | You see {what}. |
look.creature.plain | message | {name} | Looking at a creature whose statblock wrote no description. | {name}, and nothing more to be told from here. |
look.item.plain | message | {name} | Looking at an item that wrote no description. | {name}. Nothing remarkable. |
look.place.plain | message | {name} | Looking at a place that wrote no description. | {name}, from here. |
look.unseen | message | {what} | Looking at something that is not here. | You cannot see {what} from here. |
refused.actor.missing | message | The action named somebody who is not in the game. | no such character | |
refused.action.unknown | message | {action} | An action this version does not recognise. | "{action}" is not something you can do |
refused.turn.other | message | {who} | Acting out of turn. | it is {who}'s turn |
refused.select.notParty | message | Selecting somebody who is not yours to command. | not in the party | |
refused.move.noMap | message | Moving while not on a tactical map. | not on a map | |
refused.move.tooFar | message | Moving further than one tile at a time. | that is not one step away | |
refused.move.noMovement | message | Out of movement in combat. | no movement left this turn | |
refused.travel.noMap | message | Walking with no map underfoot. | nowhere to walk | |
refused.travel.noRoute | message | No path to the destination. | no way through | |
refused.travel.noRoad | message | No connection between these two areas. | there is no road that way | |
refused.travel.noWayUp | message | No route out of a dungeon by that door. | there is no way back up | |
refused.travel.notYet | message | {missing} | The way on is gated, and this is what is missing. | not yet — {missing} |
refused.travel.notYet.plain | message | The way on is gated, with nothing to say about why. | not yet | |
refused.travel.unknownArea | message | {area} | The module names no such area. | no area "{area}" |
refused.leave.noExitFound | message | Leaving a dungeon before the exit is known. | find the way out first | |
refused.leave.nowhere | message | Leaving with nowhere to go. | there is nowhere to go back to | |
refused.enter.noSuchPlace | message | {target} | Entering something that is not here. | there is no "{target}" here |
refused.enter.unknownPlace | message | The place exists in no collection. | no such place | |
refused.enter.unknownDungeon | message | {dungeon} | The module names no such dungeon. | no dungeon "{dungeon}" |
refused.attack.noWeapon | message | {who} | Attacking with no ability and no weapon. | {who} has nothing to attack with |
refused.ability.unknown | message | {ability} | The module names no such ability. | no ability "{ability}" |
refused.ability.notKnown | message | {who}{ability} | Using an ability this creature has not got. | {who} does not know {ability} |
refused.ability.prevented | message | {who} | A condition forbids the action type. | {who} cannot take that action right now |
refused.ability.requirements | message | {who}{ability} | An ability is gated and the gate is shut. | {who} does not meet the requirements for {ability} |
refused.ability.unavailable | message | {ability} | An ability's own condition says no. | {ability} cannot be used now |
refused.ability.cooldown | message | {ability}{rounds} | An ability is still cooling down. | {ability} is not ready for another {rounds} |
refused.ability.noAction | message | Out of actions in combat. | no action left this turn | |
refused.cost.shortfall | message | {resource} | An ability costs more than is left. | not enough {resource} |
refused.target.none | message | An ability that needs a target found none. | nothing to target | |
refused.target.missing | message | No target was named. | no target | |
refused.target.empty | message | The named target is gone. | nothing there | |
refused.target.elsewhere | message | The target is on another map. | not here | |
refused.target.outOfRange | message | Beyond the ability's reach. | out of range | |
refused.target.outOfReach | message | Beyond arm's length. | out of reach | |
refused.target.noSight | message | Something solid is in the way. | no line of sight | |
refused.target.covered | message | Cover blocks the shot entirely. | they are behind full cover | |
refused.flee.noCombat | message | Fleeing outside a fight. | nothing to flee from | |
refused.flee.noExit | message | Fleeing with no way out. | there is nowhere to run | |
refused.cast.silenced | message | {who} | A verbal component with speech prevented. | {who} cannot speak the words |
refused.cast.bound | message | {who} | A somatic component with gesture prevented. | {who} cannot make the signs |
refused.cast.noComponent | message | {who}{component} | A material component the caster is not carrying. | {who} has no {component} |
refused.cast.notRitual | message | {spell} | Casting as a ritual something that is not one. | {spell} cannot be cast as a ritual |
refused.cast.noSlot | message | {spell} | Out of spell slots at that level. | no slot left for {spell} |
refused.item.unknown | message | {item} | The module names no such item. | no item "{item}" |
refused.item.notCarried | message | Acting on an item nobody holds. | you are not carrying that | |
refused.take.nothingHere | message | Nothing within reach to pick up. | there is nothing here to take | |
refused.take.noSuchItem | message | {item} | That particular thing is not here. | there is no {item} here |
refused.equip.notWearable | message | {item} | Equipping something with no slot. | {item} is not something you wear |
refused.equip.notAllowed | message | {item} | Equipping something this character may not use. | {item} is not for you |
refused.unequip.notWorn | message | Taking off something not worn. | you are not wearing that | |
refused.use.nothingHappens | message | {item} | Using an item that declares no effect. | nothing happens with the {item} |
refused.use.spent | message | {item} | Using an item whose charges are gone. | the {item} is spent |
refused.give.tooFar | message | Handing something over from too far away. | they are not close enough | |
refused.search.nothing | message | A search that turned nothing up. | you find nothing here | |
refused.disarm.nothingHere | message | Disarming with no trap in reach. | there is nothing here to disarm | |
refused.open.noSuchThing | message | {target} | Opening something that is not here. | nothing here called "{target}" |
refused.open.unknownGate | message | {gate} | The module names no such gate. | no gate "{gate}" |
refused.sense.unknown | message | Using a sense the module does not declare. | nothing here works like that | |
refused.stance.unknown | message | {stance} | Setting a stance the module does not declare. | there is no way of moving called "{stance}" |
refused.follow.inCombat | message | Setting follow while fighting. | in a fight everyone acts on their own initiative | |
refused.rest.notHere | message | This place does not allow that kind of rest. | cannot rest like that here | |
refused.rest.inCombat | message | Resting during a fight. | not while fighting | |
refused.rest.interrupted | message | A rest broken into. | something came looking before you could settle | |
refused.talk.tooFar | message | Talking from across the room. | too far away to talk | |
refused.talk.nothingToSay | message | {who} | This character has no dialogue. | {who} has nothing to say |
refused.talk.unknownDialogue | message | {dialogue} | The module names no such dialogue. | no dialogue "{dialogue}" |
refused.reply.noConversation | message | Replying with no conversation open. | nobody is talking | |
refused.reply.unknown | message | Choosing a reply that is not on offer. | no such reply | |
refused.reply.locked | message | A reply that is shown but not available, and wrote no hint of its own. | you cannot say that | |
refused.buy.noStock | message | This character keeps no shop. | they have nothing to sell | |
refused.buy.noSuchItem | message | Not in stock. | they do not have that | |
refused.buy.tooExpensive | message | Not enough coin. | you cannot afford that | |
refused.sell.notBuying | message | This shop does not buy. | they are not buying | |
refused.sell.unwanted | message | This shop will not take that. | they have no use for that | |
refused.trade.barred | message | {missing} | The shop is gated, and this is why. | they will not deal with you — {missing} |
refused.trade.barred.plain | message | The shop is gated, with nothing to say about why. | they will not deal with you | |
affordance.barred | message | {what} | A way that is shut, and what would open it. | barred — needs {what} |
affordance.needs | message | {what} | A shop that will not deal, and what would change that. | needs {what} |
refused.quest.unknown | message | {quest} | The module names no such quest. | no quest "{quest}" |
refused.quest.unavailable | message | {quest} | A quest whose requirements are unmet. | {quest} is not available yet |
refused.quest.notTaken | message | Abandoning a quest nobody took. | you are not on that job | |
refused.internal.unknownResource | message | {resource} | Content named a resource the ruleset does not declare. | no resource "{resource}" |
refused.internal.unknownCondition | message | {condition} | Content named a condition the ruleset does not declare. | no condition "{condition}" |
refused.internal.unknownFaction | message | {faction} | Content named a faction the module does not declare. | no faction "{faction}" |
refused.internal.unknownOp | message | {op} | An effect this build does not know. | this engine does not implement "{op}" |