@rpgjs/client 5.0.0-beta.11 → 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.
- package/CHANGELOG.md +19 -0
- package/dist/Game/AnimationManager.d.ts +1 -0
- package/dist/Game/AnimationManager.js +3 -0
- package/dist/Game/AnimationManager.js.map +1 -1
- package/dist/Game/ClientVisuals.d.ts +61 -0
- package/dist/Game/ClientVisuals.js +96 -0
- package/dist/Game/ClientVisuals.js.map +1 -0
- package/dist/Game/ClientVisuals.spec.d.ts +1 -0
- package/dist/Game/EventComponentResolver.d.ts +16 -0
- package/dist/Game/EventComponentResolver.js +52 -0
- package/dist/Game/EventComponentResolver.js.map +1 -0
- package/dist/Game/EventComponentResolver.spec.d.ts +1 -0
- package/dist/Game/Map.js +9 -0
- package/dist/Game/Map.js.map +1 -1
- package/dist/Game/Object.d.ts +2 -0
- package/dist/Game/Object.js +22 -8
- package/dist/Game/Object.js.map +1 -1
- package/dist/Game/Object.spec.d.ts +1 -0
- package/dist/Game/ProjectileManager.d.ts +11 -2
- package/dist/Game/ProjectileManager.js +19 -2
- package/dist/Game/ProjectileManager.js.map +1 -1
- package/dist/Gui/Gui.d.ts +3 -2
- package/dist/Gui/Gui.js +18 -6
- package/dist/Gui/Gui.js.map +1 -1
- package/dist/RpgClient.d.ts +85 -1
- package/dist/RpgClientEngine.d.ts +77 -2
- package/dist/RpgClientEngine.js +290 -31
- package/dist/RpgClientEngine.js.map +1 -1
- package/dist/components/animations/fx.ce.js +58 -0
- package/dist/components/animations/fx.ce.js.map +1 -0
- package/dist/components/animations/index.d.ts +1 -0
- package/dist/components/animations/index.js +3 -1
- package/dist/components/animations/index.js.map +1 -1
- package/dist/components/character.ce.js +192 -19
- package/dist/components/character.ce.js.map +1 -1
- package/dist/components/gui/dialogbox/index.ce.js +27 -12
- package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
- package/dist/components/gui/gameover.ce.js +4 -3
- package/dist/components/gui/gameover.ce.js.map +1 -1
- package/dist/components/gui/menu/equip-menu.ce.js +9 -8
- package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/exit-menu.ce.js +7 -5
- package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/items-menu.ce.js +8 -7
- package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/main-menu.ce.js +12 -11
- package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/options-menu.ce.js +7 -5
- package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/skills-menu.ce.js +4 -2
- package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
- package/dist/components/gui/notification/notification.ce.js +4 -1
- package/dist/components/gui/notification/notification.ce.js.map +1 -1
- package/dist/components/gui/save-load.ce.js +10 -9
- package/dist/components/gui/save-load.ce.js.map +1 -1
- package/dist/components/gui/shop/shop.ce.js +17 -16
- package/dist/components/gui/shop/shop.ce.js.map +1 -1
- package/dist/components/gui/title-screen.ce.js +4 -3
- package/dist/components/gui/title-screen.ce.js.map +1 -1
- package/dist/components/interaction-components.ce.js +20 -0
- package/dist/components/interaction-components.ce.js.map +1 -0
- package/dist/components/scenes/canvas.ce.js +12 -7
- package/dist/components/scenes/canvas.ce.js.map +1 -1
- package/dist/components/scenes/draw-map.ce.js +18 -13
- package/dist/components/scenes/draw-map.ce.js.map +1 -1
- package/dist/i18n.d.ts +55 -0
- package/dist/i18n.js +60 -0
- package/dist/i18n.js.map +1 -0
- package/dist/i18n.spec.d.ts +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -2
- package/dist/module.js +30 -3
- package/dist/module.js.map +1 -1
- package/dist/services/actionInput.d.ts +3 -1
- package/dist/services/actionInput.js +33 -1
- package/dist/services/actionInput.js.map +1 -1
- package/dist/services/interactions.d.ts +159 -0
- package/dist/services/interactions.js +460 -0
- package/dist/services/interactions.js.map +1 -0
- package/dist/services/interactions.spec.d.ts +1 -0
- package/dist/services/keyboardControls.d.ts +1 -0
- package/dist/services/keyboardControls.js +1 -0
- package/dist/services/keyboardControls.js.map +1 -1
- package/dist/services/standalone.d.ts +3 -1
- package/dist/services/standalone.js +31 -13
- package/dist/services/standalone.js.map +1 -1
- package/dist/utils/mapId.d.ts +1 -0
- package/dist/utils/mapId.js +6 -0
- package/dist/utils/mapId.js.map +1 -0
- package/package.json +4 -4
- package/src/Game/AnimationManager.ts +4 -0
- package/src/Game/ClientVisuals.spec.ts +56 -0
- package/src/Game/ClientVisuals.ts +184 -0
- package/src/Game/EventComponentResolver.spec.ts +84 -0
- package/src/Game/EventComponentResolver.ts +74 -0
- package/src/Game/Map.ts +10 -0
- package/src/Game/Object.spec.ts +59 -0
- package/src/Game/Object.ts +36 -12
- package/src/Game/ProjectileManager.spec.ts +111 -0
- package/src/Game/ProjectileManager.ts +24 -2
- package/src/Gui/Gui.spec.ts +67 -0
- package/src/Gui/Gui.ts +24 -7
- package/src/RpgClient.ts +96 -1
- package/src/RpgClientEngine.ts +378 -45
- package/src/components/animations/fx.ce +101 -0
- package/src/components/animations/index.ts +4 -2
- package/src/components/character.ce +243 -17
- package/src/components/gui/dialogbox/index.ce +35 -14
- package/src/components/gui/gameover.ce +4 -3
- package/src/components/gui/menu/equip-menu.ce +9 -8
- package/src/components/gui/menu/exit-menu.ce +4 -3
- package/src/components/gui/menu/items-menu.ce +8 -7
- package/src/components/gui/menu/main-menu.ce +12 -11
- package/src/components/gui/menu/options-menu.ce +4 -3
- package/src/components/gui/menu/skills-menu.ce +2 -1
- package/src/components/gui/notification/notification.ce +7 -1
- package/src/components/gui/save-load.ce +11 -10
- package/src/components/gui/shop/shop.ce +17 -16
- package/src/components/gui/title-screen.ce +4 -3
- package/src/components/interaction-components.ce +23 -0
- package/src/components/scenes/canvas.ce +12 -7
- package/src/components/scenes/draw-map.ce +16 -5
- package/src/i18n.spec.ts +39 -0
- package/src/i18n.ts +59 -0
- package/src/index.ts +3 -0
- package/src/module.ts +43 -10
- package/src/services/actionInput.spec.ts +54 -0
- package/src/services/actionInput.ts +68 -1
- package/src/services/interactions.spec.ts +175 -0
- package/src/services/interactions.ts +722 -0
- package/src/services/keyboardControls.ts +2 -1
- package/src/services/standalone.ts +39 -10
- package/src/utils/mapId.ts +2 -0
|
@@ -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 import { getKeyboardControlBind } from \"../../../services/actionInput\";\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: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!confirmOpen()) return;\n confirmSelect(selectedConfirm())();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (!confirmOpen()) return;\n cancelConfirm();\n }\n }\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (confirmOpen()) {\n confirmSelect(selectedConfirm())();\n return;\n }\n requestUseItem(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (confirmOpen()) {\n cancelConfirm();\n return;\n }\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n clampSelection();\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"items-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/items-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">{t(\"rpg.menu.items\")}</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n @if (currentItem) {\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentItem()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentItem()?.description || \"\"}</div>\n </div>\n </div>\n </div>\n }\n </div>\n \n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of tabs) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((item,index) of filteredItems) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n class={{disabled: !item.usable}}\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n </div>\n <span>{item.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">x{item.quantity ?? 1}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n @if (confirmOpen) {\n <div class=\"rpg-ui-menu-confirm\">\n <div class=\"rpg-ui-menu-confirm-card\">\n <div class=\"rpg-ui-menu-confirm-title\">{t(\"rpg.menu.use\")} {confirmItem()?.name}?</div>\n <Navigation tabindex={selectedConfirm} controls={confirmControls}>\n <div class=\"rpg-ui-menu-confirm-actions\">\n @for ((option,index) of confirmOptions) {\n <button\n class=\"rpg-ui-menu-confirm-btn\"\n class={{\"rpg-ui-menu-confirm-btn-secondary\": option.id === \"cancel\"}}\n data-selected={selectedConfirm() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={confirmSelect(index)}\n >{option.label}</button>\n }\n </div>\n </Navigation>\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedItem = signal(0);\n const selectedTab = signal(0);\n const selectedConfirm = signal(0);\n const confirmOpen = signal(false);\n const confirmItem = signal(null);\n\n const { data, onInteraction, onBack } = defineProps();\n\n const items = computed(() => data().items);\n\n const tabs = [\n { id: \"item\", label: t(\"rpg.menu.items\") },\n { id: \"weapon\", label: t(\"rpg.menu.weapons\") },\n { id: \"armor\", label: t(\"rpg.menu.armor\") }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeItems = computed(() => {\n const value = resolveProp(items);\n return Array.isArray(value) ? value : [];\n });\n\n const filteredItems = computed(() => {\n const items = safeItems();\n const tab = tabs[selectedTab()];\n if (!tab) return [];\n return items.filter((item) => item.type === tab.id && (item.quantity ?? 1) > 0);\n });\n\n const confirmOptions = [\n { id: \"use\", label: t(\"rpg.menu.use\") },\n { id: \"cancel\", label: t(\"rpg.menu.cancel\") }\n ];\n\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, \"wrap\");\n const navConfirm = createTabindexNavigator(selectedConfirm, { count: () => confirmOptions.length }, \"wrap\");\n const currentItem = computed(() => filteredItems()[selectedItem()]);\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const clampSelection = () => {\n const count = filteredItems().length;\n if (count === 0) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n };\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n requestUseItem(index);\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedItem.set(0);\n selectedTab.set(index);\n }\n }\n\n const useItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n };\n\n const requestUseItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (item.consumable) {\n confirmItem.set(item);\n confirmOpen.set(true);\n selectedConfirm.set(0);\n return;\n }\n useItem(index);\n };\n\n const confirmUse = () => {\n const item = confirmItem();\n if (!item) return;\n delay(() => {\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const cancelConfirm = () => {\n delay(() => {\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n function confirmSelect(index) {\n return function() {\n selectedConfirm.set(index);\n if (index === 0) {\n confirmUse();\n return;\n }\n cancelConfirm();\n }\n }\n\n const confirmControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(-1);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (!confirmOpen()) return;\n confirmSelect(selectedConfirm())();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (!confirmOpen()) return;\n cancelConfirm();\n }\n }\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (confirmOpen()) {\n confirmSelect(selectedConfirm())();\n return;\n }\n requestUseItem(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (confirmOpen()) {\n cancelConfirm();\n return;\n }\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n clampSelection();\n</script>\n"],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ function component($$props) {
|
|
|
15
15
|
useProps($$props);
|
|
16
16
|
const defineProps = useDefineProps($$props);
|
|
17
17
|
const engine = inject(RpgClientEngine);
|
|
18
|
+
const { t } = engine.i18n();
|
|
18
19
|
const currentPlayer = engine.scene.currentPlayer;
|
|
19
20
|
const keyboardControls = engine.globalConfig.keyboardControls;
|
|
20
21
|
const { data, onFinish, onInteraction } = defineProps();
|
|
@@ -22,27 +23,27 @@ function component($$props) {
|
|
|
22
23
|
const defaultMenus = [
|
|
23
24
|
{
|
|
24
25
|
id: "items",
|
|
25
|
-
label: "
|
|
26
|
+
label: t("rpg.menu.items")
|
|
26
27
|
},
|
|
27
28
|
{
|
|
28
29
|
id: "skills",
|
|
29
|
-
label: "
|
|
30
|
+
label: t("rpg.menu.skills")
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
33
|
id: "equip",
|
|
33
|
-
label: "
|
|
34
|
+
label: t("rpg.menu.equip")
|
|
34
35
|
},
|
|
35
36
|
{
|
|
36
37
|
id: "options",
|
|
37
|
-
label: "
|
|
38
|
+
label: t("rpg.menu.options")
|
|
38
39
|
},
|
|
39
40
|
{
|
|
40
41
|
id: "save",
|
|
41
|
-
label: "
|
|
42
|
+
label: t("rpg.menu.save")
|
|
42
43
|
},
|
|
43
44
|
{
|
|
44
45
|
id: "exit",
|
|
45
|
-
label: "
|
|
46
|
+
label: t("rpg.menu.exit")
|
|
46
47
|
}
|
|
47
48
|
];
|
|
48
49
|
const menuEntries = computed(() => {
|
|
@@ -232,7 +233,7 @@ function component($$props) {
|
|
|
232
233
|
}, [h(DOMElement, {
|
|
233
234
|
element: "div",
|
|
234
235
|
attrs: { class: "rpg-ui-menu-header" },
|
|
235
|
-
textContent: "
|
|
236
|
+
textContent: computed(() => t("rpg.menu.title"))
|
|
236
237
|
}), h(DOMElement, {
|
|
237
238
|
element: "div",
|
|
238
239
|
attrs: { class: "rpg-ui-main-menu-list" }
|
|
@@ -256,7 +257,7 @@ function component($$props) {
|
|
|
256
257
|
h(DOMElement, {
|
|
257
258
|
element: "div",
|
|
258
259
|
attrs: { class: "rpg-ui-main-menu-section-title" },
|
|
259
|
-
textContent: "
|
|
260
|
+
textContent: computed(() => t("rpg.menu.status"))
|
|
260
261
|
}),
|
|
261
262
|
h(DOMElement, {
|
|
262
263
|
element: "div",
|
|
@@ -268,7 +269,7 @@ function component($$props) {
|
|
|
268
269
|
}, [h(DOMElement, {
|
|
269
270
|
element: "div",
|
|
270
271
|
attrs: { class: "rpg-ui-main-menu-status-label" },
|
|
271
|
-
textContent: "
|
|
272
|
+
textContent: computed(() => t("rpg.menu.level"))
|
|
272
273
|
}), h(DOMElement, {
|
|
273
274
|
element: "div",
|
|
274
275
|
attrs: { class: "rpg-ui-main-menu-status-value" },
|
|
@@ -280,7 +281,7 @@ function component($$props) {
|
|
|
280
281
|
}, [h(DOMElement, {
|
|
281
282
|
element: "div",
|
|
282
283
|
attrs: { class: "rpg-ui-main-menu-status-label" },
|
|
283
|
-
textContent: "
|
|
284
|
+
textContent: computed(() => t("rpg.menu.gold"))
|
|
284
285
|
}), h(DOMElement, {
|
|
285
286
|
element: "div",
|
|
286
287
|
attrs: { class: "rpg-ui-main-menu-status-value" },
|
|
@@ -344,7 +345,7 @@ function component($$props) {
|
|
|
344
345
|
h(DOMElement, {
|
|
345
346
|
element: "div",
|
|
346
347
|
attrs: { class: "rpg-ui-main-menu-section-title" },
|
|
347
|
-
textContent: "
|
|
348
|
+
textContent: computed(() => t("rpg.menu.parameters"))
|
|
348
349
|
}),
|
|
349
350
|
h(DOMElement, {
|
|
350
351
|
element: "div",
|
|
@@ -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
|
|
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: "
|
|
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: "
|
|
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:
|
|
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\">
|
|
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
|
|
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: "
|
|
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\">
|
|
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: {
|
|
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
|
|
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" ? "
|
|
22
|
-
const subtitle = computed(() => data().mode === "save" ? "
|
|
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:
|
|
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 || "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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:
|
|
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":";;;;;;;;AAcM,SAAS,UAAS,SAAO;CACX,SAAA,OAAA;CACZ,MAAM,cAAc,eAAe,OAAK;CACxC,MAAM,SAAS,OAAM,eAAW;CACxC,MAAM,aAAa,OAAO,iBAAiB;CAC3C,MAAM,MAAM,OAAO,MAAM;CACzB,MAAM,mBAAmB,OAAO,aAAY;CAC5C,MAAM,eAAe,OAAO,CAAC;CAC7B,MAAM,gBAAgB;CACtB,MAAM,qBAAqB,MAAM,KAAA,EAAA,QAAA,cAAA,SAAA,IAAA;CACjC,MAAM,aAAa,OAAK,aAAA,CAAA;CACxB,MAAM,EAAE,MAAM,aAAW,YAAK;CAC9B,MAAM,QAAQ,eAAe,KAAI,EAAA,SAAW,SAAQ,cAAgB,WAAW;CAC/E,MAAM,WAAW,eAAO,KAAA,EAAA,SAAA,SAClB,0CACA,sCAAU;CAChB,MAAM,aAAW,eAAA,WAAA,CAAA;CACjB,MAAM,eAAc,eAAA;EAChB,MAAK,QAAA,WAAA;EACP,MAAA,QAAY,MAAA,KAAA,MAAA,WAAA;;GAEP;GACH,WAAe;GACf,OAAS,QAAS,QAAS;GAC3B,UAAS;EACT,EAAA;EACA,IAAA,CAAA,KAAS,EAAA,cACT,OAAS;EACT,MAAM,QAAG,OAAA,KAAA,EAAA,kBAAqC,WAAS,KAAA,EAAA,gBAAY;;EAEnE,MAAM,WAAS,KAAO,EAAA,SAAA;EACtB,OAAM,CACN;GACM,MAAA;;GAEA,WAAa;GACb,OAAA,KAAc,EAAE,iBAAC;GACjB;EACN,GAAA,GAAA,KAEA;;CAEJ,MAAI,MAAM,wBAAuB,cAAiB,EAAA,aAAc,aAAc,EAAA,OAAM,GAAA,MAAA;CACpF,MAAI,aAAe,SAAE;EACjB,IAAI,KAAG,UACH,OAAG;EACP,IAAC,KAAA,EAAA,SAAA,UAAA,CAAA,KAAA,MAAA,OAAA;EAED,OAAM;CACV;CACA,MAAM,sBAAgB,UAAY;EAC9B,IAAI,CAAA,OACA,OAAI;EACR,IAAI,OAAI,UAAI,UACR,IAAI;GACA,OAAO,KAAK,MAAG,KAAQ;EAC3B,QACG;GACC,OAAO;EACX;EAEJ,OAAI;CACR;CACA,MAAM,kBAAM,SAAA;EACR,IAAI,MAAM,QAAQ,IAAC,GAAK;GACpB,MAAM,SAAQ,KAAA,IAAQ,KAAA,QAAA,aAAA;GACtB,OAAO,MAAC,KAAU,EAAC,OAAK,IAAA,GAAA,UAAA,mBAAA,KAAA,MAAA,CAAA;EAC5B;EACA,IAAI,CAAC,QAAO,OAAA,SAAA,UACR,OAAK,aAAA;EAET,MAAK,OAAA,OAAA,KAAA,IAAA,EAAA,QAAA,QAAA,QAAA,KAAA,GAAA,CAAA;EACL,MAAE,UAAA,KAAA,KAAA,QAAA,OAAA,GAAA,CAAA,EAAA,QAAA,UAAA,SAAA,CAAA;EACF,MAAM,WAAM,QAAA,SAAA,KAAwB,IAAA,GAAA,OAAgB,IAAK;;EAEzD,MAAM,QAAA,MAAa,KAAM,EAAE,OAAC,SAAA,IAAA;EAC5B,KAAI,SAAS,QAAS;GAClB,MAAI,QAAO,OAAU,GAAA;GACrB,IAAA,QAAW,KAAA,SAAA,QACd;;EAED,CAAA;EACA,OAAO;CACX;CAMA,MAAM,eAAE,YAAA;EACJ,IAAI;GACH,MAAA,OAAA,MAAA,WAAA,UAAA;;EAED,SACO,KAAC;GACJ,WAAU,IAAA,aAAkB,CAAA;EAChC;CACJ;CACA,MAAM,gBAAe,OAAO,iBAAkB;EAE1C,MAAI,OADI,aACJ,EAAA;EACJ,IAAI,CAAA,MACA;EACJ,IAAI,CAAA,UAAM,IAAS,GACf;EACJ,MAAI,SAAW,KAAG,EAAA,SAAa,SAAS,SAAO;EAC/C,IAAI,WAAK,QAAc;GACnB,MAAI,WAAa,SAAQ,KAAI,SAAA;GAC7B,MAAM,aAAa;EACvB;EACA,IAAI,WAAE,QACF,MAAM,WAAM,SAAA,KAAA,SAAA;;GAGhB,IAAM,UACE,SAAM;GACV,IAAA,KAAS,YAAS,IAAO;GAC5B,IAAA,KAAA,YAAA,WAAA;;CAEL;CACA,SAAQ,WAAI,OAAA;EACR,OAAO,WAAY;GACf,aAAI,IAAW,KAAI;GACnB,cAAc,KAAA;EAClB;CACJ;CACA,MAAK,WAAA,OAAA;;GAED,QAAM;GACF,MAAM,iBAAO;GACb,UAAU;GACV,UAAU;IACN,IAAC,KAAA,EAAU;GACf;EACJ;EACA,MAAM;GACF,QAAI;GACJ,MAAA,iBAAA;GACA,UAAU;GACV,UAAU;IACV,IAAA,KAAA,CAAA;GACA;EACJ;EACA,QAAQ;GACJ,MAAI,uBAAqB,iBAAY,MAAA;GACrC,UAAM;;GAET;;EAED,QAAQ;GACJ,MAAM,iBAAY;GAClB,UAAI;IACA,IAAA,UACJ,SAAA;IACJ,IAAA,KAAA,YAAA,IAAA;;EAEA;EACA,SAAQ,EACJ,SAAI,KACR;CACJ,CAAC;CACD,OAAO,YAAY;EACf,aAAY;CAChB,CAAC;CAEO,OADC,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oCAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;EAAA,aAAA,eAAA,MAAA,CAAA;CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA,eAAA,SAAA,CAAA;CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,YAAA;EAAA,UAAA;EAAA;CAAA,GAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,wBAAA;CAAA,GAAA,KAAA,eAAA,MAAA,iBAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,yBAAA,gBAAA,EAAA,QAAA,aAAA,MAAA,aAAA,EAAA,CAAA;GAAA,UAAA;GAAA,mBAAA;GAAA,OAAA,WAAA,YAAA;EAAA;CAAA,GAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,aAAA,KAAA;CAAA,CAAA,GAAA,KAAA,KAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;CAAA,GAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,6BAAA;GAAA,aAAA,YAAA,KAAA,KAAA;EAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,6BAAA;GAAA,aAAA,UAAA,KAAA,KAAA;EAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,6BAAA;GAAA,aAAA,UAAA,KAAA,KAAA;EAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,6BAAA;GAAA,aAAA,WAAA,KAAA,KAAA;EAAA,CAAA;CAAA,CAAA,SAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,aAAA;CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACK;AACR;AAEA,IAAM,iBAAa"}
|
|
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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"}
|