@maka/maka-cli 5.67.0 → 5.69.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/archetypes.js +6 -1
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/abandon.d.ts +30 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/abandon.js +54 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/abandon.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/ar.js +4 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/ar.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +5 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +12 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +28 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +105 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/climb.d.ts +48 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/climb.js +107 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/climb.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/companions.d.ts +39 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/companions.js +89 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/companions.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/compile.d.ts +37 -17
- package/bundle/typescript/src/commands/game/sideQuest/commands/compile.js +53 -115
- package/bundle/typescript/src/commands/game/sideQuest/commands/compile.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/decompile.d.ts +55 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/decompile.js +203 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/decompile.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.d.ts +23 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +44 -9
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.d.ts +24 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +70 -12
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/lock.js +17 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/lock.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +12 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/map.js +12 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/map.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js +8 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/move.d.ts +11 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/move.js +107 -14
- package/bundle/typescript/src/commands/game/sideQuest/commands/move.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/order.js +69 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/order.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/overwatch.js +5 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/overwatch.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/register.d.ts +15 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/register.js +32 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/register.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +33 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/sprites.d.ts +35 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sprites.js +108 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sprites.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/standby.d.ts +40 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/standby.js +91 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/standby.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/tap.js +10 -11
- package/bundle/typescript/src/commands/game/sideQuest/commands/tap.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/thread.d.ts +27 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/thread.js +7 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/thread.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js +4 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/unravel.d.ts +57 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/unravel.js +162 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/unravel.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +12 -5
- package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +17 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js +41 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +91 -6
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +6 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +135 -11
- package/bundle/typescript/src/commands/game/sideQuest/game.js +361 -30
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/headless-harness.d.ts +24 -12
- package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js +53 -13
- package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/item.d.ts +25 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/item.js +31 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/item.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +98 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +98 -4
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +95 -4
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +179 -20
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +90 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/room.js +114 -5
- package/bundle/typescript/src/commands/game/sideQuest/models/room.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/resonance-actions.d.ts +108 -0
- package/bundle/typescript/src/commands/game/sideQuest/resonance-actions.js +186 -0
- package/bundle/typescript/src/commands/game/sideQuest/resonance-actions.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/sprite-powers.d.ts +88 -0
- package/bundle/typescript/src/commands/game/sideQuest/sprite-powers.js +137 -0
- package/bundle/typescript/src/commands/game/sideQuest/sprite-powers.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/repro.d.ts +42 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +32 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/player-seed.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/room-seed.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js +3 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +5 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.d.ts +41 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.js +52 -4
- package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.d.ts +14 -2
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js +78 -7
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/outdoors.d.ts +7 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/outdoors.js +24 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/outdoors.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.d.ts +46 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js +90 -5
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.d.ts +70 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js +168 -22
- package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +83 -0
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* "climb" and "descend" -- the WORDS for vertical travel, over the
|
|
4
|
+
* machinery that already did it (items KE4oqRZBdf4prfani and
|
|
5
|
+
* vkDz3cquad25GACpm: "how do I go up in elevation? commands like
|
|
6
|
+
* 'mantle' and 'decend' aren't here").
|
|
7
|
+
*
|
|
8
|
+
* THESE ARE SHORTCUTS, NOT A SECOND IMPLEMENTATION, and that is the
|
|
9
|
+
* whole design constraint. `move to <spot>` already crosses levels: it
|
|
10
|
+
* paths through the grid, prefers a level's own stairs or ladder over a
|
|
11
|
+
* free climb, rolls Gymnastics + Strength on a climb (SR5 p.134) and
|
|
12
|
+
* applies falling damage on a failure (p.172). Every one of those
|
|
13
|
+
* behaviours is inherited here by DELEGATING to MoveCommand rather than
|
|
14
|
+
* repeated -- two paths up would drift, and the one that drifted would
|
|
15
|
+
* be the one that forgot the fall.
|
|
16
|
+
*
|
|
17
|
+
* So the only work these verbs do is CHOOSING A DESTINATION: the spot
|
|
18
|
+
* on a level above you (climb) or below you (descend). Everything after
|
|
19
|
+
* that is move's.
|
|
20
|
+
*
|
|
21
|
+
* WHY THEY EXIST AT ALL, given move already worked: a player looking at
|
|
22
|
+
* a drawn ladder reached for "mantle" and "descend" twice, unprompted,
|
|
23
|
+
* and got nothing. Vocabulary is not the mechanism, but a mechanism
|
|
24
|
+
* nobody can name is not reachable either.
|
|
25
|
+
*
|
|
26
|
+
* THE REFUSALS ARE THE CAREFUL PART. A room can legitimately have a
|
|
27
|
+
* storey with nothing to stand on -- generation is repaired for it
|
|
28
|
+
* (factories/scene-chunks.ts) but a hand-authored seed can still do it.
|
|
29
|
+
* Answering that with "you can't climb here" would say the game has no
|
|
30
|
+
* climbing, which is the false-impression bug this whole wave has been
|
|
31
|
+
* about. It says the true thing instead: there is a way up, and nothing
|
|
32
|
+
* up there to stand on.
|
|
33
|
+
*/
|
|
34
|
+
type Way = 'up' | 'down';
|
|
35
|
+
declare abstract class VerticalCommand extends Command {
|
|
36
|
+
protected travel(way: Way, args: string[]): Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
export declare class ClimbCommand extends VerticalCommand implements ICommand {
|
|
39
|
+
protected static verb: string;
|
|
40
|
+
protected static description: string;
|
|
41
|
+
execute(args?: string[]): Promise<string>;
|
|
42
|
+
}
|
|
43
|
+
export declare class DescendCommand extends VerticalCommand implements ICommand {
|
|
44
|
+
protected static verb: string;
|
|
45
|
+
protected static description: string;
|
|
46
|
+
execute(args?: string[]): Promise<string>;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
import { MoveCommand } from './move.js';
|
|
3
|
+
import { hint } from '../utilities/hints.js';
|
|
4
|
+
import { fuzzyPickName } from '../utilities/fuzzy-match.js';
|
|
5
|
+
import { spotOf, spotsActive } from '../utilities/spots.js';
|
|
6
|
+
import { distanceMeters } from '../utilities/room-grid.js';
|
|
7
|
+
class VerticalCommand extends Command {
|
|
8
|
+
async travel(way, args) {
|
|
9
|
+
const actor = this.actor;
|
|
10
|
+
const room = actor.currentLocation;
|
|
11
|
+
const word = way === 'up' ? 'climb' : 'descend';
|
|
12
|
+
const other = way === 'up' ? 'descend' : 'climb';
|
|
13
|
+
const grid = room.ensureGrid();
|
|
14
|
+
const mine = spotOf(actor);
|
|
15
|
+
if (!grid || !spotsActive(room)) {
|
|
16
|
+
return `${room.name} is one level all the way through -- nothing here to ${word}.${hint(` ("exits" lists the ways out.)`)}`;
|
|
17
|
+
}
|
|
18
|
+
// Circulating: no cell, so no level. Claim one first -- the same
|
|
19
|
+
// rule move applies to every other crossing.
|
|
20
|
+
const from = mine ? grid.spotCells.get(mine) : undefined;
|
|
21
|
+
const myZ = from?.z ?? 0;
|
|
22
|
+
// Every spot on a level in the direction asked for.
|
|
23
|
+
const candidates = [...grid.spotCells.entries()]
|
|
24
|
+
.filter(([, c]) => (way === 'up' ? c.z > myZ : c.z < myZ))
|
|
25
|
+
.map(([name]) => name);
|
|
26
|
+
if (candidates.length === 0) {
|
|
27
|
+
// Distinguish the three ways this can be empty. They are
|
|
28
|
+
// different facts about the world and a player acts on them
|
|
29
|
+
// differently.
|
|
30
|
+
const levelsExist = (room.levels ?? []).length > 0;
|
|
31
|
+
const anywhereElse = [...grid.spotCells.entries()]
|
|
32
|
+
.filter(([, c]) => c.z !== myZ).map(([name]) => name);
|
|
33
|
+
if (!levelsExist) {
|
|
34
|
+
return `${room.name} is one level all the way through -- nothing here to ${word}.${hint(` ("exits" lists the ways out; "go up"/"go down" take stairs BETWEEN rooms.)`)}`;
|
|
35
|
+
}
|
|
36
|
+
if (anywhereElse.length === 0) {
|
|
37
|
+
// The empty-storey case. There IS a way up -- the grid built
|
|
38
|
+
// the links and the panel draws them -- and nowhere to arrive.
|
|
39
|
+
const named = (room.levels ?? []).map(l => l.name).join(' and ');
|
|
40
|
+
return `There's a way up to the ${named}, but nothing up there to stand on -- no ledge, no walkway, nowhere to put your feet.${hint(` (That's a gap in this place, not in you.)`)}`;
|
|
41
|
+
}
|
|
42
|
+
// Levels exist and hold spots, just not in this direction.
|
|
43
|
+
return way === 'up'
|
|
44
|
+
? `You're already as high as this place goes.${hint(` ("${other}" goes back down.)`)}`
|
|
45
|
+
: `You're on the ground floor already.${hint(` ("${other}" goes up.)`)}`;
|
|
46
|
+
}
|
|
47
|
+
let target = candidates[0];
|
|
48
|
+
const query = (args ?? []).filter(w => !/^(to|the|a|an|up|down)$/i.test(w)).join(' ').trim();
|
|
49
|
+
if (query.length > 0) {
|
|
50
|
+
const picked = fuzzyPickName(query, candidates);
|
|
51
|
+
if (!picked) {
|
|
52
|
+
// Naming something real that is not in this direction is worth
|
|
53
|
+
// saying precisely -- "no such place" would be a lie.
|
|
54
|
+
const elsewhere = fuzzyPickName(query, [...grid.spotCells.keys()]);
|
|
55
|
+
if (elsewhere) {
|
|
56
|
+
return `${elsewhere} isn't ${way} from here.${hint(` ("move to ${elsewhere}" walks you there.)`)}`;
|
|
57
|
+
}
|
|
58
|
+
return `Nothing ${way} from here answers to "${query}". Up there: ${candidates.join(', ')}.`;
|
|
59
|
+
}
|
|
60
|
+
target = picked;
|
|
61
|
+
}
|
|
62
|
+
else if (candidates.length > 1) {
|
|
63
|
+
// ASK ONLY WHEN THE CHOICE IS A REAL ONE -- which is a question
|
|
64
|
+
// about ALTITUDE, not about how many spots there are.
|
|
65
|
+
//
|
|
66
|
+
// Bare "descend" off a catwalk used to answer "Which one?
|
|
67
|
+
// doorway, back wall, open floor", because the ground floor has
|
|
68
|
+
// three places on it. That is not a choice the player was making:
|
|
69
|
+
// they said "get me down", and every candidate satisfies it.
|
|
70
|
+
// Climbing with two storeys overhead IS a choice, and still asks.
|
|
71
|
+
const zs = new Set(candidates.map(n => grid.spotCells.get(n).z));
|
|
72
|
+
if (zs.size > 1) {
|
|
73
|
+
return `Which one? ${candidates.join(', ')}.${hint(` ("${word} <place>")`)}`;
|
|
74
|
+
}
|
|
75
|
+
// One destination level, several places on it: take the nearest,
|
|
76
|
+
// the way a person would.
|
|
77
|
+
const here = from ?? grid.spotCells.get(mine ?? '') ?? { x: 0, y: 0, z: myZ };
|
|
78
|
+
target = candidates.reduce((best, name) => {
|
|
79
|
+
const a = grid.spotCells.get(name);
|
|
80
|
+
const b = grid.spotCells.get(best);
|
|
81
|
+
return distanceMeters(here, a) < distanceMeters(here, b) ? name : best;
|
|
82
|
+
}, candidates[0]);
|
|
83
|
+
}
|
|
84
|
+
// EVERYTHING FROM HERE IS MOVE'S -- the pathing, the safe-link
|
|
85
|
+
// preference, the Gymnastics + Strength test, the fall, the
|
|
86
|
+
// narration. Delegated exactly as move.ts itself delegates to
|
|
87
|
+
// GoCommand when a step lands on a doorway.
|
|
88
|
+
return await new MoveCommand({
|
|
89
|
+
actor, scene: this.scene, rooms: this.rooms, screen: this.screen, game: this.game,
|
|
90
|
+
}).execute([target]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export class ClimbCommand extends VerticalCommand {
|
|
94
|
+
static verb = 'climb';
|
|
95
|
+
static description = 'Climb to a place above you -- a catwalk, a mezzanine, a balcony ("climb catwalk", or bare "climb" when there is only one way up). A level\'s own stairs or ladder are used when it has them; a free climb is Gymnastics + Strength (SR5 p.134) and a failure means falling. Shorthand for "move to <place>", which does the same thing.';
|
|
96
|
+
async execute(args = []) {
|
|
97
|
+
return this.travel('up', args);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export class DescendCommand extends VerticalCommand {
|
|
101
|
+
static verb = 'descend';
|
|
102
|
+
static description = 'Climb back down to a place below you ("descend", or "descend floor" when there is a choice). Shorthand for "move to <place>".';
|
|
103
|
+
async execute(args = []) {
|
|
104
|
+
return this.travel('down', args);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=climb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"climb.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/climb.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,10 +24,46 @@ export declare class AgentCommand extends Command implements ICommand {
|
|
|
24
24
|
protected static description: string;
|
|
25
25
|
execute(_args?: string[]): Promise<string>;
|
|
26
26
|
}
|
|
27
|
-
/** "recall": fold a deployed autonomous drone back to hand
|
|
28
|
-
*
|
|
27
|
+
/** "recall": fold a deployed autonomous drone back to hand, spin a
|
|
28
|
+
* remote agent down into its deck, or work CALL/DISMISS SPRITE -- see
|
|
29
|
+
* the sprite branch below. */
|
|
29
30
|
export declare class RecallCommand extends Command implements ICommand {
|
|
30
31
|
protected static verb: string;
|
|
31
32
|
protected static description: string;
|
|
32
|
-
execute(
|
|
33
|
+
execute(args?: string[]): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* CALL/DISMISS SPRITE (SR5 p.250, Simple Action), on this verb rather
|
|
36
|
+
* than a new one.
|
|
37
|
+
*
|
|
38
|
+
* TWO BUGS IN ONE PLACE, and they are worth separating. The missing
|
|
39
|
+
* action is the smaller one. The larger is that `recall` ASSERTED A
|
|
40
|
+
* FALSEHOOD: it looked for kind 'drone', fell back to 'agent', and
|
|
41
|
+
* otherwise told the player "Nothing of yours is in the air" -- to a
|
|
42
|
+
* technomancer with a registered sprite standing right there. The
|
|
43
|
+
* reported item reads like a feature request ("there should also be a
|
|
44
|
+
* way to recall the sprite"), and it is half a bug report: the way
|
|
45
|
+
* they went looking already existed and denied them.
|
|
46
|
+
*
|
|
47
|
+
* WHY THIS VERB AND NOT `call`. `call` is CallCommand, the phone.
|
|
48
|
+
* Registering a second handler for it would silently clobber a
|
|
49
|
+
* technomancer's ability to ring their fixer, so implementing the
|
|
50
|
+
* sprite action would have broken an unrelated one. `recall` already
|
|
51
|
+
* means "bring my thing home to me" for drones and agents, and
|
|
52
|
+
* canon's action is bidirectional, so the word already fits both
|
|
53
|
+
* halves. The name and action type are IMPORTED from the p.250 table
|
|
54
|
+
* rather than restated here -- two copies that agree today drift on
|
|
55
|
+
* the first edit.
|
|
56
|
+
*
|
|
57
|
+
* THE DIRECTIONS ARE NOT SYMMETRICAL, on purpose. Calling is free and
|
|
58
|
+
* reversible. Dismissing "releas[es] it from any tasks it still owes
|
|
59
|
+
* you" (p.250), which is why p.256 sells STANDBY for 1 task as the
|
|
60
|
+
* cheaper way to park one. So a bare "recall" only ever CALLS, and
|
|
61
|
+
* sending a sprite away has to be asked for by name -- the same rule
|
|
62
|
+
* decompile follows, for the same reason.
|
|
63
|
+
*
|
|
64
|
+
* Returns undefined when the words are not about sprites at all, so
|
|
65
|
+
* the caller's own "nothing of yours is in the air" still stands for
|
|
66
|
+
* a player who really has nothing.
|
|
67
|
+
*/
|
|
68
|
+
private recallSprite;
|
|
33
69
|
}
|
|
@@ -2,6 +2,7 @@ import { Command } from './command.js';
|
|
|
2
2
|
import { hint } from '../utilities/hints.js';
|
|
3
3
|
import { fuzzyPickName } from '../utilities/fuzzy-match.js';
|
|
4
4
|
import { agentRatingFromName } from '../utilities/programs.js';
|
|
5
|
+
import { resonanceAction } from '../resonance-actions.js';
|
|
5
6
|
/**
|
|
6
7
|
* The rigger's autonomous frames (SR5e p.269-271): "deploy <drone>" puts
|
|
7
8
|
* a carried frame in the air under its own DOG-BRAIN -- no control rig
|
|
@@ -116,12 +117,13 @@ export class AgentCommand extends Command {
|
|
|
116
117
|
].join('\n');
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
|
-
/** "recall": fold a deployed autonomous drone back to hand
|
|
120
|
-
*
|
|
120
|
+
/** "recall": fold a deployed autonomous drone back to hand, spin a
|
|
121
|
+
* remote agent down into its deck, or work CALL/DISMISS SPRITE -- see
|
|
122
|
+
* the sprite branch below. */
|
|
121
123
|
export class RecallCommand extends Command {
|
|
122
124
|
static verb = 'recall';
|
|
123
|
-
static description =
|
|
124
|
-
async execute(
|
|
125
|
+
static description = `Recall your deployed drone to your hand, fold a running agent back into its deck, or call a registered sprite out of the Resonance. "${resonanceAction('call-dismiss-sprite')?.name}" (${resonanceAction('call-dismiss-sprite')?.actionType}, SR5 p.250): "recall <name>" also sends a standing registered sprite back -- which releases every task it still owes you. To park one cheaply instead, "standby" spends a single task (p.256).`;
|
|
126
|
+
async execute(args = []) {
|
|
125
127
|
const game = this.game;
|
|
126
128
|
const entry = game?.companions.find(c => c.kind === 'drone');
|
|
127
129
|
if (!entry) {
|
|
@@ -136,6 +138,9 @@ export class RecallCommand extends Command {
|
|
|
136
138
|
? `Your agent's icon collapses back into your persona -- folded into the deck.`
|
|
137
139
|
: `The deck spins its agent down -- the DECK IN AR light dies as the icon folds home.`;
|
|
138
140
|
}
|
|
141
|
+
const sprite = this.recallSprite(args);
|
|
142
|
+
if (sprite !== undefined)
|
|
143
|
+
return sprite;
|
|
139
144
|
return `Nothing of yours is in the air.`;
|
|
140
145
|
}
|
|
141
146
|
const name = entry.boundDevice?.name ?? entry.npc.name;
|
|
@@ -144,5 +149,85 @@ export class RecallCommand extends Command {
|
|
|
144
149
|
this.scene.updateStatus();
|
|
145
150
|
return `The ${name} banks once and settles back onto your hand, rotors folding.${entry.boundDevice && entry.boundDevice.droneDamage > 0 ? ` The airframe carries its dents (${entry.boundDevice.droneSummary()})${hint(' -- rest repairs it')}.` : ''}`;
|
|
146
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* CALL/DISMISS SPRITE (SR5 p.250, Simple Action), on this verb rather
|
|
154
|
+
* than a new one.
|
|
155
|
+
*
|
|
156
|
+
* TWO BUGS IN ONE PLACE, and they are worth separating. The missing
|
|
157
|
+
* action is the smaller one. The larger is that `recall` ASSERTED A
|
|
158
|
+
* FALSEHOOD: it looked for kind 'drone', fell back to 'agent', and
|
|
159
|
+
* otherwise told the player "Nothing of yours is in the air" -- to a
|
|
160
|
+
* technomancer with a registered sprite standing right there. The
|
|
161
|
+
* reported item reads like a feature request ("there should also be a
|
|
162
|
+
* way to recall the sprite"), and it is half a bug report: the way
|
|
163
|
+
* they went looking already existed and denied them.
|
|
164
|
+
*
|
|
165
|
+
* WHY THIS VERB AND NOT `call`. `call` is CallCommand, the phone.
|
|
166
|
+
* Registering a second handler for it would silently clobber a
|
|
167
|
+
* technomancer's ability to ring their fixer, so implementing the
|
|
168
|
+
* sprite action would have broken an unrelated one. `recall` already
|
|
169
|
+
* means "bring my thing home to me" for drones and agents, and
|
|
170
|
+
* canon's action is bidirectional, so the word already fits both
|
|
171
|
+
* halves. The name and action type are IMPORTED from the p.250 table
|
|
172
|
+
* rather than restated here -- two copies that agree today drift on
|
|
173
|
+
* the first edit.
|
|
174
|
+
*
|
|
175
|
+
* THE DIRECTIONS ARE NOT SYMMETRICAL, on purpose. Calling is free and
|
|
176
|
+
* reversible. Dismissing "releas[es] it from any tasks it still owes
|
|
177
|
+
* you" (p.250), which is why p.256 sells STANDBY for 1 task as the
|
|
178
|
+
* cheaper way to park one. So a bare "recall" only ever CALLS, and
|
|
179
|
+
* sending a sprite away has to be asked for by name -- the same rule
|
|
180
|
+
* decompile follows, for the same reason.
|
|
181
|
+
*
|
|
182
|
+
* Returns undefined when the words are not about sprites at all, so
|
|
183
|
+
* the caller's own "nothing of yours is in the air" still stands for
|
|
184
|
+
* a player who really has nothing.
|
|
185
|
+
*/
|
|
186
|
+
recallSprite(args) {
|
|
187
|
+
const game = this.game;
|
|
188
|
+
if (!game)
|
|
189
|
+
return undefined;
|
|
190
|
+
const waiting = game.registeredSpritesWaiting();
|
|
191
|
+
const standing = game.companions.filter(c => c.kind === 'sprite' && c.registered);
|
|
192
|
+
if (waiting.length === 0 && standing.length === 0)
|
|
193
|
+
return undefined;
|
|
194
|
+
const query = (args ?? []).map(w => w.toLowerCase()).filter(w => !/^(a|an|the|sprite)$/.test(w)).join(' ').trim();
|
|
195
|
+
if (query.length > 0) {
|
|
196
|
+
const named = fuzzyPickName(query, waiting.map(s => s.name));
|
|
197
|
+
if (named) {
|
|
198
|
+
const line = game.callSpriteFromResonance(named);
|
|
199
|
+
this.scene.updateStatus();
|
|
200
|
+
return line ?? `${named} answers, but there is no room on the grid for its icon.`;
|
|
201
|
+
}
|
|
202
|
+
// Naming one that is already here is the DISMISS direction.
|
|
203
|
+
const here = fuzzyPickName(query, standing.map(c => c.npc.name));
|
|
204
|
+
if (here) {
|
|
205
|
+
const target = standing.find(c => c.npc.name === here);
|
|
206
|
+
const owed = target.services ?? 0;
|
|
207
|
+
if (!game.dismissSpriteToResonance(target))
|
|
208
|
+
return undefined;
|
|
209
|
+
this.scene.updateStatus();
|
|
210
|
+
// The warning now names its cure. It was written when there was
|
|
211
|
+
// no cheaper door; STANDBY (p.256) is that door, and a warning
|
|
212
|
+
// about a cost the player cannot avoid is worth less than one
|
|
213
|
+
// that tells them how.
|
|
214
|
+
return `${here} folds back into the Resonance and waits there, registered and yours.${owed > 0 ? ` It owed you ${owed} task${owed === 1 ? '' : 's'}; dismissing releases every one of them.${hint(` ("standby" spends ONE and keeps the rest.)`)}` : ''}${hint(` ("recall ${here}" calls it back.)`)}`;
|
|
215
|
+
}
|
|
216
|
+
return `Nothing of yours answers to "${query}".${waiting.length > 0 ? ` Waiting in the Resonance: ${waiting.map(s => `"${s.name}"`).join(', ')}.` : ''}${standing.length > 0 ? ` Already with you: ${standing.map(c => `"${c.npc.name}"`).join(', ')}.` : ''}`;
|
|
217
|
+
}
|
|
218
|
+
// Bare "recall": the safe direction only.
|
|
219
|
+
if (waiting.length > 0) {
|
|
220
|
+
const line = game.callSpriteFromResonance();
|
|
221
|
+
this.scene.updateStatus();
|
|
222
|
+
if (line) {
|
|
223
|
+
return waiting.length > 1
|
|
224
|
+
? `${line}${hint(` (${waiting.length - 1} more waiting -- "recall <name>" for a particular one.)`)}`
|
|
225
|
+
: line;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Standing, and nothing waiting: say so, and name the route rather
|
|
229
|
+
// than doing the destructive half unasked.
|
|
230
|
+
return `${standing.length === 1 ? `${standing[0].npc.name} is` : `Your sprites are`} already here with you, not in the Resonance.${hint(` ("standby" parks it for ONE task and keeps the rest; "recall ${standing[0].npc.name}" sends it back for free but releases every task it owes.)`)}`;
|
|
231
|
+
}
|
|
147
232
|
}
|
|
148
233
|
//# sourceMappingURL=companions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companions.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/companions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"companions.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/companions.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,22 @@ import { Command, ICommand } from './command.js';
|
|
|
6
6
|
* become TASKS (services); the sprite manifests as a Matrix companion
|
|
7
7
|
* shell: it rides your persona, fights ice at your side when you jack
|
|
8
8
|
* in (one task per fight, same leash as spirits), obeys "order", and
|
|
9
|
-
* decompiles when the tasks are spent, when
|
|
10
|
-
* or when you travel. FADING is the toll: 2 x the
|
|
11
|
-
* 2), resisted with Resonance + Willpower --
|
|
12
|
-
* exceeds your Resonance, the same overreach
|
|
13
|
-
* past twice your Resonance is refused
|
|
9
|
+
* decompiles when the tasks are spent, when you unmake it
|
|
10
|
+
* ("decompile"), or when you travel. FADING is the toll: 2 x the
|
|
11
|
+
* sprite's hits (min 2), resisted with Resonance + Willpower --
|
|
12
|
+
* PHYSICAL when the Level exceeds your Resonance, the same overreach
|
|
13
|
+
* law as overcasting. Level past twice your Resonance is refused
|
|
14
|
+
* outright.
|
|
15
|
+
*
|
|
16
|
+
* COMPILE DOES NOT RELEASE (items xxc3SGZJmjAPaZPhb and
|
|
17
|
+
* Av93mThv54YRH26gj, 2026-08-28). This verb used to double as the
|
|
18
|
+
* release: any second "compile" decompiled whatever was standing. That
|
|
19
|
+
* is not a rule the books have. p.250 lists Compile Sprite (Complex),
|
|
20
|
+
* Decompile Sprite (Complex) and Call/Dismiss Sprite (Simple) as three
|
|
21
|
+
* separate actions, and p.256 says outright "You can decompile your own
|
|
22
|
+
* sprites if you need to, but usually just dismissing them is enough."
|
|
23
|
+
* Compiling is now a summons and nothing else; the slot check below
|
|
24
|
+
* REFUSES and names the two verbs that actually let go.
|
|
14
25
|
*
|
|
15
26
|
* The companion symmetry this completes: mage -> spirit, decker ->
|
|
16
27
|
* agent, rigger -> drone, technomancer -> SPRITE. Unlike an agent, a
|
|
@@ -26,20 +37,29 @@ export interface ISpriteType {
|
|
|
26
37
|
/** Exported for game.ts: re-shelling a REGISTERED sprite after travel
|
|
27
38
|
* or a resumed save needs the same stat builder. */
|
|
28
39
|
export declare const SPRITE_TYPES: Record<string, ISpriteType>;
|
|
40
|
+
/**
|
|
41
|
+
* A free shell name for a sprite of this type and Level.
|
|
42
|
+
*
|
|
43
|
+
* spawnCompanionShell REFUSES a name already in the scene and returns
|
|
44
|
+
* null, which the caller can only report as "it collides with a process
|
|
45
|
+
* name already taken" -- a compile that cost real Fading and produced
|
|
46
|
+
* nothing. That was unreachable while one sprite was the hard maximum.
|
|
47
|
+
* It stopped being unreachable the moment a REGISTERED sprite was
|
|
48
|
+
* allowed to stand alongside a newly compiled one (SR5 p.254-256):
|
|
49
|
+
* register a Courier at Level 4, compile another Courier at Level 4,
|
|
50
|
+
* and both want the same name.
|
|
51
|
+
*
|
|
52
|
+
* Typed against the shape it uses rather than Scene, so this stays
|
|
53
|
+
* importable from game.ts (which imports this module) without a cycle.
|
|
54
|
+
*
|
|
55
|
+
* The unsuffixed name is preserved when it is free, so the overwhelming
|
|
56
|
+
* common case reads exactly as it always has.
|
|
57
|
+
*/
|
|
58
|
+
export declare function uniqueSpriteName(scene: {
|
|
59
|
+
getActor(name: string): unknown;
|
|
60
|
+
}, typeName: string, level: number): string;
|
|
29
61
|
export declare class CompileCommand extends Command implements ICommand {
|
|
30
62
|
protected static verb: string;
|
|
31
63
|
protected static description: string;
|
|
32
64
|
execute(args?: string[]): Promise<string>;
|
|
33
|
-
/**
|
|
34
|
-
* "decompile <name>": unmake a HOSTILE matrix construct -- ice, an
|
|
35
|
-
* enemy agent -- by tearing its thread apart (the offensive mirror of
|
|
36
|
-
* releasing your own sprite). Opposed Resonance + compiling vs the
|
|
37
|
-
* construct's code integrity (Willpower + Logic/2); net hits plus
|
|
38
|
-
* Resonance/2 land straight on its monitor, no soak -- the opposed
|
|
39
|
-
* test WAS the resistance. Fading bills the same toll as compiling
|
|
40
|
-
* (2x its hits, min 2). A failed pull leaves it standing, alert, and
|
|
41
|
-
* pointed at you. Returns undefined when the words name no hostile
|
|
42
|
-
* construct here (the summons flow's turn).
|
|
43
|
-
*/
|
|
44
|
-
private tryDecompileEnemy;
|
|
45
65
|
}
|