@maka/maka-cli 5.205.0 → 5.207.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.205.0",
3
+ "version": "5.207.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.",
@@ -303,7 +303,15 @@ export class MoveCommand extends Command {
303
303
  // wall unclimbable rather than merely slow. Hanging on with
304
304
  // progress banked is the book's own shape: another Complex
305
305
  // Action, from where you got to.
306
- actor.climbProgress = wall.progressFor(reached);
306
+ //
307
+ // ...BUT ONLY IF THERE ARE METRES (6SmvvRRtn9eEMZSbF). A first
308
+ // attempt that buys nothing used to bank ZERO and still count as
309
+ // being on the wall -- which is a real place to this engine, so
310
+ // the runner could not "move" until they "descend"ed off a floor
311
+ // they had never left, and descend then narrated letting go from
312
+ // no height at all. You are on a wall when you are up it.
313
+ const banked = wall.progressFor(reached);
314
+ actor.climbProgress = banked.meters > 0 ? banked : undefined;
307
315
  // THE TWO FIGURES HAVE TO ADD UP. Rounding each independently
308
316
  // printed "about 2m up" and "about 2m still above you" on a
309
317
  // 3m wall -- both are honest roundings of 1.5, and together
@@ -338,15 +346,26 @@ export class MoveCommand extends Command {
338
346
  const wentNowhere = reached <= 0;
339
347
  const moved = reached < 1 ? 'a body length' : `${shownUp}m`;
340
348
  const why = climb.glitch ? 'a hold shears away under your weight' : 'no purchase left within reach';
349
+ // AND NOBODY HANGS FROM THE FLOOR. With nothing banked the runner
350
+ // is standing in the yard with their hands on the wall, so
351
+ // "you hang on, boots wedged" is the same false picture the
352
+ // distance was painting. Off the wall entirely, say so.
353
+ const offTheWall = banked.meters <= 0;
354
+ const perch = down
355
+ ? (left < 1 ? 'the ground within reach' : `about ${left}m still below you`)
356
+ : (left < 1 ? 'the lip within reach' : `about ${left}m still above you`);
357
+ const rest = offTheWall
358
+ ? `, boots still on the ground.`
359
+ : `. You hang on, boots wedged, ${perch}.`;
341
360
  return {
342
361
  arrived: false,
343
362
  text: down
344
363
  ? `${wentNowhere
345
364
  ? `You feel for the next hold and there isn't one -- you get no lower, ${why}`
346
- : `You get about ${moved} down and it stops going anywhere -- ${why}`}. You hang on, boots wedged, ${left < 1 ? 'the ground within reach' : `about ${left}m still below you`}.${hint(` (Descend again to keep going${assisted ? '' : '; rope and a harness would let you rappel it'}.)`)}`
365
+ : `You get about ${moved} down and it stops going anywhere -- ${why}`}${rest}${hint(` (Descend again to keep going${assisted ? '' : '; rope and a harness would let you rappel it'}.)`)}`
347
366
  : `${wentNowhere
348
367
  ? `You feel for the next hold and there isn't one -- you get no higher, ${why}`
349
- : `You get about ${moved} up and it stops going anywhere -- ${why}`}. You hang on, boots wedged, ${left < 1 ? 'the lip within reach' : `about ${left}m still above you`}.${hint(` (Climb again to keep going${assisted ? '' : '; rope and a harness would double your rate'}.)`)}`,
368
+ : `You get about ${moved} up and it stops going anywhere -- ${why}`}${rest}${hint(` (Climb again to keep going${assisted ? '' : '; rope and a harness would double your rate'}.)`)}`,
350
369
  };
351
370
  }
352
371
  // THE SECOND CHANCE (p.134 Climbing Failures and Glitches;
@@ -385,11 +404,18 @@ export class MoveCommand extends Command {
385
404
  const heightNow = Math.max(0, wall.heightAtStart + (down ? -reached : reached));
386
405
  const shownHeight = heightNow < 1 ? 'a body length' : `${Math.round(heightNow)}m`;
387
406
  if (catchIt.hits >= 1) {
388
- actor.climbProgress = wall.progressFor(reached);
407
+ // Same rule as the hold-on above (6SmvvRRtn9eEMZSbF): catching
408
+ // yourself with nothing banked is catching yourself ON THE FLOOR,
409
+ // and saying "you are still on the wall" about a runner standing
410
+ // in the yard is the sort of line that gets an item sent back.
411
+ const caught = wall.progressFor(reached);
412
+ actor.climbProgress = caught.meters > 0 ? caught : undefined;
389
413
  this.actor.performAction('slips on', `the ${spotName} climb, and catches themselves`);
390
414
  return {
391
415
  arrived: false,
392
- text: `You come off -- and catch yourself a body length down, fingers screaming. You are still on the wall, about ${shownHeight} up.${hint(` (${down ? 'Descend' : 'Climb'} again to keep going.)`)}`,
416
+ text: caught.meters > 0
417
+ ? `You come off -- and catch yourself a body length down, fingers screaming. You are still on the wall, about ${shownHeight} up.${hint(` (${down ? 'Descend' : 'Climb'} again to keep going.)`)}`
418
+ : `You come off almost as soon as you start -- and catch yourself, boots back on the ground, fingers screaming.${hint(` (${down ? 'Descend' : 'Climb'} again to try it.)`)}`,
393
419
  };
394
420
  }
395
421
  // The grip goes: the wall takes back everything it gave.
@@ -39,6 +39,10 @@ export const REPRO_FAR_ROOM = 'The Far Side';
39
39
  * Both rooms have it: a doorway has two sides, and a guard posted on
40
40
  * the far side stands in their own. */
41
41
  export const REPRO_DOORWAY_SPOT = 'doorway';
42
+ /** What locks a `barrier.plainDoor` that names no keyItem of its own.
43
+ * A door with no key and no mechanism would simply stand open, which
44
+ * is the opposite of the fixture the author asked for. */
45
+ export const REPRO_PLAIN_DOOR_KEY = 'Door Key';
42
46
  /**
43
47
  * Somewhere to stand that is NOT the doorway, so "move to the door" is
44
48
  * a real move with a real before-state. Without it the runner starts in
@@ -202,7 +206,18 @@ export function buildReproScene(fixture) {
202
206
  const startSide = fixture.start ?? 'barrier';
203
207
  const startRoom = roomFor(startSide);
204
208
  let device;
205
- if (barrier) {
209
+ // THE LOCK THAT IS IN THE DOOR (Gfx5RFFpHJdKB87Bh). barrier.plainDoor
210
+ // seals the exit with keyRequired and builds NO device -- the shape
211
+ // every ordinary locked door in a generated scene has, and the shape
212
+ // this builder could not make until the report proved it mattered.
213
+ // `open` still means what it means -- the door simply is not locked --
214
+ // and it must NOT quietly put the mechanism back, which is the
215
+ // silently-inert shape this file exists to avoid.
216
+ const plainDoor = barrier?.plainDoor === true;
217
+ if (barrier?.plainDoor && !barrier.keyItem && !barrier.open) {
218
+ warnings.push('A plain door with no keyItem has no quiet way through at all -- force is the only route, which is fine if that is the point.');
219
+ }
220
+ if (barrier && !plainDoor) {
206
221
  // INVARIANT 1: a code belongs to a panel and nowhere else. The
207
222
  // Device constructor DROPS it on a lock or a ward, silently and
208
223
  // correctly -- that is the runtime honouring "you can't talk at a
@@ -309,7 +324,13 @@ export function buildReproScene(fixture) {
309
324
  name: REPRO_BARRIER_ROOM,
310
325
  description: barrier
311
326
  ? `A short concrete run ending at one door, ${direction} of you. `
312
- + `${device.name} is fixed beside the doorway${barrier.open ? ', standing open' : ', holding it shut'}. `
327
+ + (plainDoor
328
+ // NOTHING BESIDE THE DOOR, and the prose has to say so: the
329
+ // whole point of a plainDoor bench is that there is no
330
+ // mechanism to work, so describing one would hand the
331
+ // reviewer the wrong target to aim every verb at.
332
+ ? `No panel, no maglock, no keypad -- just a lock in the door itself, and it is ${barrier.open ? 'off the latch' : 'shut'}. `
333
+ : `${device.name} is fixed beside the doorway${barrier.open ? ', standing open' : ', holding it shut'}. `)
313
334
  + `There is nothing else here, which is the point -- whatever is wrong is wrong at that door.`
314
335
  : `A short concrete run with a door ${direction} of you and nothing else in it.`,
315
336
  // fixture.home: the barrier room is the runner's own bed, so a rest
@@ -319,7 +340,16 @@ export function buildReproScene(fixture) {
319
340
  spots,
320
341
  levels: level ? [{ name: level.name, side: level.side ?? 'north', kind: level.kind ?? 'catwalk', climbOnly: level.climbOnly === true }] : undefined,
321
342
  isStartRoom: startSide === 'barrier',
322
- exits: [{ direction, targetRoom: REPRO_FAR_ROOM, atSpot: REPRO_DOORWAY_SPOT }],
343
+ exits: [{
344
+ direction,
345
+ targetRoom: REPRO_FAR_ROOM,
346
+ atSpot: REPRO_DOORWAY_SPOT,
347
+ // INVARIANT 3, the deviceless case: with no mechanism to name the
348
+ // exit, the KEY is what locks the door.
349
+ ...(plainDoor && !barrier?.open
350
+ ? { keyRequired: barrier?.keyItem ?? REPRO_PLAIN_DOOR_KEY }
351
+ : {}),
352
+ }],
323
353
  devices: device ? [device] : undefined,
324
354
  };
325
355
  const farRoom = {
@@ -327,7 +357,7 @@ export function buildReproScene(fixture) {
327
357
  ...watchedFields('far'),
328
358
  name: REPRO_FAR_ROOM,
329
359
  description: `The other side of the door, which lies ${OPPOSITE[direction]} of you`
330
- + `${barrier ? ` and is held from the far side by ${device.name}` : ''}. Bare, and no further out.`,
360
+ + `${barrier && device ? ` and is held from the far side by ${device.name}` : ''}. Bare, and no further out.`,
331
361
  roomType: 'Street',
332
362
  size: 'medium',
333
363
  spots,
@@ -27,7 +27,7 @@
27
27
  * 2.5.0 adds IReproHost.purpose / .sculpt and IReproItem.file (engine
28
28
  * 1.50.0, hosts with a purpose) -- additive.
29
29
  */
30
- export const REPRO_SCHEMA_VERSION = '2.6.0';
30
+ export const REPRO_SCHEMA_VERSION = '2.7.0';
31
31
  /** THE LIVE REASON, from the field or the card's own words.
32
32
  *
33
33
  * `repro.live` is authoritative -- but the server's validator must
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.205.0",
3
+ "version": "5.207.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.",