idlerpg.sh 0.1.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 (478) hide show
  1. package/README.md +171 -0
  2. package/dist/affix/AffixRegistry.d.ts +68 -0
  3. package/dist/affix/AffixRegistry.d.ts.map +1 -0
  4. package/dist/affix/AffixRegistry.js +245 -0
  5. package/dist/affix/AffixRegistry.js.map +1 -0
  6. package/dist/affix/PluginLoader.d.ts +66 -0
  7. package/dist/affix/PluginLoader.d.ts.map +1 -0
  8. package/dist/affix/PluginLoader.js +321 -0
  9. package/dist/affix/PluginLoader.js.map +1 -0
  10. package/dist/affix/builtin.d.ts +6 -0
  11. package/dist/affix/builtin.d.ts.map +1 -0
  12. package/dist/affix/builtin.js +311 -0
  13. package/dist/affix/builtin.js.map +1 -0
  14. package/dist/affix/index.d.ts +8 -0
  15. package/dist/affix/index.d.ts.map +1 -0
  16. package/dist/affix/index.js +11 -0
  17. package/dist/affix/index.js.map +1 -0
  18. package/dist/affix/types.d.ts +152 -0
  19. package/dist/affix/types.d.ts.map +1 -0
  20. package/dist/affix/types.js +8 -0
  21. package/dist/affix/types.js.map +1 -0
  22. package/dist/ai/PlayKitClient.d.ts +208 -0
  23. package/dist/ai/PlayKitClient.d.ts.map +1 -0
  24. package/dist/ai/PlayKitClient.js +721 -0
  25. package/dist/ai/PlayKitClient.js.map +1 -0
  26. package/dist/ai/index.d.ts +5 -0
  27. package/dist/ai/index.d.ts.map +1 -0
  28. package/dist/ai/index.js +8 -0
  29. package/dist/ai/index.js.map +1 -0
  30. package/dist/app/App.d.ts +85 -0
  31. package/dist/app/App.d.ts.map +1 -0
  32. package/dist/app/App.js +296 -0
  33. package/dist/app/App.js.map +1 -0
  34. package/dist/app/EventBus.d.ts +222 -0
  35. package/dist/app/EventBus.d.ts.map +1 -0
  36. package/dist/app/EventBus.js +88 -0
  37. package/dist/app/EventBus.js.map +1 -0
  38. package/dist/app/Keybind.d.ts +83 -0
  39. package/dist/app/Keybind.d.ts.map +1 -0
  40. package/dist/app/Keybind.js +184 -0
  41. package/dist/app/Keybind.js.map +1 -0
  42. package/dist/app/Router.d.ts +123 -0
  43. package/dist/app/Router.d.ts.map +1 -0
  44. package/dist/app/Router.js +142 -0
  45. package/dist/app/Router.js.map +1 -0
  46. package/dist/app/ScreenManager.d.ts +97 -0
  47. package/dist/app/ScreenManager.d.ts.map +1 -0
  48. package/dist/app/ScreenManager.js +216 -0
  49. package/dist/app/ScreenManager.js.map +1 -0
  50. package/dist/app/index.d.ts +14 -0
  51. package/dist/app/index.d.ts.map +1 -0
  52. package/dist/app/index.js +19 -0
  53. package/dist/app/index.js.map +1 -0
  54. package/dist/app/screens/BaseScreen.d.ts +101 -0
  55. package/dist/app/screens/BaseScreen.d.ts.map +1 -0
  56. package/dist/app/screens/BaseScreen.js +132 -0
  57. package/dist/app/screens/BaseScreen.js.map +1 -0
  58. package/dist/app/screens/CharacterCreationScreen.d.ts +42 -0
  59. package/dist/app/screens/CharacterCreationScreen.d.ts.map +1 -0
  60. package/dist/app/screens/CharacterCreationScreen.js +467 -0
  61. package/dist/app/screens/CharacterCreationScreen.js.map +1 -0
  62. package/dist/app/screens/CombatScreen.d.ts +30 -0
  63. package/dist/app/screens/CombatScreen.d.ts.map +1 -0
  64. package/dist/app/screens/CombatScreen.js +309 -0
  65. package/dist/app/screens/CombatScreen.js.map +1 -0
  66. package/dist/app/screens/DialogScreen.d.ts +29 -0
  67. package/dist/app/screens/DialogScreen.d.ts.map +1 -0
  68. package/dist/app/screens/DialogScreen.js +295 -0
  69. package/dist/app/screens/DialogScreen.js.map +1 -0
  70. package/dist/app/screens/ExploreScreen.d.ts +50 -0
  71. package/dist/app/screens/ExploreScreen.d.ts.map +1 -0
  72. package/dist/app/screens/ExploreScreen.js +308 -0
  73. package/dist/app/screens/ExploreScreen.js.map +1 -0
  74. package/dist/app/screens/HelpScreen.d.ts +12 -0
  75. package/dist/app/screens/HelpScreen.d.ts.map +1 -0
  76. package/dist/app/screens/HelpScreen.js +155 -0
  77. package/dist/app/screens/HelpScreen.js.map +1 -0
  78. package/dist/app/screens/InventoryScreen.d.ts +27 -0
  79. package/dist/app/screens/InventoryScreen.d.ts.map +1 -0
  80. package/dist/app/screens/InventoryScreen.js +326 -0
  81. package/dist/app/screens/InventoryScreen.js.map +1 -0
  82. package/dist/app/screens/PrologueScreen.d.ts +24 -0
  83. package/dist/app/screens/PrologueScreen.d.ts.map +1 -0
  84. package/dist/app/screens/PrologueScreen.js +176 -0
  85. package/dist/app/screens/PrologueScreen.js.map +1 -0
  86. package/dist/app/screens/TitleScreen.d.ts +42 -0
  87. package/dist/app/screens/TitleScreen.d.ts.map +1 -0
  88. package/dist/app/screens/TitleScreen.js +380 -0
  89. package/dist/app/screens/TitleScreen.js.map +1 -0
  90. package/dist/app/screens/TravelScreen.d.ts +22 -0
  91. package/dist/app/screens/TravelScreen.d.ts.map +1 -0
  92. package/dist/app/screens/TravelScreen.js +122 -0
  93. package/dist/app/screens/TravelScreen.js.map +1 -0
  94. package/dist/app/screens/index.d.ts +14 -0
  95. package/dist/app/screens/index.d.ts.map +1 -0
  96. package/dist/app/screens/index.js +17 -0
  97. package/dist/app/screens/index.js.map +1 -0
  98. package/dist/commands/CommandRegistry.d.ts +91 -0
  99. package/dist/commands/CommandRegistry.d.ts.map +1 -0
  100. package/dist/commands/CommandRegistry.js +159 -0
  101. package/dist/commands/CommandRegistry.js.map +1 -0
  102. package/dist/commands/index.d.ts +7 -0
  103. package/dist/commands/index.d.ts.map +1 -0
  104. package/dist/commands/index.js +10 -0
  105. package/dist/commands/index.js.map +1 -0
  106. package/dist/core/Actor.d.ts +103 -0
  107. package/dist/core/Actor.d.ts.map +1 -0
  108. package/dist/core/Actor.js +409 -0
  109. package/dist/core/Actor.js.map +1 -0
  110. package/dist/core/Combat.d.ts +37 -0
  111. package/dist/core/Combat.d.ts.map +1 -0
  112. package/dist/core/Combat.js +294 -0
  113. package/dist/core/Combat.js.map +1 -0
  114. package/dist/core/DungeonRunner.d.ts +169 -0
  115. package/dist/core/DungeonRunner.d.ts.map +1 -0
  116. package/dist/core/DungeonRunner.js +627 -0
  117. package/dist/core/DungeonRunner.js.map +1 -0
  118. package/dist/core/Game.d.ts +133 -0
  119. package/dist/core/Game.d.ts.map +1 -0
  120. package/dist/core/Game.js +644 -0
  121. package/dist/core/Game.js.map +1 -0
  122. package/dist/core/IdleCombat.d.ts +61 -0
  123. package/dist/core/IdleCombat.d.ts.map +1 -0
  124. package/dist/core/IdleCombat.js +461 -0
  125. package/dist/core/IdleCombat.js.map +1 -0
  126. package/dist/core/IdleGameManager.d.ts +198 -0
  127. package/dist/core/IdleGameManager.d.ts.map +1 -0
  128. package/dist/core/IdleGameManager.js +688 -0
  129. package/dist/core/IdleGameManager.js.map +1 -0
  130. package/dist/core/IdleSaveManager.d.ts +109 -0
  131. package/dist/core/IdleSaveManager.d.ts.map +1 -0
  132. package/dist/core/IdleSaveManager.js +296 -0
  133. package/dist/core/IdleSaveManager.js.map +1 -0
  134. package/dist/core/NewGameFlowManager.d.ts +64 -0
  135. package/dist/core/NewGameFlowManager.d.ts.map +1 -0
  136. package/dist/core/NewGameFlowManager.js +153 -0
  137. package/dist/core/NewGameFlowManager.js.map +1 -0
  138. package/dist/core/Player.d.ts +65 -0
  139. package/dist/core/Player.d.ts.map +1 -0
  140. package/dist/core/Player.js +261 -0
  141. package/dist/core/Player.js.map +1 -0
  142. package/dist/core/RoomHandlers.d.ts +75 -0
  143. package/dist/core/RoomHandlers.d.ts.map +1 -0
  144. package/dist/core/RoomHandlers.js +383 -0
  145. package/dist/core/RoomHandlers.js.map +1 -0
  146. package/dist/core/SaveManager.d.ts +84 -0
  147. package/dist/core/SaveManager.d.ts.map +1 -0
  148. package/dist/core/SaveManager.js +281 -0
  149. package/dist/core/SaveManager.js.map +1 -0
  150. package/dist/core/SaveMigration.d.ts +69 -0
  151. package/dist/core/SaveMigration.d.ts.map +1 -0
  152. package/dist/core/SaveMigration.js +408 -0
  153. package/dist/core/SaveMigration.js.map +1 -0
  154. package/dist/core/StateAdapter.d.ts +79 -0
  155. package/dist/core/StateAdapter.d.ts.map +1 -0
  156. package/dist/core/StateAdapter.js +397 -0
  157. package/dist/core/StateAdapter.js.map +1 -0
  158. package/dist/core/Team.d.ts +145 -0
  159. package/dist/core/Team.d.ts.map +1 -0
  160. package/dist/core/Team.js +371 -0
  161. package/dist/core/Team.js.map +1 -0
  162. package/dist/core/TeamCombat.d.ts +88 -0
  163. package/dist/core/TeamCombat.d.ts.map +1 -0
  164. package/dist/core/TeamCombat.js +405 -0
  165. package/dist/core/TeamCombat.js.map +1 -0
  166. package/dist/core/TeamDungeonRunner.d.ts +186 -0
  167. package/dist/core/TeamDungeonRunner.d.ts.map +1 -0
  168. package/dist/core/TeamDungeonRunner.js +758 -0
  169. package/dist/core/TeamDungeonRunner.js.map +1 -0
  170. package/dist/core/TimeManager.d.ts +114 -0
  171. package/dist/core/TimeManager.d.ts.map +1 -0
  172. package/dist/core/TimeManager.js +318 -0
  173. package/dist/core/TimeManager.js.map +1 -0
  174. package/dist/core/index.d.ts +9 -0
  175. package/dist/core/index.d.ts.map +1 -0
  176. package/dist/core/index.js +12 -0
  177. package/dist/core/index.js.map +1 -0
  178. package/dist/core/timeConstants.d.ts +135 -0
  179. package/dist/core/timeConstants.d.ts.map +1 -0
  180. package/dist/core/timeConstants.js +157 -0
  181. package/dist/core/timeConstants.js.map +1 -0
  182. package/dist/core/types.d.ts +780 -0
  183. package/dist/core/types.d.ts.map +1 -0
  184. package/dist/core/types.js +16 -0
  185. package/dist/core/types.js.map +1 -0
  186. package/dist/data/continents/index.d.ts +163 -0
  187. package/dist/data/continents/index.d.ts.map +1 -0
  188. package/dist/data/continents/index.js +31 -0
  189. package/dist/data/continents/index.js.map +1 -0
  190. package/dist/data/continents/verdantia.d.ts +294 -0
  191. package/dist/data/continents/verdantia.d.ts.map +1 -0
  192. package/dist/data/continents/verdantia.js +327 -0
  193. package/dist/data/continents/verdantia.js.map +1 -0
  194. package/dist/handlers/DialogHandler.d.ts +95 -0
  195. package/dist/handlers/DialogHandler.d.ts.map +1 -0
  196. package/dist/handlers/DialogHandler.js +450 -0
  197. package/dist/handlers/DialogHandler.js.map +1 -0
  198. package/dist/handlers/SaveLoadHandler.d.ts +60 -0
  199. package/dist/handlers/SaveLoadHandler.d.ts.map +1 -0
  200. package/dist/handlers/SaveLoadHandler.js +187 -0
  201. package/dist/handlers/SaveLoadHandler.js.map +1 -0
  202. package/dist/handlers/TitleScreenHandler.d.ts +43 -0
  203. package/dist/handlers/TitleScreenHandler.d.ts.map +1 -0
  204. package/dist/handlers/TitleScreenHandler.js +508 -0
  205. package/dist/handlers/TitleScreenHandler.js.map +1 -0
  206. package/dist/handlers/WorkshopHandler.d.ts +75 -0
  207. package/dist/handlers/WorkshopHandler.d.ts.map +1 -0
  208. package/dist/handlers/WorkshopHandler.js +401 -0
  209. package/dist/handlers/WorkshopHandler.js.map +1 -0
  210. package/dist/handlers/index.d.ts +12 -0
  211. package/dist/handlers/index.d.ts.map +1 -0
  212. package/dist/handlers/index.js +14 -0
  213. package/dist/handlers/index.js.map +1 -0
  214. package/dist/handlers/types.d.ts +34 -0
  215. package/dist/handlers/types.d.ts.map +1 -0
  216. package/dist/handlers/types.js +8 -0
  217. package/dist/handlers/types.js.map +1 -0
  218. package/dist/i18n/en.d.ts +3 -0
  219. package/dist/i18n/en.d.ts.map +1 -0
  220. package/dist/i18n/en.js +130 -0
  221. package/dist/i18n/en.js.map +1 -0
  222. package/dist/i18n/index.d.ts +40 -0
  223. package/dist/i18n/index.d.ts.map +1 -0
  224. package/dist/i18n/index.js +105 -0
  225. package/dist/i18n/index.js.map +1 -0
  226. package/dist/i18n/types.d.ts +133 -0
  227. package/dist/i18n/types.d.ts.map +1 -0
  228. package/dist/i18n/types.js +8 -0
  229. package/dist/i18n/types.js.map +1 -0
  230. package/dist/i18n/zh.d.ts +3 -0
  231. package/dist/i18n/zh.d.ts.map +1 -0
  232. package/dist/i18n/zh.js +130 -0
  233. package/dist/i18n/zh.js.map +1 -0
  234. package/dist/instrument.d.ts +8 -0
  235. package/dist/instrument.d.ts.map +1 -0
  236. package/dist/instrument.js +33 -0
  237. package/dist/instrument.js.map +1 -0
  238. package/dist/main-new.d.ts +12 -0
  239. package/dist/main-new.d.ts.map +1 -0
  240. package/dist/main-new.js +32 -0
  241. package/dist/main-new.js.map +1 -0
  242. package/dist/main.d.ts +7 -0
  243. package/dist/main.d.ts.map +1 -0
  244. package/dist/main.js +2816 -0
  245. package/dist/main.js.map +1 -0
  246. package/dist/map/ContinentManager.d.ts +88 -0
  247. package/dist/map/ContinentManager.d.ts.map +1 -0
  248. package/dist/map/ContinentManager.js +241 -0
  249. package/dist/map/ContinentManager.js.map +1 -0
  250. package/dist/map/DungeonGenerator.d.ts +32 -0
  251. package/dist/map/DungeonGenerator.d.ts.map +1 -0
  252. package/dist/map/DungeonGenerator.js +615 -0
  253. package/dist/map/DungeonGenerator.js.map +1 -0
  254. package/dist/map/MapGenerator.d.ts +27 -0
  255. package/dist/map/MapGenerator.d.ts.map +1 -0
  256. package/dist/map/MapGenerator.js +485 -0
  257. package/dist/map/MapGenerator.js.map +1 -0
  258. package/dist/map/index.d.ts +5 -0
  259. package/dist/map/index.d.ts.map +1 -0
  260. package/dist/map/index.js +8 -0
  261. package/dist/map/index.js.map +1 -0
  262. package/dist/npc/NPCGenerator.d.ts +68 -0
  263. package/dist/npc/NPCGenerator.d.ts.map +1 -0
  264. package/dist/npc/NPCGenerator.js +468 -0
  265. package/dist/npc/NPCGenerator.js.map +1 -0
  266. package/dist/npc/NPCManager.d.ts +86 -0
  267. package/dist/npc/NPCManager.d.ts.map +1 -0
  268. package/dist/npc/NPCManager.js +217 -0
  269. package/dist/npc/NPCManager.js.map +1 -0
  270. package/dist/npc/fixedNPCs.d.ts +7 -0
  271. package/dist/npc/fixedNPCs.d.ts.map +1 -0
  272. package/dist/npc/fixedNPCs.js +196 -0
  273. package/dist/npc/fixedNPCs.js.map +1 -0
  274. package/dist/npc/index.d.ts +9 -0
  275. package/dist/npc/index.d.ts.map +1 -0
  276. package/dist/npc/index.js +12 -0
  277. package/dist/npc/index.js.map +1 -0
  278. package/dist/npc/traits.d.ts +33 -0
  279. package/dist/npc/traits.d.ts.map +1 -0
  280. package/dist/npc/traits.js +795 -0
  281. package/dist/npc/traits.js.map +1 -0
  282. package/dist/npc/types.d.ts +193 -0
  283. package/dist/npc/types.d.ts.map +1 -0
  284. package/dist/npc/types.js +9 -0
  285. package/dist/npc/types.js.map +1 -0
  286. package/dist/quest/QuestManager.d.ts +79 -0
  287. package/dist/quest/QuestManager.d.ts.map +1 -0
  288. package/dist/quest/QuestManager.js +273 -0
  289. package/dist/quest/QuestManager.js.map +1 -0
  290. package/dist/quest/index.d.ts +6 -0
  291. package/dist/quest/index.d.ts.map +1 -0
  292. package/dist/quest/index.js +9 -0
  293. package/dist/quest/index.js.map +1 -0
  294. package/dist/quest/types.d.ts +81 -0
  295. package/dist/quest/types.d.ts.map +1 -0
  296. package/dist/quest/types.js +8 -0
  297. package/dist/quest/types.js.map +1 -0
  298. package/dist/strategy/StrategyExecutor.d.ts +159 -0
  299. package/dist/strategy/StrategyExecutor.d.ts.map +1 -0
  300. package/dist/strategy/StrategyExecutor.js +479 -0
  301. package/dist/strategy/StrategyExecutor.js.map +1 -0
  302. package/dist/strategy/StrategyParser.d.ts +48 -0
  303. package/dist/strategy/StrategyParser.d.ts.map +1 -0
  304. package/dist/strategy/StrategyParser.js +321 -0
  305. package/dist/strategy/StrategyParser.js.map +1 -0
  306. package/dist/strategy/defaultStrategy.d.ts +40 -0
  307. package/dist/strategy/defaultStrategy.d.ts.map +1 -0
  308. package/dist/strategy/defaultStrategy.js +254 -0
  309. package/dist/strategy/defaultStrategy.js.map +1 -0
  310. package/dist/strategy/index.d.ts +8 -0
  311. package/dist/strategy/index.d.ts.map +1 -0
  312. package/dist/strategy/index.js +14 -0
  313. package/dist/strategy/index.js.map +1 -0
  314. package/dist/tui/ExploreMenu.d.ts +106 -0
  315. package/dist/tui/ExploreMenu.d.ts.map +1 -0
  316. package/dist/tui/ExploreMenu.js +282 -0
  317. package/dist/tui/ExploreMenu.js.map +1 -0
  318. package/dist/tui/GameUI.d.ts +313 -0
  319. package/dist/tui/GameUI.d.ts.map +1 -0
  320. package/dist/tui/GameUI.js +2116 -0
  321. package/dist/tui/GameUI.js.map +1 -0
  322. package/dist/tui/GameUIAdapter.d.ts +207 -0
  323. package/dist/tui/GameUIAdapter.d.ts.map +1 -0
  324. package/dist/tui/GameUIAdapter.js +1342 -0
  325. package/dist/tui/GameUIAdapter.js.map +1 -0
  326. package/dist/tui/Input.d.ts +139 -0
  327. package/dist/tui/Input.d.ts.map +1 -0
  328. package/dist/tui/Input.js +278 -0
  329. package/dist/tui/Input.js.map +1 -0
  330. package/dist/tui/Menu.d.ts +110 -0
  331. package/dist/tui/Menu.d.ts.map +1 -0
  332. package/dist/tui/Menu.js +365 -0
  333. package/dist/tui/Menu.js.map +1 -0
  334. package/dist/tui/Screen.d.ts +228 -0
  335. package/dist/tui/Screen.d.ts.map +1 -0
  336. package/dist/tui/Screen.js +502 -0
  337. package/dist/tui/Screen.js.map +1 -0
  338. package/dist/tui/components/Box.d.ts +36 -0
  339. package/dist/tui/components/Box.d.ts.map +1 -0
  340. package/dist/tui/components/Box.js +43 -0
  341. package/dist/tui/components/Box.js.map +1 -0
  342. package/dist/tui/components/List.d.ts +69 -0
  343. package/dist/tui/components/List.d.ts.map +1 -0
  344. package/dist/tui/components/List.js +136 -0
  345. package/dist/tui/components/List.js.map +1 -0
  346. package/dist/tui/components/ProgressBar.d.ts +42 -0
  347. package/dist/tui/components/ProgressBar.d.ts.map +1 -0
  348. package/dist/tui/components/ProgressBar.js +75 -0
  349. package/dist/tui/components/ProgressBar.js.map +1 -0
  350. package/dist/tui/components/index.d.ts +8 -0
  351. package/dist/tui/components/index.d.ts.map +1 -0
  352. package/dist/tui/components/index.js +11 -0
  353. package/dist/tui/components/index.js.map +1 -0
  354. package/dist/tui/core/BaseSection.d.ts +98 -0
  355. package/dist/tui/core/BaseSection.d.ts.map +1 -0
  356. package/dist/tui/core/BaseSection.js +174 -0
  357. package/dist/tui/core/BaseSection.js.map +1 -0
  358. package/dist/tui/core/Component.d.ts +61 -0
  359. package/dist/tui/core/Component.d.ts.map +1 -0
  360. package/dist/tui/core/Component.js +32 -0
  361. package/dist/tui/core/Component.js.map +1 -0
  362. package/dist/tui/core/Section.d.ts +101 -0
  363. package/dist/tui/core/Section.d.ts.map +1 -0
  364. package/dist/tui/core/Section.js +24 -0
  365. package/dist/tui/core/Section.js.map +1 -0
  366. package/dist/tui/core/SectionManager.d.ts +108 -0
  367. package/dist/tui/core/SectionManager.d.ts.map +1 -0
  368. package/dist/tui/core/SectionManager.js +258 -0
  369. package/dist/tui/core/SectionManager.js.map +1 -0
  370. package/dist/tui/core/index.d.ts +9 -0
  371. package/dist/tui/core/index.d.ts.map +1 -0
  372. package/dist/tui/core/index.js +12 -0
  373. package/dist/tui/core/index.js.map +1 -0
  374. package/dist/tui/index.d.ts +15 -0
  375. package/dist/tui/index.d.ts.map +1 -0
  376. package/dist/tui/index.js +23 -0
  377. package/dist/tui/index.js.map +1 -0
  378. package/dist/tui/screens/BaseScreen.d.ts +62 -0
  379. package/dist/tui/screens/BaseScreen.d.ts.map +1 -0
  380. package/dist/tui/screens/BaseScreen.js +55 -0
  381. package/dist/tui/screens/BaseScreen.js.map +1 -0
  382. package/dist/tui/screens/CombatScreen.d.ts +43 -0
  383. package/dist/tui/screens/CombatScreen.d.ts.map +1 -0
  384. package/dist/tui/screens/CombatScreen.js +125 -0
  385. package/dist/tui/screens/CombatScreen.js.map +1 -0
  386. package/dist/tui/screens/DialogScreen.d.ts +53 -0
  387. package/dist/tui/screens/DialogScreen.d.ts.map +1 -0
  388. package/dist/tui/screens/DialogScreen.js +90 -0
  389. package/dist/tui/screens/DialogScreen.js.map +1 -0
  390. package/dist/tui/screens/DungeonScreen.d.ts +80 -0
  391. package/dist/tui/screens/DungeonScreen.d.ts.map +1 -0
  392. package/dist/tui/screens/DungeonScreen.js +317 -0
  393. package/dist/tui/screens/DungeonScreen.js.map +1 -0
  394. package/dist/tui/screens/ExploreScreen.d.ts +69 -0
  395. package/dist/tui/screens/ExploreScreen.d.ts.map +1 -0
  396. package/dist/tui/screens/ExploreScreen.js +224 -0
  397. package/dist/tui/screens/ExploreScreen.js.map +1 -0
  398. package/dist/tui/screens/SectionScreen.d.ts +84 -0
  399. package/dist/tui/screens/SectionScreen.d.ts.map +1 -0
  400. package/dist/tui/screens/SectionScreen.js +156 -0
  401. package/dist/tui/screens/SectionScreen.js.map +1 -0
  402. package/dist/tui/screens/TitleScreen.d.ts +40 -0
  403. package/dist/tui/screens/TitleScreen.d.ts.map +1 -0
  404. package/dist/tui/screens/TitleScreen.js +253 -0
  405. package/dist/tui/screens/TitleScreen.js.map +1 -0
  406. package/dist/tui/screens/TownScreen.d.ts +98 -0
  407. package/dist/tui/screens/TownScreen.d.ts.map +1 -0
  408. package/dist/tui/screens/TownScreen.js +370 -0
  409. package/dist/tui/screens/TownScreen.js.map +1 -0
  410. package/dist/tui/screens/TravelScreen.d.ts +67 -0
  411. package/dist/tui/screens/TravelScreen.d.ts.map +1 -0
  412. package/dist/tui/screens/TravelScreen.js +286 -0
  413. package/dist/tui/screens/TravelScreen.js.map +1 -0
  414. package/dist/tui/screens/index.d.ts +8 -0
  415. package/dist/tui/screens/index.d.ts.map +1 -0
  416. package/dist/tui/screens/index.js +17 -0
  417. package/dist/tui/screens/index.js.map +1 -0
  418. package/dist/tui/sections/ActionsSection.d.ts +71 -0
  419. package/dist/tui/sections/ActionsSection.d.ts.map +1 -0
  420. package/dist/tui/sections/ActionsSection.js +184 -0
  421. package/dist/tui/sections/ActionsSection.js.map +1 -0
  422. package/dist/tui/sections/DungeonSection.d.ts +65 -0
  423. package/dist/tui/sections/DungeonSection.d.ts.map +1 -0
  424. package/dist/tui/sections/DungeonSection.js +144 -0
  425. package/dist/tui/sections/DungeonSection.js.map +1 -0
  426. package/dist/tui/sections/EventsSection.d.ts +50 -0
  427. package/dist/tui/sections/EventsSection.d.ts.map +1 -0
  428. package/dist/tui/sections/EventsSection.js +134 -0
  429. package/dist/tui/sections/EventsSection.js.map +1 -0
  430. package/dist/tui/sections/MapSection.d.ts +66 -0
  431. package/dist/tui/sections/MapSection.d.ts.map +1 -0
  432. package/dist/tui/sections/MapSection.js +669 -0
  433. package/dist/tui/sections/MapSection.js.map +1 -0
  434. package/dist/tui/sections/StatusSection.d.ts +47 -0
  435. package/dist/tui/sections/StatusSection.d.ts.map +1 -0
  436. package/dist/tui/sections/StatusSection.js +133 -0
  437. package/dist/tui/sections/StatusSection.js.map +1 -0
  438. package/dist/tui/sections/TeamSection.d.ts +71 -0
  439. package/dist/tui/sections/TeamSection.d.ts.map +1 -0
  440. package/dist/tui/sections/TeamSection.js +224 -0
  441. package/dist/tui/sections/TeamSection.js.map +1 -0
  442. package/dist/tui/sections/TravelingSection.d.ts +51 -0
  443. package/dist/tui/sections/TravelingSection.d.ts.map +1 -0
  444. package/dist/tui/sections/TravelingSection.js +106 -0
  445. package/dist/tui/sections/TravelingSection.js.map +1 -0
  446. package/dist/tui/sections/index.d.ts +9 -0
  447. package/dist/tui/sections/index.d.ts.map +1 -0
  448. package/dist/tui/sections/index.js +12 -0
  449. package/dist/tui/sections/index.js.map +1 -0
  450. package/dist/ui/Terminal.d.ts +68 -0
  451. package/dist/ui/Terminal.d.ts.map +1 -0
  452. package/dist/ui/Terminal.js +297 -0
  453. package/dist/ui/Terminal.js.map +1 -0
  454. package/dist/ui/index.d.ts +5 -0
  455. package/dist/ui/index.d.ts.map +1 -0
  456. package/dist/ui/index.js +8 -0
  457. package/dist/ui/index.js.map +1 -0
  458. package/dist/utils/configMigration.d.ts +14 -0
  459. package/dist/utils/configMigration.d.ts.map +1 -0
  460. package/dist/utils/configMigration.js +92 -0
  461. package/dist/utils/configMigration.js.map +1 -0
  462. package/dist/utils/errorHandler.d.ts +86 -0
  463. package/dist/utils/errorHandler.d.ts.map +1 -0
  464. package/dist/utils/errorHandler.js +224 -0
  465. package/dist/utils/errorHandler.js.map +1 -0
  466. package/dist/utils/logger.d.ts +14 -0
  467. package/dist/utils/logger.d.ts.map +1 -0
  468. package/dist/utils/logger.js +43 -0
  469. package/dist/utils/logger.js.map +1 -0
  470. package/dist/weapon/WeaponFactory.d.ts +32 -0
  471. package/dist/weapon/WeaponFactory.d.ts.map +1 -0
  472. package/dist/weapon/WeaponFactory.js +216 -0
  473. package/dist/weapon/WeaponFactory.js.map +1 -0
  474. package/dist/weapon/index.d.ts +5 -0
  475. package/dist/weapon/index.d.ts.map +1 -0
  476. package/dist/weapon/index.js +8 -0
  477. package/dist/weapon/index.js.map +1 -0
  478. package/package.json +46 -0
@@ -0,0 +1,508 @@
1
+ /**
2
+ * TitleScreenHandler - Handles login flow and title screen
3
+ *
4
+ * Extracted from main.ts to reduce file size.
5
+ * Manages authentication, title screen rendering, and player name input.
6
+ */
7
+
8
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ef6e7c8a-038d-5626-a154-8076ba6d2206")}catch(e){}}();
9
+ import { ANSI } from '../tui/index.js';
10
+ import { initiateLogin, completeLogin, generateQRCode, tryRestoreAuth, setNickname, getNickname, logout, } from '../ai/PlayKitClient.js';
11
+ // Spinner frames for loading animation
12
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
13
+ // ASCII Art Logos
14
+ const ASCII_LOGO = [
15
+ '██╗██████╗ ██╗ ███████╗██████╗ ██████╗ ██████╗ ',
16
+ '██║██╔══██╗██║ ██╔════╝██╔══██╗██╔══██╗██╔════╝ ',
17
+ '██║██║ ██║██║ █████╗ ██████╔╝██████╔╝██║ ███╗',
18
+ '██║██║ ██║██║ ██╔══╝ ██╔══██╗██╔═══╝ ██║ ██║',
19
+ '██║██████╔╝███████╗███████╗██║ ██║██║ ╚██████╔╝',
20
+ '╚═╝╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ',
21
+ ];
22
+ const ASCII_TERMINAL = [
23
+ '████████╗███████╗██████╗ ███╗ ███╗██╗███╗ ██╗ █████╗ ██╗ ',
24
+ '╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██║████╗ ██║██╔══██╗██║ ',
25
+ ' ██║ █████╗ ██████╔╝██╔████╔██║██║██╔██╗ ██║███████║██║ ',
26
+ ' ██║ ██╔══╝ ██╔══██╗██║╚██╔╝██║██║██║╚██╗██║██╔══██║██║ ',
27
+ ' ██║ ███████╗██║ ██║██║ ╚═╝ ██║██║██║ ╚████║██║ ██║███████╗',
28
+ ' ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚══════╝',
29
+ ];
30
+ const ASCII_COMPACT = [
31
+ ' ╔═══════════════════════════════════════╗',
32
+ ' ║ █ ████ █ █████ ████ ████ ██ ║',
33
+ ' ║ █ █ █ █ █ █ █ █ █ █ ║',
34
+ ' ║ █ █ █ █ ████ ████ ████ █ ██ ║',
35
+ ' ║ █ █ █ █ █ █ █ █ █ █ ║',
36
+ ' ║ █ ████ █████ █████ █ █ █ ██ ║',
37
+ ' ╠═══════════════════════════════════════╣',
38
+ ' ║ T E R M I N A L v0.1.0 ║',
39
+ ' ╚═══════════════════════════════════════╝',
40
+ ];
41
+ /**
42
+ * Handles title screen, login flow, and player name input
43
+ */
44
+ export class TitleScreenHandler {
45
+ screen;
46
+ input;
47
+ cleanup;
48
+ constructor(screen, input, cleanup) {
49
+ this.screen = screen;
50
+ this.input = input;
51
+ this.cleanup = cleanup;
52
+ }
53
+ /**
54
+ * Draw ASCII art title
55
+ */
56
+ drawAsciiTitle() {
57
+ const { width } = this.screen.getSize();
58
+ // Use compact logo for smaller terminals
59
+ const useCompact = width < 75;
60
+ const logo = useCompact ? ASCII_COMPACT : ASCII_LOGO;
61
+ const logoWidth = logo[0].length;
62
+ const logoX = Math.floor((width - logoWidth) / 2);
63
+ let y = 2;
64
+ // Draw ASCII logo
65
+ for (const line of logo) {
66
+ this.screen.write(Math.max(1, logoX), y++, line, ANSI.fg.cyan);
67
+ }
68
+ // Draw TERMINAL text (if using full logo)
69
+ if (!useCompact) {
70
+ y++;
71
+ const termX = Math.floor((width - ASCII_TERMINAL[0].length) / 2);
72
+ for (const line of ASCII_TERMINAL) {
73
+ this.screen.write(Math.max(1, termX), y++, line, ANSI.fg.yellow);
74
+ }
75
+ }
76
+ return y;
77
+ }
78
+ /**
79
+ * Wait for Enter key to proceed with login
80
+ */
81
+ async waitForLoginKey() {
82
+ return new Promise((resolve) => {
83
+ const handler = (key) => {
84
+ if (key.name === 'return') {
85
+ this.input.offKey(handler);
86
+ resolve();
87
+ }
88
+ else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
89
+ this.input.offKey(handler);
90
+ this.cleanup();
91
+ process.exit(0);
92
+ }
93
+ };
94
+ this.input.onKey(handler);
95
+ });
96
+ }
97
+ /**
98
+ * Wait for Enter to start game (after login)
99
+ */
100
+ async waitForGameStart(playerName) {
101
+ const { width } = this.screen.getSize();
102
+ const centerX = Math.floor(width / 2);
103
+ const useCompact = width < 75;
104
+ const contentY = useCompact ? 14 : 22;
105
+ const startMsg = `Press ENTER to begin, ${playerName}`;
106
+ const startMsgX = centerX - Math.floor(startMsg.length / 2);
107
+ const startMsgY = contentY + 3;
108
+ let blinkVisible = true;
109
+ // Blinking interval
110
+ const blinkInterval = setInterval(() => {
111
+ if (blinkVisible) {
112
+ this.screen.write(startMsgX, startMsgY, startMsg, ANSI.fg.cyan);
113
+ }
114
+ else {
115
+ this.screen.write(startMsgX, startMsgY, ' '.repeat(startMsg.length), ANSI.fg.cyan);
116
+ }
117
+ blinkVisible = !blinkVisible;
118
+ this.screen.forceRedraw();
119
+ }, 600);
120
+ // Initial draw
121
+ this.screen.write(startMsgX, startMsgY, startMsg, ANSI.fg.cyan);
122
+ // Show hint for logout
123
+ const logoutHint = 'Ctrl+O to logout';
124
+ this.screen.write(centerX - Math.floor(logoutHint.length / 2), startMsgY + 3, logoutHint, ANSI.fg.gray);
125
+ this.screen.forceRedraw();
126
+ // Wait for Enter
127
+ return new Promise((resolve) => {
128
+ const handler = async (key) => {
129
+ if (key.name === 'return') {
130
+ clearInterval(blinkInterval);
131
+ this.input.offKey(handler);
132
+ resolve();
133
+ }
134
+ else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
135
+ clearInterval(blinkInterval);
136
+ this.input.offKey(handler);
137
+ this.cleanup();
138
+ process.exit(0);
139
+ }
140
+ else if (key.ctrl && key.name === 'o') {
141
+ // Logout - handled by caller
142
+ clearInterval(blinkInterval);
143
+ this.input.offKey(handler);
144
+ throw new Error('LOGOUT_REQUESTED');
145
+ }
146
+ };
147
+ this.input.onKey(handler);
148
+ });
149
+ }
150
+ /**
151
+ * Prompt user to set their nickname
152
+ */
153
+ async promptSetNickname() {
154
+ const { width } = this.screen.getSize();
155
+ const centerX = Math.floor(width / 2);
156
+ const maxNameLength = 16;
157
+ // Calculate position
158
+ const useCompact = width < 75;
159
+ const inputY = useCompact ? 14 : 20;
160
+ let inputBuffer = '';
161
+ let errorMessage = '';
162
+ const drawPrompt = () => {
163
+ this.screen.clear();
164
+ this.drawAsciiTitle();
165
+ const promptText = 'Set your adventurer name:';
166
+ this.screen.write(centerX - Math.floor(promptText.length / 2), inputY, promptText, ANSI.fg.white);
167
+ // Rules hint
168
+ const rulesText = '(1-16 chars, letters, numbers, Chinese, _, space)';
169
+ this.screen.write(centerX - Math.floor(rulesText.length / 2), inputY + 1, rulesText, ANSI.fg.gray);
170
+ // Input box
171
+ const inputWidth = 24;
172
+ const inputX = Math.floor((width - inputWidth) / 2);
173
+ this.screen.write(inputX, inputY + 3, '╔' + '═'.repeat(inputWidth - 2) + '╗', ANSI.fg.cyan);
174
+ this.screen.write(inputX, inputY + 4, '║ ', ANSI.fg.cyan);
175
+ this.screen.write(inputX + 2, inputY + 4, inputBuffer.slice(0, maxNameLength).padEnd(inputWidth - 4) + '▌', ANSI.fg.white);
176
+ this.screen.write(inputX + inputWidth - 1, inputY + 4, '║', ANSI.fg.cyan);
177
+ this.screen.write(inputX, inputY + 5, '╚' + '═'.repeat(inputWidth - 2) + '╝', ANSI.fg.cyan);
178
+ // Error message
179
+ if (errorMessage) {
180
+ this.screen.write(centerX - Math.floor(errorMessage.length / 2), inputY + 7, errorMessage, ANSI.fg.red);
181
+ }
182
+ // Instructions
183
+ this.screen.write(centerX - 15, inputY + 9, 'Enter to confirm Esc to use default', ANSI.fg.gray);
184
+ this.screen.forceRedraw();
185
+ };
186
+ drawPrompt();
187
+ this.screen.showCursor();
188
+ return new Promise((resolve) => {
189
+ let isProcessing = false;
190
+ const handleKeypress = (key) => {
191
+ if (isProcessing)
192
+ return;
193
+ if (key.name === 'return') {
194
+ const trimmed = inputBuffer.trim();
195
+ if (!trimmed) {
196
+ errorMessage = 'Name cannot be empty';
197
+ drawPrompt();
198
+ return;
199
+ }
200
+ isProcessing = true;
201
+ this.screen.write(centerX - 10, inputY + 7, 'Saving... ', ANSI.fg.yellow);
202
+ this.screen.forceRedraw();
203
+ setNickname(trimmed).then((result) => {
204
+ if (result.success && result.nickname) {
205
+ this.input.offKey(handleKeypress);
206
+ this.screen.hideCursor();
207
+ this.screen.write(centerX - 15, inputY + 7, `✓ Welcome, ${result.nickname}!`.padEnd(30), ANSI.fg.green);
208
+ this.screen.forceRedraw();
209
+ setTimeout(() => {
210
+ resolve(result.nickname);
211
+ }, 1500);
212
+ }
213
+ else {
214
+ isProcessing = false;
215
+ errorMessage = result.error || 'Failed to set name';
216
+ drawPrompt();
217
+ }
218
+ }).catch(() => {
219
+ isProcessing = false;
220
+ errorMessage = 'Network error, please try again';
221
+ drawPrompt();
222
+ });
223
+ }
224
+ else if (key.name === 'backspace') {
225
+ inputBuffer = inputBuffer.slice(0, -1);
226
+ errorMessage = '';
227
+ drawPrompt();
228
+ }
229
+ else if (key.name === 'escape') {
230
+ this.input.offKey(handleKeypress);
231
+ this.screen.hideCursor();
232
+ resolve('Adventurer');
233
+ }
234
+ else if (key.raw && !key.ctrl && !key.meta) {
235
+ const charCode = key.raw.charCodeAt(0);
236
+ if (charCode >= 32 && inputBuffer.length < maxNameLength) {
237
+ inputBuffer += key.raw;
238
+ errorMessage = '';
239
+ drawPrompt();
240
+ }
241
+ }
242
+ };
243
+ this.input.onKey(handleKeypress);
244
+ });
245
+ }
246
+ /**
247
+ * Show title screen and get player name with login flow
248
+ */
249
+ async showTitleScreen() {
250
+ const { width } = this.screen.getSize();
251
+ this.screen.clear();
252
+ // Draw ASCII art
253
+ let y = this.drawAsciiTitle();
254
+ y += 2;
255
+ const centerX = Math.floor(width / 2);
256
+ // Tagline
257
+ const tagline = '~ An AI-native adventure that lives in your terminal ~';
258
+ this.screen.write(centerX - Math.floor(tagline.length / 2), y++, tagline, ANSI.fg.gray);
259
+ y++;
260
+ // Decorative line
261
+ const lineWidth = Math.min(50, width - 10);
262
+ const lineX = Math.floor((width - lineWidth) / 2);
263
+ this.screen.write(lineX, y++, '═'.repeat(lineWidth), ANSI.fg.gray);
264
+ y++;
265
+ const loginY = y;
266
+ // Start input (needed for key detection)
267
+ this.input.start();
268
+ this.input.setMode('raw');
269
+ // Show "Checking authentication..." while trying to restore
270
+ this.screen.write(centerX - 15, loginY, 'Checking authentication...', ANSI.fg.yellow);
271
+ this.screen.forceRedraw();
272
+ // Try to restore authentication from saved tokens
273
+ const restoreResult = await tryRestoreAuth();
274
+ if (restoreResult.success) {
275
+ // Authentication restored successfully!
276
+ this.screen.clear();
277
+ this.drawAsciiTitle();
278
+ const msg = restoreResult.needsRefresh
279
+ ? '✓ Session refreshed!'
280
+ : '✓ Welcome back!';
281
+ this.screen.write(centerX - 12, loginY, msg, ANSI.fg.green);
282
+ this.screen.forceRedraw();
283
+ // Get nickname from PlayKit
284
+ const nickname = await getNickname();
285
+ if (nickname) {
286
+ // Has nickname, wait for Enter to start game
287
+ await this.waitForGameStart(nickname);
288
+ return nickname;
289
+ }
290
+ else {
291
+ // No nickname set, prompt user to set one
292
+ this.screen.write(centerX - 15, loginY + 2, 'You need to set a nickname first', ANSI.fg.yellow);
293
+ this.screen.forceRedraw();
294
+ await this.sleep(1000);
295
+ const newNickname = await this.promptSetNickname();
296
+ await this.waitForGameStart(newNickname);
297
+ return newNickname;
298
+ }
299
+ }
300
+ // No saved auth or restore failed - show login UI
301
+ this.screen.clear();
302
+ this.drawAsciiTitle();
303
+ // Show "Press ENTER to login" message
304
+ this.screen.write(centerX - 15, loginY, 'Login required to play', ANSI.fg.gray);
305
+ this.screen.write(centerX - 15, loginY + 2, '▶ Press ENTER to Login ◀', ANSI.fg.cyan);
306
+ this.screen.write(centerX - 10, loginY + 4, 'Esc to quit', ANSI.fg.gray);
307
+ this.screen.forceRedraw();
308
+ // Wait for Enter key
309
+ await this.waitForLoginKey();
310
+ // Now start the login process
311
+ let playerName = '';
312
+ let spinnerFrame = 0;
313
+ let spinnerInterval = null;
314
+ let showingQR = false;
315
+ let qrCode = '';
316
+ const startSpinner = () => {
317
+ spinnerInterval = setInterval(() => {
318
+ spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;
319
+ }, 100);
320
+ };
321
+ const stopSpinner = () => {
322
+ if (spinnerInterval) {
323
+ clearInterval(spinnerInterval);
324
+ spinnerInterval = null;
325
+ }
326
+ };
327
+ const getSpinner = () => SPINNER_FRAMES[spinnerFrame];
328
+ try {
329
+ // Step 1: Show "Preparing login..." with spinner
330
+ this.screen.clear();
331
+ this.drawAsciiTitle();
332
+ this.screen.write(centerX - 15, loginY, `${getSpinner()} Preparing login...`, ANSI.fg.yellow);
333
+ this.screen.forceRedraw();
334
+ startSpinner();
335
+ // Initiate login to get URL
336
+ const loginInfo = await initiateLogin();
337
+ // Generate QR code in background
338
+ qrCode = await generateQRCode(loginInfo.authUrl);
339
+ // Helper to redraw the waiting screen
340
+ const redrawWaitingScreen = () => {
341
+ this.screen.clear();
342
+ let contentY = 2;
343
+ if (!showingQR) {
344
+ contentY = this.drawAsciiTitle();
345
+ contentY += 2;
346
+ this.screen.write(centerX - 10, contentY++, 'Please visit:', ANSI.fg.white);
347
+ contentY++;
348
+ const url = loginInfo.authUrl;
349
+ const maxLen = width - 10;
350
+ const displayUrl = url.length > maxLen ? url.slice(0, maxLen - 3) + '...' : url;
351
+ this.screen.write(centerX - Math.floor(displayUrl.length / 2), contentY++, displayUrl, ANSI.fg.cyan);
352
+ contentY += 2;
353
+ this.screen.write(centerX - 18, contentY, `${getSpinner()} Waiting for authentication...`, ANSI.fg.yellow);
354
+ contentY += 2;
355
+ this.screen.write(centerX - 20, contentY++, 'Enter: Open in browser', ANSI.fg.gray);
356
+ this.screen.write(centerX - 20, contentY++, 'Q: Show QR code (hide title)', ANSI.fg.gray);
357
+ this.screen.write(centerX - 20, contentY++, 'Esc: Cancel', ANSI.fg.gray);
358
+ }
359
+ else {
360
+ contentY = 1;
361
+ const qrLines = qrCode.split('\n');
362
+ for (const line of qrLines) {
363
+ if (line.trim()) {
364
+ this.screen.write(centerX - Math.floor(line.length / 2), contentY++, line, ANSI.fg.white);
365
+ }
366
+ }
367
+ contentY++;
368
+ const url = loginInfo.authUrl;
369
+ const maxLen = width - 4;
370
+ const displayUrl = url.length > maxLen ? url.slice(0, maxLen - 3) + '...' : url;
371
+ this.screen.write(centerX - Math.floor(displayUrl.length / 2), contentY++, displayUrl, ANSI.fg.cyan);
372
+ contentY += 2;
373
+ this.screen.write(centerX - 18, contentY, `${getSpinner()} Waiting for authentication...`, ANSI.fg.yellow);
374
+ contentY += 2;
375
+ this.screen.write(centerX - 20, contentY++, 'Enter: Open in browser', ANSI.fg.gray);
376
+ this.screen.write(centerX - 20, contentY++, 'Q: Show title (hide QR)', ANSI.fg.gray);
377
+ this.screen.write(centerX - 20, contentY++, 'Esc: Cancel', ANSI.fg.gray);
378
+ }
379
+ this.screen.forceRedraw();
380
+ };
381
+ redrawWaitingScreen();
382
+ // Set up key handler
383
+ let cancelled = false;
384
+ let spinnerUpdateInterval = null;
385
+ const keyHandler = (key) => {
386
+ if (key.name === 'return') {
387
+ import('open').then(({ default: openUrl }) => {
388
+ openUrl(loginInfo.authUrl).catch(() => { });
389
+ }).catch(() => { });
390
+ }
391
+ else if (key.raw === 'q' || key.raw === 'Q') {
392
+ showingQR = !showingQR;
393
+ redrawWaitingScreen();
394
+ }
395
+ else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
396
+ cancelled = true;
397
+ if (spinnerUpdateInterval)
398
+ clearInterval(spinnerUpdateInterval);
399
+ this.input.offKey(keyHandler);
400
+ stopSpinner();
401
+ this.cleanup();
402
+ process.exit(0);
403
+ }
404
+ };
405
+ this.input.onKey(keyHandler);
406
+ spinnerUpdateInterval = setInterval(() => {
407
+ if (cancelled)
408
+ return;
409
+ redrawWaitingScreen();
410
+ }, 100);
411
+ // Wait for login completion
412
+ try {
413
+ const result = await completeLogin((status) => {
414
+ if (cancelled)
415
+ return;
416
+ if (status === 'completed') {
417
+ if (spinnerUpdateInterval)
418
+ clearInterval(spinnerUpdateInterval);
419
+ this.input.offKey(keyHandler);
420
+ stopSpinner();
421
+ this.screen.clear();
422
+ this.drawAsciiTitle();
423
+ this.screen.write(centerX - 12, loginY, '✓ Login successful!', ANSI.fg.green);
424
+ this.screen.forceRedraw();
425
+ }
426
+ });
427
+ if (spinnerUpdateInterval)
428
+ clearInterval(spinnerUpdateInterval);
429
+ this.input.offKey(keyHandler);
430
+ stopSpinner();
431
+ if (cancelled) {
432
+ throw new Error('Login cancelled');
433
+ }
434
+ this.screen.clear();
435
+ this.drawAsciiTitle();
436
+ this.screen.write(centerX - 12, loginY, '✓ Login successful!', ANSI.fg.green);
437
+ this.screen.forceRedraw();
438
+ const nickname = await getNickname();
439
+ if (nickname) {
440
+ playerName = nickname;
441
+ }
442
+ else {
443
+ this.screen.write(centerX - 15, loginY + 2, 'Set your adventurer name', ANSI.fg.yellow);
444
+ this.screen.forceRedraw();
445
+ await this.sleep(1000);
446
+ playerName = await this.promptSetNickname();
447
+ }
448
+ await this.waitForGameStart(playerName);
449
+ }
450
+ catch (loginError) {
451
+ if (spinnerUpdateInterval)
452
+ clearInterval(spinnerUpdateInterval);
453
+ this.input.offKey(keyHandler);
454
+ stopSpinner();
455
+ throw loginError;
456
+ }
457
+ }
458
+ catch (error) {
459
+ stopSpinner();
460
+ this.screen.clear();
461
+ this.drawAsciiTitle();
462
+ this.screen.write(centerX - 10, loginY, '✗ Login failed', ANSI.fg.red);
463
+ this.screen.write(centerX - Math.floor((error.message || 'Unknown error').length / 2), loginY + 2, error.message || 'Unknown error', ANSI.fg.gray);
464
+ this.screen.write(centerX - 15, loginY + 4, 'Press any key to exit...', ANSI.fg.yellow);
465
+ this.screen.forceRedraw();
466
+ await this.input.waitForKey();
467
+ this.cleanup();
468
+ process.exit(1);
469
+ }
470
+ if (playerName) {
471
+ return playerName;
472
+ }
473
+ const fallbackName = await this.promptSetNickname();
474
+ await this.waitForGameStart(fallbackName);
475
+ return fallbackName;
476
+ }
477
+ /**
478
+ * Handle logout from title screen
479
+ */
480
+ async handleLogout() {
481
+ const { width } = this.screen.getSize();
482
+ const centerX = Math.floor(width / 2);
483
+ this.screen.clear();
484
+ const logoY = this.drawAsciiTitle();
485
+ const contentY = logoY + 3;
486
+ this.screen.write(centerX - 10, contentY, 'Logging out...', ANSI.fg.yellow);
487
+ this.screen.forceRedraw();
488
+ try {
489
+ await logout();
490
+ this.screen.write(centerX - 15, contentY + 2, '✓ Logged out successfully', ANSI.fg.green);
491
+ this.screen.forceRedraw();
492
+ await this.sleep(1000);
493
+ // Restart the title screen flow
494
+ return await this.showTitleScreen();
495
+ }
496
+ catch (error) {
497
+ this.screen.write(centerX - 10, contentY + 2, '✗ Logout failed', ANSI.fg.red);
498
+ this.screen.forceRedraw();
499
+ await this.sleep(1500);
500
+ return await this.showTitleScreen();
501
+ }
502
+ }
503
+ sleep(ms) {
504
+ return new Promise(resolve => setTimeout(resolve, ms));
505
+ }
506
+ }
507
+ //# sourceMappingURL=TitleScreenHandler.js.map
508
+ //# debugId=ef6e7c8a-038d-5626-a154-8076ba6d2206
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitleScreenHandler.js","sources":["handlers/TitleScreenHandler.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * TitleScreenHandler - Handles login flow and title screen\r\n *\r\n * Extracted from main.ts to reduce file size.\r\n * Manages authentication, title screen rendering, and player name input.\r\n */\r\n\r\nimport { ANSI } from '../tui/index.js';\r\nimport type { Screen } from '../tui/Screen.js';\r\nimport type { InputManager, KeyEvent } from '../tui/Input.js';\r\nimport {\r\n initiateLogin,\r\n completeLogin,\r\n generateQRCode,\r\n tryRestoreAuth,\r\n setNickname,\r\n getNickname,\r\n logout,\r\n} from '../ai/PlayKitClient.js';\r\n\r\n// Spinner frames for loading animation\r\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\r\n\r\n// ASCII Art Logos\r\nconst ASCII_LOGO = [\r\n '██╗██████╗ ██╗ ███████╗██████╗ ██████╗ ██████╗ ',\r\n '██║██╔══██╗██║ ██╔════╝██╔══██╗██╔══██╗██╔════╝ ',\r\n '██║██║ ██║██║ █████╗ ██████╔╝██████╔╝██║ ███╗',\r\n '██║██║ ██║██║ ██╔══╝ ██╔══██╗██╔═══╝ ██║ ██║',\r\n '██║██████╔╝███████╗███████╗██║ ██║██║ ╚██████╔╝',\r\n '╚═╝╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ',\r\n];\r\n\r\nconst ASCII_TERMINAL = [\r\n '████████╗███████╗██████╗ ███╗ ███╗██╗███╗ ██╗ █████╗ ██╗ ',\r\n '╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██║████╗ ██║██╔══██╗██║ ',\r\n ' ██║ █████╗ ██████╔╝██╔████╔██║██║██╔██╗ ██║███████║██║ ',\r\n ' ██║ ██╔══╝ ██╔══██╗██║╚██╔╝██║██║██║╚██╗██║██╔══██║██║ ',\r\n ' ██║ ███████╗██║ ██║██║ ╚═╝ ██║██║██║ ╚████║██║ ██║███████╗',\r\n ' ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚══════╝',\r\n];\r\n\r\nconst ASCII_COMPACT = [\r\n ' ╔═══════════════════════════════════════╗',\r\n ' ║ █ ████ █ █████ ████ ████ ██ ║',\r\n ' ║ █ █ █ █ █ █ █ █ █ █ ║',\r\n ' ║ █ █ █ █ ████ ████ ████ █ ██ ║',\r\n ' ║ █ █ █ █ █ █ █ █ █ █ ║',\r\n ' ║ █ ████ █████ █████ █ █ █ ██ ║',\r\n ' ╠═══════════════════════════════════════╣',\r\n ' ║ T E R M I N A L v0.1.0 ║',\r\n ' ╚═══════════════════════════════════════╝',\r\n];\r\n\r\n/**\r\n * Handles title screen, login flow, and player name input\r\n */\r\nexport class TitleScreenHandler {\r\n private screen: Screen;\r\n private input: InputManager;\r\n private cleanup: () => void;\r\n\r\n constructor(screen: Screen, input: InputManager, cleanup: () => void) {\r\n this.screen = screen;\r\n this.input = input;\r\n this.cleanup = cleanup;\r\n }\r\n\r\n /**\r\n * Draw ASCII art title\r\n */\r\n drawAsciiTitle(): number {\r\n const { width } = this.screen.getSize();\r\n\r\n // Use compact logo for smaller terminals\r\n const useCompact = width < 75;\r\n const logo = useCompact ? ASCII_COMPACT : ASCII_LOGO;\r\n const logoWidth = logo[0].length;\r\n\r\n const logoX = Math.floor((width - logoWidth) / 2);\r\n let y = 2;\r\n\r\n // Draw ASCII logo\r\n for (const line of logo) {\r\n this.screen.write(Math.max(1, logoX), y++, line, ANSI.fg.cyan);\r\n }\r\n\r\n // Draw TERMINAL text (if using full logo)\r\n if (!useCompact) {\r\n y++;\r\n const termX = Math.floor((width - ASCII_TERMINAL[0].length) / 2);\r\n for (const line of ASCII_TERMINAL) {\r\n this.screen.write(Math.max(1, termX), y++, line, ANSI.fg.yellow);\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n /**\r\n * Wait for Enter key to proceed with login\r\n */\r\n private async waitForLoginKey(): Promise<void> {\r\n return new Promise((resolve) => {\r\n const handler = (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n this.input.offKey(handler);\r\n resolve();\r\n } else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\r\n this.input.offKey(handler);\r\n this.cleanup();\r\n process.exit(0);\r\n }\r\n };\r\n this.input.onKey(handler);\r\n });\r\n }\r\n\r\n /**\r\n * Wait for Enter to start game (after login)\r\n */\r\n async waitForGameStart(playerName: string): Promise<void> {\r\n const { width } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n const useCompact = width < 75;\r\n const contentY = useCompact ? 14 : 22;\r\n\r\n const startMsg = `Press ENTER to begin, ${playerName}`;\r\n const startMsgX = centerX - Math.floor(startMsg.length / 2);\r\n const startMsgY = contentY + 3;\r\n let blinkVisible = true;\r\n\r\n // Blinking interval\r\n const blinkInterval = setInterval(() => {\r\n if (blinkVisible) {\r\n this.screen.write(startMsgX, startMsgY, startMsg, ANSI.fg.cyan);\r\n } else {\r\n this.screen.write(startMsgX, startMsgY, ' '.repeat(startMsg.length), ANSI.fg.cyan);\r\n }\r\n blinkVisible = !blinkVisible;\r\n this.screen.forceRedraw();\r\n }, 600);\r\n\r\n // Initial draw\r\n this.screen.write(startMsgX, startMsgY, startMsg, ANSI.fg.cyan);\r\n\r\n // Show hint for logout\r\n const logoutHint = 'Ctrl+O to logout';\r\n this.screen.write(centerX - Math.floor(logoutHint.length / 2), startMsgY + 3, logoutHint, ANSI.fg.gray);\r\n\r\n this.screen.forceRedraw();\r\n\r\n // Wait for Enter\r\n return new Promise((resolve) => {\r\n const handler = async (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n clearInterval(blinkInterval);\r\n this.input.offKey(handler);\r\n resolve();\r\n } else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\r\n clearInterval(blinkInterval);\r\n this.input.offKey(handler);\r\n this.cleanup();\r\n process.exit(0);\r\n } else if (key.ctrl && key.name === 'o') {\r\n // Logout - handled by caller\r\n clearInterval(blinkInterval);\r\n this.input.offKey(handler);\r\n throw new Error('LOGOUT_REQUESTED');\r\n }\r\n };\r\n this.input.onKey(handler);\r\n });\r\n }\r\n\r\n /**\r\n * Prompt user to set their nickname\r\n */\r\n async promptSetNickname(): Promise<string> {\r\n const { width } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n const maxNameLength = 16;\r\n\r\n // Calculate position\r\n const useCompact = width < 75;\r\n const inputY = useCompact ? 14 : 20;\r\n\r\n let inputBuffer = '';\r\n let errorMessage = '';\r\n\r\n const drawPrompt = () => {\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n\r\n const promptText = 'Set your adventurer name:';\r\n this.screen.write(centerX - Math.floor(promptText.length / 2), inputY, promptText, ANSI.fg.white);\r\n\r\n // Rules hint\r\n const rulesText = '(1-16 chars, letters, numbers, Chinese, _, space)';\r\n this.screen.write(centerX - Math.floor(rulesText.length / 2), inputY + 1, rulesText, ANSI.fg.gray);\r\n\r\n // Input box\r\n const inputWidth = 24;\r\n const inputX = Math.floor((width - inputWidth) / 2);\r\n\r\n this.screen.write(inputX, inputY + 3, '╔' + '═'.repeat(inputWidth - 2) + '╗', ANSI.fg.cyan);\r\n this.screen.write(inputX, inputY + 4, '║ ', ANSI.fg.cyan);\r\n this.screen.write(inputX + 2, inputY + 4, inputBuffer.slice(0, maxNameLength).padEnd(inputWidth - 4) + '▌', ANSI.fg.white);\r\n this.screen.write(inputX + inputWidth - 1, inputY + 4, '║', ANSI.fg.cyan);\r\n this.screen.write(inputX, inputY + 5, '╚' + '═'.repeat(inputWidth - 2) + '╝', ANSI.fg.cyan);\r\n\r\n // Error message\r\n if (errorMessage) {\r\n this.screen.write(centerX - Math.floor(errorMessage.length / 2), inputY + 7, errorMessage, ANSI.fg.red);\r\n }\r\n\r\n // Instructions\r\n this.screen.write(centerX - 15, inputY + 9, 'Enter to confirm Esc to use default', ANSI.fg.gray);\r\n\r\n this.screen.forceRedraw();\r\n };\r\n\r\n drawPrompt();\r\n this.screen.showCursor();\r\n\r\n return new Promise<string>((resolve) => {\r\n let isProcessing = false;\r\n\r\n const handleKeypress = (key: KeyEvent) => {\r\n if (isProcessing) return;\r\n\r\n if (key.name === 'return') {\r\n const trimmed = inputBuffer.trim();\r\n\r\n if (!trimmed) {\r\n errorMessage = 'Name cannot be empty';\r\n drawPrompt();\r\n return;\r\n }\r\n\r\n isProcessing = true;\r\n\r\n this.screen.write(centerX - 10, inputY + 7, 'Saving... ', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n setNickname(trimmed).then((result) => {\r\n if (result.success && result.nickname) {\r\n this.input.offKey(handleKeypress);\r\n this.screen.hideCursor();\r\n\r\n this.screen.write(centerX - 15, inputY + 7, `✓ Welcome, ${result.nickname}!`.padEnd(30), ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n\r\n setTimeout(() => {\r\n resolve(result.nickname!);\r\n }, 1500);\r\n } else {\r\n isProcessing = false;\r\n errorMessage = result.error || 'Failed to set name';\r\n drawPrompt();\r\n }\r\n }).catch(() => {\r\n isProcessing = false;\r\n errorMessage = 'Network error, please try again';\r\n drawPrompt();\r\n });\r\n } else if (key.name === 'backspace') {\r\n inputBuffer = inputBuffer.slice(0, -1);\r\n errorMessage = '';\r\n drawPrompt();\r\n } else if (key.name === 'escape') {\r\n this.input.offKey(handleKeypress);\r\n this.screen.hideCursor();\r\n resolve('Adventurer');\r\n } else if (key.raw && !key.ctrl && !key.meta) {\r\n const charCode = key.raw.charCodeAt(0);\r\n if (charCode >= 32 && inputBuffer.length < maxNameLength) {\r\n inputBuffer += key.raw;\r\n errorMessage = '';\r\n drawPrompt();\r\n }\r\n }\r\n };\r\n\r\n this.input.onKey(handleKeypress);\r\n });\r\n }\r\n\r\n /**\r\n * Show title screen and get player name with login flow\r\n */\r\n async showTitleScreen(): Promise<string> {\r\n const { width } = this.screen.getSize();\r\n this.screen.clear();\r\n\r\n // Draw ASCII art\r\n let y = this.drawAsciiTitle();\r\n y += 2;\r\n\r\n const centerX = Math.floor(width / 2);\r\n\r\n // Tagline\r\n const tagline = '~ An AI-native adventure that lives in your terminal ~';\r\n this.screen.write(centerX - Math.floor(tagline.length / 2), y++, tagline, ANSI.fg.gray);\r\n y++;\r\n\r\n // Decorative line\r\n const lineWidth = Math.min(50, width - 10);\r\n const lineX = Math.floor((width - lineWidth) / 2);\r\n this.screen.write(lineX, y++, '═'.repeat(lineWidth), ANSI.fg.gray);\r\n y++;\r\n\r\n const loginY = y;\r\n\r\n // Start input (needed for key detection)\r\n this.input.start();\r\n this.input.setMode('raw');\r\n\r\n // Show \"Checking authentication...\" while trying to restore\r\n this.screen.write(centerX - 15, loginY, 'Checking authentication...', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n // Try to restore authentication from saved tokens\r\n const restoreResult = await tryRestoreAuth();\r\n\r\n if (restoreResult.success) {\r\n // Authentication restored successfully!\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n\r\n const msg = restoreResult.needsRefresh\r\n ? '✓ Session refreshed!'\r\n : '✓ Welcome back!';\r\n this.screen.write(centerX - 12, loginY, msg, ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n\r\n // Get nickname from PlayKit\r\n const nickname = await getNickname();\r\n\r\n if (nickname) {\r\n // Has nickname, wait for Enter to start game\r\n await this.waitForGameStart(nickname);\r\n return nickname;\r\n } else {\r\n // No nickname set, prompt user to set one\r\n this.screen.write(centerX - 15, loginY + 2, 'You need to set a nickname first', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n await this.sleep(1000);\r\n\r\n const newNickname = await this.promptSetNickname();\r\n await this.waitForGameStart(newNickname);\r\n return newNickname;\r\n }\r\n }\r\n\r\n // No saved auth or restore failed - show login UI\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n\r\n // Show \"Press ENTER to login\" message\r\n this.screen.write(centerX - 15, loginY, 'Login required to play', ANSI.fg.gray);\r\n this.screen.write(centerX - 15, loginY + 2, '▶ Press ENTER to Login ◀', ANSI.fg.cyan);\r\n this.screen.write(centerX - 10, loginY + 4, 'Esc to quit', ANSI.fg.gray);\r\n this.screen.forceRedraw();\r\n\r\n // Wait for Enter key\r\n await this.waitForLoginKey();\r\n\r\n // Now start the login process\r\n let playerName = '';\r\n let spinnerFrame = 0;\r\n let spinnerInterval: NodeJS.Timeout | null = null;\r\n let showingQR = false;\r\n let qrCode = '';\r\n\r\n const startSpinner = () => {\r\n spinnerInterval = setInterval(() => {\r\n spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;\r\n }, 100);\r\n };\r\n\r\n const stopSpinner = () => {\r\n if (spinnerInterval) {\r\n clearInterval(spinnerInterval);\r\n spinnerInterval = null;\r\n }\r\n };\r\n\r\n const getSpinner = () => SPINNER_FRAMES[spinnerFrame];\r\n\r\n try {\r\n // Step 1: Show \"Preparing login...\" with spinner\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 15, loginY, `${getSpinner()} Preparing login...`, ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n startSpinner();\r\n\r\n // Initiate login to get URL\r\n const loginInfo = await initiateLogin();\r\n\r\n // Generate QR code in background\r\n qrCode = await generateQRCode(loginInfo.authUrl);\r\n\r\n // Helper to redraw the waiting screen\r\n const redrawWaitingScreen = () => {\r\n this.screen.clear();\r\n\r\n let contentY = 2;\r\n\r\n if (!showingQR) {\r\n contentY = this.drawAsciiTitle();\r\n contentY += 2;\r\n\r\n this.screen.write(centerX - 10, contentY++, 'Please visit:', ANSI.fg.white);\r\n contentY++;\r\n\r\n const url = loginInfo.authUrl;\r\n const maxLen = width - 10;\r\n const displayUrl = url.length > maxLen ? url.slice(0, maxLen - 3) + '...' : url;\r\n this.screen.write(centerX - Math.floor(displayUrl.length / 2), contentY++, displayUrl, ANSI.fg.cyan);\r\n contentY += 2;\r\n\r\n this.screen.write(centerX - 18, contentY, `${getSpinner()} Waiting for authentication...`, ANSI.fg.yellow);\r\n contentY += 2;\r\n\r\n this.screen.write(centerX - 20, contentY++, 'Enter: Open in browser', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Q: Show QR code (hide title)', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Esc: Cancel', ANSI.fg.gray);\r\n } else {\r\n contentY = 1;\r\n\r\n const qrLines = qrCode.split('\\n');\r\n for (const line of qrLines) {\r\n if (line.trim()) {\r\n this.screen.write(centerX - Math.floor(line.length / 2), contentY++, line, ANSI.fg.white);\r\n }\r\n }\r\n contentY++;\r\n\r\n const url = loginInfo.authUrl;\r\n const maxLen = width - 4;\r\n const displayUrl = url.length > maxLen ? url.slice(0, maxLen - 3) + '...' : url;\r\n this.screen.write(centerX - Math.floor(displayUrl.length / 2), contentY++, displayUrl, ANSI.fg.cyan);\r\n contentY += 2;\r\n\r\n this.screen.write(centerX - 18, contentY, `${getSpinner()} Waiting for authentication...`, ANSI.fg.yellow);\r\n contentY += 2;\r\n\r\n this.screen.write(centerX - 20, contentY++, 'Enter: Open in browser', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Q: Show title (hide QR)', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Esc: Cancel', ANSI.fg.gray);\r\n }\r\n\r\n this.screen.forceRedraw();\r\n };\r\n\r\n redrawWaitingScreen();\r\n\r\n // Set up key handler\r\n let cancelled = false;\r\n let spinnerUpdateInterval: NodeJS.Timeout | null = null;\r\n\r\n const keyHandler = (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n import('open').then(({ default: openUrl }) => {\r\n openUrl(loginInfo.authUrl).catch(() => {});\r\n }).catch(() => {});\r\n } else if (key.raw === 'q' || key.raw === 'Q') {\r\n showingQR = !showingQR;\r\n redrawWaitingScreen();\r\n } else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\r\n cancelled = true;\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n this.cleanup();\r\n process.exit(0);\r\n }\r\n };\r\n this.input.onKey(keyHandler);\r\n\r\n spinnerUpdateInterval = setInterval(() => {\r\n if (cancelled) return;\r\n redrawWaitingScreen();\r\n }, 100);\r\n\r\n // Wait for login completion\r\n try {\r\n const result = await completeLogin((status) => {\r\n if (cancelled) return;\r\n if (status === 'completed') {\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 12, loginY, '✓ Login successful!', ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n }\r\n });\r\n\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n\r\n if (cancelled) {\r\n throw new Error('Login cancelled');\r\n }\r\n\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 12, loginY, '✓ Login successful!', ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n\r\n const nickname = await getNickname();\r\n\r\n if (nickname) {\r\n playerName = nickname;\r\n } else {\r\n this.screen.write(centerX - 15, loginY + 2, 'Set your adventurer name', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n await this.sleep(1000);\r\n\r\n playerName = await this.promptSetNickname();\r\n }\r\n\r\n await this.waitForGameStart(playerName);\r\n\r\n } catch (loginError) {\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n throw loginError;\r\n }\r\n\r\n } catch (error) {\r\n stopSpinner();\r\n\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 10, loginY, '✗ Login failed', ANSI.fg.red);\r\n this.screen.write(centerX - Math.floor(((error as Error).message || 'Unknown error').length / 2), loginY + 2,\r\n (error as Error).message || 'Unknown error', ANSI.fg.gray);\r\n this.screen.write(centerX - 15, loginY + 4, 'Press any key to exit...', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n await this.input.waitForKey();\r\n this.cleanup();\r\n process.exit(1);\r\n }\r\n\r\n if (playerName) {\r\n return playerName;\r\n }\r\n\r\n const fallbackName = await this.promptSetNickname();\r\n await this.waitForGameStart(fallbackName);\r\n return fallbackName;\r\n }\r\n\r\n /**\r\n * Handle logout from title screen\r\n */\r\n async handleLogout(): Promise<string> {\r\n const { width } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n\r\n this.screen.clear();\r\n const logoY = this.drawAsciiTitle();\r\n const contentY = logoY + 3;\r\n\r\n this.screen.write(centerX - 10, contentY, 'Logging out...', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n try {\r\n await logout();\r\n this.screen.write(centerX - 15, contentY + 2, '✓ Logged out successfully', ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n await this.sleep(1000);\r\n\r\n // Restart the title screen flow\r\n return await this.showTitleScreen();\r\n } catch (error) {\r\n this.screen.write(centerX - 10, contentY + 2, '✗ Logout failed', ANSI.fg.red);\r\n this.screen.forceRedraw();\r\n await this.sleep(1500);\r\n return await this.showTitleScreen();\r\n }\r\n }\r\n\r\n private sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"ef6e7c8a-038d-5626-a154-8076ba6d2206"}