@maka/maka-cli 5.129.0 → 5.131.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 (21) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +9 -0
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +28 -15
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/companions.js +18 -10
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js +14 -5
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/job-offer.js +6 -0
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/jobs.js +8 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/jump.js +17 -2
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/order.js +9 -3
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +1 -1
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js +12 -1
  12. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +16 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/game.js +43 -12
  14. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +6 -3
  15. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +106 -13
  16. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js +15 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +6 -3
  18. package/bundle/typescript/src/commands/game/sideQuest/utilities/drone-prose.js +289 -0
  19. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +33 -6
  20. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js +44 -4
  21. package/package.json +1 -1
@@ -2,6 +2,7 @@ import { capitalCase } from 'change-case';
2
2
  import { Direction } from '../types/shared/direction-enum.js';
3
3
  import { OPEN_FLOOR, spotOf, visibleActorsIn, exitSpot, seatingIn, theSpot } from './spots.js';
4
4
  import { placeName } from './log-style.js';
5
+ import { DRONE_COLOUR, DRONE_ICON } from './drone-prose.js';
5
6
  import { key, levelFootprint, dimsForSize, tallestRoomRows, METERS_PER_LEVEL, } from './room-grid.js';
6
7
  /**
7
8
  * THE ROOM LAYOUT (spatial-viz follow-up, 2026-08-25): an ASCII top-down
@@ -83,6 +84,24 @@ const HOSTILE_GLYPH = '⚔';
83
84
  * A star reads as "yours" without pretending to be a person you can
84
85
  * hand the controls to. */
85
86
  const CREW_GLYPH = '★';
87
+ /**
88
+ * YOU, JUMPED INTO A DRONE (player ruling 2026-09-06: "when jumped into
89
+ * the drone, I'd like the player icon to change to amber to match the
90
+ * color scheme. Also, the player's neutral color icon (meat body)
91
+ * should remain").
92
+ *
93
+ * While rigged, the viewer's presence is the FRAME, and it drew as the
94
+ * same uncoloured 👤 as their body would -- and the body, slumped in
95
+ * bodyRoom, did not draw at all (seatingIn seats an actor once, at the
96
+ * frame). So a rigger looking at a room holding both saw one figure and
97
+ * could not say which. Now the frame is the drone icon the feed and the
98
+ * HUD already speak (✈, drone-prose.ts), in the rigger's amber -- a
99
+ * BMP dingbat, so unlike the emoji it really takes the colour -- and
100
+ * the body keeps the plain 👤 at the cell it was left in. Shape AND
101
+ * colour differ, as this panel's rulings require. An autopilot frame
102
+ * (a companion shell) is still the crew's ★: it is yours, not you.
103
+ */
104
+ const RIGGED_GLYPH = DRONE_ICON;
86
105
  /** A CORPSE -- a body left where it fell, lootable (Room.bodies). */
87
106
  const DEAD_GLYPH = '💀';
88
107
  /**
@@ -203,7 +222,13 @@ function buildRenderMaps(grid, room, viewer) {
203
222
  const corpses = new Map();
204
223
  for (const b of room.bodies)
205
224
  corpses.set(key(b.cell), b.name);
206
- return { cellToSpot, cellToExit, verticalAt, cellTerrain, occupants, corpses };
225
+ // The rigger's body, where it slumped (see RIGGED_GLYPH): seatingIn
226
+ // seats the viewer once, at the FRAME, so the body has to be placed
227
+ // from the cell enterDrone set aside.
228
+ const slumpedBody = viewer.plane !== 'meat' && viewer.bodyRoom === room && viewer.bodyCell
229
+ ? key(viewer.bodyCell)
230
+ : undefined;
231
+ return { cellToSpot, cellToExit, verticalAt, cellTerrain, occupants, corpses, slumpedBody };
207
232
  }
208
233
  function paint(g) {
209
234
  const body = g.inverse ? `{inverse}${g.ch}{/inverse}` : g.ch;
@@ -258,8 +283,13 @@ function actorGlyph(a, viewer, isOtherPlayer, isTableAlly) {
258
283
  return { ch: DOWNED_GLYPH, color: 'yellow' };
259
284
  // YOU keep the emoji; a fellow runner is the one who changes. Both
260
285
  // branches existed already and returned the identical icon.
261
- if (a === viewer)
262
- return { ch: PLAYER_GLYPH, wide: true };
286
+ // ...unless you are riding a frame: then this cell is the DRONE, in
287
+ // the rigger's amber, and the emoji is your body (see RIGGED_GLYPH).
288
+ if (a === viewer) {
289
+ return viewer.plane === 'drone'
290
+ ? { ch: RIGGED_GLYPH, color: DRONE_COLOUR }
291
+ : { ch: PLAYER_GLYPH, wide: true };
292
+ }
263
293
  if (isOtherPlayer?.(a))
264
294
  return { ch: OTHER_PLAYER_GLYPH, color: OTHER_PLAYER_COLOR };
265
295
  // Your own people read as yours even mid-fight -- knowing which of
@@ -311,7 +341,10 @@ function glyphAt(c, maps, viewer, isOtherPlayer, isTableAlly) {
311
341
  ?? glyphs.find(g => g.ch === NEUTRAL_GLYPH)
312
342
  ?? glyphs[0];
313
343
  }
314
- // Nobody standing here -- but something may be lying here.
344
+ // Nobody standing here -- but something may be lying here: your own
345
+ // slumped body first (it is what you are looking for), then the dead.
346
+ if (maps.slumpedBody === k)
347
+ return { ch: PLAYER_GLYPH, wide: true };
315
348
  if (maps.corpses.has(k))
316
349
  return { ch: DEAD_GLYPH, wide: true };
317
350
  const terrain = maps.cellTerrain.get(k);
@@ -465,6 +498,13 @@ export function renderRoomLayout(room, viewer, isOtherPlayer, isTableAlly) {
465
498
  present.has(PLAYER_GLYPH)
466
499
  ? `${PLAYER_GLYPH} you (${NARROW_SUBSTITUTE[PLAYER_GLYPH]} in the side panel, where cells are one column)`
467
500
  : '',
501
+ // Jumped in: the amber frame is you, the plain figure is your body.
502
+ present.has(RIGGED_GLYPH)
503
+ ? `{${DRONE_COLOUR}-fg}${RIGGED_GLYPH}{/${DRONE_COLOUR}-fg} you, jumped in (${viewer.riggedDrone?.name ?? 'drone'})`
504
+ : '',
505
+ maps.slumpedBody !== undefined
506
+ ? `${PLAYER_GLYPH} your body, slumped (${NARROW_SUBSTITUTE[PLAYER_GLYPH]} in the side panel)`
507
+ : '',
468
508
  present.has(OTHER_PLAYER_GLYPH) ? `{${OTHER_PLAYER_COLOR}-fg}${OTHER_PLAYER_GLYPH}{/${OTHER_PLAYER_COLOR}-fg} runner` : '',
469
509
  present.has(CREW_GLYPH) ? `{green-fg}${CREW_GLYPH}{/green-fg} yours` : '',
470
510
  present.has(NEUTRAL_GLYPH) ? `{white-fg}${NEUTRAL_GLYPH}{/white-fg} local` : '',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.129.0",
3
+ "version": "5.131.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.",