@maka/maka-cli 5.91.0 → 5.93.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 (92) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js +9 -9
  3. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -1
  4. package/bundle/typescript/src/commands/game/sideQuest/augmentations.d.ts +54 -3
  5. package/bundle/typescript/src/commands/game/sideQuest/augmentations.js +987 -53
  6. package/bundle/typescript/src/commands/game/sideQuest/augmentations.js.map +1 -1
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.d.ts +0 -14
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js +22 -0
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js +14 -1
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js.map +1 -1
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +5 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +7 -55
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -1
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/companions.js +5 -1
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/companions.js.map +1 -1
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +10 -1
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.js +8 -1
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.js.map +1 -1
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js +3 -0
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js.map +1 -1
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/move.js +13 -7
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/move.js.map +1 -1
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/project.js +12 -0
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/project.js.map +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/reload.js +1 -1
  29. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +7 -2
  30. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -1
  31. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +3 -3
  32. package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
  33. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +69 -1
  34. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
  35. package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.d.ts +1 -1
  36. package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.js +90 -16
  37. package/bundle/typescript/src/commands/game/sideQuest/factories/chargen-factory.js.map +1 -1
  38. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +26 -3
  39. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
  40. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +95 -3
  41. package/bundle/typescript/src/commands/game/sideQuest/game.js +191 -13
  42. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  43. package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js +5 -1
  44. package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js.map +1 -1
  45. package/bundle/typescript/src/commands/game/sideQuest/models/inventory.d.ts +13 -0
  46. package/bundle/typescript/src/commands/game/sideQuest/models/inventory.js +45 -2
  47. package/bundle/typescript/src/commands/game/sideQuest/models/inventory.js.map +1 -1
  48. package/bundle/typescript/src/commands/game/sideQuest/models/item.d.ts +65 -1
  49. package/bundle/typescript/src/commands/game/sideQuest/models/item.js +83 -1
  50. package/bundle/typescript/src/commands/game/sideQuest/models/item.js.map +1 -1
  51. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +126 -4
  52. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +148 -15
  53. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  54. package/bundle/typescript/src/commands/game/sideQuest/qualities.d.ts +33 -1
  55. package/bundle/typescript/src/commands/game/sideQuest/qualities.js +12 -2
  56. package/bundle/typescript/src/commands/game/sideQuest/qualities.js.map +1 -1
  57. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +1 -1
  58. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +4 -4
  59. package/bundle/typescript/src/commands/game/sideQuest/skill-groups.d.ts +120 -0
  60. package/bundle/typescript/src/commands/game/sideQuest/skill-groups.js +135 -0
  61. package/bundle/typescript/src/commands/game/sideQuest/skill-groups.js.map +1 -0
  62. package/bundle/typescript/src/commands/game/sideQuest/spells.d.ts +64 -0
  63. package/bundle/typescript/src/commands/game/sideQuest/spells.js +68 -0
  64. package/bundle/typescript/src/commands/game/sideQuest/spells.js.map +1 -0
  65. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +25 -2
  66. package/bundle/typescript/src/commands/game/sideQuest/ui.js +14 -0
  67. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  68. package/bundle/typescript/src/commands/game/sideQuest/utilities/alarmed-staff.d.ts +116 -0
  69. package/bundle/typescript/src/commands/game/sideQuest/utilities/alarmed-staff.js +127 -0
  70. package/bundle/typescript/src/commands/game/sideQuest/utilities/alarmed-staff.js.map +1 -0
  71. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.d.ts +1 -1
  72. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.js +123 -2
  73. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog-data.js.map +1 -1
  74. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.d.ts +131 -2
  75. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js +170 -12
  76. package/bundle/typescript/src/commands/game/sideQuest/utilities/catalog.js.map +1 -1
  77. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.d.ts +139 -1
  78. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js +307 -5
  79. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js.map +1 -1
  80. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.d.ts +38 -0
  81. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +106 -0
  82. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -1
  83. package/bundle/typescript/src/commands/game/sideQuest/utilities/session-lock.js +19 -3
  84. package/bundle/typescript/src/commands/game/sideQuest/utilities/session-lock.js.map +1 -1
  85. package/bundle/typescript/src/commands/game/sideQuest/utilities/sin.js +1 -1
  86. package/bundle/typescript/src/commands/game/sideQuest/utilities/sin.js.map +1 -1
  87. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.d.ts +22 -0
  88. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.js +27 -0
  89. package/bundle/typescript/src/commands/game/sideQuest/utilities/web-character-generator.js.map +1 -1
  90. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +63 -30
  91. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  92. package/package.json +1 -1
@@ -1,3 +1,43 @@
1
+ /**
2
+ * Cyberware and bioware -- the SR5e augmentation catalog, full-essence
3
+ * flavor: everyone starts at Essence 6.0, every piece of 'ware burns some
4
+ * away permanently, and the Awakened pay in power (each full point of
5
+ * essence lost -- rounded UP, as the book demands -- burns a point of
6
+ * Magic or Resonance; see Player.installAug). Installation is SURGERY: it
7
+ * happens at a street clinic for nuyen (commands/install.ts), which makes
8
+ * chrome the game's first real money sink.
9
+ *
10
+ * CATALOG POLICY, CHANGED 2026-08-31 BY THE PROJECT OWNER. It used to
11
+ * read "every entry here changes real dice -- no flavor-only chrome",
12
+ * and that rule is why whole chapters of the books were unbuildable
13
+ * here: a smuggling compartment, a cyberlimb, most of Chrome Flesh's
14
+ * exotic 'ware. The owner's ruling is that those may be OWNED and BOUGHT
15
+ * like vehicles are, so long as the catalog never implies dice it does
16
+ * not deliver.
17
+ *
18
+ * SO THERE ARE TWO KINDS OF ENTRY NOW, and the difference is visible
19
+ * rather than inferred:
20
+ * - MECHANICAL: carries `bonuses`, moves real dice through
21
+ * Player.augBonus and the pool getters that read it.
22
+ * - LISTING: carries no `bonuses`, and its `effect` line OPENS with
23
+ * COSMETIC_PREFIX below. You can buy it, install it, pay essence for
24
+ * it and see it on your sheet; it rolls nothing.
25
+ *
26
+ * THE LABEL RIDES `effect` ON PURPOSE. That string is what the sheet and
27
+ * the clinic menu already print, so the marker cannot be shown in one
28
+ * surface and missed in another -- and IAugmentation's shape is co-owned
29
+ * with the web chargen's loader, so a new field would be a contract
30
+ * change for a convention a string carries perfectly well. The pairing
31
+ * is enforced by a test, not by discipline: an entry with no bonuses and
32
+ * no marker fails, and so does a marked entry that secretly grants dice.
33
+ *
34
+ * A LISTING IS NOT A PLACEHOLDER FOR A HOOK NOBODY WROTE. Where the book
35
+ * gives an effect this engine COULD express, it is still wired -- the
36
+ * ruling widened what may be catalogued, not what may be left vague.
37
+ */
38
+ /** Opens the `effect` of every entry that grants no dice. Read by the
39
+ * sheet, the clinic and the test that keeps the two kinds honest. */
40
+ export const COSMETIC_PREFIX = 'cosmetic -- no mechanical effect yet:';
1
41
  export const AUGMENTATIONS = [
2
42
  {
3
43
  key: 'datajack',
@@ -21,6 +61,69 @@ export const AUGMENTATIONS = [
21
61
  bonuses: { firearms: 2 },
22
62
  page: 'p.454', avail: 8, legality: 'R', canonCost: 4000,
23
63
  },
64
+ // VISION ENHANCEMENT, p.454 eyeware, Rating 1-3. Two sources agree
65
+ // and neither was taken on the other's word: the eyeware table gives
66
+ // 0.1 Essence flat, [Rating] Capacity, Rating x 3 availability and
67
+ // Rating x 4,000 nuyen; the rules text gives the effect -- "adds its
68
+ // Rating as a dice pool modifier to your visual Perception Tests".
69
+ //
70
+ // TWO TABLES PRICE THIS THING and taking the wrong one misprices the
71
+ // implant. p.444 sells vision enhancement as an ACCESSORY for glasses
72
+ // and goggles at (Rating x 500) nuyen; p.454 sells the implanted
73
+ // version at Rating x 4,000. The catalog is augmentations, so the
74
+ // eyeware row is the one that applies -- the accessory is eight times
75
+ // cheaper and is not surgery.
76
+ //
77
+ // THE LIMIT HALF IS NOT MODELLED, and is named rather than dropped:
78
+ // canon also adds the Rating to the LIMIT on visual Perception tests.
79
+ // IAugmentation.bonuses carries pool dice and nothing else, and its
80
+ // shape is co-owned with the web chargen -- a limit field would be a
81
+ // contract change for one family. perceptionTest does compute a
82
+ // mental limit, so the hook exists if the shape ever opens.
83
+ //
84
+ // AUDIO ENHANCEMENT IS ITS TWIN AND IS DELIBERATELY ABSENT. The p.454
85
+ // earware table gives it the identical row and the identical effect
86
+ // one sense over. This engine has ONE perception pool and cannot tell
87
+ // sight from hearing, so shipping both would hand a runner +6 dice on
88
+ // every perception test where canon gives +3 to seeing and +3 to
89
+ // hearing. Sight is the sense the engine actually models -- spotting
90
+ // cover, reading a room, wouldNotice -- so sight is what ships.
91
+ {
92
+ key: 'vision-enhancement-1',
93
+ name: 'Vision Enhancement I',
94
+ kind: 'cyberware',
95
+ essence: 0.1,
96
+ cost: 4000,
97
+ effect: '+1 die on perception (the image sharpens a shade past what eyes do)',
98
+ wakeLine: 'Edges come back harder than you remember them. The far wall has a texture now.',
99
+ excludes: ['vision-enhancement-2', 'vision-enhancement-3'],
100
+ bonuses: { perception: 1 },
101
+ page: 'p.454', avail: 3, canonCost: 4000,
102
+ },
103
+ {
104
+ key: 'vision-enhancement-2',
105
+ name: 'Vision Enhancement II',
106
+ kind: 'cyberware',
107
+ essence: 0.1,
108
+ cost: 8000,
109
+ effect: '+2 dice on perception (the image sharpens a shade past what eyes do)',
110
+ wakeLine: 'You read a licence plate across the lot and only afterwards wonder how.',
111
+ excludes: ['vision-enhancement-1', 'vision-enhancement-3'],
112
+ bonuses: { perception: 2 },
113
+ page: 'p.454', avail: 6, canonCost: 8000,
114
+ },
115
+ {
116
+ key: 'vision-enhancement-3',
117
+ name: 'Vision Enhancement III',
118
+ kind: 'cyberware',
119
+ essence: 0.1,
120
+ cost: 12000,
121
+ effect: '+3 dice on perception (the image sharpens a shade past what eyes do)',
122
+ wakeLine: 'Nothing in the room is vague any more. It is restful and it is not restful at all.',
123
+ excludes: ['vision-enhancement-1', 'vision-enhancement-2'],
124
+ bonuses: { perception: 3 },
125
+ page: 'p.454', avail: 9, canonCost: 12000,
126
+ },
24
127
  {
25
128
  key: 'cybereyes',
26
129
  name: 'Cybereyes',
@@ -42,28 +145,7 @@ export const AUGMENTATIONS = [
42
145
  wakeLine: 'Everything aches at the marrow. You knock a knuckle on the table and dent it.',
43
146
  bonuses: { soak: 1, 'unarmed-damage': 2 },
44
147
  page: 'p.455', avail: 12, legality: 'R', canonCost: 18000,
45
- },
46
- {
47
- key: 'dermal-plating',
48
- name: 'Dermal Plating',
49
- kind: 'cyberware',
50
- essence: 1.5,
51
- cost: 7000,
52
- effect: '+2 soak (armor that never comes off)',
53
- wakeLine: 'Your skin sits heavier, ridged under the surface like something geological.',
54
- bonuses: { soak: 2 },
55
- page: 'p.456', avail: 12, legality: 'R', canonCost: 9000,
56
- },
57
- {
58
- key: 'muscle-toner',
59
- name: 'Muscle Toner',
60
- kind: 'bioware',
61
- essence: 0.8,
62
- cost: 9000,
63
- effect: '+1 die on every meat-plane attack (vat-grown fast-twitch fiber)',
64
- wakeLine: 'Your hands move a half-beat before you finish deciding to move them.',
65
- bonuses: { attack: 1 },
66
- page: 'p.460', avail: 20, legality: 'R', canonCost: 128000,
148
+ excludes: ['bone-density-1', 'bone-density-2', 'bone-density-3', 'bone-density-4'],
67
149
  },
68
150
  {
69
151
  key: 'pain-editor',
@@ -75,17 +157,6 @@ export const AUGMENTATIONS = [
75
157
  wakeLine: 'The incision should hurt. It reads instead like a report about someone else.',
76
158
  page: 'p.461', avail: 18, legality: 'F', canonCost: 48000,
77
159
  },
78
- {
79
- key: 'control-rig',
80
- name: 'Control Rig',
81
- kind: 'cyberware',
82
- essence: 1.0,
83
- cost: 12000,
84
- effect: '+2 dice piloting drones (the machine becomes a limb)',
85
- wakeLine: 'Somewhere in your skull a new sense is waiting for wings to wear.',
86
- bonuses: { piloting: 2 },
87
- page: 'p.456', avail: 5, legality: 'R', canonCost: 43000,
88
- },
89
160
  {
90
161
  key: 'wired-reflexes-1',
91
162
  name: 'Wired Reflexes I',
@@ -156,6 +227,47 @@ export const AUGMENTATIONS = [
156
227
  page: 'p.453', avail: 10, canonCost: 24000,
157
228
  },
158
229
  // ---- Speed and strength (p.456, p.460) ----
230
+ // REACTION ENHANCERS, p.456, the full canon range. The table is a
231
+ // formula -- Rating x 0.3 Essence, (Rating x 5)R, Rating x 13,000
232
+ // nuyen -- and the shipped Rating 2 matched it on every column, which
233
+ // is what made the other two safe to derive rather than invent.
234
+ //
235
+ // THE TIERS EXCLUDE EACH OTHER, and that is not decoration: augBonus
236
+ // SUMS every installed piece except the reflex family, so two tiers of
237
+ // one rated aug would stack into a bonus canon never grants. It could
238
+ // not happen while every family shipped exactly one tier; the moment a
239
+ // family is completed it can. bone-lacing-titanium already holds this
240
+ // line for a material scale (excludes: ['bone-lacing']).
241
+ //
242
+ // AND CANON'S OWN INCOMPATIBILITY, added to the shipped entry as well
243
+ // as the new ones: reaction enhancers are incompatible with all other
244
+ // enhancements to Reaction, wired reflexes included (p.456). The
245
+ // shipped Rating 2 has been installable alongside them since it
246
+ // landed, which is a canon defect this family's completion inherits.
247
+ {
248
+ key: 'reaction-enhancers-1',
249
+ name: 'Reaction Enhancers I',
250
+ kind: 'cyberware',
251
+ essence: 0.3,
252
+ cost: 4500,
253
+ effect: '+1 defense die (nerve boosters that answer before you do)',
254
+ wakeLine: 'A dropped cup is in your hand before you have finished flinching.',
255
+ bonuses: { defense: 1 },
256
+ excludes: ['reaction-enhancers-2', 'reaction-enhancers-3', 'wired-reflexes-1', 'wired-reflexes-2', 'wired-reflexes-3', 'synaptic-booster'],
257
+ page: 'p.456', avail: 5, legality: 'R', canonCost: 13000,
258
+ },
259
+ {
260
+ key: 'reaction-enhancers-3',
261
+ name: 'Reaction Enhancers III',
262
+ kind: 'cyberware',
263
+ essence: 0.9,
264
+ cost: 13500,
265
+ effect: '+3 defense dice (nerve boosters that answer before you do)',
266
+ wakeLine: 'The room fills with things that have not happened yet, and you are already leaning away from them.',
267
+ bonuses: { defense: 3 },
268
+ excludes: ['reaction-enhancers-1', 'reaction-enhancers-2', 'wired-reflexes-1', 'wired-reflexes-2', 'wired-reflexes-3', 'synaptic-booster'],
269
+ page: 'p.456', avail: 15, legality: 'R', canonCost: 39000,
270
+ },
159
271
  {
160
272
  key: 'reaction-enhancers-2',
161
273
  name: 'Reaction Enhancers II',
@@ -165,18 +277,44 @@ export const AUGMENTATIONS = [
165
277
  effect: '+2 defense dice (nerve boosters that answer before you do)',
166
278
  wakeLine: 'Someone tosses you a chip and your hand has it before your eyes find it.',
167
279
  bonuses: { defense: 2 },
280
+ excludes: ['reaction-enhancers-1', 'reaction-enhancers-3', 'wired-reflexes-1', 'wired-reflexes-2', 'wired-reflexes-3', 'synaptic-booster'],
168
281
  page: 'p.456', avail: 10, legality: 'R', canonCost: 26000,
169
282
  },
283
+ // SYNTHACARDIUM, bioware, Rating 1-3: Rating x 0.1 Essence,
284
+ // (Rating x 4) availability with no legality suffix, Rating x 30,000
285
+ // nuyen. The book's own words for the effect -- "adds its Rating as a
286
+ // dice pool bonus to your tests using skills in the Athletics skill
287
+ // group" -- which is exactly the shipped Rating 2's +2 athletics, so
288
+ // the family fills without touching what anybody already owns.
289
+ //
290
+ // THE RETRIEVAL COULD NOT PRODUCE THIS ROW. Asked in a family sweep
291
+ // it reported Synthacardium NOT FOUND, and #162 omitted the family on
292
+ // that basis. The book settles it, and the shipped Rating 2 matches
293
+ // the formula on all three columns -- which is what makes reading a
294
+ // badly-extracted table trustworthy rather than hopeful.
170
295
  {
171
- key: 'muscle-augmentation-2',
172
- name: 'Muscle Augmentation II',
296
+ key: 'synthacardium-1',
297
+ name: 'Synthacardium I',
173
298
  kind: 'bioware',
174
- essence: 0.4,
175
- cost: 11000,
176
- effect: '+1 die on meat-plane attacks, +2 on athletics (grown strength, not bolted-on)',
177
- wakeLine: 'Your arms sit heavier on the table, and the table complains first.',
178
- bonuses: { attack: 1, athletics: 2 },
179
- page: 'p.460', avail: 10, legality: 'R', canonCost: 62000,
299
+ essence: 0.1,
300
+ cost: 4000,
301
+ effect: '+1 die on athletics (a heart cultured for the long run)',
302
+ wakeLine: 'You climb the clinic stairs and notice, at the top, that you did not need to notice them.',
303
+ excludes: ['synthacardium-2', 'synthacardium-3'],
304
+ bonuses: { athletics: 1 },
305
+ page: 'p.460', avail: 4, canonCost: 30000,
306
+ },
307
+ {
308
+ key: 'synthacardium-3',
309
+ name: 'Synthacardium III',
310
+ kind: 'bioware',
311
+ essence: 0.3,
312
+ cost: 12000,
313
+ effect: '+3 dice on athletics (a heart cultured for the long run)',
314
+ wakeLine: 'Your pulse settles at a rate that would worry a doctor who did not know. You could run all night.',
315
+ excludes: ['synthacardium-1', 'synthacardium-2'],
316
+ bonuses: { athletics: 3 },
317
+ page: 'p.460', avail: 12, canonCost: 90000,
180
318
  },
181
319
  {
182
320
  key: 'synthacardium-2',
@@ -187,6 +325,7 @@ export const AUGMENTATIONS = [
187
325
  effect: '+2 dice on athletics (a heart cultured for the long run)',
188
326
  wakeLine: 'You take the clinic stairs two at a time and arrive without a breath out of place.',
189
327
  bonuses: { athletics: 2 },
328
+ excludes: ['synthacardium-1', 'synthacardium-3'],
190
329
  page: 'p.460', avail: 8, canonCost: 60000,
191
330
  },
192
331
  {
@@ -211,20 +350,9 @@ export const AUGMENTATIONS = [
211
350
  effect: '+3 unarmed damage, +2 soak (the expensive skeleton -- supersedes aluminum lacing)',
212
351
  wakeLine: 'You are heavier by the weight of a small engine, and everything you touch knows it.',
213
352
  bonuses: { soak: 2, 'unarmed-damage': 3 },
214
- excludes: ['bone-lacing'],
353
+ excludes: ['bone-lacing', 'bone-density-1', 'bone-density-2', 'bone-density-3', 'bone-density-4'],
215
354
  page: 'p.455', avail: 16, legality: 'R', canonCost: 30000,
216
355
  },
217
- {
218
- key: 'orthoskin-2',
219
- name: 'Orthoskin II',
220
- kind: 'bioware',
221
- essence: 0.5,
222
- cost: 6000,
223
- effect: '+1 soak, and no plating shows in a scan (grown armor, worn under the skin)',
224
- wakeLine: 'Your skin looks exactly the same. A knife would disagree.',
225
- bonuses: { soak: 1 },
226
- page: 'p.460', avail: 8, legality: 'R', canonCost: 12000,
227
- },
228
356
  {
229
357
  key: 'platelet-factories',
230
358
  name: 'Platelet Factories',
@@ -248,6 +376,35 @@ export const AUGMENTATIONS = [
248
376
  page: 'p.460', avail: 20, legality: 'R', canonCost: 140000,
249
377
  },
250
378
  // ---- Cultured bioware: the head (p.461) ----
379
+ // CEREBRAL BOOSTER, p.461, Rating 1-3: Rating x 0.2 Essence,
380
+ // (Rating x 6) availability with no legality suffix, Rating x 31,500
381
+ // nuyen. The shipped Rating 2 matched on all four, the missing suffix
382
+ // included -- which is the kind of agreement that makes a derived
383
+ // sibling trustworthy.
384
+ {
385
+ key: 'cerebral-booster-1',
386
+ name: 'Cerebral Booster I',
387
+ kind: 'bioware',
388
+ essence: 0.2,
389
+ cost: 6500,
390
+ effect: '+1 die on every Matrix pool (more brain, cultured to fit your skull)',
391
+ wakeLine: 'A problem you left half-finished last week is suddenly obvious, and you cannot say when that happened.',
392
+ bonuses: { matrix: 1 },
393
+ excludes: ['cerebral-booster-2', 'cerebral-booster-3'],
394
+ page: 'p.461', avail: 6, canonCost: 31500,
395
+ },
396
+ {
397
+ key: 'cerebral-booster-3',
398
+ name: 'Cerebral Booster III',
399
+ kind: 'bioware',
400
+ essence: 0.6,
401
+ cost: 19500,
402
+ effect: '+3 dice on every Matrix pool (more brain, cultured to fit your skull)',
403
+ wakeLine: 'You follow four threads at once and none of them frays. The skull feels crowded in a way you have decided to enjoy.',
404
+ bonuses: { matrix: 3 },
405
+ excludes: ['cerebral-booster-1', 'cerebral-booster-2'],
406
+ page: 'p.461', avail: 18, canonCost: 94500,
407
+ },
251
408
  {
252
409
  key: 'cerebral-booster-2',
253
410
  name: 'Cerebral Booster II',
@@ -257,8 +414,45 @@ export const AUGMENTATIONS = [
257
414
  effect: '+2 dice on every Matrix pool (more brain, cultured to fit your skull)',
258
415
  wakeLine: 'Thoughts arrive already finished. You catch yourself solving things you had not started.',
259
416
  bonuses: { matrix: 2 },
417
+ excludes: ['cerebral-booster-1', 'cerebral-booster-3'],
260
418
  page: 'p.461', avail: 12, canonCost: 63000,
261
419
  },
420
+ // DAMAGE COMPENSATOR, p.461 cultured bioware: Rating x 0.1 Essence,
421
+ // (Rating x 3)F, Rating x 2,000 nuyen. Canon runs to Rating 12; this
422
+ // catalog stops at 3, which is where it already stopped -- widening
423
+ // the band is a balance decision about how much pain a runner files
424
+ // under 'later', not a catalog gap, and it is not made here.
425
+ //
426
+ // ONE RETRIEVAL PUT THIS ROW UNDER 'VEHICLE MODIFICATIONS' and I very
427
+ // nearly reported the shipped entry as carrying vehicle stats. The
428
+ // per-entry follow-up quoted the row out of the CULTURED BIOWARE table
429
+ // on the same page and settled it: the shipped Rating 3 is right.
430
+ // Recorded because that time the discipline protected an existing
431
+ // entry rather than a new one.
432
+ {
433
+ key: 'damage-compensator-1',
434
+ name: 'Damage Compensator (Rating 1)',
435
+ kind: 'bioware',
436
+ essence: 0.1,
437
+ cost: 2000,
438
+ effect: 'ignore 1 box of damage when figuring wound modifiers (the pain arrives, the penalty does not)',
439
+ wakeLine: 'The first bad news your body sends now arrives without the shouting.',
440
+ bonuses: { 'wound-ignore': 1 },
441
+ excludes: ['damage-compensator-2', 'damage-compensator-3'],
442
+ page: 'p.461', avail: 3, legality: 'F', canonCost: 2000,
443
+ },
444
+ {
445
+ key: 'damage-compensator-2',
446
+ name: 'Damage Compensator (Rating 2)',
447
+ kind: 'bioware',
448
+ essence: 0.2,
449
+ cost: 4000,
450
+ effect: 'ignore 2 boxes of damage when figuring wound modifiers (the pain arrives, the penalty does not)',
451
+ wakeLine: 'Two floors of the alarm are switched off. The building still burns; you just stop hearing about it so early.',
452
+ bonuses: { 'wound-ignore': 2 },
453
+ excludes: ['damage-compensator-1', 'damage-compensator-3'],
454
+ page: 'p.461', avail: 6, legality: 'F', canonCost: 4000,
455
+ },
262
456
  {
263
457
  key: 'damage-compensator-3',
264
458
  name: 'Damage Compensator (Rating 3)',
@@ -268,9 +462,44 @@ export const AUGMENTATIONS = [
268
462
  effect: 'ignore 3 boxes of damage when figuring wound modifiers (the pain arrives, the penalty does not)',
269
463
  wakeLine: 'Cut-offs sit in your nerves now, filing the first three screams under "later".',
270
464
  bonuses: { 'wound-ignore': 3 },
465
+ excludes: ['damage-compensator-1', 'damage-compensator-2'],
271
466
  page: 'p.461', avail: 9, legality: 'F', canonCost: 6000,
272
467
  },
273
468
  // ---- The face (p.460) ----
469
+ // TAILORED PHEROMONES, p.460: Rating x 0.2 Essence, (Rating x 4)R,
470
+ // Rating x 31,000 nuyen -- the shipped Rating 2 matched all three.
471
+ //
472
+ // THE RANGE IS 1-3, settled by the bioware table in the book after the
473
+ // retrieval would only ever give the formula. Rating 3 is below.
474
+ {
475
+ key: 'tailored-pheromones-1',
476
+ name: 'Tailored Pheromones I',
477
+ kind: 'bioware',
478
+ essence: 0.2,
479
+ cost: 5500,
480
+ effect: '+1 die on social work -- people like you and cannot say why',
481
+ wakeLine: 'Conversations go a shade easier all afternoon. Nobody mentions it, including you.',
482
+ bonuses: { social: 1 },
483
+ excludes: ['tailored-pheromones-2', 'tailored-pheromones-3'],
484
+ page: 'p.460', avail: 4, legality: 'R', canonCost: 31000,
485
+ },
486
+ // RATING 3 JOINS THE FAMILY. #162 shipped I and II and stopped, because
487
+ // the retrieval gave the formula and never the RANGE -- and a tier the
488
+ // book does not allow is worse than a family one short. The bioware
489
+ // table settles it: "Tailored pheromones (Rating 1-3)". The ceiling is
490
+ // 3, so 3 exists, and the note above it that said otherwise is gone.
491
+ {
492
+ key: 'tailored-pheromones-3',
493
+ name: 'Tailored Pheromones III',
494
+ kind: 'bioware',
495
+ essence: 0.6,
496
+ cost: 16500,
497
+ effect: '+3 dice on social work -- people like you and cannot say why',
498
+ wakeLine: 'A stranger holds a door for you and looks briefly puzzled about why they did.',
499
+ excludes: ['tailored-pheromones-1', 'tailored-pheromones-2'],
500
+ bonuses: { social: 3 },
501
+ page: 'p.460', avail: 12, legality: 'R', canonCost: 93000,
502
+ },
274
503
  {
275
504
  key: 'tailored-pheromones-2',
276
505
  name: 'Tailored Pheromones II',
@@ -280,8 +509,713 @@ export const AUGMENTATIONS = [
280
509
  effect: '+2 dice on social work -- people like you and cannot say why',
281
510
  wakeLine: 'Nothing about you looks different. The room warms to you anyway.',
282
511
  bonuses: { social: 2 },
512
+ excludes: ['tailored-pheromones-1', 'tailored-pheromones-3'],
283
513
  page: 'p.460', avail: 8, legality: 'R', canonCost: 62000,
284
514
  },
515
+ // ================= THE RATED FAMILIES, AT CANON =================
516
+ //
517
+ // Five families shipped as ONE hand-tuned tier each, and the tier was
518
+ // not always the one its name suggested: what the catalog called
519
+ // "Muscle Toner" carried Rating 4's essence, availability and price
520
+ // while granting Rating 1's dice. Filling the siblings in forced a
521
+ // choice -- contradict the shipped tier, or invent a scale -- and the
522
+ // project owner ruled for canon.
523
+ //
524
+ // THE MAPPING IS NOT A JUDGEMENT CALL. In this engine an attribute
525
+ // point IS a die in the pools these augs touch, read off the formulas
526
+ // rather than assumed:
527
+ // attack = AGILITY + skill + ... + augBonus (player.ts)
528
+ // sneak = AGILITY + sneaking + ... + augBonus (npc.ts)
529
+ // athletics = STRENGTH + athletics + ... + augBonus (move.ts)
530
+ // soak = body + ARMOR + ... + augBonus (player.ts)
531
+ // So "+Rating Agility" is +Rating attack AND +Rating sneak; "+Rating
532
+ // Armor" is +Rating soak; "+Rating Strength" is +Rating athletics.
533
+ // Canon dictates the numbers; nothing here was chosen for feel.
534
+ //
535
+ // KEYS ARE UNCHANGED and that is load-bearing. restorePlayer REPLAYS
536
+ // essence from this catalog on every load and SKIPS a key it cannot
537
+ // find (persistence.ts) -- so renaming `muscle-toner` to
538
+ // `muscle-toner-4` would hand every owner their essence back along
539
+ // with the bonus. Only the display names gained their numeral.
540
+ //
541
+ // THE TIERS EXCLUDE THEIR SIBLINGS, or augBonus sums them: it adds up
542
+ // every installed piece bar the reflex family, so a filled family is
543
+ // stackable the moment it is filled. Orthoskin and dermal plating
544
+ // exclude each other across families too, because the book says so
545
+ // ("Orthoskin cannot be combined with skin augmentations that give
546
+ // you Armor, including dermal plating").
547
+ // ---- MUSCLE TONER (p.460), Rating 1-4 ----
548
+ {
549
+ key: 'muscle-toner-1',
550
+ name: 'Muscle Toner I',
551
+ kind: 'bioware',
552
+ essence: 0.2,
553
+ cost: 2250,
554
+ effect: '+1 die on meat-plane attacks and on sneaking (vat-grown fast-twitch fiber)',
555
+ wakeLine: 'Your hands move a half-beat before you finish deciding to move them.',
556
+ bonuses: { attack: 1, sneak: 1 },
557
+ excludes: ['muscle-toner-2', 'muscle-toner-3', 'muscle-toner', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
558
+ page: 'p.460', avail: 5, legality: 'R', canonCost: 32000,
559
+ },
560
+ {
561
+ key: 'muscle-toner-2',
562
+ name: 'Muscle Toner II',
563
+ kind: 'bioware',
564
+ essence: 0.4,
565
+ cost: 4500,
566
+ effect: '+2 diece on meat-plane attacks and on sneaking (vat-grown fast-twitch fiber)',
567
+ wakeLine: 'You catch a falling glass without looking up from the table.',
568
+ bonuses: { attack: 2, sneak: 2 },
569
+ excludes: ['muscle-toner-1', 'muscle-toner-3', 'muscle-toner', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
570
+ page: 'p.460', avail: 10, legality: 'R', canonCost: 64000,
571
+ },
572
+ {
573
+ key: 'muscle-toner-3',
574
+ name: 'Muscle Toner III',
575
+ kind: 'bioware',
576
+ essence: 0.6,
577
+ cost: 7000,
578
+ effect: '+3 diece on meat-plane attacks and on sneaking (vat-grown fast-twitch fiber)',
579
+ wakeLine: 'The room has slowed by a fraction nobody else has noticed.',
580
+ bonuses: { attack: 3, sneak: 3 },
581
+ excludes: ['muscle-toner-1', 'muscle-toner-2', 'muscle-toner', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
582
+ page: 'p.460', avail: 15, legality: 'R', canonCost: 96000,
583
+ },
584
+ {
585
+ key: 'muscle-toner',
586
+ name: 'Muscle Toner IV',
587
+ kind: 'bioware',
588
+ essence: 0.8,
589
+ cost: 9000,
590
+ effect: '+4 diece on meat-plane attacks and on sneaking (vat-grown fast-twitch fiber)',
591
+ wakeLine: 'You move like something that was designed to, and the designing shows.',
592
+ bonuses: { attack: 4, sneak: 4 },
593
+ excludes: ['muscle-toner-1', 'muscle-toner-2', 'muscle-toner-3', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
594
+ page: 'p.460', avail: 20, legality: 'R', canonCost: 128000,
595
+ },
596
+ // ---- MUSCLE AUGMENTATION (p.460), Rating 1-4 ----
597
+ {
598
+ key: 'muscle-augmentation-1',
599
+ name: 'Muscle Augmentation I',
600
+ kind: 'bioware',
601
+ essence: 0.2,
602
+ cost: 5500,
603
+ effect: '+1 die on athletics (grown strength, not bolted-on)',
604
+ wakeLine: 'Your grip closes on the bed rail a little harder than you meant it to.',
605
+ bonuses: { athletics: 1 },
606
+ excludes: ['muscle-augmentation-2', 'muscle-augmentation-3', 'muscle-augmentation-4', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
607
+ page: 'p.460', avail: 5, legality: 'R', canonCost: 31000,
608
+ },
609
+ {
610
+ key: 'muscle-augmentation-2',
611
+ name: 'Muscle Augmentation II',
612
+ kind: 'bioware',
613
+ essence: 0.4,
614
+ cost: 11000,
615
+ effect: '+2 diece on athletics (grown strength, not bolted-on)',
616
+ wakeLine: 'Your arms sit heavier on the table, and the table complains first.',
617
+ bonuses: { athletics: 2 },
618
+ excludes: ['muscle-augmentation-1', 'muscle-augmentation-3', 'muscle-augmentation-4', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
619
+ page: 'p.460', avail: 10, legality: 'R', canonCost: 62000,
620
+ },
621
+ {
622
+ key: 'muscle-augmentation-3',
623
+ name: 'Muscle Augmentation III',
624
+ kind: 'bioware',
625
+ essence: 0.6,
626
+ cost: 16500,
627
+ effect: '+3 diece on athletics (grown strength, not bolted-on)',
628
+ wakeLine: 'You stand up too fast and the chair goes over behind you.',
629
+ bonuses: { athletics: 3 },
630
+ excludes: ['muscle-augmentation-1', 'muscle-augmentation-2', 'muscle-augmentation-4', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
631
+ page: 'p.460', avail: 15, legality: 'R', canonCost: 93000,
632
+ },
633
+ {
634
+ key: 'muscle-augmentation-4',
635
+ name: 'Muscle Augmentation IV',
636
+ kind: 'bioware',
637
+ essence: 0.8,
638
+ cost: 22000,
639
+ effect: '+4 diece on athletics (grown strength, not bolted-on)',
640
+ wakeLine: 'Doors open further than you push them. You are learning to push less.',
641
+ bonuses: { athletics: 4 },
642
+ excludes: ['muscle-augmentation-1', 'muscle-augmentation-2', 'muscle-augmentation-3', 'muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4'],
643
+ page: 'p.460', avail: 20, legality: 'R', canonCost: 124000,
644
+ },
645
+ // ---- ORTHOSKIN (p.460), Rating 1-4 ----
646
+ {
647
+ key: 'orthoskin-1',
648
+ name: 'Orthoskin I',
649
+ kind: 'bioware',
650
+ essence: 0.25,
651
+ cost: 3000,
652
+ effect: '+1 soak, and no plating shows in a scan (grown armor, worn under the skin)',
653
+ wakeLine: 'Your skin looks exactly the same. It is not.',
654
+ bonuses: { soak: 1 },
655
+ excludes: ['orthoskin-2', 'orthoskin-3', 'orthoskin-4', 'dermal-plating', 'dermal-plating-1', 'dermal-plating-2', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6'],
656
+ page: 'p.460', avail: 4, legality: 'R', canonCost: 6000,
657
+ },
658
+ {
659
+ key: 'orthoskin-2',
660
+ name: 'Orthoskin II',
661
+ kind: 'bioware',
662
+ essence: 0.5,
663
+ cost: 6000,
664
+ effect: '+2 soak, and no plating shows in a scan (grown armor, worn under the skin)',
665
+ wakeLine: 'Your skin looks exactly the same. A knife would disagree.',
666
+ bonuses: { soak: 2 },
667
+ excludes: ['orthoskin-1', 'orthoskin-3', 'orthoskin-4', 'dermal-plating', 'dermal-plating-1', 'dermal-plating-2', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6'],
668
+ page: 'p.460', avail: 8, legality: 'R', canonCost: 12000,
669
+ },
670
+ {
671
+ key: 'orthoskin-3',
672
+ name: 'Orthoskin III',
673
+ kind: 'bioware',
674
+ essence: 0.75,
675
+ cost: 9000,
676
+ effect: '+3 soak, and no plating shows in a scan (grown armor, worn under the skin)',
677
+ wakeLine: 'You run a thumbnail along your forearm and it skates off.',
678
+ bonuses: { soak: 3 },
679
+ excludes: ['orthoskin-1', 'orthoskin-2', 'orthoskin-4', 'dermal-plating', 'dermal-plating-1', 'dermal-plating-2', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6'],
680
+ page: 'p.460', avail: 12, legality: 'R', canonCost: 18000,
681
+ },
682
+ {
683
+ key: 'orthoskin-4',
684
+ name: 'Orthoskin IV',
685
+ kind: 'bioware',
686
+ essence: 1,
687
+ cost: 12000,
688
+ effect: '+4 soak, and no plating shows in a scan (grown armor, worn under the skin)',
689
+ wakeLine: 'Nothing about you reads as armored, which is the entire and expensive point.',
690
+ bonuses: { soak: 4 },
691
+ excludes: ['orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'dermal-plating', 'dermal-plating-1', 'dermal-plating-2', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6'],
692
+ page: 'p.460', avail: 16, legality: 'R', canonCost: 24000,
693
+ },
694
+ // ---- DERMAL PLATING (p.456), Rating 1-6 ----
695
+ {
696
+ key: 'dermal-plating-1',
697
+ name: 'Dermal Plating I',
698
+ kind: 'cyberware',
699
+ essence: 0.5,
700
+ cost: 2250,
701
+ effect: '+1 soak (armor that never comes off)',
702
+ wakeLine: 'A faint ridging under the skin, like a scar you did not earn.',
703
+ bonuses: { soak: 1 },
704
+ excludes: ['dermal-plating-2', 'dermal-plating', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6', 'orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'orthoskin-4'],
705
+ page: 'p.456', avail: 4, legality: 'R', canonCost: 3000,
706
+ },
707
+ {
708
+ key: 'dermal-plating-2',
709
+ name: 'Dermal Plating II',
710
+ kind: 'cyberware',
711
+ essence: 1,
712
+ cost: 4750,
713
+ effect: '+2 soak (armor that never comes off)',
714
+ wakeLine: 'Your forearms have an edge to them now. People notice and do not say.',
715
+ bonuses: { soak: 2 },
716
+ excludes: ['dermal-plating-1', 'dermal-plating', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6', 'orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'orthoskin-4'],
717
+ page: 'p.456', avail: 8, legality: 'R', canonCost: 6000,
718
+ },
719
+ {
720
+ key: 'dermal-plating',
721
+ name: 'Dermal Plating III',
722
+ kind: 'cyberware',
723
+ essence: 1.5,
724
+ cost: 7000,
725
+ effect: '+3 soak (armor that never comes off)',
726
+ wakeLine: 'Your skin sits heavier, ridged under the surface like something geological.',
727
+ bonuses: { soak: 3 },
728
+ excludes: ['dermal-plating-1', 'dermal-plating-2', 'dermal-plating-4', 'dermal-plating-5', 'dermal-plating-6', 'orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'orthoskin-4'],
729
+ page: 'p.456', avail: 12, legality: 'R', canonCost: 9000,
730
+ },
731
+ {
732
+ key: 'dermal-plating-4',
733
+ name: 'Dermal Plating IV',
734
+ kind: 'cyberware',
735
+ essence: 2,
736
+ cost: 9500,
737
+ effect: '+4 soak (armor that never comes off)',
738
+ wakeLine: 'You are visibly plated. Nobody asks you for directions any more.',
739
+ bonuses: { soak: 4 },
740
+ excludes: ['dermal-plating-1', 'dermal-plating-2', 'dermal-plating', 'dermal-plating-5', 'dermal-plating-6', 'orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'orthoskin-4'],
741
+ page: 'p.456', avail: 16, legality: 'R', canonCost: 12000,
742
+ },
743
+ {
744
+ key: 'dermal-plating-5',
745
+ name: 'Dermal Plating V',
746
+ kind: 'cyberware',
747
+ essence: 2.5,
748
+ cost: 11500,
749
+ effect: '+5 soak (armor that never comes off)',
750
+ wakeLine: 'Chairs creak. Doorframes are closer than they were.',
751
+ bonuses: { soak: 5 },
752
+ excludes: ['dermal-plating-1', 'dermal-plating-2', 'dermal-plating', 'dermal-plating-4', 'dermal-plating-6', 'orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'orthoskin-4'],
753
+ page: 'p.456', avail: 20, legality: 'R', canonCost: 15000,
754
+ },
755
+ {
756
+ key: 'dermal-plating-6',
757
+ name: 'Dermal Plating VI',
758
+ kind: 'cyberware',
759
+ essence: 3,
760
+ cost: 14000,
761
+ effect: '+6 soak (armor that never comes off)',
762
+ wakeLine: 'You are wearing your own armor and there is no taking it off, ever.',
763
+ bonuses: { soak: 6 },
764
+ excludes: ['dermal-plating-1', 'dermal-plating-2', 'dermal-plating', 'dermal-plating-4', 'dermal-plating-5', 'orthoskin-1', 'orthoskin-2', 'orthoskin-3', 'orthoskin-4'],
765
+ page: 'p.456', avail: 24, legality: 'R', canonCost: 18000,
766
+ },
767
+ // ---- CONTROL RIG (p.452), Rating 1-3 ----
768
+ {
769
+ key: 'control-rig',
770
+ name: 'Control Rig I',
771
+ kind: 'cyberware',
772
+ essence: 1,
773
+ cost: 12000,
774
+ effect: '+1 die piloting drones (the machine becomes a limb)',
775
+ wakeLine: 'Somewhere in your skull a new sense is waiting for wings to wear.',
776
+ bonuses: { piloting: 1 },
777
+ excludes: ['control-rig-2', 'control-rig-3'],
778
+ page: 'p.452', avail: 5, legality: 'R', canonCost: 43000,
779
+ },
780
+ {
781
+ key: 'control-rig-2',
782
+ name: 'Control Rig II',
783
+ kind: 'cyberware',
784
+ essence: 2,
785
+ cost: 27000,
786
+ effect: '+2 diece piloting drones (the machine becomes a limb)',
787
+ wakeLine: 'You reach for a drone that is not in the room and feel the absence like a missing finger.',
788
+ bonuses: { piloting: 2 },
789
+ excludes: ['control-rig', 'control-rig-3'],
790
+ page: 'p.452', avail: 10, legality: 'R', canonCost: 97000,
791
+ },
792
+ {
793
+ key: 'control-rig-3',
794
+ name: 'Control Rig III',
795
+ kind: 'cyberware',
796
+ essence: 3,
797
+ cost: 58000,
798
+ effect: '+3 diece piloting drones (the machine becomes a limb)',
799
+ wakeLine: 'The airframe is not a thing you fly. It is a thing you are.',
800
+ bonuses: { piloting: 3 },
801
+ excludes: ['control-rig', 'control-rig-2'],
802
+ page: 'p.452', avail: 15, legality: 'R', canonCost: 208000,
803
+ },
804
+ // BONE DENSITY AUGMENTATION (p.459-460 bioware), Rating 1-4:
805
+ // Rating x 0.3 Essence, (Rating x 4) availability with no legality
806
+ // suffix, Rating x 5,000 nuyen -- table pinned from the book.
807
+ //
808
+ // TWO EFFECTS ON TWO DIFFERENT SCALES, which is why this family does
809
+ // not follow the bonus == rating shape the rest of the rated augs do:
810
+ // "Your Body attribute is increased by the bone density Rating for
811
+ // the purpose of damage resistance tests" -> soak = Rating,
812
+ // because Body sits in the soak pool one-for-one.
813
+ // The Bone Density Augmentation table gives unarmed damage as
814
+ // (STR)P, (STR+1)P, (STR+2)P, (STR+3)P -> the increment is
815
+ // Rating MINUS ONE, not Rating.
816
+ //
817
+ // RATING 1 CARRIES NO UNARMED BONUS AT ALL, and that is faithful
818
+ // rather than a rounding-down. What Rating 1 buys in the book is that
819
+ // your fists deal PHYSICAL damage; this engine has no stun/physical
820
+ // split on a melee hit -- getWeaponProfile hands bare fists a flat
821
+ // damage number -- so that half is already true for everyone, and
822
+ // there is nothing left for Rating 1 to add. The key is simply
823
+ // omitted at that tier rather than declared as a zero.
824
+ //
825
+ // INCOMPATIBLE WITH BONE LACING, both materials: "incompatible with
826
+ // other augmentations to the bones, including bone lacing cyberware".
827
+ {
828
+ key: 'bone-density-1',
829
+ name: 'Bone Density Augmentation I',
830
+ kind: 'bioware',
831
+ essence: 0.3,
832
+ cost: 3000,
833
+ effect: '+1 soak (bone grown dense enough to argue with a bullet)',
834
+ wakeLine: 'Your bones feel like somebody else\'s -- heavier, and unwilling to bend the way they used to.',
835
+ bonuses: { soak: 1 },
836
+ excludes: ['bone-density-2', 'bone-density-3', 'bone-density-4', 'bone-lacing', 'bone-lacing-titanium'],
837
+ page: 'p.460', avail: 4, canonCost: 5000,
838
+ },
839
+ {
840
+ key: 'bone-density-2',
841
+ name: 'Bone Density Augmentation II',
842
+ kind: 'bioware',
843
+ essence: 0.6,
844
+ cost: 6000,
845
+ effect: '+2 soak, +1 unarmed damage (bone grown dense enough to argue with a bullet)',
846
+ wakeLine: 'You knock on the door frame and the frame is what gives.',
847
+ bonuses: { soak: 2, 'unarmed-damage': 1 },
848
+ excludes: ['bone-density-1', 'bone-density-3', 'bone-density-4', 'bone-lacing', 'bone-lacing-titanium'],
849
+ page: 'p.460', avail: 8, canonCost: 10000,
850
+ },
851
+ {
852
+ key: 'bone-density-3',
853
+ name: 'Bone Density Augmentation III',
854
+ kind: 'bioware',
855
+ essence: 0.9,
856
+ cost: 9000,
857
+ effect: '+3 soak, +2 unarmed damage (bone grown dense enough to argue with a bullet)',
858
+ wakeLine: 'Every fall you take from here is somebody else\'s problem.',
859
+ bonuses: { soak: 3, 'unarmed-damage': 2 },
860
+ excludes: ['bone-density-1', 'bone-density-2', 'bone-density-4', 'bone-lacing', 'bone-lacing-titanium'],
861
+ page: 'p.460', avail: 12, canonCost: 15000,
862
+ },
863
+ {
864
+ key: 'bone-density-4',
865
+ name: 'Bone Density Augmentation IV',
866
+ kind: 'bioware',
867
+ essence: 1.2,
868
+ cost: 12000,
869
+ effect: '+4 soak, +3 unarmed damage (bone grown dense enough to argue with a bullet)',
870
+ wakeLine: 'You are a load-bearing person now. Chairs know it before you sit.',
871
+ bonuses: { soak: 4, 'unarmed-damage': 3 },
872
+ excludes: ['bone-density-1', 'bone-density-2', 'bone-density-3', 'bone-lacing', 'bone-lacing-titanium'],
873
+ page: 'p.460', avail: 16, canonCost: 20000,
874
+ },
875
+ // SYMBIOTES (p.459 bioware), Rating 1-4: Rating x 0.2 Essence,
876
+ // (Rating x 5) availability with no legality suffix, Rating x 3,500
877
+ // nuyen. The effect is one clean line in the book -- "Add the Rating
878
+ // of the symbiotes as a dice pool modifier on healing tests" -- and
879
+ // `healing` is a kind this engine already wires, through first aid
880
+ // (use.ts) and the rest recovery roll (rest.ts).
881
+ //
882
+ // THE UPKEEP IS NOT MODELLED AND IS NAMED RATHER THAN DROPPED. The
883
+ // book charges (Rating x 200) nuyen a month for symbiote food, waived
884
+ // at High Lifestyle or better. This game has lifestyles and a monthly
885
+ // ledger, so the hook exists -- but a recurring per-aug charge is a
886
+ // billing feature, not a catalog row, and inventing one here would
887
+ // put an unpriced obligation on every runner who buys these.
888
+ {
889
+ key: 'symbiotes-1',
890
+ name: 'Symbiotes I',
891
+ kind: 'bioware',
892
+ essence: 0.2,
893
+ cost: 2500,
894
+ effect: '+1 dice on every healing test made on or by you (first aid, rest)',
895
+ wakeLine: 'A cut on your thumb from the taxi door has already stopped bleeding.',
896
+ bonuses: { healing: 1 },
897
+ excludes: ['symbiotes-2', 'symbiotes-3', 'symbiotes-4'],
898
+ page: 'p.460', avail: 5, canonCost: 3500,
899
+ },
900
+ {
901
+ key: 'symbiotes-2',
902
+ name: 'Symbiotes II',
903
+ kind: 'bioware',
904
+ essence: 0.4,
905
+ cost: 5000,
906
+ effect: '+2 dice on every healing test made on or by you (first aid, rest)',
907
+ wakeLine: 'The surgical line is pink by evening. Something in you is working overtime and eating for it.',
908
+ bonuses: { healing: 2 },
909
+ excludes: ['symbiotes-1', 'symbiotes-3', 'symbiotes-4'],
910
+ page: 'p.460', avail: 10, canonCost: 7000,
911
+ },
912
+ {
913
+ key: 'symbiotes-3',
914
+ name: 'Symbiotes III',
915
+ kind: 'bioware',
916
+ essence: 0.6,
917
+ cost: 7500,
918
+ effect: '+3 dice on every healing test made on or by you (first aid, rest)',
919
+ wakeLine: 'You heal like a rumour spreads. You are also always, always hungry.',
920
+ bonuses: { healing: 3 },
921
+ excludes: ['symbiotes-1', 'symbiotes-2', 'symbiotes-4'],
922
+ page: 'p.460', avail: 15, canonCost: 10500,
923
+ },
924
+ {
925
+ key: 'symbiotes-4',
926
+ name: 'Symbiotes IV',
927
+ kind: 'bioware',
928
+ essence: 0.8,
929
+ cost: 10000,
930
+ effect: '+4 dice on every healing test made on or by you (first aid, rest)',
931
+ wakeLine: 'Your blood is a small industrious country now, and it has an appetite.',
932
+ bonuses: { healing: 4 },
933
+ excludes: ['symbiotes-1', 'symbiotes-2', 'symbiotes-3'],
934
+ page: 'p.460', avail: 20, canonCost: 14000,
935
+ },
936
+ // ================== LISTINGS: OWNABLE, NOT ROLLED ==================
937
+ //
938
+ // The first entries under the 2026-08-31 policy. Every stat is pinned
939
+ // from the book exactly as a mechanical entry would be -- essence,
940
+ // availability and price are REAL here, because you pay them -- and
941
+ // only the dice are absent. That is the whole distinction: a listing
942
+ // is honest about what it does not do, not vague about what it costs.
943
+ //
944
+ // THESE THREE ANSWER A BOARD ITEM (xHarA3TNgxZXtZwgp, "install items,
945
+ // like the internal cyberdeck, hidden body compartments, and shock
946
+ // hands"). The compartment half is here; the internal cyberdeck is
947
+ // NOT, and stays parked -- it is a getCyberdeck question about
948
+ // whether an implanted deck can be the deck you hack with, which is
949
+ // an investigation rather than a row, and shipping it as a cosmetic
950
+ // listing would answer the wrong question loudly.
951
+ //
952
+ // WHAT WOULD MAKE THEM REAL, said here so the next reader knows the
953
+ // hook is missing rather than forgotten: concealment. Each has a
954
+ // Concealability rating in the book (-10 for a skin pocket), and this
955
+ // engine has no concealment check for carried items -- palm.ts hides
956
+ // the ACT of taking something, not the thing itself. Item 9r9st
957
+ // (equipment slots) is the neighbouring question and is not mine.
958
+ {
959
+ key: 'fingertip-compartment',
960
+ name: 'Fingertip Compartment',
961
+ kind: 'cyberware',
962
+ essence: 0.1,
963
+ cost: 3000,
964
+ effect: 'cosmetic -- no mechanical effect yet: a hollowed fingertip with a catch under the nail -- somewhere very small to keep something very small',
965
+ wakeLine: 'Your index finger clicks. It has a lid now, and a secret to keep.',
966
+ page: 'p.455', avail: 4, canonCost: 3000,
967
+ },
968
+ {
969
+ key: 'smuggling-compartment',
970
+ name: 'Smuggling Compartment',
971
+ kind: 'cyberware',
972
+ essence: 0.2,
973
+ cost: 7500,
974
+ effect: 'cosmetic -- no mechanical effect yet: a shielded cavity under the muscle -- room for a pistol, and nothing on a scanner',
975
+ wakeLine: 'There is a space inside you that was not there on Tuesday. It closes flush and you cannot feel the seam.',
976
+ page: 'p.455', avail: 6, canonCost: 7500,
977
+ },
978
+ {
979
+ key: 'skin-pocket',
980
+ name: 'Skin Pocket',
981
+ kind: 'bioware',
982
+ essence: 0.1,
983
+ cost: 6000,
984
+ effect: 'cosmetic -- no mechanical effect yet: a nerveless sheath of flesh under a skin flap -- the bioware answer to a smuggling compartment',
985
+ wakeLine: 'A flap of you lifts like an envelope. It does not hurt, which is somehow worse.',
986
+ page: 'p.460', avail: 4, canonCost: 12000,
987
+ },
988
+ // ===================== CYBERLIMBS (p.456-457) =====================
989
+ //
990
+ // LISTINGS, ALL FOURTEEN, and the reason is structural rather than
991
+ // lazy: a cyberlimb in SR5 has its own Strength and Agility (base 3,
992
+ // customizable upward) and its own CAPACITY that enhancements and
993
+ // accessories are installed into. This engine has none of those --
994
+ // no per-limb attributes, no capacity, no limb slots. Item 9r9st
995
+ // (equipment slots) is the neighbouring question and is not mine.
996
+ //
997
+ // SO THE LIMB IS OWNABLE AND HONEST ABOUT IT. Essence, availability
998
+ // and price are the book's, because you really do pay them -- and a
999
+ // full arm really does cost a whole point of Essence for nothing
1000
+ // mechanical yet, which is exactly the sort of thing the marker
1001
+ // exists to say out loud before somebody spends it.
1002
+ //
1003
+ // HOW THE TABLE WAS READ, because it nearly went wrong. pdftotext in
1004
+ // -layout mode returns this table with values shifted from their
1005
+ // labels by an amount that CHANGES partway down, so a careful
1006
+ // reading still produces wrong rows. The raw (reading-order)
1007
+ // extraction returns it COLUMN-MAJOR instead -- every label, then
1008
+ // every Essence, then every Capacity -- which zips together
1009
+ // unambiguously. Four rows were then confirmed against an
1010
+ // independent retrieval and matched exactly. Neither source alone
1011
+ // was trustworthy here: unlike every other family, the catalog had
1012
+ // no shipped cyberlimb to anchor the alignment against.
1013
+ {
1014
+ key: 'cyberlimb-obvious-full-arm',
1015
+ name: 'Obvious Cyberlimb (Full Arm)',
1016
+ kind: 'cyberware',
1017
+ essence: 1,
1018
+ cost: 6000,
1019
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 15 capacity in the book, which this engine does not model yet',
1020
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1021
+ page: 'p.457', avail: 4, canonCost: 15000,
1022
+ },
1023
+ {
1024
+ key: 'cyberlimb-synthetic-full-arm',
1025
+ name: 'Synthetic Cyberlimb (Full Arm)',
1026
+ kind: 'cyberware',
1027
+ essence: 1,
1028
+ cost: 8000,
1029
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 8 capacity in the book, which this engine does not model yet',
1030
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1031
+ page: 'p.457', avail: 4, canonCost: 20000,
1032
+ },
1033
+ {
1034
+ key: 'cyberlimb-obvious-full-leg',
1035
+ name: 'Obvious Cyberlimb (Full Leg)',
1036
+ kind: 'cyberware',
1037
+ essence: 1,
1038
+ cost: 6000,
1039
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 20 capacity in the book, which this engine does not model yet',
1040
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1041
+ page: 'p.457', avail: 4, canonCost: 15000,
1042
+ },
1043
+ {
1044
+ key: 'cyberlimb-synthetic-full-leg',
1045
+ name: 'Synthetic Cyberlimb (Full Leg)',
1046
+ kind: 'cyberware',
1047
+ essence: 1,
1048
+ cost: 8000,
1049
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 10 capacity in the book, which this engine does not model yet',
1050
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1051
+ page: 'p.457', avail: 4, canonCost: 20000,
1052
+ },
1053
+ {
1054
+ key: 'cyberlimb-obvious-hand-foot',
1055
+ name: 'Obvious Cyberlimb (Hand/Foot)',
1056
+ kind: 'cyberware',
1057
+ essence: 0.25,
1058
+ cost: 2000,
1059
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 4 capacity in the book, which this engine does not model yet',
1060
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1061
+ page: 'p.457', avail: 2, canonCost: 5000,
1062
+ },
1063
+ {
1064
+ key: 'cyberlimb-synthetic-hand-foot',
1065
+ name: 'Synthetic Cyberlimb (Hand/Foot)',
1066
+ kind: 'cyberware',
1067
+ essence: 0.25,
1068
+ cost: 2500,
1069
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 2 capacity in the book, which this engine does not model yet',
1070
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1071
+ page: 'p.457', avail: 2, canonCost: 6000,
1072
+ },
1073
+ {
1074
+ key: 'cyberlimb-obvious-lower-arm',
1075
+ name: 'Obvious Cyberlimb (Lower Arm)',
1076
+ kind: 'cyberware',
1077
+ essence: 0.45,
1078
+ cost: 4000,
1079
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 10 capacity in the book, which this engine does not model yet',
1080
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1081
+ page: 'p.457', avail: 4, canonCost: 10000,
1082
+ },
1083
+ {
1084
+ key: 'cyberlimb-synthetic-lower-arm',
1085
+ name: 'Synthetic Cyberlimb (Lower Arm)',
1086
+ kind: 'cyberware',
1087
+ essence: 0.45,
1088
+ cost: 5000,
1089
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 5 capacity in the book, which this engine does not model yet',
1090
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1091
+ page: 'p.457', avail: 4, canonCost: 12000,
1092
+ },
1093
+ {
1094
+ key: 'cyberlimb-obvious-lower-leg',
1095
+ name: 'Obvious Cyberlimb (Lower Leg)',
1096
+ kind: 'cyberware',
1097
+ essence: 0.45,
1098
+ cost: 4000,
1099
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 12 capacity in the book, which this engine does not model yet',
1100
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1101
+ page: 'p.457', avail: 4, canonCost: 10000,
1102
+ },
1103
+ {
1104
+ key: 'cyberlimb-synthetic-lower-leg',
1105
+ name: 'Synthetic Cyberlimb (Lower Leg)',
1106
+ kind: 'cyberware',
1107
+ essence: 0.45,
1108
+ cost: 5000,
1109
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 6 capacity in the book, which this engine does not model yet',
1110
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1111
+ page: 'p.457', avail: 4, canonCost: 12000,
1112
+ },
1113
+ {
1114
+ key: 'cyberlimb-obvious-torso',
1115
+ name: 'Obvious Cyberlimb (Torso)',
1116
+ kind: 'cyberware',
1117
+ essence: 1.5,
1118
+ cost: 8000,
1119
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 10 capacity in the book, which this engine does not model yet',
1120
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1121
+ page: 'p.457', avail: 12, canonCost: 20000,
1122
+ },
1123
+ {
1124
+ key: 'cyberlimb-synthetic-torso',
1125
+ name: 'Synthetic Cyberlimb (Torso)',
1126
+ kind: 'cyberware',
1127
+ essence: 1.5,
1128
+ cost: 10000,
1129
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 5 capacity in the book, which this engine does not model yet',
1130
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1131
+ page: 'p.457', avail: 12, canonCost: 25000,
1132
+ },
1133
+ {
1134
+ key: 'cyberlimb-obvious-skull',
1135
+ name: 'Obvious Cyberlimb (Skull)',
1136
+ kind: 'cyberware',
1137
+ essence: 0.75,
1138
+ cost: 4000,
1139
+ effect: 'cosmetic -- no mechanical effect yet: chromed and unmistakable -- 4 capacity in the book, which this engine does not model yet',
1140
+ wakeLine: 'You flex fingers that gleam. They answer instantly and they are not warm.',
1141
+ page: 'p.457', avail: 16, canonCost: 10000,
1142
+ },
1143
+ {
1144
+ key: 'cyberlimb-synthetic-skull',
1145
+ name: 'Synthetic Cyberlimb (Skull)',
1146
+ kind: 'cyberware',
1147
+ essence: 0.75,
1148
+ cost: 6000,
1149
+ effect: 'cosmetic -- no mechanical effect yet: indistinguishable from flesh until somebody looks hard -- 2 capacity in the book, which this engine does not model yet',
1150
+ wakeLine: 'It looks like the limb you were born with. It is not, and only you and the surgeon can tell.',
1151
+ page: 'p.457', avail: 16, canonCost: 15000,
1152
+ },
1153
+ // MUSCLE REPLACEMENT (p.457 bodyware), Rating 1-4: Rating x 1
1154
+ // Essence, (Rating x 5)R, Rating x 25,000 nuyen. It sits with the
1155
+ // limbs because canon ties it to them -- vat-grown muscle replacing
1156
+ // your own -- and because both muscle bioware families name it as
1157
+ // the thing they cannot coexist with.
1158
+ //
1159
+ // IT MOVES REAL DICE, so it is NOT a listing: "It increases both your
1160
+ // Strength and Agility attributes by its rating." Strength is in the
1161
+ // athletics pool and Agility is in both the attack and sneak pools,
1162
+ // each one-for-one, so the rating lands three times. A full point of
1163
+ // Essence per rating is what pays for that.
1164
+ //
1165
+ // THE EXCLUSIONS WERE ALREADY HALF-WRITTEN AND POINTED AT NOTHING.
1166
+ // The muscle toner and muscle augmentation families have carried
1167
+ // `excludes: [... "muscle-replacement"]` since the rescale -- a key
1168
+ // that did not exist, so the rule silently never fired. It would
1169
+ // have started mattering the moment this family landed, which is why
1170
+ // a dangling-exclude check now runs in the tests.
1171
+ {
1172
+ key: 'muscle-replacement-1',
1173
+ name: 'Muscle Replacement I',
1174
+ kind: 'cyberware',
1175
+ essence: 1,
1176
+ cost: 4500,
1177
+ effect: '+1 on athletics, on meat-plane attacks and on sneaking (bought muscle, not earned)',
1178
+ wakeLine: 'Your arms are somebody else\'s idea of your arms, and they are better at it.',
1179
+ bonuses: { athletics: 1, attack: 1, sneak: 1 },
1180
+ excludes: ['muscle-replacement-2', 'muscle-replacement-3', 'muscle-replacement-4', 'muscle-toner-1', 'muscle-toner-2', 'muscle-toner-3', 'muscle-toner', 'muscle-augmentation-1', 'muscle-augmentation-2', 'muscle-augmentation-3', 'muscle-augmentation-4'],
1181
+ page: 'p.457', avail: 5, legality: 'R', canonCost: 25000,
1182
+ },
1183
+ {
1184
+ key: 'muscle-replacement-2',
1185
+ name: 'Muscle Replacement II',
1186
+ kind: 'cyberware',
1187
+ essence: 2,
1188
+ cost: 9000,
1189
+ effect: '+2 on athletics, on meat-plane attacks and on sneaking (bought muscle, not earned)',
1190
+ wakeLine: 'You lift the clinic chair one-handed to see if you can. You can.',
1191
+ bonuses: { athletics: 2, attack: 2, sneak: 2 },
1192
+ excludes: ['muscle-replacement-1', 'muscle-replacement-3', 'muscle-replacement-4', 'muscle-toner-1', 'muscle-toner-2', 'muscle-toner-3', 'muscle-toner', 'muscle-augmentation-1', 'muscle-augmentation-2', 'muscle-augmentation-3', 'muscle-augmentation-4'],
1193
+ page: 'p.457', avail: 10, legality: 'R', canonCost: 50000,
1194
+ },
1195
+ {
1196
+ key: 'muscle-replacement-3',
1197
+ name: 'Muscle Replacement III',
1198
+ kind: 'cyberware',
1199
+ essence: 3,
1200
+ cost: 13500,
1201
+ effect: '+3 on athletics, on meat-plane attacks and on sneaking (bought muscle, not earned)',
1202
+ wakeLine: 'Nothing about moving costs what it used to.',
1203
+ bonuses: { athletics: 3, attack: 3, sneak: 3 },
1204
+ excludes: ['muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-4', 'muscle-toner-1', 'muscle-toner-2', 'muscle-toner-3', 'muscle-toner', 'muscle-augmentation-1', 'muscle-augmentation-2', 'muscle-augmentation-3', 'muscle-augmentation-4'],
1205
+ page: 'p.457', avail: 15, legality: 'R', canonCost: 75000,
1206
+ },
1207
+ {
1208
+ key: 'muscle-replacement-4',
1209
+ name: 'Muscle Replacement IV',
1210
+ kind: 'cyberware',
1211
+ essence: 4,
1212
+ cost: 18000,
1213
+ effect: '+4 on athletics, on meat-plane attacks and on sneaking (bought muscle, not earned)',
1214
+ wakeLine: 'You are strong and quick in a way no training explains, and everyone can tell.',
1215
+ bonuses: { athletics: 4, attack: 4, sneak: 4 },
1216
+ excludes: ['muscle-replacement-1', 'muscle-replacement-2', 'muscle-replacement-3', 'muscle-toner-1', 'muscle-toner-2', 'muscle-toner-3', 'muscle-toner', 'muscle-augmentation-1', 'muscle-augmentation-2', 'muscle-augmentation-3', 'muscle-augmentation-4'],
1217
+ page: 'p.457', avail: 20, legality: 'R', canonCost: 100000,
1218
+ },
285
1219
  ];
286
1220
  export function getAug(key) {
287
1221
  return AUGMENTATIONS.find(a => a.key === key);