@maka/maka-cli 5.84.0 → 5.86.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.d.ts +0 -28
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +1 -41
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +47 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/job-offer.js +16 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/job-offer.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +31 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/map.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/mark.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +11 -8
- package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/tap.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/tap.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js +20 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/game.js +28 -4
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +11 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +86 -16
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/room.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +86 -10
- package/bundle/typescript/src/commands/game/sideQuest/types/repro.d.ts +15 -6
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/item-seed.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/bystander.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/bystander.js +123 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/bystander.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ddp-lite.d.ts +53 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ddp-lite.js +43 -3
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ddp-lite.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ephemeral.d.ts +116 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ephemeral.js +96 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ephemeral.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/first-aid.js +7 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/first-aid.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js +59 -4
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/meet-location.d.ts +37 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/meet-location.js +51 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/meet-location.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/perception.d.ts +76 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/perception.js +84 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/perception.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.d.ts +2 -2
- package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.d.ts +86 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js +137 -21
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/sin.d.ts +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/sin.js +55 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/sin.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/street-gang.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/street-gang.js +139 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/street-gang.js.map +1 -0
- package/bundle/typescript/src/commands/testCmd/mocha.sub.cmd.js +46 -44
- package/bundle/typescript/src/commands/testCmd/mocha.sub.cmd.js.map +1 -1
- package/bundle/typescript/src/commands/update.js +6 -20
- package/bundle/typescript/src/commands/update.js.map +1 -1
- package/bundle/typescript/src/tools/self-update/binary-install.d.ts +113 -0
- package/bundle/typescript/src/tools/self-update/binary-install.js +178 -0
- package/bundle/typescript/src/tools/self-update/binary-install.js.map +1 -0
- package/bundle/typescript/src/tools/self-update/update-maka.d.ts +3 -1
- package/bundle/typescript/src/tools/self-update/update-maka.js +219 -3
- package/bundle/typescript/src/tools/self-update/update-maka.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { NPC } from '../models/npc.js';
|
|
2
|
+
import { Room } from '../models/room.js';
|
|
3
|
+
import type { Scene } from '../models/scene.js';
|
|
4
|
+
/**
|
|
5
|
+
* THE EPHEMERAL NPC GOVERNOR (7ALf6u7PvTg6TZSm7, Maka: "an ephemeral NPC
|
|
6
|
+
* AI governer. This would handle non-scene generated NPCs, like
|
|
7
|
+
* authority checking SINs, hostile mobs, neutral npcs that don't impact
|
|
8
|
+
* the storyline/job").
|
|
9
|
+
*
|
|
10
|
+
* THE SPINE OF THE DESIGN: an ephemeral VOICES a result the engine has
|
|
11
|
+
* already computed. It never decides anything. The SIN sweep's officer
|
|
12
|
+
* is a mouth for mechanics that already work -- wandRead returns the
|
|
13
|
+
* band, addHeat bills it, the fake burns -- so the worst a bad brief can
|
|
14
|
+
* do is produce bad dialogue, never a wrong ruling. Every later kind
|
|
15
|
+
* (mobs, bystanders) rides these same rails, and the rails are the
|
|
16
|
+
* reason this is safe to grow.
|
|
17
|
+
*
|
|
18
|
+
* THE EPHEMERAL / CHARACTER BOUNDARY, stated as law:
|
|
19
|
+
* - an ephemeral is NOT IN THE PLOT -- no run, client, objective or
|
|
20
|
+
* payout reaches its brief;
|
|
21
|
+
* - an ephemeral CANNOT CREATE OBLIGATIONS -- no prices, no jobs, no
|
|
22
|
+
* items, no promises the world would have to honor later.
|
|
23
|
+
* A patrolman who starts discussing your Johnson has become a
|
|
24
|
+
* character, and characters have to persist. These two denials are what
|
|
25
|
+
* keep an ephemeral disposable; without them the first interesting
|
|
26
|
+
* conversation mints a debt the save file cannot pay.
|
|
27
|
+
*
|
|
28
|
+
* ONE GOVERNOR. Spawning, despawning and the brief trim all live here,
|
|
29
|
+
* and nothing else in the engine mints an ephemeral. A second spawn
|
|
30
|
+
* site is how a "temporary" NPC ends up outliving the scene.
|
|
31
|
+
*
|
|
32
|
+
* NO SAVE PERSISTENCE -- ephemeral means ephemeral (ruling). The
|
|
33
|
+
* mid-fight-save worry is already answered by the engine rather than by
|
|
34
|
+
* anything here: requestSave's guards only write at safe beats, and a
|
|
35
|
+
* mob fight is not one, so a load can neither resurrect a dead officer
|
|
36
|
+
* nor vanish one mid-swing. See despawn() below, which is where that
|
|
37
|
+
* reasoning has to be true.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* How long this body is allowed to exist. ALWAYS EXPLICIT -- an implicit
|
|
41
|
+
* lifetime is how the "temporary" patrolman is still standing there
|
|
42
|
+
* three rooms later.
|
|
43
|
+
*
|
|
44
|
+
* 'exchange' -- for as long as the player is talking to them. A
|
|
45
|
+
* mid-exchange walkout ends the exchange; the officer
|
|
46
|
+
* does not follow through the save file.
|
|
47
|
+
* 'room' -- while the player is in this room.
|
|
48
|
+
* 'fight' -- while the fight lasts. Mob despawn is FIGHT-scoped, not
|
|
49
|
+
* room-scoped, on purpose: walking out of the room is a
|
|
50
|
+
* thing you do DURING a fight, and a mob that evaporated
|
|
51
|
+
* because you backed through a doorway would be a
|
|
52
|
+
* retreat that wins by itself.
|
|
53
|
+
*/
|
|
54
|
+
export type EphemeralScope = 'exchange' | 'room' | 'fight';
|
|
55
|
+
export type EphemeralKind = 'authority' | 'mob' | 'bystander';
|
|
56
|
+
export interface IEphemeralMark {
|
|
57
|
+
kind: EphemeralKind;
|
|
58
|
+
until: EphemeralScope;
|
|
59
|
+
/** The room they were spawned into -- what 'room' scope is measured against. */
|
|
60
|
+
roomName: string;
|
|
61
|
+
}
|
|
62
|
+
/** Every ephemeral currently standing, by NPC name. */
|
|
63
|
+
export type EphemeralRegistry = Map<string, IEphemeralMark>;
|
|
64
|
+
/** What the governor needs of the Game, kept narrow so this is testable. */
|
|
65
|
+
export interface IEphemeralHost {
|
|
66
|
+
scene: Scene;
|
|
67
|
+
ephemerals: EphemeralRegistry;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Bring one into the world. Returns the NPC, or null when the name is
|
|
71
|
+
* already taken -- the same refusal spawnCompanionShell makes, and for
|
|
72
|
+
* the same reason: two actors answering to one name is a bug nobody can
|
|
73
|
+
* see until a command picks the wrong one.
|
|
74
|
+
*/
|
|
75
|
+
export declare function spawnEphemeral(host: IEphemeralHost, opts: {
|
|
76
|
+
name: string;
|
|
77
|
+
description: string;
|
|
78
|
+
kind: EphemeralKind;
|
|
79
|
+
until: EphemeralScope;
|
|
80
|
+
room: Room;
|
|
81
|
+
combat: Partial<import('../models/player.js').ICombatAttributes>;
|
|
82
|
+
}): NPC | null;
|
|
83
|
+
/**
|
|
84
|
+
* Remove every ephemeral whose scope has ended.
|
|
85
|
+
*
|
|
86
|
+
* WHY NO SAVE HOOK IS NEEDED HERE, which is the ruling's reasoning and
|
|
87
|
+
* has to be true at exactly this line: ephemerals are never written to
|
|
88
|
+
* the save file, so there is nothing to reconcile on load. The obvious
|
|
89
|
+
* worry -- a save landing mid-fight, resurrecting a dead mob or erasing
|
|
90
|
+
* a live one -- is already answered upstream: requestSave's guards only
|
|
91
|
+
* write at safe beats and a fight is not one. So a load never sees a
|
|
92
|
+
* half-finished ephemeral, and this function is the only thing that
|
|
93
|
+
* ever ends one.
|
|
94
|
+
*
|
|
95
|
+
* Returns the names removed, so a caller can say so once.
|
|
96
|
+
*/
|
|
97
|
+
export declare function despawnEphemerals(host: IEphemeralHost, opts: {
|
|
98
|
+
/** Where the player is NOW -- 'room'/'exchange' scopes end elsewhere. */
|
|
99
|
+
playerRoomName?: string;
|
|
100
|
+
/** True while a fight is running; 'fight'-scoped bodies stay up. */
|
|
101
|
+
fightActive?: boolean;
|
|
102
|
+
/** Ends everything regardless of scope (scene teardown). */
|
|
103
|
+
all?: boolean;
|
|
104
|
+
}): string[];
|
|
105
|
+
/**
|
|
106
|
+
* The two denials that make an ephemeral disposable, as prompt text.
|
|
107
|
+
*
|
|
108
|
+
* FULL LENGTH, DELIBERATELY. Everything else in an ephemeral's brief is
|
|
109
|
+
* trimmed hard -- no command help, no objective, no payout, no client,
|
|
110
|
+
* no wares, no history -- but the honesty pins are not where the budget
|
|
111
|
+
* gets saved. They are the majority of what remains precisely because
|
|
112
|
+
* the rest went, and trimming a denial is the exact economy that
|
|
113
|
+
* reintroduces the bug the denial exists to prevent. A shorter pin does
|
|
114
|
+
* not produce a shorter answer; it produces a confident wrong one.
|
|
115
|
+
*/
|
|
116
|
+
export declare function ephemeralDenials(role: string): string;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { NPC } from '../models/npc.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { CommandRegistry } from '../commands/command-registry.js';
|
|
4
|
+
/**
|
|
5
|
+
* Bring one into the world. Returns the NPC, or null when the name is
|
|
6
|
+
* already taken -- the same refusal spawnCompanionShell makes, and for
|
|
7
|
+
* the same reason: two actors answering to one name is a bug nobody can
|
|
8
|
+
* see until a command picks the wrong one.
|
|
9
|
+
*/
|
|
10
|
+
export function spawnEphemeral(host, opts) {
|
|
11
|
+
if (host.scene.getActor(opts.name)) {
|
|
12
|
+
Logger.getInstance().write(`spawnEphemeral: name "${opts.name}" already in scene -- refusing.`);
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const npc = new NPC({
|
|
16
|
+
dialog: [],
|
|
17
|
+
description: opts.description,
|
|
18
|
+
playerConstructorConfig: { playerName: opts.name, startLocation: opts.room, combat: opts.combat },
|
|
19
|
+
}, new CommandRegistry(host.scene));
|
|
20
|
+
npc.plane = 'meat';
|
|
21
|
+
// NOT allyOf, and NOT companionKind: an ephemeral belongs to nobody
|
|
22
|
+
// and is on no roster. Those two fields are what make a companion
|
|
23
|
+
// persist, follow, and take orders.
|
|
24
|
+
npc.ephemeral = { kind: opts.kind, until: opts.until, roomName: opts.room.name };
|
|
25
|
+
host.scene.addActor(npc);
|
|
26
|
+
host.scene.setCharacterLocation(npc, opts.room.name);
|
|
27
|
+
npc.scene = host.scene;
|
|
28
|
+
host.ephemerals.set(opts.name, npc.ephemeral);
|
|
29
|
+
Logger.getInstance().write(`Ephemeral spawned: ${opts.name} (${opts.kind}, until ${opts.until}) in ${opts.room.name}.`);
|
|
30
|
+
return npc;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Remove every ephemeral whose scope has ended.
|
|
34
|
+
*
|
|
35
|
+
* WHY NO SAVE HOOK IS NEEDED HERE, which is the ruling's reasoning and
|
|
36
|
+
* has to be true at exactly this line: ephemerals are never written to
|
|
37
|
+
* the save file, so there is nothing to reconcile on load. The obvious
|
|
38
|
+
* worry -- a save landing mid-fight, resurrecting a dead mob or erasing
|
|
39
|
+
* a live one -- is already answered upstream: requestSave's guards only
|
|
40
|
+
* write at safe beats and a fight is not one. So a load never sees a
|
|
41
|
+
* half-finished ephemeral, and this function is the only thing that
|
|
42
|
+
* ever ends one.
|
|
43
|
+
*
|
|
44
|
+
* Returns the names removed, so a caller can say so once.
|
|
45
|
+
*/
|
|
46
|
+
export function despawnEphemerals(host, opts) {
|
|
47
|
+
const removed = [];
|
|
48
|
+
for (const [name, mark] of [...host.ephemerals]) {
|
|
49
|
+
const ended = opts.all
|
|
50
|
+
? true
|
|
51
|
+
: mark.until === 'fight'
|
|
52
|
+
? opts.fightActive === false
|
|
53
|
+
// exchange- and room-scoped bodies both end when the player
|
|
54
|
+
// leaves: a walkout IS the end of the conversation.
|
|
55
|
+
: opts.playerRoomName !== undefined && opts.playerRoomName !== mark.roomName;
|
|
56
|
+
if (!ended)
|
|
57
|
+
continue;
|
|
58
|
+
if (host.scene.getActor(name) instanceof NPC)
|
|
59
|
+
host.scene.removeActor(name);
|
|
60
|
+
host.ephemerals.delete(name);
|
|
61
|
+
removed.push(name);
|
|
62
|
+
}
|
|
63
|
+
if (removed.length > 0) {
|
|
64
|
+
Logger.getInstance().write(`Ephemerals despawned: ${removed.join(', ')}.`);
|
|
65
|
+
}
|
|
66
|
+
return removed;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The two denials that make an ephemeral disposable, as prompt text.
|
|
70
|
+
*
|
|
71
|
+
* FULL LENGTH, DELIBERATELY. Everything else in an ephemeral's brief is
|
|
72
|
+
* trimmed hard -- no command help, no objective, no payout, no client,
|
|
73
|
+
* no wares, no history -- but the honesty pins are not where the budget
|
|
74
|
+
* gets saved. They are the majority of what remains precisely because
|
|
75
|
+
* the rest went, and trimming a denial is the exact economy that
|
|
76
|
+
* reintroduces the bug the denial exists to prevent. A shorter pin does
|
|
77
|
+
* not produce a shorter answer; it produces a confident wrong one.
|
|
78
|
+
*/
|
|
79
|
+
export function ephemeralDenials(role) {
|
|
80
|
+
return `
|
|
81
|
+
YOU ARE A PASSING FACE, NOT A CHARACTER IN ANYONE'S STORY. You are ${role} -- here for
|
|
82
|
+
this moment and no longer. You know nothing about any job, run, client, employer,
|
|
83
|
+
objective, payout, or what these people are doing in this district beyond what is
|
|
84
|
+
happening in front of you right now. You have no opinion about their business because you
|
|
85
|
+
do not know they have any. If someone raises a job, a Johnson, a target, or a score, you
|
|
86
|
+
have no idea what they are talking about and no curiosity about it -- that is somebody
|
|
87
|
+
else's world and you are not in it.
|
|
88
|
+
|
|
89
|
+
YOU CANNOT PROMISE, SELL, HIRE, OR HAND OVER ANYTHING. You quote no prices, offer no work,
|
|
90
|
+
carry no goods to trade, and make no arrangements for later -- no favors owed, no "come
|
|
91
|
+
find me", no meeting tomorrow. You will not be here tomorrow. Anything you agreed to would
|
|
92
|
+
be an obligation nobody in the world can honor, and the person who trusted it would be
|
|
93
|
+
worse off for having met you. If pressed for any of it, say plainly that it is not yours
|
|
94
|
+
to give and point them at whoever actually handles such things.`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=ephemeral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ephemeral.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/ephemeral.ts"],"names":[],"mappings":"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"}
|
|
@@ -133,6 +133,12 @@ export function firstAidRefusal(medic, patient, kit, track) {
|
|
|
133
133
|
const self = medic === patient;
|
|
134
134
|
const who = self ? 'You' : patient.name;
|
|
135
135
|
const is = self ? 'are' : 'is';
|
|
136
|
+
// "already been worked on" is a PERFECT, and takes have/has -- not the
|
|
137
|
+
// `is` the other three refusals want. Shipped in 5.85.0 as "You are
|
|
138
|
+
// already been worked on", caught by running the RELEASED client
|
|
139
|
+
// against this item's own repro before carding it as fixed. One
|
|
140
|
+
// clause, one auxiliary: English does not let one variable serve both.
|
|
141
|
+
const has = self ? 'have' : 'has';
|
|
136
142
|
// p.205: "First Aid can only be used if you have a medkit (even if you
|
|
137
143
|
// do not currently have supplies for it)."
|
|
138
144
|
if (!kit) {
|
|
@@ -154,7 +160,7 @@ export function firstAidRefusal(medic, patient, kit, track) {
|
|
|
154
160
|
// application covers the patient, whichever track it treated. Canon is
|
|
155
161
|
// silent on split tracks, and this is the conservative reading.
|
|
156
162
|
if (patient.firstAidGiven) {
|
|
157
|
-
return `${who} ${
|
|
163
|
+
return `${who} ${has} already been worked on for these wounds -- there's nothing left first aid can do until ${self ? 'you take' : 'they take'} fresh damage. Rest, a clinic, or a heal spell from here.`;
|
|
158
164
|
}
|
|
159
165
|
// p.205: "First Aid may not be applied if the character has been
|
|
160
166
|
// magically healed."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"first-aid.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/first-aid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAa,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAmBrC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAU;IACrC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,GAAU;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,GAAU;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,GAAG,MAAM;QAChC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC;IAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI;UACnB,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC;UAC7B,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;UACzB,KAAK,CAAC,aAAa,CAAC,CAAC;AAC3B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAU;IACrD,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,SAAoF,CAAC;IACxG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAa,EAAE,OAAe,EAAE,GAAqB,EAAE,KAAiB;IAExE,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"first-aid.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/first-aid.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { Scene } from '../models/scene.js';
|
|
|
10
10
|
* broadcasting, it isn't here. Shared by look.ts (gridLook) and go.ts
|
|
11
11
|
* (grid-jump arrivals). Glyphs match the grid map: ● host, ◆ persona,
|
|
12
12
|
* ▣ PAN, ▲ dangerous device, ◇ data. (There is no air-gapped-host glyph
|
|
13
|
-
* any more -- see
|
|
13
|
+
* any more -- see hhSWzLSXECFtfoAGa and canReachHost.)
|
|
14
14
|
*/
|
|
15
15
|
export declare function gridIcons(scene: Scene, actor: Player, room: Room): string[];
|
|
16
16
|
/**
|
|
@@ -10,11 +10,11 @@ import { isWatched, camerasLive, canSnoopFeeds } from './surveillance.js';
|
|
|
10
10
|
* broadcasting, it isn't here. Shared by look.ts (gridLook) and go.ts
|
|
11
11
|
* (grid-jump arrivals). Glyphs match the grid map: ● host, ◆ persona,
|
|
12
12
|
* ▣ PAN, ▲ dangerous device, ◇ data. (There is no air-gapped-host glyph
|
|
13
|
-
* any more -- see
|
|
13
|
+
* any more -- see hhSWzLSXECFtfoAGa and canReachHost.)
|
|
14
14
|
*/
|
|
15
15
|
export function gridIcons(scene, actor, room) {
|
|
16
16
|
// INSIDE A HOST IS A DIFFERENT PLACE (SR5 p.246, and Deditri's
|
|
17
|
-
//
|
|
17
|
+
// eJANPpm7qCaCAJBJw). "The virtual space inside a host is separate
|
|
18
18
|
// from the outside grid. When you're outside of a host, you can't
|
|
19
19
|
// interact directly with icons inside it... Once you're inside, you
|
|
20
20
|
// can see and interact with icons inside the host, but not outside."
|
|
@@ -58,6 +58,28 @@ export function gridIcons(scene, actor, room) {
|
|
|
58
58
|
icons.push(`● ${hostLabel(room, { capital: true })}${hr} -- sculpted ice geometry, sealed. Whatever it holds is inside it.${room.hostAlert ? ' Walls UP -- it holds a mark on an intruder.' : ''}${myMarks > 0 ? ` [your marks: ${myMarks}/3]` : ''} (${myMarks > 0 ? '"enter" walks in on your mark; ' : ''}"hack" slips in on sleaze; "hack loud" smashes; "mark" softens it first)`);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
+
// WHERE THE HOST'S OWN ICON ENDS AND THE STREET BEGINS.
|
|
62
|
+
//
|
|
63
|
+
// Everything from here down is on the OPEN GRID, standing near the
|
|
64
|
+
// host and not inside it -- and that distinction is the whole of
|
|
65
|
+
// eJANPpm7qCaCAJBJw. The reporter saw Ratchet's PAN and the camera
|
|
66
|
+
// cluster listed directly under a line about the host's sealed
|
|
67
|
+
// architecture and concluded, reasonably, that the host was leaking
|
|
68
|
+
// icons it should be hiding.
|
|
69
|
+
//
|
|
70
|
+
// CANON SIDES WITH THE ENGINE, checked rather than assumed: device
|
|
71
|
+
// icons sit on the grid landscape positioned by physical proximity
|
|
72
|
+
// (p.214, p.217-218), a persona automatically spots non-silent devices
|
|
73
|
+
// within 100m of their meat body (p.235), and "a host, even one
|
|
74
|
+
// tethered to a physical location, is still an icon separate from the
|
|
75
|
+
// devices" -- they are outside its icon on the grid. Ratchet's PAN is
|
|
76
|
+
// exactly where it belongs.
|
|
77
|
+
//
|
|
78
|
+
// BEING RIGHT IS NOT BEING LEGIBLE, which is the lesson rG8L already
|
|
79
|
+
// charged this project once. The list said nothing about which side of
|
|
80
|
+
// the wall each icon was on, so the reader supplied the wrong answer.
|
|
81
|
+
// A divider goes in below, and the report is what earned it.
|
|
82
|
+
const afterHost = icons.length;
|
|
61
83
|
for (const a of scene.getActorsInRoom(room)) {
|
|
62
84
|
if (a === actor)
|
|
63
85
|
continue;
|
|
@@ -138,7 +160,7 @@ export function gridIcons(scene, actor, room) {
|
|
|
138
160
|
}
|
|
139
161
|
}
|
|
140
162
|
}
|
|
141
|
-
// A HOST'S FILES ARE NOT ON THE STREET'S GRID (p.246;
|
|
163
|
+
// A HOST'S FILES ARE NOT ON THE STREET'S GRID (p.246; eJANPpm7qCaCAJBJw).
|
|
142
164
|
// This loop used to list every matrix-plane item in the room as "right
|
|
143
165
|
// there on the grid" -- the host's sealed paydata, advertised by name
|
|
144
166
|
// to anyone who jacked in nearby and readable by a `take` that only
|
|
@@ -172,6 +194,18 @@ export function gridIcons(scene, actor, room) {
|
|
|
172
194
|
icons.push(`◎ Camera cluster -- live, feeding the site's host. Loud acts here travel. (own the host to loop them -- or walk in and "tap" a lens in the flesh: slaved to the host means a key to the host)`);
|
|
173
195
|
}
|
|
174
196
|
}
|
|
197
|
+
// THE DIVIDER (eJANPpm7qCaCAJBJw). Only when there is a host to be
|
|
198
|
+
// confused about AND something standing next to it: on thin grid there
|
|
199
|
+
// is no wall for a reader to put an icon on the wrong side of, and a
|
|
200
|
+
// heading over an empty list is noise.
|
|
201
|
+
//
|
|
202
|
+
// It says NEAR, not IN, and it says why they are visible -- proximity
|
|
203
|
+
// to your body, not a leak in the host (p.235). A reader who wondered
|
|
204
|
+
// whether the host was showing them its insides now has the answer in
|
|
205
|
+
// the list itself instead of having to file a report to get it.
|
|
206
|
+
if (room.hasNode && icons.length > afterHost) {
|
|
207
|
+
icons.splice(afterHost, 0, `-- and NEAR it, out on the open grid (not inside the host): --`);
|
|
208
|
+
}
|
|
175
209
|
return icons;
|
|
176
210
|
}
|
|
177
211
|
/**
|
|
@@ -227,6 +261,27 @@ function hostInteriorIcons(scene, actor, room) {
|
|
|
227
261
|
? `◇ ${item.name} [data] -- unsealed, sitting open in the host's archive. ("take" it)`
|
|
228
262
|
: `◇ ${item.name} [data] -- SEALED in the host's archive. ("hack" the host to break the seal)`);
|
|
229
263
|
}
|
|
264
|
+
// THE ICE IS IN THE ROOM WITH YOU, AND THE ROOM USED TO DENY IT.
|
|
265
|
+
//
|
|
266
|
+
// A regression this file shipped: hostInteriorIcons listed personas
|
|
267
|
+
// and files and never read room.runningIC, so a persona standing in an
|
|
268
|
+
// alerted host with Patrol, Probe, Killer, Sparky and Blaster all
|
|
269
|
+
// hitting them read "Empty architecture -- nothing in it worth the
|
|
270
|
+
// trip". Five programs were taking chunks out of the condition track
|
|
271
|
+
// that the room said were not there.
|
|
272
|
+
//
|
|
273
|
+
// That is the rG8L defect exactly: a player cannot act on what the
|
|
274
|
+
// game will not name, and a room that contradicts the damage log reads
|
|
275
|
+
// as broken rules rather than thin prose.
|
|
276
|
+
//
|
|
277
|
+
// NO VERB IS OFFERED, deliberately, because none exists yet: IC live
|
|
278
|
+
// in room.runningIC as names, not as actors, so nothing in this engine
|
|
279
|
+
// can target them -- `thread Resonance Spike` says "no hostile icon in
|
|
280
|
+
// reach" while they attack. Naming them here does not pretend
|
|
281
|
+
// otherwise; advertising a verb that refuses would be the worse lie.
|
|
282
|
+
for (const name of room.runningIC) {
|
|
283
|
+
icons.push(`▲ ${name} -- hunting, and it has your icon.`);
|
|
284
|
+
}
|
|
230
285
|
if (icons.length === 0) {
|
|
231
286
|
icons.push(`Empty architecture -- turning geometry and nothing in it worth the trip.`);
|
|
232
287
|
}
|
|
@@ -265,7 +320,7 @@ export function gridSculpt(actor, room) {
|
|
|
265
320
|
if (!room.hasNode)
|
|
266
321
|
return header;
|
|
267
322
|
// NO MORE "DEAD GROUND". The air-gapped-host branch that used to live
|
|
268
|
-
// here is gone with the model it described (
|
|
323
|
+
// here is gone with the model it described (hhSWzLSXECFtfoAGa): a host
|
|
269
324
|
// is part of the Matrix by definition, so there is no such thing as
|
|
270
325
|
// one you cannot reach from the grid. What is genuinely offline is a
|
|
271
326
|
// SERVER DEVICE sitting in the room, and that is a device, not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid-view.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/grid-view.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grid-view.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/grid-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ISceneSeedJson } from '../types/seed/scene-seed.js';
|
|
2
|
+
/**
|
|
3
|
+
* WHERE THE MEET ACTUALLY IS, read off the drafted seed.
|
|
4
|
+
*
|
|
5
|
+
* Item g5CgJgmw9ix6AcD78: "Krow said to meet at Mama Wu's, that
|
|
6
|
+
* shouldn't happen." There is no Mama Wu's. The fixer's pitch is
|
|
7
|
+
* AI-generated free text, and the brief told him the client "will hold
|
|
8
|
+
* the meet on-site" without telling him WHERE -- so a model writing a
|
|
9
|
+
* fixer's voice did the natural thing and invented a venue. The player
|
|
10
|
+
* then travelled to a scene that contains no such place.
|
|
11
|
+
*
|
|
12
|
+
* This is the codebase's signature defect: a NAME REFERRING TO NOTHING.
|
|
13
|
+
* The house cure is to resolve names against the real roster or room
|
|
14
|
+
* list and repair or reject, never to ship an unresolved one (see
|
|
15
|
+
* scene-chunks.ts resolveNamedRef). The same cure applies here, and it
|
|
16
|
+
* is better than a prohibition: the seed already KNOWS the answer, so
|
|
17
|
+
* the fixer can be told the truth rather than merely forbidden a lie.
|
|
18
|
+
* A brief that only says "don't invent one" leaves him with nothing to
|
|
19
|
+
* say and invites a vaguer dodge.
|
|
20
|
+
*
|
|
21
|
+
* THE MEET IS WHERE THE CLIENT STANDS, not the start room -- generation
|
|
22
|
+
* places the client "in a REACHABLE room that makes a characterful meet
|
|
23
|
+
* spot" (scene-chunks.ts), which is frequently not where the runner
|
|
24
|
+
* arrives. Falling back to the start room is still TRUE (it is where
|
|
25
|
+
* they land, and the client is always reachable from it), so the
|
|
26
|
+
* fallback degrades to vaguer rather than to wrong.
|
|
27
|
+
*
|
|
28
|
+
* IT LIVES HERE, not in call.ts, because ONE ANSWER IS THE WHOLE POINT.
|
|
29
|
+
* The reported bug is two sources disagreeing about where the meet is
|
|
30
|
+
* (the vetting on the item: "Krow directing the player to Mama Wu's,
|
|
31
|
+
* then a conflicting message from Mr. Vane at a different location"), so
|
|
32
|
+
* a resolver that only one of the speakers consults cannot fix it. Every
|
|
33
|
+
* surface that tells the player or an NPC where the meet is reads this
|
|
34
|
+
* function; if you are about to write the words "the meet" and a place
|
|
35
|
+
* name, call this instead.
|
|
36
|
+
*/
|
|
37
|
+
export declare function meetLocationFor(seed: ISceneSeedJson | undefined): string | undefined;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHERE THE MEET ACTUALLY IS, read off the drafted seed.
|
|
3
|
+
*
|
|
4
|
+
* Item g5CgJgmw9ix6AcD78: "Krow said to meet at Mama Wu's, that
|
|
5
|
+
* shouldn't happen." There is no Mama Wu's. The fixer's pitch is
|
|
6
|
+
* AI-generated free text, and the brief told him the client "will hold
|
|
7
|
+
* the meet on-site" without telling him WHERE -- so a model writing a
|
|
8
|
+
* fixer's voice did the natural thing and invented a venue. The player
|
|
9
|
+
* then travelled to a scene that contains no such place.
|
|
10
|
+
*
|
|
11
|
+
* This is the codebase's signature defect: a NAME REFERRING TO NOTHING.
|
|
12
|
+
* The house cure is to resolve names against the real roster or room
|
|
13
|
+
* list and repair or reject, never to ship an unresolved one (see
|
|
14
|
+
* scene-chunks.ts resolveNamedRef). The same cure applies here, and it
|
|
15
|
+
* is better than a prohibition: the seed already KNOWS the answer, so
|
|
16
|
+
* the fixer can be told the truth rather than merely forbidden a lie.
|
|
17
|
+
* A brief that only says "don't invent one" leaves him with nothing to
|
|
18
|
+
* say and invites a vaguer dodge.
|
|
19
|
+
*
|
|
20
|
+
* THE MEET IS WHERE THE CLIENT STANDS, not the start room -- generation
|
|
21
|
+
* places the client "in a REACHABLE room that makes a characterful meet
|
|
22
|
+
* spot" (scene-chunks.ts), which is frequently not where the runner
|
|
23
|
+
* arrives. Falling back to the start room is still TRUE (it is where
|
|
24
|
+
* they land, and the client is always reachable from it), so the
|
|
25
|
+
* fallback degrades to vaguer rather than to wrong.
|
|
26
|
+
*
|
|
27
|
+
* IT LIVES HERE, not in call.ts, because ONE ANSWER IS THE WHOLE POINT.
|
|
28
|
+
* The reported bug is two sources disagreeing about where the meet is
|
|
29
|
+
* (the vetting on the item: "Krow directing the player to Mama Wu's,
|
|
30
|
+
* then a conflicting message from Mr. Vane at a different location"), so
|
|
31
|
+
* a resolver that only one of the speakers consults cannot fix it. Every
|
|
32
|
+
* surface that tells the player or an NPC where the meet is reads this
|
|
33
|
+
* function; if you are about to write the words "the meet" and a place
|
|
34
|
+
* name, call this instead.
|
|
35
|
+
*/
|
|
36
|
+
export function meetLocationFor(seed) {
|
|
37
|
+
if (!seed)
|
|
38
|
+
return undefined;
|
|
39
|
+
const client = seed.client
|
|
40
|
+
? seed.npcs?.find(n => n.player?.name === seed.client)
|
|
41
|
+
: undefined;
|
|
42
|
+
const clientRoom = client?.player?.startLocation;
|
|
43
|
+
// Only trust a room the scene really declares -- a startLocation that
|
|
44
|
+
// names no room is the same unresolved-name bug one level down, and
|
|
45
|
+
// repeating it into the fixer's mouth would be worse than silence.
|
|
46
|
+
const rooms = seed.rooms ?? [];
|
|
47
|
+
if (clientRoom && rooms.some(r => r.name === clientRoom))
|
|
48
|
+
return clientRoom;
|
|
49
|
+
return rooms.find(r => r.isStartRoom)?.name;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=meet-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meet-location.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/meet-location.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;QACxB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC;QACtD,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,UAAU,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC;IACjD,sEAAsE;IACtE,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Player } from '../models/player.js';
|
|
2
|
+
/**
|
|
3
|
+
* THE PERCEPTION TEST (SR5 core p.135-136), shared by every verb that
|
|
4
|
+
* makes one.
|
|
5
|
+
*
|
|
6
|
+
* Item FNgptvRhbA5yMunbB, the player writing the spec in two sentences:
|
|
7
|
+
* '"look" should reveal items that are under a perception threshold.
|
|
8
|
+
* "search" is an active perception check'.
|
|
9
|
+
*
|
|
10
|
+
* The SPLIT they asked for already shipped (52ba4dda): `look` lists
|
|
11
|
+
* plain-sight goods with no test at all, which is p.135's own
|
|
12
|
+
* instruction -- characters "should always be able to observe what is
|
|
13
|
+
* immediately obvious without spending an action or making a test" --
|
|
14
|
+
* while `search` rolls. What had NOT shipped is the mechanical
|
|
15
|
+
* difference between the two rolls, and canon is specific about what it
|
|
16
|
+
* is:
|
|
17
|
+
*
|
|
18
|
+
* "Perceiver is specifically looking/listening for it +3"
|
|
19
|
+
* (p.135-136, Perception Test Modifiers)
|
|
20
|
+
*
|
|
21
|
+
* That +3 IS the active/passive distinction. Without it, `search` was an
|
|
22
|
+
* active perception check in name while rolling the same pool as the
|
|
23
|
+
* passive glance -- the player's second sentence unimplemented, one
|
|
24
|
+
* layer below the one that was fixed.
|
|
25
|
+
*
|
|
26
|
+
* AND THE BRACKET IS A LIMIT. `Perception + Intuition [Mental]`: neither
|
|
27
|
+
* verb applied one, so a huge pool could count unlimited hits. Limits
|
|
28
|
+
* cap HITS, never dice (utilities/dice.ts, and the house rule at the top
|
|
29
|
+
* of CLAUDE.md).
|
|
30
|
+
*
|
|
31
|
+
* ONE FUNCTION, BOTH CALLERS, deliberately. look.ts and search.ts each
|
|
32
|
+
* built this pool inline and had already drifted apart; that is the same
|
|
33
|
+
* one-caller drift that let the meet address disagree with itself
|
|
34
|
+
* (g5CgJgmw9ix6AcD78) and the same duplicated-mechanic shape that let
|
|
35
|
+
* `use <medkit>` diverge from `heal`. If you are about to roll
|
|
36
|
+
* Perception, roll it here.
|
|
37
|
+
*/
|
|
38
|
+
/** p.135-136: the modifier for deliberately looking, which is what makes
|
|
39
|
+
* an active search mechanically different from a passive glance. */
|
|
40
|
+
export declare const ACTIVELY_LOOKING = 3;
|
|
41
|
+
export interface IPerceptionTest {
|
|
42
|
+
pool: number;
|
|
43
|
+
/** The bracket. Undefined only when the actor has no limit to apply --
|
|
44
|
+
* see the Matrix note below; rollPool refuses a zero limit loudly. */
|
|
45
|
+
limit: number | undefined;
|
|
46
|
+
}
|
|
47
|
+
export interface IPerceptionOpts {
|
|
48
|
+
/** True for a deliberate hunt (`search`), false for a glance (`look`). */
|
|
49
|
+
active?: boolean;
|
|
50
|
+
/** Matrix Search only: a loaded Browse program is purpose-built for it. */
|
|
51
|
+
browse?: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* ON THE GRID IT IS A DIFFERENT TEST WITH A DIFFERENT BRACKET. Matrix
|
|
55
|
+
* Search is Computer + Logic [Data Processing], so the Mental limit does
|
|
56
|
+
* NOT apply out there -- capping a decker's sweep by their Willpower
|
|
57
|
+
* would be a fresh deviation dressed as a fix. The engine takes the
|
|
58
|
+
* best of Perception and Computer so pre-Computer deckers lose nothing
|
|
59
|
+
* (a standing allowance, older than this function).
|
|
60
|
+
*
|
|
61
|
+
* Data Processing reads 0 for an actor with no deck at all; that is a
|
|
62
|
+
* caller's missing gate rather than a real limit, so it degrades to
|
|
63
|
+
* unlimited here instead of handing rollPool a zero it would reject.
|
|
64
|
+
*/
|
|
65
|
+
export declare function perceptionTest(actor: Player, opts?: IPerceptionOpts): IPerceptionTest;
|
|
66
|
+
/**
|
|
67
|
+
* PERCEPTION THRESHOLDS (p.136). Named because the numbers appear in
|
|
68
|
+
* player-facing text and in cover reads, and a bare 2 or 4 in three
|
|
69
|
+
* files is how they drift.
|
|
70
|
+
*/
|
|
71
|
+
export declare const PERCEPTION_THRESHOLD: {
|
|
72
|
+
/** Street sign, pedestrian, conversation, silenced gunfire. */
|
|
73
|
+
readonly normal: 2;
|
|
74
|
+
/** Secret door, needle in a haystack, subvocal speech. */
|
|
75
|
+
readonly hidden: 4;
|
|
76
|
+
};
|