@rpgjs/client 5.0.0-alpha.9 → 5.0.0-beta.10

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 (347) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +19 -0
  3. package/dist/Game/AnimationManager.d.ts +8 -0
  4. package/dist/Game/AnimationManager.js +35 -0
  5. package/dist/Game/AnimationManager.js.map +1 -0
  6. package/dist/Game/AnimationManager.spec.d.ts +1 -0
  7. package/dist/Game/Event.d.ts +1 -1
  8. package/dist/Game/Event.js +12 -0
  9. package/dist/Game/Event.js.map +1 -0
  10. package/dist/Game/Map.d.ts +31 -2
  11. package/dist/Game/Map.js +138 -0
  12. package/dist/Game/Map.js.map +1 -0
  13. package/dist/Game/Object.d.ts +189 -0
  14. package/dist/Game/Object.js +255 -0
  15. package/dist/Game/Object.js.map +1 -0
  16. package/dist/Game/Player.d.ts +1 -1
  17. package/dist/Game/Player.js +12 -0
  18. package/dist/Game/Player.js.map +1 -0
  19. package/dist/Gui/Gui.d.ts +192 -7
  20. package/dist/Gui/Gui.js +475 -0
  21. package/dist/Gui/Gui.js.map +1 -0
  22. package/dist/Gui/Gui.spec.d.ts +1 -0
  23. package/dist/Gui/NotificationManager.d.ts +23 -0
  24. package/dist/Gui/NotificationManager.js +49 -0
  25. package/dist/Gui/NotificationManager.js.map +1 -0
  26. package/dist/Resource.d.ts +97 -0
  27. package/dist/Resource.js +133 -0
  28. package/dist/Resource.js.map +1 -0
  29. package/dist/RpgClient.d.ts +295 -13
  30. package/dist/RpgClientEngine.d.ts +671 -15
  31. package/dist/RpgClientEngine.js +1442 -0
  32. package/dist/RpgClientEngine.js.map +1 -0
  33. package/dist/Sound.d.ts +199 -0
  34. package/dist/Sound.js +167 -0
  35. package/dist/Sound.js.map +1 -0
  36. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js +9 -0
  37. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/decorateMetadata.js +6 -0
  38. package/dist/components/animations/animation.ce.js +23 -0
  39. package/dist/components/animations/animation.ce.js.map +1 -0
  40. package/dist/components/animations/hit.ce.js +64 -0
  41. package/dist/components/animations/hit.ce.js.map +1 -0
  42. package/dist/components/animations/index.d.ts +4 -0
  43. package/dist/components/animations/index.js +11 -0
  44. package/dist/components/animations/index.js.map +1 -0
  45. package/dist/components/character.ce.js +572 -0
  46. package/dist/components/character.ce.js.map +1 -0
  47. package/dist/components/dynamics/bar.ce.js +96 -0
  48. package/dist/components/dynamics/bar.ce.js.map +1 -0
  49. package/dist/components/dynamics/image.ce.js +23 -0
  50. package/dist/components/dynamics/image.ce.js.map +1 -0
  51. package/dist/components/dynamics/parse-value.d.ts +4 -0
  52. package/dist/components/dynamics/parse-value.js +63 -0
  53. package/dist/components/dynamics/parse-value.js.map +1 -0
  54. package/dist/components/dynamics/parse-value.spec.d.ts +1 -0
  55. package/dist/components/dynamics/shape-utils.d.ts +16 -0
  56. package/dist/components/dynamics/shape-utils.js +73 -0
  57. package/dist/components/dynamics/shape-utils.js.map +1 -0
  58. package/dist/components/dynamics/shape-utils.spec.d.ts +1 -0
  59. package/dist/components/dynamics/shape.ce.js +83 -0
  60. package/dist/components/dynamics/shape.ce.js.map +1 -0
  61. package/dist/components/dynamics/text.ce.js +50 -0
  62. package/dist/components/dynamics/text.ce.js.map +1 -0
  63. package/dist/components/gui/box.ce.js +26 -0
  64. package/dist/components/gui/box.ce.js.map +1 -0
  65. package/dist/components/gui/dialogbox/index.ce.js +198 -0
  66. package/dist/components/gui/dialogbox/index.ce.js.map +1 -0
  67. package/dist/components/gui/gameover.ce.js +169 -0
  68. package/dist/components/gui/gameover.ce.js.map +1 -0
  69. package/dist/components/gui/hud/hud.ce.js +83 -0
  70. package/dist/components/gui/hud/hud.ce.js.map +1 -0
  71. package/dist/components/gui/index.d.ts +15 -3
  72. package/dist/components/gui/index.js +14 -0
  73. package/dist/components/gui/menu/equip-menu.ce.js +427 -0
  74. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -0
  75. package/dist/components/gui/menu/exit-menu.ce.js +55 -0
  76. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -0
  77. package/dist/components/gui/menu/items-menu.ce.js +326 -0
  78. package/dist/components/gui/menu/items-menu.ce.js.map +1 -0
  79. package/dist/components/gui/menu/main-menu.ce.js +399 -0
  80. package/dist/components/gui/menu/main-menu.ce.js.map +1 -0
  81. package/dist/components/gui/menu/options-menu.ce.js +49 -0
  82. package/dist/components/gui/menu/options-menu.ce.js.map +1 -0
  83. package/dist/components/gui/menu/skills-menu.ce.js +102 -0
  84. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -0
  85. package/dist/components/gui/mobile/index.d.ts +8 -0
  86. package/dist/components/gui/mobile/index.js +21 -0
  87. package/dist/components/gui/mobile/index.js.map +1 -0
  88. package/dist/components/gui/mobile/mobile.ce.js +79 -0
  89. package/dist/components/gui/mobile/mobile.ce.js.map +1 -0
  90. package/dist/components/gui/notification/notification.ce.js +62 -0
  91. package/dist/components/gui/notification/notification.ce.js.map +1 -0
  92. package/dist/components/gui/save-load.ce.js +211 -0
  93. package/dist/components/gui/save-load.ce.js.map +1 -0
  94. package/dist/components/gui/shop/shop.ce.js +614 -0
  95. package/dist/components/gui/shop/shop.ce.js.map +1 -0
  96. package/dist/components/gui/title-screen.ce.js +164 -0
  97. package/dist/components/gui/title-screen.ce.js.map +1 -0
  98. package/dist/components/index.d.ts +1 -0
  99. package/dist/components/index.js +4 -0
  100. package/dist/components/player-components-utils.d.ts +67 -0
  101. package/dist/components/player-components-utils.js +162 -0
  102. package/dist/components/player-components-utils.js.map +1 -0
  103. package/dist/components/player-components-utils.spec.d.ts +1 -0
  104. package/dist/components/player-components.ce.js +188 -0
  105. package/dist/components/player-components.ce.js.map +1 -0
  106. package/dist/components/prebuilt/hp-bar.ce.js +113 -0
  107. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -0
  108. package/dist/components/prebuilt/index.d.ts +19 -0
  109. package/dist/components/prebuilt/index.js +2 -0
  110. package/dist/components/prebuilt/light-halo.ce.js +70 -0
  111. package/dist/components/prebuilt/light-halo.ce.js.map +1 -0
  112. package/dist/components/scenes/canvas.ce.js +196 -0
  113. package/dist/components/scenes/canvas.ce.js.map +1 -0
  114. package/dist/components/scenes/draw-map.ce.js +79 -0
  115. package/dist/components/scenes/draw-map.ce.js.map +1 -0
  116. package/dist/components/scenes/event-layer.ce.js +29 -0
  117. package/dist/components/scenes/event-layer.ce.js.map +1 -0
  118. package/dist/core/inject.js +18 -0
  119. package/dist/core/inject.js.map +1 -0
  120. package/dist/core/setup.js +16 -0
  121. package/dist/core/setup.js.map +1 -0
  122. package/dist/decorators/spritesheet.d.ts +1 -0
  123. package/dist/decorators/spritesheet.js +11 -0
  124. package/dist/decorators/spritesheet.js.map +1 -0
  125. package/dist/index.d.ts +16 -1
  126. package/dist/index.js +45 -14
  127. package/dist/module.d.ts +43 -4
  128. package/dist/module.js +179 -0
  129. package/dist/module.js.map +1 -0
  130. package/dist/node_modules/.pnpm/@signe_di@3.0.1/node_modules/@signe/di/dist/index.js +167 -0
  131. package/dist/node_modules/.pnpm/@signe_di@3.0.1/node_modules/@signe/di/dist/index.js.map +1 -0
  132. package/dist/node_modules/.pnpm/@signe_reactive@3.0.1/node_modules/@signe/reactive/dist/index.js +239 -0
  133. package/dist/node_modules/.pnpm/@signe_reactive@3.0.1/node_modules/@signe/reactive/dist/index.js.map +1 -0
  134. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/chunk-EUXUH3YW.js +13 -0
  135. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/chunk-EUXUH3YW.js.map +1 -0
  136. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/index.js +696 -0
  137. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/index.js.map +1 -0
  138. package/dist/node_modules/.pnpm/@signe_sync@3.0.1/node_modules/@signe/sync/dist/client/index.js +44 -0
  139. package/dist/node_modules/.pnpm/@signe_sync@3.0.1/node_modules/@signe/sync/dist/client/index.js.map +1 -0
  140. package/dist/node_modules/.pnpm/@signe_sync@3.0.1/node_modules/@signe/sync/dist/index.js +241 -0
  141. package/dist/node_modules/.pnpm/@signe_sync@3.0.1/node_modules/@signe/sync/dist/index.js.map +1 -0
  142. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js +115 -0
  143. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +1 -0
  144. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js +401 -0
  145. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -0
  146. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/index.js +2 -0
  147. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js +3756 -0
  148. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -0
  149. package/dist/presets/animation.d.ts +31 -0
  150. package/dist/presets/animation.js +39 -0
  151. package/dist/presets/animation.js.map +1 -0
  152. package/dist/presets/faceset.d.ts +30 -0
  153. package/dist/presets/faceset.js +51 -0
  154. package/dist/presets/faceset.js.map +1 -0
  155. package/dist/presets/icon.d.ts +20 -0
  156. package/dist/presets/icon.js +15 -0
  157. package/dist/presets/icon.js.map +1 -0
  158. package/dist/presets/index.d.ts +123 -0
  159. package/dist/presets/index.js +17 -0
  160. package/dist/presets/index.js.map +1 -0
  161. package/dist/presets/lpc.d.ts +89 -0
  162. package/dist/presets/lpc.js +98 -0
  163. package/dist/presets/lpc.js.map +1 -0
  164. package/dist/presets/rmspritesheet.js +42 -0
  165. package/dist/presets/rmspritesheet.js.map +1 -0
  166. package/dist/services/AbstractSocket.d.ts +9 -5
  167. package/dist/services/AbstractSocket.js +11 -0
  168. package/dist/services/AbstractSocket.js.map +1 -0
  169. package/dist/services/keyboardControls.d.ts +15 -0
  170. package/dist/services/keyboardControls.js +23 -0
  171. package/dist/services/keyboardControls.js.map +1 -0
  172. package/dist/services/loadMap.d.ts +6 -0
  173. package/dist/services/loadMap.js +123 -0
  174. package/dist/services/loadMap.js.map +1 -0
  175. package/dist/services/mmorpg.d.ts +21 -9
  176. package/dist/services/mmorpg.js +136 -0
  177. package/dist/services/mmorpg.js.map +1 -0
  178. package/dist/services/save.d.ts +19 -0
  179. package/dist/services/save.js +77 -0
  180. package/dist/services/save.js.map +1 -0
  181. package/dist/services/save.spec.d.ts +1 -0
  182. package/dist/services/standalone.d.ts +67 -7
  183. package/dist/services/standalone.js +168 -0
  184. package/dist/services/standalone.js.map +1 -0
  185. package/dist/utils/getEntityProp.d.ts +39 -0
  186. package/dist/utils/getEntityProp.js +53 -0
  187. package/dist/utils/getEntityProp.js.map +1 -0
  188. package/dist/utils/getEntityProp.spec.d.ts +1 -0
  189. package/dist/utils/readPropValue.d.ts +2 -0
  190. package/dist/utils/readPropValue.js +13 -0
  191. package/dist/utils/readPropValue.js.map +1 -0
  192. package/package.json +14 -11
  193. package/src/Game/AnimationManager.spec.ts +30 -0
  194. package/src/Game/AnimationManager.ts +33 -0
  195. package/src/Game/Event.ts +1 -1
  196. package/src/Game/Map.ts +184 -3
  197. package/src/Game/Object.ts +409 -14
  198. package/src/Game/Player.ts +1 -1
  199. package/src/Gui/Gui.spec.ts +273 -0
  200. package/src/Gui/Gui.ts +566 -23
  201. package/src/Gui/NotificationManager.ts +69 -0
  202. package/src/Resource.ts +149 -0
  203. package/src/RpgClient.ts +309 -14
  204. package/src/RpgClientEngine.ts +1790 -63
  205. package/src/Sound.ts +253 -0
  206. package/src/components/{effects → animations}/animation.ce +3 -6
  207. package/src/components/{effects → animations}/index.ts +1 -1
  208. package/src/components/character.ce +801 -59
  209. package/src/components/dynamics/bar.ce +87 -0
  210. package/src/components/dynamics/image.ce +20 -0
  211. package/src/components/dynamics/parse-value.spec.ts +83 -0
  212. package/src/components/dynamics/parse-value.ts +154 -0
  213. package/src/components/dynamics/shape-utils.spec.ts +46 -0
  214. package/src/components/dynamics/shape-utils.ts +61 -0
  215. package/src/components/dynamics/shape.ce +89 -0
  216. package/src/components/dynamics/text.ce +68 -0
  217. package/src/components/gui/box.ce +17 -0
  218. package/src/components/gui/dialogbox/index.ce +213 -187
  219. package/src/components/gui/gameover.ce +158 -0
  220. package/src/components/gui/hud/hud.ce +61 -0
  221. package/src/components/gui/index.ts +30 -4
  222. package/src/components/gui/menu/equip-menu.ce +410 -0
  223. package/src/components/gui/menu/exit-menu.ce +41 -0
  224. package/src/components/gui/menu/items-menu.ce +317 -0
  225. package/src/components/gui/menu/main-menu.ce +294 -0
  226. package/src/components/gui/menu/options-menu.ce +35 -0
  227. package/src/components/gui/menu/skills-menu.ce +83 -0
  228. package/src/components/gui/mobile/index.ts +24 -0
  229. package/src/components/gui/mobile/mobile.ce +80 -0
  230. package/src/components/gui/notification/notification.ce +51 -0
  231. package/src/components/gui/save-load.ce +208 -0
  232. package/src/components/gui/shop/shop.ce +493 -0
  233. package/src/components/gui/title-screen.ce +163 -0
  234. package/src/components/index.ts +3 -0
  235. package/src/components/player-components-utils.spec.ts +109 -0
  236. package/src/components/player-components-utils.ts +205 -0
  237. package/src/components/player-components.ce +221 -0
  238. package/src/components/prebuilt/hp-bar.ce +255 -0
  239. package/src/components/prebuilt/index.ts +24 -0
  240. package/src/components/prebuilt/light-halo.ce +148 -0
  241. package/src/components/scenes/canvas.ce +185 -21
  242. package/src/components/scenes/draw-map.ce +55 -21
  243. package/src/components/scenes/event-layer.ce +8 -2
  244. package/src/components/scenes/transition.ce +60 -0
  245. package/src/core/setup.ts +2 -2
  246. package/src/decorators/spritesheet.ts +8 -0
  247. package/src/index.ts +17 -2
  248. package/src/module.ts +132 -10
  249. package/src/presets/animation.ts +46 -0
  250. package/src/presets/faceset.ts +60 -0
  251. package/src/presets/icon.ts +17 -0
  252. package/src/presets/index.ts +9 -1
  253. package/src/presets/lpc.ts +108 -0
  254. package/src/services/AbstractSocket.ts +10 -2
  255. package/src/services/keyboardControls.ts +20 -0
  256. package/src/services/loadMap.ts +3 -1
  257. package/src/services/mmorpg.ts +106 -12
  258. package/src/services/save.spec.ts +127 -0
  259. package/src/services/save.ts +103 -0
  260. package/src/services/standalone.ts +110 -18
  261. package/src/utils/getEntityProp.spec.ts +96 -0
  262. package/src/utils/getEntityProp.ts +88 -0
  263. package/src/utils/readPropValue.ts +16 -0
  264. package/vite.config.ts +4 -2
  265. package/dist/Game/EffectManager.d.ts +0 -5
  266. package/dist/components/effects/index.d.ts +0 -4
  267. package/dist/index.js.map +0 -1
  268. package/dist/index10.js +0 -8
  269. package/dist/index10.js.map +0 -1
  270. package/dist/index11.js +0 -10
  271. package/dist/index11.js.map +0 -1
  272. package/dist/index12.js +0 -8
  273. package/dist/index12.js.map +0 -1
  274. package/dist/index13.js +0 -17
  275. package/dist/index13.js.map +0 -1
  276. package/dist/index14.js +0 -107
  277. package/dist/index14.js.map +0 -1
  278. package/dist/index15.js +0 -50
  279. package/dist/index15.js.map +0 -1
  280. package/dist/index16.js +0 -191
  281. package/dist/index16.js.map +0 -1
  282. package/dist/index17.js +0 -9
  283. package/dist/index17.js.map +0 -1
  284. package/dist/index18.js +0 -387
  285. package/dist/index18.js.map +0 -1
  286. package/dist/index19.js +0 -31
  287. package/dist/index19.js.map +0 -1
  288. package/dist/index2.js +0 -181
  289. package/dist/index2.js.map +0 -1
  290. package/dist/index20.js +0 -24
  291. package/dist/index20.js.map +0 -1
  292. package/dist/index21.js +0 -2421
  293. package/dist/index21.js.map +0 -1
  294. package/dist/index22.js +0 -114
  295. package/dist/index22.js.map +0 -1
  296. package/dist/index23.js +0 -109
  297. package/dist/index23.js.map +0 -1
  298. package/dist/index24.js +0 -71
  299. package/dist/index24.js.map +0 -1
  300. package/dist/index25.js +0 -21
  301. package/dist/index25.js.map +0 -1
  302. package/dist/index26.js +0 -41
  303. package/dist/index26.js.map +0 -1
  304. package/dist/index27.js +0 -5
  305. package/dist/index27.js.map +0 -1
  306. package/dist/index28.js +0 -322
  307. package/dist/index28.js.map +0 -1
  308. package/dist/index29.js +0 -27
  309. package/dist/index29.js.map +0 -1
  310. package/dist/index3.js +0 -87
  311. package/dist/index3.js.map +0 -1
  312. package/dist/index30.js +0 -11
  313. package/dist/index30.js.map +0 -1
  314. package/dist/index31.js +0 -11
  315. package/dist/index31.js.map +0 -1
  316. package/dist/index32.js +0 -174
  317. package/dist/index32.js.map +0 -1
  318. package/dist/index33.js +0 -501
  319. package/dist/index33.js.map +0 -1
  320. package/dist/index34.js +0 -12
  321. package/dist/index34.js.map +0 -1
  322. package/dist/index35.js +0 -4403
  323. package/dist/index35.js.map +0 -1
  324. package/dist/index36.js +0 -316
  325. package/dist/index36.js.map +0 -1
  326. package/dist/index37.js +0 -61
  327. package/dist/index37.js.map +0 -1
  328. package/dist/index38.js +0 -20
  329. package/dist/index38.js.map +0 -1
  330. package/dist/index39.js +0 -20
  331. package/dist/index39.js.map +0 -1
  332. package/dist/index4.js +0 -67
  333. package/dist/index4.js.map +0 -1
  334. package/dist/index5.js +0 -16
  335. package/dist/index5.js.map +0 -1
  336. package/dist/index6.js +0 -17
  337. package/dist/index6.js.map +0 -1
  338. package/dist/index7.js +0 -39
  339. package/dist/index7.js.map +0 -1
  340. package/dist/index8.js +0 -108
  341. package/dist/index8.js.map +0 -1
  342. package/dist/index9.js +0 -76
  343. package/dist/index9.js.map +0 -1
  344. package/src/Game/EffectManager.ts +0 -20
  345. package/src/components/gui/dialogbox/itemMenu.ce +0 -23
  346. package/src/components/gui/dialogbox/selection.ce +0 -67
  347. /package/src/components/{effects → animations}/hit.ce +0 -0
@@ -1,194 +1,220 @@
1
- <Container justifyContent="center" alignItems="center" width="100%" height="100%">
2
- <Container
3
- ref="dialogbox"
4
- scale={{ x: scaleX }}
5
- anchor={[0.5, 0.5]}
6
- width={700}
7
- height
8
- controls
9
- positionType="absolute"
10
- bottom={10}
11
- >
12
- <Rect width={700} height={250} color="#1a1a2e" />
13
- <Rect
14
- x={0}
15
- y={0}
16
- width={700}
17
- height
18
- color="#1a1a2e"
19
- alpha={0.9}
20
- borderRadius={10}
21
- border
22
- shadow
23
- />
24
- <Container
25
- flexDirection="row"
26
- width={700}
27
- height
28
- alpha={contentOpacity}
29
- >
30
- <Container flexDirection="column">
31
- <Text
32
- text
33
- color="#fff"
34
- fontSize={18}
35
- margin={40}
36
- typewriter
37
- style={textStyle}
38
- />
39
- @if (visibleSelection) {
40
- <Selection selectedIndex={0} items={choices} onSelect />
41
- }
42
- </Container>
43
- </Container>
44
- </Container>
45
-
46
-
47
- </Container>
1
+ <DOMContainer width="100%" height="100%" controls={dialogControls}>
2
+ <div
3
+ class="rpg-ui-dialog-container"
4
+ data-position={dialogPosition()}
5
+ data-full-width={isFullWidth() ? "true" : "false"}
6
+ data-has-face={hasFace() ? "true" : "false"}
7
+ >
8
+ <div class="rpg-ui-dialog rpg-anim-fade-in">
9
+ <div class="rpg-ui-dialog-body">
10
+ <div>
11
+ @if (speakerName()) {
12
+ <div class="rpg-ui-dialog-speaker">{speakerName()}</div>
13
+ }
14
+ <div class="rpg-ui-dialog-content">
15
+ {displayMessage()}
16
+ </div>
17
+ @if (hasChoices()) {
18
+ <Navigation tabindex={selectedItem} controls={controls}>
19
+ <div class="rpg-ui-dialog-choices">
20
+ @for ((choice,index) of choices) {
21
+ <div
22
+ class="rpg-ui-dialog-choice"
23
+ class={{active: selectedItem() === index}}
24
+ tabindex={index}
25
+ data-choice-index={index}
26
+ click={selectChoice(index)}
27
+ >{{ choice.text }}</div>
28
+ }
29
+ </div>
30
+ </Navigation>
31
+ }
32
+ </div>
33
+ @if (hasFace()) {
34
+ <div class="rpg-ui-dialog-face">
35
+ <DOMSprite
36
+ sheet={faceSheet(dialogFace())}
37
+ width="100%"
38
+ height="100%"
39
+ objectFit="contain"
40
+ />
41
+ </div>
42
+ }
43
+ </div>
44
+ @if (showIndicator) {
45
+ <div class="rpg-ui-dialog-indicator"></div>
46
+ }
47
+ </div>
48
+ </div>
49
+ </DOMContainer>
50
+
48
51
  <script>
49
- import Selection from './selection.ce'
50
-
51
- import {
52
- animatedSignal,
53
- computed,
54
- effect,
55
- signal,
56
- trigger,
57
- mount
58
- } from "canvasengine";
59
-
60
- import { inject } from "../../../core/inject";
61
- import { RpgClientEngine } from "../../../RpgClientEngine";
62
-
63
- const {
64
- message,
65
- choices: _choices,
66
- onFinish,
67
- onInteraction
68
- } = defineProps();
69
-
70
- const client = inject(RpgClientEngine);
71
- const keyboardControls = client.globalConfig.keyboardControls;
72
-
73
- client.stopProcessingInput = true;
74
- let isDestroyed = false;
75
-
76
- const texts = [message()]
77
- const height = signal(250);
78
- const isTextCompleted = signal(false);
79
-
80
- const drawSpeaker = (g) => {
81
- g.beginFill(0xffa500); // Orange color
82
- g.lineStyle(2, 0x000000); // Black border
83
- g.moveTo(0, 0);
84
- g.lineTo(70, 0);
85
- g.lineTo(80, 15);
86
- g.lineTo(70, 30);
87
- g.lineTo(0, 30);
88
- g.lineTo(0, 0);
89
- g.endFill();
90
- };
91
-
92
- const border = signal({ width: 5, color: "#595971" });
93
- const shadow = signal({ color: "#000", blur: 10, offsetX: 10, offsetY: 10 });
94
-
95
- const contentOpacity = animatedSignal(0, {
96
- duration: 1000,
97
- });
98
-
99
- const scaleX = animatedSignal(0, {
100
- duration: 500,
101
- });
102
-
103
- scaleX.set(1);
104
- contentOpacity.set(1);
105
-
106
- const currentTextIndex = signal(0);
107
- const currentText = computed(() => texts?.[currentTextIndex()] ?? '');
108
- const isChoiceDisplayed = signal(false);
109
-
110
- const text = computed(() => {
111
- const current = currentText();
112
- return typeof current === "string" ? current : current.text;
113
- });
114
-
115
- const choices = computed(() => {
116
- //const current = currentText();
117
- //return typeof current === "string" ? null : current.choices;
118
- return _choices;
119
- });
120
-
121
- const visibleSelection = computed(() => isChoiceDisplayed() && choices().length != 0)
122
-
123
- const triggerSkip = trigger();
124
-
125
- const typewriter = {
126
- speed: 0.3,
127
- skip: triggerSkip,
128
- onComplete: () => {
129
- isTextCompleted.set(true);
130
- }
131
- }
132
-
133
- const textStyle = {
134
- wordWrap: true,
135
- wordWrapWidth: 700 - 256 - 80
136
- }
137
-
138
- const face = signal({ x: 0, y: 0, width: 256, height: 256 });
139
-
140
- mount((element) => {
141
- const [dialogbox] = element.props.children
142
- return () => {
143
- dialogbox.directives.controls.onDestroy()
144
- isDestroyed = true;
145
- // Wait destroy is finished before start processing input
146
- setTimeout(() => {
147
- client.stopProcessingInput = false;
148
- }, 500)
149
- }
150
- })
151
-
152
- const controls = signal({
153
- next: {
154
- bind: keyboardControls.action,
155
- keyDown(e) {
156
- if (isDestroyed) return;
157
- if (isChoiceDisplayed()) {
158
- // If choices are displayed, do nothing (wait for selection)
159
- return;
52
+ import { effect, signal, computed, createTabindexNavigator, mount } from "canvasengine";
53
+ import { inject } from "../../../core/inject";
54
+ import { RpgClientEngine } from "../../../RpgClientEngine";
55
+ import { delay } from "@rpgjs/common";
56
+
57
+ const engine = inject(RpgClientEngine);
58
+ const currentPlayer = engine.scene.currentPlayer
59
+ const keyboardControls = engine.globalConfig.keyboardControls;
60
+
61
+ engine.stopProcessingInput = true;
62
+
63
+ const selectedItem = signal(0)
64
+ let isDestroyed = false;
65
+
66
+ const {
67
+ data,
68
+ onFinish,
69
+ onInteraction
70
+ } = defineProps();
71
+
72
+ const { message, choices, face, speaker, position, typewriterEffect, autoClose } = data();
73
+ const fullWidth = computed(() => data().fullWidth || false);
74
+
75
+ const resolveProp = (value) => typeof value === "function" ? value() : value;
76
+
77
+ const speakerName = computed(() => {
78
+ const value = resolveProp(speaker);
79
+ return value ? String(value) : "";
80
+ });
81
+
82
+ const dialogPosition = computed(() => resolveProp(position) || "bottom");
83
+ const isFullWidth = computed(() => resolveProp(fullWidth) !== false);
84
+ const dialogFace = computed(() => resolveProp(face));
85
+ const hasFace = computed(() => {
86
+ const value = dialogFace();
87
+ return !!(value && value.id);
88
+ });
89
+
90
+ const displayMessage = signal("");
91
+ const fullMessage = signal("");
92
+ const isTyping = signal(false);
93
+ let typewriterTimer = null;
94
+ let rootElement = null;
95
+
96
+ mount((element) => {
97
+ rootElement = element;
98
+ });
99
+
100
+ const startTypewriter = (text) => {
101
+ if (typewriterTimer) clearInterval(typewriterTimer);
102
+ displayMessage.set("");
103
+ if (!text) return;
104
+ let index = 0;
105
+ isTyping.set(true);
106
+ typewriterTimer = setInterval(() => {
107
+ index += 1;
108
+ displayMessage.set(text.slice(0, index));
109
+ if (index >= text.length) {
110
+ clearInterval(typewriterTimer);
111
+ typewriterTimer = null;
112
+ isTyping.set(false);
113
+ }
114
+ }, 20);
115
+ };
116
+
117
+ const finishTyping = () => {
118
+ if (typewriterTimer) clearInterval(typewriterTimer);
119
+ typewriterTimer = null;
120
+ displayMessage.set(fullMessage());
121
+ isTyping.set(false);
122
+ };
123
+
124
+ effect(() => {
125
+ const text = resolveProp(message) || "";
126
+ fullMessage.set(text);
127
+ const useTypewriter = resolveProp(typewriterEffect) !== false;
128
+ if (!useTypewriter) {
129
+ finishTyping();
130
+ return;
160
131
  }
132
+ startTypewriter(text);
133
+ });
134
+
161
135
 
162
- // If text is still typing, just skip (fast forward) the animation
163
- if (!isTextCompleted()) {
164
- triggerSkip.start();
165
- isTextCompleted.set(true);
136
+ const hasChoices = computed(() => choices.length > 0);
137
+ const showIndicator = computed(() => !hasChoices() && !isTyping());
138
+ const nav = createTabindexNavigator(selectedItem, { count: () => choices.length }, 'wrap');
139
+
140
+ function selectChoice(index) {
141
+ return function() {
142
+ selectedItem.set(index);
143
+ onSelect(index);
166
144
  }
167
- else {
168
- const isFinished = currentTextIndex() === texts.length - 1;
169
- currentTextIndex.update((index) => {
170
- if (index < texts.length - 1) {
171
- return index + 1;
145
+ }
146
+
147
+ function _onFinish(value) {
148
+ if (onFinish) onFinish(value);
149
+ }
150
+
151
+ const onSelect = (index) => {
152
+ _onFinish(index);
153
+ };
154
+
155
+ const controls = signal({
156
+ up: {
157
+ repeat: true,
158
+ bind: keyboardControls.up,
159
+ throttle: 150,
160
+ keyDown() {
161
+ if (!hasChoices()) return;
162
+ nav.next(-1);
163
+ }
164
+ },
165
+ down: {
166
+ repeat: true,
167
+ bind: keyboardControls.down,
168
+ throttle: 150,
169
+ keyDown() {
170
+ if (!hasChoices()) return;
171
+ nav.next(1);
172
+ }
173
+ },
174
+ action: {
175
+ bind: keyboardControls.action,
176
+ keyDown() {
177
+ if (isTyping()) {
178
+ finishTyping();
179
+ return;
180
+ }
181
+ if (!hasChoices()) return;
182
+ onSelect(selectedItem());
172
183
  }
173
- return index;
174
- });
175
- isChoiceDisplayed.set(false);
176
- isTextCompleted.set(false);
177
- if (isFinished && onFinish) {
178
- onFinish();
179
- }
184
+ },
185
+ gamepad: {
186
+ enabled: true
180
187
  }
181
- },
182
- },
183
- });
184
-
185
- const onSelect = (index) => {
186
- onFinish(index);
187
- }
188
-
189
- effect(() => {
190
- if (choices().length != 0) {
191
- isChoiceDisplayed.set(true);
188
+ });
189
+
190
+ const dialogControls = signal({
191
+ action: {
192
+ bind: keyboardControls.action,
193
+ keyDown() {
194
+ if (isTyping()) {
195
+ finishTyping();
196
+ return;
197
+ }
198
+ if (hasChoices()) return;
199
+ _onFinish();
200
+ }
201
+ },
202
+ })
203
+
204
+ const faceSheet = (faceValue) => {
205
+ return {
206
+ definition: engine.getSpriteSheet(faceValue.id),
207
+ playing: faceValue.expression || "default",
208
+ };
192
209
  }
193
- });
194
- </script>
210
+
211
+ mount((element) => {
212
+ return () => {
213
+ isDestroyed = true;
214
+ // Wait destroy is finished before start processing input
215
+ delay(() => {
216
+ engine.stopProcessingInput = false;
217
+ })
218
+ }
219
+ })
220
+ </script>
@@ -0,0 +1,158 @@
1
+ <DOMContainer width="100%" height="100%">
2
+ <div class="rpg-ui-gameover-screen rpg-anim-fade-in">
3
+ <div class="rpg-ui-gameover-splatter rpg-ui-gameover-splatter-left"></div>
4
+ <div class="rpg-ui-gameover-splatter rpg-ui-gameover-splatter-right"></div>
5
+ <div class="rpg-ui-gameover-splatter rpg-ui-gameover-splatter-center"></div>
6
+ <div class="rpg-ui-gameover-header rpg-anim-shake">
7
+ <div class="rpg-ui-gameover-title">{titleText()}</div>
8
+ @if (subtitleText()) {
9
+ <div class="rpg-ui-gameover-subtitle">{subtitleText()}</div>
10
+ }
11
+ </div>
12
+ <Navigation tabindex={selectedEntry} controls={controls}>
13
+ <div class="rpg-ui-menu rpg-ui-gameover-menu rpg-anim-slide-up">
14
+ @for ((entry,index) of entryList()) {
15
+ <div
16
+ class="rpg-ui-menu-item"
17
+ class={{disabled: isEntryDisabled(entry)}}
18
+ data-selected={selectedEntry() === index ? "true" : "false"}
19
+ tabindex={index}
20
+ click={selectEntry(index)}
21
+ >{entry.label}</div>
22
+ }
23
+ </div>
24
+ </Navigation>
25
+ </div>
26
+ </DOMContainer>
27
+
28
+ <script>
29
+ import { signal, computed, effect } from "canvasengine";
30
+ import { PrebuiltGui } from "@rpgjs/common";
31
+ import { inject } from "../../core/inject";
32
+ import { RpgClientEngine } from "../../RpgClientEngine";
33
+ import { RpgGui } from "../../Gui/Gui";
34
+
35
+ const engine = inject(RpgClientEngine);
36
+ const guiService = inject(RpgGui);
37
+ const keyboardControls = engine.globalConfig.keyboardControls;
38
+
39
+ const { entries, title, subtitle, saveLoad, localActions, onInteraction } = defineProps({
40
+ entries: {
41
+ default: () => []
42
+ },
43
+ saveLoad: {
44
+ default: () => ({})
45
+ },
46
+ localActions: {
47
+ default: false
48
+ }
49
+ });
50
+
51
+ const defaultEntries = [
52
+ { id: "title", label: "Title Screen" },
53
+ { id: "load", label: "Load Game" }
54
+ ];
55
+
56
+ const resolveProp = (value) => typeof value === "function" ? value() : value;
57
+ const titleText = computed(() => resolveProp(title) || "Game Over");
58
+ const subtitleText = computed(() => resolveProp(subtitle) || "");
59
+ const localActionsEnabled = computed(() => resolveProp(localActions) === true);
60
+
61
+ const entryList = computed(() => {
62
+ const list = resolveProp(entries);
63
+ if (Array.isArray(list) && list.length) return list;
64
+ return defaultEntries;
65
+ });
66
+
67
+ const isEntryDisabled = (entry) => {
68
+ if (!entry) return true;
69
+ if (entry.disabled) return true;
70
+ if (entry.enabled === false) return true;
71
+ return false;
72
+ };
73
+
74
+ const selectedEntry = signal(0);
75
+ const selectableIndexes = computed(() => {
76
+ const list = entryList();
77
+ return list
78
+ .map((entry, index) => (isEntryDisabled(entry) ? null : index))
79
+ .filter((value) => value !== null);
80
+ });
81
+
82
+ effect(() => {
83
+ const available = selectableIndexes();
84
+ if (!available.length) return;
85
+ const current = selectedEntry();
86
+ if (!available.includes(current)) {
87
+ selectedEntry.set(available[0]);
88
+ }
89
+ });
90
+
91
+ const moveSelection = (delta) => {
92
+ const available = selectableIndexes();
93
+ if (!available.length) return;
94
+ const current = selectedEntry();
95
+ const currentIndex = Math.max(0, available.indexOf(current));
96
+ const nextIndex = (currentIndex + delta + available.length) % available.length;
97
+ selectedEntry.set(available[nextIndex]);
98
+ };
99
+
100
+ const triggerSelect = (index) => {
101
+ const list = entryList();
102
+ const entry = list[index];
103
+ if (!entry || isEntryDisabled(entry)) return;
104
+ if (localActionsEnabled()) {
105
+ if (entry.id === "title") {
106
+ guiService.hide(PrebuiltGui.Gameover);
107
+ guiService.display(PrebuiltGui.TitleScreen);
108
+ }
109
+ if (entry.id === "load") {
110
+ const config = resolveProp(saveLoad) || {};
111
+ const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];
112
+ guiService.display(PrebuiltGui.Save, {
113
+ ...config,
114
+ mode: config.mode || "load",
115
+ slots
116
+ });
117
+ }
118
+ }
119
+ if (onInteraction) {
120
+ onInteraction("select", { id: entry.id, index, entry });
121
+ }
122
+ };
123
+
124
+ function selectEntry(index) {
125
+ return function() {
126
+ selectedEntry.set(index);
127
+ triggerSelect(index);
128
+ };
129
+ }
130
+
131
+ const controls = signal({
132
+ up: {
133
+ repeat: true,
134
+ bind: keyboardControls.up,
135
+ throttle: 150,
136
+ keyDown() {
137
+ moveSelection(-1);
138
+ }
139
+ },
140
+ down: {
141
+ repeat: true,
142
+ bind: keyboardControls.down,
143
+ throttle: 150,
144
+ keyDown() {
145
+ moveSelection(1);
146
+ }
147
+ },
148
+ action: {
149
+ bind: keyboardControls.action,
150
+ keyDown() {
151
+ triggerSelect(selectedEntry());
152
+ }
153
+ },
154
+ gamepad: {
155
+ enabled: true
156
+ }
157
+ });
158
+ </script>
@@ -0,0 +1,61 @@
1
+ <DOMContainer>
2
+ <div class="rpg-hud">
3
+ <div class="rpg-avatar">
4
+ @if (hasFace()) {
5
+ <div class="rpg-avatar-face">
6
+ <DOMSprite
7
+ sheet={faceSheet(face())}
8
+ width={64}
9
+ height={64}
10
+ objectFit="contain"
11
+ />
12
+ </div>
13
+ }
14
+ <div class="rpg-avatar-level">{{ level() }}</div>
15
+ </div>
16
+ <div class="rpg-status-bars">
17
+ <div class="rpg-bar-container">
18
+ <span class="rpg-bar-text">HP {{ hp() }}/{{ hpMax() }}</span>
19
+ <div class="rpg-bar-fill health" style={{width: percentHp}}></div>
20
+ </div>
21
+ <div class="rpg-bar-container">
22
+ <span class="rpg-bar-text">SP {{ sp() }}/{{ spMax() }}</span>
23
+ <div class="rpg-bar-fill mana" style={{width: percentSp}}></div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </DOMContainer>
28
+
29
+ <script>
30
+ import { inject } from "../../../core/inject";
31
+ import { RpgClientEngine } from "../../../RpgClientEngine";
32
+ import { computed } from "canvasengine";
33
+ import { getEntityProp } from "../../../utils/getEntityProp";
34
+
35
+ const engine = inject(RpgClientEngine)
36
+ const currentPlayer = engine.scene.currentPlayer
37
+ const { data } = defineProps();
38
+ const { faceset } = data();
39
+
40
+ const resolveProp = (value) => typeof value === "function" ? value() : value;
41
+ const face = computed(() => resolveProp(data().faceset));
42
+
43
+ const hasFace = computed(() => {
44
+ const value = face();
45
+ return !!(value && value.id);
46
+ });
47
+ const faceSheet = (faceValue) => ({
48
+ definition: engine.getSpriteSheet(faceValue.id),
49
+ playing: faceValue.expression || "default",
50
+ });
51
+ const hp = getEntityProp(currentPlayer, "hp")
52
+ const hpMax = getEntityProp(currentPlayer, "params.maxHp")
53
+ const percentHp = computed(() => (hp() / hpMax() * 100) + '%')
54
+
55
+ const sp = getEntityProp(currentPlayer, "sp")
56
+ const spMax = getEntityProp(currentPlayer, "params.maxSp")
57
+ const percentSp = computed(() => (sp() / spMax() * 100) + '%')
58
+
59
+ const level = getEntityProp(currentPlayer, "level")
60
+ </script>
61
+
@@ -1,5 +1,31 @@
1
- import Dialogbox from "./dialogbox/index.ce";
1
+ import DialogboxComponent from "./dialogbox/index.ce";
2
+ import BoxComponent from "./box.ce";
3
+ import ShopComponent from "./shop/shop.ce";
4
+ import HudComponent from "./hud/hud.ce";
5
+ import SaveLoadComponent from "./save-load.ce";
6
+ import MainMenuComponent from "./menu/main-menu.ce";
7
+ import ItemsMenuComponent from "./menu/items-menu.ce";
8
+ import SkillsMenuComponent from "./menu/skills-menu.ce";
9
+ import EquipMenuComponent from "./menu/equip-menu.ce";
10
+ import OptionsMenuComponent from "./menu/options-menu.ce";
11
+ import ExitMenuComponent from "./menu/exit-menu.ce";
12
+ import NotificationComponent from "./notification/notification.ce";
13
+ import TitleScreenComponent from "./title-screen.ce";
14
+ import GameoverComponent from "./gameover.ce";
2
15
 
3
- export const PrebuiltGui = {
4
- Dialogbox
5
- }
16
+ export {
17
+ DialogboxComponent,
18
+ BoxComponent,
19
+ ShopComponent,
20
+ HudComponent,
21
+ SaveLoadComponent,
22
+ MainMenuComponent,
23
+ ItemsMenuComponent,
24
+ SkillsMenuComponent,
25
+ EquipMenuComponent,
26
+ OptionsMenuComponent,
27
+ ExitMenuComponent,
28
+ NotificationComponent,
29
+ TitleScreenComponent,
30
+ GameoverComponent
31
+ }