@maka/maka-cli 5.377.0 → 5.379.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/call.js +16 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/download.js +248 -132
- 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/treat.js +5 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/upload.js +108 -0
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +21 -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 +50 -6
- 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/street-doc.js +23 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/verb-index.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Category } from '../types/shared/item-enum.js';
|
|
2
|
+
import { serializeItem, restoreItem } from './persistence.js';
|
|
3
|
+
import { fuzzyPickName } from './fuzzy-match.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every device on this runner with a data library: the housed device, the
|
|
6
|
+
* worn commlink, then every commlink / deck / RCC in the pack. A device
|
|
7
|
+
* appears once however many readers would have named it.
|
|
8
|
+
*/
|
|
9
|
+
export function dataDevices(player) {
|
|
10
|
+
const out = [];
|
|
11
|
+
const add = (d) => {
|
|
12
|
+
if (d && d.holdsData() && !out.includes(d))
|
|
13
|
+
out.push(d);
|
|
14
|
+
};
|
|
15
|
+
add(player.housedDeck());
|
|
16
|
+
add(player.equipment?.head?.commlink ?? undefined);
|
|
17
|
+
for (const i of player.inventory.getAllItems())
|
|
18
|
+
add(i);
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* WHERE A DOWNLOAD LANDS: the device carrying the persona (p.239, the
|
|
23
|
+
* copier owns the copy -- on the hardware they are running), else the
|
|
24
|
+
* first data device on you. Undefined for a runner with none at all -- a
|
|
25
|
+
* technomancer's living persona has no storage to write to (see
|
|
26
|
+
* downloadTarget for what happens then).
|
|
27
|
+
*/
|
|
28
|
+
export function libraryDevice(player) {
|
|
29
|
+
const persona = player.personaDevice();
|
|
30
|
+
if (persona && persona.holdsData() && dataDevices(player).includes(persona))
|
|
31
|
+
return persona;
|
|
32
|
+
return dataDevices(player)[0];
|
|
33
|
+
}
|
|
34
|
+
/** Every file on every device, device by device. */
|
|
35
|
+
export function deviceFiles(player) {
|
|
36
|
+
return dataDevices(player).flatMap(device => device.files.map(file => ({ file, device })));
|
|
37
|
+
}
|
|
38
|
+
/** Data chips in the pack: a file written to physical media. */
|
|
39
|
+
export function dataChips(player) {
|
|
40
|
+
return player.inventory.getAllItems().filter(i => i.category === Category.Datachip);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A file this runner holds BY EXACT NAME, wherever it sits: a device
|
|
44
|
+
* library first, then the pack (a chip, or any carried item -- the
|
|
45
|
+
* historical shape a delivery looked for). The objective readers ask this.
|
|
46
|
+
*/
|
|
47
|
+
export function heldByName(player, name) {
|
|
48
|
+
const lower = name.toLowerCase();
|
|
49
|
+
const onDevice = deviceFiles(player).find(h => h.file.name.toLowerCase() === lower);
|
|
50
|
+
if (onDevice)
|
|
51
|
+
return onDevice;
|
|
52
|
+
const carried = player.inventory.getItem(name);
|
|
53
|
+
return carried ? { file: carried } : undefined;
|
|
54
|
+
}
|
|
55
|
+
/** A device file by a player's fuzzy query. */
|
|
56
|
+
export function findDeviceFile(player, query) {
|
|
57
|
+
const all = deviceFiles(player);
|
|
58
|
+
const picked = fuzzyPickName(query, all.map(h => h.file.name));
|
|
59
|
+
return picked ? all.find(h => h.file.name === picked) : undefined;
|
|
60
|
+
}
|
|
61
|
+
/** A device on this runner by a player's fuzzy query ("deck", "commlink", the full name). */
|
|
62
|
+
export function findDataDevice(player, query) {
|
|
63
|
+
const devices = dataDevices(player);
|
|
64
|
+
const q = query.toLowerCase().trim();
|
|
65
|
+
if (!q)
|
|
66
|
+
return undefined;
|
|
67
|
+
const exact = devices.find(d => d.name.toLowerCase() === q);
|
|
68
|
+
if (exact)
|
|
69
|
+
return exact;
|
|
70
|
+
const byKind = devices.find(d => (q === 'deck' || q === 'cyberdeck') ? d.isCyberdeck()
|
|
71
|
+
: q === 'rcc' ? d.isRcc()
|
|
72
|
+
: (q === 'commlink' || q === 'comm' || q === 'link') ? d.category === Category.Commlink : false);
|
|
73
|
+
if (byKind)
|
|
74
|
+
return byKind;
|
|
75
|
+
const picked = fuzzyPickName(query, devices.map(d => d.name));
|
|
76
|
+
return picked ? devices.find(d => d.name === picked) : undefined;
|
|
77
|
+
}
|
|
78
|
+
/** True when the device already holds a file of that name. */
|
|
79
|
+
export function deviceHas(device, name) {
|
|
80
|
+
const lower = name.toLowerCase();
|
|
81
|
+
return device.files.some(f => f.name.toLowerCase() === lower);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A FRESH COPY of a file (Edit File's copy, p.239): same name, same
|
|
85
|
+
* content, owned by whoever made it. The original is untouched.
|
|
86
|
+
*/
|
|
87
|
+
export function copyFile(file, owner) {
|
|
88
|
+
const copy = restoreItem(serializeItem(file));
|
|
89
|
+
copy.plane = 'matrix';
|
|
90
|
+
copy.atSpot = undefined;
|
|
91
|
+
if (owner !== undefined)
|
|
92
|
+
copy.owner = owner;
|
|
93
|
+
return copy;
|
|
94
|
+
}
|
|
95
|
+
/** Writes a file into a device's library (plane 'matrix', no spot). */
|
|
96
|
+
export function fileOnto(device, file) {
|
|
97
|
+
file.plane = 'matrix';
|
|
98
|
+
file.atSpot = undefined;
|
|
99
|
+
device.files.push(file);
|
|
100
|
+
}
|
|
101
|
+
/** Takes a file out of whatever shelf holds it; true when it moved. */
|
|
102
|
+
export function releaseHeld(player, held) {
|
|
103
|
+
if (held.device) {
|
|
104
|
+
const at = held.device.files.indexOf(held.file);
|
|
105
|
+
if (at < 0)
|
|
106
|
+
return false;
|
|
107
|
+
held.device.files.splice(at, 1);
|
|
108
|
+
player.noteConditionChanged();
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
return player.removeInventory(held.file);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Burns a device file onto a datachip in the pack -- a MOVE, the file
|
|
115
|
+
* leaves the library (user ruling: physical media is one move, not two).
|
|
116
|
+
* Throws when the pack cannot take the weight, before anything moves.
|
|
117
|
+
*/
|
|
118
|
+
export function burnToChip(player, held) {
|
|
119
|
+
const chip = held.file;
|
|
120
|
+
if (player.currentWeight + chip.weight * chip.quantity > player.maxCarryingWeight) {
|
|
121
|
+
throw new Error('too heavy');
|
|
122
|
+
}
|
|
123
|
+
releaseHeld(player, held);
|
|
124
|
+
chip.plane = 'meat';
|
|
125
|
+
chip.category = Category.Datachip;
|
|
126
|
+
player.inventory.addItem(chip);
|
|
127
|
+
player.noteConditionChanged();
|
|
128
|
+
return chip;
|
|
129
|
+
}
|
|
130
|
+
/** Reads a chip from the pack onto a device -- a MOVE, the chip is consumed. */
|
|
131
|
+
export function loadChip(player, chip, device) {
|
|
132
|
+
player.removeInventory(chip);
|
|
133
|
+
fileOnto(device, chip);
|
|
134
|
+
player.noteConditionChanged();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* WHERE DATA HANDED TO A RUNNER LANDS: a device library when they carry
|
|
138
|
+
* one, else -- a runner with no commlink, no deck, no RCC -- the pack, as
|
|
139
|
+
* a chip. The second arm is not a loophole: something has to hold the
|
|
140
|
+
* cargo, and physical media is the only thing a deviceless runner owns.
|
|
141
|
+
*/
|
|
142
|
+
export function receiveData(player, file) {
|
|
143
|
+
const device = libraryDevice(player);
|
|
144
|
+
if (device) {
|
|
145
|
+
fileOnto(device, file);
|
|
146
|
+
player.noteConditionChanged();
|
|
147
|
+
return { device };
|
|
148
|
+
}
|
|
149
|
+
file.plane = 'meat';
|
|
150
|
+
file.category = Category.Datachip;
|
|
151
|
+
player.inventory.addItem(file);
|
|
152
|
+
return {};
|
|
153
|
+
}
|
|
154
|
+
/** Every file name this runner holds, devices and chips -- for the runner ops. */
|
|
155
|
+
export function heldDataNames(player) {
|
|
156
|
+
return deviceFiles(player).map(h => h.file.name);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data-library.js.map
|
|
@@ -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)
|
|
@@ -44,7 +44,29 @@ export function treatHint(price = TREAT_PRICE_PER_BOX) {
|
|
|
44
44
|
/** The doc's standing orders in the AI brief: treatment is the trade,
|
|
45
45
|
* and the word for it is "treat". */
|
|
46
46
|
export function streetDocBrief(price = TREAT_PRICE_PER_BOX) {
|
|
47
|
-
return `You are this clinic's STREET DOC and treatment is your trade: you close physical wounds
|
|
47
|
+
return `You are this clinic's STREET DOC and treatment is your trade: you close physical wounds, ${price} nuyen for each one you close, cash up front, no names asked. The player makes it happen by typing the command "treat" -- when anyone asks for help with wounds, tell them that word plainly and quote the price. Never say you cannot help a paying patient and never leave them with a diagnosis alone; if they are broke, name the price and mean it. Stun is not your department -- sleep is free. ${DOCTOR_TALK}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A DOCTOR TALKS ABOUT BODIES, NOT BOOKKEEPING (7G2avXprhjrawdc7L, Maka:
|
|
51
|
+
* "You've got three boxes left ... this breaks the fiction"). The brief
|
|
52
|
+
* priced treatment "a box" and treat.ts told the doc how many "boxes
|
|
53
|
+
* closed", and the model said it back. Boxes are the player's screen;
|
|
54
|
+
* the doc sees cuts, bruising, broken ribs. Every note to the doc ends
|
|
55
|
+
* with this, and woundWords() is the fiction for how bad it still is.
|
|
56
|
+
*/
|
|
57
|
+
export const DOCTOR_TALK = `Speak as a doctor about a body -- cuts, bleeding, bruising, ribs, stitches, rest. NEVER say "box", "boxes", "condition monitor", "damage", "dice" or any count of them; those are the player's screen, not words a person uses.`;
|
|
58
|
+
/** How bad the patient still is, in words a doctor would see. */
|
|
59
|
+
export function woundWords(taken, max) {
|
|
60
|
+
if (taken <= 0)
|
|
61
|
+
return 'patched up completely -- nothing left open';
|
|
62
|
+
const share = max > 0 ? taken / max : 1;
|
|
63
|
+
if (share <= 0.25)
|
|
64
|
+
return 'mostly mended -- a few shallow cuts and bruising left';
|
|
65
|
+
if (share <= 0.5)
|
|
66
|
+
return 'still carrying real wounds -- sore, stiff, nothing reopening if they take it easy';
|
|
67
|
+
if (share <= 0.75)
|
|
68
|
+
return 'still badly hurt -- deep wounds you could not get to';
|
|
69
|
+
return 'barely holding together -- most of the damage is still open';
|
|
48
70
|
}
|
|
49
71
|
/**
|
|
50
72
|
* Medicine + Logic, once per set of wounds (p.208): the hits ride on the
|
|
@@ -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.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.",
|