@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,130 @@
1
+ # @rpgjs/client
2
+
3
+ ## 5.0.0-beta.22
4
+
5
+ ### Patch Changes
6
+
7
+ - 1028c17: Use workspace protocol for internal RPGJS package dependencies during prerelease development so CI installs do not fetch unpublished beta packages from npm.
8
+ - @rpgjs/server@5.0.0-beta.22
9
+
10
+ ## 5.0.0-beta.20
11
+
12
+ ### Patch Changes
13
+
14
+ - Release the next RPGJS beta while keeping the physics package unchanged.
15
+ - Updated dependencies
16
+ - @rpgjs/common@5.0.0-beta.20
17
+ - @rpgjs/server@5.0.0-beta.20
18
+ - @rpgjs/ui-css@5.0.0-beta.20
19
+
20
+ ## 5.0.0-beta.19
21
+
22
+ ### Patch Changes
23
+
24
+ - Release the next RPGJS beta while keeping the physics package unchanged.
25
+ - Updated dependencies
26
+ - @rpgjs/common@5.0.0-beta.19
27
+ - @rpgjs/server@5.0.0-beta.19
28
+ - @rpgjs/ui-css@5.0.0-beta.19
29
+
30
+ ## 5.0.0-beta.17
31
+
32
+ ### Patch Changes
33
+
34
+ - Release the next RPGJS beta while keeping the physics package on its stable release line.
35
+ - Updated dependencies
36
+ - @rpgjs/common@5.0.0-beta.16
37
+ - @rpgjs/server@5.0.0-beta.17
38
+ - @rpgjs/ui-css@5.0.0-beta.14
39
+
40
+ ## 5.0.0-beta.16
41
+
42
+ ### Patch Changes
43
+
44
+ - Release the next RPGJS beta with terrain rendering performance improvements and a unified server tick loop.
45
+ - Updated dependencies
46
+ - @rpgjs/common@5.0.0-beta.15
47
+ - @rpgjs/server@5.0.0-beta.16
48
+ - @rpgjs/ui-css@5.0.0-beta.13
49
+
50
+ ## 5.0.0-beta.15
51
+
52
+ ### Patch Changes
53
+
54
+ - dba133e: Queue early changeMap packets until the client has finished loading modules and GUI definitions.
55
+ - @rpgjs/server@5.0.0-beta.15
56
+
57
+ ## 5.0.0-beta.14
58
+
59
+ ### Patch Changes
60
+
61
+ - Updated dependencies [c96b31a]
62
+ - @rpgjs/common@5.0.0-beta.14
63
+ - @rpgjs/server@5.0.0-beta.14
64
+
65
+ ## 5.0.0-beta.13
66
+
67
+ ### Patch Changes
68
+
69
+ - Release the next RPGJS beta with client interactions, i18n support, movement and physics improvements, Studio fixes, action battle updates, playground migration, and related runtime documentation.
70
+ - Updated dependencies
71
+ - @rpgjs/common@5.0.0-beta.13
72
+ - @rpgjs/server@5.0.0-beta.13
73
+ - @rpgjs/ui-css@5.0.0-beta.12
74
+
75
+ ## 5.0.0-beta.12
76
+
77
+ ### Patch Changes
78
+
79
+ - Prepare beta.12 with action battle AI, area queries, client visuals, event component resolvers, projectile handling, and related Vite/runtime updates.
80
+ - Updated dependencies
81
+ - @rpgjs/common@5.0.0-beta.12
82
+ - @rpgjs/server@5.0.0-beta.12
83
+
84
+ ## 5.0.0-beta.11
85
+
86
+ ### Patch Changes
87
+
88
+ - Add projectile runtime support with client-side prediction, action input payload handling, pointer context helpers, standalone message handling, and MMORPG connection authentication.
89
+
90
+ Add composable CanvasEngine scene map components and update built-in GUI/dynamic components for the current CanvasEngine release.
91
+
92
+ - @rpgjs/common@5.0.0-beta.11
93
+ - @rpgjs/server@5.0.0-beta.11
94
+ - @rpgjs/ui-css@5.0.0-beta.11
95
+
96
+ ## 5.0.0-beta.10
97
+
98
+ ### Patch Changes
99
+
100
+ - Fix current-player control binding and canMove reads when values are provided by synced or reactive state.
101
+
102
+ Fix Vue GUI rendering for hidden fixed GUIs while keeping attached GUI targets updated.
103
+
104
+ - @rpgjs/server@5.0.0-beta.10
105
+
106
+ ## 5.0.0-beta.9
107
+
108
+ ### Major Changes
109
+
110
+ - c456d25: beta.9
111
+
112
+ ### Patch Changes
113
+
114
+ - Updated dependencies [c456d25]
115
+ - @rpgjs/common@5.0.0-beta.9
116
+ - @rpgjs/server@5.0.0-beta.9
117
+ - @rpgjs/ui-css@5.0.0-beta.9
118
+
119
+ ## 5.0.0-beta.8
120
+
121
+ ### Major Changes
122
+
123
+ - 35e7fa4: beta.8
124
+
125
+ ### Patch Changes
126
+
127
+ - Updated dependencies [35e7fa4]
128
+ - @rpgjs/common@5.0.0-beta.8
129
+ - @rpgjs/server@5.0.0-beta.8
130
+ - @rpgjs/ui-css@5.0.0-beta.8
@@ -1,8 +1,9 @@
1
1
  import { RpgCommonPlayer } from '@rpgjs/common';
2
2
  export declare class AnimationManager {
3
3
  current: import('canvasengine').WritableArraySignal<any[]>;
4
+ clear(): void;
4
5
  displayEffect(params: any, player: RpgCommonPlayer | {
5
6
  x: number;
6
7
  y: number;
7
- }): void;
8
+ }): Promise<void>;
8
9
  }
@@ -5,18 +5,30 @@ var AnimationManager = class {
5
5
  constructor() {
6
6
  this.current = signal([]);
7
7
  }
8
+ clear() {
9
+ this.current.set([]);
10
+ }
8
11
  displayEffect(params, player) {
9
12
  const id = generateUID();
10
- this.current().push({
11
- ...params,
12
- id,
13
- x: player.x,
14
- y: player.y,
15
- object: player,
16
- onFinish: () => {
13
+ const effectParams = params ?? {};
14
+ return new Promise((resolve) => {
15
+ let finished = false;
16
+ const finish = (data) => {
17
+ if (finished) return;
18
+ finished = true;
17
19
  const index = this.current().findIndex((value) => value.id === id);
18
- this.current().splice(index, 1);
19
- }
20
+ if (index !== -1) this.current().splice(index, 1);
21
+ effectParams.onFinish?.(data);
22
+ resolve();
23
+ };
24
+ this.current().push({
25
+ ...effectParams,
26
+ id,
27
+ x: player.x,
28
+ y: player.y,
29
+ object: player,
30
+ onFinish: finish
31
+ });
20
32
  });
21
33
  }
22
34
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationManager.js","names":[],"sources":["../../src/Game/AnimationManager.ts"],"sourcesContent":["import { generateUID, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { signal } from \"canvasengine\";\n\nexport class AnimationManager {\n current = signal<any[]>([]);\n\n displayEffect(params: any, player: RpgCommonPlayer | { x: number, y: number }) {\n const id = generateUID();\n this.current().push({\n ...params,\n id,\n x: player.x,\n y: player.y,\n object: player,\n onFinish: () => {\n const index = this.current().findIndex((value) => value.id === id);\n this.current().splice(index, 1);\n },\n });\n }\n}\n"],"mappings":";;;AAGA,IAAa,mBAAb,MAA8B;;iBAClB,OAAc,EAAE,CAAC;;CAE3B,cAAc,QAAa,QAAoD;EAC7E,MAAM,KAAK,aAAa;AACxB,OAAK,SAAS,CAAC,KAAK;GAClB,GAAG;GACH;GACA,GAAG,OAAO;GACV,GAAG,OAAO;GACV,QAAQ;GACR,gBAAgB;IACd,MAAM,QAAQ,KAAK,SAAS,CAAC,WAAW,UAAU,MAAM,OAAO,GAAG;AAClE,SAAK,SAAS,CAAC,OAAO,OAAO,EAAE;;GAElC,CAAC"}
1
+ {"version":3,"file":"AnimationManager.js","names":[],"sources":["../../src/Game/AnimationManager.ts"],"sourcesContent":["import { generateUID, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { signal } from \"canvasengine\";\n\nexport class AnimationManager {\n current = signal<any[]>([]);\n\n clear(): void {\n this.current.set([]);\n }\n\n displayEffect(params: any, player: RpgCommonPlayer | { x: number, y: number }): Promise<void> {\n const id = generateUID();\n const effectParams = params ?? {};\n return new Promise<void>((resolve) => {\n let finished = false;\n const finish = (data?: any) => {\n if (finished) return;\n finished = true;\n const index = this.current().findIndex((value) => value.id === id);\n if (index !== -1) {\n this.current().splice(index, 1);\n }\n effectParams.onFinish?.(data);\n resolve();\n };\n\n this.current().push({\n ...effectParams,\n id,\n x: player.x,\n y: player.y,\n object: player,\n onFinish: finish,\n });\n });\n }\n}\n"],"mappings":";;;AAGA,IAAa,mBAAb,MAA8B;;iBAClB,OAAc,CAAC,CAAC;;CAE1B,QAAc;EACZ,KAAK,QAAQ,IAAI,CAAC,CAAC;CACrB;CAEA,cAAc,QAAa,QAAmE;EAC5F,MAAM,KAAK,YAAY;EACvB,MAAM,eAAe,UAAU,CAAC;EAChC,OAAO,IAAI,SAAe,YAAY;GACpC,IAAI,WAAW;GACf,MAAM,UAAU,SAAe;IAC7B,IAAI,UAAU;IACd,WAAW;IACX,MAAM,QAAQ,KAAK,QAAQ,EAAE,WAAW,UAAU,MAAM,OAAO,EAAE;IACjE,IAAI,UAAU,IACZ,KAAK,QAAQ,EAAE,OAAO,OAAO,CAAC;IAEhC,aAAa,WAAW,IAAI;IAC5B,QAAQ;GACV;GAEA,KAAK,QAAQ,EAAE,KAAK;IAClB,GAAG;IACH;IACA,GAAG,OAAO;IACV,GAAG,OAAO;IACV,QAAQ;IACR,UAAU;GACZ,CAAC;EACH,CAAC;CACH;AACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { RpgClientEngine } from '../RpgClientEngine';
2
+ import { RpgClientMap } from './Map';
3
+ export type ClientVisualPosition = {
4
+ x: number;
5
+ y: number;
6
+ z?: number;
7
+ };
8
+ export type ClientVisualPayload = Record<string, any> & {
9
+ source?: string;
10
+ sourceId?: string;
11
+ target?: string;
12
+ targetId?: string;
13
+ object?: string;
14
+ objectId?: string;
15
+ position?: ClientVisualPosition;
16
+ };
17
+ export type ClientVisualPacket = {
18
+ name: string;
19
+ data?: ClientVisualPayload;
20
+ };
21
+ export type ClientVisualObjectTarget = string | Record<string, any> | undefined | null;
22
+ export type ClientVisualComponentTarget = ClientVisualObjectTarget | ClientVisualPosition;
23
+ export type ClientVisualContext = {
24
+ name: string;
25
+ data: ClientVisualPayload;
26
+ engine: RpgClientEngine;
27
+ scene: RpgClientMap;
28
+ source?: any;
29
+ target?: any;
30
+ object?: any;
31
+ position?: ClientVisualPosition;
32
+ };
33
+ export type ClientVisualHelpers = {
34
+ getObject(id?: string | null): any;
35
+ flash(target?: ClientVisualObjectTarget, options?: Record<string, any>): void;
36
+ showHit(target: ClientVisualObjectTarget, text: string): void;
37
+ component(id: string, target?: ClientVisualComponentTarget, params?: Record<string, any>): void;
38
+ sound(id: string, options?: {
39
+ volume?: number;
40
+ loop?: boolean;
41
+ }): Promise<void>;
42
+ animation(target: ClientVisualObjectTarget, animationName: string, options?: {
43
+ graphic?: string | string[];
44
+ repeat?: number;
45
+ }): void;
46
+ shake(options?: {
47
+ intensity?: number;
48
+ duration?: number;
49
+ frequency?: number;
50
+ direction?: string;
51
+ }): void;
52
+ };
53
+ export type ClientVisualHandler = (context: ClientVisualContext, helpers: ClientVisualHelpers) => void | Promise<void>;
54
+ export type ClientVisualMap = Record<string, ClientVisualHandler>;
55
+ export declare class ClientVisualRegistry {
56
+ private readonly handlers;
57
+ register(name: string, handler: ClientVisualHandler): ClientVisualHandler;
58
+ registerMany(visuals: ClientVisualMap): void;
59
+ get(name: string): ClientVisualHandler | undefined;
60
+ play(packet: ClientVisualPacket, engine: RpgClientEngine): Promise<void>;
61
+ }
@@ -0,0 +1,96 @@
1
+ //#region src/Game/ClientVisuals.ts
2
+ var isPosition = (value) => value && typeof value === "object" && typeof value.x === "number" && typeof value.y === "number";
3
+ var resolvePosition = (data) => {
4
+ if (isPosition(data.position)) return data.position;
5
+ if (typeof data.x === "number" && typeof data.y === "number") return {
6
+ x: data.x,
7
+ y: data.y,
8
+ z: data.z
9
+ };
10
+ };
11
+ var resolveObject = (engine, target) => {
12
+ if (!target) return void 0;
13
+ if (typeof target === "string") return engine.getObjectById(target);
14
+ return target;
15
+ };
16
+ var resolvePayloadObject = (engine, data, keys) => {
17
+ return resolveObject(engine, keys.map((key) => data[key]).find((value) => typeof value === "string"));
18
+ };
19
+ var createClientVisualHelpers = (engine) => ({
20
+ getObject(id) {
21
+ if (!id) return void 0;
22
+ return engine.getObjectById(id);
23
+ },
24
+ flash(target, options = {}) {
25
+ resolveObject(engine, target)?.flash?.(options);
26
+ },
27
+ showHit(target, text) {
28
+ resolveObject(engine, target)?.showHit?.(text);
29
+ },
30
+ component(id, target, params = {}) {
31
+ const object = isPosition(target) ? void 0 : resolveObject(engine, target);
32
+ const position = isPosition(target) ? target : void 0;
33
+ const anchor = object ?? position;
34
+ if (!anchor) return;
35
+ engine.getComponentAnimation(id).displayEffect(params, anchor);
36
+ },
37
+ sound(id, options) {
38
+ return engine.playSound(id, options);
39
+ },
40
+ animation(target, animationName, options = {}) {
41
+ const object = resolveObject(engine, target);
42
+ if (!object?.setAnimation) return;
43
+ if (options.graphic !== void 0) {
44
+ object.setAnimation(animationName, options.graphic, options.repeat ?? 1);
45
+ return;
46
+ }
47
+ object.setAnimation(animationName, options.repeat ?? 1);
48
+ },
49
+ shake(options = {}) {
50
+ engine.mapShakeTrigger.start(options);
51
+ }
52
+ });
53
+ var ClientVisualRegistry = class {
54
+ constructor() {
55
+ this.handlers = /* @__PURE__ */ new Map();
56
+ }
57
+ register(name, handler) {
58
+ this.handlers.set(name, handler);
59
+ return handler;
60
+ }
61
+ registerMany(visuals) {
62
+ Object.entries(visuals).forEach(([name, handler]) => {
63
+ this.register(name, handler);
64
+ });
65
+ }
66
+ get(name) {
67
+ return this.handlers.get(name);
68
+ }
69
+ async play(packet, engine) {
70
+ const handler = this.handlers.get(packet.name);
71
+ if (!handler) {
72
+ console.warn(`Client visual "${packet.name}" is not registered`);
73
+ return;
74
+ }
75
+ const data = packet.data ?? {};
76
+ const context = {
77
+ name: packet.name,
78
+ data,
79
+ engine,
80
+ scene: engine.scene,
81
+ source: resolvePayloadObject(engine, data, ["sourceId", "source"]),
82
+ target: resolvePayloadObject(engine, data, ["targetId", "target"]),
83
+ object: resolvePayloadObject(engine, data, ["objectId", "object"]),
84
+ position: resolvePosition(data)
85
+ };
86
+ try {
87
+ await handler(context, createClientVisualHelpers(engine));
88
+ } catch (error) {
89
+ console.error(`Client visual "${packet.name}" failed`, error);
90
+ }
91
+ }
92
+ };
93
+ //#endregion
94
+ export { ClientVisualRegistry };
95
+
96
+ //# sourceMappingURL=ClientVisuals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClientVisuals.js","names":[],"sources":["../../src/Game/ClientVisuals.ts"],"sourcesContent":["import type { RpgClientEngine } from \"../RpgClientEngine\";\nimport type { RpgClientMap } from \"./Map\";\n\nexport type ClientVisualPosition = {\n x: number;\n y: number;\n z?: number;\n};\n\nexport type ClientVisualPayload = Record<string, any> & {\n source?: string;\n sourceId?: string;\n target?: string;\n targetId?: string;\n object?: string;\n objectId?: string;\n position?: ClientVisualPosition;\n};\n\nexport type ClientVisualPacket = {\n name: string;\n data?: ClientVisualPayload;\n};\n\nexport type ClientVisualObjectTarget = string | Record<string, any> | undefined | null;\nexport type ClientVisualComponentTarget =\n | ClientVisualObjectTarget\n | ClientVisualPosition;\n\nexport type ClientVisualContext = {\n name: string;\n data: ClientVisualPayload;\n engine: RpgClientEngine;\n scene: RpgClientMap;\n source?: any;\n target?: any;\n object?: any;\n position?: ClientVisualPosition;\n};\n\nexport type ClientVisualHelpers = {\n getObject(id?: string | null): any;\n flash(target?: ClientVisualObjectTarget, options?: Record<string, any>): void;\n showHit(target: ClientVisualObjectTarget, text: string): void;\n component(\n id: string,\n target?: ClientVisualComponentTarget,\n params?: Record<string, any>\n ): void;\n sound(id: string, options?: { volume?: number; loop?: boolean }): Promise<void>;\n animation(\n target: ClientVisualObjectTarget,\n animationName: string,\n options?: { graphic?: string | string[]; repeat?: number }\n ): void;\n shake(options?: {\n intensity?: number;\n duration?: number;\n frequency?: number;\n direction?: string;\n }): void;\n};\n\nexport type ClientVisualHandler = (\n context: ClientVisualContext,\n helpers: ClientVisualHelpers\n) => void | Promise<void>;\n\nexport type ClientVisualMap = Record<string, ClientVisualHandler>;\n\nconst isPosition = (value: any): value is ClientVisualPosition =>\n value &&\n typeof value === \"object\" &&\n typeof value.x === \"number\" &&\n typeof value.y === \"number\";\n\nconst resolvePosition = (data: ClientVisualPayload): ClientVisualPosition | undefined => {\n if (isPosition(data.position)) return data.position;\n if (typeof data.x === \"number\" && typeof data.y === \"number\") {\n return { x: data.x, y: data.y, z: data.z };\n }\n return undefined;\n};\n\nconst resolveObject = (engine: RpgClientEngine, target: ClientVisualObjectTarget) => {\n if (!target) return undefined;\n if (typeof target === \"string\") return engine.getObjectById(target);\n return target;\n};\n\nconst resolvePayloadObject = (\n engine: RpgClientEngine,\n data: ClientVisualPayload,\n keys: string[]\n) => {\n const id = keys\n .map((key) => data[key])\n .find((value) => typeof value === \"string\");\n return resolveObject(engine, id);\n};\n\nconst createClientVisualHelpers = (\n engine: RpgClientEngine\n): ClientVisualHelpers => ({\n getObject(id) {\n if (!id) return undefined;\n return engine.getObjectById(id);\n },\n flash(target, options = {}) {\n const object = resolveObject(engine, target);\n object?.flash?.(options);\n },\n showHit(target, text) {\n const object = resolveObject(engine, target);\n object?.showHit?.(text);\n },\n component(id, target, params = {}) {\n const object = isPosition(target) ? undefined : resolveObject(engine, target);\n const position = isPosition(target) ? target : undefined;\n const anchor = object ?? position;\n if (!anchor) return;\n engine.getComponentAnimation(id).displayEffect(params, anchor);\n },\n sound(id, options) {\n return engine.playSound(id, options);\n },\n animation(target, animationName, options = {}) {\n const object = resolveObject(engine, target);\n if (!object?.setAnimation) return;\n if (options.graphic !== undefined) {\n object.setAnimation(animationName, options.graphic, options.repeat ?? 1);\n return;\n }\n object.setAnimation(animationName, options.repeat ?? 1);\n },\n shake(options = {}) {\n engine.mapShakeTrigger.start(options);\n },\n});\n\nexport class ClientVisualRegistry {\n private readonly handlers = new Map<string, ClientVisualHandler>();\n\n register(name: string, handler: ClientVisualHandler) {\n this.handlers.set(name, handler);\n return handler;\n }\n\n registerMany(visuals: ClientVisualMap) {\n Object.entries(visuals).forEach(([name, handler]) => {\n this.register(name, handler);\n });\n }\n\n get(name: string) {\n return this.handlers.get(name);\n }\n\n async play(packet: ClientVisualPacket, engine: RpgClientEngine) {\n const handler = this.handlers.get(packet.name);\n if (!handler) {\n console.warn(`Client visual \"${packet.name}\" is not registered`);\n return;\n }\n\n const data = packet.data ?? {};\n const context: ClientVisualContext = {\n name: packet.name,\n data,\n engine,\n scene: engine.scene,\n source: resolvePayloadObject(engine, data, [\"sourceId\", \"source\"]),\n target: resolvePayloadObject(engine, data, [\"targetId\", \"target\"]),\n object: resolvePayloadObject(engine, data, [\"objectId\", \"object\"]),\n position: resolvePosition(data),\n };\n\n try {\n await handler(context, createClientVisualHelpers(engine));\n } catch (error) {\n console.error(`Client visual \"${packet.name}\" failed`, error);\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Event.js","names":[],"sources":["../../src/Game/Event.ts"],"sourcesContent":["import { RpgClientObject } from \"./Object\"; \n\nexport class RpgClientEvent extends RpgClientObject {\n _type = 'event'\n} "],"mappings":";;AAEA,IAAa,iBAAb,cAAoC,gBAAgB;;;eACxC"}
1
+ {"version":3,"file":"Event.js","names":[],"sources":["../../src/Game/Event.ts"],"sourcesContent":["import { RpgClientObject } from \"./Object\"; \n\nexport class RpgClientEvent extends RpgClientObject {\n _type = 'event'\n} "],"mappings":";;AAEA,IAAa,iBAAb,cAAoC,gBAAgB;;;eACxC;;AACZ"}
@@ -0,0 +1,16 @@
1
+ import { EventComponentConfig, EventComponentSprite } from '../RpgClient';
2
+ import { RpgClientEvent } from './Event';
3
+ export type EventComponentResolver = (event: EventComponentSprite) => EventComponentConfig | null | undefined;
4
+ export interface NormalizedEventComponentConfig {
5
+ component: any;
6
+ props: Record<string, any>;
7
+ dependencies: any[];
8
+ renderGraphic: boolean;
9
+ }
10
+ export declare class EventComponentResolverRegistry {
11
+ private resolvers;
12
+ add(resolver: EventComponentResolver): EventComponentResolver;
13
+ resolve(event: RpgClientEvent): EventComponentConfig | null;
14
+ clear(): void;
15
+ }
16
+ export declare function normalizeEventComponent(componentConfig: EventComponentConfig | null | undefined, sprite: RpgClientEvent): NormalizedEventComponentConfig | null;
@@ -0,0 +1,52 @@
1
+ //#region src/Game/EventComponentResolver.ts
2
+ var EventComponentResolverRegistry = class {
3
+ constructor() {
4
+ this.resolvers = [];
5
+ }
6
+ add(resolver) {
7
+ this.resolvers.push(resolver);
8
+ return resolver;
9
+ }
10
+ resolve(event) {
11
+ let resolved = null;
12
+ this.resolvers.forEach((resolver) => {
13
+ const result = resolver(event);
14
+ if (result !== void 0 && result !== null) resolved = result;
15
+ });
16
+ return resolved;
17
+ }
18
+ clear() {
19
+ this.resolvers = [];
20
+ }
21
+ };
22
+ function withoutReservedSpriteProp(props) {
23
+ if (!props || typeof props !== "object") return {};
24
+ const { sprite: _ignoredSprite, ...safeProps } = props;
25
+ return safeProps;
26
+ }
27
+ function normalizeEventComponent(componentConfig, sprite) {
28
+ if (!componentConfig) return null;
29
+ if (typeof componentConfig === "object" && "component" in componentConfig) {
30
+ const propsValue = componentConfig.props !== void 0 ? componentConfig.props : componentConfig.data;
31
+ const props = typeof propsValue === "function" ? propsValue(sprite) : propsValue;
32
+ return {
33
+ component: componentConfig.component,
34
+ props: {
35
+ ...withoutReservedSpriteProp(props),
36
+ sprite
37
+ },
38
+ dependencies: componentConfig.dependencies ? componentConfig.dependencies(sprite) : [],
39
+ renderGraphic: componentConfig.renderGraphic === true
40
+ };
41
+ }
42
+ return {
43
+ component: componentConfig,
44
+ props: { sprite },
45
+ dependencies: [],
46
+ renderGraphic: false
47
+ };
48
+ }
49
+ //#endregion
50
+ export { EventComponentResolverRegistry, normalizeEventComponent };
51
+
52
+ //# sourceMappingURL=EventComponentResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventComponentResolver.js","names":[],"sources":["../../src/Game/EventComponentResolver.ts"],"sourcesContent":["import type { EventComponentConfig, EventComponentSprite } from \"../RpgClient\";\nimport type { RpgClientEvent } from \"./Event\";\n\nexport type EventComponentResolver = (event: EventComponentSprite) => EventComponentConfig | null | undefined;\n\nexport interface NormalizedEventComponentConfig {\n component: any;\n props: Record<string, any>;\n dependencies: any[];\n renderGraphic: boolean;\n}\n\nexport class EventComponentResolverRegistry {\n private resolvers: EventComponentResolver[] = [];\n\n add(resolver: EventComponentResolver) {\n this.resolvers.push(resolver);\n return resolver;\n }\n\n resolve(event: RpgClientEvent): EventComponentConfig | null {\n let resolved: EventComponentConfig | null = null;\n this.resolvers.forEach((resolver) => {\n const result = resolver(event as EventComponentSprite);\n if (result !== undefined && result !== null) {\n resolved = result;\n }\n });\n return resolved;\n }\n\n clear() {\n this.resolvers = [];\n }\n}\n\nfunction withoutReservedSpriteProp(props: unknown): Record<string, any> {\n if (!props || typeof props !== \"object\") return {};\n const { sprite: _ignoredSprite, ...safeProps } = props as Record<string, any>;\n return safeProps;\n}\n\nexport function normalizeEventComponent(\n componentConfig: EventComponentConfig | null | undefined,\n sprite: RpgClientEvent\n): NormalizedEventComponentConfig | null {\n if (!componentConfig) return null;\n\n if (typeof componentConfig === \"object\" && \"component\" in componentConfig) {\n const propsValue = componentConfig.props !== undefined\n ? componentConfig.props\n : componentConfig.data;\n const props = typeof propsValue === \"function\"\n ? propsValue(sprite as EventComponentSprite)\n : propsValue;\n\n return {\n component: componentConfig.component,\n props: {\n ...withoutReservedSpriteProp(props),\n sprite\n },\n dependencies: componentConfig.dependencies ? componentConfig.dependencies(sprite as EventComponentSprite) : [],\n renderGraphic: componentConfig.renderGraphic === true\n };\n }\n\n return {\n component: componentConfig,\n props: { sprite },\n dependencies: [],\n renderGraphic: false\n };\n}\n"],"mappings":";AAYA,IAAa,iCAAb,MAA4C;;mBACI,CAAC;;CAE/C,IAAI,UAAkC;EACpC,KAAK,UAAU,KAAK,QAAQ;EAC5B,OAAO;CACT;CAEA,QAAQ,OAAoD;EAC1D,IAAI,WAAwC;EAC5C,KAAK,UAAU,SAAS,aAAa;GACnC,MAAM,SAAS,SAAS,KAA6B;GACrD,IAAI,WAAW,KAAA,KAAa,WAAW,MACrC,WAAW;EAEf,CAAC;EACD,OAAO;CACT;CAEA,QAAQ;EACN,KAAK,YAAY,CAAC;CACpB;AACF;AAEA,SAAS,0BAA0B,OAAqC;CACtE,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO,CAAC;CACjD,MAAM,EAAE,QAAQ,gBAAgB,GAAG,cAAc;CACjD,OAAO;AACT;AAEA,SAAgB,wBACd,iBACA,QACuC;CACvC,IAAI,CAAC,iBAAiB,OAAO;CAE7B,IAAI,OAAO,oBAAoB,YAAY,eAAe,iBAAiB;EACzE,MAAM,aAAa,gBAAgB,UAAU,KAAA,IACzC,gBAAgB,QAChB,gBAAgB;EACpB,MAAM,QAAQ,OAAO,eAAe,aAChC,WAAW,MAA8B,IACzC;EAEJ,OAAO;GACL,WAAW,gBAAgB;GAC3B,OAAO;IACL,GAAG,0BAA0B,KAAK;IAClC;GACF;GACA,cAAc,gBAAgB,eAAe,gBAAgB,aAAa,MAA8B,IAAI,CAAC;GAC7G,eAAe,gBAAgB,kBAAkB;EACnD;CACF;CAEA,OAAO;EACL,WAAW;EACX,OAAO,EAAE,OAAO;EAChB,cAAc,CAAC;EACf,eAAe;CACjB;AACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,4 @@
1
- import { RpgCommonMap, WeatherState, MapPhysicsInitContext, MapPhysicsEntityContext } from '@rpgjs/common';
1
+ import { RpgCommonMap, LightSpot, LightingState, WeatherState, MapPhysicsInitContext, MapPhysicsEntityContext } from '@rpgjs/common';
2
2
  import { RpgClientPlayer } from './Player';
3
3
  import { RpgClientEvent } from './Event';
4
4
  import { RpgClientEngine } from '../RpgClientEngine';
@@ -9,7 +9,10 @@ export declare class RpgClientMap extends RpgCommonMap<any> {
9
9
  currentPlayer: import('canvasengine').ComputedSignal<RpgClientPlayer>;
10
10
  weatherState: import('canvasengine').WritableSignal<WeatherState | null>;
11
11
  localWeatherOverride: import('canvasengine').WritableSignal<WeatherState | null>;
12
+ lightingState: import('canvasengine').WritableSignal<LightingState | null>;
13
+ localLightSpots: import('canvasengine').WritableObjectSignal<Record<string, LightSpot>>;
12
14
  weather: import('canvasengine').ComputedSignal<WeatherState | null>;
15
+ lighting: import('canvasengine').ComputedSignal<LightingState | null>;
13
16
  private manualClientPhysicsTick;
14
17
  private readonly isTestEnvironment;
15
18
  constructor();
@@ -19,6 +22,11 @@ export declare class RpgClientMap extends RpgCommonMap<any> {
19
22
  getWeather(): WeatherState | null;
20
23
  setLocalWeather(next: WeatherState | null): void;
21
24
  clearLocalWeather(): void;
25
+ getLighting(): LightingState | null;
26
+ addLightSpot(id: string, spot: LightSpot): void;
27
+ patchLightSpot(id: string, patch: Partial<LightSpot>): void;
28
+ removeLightSpot(id: string): void;
29
+ clearLightSpots(): void;
22
30
  stepClientPhysics(deltaMs: number): number;
23
31
  stepPredictionTick(): void;
24
32
  protected emitPhysicsInit(context: MapPhysicsInitContext): void;
package/dist/Game/Map.js CHANGED
@@ -1,13 +1,21 @@
1
1
  import { inject } from "../core/inject.js";
2
- import { sync, users } from "../node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/index.js";
2
+ import { sync, users } from "../node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/index.js";
3
3
  import { RpgClientPlayer } from "./Player.js";
4
4
  import { RpgClientEvent } from "./Event.js";
5
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js";
6
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
5
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.133.0/helpers/esm/decorateMetadata.js";
6
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.133.0/helpers/esm/decorate.js";
7
7
  import { RpgClientEngine } from "../RpgClientEngine.js";
8
8
  import { computed, signal } from "canvasengine";
9
- import { RpgCommonMap } from "@rpgjs/common";
9
+ import { RpgCommonMap, cloneLightingState, normalizeLightingState } from "@rpgjs/common";
10
10
  //#region src/Game/Map.ts
11
+ var lightingColorsEqual = (left, right) => {
12
+ if (Array.isArray(left) || Array.isArray(right)) return Array.isArray(left) && Array.isArray(right) && left.length === right.length && left.every((value, index) => value === right[index]);
13
+ return left === right;
14
+ };
15
+ var lightSpotsEqual = (left, right) => {
16
+ if (!left) return false;
17
+ return left.id === right.id && left.x === right.x && left.y === right.y && left.radius === right.radius && left.intensity === right.intensity && lightingColorsEqual(left.color, right.color) && left.flicker === right.flicker && left.flickerSpeed === right.flickerSpeed && left.pulse === right.pulse && left.pulseSpeed === right.pulseSpeed && left.phase === right.phase;
18
+ };
11
19
  var RpgClientMap = class extends RpgCommonMap {
12
20
  constructor() {
13
21
  super();
@@ -17,13 +25,28 @@ var RpgClientMap = class extends RpgCommonMap {
17
25
  this.currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()]);
18
26
  this.weatherState = signal(null);
19
27
  this.localWeatherOverride = signal(null);
28
+ this.lightingState = signal(null);
29
+ this.localLightSpots = signal({});
20
30
  this.weather = computed(() => {
21
31
  const local = this.localWeatherOverride();
22
32
  const state = this.weatherState();
23
33
  return local ?? state;
24
34
  });
35
+ this.lighting = computed(() => {
36
+ const state = cloneLightingState(this.lightingState());
37
+ const localSpots = Object.entries(this.localLightSpots()).map(([id, spot]) => ({
38
+ ...spot,
39
+ id: spot.id ?? id
40
+ }));
41
+ if (!state && localSpots.length === 0) return null;
42
+ const next = { ...state ?? {} };
43
+ if (!state?.ambient) delete next.ambient;
44
+ next.spots = [...state?.spots ?? [], ...localSpots];
45
+ return next;
46
+ });
25
47
  this.manualClientPhysicsTick = false;
26
- const isTest = typeof process !== "undefined" && process.env?.TEST === "true" || typeof window !== "undefined" && window.__RPGJS_TEST__ === true;
48
+ const testGlobal = globalThis;
49
+ const isTest = testGlobal.process?.env?.TEST === "true" || testGlobal.__RPGJS_TEST__ === true;
27
50
  this.isTestEnvironment = isTest;
28
51
  if (isTest) this.autoTickEnabled = false;
29
52
  }
@@ -37,10 +60,21 @@ var RpgClientMap = class extends RpgCommonMap {
37
60
  reset(force = false) {
38
61
  const currentPlayerId = this.engine.playerIdSignal();
39
62
  const currentPlayer = !force && currentPlayerId ? this.players()[currentPlayerId] : void 0;
63
+ const players = this.players();
64
+ const events = this.events();
65
+ Object.entries(players).forEach(([id, player]) => {
66
+ if (!player || !force && id === currentPlayerId) return;
67
+ player.resetAnimationState?.();
68
+ });
69
+ Object.values(events).forEach((event) => {
70
+ event?.resetAnimationState?.();
71
+ });
40
72
  this.players.set(currentPlayerId && currentPlayer ? { [currentPlayerId]: currentPlayer } : {});
41
73
  this.events.set({});
42
74
  this.weatherState.set(null);
43
75
  this.localWeatherOverride.set(null);
76
+ this.lightingState.set(null);
77
+ this.localLightSpots.set({});
44
78
  this.clearPhysic();
45
79
  }
46
80
  getWeather() {
@@ -52,6 +86,50 @@ var RpgClientMap = class extends RpgCommonMap {
52
86
  clearLocalWeather() {
53
87
  this.localWeatherOverride.set(null);
54
88
  }
89
+ getLighting() {
90
+ return this.lighting();
91
+ }
92
+ addLightSpot(id, spot) {
93
+ const nextSpot = normalizeLightingState({ spots: [{
94
+ ...spot,
95
+ id
96
+ }] })?.spots?.[0];
97
+ if (!nextSpot) return;
98
+ this.localLightSpots.update((spots) => {
99
+ if (lightSpotsEqual(spots[id], nextSpot)) return spots;
100
+ return {
101
+ ...spots,
102
+ [id]: nextSpot
103
+ };
104
+ });
105
+ }
106
+ patchLightSpot(id, patch) {
107
+ this.localLightSpots.update((spots) => {
108
+ const current = spots[id];
109
+ if (!current) return spots;
110
+ return {
111
+ ...spots,
112
+ [id]: {
113
+ ...current,
114
+ ...patch,
115
+ id,
116
+ x: patch.x ?? current.x,
117
+ y: patch.y ?? current.y
118
+ }
119
+ };
120
+ });
121
+ }
122
+ removeLightSpot(id) {
123
+ this.localLightSpots.update((spots) => {
124
+ if (!(id in spots)) return spots;
125
+ const next = { ...spots };
126
+ delete next[id];
127
+ return next;
128
+ });
129
+ }
130
+ clearLightSpots() {
131
+ this.localLightSpots.set({});
132
+ }
55
133
  stepClientPhysics(deltaMs) {
56
134
  if (!this.manualClientPhysicsTick) return 0;
57
135
  return this.nextTick(deltaMs);
@@ -1 +1 @@
1
- {"version":3,"file":"Map.js","names":[],"sources":["../../src/Game/Map.ts"],"sourcesContent":["import {\n RpgCommonMap,\n type WeatherState,\n type MapPhysicsInitContext,\n type MapPhysicsEntityContext,\n} from \"@rpgjs/common\";\nimport { sync, users } from \"@signe/sync\";\nimport { RpgClientPlayer } from \"./Player\";\nimport { Signal, signal, computed, effect } from \"canvasengine\";\nimport { RpgClientEvent } from \"./Event\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { inject } from \"../core/inject\";\n\nexport class RpgClientMap extends RpgCommonMap<any> {\n engine: RpgClientEngine = inject(RpgClientEngine)\n @users(RpgClientPlayer) players = signal<Record<string, RpgClientPlayer>>({});\n @sync(RpgClientEvent) events = signal<Record<string, RpgClientEvent>>({});\n currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()!])\n weatherState = signal<WeatherState | null>(null);\n localWeatherOverride = signal<WeatherState | null>(null);\n weather = computed<WeatherState | null>(() => {\n const local = this.localWeatherOverride() \n const state = this.weatherState()\n return local ?? state\n });\n private manualClientPhysicsTick = false;\n private readonly isTestEnvironment: boolean;\n\n constructor() {\n super();\n // Détecter l'environnement de test\n const isTest = (typeof process !== 'undefined' && process.env?.TEST === 'true')\n || (typeof window !== 'undefined' && (window as any).__RPGJS_TEST__ === true);\n this.isTestEnvironment = isTest;\n if (isTest) {\n this.autoTickEnabled = false;\n }\n }\n\n configureClientPrediction(enabled: boolean): void {\n this.manualClientPhysicsTick = enabled;\n this.autoTickEnabled = enabled ? false : !this.isTestEnvironment;\n }\n\n getCurrentPlayer() {\n return this.currentPlayer()\n }\n\n reset(force = false) {\n const currentPlayerId = this.engine.playerIdSignal();\n const currentPlayer = !force && currentPlayerId\n ? this.players()[currentPlayerId]\n : undefined;\n\n this.players.set(\n currentPlayerId && currentPlayer ? { [currentPlayerId]: currentPlayer } : {}\n );\n this.events.set({})\n this.weatherState.set(null);\n this.localWeatherOverride.set(null);\n this.clearPhysic()\n }\n\n getWeather(): WeatherState | null {\n return this.weather();\n }\n\n setLocalWeather(next: WeatherState | null): void {\n this.localWeatherOverride.set(next);\n }\n\n clearLocalWeather(): void {\n this.localWeatherOverride.set(null);\n }\n\n stepClientPhysics(deltaMs: number): number {\n if (!this.manualClientPhysicsTick) {\n return 0;\n }\n return this.nextTick(deltaMs);\n }\n\n stepPredictionTick(): void {\n this.forceSingleTick();\n }\n\n protected emitPhysicsInit(context: MapPhysicsInitContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsInit\", this, context);\n }\n\n protected emitPhysicsEntityAdd(context: MapPhysicsEntityContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsEntityAdd\", this, context);\n }\n\n protected emitPhysicsEntityRemove(context: MapPhysicsEntityContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsEntityRemove\", this, context);\n }\n\n protected emitPhysicsReset(): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsReset\", this);\n }\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAa,eAAb,cAAkC,aAAkB;CAelD,cAAc;AACZ,SAAO;gBAfiB,OAAO,gBAAgB;iBACf,OAAwC,EAAE,CAAC;gBAC9C,OAAuC,EAAE,CAAC;uBACzD,eAAe,KAAK,SAAS,CAAC,KAAK,OAAO,gBAAgB,EAAG;sBAC9D,OAA4B,KAAK;8BACzB,OAA4B,KAAK;iBAC9C,eAAoC;GAC5C,MAAM,QAAQ,KAAK,sBAAsB;GACzC,MAAM,QAAQ,KAAK,cAAc;AACjC,UAAO,SAAS;IAChB;iCACgC;EAMhC,MAAM,SAAU,OAAO,YAAY,eAAe,QAAQ,KAAK,SAAS,UAClE,OAAO,WAAW,eAAgB,OAAe,mBAAmB;AAC1E,OAAK,oBAAoB;AACzB,MAAI,OACF,MAAK,kBAAkB;;CAI3B,0BAA0B,SAAwB;AAChD,OAAK,0BAA0B;AAC/B,OAAK,kBAAkB,UAAU,QAAQ,CAAC,KAAK;;CAGjD,mBAAmB;AACjB,SAAO,KAAK,eAAe;;CAG7B,MAAM,QAAQ,OAAO;EACnB,MAAM,kBAAkB,KAAK,OAAO,gBAAgB;EACpD,MAAM,gBAAgB,CAAC,SAAS,kBAC5B,KAAK,SAAS,CAAC,mBACf,KAAA;AAEJ,OAAK,QAAQ,IACX,mBAAmB,gBAAgB,GAAG,kBAAkB,eAAe,GAAG,EAAE,CAC7E;AACD,OAAK,OAAO,IAAI,EAAE,CAAC;AACnB,OAAK,aAAa,IAAI,KAAK;AAC3B,OAAK,qBAAqB,IAAI,KAAK;AACnC,OAAK,aAAa;;CAGpB,aAAkC;AAChC,SAAO,KAAK,SAAS;;CAGvB,gBAAgB,MAAiC;AAC/C,OAAK,qBAAqB,IAAI,KAAK;;CAGrC,oBAA0B;AACxB,OAAK,qBAAqB,IAAI,KAAK;;CAGrC,kBAAkB,SAAyB;AACzC,MAAI,CAAC,KAAK,wBACR,QAAO;AAET,SAAO,KAAK,SAAS,QAAQ;;CAG/B,qBAA2B;AACzB,OAAK,iBAAiB;;CAGxB,gBAA0B,SAAsC;AAC9D,OAAK,QAAQ,mBAAmB,iBAAiB,MAAM,QAAQ;;CAGjE,qBAA+B,SAAwC;AACrE,OAAK,QAAQ,mBAAmB,sBAAsB,MAAM,QAAQ;;CAGtE,wBAAkC,SAAwC;AACxE,OAAK,QAAQ,mBAAmB,yBAAyB,MAAM,QAAQ;;CAGzE,mBAAmC;AACjC,OAAK,QAAQ,mBAAmB,kBAAkB,KAAK;;;YApFxD,MAAM,gBAAgB,EAAA,mBAAA,eAAA,OAAA,CAAA,EAAA,aAAA,WAAA,WAAA,KAAA,EAAA;YACtB,KAAK,eAAe,EAAA,mBAAA,eAAA,OAAA,CAAA,EAAA,aAAA,WAAA,UAAA,KAAA,EAAA"}
1
+ {"version":3,"file":"Map.js","names":[],"sources":["../../src/Game/Map.ts"],"sourcesContent":["import {\n RpgCommonMap,\n cloneLightingState,\n normalizeLightingState,\n type LightSpot,\n type LightingState,\n type WeatherState,\n type MapPhysicsInitContext,\n type MapPhysicsEntityContext,\n} from \"@rpgjs/common\";\nimport { sync, users } from \"@signe/sync\";\nimport { RpgClientPlayer } from \"./Player\";\nimport { Signal, signal, computed, effect } from \"canvasengine\";\nimport { RpgClientEvent } from \"./Event\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { inject } from \"../core/inject\";\n\ntype TestGlobalScope = typeof globalThis & {\n process?: {\n env?: {\n TEST?: string;\n };\n };\n __RPGJS_TEST__?: boolean;\n};\n\nconst lightingColorsEqual = (\n left: LightSpot[\"color\"],\n right: LightSpot[\"color\"],\n): boolean => {\n if (Array.isArray(left) || Array.isArray(right)) {\n return Array.isArray(left)\n && Array.isArray(right)\n && left.length === right.length\n && left.every((value, index) => value === right[index]);\n }\n return left === right;\n};\n\nconst lightSpotsEqual = (left: LightSpot | undefined, right: LightSpot): boolean => {\n if (!left) return false;\n return left.id === right.id\n && left.x === right.x\n && left.y === right.y\n && left.radius === right.radius\n && left.intensity === right.intensity\n && lightingColorsEqual(left.color, right.color)\n && left.flicker === right.flicker\n && left.flickerSpeed === right.flickerSpeed\n && left.pulse === right.pulse\n && left.pulseSpeed === right.pulseSpeed\n && left.phase === right.phase;\n};\n\nexport class RpgClientMap extends RpgCommonMap<any> {\n engine: RpgClientEngine = inject(RpgClientEngine)\n @users(RpgClientPlayer) players = signal<Record<string, RpgClientPlayer>>({});\n @sync(RpgClientEvent) events = signal<Record<string, RpgClientEvent>>({});\n currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()!])\n weatherState = signal<WeatherState | null>(null);\n localWeatherOverride = signal<WeatherState | null>(null);\n lightingState = signal<LightingState | null>(null);\n localLightSpots = signal<Record<string, LightSpot>>({});\n weather = computed<WeatherState | null>(() => {\n const local = this.localWeatherOverride() \n const state = this.weatherState()\n return local ?? state\n });\n lighting = computed<LightingState | null>(() => {\n const state = cloneLightingState(this.lightingState());\n const localSpots = Object.entries(this.localLightSpots()).map(([id, spot]) => ({\n ...spot,\n id: spot.id ?? id,\n }));\n\n if (!state && localSpots.length === 0) {\n return null;\n }\n\n const next: LightingState = { ...(state ?? {}) };\n if (!state?.ambient) {\n delete next.ambient;\n }\n next.spots = [\n ...(state?.spots ?? []),\n ...localSpots,\n ];\n return next;\n });\n private manualClientPhysicsTick = false;\n private readonly isTestEnvironment: boolean;\n\n constructor() {\n super();\n // Détecter l'environnement de test\n const testGlobal = globalThis as TestGlobalScope;\n const isTest = testGlobal.process?.env?.TEST === 'true'\n || testGlobal.__RPGJS_TEST__ === true;\n this.isTestEnvironment = isTest;\n if (isTest) {\n this.autoTickEnabled = false;\n }\n }\n\n configureClientPrediction(enabled: boolean): void {\n this.manualClientPhysicsTick = enabled;\n this.autoTickEnabled = enabled ? false : !this.isTestEnvironment;\n }\n\n getCurrentPlayer() {\n return this.currentPlayer()\n }\n\n reset(force = false) {\n const currentPlayerId = this.engine.playerIdSignal();\n const currentPlayer = !force && currentPlayerId\n ? this.players()[currentPlayerId]\n : undefined;\n const players = this.players();\n const events = this.events();\n\n Object.entries(players).forEach(([id, player]) => {\n if (!player || (!force && id === currentPlayerId)) return;\n (player as any).resetAnimationState?.();\n });\n Object.values(events).forEach((event) => {\n (event as any)?.resetAnimationState?.();\n });\n\n this.players.set(\n currentPlayerId && currentPlayer ? { [currentPlayerId]: currentPlayer } : {}\n );\n this.events.set({})\n this.weatherState.set(null);\n this.localWeatherOverride.set(null);\n this.lightingState.set(null);\n this.localLightSpots.set({});\n this.clearPhysic()\n }\n\n getWeather(): WeatherState | null {\n return this.weather();\n }\n\n setLocalWeather(next: WeatherState | null): void {\n this.localWeatherOverride.set(next);\n }\n\n clearLocalWeather(): void {\n this.localWeatherOverride.set(null);\n }\n\n getLighting(): LightingState | null {\n return this.lighting();\n }\n\n addLightSpot(id: string, spot: LightSpot): void {\n const normalized = normalizeLightingState({ spots: [{ ...spot, id }] });\n const nextSpot = normalized?.spots?.[0];\n if (!nextSpot) {\n return;\n }\n this.localLightSpots.update((spots) => {\n if (lightSpotsEqual(spots[id], nextSpot)) {\n return spots;\n }\n return {\n ...spots,\n [id]: nextSpot,\n };\n });\n }\n\n patchLightSpot(id: string, patch: Partial<LightSpot>): void {\n this.localLightSpots.update((spots) => {\n const current = spots[id];\n if (!current) {\n return spots;\n }\n return {\n ...spots,\n [id]: {\n ...current,\n ...patch,\n id,\n x: patch.x ?? current.x,\n y: patch.y ?? current.y,\n },\n };\n });\n }\n\n removeLightSpot(id: string): void {\n this.localLightSpots.update((spots) => {\n if (!(id in spots)) {\n return spots;\n }\n const next = { ...spots };\n delete next[id];\n return next;\n });\n }\n\n clearLightSpots(): void {\n this.localLightSpots.set({});\n }\n\n stepClientPhysics(deltaMs: number): number {\n if (!this.manualClientPhysicsTick) {\n return 0;\n }\n return this.nextTick(deltaMs);\n }\n\n stepPredictionTick(): void {\n this.forceSingleTick();\n }\n\n protected emitPhysicsInit(context: MapPhysicsInitContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsInit\", this, context);\n }\n\n protected emitPhysicsEntityAdd(context: MapPhysicsEntityContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsEntityAdd\", this, context);\n }\n\n protected emitPhysicsEntityRemove(context: MapPhysicsEntityContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsEntityRemove\", this, context);\n }\n\n protected emitPhysicsReset(): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsReset\", this);\n }\n}\n"],"mappings":"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"}