@maka/maka-cli 5.154.0 → 5.156.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.154.0",
3
+ "version": "5.156.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 3.x applications using React.",
@@ -279,11 +279,22 @@ take ground. Build it accordingly:
279
279
  // the runner heard at the noodle stand pays off as foreshadowing when
280
280
  // the next job turns out to be tangled in exactly that (see
281
281
  // Game.advanceRumor).
282
+ // A NAME REFERRING TO SOMEONE ELSE (8jSvzdWGvAk27PoYr): the rumor
283
+ // sometimes names a real hub fixture by name -- e.g. "Mama Wu's cousin
284
+ // swears..." -- and a model connecting the job to it stationed a
285
+ // brand-new "Mama Wu" NPC of its own, at a freshly-invented room, right
286
+ // alongside the real Mama Wu the runner already knows from the hub. The
287
+ // rumor is HEARSAY the runner carries INTO this scene, not a cast list;
288
+ // anyone it names by name lives back home and stays there.
282
289
  const rumorBlock = rumor
283
290
  ? `\nSTREET RUMOR the runner has been hearing around their home district: "${rumor}"
284
291
  Let this job CONNECT to the rumor -- as its cause, its consequence, or the truth behind it.
285
292
  The connection should be discoverable in play (the client's briefing, an NPC's talk, a
286
- document), not just implied by the title.`
293
+ document), not just implied by the title. If the rumor names someone by name (a hub fixture
294
+ like a fixer, vendor, or contact), that person is NOT part of this job's cast -- they stay
295
+ back in the home district. Reference them only in passing (a mention, a rumor of their own);
296
+ never give them an npcs[] entry or a room of their own in THIS scene. Every npc and room this
297
+ job stations the runner with must be new and specific to this job.`
287
298
  : '';
288
299
  return `
289
300
  You are generating the STRUCTURE (skeleton) of a self-contained Shadowrun-flavored text
@@ -905,6 +905,10 @@ export class SharedRunSession {
905
905
  dead = false;
906
906
  over = false;
907
907
  quitArmed = false;
908
+ /** The taxi's warn-once on unclaimed pay (see command()): the first
909
+ * "call taxi" the server refuses as "unsettled" arms this; the next
910
+ * one confirms and leaves the pay on the table. */
911
+ forfeitArmed = false;
908
912
  subs = [];
909
913
  constructor(game, sessionID) {
910
914
  this.game = game;
@@ -1191,7 +1195,13 @@ export class SharedRunSession {
1191
1195
  // wrap-up share).
1192
1196
  if (/^call\s+(a\s+|the\s+)?(taxi|cab)\b/i.test(input.trim())) {
1193
1197
  try {
1194
- await HubLink.call('sideQuest.settle', { sessionID: this.sessionID });
1198
+ // UNCLAIMED PAY (AB6pJQpYD49qDaDJR): this shortcut skips the
1199
+ // engine's CallCommand, so its warn-once for a finished job
1200
+ // whose Johnson was never settled with never ran -- the runner
1201
+ // rode home with the whole lump sum still on the table. `guard`
1202
+ // asks the server to make that same check; a refusal arms the
1203
+ // confirm, and the next call sends it (call.ts's own shape).
1204
+ await HubLink.call('sideQuest.settle', { sessionID: this.sessionID, guard: true, confirm: this.forfeitArmed });
1195
1205
  await this.homecoming();
1196
1206
  return '';
1197
1207
  }
@@ -1200,6 +1210,20 @@ export class SharedRunSession {
1200
1210
  if (e.error === 'not-leader') {
1201
1211
  return this.leave();
1202
1212
  }
1213
+ if (e.error === 'unsettled') {
1214
+ this.forfeitArmed = true;
1215
+ let who = 'your Johnson';
1216
+ let owed = 0;
1217
+ try {
1218
+ const d = typeof e.details === 'string' ? JSON.parse(e.details) : e.details;
1219
+ if (d?.name)
1220
+ who = d.name;
1221
+ if (typeof d?.owed === 'number')
1222
+ owed = d.owed;
1223
+ }
1224
+ catch { /* the name is a courtesy; the warning stands without it */ }
1225
+ return `The dispatcher picks up -- and you hesitate. You never settled with ${who}: ${owed}¥ still on the table. ("call taxi" again to leave it and go.)`;
1226
+ }
1203
1227
  if (e.error === 'bad-status' || e.error === 'interrupted') {
1204
1228
  await this.homecoming();
1205
1229
  return '';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.154.0",
3
+ "version": "5.156.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 3.x applications using React.",