@maka/maka-cli 5.104.0 → 5.108.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/augmentations.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/augmentations.js +3 -0
- package/bundle/typescript/src/commands/game/sideQuest/augmentations.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +19 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +74 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/deck.js +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/deck.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/download.d.ts +46 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/download.js +128 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/download.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/players.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/players.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.js +4 -2
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/device.d.ts +58 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/device.js +66 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/device.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +37 -5
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +56 -4
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js +26 -5
- package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js +5 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js.map +1 -1
- package/package.json +1 -1
|
@@ -17,7 +17,27 @@ export interface IDeviceConfig {
|
|
|
17
17
|
opensExit?: string;
|
|
18
18
|
openMessage?: string;
|
|
19
19
|
refuseMessage?: string;
|
|
20
|
+
/** DEVICE RATING (p.234/p.356). Omitted takes the kind's default --
|
|
21
|
+
* see DEFAULT_DEVICE_RATING. Meaningless on a 'ward', which is not
|
|
22
|
+
* electronics at all. */
|
|
23
|
+
rating?: number;
|
|
24
|
+
/** Wireless mode. Defaults on for electronics, and is always off on a
|
|
25
|
+
* 'ward'. A device with its wireless off has no icon to find and
|
|
26
|
+
* nothing to reach from the grid. */
|
|
27
|
+
wireless?: boolean;
|
|
20
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* WHAT A SHUT THING RATES WHEN NOBODY SAID (canon p.356 DEVICE RATINGS,
|
|
31
|
+
* which prices a door lock at 2, and p.234, where a device's Data
|
|
32
|
+
* Processing and Firewall are both simply its Device Rating).
|
|
33
|
+
*
|
|
34
|
+
* A 'ward' is deliberately absent: it is the Art, not electronics, and
|
|
35
|
+
* giving it a rating would be inventing a device where canon has none.
|
|
36
|
+
* broadcastsAro() answers false for it on the same grounds -- see
|
|
37
|
+
* kbWdrysBQSahg67cA, where the ask was "anything that can be HACKED must
|
|
38
|
+
* be a device", not "everything in the room is".
|
|
39
|
+
*/
|
|
40
|
+
export declare const DEFAULT_DEVICE_RATING: Partial<Record<DeviceKind, number>>;
|
|
21
41
|
/**
|
|
22
42
|
* A DEVICE: a thing in a room that is shut and can be opened.
|
|
23
43
|
*
|
|
@@ -65,8 +85,46 @@ export declare class Device {
|
|
|
65
85
|
refuseMessage: string;
|
|
66
86
|
/** The whole of this device's state. */
|
|
67
87
|
open: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* DEVICE RATING, and the wireless mode that decides whether anything
|
|
90
|
+
* can see it (kbWdrysBQSahg67cA, Deditri: "anything that can be hacked
|
|
91
|
+
* must be a device, with a device rating and any device that is
|
|
92
|
+
* wireless enabled (and on) will have an ARO").
|
|
93
|
+
*
|
|
94
|
+
* `open` is still the whole of the device's PUZZLE state -- these two
|
|
95
|
+
* are the Matrix presence of the object, which is a different
|
|
96
|
+
* question and does not change when it opens. A cracked keypad is
|
|
97
|
+
* still a keypad standing on the grid.
|
|
98
|
+
*/
|
|
99
|
+
rating: number;
|
|
100
|
+
wireless: boolean;
|
|
68
101
|
constructor(config: IDeviceConfig);
|
|
69
102
|
isOpen(): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* IS THERE AN ICON HERE TO FIND? Wireless mode on, and a rating that
|
|
105
|
+
* means it is electronics at all.
|
|
106
|
+
*
|
|
107
|
+
* Both surfaces ask this one predicate -- utilities/ar.ts for the
|
|
108
|
+
* street's overlay and utilities/grid-view.ts for a persona's icon
|
|
109
|
+
* list -- because the two views disagreeing about one object is the
|
|
110
|
+
* exact fault this codebase keeps having to close (see the gun in
|
|
111
|
+
* aroTags, AKfemBJJWJP99nx8K).
|
|
112
|
+
*/
|
|
113
|
+
broadcastsAro(): boolean;
|
|
114
|
+
/** Data Processing and Firewall are both simply the Device Rating
|
|
115
|
+
* (p.234). Named rather than inlined so a future rating that is not
|
|
116
|
+
* flat has one place to change. */
|
|
117
|
+
get firewall(): number;
|
|
118
|
+
get dataProcessing(): number;
|
|
119
|
+
/**
|
|
120
|
+
* An UNATTENDED device stands in its Device Rating for the Mental
|
|
121
|
+
* attribute it does not have (p.237-238): a door lock nobody is
|
|
122
|
+
* watching defends a Control Device action with Rating + Firewall.
|
|
123
|
+
* Nothing consumes this yet -- hack.ts's panel route is still the
|
|
124
|
+
* bypass rail -- so it is declared where the rating lives rather than
|
|
125
|
+
* guessed at a call site later.
|
|
126
|
+
*/
|
|
127
|
+
get unattendedDefencePool(): number;
|
|
70
128
|
/** Every verb that works this device, for telling the player exactly
|
|
71
129
|
* what they may type. */
|
|
72
130
|
verbs(): string[];
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { matchesCredential } from '../utilities/credentials.js';
|
|
2
2
|
import { AFFORDANCE_FLAVOR, verbsFor } from '../utilities/affordances.js';
|
|
3
3
|
import { hint } from '../utilities/hints.js';
|
|
4
|
+
/**
|
|
5
|
+
* WHAT A SHUT THING RATES WHEN NOBODY SAID (canon p.356 DEVICE RATINGS,
|
|
6
|
+
* which prices a door lock at 2, and p.234, where a device's Data
|
|
7
|
+
* Processing and Firewall are both simply its Device Rating).
|
|
8
|
+
*
|
|
9
|
+
* A 'ward' is deliberately absent: it is the Art, not electronics, and
|
|
10
|
+
* giving it a rating would be inventing a device where canon has none.
|
|
11
|
+
* broadcastsAro() answers false for it on the same grounds -- see
|
|
12
|
+
* kbWdrysBQSahg67cA, where the ask was "anything that can be HACKED must
|
|
13
|
+
* be a device", not "everything in the room is".
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_DEVICE_RATING = {
|
|
16
|
+
lock: 2,
|
|
17
|
+
panel: 2,
|
|
18
|
+
};
|
|
4
19
|
/**
|
|
5
20
|
* A DEVICE: a thing in a room that is shut and can be opened.
|
|
6
21
|
*
|
|
@@ -48,6 +63,19 @@ export class Device {
|
|
|
48
63
|
refuseMessage;
|
|
49
64
|
/** The whole of this device's state. */
|
|
50
65
|
open = false;
|
|
66
|
+
/**
|
|
67
|
+
* DEVICE RATING, and the wireless mode that decides whether anything
|
|
68
|
+
* can see it (kbWdrysBQSahg67cA, Deditri: "anything that can be hacked
|
|
69
|
+
* must be a device, with a device rating and any device that is
|
|
70
|
+
* wireless enabled (and on) will have an ARO").
|
|
71
|
+
*
|
|
72
|
+
* `open` is still the whole of the device's PUZZLE state -- these two
|
|
73
|
+
* are the Matrix presence of the object, which is a different
|
|
74
|
+
* question and does not change when it opens. A cracked keypad is
|
|
75
|
+
* still a keypad standing on the grid.
|
|
76
|
+
*/
|
|
77
|
+
rating;
|
|
78
|
+
wireless;
|
|
51
79
|
constructor(config) {
|
|
52
80
|
this.kind = config.kind;
|
|
53
81
|
this.name = config.name;
|
|
@@ -61,10 +89,48 @@ export class Device {
|
|
|
61
89
|
this.opensExit = config.opensExit;
|
|
62
90
|
this.openMessage = config.openMessage || 'It opens.';
|
|
63
91
|
this.refuseMessage = config.refuseMessage || `Nothing happens.`;
|
|
92
|
+
this.rating = config.rating ?? DEFAULT_DEVICE_RATING[config.kind] ?? 0;
|
|
93
|
+
// A ward has no wireless mode to be in. Everything else defaults ON,
|
|
94
|
+
// because a seeded keypad nobody thought about is a keypad on the
|
|
95
|
+
// grid -- which is the state the report says the game should model.
|
|
96
|
+
this.wireless = config.kind === 'ward' ? false : (config.wireless ?? true);
|
|
64
97
|
}
|
|
65
98
|
isOpen() {
|
|
66
99
|
return this.open;
|
|
67
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* IS THERE AN ICON HERE TO FIND? Wireless mode on, and a rating that
|
|
103
|
+
* means it is electronics at all.
|
|
104
|
+
*
|
|
105
|
+
* Both surfaces ask this one predicate -- utilities/ar.ts for the
|
|
106
|
+
* street's overlay and utilities/grid-view.ts for a persona's icon
|
|
107
|
+
* list -- because the two views disagreeing about one object is the
|
|
108
|
+
* exact fault this codebase keeps having to close (see the gun in
|
|
109
|
+
* aroTags, AKfemBJJWJP99nx8K).
|
|
110
|
+
*/
|
|
111
|
+
broadcastsAro() {
|
|
112
|
+
return this.wireless && this.rating > 0;
|
|
113
|
+
}
|
|
114
|
+
/** Data Processing and Firewall are both simply the Device Rating
|
|
115
|
+
* (p.234). Named rather than inlined so a future rating that is not
|
|
116
|
+
* flat has one place to change. */
|
|
117
|
+
get firewall() {
|
|
118
|
+
return this.rating;
|
|
119
|
+
}
|
|
120
|
+
get dataProcessing() {
|
|
121
|
+
return this.rating;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* An UNATTENDED device stands in its Device Rating for the Mental
|
|
125
|
+
* attribute it does not have (p.237-238): a door lock nobody is
|
|
126
|
+
* watching defends a Control Device action with Rating + Firewall.
|
|
127
|
+
* Nothing consumes this yet -- hack.ts's panel route is still the
|
|
128
|
+
* bypass rail -- so it is declared where the rating lives rather than
|
|
129
|
+
* guessed at a call site later.
|
|
130
|
+
*/
|
|
131
|
+
get unattendedDefencePool() {
|
|
132
|
+
return this.rating + this.firewall;
|
|
133
|
+
}
|
|
68
134
|
/** Every verb that works this device, for telling the player exactly
|
|
69
135
|
* what they may type. */
|
|
70
136
|
verbs() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/models/device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAc,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/models/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -453,7 +453,9 @@ export declare class Player extends AbstractPlayer {
|
|
|
453
453
|
/** Any deck at all, bricked included -- for status displays and repair. */
|
|
454
454
|
getAnyCyberdeck(): Item | undefined;
|
|
455
455
|
arOffline: boolean;
|
|
456
|
-
|
|
456
|
+
private _arMuted;
|
|
457
|
+
get arMuted(): boolean;
|
|
458
|
+
set arMuted(v: boolean);
|
|
457
459
|
panMarksBy: Map<string, number>;
|
|
458
460
|
overwatchScore: number;
|
|
459
461
|
overwatchLastTick: number;
|
|
@@ -553,6 +555,21 @@ export declare class Player extends AbstractPlayer {
|
|
|
553
555
|
private static readonly ATTR_NAME;
|
|
554
556
|
/** The undamaged array, before any IC reduction. */
|
|
555
557
|
baseMatrixAttribute(kind: 'attack' | 'sleaze' | 'dataProcessing' | 'firewall'): number;
|
|
558
|
+
/**
|
|
559
|
+
* THE LIVE LINK -- what makes this runner reachable and lit (p.223,
|
|
560
|
+
* RAG-checked 2026-09-01: "a deck can perform all of the functions of
|
|
561
|
+
* a commlink"). The worn commlink, or failing that the working deck:
|
|
562
|
+
* a deck-only decker IS online, receives calls, and drives AR.
|
|
563
|
+
*
|
|
564
|
+
* The distinction this deliberately preserves: a POCKETED commlink is
|
|
565
|
+
* still not live (the 2026-08-24 ruling -- choosing not to wear the
|
|
566
|
+
* wearable is choosing silence), but a deck cannot be worn at all --
|
|
567
|
+
* it works from the kit BY the engine's own design, so its kit state
|
|
568
|
+
* IS its equipped state. ar.ts used to render the honest display of
|
|
569
|
+
* the old mechanics ("AR ON | Link offline"); this fixes the
|
|
570
|
+
* MECHANICS, so the display goes back to matching canon.
|
|
571
|
+
*/
|
|
572
|
+
liveLink(): Item | undefined;
|
|
556
573
|
getPanMaster(): Item | undefined;
|
|
557
574
|
/**
|
|
558
575
|
* Defense against a PAN intrusion, itemised: the book's attribute plus
|
|
@@ -851,7 +868,9 @@ export declare class Player extends AbstractPlayer {
|
|
|
851
868
|
get name(): string;
|
|
852
869
|
get currentLocation(): Room;
|
|
853
870
|
set currentLocation(room: Room);
|
|
854
|
-
|
|
871
|
+
private _atSpot?;
|
|
872
|
+
get atSpot(): string | undefined;
|
|
873
|
+
set atSpot(v: string | undefined);
|
|
855
874
|
/**
|
|
856
875
|
* WHICH PAPER YOU CARRY (player request 2026-08-25, twice: "I should
|
|
857
876
|
* be able to see which sin I have active, and be able set it"). The
|
|
@@ -883,12 +902,22 @@ export declare class Player extends AbstractPlayer {
|
|
|
883
902
|
*
|
|
884
903
|
* NOT persisted: like the grid itself, it is transient geometry -- a
|
|
885
904
|
* reload puts you back on your spot's own seat.
|
|
905
|
+
*
|
|
906
|
+
* Accessor for the live dot map (2026-09-01) -- a cell step reports.
|
|
907
|
+
* Same-reference writes are the common no-op; a NEW object with equal
|
|
908
|
+
* coordinates still fires, which is harmless (one coalesced beat).
|
|
886
909
|
*/
|
|
887
|
-
|
|
910
|
+
private _atCell?;
|
|
911
|
+
get atCell(): {
|
|
888
912
|
x: number;
|
|
889
913
|
y: number;
|
|
890
914
|
z: number;
|
|
891
|
-
};
|
|
915
|
+
} | undefined;
|
|
916
|
+
set atCell(v: {
|
|
917
|
+
x: number;
|
|
918
|
+
y: number;
|
|
919
|
+
z: number;
|
|
920
|
+
} | undefined);
|
|
892
921
|
/** The spot this actor was SEEDED at -- i.e. the fixture they work
|
|
893
922
|
* (a bartender's bar, a shopkeeper's counter). Seating puts them on
|
|
894
923
|
* the service side of it while everyone else stands in front (see
|
|
@@ -987,7 +1016,10 @@ export declare class Player extends AbstractPlayer {
|
|
|
987
1016
|
* roll, so it is guarded where it is invoked.
|
|
988
1017
|
*/
|
|
989
1018
|
onConditionChanged?: () => void;
|
|
990
|
-
|
|
1019
|
+
/** PUBLIC so state that lives on ITEMS (a deck's program list) can
|
|
1020
|
+
* report through the owning player -- deck.ts load/unload calls it.
|
|
1021
|
+
* Guarded here once: reporting never wounds. */
|
|
1022
|
+
noteConditionChanged(): void;
|
|
991
1023
|
takeDamage(boxes: number): number;
|
|
992
1024
|
/** A fresh injury opens a fresh set of wounds: first aid is available
|
|
993
1025
|
* again, and whatever the mana did is now last wound's business. */
|
|
@@ -476,7 +476,17 @@ export class Player extends AbstractPlayer {
|
|
|
476
476
|
// is untouched; you simply stop being shown the icon clutter.
|
|
477
477
|
// Session-scoped like runningSilent: a fresh session boots AR up.
|
|
478
478
|
// See commands/ar.ts and utilities/ar.ts.
|
|
479
|
-
|
|
479
|
+
// Accessor (live-sheet, 2026-09-01): the AR toggle is sheet-visible --
|
|
480
|
+
// the report carries the derived arSightUp, and this is the switch the
|
|
481
|
+
// player actually flips, so flipping it reports.
|
|
482
|
+
_arMuted = false;
|
|
483
|
+
get arMuted() { return this._arMuted; }
|
|
484
|
+
set arMuted(v) {
|
|
485
|
+
if (this._arMuted === v)
|
|
486
|
+
return;
|
|
487
|
+
this._arMuted = v;
|
|
488
|
+
this.noteConditionChanged();
|
|
489
|
+
}
|
|
480
490
|
// MARKS on THIS actor's PAN (canon p.235-236), keyed by PLACER name,
|
|
481
491
|
// capped at 3 -- each one buys the placer +2 dice on PAN intrusions
|
|
482
492
|
// against me (hack.ts). My "reboot" wipes them all; a placer's own
|
|
@@ -629,6 +639,23 @@ export class Player extends AbstractPlayer {
|
|
|
629
639
|
const rig = this.activeDeck ?? this.getCyberdeck() ?? this.getPanMaster();
|
|
630
640
|
return rig?.matrixAttribute(kind) ?? 0;
|
|
631
641
|
}
|
|
642
|
+
/**
|
|
643
|
+
* THE LIVE LINK -- what makes this runner reachable and lit (p.223,
|
|
644
|
+
* RAG-checked 2026-09-01: "a deck can perform all of the functions of
|
|
645
|
+
* a commlink"). The worn commlink, or failing that the working deck:
|
|
646
|
+
* a deck-only decker IS online, receives calls, and drives AR.
|
|
647
|
+
*
|
|
648
|
+
* The distinction this deliberately preserves: a POCKETED commlink is
|
|
649
|
+
* still not live (the 2026-08-24 ruling -- choosing not to wear the
|
|
650
|
+
* wearable is choosing silence), but a deck cannot be worn at all --
|
|
651
|
+
* it works from the kit BY the engine's own design, so its kit state
|
|
652
|
+
* IS its equipped state. ar.ts used to render the honest display of
|
|
653
|
+
* the old mechanics ("AR ON | Link offline"); this fixes the
|
|
654
|
+
* MECHANICS, so the display goes back to matching canon.
|
|
655
|
+
*/
|
|
656
|
+
liveLink() {
|
|
657
|
+
return this._equipment.head?.commlink ?? this.getCyberdeck();
|
|
658
|
+
}
|
|
632
659
|
getPanMaster() {
|
|
633
660
|
const deck = this.getCyberdeck();
|
|
634
661
|
// Worn first, then CARRIED (playtest 2026-08-24: NPCs keep their
|
|
@@ -1405,7 +1432,17 @@ export class Player extends AbstractPlayer {
|
|
|
1405
1432
|
// Where this actor stands WITHIN the room ("at" spots, see
|
|
1406
1433
|
// utilities/spots.ts). undefined = circulating (reaches everything,
|
|
1407
1434
|
// gets no cover) -- the compat default for everything un-migrated.
|
|
1408
|
-
|
|
1435
|
+
// Accessor (live-sheet, 2026-09-01, user: "let's get that streaming
|
|
1436
|
+
// in too"): in-room movement walks the sheet's dot map, so the write
|
|
1437
|
+
// fires the report hook on CHANGE. Source-compatible; NPCs no-op.
|
|
1438
|
+
_atSpot;
|
|
1439
|
+
get atSpot() { return this._atSpot; }
|
|
1440
|
+
set atSpot(v) {
|
|
1441
|
+
if (this._atSpot === v)
|
|
1442
|
+
return;
|
|
1443
|
+
this._atSpot = v;
|
|
1444
|
+
this.noteConditionChanged();
|
|
1445
|
+
}
|
|
1409
1446
|
/**
|
|
1410
1447
|
* WHICH PAPER YOU CARRY (player request 2026-08-25, twice: "I should
|
|
1411
1448
|
* be able to see which sin I have active, and be able set it"). The
|
|
@@ -1437,8 +1474,19 @@ export class Player extends AbstractPlayer {
|
|
|
1437
1474
|
*
|
|
1438
1475
|
* NOT persisted: like the grid itself, it is transient geometry -- a
|
|
1439
1476
|
* reload puts you back on your spot's own seat.
|
|
1477
|
+
*
|
|
1478
|
+
* Accessor for the live dot map (2026-09-01) -- a cell step reports.
|
|
1479
|
+
* Same-reference writes are the common no-op; a NEW object with equal
|
|
1480
|
+
* coordinates still fires, which is harmless (one coalesced beat).
|
|
1440
1481
|
*/
|
|
1441
|
-
|
|
1482
|
+
_atCell;
|
|
1483
|
+
get atCell() { return this._atCell; }
|
|
1484
|
+
set atCell(v) {
|
|
1485
|
+
if (this._atCell === v)
|
|
1486
|
+
return;
|
|
1487
|
+
this._atCell = v;
|
|
1488
|
+
this.noteConditionChanged();
|
|
1489
|
+
}
|
|
1442
1490
|
/** The spot this actor was SEEDED at -- i.e. the fixture they work
|
|
1443
1491
|
* (a bartender's bar, a shopkeeper's counter). Seating puts them on
|
|
1444
1492
|
* the service side of it while everyone else stands in front (see
|
|
@@ -1869,6 +1917,9 @@ export class Player extends AbstractPlayer {
|
|
|
1869
1917
|
* roll, so it is guarded where it is invoked.
|
|
1870
1918
|
*/
|
|
1871
1919
|
onConditionChanged;
|
|
1920
|
+
/** PUBLIC so state that lives on ITEMS (a deck's program list) can
|
|
1921
|
+
* report through the owning player -- deck.ts load/unload calls it.
|
|
1922
|
+
* Guarded here once: reporting never wounds. */
|
|
1872
1923
|
noteConditionChanged() {
|
|
1873
1924
|
try {
|
|
1874
1925
|
this.onConditionChanged?.();
|
|
@@ -2332,7 +2383,8 @@ export class Player extends AbstractPlayer {
|
|
|
2332
2383
|
// Intuition x 2 (p.159 chart, p.314 astral attributes).
|
|
2333
2384
|
return Math.max(0, this.intuition * 2 + this.woundModifier);
|
|
2334
2385
|
}
|
|
2335
|
-
|
|
2386
|
+
// The live link, not just the worn one: a deck drives AR too (p.223).
|
|
2387
|
+
const link = this.liveLink();
|
|
2336
2388
|
// AR needs a link that's on you, broadcasting, and not hacked dark.
|
|
2337
2389
|
// An ENGINE ADDITION, not canon: p.474 gives AR a bare Intuition +
|
|
2338
2390
|
// Reaction. It predates this change and is left alone deliberately,
|