@maka/maka-cli 5.208.0 → 5.210.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.
- package/bundle/typescript/package.json +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js +14 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +25 -22
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +61 -9
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.210.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.",
|
|
@@ -33,8 +33,19 @@ import { describeMarks, marksOnYou, MAX_MARKS } from '../utilities/marks.js';
|
|
|
33
33
|
export class MarkCommand extends Command {
|
|
34
34
|
static verb = 'mark';
|
|
35
35
|
static description = 'The MARK LEDGER, both directions: what you hold on other icons, and what other icons hold on YOU. Not an action -- it costs nothing and bills nothing. Placing a mark is not its own action in SR5 either: a mark is what "hack <target>" (Hack on the Fly, p.240) or "force <target>" (Brute Force, p.238) leaves behind, and "unmark" scrubs one off (Erase Mark, p.239). Also "marks".';
|
|
36
|
-
async execute() {
|
|
36
|
+
async execute(args = []) {
|
|
37
37
|
const actor = this.actor;
|
|
38
|
+
// SOMEONE WHO TYPED A TARGET MEANT TO DO THE THING, and the reporter
|
|
39
|
+
// of f79LLqTerep4nKWcA is on record expecting exactly that ("It's
|
|
40
|
+
// 'hack <target>' or 'mark <target>'"). This verb used to run the
|
|
41
|
+
// hack for them, which is how one action ended up with two spellings
|
|
42
|
+
// and no way to tell them apart. Saying so costs nothing -- there is
|
|
43
|
+
// no action to bill -- and the ledger still prints underneath, so
|
|
44
|
+
// the keystroke is never simply swallowed.
|
|
45
|
+
const named = (args ?? []).filter(w => !/^(list|mine|marks?)$/i.test(w)).join(' ').trim();
|
|
46
|
+
const aimed = named.length > 0
|
|
47
|
+
? `{light-blue-fg}Marking is not an action in SR5 -- a mark is what an intrusion LEAVES BEHIND. For ${named}: "hack ${named}" is Hack on the Fly (p.240, quiet) and "force ${named}" is Brute Force (p.238, loud). Neither has been run; nothing has been spent.{/light-blue-fg}\n\n`
|
|
48
|
+
: '';
|
|
38
49
|
const held = describeMarks(this.scene, actor.name);
|
|
39
50
|
const on = marksOnYou(this.scene, actor);
|
|
40
51
|
// NOTHING EITHER WAY. Worth its own sentence rather than two empty
|
|
@@ -44,7 +55,7 @@ export class MarkCommand extends Command {
|
|
|
44
55
|
const teach = actor.plane === 'matrix'
|
|
45
56
|
? ` ("hack <target>" is Hack on the Fly and "force <target>" is Brute Force -- a mark is what either one leaves behind.)`
|
|
46
57
|
: '';
|
|
47
|
-
return
|
|
58
|
+
return `${aimed}No marks either way -- you hold none, and nothing holds one on you.${teach}`;
|
|
48
59
|
}
|
|
49
60
|
const lines = [];
|
|
50
61
|
lines.push(`{light-blue-fg}YOUR MARKS -- what you hold (max ${MAX_MARKS} per icon){/light-blue-fg}`);
|
|
@@ -61,7 +72,7 @@ export class MarkCommand extends Command {
|
|
|
61
72
|
if (on.length > 0) {
|
|
62
73
|
lines.push(` {light-blue-fg}("unmark me" scrubs them one at a time, Erase Mark p.239; "reboot" and "jack out" wipe them all for free, p.242.){/light-blue-fg}`);
|
|
63
74
|
}
|
|
64
|
-
return lines.join('\n');
|
|
75
|
+
return aimed + lines.join('\n');
|
|
65
76
|
}
|
|
66
77
|
}
|
|
67
78
|
//# sourceMappingURL=mark.js.map
|
|
@@ -4,10 +4,11 @@ import { rollPool, formatRoll } from '../utilities/dice.js';
|
|
|
4
4
|
import { ownedDrones } from '../utilities/owned-drones.js';
|
|
5
5
|
/**
|
|
6
6
|
* The free road to STUN recovery (stim patches are the fast, risky one --
|
|
7
|
-
* see use.ts): catch your breath somewhere safe. "Safe" means
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* see use.ts): catch your breath somewhere safe. "Safe" means your own
|
|
8
|
+
* hideout (a Residence-type room) or a room with no one else in it:
|
|
9
|
+
* nobody naps in front of an audience in the sprawl. Only the hideout
|
|
10
|
+
* counts as SLEEP -- the tier's rest dice, the sleep debt and the
|
|
11
|
+
* fatigue unlock are all a bed-that-is-yours thing.
|
|
11
12
|
*
|
|
12
13
|
* Each rest is SR5 p.207's Stun half: Body + Willpower, one box per hit.
|
|
13
14
|
* A night in a bed that's yours is also the day of NATURAL RECOVERY for
|
|
@@ -60,25 +61,27 @@ export class RestCommand extends Command {
|
|
|
60
61
|
.map(d => d.item)
|
|
61
62
|
.filter(i => i.droneDamage > 0);
|
|
62
63
|
const othersHere = this.scene.getActorsInRoom(room).filter(a => a !== actor);
|
|
63
|
-
//
|
|
64
|
-
// (YxFKFqmXMgAvxwpce). 'Residence' is the roomType of Game._homeRoom
|
|
65
|
-
// and of nothing else -- and _homeRoom is only ever added to the
|
|
66
|
-
// scene on a SOLO boot (game.ts: `if (!options.sharedRun && ...)`).
|
|
67
|
-
// headless.ts hard-codes sharedRun: true, so every browser session,
|
|
68
|
-
// hub included, ran with no residence room in the world at all:
|
|
69
|
-
// isResidence was permanently false, markSlept() could never fire,
|
|
70
|
-
// the sleep-locked fatigue floor in Player.healStun never lifted,
|
|
71
|
-
// and rest printed a roll and "0 stun recovered" with nothing to
|
|
72
|
-
// explain it.
|
|
64
|
+
// A BED IS A BED, AND A STREET IS NOT ONE.
|
|
73
65
|
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
66
|
+
// 'Residence' is the roomType of Game._homeRoom and of nothing else,
|
|
67
|
+
// which is exactly right: going home to sleep IS the mechanic.
|
|
68
|
+
//
|
|
69
|
+
// This briefly also accepted any room whose seed listed your
|
|
70
|
+
// lifestyle tier in supportedLifestyles.residenceTypes, on the
|
|
71
|
+
// belief that a hosted session had no hideout to go to. That belief
|
|
72
|
+
// was wrong -- see the note on IMainGameConfig.sharedRun -- and the
|
|
73
|
+
// cost was real: the hub's own Neon Strip carries ["Street",
|
|
74
|
+
// "Squatter"], so a runner on either tier could bed down IN THE
|
|
75
|
+
// STREET and collect a night's sleep, the fatigue unlock and the
|
|
76
|
+
// lifestyle rest dice for it. scenes/scene1.json:119 carries the
|
|
77
|
+
// same field, so it landed there too.
|
|
78
|
+
//
|
|
79
|
+
// supportedLifestyles means something else in any case: its reader
|
|
80
|
+
// is Scene.validateLifestyleSupport, which checks an actor's
|
|
81
|
+
// lifestyleChoices residence against the rooms the seed provides.
|
|
82
|
+
// It answers "may someone of this tier live in this scene", never
|
|
83
|
+
// "is this particular room your bedroom".
|
|
84
|
+
const isResidence = room.roomType?.toLowerCase() === 'residence';
|
|
82
85
|
if (actor.stunTaken === 0 && actor.damageTaken === 0 && damagedDecks.length === 0 && damagedDrones.length === 0) {
|
|
83
86
|
// Nothing to heal -- but sleeping is its own point now (needs
|
|
84
87
|
// system: edge refills only fed-and-slept, see Game.
|
|
@@ -797,14 +797,14 @@
|
|
|
797
797
|
// - REST WAS SHORT AN ATTRIBUTE AND LONG A FREE BOX
|
|
798
798
|
// (YxFKFqmXMgAvxwpce). p.207's Stun half is Body + Willpower, one
|
|
799
799
|
// box per hit; this rolled Body alone and paid hits + 1. The free
|
|
800
|
-
// box is why nobody measured the missing attribute.
|
|
801
|
-
//
|
|
802
|
-
//
|
|
803
|
-
//
|
|
804
|
-
//
|
|
805
|
-
//
|
|
806
|
-
//
|
|
807
|
-
//
|
|
800
|
+
// box is why nobody measured the missing attribute. Blocked
|
|
801
|
+
// recovery also names what is blocking it now: fatigue boxes are
|
|
802
|
+
// locked to their need (p.172), so a runner whose stun IS hunger or
|
|
803
|
+
// exhaustion watched a roll happen and the track not budge, with no
|
|
804
|
+
// line connecting the two.
|
|
805
|
+
// WHAT THIS NOTE CLAIMED AND 1.68.0 TAKES BACK: that no hosted
|
|
806
|
+
// session had a bed. See the 1.68.0 entry -- it was read off one of
|
|
807
|
+
// two headless entry points and was wrong.
|
|
808
808
|
// - BREACH COULD NOT REACH A DOOR (Gfx5RFFpHJdKB87Bh, "I cant Breach
|
|
809
809
|
// East"). BypassCommand lists room.openableDevices(), which knows
|
|
810
810
|
// only Device objects, so a plain keyed Door matched nothing and
|
|
@@ -904,5 +904,57 @@
|
|
|
904
904
|
// no longer read; older saves carry them harmlessly. The condition
|
|
905
905
|
// report drops `stance` (the site and Unity drop it in the same
|
|
906
906
|
// release). REMOVED: the `stance` verb.
|
|
907
|
-
|
|
907
|
+
// 1.69.0 (2026-09-16): THE THREE THINGS WALKING THE REPORT FOUND. A real
|
|
908
|
+
// headless boot of f79LLqTerep4nKWcA's own path, read line by line.
|
|
909
|
+
// - "mark <target>" SWALLOWED THE KEYSTROKE. 1.68.0 made `mark` the
|
|
910
|
+
// ledger and stopped it routing into hack -- correctly -- but a
|
|
911
|
+
// player typing the spelling the reporter themselves expected ("It's
|
|
912
|
+
// 'hack <target>' or 'mark <target>'") got a ledger dump and no word
|
|
913
|
+
// about why nothing happened. It explains now, names both verbs
|
|
914
|
+
// against the target they typed, and prints the ledger underneath.
|
|
915
|
+
// Nothing is billed: there is no action here to spend.
|
|
916
|
+
// - FIVE HINTS IN hack.ts SAID "hack" WHATEVER RAN. force.ts shares
|
|
917
|
+
// the file, so a Brute Force answered with "hack for 2 reaches for
|
|
918
|
+
// the rest at once" -- the same mix-up the item is about, one layer
|
|
919
|
+
// in. They read this.verbName.
|
|
920
|
+
// - A HEADING IS NOT AN ICON. gridIcons splices a divider sentence
|
|
921
|
+
// between a host's icon and the icons near it; gridIconBlock's
|
|
922
|
+
// distance bands build names by stripping the glyph and cutting at
|
|
923
|
+
// " -- ", so `look` listed an icon called "and NEAR it, out on the
|
|
924
|
+
// open grid (not inside the host):". Pre-existing, and in the exact
|
|
925
|
+
// panel the report is about.
|
|
926
|
+
// Also: hack's no-such-target refusal and Tab's completion now read
|
|
927
|
+
// ONE list (utilities/nameables.ts), which is what that module always
|
|
928
|
+
// claimed. The refusal listed hosts only, under a sentence promising
|
|
929
|
+
// it had looked for a PAN and a camera too.
|
|
930
|
+
// 1.70.0 (2026-09-16): A STREET IS NOT A BEDROOM -- taking back half of
|
|
931
|
+
// what 1.67.0 did to rest, because the premise under it was wrong.
|
|
932
|
+
// 1.67.0 widened rest's "am I somewhere I can sleep" test to accept any
|
|
933
|
+
// room whose seed listed the runner's lifestyle tier in
|
|
934
|
+
// supportedLifestyles.residenceTypes. The belief was that a hosted
|
|
935
|
+
// session had no hideout to go home to. It does.
|
|
936
|
+
// - HOW THE MISTAKE WAS MADE, because that is the reusable part: there
|
|
937
|
+
// are TWO headless entry points and only one was read.
|
|
938
|
+
// createHeadlessSession (a shared JOB) sets sharedRun: true
|
|
939
|
+
// unconditionally; createHeadlessHub (the browser's hub, 1.51.0)
|
|
940
|
+
// never sets it, so a hosted hub takes the ordinary branch, gets its
|
|
941
|
+
// hideout and its door, and the runner wakes on their own cot.
|
|
942
|
+
// Generalising the first to "every hosted session" produced the
|
|
943
|
+
// claim. What settled it: a live web hub renders `@D` beside the
|
|
944
|
+
// player, and the reporter's own CLI log walks `go down` into a
|
|
945
|
+
// High-tier hideout with a working Footlocker.
|
|
946
|
+
// - WHAT IT COST. The hub's Neon Strip carries ["Street","Squatter"],
|
|
947
|
+
// so a runner on either tier could bed down IN THE STREET and take a
|
|
948
|
+
// night's sleep, the fatigue unlock and the lifestyle rest dice for
|
|
949
|
+
// it; scene1.json's start room carries the same field. Going home to
|
|
950
|
+
// sleep IS the mechanic, and this quietly removed the going-home.
|
|
951
|
+
// supportedLifestyles was never a bedroom flag: its reader is
|
|
952
|
+
// Scene.validateLifestyleSupport, which asks whether someone of a
|
|
953
|
+
// tier may LIVE IN THIS SCENE, not which room is your cot.
|
|
954
|
+
// - WHAT STAYS, because it was right on its own terms: Body +
|
|
955
|
+
// Willpower and one box per hit (p.207), the line that names the
|
|
956
|
+
// fatigue floor when recovery is refused, and the isDown() narrowing.
|
|
957
|
+
// A shared JOB still has no hideout -- deliberate and unchanged: the
|
|
958
|
+
// crew rode to the jobsite, and nobody's cot is stapled to it.
|
|
959
|
+
export const ENGINE_VERSION = '1.70.0';
|
|
908
960
|
//# sourceMappingURL=engine-version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.210.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.",
|