@maka/maka-cli 5.206.0 → 5.208.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 (28) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/complete.js +125 -0
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/disable.js +14 -14
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/erase-mark.js +1 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/force.js +40 -0
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +61 -54
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +2 -2
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js +49 -39
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/reload.js +14 -4
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/snoop.js +1 -1
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js +98 -17
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/tap.js +16 -5
  13. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +62 -1
  14. package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js +34 -4
  15. package/bundle/typescript/src/commands/game/sideQuest/game.js +49 -35
  16. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +3 -55
  17. package/bundle/typescript/src/commands/game/sideQuest/types/repro.js +1 -1
  18. package/bundle/typescript/src/commands/game/sideQuest/ui.js +32 -30
  19. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +20 -8
  20. package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js +2 -3
  21. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-reach.js +50 -17
  22. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js +56 -9
  23. package/bundle/typescript/src/commands/game/sideQuest/utilities/marks.js +3 -2
  24. package/bundle/typescript/src/commands/game/sideQuest/utilities/nameables.js +107 -0
  25. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +3 -7
  26. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +1 -1
  27. package/package.json +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js +0 -121
@@ -1,121 +0,0 @@
1
- import { Command } from './command.js';
2
- import { STANCE_CYCLE, STANCE_ALIASES, STANCE_DESCRIPTION, MATRIX_STANCE_CYCLE, MATRIX_STANCE_ALIASES, MATRIX_STANCE_ACTION } from '../models/player.js';
3
- import { fuzzyPickName } from '../utilities/fuzzy-match.js';
4
- /**
5
- * The typed twin of the Tab key: set (or inspect) the stance. On either
6
- * plane the stance is what your next action DOES -- in the meat, the
7
- * damage type your blow is meant to deal (lethal / non-lethal, see
8
- * FightStance in models/player.ts); on the Matrix, which intrusion
9
- * action a hack is (Brute Force / Hack on the Fly). It never decides
10
- * whether you act: since the Combat Turn (2026-09-06) every phase is
11
- * yours to play and "end turn" to commit, and the fight autopilot this
12
- * verb used to set was retired with it (2026-09-07).
13
- */
14
- export class StanceCommand extends Command {
15
- static verb = 'stance';
16
- static description = 'Set your stance -- what your next action does, never whether you take it. ON THE MATRIX it picks the intrusion action: attack (Brute Force, p.238) or sleaze (Hack on the Fly, p.240); "deck config" still sets the array. IN THE MEAT it picks the damage type you mean: lethal (the gear as sold) or non-lethal (Stun wherever the gear allows -- stun rounds when you reload, the flat of the blade at Accuracy 3 per p.186, bare hands; a lethal gun with lethal rounds warns you it stays lethal). Tab flips it.';
17
- /**
18
- * ON THE MATRIX, TAB FLIPS THE INTRUSION ACTION instead of the fight
19
- * autopilot (mjmcee, uMQAhaAysgaKpWFkn). One verb and one key, two
20
- * planes -- because the player's question is the same in both ("how
21
- * hard am I about to go?") and they are never on both planes at once.
22
- */
23
- matrixLines(actor) {
24
- const cur = actor.matrixStance;
25
- return [
26
- `Matrix stance: ${MATRIX_STANCE_ACTION[cur].toUpperCase()} (${cur}) -- ${StanceCommand.describeMatrix(cur)}.`,
27
- '',
28
- ...MATRIX_STANCE_CYCLE.map(m => ` ${MATRIX_STANCE_ACTION[m].padEnd(16)} -- ${StanceCommand.describeMatrix(m)}`),
29
- '',
30
- `Set with "stance attack" / "stance sleaze", or Tab to flip. "deck config" still sets the array itself.`,
31
- ].join('\n');
32
- }
33
- /** What each route costs and buys, in the book's terms (p.238/240). */
34
- static describeMatrix(m) {
35
- return m === 'attack'
36
- ? 'Cybercombat + Logic [Attack]; a miss goes unnoticed but the firewall bites, and net hits burn the target'
37
- : 'Hacking + Logic [Sleaze]; a miss gets you MADE, and net hits read the target while you key it';
38
- }
39
- async execute(args = []) {
40
- const actor = this.actor;
41
- const onMatrix = actor.plane === 'matrix';
42
- if (!args || args.length === 0) {
43
- if (onMatrix)
44
- return this.matrixLines(actor);
45
- const lines = [
46
- `Stance: ${actor.autoStance.toUpperCase()} -- ${STANCE_DESCRIPTION[actor.autoStance]}.`,
47
- '',
48
- ...STANCE_CYCLE.map(s => ` ${s.padEnd(10)} -- ${STANCE_DESCRIPTION[s]}`),
49
- '',
50
- `Set with "stance <name>", or Tab to flip. The stance is what a blow does, not who throws it -- every action is yours to type, and "end turn" commits the phase.`,
51
- ];
52
- return lines.join('\n');
53
- }
54
- // "stance next" -- THE TAB KEY'S WIRE FORM (playtest 2026-08-27:
55
- // "the combat stance isn't updating in the menu bar"). Tab used to
56
- // cycle by mutating game.player.autoStance directly, which in a
57
- // SHARED RUN is the local hub player, not the runner on the table:
58
- // the server's stance never moved, the autopilot never changed
59
- // temperature, and the HUD -- painted from the server's status
60
- // events -- never showed the switch. Tab now sends this instead, so
61
- // the cycle advances from the ACTOR's real stance wherever the
62
- // engine happens to be running. Checked before the fuzzy match: it
63
- // is a control word, not a stance name, and fuzzyPickName would
64
- // otherwise try to spell-correct it into one.
65
- const raw = args.join(' ').trim().toLowerCase();
66
- if (raw === 'next' || raw === 'cycle') {
67
- if (onMatrix) {
68
- const i = MATRIX_STANCE_CYCLE.indexOf(actor.matrixStance);
69
- const next = MATRIX_STANCE_CYCLE[(i + 1) % MATRIX_STANCE_CYCLE.length];
70
- actor.matrixStance = next;
71
- this.scene.updateStatus();
72
- this.logger.write(`${actor.name} flipped to ${MATRIX_STANCE_ACTION[next]}.`);
73
- return `Matrix stance: ${MATRIX_STANCE_ACTION[next].toUpperCase()} -- ${StanceCommand.describeMatrix(next)}.`;
74
- }
75
- const cur = STANCE_CYCLE.indexOf(actor.autoStance);
76
- const nextStance = STANCE_CYCLE[(cur + 1) % STANCE_CYCLE.length];
77
- actor.autoStance = nextStance;
78
- this.scene.updateStatus();
79
- this.logger.write(`${actor.name} cycled stance to ${nextStance}.`);
80
- return `Stance: ${nextStance.toUpperCase()} -- ${STANCE_DESCRIPTION[nextStance]}.`;
81
- }
82
- // A Matrix route by name, from either plane's vocabulary -- so
83
- // "stance sleaze" works while jacked in and reads as a typo
84
- // otherwise, rather than fuzzy-matching into a fight stance.
85
- const matrixNamed = MATRIX_STANCE_ALIASES[raw] ?? (MATRIX_STANCE_CYCLE.includes(raw) ? raw : undefined);
86
- if (onMatrix && matrixNamed) {
87
- if (matrixNamed === actor.matrixStance)
88
- return `Already ${MATRIX_STANCE_ACTION[matrixNamed].toUpperCase()} -- ${StanceCommand.describeMatrix(matrixNamed)}.`;
89
- actor.matrixStance = matrixNamed;
90
- this.scene.updateStatus();
91
- this.logger.write(`${actor.name} set Matrix stance to ${MATRIX_STANCE_ACTION[matrixNamed]}.`);
92
- return `Matrix stance: ${MATRIX_STANCE_ACTION[matrixNamed].toUpperCase()} -- ${StanceCommand.describeMatrix(matrixNamed)}.`;
93
- }
94
- if (onMatrix) {
95
- return `That's not a Matrix route. Choose: ${MATRIX_STANCE_CYCLE.join(', ')} (${MATRIX_STANCE_CYCLE.map(m => MATRIX_STANCE_ACTION[m]).join(' / ')}).`;
96
- }
97
- // THE EXACT NAME ALWAYS WINS. "stance non-lethal" -- the very word the
98
- // refusal below lists -- used to be refused: fuzzyPickName normalizes
99
- // punctuation to whitespace, so "non-lethal" and the "non lethal"
100
- // alias both became "non lethal", the exact tier saw two candidates,
101
- // and an ambiguous guess deliberately misses. Caught by a bench that
102
- // typed the name off the "Choose:" line (2jbprbSYqF7EPXrkR's dry run).
103
- // The old words (and their typos) still land: fuzzy over the cycle AND the aliases, then through the alias map.
104
- const pickedRaw = STANCE_CYCLE.includes(raw)
105
- ? raw
106
- : STANCE_ALIASES[raw] ?? fuzzyPickName(args.join(' '), [...STANCE_CYCLE, ...Object.keys(STANCE_ALIASES)]);
107
- const picked = pickedRaw ? (STANCE_ALIASES[pickedRaw] ?? pickedRaw) : undefined;
108
- if (!picked) {
109
- return `That's not a stance. Choose: ${STANCE_CYCLE.join(', ')}.`;
110
- }
111
- const stance = picked;
112
- if (stance === actor.autoStance) {
113
- return `Already ${stance.toUpperCase()} -- ${STANCE_DESCRIPTION[stance]}.`;
114
- }
115
- actor.autoStance = stance;
116
- this.scene.updateStatus();
117
- this.logger.write(`${actor.name} set stance to ${stance}.`);
118
- return `Stance: ${stance.toUpperCase()} -- ${STANCE_DESCRIPTION[stance]}.`;
119
- }
120
- }
121
- //# sourceMappingURL=stance.js.map