@maka/maka-cli 5.119.0 → 5.121.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.
Files changed (82) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js +2 -2
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js +31 -2
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js.map +1 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.d.ts +10 -3
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +17 -4
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -1
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +1 -1
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/catalog.d.ts +0 -7
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/catalog.js +39 -3
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/catalog.js.map +1 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js +28 -4
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js.map +1 -1
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/fit.d.ts +29 -0
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/fit.js +85 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/fit.js.map +1 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js +4 -4
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js.map +1 -1
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +16 -5
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/pan.js +3 -1
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/pan.js.map +1 -1
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.d.ts +34 -1
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +81 -12
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -1
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +5 -2
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  29. package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
  30. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +29 -1
  31. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
  32. package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js +4 -0
  33. package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js.map +1 -1
  34. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +7 -0
  35. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
  36. package/bundle/typescript/src/commands/game/sideQuest/game.js +12 -7
  37. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  38. package/bundle/typescript/src/commands/game/sideQuest/models/device.d.ts +72 -0
  39. package/bundle/typescript/src/commands/game/sideQuest/models/device.js +89 -1
  40. package/bundle/typescript/src/commands/game/sideQuest/models/device.js.map +1 -1
  41. package/bundle/typescript/src/commands/game/sideQuest/models/item.d.ts +134 -45
  42. package/bundle/typescript/src/commands/game/sideQuest/models/item.js +448 -104
  43. package/bundle/typescript/src/commands/game/sideQuest/models/item.js.map +1 -1
  44. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +2 -0
  45. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +7 -5
  46. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  47. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +31 -3
  48. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +171 -47
  49. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  50. package/bundle/typescript/src/commands/game/sideQuest/types/repro.d.ts +8 -0
  51. package/bundle/typescript/src/commands/game/sideQuest/types/repro.js.map +1 -1
  52. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +4 -1
  53. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.d.ts +17 -0
  54. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.js +1 -1
  55. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.js.map +1 -1
  56. package/bundle/typescript/src/commands/game/sideQuest/utilities/barrier-combat.d.ts +38 -0
  57. package/bundle/typescript/src/commands/game/sideQuest/utilities/barrier-combat.js +67 -0
  58. package/bundle/typescript/src/commands/game/sideQuest/utilities/barrier-combat.js.map +1 -0
  59. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.d.ts +279 -4
  60. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.js +221 -212
  61. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.js.map +1 -1
  62. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.d.ts +24 -5
  63. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js +50 -17
  64. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js.map +1 -1
  65. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.d.ts +6 -0
  66. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +28 -11
  67. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -1
  68. package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js +16 -1
  69. package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js.map +1 -1
  70. package/bundle/typescript/src/commands/game/sideQuest/utilities/first-aid.js +3 -1
  71. package/bundle/typescript/src/commands/game/sideQuest/utilities/first-aid.js.map +1 -1
  72. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +6 -2
  73. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -1
  74. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +1 -1
  75. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js.map +1 -1
  76. package/bundle/typescript/src/commands/game/sideQuest/utilities/range.d.ts +19 -13
  77. package/bundle/typescript/src/commands/game/sideQuest/utilities/range.js +77 -34
  78. package/bundle/typescript/src/commands/game/sideQuest/utilities/range.js.map +1 -1
  79. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.d.ts +2 -0
  80. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.js +22 -3
  81. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.js.map +1 -1
  82. package/package.json +1 -1
@@ -21,6 +21,12 @@ export interface IDeviceConfig {
21
21
  * see DEFAULT_DEVICE_RATING. Meaningless on a 'ward', which is not
22
22
  * electronics at all. */
23
23
  rating?: number;
24
+ /** BARRIER RATINGS (p.197-198): Structure (the condition monitor) and
25
+ * Armor (what it soaks with). Omitted takes barrierDefaultsFor(). */
26
+ structure?: number;
27
+ armor?: number;
28
+ /** The seed's footprint, only to pick the barrier default tier. */
29
+ footprint?: 'small' | 'medium' | 'large';
24
30
  /** Wireless mode. Defaults on for electronics, and is always off on a
25
31
  * 'ward'. A device with its wireless off has no icon to find and
26
32
  * nothing to reach from the grid. */
@@ -38,6 +44,36 @@ export interface IDeviceConfig {
38
44
  * be a device", not "everything in the room is".
39
45
  */
40
46
  export declare const DEFAULT_DEVICE_RATING: Partial<Record<DeviceKind, number>>;
47
+ /**
48
+ * THE BOOK'S BARRIER TIERS (p.197 Barrier Ratings, RAG-checked 2026-09-03):
49
+ * Structure / Armor. Fragile is standard glass; Reinforced is a security
50
+ * door, armored glass, Kevlar wallboard; Heavy is concrete or a metal
51
+ * beam. A device seed that says neither gets Reinforced -- the ordinary
52
+ * locked door -- or Heavy when its footprint is large. A ward is the Art
53
+ * and has no Structure to shoot.
54
+ */
55
+ export declare const BARRIER_TIERS: {
56
+ readonly fragile: {
57
+ readonly structure: 1;
58
+ readonly armor: 2;
59
+ };
60
+ readonly reinforced: {
61
+ readonly structure: 8;
62
+ readonly armor: 12;
63
+ };
64
+ readonly heavy: {
65
+ readonly structure: 12;
66
+ readonly armor: 20;
67
+ };
68
+ };
69
+ export declare function barrierDefaultsFor(kind: DeviceKind, footprint?: 'small' | 'medium' | 'large'): {
70
+ structure: number;
71
+ armor: number;
72
+ };
73
+ /** A seed's rating, kept to the range the book uses (1-12, the same
74
+ * clamp as Host.clampRating) so a typo cannot make a lock impossible
75
+ * or free. */
76
+ export declare function clampDeviceRating(rating: number): number;
41
77
  /**
42
78
  * A DEVICE: a thing in a room that is shut and can be opened.
43
79
  *
@@ -98,8 +134,43 @@ export declare class Device {
98
134
  */
99
135
  rating: number;
100
136
  wireless: boolean;
137
+ /**
138
+ * WHAT IT IS MADE OF (p.197-198): Structure is the condition monitor
139
+ * shooting it fills, Armor is what it soaks with. Reaching Structure
140
+ * makes a hole big enough to be a way through -- the barrier opens,
141
+ * with the same finality as a bricked deck. utilities/barrier-combat.ts
142
+ * is the only writer.
143
+ */
144
+ readonly structure: number;
145
+ readonly armor: number;
146
+ private _barrierDamage;
147
+ /**
148
+ * THE LOCKSMITH EXTENDED TEST IN PROGRESS (p.48, p.359-360): picking a
149
+ * maglock by hand accumulates hits toward Rating x 2 across attempts,
150
+ * one die fewer each time. Every `pick` is one interval of the same
151
+ * test, so the running total lives on the lock. One worker at a time:
152
+ * a different actor starting over resets it. Cleared when the device
153
+ * opens. Session-only -- a lock half-picked when you quit is a lock.
154
+ */
155
+ private _pickProgress?;
101
156
  constructor(config: IDeviceConfig);
102
157
  isOpen(): boolean;
158
+ /** The running test for this actor -- fresh when nobody, or somebody else, was working it. */
159
+ pickProgressFor(actorName: string): {
160
+ actorName: string;
161
+ hits: number;
162
+ attempts: number;
163
+ };
164
+ resetPickProgress(): void;
165
+ /** The hits a hand-pick needs in total: Rating x 2 (p.359-360). */
166
+ get pickThreshold(): number;
167
+ get barrierDamage(): number;
168
+ /** Boxes actually taken; a ward has nothing to fill. */
169
+ takeBarrierDamage(boxes: number): number;
170
+ /** Damage has reached Structure: there is a hole where the barrier was. */
171
+ get isHoled(): boolean;
172
+ /** "Structure 8 / Armor 12, 3/8" -- the panel's line. */
173
+ barrierSummary(): string;
103
174
  /**
104
175
  * IS THERE AN ICON HERE TO FIND? Wireless mode on, and a rating that
105
176
  * means it is electronics at all.
@@ -175,5 +246,6 @@ export declare class Device {
175
246
  /** Persistence-only: one flag in, nothing out. */
176
247
  restoreState(state: {
177
248
  open: boolean;
249
+ damage?: number;
178
250
  }): void;
179
251
  }
@@ -16,6 +16,32 @@ export const DEFAULT_DEVICE_RATING = {
16
16
  lock: 2,
17
17
  panel: 2,
18
18
  };
19
+ /**
20
+ * THE BOOK'S BARRIER TIERS (p.197 Barrier Ratings, RAG-checked 2026-09-03):
21
+ * Structure / Armor. Fragile is standard glass; Reinforced is a security
22
+ * door, armored glass, Kevlar wallboard; Heavy is concrete or a metal
23
+ * beam. A device seed that says neither gets Reinforced -- the ordinary
24
+ * locked door -- or Heavy when its footprint is large. A ward is the Art
25
+ * and has no Structure to shoot.
26
+ */
27
+ export const BARRIER_TIERS = {
28
+ fragile: { structure: 1, armor: 2 },
29
+ reinforced: { structure: 8, armor: 12 },
30
+ heavy: { structure: 12, armor: 20 },
31
+ };
32
+ export function barrierDefaultsFor(kind, footprint) {
33
+ if (kind === 'ward')
34
+ return { structure: 0, armor: 0 };
35
+ return footprint === 'large' ? BARRIER_TIERS.heavy : BARRIER_TIERS.reinforced;
36
+ }
37
+ /** A seed's rating, kept to the range the book uses (1-12, the same
38
+ * clamp as Host.clampRating) so a typo cannot make a lock impossible
39
+ * or free. */
40
+ export function clampDeviceRating(rating) {
41
+ if (!Number.isFinite(rating))
42
+ return 1;
43
+ return Math.max(1, Math.min(12, Math.floor(rating)));
44
+ }
19
45
  /**
20
46
  * A DEVICE: a thing in a room that is shut and can be opened.
21
47
  *
@@ -76,6 +102,25 @@ export class Device {
76
102
  */
77
103
  rating;
78
104
  wireless;
105
+ /**
106
+ * WHAT IT IS MADE OF (p.197-198): Structure is the condition monitor
107
+ * shooting it fills, Armor is what it soaks with. Reaching Structure
108
+ * makes a hole big enough to be a way through -- the barrier opens,
109
+ * with the same finality as a bricked deck. utilities/barrier-combat.ts
110
+ * is the only writer.
111
+ */
112
+ structure;
113
+ armor;
114
+ _barrierDamage = 0;
115
+ /**
116
+ * THE LOCKSMITH EXTENDED TEST IN PROGRESS (p.48, p.359-360): picking a
117
+ * maglock by hand accumulates hits toward Rating x 2 across attempts,
118
+ * one die fewer each time. Every `pick` is one interval of the same
119
+ * test, so the running total lives on the lock. One worker at a time:
120
+ * a different actor starting over resets it. Cleared when the device
121
+ * opens. Session-only -- a lock half-picked when you quit is a lock.
122
+ */
123
+ _pickProgress;
79
124
  constructor(config) {
80
125
  this.kind = config.kind;
81
126
  this.name = config.name;
@@ -89,7 +134,10 @@ export class Device {
89
134
  this.opensExit = config.opensExit;
90
135
  this.openMessage = config.openMessage || 'It opens.';
91
136
  this.refuseMessage = config.refuseMessage || `Nothing happens.`;
92
- this.rating = config.rating ?? DEFAULT_DEVICE_RATING[config.kind] ?? 0;
137
+ this.rating = config.rating !== undefined ? clampDeviceRating(config.rating) : DEFAULT_DEVICE_RATING[config.kind] ?? 0;
138
+ const tier = barrierDefaultsFor(config.kind, config.footprint);
139
+ this.structure = config.kind === 'ward' ? 0 : Math.max(0, Math.floor(config.structure ?? tier.structure));
140
+ this.armor = config.kind === 'ward' ? 0 : Math.max(0, Math.floor(config.armor ?? tier.armor));
93
141
  // A ward has no wireless mode to be in. Everything else defaults ON,
94
142
  // because a seeded keypad nobody thought about is a keypad on the
95
143
  // grid -- which is the state the report says the game should model.
@@ -98,6 +146,43 @@ export class Device {
98
146
  isOpen() {
99
147
  return this.open;
100
148
  }
149
+ // ---- The Extended Test (pick.ts) ----
150
+ /** The running test for this actor -- fresh when nobody, or somebody else, was working it. */
151
+ pickProgressFor(actorName) {
152
+ if (!this._pickProgress || this._pickProgress.actorName !== actorName) {
153
+ this._pickProgress = { actorName, hits: 0, attempts: 0 };
154
+ }
155
+ return this._pickProgress;
156
+ }
157
+ resetPickProgress() {
158
+ this._pickProgress = undefined;
159
+ }
160
+ /** The hits a hand-pick needs in total: Rating x 2 (p.359-360). */
161
+ get pickThreshold() {
162
+ return this.rating * 2;
163
+ }
164
+ // ---- The barrier (utilities/barrier-combat.ts) ----
165
+ get barrierDamage() {
166
+ return this._barrierDamage;
167
+ }
168
+ /** Boxes actually taken; a ward has nothing to fill. */
169
+ takeBarrierDamage(boxes) {
170
+ if (this.structure <= 0)
171
+ return 0;
172
+ const taken = Math.max(0, Math.floor(boxes));
173
+ this._barrierDamage = Math.min(this.structure, this._barrierDamage + taken);
174
+ return taken;
175
+ }
176
+ /** Damage has reached Structure: there is a hole where the barrier was. */
177
+ get isHoled() {
178
+ return this.structure > 0 && this._barrierDamage >= this.structure;
179
+ }
180
+ /** "Structure 8 / Armor 12, 3/8" -- the panel's line. */
181
+ barrierSummary() {
182
+ if (this.structure <= 0)
183
+ return '';
184
+ return `Structure ${this.structure} / Armor ${this.armor}${this._barrierDamage > 0 ? `, ${this._barrierDamage}/${this.structure} boxes` : ''}`;
185
+ }
101
186
  /**
102
187
  * IS THERE AN ICON HERE TO FIND? Wireless mode on, and a rating that
103
188
  * means it is electronics at all.
@@ -207,6 +292,7 @@ export class Device {
207
292
  force(succeeded) {
208
293
  if (succeeded) {
209
294
  this.open = true;
295
+ this._pickProgress = undefined;
210
296
  return { success: true, message: this.openMessage, alarmed: false };
211
297
  }
212
298
  return { success: false, message: AFFORDANCE_FLAVOR[this.kind].failureMessage, alarmed: true };
@@ -231,6 +317,8 @@ export class Device {
231
317
  /** Persistence-only: one flag in, nothing out. */
232
318
  restoreState(state) {
233
319
  this.open = state.open;
320
+ if (state.damage !== undefined)
321
+ this._barrierDamage = Math.max(0, Math.min(this.structure, Math.floor(state.damage)));
234
322
  }
235
323
  }
236
324
  //# sourceMappingURL=device.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/models/device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/models/device.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
1
  import { Size, Category, Rating } from '../types/shared/item-enum.js';
2
+ import type { ICatalogItem, ICatalogEffect, ICatalogAmmo, ICatalogVehicle, WeaponSkill, WeaponRange, MountPoint, ModKind } from '../utilities/catalog-data.js';
2
3
  import { AbstractItem } from '../types/shared/abstracts.js';
4
+ /**
5
+ * What a running program adds to a Matrix attribute, from its catalog
6
+ * row's effects (v13). The program's key is the deck's word for it
7
+ * (utilities/programs.ts); the row is found by the program's name.
8
+ * PROGRAM_ATTR_MODS stands in when no row is loaded.
9
+ */
10
+ export declare function programMatrixMod(key: string, attr: 'attack' | 'sleaze' | 'dataProcessing' | 'firewall' | 'damage'): number;
3
11
  export interface IItemConstructorConfig {
4
12
  name: string;
5
13
  description: string;
@@ -113,12 +121,24 @@ export declare class Item extends AbstractItem {
113
121
  /**
114
122
  * STUN BY NATURE (SR5 p.170-171, p.424, RAG-checked 2026-09-02):
115
123
  * electricity damage is Stun, so a taser, a stun baton or shock gloves
116
- * never deal Physical.
124
+ * never deal Physical. THE ROW SAYS SO (catalog v13: weapon.damageType
125
+ * / weapon.electric); the name regex is the fallback for generated gear.
117
126
  */
118
127
  isStunWeapon(): boolean;
119
128
  /**
120
- * STUN BY AMMUNITION (p.434): gel rounds deal Stun at AP +1; stick-n-shock
121
- * deal electric Stun at DV -2, AP -5. Anything else is Physical.
129
+ * WHAT THE LOADED ROUND DOES TO THE LINE (p.433-434): the ammunition
130
+ * row's block -- gel Stun at AP +1, stick-n-shock electric Stun at DV
131
+ * -2 / AP -5, APDS AP -4, explosive DV +1 / AP -1, flechette DV +2 /
132
+ * AP +5. Regular rounds shift nothing. Generated ammunition with no
133
+ * row keeps the two Stun names the engine always knew.
134
+ */
135
+ loadedAmmoMods(): (ICatalogAmmo & {
136
+ kind: string;
137
+ }) | undefined;
138
+ /**
139
+ * STUN BY AMMUNITION (p.434): the loaded round's block when it deals
140
+ * Stun. Kept as the pre-v13 shape for its callers (combat-exchange,
141
+ * the non-lethal tests): gel or stick-n-shock, with the DV/AP shift.
122
142
  */
123
143
  stunAmmo(): {
124
144
  kind: 'gel' | 'stick-n-shock';
@@ -131,6 +151,13 @@ export declare class Item extends AbstractItem {
131
151
  set owner(owner: string | undefined);
132
152
  get id(): string;
133
153
  get transferable(): boolean;
154
+ /**
155
+ * "Nothing special happens" is honest for most props, but confusing for
156
+ * gear whose NAME implies a specific action that lives at a different
157
+ * verb -- a Lockpick Set at a pickable door (user, 2026-09-03). The
158
+ * row's `useHint` (catalog v13) names that verb; absent it, the generic
159
+ * line stands, which is correct for gear that really has nothing to say.
160
+ */
134
161
  use(): string;
135
162
  /**
136
163
  * How much this item's quality tier is worth in game mechanics: extra
@@ -140,11 +167,33 @@ export declare class Item extends AbstractItem {
140
167
  * that gear feeds scales off this one number.
141
168
  */
142
169
  get qualityBonus(): number;
170
+ /** The catalog row, by exact slug or name (strict: catalogRowFor). */
171
+ get row(): ICatalogItem | undefined;
172
+ /** The SR5 Rating / Force / Capacity this thing carries: the row's, or
173
+ * the "(Rating N)" its name prints. Undefined for an unrated thing. */
174
+ get ratingValue(): number | undefined;
143
175
  private get weaponHay();
144
- /** Base ranged DV before quality (RAW: holdout 6P ... assault 11P, compressed). */
176
+ /** The p.185 range class: the row's, else read off the name (utilities/range.ts guessRangeClass). */
177
+ get rangeClass(): WeaponRange;
178
+ /** The skill this weapon is used with: the row's, else the class's. */
179
+ get weaponSkill(): WeaponSkill;
180
+ /**
181
+ * THE DV, the book's flat part (p.421-431): 8 for the Predator's "8P",
182
+ * 2 for a knife's "(STR+2)P" -- the Strength half is the wielder's and
183
+ * Player.getWeaponProfile adds it (dvAttribute says whether to). The
184
+ * fallback is the CLASS row of the same tables, un-compressed.
185
+ */
186
+ get weaponDv(): number;
187
+ /** Which attribute the DV rides on: melee is (STR + dv) unless the row says otherwise. */
188
+ get dvAttribute(): 'strength' | undefined;
189
+ /** Physical or Stun, before ammunition and stance have their say. */
190
+ get damageType(): 'P' | 'S';
191
+ /** @deprecated v13 -- the DV is weaponDv; kept one release for its readers. */
145
192
  get rangedBase(): number;
146
- /** Base melee DV before STR/quality (RAW: knife STR+2, sword/katana/club STR+3). */
193
+ /** @deprecated v13 -- the DV is weaponDv; kept one release for its readers. */
147
194
  get meleeBase(): number;
195
+ /** Reach (p.421-423): the row's, else none. */
196
+ get reach(): number;
148
197
  /**
149
198
  * ACCURACY -- the LIMIT on an attack made with this weapon (p.46-47,
150
199
  * p.168: "Each weapon has an Accuracy rating that serves as its limit
@@ -152,60 +201,100 @@ export declare class Item extends AbstractItem {
152
201
  * inherent one, higher or lower (p.46-47), so this is not a floor or a
153
202
  * cap on the Physical limit -- it is the limit.
154
203
  *
155
- * NOT COMPRESSED, unlike the DV values above. Damage was squeezed to
156
- * engine scale because it is measured against soak dice this engine
157
- * also scales; a limit is measured against HITS, which are the book's
158
- * own units, and the Matrix brackets next door already spend the raw
159
- * attribute ("whole, never halved"). Compressing here would make a
160
- * sniper rifle and a holdout cap at the same place.
161
- *
162
- * The numbers are the book's tables (p.421-431), read through the same
163
- * duck-typing school as rangedBase/armorPen so generated gear works
164
- * unmodified. Class-based rather than per-weapon ON PURPOSE: the RAG
165
- * could not produce standard-table rows for every gun this game ships
166
- * (the shotgun table did not come back, and the one AK-97 figure it
167
- * did return was off a Run Faster character sheet -- a MODIFIED
168
- * weapon, not the table), so a per-weapon list would have meant
169
- * inventing the gaps. Every value below is one the book gave up.
170
- *
171
- * THIS IS THE BARE NUMBER, NOT THE PARENTHETICAL, and that is now a
172
- * division of labour rather than a gap. Tables write "Acc 5 (7)": the
173
- * 5 is the gun, and the 7 is the gun PLUS a shooter who owns a
174
- * smartlink (p.433, +2 Accuracy with a smartgun system). A gun sitting
175
- * on a table has no idea who will pick it up, so the pairing is asked
176
- * of the shooter -- see Player.smartlinkAccuracyBonus, which supplies
177
- * the +2 in getAttackLimit. fxPHSuE4nrH3gAGiy.
204
+ * THIS IS THE BARE NUMBER, NOT THE PARENTHETICAL. Tables write "Acc 5
205
+ * (7)": the 5 is the gun, and the 7 is the gun PLUS a shooter who owns
206
+ * a smartlink (p.433, +2 Accuracy with a smartgun system) -- see
207
+ * Player.smartlinkAccuracyBonus, which supplies the +2 in
208
+ * getAttackLimit. A laser sight's +1 rides the same way (fitted mods,
209
+ * Player.gearLimit), and never stacks with the smartlink (p.432).
178
210
  *
179
- * The laser-sight parenthetical (p.429 Enfield, "4 (5) with the
180
- * built-in laser sight") is a DIFFERENT accessory and is still not
181
- * modelled: the engine has no sight-fitting model, and inventing one
182
- * to reuse the smartlink pairing would be guessing at a second rule.
211
+ * 0 means "no Accuracy of its own": the table's own word 'physical'
212
+ * (shock gloves, throwing knives, grenades) and everything that is not
213
+ * a weapon. Callers fall back to the Physical limit, which is what an
214
+ * improvised or bare-handed attack uses (p.168).
183
215
  *
184
- * Note the wireless smartgun bonus is a DICE POOL bonus (+1/+2,
185
- * p.433), NOT an Accuracy bonus -- getAttackPool already spends it as
186
- * dice. Keeping those apart is the same discipline as the Matrix
187
- * brackets: a limit is never a die, and a die is never a limit.
216
+ * The fallback ladder is the book's class values, read through the
217
+ * same duck-typing school as the DV so generated gear works.
188
218
  */
189
219
  get accuracy(): number;
190
220
  /**
191
- * Armor penetration (<= 0): how much of the defender's ARMOR the hit
192
- * ignores (RAW AP, compressed ~2:3 -- knife/katana -3 -> -2, heavy
193
- * pistol -1 -> -1). Applied against armor dice only, never Body
194
- * (combat-exchange.ts).
221
+ * Armor penetration: how much the hit shifts the defender's ARMOR
222
+ * (p.169) -- negative eats it, a "+" (gel, flechette) adds to it. The
223
+ * row's AP, else the class value from the same tables, un-compressed.
195
224
  */
196
225
  get armorPen(): number;
197
- /** Heavier armor classes soak harder (RAW: jacket 12 vs clothing 6). */
226
+ /** Heavier armor classes soak harder (RAW: jacket 12 vs clothing 6). Fallback only. */
198
227
  get isHeavyArmor(): boolean;
228
+ /**
229
+ * THE ARMOR RATING of a worn piece (p.436-437): the row's, else the
230
+ * class value -- jacket-class 12, a vest 9, armor clothing 6, plain
231
+ * clothing 0. Only the highest worn piece counts (Player.armorBreakdown).
232
+ */
233
+ get armorValue(): number;
234
+ /** A "+" accessory's bonus (helmet +2, shield +6, p.437-438): the row's, else the class value. */
235
+ get armorBonus(): number;
236
+ /**
237
+ * WHAT THIS THING DOES, in the engine's vocabulary: the row's effects
238
+ * plus everything fitted into it (a smartlink in the goggles, a laser
239
+ * sight on the gun). A fitted mod's effects apply whenever the host
240
+ * does, so they are re-tagged with the host's own `when`.
241
+ */
242
+ get effects(): ICatalogEffect[];
243
+ /** When a row's effects apply by default: worn for a wearable, held for a weapon, carried otherwise. */
244
+ get defaultWhen(): 'worn' | 'held' | 'carried';
245
+ /** A flag the row (or a fitted mod) grants, by key; its value, or 0. */
246
+ capability(key: string): number;
247
+ hasCapability(key: string): boolean;
248
+ fitted: Item[];
249
+ /** Capacity this thing offers to mods. */
250
+ get capacity(): number;
251
+ /** What kinds of mod it holds. */
252
+ get holds(): ModKind[];
253
+ get capacityUsed(): number;
254
+ /** The accessory seats a gun has: the row's, else the class rule (p.432). */
255
+ get mounts(): MountPoint[];
256
+ /** Accessories the factory fitted (identifiers, see ICatalogWeapon.builtIn). */
257
+ get builtIn(): string[];
258
+ hasBuiltIn(id: string): boolean;
259
+ /**
260
+ * A SMARTGUN (p.433): a smartgun system built in or fitted. Before v13
261
+ * every firearm in the engine counted as one; canon makes it an
262
+ * accessory. Generated gear with no row is a smartgun only when it
263
+ * says so.
264
+ */
265
+ get isSmartgun(): boolean;
266
+ /** Which mount a fitted accessory sits in: the first of its mounts still free when it was fitted. */
267
+ mountOf(mod: Item): MountPoint | undefined;
268
+ /**
269
+ * Why a mod will not fit, or null when it will. The message is the
270
+ * player's line, so it names the rule that refused.
271
+ */
272
+ fitRefusal(mod: Item): string | null;
273
+ /** Fits a mod; the refusal line, or null when it went in. */
274
+ fit(mod: Item): string | null;
275
+ /** Takes a mod back out; false when it was not there. */
276
+ unfit(mod: Item): boolean;
277
+ /** The drone's stat block, when it has one. */
278
+ get vehicle(): ICatalogVehicle | undefined;
279
+ /** Pilot rating (p.199): the row's, else the price-tier fallback the engine always used. */
280
+ get pilotRating(): number;
281
+ /** A drone's hull armor (p.199): the row's, else the tier fallback. */
282
+ get droneArmor(): number;
283
+ /** A drone's Body (p.199): the row's, else the tier fallback. */
284
+ get droneBody(): number;
285
+ /** Does the drone carry a weapon mount: the row's, else the name says. */
286
+ get hasWeaponMount(): boolean;
199
287
  private _deckDamage;
200
288
  isCyberdeck(): boolean;
201
- /** Better decks have more board to burn through: 8 + 2 per quality step. */
289
+ /** The Matrix condition monitor (p.228): 8 + (Device Rating / 2), rounded up. */
202
290
  get maxDeckBoxes(): number;
203
291
  get deckDamage(): number;
204
- /** p.227: Summit 1, Chariot 2, Tsurugi 3, Cyber-5 5 (Excalibur-class 6). */
292
+ /** Device Rating, NUMERIC (catalog v13): the row's, else the tier ladder
293
+ * (p.227: Summit 1, Chariot 2, Tsurugi 3, Cyber-5 5, Excalibur-class 6). */
205
294
  get deviceRating(): number;
206
- /** The p.227 attribute array (highest first), by Device Rating. */
295
+ /** The p.227 attribute array (highest first): the row's four numbers, else by Device Rating. */
207
296
  get deckArray(): number[];
208
- /** How many programs run at once (p.227; storage is unlimited). */
297
+ /** How many programs run at once (p.227; storage is unlimited): the row's, else the Device Rating. */
209
298
  get programSlots(): number;
210
299
  private _deckOrder;
211
300
  get deckOrder(): number[];