Add chance and a cast that changes between runs, and a pack to try them
An option used to do exactly what it said. Now it may carry a check: one of
four attributes (Nerve, Wits, Charm, Resolve) against a set difficulty or
against a named person's own attribute, leaning on how they regard you, with a
success and a failure. The player sees only the odds in words ("a long shot",
"likely"), never a number. The roll is one draw from the run's generator, so a
run still replays exactly from its seed and choices.
A character may be a role with several authored candidates, one drawn per run,
or a group of two to four drawn into numbered slots. Everyone carries a name, a
description and the same four attributes as the player, so a replayed pack
meets a different office. Text names people as {partner} or {clerk}, and an
event about "a clerk" binds one present clerk for the turn. The draw and the
binding are saved with the run, and a save from before a pack drew a cast gets
the same one every time it is loaded.
All of it is generic and optional: Corporate Ladder and the Frontier use none
of it and play as before. The Counting House, a one-stage office about 1910
built from the story-to-pack catalogue, exercises it, and was tuned against the
conformance suite by measurement. DECISIONS #41. Version 0.4.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018MhABSrqkwTdcybXmheDPr
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
112e558dbb
commit
3108319a2b
@@ -765,3 +765,92 @@ whether money stops mattering again, as it did in Corporate Ladder before #36.
|
||||
"Owed at the store" was asked for as "a major field at the top". It already is,
|
||||
second after Money whenever anything is owed. Whether it is prominent enough can
|
||||
only be judged in a browser, which this machine cannot render (#18).
|
||||
|
||||
## 41. Chance, and a cast that changes between runs
|
||||
|
||||
Recorded 2026-09-23. Designer's call: a change to the base engine, generic, which
|
||||
every pack may use and none has to. Corporate Ladder and the Frontier use none of
|
||||
it and replay exactly as before.
|
||||
|
||||
Until now an option did exactly what it said. Skills only decided whether an
|
||||
option was on the menu (#15, #32). The story-to-pack catalogue of recurring
|
||||
situations (asking for a rise, the door to the powerful, a colleague's needling)
|
||||
is made of moments whose outcome depends on who you are and who you are dealing
|
||||
with, so three things were added. `content/countinghouse` is the pack that exercises them.
|
||||
|
||||
**Attributes.** A pack names them in `pack.attributes`. The player's live in
|
||||
ordinary declared state (`attributes.<id>`), so they grow by effects like anything
|
||||
else. The prototype's four, agreed with the designer, are Nerve, Wits, Charm and
|
||||
Resolve. Another pack may rename them, as #14 lets it rename the interface.
|
||||
|
||||
**Checks.** An option may carry `check: { attribute, against?, opposedBy?,
|
||||
relationship?, difficulty?, modifier? }` and then must carry `success` and
|
||||
`failure`, each with its own `result` and `effects`. Its plain `effects` apply
|
||||
either way. The chance is
|
||||
|
||||
base + perPoint × (yours − theirs) + relationshipPerPoint × (their regard − centre) + modifier,
|
||||
clamped to [floor, ceiling]
|
||||
|
||||
where "theirs" is the opposing character's attribute, or the check's `difficulty`,
|
||||
or the pack's `unopposed`. Every number is the pack's, in `pack.checks` (#9).
|
||||
**The player never sees a number.** Options show the odds in words ("a long shot",
|
||||
"likely"), from bands the pack may rename, and the outcome says whether it came
|
||||
off. The roll is one draw from the run's own generator, so a run with checks still
|
||||
replays exactly from its seed and choices (#5, #6). A pack that never checks draws
|
||||
nothing extra.
|
||||
|
||||
**A cast drawn per run.** A character may be a *role* with `candidates`, several
|
||||
authored people who could fill it, and one is drawn when a run starts. A role may
|
||||
be a *group* with `count: [min, max]` (two to four clerks), which draws that many
|
||||
different people into numbered slots (`clerk_1` .. `clerk_4`). Every candidate
|
||||
carries a name, a description and the same attributes the player has, so a
|
||||
replayed pack meets a different office with different strengths. Candidates are
|
||||
authored rather than generated from random parts: a character written as sharp
|
||||
has the wits to see through a bluff, which a random attribute roll pasted onto a
|
||||
random description would not guarantee.
|
||||
|
||||
- **The draw is saved in engine-owned state** (`cast`, now a reserved root, #4)
|
||||
and made on its own stream derived from the seed, so it neither moves the event
|
||||
generator nor depends on it. `hydrate` (#36) draws one for a save that predates
|
||||
it, and draws the same one every time.
|
||||
- **Every slot up to a group's maximum is declared in the schema from the start.**
|
||||
Relationship state for `clerk_3` exists whether or not anyone was drawn into it,
|
||||
so it validates and saves like any other path. An empty slot is recorded as
|
||||
`null` and is simply absent from the run.
|
||||
- **Text names people by role.** `{partner}`, `{chief.first}` and `{clerk.title}`
|
||||
are filled in from whoever was drawn. An event about "a clerk" says
|
||||
`involves: ['clerk']`. When it is drawn, one present clerk is bound to it for
|
||||
the turn, and `{clerk}` in its text, `relationships.{clerk}.trust` in its effects
|
||||
and `against: '{clerk}'` in a check all mean that person. The binding is saved
|
||||
with the run. An event cannot fire in a run with nobody to bind. Text kept in
|
||||
state, such as a notable moment, has its placeholders pinned to the slot
|
||||
(`{clerk_2}`), so the retrospective names the right person later.
|
||||
- **The validator holds all of it:**
|
||||
- attributes declared, and every drawn person carrying all of them;
|
||||
- enough candidates for a group's maximum, and unique names;
|
||||
- checks naming real attributes and people, with both branches;
|
||||
- `{placeholders}` that name real characters, where a group is only named inside an event that binds it;
|
||||
- no placeholder in an event's own `requires`, which is evaluated before anyone is bound.
|
||||
|
||||
**What the test harness had to learn.** The archetypes score an option by its
|
||||
effects (#21). A checked option is now scored at its expected value: plain effects
|
||||
in full, and each branch weighted by its chance, the way a player reading the odds
|
||||
would. The conformance check that no repayment takes more than is owed (#38) now
|
||||
reads both branches, since a check can pay or spend on either.
|
||||
|
||||
**The prototype pack was tuned by measurement, not by eye.** Its first draft
|
||||
failed three conformance tests:
|
||||
- the routine ledgers were a third of every player's turns;
|
||||
- a careless player was broke 40% of a run;
|
||||
- it had no balance a borrower could owe.
|
||||
|
||||
Two more catalogue situations (an errand for the partner's family, and a desk you
|
||||
and a clerk both want), a lighter floor event, a loan that is refused but still
|
||||
helps a little, and an "owed to the floor" balance repaid on Saturdays brought
|
||||
those to 22% at worst, 12% at worst, and a debt that is repaid by reading the
|
||||
balance (#38).
|
||||
|
||||
**Not yet known.** Whether chance makes the same situations worth replaying, and
|
||||
whether the odds in words are legible, can only be judged by someone playing it
|
||||
(#18). The pack has one stage on purpose, so that question can be answered before
|
||||
a career is built on it.
|
||||
|
||||
Reference in New Issue
Block a user