@rpgjs/client 5.0.0-beta.4 → 5.0.0-beta.6
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/dist/Game/Object.js +2 -2
- package/dist/Game/Object.js.map +1 -1
- package/dist/Gui/Gui.js +14 -14
- package/dist/Gui/Gui.js.map +1 -1
- package/dist/RpgClientEngine.js +2 -2
- package/dist/RpgClientEngine.js.map +1 -1
- package/dist/components/animations/animation.ce.js +2 -1
- package/dist/components/animations/hit.ce.js +2 -1
- package/dist/components/animations/hit.ce.js.map +1 -1
- package/dist/components/animations/index.js +4 -4
- package/dist/components/character.ce.js +12 -1
- package/dist/components/character.ce.js.map +1 -1
- package/dist/components/dynamics/text.ce.js +2 -1
- package/dist/components/dynamics/text.ce.js.map +1 -1
- package/dist/components/gui/box.ce.js +2 -1
- package/dist/components/gui/dialogbox/index.ce.js +16 -6
- package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
- package/dist/components/gui/gameover.ce.js +2 -1
- package/dist/components/gui/gameover.ce.js.map +1 -1
- package/dist/components/gui/hud/hud.ce.js +2 -1
- package/dist/components/gui/hud/hud.ce.js.map +1 -1
- package/dist/components/gui/menu/equip-menu.ce.js +2 -1
- package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/exit-menu.ce.js +2 -1
- package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/items-menu.ce.js +2 -1
- package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/main-menu.ce.js +14 -13
- package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/options-menu.ce.js +2 -1
- package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/skills-menu.ce.js +2 -1
- package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
- package/dist/components/gui/mobile/index.js +2 -2
- package/dist/components/gui/mobile/index.js.map +1 -1
- package/dist/components/gui/mobile/mobile.ce.js +2 -1
- package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
- package/dist/components/gui/notification/notification.ce.js +9 -5
- package/dist/components/gui/notification/notification.ce.js.map +1 -1
- package/dist/components/gui/save-load.ce.js +2 -1
- package/dist/components/gui/save-load.ce.js.map +1 -1
- package/dist/components/gui/shop/shop.ce.js +2 -1
- package/dist/components/gui/shop/shop.ce.js.map +1 -1
- package/dist/components/gui/title-screen.ce.js +2 -1
- package/dist/components/gui/title-screen.ce.js.map +1 -1
- package/dist/components/prebuilt/hp-bar.ce.js +2 -1
- package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
- package/dist/components/prebuilt/light-halo.ce.js +2 -1
- package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
- package/dist/components/scenes/canvas.ce.js +4 -3
- package/dist/components/scenes/canvas.ce.js.map +1 -1
- package/dist/components/scenes/draw-map.ce.js +2 -1
- package/dist/components/scenes/draw-map.ce.js.map +1 -1
- package/dist/components/scenes/event-layer.ce.js +5 -4
- package/dist/components/scenes/event-layer.ce.js.map +1 -1
- package/dist/index.js +19 -19
- package/package.json +6 -6
- package/src/components/character.ce +14 -1
- package/src/components/gui/dialogbox/index.ce +15 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"items-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/items-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">Items</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n @if (currentItem) {\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentItem()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentItem()?.description || \"\"}</div>\n </div>\n </div>\n </div>\n }\n </div>\n \n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of tabs) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((item,index) of filteredItems) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n class={{disabled: !item.usable}}\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n </div>\n <span>{item.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">x{item.quantity ?? 1}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n @if (confirmOpen) {\n <div class=\"rpg-ui-menu-confirm\">\n <div class=\"rpg-ui-menu-confirm-card\">\n <div class=\"rpg-ui-menu-confirm-title\">Use {confirmItem()?.name}?</div>\n <Navigation tabindex={selectedConfirm} controls={confirmControls}>\n <div class=\"rpg-ui-menu-confirm-actions\">\n @for ((option,index) of confirmOptions) {\n <button\n class=\"rpg-ui-menu-confirm-btn\"\n class={{\"rpg-ui-menu-confirm-btn-secondary\": option.id === \"cancel\"}}\n data-selected={selectedConfirm() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={confirmSelect(index)}\n >{option.label}</button>\n }\n </div>\n </Navigation>\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedItem = signal(0);\n const selectedTab = signal(0);\n const selectedConfirm = signal(0);\n const confirmOpen = signal(false);\n const confirmItem = signal(null);\n\n const { data, onInteraction, onBack } = defineProps();\n\n const items = computed(() => data().items);\n\n const tabs = [\n { id: \"item\", label: \"Items\" },\n { id: \"weapon\", label: \"Weapons\" },\n { id: \"armor\", label: \"Armor\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeItems = computed(() => {\n const value = resolveProp(items);\n return Array.isArray(value) ? value : [];\n });\n\n const filteredItems = computed(() => {\n const items = safeItems();\n const tab = tabs[selectedTab()];\n if (!tab) return [];\n return items.filter((item) => item.type === tab.id && (item.quantity ?? 1) > 0);\n });\n\n const confirmOptions = [\n { id: \"use\", label: \"Use\" },\n { id: \"cancel\", label: \"Cancel\" }\n ];\n\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, \"wrap\");\n const navConfirm = createTabindexNavigator(selectedConfirm, { count: () => confirmOptions.length }, \"wrap\");\n const currentItem = computed(() => filteredItems()[selectedItem()]);\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const clampSelection = () => {\n const count = filteredItems().length;\n if (count === 0) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n };\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n requestUseItem(index);\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedItem.set(0);\n selectedTab.set(index);\n }\n }\n\n const useItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n };\n\n const requestUseItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (item.consumable) {\n confirmItem.set(item);\n confirmOpen.set(true);\n selectedConfirm.set(0);\n return;\n }\n useItem(index);\n };\n\n const confirmUse = () => {\n const item = confirmItem();\n if (!item) return;\n delay(() => {\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const cancelConfirm = () => {\n delay(() => {\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n function confirmSelect(index) {\n return function() {\n selectedConfirm.set(index);\n if (index === 0) {\n confirmUse();\n return;\n }\n cancelConfirm();\n }\n }\n\n const confirmControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(-1);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (!confirmOpen()) return;\n confirmSelect(selectedConfirm())();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (!confirmOpen()) return;\n cancelConfirm();\n }\n }\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (confirmOpen()) {\n confirmSelect(selectedConfirm())();\n return;\n }\n requestUseItem(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (confirmOpen()) {\n cancelConfirm();\n return;\n }\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n clampSelection();\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"items-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/items-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">Items</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n @if (currentItem) {\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">{currentItem()?.name}</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">{currentItem()?.description || \"\"}</div>\n </div>\n </div>\n </div>\n }\n </div>\n \n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of tabs) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((item,index) of filteredItems) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n class={{disabled: !item.usable}}\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n </div>\n <span>{item.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">x{item.quantity ?? 1}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n @if (confirmOpen) {\n <div class=\"rpg-ui-menu-confirm\">\n <div class=\"rpg-ui-menu-confirm-card\">\n <div class=\"rpg-ui-menu-confirm-title\">Use {confirmItem()?.name}?</div>\n <Navigation tabindex={selectedConfirm} controls={confirmControls}>\n <div class=\"rpg-ui-menu-confirm-actions\">\n @for ((option,index) of confirmOptions) {\n <button\n class=\"rpg-ui-menu-confirm-btn\"\n class={{\"rpg-ui-menu-confirm-btn-secondary\": option.id === \"cancel\"}}\n data-selected={selectedConfirm() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={confirmSelect(index)}\n >{option.label}</button>\n }\n </div>\n </Navigation>\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedItem = signal(0);\n const selectedTab = signal(0);\n const selectedConfirm = signal(0);\n const confirmOpen = signal(false);\n const confirmItem = signal(null);\n\n const { data, onInteraction, onBack } = defineProps();\n\n const items = computed(() => data().items);\n\n const tabs = [\n { id: \"item\", label: \"Items\" },\n { id: \"weapon\", label: \"Weapons\" },\n { id: \"armor\", label: \"Armor\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeItems = computed(() => {\n const value = resolveProp(items);\n return Array.isArray(value) ? value : [];\n });\n\n const filteredItems = computed(() => {\n const items = safeItems();\n const tab = tabs[selectedTab()];\n if (!tab) return [];\n return items.filter((item) => item.type === tab.id && (item.quantity ?? 1) > 0);\n });\n\n const confirmOptions = [\n { id: \"use\", label: \"Use\" },\n { id: \"cancel\", label: \"Cancel\" }\n ];\n\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, \"wrap\");\n const navConfirm = createTabindexNavigator(selectedConfirm, { count: () => confirmOptions.length }, \"wrap\");\n const currentItem = computed(() => filteredItems()[selectedItem()]);\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const clampSelection = () => {\n const count = filteredItems().length;\n if (count === 0) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n };\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n requestUseItem(index);\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedItem.set(0);\n selectedTab.set(index);\n }\n }\n\n const useItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n };\n\n const requestUseItem = (index) => {\n const item = filteredItems()[index];\n if (!item || !item.usable) return;\n if (item.consumable) {\n confirmItem.set(item);\n confirmOpen.set(true);\n selectedConfirm.set(0);\n return;\n }\n useItem(index);\n };\n\n const confirmUse = () => {\n const item = confirmItem();\n if (!item) return;\n delay(() => {\n if (onInteraction) onInteraction(\"useItem\", { id: item.id });\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n const cancelConfirm = () => {\n delay(() => {\n confirmOpen.set(false);\n confirmItem.set(null);\n });\n };\n\n function confirmSelect(index) {\n return function() {\n selectedConfirm.set(index);\n if (index === 0) {\n confirmUse();\n return;\n }\n cancelConfirm();\n }\n }\n\n const confirmControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(-1);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (!confirmOpen()) return;\n navConfirm.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (!confirmOpen()) return;\n confirmSelect(selectedConfirm())();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (!confirmOpen()) return;\n cancelConfirm();\n }\n }\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (confirmOpen()) {\n return;\n }\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (confirmOpen()) {\n confirmSelect(selectedConfirm())();\n return;\n }\n requestUseItem(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (confirmOpen()) {\n cancelConfirm();\n return;\n }\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n clampSelection();\n</script>\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { inject } from "../../../core/inject.js";
|
|
2
2
|
import { getEntityProp } from "../../../utils/getEntityProp.js";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
3
|
+
import __ce_component$1 from "../save-load.ce.js";
|
|
4
|
+
import __ce_component$2 from "./items-menu.ce.js";
|
|
5
|
+
import __ce_component$3 from "./skills-menu.ce.js";
|
|
6
|
+
import __ce_component$4 from "./equip-menu.ce.js";
|
|
7
|
+
import __ce_component$5 from "./options-menu.ce.js";
|
|
8
|
+
import __ce_component$6 from "./exit-menu.ce.js";
|
|
9
9
|
import { RpgClientEngine } from "../../../RpgClientEngine.js";
|
|
10
10
|
import { DOMContainer, DOMElement, computed, cond, effect, h, loop, mount, signal, useDefineProps, useProps } from "canvasengine";
|
|
11
11
|
import { delay } from "@rpgjs/common";
|
|
@@ -359,22 +359,22 @@ function component($$props) {
|
|
|
359
359
|
textContent: param.value
|
|
360
360
|
})])))
|
|
361
361
|
])),
|
|
362
|
-
cond(computed(() => view() === "items"), () => h(
|
|
362
|
+
cond(computed(() => view() === "items"), () => h(__ce_component$2, {
|
|
363
363
|
data,
|
|
364
364
|
onInteraction,
|
|
365
365
|
onBack: goBack
|
|
366
366
|
})),
|
|
367
|
-
cond(computed(() => view() === "skills"), () => h(
|
|
367
|
+
cond(computed(() => view() === "skills"), () => h(__ce_component$3, {
|
|
368
368
|
data,
|
|
369
369
|
onBack: goBack
|
|
370
370
|
})),
|
|
371
|
-
cond(computed(() => view() === "equip"), () => h(
|
|
371
|
+
cond(computed(() => view() === "equip"), () => h(__ce_component$4, {
|
|
372
372
|
data,
|
|
373
373
|
onInteraction,
|
|
374
374
|
onBack: goBack
|
|
375
375
|
})),
|
|
376
|
-
cond(computed(() => view() === "options"), () => h(
|
|
377
|
-
cond(computed(() => view() === "exit"), () => h(
|
|
376
|
+
cond(computed(() => view() === "options"), () => h(__ce_component$5, { onBack: goBack })),
|
|
377
|
+
cond(computed(() => view() === "exit"), () => h(__ce_component$6, {
|
|
378
378
|
onConfirm: confirmExit,
|
|
379
379
|
onBack: goBack
|
|
380
380
|
}))
|
|
@@ -387,12 +387,13 @@ function component($$props) {
|
|
|
387
387
|
}), h(DOMElement, {
|
|
388
388
|
element: "div",
|
|
389
389
|
attrs: { class: "rpg-ui-main-menu-overlay-content" }
|
|
390
|
-
}, h(
|
|
390
|
+
}, h(__ce_component$1, {
|
|
391
391
|
data: saveLoadData,
|
|
392
392
|
onFinish: closeSaveOverlay
|
|
393
393
|
}))]))]));
|
|
394
394
|
}
|
|
395
|
+
var __ce_component = component;
|
|
395
396
|
//#endregion
|
|
396
|
-
export {
|
|
397
|
+
export { __ce_component as default };
|
|
397
398
|
|
|
398
399
|
//# sourceMappingURL=main-menu.ce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/main-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={menuControls}>\n <div class=\"rpg-ui-main-menu rpg-anim-fade-in\">\n <div class=\"rpg-ui-main-menu-layout\">\n <div class=\"rpg-ui-main-menu-left rpg-ui-menu rpg-ui-panel\">\n <div class=\"rpg-ui-menu-header\">Menu</div>\n <div class=\"rpg-ui-main-menu-list\">\n @for ((entry,index) of menuEntries()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isMenuDisabled(entry)}}\n data-selected={selectedMenu() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectMenu(index)}\n >{entry.label}</div>\n }\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-right\">\n @if (view() === \"menu\") {\n <div class=\"rpg-ui-panel\">\n <div class=\"rpg-ui-main-menu-section-title\">Status</div>\n <div class=\"rpg-ui-main-menu-status-card\">\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Level</div>\n <div class=\"rpg-ui-main-menu-status-value\">{level()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Gold</div>\n <div class=\"rpg-ui-main-menu-status-value\">{gold()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">HP {hp()}/{hpMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill hp\" style={{width: hpPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">SP {sp()}/{spMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill sp\" style={{width: spPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\" style={{gridColumn: \"span 2\"}}>\n <div class=\"rpg-ui-main-menu-status-label\">EXP {exp()}/{expForNextlevel()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill exp\" style={{width: expPercent}}></div>\n </div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-section-title\">Parameters</div>\n <div class=\"rpg-ui-main-menu-params\">\n @for ((param,index) of paramsList) {\n <div class=\"rpg-ui-main-menu-param\">\n <span>{param.label}</span>\n <span>{param.value}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (view() === \"items\") {\n <ItemsMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"skills\") {\n <SkillsMenu data={data} onBack={goBack} />\n }\n @if (view() === \"equip\") {\n <EquipMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"options\") {\n <OptionsMenu onBack={goBack} />\n }\n @if (view() === \"exit\") {\n <ExitMenu onConfirm={confirmExit} onBack={goBack} />\n }\n </div>\n </div>\n @if (saveOverlay) {\n <div class=\"rpg-ui-main-menu-overlay\">\n <div class=\"rpg-ui-main-menu-overlay-backdrop\"></div>\n <div class=\"rpg-ui-main-menu-overlay-content\">\n <SaveLoadComponent\n data={saveLoadData}\n onFinish={closeSaveOverlay}\n />\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import SaveLoadComponent from \"../save-load.ce\";\n import ItemsMenu from \"./items-menu.ce\";\n import SkillsMenu from \"./skills-menu.ce\";\n import EquipMenu from \"./equip-menu.ce\";\n import OptionsMenu from \"./options-menu.ce\";\n import ExitMenu from \"./exit-menu.ce\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer;\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { data, onFinish, onInteraction } = defineProps();\n const { menus, items, skills, equips, saveLoad } = data();\n\n const defaultMenus = [\n { id: \"items\", label: \"Items\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"equip\", label: \"Equip\" },\n { id: \"options\", label: \"Options\" },\n { id: \"save\", label: \"Save\" },\n { id: \"exit\", label: \"Exit\" }\n ];\n\n const menuEntries = computed(() => {\n if (menus && Array.isArray(menus) && menus.length) return menus;\n return defaultMenus;\n });\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const saveLoadData = computed(() => resolveProp(saveLoad) || {});\n const saveLoadMode = computed(() => saveLoadData().mode || \"load\");\n const saveLoadSlots = computed(() => saveLoadData().slots || []);\n const saveLoadCanSave = computed(() => saveLoadData().canSave !== false);\n\n const isMenuDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n if (entry.id === \"save\" && !saveLoadCanSave()) return true;\n return false;\n };\n\n const selectedMenu = signal(0);\n const view = signal(\"menu\");\n const saveOverlay = signal(false);\n\n const selectableIndexes = computed(() => {\n const entries = menuEntries();\n return entries\n .map((entry, index) => (isMenuDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n if (!available.includes(current)) {\n selectedMenu.set(available[0]);\n }\n });\n\n const moveMenu = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedMenu.set(available[nextIndex]);\n };\n\n function selectMenu(index) {\n return function() {\n selectedMenu.set(index);\n openMenu();\n }\n }\n\n const openMenu = () => {\n const entry = menuEntries()[selectedMenu()];\n if (!entry || isMenuDisabled(entry)) return;\n if (entry.id === \"save\") {\n saveOverlay.set(true);\n return;\n }\n if (entry.id === \"exit\") {\n view.set(\"exit\");\n return;\n }\n view.set(entry.id);\n };\n\n const goBack = () => {\n delay(() => {\n view.set(\"menu\");\n });\n };\n\n const closeSaveOverlay = () => {\n delay(() => {\n saveOverlay.set(false);\n view.set(\"menu\");\n });\n };\n\n const confirmExit = () => {\n if (onInteraction) onInteraction(\"exit\");\n };\n\n const hp = getEntityProp(currentPlayer, \"hp\");\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\");\n const sp = getEntityProp(currentPlayer, \"sp\");\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\");\n const level = getEntityProp(currentPlayer, \"level\");\n const exp = getEntityProp(currentPlayer, \"exp\");\n const gold = getEntityProp(currentPlayer, \"gold\");\n const expForNextlevel = computed(() => data().expForNextlevel || 0);\n const hpPercent = computed(() => {\n const max = hpMax() || 1;\n return `${Math.max(0, Math.min(100, (hp() / max) * 100))}%`;\n });\n const spPercent = computed(() => {\n const max = spMax() || 1;\n return `${Math.max(0, Math.min(100, (sp() / max) * 100))}%`;\n });\n const expPercent = computed(() => {\n const max = expForNextlevel() || 1;\n return `${Math.max(0, Math.min(100, (exp() / max) * 100))}%`;\n });\n\n const paramsList = computed(() => {\n return [\n { label: \"ATK\", value: data().playerStats.atk },\n { label: \"PDEF\", value: data().playerStats.pdef },\n { label: \"SDEF\", value: data().playerStats.sdef },\n { label: \"STR\", value: data().playerStats.str },\n { label: \"DEX\", value: data().playerStats.dex },\n { label: \"INT\", value: data().playerStats.int },\n { label: \"AGI\", value: data().playerStats.agi }\n ]\n }\n\n const menuControls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n openMenu();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") {\n goBack();\n return;\n }\n onFinish()\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n engine.gamePause.set(true);\n return () => {\n delay(() => {\n engine.stopProcessingInput = false;\n engine.gamePause.set(false);\n });\n }\n });\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/main-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={menuControls}>\n <div class=\"rpg-ui-main-menu rpg-anim-fade-in\">\n <div class=\"rpg-ui-main-menu-layout\">\n <div class=\"rpg-ui-main-menu-left rpg-ui-menu rpg-ui-panel\">\n <div class=\"rpg-ui-menu-header\">Menu</div>\n <div class=\"rpg-ui-main-menu-list\">\n @for ((entry,index) of menuEntries()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isMenuDisabled(entry)}}\n data-selected={selectedMenu() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectMenu(index)}\n >{entry.label}</div>\n }\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-right\">\n @if (view() === \"menu\") {\n <div class=\"rpg-ui-panel\">\n <div class=\"rpg-ui-main-menu-section-title\">Status</div>\n <div class=\"rpg-ui-main-menu-status-card\">\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Level</div>\n <div class=\"rpg-ui-main-menu-status-value\">{level()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">Gold</div>\n <div class=\"rpg-ui-main-menu-status-value\">{gold()}</div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">HP {hp()}/{hpMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill hp\" style={{width: hpPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\">\n <div class=\"rpg-ui-main-menu-status-label\">SP {sp()}/{spMax()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill sp\" style={{width: spPercent}}></div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-status-block\" style={{gridColumn: \"span 2\"}}>\n <div class=\"rpg-ui-main-menu-status-label\">EXP {exp()}/{expForNextlevel()}</div>\n <div class=\"rpg-ui-main-menu-status-bar\">\n <div class=\"rpg-ui-main-menu-status-bar-fill exp\" style={{width: expPercent}}></div>\n </div>\n </div>\n </div>\n <div class=\"rpg-ui-main-menu-section-title\">Parameters</div>\n <div class=\"rpg-ui-main-menu-params\">\n @for ((param,index) of paramsList) {\n <div class=\"rpg-ui-main-menu-param\">\n <span>{param.label}</span>\n <span>{param.value}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (view() === \"items\") {\n <ItemsMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"skills\") {\n <SkillsMenu data={data} onBack={goBack} />\n }\n @if (view() === \"equip\") {\n <EquipMenu data={data} onInteraction={onInteraction} onBack={goBack} />\n }\n @if (view() === \"options\") {\n <OptionsMenu onBack={goBack} />\n }\n @if (view() === \"exit\") {\n <ExitMenu onConfirm={confirmExit} onBack={goBack} />\n }\n </div>\n </div>\n @if (saveOverlay) {\n <div class=\"rpg-ui-main-menu-overlay\">\n <div class=\"rpg-ui-main-menu-overlay-backdrop\"></div>\n <div class=\"rpg-ui-main-menu-overlay-content\">\n <SaveLoadComponent\n data={saveLoadData}\n onFinish={closeSaveOverlay}\n />\n </div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import SaveLoadComponent from \"../save-load.ce\";\n import ItemsMenu from \"./items-menu.ce\";\n import SkillsMenu from \"./skills-menu.ce\";\n import EquipMenu from \"./equip-menu.ce\";\n import OptionsMenu from \"./options-menu.ce\";\n import ExitMenu from \"./exit-menu.ce\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer;\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { data, onFinish, onInteraction } = defineProps();\n const { menus, items, skills, equips, saveLoad } = data();\n\n const defaultMenus = [\n { id: \"items\", label: \"Items\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"equip\", label: \"Equip\" },\n { id: \"options\", label: \"Options\" },\n { id: \"save\", label: \"Save\" },\n { id: \"exit\", label: \"Exit\" }\n ];\n\n const menuEntries = computed(() => {\n if (menus && Array.isArray(menus) && menus.length) return menus;\n return defaultMenus;\n });\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const saveLoadData = computed(() => resolveProp(saveLoad) || {});\n const saveLoadMode = computed(() => saveLoadData().mode || \"load\");\n const saveLoadSlots = computed(() => saveLoadData().slots || []);\n const saveLoadCanSave = computed(() => saveLoadData().canSave !== false);\n\n const isMenuDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n if (entry.id === \"save\" && !saveLoadCanSave()) return true;\n return false;\n };\n\n const selectedMenu = signal(0);\n const view = signal(\"menu\");\n const saveOverlay = signal(false);\n\n const selectableIndexes = computed(() => {\n const entries = menuEntries();\n return entries\n .map((entry, index) => (isMenuDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n if (!available.includes(current)) {\n selectedMenu.set(available[0]);\n }\n });\n\n const moveMenu = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedMenu();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedMenu.set(available[nextIndex]);\n };\n\n function selectMenu(index) {\n return function() {\n selectedMenu.set(index);\n openMenu();\n }\n }\n\n const openMenu = () => {\n const entry = menuEntries()[selectedMenu()];\n if (!entry || isMenuDisabled(entry)) return;\n if (entry.id === \"save\") {\n saveOverlay.set(true);\n return;\n }\n if (entry.id === \"exit\") {\n view.set(\"exit\");\n return;\n }\n view.set(entry.id);\n };\n\n const goBack = () => {\n delay(() => {\n view.set(\"menu\");\n });\n };\n\n const closeSaveOverlay = () => {\n delay(() => {\n saveOverlay.set(false);\n view.set(\"menu\");\n });\n };\n\n const confirmExit = () => {\n if (onInteraction) onInteraction(\"exit\");\n };\n\n const hp = getEntityProp(currentPlayer, \"hp\");\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\");\n const sp = getEntityProp(currentPlayer, \"sp\");\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\");\n const level = getEntityProp(currentPlayer, \"level\");\n const exp = getEntityProp(currentPlayer, \"exp\");\n const gold = getEntityProp(currentPlayer, \"gold\");\n const expForNextlevel = computed(() => data().expForNextlevel || 0);\n const hpPercent = computed(() => {\n const max = hpMax() || 1;\n return `${Math.max(0, Math.min(100, (hp() / max) * 100))}%`;\n });\n const spPercent = computed(() => {\n const max = spMax() || 1;\n return `${Math.max(0, Math.min(100, (sp() / max) * 100))}%`;\n });\n const expPercent = computed(() => {\n const max = expForNextlevel() || 1;\n return `${Math.max(0, Math.min(100, (exp() / max) * 100))}%`;\n });\n\n const paramsList = computed(() => {\n return [\n { label: \"ATK\", value: data().playerStats.atk },\n { label: \"PDEF\", value: data().playerStats.pdef },\n { label: \"SDEF\", value: data().playerStats.sdef },\n { label: \"STR\", value: data().playerStats.str },\n { label: \"DEX\", value: data().playerStats.dex },\n { label: \"INT\", value: data().playerStats.int },\n { label: \"AGI\", value: data().playerStats.agi }\n ]\n }\n\n const menuControls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n moveMenu(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") return;\n openMenu();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (saveOverlay()) return;\n if (view() !== \"menu\") {\n goBack();\n return;\n }\n onFinish()\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n engine.gamePause.set(true);\n return () => {\n delay(() => {\n engine.stopProcessingInput = false;\n engine.gamePause.set(false);\n });\n }\n });\n</script>\n"],"mappings":"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"}
|
|
@@ -42,7 +42,8 @@ function component($$props) {
|
|
|
42
42
|
textContent: "Configure your preferences here.\n "
|
|
43
43
|
})]))]));
|
|
44
44
|
}
|
|
45
|
+
var __ce_component = component;
|
|
45
46
|
//#endregion
|
|
46
|
-
export {
|
|
47
|
+
export { __ce_component as default };
|
|
47
48
|
|
|
48
49
|
//# sourceMappingURL=options-menu.ce.js.map
|
|
@@ -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,
|
|
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;AACJ,UAAA,QAAA;CACP,MAAG,cAAA,eAAA,QAAA;0BACK,OAAA,gBAAA,CAAA,aAAA;CAEd,MAAC,EAAM,WAAA,aAAA;AAcC,QADY,EAAA,cAAgB;EAAA,OAAA;EAAA,QAAA;EAAA,UAZvB,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;AAErB,SAAM,OACN,SAAA;;;GAGN,SAAM,EACF,SAAQ,MACX;GACJ,CACmC;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACxB;;AAGN,IAAM,iBAEN"}
|
|
@@ -95,7 +95,8 @@ function component($$props) {
|
|
|
95
95
|
textContent: "SP " + skill.spCost
|
|
96
96
|
})]))))])]));
|
|
97
97
|
}
|
|
98
|
+
var __ce_component = component;
|
|
98
99
|
//#endregion
|
|
99
|
-
export {
|
|
100
|
+
export { __ce_component as default };
|
|
100
101
|
|
|
101
102
|
//# sourceMappingURL=skills-menu.ce.js.map
|
|
@@ -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,
|
|
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;AACV,UAAM,QAAA;CACrB,MAAM,cAAW,eAAA,QAAA;CAEzB,MAAM,mBADU,OAAA,gBACC,CAAA,aAAA;CACjB,MAAM,gBAAgB,OAAM,EAAG;CAC/B,MAAM,EAAE,MAAM,WAAG,aAAqB;CACtC,MAAM,SAAS,eAAY,MAAM,CAAA,OAAU;CAC3C,MAAM,MAAM,wBAAa,eAAA,EAAA,aAAA,QAAA,CAAA,QAAA,EAAA,OAAA;CACzB,MAAM,eAAe,eAAc,QAAO,CAAA,eAAiB,EAAA;CAC3D,SAAS,YAAY,OAAO;AACxB,SAAO,WAAY;AACf,iBAAc,IAAI,MAAE;;;CAG5B,MAAM,WAAW,OAAO;EACpB,IAAI;GACA,QAAQ;GACR,MAAM,iBAAc;GACpB,UAAS;GACT,UAAK;AACJ,QAAA,KAAA,GAAA;;;EAGR,MAAM;GACH,QAAS;GACT,MAAS,iBAAkB;GAC3B,UAAS;;AAEH,QAAM,KAAG,EAAA;;;EAGf,QAAM;GACN,MAAQ,iBAAiB;GACzB,UAAc;eAEF,SAAA;;;EAGZ,SAAS,EACL,SAAO,MACV;EACJ,CAAC;QACE,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yDAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0CAAA;EAAA,EAAA,KAAA,oBAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA,EAAA,SAAA,OAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA,eAAA,cAAA,EAAA,KAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA,eAAA,cAAA,EAAA,eAAA,GAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kEAAA;EAAA,EAAA,EAAA,YAAA;EAAA,UAAA;EAAA;EAAA,EAAA,KAAA,SAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,iBAAA,eAAA,eAAA,KAAA,QAAA,SAAA,QAAA;GAAA,UAAA;GAAA,OAAA,YAAA,MAAA;GAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,aAAA,MAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uBAAA;EAAA,aAAA,QAAA,MAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAIE,IAAM,iBAEF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { inject } from "../../../core/inject.js";
|
|
2
2
|
import { RpgClientEngine } from "../../../RpgClientEngine.js";
|
|
3
|
-
import
|
|
3
|
+
import __ce_component from "./mobile.ce.js";
|
|
4
4
|
import { signal } from "canvasengine";
|
|
5
5
|
//#region src/components/gui/mobile/index.ts
|
|
6
6
|
function isMobile() {
|
|
@@ -8,7 +8,7 @@ function isMobile() {
|
|
|
8
8
|
}
|
|
9
9
|
var withMobile = () => ({ gui: [{
|
|
10
10
|
id: "mobile-gui",
|
|
11
|
-
component,
|
|
11
|
+
component: __ce_component,
|
|
12
12
|
autoDisplay: true,
|
|
13
13
|
dependencies: () => {
|
|
14
14
|
const engine = inject(RpgClientEngine);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/gui/mobile/index.ts"],"sourcesContent":["import { inject } from \"../../../core/inject\";\nimport { RpgClientEngine } from \"../../../RpgClientEngine\";\nimport MobileGui from \"./mobile.ce\";\nimport { signal } from \"canvasengine\";\n\nfunction isMobile() {\n return /Android|iPhone|iPad|iPod|Windows Phone|webOS|BlackBerry/i.test(navigator.userAgent);\n }\n\nexport const withMobile = () => (\n {\n gui: [\n {\n id: 'mobile-gui',\n component: MobileGui,\n autoDisplay: true,\n dependencies: () => {\n const engine = inject(RpgClientEngine);\n return [signal(isMobile() ||undefined), engine.controlsReady]\n }\n }\n ]\n }\n)"],"mappings":";;;;;AAKA,SAAS,WAAW;AAChB,QAAO,2DAA2D,KAAK,UAAU,UAAU;;AAG/F,IAAa,oBACT,EACI,KAAK,CACD;CACI,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/gui/mobile/index.ts"],"sourcesContent":["import { inject } from \"../../../core/inject\";\nimport { RpgClientEngine } from \"../../../RpgClientEngine\";\nimport MobileGui from \"./mobile.ce\";\nimport { signal } from \"canvasengine\";\n\nfunction isMobile() {\n return /Android|iPhone|iPad|iPod|Windows Phone|webOS|BlackBerry/i.test(navigator.userAgent);\n }\n\nexport const withMobile = () => (\n {\n gui: [\n {\n id: 'mobile-gui',\n component: MobileGui,\n autoDisplay: true,\n dependencies: () => {\n const engine = inject(RpgClientEngine);\n return [signal(isMobile() ||undefined), engine.controlsReady]\n }\n }\n ]\n }\n)"],"mappings":";;;;;AAKA,SAAS,WAAW;AAChB,QAAO,2DAA2D,KAAK,UAAU,UAAU;;AAG/F,IAAa,oBACT,EACI,KAAK,CACD;CACI,IAAI;CACJ,WAAW;CACX,aAAa;CACb,oBAAoB;EAChB,MAAM,SAAS,OAAO,gBAAgB;AACtC,SAAO,CAAC,OAAO,UAAU,IAAG,KAAA,EAAU,EAAE,OAAO,cAAc;;CAEpE,CACJ,EACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobile.ce.js","names":[],"sources":["../../../../src/components/gui/mobile/mobile.ce"],"sourcesContent":["<Container justifyContent=\"space-between\" alignItems=\"flex-end\" width=\"100%\" height=\"100%\">\n <!-- Gamepad buttons A and B (left side) -->\n <Container justifyContent=\"flex-start\" alignItems=\"flex-end\" gap={20}>\n <Container display=\"flex\" direction=\"column\" gap={20} margin={50}>\n <!-- Button B (top) -->\n \n <!-- Button A (bottom) -->\n <Button \n text=\"A\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"action\"\n style={{\n backgroundColor: {\n normal: \"#2ecc71\",\n hover: \"#27ae60\",\n pressed: \"#229954\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n <Button \n text=\"B\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"back\"\n style={{\n backgroundColor: {\n normal: \"#e74c3c\",\n hover: \"#c0392b\",\n pressed: \"#a93226\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n </Container>\n </Container>\n \n <Container margin={100} alignItems=\"flex-end\">\n <Container>\n <Joystick \n controls={controlsInstance}\n outerColor=\"#34495e\"\n innerColor=\"#3498db\"\n />\n </Container>\n </Container>\n</Container>\n\n<script>\n import { signal, mount } from 'canvasengine'\n import { Button } from 'canvasengine'\n import { inject } from '../../../core/inject'\n import { RpgClientEngine } from '../../../RpgClientEngine'\n import { Direction } from '@rpgjs/common'\n\n\n const controlsInstance = signal(null)\n\n mount((element) => {\n const control = inject('KeyboardControls')\n controlsInstance.set(control)\n })\n</script>"],"mappings":";;;AASM,
|
|
1
|
+
{"version":3,"file":"mobile.ce.js","names":[],"sources":["../../../../src/components/gui/mobile/mobile.ce"],"sourcesContent":["<Container justifyContent=\"space-between\" alignItems=\"flex-end\" width=\"100%\" height=\"100%\">\n <!-- Gamepad buttons A and B (left side) -->\n <Container justifyContent=\"flex-start\" alignItems=\"flex-end\" gap={20}>\n <Container display=\"flex\" direction=\"column\" gap={20} margin={50}>\n <!-- Button B (top) -->\n \n <!-- Button A (bottom) -->\n <Button \n text=\"A\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"action\"\n style={{\n backgroundColor: {\n normal: \"#2ecc71\",\n hover: \"#27ae60\",\n pressed: \"#229954\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n <Button \n text=\"B\"\n shape=\"circle\"\n width={70}\n height={70}\n controls={controlsInstance}\n controlName=\"back\"\n style={{\n backgroundColor: {\n normal: \"#e74c3c\",\n hover: \"#c0392b\",\n pressed: \"#a93226\",\n disabled: \"#7f8c8d\"\n },\n text: {\n fontSize: 24,\n fontFamily: \"Arial Bold\",\n color: \"#ffffff\"\n }\n }}\n />\n\n </Container>\n </Container>\n \n <Container margin={100} alignItems=\"flex-end\">\n <Container>\n <Joystick \n controls={controlsInstance}\n outerColor=\"#34495e\"\n innerColor=\"#3498db\"\n />\n </Container>\n </Container>\n</Container>\n\n<script>\n import { signal, mount } from 'canvasengine'\n import { Button } from 'canvasengine'\n import { inject } from '../../../core/inject'\n import { RpgClientEngine } from '../../../RpgClientEngine'\n import { Direction } from '@rpgjs/common'\n\n\n const controlsInstance = signal(null)\n\n mount((element) => {\n const control = inject('KeyboardControls')\n controlsInstance.set(control)\n })\n</script>"],"mappings":";;;AASM,SAAS,UAAQ,SAAM;AACN,UAAE,QAAA;AACC,gBAAA,QAAA;CAClB,MAAM,mBAAY,OAAA,KAAgB;AAC1C,QAAO,YAAS;EACZ,MAAM,UAAM,OAAO,mBAAA;AACnB,mBAAgB,IAAA,QAAA;GAClB;AAEM,QADY,EAAE,WAAW;EAAA,gBAAO;EAAA,YAAA;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,CAAA,EAAA,WAAA;EAAA,gBAAA;EAAA,YAAA;EAAA,KAAA;EAAA,EAAA,EAAA,WAAA;EAAA,SAAA;EAAA,WAAA;EAAA,KAAA;EAAA,QAAA;EAAA,EAAA,CAAA,EAAA,QAAA;EAAA,MAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,OAAA;GAAA,iBAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,UAAA;IAAA;GAAA,MAAA;IAAA,UAAA;IAAA,YAAA;IAAA,OAAA;IAAA;GAAA;EAAA,CAAA,EAAA,EAAA,QAAA;EAAA,MAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,OAAA;GAAA,iBAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,UAAA;IAAA;GAAA,MAAA;IAAA,UAAA;IAAA,YAAA;IAAA,OAAA;IAAA;GAAA;EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,WAAA;EAAA,QAAA;EAAA,YAAA;EAAA,EAAA,EAAA,WAAA,MAAA,EAAA,UAAA;EAAA,UAAA;EAAA,YAAA;EAAA,YAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CACpB;;AAGd,IAAM,iBAEF"}
|
|
@@ -2,11 +2,14 @@ import { inject } from "../../../core/inject.js";
|
|
|
2
2
|
import { RpgClientEngine } from "../../../RpgClientEngine.js";
|
|
3
3
|
import { DOMContainer, DOMElement, DOMSprite, computed, cond, effect, h, loop, useDefineProps, useProps } from "canvasengine";
|
|
4
4
|
//#region src/components/gui/notification/notification.ce
|
|
5
|
-
if (typeof document !== "undefined"
|
|
6
|
-
|
|
7
|
-
styleElement
|
|
5
|
+
if (typeof document !== "undefined") {
|
|
6
|
+
let styleElement = document.getElementById("ce-style--home-runner-work-RPG-JS-RPG-JS-packages-client-src-components-gui-notification-notification-ce");
|
|
7
|
+
if (!styleElement) {
|
|
8
|
+
styleElement = document.createElement("style");
|
|
9
|
+
styleElement.id = "ce-style--home-runner-work-RPG-JS-RPG-JS-packages-client-src-components-gui-notification-notification-ce";
|
|
10
|
+
document.head.appendChild(styleElement);
|
|
11
|
+
}
|
|
8
12
|
styleElement.textContent = ".notification {\n pointer-events: none !important;\n }";
|
|
9
|
-
document.head.appendChild(styleElement);
|
|
10
13
|
}
|
|
11
14
|
function component($$props) {
|
|
12
15
|
useProps($$props);
|
|
@@ -52,7 +55,8 @@ function component($$props) {
|
|
|
52
55
|
textContent: notif.message
|
|
53
56
|
})]))));
|
|
54
57
|
}
|
|
58
|
+
var __ce_component = component;
|
|
55
59
|
//#endregion
|
|
56
|
-
export {
|
|
60
|
+
export { __ce_component as default };
|
|
57
61
|
|
|
58
62
|
//# sourceMappingURL=notification.ce.js.map
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"notification.ce.js","names":[],"sources":["../../../../src/components/gui/notification/notification.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" zIndex={100} class=\"notification\">\n <div class=\"rpg-ui-notifications\">\n @for ((notif,index) of notifications) {\n <div\n class=\"rpg-ui-notification\"\n data-type={notif.type || \"info\"}\n style={notificationStyle(notif)}\n >\n @if (notif.icon) {\n <div class=\"rpg-ui-notification-icon\">\n <DOMSprite sheet={iconSheet(notif.icon)} />\n </div>\n }\n <div class=\"rpg-ui-notification-message\">{notif.message}</div>\n </div>\n }\n </div>\n</DOMContainer>\n\n<style>\n .notification {\n pointer-events: none !important;\n }\n</style>\n\n<script>\n import { effect, computed } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const notifications = computed(() => engine.notificationManager.stack());\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n });\n\n effect(() => {\n const list = notifications();\n const rowHeight = 68;\n list.forEach((notif, index) => {\n notif.layoutY.set(index * rowHeight);\n });\n });\n\n const notificationStyle = (notif) => ({\n opacity: notif.opacity(),\n transform: `translateY(${notif.layoutY() + notif.offset()}px)`\n });\n</script>\n"],"mappings":";;;;AAUA,IAAI,OAAO,aAAa,aAAW;CACjC,IAAI,eAAe,SAAI,eAAA,2GAAA;AACvB,KAAI,CAAC,cAAS;AACZ,iBAAa,SAAW,cAAO,QAAa;AAC5C,eAAa,KAAA;AACb,WAAI,KAAA,YAAA,aAAA;;AAEN,cAAY,cAAA;;AAGT,SAAA,UAAa,SAAA;AACK,UAAO,QAAS;AACnC,gBAAA,QAAA;CACG,MAAA,SAAA,OAAA,gBAAA;;CAEP,MAAC,aAAM,YAAA;EACH,YAAS,OAAQ,eAAiB,OAAA;EAClC,SAAS;EACZ;;EAEG,MAAM,OAAO,eAAS;EACtB,MAAM,YAAA;;AAEN,SAAM,QAAY,IAAC,QAAW,UAAC;IAC7B;GACJ;CACF,MAAM,qBAAA,WAAA;;EAEF,WAAW,cAAE,MAAA,SAAA,GAAA,MAAA,QAAA,CAAA;EAChB;AAEO,QADM,EAAA,cAAc;EAAA,OAAA;EAAA,QAAA;EAAA,QAAA;EAAA,OAAA,EAAA,OAAA,gBAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,wBAAA;EAAA,EAAA,KAAA,gBAAA,OAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,aAAA,eAAA,MAAA,QAAA,OAAA;GAAA,OAAA,eAAA,kBAAA,MAAA,CAAA;GAAA;EAAA,EAAA,CAAA,KAAA,MAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,EAAA,EAAA,WAAA,EAAA,OAAA,eAAA,UAAA,MAAA,KAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA,MAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACR;;AAGd,IAAA,iBAEI"}
|
|
@@ -204,7 +204,8 @@ function component($$props) {
|
|
|
204
204
|
textContent: "Empty Slot"
|
|
205
205
|
}))]))))]));
|
|
206
206
|
}
|
|
207
|
+
var __ce_component = component;
|
|
207
208
|
//#endregion
|
|
208
|
-
export {
|
|
209
|
+
export { __ce_component as default };
|
|
209
210
|
|
|
210
211
|
//# sourceMappingURL=save-load.ce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-load.ce.js","names":[],"sources":["../../../src/components/gui/save-load.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-save-load rpg-anim-fade-in\">\n <div class=\"rpg-ui-save-load-header\">\n <div class=\"rpg-ui-save-load-title\">{title()}</div>\n <div class=\"rpg-ui-save-load-subtitle\">{subtitle()}</div>\n </div>\n <Navigation tabindex={selectedSlot} controls={controls}>\n <div class=\"rpg-ui-save-load-list\">\n @for ((item,displayIndex) of displaySlots) {\n <div\n class=\"rpg-ui-save-load-slot\"\n class={{active: selectedSlot() === displayIndex}}\n tabindex={displayIndex}\n data-slot-index={displayIndex}\n click={selectSlot(displayIndex)}\n >\n <div class=\"rpg-ui-save-load-slot-index\">{item.label}</div>\n @if (item.slot) {\n <div class=\"rpg-ui-save-load-slot-meta\">\n <div class=\"rpg-ui-save-load-slot-line\">Level: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Exp: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Map: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Date: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">Empty Slot</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? \"Save Game\" : \"Load Game\");\n const subtitle = computed(() => data().mode === \"save\"\n ? \"Choose a slot to overwrite or create.\"\n : \"Select a slot to load your progress.\"\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: `Slot ${index + 1}`,\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || \"Auto Save\",\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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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\">Level: {item.slot.level ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Exp: {item.slot.exp ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Map: {item.slot.map ?? \"-\"}</div>\n <div class=\"rpg-ui-save-load-slot-line\">Date: {item.slot.date ?? \"-\"}</div>\n </div>\n }\n @else {\n <div class=\"rpg-ui-save-load-slot-empty\">Empty Slot</div>\n }\n </div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { SaveClientService } from \"../../services/save\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const saveClient = inject(SaveClientService);\n const gui = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const selectedSlot = signal(0);\n const DEFAULT_SLOTS = 4;\n const defaultSlots = () => Array.from({ length: DEFAULT_SLOTS }, () => null);\n const localSlots = signal(defaultSlots());\n\n const { data, onFinish } = defineProps();\n\n const title = computed(() => data().mode === \"save\" ? \"Save Game\" : \"Load Game\");\n const subtitle = computed(() => data().mode === \"save\"\n ? \"Choose a slot to overwrite or create.\"\n : \"Select a slot to load your progress.\"\n );\n\n const slotsValue = computed(() => localSlots());\n const displaySlots = computed(() => {\n const slots = slotsValue();\n const items = slots.map((slot, index) => ({\n kind: \"slot\",\n slot,\n slotIndex: index,\n label: `Slot ${index + 1}`,\n readonly: false\n }));\n if (!data().showAutoSlot) return items;\n const index = typeof data().autoSlotIndex === \"number\" ? data().autoSlotIndex : 0;\n const autoSlot = slots[index] ?? null;\n const readonly = data().mode === \"save\";\n return [\n {\n kind: \"auto\",\n slot: autoSlot,\n slotIndex: index,\n label: data().autoSlotLabel || \"Auto Save\",\n readonly\n },\n ...items\n ];\n });\n const nav = createTabindexNavigator(selectedSlot, { count: () => displaySlots().length }, \"wrap\");\n\n const canSelect = (item) => {\n if (item.readonly) return false;\n if (data().mode === \"load\" && !item.slot) return false;\n return true;\n };\n\n const normalizeSlotValue = (value) => {\n if (!value) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n };\n\n const normalizeSlots = (list) => {\n if (Array.isArray(list)) {\n const length = Math.max(list.length, DEFAULT_SLOTS);\n return Array.from({ length }, (_, index) => normalizeSlotValue(list[index]));\n }\n if (!list || typeof list !== \"object\") {\n return defaultSlots();\n }\n const keys = Object.keys(list).filter((key) => /^\\d+$/.test(key));\n const indices = keys.map((key) => Number(key)).filter((index) => index >= 0);\n const maxIndex = indices.length ? Math.max(...indices) : -1;\n const length = Math.max(maxIndex + 1, DEFAULT_SLOTS);\n const slots = Array.from({ length }, () => null);\n keys.forEach((key) => {\n const index = Number(key);\n if (index < 0 || index >= length) return;\n slots[index] = normalizeSlotValue(list[key]);\n });\n return slots;\n };\n\n const hasProvidedSlots = (list) => {\n if (Array.isArray(list)) return list.length > 0;\n return !!(list && typeof list === \"object\" && Object.keys(list).length > 0);\n };\n\n const refreshSlots = async () => {\n try {\n const list = await saveClient.listSlots();\n localSlots.set(normalizeSlots(list));\n } catch (err) {\n localSlots.set(defaultSlots());\n }\n };\n\n const triggerSelect = async (displayIndex) => {\n const list = displaySlots();\n const item = list[displayIndex];\n if (!item) return;\n if (!canSelect(item)) return;\n const action = data().mode === \"save\" ? \"save\" : \"load\";\n if (action === \"save\") {\n await saveClient.saveSlot(item.slotIndex);\n await refreshSlots();\n }\n if (action === \"load\") {\n await saveClient.loadSlot(item.slotIndex);\n }\n setTimeout(() => {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n gui.hide(PrebuiltGui.TitleScreen);\n }, 50);\n\n };\n\n function selectSlot(index) {\n return function() {\n selectedSlot.set(index);\n triggerSelect(index);\n }\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedSlot());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onFinish) onFinish();\n gui.hide(PrebuiltGui.Save);\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n mount((element) => {\n refreshSlots();\n });\n</script>\n"],"mappings":"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"}
|