@rpgjs/client 5.0.0-beta.2 → 5.0.0-beta.22

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 (325) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/dist/Game/AnimationManager.d.ts +2 -1
  3. package/dist/Game/AnimationManager.js +21 -9
  4. package/dist/Game/AnimationManager.js.map +1 -1
  5. package/dist/Game/AnimationManager.spec.d.ts +1 -0
  6. package/dist/Game/ClientVisuals.d.ts +61 -0
  7. package/dist/Game/ClientVisuals.js +96 -0
  8. package/dist/Game/ClientVisuals.js.map +1 -0
  9. package/dist/Game/ClientVisuals.spec.d.ts +1 -0
  10. package/dist/Game/Event.js.map +1 -1
  11. package/dist/Game/EventComponentResolver.d.ts +16 -0
  12. package/dist/Game/EventComponentResolver.js +52 -0
  13. package/dist/Game/EventComponentResolver.js.map +1 -0
  14. package/dist/Game/EventComponentResolver.spec.d.ts +1 -0
  15. package/dist/Game/Map.d.ts +9 -1
  16. package/dist/Game/Map.js +83 -5
  17. package/dist/Game/Map.js.map +1 -1
  18. package/dist/Game/Object.d.ts +49 -15
  19. package/dist/Game/Object.js +101 -42
  20. package/dist/Game/Object.js.map +1 -1
  21. package/dist/Game/Object.spec.d.ts +1 -0
  22. package/dist/Game/Player.js.map +1 -1
  23. package/dist/Game/ProjectileManager.d.ts +98 -0
  24. package/dist/Game/ProjectileManager.js +196 -0
  25. package/dist/Game/ProjectileManager.js.map +1 -0
  26. package/dist/Game/ProjectileManager.spec.d.ts +1 -0
  27. package/dist/Gui/Gui.d.ts +20 -6
  28. package/dist/Gui/Gui.js +132 -57
  29. package/dist/Gui/Gui.js.map +1 -1
  30. package/dist/Gui/Gui.spec.d.ts +1 -0
  31. package/dist/Gui/NotificationManager.js.map +1 -1
  32. package/dist/Resource.js +1 -1
  33. package/dist/Resource.js.map +1 -1
  34. package/dist/RpgClient.d.ts +194 -15
  35. package/dist/RpgClientEngine.d.ts +191 -19
  36. package/dist/RpgClientEngine.js +693 -74
  37. package/dist/RpgClientEngine.js.map +1 -1
  38. package/dist/Sound.js.map +1 -1
  39. package/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.133.0/helpers/esm}/decorate.js +1 -1
  40. package/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.133.0/helpers/esm}/decorateMetadata.js +1 -1
  41. package/dist/_virtual/_rolldown/runtime.js +13 -0
  42. package/dist/components/animations/animation.ce.js +6 -5
  43. package/dist/components/animations/animation.ce.js.map +1 -1
  44. package/dist/components/animations/fx.ce.js +60 -0
  45. package/dist/components/animations/fx.ce.js.map +1 -0
  46. package/dist/components/animations/hit.ce.js +24 -28
  47. package/dist/components/animations/hit.ce.js.map +1 -1
  48. package/dist/components/animations/index.d.ts +1 -0
  49. package/dist/components/animations/index.js +6 -4
  50. package/dist/components/animations/index.js.map +1 -1
  51. package/dist/components/character.ce.js +748 -249
  52. package/dist/components/character.ce.js.map +1 -1
  53. package/dist/components/dynamics/bar.ce.js +99 -0
  54. package/dist/components/dynamics/bar.ce.js.map +1 -0
  55. package/dist/components/dynamics/image.ce.js +26 -0
  56. package/dist/components/dynamics/image.ce.js.map +1 -0
  57. package/dist/components/dynamics/parse-value.d.ts +3 -0
  58. package/dist/components/dynamics/parse-value.js +54 -35
  59. package/dist/components/dynamics/parse-value.js.map +1 -1
  60. package/dist/components/dynamics/parse-value.spec.d.ts +1 -0
  61. package/dist/components/dynamics/shape-utils.d.ts +16 -0
  62. package/dist/components/dynamics/shape-utils.js +73 -0
  63. package/dist/components/dynamics/shape-utils.js.map +1 -0
  64. package/dist/components/dynamics/shape-utils.spec.d.ts +1 -0
  65. package/dist/components/dynamics/shape.ce.js +86 -0
  66. package/dist/components/dynamics/shape.ce.js.map +1 -0
  67. package/dist/components/dynamics/text.ce.js +36 -56
  68. package/dist/components/dynamics/text.ce.js.map +1 -1
  69. package/dist/components/gui/box.ce.js +9 -9
  70. package/dist/components/gui/box.ce.js.map +1 -1
  71. package/dist/components/gui/dialogbox/index.ce.js +75 -65
  72. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  73. package/dist/components/gui/gameover.ce.js +47 -68
  74. package/dist/components/gui/gameover.ce.js.map +1 -1
  75. package/dist/components/gui/hud/hud.ce.js +23 -31
  76. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  77. package/dist/components/gui/menu/equip-menu.ce.js +121 -172
  78. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  79. package/dist/components/gui/menu/exit-menu.ce.js +15 -10
  80. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  81. package/dist/components/gui/menu/items-menu.ce.js +62 -77
  82. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  83. package/dist/components/gui/menu/main-menu.ce.js +89 -104
  84. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  85. package/dist/components/gui/menu/options-menu.ce.js +12 -8
  86. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  87. package/dist/components/gui/menu/skills-menu.ce.js +17 -19
  88. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  89. package/dist/components/gui/mobile/index.d.ts +51 -2
  90. package/dist/components/gui/mobile/index.js +14 -6
  91. package/dist/components/gui/mobile/index.js.map +1 -1
  92. package/dist/components/gui/mobile/index.spec.d.ts +1 -0
  93. package/dist/components/gui/mobile/mobile.ce.js +309 -59
  94. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  95. package/dist/components/gui/notification/notification.ce.js +28 -26
  96. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  97. package/dist/components/gui/save-load.ce.js +81 -256
  98. package/dist/components/gui/save-load.ce.js.map +1 -1
  99. package/dist/components/gui/shop/shop.ce.js +107 -142
  100. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  101. package/dist/components/gui/title-screen.ce.js +50 -73
  102. package/dist/components/gui/title-screen.ce.js.map +1 -1
  103. package/dist/components/index.d.ts +2 -1
  104. package/dist/components/index.js +1 -0
  105. package/dist/components/interaction-components.ce.js +22 -0
  106. package/dist/components/interaction-components.ce.js.map +1 -0
  107. package/dist/components/player-components-utils.d.ts +67 -0
  108. package/dist/components/player-components-utils.js +162 -0
  109. package/dist/components/player-components-utils.js.map +1 -0
  110. package/dist/components/player-components-utils.spec.d.ts +1 -0
  111. package/dist/components/player-components.ce.js +191 -0
  112. package/dist/components/player-components.ce.js.map +1 -0
  113. package/dist/components/prebuilt/hp-bar.ce.js +45 -45
  114. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  115. package/dist/components/prebuilt/light-halo.ce.js +39 -60
  116. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  117. package/dist/components/scenes/canvas.ce.js +205 -27
  118. package/dist/components/scenes/canvas.ce.js.map +1 -1
  119. package/dist/components/scenes/draw-map.ce.js +39 -39
  120. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  121. package/dist/components/scenes/event-layer.ce.js +51 -10
  122. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  123. package/dist/core/inject.js +1 -1
  124. package/dist/core/inject.js.map +1 -1
  125. package/dist/core/setup.js +1 -1
  126. package/dist/core/setup.js.map +1 -1
  127. package/dist/decorators/spritesheet.d.ts +1 -0
  128. package/dist/decorators/spritesheet.js +11 -0
  129. package/dist/decorators/spritesheet.js.map +1 -0
  130. package/dist/i18n.d.ts +55 -0
  131. package/dist/i18n.js +60 -0
  132. package/dist/i18n.js.map +1 -0
  133. package/dist/i18n.spec.d.ts +1 -0
  134. package/dist/index.d.ts +8 -0
  135. package/dist/index.js +29 -21
  136. package/dist/module.js +45 -4
  137. package/dist/module.js.map +1 -1
  138. package/dist/node_modules/.pnpm/{@signe_di@2.9.0 → @signe_di@3.1.0}/node_modules/@signe/di/dist/index.js +7 -117
  139. package/dist/node_modules/.pnpm/@signe_di@3.1.0/node_modules/@signe/di/dist/index.js.map +1 -0
  140. package/dist/node_modules/.pnpm/@signe_reactive@3.1.0/node_modules/@signe/reactive/dist/index.js +239 -0
  141. package/dist/node_modules/.pnpm/@signe_reactive@3.1.0/node_modules/@signe/reactive/dist/index.js.map +1 -0
  142. package/dist/node_modules/.pnpm/@signe_room@3.1.0_react@19.2.7/node_modules/@signe/room/dist/chunk-EUXUH3YW.js +13 -0
  143. package/dist/node_modules/.pnpm/@signe_room@3.1.0_react@19.2.7/node_modules/@signe/room/dist/chunk-EUXUH3YW.js.map +1 -0
  144. package/dist/node_modules/.pnpm/@signe_room@3.1.0_react@19.2.7/node_modules/@signe/room/dist/index.js +698 -0
  145. package/dist/node_modules/.pnpm/@signe_room@3.1.0_react@19.2.7/node_modules/@signe/room/dist/index.js.map +1 -0
  146. package/dist/node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/client/index.js +43 -0
  147. package/dist/node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/client/index.js.map +1 -0
  148. package/dist/node_modules/.pnpm/{@signe_sync@2.9.0 → @signe_sync@3.1.0_react@19.2.7}/node_modules/@signe/sync/dist/index.js +57 -141
  149. package/dist/node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/index.js.map +1 -0
  150. package/dist/node_modules/.pnpm/{partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js → partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/index.js} +30 -17
  151. package/dist/node_modules/.pnpm/partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/index.js.map +1 -0
  152. package/dist/node_modules/.pnpm/{partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js → partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/ws.js} +65 -34
  153. package/dist/node_modules/.pnpm/partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/ws.js.map +1 -0
  154. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js +13 -0
  155. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js.map +1 -0
  156. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js +106 -0
  157. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js.map +1 -0
  158. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js +13 -0
  159. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js.map +1 -0
  160. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js +121 -0
  161. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js.map +1 -0
  162. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js +10 -0
  163. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
  164. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js +110 -0
  165. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
  166. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js +99 -0
  167. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js.map +1 -0
  168. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js +82 -0
  169. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js.map +1 -0
  170. package/dist/node_modules/.pnpm/{zod@3.24.2/node_modules/zod/lib/index.js → zod@3.25.76/node_modules/zod/v3/types.js} +74 -611
  171. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js.map +1 -0
  172. package/dist/presets/animation.js.map +1 -1
  173. package/dist/presets/faceset.js.map +1 -1
  174. package/dist/presets/icon.js.map +1 -1
  175. package/dist/presets/index.js.map +1 -1
  176. package/dist/presets/lpc.js.map +1 -1
  177. package/dist/presets/rmspritesheet.js.map +1 -1
  178. package/dist/services/AbstractSocket.d.ts +2 -0
  179. package/dist/services/AbstractSocket.js.map +1 -1
  180. package/dist/services/actionInput.d.ts +14 -0
  181. package/dist/services/actionInput.js +59 -0
  182. package/dist/services/actionInput.js.map +1 -0
  183. package/dist/services/actionInput.spec.d.ts +1 -0
  184. package/dist/services/cameraFollow.d.ts +51 -0
  185. package/dist/services/cameraFollow.js +134 -0
  186. package/dist/services/cameraFollow.js.map +1 -0
  187. package/dist/services/cameraFollow.spec.d.ts +1 -0
  188. package/dist/services/interactions.d.ts +159 -0
  189. package/dist/services/interactions.js +460 -0
  190. package/dist/services/interactions.js.map +1 -0
  191. package/dist/services/interactions.spec.d.ts +1 -0
  192. package/dist/services/keyboardControls.d.ts +1 -0
  193. package/dist/services/keyboardControls.js +1 -0
  194. package/dist/services/keyboardControls.js.map +1 -1
  195. package/dist/services/loadMap.d.ts +9 -0
  196. package/dist/services/loadMap.js +1 -1
  197. package/dist/services/loadMap.js.map +1 -1
  198. package/dist/services/mmorpg-connection.d.ts +5 -0
  199. package/dist/services/mmorpg-connection.js +50 -0
  200. package/dist/services/mmorpg-connection.js.map +1 -0
  201. package/dist/services/mmorpg-connection.spec.d.ts +1 -0
  202. package/dist/services/mmorpg.d.ts +11 -4
  203. package/dist/services/mmorpg.js +57 -33
  204. package/dist/services/mmorpg.js.map +1 -1
  205. package/dist/services/pointerContext.d.ts +11 -0
  206. package/dist/services/pointerContext.js +48 -0
  207. package/dist/services/pointerContext.js.map +1 -0
  208. package/dist/services/pointerContext.spec.d.ts +1 -0
  209. package/dist/services/save.js.map +1 -1
  210. package/dist/services/save.spec.d.ts +1 -0
  211. package/dist/services/standalone-message.d.ts +1 -0
  212. package/dist/services/standalone-message.js +9 -0
  213. package/dist/services/standalone-message.js.map +1 -0
  214. package/dist/services/standalone.d.ts +4 -1
  215. package/dist/services/standalone.js +36 -16
  216. package/dist/services/standalone.js.map +1 -1
  217. package/dist/services/standalone.spec.d.ts +1 -0
  218. package/dist/utils/getEntityProp.js +4 -3
  219. package/dist/utils/getEntityProp.js.map +1 -1
  220. package/dist/utils/getEntityProp.spec.d.ts +1 -0
  221. package/dist/utils/mapId.d.ts +1 -0
  222. package/dist/utils/mapId.js +6 -0
  223. package/dist/utils/mapId.js.map +1 -0
  224. package/dist/utils/readPropValue.d.ts +2 -0
  225. package/dist/utils/readPropValue.js +13 -0
  226. package/dist/utils/readPropValue.js.map +1 -0
  227. package/package.json +13 -13
  228. package/src/Game/AnimationManager.spec.ts +30 -0
  229. package/src/Game/AnimationManager.ts +26 -10
  230. package/src/Game/ClientVisuals.spec.ts +56 -0
  231. package/src/Game/ClientVisuals.ts +184 -0
  232. package/src/Game/EventComponentResolver.spec.ts +84 -0
  233. package/src/Game/EventComponentResolver.ts +74 -0
  234. package/src/Game/Map.ts +134 -2
  235. package/src/Game/Object.spec.ts +59 -0
  236. package/src/Game/Object.ts +181 -77
  237. package/src/Game/ProjectileManager.spec.ts +449 -0
  238. package/src/Game/ProjectileManager.ts +346 -0
  239. package/src/Gui/Gui.spec.ts +359 -0
  240. package/src/Gui/Gui.ts +178 -67
  241. package/src/Resource.ts +1 -2
  242. package/src/RpgClient.ts +220 -17
  243. package/src/RpgClientEngine.ts +995 -133
  244. package/src/components/animations/fx.ce +101 -0
  245. package/src/components/animations/index.ts +4 -2
  246. package/src/components/character.ce +839 -45
  247. package/src/components/dynamics/bar.ce +88 -0
  248. package/src/components/dynamics/image.ce +21 -0
  249. package/src/components/dynamics/parse-value.spec.ts +83 -0
  250. package/src/components/dynamics/parse-value.ts +111 -37
  251. package/src/components/dynamics/shape-utils.spec.ts +46 -0
  252. package/src/components/dynamics/shape-utils.ts +61 -0
  253. package/src/components/dynamics/shape.ce +90 -0
  254. package/src/components/dynamics/text.ce +35 -149
  255. package/src/components/gui/dialogbox/index.ce +52 -21
  256. package/src/components/gui/gameover.ce +6 -4
  257. package/src/components/gui/menu/equip-menu.ce +11 -9
  258. package/src/components/gui/menu/exit-menu.ce +6 -4
  259. package/src/components/gui/menu/items-menu.ce +11 -9
  260. package/src/components/gui/menu/main-menu.ce +14 -12
  261. package/src/components/gui/menu/options-menu.ce +4 -3
  262. package/src/components/gui/menu/skills-menu.ce +2 -1
  263. package/src/components/gui/mobile/index.spec.ts +94 -0
  264. package/src/components/gui/mobile/index.ts +74 -6
  265. package/src/components/gui/mobile/mobile.ce +347 -65
  266. package/src/components/gui/notification/notification.ce +7 -1
  267. package/src/components/gui/save-load.ce +13 -11
  268. package/src/components/gui/shop/shop.ce +20 -18
  269. package/src/components/gui/title-screen.ce +6 -4
  270. package/src/components/index.ts +2 -1
  271. package/src/components/interaction-components.ce +23 -0
  272. package/src/components/player-components-utils.spec.ts +109 -0
  273. package/src/components/player-components-utils.ts +205 -0
  274. package/src/components/player-components.ce +222 -0
  275. package/src/components/prebuilt/hp-bar.ce +4 -3
  276. package/src/components/prebuilt/light-halo.ce +2 -2
  277. package/src/components/scenes/canvas.ce +219 -15
  278. package/src/components/scenes/draw-map.ce +34 -22
  279. package/src/components/scenes/event-layer.ce +55 -4
  280. package/src/core/setup.ts +2 -2
  281. package/src/decorators/spritesheet.ts +8 -0
  282. package/src/i18n.spec.ts +39 -0
  283. package/src/i18n.ts +59 -0
  284. package/src/index.ts +19 -0
  285. package/src/module.ts +61 -11
  286. package/src/services/AbstractSocket.ts +3 -0
  287. package/src/services/actionInput.spec.ts +155 -0
  288. package/src/services/actionInput.ts +120 -0
  289. package/src/services/cameraFollow.spec.ts +220 -0
  290. package/src/services/cameraFollow.ts +222 -0
  291. package/src/services/interactions.spec.ts +175 -0
  292. package/src/services/interactions.ts +722 -0
  293. package/src/services/keyboardControls.ts +2 -1
  294. package/src/services/loadMap.ts +5 -1
  295. package/src/services/mmorpg-connection.spec.ts +99 -0
  296. package/src/services/mmorpg-connection.ts +69 -0
  297. package/src/services/mmorpg.ts +70 -36
  298. package/src/services/pointerContext.spec.ts +36 -0
  299. package/src/services/pointerContext.ts +84 -0
  300. package/src/services/save.spec.ts +127 -0
  301. package/src/services/standalone-message.ts +7 -0
  302. package/src/services/standalone.spec.ts +54 -0
  303. package/src/services/standalone.ts +44 -12
  304. package/src/utils/getEntityProp.spec.ts +96 -0
  305. package/src/utils/getEntityProp.ts +4 -3
  306. package/src/utils/mapId.ts +2 -0
  307. package/src/utils/readPropValue.ts +16 -0
  308. package/dist/node_modules/.pnpm/@signe_di@2.9.0/node_modules/@signe/di/dist/index.js.map +0 -1
  309. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js +0 -457
  310. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js.map +0 -1
  311. package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js +0 -463
  312. package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js.map +0 -1
  313. package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js +0 -2191
  314. package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js.map +0 -1
  315. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/chunk-7QVYU63E.js +0 -10
  316. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/chunk-7QVYU63E.js.map +0 -1
  317. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js +0 -91
  318. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js.map +0 -1
  319. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/index.js.map +0 -1
  320. package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js +0 -14
  321. package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js.map +0 -1
  322. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +0 -1
  323. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +0 -1
  324. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/index.js +0 -2
  325. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +0 -1
@@ -1,44 +1,45 @@
1
1
  import { inject } from "../../../core/inject.js";
2
2
  import { RpgClientEngine } from "../../../RpgClientEngine.js";
3
- import { DOMContainer, DOMElement, DOMSprite, computed, cond, effect, h, loop, useDefineProps, useProps } from "canvasengine";
3
+ import { DOMContainer, DOMElement, DOMSprite, computed, cond, effect, h, loop, useDefineEmits, useDefineProps, useProps } from "canvasengine";
4
4
  //#region src/components/gui/notification/notification.ce
5
- if (typeof document !== "undefined" && !document.getElementById("ce-style--home-runner-work-RPG-JS-RPG-JS-packages-client-src-components-gui-notification-notification-ce")) {
6
- const styleElement = document.createElement("style");
7
- styleElement.id = "ce-style--home-runner-work-RPG-JS-RPG-JS-packages-client-src-components-gui-notification-notification-ce";
5
+ if (typeof document !== "undefined") {
6
+ let styleElement = document.getElementById("ce-style--home-runner-work-RPG-JS-RPG-JS-packages-client-src-components-gui-notification-notification-ce");
7
+ if (!styleElement) {
8
+ styleElement = document.createElement("style");
9
+ styleElement.id = "ce-style--home-runner-work-RPG-JS-RPG-JS-packages-client-src-components-gui-notification-notification-ce";
10
+ document.head.appendChild(styleElement);
11
+ }
8
12
  styleElement.textContent = ".notification {\n pointer-events: none !important;\n }";
9
- document.head.appendChild(styleElement);
10
13
  }
11
14
  function component($$props) {
12
15
  useProps($$props);
13
16
  useDefineProps($$props);
14
- var engine = inject(RpgClientEngine);
15
- var notifications = computed(function() {
16
- return engine.notificationManager.stack();
17
+ useDefineEmits($$props);
18
+ const engine = inject(RpgClientEngine);
19
+ const notifications = computed(() => engine.notificationManager.stack());
20
+ const iconSheet = (iconId) => ({
21
+ definition: engine.getSpriteSheet(iconId),
22
+ playing: "default"
17
23
  });
18
- var iconSheet = function(iconId) {
19
- return {
20
- definition: engine.getSpriteSheet(iconId),
21
- playing: "default"
22
- };
23
- };
24
- effect(function() {
25
- var list = notifications();
26
- var rowHeight = 68;
27
- list.forEach(function(notif, index) {
24
+ effect(() => {
25
+ const list = notifications();
26
+ const rowHeight = 68;
27
+ list.forEach((notif, index) => {
28
28
  notif.layoutY.set(index * rowHeight);
29
29
  });
30
30
  });
31
- var notificationStyle = function(notif) {
32
- return {
33
- opacity: notif.opacity(),
34
- transform: "translateY(".concat(notif.layoutY() + notif.offset(), "px)")
35
- };
36
- };
31
+ const notificationStyle = (notif) => ({
32
+ opacity: notif.opacity(),
33
+ transform: `translateY(${notif.layoutY() + notif.offset()}px)`
34
+ });
37
35
  return h(DOMContainer, {
38
36
  width: "100%",
39
37
  height: "100%",
40
38
  zIndex: 100,
41
- attrs: { class: "notification" }
39
+ attrs: {
40
+ class: "notification",
41
+ style: "pointer-events: none !important;"
42
+ }
42
43
  }, h(DOMElement, {
43
44
  element: "div",
44
45
  attrs: { class: "rpg-ui-notifications" }
@@ -58,7 +59,8 @@ function component($$props) {
58
59
  textContent: notif.message
59
60
  })]))));
60
61
  }
62
+ var __ce_component = component;
61
63
  //#endregion
62
- export { component as default };
64
+ export { __ce_component as default };
63
65
 
64
66
  //# sourceMappingURL=notification.ce.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification.ce.js","names":[],"sources":["../../../../src/components/gui/notification/notification.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" zIndex={100} class=\"notification\">\n <div class=\"rpg-ui-notifications\">\n @for ((notif,index) of notifications) {\n <div\n class=\"rpg-ui-notification\"\n data-type={notif.type || \"info\"}\n style={notificationStyle(notif)}\n >\n @if (notif.icon) {\n <div class=\"rpg-ui-notification-icon\">\n <DOMSprite sheet={iconSheet(notif.icon)} />\n </div>\n }\n <div class=\"rpg-ui-notification-message\">{notif.message}</div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<style>\n .notification {\n pointer-events: none !important;\n }\n</style>\n\n<script>\n import { effect, computed } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const notifications = computed(() => engine.notificationManager.stack());\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n });\n\n effect(() => {\n const list = notifications();\n const rowHeight = 68;\n list.forEach((notif, index) => {\n notif.layoutY.set(index * rowHeight);\n });\n });\n\n const notificationStyle = (notif) => ({\n opacity: notif.opacity(),\n transform: `translateY(${notif.layoutY() + notif.offset()}px)`\n });\n</script>\n"],"mappings":";;;;AAUA,IAAI,OAAO,aAAa,eAAW,CAAK,SAAE,eAAsB,2GAAE,EAAA;CAChE,MAAM,eAAc,SAAG,cAAA,QAAA;AACvB,cAAa,KAAC;AACd,cAAa,cAAa;AAC1B,UAAS,KAAG,YAAG,aAAA;;AAGf,SAAY,UAAA,SAAA;;AAER,gBAAA,QAAA;CACD,IAAA,SAAa,OAAA,gBAAA;CAClB,IAAI,gBAAY,SAAa,WAAU;AAAA,SAAA,OAAA,oBAAA,OAAA;GAAA;CACvC,IAAI,YAAA,SAAA,QAAA;AAAA,SAAA;GACF,YAAK,OAAA,eAAA,OAAA;;GAEN;;AACD,QAAI,WAAe;EACf,IAAA,OAAS,eAAiB;EAC1B,IAAA,YAAS;;AAET,SAAM,QAAS,IAAO,QAAA,UAAgB;IACtC;;CAEJ,IAAI,oBAAmB,SAAW,OAAC;AAAA,SAAA;GAC/B,SAAI,MAAW,SAAQ;GACvB,WAAW,cAAU,OAAA,MAAA,SAAA,GAAA,MAAA,QAAA,EAAA,MAAA;GACxB;;AAEG,QAAA,EAAA,cAAA"}
1
+ {"version":3,"file":"notification.ce.js","names":[],"sources":["../../../../src/components/gui/notification/notification.ce"],"sourcesContent":["<DOMContainer\n width=\"100%\"\n height=\"100%\"\n zIndex={100}\n class=\"notification\"\n style=\"pointer-events: none !important;\"\n>\n <div class=\"rpg-ui-notifications\">\n @for ((notif,index) of notifications) {\n <div\n class=\"rpg-ui-notification\"\n data-type={notif.type || \"info\"}\n style={notificationStyle(notif)}\n >\n @if (notif.icon) {\n <div class=\"rpg-ui-notification-icon\">\n <DOMSprite sheet={iconSheet(notif.icon)} />\n </div>\n }\n <div class=\"rpg-ui-notification-message\">{notif.message}</div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<style>\n .notification {\n pointer-events: none !important;\n }\n</style>\n\n<script>\n import { effect, computed } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const notifications = computed(() => engine.notificationManager.stack());\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n });\n\n effect(() => {\n const list = notifications();\n const rowHeight = 68;\n list.forEach((notif, index) => {\n notif.layoutY.set(index * rowHeight);\n });\n });\n\n const notificationStyle = (notif) => ({\n opacity: notif.opacity(),\n transform: `translateY(${notif.layoutY() + notif.offset()}px)`\n });\n</script>\n"],"mappings":";;;;AAUA,IAAI,OAAO,aAAY,aAAO;CAC5B,IAAI,eAAe,SAAM,eAAe,0GAAK;CAC7C,IAAI,CAAC,cAAc;EACjB,eAAQ,SAAA,cAAA,OAAA;EACR,aAAa,KAAI;EACjB,SAAS,KAAK,YAAY,YAAS;CACrC;CACA,aAAa,cAAU;AACzB;AAEM,SAAQ,UAAG,SAAA;CACT,SAAA,OAAA;CACC,eAAA,OAAA;CACK,eAAA,OAAA;;CAEd,MAAM,gBAAA,eAAA,OAAA,oBAAA,MAAA,CAAA;CACN,MAAK,aAAa,YAAA;EACd,YAAY,OAAO,eAAO,MAAS;EACnC,SAAA;CACJ;;EAEC,MAAM,OAAA,cAAA;EACH,MAAM,YAAW;EACjB,KAAA,SAAS,OAAS,UAAa;GAC/B,MAAS,QAAA,IAAA,QAAkB,SAAY;;CAE3C,CAAC;CACD,MAAI,qBAAsB,WAAY;;EAElC,WAAM,cAAmB,MAAM,QAAA,IAAA,MAAA,OAAA,EAAA;CACnC;CAEM,OADY,EAAA,cAAO;EAAA,OAAA;EAAA,QAAA;EAAA,QAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA;EAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uBAAA;CAAA,GAAA,KAAA,gBAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,aAAA,eAAA,MAAA,QAAA,MAAA;GAAA,OAAA,eAAA,kBAAA,KAAA,CAAA;EAAA;CAAA,GAAA,CAAA,KAAA,MAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;CAAA,GAAA,EAAA,WAAA,EAAA,OAAA,eAAA,UAAA,MAAA,IAAA,CAAA,EAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,aAAA,MAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACnB;;AAGA,IAAE,iBAAa"}
@@ -1,281 +1,105 @@
1
1
  import { inject } from "../../core/inject.js";
2
+ import { getKeyboardControlBind } from "../../services/actionInput.js";
2
3
  import { SaveClientService } from "../../services/save.js";
3
4
  import { RpgGui } from "../../Gui/Gui.js";
4
5
  import { RpgClientEngine } from "../../RpgClientEngine.js";
5
- import { DOMContainer, DOMElement, Navigation, computed, cond, createTabindexNavigator, h, loop, mount, signal, useDefineProps, useProps } from "canvasengine";
6
+ import { DOMContainer, DOMElement, Navigation, computed, cond, createTabindexNavigator, h, loop, mount, signal, useDefineEmits, useDefineProps, useProps } from "canvasengine";
6
7
  import { PrebuiltGui } from "@rpgjs/common";
7
8
  //#region src/components/gui/save-load.ce
8
9
  function component($$props) {
9
10
  useProps($$props);
10
11
  const defineProps = useDefineProps($$props);
11
- var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
12
- function adopt(value) {
13
- return value instanceof P ? value : new P(function(resolve) {
14
- resolve(value);
15
- });
16
- }
17
- return new (P || (P = Promise))(function(resolve, reject) {
18
- function fulfilled(value) {
19
- try {
20
- step(generator.next(value));
21
- } catch (e) {
22
- reject(e);
23
- }
24
- }
25
- function rejected(value) {
26
- try {
27
- step(generator["throw"](value));
28
- } catch (e) {
29
- reject(e);
30
- }
31
- }
32
- function step(result) {
33
- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
34
- }
35
- step((generator = generator.apply(thisArg, _arguments || [])).next());
36
- });
37
- };
38
- var __generator = this && this.__generator || function(thisArg, body) {
39
- var _ = {
40
- label: 0,
41
- sent: function() {
42
- if (t[0] & 1) throw t[1];
43
- return t[1];
44
- },
45
- trys: [],
46
- ops: []
47
- }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
48
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
49
- return this;
50
- }), g;
51
- function verb(n) {
52
- return function(v) {
53
- return step([n, v]);
54
- };
55
- }
56
- function step(op) {
57
- if (f) throw new TypeError("Generator is already executing.");
58
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
59
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
60
- if (y = 0, t) op = [op[0] & 2, t.value];
61
- switch (op[0]) {
62
- case 0:
63
- case 1:
64
- t = op;
65
- break;
66
- case 4:
67
- _.label++;
68
- return {
69
- value: op[1],
70
- done: false
71
- };
72
- case 5:
73
- _.label++;
74
- y = op[1];
75
- op = [0];
76
- continue;
77
- case 7:
78
- op = _.ops.pop();
79
- _.trys.pop();
80
- continue;
81
- default:
82
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
83
- _ = 0;
84
- continue;
85
- }
86
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
87
- _.label = op[1];
88
- break;
89
- }
90
- if (op[0] === 6 && _.label < t[1]) {
91
- _.label = t[1];
92
- t = op;
93
- break;
94
- }
95
- if (t && _.label < t[2]) {
96
- _.label = t[2];
97
- _.ops.push(op);
98
- break;
99
- }
100
- if (t[2]) _.ops.pop();
101
- _.trys.pop();
102
- continue;
103
- }
104
- op = body.call(thisArg, _);
105
- } catch (e) {
106
- op = [6, e];
107
- y = 0;
108
- } finally {
109
- f = t = 0;
110
- }
111
- if (op[0] & 5) throw op[1];
112
- return {
113
- value: op[0] ? op[1] : void 0,
114
- done: true
115
- };
116
- }
117
- };
118
- var __spreadArray = this && this.__spreadArray || function(to, from, pack) {
119
- if (pack || arguments.length === 2) {
120
- for (var i = 0, l = from.length, ar; i < l; i++) if (ar || !(i in from)) {
121
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
122
- ar[i] = from[i];
123
- }
124
- }
125
- return to.concat(ar || Array.prototype.slice.call(from));
126
- };
127
- var engine = inject(RpgClientEngine);
128
- var saveClient = inject(SaveClientService);
129
- var gui = inject(RpgGui);
130
- var keyboardControls = engine.globalConfig.keyboardControls;
131
- var selectedSlot = signal(0);
132
- var DEFAULT_SLOTS = 4;
133
- var defaultSlots = function() {
134
- return Array.from({ length: DEFAULT_SLOTS }, function() {
135
- return null;
136
- });
137
- };
138
- var localSlots = signal(defaultSlots());
139
- var _a = defineProps(), data = _a.data, onFinish = _a.onFinish;
140
- var title = computed(function() {
141
- return data().mode === "save" ? "Save Game" : "Load Game";
142
- });
143
- var subtitle = computed(function() {
144
- return data().mode === "save" ? "Choose a slot to overwrite or create." : "Select a slot to load your progress.";
145
- });
146
- var slotsValue = computed(function() {
147
- return localSlots();
148
- });
149
- var displaySlots = computed(function() {
150
- var _a;
151
- var slots = slotsValue();
152
- var items = slots.map(function(slot, index) {
153
- return {
154
- kind: "slot",
155
- slot,
156
- slotIndex: index,
157
- label: "Slot ".concat(index + 1),
158
- readonly: false
159
- };
160
- });
12
+ useDefineEmits($$props);
13
+ const engine = inject(RpgClientEngine);
14
+ const { t } = engine.i18n();
15
+ const saveClient = inject(SaveClientService);
16
+ const gui = inject(RpgGui);
17
+ const keyboardControls = engine.globalConfig.keyboardControls;
18
+ const selectedSlot = signal(0);
19
+ const DEFAULT_SLOTS = 4;
20
+ const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);
21
+ const localSlots = signal(defaultSlots());
22
+ const { data, onFinish } = defineProps();
23
+ const title = computed(() => data().mode === "save" ? t("rpg.save.title") : t("rpg.load.title"));
24
+ const subtitle = computed(() => data().mode === "save" ? t("rpg.save.subtitle") : t("rpg.load.subtitle"));
25
+ const slotsValue = computed(() => localSlots());
26
+ const displaySlots = computed(() => {
27
+ const slots = slotsValue();
28
+ const items = slots.map((slot, index) => ({
29
+ kind: "slot",
30
+ slot,
31
+ slotIndex: index,
32
+ label: t("rpg.save.slot", { index: index + 1 }),
33
+ readonly: false
34
+ }));
161
35
  if (!data().showAutoSlot) return items;
162
- var index = typeof data().autoSlotIndex === "number" ? data().autoSlotIndex : 0;
163
- var autoSlot = (_a = slots[index]) !== null && _a !== void 0 ? _a : null;
164
- var readonly = data().mode === "save";
165
- return __spreadArray([{
36
+ const index = typeof data().autoSlotIndex === "number" ? data().autoSlotIndex : 0;
37
+ const autoSlot = slots[index] ?? null;
38
+ const readonly = data().mode === "save";
39
+ return [{
166
40
  kind: "auto",
167
41
  slot: autoSlot,
168
42
  slotIndex: index,
169
- label: data().autoSlotLabel || "Auto Save",
43
+ label: data().autoSlotLabel || t("rpg.save.auto"),
170
44
  readonly
171
- }], items, true);
45
+ }, ...items];
172
46
  });
173
- var nav = createTabindexNavigator(selectedSlot, { count: function() {
174
- return displaySlots().length;
175
- } }, "wrap");
176
- var canSelect = function(item) {
47
+ const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, "wrap");
48
+ const canSelect = (item) => {
177
49
  if (item.readonly) return false;
178
50
  if (data().mode === "load" && !item.slot) return false;
179
51
  return true;
180
52
  };
181
- var normalizeSlotValue = function(value) {
53
+ const normalizeSlotValue = (value) => {
182
54
  if (!value) return null;
183
55
  if (typeof value === "string") try {
184
56
  return JSON.parse(value);
185
- } catch (_a) {
57
+ } catch {
186
58
  return null;
187
59
  }
188
60
  return value;
189
61
  };
190
- var normalizeSlots = function(list) {
62
+ const normalizeSlots = (list) => {
191
63
  if (Array.isArray(list)) {
192
- var length_1 = Math.max(list.length, DEFAULT_SLOTS);
193
- return Array.from({ length: length_1 }, function(_, index) {
194
- return normalizeSlotValue(list[index]);
195
- });
64
+ const length = Math.max(list.length, DEFAULT_SLOTS);
65
+ return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));
196
66
  }
197
67
  if (!list || typeof list !== "object") return defaultSlots();
198
- var keys = Object.keys(list).filter(function(key) {
199
- return /^\d+$/.test(key);
200
- });
201
- var indices = keys.map(function(key) {
202
- return Number(key);
203
- }).filter(function(index) {
204
- return index >= 0;
205
- });
206
- var maxIndex = indices.length ? Math.max.apply(Math, indices) : -1;
207
- var length = Math.max(maxIndex + 1, DEFAULT_SLOTS);
208
- var slots = Array.from({ length }, function() {
209
- return null;
210
- });
211
- keys.forEach(function(key) {
212
- var index = Number(key);
68
+ const keys = Object.keys(list).filter((key) => /^\d+$/.test(key));
69
+ const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);
70
+ const maxIndex = indices.length ? Math.max(...indices) : -1;
71
+ const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);
72
+ const slots = Array.from({ length }, () => null);
73
+ keys.forEach((key) => {
74
+ const index = Number(key);
213
75
  if (index < 0 || index >= length) return;
214
76
  slots[index] = normalizeSlotValue(list[key]);
215
77
  });
216
78
  return slots;
217
79
  };
218
- var refreshSlots = function() {
219
- return __awaiter(void 0, void 0, void 0, function() {
220
- var list;
221
- return __generator(this, function(_a) {
222
- switch (_a.label) {
223
- case 0:
224
- _a.trys.push([
225
- 0,
226
- 2,
227
- ,
228
- 3
229
- ]);
230
- return [4, saveClient.listSlots()];
231
- case 1:
232
- list = _a.sent();
233
- localSlots.set(normalizeSlots(list));
234
- return [3, 3];
235
- case 2:
236
- _a.sent();
237
- localSlots.set(defaultSlots());
238
- return [3, 3];
239
- case 3: return [2];
240
- }
241
- });
242
- });
80
+ const refreshSlots = async () => {
81
+ try {
82
+ const list = await saveClient.listSlots();
83
+ localSlots.set(normalizeSlots(list));
84
+ } catch (err) {
85
+ localSlots.set(defaultSlots());
86
+ }
243
87
  };
244
- var triggerSelect = function(displayIndex) {
245
- return __awaiter(void 0, void 0, void 0, function() {
246
- var list, item, action;
247
- return __generator(this, function(_a) {
248
- switch (_a.label) {
249
- case 0:
250
- list = displaySlots();
251
- item = list[displayIndex];
252
- if (!item) return [2];
253
- if (!canSelect(item)) return [2];
254
- action = data().mode === "save" ? "save" : "load";
255
- if (!(action === "save")) return [3, 3];
256
- return [4, saveClient.saveSlot(item.slotIndex)];
257
- case 1:
258
- _a.sent();
259
- return [4, refreshSlots()];
260
- case 2:
261
- _a.sent();
262
- _a.label = 3;
263
- case 3:
264
- if (!(action === "load")) return [3, 5];
265
- return [4, saveClient.loadSlot(item.slotIndex)];
266
- case 4:
267
- _a.sent();
268
- _a.label = 5;
269
- case 5:
270
- setTimeout(function() {
271
- if (onFinish) onFinish();
272
- gui.hide(PrebuiltGui.Save);
273
- gui.hide(PrebuiltGui.TitleScreen);
274
- }, 50);
275
- return [2];
276
- }
277
- });
278
- });
88
+ const triggerSelect = async (displayIndex) => {
89
+ const item = displaySlots()[displayIndex];
90
+ if (!item) return;
91
+ if (!canSelect(item)) return;
92
+ const action = data().mode === "save" ? "save" : "load";
93
+ if (action === "save") {
94
+ await saveClient.saveSlot(item.slotIndex);
95
+ await refreshSlots();
96
+ }
97
+ if (action === "load") await saveClient.loadSlot(item.slotIndex);
98
+ setTimeout(() => {
99
+ if (onFinish) onFinish();
100
+ gui.hide(PrebuiltGui.Save);
101
+ gui.hide(PrebuiltGui.TitleScreen);
102
+ }, 50);
279
103
  };
280
104
  function selectSlot(index) {
281
105
  return function() {
@@ -283,12 +107,12 @@ function component($$props) {
283
107
  triggerSelect(index);
284
108
  };
285
109
  }
286
- var controls = signal({
110
+ const controls = signal({
287
111
  up: {
288
112
  repeat: true,
289
113
  bind: keyboardControls.up,
290
114
  throttle: 150,
291
- keyDown: function() {
115
+ keyDown() {
292
116
  nav.next(-1);
293
117
  }
294
118
  },
@@ -296,26 +120,26 @@ function component($$props) {
296
120
  repeat: true,
297
121
  bind: keyboardControls.down,
298
122
  throttle: 150,
299
- keyDown: function() {
123
+ keyDown() {
300
124
  nav.next(1);
301
125
  }
302
126
  },
303
127
  action: {
304
- bind: keyboardControls.action,
305
- keyDown: function() {
128
+ bind: getKeyboardControlBind(keyboardControls.action),
129
+ keyDown() {
306
130
  triggerSelect(selectedSlot());
307
131
  }
308
132
  },
309
133
  escape: {
310
134
  bind: keyboardControls.escape,
311
- keyDown: function() {
135
+ keyDown() {
312
136
  if (onFinish) onFinish();
313
137
  gui.hide(PrebuiltGui.Save);
314
138
  }
315
139
  },
316
140
  gamepad: { enabled: true }
317
141
  });
318
- mount(function(element) {
142
+ mount((element) => {
319
143
  refreshSlots();
320
144
  });
321
145
  return h(DOMContainer, {
@@ -360,30 +184,31 @@ function component($$props) {
360
184
  h(DOMElement, {
361
185
  element: "div",
362
186
  attrs: { class: "rpg-ui-save-load-slot-line" },
363
- textContent: "Level: " + item.slot.level
187
+ textContent: t("rpg.save.level") + ": " + item.slot.level
364
188
  }),
365
189
  h(DOMElement, {
366
190
  element: "div",
367
191
  attrs: { class: "rpg-ui-save-load-slot-line" },
368
- textContent: "Exp: " + item.slot.exp
192
+ textContent: t("rpg.save.exp") + ": " + item.slot.exp
369
193
  }),
370
194
  h(DOMElement, {
371
195
  element: "div",
372
196
  attrs: { class: "rpg-ui-save-load-slot-line" },
373
- textContent: "Map: " + item.slot.map
197
+ textContent: t("rpg.save.map") + ": " + item.slot.map
374
198
  }),
375
199
  h(DOMElement, {
376
200
  element: "div",
377
201
  attrs: { class: "rpg-ui-save-load-slot-line" },
378
- textContent: "Date: " + item.slot.date
202
+ textContent: t("rpg.save.date") + ": " + item.slot.date
379
203
  })
380
204
  ]), () => h(DOMElement, {
381
205
  element: "div",
382
206
  attrs: { class: "rpg-ui-save-load-slot-empty" },
383
- textContent: "Empty Slot"
207
+ textContent: computed(() => t("rpg.save.empty-slot"))
384
208
  }))]))))]));
385
209
  }
210
+ var __ce_component = component;
386
211
  //#endregion
387
- export { component as default };
212
+ export { __ce_component as default };
388
213
 
389
214
  //# sourceMappingURL=save-load.ce.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"save-load.ce.js","names":[],"sources":["../../../src/components/gui/save-load.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-save-load rpg-anim-fade-in\">\n <div class=\"rpg-ui-save-load-header\">\n <div class=\"rpg-ui-save-load-title\">{title()}</div>\n <div class=\"rpg-ui-save-load-subtitle\">{subtitle()}</div>\n </div>\n <Navigation tabindex={selectedSlot} controls={controls}>\n <div class=\"rpg-ui-save-load-list\">\n @for ((item,displayIndex) of displaySlots) {\n <div\n class=\"rpg-ui-save-load-slot\"\n class={{active: selectedSlot() === displayIndex}}\n tabindex={displayIndex}\n data-slot-index={displayIndex}\n click={selectSlot(displayIndex)}\n >\n <div class=\"rpg-ui-save-load-slot-index\">{item.label}</div>\n @if (item.slot) {\n <div class=\"rpg-ui-save-load-slot-meta\">\n <div class=\"rpg-ui-save-load-slot-line\">Level: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Exp: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Map: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Date: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">Empty Slot</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? \"Save Game\" : \"Load Game\");\n const subtitle = computed(() => data().mode === \"save\"\n ? \"Choose a slot to overwrite or create.\"\n : \"Select a slot to load your progress.\"\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: `Slot ${index + 1}`,\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || \"Auto Save\",\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"save-load.ce.js","names":[],"sources":["../../../src/components/gui/save-load.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-save-load rpg-anim-fade-in\">\n <div class=\"rpg-ui-save-load-header\">\n <div class=\"rpg-ui-save-load-title\">{title()}</div>\n <div class=\"rpg-ui-save-load-subtitle\">{subtitle()}</div>\n </div>\n <Navigation tabindex={selectedSlot} controls={controls}>\n <div class=\"rpg-ui-save-load-list\">\n @for ((item,displayIndex) of displaySlots) {\n <div\n class=\"rpg-ui-save-load-slot\"\n class={{active: selectedSlot() === displayIndex}}\n tabindex={displayIndex}\n data-slot-index={displayIndex}\n click={selectSlot(displayIndex)}\n >\n <div class=\"rpg-ui-save-load-slot-index\">{item.label}</div>\n @if (item.slot) {\n <div class=\"rpg-ui-save-load-slot-meta\">\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.level\")}: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.exp\")}: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.map\")}: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.date\")}: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">{t(\"rpg.save.empty-slot\")}</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { getKeyboardControlBind } from \"../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? t(\"rpg.save.title\") : t(\"rpg.load.title\"));\n const subtitle = computed(() => data().mode === \"save\"\n ? t(\"rpg.save.subtitle\")\n : t(\"rpg.load.subtitle\")\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: t(\"rpg.save.slot\", { index: index + 1 }),\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || t(\"rpg.save.auto\"),\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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"}