@rpgjs/client 5.0.0-beta.7 → 5.0.0-beta.9

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 (158) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/Game/AnimationManager.js.map +1 -1
  3. package/dist/Game/Event.js.map +1 -1
  4. package/dist/Game/Map.d.ts +9 -1
  5. package/dist/Game/Map.js +63 -5
  6. package/dist/Game/Map.js.map +1 -1
  7. package/dist/Game/Object.d.ts +17 -9
  8. package/dist/Game/Object.js +1 -12
  9. package/dist/Game/Object.js.map +1 -1
  10. package/dist/Game/Player.js.map +1 -1
  11. package/dist/Gui/Gui.d.ts +17 -4
  12. package/dist/Gui/Gui.js +64 -34
  13. package/dist/Gui/Gui.js.map +1 -1
  14. package/dist/Gui/Gui.spec.d.ts +1 -0
  15. package/dist/Gui/NotificationManager.js.map +1 -1
  16. package/dist/Resource.js +1 -1
  17. package/dist/Resource.js.map +1 -1
  18. package/dist/RpgClient.d.ts +35 -2
  19. package/dist/RpgClientEngine.d.ts +41 -5
  20. package/dist/RpgClientEngine.js +50 -5
  21. package/dist/RpgClientEngine.js.map +1 -1
  22. package/dist/Sound.js.map +1 -1
  23. package/dist/_virtual/{_@oxc-project_runtime@0.128.0 → _@oxc-project_runtime@0.130.0}/helpers/decorate.js +1 -1
  24. package/dist/_virtual/{_@oxc-project_runtime@0.128.0 → _@oxc-project_runtime@0.130.0}/helpers/decorateMetadata.js +1 -1
  25. package/dist/components/animations/animation.ce.js.map +1 -1
  26. package/dist/components/animations/hit.ce.js.map +1 -1
  27. package/dist/components/animations/index.js.map +1 -1
  28. package/dist/components/character.ce.js +259 -5
  29. package/dist/components/character.ce.js.map +1 -1
  30. package/dist/components/dynamics/bar.ce.js +96 -0
  31. package/dist/components/dynamics/bar.ce.js.map +1 -0
  32. package/dist/components/dynamics/image.ce.js +23 -0
  33. package/dist/components/dynamics/image.ce.js.map +1 -0
  34. package/dist/components/dynamics/parse-value.d.ts +3 -0
  35. package/dist/components/dynamics/parse-value.js +51 -35
  36. package/dist/components/dynamics/parse-value.js.map +1 -1
  37. package/dist/components/dynamics/parse-value.spec.d.ts +1 -0
  38. package/dist/components/dynamics/shape-utils.d.ts +16 -0
  39. package/dist/components/dynamics/shape-utils.js +73 -0
  40. package/dist/components/dynamics/shape-utils.js.map +1 -0
  41. package/dist/components/dynamics/shape-utils.spec.d.ts +1 -0
  42. package/dist/components/dynamics/shape.ce.js +83 -0
  43. package/dist/components/dynamics/shape.ce.js.map +1 -0
  44. package/dist/components/dynamics/text.ce.js +28 -41
  45. package/dist/components/dynamics/text.ce.js.map +1 -1
  46. package/dist/components/gui/box.ce.js.map +1 -1
  47. package/dist/components/gui/dialogbox/index.ce.js +3 -3
  48. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  49. package/dist/components/gui/gameover.ce.js +1 -1
  50. package/dist/components/gui/gameover.ce.js.map +1 -1
  51. package/dist/components/gui/hud/hud.ce.js +1 -1
  52. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  53. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  54. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  55. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  56. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  57. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  58. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  59. package/dist/components/gui/mobile/index.js.map +1 -1
  60. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  61. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  62. package/dist/components/gui/save-load.ce.js.map +1 -1
  63. package/dist/components/gui/shop/shop.ce.js +1 -1
  64. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  65. package/dist/components/gui/title-screen.ce.js +2 -2
  66. package/dist/components/gui/title-screen.ce.js.map +1 -1
  67. package/dist/components/player-components-utils.d.ts +67 -0
  68. package/dist/components/player-components-utils.js +162 -0
  69. package/dist/components/player-components-utils.js.map +1 -0
  70. package/dist/components/player-components-utils.spec.d.ts +1 -0
  71. package/dist/components/player-components.ce.js +188 -0
  72. package/dist/components/player-components.ce.js.map +1 -0
  73. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  74. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  75. package/dist/components/scenes/canvas.ce.js +147 -4
  76. package/dist/components/scenes/canvas.ce.js.map +1 -1
  77. package/dist/components/scenes/draw-map.ce.js +2 -8
  78. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  79. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  80. package/dist/core/inject.js +1 -1
  81. package/dist/core/inject.js.map +1 -1
  82. package/dist/core/setup.js +1 -1
  83. package/dist/core/setup.js.map +1 -1
  84. package/dist/decorators/spritesheet.d.ts +1 -0
  85. package/dist/decorators/spritesheet.js +11 -0
  86. package/dist/decorators/spritesheet.js.map +1 -0
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.js +3 -2
  89. package/dist/module.js +4 -1
  90. package/dist/module.js.map +1 -1
  91. package/dist/node_modules/.pnpm/{@signe_di@2.10.0 → @signe_di@3.0.1}/node_modules/@signe/di/dist/index.js +1 -1
  92. package/dist/node_modules/.pnpm/@signe_di@3.0.1/node_modules/@signe/di/dist/index.js.map +1 -0
  93. package/dist/node_modules/.pnpm/{@signe_reactive@2.9.2 → @signe_reactive@3.0.1}/node_modules/@signe/reactive/dist/index.js +15 -3
  94. package/dist/node_modules/.pnpm/@signe_reactive@3.0.1/node_modules/@signe/reactive/dist/index.js.map +1 -0
  95. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/chunk-EUXUH3YW.js +13 -0
  96. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/chunk-EUXUH3YW.js.map +1 -0
  97. package/dist/node_modules/.pnpm/{@signe_room@2.10.0 → @signe_room@3.0.1}/node_modules/@signe/room/dist/index.js +124 -39
  98. package/dist/node_modules/.pnpm/@signe_room@3.0.1/node_modules/@signe/room/dist/index.js.map +1 -0
  99. package/dist/node_modules/.pnpm/{@signe_sync@2.10.0 → @signe_sync@3.0.1}/node_modules/@signe/sync/dist/client/index.js +1 -1
  100. package/dist/node_modules/.pnpm/@signe_sync@3.0.1/node_modules/@signe/sync/dist/client/index.js.map +1 -0
  101. package/dist/node_modules/.pnpm/{@signe_sync@2.10.0 → @signe_sync@3.0.1}/node_modules/@signe/sync/dist/index.js +36 -13
  102. package/dist/node_modules/.pnpm/@signe_sync@3.0.1/node_modules/@signe/sync/dist/index.js.map +1 -0
  103. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +1 -1
  104. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
  105. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
  106. package/dist/presets/animation.js.map +1 -1
  107. package/dist/presets/faceset.js.map +1 -1
  108. package/dist/presets/icon.js.map +1 -1
  109. package/dist/presets/index.js.map +1 -1
  110. package/dist/presets/lpc.js.map +1 -1
  111. package/dist/presets/rmspritesheet.js.map +1 -1
  112. package/dist/services/AbstractSocket.js.map +1 -1
  113. package/dist/services/keyboardControls.js.map +1 -1
  114. package/dist/services/loadMap.d.ts +6 -0
  115. package/dist/services/loadMap.js +1 -1
  116. package/dist/services/loadMap.js.map +1 -1
  117. package/dist/services/mmorpg.js +7 -3
  118. package/dist/services/mmorpg.js.map +1 -1
  119. package/dist/services/save.js.map +1 -1
  120. package/dist/services/standalone.js +1 -1
  121. package/dist/services/standalone.js.map +1 -1
  122. package/dist/utils/getEntityProp.js.map +1 -1
  123. package/package.json +10 -10
  124. package/src/Game/Map.ts +91 -2
  125. package/src/Game/Object.ts +22 -35
  126. package/src/Gui/Gui.spec.ts +273 -0
  127. package/src/Gui/Gui.ts +105 -50
  128. package/src/Resource.ts +1 -2
  129. package/src/RpgClient.ts +36 -2
  130. package/src/RpgClientEngine.ts +74 -11
  131. package/src/components/character.ce +318 -9
  132. package/src/components/dynamics/bar.ce +87 -0
  133. package/src/components/dynamics/image.ce +20 -0
  134. package/src/components/dynamics/parse-value.spec.ts +41 -0
  135. package/src/components/dynamics/parse-value.ts +102 -37
  136. package/src/components/dynamics/shape-utils.spec.ts +46 -0
  137. package/src/components/dynamics/shape-utils.ts +61 -0
  138. package/src/components/dynamics/shape.ce +89 -0
  139. package/src/components/dynamics/text.ce +34 -149
  140. package/src/components/player-components-utils.spec.ts +109 -0
  141. package/src/components/player-components-utils.ts +205 -0
  142. package/src/components/player-components.ce +221 -0
  143. package/src/components/scenes/canvas.ce +165 -6
  144. package/src/components/scenes/draw-map.ce +2 -15
  145. package/src/components/scenes/event-layer.ce +1 -2
  146. package/src/core/setup.ts +2 -2
  147. package/src/decorators/spritesheet.ts +8 -0
  148. package/src/index.ts +1 -0
  149. package/src/module.ts +5 -1
  150. package/src/services/loadMap.ts +2 -0
  151. package/src/services/mmorpg.ts +8 -2
  152. package/dist/node_modules/.pnpm/@signe_di@2.10.0/node_modules/@signe/di/dist/index.js.map +0 -1
  153. package/dist/node_modules/.pnpm/@signe_reactive@2.10.0/node_modules/@signe/reactive/dist/index.js +0 -45
  154. package/dist/node_modules/.pnpm/@signe_reactive@2.10.0/node_modules/@signe/reactive/dist/index.js.map +0 -1
  155. package/dist/node_modules/.pnpm/@signe_reactive@2.9.2/node_modules/@signe/reactive/dist/index.js.map +0 -1
  156. package/dist/node_modules/.pnpm/@signe_room@2.10.0/node_modules/@signe/room/dist/index.js.map +0 -1
  157. package/dist/node_modules/.pnpm/@signe_sync@2.10.0/node_modules/@signe/sync/dist/client/index.js.map +0 -1
  158. package/dist/node_modules/.pnpm/@signe_sync@2.10.0/node_modules/@signe/sync/dist/index.js.map +0 -1
@@ -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\n const engine = inject(RpgClientEngine);\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: \"Title Screen\" },\n { id: \"load\", label: \"Load Game\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || \"Game Over\");\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: 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\n const engine = inject(RpgClientEngine);\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: \"Title Screen\" },\n { id: \"load\", label: \"Load Game\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || \"Game Over\");\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: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":"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"}
@@ -33,7 +33,7 @@ function component($$props) {
33
33
  }, [h(DOMElement, {
34
34
  element: "div",
35
35
  attrs: { class: "rpg-avatar" }
36
- }, [cond(hasFace(), () => h(DOMElement, {
36
+ }, [cond(computed(() => hasFace()), () => h(DOMElement, {
37
37
  element: "div",
38
38
  attrs: { class: "rpg-avatar-face" }
39
39
  }, h(DOMSprite, {
@@ -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={64} \n height={64} \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,QAAA;CACJ,MAAK,cAAe,eAAe,QAAQ;CAC3C,MAAK,SAAA,OAAA,gBAAA;CACb,MAAM,gBAAc,OAAI,MAAW;CACnC,MAAM,EAAE,SAAS,aAAW;CAC5B,MAAM,EAAE,YAAS,MAAK;CACtB,MAAM,eAAe,UAAU,OAAK,UAAY,aAAS,OAAO,GAAA;CAChE,MAAM,OAAO,eAAI,YAAA,MAAA,CAAA,QAAA,CAAA;CACjB,MAAM,UAAU,eAAe;EAC3B,MAAM,QAAO,MAAK;EAClB,OAAO,CAAC,EAAE,SAAO,MAAO;GAC1B;CACF,MAAM,aAAO,eAAA;EACT,YAAK,OAAA,eAAA,UAAA,GAAA;EACP,SAAA,UAAY,cAAA;;CAEd,MAAC,KAAM,cAAA,eAAA,KAAA;CACP,MAAI,QAAS,cAAe,eAAc,eAAO;CACjD,MAAI,YAAS,eAAkB,IAAO,GAAG,OAAK,GAAA,MAAA,IAAgB;CAC9D,MAAI,KAAO,cAAa,eAAM,KAAa;CAC3C,MAAI,QAAS,cAAe,eAAe,eAAO;;CAElD,MAAI,QAAM,cAAgB,eAAe,QAAA;CAErC,OADM,EAAA,cAAuB,MAAM,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,WAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,cAAA;EAAA,EAAA,CAAA,KAAA,SAAA,QAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mBAAA;EAAA,EAAA,EAAA,WAAA;EAAA,OAAA,eAAA,UAAA,MAAA,CAAA,CAAA;EAAA,OAAA;EAAA,QAAA;EAAA,WAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oBAAA;EAAA,aAAA,eAAA,OAAA,CAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,gBAAA;EAAA,aAAA,eAAA,QAAA,IAAA,GAAA,MAAA,OAAA,CAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA,EAAA,OAAA,WAAA;GAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,gBAAA;EAAA,aAAA,eAAA,QAAA,IAAA,GAAA,MAAA,OAAA,CAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA,EAAA,OAAA,WAAA;GAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACnB;;AAGhB,IAAM,iBAAA"}
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={64} \n height={64} \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;CAC1C,MAAK,SAAA,OAAA,eAAA;CACb,MAAM,gBAAc,OAAI,MAAW;CACnC,MAAM,EAAE,SAAS,YAAW;CAC5B,MAAM,EAAE,YAAS,KAAK;CACtB,MAAM,eAAe,UAAU,OAAK,UAAY,aAAS,MAAO,IAAA;CAChE,MAAM,OAAO,eAAI,YAAA,KAAA,EAAA,OAAA,CAAA;CACjB,MAAM,UAAU,eAAe;EAC3B,MAAM,QAAO,KAAK;EAClB,OAAO,CAAC,EAAE,SAAO,MAAO;CAC5B,CAAC;CACD,MAAM,aAAO,eAAA;EACT,YAAK,OAAA,eAAA,UAAA,EAAA;EACP,SAAA,UAAY,cAAA;;CAEd,MAAC,KAAM,cAAA,eAAA,IAAA;CACP,MAAI,QAAS,cAAe,eAAc,cAAO;CACjD,MAAI,YAAS,eAAkB,GAAM,IAAI,MAAK,IAAA,MAAA,GAAe;CAC7D,MAAI,KAAO,cAAa,eAAM,IAAa;CAC3C,MAAI,QAAS,cAAe,eAAe,cAAO;;CAElD,MAAI,QAAM,cAAgB,eAAe,OAAA;CAErC,OADM,EAAA,cAAuB,MAAM,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,CACpB;AACf;AAEA,IAAM,iBAAA"}
@@ -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\">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 || \"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\n const engine = inject(RpgClientEngine);\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: \"Weapon\", types: [\"weapon\"] },\n { id: \"armor\", label: \"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) ? \"Equipped\" : \"\"\n }));\n const equipped = currentEquippedItem();\n if (!equipped) return items;\n return [\n {\n id: \"__unequip__\",\n name: \"Unequip\",\n description: \"Remove the current 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}: 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: 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\">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 || \"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\n const engine = inject(RpgClientEngine);\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: \"Weapon\", types: [\"weapon\"] },\n { id: \"armor\", label: \"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) ? \"Equipped\" : \"\"\n }));\n const equipped = currentEquippedItem();\n if (!equipped) return items;\n return [\n {\n id: \"__unequip__\",\n name: \"Unequip\",\n description: \"Remove the current 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}: 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: 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\">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\">Leave the game?</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n Press Action to confirm or Escape to go back.\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\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onConfirm, onBack } = defineProps();\n\n const controls = signal({\n action: {\n bind: 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":";;;;AASM,SAAQ,UAAG,SAAA;CACJ,SAAA,QAAA;CACP,MAAG,cAAA,eAAA,QAAA;0BACK,OAAA,gBAAA,CAAA,aAAA;CAEd,MAAC,EAAM,WAAA,WAAA,aAAA;CAqBC,OADI,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAnBC,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;KAErB,IAAM,WACN,WAAiB;;;GAGvB,QAAM;IACF,MAAM,iBAAE;IACR,UAAU;KACN,IAAA,QACI,QAAI;;IAEf;GACD,SAAI,EACA,SAAS,MACZ;GACJ,CACW;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACH;;AAGH,IAAE,iBAEA"}
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\">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\">Leave the game?</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n Press Action to confirm or Escape to go back.\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\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onConfirm, onBack } = defineProps();\n\n const controls = signal({\n action: {\n bind: 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":";;;;AASM,SAAQ,UAAG,SAAA;CACJ,SAAA,OAAA;CACP,MAAG,cAAA,eAAA,OAAA;0BACK,OAAA,eAAA,EAAA,aAAA;CAEd,MAAC,EAAM,WAAA,WAAA,YAAA;CAqBC,OADI,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAnBC,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;KAErB,IAAM,WACN,UAAgB;IACtB;;GAEA,QAAM;IACF,MAAM,iBAAE;IACR,UAAU;KACN,IAAA,QACI,OAAI;IACZ;GACJ;GACA,SAAI,EACA,SAAS,KACb;EACJ,CACY;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;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;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iCAAA;EAAA,aAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACH;AACH;AAEA,IAAE,iBAEA"}
@@ -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\">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\">\n <div class=\"rpg-ui-menu-confirm-card\">\n <div class=\"rpg-ui-menu-confirm-title\">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\n const engine = inject(RpgClientEngine);\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: \"Items\" },\n { id: \"weapon\", label: \"Weapons\" },\n { id: \"armor\", label: \"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: \"Use\" },\n { id: \"cancel\", label: \"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 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: 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: 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\">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\">\n <div class=\"rpg-ui-menu-confirm-card\">\n <div class=\"rpg-ui-menu-confirm-title\">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\n const engine = inject(RpgClientEngine);\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: \"Items\" },\n { id: \"weapon\", label: \"Weapons\" },\n { id: \"armor\", label: \"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: \"Use\" },\n { id: \"cancel\", label: \"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 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: 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: 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 +1 @@
1
- {"version":3,"file":"main-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/main-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={menuControls}>\n <div class=\"rpg-ui-main-menu rpg-anim-fade-in\">\n <div class=\"rpg-ui-main-menu-layout\">\n <div class=\"rpg-ui-main-menu-left rpg-ui-menu rpg-ui-panel\">\n <div class=\"rpg-ui-menu-header\">Menu</div>\n <div class=\"rpg-ui-main-menu-list\">\n @for ((entry,index) of menuEntries()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isMenuDisabled(entry)}}\n data-selected={selectedMenu() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectMenu(index)}\n >{entry.label}</div>\n }\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-right\">\n @if (view() === \"menu\") {\n <div class=\"rpg-ui-panel\">\n <div class=\"rpg-ui-main-menu-section-title\">Status</div>\n <div class=\"rpg-ui-main-menu-status-card\">\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Level</div>\n <div class=\"rpg-ui-main-menu-status-value\">{level()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Gold</div>\n <div class=\"rpg-ui-main-menu-status-value\">{gold()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">HP {hp()}/{hpMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill hp\" style={{width: hpPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">SP {sp()}/{spMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill sp\" style={{width: spPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\" style={{gridColumn: \"span 2\"}}>\n <div class=\"rpg-ui-main-menu-status-label\">EXP {exp()}/{expForNextlevel()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill exp\" style={{width: expPercent}}></div>\n </div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-section-title\">Parameters</div>\n <div class=\"rpg-ui-main-menu-params\">\n @for ((param,index) of paramsList) {\n <div class=\"rpg-ui-main-menu-param\">\n <span>{param.label}</span>\n <span>{param.value}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (view() === \"items\") {\n <ItemsMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"skills\") {\n <SkillsMenu data={data} onBack={goBack} />\n }\n @if (view() === \"equip\") {\n <EquipMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"options\") {\n <OptionsMenu onBack={goBack} />\n }\n @if (view() === \"exit\") {\n <ExitMenu onConfirm={confirmExit} onBack={goBack} />\n }\n </div>\n </div>\n @if (saveOverlay) {\n <div class=\"rpg-ui-main-menu-overlay\">\n <div class=\"rpg-ui-main-menu-overlay-backdrop\"></div>\n <div class=\"rpg-ui-main-menu-overlay-content\">\n <SaveLoadComponent\n data={saveLoadData}\n onFinish={closeSaveOverlay}\n />\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import SaveLoadComponent from \"../save-load.ce\";\n import ItemsMenu from \"./items-menu.ce\";\n import SkillsMenu from \"./skills-menu.ce\";\n import EquipMenu from \"./equip-menu.ce\";\n import OptionsMenu from \"./options-menu.ce\";\n import ExitMenu from \"./exit-menu.ce\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer;\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { data, onFinish, onInteraction } = defineProps();\n const { menus, items, skills, equips, saveLoad } = data();\n\n const defaultMenus = [\n { id: \"items\", label: \"Items\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"equip\", label: \"Equip\" },\n { id: \"options\", label: \"Options\" },\n { id: \"save\", label: \"Save\" },\n { id: \"exit\", label: \"Exit\" }\n ];\n\n const menuEntries = computed(() => {\n if (menus && Array.isArray(menus) && menus.length) return menus;\n return defaultMenus;\n });\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const saveLoadData = computed(() => resolveProp(saveLoad) || {});\n const saveLoadMode = computed(() => saveLoadData().mode || \"load\");\n const saveLoadSlots = computed(() => saveLoadData().slots || []);\n const saveLoadCanSave = computed(() => saveLoadData().canSave !== false);\n\n const isMenuDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n if (entry.id === \"save\" && !saveLoadCanSave()) return true;\n return false;\n };\n\n const selectedMenu = signal(0);\n const view = signal(\"menu\");\n const saveOverlay = signal(false);\n\n const selectableIndexes = computed(() => {\n const entries = menuEntries();\n return entries\n .map((entry, index) => (isMenuDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n if (!available.includes(current)) {\n selectedMenu.set(available[0]);\n }\n });\n\n const moveMenu = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedMenu.set(available[nextIndex]);\n };\n\n function selectMenu(index) {\n return function() {\n selectedMenu.set(index);\n openMenu();\n }\n }\n\n const openMenu = () => {\n const entry = menuEntries()[selectedMenu()];\n if (!entry || isMenuDisabled(entry)) return;\n if (entry.id === \"save\") {\n saveOverlay.set(true);\n return;\n }\n if (entry.id === \"exit\") {\n view.set(\"exit\");\n return;\n }\n view.set(entry.id);\n };\n\n const goBack = () => {\n delay(() => {\n view.set(\"menu\");\n });\n };\n\n const closeSaveOverlay = () => {\n delay(() => {\n saveOverlay.set(false);\n view.set(\"menu\");\n });\n };\n\n const confirmExit = () => {\n if (onInteraction) onInteraction(\"exit\");\n };\n\n const hp = getEntityProp(currentPlayer, \"hp\");\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\");\n const sp = getEntityProp(currentPlayer, \"sp\");\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\");\n const level = getEntityProp(currentPlayer, \"level\");\n const exp = getEntityProp(currentPlayer, \"exp\");\n const gold = getEntityProp(currentPlayer, \"gold\");\n const expForNextlevel = computed(() => data().expForNextlevel || 0);\n const hpPercent = computed(() => {\n const max = hpMax() || 1;\n return `${Math.max(0, Math.min(100, (hp() / max) * 100))}%`;\n });\n const spPercent = computed(() => {\n const max = spMax() || 1;\n return `${Math.max(0, Math.min(100, (sp() / max) * 100))}%`;\n });\n const expPercent = computed(() => {\n const max = expForNextlevel() || 1;\n return `${Math.max(0, Math.min(100, (exp() / max) * 100))}%`;\n });\n\n const paramsList = computed(() => {\n return [\n { label: \"ATK\", value: data().playerStats.atk },\n { label: \"PDEF\", value: data().playerStats.pdef },\n { label: \"SDEF\", value: data().playerStats.sdef },\n { label: \"STR\", value: data().playerStats.str },\n { label: \"DEX\", value: data().playerStats.dex },\n { label: \"INT\", value: data().playerStats.int },\n { label: \"AGI\", value: data().playerStats.agi }\n ]\n }\n\n const menuControls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n openMenu();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") {\n goBack();\n return;\n }\n onFinish()\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n engine.gamePause.set(true);\n return () => {\n delay(() => {\n engine.stopProcessingInput = false;\n engine.gamePause.set(false);\n });\n }\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"main-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/main-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={menuControls}>\n <div class=\"rpg-ui-main-menu rpg-anim-fade-in\">\n <div class=\"rpg-ui-main-menu-layout\">\n <div class=\"rpg-ui-main-menu-left rpg-ui-menu rpg-ui-panel\">\n <div class=\"rpg-ui-menu-header\">Menu</div>\n <div class=\"rpg-ui-main-menu-list\">\n @for ((entry,index) of menuEntries()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isMenuDisabled(entry)}}\n data-selected={selectedMenu() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectMenu(index)}\n >{entry.label}</div>\n }\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-right\">\n @if (view() === \"menu\") {\n <div class=\"rpg-ui-panel\">\n <div class=\"rpg-ui-main-menu-section-title\">Status</div>\n <div class=\"rpg-ui-main-menu-status-card\">\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Level</div>\n <div class=\"rpg-ui-main-menu-status-value\">{level()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Gold</div>\n <div class=\"rpg-ui-main-menu-status-value\">{gold()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">HP {hp()}/{hpMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill hp\" style={{width: hpPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">SP {sp()}/{spMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill sp\" style={{width: spPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\" style={{gridColumn: \"span 2\"}}>\n <div class=\"rpg-ui-main-menu-status-label\">EXP {exp()}/{expForNextlevel()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill exp\" style={{width: expPercent}}></div>\n </div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-section-title\">Parameters</div>\n <div class=\"rpg-ui-main-menu-params\">\n @for ((param,index) of paramsList) {\n <div class=\"rpg-ui-main-menu-param\">\n <span>{param.label}</span>\n <span>{param.value}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (view() === \"items\") {\n <ItemsMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"skills\") {\n <SkillsMenu data={data} onBack={goBack} />\n }\n @if (view() === \"equip\") {\n <EquipMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"options\") {\n <OptionsMenu onBack={goBack} />\n }\n @if (view() === \"exit\") {\n <ExitMenu onConfirm={confirmExit} onBack={goBack} />\n }\n </div>\n </div>\n @if (saveOverlay) {\n <div class=\"rpg-ui-main-menu-overlay\">\n <div class=\"rpg-ui-main-menu-overlay-backdrop\"></div>\n <div class=\"rpg-ui-main-menu-overlay-content\">\n <SaveLoadComponent\n data={saveLoadData}\n onFinish={closeSaveOverlay}\n />\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import SaveLoadComponent from \"../save-load.ce\";\n import ItemsMenu from \"./items-menu.ce\";\n import SkillsMenu from \"./skills-menu.ce\";\n import EquipMenu from \"./equip-menu.ce\";\n import OptionsMenu from \"./options-menu.ce\";\n import ExitMenu from \"./exit-menu.ce\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer;\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { data, onFinish, onInteraction } = defineProps();\n const { menus, items, skills, equips, saveLoad } = data();\n\n const defaultMenus = [\n { id: \"items\", label: \"Items\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"equip\", label: \"Equip\" },\n { id: \"options\", label: \"Options\" },\n { id: \"save\", label: \"Save\" },\n { id: \"exit\", label: \"Exit\" }\n ];\n\n const menuEntries = computed(() => {\n if (menus && Array.isArray(menus) && menus.length) return menus;\n return defaultMenus;\n });\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const saveLoadData = computed(() => resolveProp(saveLoad) || {});\n const saveLoadMode = computed(() => saveLoadData().mode || \"load\");\n const saveLoadSlots = computed(() => saveLoadData().slots || []);\n const saveLoadCanSave = computed(() => saveLoadData().canSave !== false);\n\n const isMenuDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n if (entry.id === \"save\" && !saveLoadCanSave()) return true;\n return false;\n };\n\n const selectedMenu = signal(0);\n const view = signal(\"menu\");\n const saveOverlay = signal(false);\n\n const selectableIndexes = computed(() => {\n const entries = menuEntries();\n return entries\n .map((entry, index) => (isMenuDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n if (!available.includes(current)) {\n selectedMenu.set(available[0]);\n }\n });\n\n const moveMenu = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedMenu.set(available[nextIndex]);\n };\n\n function selectMenu(index) {\n return function() {\n selectedMenu.set(index);\n openMenu();\n }\n }\n\n const openMenu = () => {\n const entry = menuEntries()[selectedMenu()];\n if (!entry || isMenuDisabled(entry)) return;\n if (entry.id === \"save\") {\n saveOverlay.set(true);\n return;\n }\n if (entry.id === \"exit\") {\n view.set(\"exit\");\n return;\n }\n view.set(entry.id);\n };\n\n const goBack = () => {\n delay(() => {\n view.set(\"menu\");\n });\n };\n\n const closeSaveOverlay = () => {\n delay(() => {\n saveOverlay.set(false);\n view.set(\"menu\");\n });\n };\n\n const confirmExit = () => {\n if (onInteraction) onInteraction(\"exit\");\n };\n\n const hp = getEntityProp(currentPlayer, \"hp\");\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\");\n const sp = getEntityProp(currentPlayer, \"sp\");\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\");\n const level = getEntityProp(currentPlayer, \"level\");\n const exp = getEntityProp(currentPlayer, \"exp\");\n const gold = getEntityProp(currentPlayer, \"gold\");\n const expForNextlevel = computed(() => data().expForNextlevel || 0);\n const hpPercent = computed(() => {\n const max = hpMax() || 1;\n return `${Math.max(0, Math.min(100, (hp() / max) * 100))}%`;\n });\n const spPercent = computed(() => {\n const max = spMax() || 1;\n return `${Math.max(0, Math.min(100, (sp() / max) * 100))}%`;\n });\n const expPercent = computed(() => {\n const max = expForNextlevel() || 1;\n return `${Math.max(0, Math.min(100, (exp() / max) * 100))}%`;\n });\n\n const paramsList = computed(() => {\n return [\n { label: \"ATK\", value: data().playerStats.atk },\n { label: \"PDEF\", value: data().playerStats.pdef },\n { label: \"SDEF\", value: data().playerStats.sdef },\n { label: \"STR\", value: data().playerStats.str },\n { label: \"DEX\", value: data().playerStats.dex },\n { label: \"INT\", value: data().playerStats.int },\n { label: \"AGI\", value: data().playerStats.agi }\n ]\n }\n\n const menuControls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n openMenu();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") {\n goBack();\n return;\n }\n onFinish()\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n engine.gamePause.set(true);\n return () => {\n delay(() => {\n engine.stopProcessingInput = false;\n engine.gamePause.set(false);\n });\n }\n });\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"options-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/options-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\">Options</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\">Options</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n Configure your preferences here.\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\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onBack } = defineProps();\n\n const controls = signal({\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":";;;;AASM,SAAQ,UAAG,SAAA;CACJ,SAAA,QAAA;CACP,MAAG,cAAA,eAAA,QAAA;0BACK,OAAA,gBAAA,CAAA,aAAA;CAEd,MAAC,EAAM,WAAA,aAAA;CAcC,OADY,EAAA,cAAgB;EAAA,OAAA;EAAA,QAAA;EAAA,UAZvB,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;KAErB,IAAM,QACN,QAAA;;;GAGN,SAAM,EACF,SAAQ,MACX;GACJ,CACmC;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACxB;;AAGN,IAAM,iBAEN"}
1
+ {"version":3,"file":"options-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/options-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\">Options</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\">Options</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n Configure your preferences here.\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\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onBack } = defineProps();\n\n const controls = signal({\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":";;;;AASM,SAAQ,UAAG,SAAA;CACJ,SAAA,OAAA;CACP,MAAG,cAAA,eAAA,OAAA;0BACK,OAAA,eAAA,EAAA,aAAA;CAEd,MAAC,EAAM,WAAA,YAAA;CAcC,OADY,EAAA,cAAgB;EAAA,OAAA;EAAA,QAAA;EAAA,UAZvB,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;KAErB,IAAM,QACN,OAAA;IACN;;GAEA,SAAM,EACF,SAAQ,KACZ;EACJ,CACoC;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;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;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iCAAA;EAAA,aAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACxB;AACN;AAEA,IAAM,iBAEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"skills-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/skills-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\">Skills</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n @if (currentSkill) {\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">✨</div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentSkill()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentSkill()?.description || \"\"}</div>\n </div>\n </div>\n }\n </div>\n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <Navigation tabindex={selectedSkill} controls={controls}>\n @for ((skill,index) of skills) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n data-selected={selectedSkill() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectSkill(index)}\n >\n <span>{skill.name}</span>\n <span class=\"rpg-ui-menu-row-end\">SP {skill.spCost ?? 0}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSkill = signal(0);\n const { data, onBack } = defineProps();\n const skills = computed(() => data().skills);\n\n const nav = createTabindexNavigator(selectedSkill, { count: () => skills().length }, \"wrap\");\n const currentSkill = computed(() => skills()[selectedSkill()]);\n\n function selectSkill(index) {\n return function() {\n selectedSkill.set(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n 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,SAAQ;CACV,SAAM,QAAA;CACrB,MAAM,cAAW,eAAA,QAAA;CAEzB,MAAM,mBADU,OAAA,gBACC,CAAA,aAAA;CACjB,MAAM,gBAAgB,OAAM,EAAG;CAC/B,MAAM,EAAE,MAAM,WAAG,aAAqB;CACtC,MAAM,SAAS,eAAY,MAAM,CAAA,OAAU;CAC3C,MAAM,MAAM,wBAAa,eAAA,EAAA,aAAA,QAAA,CAAA,QAAA,EAAA,OAAA;CACzB,MAAM,eAAe,eAAc,QAAO,CAAA,eAAiB,EAAA;CAC3D,SAAS,YAAY,OAAO;EACxB,OAAO,WAAY;GACf,cAAc,IAAI,MAAE;;;CAG5B,MAAM,WAAW,OAAO;EACpB,IAAI;GACA,QAAQ;GACR,MAAM,iBAAc;GACpB,UAAS;GACT,UAAK;IACJ,IAAA,KAAA,GAAA;;;EAGR,MAAM;GACH,QAAS;GACT,MAAS,iBAAkB;GAC3B,UAAS;;IAEH,IAAM,KAAG,EAAA;;;EAGf,QAAM;GACN,MAAQ,iBAAiB;GACzB,UAAc;gBAEF,QAAA;;;EAGZ,SAAS,EACL,SAAO,MACV;EACJ,CAAC;QACE,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yDAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0CAAA;EAAA,EAAA,KAAA,oBAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA,EAAA,SAAA,OAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA,eAAA,cAAA,EAAA,KAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA,eAAA,cAAA,EAAA,eAAA,GAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kEAAA;EAAA,EAAA,EAAA,YAAA;EAAA,UAAA;EAAA;EAAA,EAAA,KAAA,SAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,iBAAA,eAAA,eAAA,KAAA,QAAA,SAAA,QAAA;GAAA,UAAA;GAAA,OAAA,YAAA,MAAA;GAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,aAAA,MAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uBAAA;EAAA,aAAA,QAAA,MAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAIE,IAAM,iBAEF"}
1
+ {"version":3,"file":"skills-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/skills-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\">Skills</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n @if (currentSkill) {\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">✨</div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentSkill()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentSkill()?.description || \"\"}</div>\n </div>\n </div>\n }\n </div>\n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <Navigation tabindex={selectedSkill} controls={controls}>\n @for ((skill,index) of skills) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n data-selected={selectedSkill() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectSkill(index)}\n >\n <span>{skill.name}</span>\n <span class=\"rpg-ui-menu-row-end\">SP {skill.spCost ?? 0}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSkill = signal(0);\n const { data, onBack } = defineProps();\n const skills = computed(() => data().skills);\n\n const nav = createTabindexNavigator(selectedSkill, { count: () => skills().length }, \"wrap\");\n const currentSkill = computed(() => skills()[selectedSkill()]);\n\n function selectSkill(index) {\n return function() {\n selectedSkill.set(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n 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,SAAQ;CACV,SAAM,OAAA;CACrB,MAAM,cAAW,eAAA,OAAA;CAEzB,MAAM,mBADU,OAAA,eACC,EAAA,aAAA;CACjB,MAAM,gBAAgB,OAAM,CAAE;CAC9B,MAAM,EAAE,MAAM,WAAG,YAAoB;CACrC,MAAM,SAAS,eAAY,KAAM,EAAA,MAAU;CAC3C,MAAM,MAAM,wBAAa,eAAA,EAAA,aAAA,OAAA,EAAA,OAAA,GAAA,MAAA;CACzB,MAAM,eAAe,eAAc,OAAO,EAAA,cAAiB,EAAA;CAC3D,SAAS,YAAY,OAAO;EACxB,OAAO,WAAY;GACf,cAAc,IAAI,KAAE;EACxB;CACJ;CACA,MAAM,WAAW,OAAO;EACpB,IAAI;GACA,QAAQ;GACR,MAAM,iBAAc;GACpB,UAAS;GACT,UAAK;IACJ,IAAA,KAAA,EAAA;GACP;;EAED,MAAM;GACH,QAAS;GACT,MAAS,iBAAkB;GAC3B,UAAS;;IAEH,IAAM,KAAG,CAAA;GACf;;EAEA,QAAM;GACN,MAAQ,iBAAiB;GACzB,UAAc;gBAEF,OAAA;GACZ;;EAEA,SAAS,EACL,SAAO,KACX;CACJ,CAAC;QACG,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;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;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,wDAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yCAAA;CAAA,GAAA,KAAA,oBAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,aAAA;CAAA,CAAA,GAAA,EAAA,YAAA,EAAA,SAAA,MAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA,eAAA,aAAA,GAAA,IAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iCAAA;EAAA,aAAA,eAAA,aAAA,GAAA,eAAA,EAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iEAAA;CAAA,GAAA,EAAA,YAAA;EAAA,UAAA;EAAA;CAAA,GAAA,KAAA,SAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,iBAAA,eAAA,cAAA,MAAA,QAAA,SAAA,OAAA;GAAA,UAAA;GAAA,OAAA,YAAA,KAAA;EAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,aAAA,MAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,sBAAA;EAAA,aAAA,QAAA,MAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA;AAEE,IAAM,iBAEF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/gui/mobile/index.ts"],"sourcesContent":["import { inject } from \"../../../core/inject\";\nimport { RpgClientEngine } from \"../../../RpgClientEngine\";\nimport MobileGui from \"./mobile.ce\";\nimport { signal } from \"canvasengine\";\n\nfunction isMobile() {\n return /Android|iPhone|iPad|iPod|Windows Phone|webOS|BlackBerry/i.test(navigator.userAgent);\n }\n\nexport const withMobile = () => (\n {\n gui: [\n {\n id: 'mobile-gui',\n component: MobileGui,\n autoDisplay: true,\n dependencies: () => {\n const engine = inject(RpgClientEngine);\n return [signal(isMobile() ||undefined), engine.controlsReady]\n }\n }\n ]\n }\n)"],"mappings":";;;;;AAKA,SAAS,WAAW;CAChB,OAAO,2DAA2D,KAAK,UAAU,UAAU;;AAG/F,IAAa,oBACT,EACI,KAAK,CACD;CACI,IAAI;CACJ,WAAW;CACX,aAAa;CACb,oBAAoB;EAChB,MAAM,SAAS,OAAO,gBAAgB;EACtC,OAAO,CAAC,OAAO,UAAU,IAAG,KAAA,EAAU,EAAE,OAAO,cAAc;;CAEpE,CACJ,EACJ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/gui/mobile/index.ts"],"sourcesContent":["import { inject } from \"../../../core/inject\";\nimport { RpgClientEngine } from \"../../../RpgClientEngine\";\nimport MobileGui from \"./mobile.ce\";\nimport { signal } from \"canvasengine\";\n\nfunction isMobile() {\n return /Android|iPhone|iPad|iPod|Windows Phone|webOS|BlackBerry/i.test(navigator.userAgent);\n }\n\nexport const withMobile = () => (\n {\n gui: [\n {\n id: 'mobile-gui',\n component: MobileGui,\n autoDisplay: true,\n dependencies: () => {\n const engine = inject(RpgClientEngine);\n return [signal(isMobile() ||undefined), engine.controlsReady]\n }\n }\n ]\n }\n)"],"mappings":";;;;;AAKA,SAAS,WAAW;CAChB,OAAO,2DAA2D,KAAK,UAAU,SAAS;AAC5F;AAEF,IAAa,oBACT,EACI,KAAK,CACD;CACI,IAAI;CACJ,WAAW;CACX,aAAa;CACb,oBAAoB;EAChB,MAAM,SAAS,OAAO,eAAe;EACrC,OAAO,CAAC,OAAO,SAAS,KAAI,KAAA,CAAS,GAAG,OAAO,aAAa;CAChE;AACJ,CACJ,EACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"mobile.ce.js","names":[],"sources":["../../../../src/components/gui/mobile/mobile.ce"],"sourcesContent":["<Container justifyContent=\"space-between\" alignItems=\"flex-end\" width=\"100%\" height=\"100%\">\n <!-- Gamepad buttons A and B (left side) -->\n <Container justifyContent=\"flex-start\" alignItems=\"flex-end\" gap={20}>\n <Container display=\"flex\" direction=\"column\" gap={20} margin={50}>\n <!-- Button B (top) -->\n \n <!-- Button A (bottom) -->\n <Button \n text=\"A\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"action\"\n style={{\n backgroundColor: {\n normal: \"#2ecc71\",\n hover: \"#27ae60\",\n pressed: \"#229954\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n <Button \n text=\"B\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"back\"\n style={{\n backgroundColor: {\n normal: \"#e74c3c\",\n hover: \"#c0392b\",\n pressed: \"#a93226\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n </Container>\n </Container>\n \n <Container margin={100} alignItems=\"flex-end\">\n <Container>\n <Joystick \n controls={controlsInstance}\n outerColor=\"#34495e\"\n innerColor=\"#3498db\"\n />\n </Container>\n </Container>\n</Container>\n\n<script>\n import { signal, mount } from 'canvasengine'\n import { Button } from 'canvasengine'\n import { inject } from '../../../core/inject'\n import { RpgClientEngine } from '../../../RpgClientEngine'\n import { Direction } from '@rpgjs/common'\n\n\n const controlsInstance = signal(null)\n\n mount((element) => {\n const control = inject('KeyboardControls')\n controlsInstance.set(control)\n })\n</script>"],"mappings":";;;AASM,SAAS,UAAQ,SAAM;CACN,SAAE,QAAA;CACC,eAAA,QAAA;CAClB,MAAM,mBAAY,OAAA,KAAgB;CAC1C,OAAO,YAAS;EACZ,MAAM,UAAM,OAAO,mBAAA;EACnB,iBAAgB,IAAA,QAAA;GAClB;CAEM,OADY,EAAE,WAAW;EAAA,gBAAO;EAAA,YAAA;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,CAAA,EAAA,WAAA;EAAA,gBAAA;EAAA,YAAA;EAAA,KAAA;EAAA,EAAA,EAAA,WAAA;EAAA,SAAA;EAAA,WAAA;EAAA,KAAA;EAAA,QAAA;EAAA,EAAA,CAAA,EAAA,QAAA;EAAA,MAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,OAAA;GAAA,iBAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,UAAA;IAAA;GAAA,MAAA;IAAA,UAAA;IAAA,YAAA;IAAA,OAAA;IAAA;GAAA;EAAA,CAAA,EAAA,EAAA,QAAA;EAAA,MAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,OAAA;GAAA,iBAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,UAAA;IAAA;GAAA,MAAA;IAAA,UAAA;IAAA,YAAA;IAAA,OAAA;IAAA;GAAA;EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,WAAA;EAAA,QAAA;EAAA,YAAA;EAAA,EAAA,EAAA,WAAA,MAAA,EAAA,UAAA;EAAA,UAAA;EAAA,YAAA;EAAA,YAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CACpB;;AAGd,IAAM,iBAEF"}
1
+ {"version":3,"file":"mobile.ce.js","names":[],"sources":["../../../../src/components/gui/mobile/mobile.ce"],"sourcesContent":["<Container justifyContent=\"space-between\" alignItems=\"flex-end\" width=\"100%\" height=\"100%\">\n <!-- Gamepad buttons A and B (left side) -->\n <Container justifyContent=\"flex-start\" alignItems=\"flex-end\" gap={20}>\n <Container display=\"flex\" direction=\"column\" gap={20} margin={50}>\n <!-- Button B (top) -->\n \n <!-- Button A (bottom) -->\n <Button \n text=\"A\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"action\"\n style={{\n backgroundColor: {\n normal: \"#2ecc71\",\n hover: \"#27ae60\",\n pressed: \"#229954\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n <Button \n text=\"B\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"back\"\n style={{\n backgroundColor: {\n normal: \"#e74c3c\",\n hover: \"#c0392b\",\n pressed: \"#a93226\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n </Container>\n </Container>\n \n <Container margin={100} alignItems=\"flex-end\">\n <Container>\n <Joystick \n controls={controlsInstance}\n outerColor=\"#34495e\"\n innerColor=\"#3498db\"\n />\n </Container>\n </Container>\n</Container>\n\n<script>\n import { signal, mount } from 'canvasengine'\n import { Button } from 'canvasengine'\n import { inject } from '../../../core/inject'\n import { RpgClientEngine } from '../../../RpgClientEngine'\n import { Direction } from '@rpgjs/common'\n\n\n const controlsInstance = signal(null)\n\n mount((element) => {\n const control = inject('KeyboardControls')\n controlsInstance.set(control)\n })\n</script>"],"mappings":";;;AASM,SAAS,UAAQ,SAAM;CACN,SAAE,OAAA;CACC,eAAA,OAAA;CAClB,MAAM,mBAAY,OAAA,IAAgB;CAC1C,OAAO,YAAS;EACZ,MAAM,UAAM,OAAO,kBAAA;EACnB,iBAAgB,IAAA,OAAA;CACpB,CAAC;CAEO,OADY,EAAE,WAAW;EAAA,gBAAO;EAAA,YAAA;EAAA,OAAA;EAAA,QAAA;CAAA,GAAA,CAAA,EAAA,WAAA;EAAA,gBAAA;EAAA,YAAA;EAAA,KAAA;CAAA,GAAA,EAAA,WAAA;EAAA,SAAA;EAAA,WAAA;EAAA,KAAA;EAAA,QAAA;CAAA,GAAA,CAAA,EAAA,QAAA;EAAA,MAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,OAAA;GAAA,iBAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,UAAA;GAAA;GAAA,MAAA;IAAA,UAAA;IAAA,YAAA;IAAA,OAAA;GAAA;EAAA;CAAA,CAAA,GAAA,EAAA,QAAA;EAAA,MAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,OAAA;GAAA,iBAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,UAAA;GAAA;GAAA,MAAA;IAAA,UAAA;IAAA,YAAA;IAAA,OAAA;GAAA;EAAA;CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,WAAA;EAAA,QAAA;EAAA,YAAA;CAAA,GAAA,EAAA,WAAA,MAAA,EAAA,UAAA;EAAA,UAAA;EAAA,YAAA;EAAA,YAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CACrB;AACb;AAEA,IAAM,iBAEF"}
@@ -1 +1 @@
1
- {"version":3,"file":"notification.ce.js","names":[],"sources":["../../../../src/components/gui/notification/notification.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" zIndex={100} class=\"notification\">\n <div class=\"rpg-ui-notifications\">\n @for ((notif,index) of notifications) {\n <div\n class=\"rpg-ui-notification\"\n data-type={notif.type || \"info\"}\n style={notificationStyle(notif)}\n >\n @if (notif.icon) {\n <div class=\"rpg-ui-notification-icon\">\n <DOMSprite sheet={iconSheet(notif.icon)} />\n </div>\n }\n <div class=\"rpg-ui-notification-message\">{notif.message}</div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<style>\n .notification {\n pointer-events: none !important;\n }\n</style>\n\n<script>\n import { effect, computed } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const notifications = computed(() => engine.notificationManager.stack());\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n });\n\n effect(() => {\n const list = notifications();\n const rowHeight = 68;\n list.forEach((notif, index) => {\n notif.layoutY.set(index * rowHeight);\n });\n });\n\n const notificationStyle = (notif) => ({\n opacity: notif.opacity(),\n transform: `translateY(${notif.layoutY() + notif.offset()}px)`\n });\n</script>\n"],"mappings":";;;;AAUA,IAAI,OAAO,aAAa,aAAW;CACjC,IAAI,eAAe,SAAI,eAAA,2GAAA;CACvB,IAAI,CAAC,cAAS;EACZ,eAAa,SAAW,cAAO,QAAa;EAC5C,aAAa,KAAA;EACb,SAAI,KAAA,YAAA,aAAA;;CAEN,aAAY,cAAA;;AAGT,SAAA,UAAa,SAAA;CACK,SAAO,QAAS;CACnC,eAAA,QAAA;CACG,MAAA,SAAA,OAAA,gBAAA;;CAEP,MAAC,aAAM,YAAA;EACH,YAAS,OAAQ,eAAiB,OAAA;EAClC,SAAS;EACZ;;EAEG,MAAM,OAAO,eAAS;EACtB,MAAM,YAAA;;GAEN,MAAM,QAAY,IAAC,QAAW,UAAC;IAC7B;GACJ;CACF,MAAM,qBAAA,WAAA;;EAEF,WAAW,cAAE,MAAA,SAAA,GAAA,MAAA,QAAA,CAAA;EAChB;CAEO,OADM,EAAA,cAAc;EAAA,OAAA;EAAA,QAAA;EAAA,QAAA;EAAA,OAAA,EAAA,OAAA,gBAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,wBAAA;EAAA,EAAA,KAAA,gBAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,aAAA,eAAA,MAAA,QAAA,OAAA;GAAA,OAAA,eAAA,kBAAA,MAAA,CAAA;GAAA;EAAA,EAAA,CAAA,KAAA,MAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,EAAA,EAAA,WAAA,EAAA,OAAA,eAAA,UAAA,MAAA,KAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA,MAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACR;;AAGd,IAAA,iBAEI"}
1
+ {"version":3,"file":"notification.ce.js","names":[],"sources":["../../../../src/components/gui/notification/notification.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" zIndex={100} class=\"notification\">\n <div class=\"rpg-ui-notifications\">\n @for ((notif,index) of notifications) {\n <div\n class=\"rpg-ui-notification\"\n data-type={notif.type || \"info\"}\n style={notificationStyle(notif)}\n >\n @if (notif.icon) {\n <div class=\"rpg-ui-notification-icon\">\n <DOMSprite sheet={iconSheet(notif.icon)} />\n </div>\n }\n <div class=\"rpg-ui-notification-message\">{notif.message}</div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<style>\n .notification {\n pointer-events: none !important;\n }\n</style>\n\n<script>\n import { effect, computed } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const notifications = computed(() => engine.notificationManager.stack());\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n });\n\n effect(() => {\n const list = notifications();\n const rowHeight = 68;\n list.forEach((notif, index) => {\n notif.layoutY.set(index * rowHeight);\n });\n });\n\n const notificationStyle = (notif) => ({\n opacity: notif.opacity(),\n transform: `translateY(${notif.layoutY() + notif.offset()}px)`\n });\n</script>\n"],"mappings":";;;;AAUA,IAAI,OAAO,aAAa,aAAW;CACjC,IAAI,eAAe,SAAI,eAAA,0GAAA;CACvB,IAAI,CAAC,cAAS;EACZ,eAAa,SAAW,cAAO,OAAa;EAC5C,aAAa,KAAA;EACb,SAAI,KAAA,YAAA,YAAA;CACN;CACA,aAAY,cAAA;;AAGT,SAAA,UAAa,SAAA;CACK,SAAO,OAAS;CACnC,eAAA,OAAA;CACG,MAAA,SAAA,OAAA,eAAA;;CAEP,MAAC,aAAM,YAAA;EACH,YAAS,OAAQ,eAAiB,MAAA;EAClC,SAAS;CACb;;EAEI,MAAM,OAAO,cAAS;EACtB,MAAM,YAAA;;GAEN,MAAM,QAAY,IAAC,QAAW,SAAC;EAC/B,CAAC;CACL,CAAC;CACD,MAAM,qBAAA,WAAA;;EAEF,WAAW,cAAE,MAAA,QAAA,IAAA,MAAA,OAAA,EAAA;CACjB;CAEQ,OADM,EAAA,cAAc;EAAA,OAAA;EAAA,QAAA;EAAA,QAAA;EAAA,OAAA,EAAA,OAAA,eAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uBAAA;CAAA,GAAA,KAAA,gBAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,aAAA,eAAA,MAAA,QAAA,MAAA;GAAA,OAAA,eAAA,kBAAA,KAAA,CAAA;EAAA;CAAA,GAAA,CAAA,KAAA,MAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;CAAA,GAAA,EAAA,WAAA,EAAA,OAAA,eAAA,UAAA,MAAA,IAAA,CAAA,EAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,aAAA,MAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACf;AACP;AAEA,IAAA,iBAEI"}
@@ -1 +1 @@
1
- {"version":3,"file":"save-load.ce.js","names":[],"sources":["../../../src/components/gui/save-load.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-save-load rpg-anim-fade-in\">\n <div class=\"rpg-ui-save-load-header\">\n <div class=\"rpg-ui-save-load-title\">{title()}</div>\n <div class=\"rpg-ui-save-load-subtitle\">{subtitle()}</div>\n </div>\n <Navigation tabindex={selectedSlot} controls={controls}>\n <div class=\"rpg-ui-save-load-list\">\n @for ((item,displayIndex) of displaySlots) {\n <div\n class=\"rpg-ui-save-load-slot\"\n class={{active: selectedSlot() === displayIndex}}\n tabindex={displayIndex}\n data-slot-index={displayIndex}\n click={selectSlot(displayIndex)}\n >\n <div class=\"rpg-ui-save-load-slot-index\">{item.label}</div>\n @if (item.slot) {\n <div class=\"rpg-ui-save-load-slot-meta\">\n <div class=\"rpg-ui-save-load-slot-line\">Level: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Exp: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Map: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Date: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">Empty Slot</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? \"Save Game\" : \"Load Game\");\n const subtitle = computed(() => data().mode === \"save\"\n ? \"Choose a slot to overwrite or create.\"\n : \"Select a slot to load your progress.\"\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: `Slot ${index + 1}`,\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || \"Auto Save\",\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":";;;;;;;AAaM,SAAS,UAAS,SAAU;CACX,SAAQ,QAAA;CACvB,MAAM,cAAM,eAAA,QAAA;CACZ,MAAM,SAAS,OAAM,gBAAc;CAC3C,MAAM,aAAa,OAAM,kBAAe;CACxC,MAAM,MAAM,OAAO,OAAO;CAC1B,MAAM,mBAAmB,OAAO,aAAY;CAC5C,MAAM,eAAe,OAAO,EAAE;CAC9B,MAAM,gBAAgB;CACtB,MAAM,qBAAqB,MAAM,KAAI,EAAA,QAAW,eAAa,QAAU,KAAK;CAC5E,MAAM,aAAa,OAAO,cAAO,CAAA;CACjC,MAAM,EAAE,MAAM,aAAU,aAAA;CACxB,MAAM,QAAQ,eAAe,MAAC,CAAA,SAAA,SAAA,cAAA,YAAA;CAC9B,MAAM,WAAW,eAAe,MAAM,CAAC,SAAQ,SACzC,0CACA,uCAAmB;CACzB,MAAM,aAAU,eAAA,YAAA,CAAA;CAChB,MAAM,eAAW,eAAA;EACb,MAAM,QAAA,YAAU;EAChB,MAAK,QAAA,MAAA,KAAA,MAAA,WAAA;GACP,MAAY;;GAEP,WAAA;GACH,OAAS,QAAQ,QAAU;GAC3B,UAAS;GACT,EAAA;EACA,IAAA,CAAA,MAAS,CAAA,cACT,OAAS;EACT,MAAM,QAAG,OAAS,MAAS,CAAC,kBAAU,WAAA,MAAA,CAAA,gBAAA;;EAEtC,MAAM,WAAS,MAAO,CAAA,SAAA;EACtB,OAAM,CACN;GACM,MAAA;;GAEA,WAAa;GACb,OAAA,MAAe,CAAC,iBAAC;GACjB;GACD,EAAA,GAAA,MAEL;;CAEJ,MAAI,MAAM,wBAAuB,cAAiB,EAAA,aAAc,cAAc,CAAA,QAAM,EAAA,OAAA;CACpF,MAAI,aAAe,SAAE;EACjB,IAAI,KAAG,UACH,OAAG;EACP,IAAC,MAAA,CAAA,SAAA,UAAA,CAAA,KAAA,MAAA,OAAA;EAED,OAAM;;CAEV,MAAM,sBAAgB,UAAY;EAC9B,IAAI,CAAA,OACA,OAAI;EACR,IAAI,OAAI,UAAI,UACR,IAAI;GACA,OAAO,KAAK,MAAG,MAAS;UAEzB;GACC,OAAO;;EAGf,OAAI;;CAER,MAAM,kBAAM,SAAA;EACR,IAAI,MAAM,QAAQ,KAAK,EAAC;GACpB,MAAM,SAAQ,KAAA,IAAQ,KAAA,QAAA,cAAA;GACtB,OAAO,MAAC,KAAU,EAAC,QAAK,GAAA,GAAA,UAAA,mBAAA,KAAA,OAAA,CAAA;;EAE5B,IAAI,CAAC,QAAO,OAAA,SAAA,UACR,OAAK,cAAA;EAET,MAAK,OAAA,OAAA,KAAA,KAAA,CAAA,QAAA,QAAA,QAAA,KAAA,IAAA,CAAA;EACL,MAAE,UAAA,KAAA,KAAA,QAAA,OAAA,IAAA,CAAA,CAAA,QAAA,UAAA,SAAA,EAAA;EACF,MAAM,WAAM,QAAA,SAAA,KAAwB,IAAA,GAAA,QAAgB,GAAK;;EAEzD,MAAM,QAAA,MAAa,KAAM,EAAE,QAAC,QAAA,KAAA;EAC5B,KAAI,SAAS,QAAS;GAClB,MAAI,QAAO,OAAU,IAAI;GACzB,IAAA,QAAW,KAAA,SAAA,QACd;;IAED;EACA,OAAO;;CAOX,MAAM,eAAE,YAAA;EACJ,IAAI;GACH,MAAA,OAAA,MAAA,WAAA,WAAA;;WAGM,KAAC;GACJ,WAAU,IAAA,cAAkB,CAAA;;;CAGpC,MAAM,gBAAe,OAAO,iBAAkB;EAE1C,MAAI,OADI,cACJ,CAAA;EACJ,IAAI,CAAA,MACA;EACJ,IAAI,CAAA,UAAM,KAAU,EAChB;EACJ,MAAI,SAAW,MAAG,CAAA,SAAa,SAAS,SAAO;EAC/C,IAAI,WAAK,QAAc;GACnB,MAAI,WAAa,SAAQ,KAAI,UAAA;GAC7B,MAAM,cAAc;;EAExB,IAAI,WAAE,QACF,MAAM,WAAM,SAAA,KAAA,UAAA;;GAGhB,IAAM,UACE,UAAM;GACV,IAAA,KAAS,YAAS,KAAO;GAC5B,IAAA,KAAA,YAAA,YAAA;;;CAGL,SAAQ,WAAI,OAAA;EACR,OAAO,WAAY;GACf,aAAI,IAAW,MAAI;GACnB,cAAc,MAAA;;;CAGtB,MAAK,WAAA,OAAA;;GAED,QAAM;GACF,MAAM,iBAAO;GACb,UAAU;GACV,UAAU;IACN,IAAC,KAAA,GAAU;;GAElB;EACD,MAAM;GACF,QAAI;GACJ,MAAA,iBAAA;GACA,UAAU;GACV,UAAU;IACV,IAAA,KAAA,EAAA;;GAEH;EACD,QAAQ;GACJ,MAAI,iBAAS;GACb,UAAM;;;;EAIV,QAAQ;GACJ,MAAM,iBAAY;GAClB,UAAI;IACA,IAAA,UACJ,UAAA;IACJ,IAAA,KAAA,YAAA,KAAA;;GAEA;EACA,SAAQ,EACJ,SAAI,MACP;EACJ,CAAC;CACF,OAAO,YAAY;EACf,cAAY;GACd;CAEM,OADC,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,aAAA,eAAA,OAAA,CAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,aAAA,eAAA,UAAA,CAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,UAAA;EAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;EAAA,EAAA,KAAA,eAAA,MAAA,iBAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,yBAAA,gBAAA,EAAA,QAAA,cAAA,KAAA,cAAA,EAAA,CAAA;GAAA,UAAA;GAAA,mBAAA;GAAA,OAAA,WAAA,aAAA;GAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA,KAAA;EAAA,CAAA,EAAA,KAAA,KAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,EAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,YAAA,KAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,UAAA,KAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,UAAA,KAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,WAAA,KAAA,KAAA;GAAA,CAAA;EAAA,CAAA,QAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACK;;AAGR,IAAM,iBAEF"}
1
+ {"version":3,"file":"save-load.ce.js","names":[],"sources":["../../../src/components/gui/save-load.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-save-load rpg-anim-fade-in\">\n <div class=\"rpg-ui-save-load-header\">\n <div class=\"rpg-ui-save-load-title\">{title()}</div>\n <div class=\"rpg-ui-save-load-subtitle\">{subtitle()}</div>\n </div>\n <Navigation tabindex={selectedSlot} controls={controls}>\n <div class=\"rpg-ui-save-load-list\">\n @for ((item,displayIndex) of displaySlots) {\n <div\n class=\"rpg-ui-save-load-slot\"\n class={{active: selectedSlot() === displayIndex}}\n tabindex={displayIndex}\n data-slot-index={displayIndex}\n click={selectSlot(displayIndex)}\n >\n <div class=\"rpg-ui-save-load-slot-index\">{item.label}</div>\n @if (item.slot) {\n <div class=\"rpg-ui-save-load-slot-meta\">\n <div class=\"rpg-ui-save-load-slot-line\">Level: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Exp: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Map: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Date: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">Empty Slot</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? \"Save Game\" : \"Load Game\");\n const subtitle = computed(() => data().mode === \"save\"\n ? \"Choose a slot to overwrite or create.\"\n : \"Select a slot to load your progress.\"\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: `Slot ${index + 1}`,\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || \"Auto Save\",\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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"}
@@ -478,7 +478,7 @@ function component($$props) {
478
478
  textContent: computed(() => "Qty: x" + currentItem()?.quantity)
479
479
  }))
480
480
  ]),
481
- h(DOMElement, { element: "div" }, cond(currentItem()?.equipped, () => h(DOMElement, {
481
+ h(DOMElement, { element: "div" }, cond(computed(() => currentItem()?.equipped), () => h(DOMElement, {
482
482
  element: "div",
483
483
  attrs: { class: "rpg-shop-equipped" },
484
484
  textContent: "Already equipped"