@maka/maka-cli 5.378.0 → 5.379.1
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/call.js +16 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/download.js +271 -131
- package/bundle/typescript/src/commands/game/sideQuest/commands/edit-file.js +26 -31
- package/bundle/typescript/src/commands/game/sideQuest/commands/give.js +24 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +21 -128
- package/bundle/typescript/src/commands/game/sideQuest/commands/transfer.js +92 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/upload.js +108 -0
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +19 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/job-order.js +28 -4
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +125 -32
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +5 -0
- package/bundle/typescript/src/commands/game/sideQuest/game.js +24 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/host.js +26 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/item.js +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +37 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/data-library.js +158 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/data-work.js +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/edit-file-test.js +31 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/fixer-menu.js +10 -8
- package/bundle/typescript/src/commands/game/sideQuest/utilities/gear-tree.js +13 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/verb-index.js +1 -1
- package/package.json +1 -1
|
@@ -28,6 +28,10 @@ const DATA_WORK = [
|
|
|
28
28
|
/\bdumpster\s*(dive|diving|run)\b/i,
|
|
29
29
|
/\bpaydata\b/i,
|
|
30
30
|
/\bmatrix\s*(work|run|runs|job|jobs)\b/i,
|
|
31
|
+
// THE DATA COURIER (2026-10-04): a file carried TO a host.
|
|
32
|
+
/\b(data|file)\s*(courier|delivery|deliveries|drop|plant)\b/i,
|
|
33
|
+
/\bplant\w*\s+(a\s+|the\s+|some\s+)?(file|data|worm|backdoor)\b/i,
|
|
34
|
+
/\bupload\w*\b/i,
|
|
31
35
|
];
|
|
32
36
|
/**
|
|
33
37
|
* Is this caller asking the fixer for DATA work specifically?
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { gridActionModifier } from './grids.js';
|
|
2
|
+
import { rollPool, formatRoll } from './dice.js';
|
|
3
|
+
import { hostDefensePool } from './matrix-intrusion.js';
|
|
4
|
+
import { hostLabel } from './grid-names.js';
|
|
5
|
+
import { showsMechanics, mechanicsActorPrefix } from './mechanics-audience.js';
|
|
6
|
+
/**
|
|
7
|
+
* Refuses (returns a line) when Binder IC has burned Data Processing to
|
|
8
|
+
* zero -- a bracket of 0 permits no hits. Undefined when the roll may go.
|
|
9
|
+
*/
|
|
10
|
+
export function editFileBlocked(actor) {
|
|
11
|
+
return actor.burnedAttributeRefusal('dataProcessing') || undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Rolls Edit File against a host; `what` names the operation for the mechanics line ("delete", "copy", "create"). */
|
|
14
|
+
export function rollEditFile(scene, logger, actor, host, what) {
|
|
15
|
+
const computer = actor.skillRating('computer');
|
|
16
|
+
// Inside a host no grid penalty applies (p.246); silence still taxes
|
|
17
|
+
// every Matrix action (p.235-236, Player.matrixActionPenalty).
|
|
18
|
+
const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
|
|
19
|
+
const pool = Math.max(1, actor.logic + (computer > 0 ? computer : -1)
|
|
20
|
+
+ actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty);
|
|
21
|
+
const limit = actor.matrixAttribute('dataProcessing');
|
|
22
|
+
const defence = hostDefensePool(host);
|
|
23
|
+
const attempt = rollPool(pool, limit, { gremlins: actor.deckGremlins });
|
|
24
|
+
const resist = rollPool(defence.pool);
|
|
25
|
+
if (showsMechanics(scene, actor)) {
|
|
26
|
+
logger.meta(`${mechanicsActorPrefix(scene, actor)}Edit File (${what}) -- Computer + Logic [Data Processing]: ${formatRoll(attempt)}`);
|
|
27
|
+
logger.meta(` v. ${hostLabel(host.over)} (${defence.label}, rating standing in for Intuition): ${formatRoll(resist)}`);
|
|
28
|
+
}
|
|
29
|
+
return { success: attempt.hits > resist.hits, hits: attempt.hits, defence: resist.hits };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=edit-file-test.js.map
|
|
@@ -76,7 +76,7 @@ export function fixerPickupNote(game, actorName) {
|
|
|
76
76
|
const heads = tableHeads(game);
|
|
77
77
|
const sizes = JOB_SIZES.map(s => `${s} (${SIZE_BLURB[s]}; ${payWords(s, heads)})`).join('; ');
|
|
78
78
|
const table = heads > 1 ? ` The money is priced for the ${heads} of them.` : '';
|
|
79
|
-
return `[System note: ${actorName} just called you looking for work, and you have NOTHING specific yet -- you shop for a job once they tell you the SIZE of night they want. In your own voice, in a few sentences, ask what kind of night they are after and lay out the four sizes with what each runs to: ${sizes}.${table} Mention they can name a kind if they have a taste -- a snatch, a delivery, an extraction, wetwork, a demolition,
|
|
79
|
+
return `[System note: ${actorName} just called you looking for work, and you have NOTHING specific yet -- you shop for a job once they tell you the SIZE of night they want. In your own voice, in a few sentences, ask what kind of night they are after and lay out the four sizes with what each runs to: ${sizes}.${table} Mention they can name a kind if they have a taste -- a snatch, a delivery, an extraction, wetwork, a demolition, quiet data work on a host, or a data courier run that plants a file on one -- or leave it to you to roll the dice. Quote THESE bands and no others. Never invent a client, a venue or a rate.]`;
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
82
|
* THE COMMISSION. Drops the line, drafts the job in the background, and
|
|
@@ -100,13 +100,15 @@ export function commissionFromFixer(game, actor, order, fixerName = FIXER_NAME)
|
|
|
100
100
|
: liveSeats.length === 1 ? ` Heard ${liveSeats[0].name} runs with you now -- I'll shop it as crew work.`
|
|
101
101
|
: ` Heard you're rolling ${liveSeats.length + 1} deep these days -- I'll shop it as crew work.`;
|
|
102
102
|
const sized = `${order.size[0].toUpperCase()}${order.size.slice(1)}`;
|
|
103
|
-
const shape = order.runType === 'data'
|
|
104
|
-
? `
|
|
105
|
-
: order.
|
|
106
|
-
?
|
|
107
|
-
: order.kind
|
|
108
|
-
? `${sized},
|
|
109
|
-
:
|
|
103
|
+
const shape = order.runType === 'data' && order.kind === 'delivery'
|
|
104
|
+
? `Courier work, then -- ${order.size}, a file that needs to end up on somebody's host.`
|
|
105
|
+
: order.runType === 'data'
|
|
106
|
+
? `Quiet work, then -- ${order.size}, something with a host and a file in it.`
|
|
107
|
+
: order.kind === 'assassination'
|
|
108
|
+
? `${sized}, and wetwork. I'll find a name that needs finding. Your call to take it when you hear it.`
|
|
109
|
+
: order.kind
|
|
110
|
+
? `${sized}, ${kindLabel(order.kind)}. I know a Johnson.`
|
|
111
|
+
: `${sized}, then.`;
|
|
110
112
|
return `${CALL_ICON} "${shape}${table} Give me a minute; I'll ping you." Click.`;
|
|
111
113
|
}
|
|
112
114
|
/** The note Krow's AI hears when the runner says something on the line
|
|
@@ -4,6 +4,7 @@ import { catalogAugmentations } from './catalog.js';
|
|
|
4
4
|
import { carryMode } from './carry.js';
|
|
5
5
|
import { hint } from './hints.js';
|
|
6
6
|
import { bodyTree } from './body-tree.js';
|
|
7
|
+
import { dataDevices, libraryDevice } from './data-library.js';
|
|
7
8
|
/**
|
|
8
9
|
* WHAT IS ON THE BODY, AS DATA (web drag-and-drop gear, 2026-10-02).
|
|
9
10
|
*
|
|
@@ -143,7 +144,18 @@ export function gearReport(actor, homeRoom) {
|
|
|
143
144
|
dumpster: containerView(findDumpster(homeRoom, actor.name)),
|
|
144
145
|
};
|
|
145
146
|
}
|
|
146
|
-
|
|
147
|
+
const persona = libraryDevice(actor);
|
|
148
|
+
const data = dataDevices(actor).map(d => ({
|
|
149
|
+
name: d.name,
|
|
150
|
+
category: String(d.category),
|
|
151
|
+
...(d === persona ? { persona: true } : {}),
|
|
152
|
+
files: d.files.map(f => gearItem(f)),
|
|
153
|
+
}));
|
|
154
|
+
const inside = actor.plane === 'matrix' ? actor.hostInside : undefined;
|
|
155
|
+
const host = inside && !inside.over.offlineServer && (inside.cracked || inside.searchedBy.has(actor.name))
|
|
156
|
+
? { name: inside.name, ...(inside.cracked ? { cracked: true } : {}), files: inside.files().map(f => gearItem(f)) }
|
|
157
|
+
: null;
|
|
158
|
+
return { worn: wornTree(actor) ?? null, augments: augmentTree(actor) ?? null, carried, home, data, host };
|
|
147
159
|
}
|
|
148
160
|
/** The AUGMENTS tree: the 'ware is equipment you cannot take off, hung
|
|
149
161
|
* where it sits (catalog v30 `location`). Undefined with no 'ware. */
|
|
@@ -185,6 +185,8 @@ export function serializeItem(item) {
|
|
|
185
185
|
out.storedPrograms = [...item.storedPrograms];
|
|
186
186
|
if (item.papers.length > 0)
|
|
187
187
|
out.papers = item.papers.map(serializeItem);
|
|
188
|
+
if (item.files.length > 0)
|
|
189
|
+
out.files = item.files.map(serializeItem);
|
|
188
190
|
if (item.linkedSin)
|
|
189
191
|
out.linkedSin = item.linkedSin;
|
|
190
192
|
if (item.licenseType)
|
|
@@ -256,6 +258,8 @@ export function restoreItem(json) {
|
|
|
256
258
|
item.storedPrograms = [...json.storedPrograms];
|
|
257
259
|
if (json.papers)
|
|
258
260
|
item.papers = json.papers.map(restoreItem);
|
|
261
|
+
if (json.files)
|
|
262
|
+
item.files = json.files.map(restoreItem);
|
|
259
263
|
if (json.linkedSin)
|
|
260
264
|
item.linkedSin = json.linkedSin;
|
|
261
265
|
if (json.licenseType)
|
|
@@ -29,7 +29,7 @@ export const HELP_CATEGORIES = [
|
|
|
29
29
|
// entered like any other -- "mark jackpoint" takes its invitation
|
|
30
30
|
// (utilities/invitations.ts), "enter jackpoint" walks in. The bare word is still
|
|
31
31
|
// caught before the typo matcher (game.ts) so it cannot read as `jack`.
|
|
32
|
-
{ title: 'matrix', entries: [['jack'], ['deck'], ['load'], ['unload'], ['hack'], ['force', 'brute', 'smash'], ['mark', 'marks'], ['unmark'], ['disable'], ['brick'], ['download'], ['enter'], ['exit-host'], ['hop'], ['tap', 'splice'], ['snoop'], ['overwatch', 'os'], ['hide'], ['edit'], ['erase', 'wipe'], ['pan'], ['wireless'], ['ar'], ['aros'], ['silent'], ['reboot'], ['agent'], ['drone'], ['jump', 'rig']] },
|
|
32
|
+
{ title: 'matrix', entries: [['jack'], ['deck'], ['load'], ['unload'], ['hack'], ['force', 'brute', 'smash'], ['mark', 'marks'], ['unmark'], ['disable'], ['brick'], ['download'], ['upload'], ['transfer'], ['enter'], ['exit-host'], ['hop'], ['tap', 'splice'], ['snoop'], ['overwatch', 'os'], ['hide'], ['edit'], ['erase', 'wipe'], ['pan'], ['wireless'], ['ar'], ['aros'], ['silent'], ['reboot'], ['agent'], ['drone'], ['jump', 'rig']] },
|
|
33
33
|
// The Emerged get their own shelf (player request: "there MUST be
|
|
34
34
|
// resonance" -- matrix is the place, Resonance is the talent).
|
|
35
35
|
// `sustain` shelves here and not under magic: the command is
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.379.1",
|
|
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.",
|