@rpgjs/client 5.0.0-beta.12 → 5.0.0-beta.13

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 (88) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/Game/Object.d.ts +2 -0
  3. package/dist/Game/Object.js +20 -6
  4. package/dist/Game/Object.js.map +1 -1
  5. package/dist/Gui/Gui.d.ts +3 -2
  6. package/dist/Gui/Gui.js +18 -6
  7. package/dist/Gui/Gui.js.map +1 -1
  8. package/dist/RpgClient.d.ts +21 -1
  9. package/dist/RpgClientEngine.d.ts +20 -2
  10. package/dist/RpgClientEngine.js +180 -17
  11. package/dist/RpgClientEngine.js.map +1 -1
  12. package/dist/components/character.ce.js +82 -7
  13. package/dist/components/character.ce.js.map +1 -1
  14. package/dist/components/gui/dialogbox/index.ce.js +27 -12
  15. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  16. package/dist/components/gui/gameover.ce.js +4 -3
  17. package/dist/components/gui/gameover.ce.js.map +1 -1
  18. package/dist/components/gui/menu/equip-menu.ce.js +9 -8
  19. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  20. package/dist/components/gui/menu/exit-menu.ce.js +7 -5
  21. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  22. package/dist/components/gui/menu/items-menu.ce.js +8 -7
  23. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  24. package/dist/components/gui/menu/main-menu.ce.js +12 -11
  25. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  26. package/dist/components/gui/menu/options-menu.ce.js +7 -5
  27. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  28. package/dist/components/gui/menu/skills-menu.ce.js +4 -2
  29. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  30. package/dist/components/gui/notification/notification.ce.js +4 -1
  31. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  32. package/dist/components/gui/save-load.ce.js +10 -9
  33. package/dist/components/gui/save-load.ce.js.map +1 -1
  34. package/dist/components/gui/shop/shop.ce.js +17 -16
  35. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  36. package/dist/components/gui/title-screen.ce.js +4 -3
  37. package/dist/components/gui/title-screen.ce.js.map +1 -1
  38. package/dist/components/interaction-components.ce.js +20 -0
  39. package/dist/components/interaction-components.ce.js.map +1 -0
  40. package/dist/components/scenes/canvas.ce.js +12 -7
  41. package/dist/components/scenes/canvas.ce.js.map +1 -1
  42. package/dist/components/scenes/draw-map.ce.js +18 -13
  43. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  44. package/dist/i18n.d.ts +55 -0
  45. package/dist/i18n.js +60 -0
  46. package/dist/i18n.js.map +1 -0
  47. package/dist/i18n.spec.d.ts +1 -0
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +3 -1
  50. package/dist/module.js +23 -3
  51. package/dist/module.js.map +1 -1
  52. package/dist/services/interactions.d.ts +159 -0
  53. package/dist/services/interactions.js +460 -0
  54. package/dist/services/interactions.js.map +1 -0
  55. package/dist/services/interactions.spec.d.ts +1 -0
  56. package/dist/services/keyboardControls.d.ts +1 -0
  57. package/dist/services/keyboardControls.js +1 -0
  58. package/dist/services/keyboardControls.js.map +1 -1
  59. package/package.json +4 -4
  60. package/src/Game/Object.spec.ts +14 -1
  61. package/src/Game/Object.ts +34 -10
  62. package/src/Gui/Gui.spec.ts +67 -0
  63. package/src/Gui/Gui.ts +24 -7
  64. package/src/RpgClient.ts +28 -1
  65. package/src/RpgClientEngine.ts +248 -29
  66. package/src/components/character.ce +90 -7
  67. package/src/components/gui/dialogbox/index.ce +35 -14
  68. package/src/components/gui/gameover.ce +4 -3
  69. package/src/components/gui/menu/equip-menu.ce +9 -8
  70. package/src/components/gui/menu/exit-menu.ce +4 -3
  71. package/src/components/gui/menu/items-menu.ce +8 -7
  72. package/src/components/gui/menu/main-menu.ce +12 -11
  73. package/src/components/gui/menu/options-menu.ce +4 -3
  74. package/src/components/gui/menu/skills-menu.ce +2 -1
  75. package/src/components/gui/notification/notification.ce +7 -1
  76. package/src/components/gui/save-load.ce +11 -10
  77. package/src/components/gui/shop/shop.ce +17 -16
  78. package/src/components/gui/title-screen.ce +4 -3
  79. package/src/components/interaction-components.ce +23 -0
  80. package/src/components/scenes/canvas.ce +12 -7
  81. package/src/components/scenes/draw-map.ce +16 -5
  82. package/src/i18n.spec.ts +39 -0
  83. package/src/i18n.ts +59 -0
  84. package/src/index.ts +2 -0
  85. package/src/module.ts +32 -10
  86. package/src/services/interactions.spec.ts +175 -0
  87. package/src/services/interactions.ts +722 -0
  88. package/src/services/keyboardControls.ts +2 -1
@@ -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 import { getKeyboardControlBind } from \"../../../services/actionInput\";\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: getKeyboardControlBind(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\">{t(\"rpg.menu.title\")}</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\">{t(\"rpg.menu.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\">{t(\"rpg.menu.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\">{t(\"rpg.menu.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\">{t(\"rpg.menu.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 import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\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: t(\"rpg.menu.items\") },\n { id: \"skills\", label: t(\"rpg.menu.skills\") },\n { id: \"equip\", label: t(\"rpg.menu.equip\") },\n { id: \"options\", label: t(\"rpg.menu.options\") },\n { id: \"save\", label: t(\"rpg.menu.save\") },\n { id: \"exit\", label: t(\"rpg.menu.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: getKeyboardControlBind(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,11 +1,13 @@
1
1
  import { inject } from "../../../core/inject.js";
2
2
  import { RpgClientEngine } from "../../../RpgClientEngine.js";
3
- import { DOMContainer, DOMElement, h, signal, useDefineProps, useProps } from "canvasengine";
3
+ import { DOMContainer, DOMElement, computed, h, signal, useDefineProps, useProps } from "canvasengine";
4
4
  //#region src/components/gui/menu/options-menu.ce
5
5
  function component($$props) {
6
6
  useProps($$props);
7
7
  const defineProps = useDefineProps($$props);
8
- const keyboardControls = inject(RpgClientEngine).globalConfig.keyboardControls;
8
+ const engine = inject(RpgClientEngine);
9
+ const { t } = engine.i18n();
10
+ const keyboardControls = engine.globalConfig.keyboardControls;
9
11
  const { onBack } = defineProps();
10
12
  return h(DOMContainer, {
11
13
  width: "100%",
@@ -25,7 +27,7 @@ function component($$props) {
25
27
  }, [h(DOMElement, {
26
28
  element: "div",
27
29
  attrs: { class: "rpg-ui-menu-panel-header" },
28
- textContent: "Options"
30
+ textContent: computed(() => t("rpg.menu.options"))
29
31
  }), h(DOMElement, {
30
32
  element: "div",
31
33
  attrs: { class: "rpg-ui-menu-panel-body" }
@@ -35,11 +37,11 @@ function component($$props) {
35
37
  }, [h(DOMElement, {
36
38
  element: "div",
37
39
  attrs: { class: "rpg-ui-menu-panel-details-title" },
38
- textContent: "Options"
40
+ textContent: computed(() => t("rpg.menu.options"))
39
41
  }), h(DOMElement, {
40
42
  element: "div",
41
43
  attrs: { class: "rpg-ui-menu-panel-details-desc" },
42
- textContent: "Configure your preferences here.\n "
44
+ textContent: computed(() => t("rpg.menu.options-help"))
43
45
  })]))]));
44
46
  }
45
47
  var __ce_component = component;
@@ -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,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,iBAAS"}
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\">{t(\"rpg.menu.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\">{t(\"rpg.menu.options\")}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {t(\"rpg.menu.options-help\")}\n </div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\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;CACP,MAAY,SAAA,OAAA,eAAA;;CAEd,MAAC,mBAAM,OAAA,aAAA;CACP,MAAI,EAAA,WAAe,YAAS;CAcpB,OADY,EAAA,cAAgB;EAAA,OAAA;EAAA,QAAA;EAAA,UAZvB,OAAS;GAClB,QAAQ;;IAER,UAAc;KACN,IAAI,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,eAAA,EAAA,kBAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA,eAAA,EAAA,kBAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iCAAA;EAAA,aAAA,eAAA,EAAA,uBAAA,CAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACxB;AACN;AAEA,IAAM,iBAAS"}
@@ -5,7 +5,9 @@ import { DOMContainer, DOMElement, Navigation, computed, cond, createTabindexNav
5
5
  function component($$props) {
6
6
  useProps($$props);
7
7
  const defineProps = useDefineProps($$props);
8
- const keyboardControls = inject(RpgClientEngine).globalConfig.keyboardControls;
8
+ const engine = inject(RpgClientEngine);
9
+ const { t } = engine.i18n();
10
+ const keyboardControls = engine.globalConfig.keyboardControls;
9
11
  const selectedSkill = signal(0);
10
12
  const { data, onBack } = defineProps();
11
13
  const skills = computed(() => data().skills);
@@ -50,7 +52,7 @@ function component($$props) {
50
52
  }, [h(DOMElement, {
51
53
  element: "div",
52
54
  attrs: { class: "rpg-ui-menu-panel-header" },
53
- textContent: "Skills"
55
+ textContent: computed(() => t("rpg.menu.skills"))
54
56
  }), h(DOMElement, {
55
57
  element: "div",
56
58
  attrs: { class: "rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked" }
@@ -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,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,iBAAY"}
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\">{t(\"rpg.menu.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 { t } = engine.i18n();\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;CACjB,MAAM,SAAE,OAAA,eAAA;CAChB,MAAM,EAAE,MAAM,OAAG,KAAA;CACjB,MAAM,mBAAkB,OAAO,aAAW;CAC1C,MAAM,gBAAW,OAAW,CAAA;CAC5B,MAAM,EAAE,MAAM,WAAW,YAAQ;CACjC,MAAM,SAAS,eAAU,KAAA,EAAA,MAAA;CACzB,MAAM,MAAM,wBAAuB,eAAgB,EAAC,aAAY,OAAG,EAAA,OAAA,GAAA,MAAA;CACnE,MAAM,eAAe,eAAY,OAAU,EAAA,cAAgB,EAAE;CAC7D,SAAS,YAAY,OAAO;EACxB,OAAO,WAAY;GACf,cAAc,IAAE,KAAA;EACpB;CACJ;CACA,MAAM,WAAW,OAAO;EACpB,IAAI;GACA,QAAQ;GACR,MAAM,iBAAG;GACT,UAAK;GACP,UAAG;IACP,IAAY,KAAA,EAAA;;EAEb;EACG,MAAM;GACN,QAAS;GACT,MAAS,iBAAkB;;GAE3B,UAAc;IACN,IAAI,KAAE,CAAA;GACd;;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,eAAA,EAAA,iBAAA,CAAA;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,iBAAY"}
@@ -35,7 +35,10 @@ function component($$props) {
35
35
  width: "100%",
36
36
  height: "100%",
37
37
  zIndex: 100,
38
- attrs: { class: "notification" }
38
+ attrs: {
39
+ class: "notification",
40
+ style: "pointer-events: none !important;"
41
+ }
39
42
  }, h(DOMElement, {
40
43
  element: "div",
41
44
  attrs: { class: "rpg-ui-notifications" }
@@ -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,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,iBAAA"}
1
+ {"version":3,"file":"notification.ce.js","names":[],"sources":["../../../../src/components/gui/notification/notification.ce"],"sourcesContent":["<DOMContainer\n width=\"100%\"\n height=\"100%\"\n zIndex={100}\n class=\"notification\"\n style=\"pointer-events: none !important;\"\n>\n <div class=\"rpg-ui-notifications\">\n @for ((notif,index) of notifications) {\n <div\n class=\"rpg-ui-notification\"\n data-type={notif.type || \"info\"}\n style={notificationStyle(notif)}\n >\n @if (notif.icon) {\n <div class=\"rpg-ui-notification-icon\">\n <DOMSprite sheet={iconSheet(notif.icon)} />\n </div>\n }\n <div class=\"rpg-ui-notification-message\">{notif.message}</div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<style>\n .notification {\n pointer-events: none !important;\n }\n</style>\n\n<script>\n import { effect, computed } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const notifications = computed(() => engine.notificationManager.stack());\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n });\n\n effect(() => {\n const list = notifications();\n const rowHeight = 68;\n list.forEach((notif, index) => {\n notif.layoutY.set(index * rowHeight);\n });\n });\n\n const notificationStyle = (notif) => ({\n opacity: notif.opacity(),\n transform: `translateY(${notif.layoutY() + notif.offset()}px)`\n });\n</script>\n"],"mappings":";;;;AAUA,IAAI,OAAO,aAAY,aAAO;CAC5B,IAAI,eAAe,SAAM,eAAe,0GAAK;CAC7C,IAAI,CAAC,cAAc;EACjB,eAAQ,SAAA,cAAA,OAAA;EACR,aAAa,KAAI;EACjB,SAAS,KAAK,YAAY,YAAS;CACrC;CACA,aAAa,cAAU;AACzB;AAEM,SAAQ,UAAG,SAAA;CACT,SAAA,OAAA;CACC,eAAA,OAAA;CACP,MAAY,SAAA,OAAA,eAAA;;CAEd,MAAM,aAAA,YAAA;EACF,YAAC,OAAa,eAAA,MAAA;EACd,SAAI;CACR;CACA,aAAO;;EAEN,MAAM,YAAA;EACH,KAAA,SAAS,OAAQ,UAAW;GAC5B,MAAS,QAAS,IAAI,QAAQ,SAAQ;EACtC,CAAA;;CAEJ,MAAI,qBAAsB,WAAA;EACtB,SAAM,MAAA,QAAgB;;CAE1B;CAEQ,OADY,EAAA,cAAO;EAAA,OAAe;EAAO,QAAA;EAAA,QAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA;EAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uBAAA;CAAA,GAAA,KAAA,gBAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,aAAA,eAAA,MAAA,QAAA,MAAA;GAAA,OAAA,eAAA,kBAAA,KAAA,CAAA;EAAA;CAAA,GAAA,CAAA,KAAA,MAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;CAAA,GAAA,EAAA,WAAA,EAAA,OAAA,eAAA,UAAA,MAAA,IAAA,CAAA,EAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,aAAA,MAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC/B;AACZ;AAEF,IAAQ,iBAAK"}
@@ -10,6 +10,7 @@ function component($$props) {
10
10
  useProps($$props);
11
11
  const defineProps = useDefineProps($$props);
12
12
  const engine = inject(RpgClientEngine);
13
+ const { t } = engine.i18n();
13
14
  const saveClient = inject(SaveClientService);
14
15
  const gui = inject(RpgGui);
15
16
  const keyboardControls = engine.globalConfig.keyboardControls;
@@ -18,8 +19,8 @@ function component($$props) {
18
19
  const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);
19
20
  const localSlots = signal(defaultSlots());
20
21
  const { data, onFinish } = defineProps();
21
- const title = computed(() => data().mode === "save" ? "Save Game" : "Load Game");
22
- const subtitle = computed(() => data().mode === "save" ? "Choose a slot to overwrite or create." : "Select a slot to load your progress.");
22
+ const title = computed(() => data().mode === "save" ? t("rpg.save.title") : t("rpg.load.title"));
23
+ const subtitle = computed(() => data().mode === "save" ? t("rpg.save.subtitle") : t("rpg.load.subtitle"));
23
24
  const slotsValue = computed(() => localSlots());
24
25
  const displaySlots = computed(() => {
25
26
  const slots = slotsValue();
@@ -27,7 +28,7 @@ function component($$props) {
27
28
  kind: "slot",
28
29
  slot,
29
30
  slotIndex: index,
30
- label: `Slot ${index + 1}`,
31
+ label: t("rpg.save.slot", { index: index + 1 }),
31
32
  readonly: false
32
33
  }));
33
34
  if (!data().showAutoSlot) return items;
@@ -38,7 +39,7 @@ function component($$props) {
38
39
  kind: "auto",
39
40
  slot: autoSlot,
40
41
  slotIndex: index,
41
- label: data().autoSlotLabel || "Auto Save",
42
+ label: data().autoSlotLabel || t("rpg.save.auto"),
42
43
  readonly
43
44
  }, ...items];
44
45
  });
@@ -182,27 +183,27 @@ function component($$props) {
182
183
  h(DOMElement, {
183
184
  element: "div",
184
185
  attrs: { class: "rpg-ui-save-load-slot-line" },
185
- textContent: "Level: " + item.slot.level
186
+ textContent: t("rpg.save.level") + ": " + item.slot.level
186
187
  }),
187
188
  h(DOMElement, {
188
189
  element: "div",
189
190
  attrs: { class: "rpg-ui-save-load-slot-line" },
190
- textContent: "Exp: " + item.slot.exp
191
+ textContent: t("rpg.save.exp") + ": " + item.slot.exp
191
192
  }),
192
193
  h(DOMElement, {
193
194
  element: "div",
194
195
  attrs: { class: "rpg-ui-save-load-slot-line" },
195
- textContent: "Map: " + item.slot.map
196
+ textContent: t("rpg.save.map") + ": " + item.slot.map
196
197
  }),
197
198
  h(DOMElement, {
198
199
  element: "div",
199
200
  attrs: { class: "rpg-ui-save-load-slot-line" },
200
- textContent: "Date: " + item.slot.date
201
+ textContent: t("rpg.save.date") + ": " + item.slot.date
201
202
  })
202
203
  ]), () => h(DOMElement, {
203
204
  element: "div",
204
205
  attrs: { class: "rpg-ui-save-load-slot-empty" },
205
- textContent: "Empty Slot"
206
+ textContent: computed(() => t("rpg.save.empty-slot"))
206
207
  }))]))))]));
207
208
  }
208
209
  var __ce_component = component;
@@ -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 import { getKeyboardControlBind } from \"../../services/actionInput\";\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: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"save-load.ce.js","names":[],"sources":["../../../src/components/gui/save-load.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-save-load rpg-anim-fade-in\">\n <div class=\"rpg-ui-save-load-header\">\n <div class=\"rpg-ui-save-load-title\">{title()}</div>\n <div class=\"rpg-ui-save-load-subtitle\">{subtitle()}</div>\n </div>\n <Navigation tabindex={selectedSlot} controls={controls}>\n <div class=\"rpg-ui-save-load-list\">\n @for ((item,displayIndex) of displaySlots) {\n <div\n class=\"rpg-ui-save-load-slot\"\n class={{active: selectedSlot() === displayIndex}}\n tabindex={displayIndex}\n data-slot-index={displayIndex}\n click={selectSlot(displayIndex)}\n >\n <div class=\"rpg-ui-save-load-slot-index\">{item.label}</div>\n @if (item.slot) {\n <div class=\"rpg-ui-save-load-slot-meta\">\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.level\")}: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.exp\")}: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.map\")}: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">{t(\"rpg.save.date\")}: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">{t(\"rpg.save.empty-slot\")}</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { getKeyboardControlBind } from \"../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? t(\"rpg.save.title\") : t(\"rpg.load.title\"));\n const subtitle = computed(() => data().mode === \"save\"\n ? t(\"rpg.save.subtitle\")\n : t(\"rpg.load.subtitle\")\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: t(\"rpg.save.slot\", { index: index + 1 }),\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || t(\"rpg.save.auto\"),\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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"}
@@ -7,6 +7,7 @@ function component($$props) {
7
7
  useProps($$props);
8
8
  const defineProps = useDefineProps($$props);
9
9
  const engine = inject(RpgClientEngine);
10
+ const { t } = engine.i18n();
10
11
  const currentPlayer = engine.scene.currentPlayer;
11
12
  const keyboardControls = engine.globalConfig.keyboardControls;
12
13
  const iconSheet = (iconId) => ({
@@ -21,19 +22,19 @@ function component($$props) {
21
22
  const selectedModeIndex = signal(0);
22
23
  const quantity = signal(1);
23
24
  const quantityDialogOpen = signal(false);
24
- const defaultMessage = "Welcome to my shop!";
25
+ const defaultMessage = t("rpg.shop.default-message");
25
26
  const tabs = [
26
27
  {
27
28
  id: "item",
28
- label: "Items"
29
+ label: t("rpg.menu.items")
29
30
  },
30
31
  {
31
32
  id: "weapon",
32
- label: "Weapons"
33
+ label: t("rpg.menu.weapons")
33
34
  },
34
35
  {
35
36
  id: "armor",
36
- label: "Armor"
37
+ label: t("rpg.menu.armor")
37
38
  }
38
39
  ];
39
40
  const { data, onInteraction, onFinish } = defineProps();
@@ -59,7 +60,7 @@ function component($$props) {
59
60
  });
60
61
  const currentItem = computed(() => filteredItems()[selectedItem()]);
61
62
  const gold = computed(() => currentPlayer()._gold());
62
- const actionLabel = computed(() => tradeMode() === "buy" ? "Buy" : "Sell");
63
+ const actionLabel = computed(() => tradeMode() === "buy" ? t("rpg.shop.buy") : t("rpg.shop.sell"));
63
64
  const faceSheet = (graphicId, animationName) => ({
64
65
  definition: engine.getSpriteSheet(graphicId),
65
66
  playing: animationName || "default"
@@ -357,7 +358,7 @@ function component($$props) {
357
358
  }), h(DOMElement, {
358
359
  element: "h2",
359
360
  attrs: { style: "margin: 0;" },
360
- textContent: "Choose an action"
361
+ textContent: computed(() => t("rpg.shop.choose-action"))
361
362
  })]), h(DOMElement, {
362
363
  element: "div",
363
364
  attrs: { class: "rpg-shop-trade" }
@@ -373,14 +374,14 @@ function component($$props) {
373
374
  class: ["rpg-shop-tab", computed(() => ({ active: selectedModeIndex() === 0 }))],
374
375
  click: selectMode("buy")
375
376
  },
376
- textContent: "Buy"
377
+ textContent: computed(() => t("rpg.shop.buy"))
377
378
  }), h(DOMElement, {
378
379
  element: "div",
379
380
  attrs: {
380
381
  class: ["rpg-shop-tab", computed(() => ({ active: selectedModeIndex() === 1 }))],
381
382
  click: selectMode("sell")
382
383
  },
383
- textContent: "Sell"
384
+ textContent: computed(() => t("rpg.shop.sell"))
384
385
  })])))])), () => h(DOMElement, { element: "div" }, [h(Navigation, {
385
386
  tabindex: selectedTab,
386
387
  controls: tabControls
@@ -443,7 +444,7 @@ function component($$props) {
443
444
  cond(item.equipped, () => h(DOMElement, {
444
445
  element: "div",
445
446
  attrs: { class: "rpg-shop-card-tag" },
446
- textContent: "Equipped"
447
+ textContent: computed(() => t("rpg.shop.equipped"))
447
448
  }))
448
449
  ])))), h(DOMElement, {
449
450
  element: "div",
@@ -476,13 +477,13 @@ function component($$props) {
476
477
  cond(computed(() => currentItem()?.quantity !== void 0), () => h(DOMElement, {
477
478
  element: "div",
478
479
  attrs: { class: "rpg-shop-details-qty" },
479
- textContent: computed(() => "Qty: x" + currentItem()?.quantity)
480
+ textContent: computed(() => t("rpg.shop.qty") + ": x" + currentItem()?.quantity)
480
481
  }))
481
482
  ]),
482
483
  h(DOMElement, { element: "div" }, cond(computed(() => currentItem()?.equipped), () => h(DOMElement, {
483
484
  element: "div",
484
485
  attrs: { class: "rpg-shop-equipped" },
485
- textContent: "Already equipped"
486
+ textContent: computed(() => t("rpg.shop.already-equipped"))
486
487
  }))),
487
488
  h(DOMElement, {
488
489
  element: "div",
@@ -521,7 +522,7 @@ function component($$props) {
521
522
  class: "rpg-shop-btn",
522
523
  click: backToMode()
523
524
  },
524
- textContent: "Back"
525
+ textContent: computed(() => t("rpg.shop.back"))
525
526
  })
526
527
  ])])])), cond(quantityDialogOpen, () => h(DOMElement, {
527
528
  element: "div",
@@ -543,7 +544,7 @@ function component($$props) {
543
544
  cond(computed(() => currentItem()?.quantity !== void 0), () => h(DOMElement, {
544
545
  element: "div",
545
546
  attrs: { class: "rpg-shop-modal-qty" },
546
- textContent: computed(() => "Available: x" + currentItem()?.quantity)
547
+ textContent: computed(() => t("rpg.shop.available") + ": x" + currentItem()?.quantity)
547
548
  })),
548
549
  h(DOMElement, {
549
550
  element: "div",
@@ -551,7 +552,7 @@ function component($$props) {
551
552
  }, [h(DOMElement, {
552
553
  element: "div",
553
554
  attrs: { class: "rpg-shop-quantity-label" },
554
- textContent: "Quantity"
555
+ textContent: computed(() => t("rpg.shop.quantity"))
555
556
  }), h(DOMElement, {
556
557
  element: "div",
557
558
  attrs: { class: "rpg-shop-quantity-controls" }
@@ -583,7 +584,7 @@ function component($$props) {
583
584
  attrs: { class: "rpg-shop-modal-total" }
584
585
  }, [h(DOMElement, {
585
586
  element: "span",
586
- textContent: "Total"
587
+ textContent: computed(() => t("rpg.shop.total"))
587
588
  }), h(DOMElement, {
588
589
  element: "span",
589
590
  textContent: computed(() => totalPrice() + goldTerm)
@@ -597,7 +598,7 @@ function component($$props) {
597
598
  class: "rpg-shop-btn rpg-shop-btn-secondary",
598
599
  click: closeQuantityDialog()
599
600
  },
600
- textContent: "Cancel"
601
+ textContent: computed(() => t("rpg.menu.cancel"))
601
602
  }), h(DOMElement, {
602
603
  element: "button",
603
604
  attrs: {