@rpgjs/client 5.0.0-beta.26 → 5.0.0-beta.28

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 (135) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/Game/AnimationManager.js.map +1 -1
  3. package/dist/Game/ClientVisuals.js.map +1 -1
  4. package/dist/Game/Map.js +2 -2
  5. package/dist/Game/Map.js.map +1 -1
  6. package/dist/Game/Object.js +1 -1
  7. package/dist/Game/Object.js.map +1 -1
  8. package/dist/Game/ProjectileManager.js.map +1 -1
  9. package/dist/Gui/Gui.d.ts +36 -17
  10. package/dist/Gui/Gui.js +40 -22
  11. package/dist/Gui/Gui.js.map +1 -1
  12. package/dist/Gui/NotificationManager.js.map +1 -1
  13. package/dist/RpgClient.d.ts +3 -64
  14. package/dist/RpgClientEngine.js +1 -1
  15. package/dist/RpgClientEngine.js.map +1 -1
  16. package/dist/_virtual/{_@oxc-project_runtime@0.133.0 → _@oxc-project_runtime@0.139.0}/helpers/esm/decorate.js +2 -2
  17. package/dist/_virtual/{_@oxc-project_runtime@0.133.0 → _@oxc-project_runtime@0.139.0}/helpers/esm/decorateMetadata.js +2 -2
  18. package/dist/components/animations/animation.ce.js.map +1 -1
  19. package/dist/components/animations/fx.ce.js.map +1 -1
  20. package/dist/components/animations/hit.ce.js.map +1 -1
  21. package/dist/components/character-hitbox.js +1 -1
  22. package/dist/components/character.ce.js +3 -1
  23. package/dist/components/character.ce.js.map +1 -1
  24. package/dist/components/dynamics/bar.ce.js.map +1 -1
  25. package/dist/components/dynamics/image.ce.js.map +1 -1
  26. package/dist/components/dynamics/parse-value.js +1 -1
  27. package/dist/components/dynamics/parse-value.js.map +1 -1
  28. package/dist/components/dynamics/shape-utils.js +1 -1
  29. package/dist/components/dynamics/shape.ce.js.map +1 -1
  30. package/dist/components/dynamics/text.ce.js.map +1 -1
  31. package/dist/components/gui/box.ce.js.map +1 -1
  32. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  33. package/dist/components/gui/gameover.ce.js.map +1 -1
  34. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  35. package/dist/components/gui/index.js +17 -16
  36. package/dist/components/gui/input-field.ce.js.map +1 -1
  37. package/dist/components/gui/input.ce.js.map +1 -1
  38. package/dist/components/gui/menu/equip-menu.ce.js +1 -1
  39. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  40. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  41. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  42. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  43. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  44. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  45. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  46. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  47. package/dist/components/gui/save-load.ce.js.map +1 -1
  48. package/dist/components/gui/shop/shop.ce.js +4 -2
  49. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  50. package/dist/components/gui/title-screen.ce.js.map +1 -1
  51. package/dist/components/index.js +4 -3
  52. package/dist/components/interaction-components.ce.js.map +1 -1
  53. package/dist/components/player-components-utils.js +1 -1
  54. package/dist/components/player-components-utils.js.map +1 -1
  55. package/dist/components/player-components.ce.js.map +1 -1
  56. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  57. package/dist/components/prebuilt/index.js +3 -2
  58. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  59. package/dist/components/scenes/canvas.ce.js.map +1 -1
  60. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  61. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  62. package/dist/components/scenes/weather-tick-lifecycle.js.map +1 -1
  63. package/dist/core/inject.d.ts +4 -4
  64. package/dist/core/inject.js.map +1 -1
  65. package/dist/core/setup.d.ts +3 -3
  66. package/dist/core/setup.js +1 -1
  67. package/dist/core/setup.js.map +1 -1
  68. package/dist/core/setup.spec.d.ts +1 -0
  69. package/dist/i18n.d.ts +1 -1
  70. package/dist/index.d.ts +1 -1
  71. package/dist/index.js +1 -2
  72. package/dist/module.d.ts +2 -2
  73. package/dist/module.js.map +1 -1
  74. package/dist/node_modules/.pnpm/@signe_di@3.1.0/node_modules/@signe/di/dist/index.js +1 -1
  75. package/dist/node_modules/.pnpm/@signe_reactive@3.1.0/node_modules/@signe/reactive/dist/index.js +1 -1
  76. package/dist/node_modules/.pnpm/@signe_reactive@3.1.0/node_modules/@signe/reactive/dist/index.js.map +1 -1
  77. package/dist/node_modules/.pnpm/@signe_room@3.1.0_react@19.2.7/node_modules/@signe/room/dist/index.js +2 -2
  78. package/dist/node_modules/.pnpm/@signe_room@3.1.0_react@19.2.7/node_modules/@signe/room/dist/index.js.map +1 -1
  79. package/dist/node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/client/index.js +1 -1
  80. package/dist/node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/index.js +1 -1
  81. package/dist/node_modules/.pnpm/@signe_sync@3.1.0_react@19.2.7/node_modules/@signe/sync/dist/index.js.map +1 -1
  82. package/dist/node_modules/.pnpm/partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/index.js +2 -2
  83. package/dist/node_modules/.pnpm/partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/index.js.map +1 -1
  84. package/dist/node_modules/.pnpm/partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/ws.js +1 -1
  85. package/dist/node_modules/.pnpm/partysocket@1.2.0_react@19.2.7/node_modules/partysocket/dist/ws.js.map +1 -1
  86. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js +7 -7
  87. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js.map +1 -1
  88. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js +1 -1
  89. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js +2 -2
  90. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js.map +1 -1
  91. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js.map +1 -1
  92. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js.map +1 -1
  93. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js +1 -1
  94. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js.map +1 -1
  95. package/dist/presets/faceset.js.map +1 -1
  96. package/dist/presets/rmspritesheet.js.map +1 -1
  97. package/dist/public-api-types.spec.d.ts +1 -0
  98. package/dist/services/AbstractSocket.d.ts +3 -3
  99. package/dist/services/AbstractSocket.js.map +1 -1
  100. package/dist/services/cameraFollow.js +1 -1
  101. package/dist/services/cameraFollow.js.map +1 -1
  102. package/dist/services/interactions.js.map +1 -1
  103. package/dist/services/loadMap.d.ts +3 -7
  104. package/dist/services/loadMap.js +2 -2
  105. package/dist/services/loadMap.js.map +1 -1
  106. package/dist/services/mapStreaming.d.ts +2 -16
  107. package/dist/services/mapStreaming.js.map +1 -1
  108. package/dist/services/mmorpg-connection.js +1 -1
  109. package/dist/services/mmorpg-connection.js.map +1 -1
  110. package/dist/services/mmorpg.d.ts +4 -26
  111. package/dist/services/mmorpg.js.map +1 -1
  112. package/dist/services/pointerContext.js +2 -1
  113. package/dist/services/pointerContext.js.map +1 -1
  114. package/dist/services/save.js.map +1 -1
  115. package/dist/services/standalone.d.ts +2 -98
  116. package/dist/services/standalone.js.map +1 -1
  117. package/dist/utils/getEntityProp.js.map +1 -1
  118. package/dist/utils/syncHitbox.js.map +1 -1
  119. package/package.json +10 -10
  120. package/src/Game/Object.spec.ts +1 -1
  121. package/src/Game/Object.ts +4 -4
  122. package/src/Gui/Gui.spec.ts +26 -1
  123. package/src/Gui/Gui.ts +104 -40
  124. package/src/RpgClient.ts +2 -63
  125. package/src/core/inject.ts +6 -5
  126. package/src/core/setup.spec.ts +35 -0
  127. package/src/core/setup.ts +8 -6
  128. package/src/index.ts +12 -1
  129. package/src/module.ts +2 -2
  130. package/src/public-api-types.spec.ts +37 -0
  131. package/src/services/AbstractSocket.ts +2 -2
  132. package/src/services/loadMap.ts +8 -8
  133. package/src/services/mapStreaming.ts +7 -5
  134. package/src/services/mmorpg.ts +6 -7
  135. package/src/services/standalone.ts +4 -5
@@ -1 +1 @@
1
- {"version":3,"file":"text.ce.js","names":[],"sources":["../../../src/components/dynamics/text.ce"],"sourcesContent":["<Text text={textValue} color={textColor} size={textSize} fontFamily={textFontFamily} style={textStyle} />\n\n<script>\nimport { computed } from \"canvasengine\";\nimport { resolveDynamicValue } from \"./parse-value\";\n\nconst { object, value, style } = defineProps();\nconst sprite = object();\n\nconst read = (prop, fallback) => prop ? prop() : fallback;\n\nconst parseNumericStyleValue = (value, object) => {\n value = resolveDynamicValue(value, sprite);\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'number') return value;\n\n const num = parseFloat(value);\n return isNaN(num) ? undefined : num;\n};\n\nconst getTextStyle = (style) => {\n if (!style) return {};\n const textStyle = {};\n\n if (style.fontStyle !== undefined) {\n textStyle.fontStyle = resolveDynamicValue(style.fontStyle, sprite);\n }\n\n if (style.fontWeight !== undefined) {\n textStyle.fontWeight = resolveDynamicValue(style.fontWeight, sprite);\n }\n\n if (style.stroke !== undefined) {\n textStyle.stroke = resolveDynamicValue(style.stroke, sprite);\n }\n\n if (style.opacity !== undefined) {\n const opacityValue = parseNumericStyleValue(style.opacity, object);\n if (opacityValue !== undefined) {\n textStyle.opacity = opacityValue;\n }\n }\n\n if (style.wordWrap !== undefined) {\n textStyle.wordWrap = style.wordWrap;\n }\n\n if (style.align !== undefined) {\n textStyle.align = resolveDynamicValue(style.align, sprite);\n }\n\n return textStyle;\n};\n\nconst textValue = computed(() => String(resolveDynamicValue(read(value, ''), sprite) ?? ''));\nconst textColor = computed(() => {\n const currentStyle = read(style, {});\n return currentStyle.fill !== undefined ? resolveDynamicValue(currentStyle.fill, sprite) : undefined;\n});\nconst textSize = computed(() => {\n const currentStyle = read(style, {});\n return currentStyle.fontSize !== undefined ? parseNumericStyleValue(currentStyle.fontSize, object) : undefined;\n});\nconst textFontFamily = computed(() => {\n const currentStyle = read(style, {});\n return currentStyle.fontFamily !== undefined ? resolveDynamicValue(currentStyle.fontFamily, sprite) : undefined;\n});\nconst textStyle = computed(() => getTextStyle(read(style, {})));\n</script>\n"],"mappings":";;;AAOM,SAAS,UAAQ,SAAA;;CAEjB,MAAQ,cAAc,eAAY,OAAS;;CAE3C,MAAA,EAAA,QAAA,OAAyB,UAAQ,YAAW;CAClD,MAAI,SAAQ,OAAA;CACZ,MAAM,QAAQ,MAAI,aAAa,OAAS,KAAK,IAAE;CAC/C,MAAM,0BAA0B,OAAG,WAAY;;EAE3C,IAAA,UAAY,KAAA,KAAW,UAAM,MAC7B,OAAO,KAAA;EACV,IAAA,OAAA,UAAA,UAAA,OAAA;EAED,MAAM,MAAA,WAAqB,KAAK;EAC5B,OAAK,MAAO,GAAA,IAAQ,KAAA,IAAC;CACzB;;EAEI,IAAI,CAAA,OACA,OAAA,CAAA;EACJ,MAAA,YAAA,CAAA;kCAEI,UAAM,YAAe,oBAAW,MAAA,WAAA,MAAA;EAEpC,IAAA,MAAA,eAAA,KAAA,GAAA,UAAA,aAAA,oBAAA,MAAA,YAAA,MAAA;EAGA,IAAI,MAAA,WAAiB,KAAA,GACrB,UAAA,SAAA,oBAAA,MAAA,QAAA,MAAA;EAEA,IAAI,MAAM,YAAY,KAAA,GAAW;GAC7B,MAAM,eAAe,uBAAuB,MAAM,SAAS,MAAM;GACjE,IAAI,iBAAiB,KAAA,GACjB,UAAU,UAAU;EAE5B;iCAEI,UAAM,WAAa,MAAA;EAEvB,IAAA,MAAA,UAAA,KAAA,GAAA,UAAA,QAAA,oBAAA,MAAA,OAAA,MAAA;EAGA,OAAI;CACR;CAgBI,OADM,EAAY,MAAG;EAAK,MAAA,eAAA,OAAA,oBAAA,KAAA,OAAA,EAAA,GAAA,MAAA,KAAA,EAAA,CAAU;EAAA,OAb7B,eAAS;GACnB,MAAA,eAAA,KAAA,OAAA,CAAA,CAAA;;EAED,CAUwC;EAAA,MATvB,eAAe;GAC5B,MAAM,eAAe,KAAK,OAAO,CAAC,CAAC;GACnC,OAAO,aAAa,aAAS,KAAA,IAAY,uBAAoB,aAAmB,UAAU,MAAA,IAAS,KAAA;EACvG,CAMwC;EAAA,YALvB,eAAe;GAC5B,MAAM,eAAe,KAAK,OAAO,CAAC,CAAC;GACnC,OAAO,aAAa,eAAa,KAAA,IAAY,oBAAsB,aAAa,YAAW,MAAO,IAAG,KAAA;EACzG,CAEwC;EAAA,OADlC,eAA2B,aAAK,KAAA,OAAA,CAAA,CAAA,CAAA,CACE;CAAA,CAC7B;AACT;AAEA,IAAM,iBAAA"}
1
+ {"version":3,"file":"text.ce.js","names":[],"sources":["../../../src/components/dynamics/text.ce"],"sourcesContent":["<Text text={textValue} color={textColor} size={textSize} fontFamily={textFontFamily} style={textStyle} />\n\n<script>\nimport { computed } from \"canvasengine\";\nimport { resolveDynamicValue } from \"./parse-value\";\n\nconst { object, value, style } = defineProps();\nconst sprite = object();\n\nconst read = (prop, fallback) => prop ? prop() : fallback;\n\nconst parseNumericStyleValue = (value, object) => {\n value = resolveDynamicValue(value, sprite);\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'number') return value;\n\n const num = parseFloat(value);\n return isNaN(num) ? undefined : num;\n};\n\nconst getTextStyle = (style) => {\n if (!style) return {};\n const textStyle = {};\n\n if (style.fontStyle !== undefined) {\n textStyle.fontStyle = resolveDynamicValue(style.fontStyle, sprite);\n }\n\n if (style.fontWeight !== undefined) {\n textStyle.fontWeight = resolveDynamicValue(style.fontWeight, sprite);\n }\n\n if (style.stroke !== undefined) {\n textStyle.stroke = resolveDynamicValue(style.stroke, sprite);\n }\n\n if (style.opacity !== undefined) {\n const opacityValue = parseNumericStyleValue(style.opacity, object);\n if (opacityValue !== undefined) {\n textStyle.opacity = opacityValue;\n }\n }\n\n if (style.wordWrap !== undefined) {\n textStyle.wordWrap = style.wordWrap;\n }\n\n if (style.align !== undefined) {\n textStyle.align = resolveDynamicValue(style.align, sprite);\n }\n\n return textStyle;\n};\n\nconst textValue = computed(() => String(resolveDynamicValue(read(value, ''), sprite) ?? ''));\nconst textColor = computed(() => {\n const currentStyle = read(style, {});\n return currentStyle.fill !== undefined ? resolveDynamicValue(currentStyle.fill, sprite) : undefined;\n});\nconst textSize = computed(() => {\n const currentStyle = read(style, {});\n return currentStyle.fontSize !== undefined ? parseNumericStyleValue(currentStyle.fontSize, object) : undefined;\n});\nconst textFontFamily = computed(() => {\n const currentStyle = read(style, {});\n return currentStyle.fontFamily !== undefined ? resolveDynamicValue(currentStyle.fontFamily, sprite) : undefined;\n});\nconst textStyle = computed(() => getTextStyle(read(style, {})));\n</script>\n"],"mappings":";;;AAOM,SAAS,UAAU,SAAS;CACX,SAAS,OAAO;CAC/B,MAAM,cAAc,eAAe,OAAO;CACtB,eAAe,OAAO;CAC1C,MAAM,EAAE,QAAQ,OAAO,UAAU,YAAY;CACrD,MAAM,SAAS,OAAO;CACtB,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAK,IAAI;CACjD,MAAM,0BAA0B,OAAO,WAAW;EAC9C,QAAQ,oBAAoB,OAAO,MAAM;EACzC,IAAI,UAAU,KAAA,KAAa,UAAU,MACjC,OAAO,KAAA;EACX,IAAI,OAAO,UAAU,UACjB,OAAO;EACX,MAAM,MAAM,WAAW,KAAK;EAC5B,OAAO,MAAM,GAAG,IAAI,KAAA,IAAY;CACpC;CACA,MAAM,gBAAgB,UAAU;EAC5B,IAAI,CAAC,OACD,OAAO,CAAC;EACZ,MAAM,YAAY,CAAC;EACnB,IAAI,MAAM,cAAc,KAAA,GACpB,UAAU,YAAY,oBAAoB,MAAM,WAAW,MAAM;EAErE,IAAI,MAAM,eAAe,KAAA,GACrB,UAAU,aAAa,oBAAoB,MAAM,YAAY,MAAM;EAEvE,IAAI,MAAM,WAAW,KAAA,GACjB,UAAU,SAAS,oBAAoB,MAAM,QAAQ,MAAM;EAE/D,IAAI,MAAM,YAAY,KAAA,GAAW;GAC7B,MAAM,eAAe,uBAAuB,MAAM,SAAS,MAAM;GACjE,IAAI,iBAAiB,KAAA,GACjB,UAAU,UAAU;EAE5B;EACA,IAAI,MAAM,aAAa,KAAA,GACnB,UAAU,WAAW,MAAM;EAE/B,IAAI,MAAM,UAAU,KAAA,GAChB,UAAU,QAAQ,oBAAoB,MAAM,OAAO,MAAM;EAE7D,OAAO;CACX;CAgBQ,OADY,EAAE,MAAM;EAAE,MAdZ,eAAe,OAAO,oBAAoB,KAAK,OAAO,EAAE,GAAG,MAAM,KAAK,EAAE,CAc9C;EAAG,OAb7B,eAAe;GAC7B,MAAM,eAAe,KAAK,OAAO,CAAC,CAAC;GACnC,OAAO,aAAa,SAAS,KAAA,IAAY,oBAAoB,aAAa,MAAM,MAAM,IAAI,KAAA;EAC9F,CAU8D;EAAG,MAThD,eAAe;GAC5B,MAAM,eAAe,KAAK,OAAO,CAAC,CAAC;GACnC,OAAO,aAAa,aAAa,KAAA,IAAY,uBAAuB,aAAa,UAAU,MAAM,IAAI,KAAA;EACzG,CAM8E;EAAG,YAL1D,eAAe;GAClC,MAAM,eAAe,KAAK,OAAO,CAAC,CAAC;GACnC,OAAO,aAAa,eAAe,KAAA,IAAY,oBAAoB,aAAa,YAAY,MAAM,IAAI,KAAA;EAC1G,CAE0G;EAAG,OAD3F,eAAe,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAC+D;CAAE,CAC3G;AACb;AAEA,IAAM,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"box.ce.js","names":[],"sources":["../../../src/components/gui/box.ce"],"sourcesContent":["<Container positionType=\"absolute\" top={top} left={left}>\n <Container\n anchor={[0.5, 0.5]}\n >\n <Rect width height color={_color} />\n <Container attach={child}></Container>\n </Container> \n</Container>\n\n<script>\n import { RpgClientEngine, inject } from \"../../index\";\n\n const { width, height, children, color, top, left } = defineProps();\n const engine = inject(RpgClientEngine)\n const child = children[0]\n const _color = computed(() => engine.globalConfig.gui?.windowColor || color?.() || \"#1a1a2e\")\n</script>"],"mappings":";;;;;AAOE,SAAS,UAAA,SAAA;;CAEJ,MAAA,cAAA,eAAA,OAAA;CACqB,eAAe,OAAM;;CAEjD,MAAE,SAAa,OAAE,eAAkB;CACnC,MAAE,QAAY,SAAS;CACvB,MAAE,SAAa,eAAW,OAAA,aAAA,KAAA,eAAA,QAAA,KAAA,SAAA;CAElB,OADS,EAAA,WAAe;EAAA,cAAO;EAAkB;EAAoB;CAAK,GAAG,EAAE,WAAO,EAAA,QAAA,CAAA,IAAA,EAAA,EAAA,GAAA,CAAA,EAAA,MAAA;EAAA;EAAA;EAAA,OAAA;CAAA,CAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MAAA,CAAA,CAAA,CAAA,CACtF"}
1
+ {"version":3,"file":"box.ce.js","names":[],"sources":["../../../src/components/gui/box.ce"],"sourcesContent":["<Container positionType=\"absolute\" top={top} left={left}>\n <Container\n anchor={[0.5, 0.5]}\n >\n <Rect width height color={_color} />\n <Container attach={child}></Container>\n </Container> \n</Container>\n\n<script>\n import { RpgClientEngine, inject } from \"../../index\";\n\n const { width, height, children, color, top, left } = defineProps();\n const engine = inject(RpgClientEngine)\n const child = children[0]\n const _color = computed(() => engine.globalConfig.gui?.windowColor || color?.() || \"#1a1a2e\")\n</script>"],"mappings":";;;;;AAOM,SAAS,UAAU,SAAS;CACX,SAAS,OAAO;CAC/B,MAAM,cAAc,eAAe,OAAO;CACtB,eAAe,OAAO;CAC1C,MAAM,EAAE,OAAO,QAAQ,UAAU,OAAO,KAAK,SAAS,YAAY;CAC1E,MAAM,SAAS,OAAO,eAAe;CACrC,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,eAAe,OAAO,aAAa,KAAK,eAAe,QAAQ,KAAK,SAAS;CAEpF,OADY,EAAE,WAAW;EAAE,cAAc;EAAiB;EAAW;CAAK,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAK,EAAG,EAAE,GAAG,CAAC,EAAE,MAAM;EAAE;EAAO;EAAQ,OAAO;CAAO,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,CACnL;AACb;AAEA,IAAM,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.ce.js","names":[],"sources":["../../../../src/components/gui/dialogbox/index.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={dialogControls}>\n <div class=\"rpg-ui-dialog-layer\" click={closeDialogFromPointer}>\n <button class=\"rpg-ui-close-button\" type=\"button\" title=\"Close\" aria-label=\"Close dialog\" click={closeDialogFromPointer}>x</button>\n <div\n class=\"rpg-ui-dialog-container\"\n data-position={dialogPosition()}\n data-full-width={isFullWidth() ? \"true\" : \"false\"}\n data-has-face={hasFace() ? \"true\" : \"false\"}\n >\n <div class=\"rpg-ui-dialog rpg-anim-fade-in\" click={stopEvent}>\n <div class=\"rpg-ui-dialog-body\">\n <div>\n @if (speakerName()) {\n <div class=\"rpg-ui-dialog-speaker\">{speakerName()}</div>\n }\n <div class=\"rpg-ui-dialog-content\">\n {displayMessage()}\n </div>\n @if (hasChoices()) {\n <Navigation tabindex={selectedItem} controls={controls}>\n <div class=\"rpg-ui-dialog-choices\">\n @for ((choice,index) of dialogChoices()) {\n <div\n class=\"rpg-ui-dialog-choice\"\n class={{active: selectedItem() === index}}\n tabindex={index}\n data-choice-index={index}\n click={selectChoice(index)}\n >{{ choice.text }}</div>\n }\n </div>\n </Navigation>\n }\n @if (hasInput()) {\n <InputField\n data={dialogInput}\n layout=\"dialog\"\n showMessage={false}\n submit={submitInput}\n cancel={cancelInput}\n />\n }\n </div>\n @if (hasFace()) {\n <div class=\"rpg-ui-dialog-face\">\n <DOMSprite\n sheet={faceSheet(dialogFace())}\n width=\"100%\"\n height=\"100%\"\n objectFit=\"contain\"\n />\n </div>\n }\n </div>\n @if (showIndicator) {\n <div class=\"rpg-ui-dialog-indicator\"></div>\n }\n </div>\n </div>\n </div>\n</DOMContainer>\n \n<script>\n import { effect, signal, computed, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n import InputField from \"../input-field.ce\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n engine.stopProcessingInput = true;\n\n const selectedItem = signal(0)\n const ACTION_OPEN_GUARD_MS = 150;\n const openedAt = Date.now();\n\n const {\n data,\n onFinish,\n onInteraction,\n guiOpenId\n } = defineProps();\n\n const dialogData = computed(() => data() || {});\n const dialogChoices = computed(() => Array.isArray(dialogData().choices) ? dialogData().choices : []);\n const message = computed(() => dialogData().message);\n const speaker = computed(() => dialogData().speaker);\n const position = computed(() => dialogData().position);\n const typewriterEffect = computed(() => dialogData().typewriterEffect);\n const fullWidth = computed(() => dialogData().fullWidth || false);\n const dialogInput = computed(() => dialogData().input || null);\n const hasInput = computed(() => !!dialogInput());\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const normalizeOpenId = (value) => {\n const resolved = resolveProp(value);\n return typeof resolved === \"string\" && resolved.length > 0 ? resolved : undefined;\n };\n\n const speakerName = computed(() => {\n const value = resolveProp(speaker());\n return value ? String(value) : \"\";\n });\n\n const dialogPosition = computed(() => resolveProp(position()) || \"bottom\");\n const isFullWidth = computed(() => resolveProp(fullWidth) !== false);\n const dialogFace = computed(() => resolveProp(dialogData().face));\n const hasFace = computed(() => {\n const value = dialogFace();\n return !!(value && value.id);\n });\n\n const displayMessage = signal(\"\");\n const fullMessage = signal(\"\");\n const isTyping = signal(false);\n let typewriterTimer = null;\n let rootElement = null;\n\n mount((element) => {\n rootElement = element;\n });\n\n const startTypewriter = (text) => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n displayMessage.set(\"\");\n if (!text) return;\n let index = 0;\n isTyping.set(true);\n typewriterTimer = setInterval(() => {\n index += 1;\n displayMessage.set(text.slice(0, index));\n if (index >= text.length) {\n clearInterval(typewriterTimer);\n typewriterTimer = null;\n isTyping.set(false);\n }\n }, 20);\n };\n\n const finishTyping = () => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n typewriterTimer = null;\n displayMessage.set(fullMessage());\n isTyping.set(false);\n };\n\n effect(() => {\n const text = resolveProp(message()) || \"\";\n fullMessage.set(text);\n const useTypewriter = resolveProp(typewriterEffect()) !== false;\n if (!useTypewriter) {\n finishTyping();\n return;\n }\n startTypewriter(text);\n });\n\n\n const hasChoices = computed(() => dialogChoices().length > 0);\n const showIndicator = computed(() => !hasChoices() && !hasInput() && !isTyping());\n const nav = createTabindexNavigator(selectedItem, { count: () => dialogChoices().length }, 'wrap');\n\n function selectChoice(index) {\n return function() {\n selectedItem.set(index);\n onSelect(index);\n }\n }\n\n function _onFinish(value) {\n if (onFinish) onFinish(value, normalizeOpenId(guiOpenId));\n }\n\n const stopEvent = (event) => {\n event?.stopPropagation?.();\n };\n\n const closeDialog = () => {\n if (hasInput()) {\n onInteraction?.(\"cancel\");\n return;\n }\n _onFinish();\n };\n\n const closeDialogFromPointer = (event) => {\n stopEvent(event);\n closeDialog();\n };\n\n const onSelect = (index) => {\n _onFinish(index);\n };\n\n const submitInput = (payload) => {\n onInteraction?.(\"submit\", payload);\n };\n\n const cancelInput = () => {\n onInteraction?.(\"cancel\");\n };\n\n const canAcceptAction = () => Date.now() - openedAt >= ACTION_OPEN_GUARD_MS;\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!canAcceptAction()) {\n return;\n }\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (!hasChoices()) return;\n onSelect(selectedItem());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n \n const dialogControls = signal({\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!canAcceptAction()) {\n return;\n }\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (hasInput()) return;\n if (hasChoices()) return;\n _onFinish();\n }\n },\n })\n\n const faceSheet = (faceValue) => {\n if (!faceValue || !faceValue.id) {\n return undefined;\n }\n return {\n definition: engine.getSpriteSheet(faceValue.id),\n playing: faceValue.expression || \"default\",\n };\n }\n\n mount((element) => {\n return () => {\n // Wait destroy is finished before start processing input\n delay(() => {\n engine.stopProcessingInput = false;\n })\n }\n })\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.ce.js","names":["InputField"],"sources":["../../../../src/components/gui/dialogbox/index.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={dialogControls}>\n <div class=\"rpg-ui-dialog-layer\" click={closeDialogFromPointer}>\n <button class=\"rpg-ui-close-button\" type=\"button\" title=\"Close\" aria-label=\"Close dialog\" click={closeDialogFromPointer}>x</button>\n <div\n class=\"rpg-ui-dialog-container\"\n data-position={dialogPosition()}\n data-full-width={isFullWidth() ? \"true\" : \"false\"}\n data-has-face={hasFace() ? \"true\" : \"false\"}\n >\n <div class=\"rpg-ui-dialog rpg-anim-fade-in\" click={stopEvent}>\n <div class=\"rpg-ui-dialog-body\">\n <div>\n @if (speakerName()) {\n <div class=\"rpg-ui-dialog-speaker\">{speakerName()}</div>\n }\n <div class=\"rpg-ui-dialog-content\">\n {displayMessage()}\n </div>\n @if (hasChoices()) {\n <Navigation tabindex={selectedItem} controls={controls}>\n <div class=\"rpg-ui-dialog-choices\">\n @for ((choice,index) of dialogChoices()) {\n <div\n class=\"rpg-ui-dialog-choice\"\n class={{active: selectedItem() === index}}\n tabindex={index}\n data-choice-index={index}\n click={selectChoice(index)}\n >{{ choice.text }}</div>\n }\n </div>\n </Navigation>\n }\n @if (hasInput()) {\n <InputField\n data={dialogInput}\n layout=\"dialog\"\n showMessage={false}\n submit={submitInput}\n cancel={cancelInput}\n />\n }\n </div>\n @if (hasFace()) {\n <div class=\"rpg-ui-dialog-face\">\n <DOMSprite\n sheet={faceSheet(dialogFace())}\n width=\"100%\"\n height=\"100%\"\n objectFit=\"contain\"\n />\n </div>\n }\n </div>\n @if (showIndicator) {\n <div class=\"rpg-ui-dialog-indicator\"></div>\n }\n </div>\n </div>\n </div>\n</DOMContainer>\n \n<script>\n import { effect, signal, computed, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n import InputField from \"../input-field.ce\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n engine.stopProcessingInput = true;\n\n const selectedItem = signal(0)\n const ACTION_OPEN_GUARD_MS = 150;\n const openedAt = Date.now();\n\n const {\n data,\n onFinish,\n onInteraction,\n guiOpenId\n } = defineProps();\n\n const dialogData = computed(() => data() || {});\n const dialogChoices = computed(() => Array.isArray(dialogData().choices) ? dialogData().choices : []);\n const message = computed(() => dialogData().message);\n const speaker = computed(() => dialogData().speaker);\n const position = computed(() => dialogData().position);\n const typewriterEffect = computed(() => dialogData().typewriterEffect);\n const fullWidth = computed(() => dialogData().fullWidth || false);\n const dialogInput = computed(() => dialogData().input || null);\n const hasInput = computed(() => !!dialogInput());\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const normalizeOpenId = (value) => {\n const resolved = resolveProp(value);\n return typeof resolved === \"string\" && resolved.length > 0 ? resolved : undefined;\n };\n\n const speakerName = computed(() => {\n const value = resolveProp(speaker());\n return value ? String(value) : \"\";\n });\n\n const dialogPosition = computed(() => resolveProp(position()) || \"bottom\");\n const isFullWidth = computed(() => resolveProp(fullWidth) !== false);\n const dialogFace = computed(() => resolveProp(dialogData().face));\n const hasFace = computed(() => {\n const value = dialogFace();\n return !!(value && value.id);\n });\n\n const displayMessage = signal(\"\");\n const fullMessage = signal(\"\");\n const isTyping = signal(false);\n let typewriterTimer = null;\n let rootElement = null;\n\n mount((element) => {\n rootElement = element;\n });\n\n const startTypewriter = (text) => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n displayMessage.set(\"\");\n if (!text) return;\n let index = 0;\n isTyping.set(true);\n typewriterTimer = setInterval(() => {\n index += 1;\n displayMessage.set(text.slice(0, index));\n if (index >= text.length) {\n clearInterval(typewriterTimer);\n typewriterTimer = null;\n isTyping.set(false);\n }\n }, 20);\n };\n\n const finishTyping = () => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n typewriterTimer = null;\n displayMessage.set(fullMessage());\n isTyping.set(false);\n };\n\n effect(() => {\n const text = resolveProp(message()) || \"\";\n fullMessage.set(text);\n const useTypewriter = resolveProp(typewriterEffect()) !== false;\n if (!useTypewriter) {\n finishTyping();\n return;\n }\n startTypewriter(text);\n });\n\n\n const hasChoices = computed(() => dialogChoices().length > 0);\n const showIndicator = computed(() => !hasChoices() && !hasInput() && !isTyping());\n const nav = createTabindexNavigator(selectedItem, { count: () => dialogChoices().length }, 'wrap');\n\n function selectChoice(index) {\n return function() {\n selectedItem.set(index);\n onSelect(index);\n }\n }\n\n function _onFinish(value) {\n if (onFinish) onFinish(value, normalizeOpenId(guiOpenId));\n }\n\n const stopEvent = (event) => {\n event?.stopPropagation?.();\n };\n\n const closeDialog = () => {\n if (hasInput()) {\n onInteraction?.(\"cancel\");\n return;\n }\n _onFinish();\n };\n\n const closeDialogFromPointer = (event) => {\n stopEvent(event);\n closeDialog();\n };\n\n const onSelect = (index) => {\n _onFinish(index);\n };\n\n const submitInput = (payload) => {\n onInteraction?.(\"submit\", payload);\n };\n\n const cancelInput = () => {\n onInteraction?.(\"cancel\");\n };\n\n const canAcceptAction = () => Date.now() - openedAt >= ACTION_OPEN_GUARD_MS;\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!canAcceptAction()) {\n return;\n }\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (!hasChoices()) return;\n onSelect(selectedItem());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n \n const dialogControls = signal({\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!canAcceptAction()) {\n return;\n }\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (hasInput()) return;\n if (hasChoices()) return;\n _onFinish();\n }\n },\n })\n\n const faceSheet = (faceValue) => {\n if (!faceValue || !faceValue.id) {\n return undefined;\n }\n return {\n definition: engine.getSpriteSheet(faceValue.id),\n playing: faceValue.expression || \"default\",\n };\n }\n\n mount((element) => {\n return () => {\n // Wait destroy is finished before start processing input\n delay(() => {\n engine.stopProcessingInput = false;\n })\n }\n })\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gameover.ce.js","names":[],"sources":["../../../src/components/gui/gameover.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-gameover-screen rpg-anim-fade-in\">\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-left\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-right\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-center\"></div>\n <div class=\"rpg-ui-gameover-header rpg-anim-shake\">\n <div class=\"rpg-ui-gameover-title\">{titleText()}</div>\n @if (subtitleText()) {\n <div class=\"rpg-ui-gameover-subtitle\">{subtitleText()}</div>\n }\n </div>\n <Navigation tabindex={selectedEntry} controls={controls}>\n <div class=\"rpg-ui-menu rpg-ui-gameover-menu rpg-anim-slide-up\">\n @for ((entry,index) of entryList()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isEntryDisabled(entry)}}\n data-selected={selectedEntry() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectEntry(index)}\n >{entry.label}</div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect } from \"canvasengine\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { getKeyboardControlBind } from \"../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const guiService = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { entries, title, subtitle, saveLoad, localActions, onInteraction } = defineProps({\n entries: {\n default: () => []\n },\n saveLoad: {\n default: () => ({})\n },\n localActions: {\n default: false\n }\n });\n\n const defaultEntries = [\n { id: \"title\", label: t(\"rpg.gameover.title-screen\") },\n { id: \"load\", label: t(\"rpg.gameover.load-game\") }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || t(\"rpg.gameover.title\"));\n const subtitleText = computed(() => resolveProp(subtitle) || \"\");\n const localActionsEnabled = computed(() => resolveProp(localActions) === true);\n\n const entryList = computed(() => {\n const list = resolveProp(entries);\n if (Array.isArray(list) && list.length) return list;\n return defaultEntries;\n });\n\n const isEntryDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n return false;\n };\n\n const selectedEntry = signal(0);\n const selectableIndexes = computed(() => {\n const list = entryList();\n return list\n .map((entry, index) => (isEntryDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n if (!available.includes(current)) {\n selectedEntry.set(available[0]);\n }\n });\n\n const moveSelection = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedEntry.set(available[nextIndex]);\n };\n\n const triggerSelect = (index) => {\n const list = entryList();\n const entry = list[index];\n if (!entry || isEntryDisabled(entry)) return;\n if (localActionsEnabled()) {\n if (entry.id === \"title\") {\n guiService.hide(PrebuiltGui.Gameover);\n guiService.display(PrebuiltGui.TitleScreen);\n }\n if (entry.id === \"load\") {\n const config = resolveProp(saveLoad) || {};\n const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];\n guiService.display(PrebuiltGui.Save, {\n ...config,\n mode: config.mode || \"load\",\n slots\n });\n }\n }\n if (onInteraction) {\n onInteraction(\"select\", { id: entry.id, index, entry });\n }\n };\n\n function selectEntry(index) {\n return function() {\n selectedEntry.set(index);\n triggerSelect(index);\n };\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n moveSelection(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n moveSelection(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"gameover.ce.js","names":[],"sources":["../../../src/components/gui/gameover.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-gameover-screen rpg-anim-fade-in\">\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-left\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-right\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-center\"></div>\n <div class=\"rpg-ui-gameover-header rpg-anim-shake\">\n <div class=\"rpg-ui-gameover-title\">{titleText()}</div>\n @if (subtitleText()) {\n <div class=\"rpg-ui-gameover-subtitle\">{subtitleText()}</div>\n }\n </div>\n <Navigation tabindex={selectedEntry} controls={controls}>\n <div class=\"rpg-ui-menu rpg-ui-gameover-menu rpg-anim-slide-up\">\n @for ((entry,index) of entryList()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isEntryDisabled(entry)}}\n data-selected={selectedEntry() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectEntry(index)}\n >{entry.label}</div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect } from \"canvasengine\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { getKeyboardControlBind } from \"../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const guiService = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { entries, title, subtitle, saveLoad, localActions, onInteraction } = defineProps({\n entries: {\n default: () => []\n },\n saveLoad: {\n default: () => ({})\n },\n localActions: {\n default: false\n }\n });\n\n const defaultEntries = [\n { id: \"title\", label: t(\"rpg.gameover.title-screen\") },\n { id: \"load\", label: t(\"rpg.gameover.load-game\") }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || t(\"rpg.gameover.title\"));\n const subtitleText = computed(() => resolveProp(subtitle) || \"\");\n const localActionsEnabled = computed(() => resolveProp(localActions) === true);\n\n const entryList = computed(() => {\n const list = resolveProp(entries);\n if (Array.isArray(list) && list.length) return list;\n return defaultEntries;\n });\n\n const isEntryDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n return false;\n };\n\n const selectedEntry = signal(0);\n const selectableIndexes = computed(() => {\n const list = entryList();\n return list\n .map((entry, index) => (isEntryDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n if (!available.includes(current)) {\n selectedEntry.set(available[0]);\n }\n });\n\n const moveSelection = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedEntry.set(available[nextIndex]);\n };\n\n const triggerSelect = (index) => {\n const list = entryList();\n const entry = list[index];\n if (!entry || isEntryDisabled(entry)) return;\n if (localActionsEnabled()) {\n if (entry.id === \"title\") {\n guiService.hide(PrebuiltGui.Gameover);\n guiService.display(PrebuiltGui.TitleScreen);\n }\n if (entry.id === \"load\") {\n const config = resolveProp(saveLoad) || {};\n const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];\n guiService.display(PrebuiltGui.Save, {\n ...config,\n mode: config.mode || \"load\",\n slots\n });\n }\n }\n if (onInteraction) {\n onInteraction(\"select\", { id: entry.id, index, entry });\n }\n };\n\n function selectEntry(index) {\n return function() {\n selectedEntry.set(index);\n triggerSelect(index);\n };\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n moveSelection(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n moveSelection(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hud.ce.js","names":[],"sources":["../../../../src/components/gui/hud/hud.ce"],"sourcesContent":["<DOMContainer>\n <div class=\"rpg-hud\">\n <div class=\"rpg-avatar\">\n @if (hasFace()) {\n <div class=\"rpg-avatar-face\">\n <DOMSprite \n sheet={faceSheet(face())} \n width=\"100%\" \n height=\"100%\" \n objectFit=\"contain\" \n />\n </div>\n }\n <div class=\"rpg-avatar-level\">{{ level() }}</div>\n </div>\n <div class=\"rpg-status-bars\">\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">HP {{ hp() }}/{{ hpMax() }}</span>\n <div class=\"rpg-bar-fill health\" style={{width: percentHp}}></div>\n </div>\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">SP {{ sp() }}/{{ spMax() }}</span>\n <div class=\"rpg-bar-fill mana\" style={{width: percentSp}}></div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { computed } from \"canvasengine\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n\n const engine = inject(RpgClientEngine)\n const currentPlayer = engine.scene.currentPlayer\n const { data } = defineProps();\n const { faceset } = data();\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const face = computed(() => resolveProp(data().faceset));\n\n const hasFace = computed(() => {\n const value = face();\n return !!(value && value.id);\n });\n const faceSheet = (faceValue) => ({\n definition: engine.getSpriteSheet(faceValue.id),\n playing: faceValue.expression || \"default\",\n });\n const hp = getEntityProp(currentPlayer, \"hp\")\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\")\n const percentHp = computed(() => (hp() / hpMax() * 100) + '%')\n\n const sp = getEntityProp(currentPlayer, \"sp\")\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\")\n const percentSp = computed(() => (sp() / spMax() * 100) + '%')\n\n const level = getEntityProp(currentPlayer, \"level\")\n</script>\n \n"],"mappings":";;;;;AAWM,SAAS,UAAM,SAAA;CACT,SAAA,OAAA;CACJ,MAAK,cAAe,eAAe,OAAO;CACrC,eAAA,OAAA;CACL,MAAK,SAAU,OAAO,eAAM;CACpC,MAAM,gBAAgB,OAAM,MAAI;CAChC,MAAM,EAAE,SAAS,YAAY;CAC7B,MAAM,EAAE,YAAY,KAAC;CACrB,MAAM,eAAW,UAAA,OAAA,UAAA,aAAA,MAAA,IAAA;CACjB,MAAM,OAAO,eAAe,YAAI,KAAU,EAAA,OAAA,CAAA;CAC1C,MAAM,UAAU,eAAa;EACzB,MAAM,QAAO,KAAI;EACjB,OAAO,CAAC,EAAE,SAAG,MAAA;CACjB,CAAC;CACD,MAAM,aAAG,eAAA;EACP,YAAY,OAAA,eAAA,UAAA,EAAA;;CAEd;CACA,MAAI,KAAO,cAAW,eAAe,IAAK;CAC1C,MAAI,QAAS,cAAe,eAAe,cAAG;CAC9C,MAAI,YAAS,eAAiB,GAAA,IAAA,MAAa,IAAA,MAAA,GAAA;CAC3C,MAAI,KAAO,cAAE,eAA2B,IAAI;;CAE5C,MAAI,YAAc,eAAQ,GAAA,IAAe,MAAA,IAAA,MAAA,GAAA;CACzC,MAAI,QAAM,cAAgB,eAAa,OAAA;CAEnC,OADgB,EAAC,cAAa,MAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,UAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,aAAA;CAAA,GAAA,CAAA,KAAA,eAAA,QAAA,CAAA,SAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kBAAA;CAAA,GAAA,EAAA,WAAA;EAAA,OAAA,eAAA,UAAA,KAAA,CAAA,CAAA;EAAA,OAAA;EAAA,QAAA;EAAA,WAAA;CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mBAAA;EAAA,aAAA,eAAA,MAAA,CAAA;CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kBAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oBAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,eAAA;EAAA,aAAA,eAAA,QAAA,GAAA,IAAA,MAAA,MAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA,EAAA,OAAA,UAAA;EAAA;CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oBAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,eAAA;EAAA,aAAA,eAAA,QAAA,GAAA,IAAA,MAAA,MAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA,EAAA,OAAA,UAAA;EAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACf;;AAGf,IAAM,iBAAmB"}
1
+ {"version":3,"file":"hud.ce.js","names":[],"sources":["../../../../src/components/gui/hud/hud.ce"],"sourcesContent":["<DOMContainer>\n <div class=\"rpg-hud\">\n <div class=\"rpg-avatar\">\n @if (hasFace()) {\n <div class=\"rpg-avatar-face\">\n <DOMSprite \n sheet={faceSheet(face())} \n width=\"100%\" \n height=\"100%\" \n objectFit=\"contain\" \n />\n </div>\n }\n <div class=\"rpg-avatar-level\">{{ level() }}</div>\n </div>\n <div class=\"rpg-status-bars\">\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">HP {{ hp() }}/{{ hpMax() }}</span>\n <div class=\"rpg-bar-fill health\" style={{width: percentHp}}></div>\n </div>\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">SP {{ sp() }}/{{ spMax() }}</span>\n <div class=\"rpg-bar-fill mana\" style={{width: percentSp}}></div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { computed } from \"canvasengine\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n\n const engine = inject(RpgClientEngine)\n const currentPlayer = engine.scene.currentPlayer\n const { data } = defineProps();\n const { faceset } = data();\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const face = computed(() => resolveProp(data().faceset));\n\n const hasFace = computed(() => {\n const value = face();\n return !!(value && value.id);\n });\n const faceSheet = (faceValue) => ({\n definition: engine.getSpriteSheet(faceValue.id),\n playing: faceValue.expression || \"default\",\n });\n const hp = getEntityProp(currentPlayer, \"hp\")\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\")\n const percentHp = computed(() => (hp() / hpMax() * 100) + '%')\n\n const sp = getEntityProp(currentPlayer, \"sp\")\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\")\n const percentSp = computed(() => (sp() / spMax() * 100) + '%')\n\n const level = getEntityProp(currentPlayer, \"level\")\n</script>\n \n"],"mappings":";;;;;AAWM,SAAS,UAAU,SAAS;CACX,SAAS,OAAO;CAC/B,MAAM,cAAc,eAAe,OAAO;CACtB,eAAe,OAAO;CAC1C,MAAM,SAAS,OAAO,eAAe;CAC7C,MAAM,gBAAgB,OAAO,MAAM;CACnC,MAAM,EAAE,SAAS,YAAY;CAC7B,MAAM,EAAE,YAAY,KAAK;CACzB,MAAM,eAAe,UAAU,OAAO,UAAU,aAAa,MAAM,IAAI;CACvE,MAAM,OAAO,eAAe,YAAY,KAAK,CAAC,CAAC,OAAO,CAAC;CACvD,MAAM,UAAU,eAAe;EAC3B,MAAM,QAAQ,KAAK;EACnB,OAAO,CAAC,EAAE,SAAS,MAAM;CAC7B,CAAC;CACD,MAAM,aAAa,eAAe;EAC9B,YAAY,OAAO,eAAe,UAAU,EAAE;EAC9C,SAAS,UAAU,cAAc;CACrC;CACA,MAAM,KAAK,cAAc,eAAe,IAAI;CAC5C,MAAM,QAAQ,cAAc,eAAe,cAAc;CACzD,MAAM,YAAY,eAAgB,GAAG,IAAI,MAAM,IAAI,MAAO,GAAG;CAC7D,MAAM,KAAK,cAAc,eAAe,IAAI;CAC5C,MAAM,QAAQ,cAAc,eAAe,cAAc;CACzD,MAAM,YAAY,eAAgB,GAAG,IAAI,MAAM,IAAI,MAAO,GAAG;CAC7D,MAAM,QAAQ,cAAc,eAAe,OAAO;CAE1C,OADY,EAAE,cAAc,MAAM,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,UAAU;CAAE,GAAG,CAAC,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,aAAa;CAAE,GAAG,CAAC,KAAK,eAAe,QAAQ,CAAC,SAAS,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,kBAAkB;CAAE,GAAG,EAAE,WAAW;EAAE,OAAO,eAAe,UAAU,KAAK,CAAC,CAAC;EAAG,OAAO;EAAQ,QAAQ;EAAQ,WAAW;CAAU,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,mBAAmB;EAAG,aAAa,eAAe,MAAM,CAAC;CAAE,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,kBAAkB;CAAE,GAAG,CAAC,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,oBAAoB;CAAE,GAAG,CAAC,EAAE,YAAY;EAAE,SAAS;EAAQ,OAAO,EAAE,OAAO,eAAe;EAAG,aAAa,eAAe,QAAQ,GAAG,IAAI,MAAM,MAAM,CAAC;CAAE,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO;GAAE,OAAO;GAAuB,OAAO,EAAE,OAAO,UAAU;EAAE;CAAE,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,oBAAoB;CAAE,GAAG,CAAC,EAAE,YAAY;EAAE,SAAS;EAAQ,OAAO,EAAE,OAAO,eAAe;EAAG,aAAa,eAAe,QAAQ,GAAG,IAAI,MAAM,MAAM,CAAC;CAAE,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO;GAAE,OAAO;GAAqB,OAAO,EAAE,OAAO,UAAU;EAAE;CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9pC;AACb;AAEA,IAAM,iBAAiB"}
@@ -1,16 +1,17 @@
1
- import "./input-field.ce.js";
2
- import "./dialogbox/index.ce.js";
3
- import "./box.ce.js";
4
- import "./shop/shop.ce.js";
5
- import "./hud/hud.ce.js";
6
- import "./save-load.ce.js";
7
- import "./menu/items-menu.ce.js";
8
- import "./menu/skills-menu.ce.js";
9
- import "./menu/equip-menu.ce.js";
10
- import "./menu/options-menu.ce.js";
11
- import "./menu/exit-menu.ce.js";
12
- import "./menu/main-menu.ce.js";
13
- import "./notification/notification.ce.js";
14
- import "./title-screen.ce.js";
15
- import "./gameover.ce.js";
16
- import "./input.ce.js";
1
+ import __ce_component from "./input-field.ce.js";
2
+ import __ce_component$1 from "./dialogbox/index.ce.js";
3
+ import __ce_component$2 from "./box.ce.js";
4
+ import __ce_component$3 from "./shop/shop.ce.js";
5
+ import __ce_component$4 from "./hud/hud.ce.js";
6
+ import __ce_component$5 from "./save-load.ce.js";
7
+ import __ce_component$6 from "./menu/items-menu.ce.js";
8
+ import __ce_component$7 from "./menu/skills-menu.ce.js";
9
+ import __ce_component$8 from "./menu/equip-menu.ce.js";
10
+ import __ce_component$9 from "./menu/options-menu.ce.js";
11
+ import __ce_component$10 from "./menu/exit-menu.ce.js";
12
+ import __ce_component$11 from "./menu/main-menu.ce.js";
13
+ import __ce_component$12 from "./notification/notification.ce.js";
14
+ import __ce_component$13 from "./title-screen.ce.js";
15
+ import __ce_component$14 from "./gameover.ce.js";
16
+ import __ce_component$15 from "./input.ce.js";
17
+ export { __ce_component$2 as BoxComponent, __ce_component$1 as DialogboxComponent, __ce_component$8 as EquipMenuComponent, __ce_component$10 as ExitMenuComponent, __ce_component$14 as GameoverComponent, __ce_component$4 as HudComponent, __ce_component$15 as InputComponent, __ce_component as InputFieldComponent, __ce_component$6 as ItemsMenuComponent, __ce_component$11 as MainMenuComponent, __ce_component$12 as NotificationComponent, __ce_component$9 as OptionsMenuComponent, __ce_component$5 as SaveLoadComponent, __ce_component$3 as ShopComponent, __ce_component$7 as SkillsMenuComponent, __ce_component$13 as TitleScreenComponent };
@@ -1 +1 @@
1
- {"version":3,"file":"input-field.ce.js","names":[],"sources":["../../../src/components/gui/input-field.ce"],"sourcesContent":["<form\n class=\"rpg-ui-input-form\"\n data-layout={layout()}\n submit={submitForm}\n keydown={handleKeydown}\n>\n @if (showMessage()) {\n <label class=\"rpg-ui-input-message\" for={fieldId()}>{formData().message}</label>\n }\n @if (formData().control === \"textarea\") {\n <textarea\n id={fieldId()}\n class=\"rpg-ui-input rpg-ui-input-dialog-field\"\n name=\"value\"\n value={value}\n placeholder={formData().placeholder || \"\"}\n rows={formData().rows || 4}\n minlength={formData().minLength}\n maxlength={formData().maxLength}\n aria-required={formData().required ? \"true\" : \"false\"}\n ></textarea>\n }\n @else {\n <input\n id={fieldId()}\n class=\"rpg-ui-input rpg-ui-input-dialog-field\"\n name=\"value\"\n type={formData().type || \"text\"}\n value={value}\n placeholder={formData().placeholder || \"\"}\n min={formData().min}\n max={formData().max}\n step={formData().step}\n minlength={formData().minLength}\n maxlength={formData().maxLength}\n aria-required={formData().required ? \"true\" : \"false\"}\n />\n }\n @if (errorText()) {\n <div class=\"rpg-ui-input-error\" role=\"alert\">{errorText()}</div>\n }\n <div class=\"rpg-ui-input-actions\">\n @if (showCancelButton()) {\n <button class=\"rpg-ui-btn rpg-ui-input-button rpg-ui-input-button-cancel\" type=\"button\" click={cancelForm}>\n {formData().cancelText || t(\"rpg.input.cancel\")}\n </button>\n }\n <button\n class=\"rpg-ui-btn rpg-ui-input-button rpg-ui-input-button-confirm\"\n data-variant=\"primary\"\n type=\"submit\"\n >\n {formData().confirmText || t(\"rpg.input.confirm\")}\n </button>\n </div>\n</form>\n\n<script>\n import { computed, effect, signal } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const { data, layout, showMessage } = defineProps({\n layout: \"standalone\",\n showMessage: true,\n });\n const { submit, cancel } = defineEmits();\n const formData = computed(() => data() || {});\n const value = signal(String(formData().defaultValue ?? \"\"));\n const fieldId = computed(() => `rpg-input-value-${layout()}`);\n const errorText = computed(() => formData().errorKey\n ? t(formData().errorKey, formData().errorParams || {})\n : \"\"\n );\n const showCancelButton = computed(() => formData().cancelButton !== false);\n let focused = false;\n\n function submitForm(event, collectedData) {\n const submittedValue = collectedData && Object.prototype.hasOwnProperty.call(collectedData, \"value\")\n ? collectedData.value\n : event?.currentTarget?.elements?.value?.value ?? value();\n value.set(String(submittedValue ?? \"\"));\n submit({ value: submittedValue ?? \"\" });\n }\n\n function cancelForm() {\n cancel();\n }\n\n function handleKeydown(event) {\n if (event?.key !== \"Escape\") return;\n event.preventDefault?.();\n event.stopPropagation?.();\n cancelForm();\n }\n\n effect(() => {\n if (focused) return;\n focused = true;\n setTimeout(() => {\n document.getElementById(fieldId())?.focus?.();\n });\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"input-field.ce.js","names":[],"sources":["../../../src/components/gui/input-field.ce"],"sourcesContent":["<form\n class=\"rpg-ui-input-form\"\n data-layout={layout()}\n submit={submitForm}\n keydown={handleKeydown}\n>\n @if (showMessage()) {\n <label class=\"rpg-ui-input-message\" for={fieldId()}>{formData().message}</label>\n }\n @if (formData().control === \"textarea\") {\n <textarea\n id={fieldId()}\n class=\"rpg-ui-input rpg-ui-input-dialog-field\"\n name=\"value\"\n value={value}\n placeholder={formData().placeholder || \"\"}\n rows={formData().rows || 4}\n minlength={formData().minLength}\n maxlength={formData().maxLength}\n aria-required={formData().required ? \"true\" : \"false\"}\n ></textarea>\n }\n @else {\n <input\n id={fieldId()}\n class=\"rpg-ui-input rpg-ui-input-dialog-field\"\n name=\"value\"\n type={formData().type || \"text\"}\n value={value}\n placeholder={formData().placeholder || \"\"}\n min={formData().min}\n max={formData().max}\n step={formData().step}\n minlength={formData().minLength}\n maxlength={formData().maxLength}\n aria-required={formData().required ? \"true\" : \"false\"}\n />\n }\n @if (errorText()) {\n <div class=\"rpg-ui-input-error\" role=\"alert\">{errorText()}</div>\n }\n <div class=\"rpg-ui-input-actions\">\n @if (showCancelButton()) {\n <button class=\"rpg-ui-btn rpg-ui-input-button rpg-ui-input-button-cancel\" type=\"button\" click={cancelForm}>\n {formData().cancelText || t(\"rpg.input.cancel\")}\n </button>\n }\n <button\n class=\"rpg-ui-btn rpg-ui-input-button rpg-ui-input-button-confirm\"\n data-variant=\"primary\"\n type=\"submit\"\n >\n {formData().confirmText || t(\"rpg.input.confirm\")}\n </button>\n </div>\n</form>\n\n<script>\n import { computed, effect, signal } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const { data, layout, showMessage } = defineProps({\n layout: \"standalone\",\n showMessage: true,\n });\n const { submit, cancel } = defineEmits();\n const formData = computed(() => data() || {});\n const value = signal(String(formData().defaultValue ?? \"\"));\n const fieldId = computed(() => `rpg-input-value-${layout()}`);\n const errorText = computed(() => formData().errorKey\n ? t(formData().errorKey, formData().errorParams || {})\n : \"\"\n );\n const showCancelButton = computed(() => formData().cancelButton !== false);\n let focused = false;\n\n function submitForm(event, collectedData) {\n const submittedValue = collectedData && Object.prototype.hasOwnProperty.call(collectedData, \"value\")\n ? collectedData.value\n : event?.currentTarget?.elements?.value?.value ?? value();\n value.set(String(submittedValue ?? \"\"));\n submit({ value: submittedValue ?? \"\" });\n }\n\n function cancelForm() {\n cancel();\n }\n\n function handleKeydown(event) {\n if (event?.key !== \"Escape\") return;\n event.preventDefault?.();\n event.stopPropagation?.();\n cancelForm();\n }\n\n effect(() => {\n if (focused) return;\n focused = true;\n setTimeout(() => {\n document.getElementById(fieldId())?.focus?.();\n });\n });\n</script>\n"],"mappings":";;;;AAQM,SAAS,UAAU,SAAS;CACX,SAAS,OAAO;CAC/B,MAAM,cAAc,eAAe,OAAO;CAC1C,MAAM,cAAc,eAAe,OAAO;CAElD,MAAM,EAAE,MADe,OAAO,eACX,CAAC,CAAC,KAAK;CAC1B,MAAM,EAAE,MAAM,QAAQ,gBAAgB,YAAY;EAC9C,QAAQ;EACR,aAAa;CACjB,CAAC;CACD,MAAM,EAAE,QAAQ,WAAW,YAAY;CACvC,MAAM,WAAW,eAAe,KAAK,KAAK,CAAC,CAAC;CAC5C,MAAM,QAAQ,OAAO,OAAO,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC;CAC1D,MAAM,UAAU,eAAe,mBAAmB,OAAO,GAAG;CAC5D,MAAM,YAAY,eAAe,SAAS,CAAC,CAAC,WACtC,EAAE,SAAS,CAAC,CAAC,UAAU,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,IACnD,EAAE;CACR,MAAM,mBAAmB,eAAe,SAAS,CAAC,CAAC,iBAAiB,KAAK;CACzE,IAAI,UAAU;CACd,SAAS,WAAW,OAAO,eAAe;EACtC,MAAM,iBAAiB,iBAAiB,OAAO,UAAU,eAAe,KAAK,eAAe,OAAO,IAC7F,cAAc,QACd,OAAO,eAAe,UAAU,OAAO,SAAS,MAAM;EAC5D,MAAM,IAAI,OAAO,kBAAkB,EAAE,CAAC;EACtC,OAAO,EAAE,OAAO,kBAAkB,GAAG,CAAC;CAC1C;CACA,SAAS,aAAa;EAClB,OAAO;CACX;CACA,SAAS,cAAc,OAAO;EAC1B,IAAI,OAAO,QAAQ,UACf;EACJ,MAAM,iBAAiB;EACvB,MAAM,kBAAkB;EACxB,WAAW;CACf;CACA,aAAa;EACT,IAAI,SACA;EACJ,UAAU;EACV,iBAAiB;GACb,SAAS,eAAe,QAAQ,CAAC,CAAC,EAAE,QAAQ;EAChD,CAAC;CACL,CAAC;CAEO,OADY,EAAE,YAAY;EAAE,SAAS;EAAQ,OAAO;GAAE,OAAO;GAAqB,eAAe,eAAe,OAAO,CAAC;GAAG,QAAQ;GAAY,SAAS;EAAc;CAAE,GAAG;EAAC,KAAK,eAAe,YAAY,CAAC,SAAS,EAAE,YAAY;GAAE,SAAS;GAAS,OAAO;IAAE,OAAO;IAAwB,KAAK,eAAe,QAAQ,CAAC;GAAE;GAAG,aAAa,eAAe,SAAS,CAAC,CAAC,OAAO;EAAE,CAAC,CAAC;EAAG,KAAK,eAAe,SAAS,CAAC,CAAC,YAAY,UAAU,SAAS,EAAE,YAAY;GAAE,SAAS;GAAY,OAAO;IAAE,IAAI,eAAe,QAAQ,CAAC;IAAG,OAAO;IAA0C,MAAM;IAAgB;IAAO,aAAa,eAAe,SAAS,CAAC,CAAC,eAAe,EAAE;IAAG,MAAM,eAAe,SAAS,CAAC,CAAC,QAAQ,CAAC;IAAG,WAAW,eAAe,SAAS,CAAC,CAAC,SAAS;IAAG,WAAW,eAAe,SAAS,CAAC,CAAC,SAAS;IAAG,iBAAiB,eAAe,SAAS,CAAC,CAAC,WAAW,SAAS,OAAO;GAAE;EAAE,CAAC,SAAS,EAAE,YAAY;GAAE,SAAS;GAAS,OAAO;IAAE,IAAI,eAAe,QAAQ,CAAC;IAAG,OAAO;IAA0C,MAAM;IAAS,MAAM,eAAe,SAAS,CAAC,CAAC,QAAQ,MAAM;IAAU;IAAO,aAAa,eAAe,SAAS,CAAC,CAAC,eAAe,EAAE;IAAG,KAAK,eAAe,SAAS,CAAC,CAAC,GAAG;IAAG,KAAK,eAAe,SAAS,CAAC,CAAC,GAAG;IAAG,MAAM,eAAe,SAAS,CAAC,CAAC,IAAI;IAAG,WAAW,eAAe,SAAS,CAAC,CAAC,SAAS;IAAG,WAAW,eAAe,SAAS,CAAC,CAAC,SAAS;IAAG,iBAAiB,eAAe,SAAS,CAAC,CAAC,WAAW,SAAS,OAAO;GAAE;EAAE,CAAC,CAAC;EAAG,KAAK,eAAe,UAAU,CAAC,SAAS,EAAE,YAAY;GAAE,SAAS;GAAO,OAAO;IAAE,OAAO;IAAsB,MAAM;GAAQ;GAAG,aAAa,eAAe,UAAU,CAAC;EAAE,CAAC,CAAC;EAAG,EAAE,YAAY;GAAE,SAAS;GAAO,OAAO,EAAE,OAAO,uBAAuB;EAAE,GAAG,CAAC,KAAK,eAAe,iBAAiB,CAAC,SAAS,EAAE,YAAY;GAAE,SAAS;GAAU,OAAO;IAAE,OAAO;IAA6D,MAAM;IAAU,OAAO;GAAW;GAAG,aAAa,eAAe,SAAS,CAAC,CAAC,cAAc,EAAE,kBAAkB,CAAC;EAAE,CAAC,CAAC,GAAG,EAAE,YAAY;GAAE,SAAS;GAAU,OAAO;IAAE,OAAO;IAA8D,gBAAgB;IAAW,MAAM;GAAS;GAAG,aAAa,eAAe,SAAS,CAAC,CAAC,eAAe,EAAE,mBAAmB,CAAC;EAAE,CAAC,CAAC,CAAC;CAAC,CACvoE;AACb;AAEA,IAAM,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"input.ce.js","names":[],"sources":["../../../src/components/gui/input.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-input-layer\">\n <div class=\"rpg-ui-input-dialog rpg-ui-window rpg-anim-fade-in\">\n @if (title()) {\n <div class=\"rpg-ui-window-title\">{title()}</div>\n }\n <InputField data={data} layout=\"standalone\" submit={submit} cancel={cancel} />\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { computed } from \"canvasengine\";\n import InputField from \"./input-field.ce\";\n\n const { data, onInteraction } = defineProps();\n const title = computed(() => data().title || \"\");\n\n function submit(payload) {\n onInteraction?.(\"submit\", payload);\n }\n\n function cancel() {\n onInteraction?.(\"cancel\");\n }\n</script>\n"],"mappings":";;;AAQI,SAAG,UAAA,SAAA;CACO,SAAA,OAAA;;CAEP,eAAA,OAAA;CACC,MAAG,EAAA,MAAW,kBAAkB,YAAC;CACzC,MAAE,QAAO,eAAmB,KAAM,EAAA,SAAS,EAAA;;EAEzC,gBAAc,UAAc,OAAI;CAClC;;EAEE,gBAAgB,QAAS;CAC3B;QACE,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qBAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qDAAA;CAAA,GAAA,CAAA,KAAA,eAAA,MAAA,CAAA,SAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,sBAAA;EAAA,aAAA,eAAA,MAAA,CAAA;CAAA,CAAA,CAAA,GAAA,EAAA,kBAAA;EAAA;EAAA,QAAA;EAAA;EAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA;AAEA,IAAA,iBAAA"}
1
+ {"version":3,"file":"input.ce.js","names":["InputField"],"sources":["../../../src/components/gui/input.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-input-layer\">\n <div class=\"rpg-ui-input-dialog rpg-ui-window rpg-anim-fade-in\">\n @if (title()) {\n <div class=\"rpg-ui-window-title\">{title()}</div>\n }\n <InputField data={data} layout=\"standalone\" submit={submit} cancel={cancel} />\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { computed } from \"canvasengine\";\n import InputField from \"./input-field.ce\";\n\n const { data, onInteraction } = defineProps();\n const title = computed(() => data().title || \"\");\n\n function submit(payload) {\n onInteraction?.(\"submit\", payload);\n }\n\n function cancel() {\n onInteraction?.(\"cancel\");\n }\n</script>\n"],"mappings":";;;AAQM,SAAS,UAAU,SAAS;CACX,SAAS,OAAO;CAC/B,MAAM,cAAc,eAAe,OAAO;CACtB,eAAe,OAAO;CAC1C,MAAM,EAAE,MAAM,kBAAkB,YAAY;CACpD,MAAM,QAAQ,eAAe,KAAK,CAAC,CAAC,SAAS,EAAE;CAC/C,SAAS,OAAO,SAAS;EACrB,gBAAgB,UAAU,OAAO;CACrC;CACA,SAAS,SAAS;EACd,gBAAgB,QAAQ;CAC5B;CAEQ,OADY,EAAE,cAAc;EAAE,OAAO;EAAQ,QAAQ;CAAO,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,qBAAqB;CAAE,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,qDAAqD;CAAE,GAAG,CAAC,KAAK,eAAe,MAAM,CAAC,SAAS,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,sBAAsB;EAAG,aAAa,eAAe,MAAM,CAAC;CAAE,CAAC,CAAC,GAAG,EAAEA,kBAAY;EAAQ;EAAM,QAAQ;EAAsB;EAAgB;CAAO,CAAC,CAAC,CAAC,CAAC,CACrd;AACb;AAEA,IAAM,iBAAiB"}
@@ -191,7 +191,7 @@ function component($$props) {
191
191
  const equippedStats = getItemStats(equipped);
192
192
  const nextStats = getItemStats(entry);
193
193
  const delta = {};
194
- new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)]).forEach((key) => {
194
+ (/* @__PURE__ */ new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)])).forEach((key) => {
195
195
  delta[key] = (nextStats[key] || 0) - (equippedStats[key] || 0);
196
196
  });
197
197
  return buildStatsList(delta);
@@ -1 +1 @@
1
- {"version":3,"file":"equip-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/equip-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.equip\")}</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(detailsItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">\n {detailsItem()?.name || currentSlot()?.label || t(\"rpg.menu.equip\")}\n </div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {detailsItem()?.description || \"\"}\n </div>\n @if (displayStats().length > 0) {\n <div class=\"rpg-ui-equip-stats\">\n @for ((stat,index) of displayStats) {\n <div class=\"rpg-ui-equip-stat\" class={{positive: stat.delta > 0, negative: stat.delta < 0}}>\n <div class=\"rpg-ui-equip-stat-key\">{stat.label}</div>\n <div class=\"rpg-ui-equip-stat-value\">\n {stat.delta > 0 ? \"+\" : \"\"}{stat.delta}\n </div>\n @if (stat.current) {\n <div class=\"rpg-ui-equip-stat-current\">{stat.current} -> {stat.next}</div>\n }\n </div>\n }\n </div>\n }\n <div class=\"rpg-ui-menu-panel-details-meta\">\n <span>{equippedText()}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of slotList) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((entry,index) of listEntries) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n @if (entry?.icon) {\n <DOMSprite \n sheet={iconSheet(entry.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n }\n </div>\n <span>{entry.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">{entry.tag || \"\"}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n const currentPlayer = engine.scene.currentPlayer;\n\n const selectedTab = signal(0);\n const selectedItem = signal(0);\n const { data, onInteraction, onBack } = defineProps();\n\n const equips = computed(() => data().equips ?? data().items);\n const slots = computed(() => data().slots);\n\n const defaultSlots = [\n { id: \"weapon\", label: t(\"rpg.menu.weapons\"), types: [\"weapon\"] },\n { id: \"armor\", label: t(\"rpg.menu.armor\"), types: [\"armor\"] }\n ];\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeEquips = computed(() => {\n const list = resolveProp(equips);\n return Array.isArray(list) ? list : [];\n });\n const slotList = computed(() => {\n const list = resolveProp(slots);\n if (Array.isArray(list) && list.length) return list;\n return defaultSlots;\n });\n\n const currentSlot = computed(() => slotList()[selectedTab()]);\n\n const equippedIds = computed(() => {\n const equipped = currentPlayer().equipments?.() || [];\n return new Set(equipped.map((it) => it?.id?.() ?? it?.id ?? it?.name));\n });\n const equippedOverrides = signal({});\n\n effect(() => {\n const next = {};\n safeEquips().forEach((item) => {\n if (item?.id && typeof item.equipped === \"boolean\") {\n next[item.id] = item.equipped;\n }\n });\n equippedOverrides.set(next);\n });\n\n const itemEquipped = (item) => {\n if (!item) return false;\n const overrides = equippedOverrides();\n if (Object.prototype.hasOwnProperty.call(overrides, item.id)) {\n return overrides[item.id];\n }\n if (typeof item.equipped === \"boolean\") return item.equipped;\n return equippedIds().has(item.id);\n };\n\n const slotTypes = (slot) => {\n if (!slot) return [];\n if (Array.isArray(slot.types)) return slot.types;\n if (slot.type) return [slot.type];\n if (slot.id) return [slot.id];\n return [];\n };\n\n const slotItems = computed(() => {\n const slot = currentSlot();\n if (!slot) return [];\n const types = new Set(slotTypes(slot));\n return safeEquips().filter((item) => item && types.has(item.type));\n });\n\n const currentEquippedItem = computed(() => {\n const list = slotItems();\n return list.find((item) => itemEquipped(item)) || null;\n });\n\n const listEntries = computed(() => {\n const items = slotItems().map((item) => ({\n ...item,\n kind: \"item\",\n tag: itemEquipped(item) ? t(\"rpg.shop.equipped\") : \"\"\n }));\n const equipped = currentEquippedItem();\n if (!equipped) return items;\n return [\n {\n id: \"__unequip__\",\n name: t(\"rpg.menu.unequip\"),\n description: t(\"rpg.menu.remove-equipment\"),\n kind: \"unequip\",\n tag: \"\"\n },\n ...items\n ];\n });\n\n const currentEntry = computed(() => listEntries()[selectedItem()]);\n const detailsItem = computed(() => {\n const entry = currentEntry();\n if (entry?.kind === \"item\") return entry;\n return currentEquippedItem();\n });\n\n const equippedText = computed(() => {\n const slot = currentSlot();\n if (!slot) return \"\";\n const equipped = currentEquippedItem();\n return equipped ? `${slot.label}: ${equipped.name}` : `${slot.label}: ${t(\"rpg.menu.empty\")}`;\n });\n const listEmpty = computed(() => listEntries().length === 0);\n\n const nav = createTabindexNavigator(selectedItem, { count: () => listEntries().length }, \"wrap\");\n\n const playerParams = computed(() => {\n const menuData = data();\n if (menuData?.playerStats) return menuData.playerStats;\n if (menuData?.playerParams) return menuData.playerParams;\n return currentPlayer()?._param?.() || {};\n });\n const statOrder = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const statLabels = {\n atk: \"ATK\",\n def: \"DEF\",\n pdef: \"PDEF\",\n sdef: \"SDEF\",\n str: \"STR\",\n dex: \"DEX\",\n int: \"INT\",\n agi: \"AGI\",\n maxHp: \"MAX HP\",\n maxSp: \"MAX SP\"\n };\n\n const getItemStats = (item) => {\n if (!item) return {};\n const stats = item.stats || item.params || {};\n if (Object.keys(stats).length) return stats;\n const keys = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const direct = {};\n keys.forEach((key) => {\n if (item[key] !== undefined) direct[key] = item[key];\n });\n return direct;\n };\n\n const buildStatsList = (deltaStats) => {\n const params = playerParams() || {};\n const orderedKeys = statOrder.filter((key) => deltaStats[key] !== undefined);\n const extraKeys = Object.keys(deltaStats).filter((key) => !statOrder.includes(key));\n const keys = orderedKeys.concat(extraKeys);\n const list = [];\n for (const key of keys) {\n const delta = deltaStats[key];\n if (delta === undefined || delta === 0) continue;\n let current = params[key];\n if (current === undefined && key === \"def\") current = params.pdef;\n const next = current !== undefined ? current + delta : undefined;\n list.push({\n key,\n label: statLabels[key] || key.toUpperCase(),\n delta,\n current,\n next\n });\n }\n return list;\n };\n\n const displayStats = computed(() => {\n const entry = currentEntry();\n const equipped = currentEquippedItem();\n if (!entry) return [];\n if (entry.kind === \"unequip\") {\n \n if (!equipped) return [];\n const stats = getItemStats(equipped);\n const delta = {};\n Object.keys(stats).forEach((key) => {\n delta[key] = -stats[key];\n });\n return buildStatsList(delta);\n }\n if (entry.kind === \"item\") {\n const equippedStats = getItemStats(equipped);\n const nextStats = getItemStats(entry);\n const delta = {};\n const keys = new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)]);\n keys.forEach((key) => {\n delta[key] = (nextStats[key] || 0) - (equippedStats[key] || 0);\n });\n return buildStatsList(delta);\n }\n return [];\n });\n\n const applyEquipState = (slot, itemId, equip) => {\n const types = slotTypes(slot);\n const next = { ...equippedOverrides() };\n if (types.length) {\n safeEquips().forEach((item) => {\n if (!item) return;\n if (types.includes(item.type)) {\n next[item.id] = false;\n }\n });\n }\n if (itemId) {\n next[itemId] = equip;\n }\n equippedOverrides.set(next);\n };\n\n const commitSelection = (index) => {\n const entry = listEntries()[index];\n if (!entry) return;\n if (entry.kind === \"unequip\") {\n const equipped = currentEquippedItem();\n if (equipped && onInteraction) {\n onInteraction(\"equipItem\", { id: equipped.id, equip: false });\n }\n applyEquipState(currentSlot(), equipped?.id, false);\n return;\n }\n if (entry.kind === \"item\" && onInteraction) {\n if (!itemEquipped(entry)) {\n onInteraction(\"equipItem\", { id: entry.id, equip: true });\n }\n applyEquipState(currentSlot(), entry.id, true);\n }\n };\n\n function selectTab(index) {\n return function() {\n selectedTab.set(index);\n selectedItem.set(0);\n }\n }\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n commitSelection(index);\n }\n }\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!listEntries().length) return;\n commitSelection(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n effect(() => {\n const count = listEntries().length;\n if (!count) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"equip-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/equip-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.equip\")}</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(detailsItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">\n {detailsItem()?.name || currentSlot()?.label || t(\"rpg.menu.equip\")}\n </div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {detailsItem()?.description || \"\"}\n </div>\n @if (displayStats().length > 0) {\n <div class=\"rpg-ui-equip-stats\">\n @for ((stat,index) of displayStats) {\n <div class=\"rpg-ui-equip-stat\" class={{positive: stat.delta > 0, negative: stat.delta < 0}}>\n <div class=\"rpg-ui-equip-stat-key\">{stat.label}</div>\n <div class=\"rpg-ui-equip-stat-value\">\n {stat.delta > 0 ? \"+\" : \"\"}{stat.delta}\n </div>\n @if (stat.current) {\n <div class=\"rpg-ui-equip-stat-current\">{stat.current} -> {stat.next}</div>\n }\n </div>\n }\n </div>\n }\n <div class=\"rpg-ui-menu-panel-details-meta\">\n <span>{equippedText()}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of slotList) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((entry,index) of listEntries) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n @if (entry?.icon) {\n <DOMSprite \n sheet={iconSheet(entry.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n }\n </div>\n <span>{entry.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">{entry.tag || \"\"}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n const currentPlayer = engine.scene.currentPlayer;\n\n const selectedTab = signal(0);\n const selectedItem = signal(0);\n const { data, onInteraction, onBack } = defineProps();\n\n const equips = computed(() => data().equips ?? data().items);\n const slots = computed(() => data().slots);\n\n const defaultSlots = [\n { id: \"weapon\", label: t(\"rpg.menu.weapons\"), types: [\"weapon\"] },\n { id: \"armor\", label: t(\"rpg.menu.armor\"), types: [\"armor\"] }\n ];\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeEquips = computed(() => {\n const list = resolveProp(equips);\n return Array.isArray(list) ? list : [];\n });\n const slotList = computed(() => {\n const list = resolveProp(slots);\n if (Array.isArray(list) && list.length) return list;\n return defaultSlots;\n });\n\n const currentSlot = computed(() => slotList()[selectedTab()]);\n\n const equippedIds = computed(() => {\n const equipped = currentPlayer().equipments?.() || [];\n return new Set(equipped.map((it) => it?.id?.() ?? it?.id ?? it?.name));\n });\n const equippedOverrides = signal({});\n\n effect(() => {\n const next = {};\n safeEquips().forEach((item) => {\n if (item?.id && typeof item.equipped === \"boolean\") {\n next[item.id] = item.equipped;\n }\n });\n equippedOverrides.set(next);\n });\n\n const itemEquipped = (item) => {\n if (!item) return false;\n const overrides = equippedOverrides();\n if (Object.prototype.hasOwnProperty.call(overrides, item.id)) {\n return overrides[item.id];\n }\n if (typeof item.equipped === \"boolean\") return item.equipped;\n return equippedIds().has(item.id);\n };\n\n const slotTypes = (slot) => {\n if (!slot) return [];\n if (Array.isArray(slot.types)) return slot.types;\n if (slot.type) return [slot.type];\n if (slot.id) return [slot.id];\n return [];\n };\n\n const slotItems = computed(() => {\n const slot = currentSlot();\n if (!slot) return [];\n const types = new Set(slotTypes(slot));\n return safeEquips().filter((item) => item && types.has(item.type));\n });\n\n const currentEquippedItem = computed(() => {\n const list = slotItems();\n return list.find((item) => itemEquipped(item)) || null;\n });\n\n const listEntries = computed(() => {\n const items = slotItems().map((item) => ({\n ...item,\n kind: \"item\",\n tag: itemEquipped(item) ? t(\"rpg.shop.equipped\") : \"\"\n }));\n const equipped = currentEquippedItem();\n if (!equipped) return items;\n return [\n {\n id: \"__unequip__\",\n name: t(\"rpg.menu.unequip\"),\n description: t(\"rpg.menu.remove-equipment\"),\n kind: \"unequip\",\n tag: \"\"\n },\n ...items\n ];\n });\n\n const currentEntry = computed(() => listEntries()[selectedItem()]);\n const detailsItem = computed(() => {\n const entry = currentEntry();\n if (entry?.kind === \"item\") return entry;\n return currentEquippedItem();\n });\n\n const equippedText = computed(() => {\n const slot = currentSlot();\n if (!slot) return \"\";\n const equipped = currentEquippedItem();\n return equipped ? `${slot.label}: ${equipped.name}` : `${slot.label}: ${t(\"rpg.menu.empty\")}`;\n });\n const listEmpty = computed(() => listEntries().length === 0);\n\n const nav = createTabindexNavigator(selectedItem, { count: () => listEntries().length }, \"wrap\");\n\n const playerParams = computed(() => {\n const menuData = data();\n if (menuData?.playerStats) return menuData.playerStats;\n if (menuData?.playerParams) return menuData.playerParams;\n return currentPlayer()?._param?.() || {};\n });\n const statOrder = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const statLabels = {\n atk: \"ATK\",\n def: \"DEF\",\n pdef: \"PDEF\",\n sdef: \"SDEF\",\n str: \"STR\",\n dex: \"DEX\",\n int: \"INT\",\n agi: \"AGI\",\n maxHp: \"MAX HP\",\n maxSp: \"MAX SP\"\n };\n\n const getItemStats = (item) => {\n if (!item) return {};\n const stats = item.stats || item.params || {};\n if (Object.keys(stats).length) return stats;\n const keys = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const direct = {};\n keys.forEach((key) => {\n if (item[key] !== undefined) direct[key] = item[key];\n });\n return direct;\n };\n\n const buildStatsList = (deltaStats) => {\n const params = playerParams() || {};\n const orderedKeys = statOrder.filter((key) => deltaStats[key] !== undefined);\n const extraKeys = Object.keys(deltaStats).filter((key) => !statOrder.includes(key));\n const keys = orderedKeys.concat(extraKeys);\n const list = [];\n for (const key of keys) {\n const delta = deltaStats[key];\n if (delta === undefined || delta === 0) continue;\n let current = params[key];\n if (current === undefined && key === \"def\") current = params.pdef;\n const next = current !== undefined ? current + delta : undefined;\n list.push({\n key,\n label: statLabels[key] || key.toUpperCase(),\n delta,\n current,\n next\n });\n }\n return list;\n };\n\n const displayStats = computed(() => {\n const entry = currentEntry();\n const equipped = currentEquippedItem();\n if (!entry) return [];\n if (entry.kind === \"unequip\") {\n \n if (!equipped) return [];\n const stats = getItemStats(equipped);\n const delta = {};\n Object.keys(stats).forEach((key) => {\n delta[key] = -stats[key];\n });\n return buildStatsList(delta);\n }\n if (entry.kind === \"item\") {\n const equippedStats = getItemStats(equipped);\n const nextStats = getItemStats(entry);\n const delta = {};\n const keys = new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)]);\n keys.forEach((key) => {\n delta[key] = (nextStats[key] || 0) - (equippedStats[key] || 0);\n });\n return buildStatsList(delta);\n }\n return [];\n });\n\n const applyEquipState = (slot, itemId, equip) => {\n const types = slotTypes(slot);\n const next = { ...equippedOverrides() };\n if (types.length) {\n safeEquips().forEach((item) => {\n if (!item) return;\n if (types.includes(item.type)) {\n next[item.id] = false;\n }\n });\n }\n if (itemId) {\n next[itemId] = equip;\n }\n equippedOverrides.set(next);\n };\n\n const commitSelection = (index) => {\n const entry = listEntries()[index];\n if (!entry) return;\n if (entry.kind === \"unequip\") {\n const equipped = currentEquippedItem();\n if (equipped && onInteraction) {\n onInteraction(\"equipItem\", { id: equipped.id, equip: false });\n }\n applyEquipState(currentSlot(), equipped?.id, false);\n return;\n }\n if (entry.kind === \"item\" && onInteraction) {\n if (!itemEquipped(entry)) {\n onInteraction(\"equipItem\", { id: entry.id, equip: true });\n }\n applyEquipState(currentSlot(), entry.id, true);\n }\n };\n\n function selectTab(index) {\n return function() {\n selectedTab.set(index);\n selectedItem.set(0);\n }\n }\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n commitSelection(index);\n }\n }\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!listEntries().length) return;\n commitSelection(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n effect(() => {\n const count = listEntries().length;\n if (!count) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n });\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"exit-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/exit-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={controls}>\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.exit\")}</div>\n <div class=\"rpg-ui-menu-panel-body\">\n <div class=\"rpg-ui-menu-panel-details\">\n <div class=\"rpg-ui-menu-panel-details-title\">{t(\"rpg.menu.leave-game\")}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {t(\"rpg.menu.exit-help\")}\n </div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onConfirm, onBack } = defineProps();\n\n const controls = signal({\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (onConfirm) onConfirm();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":";;;;;AAUM,SAAO,UAAA,SAAA;CACJ,SAAA,OAAA;CACP,MAAY,cAAA,eAAA,OAAA;;CAEP,MAAA,SAAA,OAAA,eAAA;CACP,MAAI,EAAA,MAAS,OAAQ,KAAK;CAC1B,MAAI,mBAAkB,OAAU,aAAU;CAC1C,MAAI,EAAA,WAAS,WAAiB,YAAY;CAqBlC,OADC,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAnBI,OAAA;;IAET,MAAM,uBAAgB,iBAAgB,MAAA;IACtC,UAAc;KACR,IAAA,WACE,UAAW;;GAEnB;GACA,QAAI;IACA,MAAI,iBAAM;IACV,UAAI;KACA,IAAI,QACJ,OAAA;IACJ;GACJ;GACA,SAAQ,EACJ,SAAI,KACR;EACJ,CACS;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iCAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;EAAA,aAAA,eAAA,EAAA,eAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA,eAAA,EAAA,qBAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iCAAA;EAAA,aAAA,eAAA,EAAA,oBAAA,CAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACQ;AACX;AAEA,IAAA,iBAAA"}
1
+ {"version":3,"file":"exit-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/exit-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={controls}>\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.exit\")}</div>\n <div class=\"rpg-ui-menu-panel-body\">\n <div class=\"rpg-ui-menu-panel-details\">\n <div class=\"rpg-ui-menu-panel-details-title\">{t(\"rpg.menu.leave-game\")}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {t(\"rpg.menu.exit-help\")}\n </div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onConfirm, onBack } = defineProps();\n\n const controls = signal({\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (onConfirm) onConfirm();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":";;;;;AAUM,SAAS,UAAU,SAAS;CACX,SAAS,OAAO;CAC/B,MAAM,cAAc,eAAe,OAAO;CACtB,eAAe,OAAO;CAC1C,MAAM,SAAS,OAAO,eAAe;CAC7C,MAAM,EAAE,MAAM,OAAO,KAAK;CAC1B,MAAM,mBAAmB,OAAO,aAAa;CAC7C,MAAM,EAAE,WAAW,WAAW,YAAY;CAqBlC,OADY,EAAE,cAAc;EAAE,OAAO;EAAQ,QAAQ;EAAQ,UAnBpD,OAAO;GACpB,QAAQ;IACJ,MAAM,uBAAuB,iBAAiB,MAAM;IACpD,UAAU;KACN,IAAI,WACA,UAAU;IAClB;GACJ;GACA,QAAQ;IACJ,MAAM,iBAAiB;IACvB,UAAU;KACN,IAAI,QACA,OAAO;IACf;GACJ;GACA,SAAS,EACL,SAAS,KACb;EACJ,CACsF;CAAE,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,iCAAiC;CAAE,GAAG,CAAC,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,2BAA2B;EAAG,aAAa,eAAe,EAAE,eAAe,CAAC;CAAE,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,yBAAyB;CAAE,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,4BAA4B;CAAE,GAAG,CAAC,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,kCAAkC;EAAG,aAAa,eAAe,EAAE,qBAAqB,CAAC;CAAE,CAAC,GAAG,EAAE,YAAY;EAAE,SAAS;EAAO,OAAO,EAAE,OAAO,iCAAiC;EAAG,aAAa,eAAe,EAAE,oBAAoB,CAAC;CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/tB;AACb;AAEA,IAAM,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"items-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/items-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.items\")}</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n @if (currentItem) {\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentItem()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentItem()?.description || \"\"}</div>\n </div>\n </div>\n </div>\n }\n </div>\n \n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of tabs) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((item,index) of filteredItems) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n class={{disabled: !item.usable}}\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n </div>\n <span>{item.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">x{item.quantity ?? 1}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n @if (confirmOpen) {\n <div class=\"rpg-ui-menu-confirm\" click={cancelConfirmFromPointer}>\n <button class=\"rpg-ui-close-button\" type=\"button\" title=\"Close\" aria-label=\"Close confirmation\" click={cancelConfirmFromPointer}>x</button>\n <div class=\"rpg-ui-menu-confirm-card\" click={stopEvent}>\n <div class=\"rpg-ui-menu-confirm-title\">{t(\"rpg.menu.use\")} {confirmItem()?.name}?</div>\n <Navigation tabindex={selectedConfirm} controls={confirmControls}>\n <div class=\"rpg-ui-menu-confirm-actions\">\n @for ((option,index) of confirmOptions) {\n <button\n class=\"rpg-ui-menu-confirm-btn\"\n class={{\"rpg-ui-menu-confirm-btn-secondary\": option.id === \"cancel\"}}\n data-selected={selectedConfirm() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={confirmSelect(index)}\n >{option.label}</button>\n }\n </div>\n </Navigation>\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedItem = signal(0);\n const selectedTab = signal(0);\n const selectedConfirm = signal(0);\n const confirmOpen = signal(false);\n const confirmItem = signal(null);\n\n const { data, onInteraction, onBack } = defineProps();\n\n const items = computed(() => data().items);\n\n const tabs = [\n { id: \"item\", label: t(\"rpg.menu.items\") },\n { id: \"weapon\", label: t(\"rpg.menu.weapons\") },\n { id: \"armor\", label: t(\"rpg.menu.armor\") }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeItems = computed(() => {\n const value = resolveProp(items);\n return Array.isArray(value) ? value : [];\n });\n\n const filteredItems = computed(() => {\n const items = safeItems();\n const tab = tabs[selectedTab()];\n if (!tab) return [];\n return items.filter((item) => item.type === tab.id && (item.quantity ?? 1) > 0);\n });\n\n const confirmOptions = [\n { id: \"use\", label: t(\"rpg.menu.use\") },\n { id: \"cancel\", label: t(\"rpg.menu.cancel\") }\n ];\n\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, \"wrap\");\n const navConfirm = createTabindexNavigator(selectedConfirm, { count: () => confirmOptions.length }, \"wrap\");\n const currentItem = computed(() => filteredItems()[selectedItem()]);\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const clampSelection = () => {\n const count = filteredItems().length;\n if (count === 0) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n };\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n requestUseItem(index);\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedItem.set(0);\n selectedTab.set(index);\n }\n }\n\n const useItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n };\n\n const requestUseItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (item.consumable) {\n confirmItem.set(item);\n confirmOpen.set(true);\n selectedConfirm.set(0);\n return;\n }\n useItem(index);\n };\n\n const confirmUse = () => {\n const item = confirmItem();\n if (!item) return;\n delay(() => {\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const cancelConfirm = () => {\n delay(() => {\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const stopEvent = (event) => {\n event?.stopPropagation?.();\n };\n\n const cancelConfirmFromPointer = (event) => {\n stopEvent(event);\n cancelConfirm();\n };\n\n function confirmSelect(index) {\n return function() {\n selectedConfirm.set(index);\n if (index === 0) {\n confirmUse();\n return;\n }\n cancelConfirm();\n }\n }\n\n const confirmControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(-1);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!confirmOpen()) return;\n confirmSelect(selectedConfirm())();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (!confirmOpen()) return;\n cancelConfirm();\n }\n }\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (confirmOpen()) {\n confirmSelect(selectedConfirm())();\n return;\n }\n requestUseItem(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (confirmOpen()) {\n cancelConfirm();\n return;\n }\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n clampSelection();\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"items-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/items-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.items\")}</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n @if (currentItem) {\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentItem()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentItem()?.description || \"\"}</div>\n </div>\n </div>\n </div>\n }\n </div>\n \n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of tabs) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((item,index) of filteredItems) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n class={{disabled: !item.usable}}\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n </div>\n <span>{item.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">x{item.quantity ?? 1}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n @if (confirmOpen) {\n <div class=\"rpg-ui-menu-confirm\" click={cancelConfirmFromPointer}>\n <button class=\"rpg-ui-close-button\" type=\"button\" title=\"Close\" aria-label=\"Close confirmation\" click={cancelConfirmFromPointer}>x</button>\n <div class=\"rpg-ui-menu-confirm-card\" click={stopEvent}>\n <div class=\"rpg-ui-menu-confirm-title\">{t(\"rpg.menu.use\")} {confirmItem()?.name}?</div>\n <Navigation tabindex={selectedConfirm} controls={confirmControls}>\n <div class=\"rpg-ui-menu-confirm-actions\">\n @for ((option,index) of confirmOptions) {\n <button\n class=\"rpg-ui-menu-confirm-btn\"\n class={{\"rpg-ui-menu-confirm-btn-secondary\": option.id === \"cancel\"}}\n data-selected={selectedConfirm() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={confirmSelect(index)}\n >{option.label}</button>\n }\n </div>\n </Navigation>\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedItem = signal(0);\n const selectedTab = signal(0);\n const selectedConfirm = signal(0);\n const confirmOpen = signal(false);\n const confirmItem = signal(null);\n\n const { data, onInteraction, onBack } = defineProps();\n\n const items = computed(() => data().items);\n\n const tabs = [\n { id: \"item\", label: t(\"rpg.menu.items\") },\n { id: \"weapon\", label: t(\"rpg.menu.weapons\") },\n { id: \"armor\", label: t(\"rpg.menu.armor\") }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeItems = computed(() => {\n const value = resolveProp(items);\n return Array.isArray(value) ? value : [];\n });\n\n const filteredItems = computed(() => {\n const items = safeItems();\n const tab = tabs[selectedTab()];\n if (!tab) return [];\n return items.filter((item) => item.type === tab.id && (item.quantity ?? 1) > 0);\n });\n\n const confirmOptions = [\n { id: \"use\", label: t(\"rpg.menu.use\") },\n { id: \"cancel\", label: t(\"rpg.menu.cancel\") }\n ];\n\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, \"wrap\");\n const navConfirm = createTabindexNavigator(selectedConfirm, { count: () => confirmOptions.length }, \"wrap\");\n const currentItem = computed(() => filteredItems()[selectedItem()]);\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const clampSelection = () => {\n const count = filteredItems().length;\n if (count === 0) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n };\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n requestUseItem(index);\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedItem.set(0);\n selectedTab.set(index);\n }\n }\n\n const useItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n };\n\n const requestUseItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (item.consumable) {\n confirmItem.set(item);\n confirmOpen.set(true);\n selectedConfirm.set(0);\n return;\n }\n useItem(index);\n };\n\n const confirmUse = () => {\n const item = confirmItem();\n if (!item) return;\n delay(() => {\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const cancelConfirm = () => {\n delay(() => {\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const stopEvent = (event) => {\n event?.stopPropagation?.();\n };\n\n const cancelConfirmFromPointer = (event) => {\n stopEvent(event);\n cancelConfirm();\n };\n\n function confirmSelect(index) {\n return function() {\n selectedConfirm.set(index);\n if (index === 0) {\n confirmUse();\n return;\n }\n cancelConfirm();\n }\n }\n\n const confirmControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(-1);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!confirmOpen()) return;\n confirmSelect(selectedConfirm())();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (!confirmOpen()) return;\n cancelConfirm();\n }\n }\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (confirmOpen()) {\n confirmSelect(selectedConfirm())();\n return;\n }\n requestUseItem(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (confirmOpen()) {\n cancelConfirm();\n return;\n }\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n clampSelection();\n</script>\n"],"mappings":"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"}