@maka/maka-cli 5.153.0 → 5.155.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/reload.js +20 -4
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +12 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js +2 -2
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.155.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.",
|
|
@@ -2,6 +2,7 @@ import { Command } from './command.js';
|
|
|
2
2
|
import { Category } from '../types/shared/item-enum.js';
|
|
3
3
|
import { Item } from '../models/item.js';
|
|
4
4
|
import { billAction, encounterOf, phaseHint } from '../utilities/action-cost.js';
|
|
5
|
+
import { fuzzyPickName } from '../utilities/fuzzy-match.js';
|
|
5
6
|
/**
|
|
6
7
|
* Refills the equipped firearm's magazine by consuming one
|
|
7
8
|
* Ammunition-category item from the pack. Every shot spends a round --
|
|
@@ -20,7 +21,7 @@ import { billAction, encounterOf, phaseHint } from '../utilities/action-cost.js'
|
|
|
20
21
|
export class ReloadCommand extends Command {
|
|
21
22
|
static verb = 'reload';
|
|
22
23
|
static description = 'Reload your equipped firearm -- consumes one Ammunition item from your pack. In a fight it takes the whole Action Phase (Remove Clip + Insert Clip, SR5 p.163), or a Free + a Simple with a smartgun you\'re linked to (p.164).';
|
|
23
|
-
async execute(
|
|
24
|
+
async execute(args = []) {
|
|
24
25
|
const actor = this.actor;
|
|
25
26
|
if (this.scene.isHumanControlled(actor) && this.scene.isPlayerExchangeActive(actor.name)) {
|
|
26
27
|
return `No time -- the exchange is still resolving. Reload in the lull.`;
|
|
@@ -32,10 +33,25 @@ export class ReloadCommand extends Command {
|
|
|
32
33
|
if (weapon.ammo >= weapon.magazineCapacity) {
|
|
33
34
|
return `The ${weapon.name} is already fully loaded (${weapon.ammo}/${weapon.magazineCapacity}).`;
|
|
34
35
|
}
|
|
35
|
-
// NON-LETHAL STANCE: stun rounds first if you carry any (gel,
|
|
36
|
-
// stick-n-shock -- p.434); otherwise whatever is in the pack.
|
|
37
36
|
const boxes = actor.inventory.getAllItems().filter(i => i.category === Category.Ammunition);
|
|
38
|
-
|
|
37
|
+
// "reload APDS Rounds" names which box to slap home -- the arg was
|
|
38
|
+
// being silently discarded (bktSfejkhvmjFZ5EH), always loading the
|
|
39
|
+
// stance default instead of what the player actually asked for.
|
|
40
|
+
let ammo;
|
|
41
|
+
if (args.length > 0) {
|
|
42
|
+
const requested = args.join(' ');
|
|
43
|
+
const picked = fuzzyPickName(requested, boxes.map(b => b.name));
|
|
44
|
+
ammo = picked ? boxes.find(b => b.name === picked) : undefined;
|
|
45
|
+
if (!ammo) {
|
|
46
|
+
const present = boxes.map(b => b.name).join(', ') || 'none';
|
|
47
|
+
return `You're not carrying any ammunition named "${requested}" -- carrying: ${present}.`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// NON-LETHAL STANCE: stun rounds first if you carry any (gel,
|
|
52
|
+
// stick-n-shock -- p.434); otherwise whatever is in the pack.
|
|
53
|
+
ammo = (actor.autoStance === 'non-lethal' ? boxes.find(b => Item.isStunAmmo(b)) : undefined) ?? boxes[0];
|
|
54
|
+
}
|
|
39
55
|
if (!ammo) {
|
|
40
56
|
return `No ammunition in your pack -- the ${weapon.name} stays at ${weapon.ammo}/${weapon.magazineCapacity}. Find a spare clip.`;
|
|
41
57
|
}
|
|
@@ -279,11 +279,22 @@ take ground. Build it accordingly:
|
|
|
279
279
|
// the runner heard at the noodle stand pays off as foreshadowing when
|
|
280
280
|
// the next job turns out to be tangled in exactly that (see
|
|
281
281
|
// Game.advanceRumor).
|
|
282
|
+
// A NAME REFERRING TO SOMEONE ELSE (8jSvzdWGvAk27PoYr): the rumor
|
|
283
|
+
// sometimes names a real hub fixture by name -- e.g. "Mama Wu's cousin
|
|
284
|
+
// swears..." -- and a model connecting the job to it stationed a
|
|
285
|
+
// brand-new "Mama Wu" NPC of its own, at a freshly-invented room, right
|
|
286
|
+
// alongside the real Mama Wu the runner already knows from the hub. The
|
|
287
|
+
// rumor is HEARSAY the runner carries INTO this scene, not a cast list;
|
|
288
|
+
// anyone it names by name lives back home and stays there.
|
|
282
289
|
const rumorBlock = rumor
|
|
283
290
|
? `\nSTREET RUMOR the runner has been hearing around their home district: "${rumor}"
|
|
284
291
|
Let this job CONNECT to the rumor -- as its cause, its consequence, or the truth behind it.
|
|
285
292
|
The connection should be discoverable in play (the client's briefing, an NPC's talk, a
|
|
286
|
-
document), not just implied by the title
|
|
293
|
+
document), not just implied by the title. If the rumor names someone by name (a hub fixture
|
|
294
|
+
like a fixer, vendor, or contact), that person is NOT part of this job's cast -- they stay
|
|
295
|
+
back in the home district. Reference them only in passing (a mention, a rumor of their own);
|
|
296
|
+
never give them an npcs[] entry or a room of their own in THIS scene. Every npc and room this
|
|
297
|
+
job stations the runner with must be new and specific to this job.`
|
|
287
298
|
: '';
|
|
288
299
|
return `
|
|
289
300
|
You are generating the STRUCTURE (skeleton) of a self-contained Shadowrun-flavored text
|
|
@@ -130,7 +130,7 @@ function renderRow(item) {
|
|
|
130
130
|
// extra steps (user, 2026-08-30).
|
|
131
131
|
const liveReason = liveReasonOf(item.repro);
|
|
132
132
|
Log.plain(liveReason
|
|
133
|
-
? ` ${Log.colors.warn(`${liveReason} -- card: maka play
|
|
133
|
+
? ` ${Log.colors.warn(`${liveReason} -- card: maka play:backlog ${item._id}`)}`
|
|
134
134
|
: ` ${Log.colors.success(`bench: maka play --repro ${item._id}`)}${benchLockNote(item)}`);
|
|
135
135
|
}
|
|
136
136
|
}
|
|
@@ -286,7 +286,7 @@ export async function dumpBacklog(opts = {}) {
|
|
|
286
286
|
if (!found) {
|
|
287
287
|
if (!items.some(it => it._id.startsWith(id))) {
|
|
288
288
|
Log.error(`No item with id "${id}" on the board${filter ? ` in ${filter}` : ''}.`);
|
|
289
|
-
Log.info('`maka play
|
|
289
|
+
Log.info('`maka play:backlog` lists them -- every row carries its id.');
|
|
290
290
|
}
|
|
291
291
|
return;
|
|
292
292
|
}
|
|
@@ -333,7 +333,7 @@ const ShadowrunCommand = Command.create({
|
|
|
333
333
|
}
|
|
334
334
|
if (found.outcome === 'not-found') {
|
|
335
335
|
Log.error(`Nothing in your review queue matches "${reproTarget}".`);
|
|
336
|
-
Log.info('`maka play
|
|
336
|
+
Log.info('`maka play:backlog --filter in-review` lists them, with ids.');
|
|
337
337
|
return;
|
|
338
338
|
}
|
|
339
339
|
if (found.outcome === 'no-repro') {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.155.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.",
|