@maka/maka-cli 5.17.17 → 5.17.18
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/archetypes.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/command.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/command.js +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/command.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/compile.d.ts +27 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/compile.js +8 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/compile.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/crew.d.ts +12 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/crew.js +69 -79
- package/bundle/typescript/src/commands/game/sideQuest/commands/crew.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/players.d.ts +4 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/players.js +6 -9
- package/bundle/typescript/src/commands/game/sideQuest/commands/players.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/register.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/register.js +74 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/register.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/thread.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/thread.js +165 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/thread.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +3 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +17 -4
- package/bundle/typescript/src/commands/game/sideQuest/game.js +122 -46
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +9 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +17 -4
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +7 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.d.ts +5 -5
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js +9 -9
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/social.d.ts +1 -30
- package/bundle/typescript/src/commands/game/sideQuest/utilities/social.js +4 -89
- package/bundle/typescript/src/commands/game/sideQuest/utilities/social.js.map +1 -1
- package/package.json +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/crew-ledger.d.ts +0 -21
- package/bundle/typescript/src/commands/game/sideQuest/utilities/crew-ledger.js +0 -25
- package/bundle/typescript/src/commands/game/sideQuest/utilities/crew-ledger.js.map +0 -1
|
@@ -3,12 +3,10 @@ import { hint } from '../utilities/hints.js';
|
|
|
3
3
|
import { fetchPlayers } from '../utilities/social.js';
|
|
4
4
|
import { authToken } from '../utilities/cloud-saves.js';
|
|
5
5
|
/**
|
|
6
|
-
* THE STREET (
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* running silent (pull the link or go silent and you drop off the
|
|
11
|
-
* list); "away, hireable" rows are the standing ghost opt-in.
|
|
6
|
+
* THE STREET ("crew players"). Real players' runners, shown by STREET
|
|
7
|
+
* NAME only -- no account handles, no emails. A runner is "online" only
|
|
8
|
+
* while their link broadcasts: commlink equipped and not running silent
|
|
9
|
+
* (pull the link or go silent and you drop off the list).
|
|
12
10
|
*/
|
|
13
11
|
export class PlayersCommand extends Command {
|
|
14
12
|
static verb = 'players';
|
|
@@ -44,11 +42,10 @@ export class PlayersCommand extends Command {
|
|
|
44
42
|
else {
|
|
45
43
|
lines.push(` ${'Runner'.padEnd(18)} ${'Archetype'.padEnd(16)} Karma Status`);
|
|
46
44
|
for (const p of players) {
|
|
47
|
-
|
|
48
|
-
lines.push(` ${p.playerName.padEnd(18)} ${(p.archetypeName ?? '?').padEnd(16)} ${String(p.karma).padStart(5)} ${status}`);
|
|
45
|
+
lines.push(` ${p.playerName.padEnd(18)} ${(p.archetypeName ?? '?').padEnd(16)} ${String(p.karma).padStart(5)} ${p.online ? 'online' : 'away'}`);
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
|
-
const footer = hint(`"hire <runner>" seats one at your table
|
|
48
|
+
const footer = hint(`"hire <runner>" seats one at your table (they accept the invite from their own terminal); "call <runner>" rings them on the crew channel -- then "say" talks, "end-call" hangs up.`);
|
|
52
49
|
if (footer)
|
|
53
50
|
lines.push('', footer);
|
|
54
51
|
return lines.join('\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"players.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/players.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"players.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/players.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD;;;;;GAKG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO;IAC/B,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,MAAM,CAAC,WAAW,GAAG,kRAAkR,CAAC;IAElT,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAClB,OAAO,wEAAwE,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,OAAO,0EAA0E,CAAC;QACpF,CAAC;QACD,iEAAiE;QACjE,+DAA+D;QAC/D,6DAA6D;QAC7D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;QACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,mEAAmE,CAAC;QAC7E,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;YACtB,CAAC,CAAC,MAAM;gBACN,CAAC,CAAC,qDAAqD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG;gBACzE,CAAC,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,6BAA6B;YACxI,CAAC,CAAC,IAAI,KAAK,YAAY;gBACrB,CAAC,CAAC,oEAAoE;gBACtE,CAAC,CAAC,2EAA2E,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;YAC/E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACpJ,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,oLAAoL,CAAC,CAAC;QAC1M,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registering (SR5e p.254-256, engine-adapted): make a compiled sprite
|
|
4
|
+
* PERMANENT. An opposed Resonance + compiling test against TWICE the
|
|
5
|
+
* sprite's Level -- net hits add tasks, and the sprite becomes
|
|
6
|
+
* REGISTERED: it survives travel (folds into your PAN and re-shells at
|
|
7
|
+
* the curb) and rides your save file across sessions. Fading is 2x the
|
|
8
|
+
* sprite's hits (min 2), resisted with Resonance + Willpower --
|
|
9
|
+
* PHYSICAL past your Resonance, the usual overreach law. One sprite at
|
|
10
|
+
* a time either way; decompiling releases a registered sprite too.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RegisterCommand extends Command implements ICommand {
|
|
13
|
+
protected static verb: string;
|
|
14
|
+
protected static description: string;
|
|
15
|
+
execute(_args?: string[]): Promise<string>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
import { rollPool, formatRoll } from '../utilities/dice.js';
|
|
3
|
+
import { hint } from '../utilities/hints.js';
|
|
4
|
+
/**
|
|
5
|
+
* Registering (SR5e p.254-256, engine-adapted): make a compiled sprite
|
|
6
|
+
* PERMANENT. An opposed Resonance + compiling test against TWICE the
|
|
7
|
+
* sprite's Level -- net hits add tasks, and the sprite becomes
|
|
8
|
+
* REGISTERED: it survives travel (folds into your PAN and re-shells at
|
|
9
|
+
* the curb) and rides your save file across sessions. Fading is 2x the
|
|
10
|
+
* sprite's hits (min 2), resisted with Resonance + Willpower --
|
|
11
|
+
* PHYSICAL past your Resonance, the usual overreach law. One sprite at
|
|
12
|
+
* a time either way; decompiling releases a registered sprite too.
|
|
13
|
+
*/
|
|
14
|
+
export class RegisterCommand extends Command {
|
|
15
|
+
static verb = 'register';
|
|
16
|
+
static description = 'Register your compiled sprite (technomancers): Resonance + compiling vs twice its Level -- net hits ADD tasks, and the sprite becomes permanent (survives travel, rides your save). Fading 2x its hits (PHYSICAL past your Resonance).';
|
|
17
|
+
async execute(_args = []) {
|
|
18
|
+
const actor = this.actor;
|
|
19
|
+
const game = this.game;
|
|
20
|
+
if (!actor.isTechnomancer()) {
|
|
21
|
+
return `The Resonance doesn't know your voice. Registering is technomancer work.`;
|
|
22
|
+
}
|
|
23
|
+
const entry = game?.companions.find(c => c.kind === 'sprite');
|
|
24
|
+
if (!entry) {
|
|
25
|
+
return `No sprite rides with you -- "compile" one first.`;
|
|
26
|
+
}
|
|
27
|
+
if (entry.registered) {
|
|
28
|
+
return `${entry.npc.name} is already registered -- it isn't going anywhere.${hint(` ("compile" decompiles it when you're done.)`)}`;
|
|
29
|
+
}
|
|
30
|
+
if (actor.inExchange) {
|
|
31
|
+
return `Registering takes more focus than the fight will give you.`;
|
|
32
|
+
}
|
|
33
|
+
const level = entry.force;
|
|
34
|
+
const compiling = actor.skillRating('compiling');
|
|
35
|
+
const mine = rollPool(Math.max(1, actor.resonance + (compiling > 0 ? compiling : -1) + actor.woundModifier - actor.sustainingPenalty));
|
|
36
|
+
const sprite = rollPool(level * 2);
|
|
37
|
+
const net = Math.max(0, mine.hits - sprite.hits);
|
|
38
|
+
const fadingValue = Math.max(2, sprite.hits * 2);
|
|
39
|
+
const resist = rollPool(Math.max(1, actor.willpower + actor.resonance));
|
|
40
|
+
const fadingTaken = Math.max(0, fadingValue - resist.hits);
|
|
41
|
+
const overreach = level > actor.resonance;
|
|
42
|
+
actor.performAction('weaves a registration', `around ${entry.npc.name}`);
|
|
43
|
+
this.logger.write(`RegisterCommand: ${actor.name} vs ${entry.npc.name} (L${level}) -- ${mine.hits} vs ${sprite.hits}, net ${net}, fading ${fadingValue} (took ${fadingTaken}${overreach ? ' physical' : ''}).`);
|
|
44
|
+
this.logger.meta(`Registering (Resonance ${actor.resonance}${compiling > 0 ? `, compiling ${compiling}` : ', no compiling -1'}): ${formatRoll(mine)}`);
|
|
45
|
+
this.logger.meta(` the sprite resists (Level x2): ${formatRoll(sprite)}`);
|
|
46
|
+
const lines = [];
|
|
47
|
+
if (net === 0) {
|
|
48
|
+
lines.push(`The sprite slips the weave -- it stays compiled, but it will not be OWNED tonight. (Still ${entry.services ?? 0} task${(entry.services ?? 0) === 1 ? '' : 's'}.)`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
entry.registered = true;
|
|
52
|
+
entry.services = (entry.services ?? 0) + net;
|
|
53
|
+
lines.push(`The weave settles and HOLDS -- ${entry.npc.name} is REGISTERED: ${net} task${net === 1 ? '' : 's'} added (${entry.services} standing). It survives travel now, folded into your PAN, and rides your save.`);
|
|
54
|
+
}
|
|
55
|
+
this.logger.meta(`Fading (${fadingValue}${overreach ? ', OVERREACH -- physical' : ''}): resist ${formatRoll(resist)}`);
|
|
56
|
+
if (fadingTaken === 0) {
|
|
57
|
+
lines.push(` You shake the fading off.`);
|
|
58
|
+
}
|
|
59
|
+
else if (overreach) {
|
|
60
|
+
actor.takeDamage(fadingTaken);
|
|
61
|
+
lines.push(` The registration tears something on the way through -- ${fadingTaken} PHYSICAL: ${actor.conditionSummary()}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const { stun, overflow } = actor.takeStun(fadingTaken);
|
|
65
|
+
lines.push(` The fading bites -- ${stun} stun: ${actor.stunSummary()}`);
|
|
66
|
+
if (overflow > 0) {
|
|
67
|
+
lines.push(` It's more than your mind can hold -- ${overflow} box${overflow === 1 ? '' : 'es'} spill into your body: ${actor.conditionSummary()}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
this.scene.updateStatus();
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
export declare class ThreadCommand extends Command implements ICommand {
|
|
3
|
+
protected static verb: string;
|
|
4
|
+
protected static description: string;
|
|
5
|
+
protected static subcommands: ({
|
|
6
|
+
usage: string;
|
|
7
|
+
short: string;
|
|
8
|
+
long?: undefined;
|
|
9
|
+
} | {
|
|
10
|
+
usage: string;
|
|
11
|
+
short: string;
|
|
12
|
+
long: string;
|
|
13
|
+
})[];
|
|
14
|
+
execute(args?: string[]): Promise<string>;
|
|
15
|
+
/** Per-form resolution once the weave holds (hits >= 1). */
|
|
16
|
+
private resolveForm;
|
|
17
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
import { rollPool, formatRoll } from '../utilities/dice.js';
|
|
3
|
+
import { hint } from '../utilities/hints.js';
|
|
4
|
+
import { fuzzyPickName } from '../utilities/fuzzy-match.js';
|
|
5
|
+
import { NPC } from '../models/npc.js';
|
|
6
|
+
const FORMS = [
|
|
7
|
+
{ key: 'resonance-spike', name: 'Resonance Spike', blurb: 'raw Resonance as a weapon -- boxes of Matrix damage, no marks, no mercy', fvDelta: -1, kind: 'instant' },
|
|
8
|
+
{ key: 'stitches', name: 'Stitches', blurb: 'rethread a damaged sprite -- repairs its condition monitor', fvDelta: 0, kind: 'instant' },
|
|
9
|
+
{ key: 'diagnostics', name: 'Diagnostics', blurb: 'the code shows you its seams -- +2 to your Matrix pools while held', fvDelta: -1, kind: 'sustained' },
|
|
10
|
+
{ key: 'static-veil', name: 'Static Veil', blurb: 'you read as background noise -- +2 Matrix defense while held', fvDelta: -1, kind: 'sustained' },
|
|
11
|
+
];
|
|
12
|
+
export class ThreadCommand extends Command {
|
|
13
|
+
static verb = 'thread';
|
|
14
|
+
static description = 'Thread a complex form (technomancers): "thread <form> <level>" -- Resonance + software vs the weave; fading resisted with Resonance + Willpower (PHYSICAL past your Resonance). Sustained forms hold at -2 dice each. "thread" lists; "thread drop <form>" releases.';
|
|
15
|
+
static subcommands = [
|
|
16
|
+
{ usage: 'thread', short: 'list the forms you can weave' },
|
|
17
|
+
{ usage: 'thread <form> <level>', short: 'weave one (level defaults to your Resonance)',
|
|
18
|
+
long: 'Resonance + software [Level] shapes the form; hits are capped by the Level. Fading = the form\'s value off the Level (min 2), resisted with Resonance + Willpower -- PHYSICAL when the Level exceeds your Resonance. Level caps at twice your Resonance.' },
|
|
19
|
+
{ usage: 'thread drop <form>', short: 'release a sustained form',
|
|
20
|
+
long: 'Lets a sustained form unravel -- its bonus ends, its -2 sustaining burden lifts.' },
|
|
21
|
+
];
|
|
22
|
+
async execute(args = []) {
|
|
23
|
+
const actor = this.actor;
|
|
24
|
+
if (!actor.isTechnomancer()) {
|
|
25
|
+
return `The Resonance doesn't know your voice. Complex forms answer technomancers.`;
|
|
26
|
+
}
|
|
27
|
+
if (actor.plane === 'astral') {
|
|
28
|
+
return `The astral and the Resonance don't touch. "return" first.`;
|
|
29
|
+
}
|
|
30
|
+
const words = args.map(w => w.toLowerCase());
|
|
31
|
+
// "thread drop <form>": release a sustained working.
|
|
32
|
+
if (words[0] === 'drop' || words[0] === 'release') {
|
|
33
|
+
const query = words.slice(1).join(' ');
|
|
34
|
+
const held = actor.sustainedForms;
|
|
35
|
+
if (held.length === 0)
|
|
36
|
+
return `You hold no threaded forms.`;
|
|
37
|
+
const pick = query
|
|
38
|
+
? fuzzyPickName(query, held.map(f => f.key))
|
|
39
|
+
: held[held.length - 1].key;
|
|
40
|
+
const idx = pick ? held.findIndex(f => f.key === pick) : -1;
|
|
41
|
+
if (idx < 0)
|
|
42
|
+
return `You hold no form matching "${query}". (${held.map(f => f.key).join(', ')})`;
|
|
43
|
+
const [dropped] = held.splice(idx, 1);
|
|
44
|
+
this.scene.updateStatus();
|
|
45
|
+
return `You let ${FORMS.find(f => f.key === dropped.key)?.name ?? dropped.key} unravel -- the weave releases, your focus comes back.`;
|
|
46
|
+
}
|
|
47
|
+
// Bare "thread": the catalog.
|
|
48
|
+
if (words.length === 0) {
|
|
49
|
+
const lines = [`=== COMPLEX FORMS === (thread <form> <level>)`];
|
|
50
|
+
for (const f of FORMS) {
|
|
51
|
+
const held = actor.sustainedForms.some(s => s.key === f.key);
|
|
52
|
+
lines.push(` ${f.name.padEnd(16)} ${f.kind === 'sustained' ? '[sustained]' : '[instant] '} ${f.blurb}${held ? ' {cyan-fg}(HELD){/cyan-fg}' : ''}`);
|
|
53
|
+
}
|
|
54
|
+
if (actor.sustainedForms.length > 0) {
|
|
55
|
+
lines.push('', ` Holding ${actor.sustainedForms.length} form${actor.sustainedForms.length === 1 ? '' : 's'} (-${actor.sustainedForms.length * 2} dice).${hint(` ("thread drop <form>" releases.)`)}`);
|
|
56
|
+
}
|
|
57
|
+
return lines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
// "thread <form> [level]"
|
|
60
|
+
const numArg = words.find(w => /^\d+$/.test(w));
|
|
61
|
+
const nameWords = words.filter(w => !/^\d+$/.test(w)).join(' ');
|
|
62
|
+
const pickedKey = fuzzyPickName(nameWords, FORMS.map(f => f.key))
|
|
63
|
+
?? fuzzyPickName(nameWords, FORMS.map(f => f.name));
|
|
64
|
+
const form = FORMS.find(f => f.key === pickedKey || f.name === pickedKey);
|
|
65
|
+
if (!form) {
|
|
66
|
+
return `No form by that name. The Resonance weaves: ${FORMS.map(f => f.name).join(', ')}. ("thread" lists them.)`;
|
|
67
|
+
}
|
|
68
|
+
const level = numArg ? parseInt(numArg, 10) : Math.max(1, actor.resonance);
|
|
69
|
+
if (level < 1)
|
|
70
|
+
return `Level below 1 threads nothing at all.`;
|
|
71
|
+
if (level > actor.resonance * 2) {
|
|
72
|
+
return `A Level ${level} weave would thread YOU -- twice your Resonance (${actor.resonance * 2}) is the hard ceiling.`;
|
|
73
|
+
}
|
|
74
|
+
if (form.kind === 'sustained' && actor.sustainedForms.some(f => f.key === form.key)) {
|
|
75
|
+
return `${form.name} is already woven and held. ("thread drop ${form.key}" releases it first.)`;
|
|
76
|
+
}
|
|
77
|
+
const overreach = level > actor.resonance;
|
|
78
|
+
// The threading test: Resonance + software [Level] -- hits capped
|
|
79
|
+
// by the Level, unskilled defaults at -1 (the conjuring school).
|
|
80
|
+
const software = actor.skillRating('software');
|
|
81
|
+
const roll = rollPool(Math.max(1, actor.resonance + (software > 0 ? software : -1) + actor.woundModifier - actor.sustainingPenalty));
|
|
82
|
+
const hits = Math.min(roll.hits, level);
|
|
83
|
+
// Fading: the form's value off the Level, min 2 -- resisted with
|
|
84
|
+
// Resonance + Willpower, physical on overreach.
|
|
85
|
+
const fadingValue = Math.max(2, level + form.fvDelta);
|
|
86
|
+
const resist = rollPool(Math.max(1, actor.willpower + actor.resonance));
|
|
87
|
+
const fadingTaken = Math.max(0, fadingValue - resist.hits);
|
|
88
|
+
actor.performAction('threads a complex form', form.name);
|
|
89
|
+
this.logger.write(`ThreadCommand: ${actor.name} ${form.key} level ${level} -- ${roll.hits} hits (capped ${hits}), fading ${fadingValue} (took ${fadingTaken}${overreach ? ' physical' : ''}).`);
|
|
90
|
+
const poolParts = [`Resonance ${actor.resonance}`, software > 0 ? `software ${software}` : `no software -1`];
|
|
91
|
+
if (actor.woundModifier < 0)
|
|
92
|
+
poolParts.push(`wounds ${actor.woundModifier}`);
|
|
93
|
+
if (actor.sustainingPenalty > 0)
|
|
94
|
+
poolParts.push(`sustaining -${actor.sustainingPenalty}`);
|
|
95
|
+
this.logger.meta(`Threading (${poolParts.join(', ')}) [Level ${level}]: ${formatRoll(roll)}`);
|
|
96
|
+
const lines = [
|
|
97
|
+
`You reach into the code behind the code and THREAD ${form.name} at Level ${level}${overreach ? ' (past your Resonance -- the fading will be PHYSICAL)' : ''}:`,
|
|
98
|
+
];
|
|
99
|
+
if (hits === 0) {
|
|
100
|
+
lines.push(` The weave slips through your fingers -- nothing holds.`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
lines.push(...this.resolveForm(form, level, hits));
|
|
104
|
+
}
|
|
105
|
+
this.logger.meta(`Fading (${fadingValue}${overreach ? ', OVERREACH -- physical' : ''}): resist ${formatRoll(resist)}`);
|
|
106
|
+
if (fadingTaken === 0) {
|
|
107
|
+
lines.push(` The fading washes past you.`);
|
|
108
|
+
}
|
|
109
|
+
else if (overreach) {
|
|
110
|
+
actor.takeDamage(fadingTaken);
|
|
111
|
+
lines.push(` The weave burns on the way out -- ${fadingTaken} PHYSICAL: ${actor.conditionSummary()}`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const { stun, overflow } = actor.takeStun(fadingTaken);
|
|
115
|
+
lines.push(` The fading bites -- ${stun} stun: ${actor.stunSummary()}`);
|
|
116
|
+
if (overflow > 0) {
|
|
117
|
+
lines.push(` It's more than your mind can hold -- ${overflow} box${overflow === 1 ? '' : 'es'} spill into your body: ${actor.conditionSummary()}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
this.scene.updateStatus();
|
|
121
|
+
return lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
/** Per-form resolution once the weave holds (hits >= 1). */
|
|
124
|
+
resolveForm(form, level, hits) {
|
|
125
|
+
const actor = this.actor;
|
|
126
|
+
switch (form.key) {
|
|
127
|
+
case 'resonance-spike': {
|
|
128
|
+
// Raw damage to a Matrix opponent: your engaged foe, or the
|
|
129
|
+
// nearest hostile icon in the room. Resonance actions need no
|
|
130
|
+
// marks and grant no defense from hardware.
|
|
131
|
+
const target = (actor.combatOpponent instanceof NPC && actor.combatOpponent.plane === 'matrix')
|
|
132
|
+
? actor.combatOpponent
|
|
133
|
+
: actor.currentLocation.getActors().find((a) => a instanceof NPC && a.plane === 'matrix' && !a.deathClaimed);
|
|
134
|
+
if (!target || actor.plane !== 'matrix') {
|
|
135
|
+
return [` The spike arcs and grounds out -- no hostile icon in reach.${actor.plane !== 'matrix' ? ` ("jack in" -- the Resonance strikes on the grid.)` : ''}`];
|
|
136
|
+
}
|
|
137
|
+
const dmg = hits + 2;
|
|
138
|
+
target.takeDamage(dmg);
|
|
139
|
+
this.logger.meta(`Resonance Spike: ${dmg} boxes to ${target.name}.`);
|
|
140
|
+
const fell = target.isDown() || target.deathClaimed;
|
|
141
|
+
return [` The spike lands SQUARE -- ${dmg} boxes of raw Resonance tear through ${target.name}${fell ? `, and its code shears apart` : ` (${target.conditionSummary()})`}.`];
|
|
142
|
+
}
|
|
143
|
+
case 'stitches': {
|
|
144
|
+
const sprite = this.game?.companions.find(c => c.kind === 'sprite');
|
|
145
|
+
if (!sprite)
|
|
146
|
+
return [` Stitches finds nothing to mend -- no sprite rides with you.`];
|
|
147
|
+
const before = sprite.npc.damageTaken;
|
|
148
|
+
sprite.npc.healDamage(hits);
|
|
149
|
+
const healed = before - sprite.npc.damageTaken;
|
|
150
|
+
return healed > 0
|
|
151
|
+
? [` The weave knits ${sprite.npc.name} back together -- ${healed} box${healed === 1 ? '' : 'es'} restored (${sprite.npc.conditionSummary()}).`]
|
|
152
|
+
: [` ${sprite.npc.name} runs clean already -- the stitches find nothing torn.`];
|
|
153
|
+
}
|
|
154
|
+
case 'diagnostics':
|
|
155
|
+
case 'static-veil': {
|
|
156
|
+
actor.sustainedForms.push({ key: form.key, level });
|
|
157
|
+
const effect = form.key === 'diagnostics' ? '+2 to your Matrix pools' : '+2 Matrix defense';
|
|
158
|
+
return [` ${form.name} settles over your persona and HOLDS -- ${effect} while you sustain it (-2 dice to everything else).${hint(` ("thread drop ${form.key}" releases.)`)}`];
|
|
159
|
+
}
|
|
160
|
+
default:
|
|
161
|
+
return [` The form resolves and fades.`];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,5 +16,7 @@
|
|
|
16
16
|
* No import.meta here (engine-graph law) -- this file is loaded by the
|
|
17
17
|
* server.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
// 1.1.0 (2026-08-23): threading + sprite registration verbs in shared
|
|
20
|
+
// scenes; ghost mechanic removed; one-table-at-a-time party rules.
|
|
21
|
+
export const ENGINE_VERSION = '1.1.0';
|
|
20
22
|
//# sourceMappingURL=engine-version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-version.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/engine-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"engine-version.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/engine-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,sEAAsE;AACtE,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
|
|
@@ -108,10 +108,6 @@ export default class Game {
|
|
|
108
108
|
*/
|
|
109
109
|
pushPresenceNow(): Promise<'ok' | 'logged-out' | 'offline'>;
|
|
110
110
|
startPresenceHeartbeat(): void;
|
|
111
|
-
/** Ghost earnings home delivery: what YOUR runner made riding in
|
|
112
|
-
* other players' crews since last time. Fire-and-forget from hub
|
|
113
|
-
* arrival beats; pays onto the job credstick when anything landed. */
|
|
114
|
-
collectGhostEarnings(): Promise<void>;
|
|
115
111
|
private static readonly HIRE_NAMES;
|
|
116
112
|
/** Deal 2-3 fresh candidates. Names dodge the live cast and roster. */
|
|
117
113
|
rollHireCandidates(): void;
|
|
@@ -214,7 +210,16 @@ export default class Game {
|
|
|
214
210
|
services?: number;
|
|
215
211
|
force: number;
|
|
216
212
|
boundDevice?: Item;
|
|
213
|
+
/** Sprites only: which SPRITE_TYPES entry built the shell -- needed
|
|
214
|
+
* to re-shell a REGISTERED sprite after travel or a resume. */
|
|
215
|
+
spriteType?: string;
|
|
216
|
+
/** REGISTERED (commands/register.ts): the sprite persists -- it
|
|
217
|
+
* survives travel and rides the save file. */
|
|
218
|
+
registered?: boolean;
|
|
217
219
|
}[];
|
|
220
|
+
/** A registered sprite folded for travel, waiting to re-shell at the
|
|
221
|
+
* destination (the drone _pendingRedeploys school). */
|
|
222
|
+
private _pendingSpriteRedeploy?;
|
|
218
223
|
private _pendingRedeploys;
|
|
219
224
|
private _saveFilePath?;
|
|
220
225
|
private _dead;
|
|
@@ -270,6 +275,14 @@ export default class Game {
|
|
|
270
275
|
foldCompanionsForTravel(): string[];
|
|
271
276
|
/** Post-arrival: re-shell what was deployed when you left (drones). */
|
|
272
277
|
unfoldCompanionsOnArrival(): string[];
|
|
278
|
+
/** Re-shell a registered sprite (travel arrival, or a resumed save).
|
|
279
|
+
* Returns the arrival line, or undefined when the shell can't land
|
|
280
|
+
* (name collision -- vanishingly rare). */
|
|
281
|
+
respawnRegisteredSprite(spec: {
|
|
282
|
+
spriteType: string;
|
|
283
|
+
level: number;
|
|
284
|
+
tasks: number;
|
|
285
|
+
}): string | undefined;
|
|
273
286
|
/**
|
|
274
287
|
* Records a real transaction with a hub NPC: first contact opens the
|
|
275
288
|
* relationship at Loyalty 1 (a safeguard -- the hub cast is pre-seeded
|