@maka/maka-cli 5.4.0 → 5.6.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 (123) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/archetypes.d.ts +20 -1
  3. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js +76 -11
  4. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/advance.d.ts +16 -0
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/advance.js +65 -0
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/advance.js.map +1 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.d.ts +2 -0
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js +72 -29
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js.map +1 -1
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js +21 -2
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js.map +1 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.d.ts +16 -0
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +39 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -0
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.d.ts +21 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.js +82 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.js.map +1 -0
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +1 -1
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -1
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +13 -0
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +93 -1
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +21 -2
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -1
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js +13 -1
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js.map +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/drop.js +3 -0
  29. package/bundle/typescript/src/commands/game/sideQuest/commands/drop.js.map +1 -1
  30. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js +19 -2
  31. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js.map +1 -1
  32. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js +9 -2
  33. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js.map +1 -1
  34. package/bundle/typescript/src/commands/game/sideQuest/commands/go.d.ts +2 -0
  35. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +33 -1
  36. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
  37. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +43 -20
  38. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -1
  39. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.d.ts +15 -0
  40. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js +75 -0
  41. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js.map +1 -0
  42. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js +5 -1
  43. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js.map +1 -1
  44. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +16 -4
  45. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
  46. package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.d.ts +18 -0
  47. package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.js +100 -0
  48. package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.js.map +1 -0
  49. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.d.ts +1 -0
  50. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +22 -7
  51. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -1
  52. package/bundle/typescript/src/commands/game/sideQuest/commands/say.js +8 -0
  53. package/bundle/typescript/src/commands/game/sideQuest/commands/say.js.map +1 -1
  54. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +55 -8
  55. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  56. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +11 -2
  57. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -1
  58. package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.d.ts +15 -0
  59. package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.js +35 -0
  60. package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.js.map +1 -0
  61. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js +21 -0
  62. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js.map +1 -1
  63. package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js +4 -4
  64. package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js.map +1 -1
  65. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +70 -13
  66. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
  67. package/bundle/typescript/src/commands/game/sideQuest/commands/talk.js +8 -0
  68. package/bundle/typescript/src/commands/game/sideQuest/commands/talk.js.map +1 -1
  69. package/bundle/typescript/src/commands/game/sideQuest/commands/unequip.js +6 -3
  70. package/bundle/typescript/src/commands/game/sideQuest/commands/unequip.js.map +1 -1
  71. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +5 -4
  72. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
  73. package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js +1 -0
  74. package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js.map +1 -1
  75. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +175 -0
  76. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +673 -0
  77. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -0
  78. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +1 -0
  79. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
  80. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.d.ts +64 -9
  81. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +265 -434
  82. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js.map +1 -1
  83. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +69 -1
  84. package/bundle/typescript/src/commands/game/sideQuest/game.js +388 -67
  85. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  86. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +2 -0
  87. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +92 -3
  88. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  89. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +66 -1
  90. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +151 -15
  91. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  92. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +29 -4
  93. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
  94. package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +4 -0
  95. package/bundle/typescript/src/commands/game/sideQuest/models/room.js +14 -0
  96. package/bundle/typescript/src/commands/game/sideQuest/models/room.js.map +1 -1
  97. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +4 -0
  98. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +35 -3
  99. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  100. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +275 -105
  101. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +662 -233
  102. package/bundle/typescript/src/commands/game/sideQuest/types/seed/player-seed.d.ts +8 -0
  103. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.d.ts +1 -1
  104. package/bundle/typescript/src/commands/game/sideQuest/types/seed/room-seed.d.ts +1 -0
  105. package/bundle/typescript/src/commands/game/sideQuest/types/seed/scene-seed.d.ts +6 -3
  106. package/bundle/typescript/src/commands/game/sideQuest/ui.js +19 -20
  107. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  108. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.d.ts +6 -4
  109. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +31 -5
  110. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -1
  111. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.d.ts +34 -1
  112. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +72 -0
  113. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js.map +1 -1
  114. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +27 -3
  115. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  116. package/bundle/typescript/src/tools/ai/ai.class.d.ts +8 -1
  117. package/bundle/typescript/src/tools/ai/ai.class.js +8 -3
  118. package/bundle/typescript/src/tools/ai/ai.class.js.map +1 -1
  119. package/bundle/typescript/src/tools/https/https.class.d.ts +2 -2
  120. package/bundle/typescript/src/tools/https/https.class.js +10 -4
  121. package/bundle/typescript/src/tools/https/https.class.js.map +1 -1
  122. package/bundle/typescript/src/tools/https/https.interface.d.ts +2 -0
  123. package/package.json +1 -1
@@ -1,21 +1,28 @@
1
1
  {
2
- "name": "Rainwalker's Refuge",
3
- "story": "“Rainwalker’s Refuge” is a secretive underworld node hidden beneath Seattle’s rotting sprawl — a place where debt, data, and desperation flow more freely than water. A digital storm is brewing: someone has leaked fragments of blackmail material from Rainwalker’s private vault, threatening the balance of power among local fixers and corps. Rainwalker believes one of his own might be compromised.\n\nDr. Nyx, the unlicensed street doc with a buried conscience, has been patching up mercs who’ve gotten too close to the truth. Slink, a rogue dwarf smuggler with a habit of disappearing at just the wrong moment, may know more than he lets on. Somewhere in this mess, trust is failing — and neural sync errors are just the surface noise.\n\nVault doors are locking themselves. AR signals are flickering with hidden messages. And through it all, a silent test plays out: who’s loyal, who’s useful, and who’s next to disappear?\n\nOnly the sharpest shadows survive in the Refuge.",
4
- "residenceTiers": ["Street", "Squatter", "Low", "Middle", "High", "Luxury"],
2
+ "name": "Tacoma Purple Haze",
3
+ "story": "The Purple Haze district of Tacoma: your streets, your people, your bolt-hole. Nobody's shooting at you tonight -- but Mr. Johnson always has work for a runner who calls.",
4
+ "hub": true,
5
+ "residenceTiers": [
6
+ "Street",
7
+ "Squatter",
8
+ "Low",
9
+ "Middle",
10
+ "High",
11
+ "Luxury"
12
+ ],
5
13
  "currency": {
6
14
  "type": "nuyen",
7
- "carrier": "credstick",
8
- "authorityRoomTags": ["Vault"]
15
+ "authorityRoomTags": ["Bank"]
9
16
  },
10
17
  "player": {
11
18
  "name": "Maka",
12
- "startLocation": "Barrens Apartment",
19
+ "startLocation": "Neon Strip",
13
20
  "lifestyleChoices": [
14
21
  {
15
22
  "type": "residence",
16
23
  "metadata": {
17
24
  "tier": "Street",
18
- "location": "Barrens Apartment"
25
+ "location": "Neon Strip"
19
26
  }
20
27
  }
21
28
  ],
@@ -33,7 +40,7 @@
33
40
  },
34
41
  {
35
42
  "name": "Armored Jacket",
36
- "description": "A rugged armored jacket with built-in smartweave. Offers decent protection without looking too suspicious.",
43
+ "description": "A rugged armored jacket with built-in smartweave.",
37
44
  "size": "Large",
38
45
  "category": "Armor",
39
46
  "shape": "Jacket",
@@ -89,314 +96,736 @@
89
96
  }
90
97
  ]
91
98
  },
99
+
92
100
  "rooms": [
93
101
  {
94
- "name": "Drowned Alley",
95
- "description": "A narrow, rain-slicked alley lit by flickering magenta AR graffiti. Trash piles steam in the cold drizzle, masking the entrance to something deeper.",
102
+ "name": "Neon Strip",
103
+ "description": "The spine of the Purple Haze district: rain-slick pavement under a canopy of violet neon, food smoke, and AR graffiti three layers deep. Everyone you need is a block away in some direction.",
104
+ "roomType": "Street",
96
105
  "tags": ["residence"],
97
106
  "supportedLifestyles": {
98
- "residenceTiers": ["Street", "Squatter"]
107
+ "residenceTypes": ["Street", "Squatter"]
99
108
  },
109
+ "isStartRoom": true,
100
110
  "exits": [
101
- {
102
- "direction": "east",
103
- "targetRoom": "Hidden Clinic"
104
- },
105
- {
106
- "direction": "west",
107
- "targetRoom": "Obsidian Lounge"
108
- }
109
- ],
110
- "isStartRoom": true
111
+ { "direction": "north", "targetRoom": "Purple Haze Bar" },
112
+ { "direction": "east", "targetRoom": "Night Market" },
113
+ { "direction": "south", "targetRoom": "Rain-Chewed Alley" },
114
+ { "direction": "west", "targetRoom": "Mama Wu's Noodles" }
115
+ ]
111
116
  },
112
117
  {
113
- "name": "Hidden Clinic",
114
- "description": "A covert med-den patched together with scavenged tech and old hospital gear. The hum of cyberware diagnostics fills the air.",
115
- "tags": ["employment"],
116
- "supportedLifestyles": {
117
- "employmentRoles": ["Street Doc"]
118
- },
118
+ "name": "Purple Haze Bar",
119
+ "description": "The district's namesake: a smoky dive where the house special glows faintly and the booths have heard every job in Tacoma get planned. Runners drink here between runs.",
120
+ "roomType": "Bar",
119
121
  "exits": [
120
- {
121
- "direction": "west",
122
- "targetRoom": "Drowned Alley"
123
- },
124
- {
125
- "direction": "north",
126
- "targetRoom": "Rainwalker's Vault",
127
- "keyRequired": "Neural Keychip"
128
- }
122
+ { "direction": "north", "targetRoom": "Bar Backroom" }
129
123
  ]
130
124
  },
131
125
  {
132
- "name": "Rainwalker's Vault",
133
- "description": "A fortified room hidden beneath layers of false walls. Rows of lockers hold secrets, currency, and blackmail material.",
134
- "tags": ["Vault"],
135
- "supportedLifestyles": {
136
- "habitTags": ["Hoarding"]
137
- },
126
+ "name": "Bar Backroom",
127
+ "description": "Crates of unlabeled bottles, a card table with initials knifed into it, and a wall of photographs of runners who didn't come home. Quiet enough to actually talk.",
128
+ "roomType": "Bar"
129
+ },
130
+ {
131
+ "name": "Mama Wu's Noodles",
132
+ "description": "Steam, chili oil, and the best laksa in the Barrens-adjacent world. Mama Wu feeds everyone and forgets nothing.",
133
+ "roomType": "Restaurant"
134
+ },
135
+ {
136
+ "name": "Night Market",
137
+ "description": "Stalls of counterfeit everything under strings of dying festival lights. The real shops open off the market's edges -- iron, circuits, medicine, and things with no barcode at all.",
138
+ "roomType": "Market",
138
139
  "exits": [
139
- {
140
- "direction": "south",
141
- "targetRoom": "Hidden Clinic"
142
- },
143
- {
144
- "direction": "up",
145
- "targetRoom": "Rainwalker’s Loft"
146
- }
140
+ { "direction": "north", "targetRoom": "Ironmonger's Arms" },
141
+ { "direction": "east", "targetRoom": "Circuit Bazaar" },
142
+ { "direction": "south", "targetRoom": "Doc Halloran's Clinic" }
147
143
  ]
148
144
  },
149
145
  {
150
- "name": "Rainwalker’s Loft",
151
- "description": "An opulent apartment hidden above the city’s decay, lined with polished chrome, AR surveillance feeds, and a whisky cabinet.",
152
- "tags": ["residence"],
153
- "owner": "Rainwalker",
154
- "supportedLifestyles": {
155
- "residenceTiers": ["Luxury"]
156
- },
146
+ "name": "Ironmonger's Arms",
147
+ "description": "Racked steel and gun oil: Torque's shop sells serious hardware to serious people. Everything on the wall has a price and a history.",
148
+ "roomType": "Shop",
149
+ "owner": "Torque"
150
+ },
151
+ {
152
+ "name": "Circuit Bazaar",
153
+ "description": "Ratchet's electronics den -- benches of half-gutted decks, coils of optical cable, and a public host humming over the shopfront where locals trade files and gossip.",
154
+ "roomType": "Shop",
155
+ "owner": "Ratchet",
156
+ "hasNode": true,
157
157
  "exits": [
158
- {
159
- "direction": "down",
160
- "targetRoom": "Rainwalker's Vault"
161
- }
158
+ { "direction": "east", "targetRoom": "Talismonger's Hut" }
162
159
  ]
163
160
  },
164
161
  {
165
- "name": "Obsidian Lounge",
166
- "description": "A shadowrunner speakeasy hidden behind a trideo store, thick with smoke, synth-jazz, and whispered deals.",
167
- "supportedLifestyles": {
168
- "habitTags": ["Socializing", "Alcohol"]
169
- },
162
+ "name": "Talismonger's Hut",
163
+ "description": "Bundled herbs, etched copper, and the pressure of old rituals: Sister Verdigris's shop sits inside a working ward that hums against your teeth.",
164
+ "roomType": "Shop",
165
+ "owner": "Sister Verdigris",
166
+ "warded": true
167
+ },
168
+ {
169
+ "name": "Doc Halloran's Clinic",
170
+ "description": "A three-bed street clinic that smells of antiseptic and burnt coffee. Halloran patches runners with no questions and a running tab.",
171
+ "roomType": "Clinic",
172
+ "owner": "Doc Halloran"
173
+ },
174
+ {
175
+ "name": "Rain-Chewed Alley",
176
+ "description": "The way down: an alley chewed ragged by decades of acid rain, its storm drains breathing cold air up from the undermarket below.",
177
+ "roomType": "Street",
170
178
  "exits": [
171
- {
172
- "direction": "west",
173
- "targetRoom": "Rainwalker’s Loft"
174
- }
179
+ { "direction": "south", "targetRoom": "Flooded Undermarket" },
180
+ { "direction": "east", "targetRoom": "Union Pawnshop" }
181
+ ]
182
+ },
183
+ {
184
+ "name": "Union Pawnshop",
185
+ "description": "Whisper's cage of secondhand everything -- fenced goods, forgotten heirlooms, and a ledger of favors nobody wants called in.",
186
+ "roomType": "Shop",
187
+ "owner": "Whisper"
188
+ },
189
+ {
190
+ "name": "Flooded Undermarket",
191
+ "description": "The old market level, shin-deep in black water. Vendors work from stilted stalls; things move under the surface that nobody names.",
192
+ "roomType": "Market",
193
+ "exits": [
194
+ { "direction": "south", "targetRoom": "Smuggler's Tunnel" },
195
+ { "direction": "west", "targetRoom": "Condemned Chapel" }
175
196
  ]
197
+ },
198
+ {
199
+ "name": "Smuggler's Tunnel",
200
+ "description": "A bore of cracked ferrocrete running under the district, lit by chemlights and lined with cargo that never saw customs.",
201
+ "roomType": "Tunnel",
202
+ "exits": [
203
+ { "direction": "east", "targetRoom": "Haze Dragons Turf" },
204
+ { "direction": "south", "targetRoom": "Sim Den" }
205
+ ]
206
+ },
207
+ {
208
+ "name": "Haze Dragons Turf",
209
+ "description": "The Dragons' clubhouse: engine blocks for furniture, gang colors on every wall, and Brick holding court by the fire barrel. Respect gets you in; anything else gets you Brick.",
210
+ "roomType": "Gang Turf",
211
+ "owner": "Brick"
212
+ },
213
+ {
214
+ "name": "Condemned Chapel",
215
+ "description": "A drowned chapel leaning into the flood, its pews rafted together and its saints scoured faceless. Something still sings here at the edge of hearing.",
216
+ "roomType": "Chapel",
217
+ "exits": [
218
+ { "direction": "down", "targetRoom": "Chapel Crypt", "puzzle": "Crypt Grate" }
219
+ ]
220
+ },
221
+ {
222
+ "name": "Chapel Crypt",
223
+ "description": "A dry vault below the waterline, older than the district above it. The reliquary niches were emptied long ago -- almost all of them.",
224
+ "roomType": "Crypt"
225
+ },
226
+ {
227
+ "name": "Sim Den",
228
+ "description": "Rows of scavenged sim-couches wired into a matte-black host with no wireless presence at all -- hard lines only, the way the paranoid like it. The couches whisper with other people's dreams.",
229
+ "roomType": "Den",
230
+ "hasNode": true,
231
+ "nodeAccess": "wired"
232
+ },
233
+ {
234
+ "name": "Johnson's Office",
235
+ "description": "Wherever Mr. Johnson actually works from. You have never seen it and never will.",
236
+ "roomType": "Office",
237
+ "reachable": false
176
238
  }
177
239
  ],
178
240
  "npcs": [
179
241
  {
242
+ "description": "Mr. Johnson is the district's job broker: anonymous, punctual, and permanently unreachable in person. He commissions runs over comms and pays exactly what he quotes. When called with no job active, he offers work.",
180
243
  "dialogue": [
181
- "Every scar's got a story, omae.",
182
- "I patch you up, no questions, no judgment.",
183
- "You didn't see me. You were never here."
244
+ "You know how this works. I call the number, you do the thing, the cred appears.",
245
+ "Call me when you're ready to work.",
246
+ "No names. That's the whole point of me."
184
247
  ],
185
- "description": "A weathered elf with surgical hands and haunted eyes. Dr. Nyx runs a back-alley clinic with a conscience he denies having.",
186
248
  "player": {
187
- "name": "Dr. Nyx",
188
- "startLocation": "Hidden Clinic",
189
- "lifestyleChoices": [
190
- {
191
- "type": "residence",
192
- "metadata": {
193
- "tier": "Low",
194
- "location": "Hidden Clinic"
195
- }
196
- },
197
- {
198
- "type": "employment",
199
- "metadata": {
200
- "jobTitle": "Street Doc"
201
- }
202
- },
203
- {
204
- "type": "vice",
205
- "metadata": {
206
- "habits": ["MedStims"]
207
- }
249
+ "name": "Mr. Johnson",
250
+ "startLocation": "Johnson's Office",
251
+ "lifestyleChoices": []
252
+ }
253
+ },
254
+ {
255
+ "description": "Torque runs Ironmonger's Arms: an ex-mercenary dwarf who sells weapons and armor at honest prices to people she likes. She does not extend credit and does not tolerate theft.",
256
+ "dialogue": [
257
+ "Everything on that wall works. I test-fire personally.",
258
+ "You break it, you bought it. You steal it, I bury you with it.",
259
+ "Predators are in this week. Serious iron for serious people."
260
+ ],
261
+ "player": {
262
+ "name": "Torque",
263
+ "startLocation": "Ironmonger's Arms",
264
+ "lifestyleChoices": [],
265
+ "combat": {
266
+ "body": 5,
267
+ "agility": 4,
268
+ "reaction": 4,
269
+ "combatSkill": 5,
270
+ "strength": 5,
271
+ "willpower": 4,
272
+ "intuition": 3,
273
+ "charisma": 2,
274
+ "skills": {
275
+ "firearms": 6,
276
+ "unarmed": 4,
277
+ "perception": 4,
278
+ "intimidation": 4,
279
+ "negotiation": 3
280
+ }
281
+ }
282
+ }
283
+ },
284
+ {
285
+ "description": "Ratchet is the Circuit Bazaar's owner: a wiry decker who sells, repairs, and quietly upgrades electronics. He knows every host in the district, including the Sim Den's air-gapped one, and gossips freely with fellow tech-heads.",
286
+ "dialogue": [
287
+ "Everything here boots. Mostly.",
288
+ "The Sim Den host? Hard lines only, chummer. Somebody down there is paranoid for a REASON.",
289
+ "Bring me broken decks. I like the sad ones."
290
+ ],
291
+ "player": {
292
+ "name": "Ratchet",
293
+ "startLocation": "Circuit Bazaar",
294
+ "lifestyleChoices": [],
295
+ "combat": {
296
+ "body": 2,
297
+ "agility": 3,
298
+ "reaction": 3,
299
+ "combatSkill": 2,
300
+ "willpower": 4,
301
+ "logic": 6,
302
+ "intuition": 4,
303
+ "charisma": 3,
304
+ "skills": {
305
+ "hacking": 6,
306
+ "perception": 4,
307
+ "locksmith": 3,
308
+ "con": 2
208
309
  }
209
- ]
310
+ }
210
311
  }
211
312
  },
212
313
  {
314
+ "description": "Sister Verdigris is the district's talismonger: an Awakened woman who trades in foci, formulas, and quiet warnings. Her shop's ward is her own work and her pride. She reads auras out of habit.",
213
315
  "dialogue": [
214
- "Up here, you're above the noise. Remember that.",
215
- "Information is the real currency.",
216
- "I don’t forget debts. Neither should you."
316
+ "The ward stays up, dear. It is not personal. It is structural.",
317
+ "Foci, formulas, and honest advice -- two of the three have prices.",
318
+ "The chapel spirit below sings sadder lately. Someone should visit her."
217
319
  ],
218
- "description": "An imposing figure in a tailored synth-leather coat. Rainwalker is a human data broker who sees everything — and forgets nothing.",
219
320
  "player": {
220
- "name": "Rainwalker",
221
- "startLocation": "Rainwalker’s Loft",
222
- "lifestyleChoices": [
223
- {
224
- "type": "residence",
225
- "metadata": {
226
- "tier": "Luxury",
227
- "location": "Rainwalker’s Loft"
228
- }
229
- },
230
- {
231
- "type": "employment",
232
- "metadata": {
233
- "jobTitle": "Data Broker"
234
- }
235
- },
236
- {
237
- "type": "vice",
238
- "metadata": {
239
- "addictions": ["Whiskey"]
240
- }
321
+ "name": "Sister Verdigris",
322
+ "startLocation": "Talismonger's Hut",
323
+ "lifestyleChoices": [],
324
+ "combat": {
325
+ "body": 3,
326
+ "agility": 3,
327
+ "reaction": 3,
328
+ "combatSkill": 2,
329
+ "willpower": 6,
330
+ "logic": 4,
331
+ "intuition": 5,
332
+ "charisma": 4,
333
+ "magic": 5,
334
+ "skills": {
335
+ "spellcasting": 5,
336
+ "assensing": 5,
337
+ "perception": 4,
338
+ "negotiation": 3
241
339
  }
242
- ]
340
+ }
243
341
  }
244
342
  },
245
343
  {
344
+ "description": "Doc Halloran runs the street clinic: a weary human trauma surgeon who left corp medicine and never explains why. He patches anyone, sells supplies at cost to regulars, and remembers every bullet he has pulled.",
246
345
  "dialogue": [
247
- "They call me Slink. I disappear when I need to.",
248
- "You're looking for something? Maybe I already found it.",
249
- "Just don’t ask where I got it from."
346
+ "Sit. Bleed on the tray, not the floor.",
347
+ "Medkits are on the shelf. Pay what you can. Pay SOMETHING.",
348
+ "You runners keep me in business and out of sleep."
250
349
  ],
251
- "description": "A wiry dwarf with darting eyes and restless fingers. Slink specializes in getting in and out of tight spots — and tight vaults.",
252
350
  "player": {
253
- "name": "Slink",
254
- "startLocation": "Obsidian Lounge",
255
- "lifestyleChoices": [
256
- {
257
- "type": "residence",
258
- "metadata": {
259
- "tier": "Squatter",
260
- "location": "Drowned Alley"
261
- }
262
- },
263
- {
264
- "type": "employment",
265
- "metadata": {
266
- "jobTitle": "Smuggler"
267
- }
268
- },
269
- {
270
- "type": "hobby",
271
- "metadata": {
272
- "tags": ["Lockpicking", "Urban Exploration"]
273
- }
351
+ "name": "Doc Halloran",
352
+ "startLocation": "Doc Halloran's Clinic",
353
+ "lifestyleChoices": [],
354
+ "combat": {
355
+ "body": 3,
356
+ "agility": 3,
357
+ "reaction": 3,
358
+ "combatSkill": 2,
359
+ "willpower": 4,
360
+ "logic": 6,
361
+ "intuition": 4,
362
+ "charisma": 3,
363
+ "skills": {
364
+ "first-aid": 6,
365
+ "perception": 4,
366
+ "negotiation": 3
274
367
  }
275
- ]
368
+ }
369
+ }
370
+ },
371
+ {
372
+ "description": "Mama Wu owns the noodle stand and, functionally, the district's rumor network. She feeds everyone, likes being flattered, and trades gossip for company. Nothing happens on the Strip she doesn't hear about.",
373
+ "dialogue": [
374
+ "Sit, eat. Skinny runners die faster.",
375
+ "The Dragons are twitchy this week. Eat your noodles somewhere ELSE if you plan to be stupid.",
376
+ "Everyone tells Mama Wu everything. Eventually."
377
+ ],
378
+ "player": {
379
+ "name": "Mama Wu",
380
+ "startLocation": "Mama Wu's Noodles",
381
+ "lifestyleChoices": [],
382
+ "combat": {
383
+ "body": 3,
384
+ "agility": 2,
385
+ "reaction": 3,
386
+ "combatSkill": 1,
387
+ "willpower": 5,
388
+ "intuition": 5,
389
+ "charisma": 5,
390
+ "skills": {
391
+ "perception": 5,
392
+ "negotiation": 5,
393
+ "con": 3
394
+ }
395
+ }
396
+ }
397
+ },
398
+ {
399
+ "description": "Brick is the Haze Dragons' lieutenant: an ork mountain who respects strength, nerve, and very little else. He'll spar, arm-wrestle, or trade war stories with anyone who impresses him -- and flatten anyone who disrespects the turf. He is not looking for a war with a local runner.",
400
+ "dialogue": [
401
+ "This is Dragons' ground. State your business or state your teeth.",
402
+ "You want respect down here? Earn it. Words or fists, your pick.",
403
+ "Johnson's errand rat, huh. He pays you fair? He better."
404
+ ],
405
+ "player": {
406
+ "name": "Brick",
407
+ "startLocation": "Haze Dragons Turf",
408
+ "lifestyleChoices": [],
409
+ "combat": {
410
+ "body": 6,
411
+ "agility": 4,
412
+ "reaction": 4,
413
+ "combatSkill": 5,
414
+ "strength": 6,
415
+ "willpower": 4,
416
+ "intuition": 3,
417
+ "charisma": 3,
418
+ "skills": {
419
+ "unarmed": 6,
420
+ "blades": 5,
421
+ "firearms": 4,
422
+ "intimidation": 5,
423
+ "perception": 3
424
+ }
425
+ }
426
+ }
427
+ },
428
+ {
429
+ "description": "Whisper runs the Union Pawnshop and fences whatever crosses the counter, no questions recorded. A silver-tongued elf who lies as easily as breathing and respects anyone who catches them at it.",
430
+ "dialogue": [
431
+ "Everything's authentic. Some things are authentically stolen.",
432
+ "Buying, selling, or confessing? The rates differ.",
433
+ "The crypt under the chapel? Old bones, old locks, old stories. I sell one of the three."
434
+ ],
435
+ "player": {
436
+ "name": "Whisper",
437
+ "startLocation": "Union Pawnshop",
438
+ "lifestyleChoices": [],
439
+ "combat": {
440
+ "body": 2,
441
+ "agility": 4,
442
+ "reaction": 4,
443
+ "combatSkill": 2,
444
+ "willpower": 4,
445
+ "intuition": 5,
446
+ "charisma": 6,
447
+ "skills": {
448
+ "con": 6,
449
+ "negotiation": 5,
450
+ "sneaking": 4,
451
+ "perception": 4,
452
+ "locksmith": 3
453
+ }
454
+ }
455
+ }
456
+ },
457
+ {
458
+ "plane": "matrix",
459
+ "description": "Static Ghost is the Sim Den host's resident ice: a scavenged military countermeasure someone wired into a bootleg sim parlor. It guards the den's files with disproportionate ferocity.",
460
+ "dialogue": [
461
+ "THIS HOST IS PROTECTED.",
462
+ "your dreams are not your own here. leave."
463
+ ],
464
+ "player": {
465
+ "name": "Static Ghost",
466
+ "startLocation": "Sim Den",
467
+ "lifestyleChoices": [],
468
+ "combat": {
469
+ "body": 3,
470
+ "agility": 3,
471
+ "reaction": 4,
472
+ "combatSkill": 4,
473
+ "willpower": 4,
474
+ "logic": 6,
475
+ "intuition": 4
476
+ }
477
+ }
478
+ },
479
+ {
480
+ "plane": "astral",
481
+ "description": "The Drowned Choir is a merged spirit of the chapel's lost congregation: many voices, one grief. It sings in the astral above the flooded pews, remembers every parishioner, and welcomes the Awakened who visit politely.",
482
+ "dialogue": [
483
+ "We remember singing. Sing with us, two-worlds-walker.",
484
+ "The water took the nave but not the song.",
485
+ "The crypt keeps our quietest brother. Let him sleep."
486
+ ],
487
+ "player": {
488
+ "name": "The Drowned Choir",
489
+ "startLocation": "Condemned Chapel",
490
+ "lifestyleChoices": [],
491
+ "combat": {
492
+ "body": 4,
493
+ "agility": 3,
494
+ "reaction": 4,
495
+ "combatSkill": 3,
496
+ "willpower": 6,
497
+ "intuition": 5,
498
+ "magic": 5
499
+ }
276
500
  }
277
501
  }
278
502
  ],
279
503
  "items": [
280
504
  {
281
- "name": "Trust and Sparks",
282
- "description": "A philosophical book wrapped in synth-paper discussing the fragile relationship between trust and machine interface.",
505
+ "name": "Johnson's Commlink",
506
+ "description": "A high-end encrypted commlink that is never powered down and never traced.",
283
507
  "size": "Small",
284
- "category": "Book",
508
+ "category": "Commlink",
509
+ "shape": "Slab",
510
+ "color": "Matte Black",
511
+ "texture": "Cold Metal",
512
+ "rating": "Rare",
513
+ "weight": 0.2,
514
+ "heldBy": "Mr. Johnson",
515
+ "owner": "Mr. Johnson",
516
+ "transferable": false
517
+ },
518
+ {
519
+ "name": "Ares Predator V",
520
+ "description": "The iconic heavy pistol of the shadows, racked behind Torque's counter with a price tag that means it.",
521
+ "size": "Small",
522
+ "category": "RangedWeapon",
523
+ "shape": "Pistol",
524
+ "color": "Gunmetal",
525
+ "texture": "Machined Steel",
526
+ "rating": "Rare",
527
+ "weight": 2,
528
+ "room": "Ironmonger's Arms",
529
+ "owner": "Torque"
530
+ },
531
+ {
532
+ "name": "Combat Axe",
533
+ "description": "A brutal single-bit axe with a composite haft. Torque calls it the 'negotiation ender'.",
534
+ "size": "Medium",
535
+ "category": "MeleeWeapon",
536
+ "shape": "Axe",
537
+ "color": "Black",
538
+ "texture": "Composite",
539
+ "rating": "Standard",
540
+ "weight": 2.5,
541
+ "room": "Ironmonger's Arms",
542
+ "owner": "Torque"
543
+ },
544
+ {
545
+ "name": "Ballistic Vest",
546
+ "description": "Plain, heavy, and honest protection. No smartweave, no excuses.",
547
+ "size": "Large",
548
+ "category": "BodyArmor",
549
+ "shape": "Vest",
550
+ "color": "Slate",
551
+ "texture": "Ballistic Weave",
552
+ "rating": "Standard",
553
+ "weight": 4,
554
+ "room": "Ironmonger's Arms",
555
+ "owner": "Torque"
556
+ },
557
+ {
558
+ "name": "Boxed Ammunition",
559
+ "description": "A factory-sealed box of street-caliber rounds from Torque's stock.",
560
+ "size": "Tiny",
561
+ "category": "Ammunition",
562
+ "shape": "Box",
563
+ "color": "Olive",
564
+ "texture": "Cardboard",
565
+ "rating": "Common",
566
+ "weight": 0.4,
567
+ "room": "Ironmonger's Arms",
568
+ "owner": "Torque"
569
+ },
570
+ {
571
+ "name": "Renraku Kitsune",
572
+ "description": "A sleek secondhand cyberdeck on Ratchet's display bench, refurbished and lovingly overclocked.",
573
+ "size": "Small",
574
+ "category": "Cyberdeck",
575
+ "shape": "Deck",
576
+ "color": "Pearl White",
577
+ "texture": "Lacquered",
578
+ "rating": "Standard",
579
+ "weight": 2,
580
+ "room": "Circuit Bazaar",
581
+ "owner": "Ratchet"
582
+ },
583
+ {
584
+ "name": "Shop Commlink",
585
+ "description": "A reliable mid-range commlink from Ratchet's shelf, factory-reset and de-bugged. Probably.",
586
+ "size": "Tiny",
587
+ "category": "Commlink",
285
588
  "shape": "Rectangle",
286
- "color": "Ivory",
287
- "texture": "Smooth",
589
+ "color": "Blue",
590
+ "texture": "Polycarbonate",
288
591
  "rating": "Standard",
289
- "weight": 0.7,
290
- "room": "Hidden Clinic",
291
- "details": "Excerpt: 'Machines do not trust. They await alignment. And in that spark of unity — when man and machine speak the same pulse — doors open.'"
592
+ "weight": 0.1,
593
+ "room": "Circuit Bazaar",
594
+ "owner": "Ratchet"
292
595
  },
293
596
  {
294
- "name": "Secrets of the Street",
295
- "description": "A worn manual penned by an anonymous urban explorer. Scribbled maps and cryptic notes line the margins.",
597
+ "name": "Spell Formula: Heal",
598
+ "description": "A licensed teaching copy of the Heal formula, annotated in Sister Verdigris's neat hand.",
296
599
  "size": "Small",
297
- "category": "Book",
600
+ "category": "SpellFormula",
601
+ "shape": "Scroll",
602
+ "color": "Cream",
603
+ "texture": "Vellum",
604
+ "rating": "Standard",
605
+ "weight": 0.3,
606
+ "room": "Talismonger's Hut",
607
+ "owner": "Sister Verdigris"
608
+ },
609
+ {
610
+ "name": "Copper Focus",
611
+ "description": "A spiral of etched copper that warms in an Awakened hand. Shop-grade, honestly priced.",
612
+ "size": "Tiny",
613
+ "category": "Focus",
614
+ "shape": "Spiral",
615
+ "color": "Copper",
616
+ "texture": "Etched Metal",
617
+ "rating": "Standard",
618
+ "weight": 0.2,
619
+ "room": "Talismonger's Hut",
620
+ "owner": "Sister Verdigris"
621
+ },
622
+ {
623
+ "name": "Trauma Kit",
624
+ "description": "A doc-grade field kit from Halloran's shelf: sprays, staples, and things that hiss.",
625
+ "size": "Small",
626
+ "category": "Medical",
627
+ "shape": "Case",
628
+ "color": "White",
629
+ "texture": "Hard Shell",
630
+ "rating": "Rare",
631
+ "weight": 1.5,
632
+ "room": "Doc Halloran's Clinic",
633
+ "owner": "Doc Halloran"
634
+ },
635
+ {
636
+ "name": "Field Medkit",
637
+ "description": "A standard street medkit, restocked this week.",
638
+ "size": "Small",
639
+ "category": "Medical",
640
+ "shape": "Pouch",
641
+ "color": "Red",
642
+ "texture": "Nylon",
643
+ "rating": "Standard",
644
+ "weight": 1,
645
+ "room": "Doc Halloran's Clinic",
646
+ "owner": "Doc Halloran"
647
+ },
648
+ {
649
+ "name": "Clinic Stim Patch",
650
+ "description": "A clinical-grade stimulant patch. The crash is printed on the label, which is more honesty than the street version offers.",
651
+ "size": "Tiny",
652
+ "category": "StimPatch",
298
653
  "shape": "Square",
299
- "color": "Dark Green",
300
- "texture": "Worn Leather",
654
+ "color": "White",
655
+ "texture": "Foil",
656
+ "rating": "Standard",
657
+ "weight": 0.05,
658
+ "room": "Doc Halloran's Clinic",
659
+ "owner": "Doc Halloran"
660
+ },
661
+ {
662
+ "name": "Bowl of Laksa",
663
+ "description": "Mama Wu's laksa: chili oil, coconut, and the will to keep going.",
664
+ "size": "Small",
665
+ "category": "Vice",
666
+ "shape": "Bowl",
667
+ "color": "Red-Gold",
668
+ "texture": "Steaming",
669
+ "rating": "Standard",
670
+ "weight": 0.5,
671
+ "room": "Mama Wu's Noodles",
672
+ "owner": "Mama Wu"
673
+ },
674
+ {
675
+ "name": "Purple Haze Special",
676
+ "description": "The house drink: violet, luminous, and legally ambiguous.",
677
+ "size": "Tiny",
678
+ "category": "Vice",
679
+ "shape": "Glass",
680
+ "color": "Violet",
681
+ "texture": "Luminous",
301
682
  "rating": "Common",
302
- "weight": 0.6,
303
- "room": "Obsidian Lounge",
304
- "details": "A note in the margins reads: 'The city breathes through forgotten cracks — bricks that give way, alleys that lead nowhere... and doors with no handles. The urban key is awareness.'"
683
+ "weight": 0.3,
684
+ "room": "Purple Haze Bar"
305
685
  },
306
686
  {
307
- "name": "NeuroSync Theory",
308
- "description": "A dense tome filled with esoteric diagrams and fragmented research on neural interface harmonics.",
309
- "size": "Medium",
687
+ "name": "Wall of the Fallen Ledger",
688
+ "description": "A hand-bound book beneath the backroom's photographs, recording every runner the district lost and how.",
689
+ "details": "The last page is half-filled. There is room for more names, and the handwriting changes every few years -- whoever keeps the wall, keeps it faithfully.",
690
+ "size": "Small",
310
691
  "category": "Book",
311
692
  "shape": "Rectangle",
693
+ "color": "Black",
694
+ "texture": "Hand-Bound",
695
+ "rating": "Common",
696
+ "weight": 0.6,
697
+ "room": "Bar Backroom"
698
+ },
699
+ {
700
+ "name": "Crypt Notes",
701
+ "description": "A pawned notebook of a dead urban explorer, thick with sketches of the chapel's lower level.",
702
+ "details": "The final sketch shows the crypt grate and its old mechanical lock, annotated: 'The verger's trick -- the tumblers answer to the saint of rust. Say it, or pick it, but the grate WILL open for the patient.'",
703
+ "size": "Small",
704
+ "category": "Book",
705
+ "shape": "Notebook",
312
706
  "color": "Gray",
313
- "texture": "Rough",
314
- "rating": "Standard",
315
- "weight": 1.2,
316
- "heldBy": "Rainwalker",
317
- "owner": "Rainwalker",
318
- "details": "Chapter 3: 'Only when the sync is complete—when nerve and node hum in harmony—can the lock yield to thought.'"
707
+ "texture": "Water-Stained",
708
+ "rating": "Common",
709
+ "weight": 0.3,
710
+ "room": "Union Pawnshop",
711
+ "owner": "Whisper"
319
712
  },
320
713
  {
321
- "name": "Neural Keychip",
322
- "description": "A bio-coded chip that interfaces with security nodes, shaped like a spinal vertebra.",
714
+ "name": "Chipped Credstick",
715
+ "description": "A secondhand credstick from Whisper's counter, history unknown and unasked.",
716
+ "size": "Small",
717
+ "category": "CurrencyContainer",
718
+ "shape": "Cylinder",
719
+ "color": "Scratched Silver",
720
+ "texture": "Worn",
721
+ "rating": "Common",
722
+ "weight": 0.2,
723
+ "currencyAmount": 120,
724
+ "room": "Union Pawnshop",
725
+ "owner": "Whisper"
726
+ },
727
+ {
728
+ "name": "Lockpick Set",
729
+ "description": "Precision picks and tension bars in a roll of oiled leather, pawned by someone who went straight or went down.",
323
730
  "size": "Tiny",
324
- "category": "Key",
325
- "shape": "Curved",
326
- "color": "Gunmetal",
327
- "texture": "Smooth",
731
+ "category": "Tool",
732
+ "shape": "Roll",
733
+ "color": "Brown",
734
+ "texture": "Oiled Leather",
328
735
  "rating": "Standard",
329
- "weight": 0.03,
330
- "heldBy": "Dr. Nyx",
331
- "owner": "Dr. Nyx",
332
- "droppable": false,
333
- "transferable": false
736
+ "weight": 0.3,
737
+ "room": "Union Pawnshop",
738
+ "owner": "Whisper"
334
739
  },
335
740
  {
336
- "name": "Encrypted Credstick",
337
- "description": "A high-limit credstick with a rotating encryption core. Worth a small fortune.",
741
+ "name": "Soggy District Flyer",
742
+ "description": "A rain-pulped flyer for the Purple Haze district, still half-readable.",
743
+ "details": "The legible part maps the district: the Bar and Wu's off the Strip, the Night Market's shops to the east, and the undermarket below the alley -- 'mind the Dragons, tip the Doc, and never take the last noodle.'",
744
+ "size": "Tiny",
745
+ "category": "Book",
746
+ "shape": "Flyer",
747
+ "color": "Faded Purple",
748
+ "texture": "Pulped Paper",
749
+ "rating": "Common",
750
+ "weight": 0.05,
751
+ "room": "Neon Strip"
752
+ },
753
+ {
754
+ "name": "Dragons' Stash Credstick",
755
+ "description": "The Haze Dragons' petty cash, sitting in the open because nobody in this district is that stupid.",
338
756
  "size": "Small",
339
757
  "category": "CurrencyContainer",
340
- "shape": "Cylinder",
341
- "color": "Blue",
342
- "texture": "Matte",
343
- "rating": "Rare",
758
+ "shape": "Rectangle",
759
+ "color": "Green",
760
+ "texture": "Stickered",
761
+ "rating": "Common",
344
762
  "weight": 0.2,
345
- "currencyAmount": 3200,
346
- "room": "Rainwalker's Vault"
763
+ "currencyAmount": 200,
764
+ "room": "Haze Dragons Turf",
765
+ "owner": "Brick"
766
+ },
767
+ {
768
+ "name": "Dragon Cleaver",
769
+ "description": "Brick's personal blade: half machete, half doctrine.",
770
+ "size": "Medium",
771
+ "category": "MeleeWeapon",
772
+ "shape": "Cleaver",
773
+ "color": "Scarred Steel",
774
+ "texture": "Notched",
775
+ "rating": "Standard",
776
+ "weight": 2.2,
777
+ "heldBy": "Brick",
778
+ "owner": "Brick",
779
+ "transferable": false
347
780
  },
348
781
  {
349
- "name": "Whiskey Vial",
350
- "description": "A small, flat bottle labeled 'Rainwalker Reserve'. Smells of oak and digital fire.",
782
+ "name": "Ghost-Sim Bootlegs",
783
+ "description": "A cache of bootleg sim-recordings on the den's host -- other people's stolen sensory memories, flickering behind the ice.",
784
+ "details": "Someone's whole life is in here, felt first-hand. The den's regulars pay well for the vivid ones and better for the forbidden ones.",
351
785
  "size": "Tiny",
352
- "category": "Vice",
353
- "shape": "Flask",
354
- "color": "Amber",
355
- "texture": "Glass",
786
+ "category": "Datachip",
787
+ "shape": "Virtual Shelf",
788
+ "color": "Static Gray",
789
+ "texture": "Digital",
356
790
  "rating": "Rare",
357
- "weight": 0.1,
358
- "room": "Rainwalker’s Loft"
791
+ "weight": 0,
792
+ "plane": "matrix",
793
+ "room": "Sim Den"
359
794
  },
360
795
  {
361
- "name": "Lockpick Set",
362
- "description": "A compact set of smartpicks and sonic pulses for disabling most analog locks.",
796
+ "name": "Drowned Reliquary",
797
+ "description": "A small reliquary of fused glass and silver from the crypt's one unlooted niche, cold as deep water and humming with old faith.",
363
798
  "size": "Tiny",
364
- "category": "Tool",
365
- "shape": "Rectangular Case",
366
- "color": "Black",
367
- "texture": "Carbon Fiber",
799
+ "category": "Focus",
800
+ "shape": "Reliquary",
801
+ "color": "Sea Glass",
802
+ "texture": "Fused Silver",
803
+ "rating": "Rare",
804
+ "weight": 0.4,
805
+ "room": "Chapel Crypt"
806
+ },
807
+ {
808
+ "name": "Tarnished Credstick",
809
+ "description": "A pre-flood credstick from the crypt floor, miraculously still certified.",
810
+ "size": "Small",
811
+ "category": "CurrencyContainer",
812
+ "shape": "Cylinder",
813
+ "color": "Tarnished",
814
+ "texture": "Corroded",
368
815
  "rating": "Common",
369
816
  "weight": 0.2,
370
- "heldBy": "Slink",
371
- "owner": "Slink"
817
+ "currencyAmount": 300,
818
+ "room": "Chapel Crypt"
372
819
  }
373
820
  ],
374
821
  "puzzles": [
375
822
  {
376
- "name": "Vault Challenge",
377
- "rewardItem": "Encrypted Credstick",
378
- "requiredPhrase": "neural sync complete",
379
- "riddle": "Only those with the right frequency, the right nerve, and a spark of trust may pass into the shadows of wealth.",
380
- "successMessage": "The neural lock flashes green. The vault opens with a low hiss.",
381
- "failureMessage": "A jolt of static surges through your spine. The vault remains sealed.",
382
- "hobbyTags": ["Neural Tech", "Cybernetics"],
383
- "room": "Rainwalker's Vault"
384
- },
385
- {
386
- "name": "Street Puzzle",
387
- "rewardItem": "Lockpick Set",
388
- "requiredPhrase": "urban key",
389
- "riddle": "What has no hinges, key, or lid, yet opens doors where none exist?",
390
- "successMessage": "You find a secret panel in the alley wall, revealing the prized toolkit.",
391
- "failureMessage": "Your fingers find nothing but rust and regret.",
392
- "hobbyTags": ["Urban Exploration", "Smuggling"],
393
- "room": "Drowned Alley"
823
+ "name": "Crypt Grate",
824
+ "riddle": "You see a rust-welded iron grate in the chapel floor, its old mechanical lock built to answer a spoken verger's phrase -- or a very patient set of picks.",
825
+ "requiredPhrase": "the saint of rust",
826
+ "successMessage": "The tumblers grind through decades of corrosion and the grate swings up on screaming hinges.",
827
+ "failureMessage": "The mechanism seizes. Flakes of rust drift down into the dark, and the Choir's song falters for a beat.",
828
+ "bypassType": "lockpick"
394
829
  }
395
- ],
396
- "winCondition": {
397
- "type": "possess",
398
- "item": "Encrypted Credstick",
399
- "completionMessage": "The vault's contents are in your hands. Whatever blackmail material Rainwalker was hoarding, its leverage now belongs to whoever holds this credstick -- and that's you."
400
- }
830
+ ]
401
831
  }
402
-