@maka/maka-cli 5.234.0 → 5.236.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.234.0",
3
+ "version": "5.236.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.",
@@ -1,4 +1,5 @@
1
1
  import { Command } from './command.js';
2
+ import { gridActionModifier } from '../utilities/grids.js';
2
3
  import { hint } from '../utilities/hints.js';
3
4
  import { rollPool, formatRoll } from '../utilities/dice.js';
4
5
  import { billAction } from '../utilities/action-cost.js';
@@ -111,8 +112,12 @@ export class EditFileCommand extends Command {
111
112
  const computer = actor.skillRating('computer');
112
113
  // Inside a host no grid penalty applies (p.246); silence still taxes
113
114
  // every Matrix action (p.235-236, Player.matrixActionPenalty).
115
+ // The grid tax was NAMED here and never charged -- gridActionModifier
116
+ // is the helper that answers both halves, returning 0 inside a host
117
+ // and the public grid's -2 out on it (p.233).
118
+ const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
114
119
  const pool = Math.max(1, actor.logic + (computer > 0 ? computer : -1)
115
- + actor.matrixActionPenalty + actor.woundModifier - actor.sustainingPenalty);
120
+ + actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty);
116
121
  const limit = actor.matrixAttribute('dataProcessing');
117
122
  const defence = hostDefensePool(host);
118
123
  const attempt = rollPool(pool, limit, { gremlins: actor.deckGremlins });
@@ -1,4 +1,5 @@
1
1
  import { Command } from './command.js';
2
+ import { gridActionModifier } from '../utilities/grids.js';
2
3
  import { hint } from '../utilities/hints.js';
3
4
  import { rollPool, formatRoll } from '../utilities/dice.js';
4
5
  import { billAction } from '../utilities/action-cost.js';
@@ -192,8 +193,12 @@ export class EraseMarkCommand extends Command {
192
193
  if (bill)
193
194
  return bill;
194
195
  const computer = actor.skillRating('computer');
196
+ // The grid you are riding taxes every Matrix action you take from it
197
+ // (p.233); inside a host it is nothing, because a host's interior is
198
+ // not on a grid.
199
+ const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
195
200
  const pool = Math.max(1, actor.logic + (computer > 0 ? computer : -1)
196
- + penalty + actor.matrixActionPenalty + actor.woundModifier - actor.sustainingPenalty);
201
+ + penalty + actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty);
197
202
  const limit = actor.matrixAttribute('attack');
198
203
  // THE PLACER ROLLS, not the icon the key is written on (p.239, see
199
204
  // IPlacer). `chosen` is the icon whose keys this action is scrubbing.
@@ -1,4 +1,5 @@
1
1
  import { Command } from './command.js';
2
+ import { gridActionModifier } from '../utilities/grids.js';
2
3
  import { hint } from '../utilities/hints.js';
3
4
  import { rollPool, formatRoll } from '../utilities/dice.js';
4
5
  import { accrueOverwatch } from '../utilities/overwatch.js';
@@ -63,8 +64,12 @@ export class HideCommand extends Command {
63
64
  if (bill)
64
65
  return bill;
65
66
  const ew = actor.skillRating('electronic-warfare');
67
+ // The grid you are riding taxes every Matrix action you take from it
68
+ // (p.233); inside a host it is nothing, because a host's interior is
69
+ // not on a grid.
70
+ const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
66
71
  const pool = Math.max(1, actor.intuition + (ew > 0 ? ew : -1)
67
- + actor.matrixActionPenalty + actor.woundModifier - actor.sustainingPenalty);
72
+ + actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty);
68
73
  const limit = actor.matrixAttribute('sleaze');
69
74
  const attempt = rollPool(pool, limit, { gremlins: actor.deckGremlins });
70
75
  const defence = rollPool(room.hostRating + room.hostAttributes().dataProcessing);
@@ -1,4 +1,5 @@
1
1
  import { Command } from './command.js';
2
+ import { gridActionModifier } from '../utilities/grids.js';
2
3
  import { rollPool, formatRoll } from '../utilities/dice.js';
3
4
  import { accrueOverwatch, settledScore, CONVERGENCE_AT } from '../utilities/overwatch.js';
4
5
  import { leaveMatrix } from '../utilities/planes.js';
@@ -38,8 +39,10 @@ export class OverwatchCommand extends Command {
38
39
  return burned;
39
40
  const limit = actor.matrixAttribute('sleaze');
40
41
  // The check is itself a Sleaze action, so silence taxes it too
41
- // (canon p.235-236, Player.matrixActionPenalty).
42
- const mine = rollPool(Math.max(1, actor.logic + (skill > 0 ? skill : -1) + actor.matrixActionPenalty + actor.woundModifier - actor.sustainingPenalty), limit);
42
+ // (canon p.235-236, Player.matrixActionPenalty) -- and so does the
43
+ // grid you take it from (p.233), which is nothing inside a host.
44
+ const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
45
+ const mine = rollPool(Math.max(1, actor.logic + (skill > 0 ? skill : -1) + actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty), limit);
43
46
  const god = rollPool(6);
44
47
  if (showsMechanics(this.scene, actor)) {
45
48
  this.logger.meta(`${mechanicsActorPrefix(this.scene, actor)}Check Overwatch (EW, sleaze): ${formatRoll(mine)}`);
@@ -1490,5 +1490,39 @@
1490
1490
  // Nothing here is new to this engine: clue-reading has used p.49 and
1491
1491
  // the same -2 since 1.40. It had simply never been pointed at the one
1492
1492
  // test a player can repeat by holding down a key.
1493
- export const ENGINE_VERSION = '1.85.0';
1493
+ // 1.85.1 (2026-09-16): THE GRID WAS ANNOUNCED BUT NEVER CHARGED
1494
+ // Asked while reading a sweep transcript: "is the grid type being
1495
+ // applied?" The banner says it plainly --
1496
+ // "Riding the public grid (-2 on everything you do, p.233)"
1497
+ // -- and the sweep was not paying it. Player.matrixActionPenalty is
1498
+ // ONLY the running-silent -2; the grid modifier is a separate helper
1499
+ // (grids.ts gridActionModifier) that every other Matrix verb calls
1500
+ // and spotHiddenIcons never did. So the -2 was printed on screen and
1501
+ // then left out of the one roll the player was watching, which is the
1502
+ // same class of defect as the Firewall label a version ago: the text
1503
+ // made a claim the dice did not honour.
1504
+ // The sweep now takes it, and the mechanics line shows '[public grid
1505
+ // -2]' where it applied. Inside a host it is correctly nothing -- a
1506
+ // host's interior is not on a grid -- and it stacks with p.49's retry
1507
+ // penalty, so a public-grid decker gets 5, 3, 1, none.
1508
+ // 1.85.2 (2026-09-16): SWEEP THE FAMILY -- the grid tax on every verb
1509
+ // 1.85.1 fixed the grid modifier on the sweep. CLAUDE.md's rule is
1510
+ // that a uniform approximation is still a deviation and partial canon
1511
+ // is worse than either extreme, so the other Matrix verbs were audited
1512
+ // rather than left to be reported one at a time.
1513
+ // FOUR MORE WERE BUILDING A POOL WITHOUT IT: Edit File (p.239), Erase
1514
+ // Mark (p.239), Hide (p.240) and Check Overwatch Score (p.238). All
1515
+ // four read Player.matrixActionPenalty -- which is ONLY the
1516
+ // running-silent -2 -- and none called gridActionModifier. edit-file's
1517
+ // own comment even NAMED the rule it was not applying ("inside a host
1518
+ // no grid penalty applies"), which is the tell: the author knew about
1519
+ // the grid and handled only the exempt case.
1520
+ // Each takes it now, and gridActionModifier answers both halves --
1521
+ // zero inside a host (p.246: its interior is not on a grid), the
1522
+ // public grid's -2 out on it (p.233).
1523
+ // NOT CHANGED: the `tap` verb. It is a direct connection to a lens in the
1524
+ // flesh, and the books do not say whether the grid tax still applies
1525
+ // to an action taken down a cable. Left alone and said so rather than
1526
+ // guessed in either direction.
1527
+ export const ENGINE_VERSION = '1.85.2';
1494
1528
  //# sourceMappingURL=engine-version.js.map
@@ -1,6 +1,7 @@
1
1
  import { rollPool, formatRoll } from './dice.js';
2
2
  import { deviceHidePool, wanHidePool } from './matrix-intrusion.js';
3
3
  import { isWatched, cameraMasterHost } from './surveillance.js';
4
+ import { gridActionModifier, gridNote } from './grids.js';
4
5
  function hiddenDevice(device, master) {
5
6
  // p.235-236: the hider rolls LOGIC + SLEAZE. Not Firewall -- that
6
7
  // resists an intrusion (p.238/p.240) and has nothing to do with being
@@ -128,8 +129,17 @@ export function spotHiddenIcons(scene, actor, room) {
128
129
  // because that is what stops the grind: a pool reduced to nothing
129
130
  // cannot be rolled, so after enough failures you are not looking
130
131
  // harder, you are done looking until you take the break p.49 names.
132
+ // THE GRID YOU ARE RIDING (p.233), which the banner has been promising
133
+ // and the dice were not paying: "Riding the public grid (-2 on
134
+ // everything you do)". matrixActionPenalty is ONLY the running-silent
135
+ // -2 -- the grid modifier is a separate helper that every other Matrix
136
+ // verb calls and this sweep never did, so the public grid's -2 was
137
+ // announced on screen and then quietly left out of the one roll the
138
+ // player was watching. Inside a host it is correctly nothing: a host's
139
+ // interior is not on a grid.
140
+ const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
131
141
  const base = Math.max(1, actor.intuition + (computer > 0 ? computer : -1)
132
- + actor.matrixActionPenalty + actor.woundModifier - actor.sustainingPenalty);
142
+ + actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty);
133
143
  const pool = Math.max(0, base - 2 * retries);
134
144
  const roll = rollPool(pool, actor.matrixAttribute('dataProcessing'), { gremlins: actor.deckGremlins });
135
145
  const found = [];
@@ -159,7 +169,7 @@ export function spotHiddenIcons(scene, actor, room) {
159
169
  actor.sweepAttempts.set(room.name, retries + 1);
160
170
  else
161
171
  actor.sweepAttempts.delete(room.name);
162
- return { found, missed, roll, retries, against };
172
+ return { found, missed, roll, retries, grid: gridNote(grid), against };
163
173
  }
164
174
  /**
165
175
  * The mechanics lines for a sweep.
@@ -181,7 +191,7 @@ export function spotMechanics(outcome) {
181
191
  ? ` -- trying again, -${outcome.retries * 2} (p.49: -2 per failed attempt; a break clears it)`
182
192
  : '';
183
193
  return [
184
- `Matrix Perception, silent icons (Computer + Intuition [Data Processing]): ${formatRoll(outcome.roll)}${again}`,
194
+ `Matrix Perception, silent icons (Computer + Intuition [Data Processing]): ${formatRoll(outcome.roll)}${outcome.grid}${again}`,
185
195
  ...outcome.against.map(a => (a.name
186
196
  ? ` ${a.name} hides (${a.label}): ${formatRoll(a.roll)}`
187
197
  : ` something holds its cover: ${formatRoll(a.roll)}`)),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.234.0",
3
+ "version": "5.236.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.",