@maka/maka-cli 5.3.16 → 5.4.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 (220) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/create.js +1 -1
  3. package/bundle/typescript/src/commands/create.js.map +1 -1
  4. package/bundle/typescript/src/commands/game/sideQuest/archetypes.d.ts +43 -0
  5. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js +131 -0
  6. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -0
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.d.ts +14 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js +79 -0
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js.map +1 -0
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.d.ts +42 -0
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js +224 -0
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js.map +1 -0
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.d.ts +28 -0
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +101 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -0
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +19 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +149 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -0
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.d.ts +58 -0
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +378 -0
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -0
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/command-registry.d.ts +11 -1
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/command-registry.js +8 -3
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/command-registry.js.map +1 -1
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/command.d.ts +6 -0
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/command.js +4 -0
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/command.js.map +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.d.ts +15 -0
  29. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js +60 -0
  30. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js.map +1 -0
  31. package/bundle/typescript/src/commands/game/sideQuest/commands/edge.d.ts +13 -0
  32. package/bundle/typescript/src/commands/game/sideQuest/commands/edge.js +31 -0
  33. package/bundle/typescript/src/commands/game/sideQuest/commands/edge.js.map +1 -0
  34. package/bundle/typescript/src/commands/game/sideQuest/commands/end-call.d.ts +6 -0
  35. package/bundle/typescript/src/commands/game/sideQuest/commands/end-call.js +27 -0
  36. package/bundle/typescript/src/commands/game/sideQuest/commands/end-call.js.map +1 -0
  37. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.d.ts +4 -0
  38. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js +40 -0
  39. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js.map +1 -1
  40. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.d.ts +13 -0
  41. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js +43 -0
  42. package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js.map +1 -0
  43. package/bundle/typescript/src/commands/game/sideQuest/commands/give.js +7 -1
  44. package/bundle/typescript/src/commands/game/sideQuest/commands/give.js.map +1 -1
  45. package/bundle/typescript/src/commands/game/sideQuest/commands/go.d.ts +11 -0
  46. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +115 -4
  47. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
  48. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.d.ts +25 -0
  49. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +176 -0
  50. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -0
  51. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.d.ts +12 -0
  52. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js +39 -0
  53. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js.map +1 -0
  54. package/bundle/typescript/src/commands/game/sideQuest/commands/jack.d.ts +17 -0
  55. package/bundle/typescript/src/commands/game/sideQuest/commands/jack.js +64 -0
  56. package/bundle/typescript/src/commands/game/sideQuest/commands/jack.js.map +1 -0
  57. package/bundle/typescript/src/commands/game/sideQuest/commands/kill.d.ts +10 -3
  58. package/bundle/typescript/src/commands/game/sideQuest/commands/kill.js +11 -33
  59. package/bundle/typescript/src/commands/game/sideQuest/commands/kill.js.map +1 -1
  60. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +35 -4
  61. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
  62. package/bundle/typescript/src/commands/game/sideQuest/commands/map.d.ts +12 -0
  63. package/bundle/typescript/src/commands/game/sideQuest/commands/map.js +46 -0
  64. package/bundle/typescript/src/commands/game/sideQuest/commands/map.js.map +1 -0
  65. package/bundle/typescript/src/commands/game/sideQuest/commands/pan.d.ts +12 -0
  66. package/bundle/typescript/src/commands/game/sideQuest/commands/pan.js +55 -0
  67. package/bundle/typescript/src/commands/game/sideQuest/commands/pan.js.map +1 -0
  68. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.d.ts +9 -0
  69. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +18 -0
  70. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -0
  71. package/bundle/typescript/src/commands/game/sideQuest/commands/project.d.ts +19 -0
  72. package/bundle/typescript/src/commands/game/sideQuest/commands/project.js +54 -0
  73. package/bundle/typescript/src/commands/game/sideQuest/commands/project.js.map +1 -0
  74. package/bundle/typescript/src/commands/game/sideQuest/commands/read.js +6 -5
  75. package/bundle/typescript/src/commands/game/sideQuest/commands/read.js.map +1 -1
  76. package/bundle/typescript/src/commands/game/sideQuest/commands/reboot.d.ts +12 -0
  77. package/bundle/typescript/src/commands/game/sideQuest/commands/reboot.js +52 -0
  78. package/bundle/typescript/src/commands/game/sideQuest/commands/reboot.js.map +1 -0
  79. package/bundle/typescript/src/commands/game/sideQuest/commands/reload.d.ts +14 -0
  80. package/bundle/typescript/src/commands/game/sideQuest/commands/reload.js +40 -0
  81. package/bundle/typescript/src/commands/game/sideQuest/commands/reload.js.map +1 -0
  82. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.d.ts +15 -0
  83. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +59 -0
  84. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -0
  85. package/bundle/typescript/src/commands/game/sideQuest/commands/say.js +23 -2
  86. package/bundle/typescript/src/commands/game/sideQuest/commands/say.js.map +1 -1
  87. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +20 -3
  88. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  89. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.d.ts +12 -0
  90. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +49 -0
  91. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -0
  92. package/bundle/typescript/src/commands/game/sideQuest/commands/silent.d.ts +13 -0
  93. package/bundle/typescript/src/commands/game/sideQuest/commands/silent.js +50 -0
  94. package/bundle/typescript/src/commands/game/sideQuest/commands/silent.js.map +1 -0
  95. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js +32 -11
  96. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js.map +1 -1
  97. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.d.ts +14 -0
  98. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js +65 -0
  99. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js.map +1 -0
  100. package/bundle/typescript/src/commands/game/sideQuest/commands/stance.d.ts +12 -0
  101. package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js +41 -0
  102. package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js.map +1 -0
  103. package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.d.ts +21 -0
  104. package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js +43 -0
  105. package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js.map +1 -0
  106. package/bundle/typescript/src/commands/game/sideQuest/commands/surrender.d.ts +20 -0
  107. package/bundle/typescript/src/commands/game/sideQuest/commands/surrender.js +45 -0
  108. package/bundle/typescript/src/commands/game/sideQuest/commands/surrender.js.map +1 -0
  109. package/bundle/typescript/src/commands/game/sideQuest/commands/take.d.ts +8 -0
  110. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +80 -1
  111. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
  112. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js +1 -0
  113. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js.map +1 -1
  114. package/bundle/typescript/src/commands/game/sideQuest/commands/use.d.ts +24 -0
  115. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +101 -1
  116. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
  117. package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js +2 -1
  118. package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js.map +1 -1
  119. package/bundle/typescript/src/commands/game/sideQuest/factories/npc-factory.js +7 -2
  120. package/bundle/typescript/src/commands/game/sideQuest/factories/npc-factory.js.map +1 -1
  121. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js +2 -1
  122. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js.map +1 -1
  123. package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js +2 -0
  124. package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js.map +1 -1
  125. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.d.ts +8 -1
  126. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +138 -21
  127. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
  128. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.d.ts +119 -0
  129. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +816 -0
  130. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js.map +1 -0
  131. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +70 -9
  132. package/bundle/typescript/src/commands/game/sideQuest/game.js +403 -164
  133. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  134. package/bundle/typescript/src/commands/game/sideQuest/minigames/hack-minigame.d.ts +16 -0
  135. package/bundle/typescript/src/commands/game/sideQuest/minigames/hack-minigame.js +101 -0
  136. package/bundle/typescript/src/commands/game/sideQuest/minigames/hack-minigame.js.map +1 -0
  137. package/bundle/typescript/src/commands/game/sideQuest/minigames/lockpick-minigame.d.ts +15 -0
  138. package/bundle/typescript/src/commands/game/sideQuest/minigames/lockpick-minigame.js +95 -0
  139. package/bundle/typescript/src/commands/game/sideQuest/minigames/lockpick-minigame.js.map +1 -0
  140. package/bundle/typescript/src/commands/game/sideQuest/models/door.d.ts +10 -0
  141. package/bundle/typescript/src/commands/game/sideQuest/models/door.js +15 -2
  142. package/bundle/typescript/src/commands/game/sideQuest/models/door.js.map +1 -1
  143. package/bundle/typescript/src/commands/game/sideQuest/models/inventory.d.ts +10 -0
  144. package/bundle/typescript/src/commands/game/sideQuest/models/inventory.js +54 -4
  145. package/bundle/typescript/src/commands/game/sideQuest/models/inventory.js.map +1 -1
  146. package/bundle/typescript/src/commands/game/sideQuest/models/item.d.ts +41 -0
  147. package/bundle/typescript/src/commands/game/sideQuest/models/item.js +106 -3
  148. package/bundle/typescript/src/commands/game/sideQuest/models/item.js.map +1 -1
  149. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +25 -0
  150. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +220 -47
  151. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  152. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +213 -0
  153. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +525 -9
  154. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  155. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +75 -1
  156. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +174 -6
  157. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
  158. package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +20 -0
  159. package/bundle/typescript/src/commands/game/sideQuest/models/room.js +39 -18
  160. package/bundle/typescript/src/commands/game/sideQuest/models/room.js.map +1 -1
  161. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +69 -0
  162. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +175 -2
  163. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  164. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +80 -1
  165. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +7 -2
  166. package/bundle/typescript/src/commands/game/sideQuest/types/player-equipment.d.ts +1 -0
  167. package/bundle/typescript/src/commands/game/sideQuest/types/seed/exit-seed.d.ts +1 -0
  168. package/bundle/typescript/src/commands/game/sideQuest/types/seed/item-seed.d.ts +1 -0
  169. package/bundle/typescript/src/commands/game/sideQuest/types/seed/npc-seed.d.ts +1 -0
  170. package/bundle/typescript/src/commands/game/sideQuest/types/seed/player-seed.d.ts +34 -0
  171. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.d.ts +15 -1
  172. package/bundle/typescript/src/commands/game/sideQuest/types/seed/room-seed.d.ts +3 -0
  173. package/bundle/typescript/src/commands/game/sideQuest/types/seed/scene-seed.d.ts +5 -0
  174. package/bundle/typescript/src/commands/game/sideQuest/types/seed/win-condition-seed.d.ts +15 -0
  175. package/bundle/typescript/src/commands/game/sideQuest/types/seed/win-condition-seed.js +2 -0
  176. package/bundle/typescript/src/commands/game/sideQuest/types/seed/win-condition-seed.js.map +1 -0
  177. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.d.ts +1 -0
  178. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js +5 -0
  179. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js.map +1 -1
  180. package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.d.ts +1 -0
  181. package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.js +1 -0
  182. package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.js.map +1 -1
  183. package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +3 -0
  184. package/bundle/typescript/src/commands/game/sideQuest/ui.js +95 -5
  185. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  186. package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.d.ts +60 -0
  187. package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.js +138 -0
  188. package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.js.map +1 -0
  189. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.d.ts +143 -0
  190. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +328 -0
  191. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -0
  192. package/bundle/typescript/src/commands/game/sideQuest/utilities/comm-style.d.ts +2 -0
  193. package/bundle/typescript/src/commands/game/sideQuest/utilities/comm-style.js +12 -0
  194. package/bundle/typescript/src/commands/game/sideQuest/utilities/comm-style.js.map +1 -0
  195. package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.d.ts +22 -0
  196. package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.js +34 -0
  197. package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.js.map +1 -0
  198. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.d.ts +36 -0
  199. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js +92 -0
  200. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js.map +1 -0
  201. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.d.ts +44 -0
  202. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +193 -0
  203. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js.map +1 -0
  204. package/bundle/typescript/src/commands/game/sideQuest/utilities/pursuit.d.ts +16 -0
  205. package/bundle/typescript/src/commands/game/sideQuest/utilities/pursuit.js +36 -0
  206. package/bundle/typescript/src/commands/game/sideQuest/utilities/pursuit.js.map +1 -0
  207. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +54 -7
  208. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  209. package/bundle/typescript/src/commands/set/global.sub.cmd.js +59 -5
  210. package/bundle/typescript/src/commands/set/global.sub.cmd.js.map +1 -1
  211. package/bundle/typescript/src/tools/ai/ai.class.d.ts +35 -0
  212. package/bundle/typescript/src/tools/ai/ai.class.js +112 -0
  213. package/bundle/typescript/src/tools/ai/ai.class.js.map +1 -0
  214. package/bundle/typescript/src/tools/fsi/fsi.interfaces.d.ts +1 -0
  215. package/bundle/typescript/src/tools/fsi/fsi.interfaces.js.map +1 -1
  216. package/bundle/typescript/src/tools/https/https.class.d.ts +2 -1
  217. package/bundle/typescript/src/tools/https/https.class.js +43 -0
  218. package/bundle/typescript/src/tools/https/https.class.js.map +1 -1
  219. package/bundle/typescript/src/tools/https/https.interface.d.ts +8 -0
  220. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ import { Command } from './command.js';
2
+ import { Category } from '../types/shared/item-enum.js';
3
+ /**
4
+ * The PAN dashboard: your personal area network at a glance -- master
5
+ * device and its firewall, every slaved device with what it grants while
6
+ * loud, and the silent-vs-loud tradeoff spelled out. This is the screen
7
+ * you check before deciding whether the AR bonus is worth being hackable.
8
+ */
9
+ export class PanCommand extends Command {
10
+ static verb = 'pan';
11
+ static description = 'Your personal area network: master device, slaved gear, wireless bonuses, and what running silent costs and protects.';
12
+ async execute(_args = []) {
13
+ const a = this.actor;
14
+ const master = a.getPanMaster();
15
+ if (!master) {
16
+ return `No devices, no PAN. You are unhackable and unreachable -- the monk's build.`;
17
+ }
18
+ const state = a.runningSilent
19
+ ? `{magenta-fg}SILENT{/magenta-fg} -- hidden (+2 firewall), but no calls, no AR, no Matrix`
20
+ : a.arOffline
21
+ ? `{red-fg}LOUD, AR CUT{/red-fg} -- someone hacked your overlay dark ("reboot")`
22
+ : `{green-fg}LOUD{/green-fg} -- full bonuses, and hackable`;
23
+ const lines = [
24
+ `=== PAN: ${a.name.toUpperCase()} ===`,
25
+ '',
26
+ `Broadcast: ${state}`,
27
+ `Master: ${master.name} -- firewall ${a.getPanDefensePool()}d6 (Logic + quality${a.runningSilent ? ' + silent' : ''})`,
28
+ '',
29
+ 'Slaved devices:',
30
+ ];
31
+ const link = a.equipment.head?.commlink;
32
+ if (link) {
33
+ const bonus = a.runningSilent || a.arOffline ? 'inactive' : `+${link.qualityBonus} initiative (AR overlay)`;
34
+ lines.push(` • ${link.name} (commlink) -- calls; ${bonus}`);
35
+ }
36
+ const deck = a.getAnyCyberdeck();
37
+ if (deck) {
38
+ lines.push(` • ${deck.name} (cyberdeck) -- Matrix access; ${deck.deckSummary()}${deck.isBricked ? ' BRICKED (rest to repair)' : ''}`);
39
+ }
40
+ const gun = a.equipment.rightHand?.weapon ?? a.equipment.leftHand?.weapon;
41
+ if (gun?.isFirearm()) {
42
+ lines.push(` • ${gun.name} (smartgun) -- ${gun.jammed ? '{red-fg}JAMMED -- smartlink cracked ("reboot"){/red-fg}' : 'smartlink live'}`);
43
+ }
44
+ const drone = a.inventory.getAllItems().find(i => i.category === Category.Drone);
45
+ if (drone) {
46
+ lines.push(` • ${drone.name} (drone) -- recon uplink ("drone")`);
47
+ }
48
+ lines.push('');
49
+ lines.push(a.runningSilent
50
+ ? `Silent running: enemy deckers must FIND you before they can crack you -- but a good one can force you loud.`
51
+ : `Running loud: any decker in reach can try your firewall -- jammed guns and dead AR are how that feels. "silent" goes dark.`);
52
+ return lines.join('\n');
53
+ }
54
+ }
55
+ //# sourceMappingURL=pan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pan.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/pan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BypassCommand } from './bypass-command.js';
2
+ import { PuzzleBypassType } from '../types/seed/puzzle-seed.js';
3
+ export declare class PickCommand extends BypassCommand {
4
+ protected static verb: string;
5
+ protected static description: string;
6
+ protected bypassType: PuzzleBypassType;
7
+ protected noPuzzleMessage: string;
8
+ protected determineOutcome(): Promise<boolean>;
9
+ }
@@ -0,0 +1,18 @@
1
+ import { BypassCommand } from './bypass-command.js';
2
+ import { playLockpickMinigame } from '../minigames/lockpick-minigame.js';
3
+ export class PickCommand extends BypassCommand {
4
+ static verb = 'pick';
5
+ static description = 'Pick a lock -- skips needing the code, but a failed attempt is fatal (instant game over). If there\'s more than one barrier here, say which: "pick north" or "pick <name>".';
6
+ bypassType = 'lockpick';
7
+ noPuzzleMessage = "There's nothing here to pick.";
8
+ async determineOutcome() {
9
+ // No live screen (e.g. an NPC attempting this -- see command-registry.ts,
10
+ // which never passes one) -- fall back to the coin flip rather than
11
+ // crashing or silently always succeeding/failing.
12
+ if (!this.screen) {
13
+ return super.determineOutcome();
14
+ }
15
+ return playLockpickMinigame(this.screen);
16
+ }
17
+ }
18
+ //# sourceMappingURL=pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/pick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,MAAM,OAAO,WAAY,SAAQ,aAAa;IAClC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,WAAW,GAAG,6KAA6K,CAAC;IACnM,UAAU,GAAqB,UAAU,CAAC;IAC1C,eAAe,GAAG,+BAA+B,CAAC;IAElD,KAAK,CAAC,gBAAgB;QAC9B,0EAA0E;QAC1E,oEAAoE;QACpE,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Command, ICommand } from './command.js';
2
+ /**
3
+ * Astral projection ("project") and the way back ("return") -- Awakened
4
+ * only; a mundane with a grimoire can throw a book-learned spell but can't
5
+ * leave their flesh. The astral overlays the same rooms: locked doors mean
6
+ * nothing, wards mean everything, and every move out there deepens the
7
+ * snap-back toll collected on return (see planes.ts). Your body slumps
8
+ * where you left it, and yes, someone can find it.
9
+ */
10
+ export declare class ProjectCommand extends Command implements ICommand {
11
+ protected static verb: string;
12
+ protected static description: string;
13
+ execute(_args?: string[]): Promise<string>;
14
+ }
15
+ export declare class ReturnCommand extends Command implements ICommand {
16
+ protected static verb: string;
17
+ protected static description: string;
18
+ execute(_args?: string[]): Promise<string>;
19
+ }
@@ -0,0 +1,54 @@
1
+ import { Command } from './command.js';
2
+ import { projectAstral, returnToBody } from '../utilities/planes.js';
3
+ /**
4
+ * Astral projection ("project") and the way back ("return") -- Awakened
5
+ * only; a mundane with a grimoire can throw a book-learned spell but can't
6
+ * leave their flesh. The astral overlays the same rooms: locked doors mean
7
+ * nothing, wards mean everything, and every move out there deepens the
8
+ * snap-back toll collected on return (see planes.ts). Your body slumps
9
+ * where you left it, and yes, someone can find it.
10
+ */
11
+ export class ProjectCommand extends Command {
12
+ static verb = 'project';
13
+ static description = 'Leave your body and walk the astral (Awakened only). Locked doors mean nothing, wards mean everything, and your empty body stays behind. "return" comes back.';
14
+ async execute(_args = []) {
15
+ const actor = this.actor;
16
+ if (actor.plane === 'astral') {
17
+ return `You're already out. "return" comes back to your body.`;
18
+ }
19
+ if (actor.plane === 'matrix') {
20
+ return `Your mind is in the Matrix -- one plane at a time. "jack out" first.`;
21
+ }
22
+ if (!actor.isAwakened()) {
23
+ return `You reach for the door out of your flesh and find a wall. Projection takes the Awakened gift -- no formula or focus fakes this one.`;
24
+ }
25
+ if (actor.adept) {
26
+ return `Your magic lives IN your body -- an adept's gift doesn't leave the flesh. You can read auras ("assense"), but projecting isn't yours.`;
27
+ }
28
+ if (actor.isIncapacitated()) {
29
+ return `You're down -- your spirit isn't going anywhere your body can't follow.`;
30
+ }
31
+ if (actor.inExchange) {
32
+ return `Lead is flying -- leaving your body mid-firefight is how bodies stop being yours. Wait for the lull.`;
33
+ }
34
+ const lines = projectAstral(this.scene, actor);
35
+ this.scene.updateStatus();
36
+ return lines.join('\n');
37
+ }
38
+ }
39
+ export class ReturnCommand extends Command {
40
+ static verb = 'return';
41
+ static description = 'Return to your body from the astral plane, paying the snap-back toll for time spent out.';
42
+ async execute(_args = []) {
43
+ const actor = this.actor;
44
+ if (actor.plane !== 'astral') {
45
+ return `You're already in your body.`;
46
+ }
47
+ if (actor.inExchange) {
48
+ return `The fight has your astral form pinned in the exchange -- survive it, then slip back in the lull.`;
49
+ }
50
+ const lines = returnToBody(this.scene, actor);
51
+ return lines.join('\n');
52
+ }
53
+ }
54
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO;IAC/B,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,MAAM,CAAC,WAAW,GAAG,+JAA+J,CAAC;IAE/L,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,uDAAuD,CAAC;QACjE,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,sEAAsE,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACxB,OAAO,qIAAqI,CAAC;QAC/I,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,uIAAuI,CAAC;QACjJ,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,OAAO,yEAAyE,CAAC;QACnF,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,sGAAsG,CAAC;QAChH,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;;AAGH,MAAM,OAAO,aAAc,SAAQ,OAAO;IAC9B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,WAAW,GAAG,0FAA0F,CAAC;IAE1H,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,8BAA8B,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,kGAAkG,CAAC;QAC5G,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC"}
@@ -7,9 +7,8 @@ export class ReadCommand extends Command {
7
7
  if (args.length === 0) {
8
8
  return 'What do you want to read? Try: `read [item name]`';
9
9
  }
10
- const targetName = args.join(' ').toLowerCase();
11
- const actorItems = this.actor.inventory.getAllItems();
12
- const item = actorItems.find((i) => i.name.toLowerCase() === targetName);
10
+ const targetName = args.join(' ');
11
+ const item = this.actor.inventory.getItem(targetName);
13
12
  if (!item) {
14
13
  return `You don't have anything called "${targetName}" here.`;
15
14
  }
@@ -19,8 +18,10 @@ export class ReadCommand extends Command {
19
18
  // Log the action
20
19
  this.logger.write(`ReadCommand: ${this.actor.name} reads "${item.name}".`);
21
20
  this.actor.performAction('reads', item.name);
22
- // Provide a default response if no extra details are present
23
- return item.details || `You flip through "${item.name}" but it's mostly blank pages.`;
21
+ // "details" is where clue/note content is meant to live, but "description"
22
+ // is a reasonable fallback if a scene ever puts it there instead -- better
23
+ // to show something real than a dead "blank pages" non-answer.
24
+ return item.details || item.description || `You flip through "${item.name}" but it's mostly blank pages.`;
24
25
  }
25
26
  }
26
27
  //# sourceMappingURL=read.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,OAAO,WAAY,SAAQ,OAAO;IAC5B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,WAAW,GAAG,qCAAqC,CAAC;IAErE,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,mDAAmD,CAAC;QAC7D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAEtD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;QAE/E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,mCAAmC,UAAU,SAAS,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,CAAC,IAAI,gCAAgC,CAAC;QACtD,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,6DAA6D;QAC7D,OAAO,IAAI,CAAC,OAAO,IAAI,qBAAqB,IAAI,CAAC,IAAI,gCAAgC,CAAC;IACxF,CAAC"}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,OAAO,WAAY,SAAQ,OAAO;IAC5B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,WAAW,GAAG,qCAAqC,CAAC;IAErE,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,mDAAmD,CAAC;QAC7D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,mCAAmC,UAAU,SAAS,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,CAAC,IAAI,gCAAgC,CAAC;QACtD,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,2EAA2E;QAC3E,2EAA2E;QAC3E,+DAA+D;QAC/D,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,IAAI,qBAAqB,IAAI,CAAC,IAAI,gCAAgC,CAAC;IAC5G,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Command, ICommand } from './command.js';
2
+ /**
3
+ * The answer to a cracked PAN (see hack.ts): reboot your network. Clears
4
+ * every jammed device you carry and brings a hacked-dark AR overlay back
5
+ * up. Costs you the lull -- you can't reboot with lead in the air, which
6
+ * is exactly why a mid-fight jam hurts.
7
+ */
8
+ export declare class RebootCommand extends Command implements ICommand {
9
+ protected static verb: string;
10
+ protected static description: string;
11
+ execute(_args?: string[]): Promise<string>;
12
+ }
@@ -0,0 +1,52 @@
1
+ import { Command } from './command.js';
2
+ /**
3
+ * The answer to a cracked PAN (see hack.ts): reboot your network. Clears
4
+ * every jammed device you carry and brings a hacked-dark AR overlay back
5
+ * up. Costs you the lull -- you can't reboot with lead in the air, which
6
+ * is exactly why a mid-fight jam hurts.
7
+ */
8
+ export class RebootCommand extends Command {
9
+ static verb = 'reboot';
10
+ static description = 'Reboot your PAN: clears jammed (hacked) devices and restores a cut AR overlay. Not while lead is flying.';
11
+ async execute(_args = []) {
12
+ const actor = this.actor;
13
+ if (actor.isIncapacitated()) {
14
+ return `You're down. The network can wait.`;
15
+ }
16
+ if (actor.inExchange || (actor === this.scene.getPlayer() && this.scene.isPlayerExchangeActive())) {
17
+ return `No rebooting with lead in the air -- survive the exchange, then cycle it in the lull.`;
18
+ }
19
+ if (actor.plane === 'matrix') {
20
+ return `Rebooting the deck you're RIDING would dump you. "jack out" first.`;
21
+ }
22
+ const jammedGear = actor.inventory.getAllItems().filter(i => i.jammed);
23
+ for (const group of Object.values(actor.equipment)) {
24
+ if (!group)
25
+ continue;
26
+ for (const item of Object.values(group)) {
27
+ if (item && item.jammed)
28
+ jammedGear.push(item);
29
+ }
30
+ }
31
+ const hadArDown = actor.arOffline;
32
+ if (jammedGear.length === 0 && !hadArDown) {
33
+ return `Your PAN is clean -- nothing needs a reboot.`;
34
+ }
35
+ for (const item of jammedGear) {
36
+ item.jammed = false;
37
+ }
38
+ actor.arOffline = false;
39
+ actor.performAction('reboots their PAN', 'devices cycling back up');
40
+ this.logger.write(`${actor.name} rebooted their PAN (${jammedGear.length} device(s) cleared, AR ${hadArDown ? 'restored' : 'fine'}).`);
41
+ this.scene.updateStatus();
42
+ const lines = [`You cold-cycle the PAN. A three-second eternity, then everything handshakes back:`];
43
+ for (const item of jammedGear) {
44
+ lines.push(` • ${item.name} -- smartlink live again`);
45
+ }
46
+ if (hadArDown) {
47
+ lines.push(` • AR overlay back up -- the world regrows its labels`);
48
+ }
49
+ return lines.join('\n');
50
+ }
51
+ }
52
+ //# sourceMappingURL=reboot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reboot.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/reboot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAO;IAC9B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,WAAW,GAAG,0GAA0G,CAAC;IAE1I,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,OAAO,oCAAoC,CAAC;QAC9C,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC;YAClG,OAAO,uFAAuF,CAAC;QACjG,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,oEAAoE,CAAC;QAC9E,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxC,IAAI,IAAI,IAAK,IAA6B,CAAC,MAAM;oBAAE,UAAU,CAAC,IAAI,CAAC,IAAiC,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAElC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,8CAA8C,CAAC;QACxD,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,wBAAwB,UAAU,CAAC,MAAM,0BAA0B,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACvI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAG,CAAC,mFAAmF,CAAC,CAAC;QACpG,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Command, ICommand } from './command.js';
2
+ /**
3
+ * Refills the equipped firearm's magazine by consuming one
4
+ * Ammunition-category item from the pack. Firearms hold
5
+ * Item.MAGAZINE_CAPACITY rounds and every shot (retaliation included)
6
+ * spends one -- see combat-exchange.ts. Reloading mid-fight is allowed
7
+ * (the between-exchanges pause is exactly the window for it), just not
8
+ * mid-exchange.
9
+ */
10
+ export declare class ReloadCommand extends Command implements ICommand {
11
+ protected static verb: string;
12
+ protected static description: string;
13
+ execute(_args?: string[]): Promise<string>;
14
+ }
@@ -0,0 +1,40 @@
1
+ import { Command } from './command.js';
2
+ import { Category } from '../types/shared/item-enum.js';
3
+ import { Item } from '../models/item.js';
4
+ /**
5
+ * Refills the equipped firearm's magazine by consuming one
6
+ * Ammunition-category item from the pack. Firearms hold
7
+ * Item.MAGAZINE_CAPACITY rounds and every shot (retaliation included)
8
+ * spends one -- see combat-exchange.ts. Reloading mid-fight is allowed
9
+ * (the between-exchanges pause is exactly the window for it), just not
10
+ * mid-exchange.
11
+ */
12
+ export class ReloadCommand extends Command {
13
+ static verb = 'reload';
14
+ static description = 'Reload your equipped firearm -- consumes one Ammunition item from your pack.';
15
+ async execute(_args = []) {
16
+ const actor = this.actor;
17
+ if (actor === this.scene.getPlayer() && this.scene.isPlayerExchangeActive()) {
18
+ return `No time -- the exchange is still resolving. Reload in the lull.`;
19
+ }
20
+ const weapon = actor.equipment.rightHand?.weapon ?? actor.equipment.leftHand?.weapon;
21
+ if (!weapon || !weapon.isFirearm()) {
22
+ return `You have no firearm equipped to reload.`;
23
+ }
24
+ if (weapon.ammo >= Item.MAGAZINE_CAPACITY) {
25
+ return `The ${weapon.name} is already fully loaded (${weapon.ammo}/${Item.MAGAZINE_CAPACITY}).`;
26
+ }
27
+ const ammo = actor.inventory.getAllItems().find(i => i.category === Category.Ammunition);
28
+ if (!ammo) {
29
+ return `No ammunition in your pack -- the ${weapon.name} stays at ${weapon.ammo}/${Item.MAGAZINE_CAPACITY}. Find a spare clip.`;
30
+ }
31
+ actor.inventory.removeItem(ammo.name);
32
+ weapon.reload();
33
+ this.logger.write(`${actor.name} reloaded ${weapon.name} with ${ammo.name}.`);
34
+ this.actor.performAction('reloads', weapon.name);
35
+ this.scene.updateInventory(this.scene.getPlayer().inventory);
36
+ this.scene.updateStatus();
37
+ return `You slap the ${ammo.name} home -- ${weapon.name} loaded, ${weapon.ammo}/${Item.MAGAZINE_CAPACITY}.`;
38
+ }
39
+ }
40
+ //# sourceMappingURL=reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/reload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAO;IAC9B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,WAAW,GAAG,8EAA8E,CAAC;IAE9G,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC;YAC5E,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;QACrF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YACnC,OAAO,yCAAyC,CAAC;QACnD,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,OAAO,OAAO,MAAM,CAAC,IAAI,6BAA6B,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC;QAClG,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,qCAAqC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,sBAAsB,CAAC;QAClI,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,aAAa,MAAM,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE1B,OAAO,gBAAgB,IAAI,CAAC,IAAI,YAAY,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,GAAG,CAAC;IAC9G,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command, ICommand } from './command.js';
2
+ /**
3
+ * The free road to STUN recovery (stim patches are the fast, risky one --
4
+ * see use.ts): catch your breath somewhere safe. "Safe" means a
5
+ * Residence-type room (your Hideout qualifies) or a room with no one else
6
+ * in it -- nobody naps in front of an audience in the sprawl. Each rest
7
+ * rolls Body and recovers hits + 1 stun; repeat as needed. Rest never
8
+ * touches the physical track (bullet holes take medkits or a heal spell),
9
+ * and you can't rest mid-combat-exchange.
10
+ */
11
+ export declare class RestCommand extends Command implements ICommand {
12
+ protected static verb: string;
13
+ protected static description: string;
14
+ execute(_args?: string[]): Promise<string>;
15
+ }
@@ -0,0 +1,59 @@
1
+ import { Command } from './command.js';
2
+ import { rollPool, formatRoll } from '../utilities/dice.js';
3
+ /**
4
+ * The free road to STUN recovery (stim patches are the fast, risky one --
5
+ * see use.ts): catch your breath somewhere safe. "Safe" means a
6
+ * Residence-type room (your Hideout qualifies) or a room with no one else
7
+ * in it -- nobody naps in front of an audience in the sprawl. Each rest
8
+ * rolls Body and recovers hits + 1 stun; repeat as needed. Rest never
9
+ * touches the physical track (bullet holes take medkits or a heal spell),
10
+ * and you can't rest mid-combat-exchange.
11
+ */
12
+ export class RestCommand extends Command {
13
+ static verb = 'rest';
14
+ static description = 'Catch your breath somewhere safe to recover Stun (spell drain, stim crashes). Physical wounds need a medkit or a heal spell.';
15
+ async execute(_args = []) {
16
+ const actor = this.actor;
17
+ const room = actor.currentLocation;
18
+ if (actor.isIncapacitated()) {
19
+ return `You're past resting.`;
20
+ }
21
+ if (actor === this.scene.getPlayer() && this.scene.isPlayerExchangeActive()) {
22
+ return `Rest? Lead is flying. Survive first.`;
23
+ }
24
+ // Downtime also covers bench work: any damaged cyberdeck carried gets
25
+ // repaired alongside the nap (Logic roll -- soldering is brainwork).
26
+ const damagedDecks = actor.inventory.getAllItems().filter(i => i.isCyberdeck() && i.deckDamage > 0);
27
+ if (actor.stunTaken === 0 && damagedDecks.length === 0) {
28
+ return `Your head's already clear -- nothing to sleep off.`;
29
+ }
30
+ const othersHere = this.scene.getActorsInRoom(room).filter(a => a !== actor);
31
+ const isResidence = room.roomType?.toLowerCase() === 'residence';
32
+ if (!isResidence && othersHere.length > 0) {
33
+ return `Too exposed to rest here with ${othersHere.map(a => a.name).join(', ')} around. Find your hideout, or an empty room.`;
34
+ }
35
+ const lines = [`You find a corner, close your eyes, and let the static drain out.`];
36
+ if (actor.stunTaken > 0) {
37
+ const roll = rollPool(actor.body);
38
+ const recovered = actor.healStun(roll.hits + 1);
39
+ this.logger.write(`RestCommand: ${actor.name} rested and recovered ${recovered} stun (${actor.stunTaken}/${actor.maxStunBoxes}).`);
40
+ lines.push(` Rest: ${formatRoll(roll)}`);
41
+ lines.push(` ${recovered} stun recovered: ${actor.stunSummary()}`);
42
+ }
43
+ for (const deck of damagedDecks) {
44
+ const wasBricked = deck.isBricked;
45
+ const repairRoll = rollPool(actor.logic);
46
+ const repaired = deck.repairDeck(repairRoll.hits + 1);
47
+ this.logger.write(`RestCommand: ${actor.name} repaired ${repaired} boxes on ${deck.name} (${deck.deckDamage}/${deck.maxDeckBoxes}).`);
48
+ lines.push(` Bench work on the ${deck.name}: ${formatRoll(repairRoll)}`);
49
+ lines.push(` ${repaired} box${repaired === 1 ? '' : 'es'} repaired: ${deck.deckSummary()}${wasBricked && !deck.isBricked ? ' -- it boots again.' : ''}`);
50
+ }
51
+ lines.push(actor.stunTaken === 0 && !damagedDecks.some(d => d.deckDamage > 0)
52
+ ? ` Head clear, gear humming. Back to work.`
53
+ : ` (Rest again to keep recovering.)`);
54
+ this.actor.performAction('rests', '');
55
+ this.scene.updateStatus();
56
+ return lines.join('\n');
57
+ }
58
+ }
59
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/rest.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Command } from './command.js';
2
2
  import { NPC } from '../models/npc.js';
3
+ import { CALL_ICON, CALL_COLOR } from '../utilities/comm-style.js';
3
4
  export class SayCommand extends Command {
4
5
  static verb = "say";
5
6
  static description = "Broadcast a message to everyone in the current room.";
@@ -20,11 +21,31 @@ export class SayCommand extends Command {
20
21
  return "An error occurred.";
21
22
  }
22
23
  if (!(this.actor instanceof NPC)) {
23
- // this.actor is *not* an instance of NPC
24
- this.logger.logWithColor(message, 'yellow');
24
+ // this.actor is *not* an instance of NPC. While on a call, tag this
25
+ // the same way as call.ts's own confirmation, so a conversation over
26
+ // comms visually reads as a different "space" than in-person speech.
27
+ const inCall = !!currentPlayer.activeCallPartner;
28
+ const prefix = inCall ? `${CALL_ICON} ` : '';
29
+ this.logger.logWithColor(`${prefix}${message}`, inCall ? CALL_COLOR : 'yellow');
25
30
  }
26
31
  // Only the current actor says something in their room
27
32
  currentPlayer.currentLocation.say(currentPlayer, message);
33
+ // "say" and "call" are deliberately similar -- once a call connects
34
+ // (see call.ts), the two ends keep talking with the same "say" command
35
+ // they already know, but it also reaches whoever they're on the line
36
+ // with, regardless of room. Guarded against double delivery for the
37
+ // (unusual) case where the call partner is actually in the same room.
38
+ // Deliberately NOT awaited (same as call.ts): the partner's reply is
39
+ // an AI round trip that announces itself when it arrives -- awaiting
40
+ // it here held the whole command (and the input box's clear) hostage
41
+ // for seconds, found via a real session where typed text visibly
42
+ // lingered while on a call.
43
+ const partner = currentPlayer.activeCallPartner;
44
+ if (partner && partner.currentLocation !== currentPlayer.currentLocation) {
45
+ void Promise.resolve(partner.hear(currentPlayer, message)).catch(err => {
46
+ this.logger.error(`${partner.name} failed to hear ${currentPlayer.name} over the call: ${err}`);
47
+ });
48
+ }
28
49
  return "";
29
50
  }
30
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/say.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,OAAO,UAAW,SAAQ,OAAO;IAC3B,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,MAAM,CAAC,WAAW,GAAG,sDAAsD,CAAC;IAC5E,OAAO,CAAsB;IAEvC,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAClD,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YACjC,yCAAyC;YACzC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,sDAAsD;QACtD,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,OAAO,EAAE,CAAC;IACZ,CAAC"}
1
+ {"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/say.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,UAAW,SAAQ,OAAO;IAC3B,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,MAAM,CAAC,WAAW,GAAG,sDAAsD,CAAC;IAC5E,OAAO,CAAsB;IAEvC,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAClD,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YACjC,oEAAoE;YACpE,qEAAqE;YACrE,qEAAqE;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClF,CAAC;QAED,sDAAsD;QACtD,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,oEAAoE;QACpE,uEAAuE;QACvE,qEAAqE;QACrE,oEAAoE;QACpE,sEAAsE;QACtE,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,iEAAiE;QACjE,4BAA4B;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,iBAAiB,CAAC;QAChD,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,aAAa,CAAC,eAAe,EAAE,CAAC;YACzE,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,mBAAmB,aAAa,CAAC,IAAI,mBAAmB,GAAG,EAAE,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC"}
@@ -4,7 +4,15 @@ export class SearchCommand extends Command {
4
4
  static description = 'Search for items in your area';
5
5
  async execute(_args) {
6
6
  const room = this.actor.currentLocation;
7
- const roomItems = room.inventory.listItems();
7
+ // Casing the room is what unlocks "take all" here (see take.ts) --
8
+ // and the future anchor point for perception checks.
9
+ room.searchedBy.add(this.actor.name);
10
+ // A search finds what your plane can touch or see: meat finds meat,
11
+ // a Matrix persona finds files and paydata, the astral sees the meat
12
+ // world's objects (dimly -- taking them is another matter, see take.ts).
13
+ const roomItems = room.inventory.getAllItems()
14
+ .filter(i => i.plane === this.actor.plane || (this.actor.plane === 'astral' && i.plane === 'meat'))
15
+ .map(i => i.name.toLowerCase());
8
16
  let description = '';
9
17
  if (roomItems.length === 0) {
10
18
  description += "You search the area thoroughly, but don't find any items.";
@@ -15,8 +23,17 @@ export class SearchCommand extends Command {
15
23
  this.actor.performAction('search', itemsList);
16
24
  description += `You search the area and find: ${itemsList}`;
17
25
  }
18
- if (room.puzzle && !room.puzzle.isSolved()) {
19
- description += `\n\nPuzzle here: ${room.puzzle.riddle}`;
26
+ for (const target of room.getPuzzleTargets()) {
27
+ const locked = target.puzzle.requiresPuzzle && !target.puzzle.requiresPuzzle.isSolved();
28
+ const directionNote = target.direction ? ` (blocking the way ${target.direction})` : '';
29
+ description += `\n\n${target.puzzle.riddle}${directionNote}`;
30
+ const bypassHint = target.puzzle.getBypassHint();
31
+ if (bypassHint) {
32
+ description += `\n${bypassHint}`;
33
+ }
34
+ if (locked) {
35
+ description += `\n(This seems locked -- something else needs to happen first.)`;
36
+ }
20
37
  }
21
38
  return description;
22
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AAEjD,MAAM,OAAO,aAAc,SAAQ,OAAO;IAC9B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,WAAW,GAAG,+BAA+B,CAAC;IAE/D,KAAK,CAAC,OAAO,CAAC,KAAe;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,IAAI,2DAA2D,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,+BAA+B,SAAS,EAAE,CAAC,CAAC;YAC/F,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9C,WAAW,IAAI,iCAAiC,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3C,WAAW,IAAI,oBAAoB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1D,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AAEjD,MAAM,OAAO,aAAc,SAAQ,OAAO;IAC9B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,WAAW,GAAG,+BAA+B,CAAC;IAE/D,KAAK,CAAC,OAAO,CAAC,KAAe;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;QACxC,mEAAmE;QACnE,qDAAqD;QACrD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,oEAAoE;QACpE,qEAAqE;QACrE,yEAAyE;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;aAClG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAClC,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,IAAI,2DAA2D,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,+BAA+B,SAAS,EAAE,CAAC,CAAC;YAC/F,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9C,WAAW,IAAI,iCAAiC,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACxF,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,WAAW,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,IAAI,KAAK,UAAU,EAAE,CAAC;YACnC,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,IAAI,gEAAgE,CAAC;YAClF,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Command, ICommand } from './command.js';
2
+ /**
3
+ * The character sheet: every attribute and the derived numbers they feed,
4
+ * in the same on-demand panel style as spells/inv/equipment. What each
5
+ * stat actually does is spelled out inline, so the sheet doubles as the
6
+ * rules reference.
7
+ */
8
+ export declare class SheetCommand extends Command implements ICommand {
9
+ protected static verb: string;
10
+ protected static description: string;
11
+ execute(_args?: string[]): Promise<string>;
12
+ }
@@ -0,0 +1,49 @@
1
+ import { Command } from './command.js';
2
+ /**
3
+ * The character sheet: every attribute and the derived numbers they feed,
4
+ * in the same on-demand panel style as spells/inv/equipment. What each
5
+ * stat actually does is spelled out inline, so the sheet doubles as the
6
+ * rules reference.
7
+ */
8
+ export class SheetCommand extends Command {
9
+ static verb = 'sheet';
10
+ static description = 'Your character sheet: attributes, derived pools, tracks, and edge.';
11
+ async execute(_args = []) {
12
+ const a = this.actor;
13
+ const attr = (label, value, does) => ` ${label.padEnd(10)} ${String(value).padStart(2)} -- ${does}`;
14
+ const lines = [
15
+ `=== ${a.name.toUpperCase()} ===`,
16
+ '',
17
+ 'Attributes:',
18
+ attr('Body', a.body, 'soak, physical track, rest recovery'),
19
+ attr('Agility', a.agility, 'attack pool'),
20
+ attr('Reaction', a.reaction, 'defense pool'),
21
+ attr('Strength', a.strength, `melee/unarmed damage, carry cap (${a.maxCarryingWeight} kg)`),
22
+ attr('Willpower', a.willpower, 'stun track, drain resistance'),
23
+ attr('Logic', a.logic, 'first aid, hacking'),
24
+ attr('Intuition', a.intuition, 'defense (half), perception'),
25
+ attr('Charisma', a.charisma, 'presence -- the talking stats are coming'),
26
+ attr('Skill', a.combatSkill, 'combat training, attack pool'),
27
+ attr('Magic', a.magic, a.adept
28
+ ? 'ADEPT -- body-magic: half rides every meat attack/defense; no spells, no projection'
29
+ : a.isAwakened() ? 'AWAKENED -- innate casting (see "spells")' : 'mundane'),
30
+ ...(a.isTechnomancer() ? [attr('Resonance', a.resonance, 'TECHNOMANCER -- the Matrix without a deck; all Matrix damage is REAL stun')] : []),
31
+ attr('Edge', a.edge, `luck -- ${a.edgeRemaining}/${a.edge} left this job${a.edgeBoostArmed ? ', a boost is BURNING now' : ''} ("edge" to burn one)`),
32
+ '',
33
+ 'Derived:',
34
+ ...(a.plane !== 'meat' ? [` Plane: ${a.plane.toUpperCase()}${a.plane === 'matrix' ? ` (${a.simMode}-sim)` : ''} -- pools below are your ${a.plane} pools; body at ${a.bodyRoom?.name ?? '???'}`] : []),
35
+ ` Attack pool: ${a.getAttackPool()}d6 (${a.getWeaponProfile().name}, damage ${a.getWeaponProfile().damage})`,
36
+ ` Defense pool: ${a.getDefensePool()}d6`,
37
+ ` Initiative: ${a.getInitiativePool()}d6${a.plane === 'meat' ? ' (Reaction + Intuition + live commlink AR)' : ''}`,
38
+ ` Soak pool: ${a.getSoakPool()}d6`,
39
+ ...(a.isCaster() ? [` Casting pool: ${a.getMagicPool()}d6`] : []),
40
+ ` Physical: ${a.conditionSummary()}`,
41
+ ` Stun: ${a.stunSummary()}`,
42
+ ...(a.getAnyCyberdeck() ? [` Deck: ${a.getAnyCyberdeck().name} ${a.matrixSummary()}${a.getAnyCyberdeck().isBricked ? ' -- BRICKED (rest to repair)' : ''}`] : []),
43
+ ...(a.woundModifier < 0 ? [` Wounds: ${a.woundModifier} dice on everything`] : []),
44
+ ...(a.sustainedArmor > 0 ? [` Sustained: armor +${a.sustainedArmor} soak (-2 dice)`] : []),
45
+ ];
46
+ return lines.join('\n');
47
+ }
48
+ }
49
+ //# sourceMappingURL=sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/sheet.ts"],"names":[],"mappings":"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"}