@maka/maka-cli 5.63.1 → 5.65.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 (205) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/ar.js +29 -8
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/ar.js.map +1 -1
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.d.ts +42 -0
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js +86 -3
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js.map +1 -1
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.d.ts +29 -2
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js +151 -1
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.d.ts +40 -13
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +107 -25
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/breach.d.ts +11 -15
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/breach.js +13 -16
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/breach.js.map +1 -1
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.d.ts +8 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js +30 -2
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js.map +1 -1
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.d.ts +40 -49
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +121 -160
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -1
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +29 -5
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.d.ts +7 -8
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +13 -13
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -1
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/contacts.js +22 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/contacts.js.map +1 -1
  29. package/bundle/typescript/src/commands/game/sideQuest/commands/cover.d.ts +30 -0
  30. package/bundle/typescript/src/commands/game/sideQuest/commands/cover.js +65 -0
  31. package/bundle/typescript/src/commands/game/sideQuest/commands/cover.js.map +1 -0
  32. package/bundle/typescript/src/commands/game/sideQuest/commands/dispel.d.ts +1 -1
  33. package/bundle/typescript/src/commands/game/sideQuest/commands/dispel.js +2 -2
  34. package/bundle/typescript/src/commands/game/sideQuest/commands/dispel.js.map +1 -1
  35. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +25 -3
  36. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
  37. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.d.ts +2 -3
  38. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +2 -2
  39. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -1
  40. package/bundle/typescript/src/commands/game/sideQuest/commands/jobs.js +18 -10
  41. package/bundle/typescript/src/commands/game/sideQuest/commands/jobs.js.map +1 -1
  42. package/bundle/typescript/src/commands/game/sideQuest/commands/journal.d.ts +44 -0
  43. package/bundle/typescript/src/commands/game/sideQuest/commands/journal.js +136 -0
  44. package/bundle/typescript/src/commands/game/sideQuest/commands/journal.js.map +1 -0
  45. package/bundle/typescript/src/commands/game/sideQuest/commands/look.d.ts +20 -0
  46. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +157 -5
  47. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
  48. package/bundle/typescript/src/commands/game/sideQuest/commands/map.js +18 -4
  49. package/bundle/typescript/src/commands/game/sideQuest/commands/map.js.map +1 -1
  50. package/bundle/typescript/src/commands/game/sideQuest/commands/move.js +1 -1
  51. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.d.ts +2 -3
  52. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +2 -2
  53. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -1
  54. package/bundle/typescript/src/commands/game/sideQuest/commands/players.js +8 -2
  55. package/bundle/typescript/src/commands/game/sideQuest/commands/players.js.map +1 -1
  56. package/bundle/typescript/src/commands/game/sideQuest/commands/posture.d.ts +45 -0
  57. package/bundle/typescript/src/commands/game/sideQuest/commands/posture.js +115 -0
  58. package/bundle/typescript/src/commands/game/sideQuest/commands/posture.js.map +1 -0
  59. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +46 -12
  60. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  61. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +30 -1
  62. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -1
  63. package/bundle/typescript/src/commands/game/sideQuest/commands/silent.js +11 -1
  64. package/bundle/typescript/src/commands/game/sideQuest/commands/silent.js.map +1 -1
  65. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +12 -0
  66. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
  67. package/bundle/typescript/src/commands/game/sideQuest/commands/talk.d.ts +47 -0
  68. package/bundle/typescript/src/commands/game/sideQuest/commands/talk.js +91 -5
  69. package/bundle/typescript/src/commands/game/sideQuest/commands/talk.js.map +1 -1
  70. package/bundle/typescript/src/commands/game/sideQuest/commands/time.d.ts +20 -0
  71. package/bundle/typescript/src/commands/game/sideQuest/commands/time.js +61 -0
  72. package/bundle/typescript/src/commands/game/sideQuest/commands/time.js.map +1 -0
  73. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js +1 -1
  74. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js.map +1 -1
  75. package/bundle/typescript/src/commands/game/sideQuest/commands/use.d.ts +17 -0
  76. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +136 -1
  77. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
  78. package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
  79. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +15 -1
  80. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
  81. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +128 -44
  82. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +551 -254
  83. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
  84. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +82 -84
  85. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
  86. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.d.ts +23 -4
  87. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +95 -79
  88. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js.map +1 -1
  89. package/bundle/typescript/src/commands/game/sideQuest/factories/seed-migration.d.ts +30 -0
  90. package/bundle/typescript/src/commands/game/sideQuest/factories/seed-migration.js +176 -0
  91. package/bundle/typescript/src/commands/game/sideQuest/factories/seed-migration.js.map +1 -0
  92. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +104 -0
  93. package/bundle/typescript/src/commands/game/sideQuest/game.js +268 -16
  94. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  95. package/bundle/typescript/src/commands/game/sideQuest/headless-harness.d.ts +78 -0
  96. package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js +188 -0
  97. package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js.map +1 -0
  98. package/bundle/typescript/src/commands/game/sideQuest/headless.d.ts +5 -0
  99. package/bundle/typescript/src/commands/game/sideQuest/headless.js +78 -0
  100. package/bundle/typescript/src/commands/game/sideQuest/headless.js.map +1 -1
  101. package/bundle/typescript/src/commands/game/sideQuest/models/_index.d.ts +0 -1
  102. package/bundle/typescript/src/commands/game/sideQuest/models/_index.js +0 -1
  103. package/bundle/typescript/src/commands/game/sideQuest/models/_index.js.map +1 -1
  104. package/bundle/typescript/src/commands/game/sideQuest/models/device.d.ts +121 -0
  105. package/bundle/typescript/src/commands/game/sideQuest/models/device.js +145 -0
  106. package/bundle/typescript/src/commands/game/sideQuest/models/device.js.map +1 -0
  107. package/bundle/typescript/src/commands/game/sideQuest/models/door.d.ts +27 -8
  108. package/bundle/typescript/src/commands/game/sideQuest/models/door.js +15 -10
  109. package/bundle/typescript/src/commands/game/sideQuest/models/door.js.map +1 -1
  110. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +143 -0
  111. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +253 -30
  112. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  113. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +68 -0
  114. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +102 -0
  115. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  116. package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +80 -34
  117. package/bundle/typescript/src/commands/game/sideQuest/models/room.js +126 -54
  118. package/bundle/typescript/src/commands/game/sideQuest/models/room.js.map +1 -1
  119. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +1 -4
  120. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +0 -22
  121. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  122. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +78 -109
  123. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +4 -101
  124. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +24 -0
  125. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.d.ts +52 -0
  126. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.js +2 -0
  127. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.js.map +1 -0
  128. package/bundle/typescript/src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.d.ts +63 -0
  129. package/bundle/typescript/src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.js +2 -0
  130. package/bundle/typescript/src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.js.map +1 -0
  131. package/bundle/typescript/src/commands/game/sideQuest/types/seed/player-seed.d.ts +6 -0
  132. package/bundle/typescript/src/commands/game/sideQuest/types/seed/room-seed.d.ts +4 -0
  133. package/bundle/typescript/src/commands/game/sideQuest/types/seed/scene-seed.d.ts +3 -2
  134. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.d.ts +2 -28
  135. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js +1 -14
  136. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js.map +1 -1
  137. package/bundle/typescript/src/commands/game/sideQuest/ui.js +24 -0
  138. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  139. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.d.ts +55 -0
  140. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.js +36 -0
  141. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.js.map +1 -0
  142. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.d.ts +22 -0
  143. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js +26 -0
  144. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js.map +1 -1
  145. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js +6 -0
  146. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js.map +1 -1
  147. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.d.ts +45 -0
  148. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.js +116 -0
  149. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.js.map +1 -0
  150. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.d.ts +73 -1
  151. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js +56 -1
  152. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js.map +1 -1
  153. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +37 -4
  154. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -1
  155. package/bundle/typescript/src/commands/game/sideQuest/utilities/credentials.d.ts +26 -0
  156. package/bundle/typescript/src/commands/game/sideQuest/utilities/credentials.js +48 -0
  157. package/bundle/typescript/src/commands/game/sideQuest/utilities/credentials.js.map +1 -0
  158. package/bundle/typescript/src/commands/game/sideQuest/utilities/devices.d.ts +23 -0
  159. package/bundle/typescript/src/commands/game/sideQuest/utilities/devices.js +55 -0
  160. package/bundle/typescript/src/commands/game/sideQuest/utilities/devices.js.map +1 -0
  161. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.d.ts +57 -2
  162. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js +46 -3
  163. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js.map +1 -1
  164. package/bundle/typescript/src/commands/game/sideQuest/utilities/log-style.d.ts +38 -0
  165. package/bundle/typescript/src/commands/game/sideQuest/utilities/log-style.js +42 -0
  166. package/bundle/typescript/src/commands/game/sideQuest/utilities/log-style.js.map +1 -1
  167. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +72 -17
  168. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -1
  169. package/bundle/typescript/src/commands/game/sideQuest/utilities/playtester.d.ts +50 -0
  170. package/bundle/typescript/src/commands/game/sideQuest/utilities/playtester.js +43 -0
  171. package/bundle/typescript/src/commands/game/sideQuest/utilities/playtester.js.map +1 -0
  172. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.d.ts +14 -3
  173. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js +45 -31
  174. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js.map +1 -1
  175. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js +66 -8
  176. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js.map +1 -1
  177. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.d.ts +81 -15
  178. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js +142 -33
  179. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js.map +1 -1
  180. package/bundle/typescript/src/commands/game/sideQuest/utilities/use-target.d.ts +88 -0
  181. package/bundle/typescript/src/commands/game/sideQuest/utilities/use-target.js +113 -0
  182. package/bundle/typescript/src/commands/game/sideQuest/utilities/use-target.js.map +1 -0
  183. package/bundle/typescript/src/commands/game/sideQuest/utilities/world-clock.d.ts +83 -0
  184. package/bundle/typescript/src/commands/game/sideQuest/utilities/world-clock.js +106 -0
  185. package/bundle/typescript/src/commands/game/sideQuest/utilities/world-clock.js.map +1 -0
  186. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +54 -5
  187. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  188. package/bundle/typescript/src/maka.js +1 -1
  189. package/bundle/typescript/src/maka.js.map +1 -1
  190. package/bundle/typescript/src/tools/sdk-loader/relocate.d.ts +19 -2
  191. package/bundle/typescript/src/tools/sdk-loader/relocate.js +22 -2
  192. package/bundle/typescript/src/tools/sdk-loader/relocate.js.map +1 -1
  193. package/package.json +1 -1
  194. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.d.ts +0 -6
  195. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js +0 -72
  196. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js.map +0 -1
  197. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.d.ts +0 -6
  198. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js +0 -26
  199. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js.map +0 -1
  200. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +0 -143
  201. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +0 -366
  202. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +0 -1
  203. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.d.ts +0 -28
  204. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.js +0 -2
  205. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.js.map +0 -1
@@ -11,7 +11,9 @@
11
11
  ],
12
12
  "currency": {
13
13
  "type": "nuyen",
14
- "authorityRoomTags": ["Bank"]
14
+ "authorityRoomTags": [
15
+ "Bank"
16
+ ]
15
17
  },
16
18
  "player": {
17
19
  "name": "Maka",
@@ -95,20 +97,30 @@
95
97
  }
96
98
  ]
97
99
  },
98
-
99
100
  "rooms": [
100
101
  {
101
102
  "name": "Barrens Apartment",
102
103
  "description": "A grimy studio in the heart of the Redmond Barrens. The synth-leather couch sags by the window, the door barely locks, and a dead mage's bookshelf still holds a few things worth having.",
103
- "tags": ["residence"],
104
+ "tags": [
105
+ "residence"
106
+ ],
104
107
  "size": "small",
105
108
  "spots": [
106
- { "name": "door" },
107
- { "name": "couch" },
108
- { "name": "bookshelf" }
109
+ {
110
+ "name": "door"
111
+ },
112
+ {
113
+ "name": "couch"
114
+ },
115
+ {
116
+ "name": "bookshelf"
117
+ }
109
118
  ],
110
119
  "supportedLifestyles": {
111
- "residenceTypes": ["Street", "Squatter"]
120
+ "residenceTypes": [
121
+ "Street",
122
+ "Squatter"
123
+ ]
112
124
  },
113
125
  "exits": [
114
126
  {
@@ -121,15 +133,25 @@
121
133
  {
122
134
  "name": "Redmond Safehouse",
123
135
  "description": "A hidden bolthole where four tunnels meet at a scraped-clear entryway -- gear cache on one wall, a card sharp's abandoned bunk on the other. Every direction out of here leads somewhere that will test a different part of you.",
124
- "tags": ["residence"],
136
+ "tags": [
137
+ "residence"
138
+ ],
125
139
  "size": "medium",
126
140
  "spots": [
127
- { "name": "entryway" },
128
- { "name": "gear cache" },
129
- { "name": "bunk" }
141
+ {
142
+ "name": "entryway"
143
+ },
144
+ {
145
+ "name": "gear cache"
146
+ },
147
+ {
148
+ "name": "bunk"
149
+ }
130
150
  ],
131
151
  "supportedLifestyles": {
132
- "residenceTypes": ["Low"]
152
+ "residenceTypes": [
153
+ "Low"
154
+ ]
133
155
  },
134
156
  "exits": [
135
157
  {
@@ -156,11 +178,17 @@
156
178
  "owner": "Mr. Krow",
157
179
  "size": "small",
158
180
  "spots": [
159
- { "name": "door" },
160
- { "name": "desk" }
181
+ {
182
+ "name": "door"
183
+ },
184
+ {
185
+ "name": "desk"
186
+ }
161
187
  ],
162
188
  "supportedLifestyles": {
163
- "employmentRoles": ["Fixer"]
189
+ "employmentRoles": [
190
+ "Fixer"
191
+ ]
164
192
  },
165
193
  "exits": [
166
194
  {
@@ -172,35 +200,27 @@
172
200
  },
173
201
  {
174
202
  "name": "Lucky Chummer",
175
- "description": "A neon casino buzzing with illicit energy. Cards snap at the tables, chips clatter down the bar rail, and past the entrance a velvet rope on the roped stair guards the way deeper in.",
203
+ "description": "A neon casino buzzing with illicit energy. Cards snap at the tables, chips clatter down the bar rail, and a frayed cord hangs across the disused stair at the back.",
176
204
  "size": "large",
177
205
  "spots": [
178
- { "name": "entrance" },
179
- { "name": "card tables" },
180
- { "name": "bar rail" },
181
- { "name": "roped stair" }
182
- ],
183
- "supportedLifestyles": {
184
- "habitTags": ["Gambling"]
185
- },
186
- "exits": [
187
206
  {
188
- "direction": "north",
189
- "targetRoom": "Chummer Backroom",
190
- "puzzle": "Velvet Rope",
191
- "atSpot": "roped stair"
207
+ "name": "entrance"
208
+ },
209
+ {
210
+ "name": "card tables"
211
+ },
212
+ {
213
+ "name": "bar rail"
214
+ },
215
+ {
216
+ "name": "roped stair"
192
217
  }
193
- ]
194
- },
195
- {
196
- "name": "Chummer Backroom",
197
- "description": "The counting room behind the casino floor: a battered floor safe against the safe wall, a card table of ledgers nobody audits, and the smell of old money by the door.",
198
- "size": "small",
199
- "spots": [
200
- { "name": "door" },
201
- { "name": "card table" },
202
- { "name": "safe wall" }
203
- ]
218
+ ],
219
+ "supportedLifestyles": {
220
+ "habitTags": [
221
+ "Gambling"
222
+ ]
223
+ }
204
224
  },
205
225
  {
206
226
  "name": "Grid Vault",
@@ -209,8 +229,15 @@
209
229
  "nodeAccess": "wired",
210
230
  "size": "small",
211
231
  "spots": [
212
- { "name": "door" },
213
- { "name": "server racks", "tags": ["cover-partial"] }
232
+ {
233
+ "name": "door"
234
+ },
235
+ {
236
+ "name": "server racks",
237
+ "tags": [
238
+ "cover-partial"
239
+ ]
240
+ }
214
241
  ]
215
242
  },
216
243
  {
@@ -219,8 +246,12 @@
219
246
  "warded": true,
220
247
  "size": "small",
221
248
  "spots": [
222
- { "name": "threshold" },
223
- { "name": "shrine" }
249
+ {
250
+ "name": "threshold"
251
+ },
252
+ {
253
+ "name": "shrine"
254
+ }
224
255
  ]
225
256
  }
226
257
  ],
@@ -265,10 +296,10 @@
265
296
  }
266
297
  },
267
298
  {
268
- "description": "Salli Vex tends bar at the Lucky Chummer and hears everything. She won't cross Krow for free, but she likes a good talker and knows the doorman's phrase, the safe's history, and what really sits in the Grid Vault.",
299
+ "description": "Salli Vex tends bar at the Lucky Chummer and hears everything. She won't cross Krow for free, but she likes a good talker and knows who owes the house, how Krow plays his own table, and what really sits in the Grid Vault.",
269
300
  "dialogue": [
270
301
  "First drink's watered down. So is the second.",
271
- "The rope? Toro only moves for the right words.",
302
+ "Krow keeps his door open. Doesn't mean you're invited through it.",
272
303
  "Everything in this place is rigged, sugar. Including me."
273
304
  ],
274
305
  "player": {
@@ -435,20 +466,6 @@
435
466
  "room": "Barrens Apartment",
436
467
  "atSpot": "bookshelf"
437
468
  },
438
- {
439
- "name": "Dragon Door Etiquette",
440
- "description": "A slim etiquette pamphlet for the Lucky Chummer's high-roller room, dog-eared at the section on the door.",
441
- "details": "The dog-eared page reads: 'Toro moves the rope for members only. Members announce themselves properly: the silver dragon says. Say it like you belong.'",
442
- "size": "Small",
443
- "category": "Book",
444
- "shape": "Pamphlet",
445
- "color": "Purple",
446
- "texture": "Glossy Paper",
447
- "rating": "Common",
448
- "weight": 0.2,
449
- "room": "Barrens Apartment",
450
- "atSpot": "bookshelf"
451
- },
452
469
  {
453
470
  "name": "Spare Clip",
454
471
  "description": "A boxy magazine of 10 rounds, factory-wrapped. Fits most street-caliber sidearms.",
@@ -488,20 +505,6 @@
488
505
  "room": "Redmond Safehouse",
489
506
  "atSpot": "gear cache"
490
507
  },
491
- {
492
- "name": "Card Sharp's Notebook",
493
- "description": "A battered notebook, pages soft with handling, filled with a card sharp's private notes on the Lucky Chummer's back rooms.",
494
- "details": "One page is circled twice: 'The counting-room safe still runs the house code from the old management: double or nothing. They never changed it. They never change anything.'",
495
- "size": "Small",
496
- "category": "Book",
497
- "shape": "Rectangle",
498
- "color": "Brown",
499
- "texture": "Worn Leather",
500
- "rating": "Common",
501
- "weight": 0.3,
502
- "room": "Redmond Safehouse",
503
- "atSpot": "bunk"
504
- },
505
508
  {
506
509
  "name": "Cuban Cigar",
507
510
  "description": "Hard to find, but delicious.",
@@ -541,43 +544,9 @@
541
544
  "weight": 0.2,
542
545
  "room": "Chapel Alcove",
543
546
  "atSpot": "shrine"
544
- },
545
- {
546
- "name": "House Take Credstick",
547
- "description": "A certified credstick straight out of the counting-room safe -- the house's own skim, still warm.",
548
- "size": "Small",
549
- "category": "CurrencyContainer",
550
- "shape": "Rectangle",
551
- "color": "Matte Black",
552
- "texture": "Smooth",
553
- "rating": "Standard",
554
- "weight": 0.2,
555
- "currencyAmount": 800
556
- }
557
- ],
558
- "puzzles": [
559
- {
560
- "name": "Velvet Rope",
561
- "riddle": "You see a velvet rope across the backroom stair, and Toro behind it -- two and a half meters of troll in a tailored suit. He looks through you, waiting for the members' phrase.",
562
- "requiredPhrase": "the silver dragon says",
563
- "successMessage": "Toro unhooks the rope without a word and looks back at nothing. You belong now.",
564
- "failureMessage": "Toro's eyes narrow a millimeter. The rope stays. Somewhere a pit boss glances over.",
565
- "bypassType": "con"
566
- },
567
- {
568
- "name": "Backroom Safe",
569
- "room": "Chummer Backroom",
570
- "atSpot": "safe wall",
571
- "riddle": "You see a battered floor safe behind the counting table, its mechanical dial worn shiny. It wants the house code.",
572
- "requiredPhrase": "double or nothing",
573
- "rewardItem": "House Take Credstick",
574
- "requiresPuzzle": "Velvet Rope",
575
- "lockedMessage": "You'd need to actually be inside the counting room's circle of trust before anyone lets you kneel at the safe.",
576
- "successMessage": "The dial lands, tumblers surrender, and the house's own skim slides into your hand.",
577
- "failureMessage": "The dial jams. Somewhere above, a camera swivels toward the counting room.",
578
- "bypassType": "lockpick"
579
547
  }
580
548
  ],
549
+ "puzzles": [],
581
550
  "winCondition": {
582
551
  "type": "possess",
583
552
  "item": "Krow's Datachip",
@@ -220,30 +220,6 @@
220
220
  "name": "back corner",
221
221
  "description": "The dim table nobody chooses by accident."
222
222
  }
223
- ],
224
- "exits": [
225
- {
226
- "direction": "north",
227
- "targetRoom": "Bar Backroom",
228
- "atSpot": "back corner"
229
- }
230
- ]
231
- },
232
- {
233
- "name": "Bar Backroom",
234
- "description": "Crates of unlabeled bottles by the door, 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.",
235
- "roomType": "Bar",
236
- "size": "small",
237
- "spots": [
238
- {
239
- "name": "door"
240
- },
241
- {
242
- "name": "card table"
243
- },
244
- {
245
- "name": "crates"
246
- }
247
223
  ]
248
224
  },
249
225
  {
@@ -491,28 +467,6 @@
491
467
  {
492
468
  "name": "altar"
493
469
  }
494
- ],
495
- "exits": [
496
- {
497
- "direction": "down",
498
- "targetRoom": "Chapel Crypt",
499
- "puzzle": "Crypt Grate",
500
- "atSpot": "altar"
501
- }
502
- ]
503
- },
504
- {
505
- "name": "Chapel Crypt",
506
- "description": "A dry vault below the waterline, older than the district above it. From the entry stairs, reliquary niches line the walls -- emptied long ago, almost all of them.",
507
- "roomType": "Crypt",
508
- "size": "tiny",
509
- "spots": [
510
- {
511
- "name": "entry stairs"
512
- },
513
- {
514
- "name": "reliquary niches"
515
- }
516
470
  ]
517
471
  },
518
472
  {
@@ -1228,7 +1182,7 @@
1228
1182
  },
1229
1183
  {
1230
1184
  "name": "Wall of the Fallen Ledger",
1231
- "description": "A hand-bound book beneath the backroom's photographs, recording every runner the district lost and how.",
1185
+ "description": "A hand-bound book in the bar's back corner, kept beneath a handful of pinned photographs, recording every runner the district lost and how.",
1232
1186
  "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.",
1233
1187
  "size": "Small",
1234
1188
  "category": "Book",
@@ -1237,23 +1191,8 @@
1237
1191
  "texture": "Hand-Bound",
1238
1192
  "rating": "Common",
1239
1193
  "weight": 0.6,
1240
- "room": "Bar Backroom",
1241
- "atSpot": "card table"
1242
- },
1243
- {
1244
- "name": "Crypt Notes",
1245
- "description": "A pawned notebook of a dead urban explorer, thick with sketches of the chapel's lower level.",
1246
- "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.'",
1247
- "size": "Small",
1248
- "category": "Book",
1249
- "shape": "Notebook",
1250
- "color": "Gray",
1251
- "texture": "Water-Stained",
1252
- "rating": "Common",
1253
- "weight": 0.3,
1254
- "room": "Union Pawnshop",
1255
- "atSpot": "back shelves",
1256
- "owner": "Whisper"
1194
+ "room": "Purple Haze Bar",
1195
+ "atSpot": "back corner"
1257
1196
  },
1258
1197
  {
1259
1198
  "name": "Chipped Credstick",
@@ -1341,33 +1280,6 @@
1341
1280
  "room": "Sim Den",
1342
1281
  "atSpot": "couch rows"
1343
1282
  },
1344
- {
1345
- "name": "Drowned Reliquary",
1346
- "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.",
1347
- "size": "Tiny",
1348
- "category": "Focus",
1349
- "shape": "Reliquary",
1350
- "color": "Sea Glass",
1351
- "texture": "Fused Silver",
1352
- "rating": "Rare",
1353
- "weight": 0.4,
1354
- "room": "Chapel Crypt",
1355
- "atSpot": "reliquary niches"
1356
- },
1357
- {
1358
- "name": "Tarnished Credstick",
1359
- "description": "A pre-flood credstick from the crypt floor, miraculously still certified.",
1360
- "size": "Small",
1361
- "category": "CurrencyContainer",
1362
- "shape": "Cylinder",
1363
- "color": "Tarnished",
1364
- "texture": "Corroded",
1365
- "rating": "Common",
1366
- "weight": 0.2,
1367
- "currencyAmount": 300,
1368
- "room": "Chapel Crypt",
1369
- "atSpot": "reliquary niches"
1370
- },
1371
1283
  {
1372
1284
  "name": "Torque's Commlink",
1373
1285
  "description": "A ruggedized shop commlink, speed-dial worn down to the metal -- Torque answers for paying customers.",
@@ -1453,14 +1365,5 @@
1453
1365
  "transferable": false
1454
1366
  }
1455
1367
  ],
1456
- "puzzles": [
1457
- {
1458
- "name": "Crypt Grate",
1459
- "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.",
1460
- "requiredPhrase": "the saint of rust",
1461
- "successMessage": "The tumblers grind through decades of corrosion and the grate swings up on screaming hinges.",
1462
- "failureMessage": "The mechanism seizes. Flakes of rust drift down into the dark, and the Choir's song falters for a beat.",
1463
- "bypassType": "lockpick"
1464
- }
1465
- ]
1368
+ "puzzles": []
1466
1369
  }
@@ -166,6 +166,30 @@ export interface ISavedHub {
166
166
  /** Seed NPCs absent from the live scene (killed) -- removed QUIETLY
167
167
  * on load; their dropped gear is already in the room overlays. */
168
168
  deadActors: string[];
169
+ /** Devices by name, and the whole of their state. `bypassBurned`
170
+ * went with the puzzle mechanic -- a lock you failed to force is a
171
+ * lock you can try again. */
172
+ devices: {
173
+ name: string;
174
+ open: boolean;
175
+ }[];
176
+ /**
177
+ * A TOMBSTONE, always written as [], never read by this build.
178
+ *
179
+ * It exists for an OLDER READER, not for us. v5.64.0 is shipped, and
180
+ * its persistence.ts line 530 is `for (const p of saved.puzzles)`
181
+ * with no guard -- so a save written without this field makes that
182
+ * build throw "saved.puzzles is not iterable" on resume. Not
183
+ * degraded: a hard crash.
184
+ *
185
+ * And saves MOVE. cloud-saves.ts mirrors the whole ISaveFileV1
186
+ * including this overlay, so a player on two machines, a rollback,
187
+ * or a server pin lagging the client all put a new save in front of
188
+ * an old reader.
189
+ *
190
+ * SAFE TO DELETE only once v5.64.0 is out of the wild -- check
191
+ * before you do; nothing in THIS build will fail if you remove it.
192
+ */
169
193
  puzzles: {
170
194
  name: string;
171
195
  solved: boolean;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * A DEVICE IN A ROOM -- the seed shape that replaces the old puzzles[].
3
+ *
4
+ * The user's framing is the specification: "A lock is not a puzzle, it
5
+ * has a key. A keypad has an interface (to use). An NPC in the doorway
6
+ * can be persuaded/bluffed/conned to move aside. A persistent forcewall
7
+ * can be dispelled."
8
+ *
9
+ * Three of those four are DEVICES; the fourth is a person and has no
10
+ * entry here on purpose (see npcs[].guarding / npcs[].passphrase).
11
+ *
12
+ * A DEVICE ALWAYS BELONGS TO A ROOM. There is no "attached to a door"
13
+ * form, because a keypad beside a grate stands in one room -- the one
14
+ * you must be in to reach it. The puzzle shape allowed both, and the
15
+ * cost was two validators that had to agree, a normaliser between them,
16
+ * and a placement fault the comments record as killing two consecutive
17
+ * generations.
18
+ */
19
+ export type DeviceSeedKind = 'lock' | 'panel' | 'ward';
20
+ export interface IDeviceSeedJson {
21
+ name: string;
22
+ /** MANDATORY. What the player sees when they look at it. Optional
23
+ * descriptions are how a barrier ended up rendering the literal
24
+ * string "undefined" into an NPC's prompt. */
25
+ description: string;
26
+ kind: DeviceSeedKind;
27
+ /**
28
+ * The credential that opens it -- ONLY valid on a 'panel'.
29
+ *
30
+ * User ruling, verbatim: "if it's a _mechanical_ lock, it has a key
31
+ * or can be picked. You can't talk at a _mechanical_ lock." A lock
32
+ * opens by key or by force; a ward answers to the Art. Neither has
33
+ * anything to hear a phrase with, and the migration drops a code off
34
+ * anything that is not a panel.
35
+ */
36
+ code?: string;
37
+ /** Item name that opens it outright -- a keycard, a physical key. */
38
+ keyItem?: string;
39
+ /** Item name handed over when it opens (a safe's contents). */
40
+ grantsItem?: string;
41
+ /** "At" spot of its room that it physically stands at. */
42
+ atSpot?: string;
43
+ /** The exit OF ITS OWN ROOM that opening this device unseals. The
44
+ * door starts locked and the device is what unlocks it. */
45
+ opensExit?: string;
46
+ /** Terrain this device's footprint seals on the room grid, if it is
47
+ * physically in the way (rubble, a shutter). */
48
+ guardsExit?: string;
49
+ footprint?: 'small' | 'medium' | 'large';
50
+ openMessage?: string;
51
+ refuseMessage?: string;
52
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=device-seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-seed.js","sourceRoot":"","sources":["../../../../../../../../src/commands/game/sideQuest/types/seed/device-seed.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * THE SHAPE OF AN OLD SEED, kept only so it can be TRANSLATED.
3
+ *
4
+ * This is not a live seed type. The puzzle mechanic is gone (2026-08-27
5
+ * -- barriers are room-owned Devices worked by the verb that suits the
6
+ * thing; see types/seed/device-seed.ts). Nothing in the engine consumes
7
+ * a puzzle any more.
8
+ *
9
+ * It survives for exactly one reader: factories/seed-migration.ts,
10
+ * which converts `puzzles[]` into devices and guards on the way in. And
11
+ * it has to keep surviving, because a seed is not only a file on disk
12
+ * -- every save EMBEDS its hub seed, so a returning player's save
13
+ * carries a puzzles[] array written by a build that still had them.
14
+ *
15
+ * >>> DELETE THIS FILE WHEN no save in the wild still embeds a
16
+ * >>> puzzles[] hubSeed. Until then it is load-bearing, and the import
17
+ * >>> line in seed-migration.ts is the only place it should appear.
18
+ *
19
+ * It is named and located to make that status legible: a file called
20
+ * `puzzle-seed.ts` sitting in types/seed/ beside the live types reads
21
+ * as current to anyone browsing, which is how a dead mechanic keeps
22
+ * looking alive.
23
+ *
24
+ * ---- what the fields meant, for whoever is reading a legacy seed ----
25
+ *
26
+ * `bypassType` was the risky route past a barrier. "con" used to be in
27
+ * that union too, for barriers that were "really a person or a
28
+ * voice-gate", and it went first (player ruling: "'bluff' shouldn't
29
+ * work on Barriers like locks/wards/etc ... NPCs can be barriers").
30
+ * That was the modelling correction the rest of this file eventually
31
+ * followed: a lock has no opinion to change, and making a PERSON into
32
+ * a Puzzle dragged them through machinery that made no sense for a
33
+ * human being. The migration reads these values one last time and maps
34
+ * them to a device kind, or to a guarding NPC.
35
+ */
36
+ export type LegacyPuzzleBypassType = 'lockpick' | 'hack' | 'spell';
37
+ export interface ILegacyPuzzleSeedJson {
38
+ name: string;
39
+ room?: string;
40
+ riddle: string;
41
+ requiredPhrase?: string;
42
+ requiredItem?: string;
43
+ rewardItem?: string;
44
+ successMessage?: string;
45
+ failureMessage?: string;
46
+ hobbyTags?: string[];
47
+ /** Name of another puzzle in this same scene that must be solved first. */
48
+ requiresPuzzle?: string;
49
+ /** Shown when attempting to solve this puzzle before requiresPuzzle is met. */
50
+ lockedMessage?: string;
51
+ /**
52
+ * Optional risky alternate route to the same reward, matching this
53
+ * barrier's in-fiction nature (a lock -> "pick", a terminal -> "hack", a
54
+ * ward -> "cast") -- a coin-flip chance to bypass without ever knowing
55
+ * requiredPhrase, but a failed attempt is loud (see Puzzle.attemptBypass).
56
+ * Leave unset for a puzzle with no such physical/technical/magical route
57
+ * (e.g. a purely social one, solvable only by knowing the actual answer).
58
+ */
59
+ bypassType?: LegacyPuzzleBypassType;
60
+ atSpot?: string;
61
+ guardsExit?: string;
62
+ footprint?: 'small' | 'medium' | 'large';
63
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=legacy-puzzle-seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-puzzle-seed.js","sourceRoot":"","sources":["../../../../../../../../src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.ts"],"names":[],"mappings":""}
@@ -45,6 +45,12 @@ export interface IPlayerSeedJson {
45
45
  name: string;
46
46
  startLocation: string;
47
47
  startSpot?: string;
48
+ /** This NPC HOLDS their position against passage -- a doorman, a
49
+ * picket. Combined with a startSpot on a doorway, it makes them a
50
+ * barrier you cannot walk through (see Player.guarding and
51
+ * utilities/spots.ts holdsGround). The way past is social or
52
+ * violent, never a lockpick. */
53
+ guarding?: boolean;
48
54
  lifestyleChoices: LifestyleChoice[];
49
55
  startingItems?: IItemSeedJson[];
50
56
  combat?: ICombatSeedJson;
@@ -1,3 +1,4 @@
1
+ import { IDeviceSeedJson } from './device-seed.js';
1
2
  import { IExitSeedJson } from './exit-seed.js';
2
3
  import { RoomSize, SpotPlace, IGridSynthesisLevel } from '../../utilities/room-grid.js';
3
4
  export interface IRoomSeedJson {
@@ -8,6 +9,9 @@ export interface IRoomSeedJson {
8
9
  owner?: string;
9
10
  tags?: string[];
10
11
  exits: IExitSeedJson[];
12
+ /** Devices standing in THIS room (see types/seed/device-seed.ts).
13
+ * Always room-owned -- there is no device-on-a-door form. */
14
+ devices?: IDeviceSeedJson[];
11
15
  reachable?: boolean;
12
16
  hasNode?: boolean;
13
17
  nodeAccess?: 'wireless' | 'wired';
@@ -1,7 +1,7 @@
1
1
  import { IRoomSeedJson } from './room-seed.js';
2
2
  import { INPCSeedJson } from './npc-seed.js';
3
3
  import { IItemSeedJson } from './item-seed.js';
4
- import { IPuzzleSeedJson } from './puzzle-seed.js';
4
+ import { ILegacyPuzzleSeedJson } from './legacy-puzzle-seed.js';
5
5
  import { IPlayerSeedJson } from './player-seed.js';
6
6
  import { IWinConditionSeedJson } from './win-condition-seed.js';
7
7
  export interface ISceneSeedJson {
@@ -13,7 +13,8 @@ export interface ISceneSeedJson {
13
13
  rooms: IRoomSeedJson[];
14
14
  npcs: INPCSeedJson[];
15
15
  items: IItemSeedJson[];
16
- puzzles: IPuzzleSeedJson[];
16
+ /** LEGACY, migrated away on load -- see legacy-puzzle-seed.ts. */
17
+ puzzles: ILegacyPuzzleSeedJson[];
17
18
  residenceTiers: string[];
18
19
  story: string;
19
20
  /** The logging-in player who will be actively controlled */