@maka/maka-cli 5.123.0 → 5.124.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/adept-powers.d.ts +0 -8
- package/bundle/typescript/src/commands/game/sideQuest/adept-powers.js +6 -50
- package/bundle/typescript/src/commands/game/sideQuest/adept-powers.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.js +3 -3
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/augmentations.d.ts +0 -4
- package/bundle/typescript/src/commands/game/sideQuest/augmentations.js +0 -1342
- package/bundle/typescript/src/commands/game/sideQuest/augmentations.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/cast.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/catalog.js +5 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/catalog.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js +2 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.d.ts +0 -38
- package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.js +11 -45
- package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/install.js +5 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/install.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/quality-trade.js +10 -7
- package/bundle/typescript/src/commands/game/sideQuest/commands/quality-trade.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +5 -6
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/sin.js +2 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/sin.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/source.js +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/source.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 +14 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.js +11 -12
- package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +3 -3
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.js +5 -9
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/metamagics.d.ts +32 -0
- package/bundle/typescript/src/commands/game/sideQuest/metamagics.js +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/metamagics.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/metatypes.d.ts +6 -4
- package/bundle/typescript/src/commands/game/sideQuest/metatypes.js +3 -83
- package/bundle/typescript/src/commands/game/sideQuest/metatypes.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +5 -5
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +10 -14
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/qualities.d.ts +3 -7
- package/bundle/typescript/src/commands/game/sideQuest/qualities.js +15 -715
- package/bundle/typescript/src/commands/game/sideQuest/qualities.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/spells.d.ts +5 -7
- package/bundle/typescript/src/commands/game/sideQuest/spells.js +5 -63
- package/bundle/typescript/src/commands/game/sideQuest/spells.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/ui.js +22 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.d.ts +36 -20
- package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.js +24 -658
- package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.d.ts +100 -20
- package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js +314 -57
- package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +3 -2
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +26 -0
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
- package/bundle/typescript/src/error.js +1 -1
- package/bundle/typescript/src/error.js.map +1 -1
- package/bundle/typescript/src/tool.d.ts +2 -0
- package/bundle/typescript/src/tool.js +5 -2
- package/bundle/typescript/src/tool.js.map +1 -1
- package/bundle/typescript/src/tools/mpi/sdk-runtime.d.ts +1 -0
- package/bundle/typescript/src/tools/mpi/sdk-runtime.js +29 -0
- package/bundle/typescript/src/tools/mpi/sdk-runtime.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A METAMAGIC (SR5e p.325-326) or a technomancer's ECHO (p.257-258), as
|
|
3
|
+
* the engine holds one. Types only: the rows themselves are catalog rows
|
|
4
|
+
* of kind 'metamagic' on maka-cli.com, and utilities/catalog.ts's
|
|
5
|
+
* metamagicFor()/catalogMetamagics() rebuild this shape from them.
|
|
6
|
+
*
|
|
7
|
+
* Lived inside commands/initiate.ts until 2026-09-05, beside the array
|
|
8
|
+
* that is now gone; moved out so models/player.ts and the catalog client
|
|
9
|
+
* can name the type without importing a command.
|
|
10
|
+
*/
|
|
11
|
+
import type { ICatalogEffect } from './utilities/effects.js';
|
|
12
|
+
export interface IMetamagic {
|
|
13
|
+
key: string;
|
|
14
|
+
name: string;
|
|
15
|
+
/** Who can take it: casters (magic, not adept), adepts, or technomancers. */
|
|
16
|
+
path: 'caster' | 'adept' | 'techno';
|
|
17
|
+
effect: string;
|
|
18
|
+
page: string;
|
|
19
|
+
/**
|
|
20
|
+
* WHAT IT DOES, in the shared effects vocabulary (2026-09-04). A
|
|
21
|
+
* metamagic applies once 'initiated', and `scaleBy: 'grade'` multiplies
|
|
22
|
+
* by the initiation or submersion grade -- which is what Centering's
|
|
23
|
+
* "+grade dice" means.
|
|
24
|
+
*
|
|
25
|
+
* ONLY THE FLAT ONES CARRY EFFECTS, and the rest are rules of their own
|
|
26
|
+
* shape in models/player.ts: Quickening changes whether a sustained
|
|
27
|
+
* spell BILLS you, Overclocking adds a die only in hot-sim, and the two
|
|
28
|
+
* Matrix upgrades move a persona attribute that is computed rather than
|
|
29
|
+
* summed. Writing those as dice would be a stat block that lies.
|
|
30
|
+
*/
|
|
31
|
+
effects?: ICatalogEffect[];
|
|
32
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A METAMAGIC (SR5e p.325-326) or a technomancer's ECHO (p.257-258), as
|
|
3
|
+
* the engine holds one. Types only: the rows themselves are catalog rows
|
|
4
|
+
* of kind 'metamagic' on maka-cli.com, and utilities/catalog.ts's
|
|
5
|
+
* metamagicFor()/catalogMetamagics() rebuild this shape from them.
|
|
6
|
+
*
|
|
7
|
+
* Lived inside commands/initiate.ts until 2026-09-05, beside the array
|
|
8
|
+
* that is now gone; moved out so models/player.ts and the catalog client
|
|
9
|
+
* can name the type without importing a command.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=metamagics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metamagics.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/metamagics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -43,11 +43,13 @@ export interface IMetatype {
|
|
|
43
43
|
lifestyleCostMult?: number;
|
|
44
44
|
/** Racial abilities, in the shared effects vocabulary. */
|
|
45
45
|
effects?: ICatalogEffect[];
|
|
46
|
+
/**
|
|
47
|
+
* The Priority Table's metatype column (p.65): special attribute
|
|
48
|
+
* points per priority letter; a letter absent = not offered at that
|
|
49
|
+
* priority. The web chargen prices its metatype pick from this.
|
|
50
|
+
*/
|
|
51
|
+
priority?: Partial<Record<'A' | 'B' | 'C' | 'D' | 'E', number>>;
|
|
46
52
|
page: string;
|
|
47
53
|
}
|
|
48
54
|
/** Every metatype's Essence starts at 6 (p.66); none of them varies. */
|
|
49
55
|
export declare const STARTING_ESSENCE = 6;
|
|
50
|
-
export declare const METATYPES: IMetatype[];
|
|
51
|
-
/** Keyed lookup, the shape every other source file here exposes. */
|
|
52
|
-
export declare const METATYPES_BY_KEY: Record<string, IMetatype>;
|
|
53
|
-
export declare function getMetatype(key: string): IMetatype | undefined;
|
|
@@ -1,86 +1,6 @@
|
|
|
1
1
|
/** Every metatype's Essence starts at 6 (p.66); none of them varies. */
|
|
2
2
|
export const STARTING_ESSENCE = 6;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
description: 'The baseline the rest of the table is measured against -- and the one with luck to spare.',
|
|
7
|
-
attributes: {
|
|
8
|
-
body: { min: 1, max: 6 }, agility: { min: 1, max: 6 }, reaction: { min: 1, max: 6 },
|
|
9
|
-
strength: { min: 1, max: 6 }, willpower: { min: 1, max: 6 }, logic: { min: 1, max: 6 },
|
|
10
|
-
intuition: { min: 1, max: 6 }, charisma: { min: 1, max: 6 },
|
|
11
|
-
// The one place humans are ahead of everyone: Edge 2/7, where every
|
|
12
|
-
// other metatype starts at 1 and stops at 6.
|
|
13
|
-
edge: { min: 2, max: 7 },
|
|
14
|
-
},
|
|
15
|
-
sprintMetersPerHit: 2,
|
|
16
|
-
page: 'p.66',
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
key: 'elf', name: 'Elf',
|
|
20
|
-
description: 'Quick and easy to like, and never quite allowed to forget either.',
|
|
21
|
-
attributes: {
|
|
22
|
-
body: { min: 1, max: 6 }, agility: { min: 2, max: 7 }, reaction: { min: 1, max: 6 },
|
|
23
|
-
strength: { min: 1, max: 6 }, willpower: { min: 1, max: 6 }, logic: { min: 1, max: 6 },
|
|
24
|
-
intuition: { min: 1, max: 6 }, charisma: { min: 3, max: 8 }, edge: { min: 1, max: 6 },
|
|
25
|
-
},
|
|
26
|
-
sprintMetersPerHit: 2,
|
|
27
|
-
effects: [{ type: 'flag', category: 'capability', property: 'low-light', value: 1 }],
|
|
28
|
-
page: 'p.66',
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
key: 'dwarf', name: 'Dwarf',
|
|
32
|
-
description: 'Built low and built to last: harder to poison, harder to move, and paying more for a door that fits.',
|
|
33
|
-
attributes: {
|
|
34
|
-
body: { min: 3, max: 8 }, agility: { min: 1, max: 6 }, reaction: { min: 1, max: 5 },
|
|
35
|
-
strength: { min: 3, max: 8 }, willpower: { min: 2, max: 7 }, logic: { min: 1, max: 6 },
|
|
36
|
-
intuition: { min: 1, max: 6 }, charisma: { min: 1, max: 6 }, edge: { min: 1, max: 6 },
|
|
37
|
-
},
|
|
38
|
-
sprintMetersPerHit: 1,
|
|
39
|
-
lifestyleCostMult: 1.2,
|
|
40
|
-
effects: [
|
|
41
|
-
{ type: 'flag', category: 'capability', property: 'thermographic', value: 1 },
|
|
42
|
-
// Canon reads "+2 dice for pathogen and toxin resistance". The
|
|
43
|
-
// engine has a toxin pool and no pathogen track at all, so the
|
|
44
|
-
// toxin half is declared and the pathogen half is simply absent --
|
|
45
|
-
// named here rather than folded in, because a die granted against
|
|
46
|
-
// something nothing rolls would be a stat block that lies.
|
|
47
|
-
{ type: 'dice', category: 'pools', property: 'toxin', value: 2 },
|
|
48
|
-
],
|
|
49
|
-
page: 'p.66',
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
key: 'ork', name: 'Ork',
|
|
53
|
-
description: 'Strong, fast to mature, and written off by everyone who has never needed one.',
|
|
54
|
-
attributes: {
|
|
55
|
-
body: { min: 4, max: 9 }, agility: { min: 1, max: 6 }, reaction: { min: 1, max: 6 },
|
|
56
|
-
strength: { min: 3, max: 8 }, willpower: { min: 1, max: 6 }, logic: { min: 1, max: 5 },
|
|
57
|
-
intuition: { min: 1, max: 6 }, charisma: { min: 1, max: 5 }, edge: { min: 1, max: 6 },
|
|
58
|
-
},
|
|
59
|
-
sprintMetersPerHit: 2,
|
|
60
|
-
effects: [{ type: 'flag', category: 'capability', property: 'low-light', value: 1 }],
|
|
61
|
-
page: 'p.66',
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
key: 'troll', name: 'Troll',
|
|
65
|
-
description: 'Armoured at birth, longer in the arm than anything else on the street, and charged double for everything.',
|
|
66
|
-
attributes: {
|
|
67
|
-
body: { min: 5, max: 10 }, agility: { min: 1, max: 5 }, reaction: { min: 1, max: 6 },
|
|
68
|
-
strength: { min: 5, max: 10 }, willpower: { min: 1, max: 6 }, logic: { min: 1, max: 5 },
|
|
69
|
-
intuition: { min: 1, max: 5 }, charisma: { min: 1, max: 4 }, edge: { min: 1, max: 6 },
|
|
70
|
-
},
|
|
71
|
-
sprintMetersPerHit: 1,
|
|
72
|
-
lifestyleCostMult: 2,
|
|
73
|
-
effects: [
|
|
74
|
-
{ type: 'flag', category: 'capability', property: 'thermographic', value: 1 },
|
|
75
|
-
{ type: 'attribute', category: 'attributes', property: 'reach', value: 1 },
|
|
76
|
-
{ type: 'attribute', category: 'attributes', property: 'armor-bonus', value: 1 },
|
|
77
|
-
],
|
|
78
|
-
page: 'p.66',
|
|
79
|
-
},
|
|
80
|
-
];
|
|
81
|
-
/** Keyed lookup, the shape every other source file here exposes. */
|
|
82
|
-
export const METATYPES_BY_KEY = Object.fromEntries(METATYPES.map(m => [m.key, m]));
|
|
83
|
-
export function getMetatype(key) {
|
|
84
|
-
return METATYPES_BY_KEY[key];
|
|
85
|
-
}
|
|
3
|
+
// THE ROWS ARE NOT HERE. The five metatypes are catalog rows of kind
|
|
4
|
+
// 'metatype' on maka-cli.com; utilities/catalog.ts's metatypeFor() and
|
|
5
|
+
// catalogMetatypes() rebuild IMetatype from a row.
|
|
86
6
|
//# sourceMappingURL=metatypes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metatypes.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/metatypes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metatypes.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/metatypes.ts"],"names":[],"mappings":"AAoDA,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,qEAAqE;AACrE,uEAAuE;AACvE,mDAAmD"}
|
|
@@ -261,7 +261,7 @@ export interface ICombatAttributes {
|
|
|
261
261
|
aspect?: string;
|
|
262
262
|
/**
|
|
263
263
|
* The spells a magician/mystic adept CHOSE at creation (SR5 p.300, up to
|
|
264
|
-
* Magic x 2). Keys into
|
|
264
|
+
* Magic x 2). Keys into the catalog's spell rows. ABSENT means "knows
|
|
265
265
|
* every spell", the pre-selection behaviour -- so an existing save with
|
|
266
266
|
* no spellbook keeps casting anything, and only a chargen that sends a
|
|
267
267
|
* list is narrowed to it. An empty list would mean a magician who chose
|
|
@@ -270,7 +270,7 @@ export interface ICombatAttributes {
|
|
|
270
270
|
knownSpells?: string[];
|
|
271
271
|
/**
|
|
272
272
|
* The adept powers CHOSEN at creation (SR5 p.308-310): key -> level, keys
|
|
273
|
-
* into
|
|
273
|
+
* into the catalog's adept-power rows, total cost within
|
|
274
274
|
* effectivePowerPoints. ABSENT means the COMPRESSED model -- Power Points
|
|
275
275
|
* grant floor(pp/2) on every meat-plane pool, the pre-selection behaviour
|
|
276
276
|
* every existing adept keeps. Present means the powers themselves are the
|
|
@@ -862,7 +862,7 @@ export declare class Player extends AbstractPlayer {
|
|
|
862
862
|
essence: number;
|
|
863
863
|
baseMagic: number;
|
|
864
864
|
baseResonance: number;
|
|
865
|
-
/** Installed 'ware, by catalog key (
|
|
865
|
+
/** Installed 'ware, by catalog key (kind 'augmentation'). */
|
|
866
866
|
augmentations: Set<string>;
|
|
867
867
|
/**
|
|
868
868
|
* What GRADE each installed piece was cut at (see WARE_GRADES,
|
|
@@ -1030,7 +1030,7 @@ export declare class Player extends AbstractPlayer {
|
|
|
1030
1030
|
* and only the chrome lane can answer it.
|
|
1031
1031
|
*/
|
|
1032
1032
|
augBonus(kind: AugBonusKind): number;
|
|
1033
|
-
/** Installed qualities, by catalog key (
|
|
1033
|
+
/** Installed qualities, by catalog key (kind 'quality'). */
|
|
1034
1034
|
qualities: Set<string>;
|
|
1035
1035
|
/**
|
|
1036
1036
|
* IS THIS SKILL OR ATTRIBUTE FORBIDDEN OUTRIGHT to this character?
|
|
@@ -1820,7 +1820,7 @@ export declare class Player extends AbstractPlayer {
|
|
|
1820
1820
|
/** Static Veil: +2 to matrix defense while sustained. */
|
|
1821
1821
|
get formDefenseBonus(): number;
|
|
1822
1822
|
/** The Force each sustained spell was cast at (cast.ts records it) -- Focused Concentration reads it. */
|
|
1823
|
-
sustainedForces: Map<"armor" | "
|
|
1823
|
+
sustainedForces: Map<"armor" | "invisibility" | "reflexes", number>;
|
|
1824
1824
|
noteSustainedForce(kind: 'armor' | 'invisibility' | 'reflexes', force: number): void;
|
|
1825
1825
|
/** GREMLINS (p.81): the 1s a glitch needs, one fewer per rating, on external equipment -- the deck. */
|
|
1826
1826
|
get deckGremlins(): number;
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import { getSoft, getProgram } from '../utilities/programs.js';
|
|
2
2
|
import { GEAR_LANES, CHROME_LANES, QUALITY_LANES, ART_LANES, ADEPT_LANES, scaleOf } from '../utilities/effects.js';
|
|
3
|
-
import { catalogRowFor } from '../utilities/catalog.js';
|
|
3
|
+
import { catalogRowFor, spellFor, augFor, adeptPowerFor, metamagicFor } from '../utilities/catalog.js';
|
|
4
4
|
import { getQuality, resolveQualityKey } from '../qualities.js';
|
|
5
|
-
import { ADEPT_POWERS } from '../adept-powers.js';
|
|
6
5
|
import { skillsInGroup } from '../skill-groups.js';
|
|
7
|
-
import { spellFor } from '../utilities/catalog.js';
|
|
8
|
-
import { METAMAGICS_BY_KEY } from '../commands/initiate.js';
|
|
9
6
|
import { isAspectKey } from '../aspects.js';
|
|
10
7
|
import { hint } from '../utilities/hints.js';
|
|
11
8
|
import { Category } from '../types/shared/item-enum.js';
|
|
12
9
|
import { Logger } from '../utilities/logger.js';
|
|
13
10
|
import { CALL_ICON, CALL_COLOR } from '../utilities/comm-style.js';
|
|
14
|
-
import { getAug } from '../augmentations.js';
|
|
15
11
|
// The Physical limit already lives here (subduing, p.195) -- imported
|
|
16
12
|
// rather than re-derived so meat combat and the grapple cannot drift
|
|
17
13
|
// into two different formulas for the same canon number.
|
|
@@ -1224,7 +1220,7 @@ export class Player extends AbstractPlayer {
|
|
|
1224
1220
|
// `magic`/`resonance` above stay the EFFECTIVE values every pool reads.
|
|
1225
1221
|
baseMagic = 0;
|
|
1226
1222
|
baseResonance = 0;
|
|
1227
|
-
/** Installed 'ware, by catalog key (
|
|
1223
|
+
/** Installed 'ware, by catalog key (kind 'augmentation'). */
|
|
1228
1224
|
augmentations = new Set();
|
|
1229
1225
|
/**
|
|
1230
1226
|
* What GRADE each installed piece was cut at (see WARE_GRADES,
|
|
@@ -1250,7 +1246,7 @@ export class Player extends AbstractPlayer {
|
|
|
1250
1246
|
*/
|
|
1251
1247
|
implantWeapon() {
|
|
1252
1248
|
for (const key of this.augmentations) {
|
|
1253
|
-
const w =
|
|
1249
|
+
const w = augFor(key)?.implantWeapon;
|
|
1254
1250
|
if (!w)
|
|
1255
1251
|
continue;
|
|
1256
1252
|
// A shock hand out of charges is a hand (p.458).
|
|
@@ -1277,7 +1273,7 @@ export class Player extends AbstractPlayer {
|
|
|
1277
1273
|
/** Back to full -- a rest, or the moment the chrome goes in. */
|
|
1278
1274
|
refillImplantCharges() {
|
|
1279
1275
|
for (const key of this.augmentations) {
|
|
1280
|
-
const w =
|
|
1276
|
+
const w = augFor(key)?.implantWeapon;
|
|
1281
1277
|
if (w?.charges !== undefined) {
|
|
1282
1278
|
this.implantCharges = w.charges;
|
|
1283
1279
|
return;
|
|
@@ -1310,7 +1306,7 @@ export class Player extends AbstractPlayer {
|
|
|
1310
1306
|
// A HOUSING TAKES THE DECK YOU BROUGHT (Chrome Flesh p.222). Nothing
|
|
1311
1307
|
// is granted -- the book charges 5,000 PLUS the deck, so this moves
|
|
1312
1308
|
// the one you own inside your skull and it stops being liftable.
|
|
1313
|
-
if (
|
|
1309
|
+
if (augFor(aug.key)?.implantsCarriedDeck)
|
|
1314
1310
|
this.getAnyCyberdeck()?.implantIntoBody();
|
|
1315
1311
|
}
|
|
1316
1312
|
// ================= THE EFFECTS LANE (one resolver) =================
|
|
@@ -1393,7 +1389,7 @@ export class Player extends AbstractPlayer {
|
|
|
1393
1389
|
// here, once, so every reader sees the same surviving set -- rather
|
|
1394
1390
|
// than in a getter, where only that getter would have been right.
|
|
1395
1391
|
for (const key of this.chromeThatCounts()) {
|
|
1396
|
-
const a =
|
|
1392
|
+
const a = augFor(key);
|
|
1397
1393
|
if (a?.effects)
|
|
1398
1394
|
take(a.effects, 'installed', 'installed', undefined, 'chrome', key);
|
|
1399
1395
|
}
|
|
@@ -1406,14 +1402,14 @@ export class Player extends AbstractPlayer {
|
|
|
1406
1402
|
for (const [key, level] of Object.entries(this.adeptPowers ?? {})) {
|
|
1407
1403
|
if (level <= 0)
|
|
1408
1404
|
continue;
|
|
1409
|
-
const power =
|
|
1405
|
+
const power = adeptPowerFor(key);
|
|
1410
1406
|
if (power?.effects)
|
|
1411
1407
|
take(power.effects, 'innate', 'innate', level, 'adept', key);
|
|
1412
1408
|
}
|
|
1413
1409
|
// ---- The INITIATE lane. A metamagic applies from the moment it is
|
|
1414
1410
|
// learned, and 'grade' is what Centering multiplies by.
|
|
1415
1411
|
for (const key of this.metamagics) {
|
|
1416
|
-
const m =
|
|
1412
|
+
const m = metamagicFor(key);
|
|
1417
1413
|
if (m?.effects)
|
|
1418
1414
|
take(m.effects, 'initiated', 'initiated', this.initiationGrade, 'initiate', key);
|
|
1419
1415
|
}
|
|
@@ -1648,7 +1644,7 @@ export class Player extends AbstractPlayer {
|
|
|
1648
1644
|
// (outfitArchetype). Every entry in the catalog has a real mechanical
|
|
1649
1645
|
// hook; the ones that read as flat pool nudges all tap through
|
|
1650
1646
|
// qualityBonus below, the same single-switch pattern as augBonus.
|
|
1651
|
-
/** Installed qualities, by catalog key (
|
|
1647
|
+
/** Installed qualities, by catalog key (kind 'quality'). */
|
|
1652
1648
|
qualities = new Set();
|
|
1653
1649
|
/**
|
|
1654
1650
|
* IS THIS SKILL OR ATTRIBUTE FORBIDDEN OUTRIGHT to this character?
|
|
@@ -2938,7 +2934,7 @@ export class Player extends AbstractPlayer {
|
|
|
2938
2934
|
// this same punch independently, and both read implantWeapon.
|
|
2939
2935
|
const implant = this.implantWeapon();
|
|
2940
2936
|
if (implant) {
|
|
2941
|
-
const aug = [...this.augmentations].map(k =>
|
|
2937
|
+
const aug = [...this.augmentations].map(k => augFor(k)).find(a => a?.implantWeapon);
|
|
2942
2938
|
return {
|
|
2943
2939
|
name: aug?.name?.toLowerCase() ?? 'implanted blades',
|
|
2944
2940
|
damage: implant.dv + (implant.dvAttribute === 'strength' ? this.strength : 0),
|