@maka/maka-cli 5.73.0 → 5.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/_index.d.ts +0 -4
  3. package/bundle/typescript/src/commands/game/_index.js +6 -5
  4. package/bundle/typescript/src/commands/game/_index.js.map +1 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js +6 -6
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js.map +1 -1
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.d.ts +2 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +26 -7
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +29 -2
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js +10 -5
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js.map +1 -1
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/move.d.ts +42 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/move.js +288 -46
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/move.js.map +1 -1
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +8 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -1
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +20 -15
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/snoop.js +8 -1
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/snoop.js.map +1 -1
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/sustain.d.ts +48 -0
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/sustain.js +135 -0
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/sustain.js.map +1 -0
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +10 -2
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/tap.js +9 -8
  29. package/bundle/typescript/src/commands/game/sideQuest/commands/tap.js.map +1 -1
  30. package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.d.ts +83 -0
  31. package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.js +253 -0
  32. package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.js.map +1 -0
  33. package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js +116 -3
  34. package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js.map +1 -1
  35. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +3 -0
  36. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
  37. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +21 -1
  38. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
  39. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +61 -0
  40. package/bundle/typescript/src/commands/game/sideQuest/game.js +146 -23
  41. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  42. package/bundle/typescript/src/commands/game/sideQuest/headless.js +48 -5
  43. package/bundle/typescript/src/commands/game/sideQuest/headless.js.map +1 -1
  44. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +35 -0
  45. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +46 -0
  46. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  47. package/bundle/typescript/src/commands/game/sideQuest/types/repro.d.ts +158 -3
  48. package/bundle/typescript/src/commands/game/sideQuest/types/repro.js +24 -1
  49. package/bundle/typescript/src/commands/game/sideQuest/types/repro.js.map +1 -1
  50. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js +33 -3
  51. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js.map +1 -1
  52. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js +8 -8
  53. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js.map +1 -1
  54. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-vocab.d.ts +4 -2
  55. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-vocab.js +15 -3
  56. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-vocab.js.map +1 -1
  57. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.d.ts +6 -0
  58. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js.map +1 -1
  59. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.d.ts +24 -0
  60. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js +31 -0
  61. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js.map +1 -1
  62. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-names.d.ts +63 -0
  63. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-names.js +104 -0
  64. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-names.js.map +1 -0
  65. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js +4 -3
  66. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js.map +1 -1
  67. package/bundle/typescript/src/commands/game/sideQuest/utilities/identity.d.ts +26 -0
  68. package/bundle/typescript/src/commands/game/sideQuest/utilities/identity.js +37 -0
  69. package/bundle/typescript/src/commands/game/sideQuest/utilities/identity.js.map +1 -1
  70. package/bundle/typescript/src/commands/game/sideQuest/utilities/map-view.d.ts +19 -0
  71. package/bundle/typescript/src/commands/game/sideQuest/utilities/map-view.js +22 -0
  72. package/bundle/typescript/src/commands/game/sideQuest/utilities/map-view.js.map +1 -1
  73. package/bundle/typescript/src/commands/game/sideQuest/utilities/marks.js +2 -1
  74. package/bundle/typescript/src/commands/game/sideQuest/utilities/marks.js.map +1 -1
  75. package/bundle/typescript/src/commands/game/sideQuest/utilities/repro-launch.d.ts +1 -1
  76. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.d.ts +71 -18
  77. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js +109 -21
  78. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js.map +1 -1
  79. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.d.ts +38 -0
  80. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js +46 -0
  81. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js.map +1 -1
  82. package/bundle/typescript/src/commands/game/sideQuest/utilities/splash.d.ts +6 -0
  83. package/bundle/typescript/src/commands/game/sideQuest/utilities/splash.js +60 -0
  84. package/bundle/typescript/src/commands/game/sideQuest/utilities/splash.js.map +1 -0
  85. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.d.ts +31 -0
  86. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js +41 -0
  87. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js.map +1 -1
  88. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.d.ts +29 -0
  89. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.js +33 -0
  90. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.js.map +1 -0
  91. package/bundle/typescript/src/commands/game/sideQuest-backlog.sub.cmd.js +16 -11
  92. package/bundle/typescript/src/commands/game/sideQuest-backlog.sub.cmd.js.map +1 -1
  93. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.d.ts +1 -0
  94. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +100 -42
  95. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  96. package/bundle/typescript/src/commands/registry.js +1 -1
  97. package/bundle/typescript/src/commands/registry.js.map +1 -1
  98. package/bundle/typescript/src/commands/set/global.sub.cmd.js +1 -20
  99. package/bundle/typescript/src/commands/set/global.sub.cmd.js.map +1 -1
  100. package/bundle/typescript/src/generator.js +1 -0
  101. package/bundle/typescript/src/generator.js.map +1 -1
  102. package/bundle/typescript/src/templates/meteor/collection/tests.js +1 -1
  103. package/bundle/typescript/src/templates/meteor/collection/tests.js.ts +1 -1
  104. package/bundle/typescript/src/templates/react/test/test.js.jsx +31 -29
  105. package/bundle/typescript/src/templates/react/test/test.js.tsx +31 -29
  106. package/bundle/typescript/src/tools/browser/open-browser.d.ts +7 -0
  107. package/bundle/typescript/src/tools/browser/open-browser.js +21 -0
  108. package/bundle/typescript/src/tools/browser/open-browser.js.map +1 -0
  109. package/bundle/typescript/src/tools/pkg/pkg.class.js +12 -1
  110. package/bundle/typescript/src/tools/pkg/pkg.class.js.map +1 -1
  111. package/package.json +1 -1
  112. package/bundle/typescript/src/commands/game/battleship.sub.cmd.d.ts +0 -1
  113. package/bundle/typescript/src/commands/game/battleship.sub.cmd.js +0 -12
  114. package/bundle/typescript/src/commands/game/battleship.sub.cmd.js.map +0 -1
  115. package/bundle/typescript/src/commands/game/play.command.d.ts +0 -3
  116. package/bundle/typescript/src/commands/game/play.command.js +0 -18
  117. package/bundle/typescript/src/commands/game/play.command.js.map +0 -1
  118. package/bundle/typescript/src/commands/game/pong.sub.cmd.d.ts +0 -1
  119. package/bundle/typescript/src/commands/game/pong.sub.cmd.js +0 -12
  120. package/bundle/typescript/src/commands/game/pong.sub.cmd.js.map +0 -1
  121. package/bundle/typescript/src/commands/game/snake.sub.cmd.d.ts +0 -1
  122. package/bundle/typescript/src/commands/game/snake.sub.cmd.js +0 -12
  123. package/bundle/typescript/src/commands/game/snake.sub.cmd.js.map +0 -1
  124. package/bundle/typescript/src/commands/game/tetris.sub.cmd.d.ts +0 -1
  125. package/bundle/typescript/src/commands/game/tetris.sub.cmd.js +0 -12
  126. package/bundle/typescript/src/commands/game/tetris.sub.cmd.js.map +0 -1
@@ -0,0 +1,253 @@
1
+ import { Player } from '../models/player.js';
2
+ import { Room } from '../models/room.js';
3
+ import { Item } from '../models/item.js';
4
+ import { Category, Size, Rating } from '../types/shared/item-enum.js';
5
+ import { getAug, getGrade, gradedAug, STANDARD_GRADE } from '../augmentations.js';
6
+ import { getQuality, creationSplit } from '../qualities.js';
7
+ import { findCatalogItem } from '../utilities/catalog.js';
8
+ import { serializePlayer } from '../utilities/persistence.js';
9
+ import { SAVE_VERSION } from '../types/save-file.js';
10
+ /**
11
+ * THE ENGINE-SIDE CHARACTER FACTORY -- one payload in, one bootable save
12
+ * out, so the maka-cli.com web generator and the CLI cannot produce
13
+ * different runners from the same description.
14
+ *
15
+ * WHAT THIS IS NOT, because the obvious reading is wrong in two places
16
+ * and both were proposed before the code was read:
17
+ *
18
+ * - It is NOT `Game.buildSaveFile()` parameterised. That is a PRIVATE
19
+ * method on a LIVE game and it serialises contacts, gig pools, rumor
20
+ * indices, sprites and crew. A fresh character has none of that.
21
+ * - It is NOT "the path the CLI's creation walks". ui.ts builds a
22
+ * Player, calls outfitArchetype, and boots a Game; NO SAVE IS WRITTEN
23
+ * AT CREATION. The first save comes later, from a running game. There
24
+ * was no existing path to parameterise.
25
+ *
26
+ * What it IS: the same shape ui.ts uses to build the Player, then
27
+ * `serializePlayer` -- the exported serialiser the live game itself
28
+ * uses (utilities/persistence.ts) -- to write the player block. Sharing
29
+ * that function rather than restating it is the point: a second
30
+ * serialiser is a second thing to drift.
31
+ *
32
+ * DO NOT MODEL A SAVE ON headless-harness.ts's `save()`. It casts
33
+ * through `as unknown as ISaveFileV1` and omits savedAt, reason,
34
+ * summary, hubSeed and hub. It boots in tests and would be unreadable
35
+ * to the launcher's Continue menu.
36
+ */
37
+ /**
38
+ * THE PAYLOAD, frozen and co-owned with maka-cli.com. Version it here
39
+ * because the engine is the side that has to honour it -- same
40
+ * discipline as REPRO_SCHEMA_VERSION.
41
+ *
42
+ * BUMPING: MINOR for a new optional field; MAJOR when an existing field
43
+ * changes meaning or stops being honoured.
44
+ */
45
+ export const CHARGEN_FACTORY_VERSION = '1.0.0';
46
+ export class ChargenPayloadError extends Error {
47
+ constructor(message) {
48
+ super(message);
49
+ this.name = 'ChargenPayloadError';
50
+ }
51
+ }
52
+ /** Wearables a runner starts already wearing. Mirrors archetypes.ts's
53
+ * EQUIP_ON_START, which is module-private there; kept in step by a test
54
+ * that compares the two sets rather than by hoping. */
55
+ const EQUIP_ON_START = new Set([
56
+ Category.Weapon, Category.MeleeWeapon, Category.RangedWeapon,
57
+ Category.Armor, Category.BodyArmor, Category.ArmorClothing,
58
+ Category.Helmet, Category.Hat, Category.Gloves, Category.Boots, Category.Commlink,
59
+ Category.Clothing, Category.LegArmor,
60
+ ]);
61
+ /**
62
+ * ENUM KEY BACK TO ENUM VALUE -- the trap, in its third costume.
63
+ *
64
+ * headless-harness.ts records enum KEY vs VALUE costing two sessions an
65
+ * hour, and carries `enumKeyFor` for the value->key direction that a
66
+ * SAVED item needs. Catalog rows go the other way: catalog-data.ts
67
+ * declares `size: 'Tiny'` (a KEY) while the Item constructor validates
68
+ * against VALUES ('tiny') and throws outright on a mismatch.
69
+ *
70
+ * This function existing is not incidental -- the first cut of the gear
71
+ * path did not have it and died on "Invalid size value for Gel Rounds:
72
+ * Tiny". Left as a lesson rather than a silent fix, because the same
73
+ * trap will meet whoever wires the next catalog-fed feature.
74
+ */
75
+ function enumValueFor(enumObj, given) {
76
+ if (given === undefined)
77
+ return undefined;
78
+ // Already a value: nothing to do.
79
+ if (Object.values(enumObj).includes(given))
80
+ return given;
81
+ return enumObj[given] ?? given;
82
+ }
83
+ /** A catalog row is not an Item. The conversion lives here because
84
+ * nothing else in the engine needed it -- `buy` works off shelf stock
85
+ * that is already instantiated. */
86
+ function itemFromSlug(slug) {
87
+ const row = findCatalogItem(slug);
88
+ if (!row) {
89
+ throw new ChargenPayloadError(`No catalog item with slug "${slug}". Slugs come from utilities/catalog-data.ts.`);
90
+ }
91
+ return new Item({
92
+ name: row.name,
93
+ description: row.description,
94
+ category: enumValueFor(Category, row.category),
95
+ size: (enumValueFor(Size, row.size) ?? Size.Small),
96
+ rating: (enumValueFor(Rating, row.rating) ?? Rating.Standard),
97
+ shape: row.shape ?? 'Rectangle',
98
+ color: row.color ?? 'Gray',
99
+ texture: row.texture ?? 'Plain',
100
+ weight: row.weight ?? 0.5,
101
+ });
102
+ }
103
+ /**
104
+ * CANON OWNS THE CREATION LEDGER (SR5 p.71, p.94/98, via
105
+ * qualities.ts creationSplit): the positives are bought, the negatives
106
+ * refund, at most 7 karma carries into play and up to 10 more converts
107
+ * to nuyen at 2,000 a point.
108
+ *
109
+ * So the payload's karma and nuyen are VALIDATED against the derivation
110
+ * and REJECTED on mismatch -- never silently overridden. Coordinator
111
+ * ruling, and the reason is that a silent correction ships a web
112
+ * character that diverges from its CLI twin while both look fine; a
113
+ * rejection surfaces the generator's bug at the seam, once, with both
114
+ * numbers named.
115
+ */
116
+ function ledgerFor(payload) {
117
+ const derived = creationSplit(payload.qualities ?? []);
118
+ const claims = [];
119
+ if (payload.karma !== undefined && payload.karma !== derived.karma) {
120
+ claims.push(`karma: payload says ${payload.karma}, canon derives ${derived.karma}`);
121
+ }
122
+ if (payload.nuyen !== undefined && payload.nuyen !== derived.nuyen) {
123
+ claims.push(`nuyen: payload says ${payload.nuyen}, canon derives ${derived.nuyen}`);
124
+ }
125
+ if (claims.length > 0) {
126
+ throw new ChargenPayloadError(`The creation ledger disagrees with canon (SR5 p.71/94/98). ${claims.join('; ')}. `
127
+ + `Qualities given: ${(payload.qualities ?? []).join(', ') || 'none'}. `
128
+ + `The engine derives both from the qualities -- fix the generator rather than the engine.`);
129
+ }
130
+ return derived;
131
+ }
132
+ /**
133
+ * Builds the Player a payload describes. Exported separately from the
134
+ * save so a caller that wants the live object (a preview, a dossier)
135
+ * does not have to serialise and re-read one.
136
+ */
137
+ export function buildPlayerFromChargen(payload) {
138
+ if (!payload.playerName?.trim()) {
139
+ throw new ChargenPayloadError('A character needs a name.');
140
+ }
141
+ // The same nowhere-room ui.ts and buildPlayerFromSave both use: a
142
+ // Player needs somewhere to stand before a scene exists.
143
+ const nexus = new Room({
144
+ name: 'Nexus',
145
+ description: 'A featureless room where lost souls drift.',
146
+ roomType: 'void',
147
+ });
148
+ const { skills, ...attrs } = payload.combat ?? {};
149
+ const player = new Player({
150
+ playerName: payload.playerName,
151
+ startLocation: nexus,
152
+ combat: { ...attrs, skills: skills ?? {} },
153
+ });
154
+ if (payload.gender !== undefined) {
155
+ // Validated as well as typed: a payload crosses a wire as JSON,
156
+ // where a TypeScript union enforces nothing at all.
157
+ if (payload.gender !== 'male' && payload.gender !== 'female') {
158
+ throw new ChargenPayloadError(`Gender is "male" or "female" in this engine; got "${String(payload.gender)}". `
159
+ + `It is a two-value enum on Player, not free text.`);
160
+ }
161
+ player.gender = payload.gender;
162
+ }
163
+ // QUALITIES FIRST: the ledger is derived from them, and addQuality is
164
+ // what the CLI path uses.
165
+ for (const key of payload.qualities ?? []) {
166
+ if (!getQuality(key)) {
167
+ throw new ChargenPayloadError(`No quality called "${key}" (see qualities.ts QUALITIES).`);
168
+ }
169
+ player.addQuality(key);
170
+ }
171
+ const ledger = ledgerFor(payload);
172
+ player.karma += ledger.karma;
173
+ // Converted karma arrives as a CREDSTICK, never a floating number --
174
+ // currency only counts when a carrier in the pack holds it. Same
175
+ // pattern as outfitArchetype and the job-payment stick.
176
+ if (ledger.nuyen > 0) {
177
+ const stick = new Item({
178
+ name: 'Certified Credstick (gear money)',
179
+ description: 'Whatever was left when the outfitting was done -- certified, anonymous, and spending fast.',
180
+ size: Size.Tiny, category: Category.Credstick,
181
+ shape: 'Rectangle', color: 'Gunmetal', texture: 'Smooth',
182
+ rating: Rating.Standard, weight: 0.05, transferable: true,
183
+ });
184
+ stick.addCurrency(ledger.nuyen);
185
+ player.addInventory(stick);
186
+ stick.owner = player.name;
187
+ }
188
+ // CHROME BEFORE GEAR, as at creation: essence is paid first so the
189
+ // Magic/Resonance burn-down lands before anything reads the totals.
190
+ for (const entry of payload.augmentations ?? []) {
191
+ const aug = getAug(entry.key);
192
+ if (!aug) {
193
+ throw new ChargenPayloadError(`No augmentation with key "${entry.key}" (see augmentations.ts).`);
194
+ }
195
+ if (entry.grade && !getGrade(entry.grade)) {
196
+ throw new ChargenPayloadError(`No ware grade "${entry.grade}" (see WARE_GRADES).`);
197
+ }
198
+ if (!player.hasAug(entry.key)) {
199
+ player.installAug(gradedAug(aug, getGrade(entry.grade) ?? STANDARD_GRADE));
200
+ }
201
+ }
202
+ for (const entry of payload.gear ?? []) {
203
+ // QTY > 1 CANNOT BE HONOURED, and is refused rather than quietly
204
+ // granted once. Inventory is a Map keyed by lowercased name
205
+ // (models/inventory.ts addItem), so adding a second Gel Rounds
206
+ // REPLACES the first -- a runner can hold exactly one item of any
207
+ // given name. Granting one where three were asked for is the
208
+ // "quietly does less than it says" failure this codebase keeps
209
+ // paying for, and it would be invisible on the payload side.
210
+ if (entry.qty !== undefined && entry.qty > 1) {
211
+ throw new ChargenPayloadError(`"${entry.slug}" was asked for qty ${entry.qty}, and this engine cannot hold it. `
212
+ + `Inventory is keyed by item NAME, so a second copy replaces the first -- `
213
+ + `one item per name, always. Emit a single entry, or model stacks as a rating/quantity `
214
+ + `on the item itself if the catalog ever grows one.`);
215
+ }
216
+ const item = itemFromSlug(entry.slug);
217
+ player.addInventory(item);
218
+ item.owner = player.name;
219
+ if (EQUIP_ON_START.has(item.category)) {
220
+ try {
221
+ player.equip(item);
222
+ }
223
+ catch { /* a second weapon just stays holstered */ }
224
+ }
225
+ }
226
+ return player;
227
+ }
228
+ /**
229
+ * The payload's save. `hubSeed` is the SHIPPED scene2 seed by ruling --
230
+ * it is embedded rather than referenced so a resume never depends on
231
+ * scene2.json still existing or still matching.
232
+ */
233
+ export function createNewCharacterSave(payload, hubSeed) {
234
+ const player = buildPlayerFromChargen(payload);
235
+ return {
236
+ version: SAVE_VERSION,
237
+ savedAt: new Date().toISOString(),
238
+ reason: 'creation',
239
+ playerName: player.name,
240
+ summary: {
241
+ archetypeName: player.archetypeName,
242
+ karma: player.karma,
243
+ currency: player.currency,
244
+ lifestyleTier: 'street',
245
+ hubName: hubSeed.name ?? 'the hub',
246
+ },
247
+ hubSeed,
248
+ player: serializePlayer(player),
249
+ game: {},
250
+ hub: {},
251
+ };
252
+ }
253
+ //# sourceMappingURL=chargen-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chargen-factory.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/factories/chargen-factory.ts"],"names":[],"mappings":"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"}
@@ -129,10 +129,39 @@ export function buildReproScene(fixture) {
129
129
  if (items.length > MAX_ITEMS) {
130
130
  throw new ReproFixtureError(`A repro carries at most ${MAX_ITEMS} items; this one has ${items.length}.`);
131
131
  }
132
+ // A CIRCULATING NPC HOLDS NOTHING. Refused rather than resolved:
133
+ // "guarding" and "atDoorway" both mean "stands in the doorway", and
134
+ // "circulating" means "stands nowhere". A fixture asking for both
135
+ // would build, walk, and hold the door open while claiming to guard
136
+ // it -- the same silent-nothing this file exists to prevent.
137
+ const contradictory = npcs.find(n => n.circulating && (n.guarding || n.atDoorway));
138
+ if (contradictory) {
139
+ throw new ReproFixtureError(`"${contradictory.name}" is asked to circulate AND hold the doorway. `
140
+ + `A circulating NPC stands nowhere, so it can guard nothing -- pick one.`);
141
+ }
132
142
  const duplicateNpc = npcs.find((n, i) => npcs.findIndex(o => o.name === n.name) !== i);
133
143
  if (duplicateNpc) {
134
144
  throw new ReproFixtureError(`Two NPCs are both called "${duplicateNpc.name}" -- a name has to pick one body out.`);
135
145
  }
146
+ // ICE NEEDS SOMETHING TO GUARD. Refused rather than promoted to a
147
+ // host: a builder that quietly invented the host would be inventing
148
+ // the very fixture the bench exists to demonstrate.
149
+ const homelessIce = npcs.find(n => n.ice) && !fixture.host;
150
+ if (homelessIce) {
151
+ throw new ReproFixtureError(`This fixture has ice but no host. Intrusion countermeasures guard a node -- `
152
+ + `add "host": {} (or give it a rating and access) so there is something for it to be inside.`);
153
+ }
154
+ // ICE DOES NOT STAND ANYWHERE, AND CARRIES NOTHING (raised by
155
+ // backlog-session-1). Spots are MEAT positions -- spotOf returns
156
+ // undefined off the meat plane -- so a doorway or a patrol route on
157
+ // ice is silently inert rather than wrong, and silently inert is
158
+ // exactly what these invariants exist to catch. `armed` is a pistol
159
+ // and a commlink, which on a countermeasure is meaningless at best.
160
+ const misplacedIce = npcs.find(n => n.ice && (n.atDoorway || n.guarding || n.circulating || n.armed));
161
+ if (misplacedIce) {
162
+ throw new ReproFixtureError(`"${misplacedIce.name}" is ice, so it cannot also stand in a doorway, guard, circulate or carry a gun. `
163
+ + `Ice lives in the host, not on the floor -- drop the meat-side flags, or drop "ice".`);
164
+ }
136
165
  const barrier = fixture.barrier;
137
166
  const direction = barrier?.sealsExit ?? Direction.NORTH;
138
167
  const startSide = fixture.start ?? 'barrier';
@@ -208,7 +237,36 @@ export function buildReproScene(fixture) {
208
237
  if (level) {
209
238
  spots.push({ name: level.name, level: 1 });
210
239
  }
240
+ // `climbOnly` is applied AFTER the grid exists, in buildReproScene
241
+ // below -- the seed cannot express "no ladder", because the safe link
242
+ // is synthesised by the grid rather than declared by the room.
243
+ // THE HOST, on whichever side was asked for.
244
+ //
245
+ // INVARIANT 4: a host goes on ONE room, and by default the one the
246
+ // runner is standing in. A bench whose node sits behind the door it
247
+ // is also testing makes the reviewer walk before they can type the
248
+ // verb under review, and the first thing they will report is that
249
+ // `hack` says there is no host here.
250
+ const host = fixture.host;
251
+ const hostSide = host?.side ?? startSide;
252
+ if (host?.rating !== undefined && (host.rating < 1 || host.rating > 12)) {
253
+ throw new ReproFixtureError(`A host rating is 1-12 (SR5 p.247); this one is ${host.rating}.`);
254
+ }
255
+ /** hasNode/nodeAccess/hostRating/watched already mean exactly this on
256
+ * the room seed -- see types/seed/room-seed.ts. Nothing is invented
257
+ * here, so a bench cannot describe a host the engine cannot build. */
258
+ const hostFields = (side) => (host && hostSide === side
259
+ ? { hasNode: true, nodeAccess: host.access ?? 'wireless', hostRating: host.rating }
260
+ : {});
261
+ // Cameras WITHOUT a host. Never emitted alongside one: a host is
262
+ // always watched already, and saying it twice invites the next reader
263
+ // to think the two flags are independent.
264
+ const watchedFields = (side) => (fixture.watched && !(host && hostSide === side)
265
+ ? { watched: true }
266
+ : {});
211
267
  const barrierRoom = {
268
+ ...hostFields('barrier'),
269
+ ...watchedFields('barrier'),
212
270
  name: REPRO_BARRIER_ROOM,
213
271
  description: barrier
214
272
  ? `A short concrete run ending at one door, ${direction} of you. `
@@ -218,12 +276,14 @@ export function buildReproScene(fixture) {
218
276
  roomType: 'Street',
219
277
  size: level ? 'large' : 'medium',
220
278
  spots,
221
- levels: level ? [{ name: level.name, side: level.side ?? 'north', kind: level.kind ?? 'catwalk' }] : undefined,
279
+ levels: level ? [{ name: level.name, side: level.side ?? 'north', kind: level.kind ?? 'catwalk', climbOnly: level.climbOnly === true }] : undefined,
222
280
  isStartRoom: startSide === 'barrier',
223
281
  exits: [{ direction, targetRoom: REPRO_FAR_ROOM, atSpot: REPRO_DOORWAY_SPOT }],
224
282
  devices: device ? [device] : undefined,
225
283
  };
226
284
  const farRoom = {
285
+ ...hostFields('far'),
286
+ ...watchedFields('far'),
227
287
  name: REPRO_FAR_ROOM,
228
288
  description: `The other side of the door, which lies ${OPPOSITE[direction]} of you`
229
289
  + `${barrier ? ` and is held from the far side by ${device.name}` : ''}. Bare, and no further out.`,
@@ -240,6 +300,32 @@ export function buildReproScene(fixture) {
240
300
  const npcSeeds = npcs.map(npc => {
241
301
  const side = npc.side ?? 'barrier';
242
302
  const inDoorway = standsInDoorway(npc);
303
+ // ICE LIVES IN THE HOST'S ROOM, and takes its side from the host
304
+ // rather than from `side` -- one placement rule, not two. plane
305
+ // 'matrix' is what MAKES it ice (npc-seed.ts), and scene-factory
306
+ // then treats it as opposition by construction, so the fixture
307
+ // never has to declare hostility to get hostile ice.
308
+ //
309
+ // No startSpot, deliberately: a spot is a meat position and would
310
+ // be silently inert on a persona. The refusal above stops a fixture
311
+ // ASKING for one; this is the same rule on the emitting side.
312
+ if (npc.ice) {
313
+ return {
314
+ plane: 'matrix',
315
+ description: npc.concept,
316
+ dialogue: [],
317
+ player: {
318
+ name: npc.name,
319
+ startLocation: roomFor(fixture.host?.side ?? startSide),
320
+ lifestyleChoices: [],
321
+ combat: {
322
+ body: 4, agility: 4, reaction: 4, combatSkill: 3, strength: 4,
323
+ willpower: 3, logic: 3, intuition: 3, charisma: 3, edge: 2,
324
+ skills: { unarmed: 3, perception: 3, negotiation: 3 },
325
+ },
326
+ },
327
+ };
328
+ }
243
329
  return {
244
330
  description: npc.concept,
245
331
  dialogue: [],
@@ -250,7 +336,10 @@ export function buildReproScene(fixture) {
250
336
  // direction the barrier seals, never supplied -- a guarding NPC
251
337
  // standing anywhere else holds nothing, silently, and the
252
338
  // walkthrough would still pass.
253
- startSpot: inDoorway ? REPRO_DOORWAY_SPOT : REPRO_FLOOR_SPOT,
339
+ // Omitted entirely when circulating -- an undefined startSpot is
340
+ // what "no cell" means to the scene factory. Not the empty
341
+ // string, which would read as a spot whose name is nothing.
342
+ ...(npc.circulating ? {} : { startSpot: inDoorway ? REPRO_DOORWAY_SPOT : REPRO_FLOOR_SPOT }),
254
343
  guarding: npc.guarding === true,
255
344
  lifestyleChoices: [],
256
345
  combat: {
@@ -273,7 +362,7 @@ export function buildReproScene(fixture) {
273
362
  rating: 'Common',
274
363
  weight: 0.1,
275
364
  room: roomFor(it.side ?? 'barrier'),
276
- atSpot: REPRO_FLOOR_SPOT,
365
+ atSpot: it.atDoorway ? REPRO_DOORWAY_SPOT : REPRO_FLOOR_SPOT,
277
366
  }));
278
367
  // INVARIANT 4: the key is on the side the runner starts on. A key
279
368
  // behind the door it opens is a bench nobody can work, and it reads
@@ -321,6 +410,30 @@ export function buildReproScene(fixture) {
321
410
  player: {
322
411
  name: 'Testbed',
323
412
  startLocation: startRoom,
413
+ // THE RUNNER STARTS NOWHERE, and this line does not yet fix it.
414
+ //
415
+ // Stated rather than quietly omitted, because it BLOCKS the climb
416
+ // bench this fixture work exists for. Every bench NPC gets a
417
+ // spot; the runner gets none, so spotOf() returns undefined for
418
+ // the one actor a reviewer controls -- and move.ts derives
419
+ // climbSteps from that spot, so with none there is no path, no
420
+ // climb link, and no climbing test. A level fixture walks you
421
+ // onto the catwalk with no roll at all.
422
+ //
423
+ // `startSpot` IS declared on player-seed.ts and scene-factory
424
+ // never reads it for the player (NPCs get theirs applied a
425
+ // hundred lines earlier). Setting it here alone is therefore
426
+ // inert today -- kept because it is the correct INTENT and the
427
+ // seed is where the intent belongs, and reported rather than
428
+ // half-wired: the remaining piece is that something re-places the
429
+ // runner after synthesis, and the currentLocation setter clears
430
+ // atSpot on every room change.
431
+ //
432
+ // Measured, not assumed: with climbOnly the grid really does emit
433
+ // climb,climb instead of ladder,climb, and pathClimbSteps finds
434
+ // the link -- the bench still says "You cross to the catwalk"
435
+ // because the runner has no spot to path FROM.
436
+ startSpot: REPRO_FLOOR_SPOT,
324
437
  // NO RESIDENCE. Copied from paritySeed originally, where it is
325
438
  // right -- that fixture models a real run. A bench models nothing
326
439
  // and nobody lives in it; declaring a home here only invites the
@@ -1 +1 @@
1
- {"version":3,"file":"repro-scene.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/factories/repro-scene.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repro-scene.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/factories/repro-scene.ts"],"names":[],"mappings":"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"}
@@ -320,6 +320,9 @@ ${JSON_ONLY}
320
320
  // building, and marking them turns an ordinary scene into a
321
321
  // brawl. If in doubt, leave it out -- a guard who stays calm is
322
322
  // a missed beat, a hostile bartender is a broken scene.
323
+ // ICE NEEDS NO FLAG: a "matrix" NPC is intrusion countermeasures
324
+ // and is treated as opposition automatically. Write it only to
325
+ // say FALSE, for the rare tame construct.
323
326
  }],
324
327
  "devices": [{
325
328
  "name": string, "concept": string, // what it physically IS (a maglock, a keypad, a