@maka/maka-cli 5.6.0 → 5.7.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 (212) hide show
  1. package/bundle/typescript/package.json +2 -2
  2. package/bundle/typescript/src/commands/_index.d.ts +4 -0
  3. package/bundle/typescript/src/commands/_index.js +4 -0
  4. package/bundle/typescript/src/commands/_index.js.map +1 -1
  5. package/bundle/typescript/src/commands/debug.js +1 -7
  6. package/bundle/typescript/src/commands/debug.js.map +1 -1
  7. package/bundle/typescript/src/commands/deploy/ubuntu.sub.cmd.js +17 -1
  8. package/bundle/typescript/src/commands/deploy/ubuntu.sub.cmd.js.map +1 -1
  9. package/bundle/typescript/src/commands/env/_index.d.ts +3 -0
  10. package/bundle/typescript/src/commands/env/_index.js +4 -0
  11. package/bundle/typescript/src/commands/env/_index.js.map +1 -0
  12. package/bundle/typescript/src/commands/env/env.command.d.ts +3 -0
  13. package/bundle/typescript/src/commands/env/env.command.js +22 -0
  14. package/bundle/typescript/src/commands/env/env.command.js.map +1 -0
  15. package/bundle/typescript/src/commands/env/get.sub.cmd.d.ts +1 -0
  16. package/bundle/typescript/src/commands/env/get.sub.cmd.js +46 -0
  17. package/bundle/typescript/src/commands/env/get.sub.cmd.js.map +1 -0
  18. package/bundle/typescript/src/commands/env/prompt-for-env.d.ts +10 -0
  19. package/bundle/typescript/src/commands/env/prompt-for-env.js +27 -0
  20. package/bundle/typescript/src/commands/env/prompt-for-env.js.map +1 -0
  21. package/bundle/typescript/src/commands/env/set.sub.cmd.d.ts +1 -0
  22. package/bundle/typescript/src/commands/env/set.sub.cmd.js +59 -0
  23. package/bundle/typescript/src/commands/env/set.sub.cmd.js.map +1 -0
  24. package/bundle/typescript/src/commands/game/sideQuest/archetypes.d.ts +16 -0
  25. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js +79 -0
  26. package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -1
  27. package/bundle/typescript/src/commands/game/sideQuest/augmentations.d.ts +31 -0
  28. package/bundle/typescript/src/commands/game/sideQuest/augmentations.js +125 -0
  29. package/bundle/typescript/src/commands/game/sideQuest/augmentations.js.map +1 -0
  30. package/bundle/typescript/src/commands/game/sideQuest/commands/advance.d.ts +17 -7
  31. package/bundle/typescript/src/commands/game/sideQuest/commands/advance.js +113 -15
  32. package/bundle/typescript/src/commands/game/sideQuest/commands/advance.js.map +1 -1
  33. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.d.ts +37 -0
  34. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js +193 -0
  35. package/bundle/typescript/src/commands/game/sideQuest/commands/ask.js.map +1 -0
  36. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js +3 -0
  37. package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js.map +1 -1
  38. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js +10 -3
  39. package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js.map +1 -1
  40. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.d.ts +3 -2
  41. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +12 -4
  42. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -1
  43. package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.js +7 -1
  44. package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.js.map +1 -1
  45. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.d.ts +16 -0
  46. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js +97 -0
  47. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js.map +1 -0
  48. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.d.ts +21 -10
  49. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +41 -27
  50. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -1
  51. package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +6 -7
  52. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +54 -20
  53. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
  54. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.d.ts +35 -1
  55. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +277 -44
  56. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -1
  57. package/bundle/typescript/src/commands/game/sideQuest/commands/contacts.d.ts +13 -0
  58. package/bundle/typescript/src/commands/game/sideQuest/commands/contacts.js +37 -0
  59. package/bundle/typescript/src/commands/game/sideQuest/commands/contacts.js.map +1 -0
  60. package/bundle/typescript/src/commands/game/sideQuest/commands/drink.d.ts +14 -0
  61. package/bundle/typescript/src/commands/game/sideQuest/commands/drink.js +15 -0
  62. package/bundle/typescript/src/commands/game/sideQuest/commands/drink.js.map +1 -0
  63. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js +1 -1
  64. package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js.map +1 -1
  65. package/bundle/typescript/src/commands/game/sideQuest/commands/drop.js +7 -0
  66. package/bundle/typescript/src/commands/game/sideQuest/commands/drop.js.map +1 -1
  67. package/bundle/typescript/src/commands/game/sideQuest/commands/eat.d.ts +14 -0
  68. package/bundle/typescript/src/commands/game/sideQuest/commands/eat.js +15 -0
  69. package/bundle/typescript/src/commands/game/sideQuest/commands/eat.js.map +1 -0
  70. package/bundle/typescript/src/commands/game/sideQuest/commands/edge.js +10 -0
  71. package/bundle/typescript/src/commands/game/sideQuest/commands/edge.js.map +1 -1
  72. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js +3 -0
  73. package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js.map +1 -1
  74. package/bundle/typescript/src/commands/game/sideQuest/commands/give.js +101 -1
  75. package/bundle/typescript/src/commands/game/sideQuest/commands/give.js.map +1 -1
  76. package/bundle/typescript/src/commands/game/sideQuest/commands/go.d.ts +4 -1
  77. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +15 -11
  78. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
  79. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +3 -3
  80. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -1
  81. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js +58 -2
  82. package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js.map +1 -1
  83. package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.d.ts +26 -0
  84. package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.js +125 -0
  85. package/bundle/typescript/src/commands/game/sideQuest/commands/initiate.js.map +1 -0
  86. package/bundle/typescript/src/commands/game/sideQuest/commands/install.d.ts +21 -0
  87. package/bundle/typescript/src/commands/game/sideQuest/commands/install.js +125 -0
  88. package/bundle/typescript/src/commands/game/sideQuest/commands/install.js.map +1 -0
  89. package/bundle/typescript/src/commands/game/sideQuest/commands/jump.d.ts +16 -0
  90. package/bundle/typescript/src/commands/game/sideQuest/commands/jump.js +62 -0
  91. package/bundle/typescript/src/commands/game/sideQuest/commands/jump.js.map +1 -0
  92. package/bundle/typescript/src/commands/game/sideQuest/commands/lifestyle.d.ts +16 -0
  93. package/bundle/typescript/src/commands/game/sideQuest/commands/lifestyle.js +76 -0
  94. package/bundle/typescript/src/commands/game/sideQuest/commands/lifestyle.js.map +1 -0
  95. package/bundle/typescript/src/commands/game/sideQuest/commands/lock.js +4 -0
  96. package/bundle/typescript/src/commands/game/sideQuest/commands/lock.js.map +1 -1
  97. package/bundle/typescript/src/commands/game/sideQuest/commands/pay.d.ts +13 -0
  98. package/bundle/typescript/src/commands/game/sideQuest/commands/pay.js +39 -0
  99. package/bundle/typescript/src/commands/game/sideQuest/commands/pay.js.map +1 -0
  100. package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.js +5 -1
  101. package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.js.map +1 -1
  102. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +5 -2
  103. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -1
  104. package/bundle/typescript/src/commands/game/sideQuest/commands/quality-trade.d.ts +21 -0
  105. package/bundle/typescript/src/commands/game/sideQuest/commands/quality-trade.js +121 -0
  106. package/bundle/typescript/src/commands/game/sideQuest/commands/quality-trade.js.map +1 -0
  107. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +60 -12
  108. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -1
  109. package/bundle/typescript/src/commands/game/sideQuest/commands/say.js +27 -10
  110. package/bundle/typescript/src/commands/game/sideQuest/commands/say.js.map +1 -1
  111. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +6 -2
  112. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  113. package/bundle/typescript/src/commands/game/sideQuest/commands/sell.d.ts +17 -0
  114. package/bundle/typescript/src/commands/game/sideQuest/commands/sell.js +125 -0
  115. package/bundle/typescript/src/commands/game/sideQuest/commands/sell.js.map +1 -0
  116. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +36 -3
  117. package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -1
  118. package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.js +9 -1
  119. package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.js.map +1 -1
  120. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js +27 -4
  121. package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js.map +1 -1
  122. package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js +1 -1
  123. package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js.map +1 -1
  124. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +8 -0
  125. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
  126. package/bundle/typescript/src/commands/game/sideQuest/commands/treat.d.ts +14 -0
  127. package/bundle/typescript/src/commands/game/sideQuest/commands/treat.js +67 -0
  128. package/bundle/typescript/src/commands/game/sideQuest/commands/treat.js.map +1 -0
  129. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js +7 -0
  130. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js.map +1 -1
  131. package/bundle/typescript/src/commands/game/sideQuest/commands/use.d.ts +29 -0
  132. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +118 -11
  133. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
  134. package/bundle/typescript/src/commands/game/sideQuest/commands/work.d.ts +15 -0
  135. package/bundle/typescript/src/commands/game/sideQuest/commands/work.js +68 -0
  136. package/bundle/typescript/src/commands/game/sideQuest/commands/work.js.map +1 -0
  137. package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js +2 -1
  138. package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js.map +1 -1
  139. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +1 -1
  140. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +131 -4
  141. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
  142. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.d.ts +6 -2
  143. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +10 -6
  144. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js.map +1 -1
  145. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +115 -0
  146. package/bundle/typescript/src/commands/game/sideQuest/game.js +464 -25
  147. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  148. package/bundle/typescript/src/commands/game/sideQuest/models/item.d.ts +28 -0
  149. package/bundle/typescript/src/commands/game/sideQuest/models/item.js +111 -0
  150. package/bundle/typescript/src/commands/game/sideQuest/models/item.js.map +1 -1
  151. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +70 -7
  152. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  153. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +109 -4
  154. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +423 -39
  155. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  156. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +6 -6
  157. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +38 -14
  158. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
  159. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +9 -0
  160. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +41 -8
  161. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  162. package/bundle/typescript/src/commands/game/sideQuest/qualities.d.ts +44 -0
  163. package/bundle/typescript/src/commands/game/sideQuest/qualities.js +155 -0
  164. package/bundle/typescript/src/commands/game/sideQuest/qualities.js.map +1 -0
  165. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +274 -5
  166. package/bundle/typescript/src/commands/game/sideQuest/types/seed/item-seed.d.ts +1 -0
  167. package/bundle/typescript/src/commands/game/sideQuest/types/seed/scene-seed.d.ts +17 -0
  168. package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.d.ts +2 -0
  169. package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.js +4 -0
  170. package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.js.map +1 -1
  171. package/bundle/typescript/src/commands/game/sideQuest/ui.js +50 -3
  172. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  173. package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.d.ts +13 -6
  174. package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.js +25 -14
  175. package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.js.map +1 -1
  176. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +100 -10
  177. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -1
  178. package/bundle/typescript/src/commands/game/sideQuest/utilities/commerce.d.ts +56 -0
  179. package/bundle/typescript/src/commands/game/sideQuest/utilities/commerce.js +144 -0
  180. package/bundle/typescript/src/commands/game/sideQuest/utilities/commerce.js.map +1 -0
  181. package/bundle/typescript/src/commands/game/sideQuest/utilities/outdoors.d.ts +10 -0
  182. package/bundle/typescript/src/commands/game/sideQuest/utilities/outdoors.js +16 -0
  183. package/bundle/typescript/src/commands/game/sideQuest/utilities/outdoors.js.map +1 -0
  184. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.d.ts +21 -0
  185. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +84 -0
  186. package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js.map +1 -1
  187. package/bundle/typescript/src/commands/game/sideQuest/utilities/terminal-reset.d.ts +17 -0
  188. package/bundle/typescript/src/commands/game/sideQuest/utilities/terminal-reset.js +23 -0
  189. package/bundle/typescript/src/commands/game/sideQuest/utilities/terminal-reset.js.map +1 -0
  190. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +51 -15
  191. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  192. package/bundle/typescript/src/commands/remote/reconfig.sub.cmd.js +27 -1
  193. package/bundle/typescript/src/commands/remote/reconfig.sub.cmd.js.map +1 -1
  194. package/bundle/typescript/src/commands/run/run.command.js +1 -7
  195. package/bundle/typescript/src/commands/run/run.command.js.map +1 -1
  196. package/bundle/typescript/src/commands/testCmd/mocha.sub.cmd.js +1 -6
  197. package/bundle/typescript/src/commands/testCmd/mocha.sub.cmd.js.map +1 -1
  198. package/bundle/typescript/src/generators/config.js +11 -10
  199. package/bundle/typescript/src/generators/config.js.map +1 -1
  200. package/bundle/typescript/src/templates/meteor/config/pm2.config.js +3 -3
  201. package/bundle/typescript/src/templates/meteor/project/gitignore +2 -1
  202. package/bundle/typescript/src/tool.d.ts +2 -0
  203. package/bundle/typescript/src/tool.js +3 -0
  204. package/bundle/typescript/src/tool.js.map +1 -1
  205. package/bundle/typescript/src/tools/aws/aws.class.js +6 -4
  206. package/bundle/typescript/src/tools/aws/aws.class.js.map +1 -1
  207. package/bundle/typescript/src/tools/dotenvx/dotenvx.class.d.ts +24 -0
  208. package/bundle/typescript/src/tools/dotenvx/dotenvx.class.js +66 -0
  209. package/bundle/typescript/src/tools/dotenvx/dotenvx.class.js.map +1 -0
  210. package/bundle/typescript/src/tools/ssh/ssh.class.js +1 -1
  211. package/bundle/typescript/src/tools/ssh/ssh.class.js.map +1 -1
  212. package/package.json +2 -2
@@ -0,0 +1,155 @@
1
+ /**
2
+ * SR5e Qualities (core p.71-85): the traits that make a spread a PERSON.
3
+ * Positive qualities cost karma, negative ones refund it, and the ledger
4
+ * starts at the book's 25 creation karma (p.71) -- so an archetype's
5
+ * quality picks decide the karma it walks onto the street with
6
+ * (see startingKarma / archetypes.ts). Deliberately archetype-baked
7
+ * rather than point-buy, same philosophy as the archetype pick itself:
8
+ * one select and you're playing.
9
+ *
10
+ * Catalog policy: every entry has a REAL mechanical hook -- no
11
+ * flavor-only traits (player decision). Where the book's effect targets
12
+ * a subsystem this game doesn't have, the entry adapts to the nearest
13
+ * real hook and says so in its comment. Karma values are RAW (p.73-74
14
+ * summary tables) throughout.
15
+ */
16
+ /** Everyone starts character creation with 25 karma (SR5e p.71). */
17
+ export const CREATION_KARMA = 25;
18
+ export const QUALITIES = [
19
+ // ------------------------------ Positive ------------------------------
20
+ {
21
+ key: 'toughness', name: 'Toughness', kind: 'positive', karma: 9, page: 'p.77',
22
+ effect: '+1 die on every damage soak roll',
23
+ },
24
+ {
25
+ // RAW: ignore one box per rating when counting wound modifiers, and it
26
+ // cannot combine with a pain editor (woundModifier enforces that).
27
+ key: 'high-pain-tolerance', name: 'High Pain Tolerance', kind: 'positive', karma: 7, page: 'p.74',
28
+ effect: 'ignore 1 box of damage when counting wound modifiers',
29
+ },
30
+ {
31
+ key: 'catlike', name: 'Catlike', kind: 'positive', karma: 7, page: 'p.72',
32
+ effect: '+2 dice on sneaking tests',
33
+ },
34
+ {
35
+ // RAW: +2 on Running/Gymnastics -- here, the athletics sprint that
36
+ // breaks off a fight (go.ts) is where that muscle shows.
37
+ key: 'natural-athlete', name: 'Natural Athlete', kind: 'positive', karma: 7, page: 'p.76',
38
+ effect: '+2 dice on athletics tests (including the sprint out of a fight)',
39
+ },
40
+ {
41
+ // RAW raises the Edge CEILING without granting the point; with no
42
+ // point-buy attributes here, the adaptation grants it outright.
43
+ key: 'lucky', name: 'Lucky', kind: 'positive', karma: 12, page: 'p.76',
44
+ effect: '+1 Edge -- luck past your natural ceiling',
45
+ },
46
+ {
47
+ // RAW: +2 social dice on a first meeting. Meetings aren't tracked
48
+ // per-NPC, so the adaptation is per JOB: the first social play of
49
+ // every job (persuade, bluff, haggle) gets the bonus.
50
+ key: 'first-impression', name: 'First Impression', kind: 'positive', karma: 11, page: 'p.74',
51
+ effect: '+2 dice on the first social play of every job',
52
+ },
53
+ {
54
+ // RAW: +2 on all Healing Tests -- exactly the first-aid roll (use.ts)
55
+ // and the rest recovery roll (rest.ts).
56
+ key: 'quick-healer', name: 'Quick Healer', kind: 'positive', karma: 3, page: 'p.77',
57
+ effect: '+2 dice on every healing test made on or by you (first aid, rest)',
58
+ },
59
+ {
60
+ // RAW: +2 on Logic tests for pattern analysis / puzzle-cracking --
61
+ // mapped to the hacking rolls, the game's logic-puzzle work.
62
+ key: 'analytical-mind', name: 'Analytical Mind', kind: 'positive', karma: 5, page: 'p.72',
63
+ effect: '+2 dice on hacking tests -- code is just a puzzle with rent',
64
+ },
65
+ {
66
+ // RAW: +2 juryrigging mechanical/electronic gear -- mapped to the
67
+ // piloting roll (drone work IS field rigging) and bench deck repair.
68
+ key: 'juryrigger', name: 'Juryrigger', kind: 'positive', karma: 10, page: 'p.75',
69
+ effect: '+2 dice on piloting and on bench-repairing a damaged deck',
70
+ },
71
+ // ------------------------------ Negative ------------------------------
72
+ {
73
+ key: 'sinner-national', name: 'SINner (National)', kind: 'negative', karma: 5, page: 'p.84',
74
+ effect: 'a legal SIN with taxes attached: 15% of every job and gig payout withheld',
75
+ },
76
+ {
77
+ key: 'sinner-criminal', name: 'SINner (Criminal)', kind: 'negative', karma: 10, page: 'p.84',
78
+ effect: 'a felon\'s SIN, broadcast always: 15% of every payout withheld, and the law knows your face',
79
+ },
80
+ {
81
+ key: 'sinner-corp', name: 'SINner (Corporate Limited)', kind: 'negative', karma: 15, page: 'p.84-85',
82
+ effect: 'a megacorp owns your file: 20% of every payout goes home to the company',
83
+ },
84
+ {
85
+ key: 'low-pain-tolerance', name: 'Low Pain Tolerance', kind: 'negative', karma: 9, page: 'p.82',
86
+ effect: 'wound modifiers bite every 2 boxes instead of every 3',
87
+ },
88
+ {
89
+ // RAW: first Initiative Score of a combat halved. Mapped to the
90
+ // opening exchange of any fresh fight (combat-exchange.ts).
91
+ key: 'combat-paralysis', name: 'Combat Paralysis', kind: 'negative', karma: 12, page: 'p.80',
92
+ effect: 'you freeze when it starts: initiative halved in a fight\'s opening exchange',
93
+ },
94
+ {
95
+ // RAW: spent Edge can turn on you. Adaptation: burning edge rolls a
96
+ // die -- on a 1 the point is gone and the boost never arms (edge.ts).
97
+ key: 'bad-luck', name: 'Bad Luck', kind: 'negative', karma: 12, page: 'p.79',
98
+ effect: '1 in 6 edge burns curdle: the point is spent, the boost never comes',
99
+ },
100
+ {
101
+ // RAW: a look people remember, easy to describe, easy to identify.
102
+ // Adaptation: -2 on sneaking tests -- witnesses clock you.
103
+ key: 'distinctive-style', name: 'Distinctive Style', kind: 'negative', karma: 5, page: 'p.80',
104
+ effect: 'people remember you: -2 dice on sneaking tests',
105
+ },
106
+ {
107
+ // RAW: rest may not restore you fully. Adaptation: rest recovery
108
+ // halved (rest.ts) -- sleep never comes easy.
109
+ key: 'insomnia', name: 'Insomnia', kind: 'negative', karma: 10, page: 'p.81',
110
+ effect: 'rest recovers half the stun it should -- sleep never comes easy',
111
+ },
112
+ {
113
+ key: 'simsense-vertigo', name: 'Simsense Vertigo', kind: 'negative', karma: 5, page: 'p.83',
114
+ effect: '-2 dice on Matrix actions -- the sim makes your inner ear lie',
115
+ },
116
+ {
117
+ // RAW: an Active skill group you simply cannot have. skillRating
118
+ // pins it to 0 and advance.ts refuses to train it.
119
+ key: 'incompetent-hacking', name: 'Incompetent (Hacking)', kind: 'negative', karma: 5, page: 'p.81',
120
+ effect: 'the Matrix bounces off you: hacking is 0 and can never be trained',
121
+ },
122
+ ];
123
+ export function getQuality(key) {
124
+ return QUALITIES.find(q => q.key === key);
125
+ }
126
+ /**
127
+ * The creation-karma ledger (SR5e p.71): 25, minus what the positive
128
+ * qualities cost, plus what the negative ones refund. This is the RAW
129
+ * remainder BEFORE the end-of-chargen split below.
130
+ */
131
+ export function startingKarma(qualityKeys = []) {
132
+ let karma = CREATION_KARMA;
133
+ for (const key of qualityKeys) {
134
+ const q = getQuality(key);
135
+ if (!q)
136
+ continue;
137
+ karma += q.kind === 'negative' ? q.karma : -q.karma;
138
+ }
139
+ return karma;
140
+ }
141
+ // End-of-chargen karma rules (SR5e p.94 / p.98 / p.101-102): at most 7
142
+ // karma carries into play; of the excess, up to 10 converts to nuyen at
143
+ // 2,000 a point; anything past that was spent on the stat line (which is
144
+ // literally true here -- the archetype spreads ARE that spending).
145
+ export const KARMA_CARRYOVER_MAX = 7;
146
+ export const KARMA_TO_NUYEN_MAX = 10;
147
+ export const KARMA_NUYEN_RATE = 2000;
148
+ /** What the ledger remainder actually becomes at the table: banked karma + starting cash. */
149
+ export function creationSplit(qualityKeys = []) {
150
+ const leftover = startingKarma(qualityKeys);
151
+ const karma = Math.min(leftover, KARMA_CARRYOVER_MAX);
152
+ const nuyen = Math.min(Math.max(leftover - KARMA_CARRYOVER_MAX, 0), KARMA_TO_NUYEN_MAX) * KARMA_NUYEN_RATE;
153
+ return { karma, nuyen };
154
+ }
155
+ //# sourceMappingURL=qualities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualities.js","sourceRoot":"","sources":["../../../../../../src/commands/game/sideQuest/qualities.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,68 @@
14
14
  "type": "nuyen",
15
15
  "authorityRoomTags": ["Bank"]
16
16
  },
17
+ "rumors": [
18
+ "The Haze Dragons doubled their watch on the Smuggler's Tunnel -- something's moving under the district that even Brick won't name.",
19
+ "A corp scout in a too-clean coat has been photographing the Night Market stalls. Nobody sells to them, and nobody's seen them leave.",
20
+ "Mama Wu's cousin swears the Sim Den's ghost started whispering NAMES last week. Real ones.",
21
+ "Somebody's buying up fake SINs across three districts and paying triple. Whisper won't say who, which means Whisper knows.",
22
+ "The Drowned Choir under the chapel sang all night on Tuesday. Sister Verdigris burned sage until dawn and won't talk about it.",
23
+ "Doc Halloran turned away a man with corp-grade chrome and a bullet in him. The man walked north into the rain and nobody's seen him since.",
24
+ "Ratchet's public host got probed twice this month from OUTSIDE the district. He's rebuilding his ice and swearing in three languages.",
25
+ "A docks crew found a shipping crate of medical-grade bioware, still cold. By morning the crate was gone -- and so was their foreman.",
26
+ "Mr. Johnson's clients are getting jumpy -- two commissions cancelled this month before the ink dried. Something upstream is scaring the money.",
27
+ "Old Cray says the water in the Flooded Undermarket dropped half a meter overnight. Nobody drains water down there on purpose."
28
+ ],
29
+ "gigs": [
30
+ {
31
+ "from": "Mama Wu",
32
+ "to": "Brick",
33
+ "itemName": "Wu's Peace Offering",
34
+ "itemDescription": "A steamer crate of noodles and dumplings, sealed against the rain, smelling like a truce.",
35
+ "pay": 200,
36
+ "brief": "Take this to Brick. He and I have an arrangement, and the arrangement is: I feed his crew, they forget my stall exists on collection day."
37
+ },
38
+ {
39
+ "from": "Patch",
40
+ "to": "Doc Halloran",
41
+ "itemName": "Unlabeled Bottle",
42
+ "itemDescription": "A heavy glass bottle with no label and a wax seal. The contents slosh like they mean it.",
43
+ "pay": 150,
44
+ "brief": "Get this to the Doc. He'll know what it's for, and neither of us is going to say it out loud."
45
+ },
46
+ {
47
+ "from": "Ratchet",
48
+ "to": "Sister Verdigris",
49
+ "itemName": "Shielded Datachip",
50
+ "itemDescription": "A datachip in a hand-soldered Faraday sleeve. Someone wanted this VERY offline.",
51
+ "pay": 300,
52
+ "brief": "The Sister asked for this off the grid -- all the way off. No wireless, no scanning it, no curiosity. That's what the pay's for."
53
+ },
54
+ {
55
+ "from": "Doc Halloran",
56
+ "to": "Mama Wu",
57
+ "itemName": "Wu's Prescription",
58
+ "itemDescription": "A discreet clinic pouch, dosage schedule printed small. The Doc's handwriting says take it seriously.",
59
+ "pay": 200,
60
+ "brief": "Wu's refill. She won't come collect it herself because that would mean admitting she needs it. Be kind about that."
61
+ },
62
+ {
63
+ "from": "Skitter",
64
+ "to": "Old Cray",
65
+ "itemName": "Prepaid Lucky Charm",
66
+ "itemDescription": "A brass dragon charm on a red cord, tagged PAID IN FULL in a teenager's handwriting.",
67
+ "pay": 100,
68
+ "brief": "Cray bought a charm and then forgot which century he bought it in. Walk it over before the luck expires -- stall policy says it can."
69
+ },
70
+ {
71
+ "from": "Whisper",
72
+ "to": "Ratchet",
73
+ "itemName": "Sealed Pawn Ticket",
74
+ "itemDescription": "A pawn ticket in a wax-sealed envelope. What it redeems is nobody's business, which is the point.",
75
+ "pay": 250,
76
+ "brief": "Ratchet's property came through my counter. The ticket says which lockbox. You carry the ticket, not the question."
77
+ }
78
+ ],
17
79
  "player": {
18
80
  "name": "Maka",
19
81
  "startLocation": "Neon Strip",
@@ -341,7 +403,7 @@
341
403
  }
342
404
  },
343
405
  {
344
- "description": "Doc Halloran runs the street clinic: a weary human trauma surgeon who left corp medicine and never explains why. He patches anyone, sells supplies at cost to regulars, and remembers every bullet he has pulled.",
406
+ "description": "Doc Halloran runs the street clinic: a weary human trauma surgeon who left corp medicine and never explains why. He patches anyone, sells supplies at cost to regulars, and remembers every bullet he has pulled. He also cuts chrome -- cyberware and bioware installed clean, priced fair, essence toll explained up front to anyone who asks (the 'install' board lists his catalog).",
345
407
  "dialogue": [
346
408
  "Sit. Bleed on the tray, not the floor.",
347
409
  "Medkits are on the shelf. Pay what you can. Pay SOMETHING.",
@@ -395,6 +457,95 @@
395
457
  }
396
458
  }
397
459
  },
460
+ {
461
+ "description": "Patch tends the Purple Haze Bar: an ork ex-runner who retired the day her whole team didn't, and has poured drinks over the wall of their photographs ever since. She sells drinks, keeps confidences, and can read a runner's last job in how they hold their glass. Nothing rattles her; she has seen the before AND the after.",
462
+ "dialogue": [
463
+ "First one's full price. So is every one after. This isn't that kind of story.",
464
+ "You've got the look. Drink it slow, whatever it is you're deciding.",
465
+ "The wall behind you? Friends of the house. Don't end up on it."
466
+ ],
467
+ "player": {
468
+ "name": "Patch",
469
+ "startLocation": "Purple Haze Bar",
470
+ "lifestyleChoices": [],
471
+ "combat": {
472
+ "body": 5,
473
+ "agility": 4,
474
+ "reaction": 4,
475
+ "combatSkill": 4,
476
+ "strength": 5,
477
+ "willpower": 5,
478
+ "intuition": 4,
479
+ "charisma": 4,
480
+ "skills": {
481
+ "firearms": 5,
482
+ "unarmed": 4,
483
+ "perception": 5,
484
+ "negotiation": 4,
485
+ "intimidation": 4,
486
+ "first-aid": 3
487
+ }
488
+ }
489
+ }
490
+ },
491
+ {
492
+ "description": "Old Cray is the Purple Haze Bar's permanent fixture: a dwarf ex-rigger with a dead datajack, a standing tab, and an encyclopedic feel for everything that moves in the district. He trades gossip for drinks and company, embellishes freely, and is right more often than anyone wants to admit.",
493
+ "dialogue": [
494
+ "Buy an old man a drink and I'll tell you what the rain's been hiding.",
495
+ "I flew drones over half this sprawl before your voice broke. I still hear everything -- just slower.",
496
+ "The Undermarket water's WRONG lately. You mark me."
497
+ ],
498
+ "player": {
499
+ "name": "Old Cray",
500
+ "startLocation": "Purple Haze Bar",
501
+ "lifestyleChoices": [],
502
+ "combat": {
503
+ "body": 3,
504
+ "agility": 2,
505
+ "reaction": 2,
506
+ "combatSkill": 1,
507
+ "willpower": 4,
508
+ "logic": 4,
509
+ "intuition": 6,
510
+ "charisma": 3,
511
+ "skills": {
512
+ "perception": 6,
513
+ "piloting": 4,
514
+ "negotiation": 2,
515
+ "con": 2
516
+ }
517
+ }
518
+ }
519
+ },
520
+ {
521
+ "description": "Skitter runs a folding stall in the Night Market: a wiry human teenager who sells ammunition, knockoff patches, and lucky charms of dubious provenance. Fast hands, faster mouth, and a strict no-refunds policy delivered with a grin. The stall folds up in eight seconds flat when badges appear.",
522
+ "dialogue": [
523
+ "Ammo, patches, charms -- everything a runner needs and nothing they can trace.",
524
+ "No refunds. The luck's non-transferable once you touch it.",
525
+ "You hear about the corp scout with the camera? I sold them a charm. Cursed one."
526
+ ],
527
+ "player": {
528
+ "name": "Skitter",
529
+ "startLocation": "Night Market",
530
+ "lifestyleChoices": [],
531
+ "combat": {
532
+ "body": 2,
533
+ "agility": 5,
534
+ "reaction": 4,
535
+ "combatSkill": 1,
536
+ "willpower": 3,
537
+ "intuition": 4,
538
+ "charisma": 4,
539
+ "skills": {
540
+ "sneaking": 5,
541
+ "con": 4,
542
+ "perception": 4,
543
+ "negotiation": 3,
544
+ "athletics": 4
545
+ }
546
+ }
547
+ }
548
+ },
398
549
  {
399
550
  "description": "Brick is the Haze Dragons' lieutenant: an ork mountain who respects strength, nerve, and very little else. He'll spar, arm-wrestle, or trade war stories with anyone who impresses him -- and flatten anyone who disrespects the turf. He is not looking for a war with a local runner.",
400
551
  "dialogue": [
@@ -593,6 +744,19 @@
593
744
  "room": "Circuit Bazaar",
594
745
  "owner": "Ratchet"
595
746
  },
747
+ {
748
+ "name": "Sentry Roto-Drone",
749
+ "description": "A rebuilt combat roto-drone hanging from Ratchet's ceiling hook, rotors folded, a mounted light SMG slung under its chin. Armed, rigger-ready, and absolutely not street-legal.",
750
+ "size": "Medium",
751
+ "category": "Drone",
752
+ "shape": "Rotorcraft",
753
+ "color": "Gunmetal",
754
+ "texture": "Scuffed Composite",
755
+ "rating": "Rare",
756
+ "weight": 6,
757
+ "room": "Circuit Bazaar",
758
+ "owner": "Ratchet"
759
+ },
596
760
  {
597
761
  "name": "Spell Formula: Heal",
598
762
  "description": "A licensed teaching copy of the Heal formula, annotated in Sister Verdigris's neat hand.",
@@ -662,7 +826,7 @@
662
826
  "name": "Bowl of Laksa",
663
827
  "description": "Mama Wu's laksa: chili oil, coconut, and the will to keep going.",
664
828
  "size": "Small",
665
- "category": "Vice",
829
+ "category": "Food",
666
830
  "shape": "Bowl",
667
831
  "color": "Red-Gold",
668
832
  "texture": "Steaming",
@@ -671,17 +835,122 @@
671
835
  "room": "Mama Wu's Noodles",
672
836
  "owner": "Mama Wu"
673
837
  },
838
+ {
839
+ "name": "Noodle Bowl",
840
+ "description": "Mama Wu's hand-pulled noodles in dark broth -- the thing everyone actually orders, whatever the laksa's reputation says.",
841
+ "size": "Small",
842
+ "category": "Food",
843
+ "shape": "Bowl",
844
+ "color": "Amber",
845
+ "texture": "Steaming",
846
+ "rating": "Common",
847
+ "weight": 0.5,
848
+ "room": "Mama Wu's Noodles",
849
+ "owner": "Mama Wu"
850
+ },
851
+ {
852
+ "name": "Dumpling Basket",
853
+ "description": "Six pork-adjacent dumplings in a bamboo steamer. The dipping sauce is a family secret and mildly addictive.",
854
+ "size": "Small",
855
+ "category": "Food",
856
+ "shape": "Basket",
857
+ "color": "Pale Gold",
858
+ "texture": "Steamed",
859
+ "rating": "Common",
860
+ "weight": 0.4,
861
+ "room": "Mama Wu's Noodles",
862
+ "owner": "Mama Wu"
863
+ },
864
+ {
865
+ "name": "Black Soykaf",
866
+ "description": "Scalding, bitter, and honest about both. Mama Wu brews it strong enough to hold a spoon upright.",
867
+ "size": "Tiny",
868
+ "category": "Drink",
869
+ "shape": "Cup",
870
+ "color": "Black",
871
+ "texture": "Steaming",
872
+ "rating": "Common",
873
+ "weight": 0.3,
874
+ "room": "Mama Wu's Noodles",
875
+ "owner": "Mama Wu"
876
+ },
674
877
  {
675
878
  "name": "Purple Haze Special",
676
- "description": "The house drink: violet, luminous, and legally ambiguous.",
879
+ "description": "The house drink: violet, luminous, and legally ambiguous. Patch pours it with ceremony and zero explanation.",
677
880
  "size": "Tiny",
678
- "category": "Vice",
881
+ "category": "Drink",
679
882
  "shape": "Glass",
680
883
  "color": "Violet",
681
884
  "texture": "Luminous",
682
885
  "rating": "Common",
683
886
  "weight": 0.3,
684
- "room": "Purple Haze Bar"
887
+ "room": "Purple Haze Bar",
888
+ "owner": "Patch"
889
+ },
890
+ {
891
+ "name": "Haze Amber Lager",
892
+ "description": "The district's own bootleg brew, served cold enough to forgive it.",
893
+ "size": "Tiny",
894
+ "category": "Drink",
895
+ "shape": "Bottle",
896
+ "color": "Amber",
897
+ "texture": "Sweating Glass",
898
+ "rating": "Common",
899
+ "weight": 0.4,
900
+ "room": "Purple Haze Bar",
901
+ "owner": "Patch"
902
+ },
903
+ {
904
+ "name": "Synthahol Old-Fashioned",
905
+ "description": "Patch's good stuff: synthetic bourbon, real bitters, and one enormous slow-melting cube.",
906
+ "size": "Tiny",
907
+ "category": "Drink",
908
+ "shape": "Glass",
909
+ "color": "Deep Amber",
910
+ "texture": "Cut Crystal",
911
+ "rating": "Standard",
912
+ "weight": 0.3,
913
+ "room": "Purple Haze Bar",
914
+ "owner": "Patch"
915
+ },
916
+ {
917
+ "name": "Street Ammo Bundle",
918
+ "description": "Loose rounds shrink-wrapped in Skitter's stall, caliber 'probably yours'.",
919
+ "size": "Small",
920
+ "category": "Ammunition",
921
+ "shape": "Bundle",
922
+ "color": "Brass",
923
+ "texture": "Shrink-Wrapped",
924
+ "rating": "Common",
925
+ "weight": 0.8,
926
+ "room": "Night Market",
927
+ "owner": "Skitter"
928
+ },
929
+ {
930
+ "name": "Knockoff Slap Patch",
931
+ "description": "A stim patch of enthusiastic counterfeit origin. Skitter swears by it. Skitter swears by everything.",
932
+ "size": "Tiny",
933
+ "category": "StimPatch",
934
+ "shape": "Patch",
935
+ "color": "Off-White",
936
+ "texture": "Peeling Adhesive",
937
+ "rating": "Common",
938
+ "weight": 0.1,
939
+ "room": "Night Market",
940
+ "owner": "Skitter"
941
+ },
942
+ {
943
+ "name": "Lucky Dragon Charm",
944
+ "description": "A tiny brass dragon on a red cord. The luck is non-transferable once you touch it -- stall policy.",
945
+ "size": "Tiny",
946
+ "category": "Trinket",
947
+ "shape": "Charm",
948
+ "color": "Brass",
949
+ "texture": "Worn Smooth",
950
+ "rating": "Common",
951
+ "weight": 0.1,
952
+ "room": "Night Market",
953
+ "owner": "Skitter"
685
954
  },
686
955
  {
687
956
  "name": "Wall of the Fallen Ledger",
@@ -21,4 +21,5 @@ export interface IItemSeedJson {
21
21
  owner?: string;
22
22
  transferable?: boolean;
23
23
  plane?: 'meat' | 'matrix' | 'astral';
24
+ price?: number;
24
25
  }
@@ -25,4 +25,21 @@ export interface ISceneSeedJson {
25
25
  * Calling the fixer from a hub is what initiates a run, and completing
26
26
  * a run drops the player back into the hub -- see Game.returnToHub. */
27
27
  hub?: boolean;
28
+ /** Hub only: the street-rumor pool. One rumor is active at a time,
29
+ * rotating each time a run wraps -- planted in the NPC world-event mesh
30
+ * (so locals gossip it) and handed to the next job's generation as its
31
+ * backdrop. See Game.advanceRumor. */
32
+ rumors?: string[];
33
+ /** Hub only: the side-gig pool -- small paid deliveries between locals,
34
+ * one on offer at a time, rotating each homecoming. Taken with "work"
35
+ * in front of the giver, completed with an ordinary "give" to the
36
+ * recipient. See Game.advanceGig / commands/work.ts. */
37
+ gigs?: {
38
+ from: string;
39
+ to: string;
40
+ itemName: string;
41
+ itemDescription: string;
42
+ pay: number;
43
+ brief: string;
44
+ }[];
28
45
  }
@@ -59,6 +59,8 @@ export declare enum Category {
59
59
  License = "license",
60
60
  CurrencyContainer = "currency container",
61
61
  Credstick = "credstick",
62
+ Food = "food",
63
+ Drink = "drink",
62
64
  Vice = "vice",
63
65
  Book = "book",
64
66
  Key = "key",
@@ -68,6 +68,10 @@ export var Category;
68
68
  Category["License"] = "license";
69
69
  Category["CurrencyContainer"] = "currency container";
70
70
  Category["Credstick"] = "credstick";
71
+ // Food and drink (see commands/use.ts: hot food heals stun, a drink
72
+ // pours liquid courage into the next social roll)
73
+ Category["Food"] = "food";
74
+ Category["Drink"] = "drink";
71
75
  // Misc and World
72
76
  Category["Vice"] = "vice";
73
77
  Category["Book"] = "book";
@@ -1 +1 @@
1
- {"version":3,"file":"item-enum.js","sourceRoot":"","sources":["../../../../../../../../src/commands/game/sideQuest/types/shared/item-enum.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,IAMX;AAND,WAAY,IAAI;IACd,qBAAa,CAAA;IACX,uBAAe,CAAA;IACf,yBAAiB,CAAA;IACjB,uBAAe,CAAA;IACf,gCAAwB,CAAA;AAC5B,CAAC,EANW,IAAI,KAAJ,IAAI,QAMf;AAED,MAAM,CAAN,IAAY,MAMX;AAND,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACf,+BAAqB,CAAA;IACrB,uBAAa,CAAA;IACb,iCAAuB,CAAA;IACvB,0CAAgC,CAAA;AACpC,CAAC,EANW,MAAM,KAAN,MAAM,QAMjB;AAED,MAAM,CAAN,IAAY,QAoEX;AApED,WAAY,QAAQ;IAClB,SAAS;IACT,6BAAiB,CAAA;IACjB,wCAA4B,CAAA;IAC5B,0CAA8B,CAAA;IAC9B,qCAAyB,CAAA;IACzB,mCAAuB,CAAA;IACvB,oCAAwB,CAAA;IACxB,2BAAe,CAAA;IACf,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,kCAAsB,CAAA;IACtB,kCAAsB,CAAA;IACtB,2BAAe,CAAA;IACf,6BAAiB,CAAA;IAEjB,sCAAsC;IACtC,mCAAuB,CAAA;IACvB,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,iCAAqB,CAAA;IAErB,yBAAyB;IACzB,iCAAqB,CAAA;IACrB,mCAAuB,CAAA;IACvB,uBAAW,CAAA;IACX,2BAAe,CAAA;IACf,iCAAqB,CAAA;IACrB,uCAA2B,CAAA;IAC3B,oCAAwB,CAAA;IAExB,QAAQ;IACR,2BAAe,CAAA;IACf,0CAA8B,CAAA;IAC9B,8CAAkC,CAAA;IAClC,8CAAkC,CAAA;IAClC,6BAAiB,CAAA;IACjB,iCAAqB,CAAA;IAErB,mBAAmB;IACnB,iCAAqB,CAAA;IACrB,4CAAgC,CAAA;IAChC,+BAAmB,CAAA;IACnB,oCAAwB,CAAA;IACxB,yBAAa,CAAA;IACb,qCAAyB,CAAA;IACzB,6BAAiB,CAAA;IACjB,oCAAwB,CAAA;IACxB,kDAAsC,CAAA;IACtC,uBAAW,CAAA;IACX,+BAAmB,CAAA;IAEnB,qBAAqB;IACrB,uBAAW,CAAA;IACX,gCAAoB,CAAA;IACpB,+BAAmB,CAAA;IACnB,oDAAwC,CAAA;IACxC,mCAAuB,CAAA;IAEvB,iBAAiB;IACjB,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,uBAAW,CAAA;IACX,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,iCAAqB,CAAA;IACrB,2BAAe,CAAA;IACf,+BAAmB,CAAA;AACrB,CAAC,EApEW,QAAQ,KAAR,QAAQ,QAoEnB"}
1
+ {"version":3,"file":"item-enum.js","sourceRoot":"","sources":["../../../../../../../../src/commands/game/sideQuest/types/shared/item-enum.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,IAMX;AAND,WAAY,IAAI;IACd,qBAAa,CAAA;IACX,uBAAe,CAAA;IACf,yBAAiB,CAAA;IACjB,uBAAe,CAAA;IACf,gCAAwB,CAAA;AAC5B,CAAC,EANW,IAAI,KAAJ,IAAI,QAMf;AAED,MAAM,CAAN,IAAY,MAMX;AAND,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACf,+BAAqB,CAAA;IACrB,uBAAa,CAAA;IACb,iCAAuB,CAAA;IACvB,0CAAgC,CAAA;AACpC,CAAC,EANW,MAAM,KAAN,MAAM,QAMjB;AAED,MAAM,CAAN,IAAY,QAyEX;AAzED,WAAY,QAAQ;IAClB,SAAS;IACT,6BAAiB,CAAA;IACjB,wCAA4B,CAAA;IAC5B,0CAA8B,CAAA;IAC9B,qCAAyB,CAAA;IACzB,mCAAuB,CAAA;IACvB,oCAAwB,CAAA;IACxB,2BAAe,CAAA;IACf,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,kCAAsB,CAAA;IACtB,kCAAsB,CAAA;IACtB,2BAAe,CAAA;IACf,6BAAiB,CAAA;IAEjB,sCAAsC;IACtC,mCAAuB,CAAA;IACvB,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,iCAAqB,CAAA;IAErB,yBAAyB;IACzB,iCAAqB,CAAA;IACrB,mCAAuB,CAAA;IACvB,uBAAW,CAAA;IACX,2BAAe,CAAA;IACf,iCAAqB,CAAA;IACrB,uCAA2B,CAAA;IAC3B,oCAAwB,CAAA;IAExB,QAAQ;IACR,2BAAe,CAAA;IACf,0CAA8B,CAAA;IAC9B,8CAAkC,CAAA;IAClC,8CAAkC,CAAA;IAClC,6BAAiB,CAAA;IACjB,iCAAqB,CAAA;IAErB,mBAAmB;IACnB,iCAAqB,CAAA;IACrB,4CAAgC,CAAA;IAChC,+BAAmB,CAAA;IACnB,oCAAwB,CAAA;IACxB,yBAAa,CAAA;IACb,qCAAyB,CAAA;IACzB,6BAAiB,CAAA;IACjB,oCAAwB,CAAA;IACxB,kDAAsC,CAAA;IACtC,uBAAW,CAAA;IACX,+BAAmB,CAAA;IAEnB,qBAAqB;IACrB,uBAAW,CAAA;IACX,gCAAoB,CAAA;IACpB,+BAAmB,CAAA;IACnB,oDAAwC,CAAA;IACxC,mCAAuB,CAAA;IAEvB,oEAAoE;IACpE,kDAAkD;IAClD,yBAAa,CAAA;IACb,2BAAe,CAAA;IAEf,iBAAiB;IACjB,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,uBAAW,CAAA;IACX,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,iCAAqB,CAAA;IACrB,2BAAe,CAAA;IACf,+BAAmB,CAAA;AACrB,CAAC,EAzEW,QAAQ,KAAR,QAAQ,QAyEnB"}
@@ -6,12 +6,48 @@ import { Logger } from './utilities/logger.js';
6
6
  import { getArchetype, outfitArchetype } from './archetypes.js';
7
7
  import { STANCE_CYCLE } from './models/player.js';
8
8
  import { AutoFight } from './utilities/auto-fight.js';
9
+ import { TERMINAL_RESET_SEQUENCE } from './utilities/terminal-reset.js';
9
10
  export async function main(playerName, sceneSeed, options) {
10
11
  // Create a screen object
11
12
  const screen = blessed.screen({
12
13
  smartCSR: true,
13
14
  title: 'Side Quest Adventure Game',
14
15
  });
16
+ // TERMINAL HYGIENE: blessed arms xterm modes (mouse tracking, alt
17
+ // screen, hidden cursor) that outlive the process unless explicitly
18
+ // torn down -- a crash without screen.destroy() left a real session's
19
+ // shell flooded with raw mouse-coordinate bytes on every cursor move.
20
+ // One restore routine, hooked to EVERY way out: the 'exit' hook covers
21
+ // all process.exit() paths, and the fatal handlers write the stack to
22
+ // the session log FIRST (pre-hygiene, crashes died without a trace
23
+ // anywhere) before restoring the terminal and re-printing to stderr.
24
+ const restoreTerminal = () => {
25
+ try {
26
+ screen.destroy();
27
+ }
28
+ catch { /* screen already down */ }
29
+ // destroy() can throw PARTWAY through its own teardown (mid-render
30
+ // crash state) and leave modes armed -- follow it with the raw
31
+ // escapes unconditionally; switching off an off mode is a no-op.
32
+ try {
33
+ process.stdout.write(TERMINAL_RESET_SEQUENCE);
34
+ }
35
+ catch { /* stream gone */ }
36
+ };
37
+ process.on('exit', restoreTerminal);
38
+ const fatal = (label) => (err) => {
39
+ const detail = err instanceof Error ? err.stack ?? err.message : String(err);
40
+ try {
41
+ Logger.getInstance().error(`FATAL (${label}): ${detail}`);
42
+ }
43
+ catch { /* logger may be the casualty */ }
44
+ restoreTerminal();
45
+ console.error(`side-quest ${label}:\n${detail}`);
46
+ process.exit(1);
47
+ };
48
+ process.on('uncaughtException', fatal('uncaughtException'));
49
+ process.on('unhandledRejection', fatal('unhandledRejection'));
50
+ process.on('SIGTERM', () => process.exit(0));
15
51
  screen.key(['C-c'], () => {
16
52
  process.exit(0);
17
53
  });
@@ -159,8 +195,19 @@ export async function main(playerName, sceneSeed, options) {
159
195
  process.exit(1);
160
196
  }
161
197
  }
162
- // Get arguments from the command line
198
+ // Get arguments from the command line. The launcher passes ONE argument: a
199
+ // path to a launch file holding { playerName, scene, options } -- scenes
200
+ // outgrew Windows' ~32KB command-line limit (spawn ENAMETOOLONG the moment
201
+ // the hub seed gained rumors, gigs, and a bigger cast), so the JSON goes
202
+ // through the filesystem now. The legacy 3-arg inline shape still works as
203
+ // a fallback for anything that spawns the old way.
163
204
  const args = process.argv.slice(2);
164
- // Call the main function with the parsed arguments
165
- await main(args[0], JSON.parse(args[1]), JSON.parse(args[2]));
205
+ if (args.length === 1) {
206
+ const { readFileSync } = await import('fs');
207
+ const launch = JSON.parse(readFileSync(args[0], 'utf8'));
208
+ await main(launch.playerName, launch.scene, launch.options);
209
+ }
210
+ else {
211
+ await main(args[0], JSON.parse(args[1]), JSON.parse(args[2]));
212
+ }
166
213
  //# sourceMappingURL=ui.js.map