@rpgjs/client 5.0.0-beta.2 → 5.0.0-beta.4
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/Map.js +2 -2
- package/dist/Game/Object.d.ts +10 -2
- package/dist/Game/Object.js +56 -26
- package/dist/Game/Object.js.map +1 -1
- package/dist/Gui/Gui.js.map +1 -1
- package/dist/Gui/NotificationManager.js.map +1 -1
- package/dist/RpgClientEngine.d.ts +16 -0
- package/dist/RpgClientEngine.js +53 -6
- package/dist/RpgClientEngine.js.map +1 -1
- package/dist/Sound.js.map +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.127.0}/helpers/decorateMetadata.js +1 -1
- package/dist/components/animations/animation.ce.js +2 -4
- package/dist/components/animations/animation.ce.js.map +1 -1
- package/dist/components/animations/hit.ce.js +17 -24
- package/dist/components/animations/hit.ce.js.map +1 -1
- package/dist/components/character.ce.js +75 -222
- package/dist/components/character.ce.js.map +1 -1
- package/dist/components/dynamics/text.ce.js +14 -25
- package/dist/components/dynamics/text.ce.js.map +1 -1
- package/dist/components/gui/box.ce.js +4 -7
- package/dist/components/gui/box.ce.js.map +1 -1
- package/dist/components/gui/dialogbox/index.ce.js +37 -54
- package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
- package/dist/components/gui/gameover.ce.js +36 -61
- package/dist/components/gui/gameover.ce.js.map +1 -1
- package/dist/components/gui/hud/hud.ce.js +18 -28
- package/dist/components/gui/hud/hud.ce.js.map +1 -1
- package/dist/components/gui/menu/equip-menu.ce.js +108 -163
- package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/exit-menu.ce.js +4 -4
- package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/items-menu.ce.js +47 -66
- package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/main-menu.ce.js +58 -77
- package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/options-menu.ce.js +3 -3
- package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/skills-menu.ce.js +10 -16
- package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
- package/dist/components/gui/mobile/mobile.ce.js +3 -3
- package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
- package/dist/components/gui/notification/notification.ce.js +13 -19
- package/dist/components/gui/notification/notification.ce.js.map +1 -1
- package/dist/components/gui/save-load.ce.js +68 -247
- package/dist/components/gui/save-load.ce.js.map +1 -1
- package/dist/components/gui/shop/shop.ce.js +84 -123
- package/dist/components/gui/shop/shop.ce.js.map +1 -1
- package/dist/components/gui/title-screen.ce.js +38 -65
- package/dist/components/gui/title-screen.ce.js.map +1 -1
- package/dist/components/prebuilt/hp-bar.ce.js +39 -43
- package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
- package/dist/components/prebuilt/light-halo.ce.js +33 -58
- package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
- package/dist/components/scenes/canvas.ce.js +11 -19
- package/dist/components/scenes/canvas.ce.js.map +1 -1
- package/dist/components/scenes/draw-map.ce.js +20 -25
- package/dist/components/scenes/draw-map.ce.js.map +1 -1
- package/dist/components/scenes/event-layer.ce.js +4 -4
- package/dist/components/scenes/event-layer.ce.js.map +1 -1
- package/dist/core/setup.js.map +1 -1
- package/dist/module.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_di@2.9.0/node_modules/@signe/di/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
- package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js +27 -27
- package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
- package/dist/services/keyboardControls.js.map +1 -1
- package/dist/services/mmorpg.js +2 -1
- package/dist/services/mmorpg.js.map +1 -1
- package/package.json +7 -7
- package/src/Game/Object.ts +86 -32
- package/src/RpgClientEngine.ts +83 -12
- package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js +0 -457
- package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js.map +0 -1
|
@@ -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":";;;;;;;AAaM,SAAuB,UAAW,SAAC;AAClB,UAAQ,QAAA;CACvB,MAAM,cAAM,eAAA,QAAA;CACZ,MAAM,SAAS,OAAM,gBAAc;CAC3C,MAAM,aAAa,OAAM,kBAAe;CACxC,MAAM,MAAM,OAAO,OAAO;CAC1B,MAAM,mBAAmB,OAAO,aAAY;CAC5C,MAAM,eAAe,OAAO,EAAE;CAC9B,MAAM,gBAAgB;CACtB,MAAM,qBAAqB,MAAM,KAAI,EAAA,QAAW,eAAa,QAAU,KAAK;CAC5E,MAAM,aAAa,OAAO,cAAO,CAAA;CACjC,MAAM,EAAE,MAAM,aAAU,aAAA;CACxB,MAAM,QAAQ,eAAe,MAAC,CAAA,SAAA,SAAA,cAAA,YAAA;CAC9B,MAAM,WAAW,eAAe,MAAM,CAAC,SAAQ,SACzC,0CACA,uCAAmB;CACzB,MAAM,aAAU,eAAA,YAAA,CAAA;CAChB,MAAM,eAAW,eAAA;EACb,MAAM,QAAA,YAAU;EAChB,MAAK,QAAA,MAAA,KAAA,MAAA,WAAA;GACP,MAAY;;GAEP,WAAA;GACH,OAAS,QAAQ,QAAU;GAC3B,UAAS;GACT,EAAA;AACA,MAAA,CAAA,MAAS,CAAA,aACT,QAAS;EACT,MAAM,QAAG,OAAS,MAAS,CAAC,kBAAU,WAAA,MAAA,CAAA,gBAAA;;EAEtC,MAAM,WAAS,MAAO,CAAA,SAAA;AACtB,SAAM,CACN;GACM,MAAA;;GAEA,WAAa;GACb,OAAA,MAAe,CAAC,iBAAC;GACjB;GACD,EAAA,GAAA,MAEL;;CAEJ,MAAI,MAAM,wBAAuB,cAAiB,EAAA,aAAc,cAAc,CAAA,QAAM,EAAA,OAAA;CACpF,MAAI,aAAe,SAAE;AACjB,MAAI,KAAG,SACH,QAAG;AACP,MAAC,MAAA,CAAA,SAAA,UAAA,CAAA,KAAA,KAAA,QAAA;AAED,SAAM;;CAEV,MAAM,sBAAgB,UAAY;AAC9B,MAAI,CAAA,MACA,QAAI;AACR,MAAI,OAAI,UAAI,SACR,KAAI;AACA,UAAO,KAAK,MAAG,MAAS;UAEzB;AACC,UAAO;;AAGf,SAAI;;CAER,MAAM,kBAAM,SAAA;AACR,MAAI,MAAM,QAAQ,KAAK,EAAC;GACpB,MAAM,SAAQ,KAAA,IAAQ,KAAA,QAAA,cAAA;AACtB,UAAO,MAAC,KAAU,EAAC,QAAK,GAAA,GAAA,UAAA,mBAAA,KAAA,OAAA,CAAA;;AAE5B,MAAI,CAAC,QAAO,OAAA,SAAA,SACR,QAAK,cAAA;EAET,MAAK,OAAA,OAAA,KAAA,KAAA,CAAA,QAAA,QAAA,QAAA,KAAA,IAAA,CAAA;EACL,MAAE,UAAA,KAAA,KAAA,QAAA,OAAA,IAAA,CAAA,CAAA,QAAA,UAAA,SAAA,EAAA;EACF,MAAM,WAAM,QAAA,SAAA,KAAwB,IAAA,GAAA,QAAgB,GAAK;;EAEzD,MAAM,QAAA,MAAa,KAAM,EAAE,QAAC,QAAA,KAAA;AAC5B,OAAI,SAAS,QAAS;GAClB,MAAI,QAAO,OAAU,IAAI;AACzB,OAAA,QAAW,KAAA,SAAA,OACd;;IAED;AACA,SAAO;;CAOX,MAAM,eAAE,YAAA;AACJ,MAAI;GACH,MAAA,OAAA,MAAA,WAAA,WAAA;;WAGM,KAAC;AACJ,cAAU,IAAA,cAAkB,CAAA;;;CAGpC,MAAM,gBAAe,OAAO,iBAAkB;EAE1C,MAAI,OADI,cACJ,CAAA;AACJ,MAAI,CAAA,KACA;AACJ,MAAI,CAAA,UAAM,KAAU,CAChB;EACJ,MAAI,SAAW,MAAG,CAAA,SAAa,SAAS,SAAO;AAC/C,MAAI,WAAK,QAAc;AACnB,SAAI,WAAa,SAAQ,KAAI,UAAA;AAC7B,SAAM,cAAc;;AAExB,MAAI,WAAE,OACF,OAAM,WAAM,SAAA,KAAA,UAAA;;AAGhB,OAAM,SACE,WAAM;AACV,OAAA,KAAS,YAAS,KAAO;AAC5B,OAAA,KAAA,YAAA,YAAA;;;CAGL,SAAQ,WAAI,OAAA;AACR,SAAO,WAAY;AACf,gBAAI,IAAW,MAAI;AACnB,iBAAc,MAAA;;;CAGtB,MAAK,WAAA,OAAA;;GAED,QAAM;GACF,MAAM,iBAAO;GACb,UAAU;GACV,UAAU;AACN,QAAC,KAAA,GAAU;;GAElB;EACD,MAAM;GACF,QAAI;GACJ,MAAA,iBAAA;GACA,UAAU;GACV,UAAU;AACV,QAAA,KAAA,EAAA;;GAEH;EACD,QAAQ;GACJ,MAAI,iBAAS;GACb,UAAM;;;;EAIV,QAAQ;GACJ,MAAM,iBAAY;GAClB,UAAI;AACA,QAAA,SACJ,WAAA;AACJ,QAAA,KAAA,YAAA,KAAA;;GAEA;EACA,SAAQ,EACJ,SAAI,MACP;EACJ,CAAC;AACF,QAAO,YAAY;AACf,gBAAY;GACd;AAEM,QADC,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,aAAA,eAAA,OAAA,CAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,aAAA,eAAA,UAAA,CAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,UAAA;EAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;EAAA,EAAA,KAAA,eAAA,MAAA,iBAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,yBAAA,gBAAA,EAAA,QAAA,cAAA,KAAA,cAAA,EAAA,CAAA;GAAA,UAAA;GAAA,mBAAA;GAAA,OAAA,WAAA,aAAA;GAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA,KAAA;EAAA,CAAA,EAAA,KAAA,KAAA,YAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,8BAAA;EAAA,EAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,YAAA,KAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,UAAA,KAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,UAAA,KAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,aAAA,WAAA,KAAA,KAAA;GAAA,CAAA;EAAA,CAAA,QAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,+BAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACK"}
|
|
@@ -5,25 +5,23 @@ import { DOMContainer, DOMElement, DOMSprite, Navigation, computed, cond, create
|
|
|
5
5
|
function component($$props) {
|
|
6
6
|
useProps($$props);
|
|
7
7
|
const defineProps = useDefineProps($$props);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
var defaultMessage = "Welcome to my shop!";
|
|
26
|
-
var tabs = [
|
|
8
|
+
const engine = inject(RpgClientEngine);
|
|
9
|
+
const currentPlayer = engine.scene.currentPlayer;
|
|
10
|
+
const keyboardControls = engine.globalConfig.keyboardControls;
|
|
11
|
+
const iconSheet = (iconId) => ({
|
|
12
|
+
definition: engine.getSpriteSheet(iconId),
|
|
13
|
+
playing: "default"
|
|
14
|
+
});
|
|
15
|
+
const goldTerm = engine.globalConfig.goldTerm || "G";
|
|
16
|
+
const selectedItem = signal(0);
|
|
17
|
+
const selectedTab = signal(0);
|
|
18
|
+
const tradeMode = signal("buy");
|
|
19
|
+
const tradeView = signal("mode");
|
|
20
|
+
const selectedModeIndex = signal(0);
|
|
21
|
+
const quantity = signal(1);
|
|
22
|
+
const quantityDialogOpen = signal(false);
|
|
23
|
+
const defaultMessage = "Welcome to my shop!";
|
|
24
|
+
const tabs = [
|
|
27
25
|
{
|
|
28
26
|
id: "item",
|
|
29
27
|
label: "Items"
|
|
@@ -37,77 +35,52 @@ function component($$props) {
|
|
|
37
35
|
label: "Armor"
|
|
38
36
|
}
|
|
39
37
|
];
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return resolveProp(data) || {};
|
|
46
|
-
});
|
|
47
|
-
var shopMessage = computed(function() {
|
|
48
|
-
var message = resolveProp(guiData().message);
|
|
38
|
+
const { data, onInteraction, onFinish } = defineProps();
|
|
39
|
+
const resolveProp = (value) => typeof value === "function" ? value() : value;
|
|
40
|
+
const guiData = computed(() => resolveProp(data) || {});
|
|
41
|
+
const shopMessage = computed(() => {
|
|
42
|
+
const message = resolveProp(guiData().message);
|
|
49
43
|
return message ? String(message) : defaultMessage;
|
|
50
44
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
var hasFace = computed(function() {
|
|
55
|
-
var value = face();
|
|
45
|
+
const face = computed(() => resolveProp(guiData().face));
|
|
46
|
+
const hasFace = computed(() => {
|
|
47
|
+
const value = face();
|
|
56
48
|
return value && value.id;
|
|
57
49
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
var activeItems = computed(function() {
|
|
65
|
-
return tradeMode() === "buy" ? buyItems() : sellItems();
|
|
66
|
-
});
|
|
67
|
-
var filteredItems = computed(function() {
|
|
68
|
-
var tab = tabs[selectedTab()];
|
|
69
|
-
var items = activeItems();
|
|
50
|
+
const buyItems = computed(() => guiData().items || []);
|
|
51
|
+
const sellItems = computed(() => guiData().sellItems || []);
|
|
52
|
+
const activeItems = computed(() => tradeMode() === "buy" ? buyItems() : sellItems());
|
|
53
|
+
const filteredItems = computed(() => {
|
|
54
|
+
const tab = tabs[selectedTab()];
|
|
55
|
+
const items = activeItems();
|
|
70
56
|
if (!tab) return [];
|
|
71
|
-
return items.filter(
|
|
72
|
-
return (item === null || item === void 0 ? void 0 : item.type) === tab.id;
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
var currentItem = computed(function() {
|
|
76
|
-
return filteredItems()[selectedItem()];
|
|
57
|
+
return items.filter((item) => item?.type === tab.id);
|
|
77
58
|
});
|
|
78
|
-
|
|
79
|
-
|
|
59
|
+
const currentItem = computed(() => filteredItems()[selectedItem()]);
|
|
60
|
+
const gold = computed(() => currentPlayer()._gold());
|
|
61
|
+
const actionLabel = computed(() => tradeMode() === "buy" ? "Buy" : "Sell");
|
|
62
|
+
const faceSheet = (graphicId, animationName) => ({
|
|
63
|
+
definition: engine.getSpriteSheet(graphicId),
|
|
64
|
+
playing: animationName || "default"
|
|
80
65
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
});
|
|
84
|
-
var faceSheet = function(graphicId, animationName) {
|
|
85
|
-
return {
|
|
86
|
-
definition: engine.getSpriteSheet(graphicId),
|
|
87
|
-
playing: animationName || "default"
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
var maxQuantity = computed(function() {
|
|
91
|
-
var _a;
|
|
92
|
-
var item = currentItem();
|
|
66
|
+
const maxQuantity = computed(() => {
|
|
67
|
+
const item = currentItem();
|
|
93
68
|
if (!item) return 0;
|
|
94
|
-
|
|
69
|
+
const price = item?.price || 0;
|
|
95
70
|
if (price <= 0) return 0;
|
|
96
71
|
if (tradeMode() === "sell") {
|
|
97
|
-
|
|
72
|
+
const qty = item?.quantity ?? 0;
|
|
98
73
|
return Math.max(0, qty);
|
|
99
74
|
}
|
|
100
75
|
return Math.max(1, Math.floor(gold() / price));
|
|
101
76
|
});
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return (((_a = currentItem()) === null || _a === void 0 ? void 0 : _a.price) || 0) * quantity();
|
|
77
|
+
const totalPrice = computed(() => {
|
|
78
|
+
return (currentItem()?.price || 0) * quantity();
|
|
105
79
|
});
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
var order = [
|
|
80
|
+
const displayStats = computed(() => {
|
|
81
|
+
const stats = currentItem()?.stats || {};
|
|
82
|
+
const params = guiData().playerParams || {};
|
|
83
|
+
const order = [
|
|
111
84
|
"atk",
|
|
112
85
|
"def",
|
|
113
86
|
"pdef",
|
|
@@ -119,7 +92,7 @@ function component($$props) {
|
|
|
119
92
|
"maxHp",
|
|
120
93
|
"maxSp"
|
|
121
94
|
];
|
|
122
|
-
|
|
95
|
+
const labels = {
|
|
123
96
|
atk: "ATK",
|
|
124
97
|
def: "DEF",
|
|
125
98
|
pdef: "PDEF",
|
|
@@ -131,21 +104,16 @@ function component($$props) {
|
|
|
131
104
|
maxHp: "MAX HP",
|
|
132
105
|
maxSp: "MAX SP"
|
|
133
106
|
};
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
var keys = orderedKeys.concat(extraKeys);
|
|
141
|
-
var list = [];
|
|
142
|
-
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
|
|
143
|
-
var key = keys_1[_i];
|
|
144
|
-
var delta = stats[key];
|
|
107
|
+
const orderedKeys = order.filter((key) => stats[key] !== void 0);
|
|
108
|
+
const extraKeys = Object.keys(stats).filter((key) => !order.includes(key));
|
|
109
|
+
const keys = orderedKeys.concat(extraKeys);
|
|
110
|
+
const list = [];
|
|
111
|
+
for (const key of keys) {
|
|
112
|
+
const delta = stats[key];
|
|
145
113
|
if (delta === void 0 || delta === 0) continue;
|
|
146
|
-
|
|
114
|
+
let current = params[key];
|
|
147
115
|
if (current === void 0 && key === "def") current = params.pdef;
|
|
148
|
-
|
|
116
|
+
const next = current !== void 0 ? current + delta : void 0;
|
|
149
117
|
list.push({
|
|
150
118
|
key,
|
|
151
119
|
label: labels[key] || key.toUpperCase(),
|
|
@@ -156,15 +124,9 @@ function component($$props) {
|
|
|
156
124
|
}
|
|
157
125
|
return list;
|
|
158
126
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
var navTab = createTabindexNavigator(selectedTab, { count: function() {
|
|
163
|
-
return tabs.length;
|
|
164
|
-
} }, "wrap");
|
|
165
|
-
var navMode = createTabindexNavigator(selectedModeIndex, { count: function() {
|
|
166
|
-
return 2;
|
|
167
|
-
} }, "wrap");
|
|
127
|
+
const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, "wrap");
|
|
128
|
+
const navTab = createTabindexNavigator(selectedTab, { count: () => tabs.length }, "wrap");
|
|
129
|
+
const navMode = createTabindexNavigator(selectedModeIndex, { count: () => 2 }, "wrap");
|
|
168
130
|
function selectItem(index) {
|
|
169
131
|
return function() {
|
|
170
132
|
selectedItem.set(index);
|
|
@@ -188,11 +150,10 @@ function component($$props) {
|
|
|
188
150
|
};
|
|
189
151
|
}
|
|
190
152
|
function isItemDisabled(item) {
|
|
191
|
-
var _a;
|
|
192
153
|
if (!item) return true;
|
|
193
|
-
|
|
154
|
+
const price = item?.price || 0;
|
|
194
155
|
if (price <= 0) return true;
|
|
195
|
-
if (tradeMode() === "sell") return (
|
|
156
|
+
if (tradeMode() === "sell") return (item?.quantity ?? 0) <= 0;
|
|
196
157
|
return gold() < price;
|
|
197
158
|
}
|
|
198
159
|
function backToMode() {
|
|
@@ -202,9 +163,9 @@ function component($$props) {
|
|
|
202
163
|
}
|
|
203
164
|
function changeQuantity(delta) {
|
|
204
165
|
return function() {
|
|
205
|
-
|
|
166
|
+
const limit = maxQuantity();
|
|
206
167
|
if (limit <= 0) return;
|
|
207
|
-
|
|
168
|
+
const nextValue = Math.max(1, Math.min(limit, quantity() + delta));
|
|
208
169
|
if (nextValue !== quantity()) quantity.set(nextValue);
|
|
209
170
|
};
|
|
210
171
|
}
|
|
@@ -215,7 +176,7 @@ function component($$props) {
|
|
|
215
176
|
}
|
|
216
177
|
function confirmTrade() {
|
|
217
178
|
return function() {
|
|
218
|
-
|
|
179
|
+
const item = currentItem();
|
|
219
180
|
if (!item || isItemDisabled(item)) {
|
|
220
181
|
quantityDialogOpen.set(false);
|
|
221
182
|
return;
|
|
@@ -227,16 +188,16 @@ function component($$props) {
|
|
|
227
188
|
quantityDialogOpen.set(false);
|
|
228
189
|
};
|
|
229
190
|
}
|
|
230
|
-
effect(
|
|
231
|
-
|
|
191
|
+
effect(() => {
|
|
192
|
+
const count = filteredItems().length;
|
|
232
193
|
if (selectedItem() >= count) selectedItem.set(Math.max(0, count - 1));
|
|
233
194
|
});
|
|
234
|
-
|
|
195
|
+
const modeControls = signal({
|
|
235
196
|
left: {
|
|
236
197
|
repeat: true,
|
|
237
198
|
bind: keyboardControls.left,
|
|
238
199
|
throttle: 150,
|
|
239
|
-
keyDown
|
|
200
|
+
keyDown() {
|
|
240
201
|
navMode.next(-1);
|
|
241
202
|
}
|
|
242
203
|
},
|
|
@@ -244,14 +205,14 @@ function component($$props) {
|
|
|
244
205
|
repeat: true,
|
|
245
206
|
bind: keyboardControls.right,
|
|
246
207
|
throttle: 150,
|
|
247
|
-
keyDown
|
|
208
|
+
keyDown() {
|
|
248
209
|
navMode.next(1);
|
|
249
210
|
}
|
|
250
211
|
},
|
|
251
212
|
action: {
|
|
252
213
|
bind: keyboardControls.action,
|
|
253
|
-
keyDown
|
|
254
|
-
|
|
214
|
+
keyDown() {
|
|
215
|
+
const mode = selectedModeIndex() === 0 ? "buy" : "sell";
|
|
255
216
|
tradeMode.set(mode);
|
|
256
217
|
selectedItem.set(0);
|
|
257
218
|
quantity.set(1);
|
|
@@ -260,18 +221,18 @@ function component($$props) {
|
|
|
260
221
|
},
|
|
261
222
|
escape: {
|
|
262
223
|
bind: keyboardControls.escape,
|
|
263
|
-
keyDown
|
|
224
|
+
keyDown() {
|
|
264
225
|
onFinish();
|
|
265
226
|
}
|
|
266
227
|
},
|
|
267
228
|
gamepad: { enabled: true }
|
|
268
229
|
});
|
|
269
|
-
|
|
230
|
+
const itemControls = signal({
|
|
270
231
|
up: {
|
|
271
232
|
repeat: true,
|
|
272
233
|
bind: keyboardControls.up,
|
|
273
234
|
throttle: 150,
|
|
274
|
-
keyDown
|
|
235
|
+
keyDown() {
|
|
275
236
|
if (quantityDialogOpen()) {
|
|
276
237
|
changeQuantity(1)();
|
|
277
238
|
return;
|
|
@@ -283,7 +244,7 @@ function component($$props) {
|
|
|
283
244
|
repeat: true,
|
|
284
245
|
bind: keyboardControls.down,
|
|
285
246
|
throttle: 150,
|
|
286
|
-
keyDown
|
|
247
|
+
keyDown() {
|
|
287
248
|
if (quantityDialogOpen()) {
|
|
288
249
|
changeQuantity(-1)();
|
|
289
250
|
return;
|
|
@@ -293,15 +254,15 @@ function component($$props) {
|
|
|
293
254
|
},
|
|
294
255
|
action: {
|
|
295
256
|
bind: keyboardControls.action,
|
|
296
|
-
keyDown
|
|
257
|
+
keyDown() {
|
|
297
258
|
if (quantityDialogOpen()) {
|
|
298
|
-
|
|
299
|
-
if (!
|
|
259
|
+
const item = currentItem();
|
|
260
|
+
if (!item || isItemDisabled(item)) {
|
|
300
261
|
quantityDialogOpen.set(false);
|
|
301
262
|
return;
|
|
302
263
|
}
|
|
303
264
|
onInteraction(tradeMode() === "buy" ? "buyItem" : "sellItem", {
|
|
304
|
-
id:
|
|
265
|
+
id: item.id,
|
|
305
266
|
nb: quantity()
|
|
306
267
|
});
|
|
307
268
|
quantityDialogOpen.set(false);
|
|
@@ -312,7 +273,7 @@ function component($$props) {
|
|
|
312
273
|
},
|
|
313
274
|
escape: {
|
|
314
275
|
bind: keyboardControls.escape,
|
|
315
|
-
keyDown
|
|
276
|
+
keyDown() {
|
|
316
277
|
if (quantityDialogOpen()) {
|
|
317
278
|
quantityDialogOpen.set(false);
|
|
318
279
|
return;
|
|
@@ -322,12 +283,12 @@ function component($$props) {
|
|
|
322
283
|
},
|
|
323
284
|
gamepad: { enabled: true }
|
|
324
285
|
});
|
|
325
|
-
|
|
286
|
+
const tabControls = signal({
|
|
326
287
|
left: {
|
|
327
288
|
repeat: true,
|
|
328
289
|
bind: keyboardControls.left,
|
|
329
290
|
throttle: 150,
|
|
330
|
-
keyDown
|
|
291
|
+
keyDown() {
|
|
331
292
|
if (quantityDialogOpen()) return;
|
|
332
293
|
navTab.next(-1);
|
|
333
294
|
}
|
|
@@ -336,7 +297,7 @@ function component($$props) {
|
|
|
336
297
|
repeat: true,
|
|
337
298
|
bind: keyboardControls.right,
|
|
338
299
|
throttle: 150,
|
|
339
|
-
keyDown
|
|
300
|
+
keyDown() {
|
|
340
301
|
if (quantityDialogOpen()) return;
|
|
341
302
|
navTab.next(1);
|
|
342
303
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shop.ce.js","names":[],"sources":["../../../../src/components/gui/shop/shop.ce"],"sourcesContent":[" <DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-shop-container rpg-anim-fade-in\">\n <div class=\"rpg-shop-header\">\n <div class=\"rpg-shop-merchant\">\n <div>\n @if (hasFace) {\n <div class=\"rpg-shop-merchant-avatar\">\n <DOMSprite \n sheet={faceSheet(face().id, face().expression)} \n width=\"50px\"\n height=\"50px\"\n objectFit=\"contain\"\n /> \n </div>\n }\n </div>\n <div class=\"rpg-shop-merchant-info\">\n <p>{{ shopMessage() }}</p>\n </div>\n </div>\n <div class=\"rpg-shop-gold\">\n {{ gold() }} {{ goldTerm }}\n </div>\n </div>\n\n <div class=\"rpg-shop-body\">\n <div class=\"rpg-shop-left\">\n @if (tradeView() === 'mode') {\n <div class=\"rpg-shop-content rpg-shop-content-mode\">\n <div class=\"rpg-shop-details rpg-shop-details-mode\">\n <div class=\"rpg-shop-details-header\">\n <div class=\"rpg-shop-details-icon\">🛒</div>\n <h2 style=\"margin: 0;\">Choose an action</h2>\n </div>\n <div class=\"rpg-shop-trade\">\n <Navigation tabindex={selectedModeIndex} controls={modeControls}>\n <div class=\"rpg-shop-tabs rpg-shop-trade-tabs\">\n <div\n class=\"rpg-shop-tab\"\n class={{active: selectedModeIndex() === 0}}\n click={selectMode('buy')}\n >Buy</div>\n <div\n class=\"rpg-shop-tab\"\n class={{active: selectedModeIndex() === 1}}\n click={selectMode('sell')}\n >Sell</div>\n </div>\n </Navigation>\n </div>\n </div>\n </div>\n }\n @else {\n <div>\n <Navigation tabindex={selectedTab} controls={tabControls}> \n <div class=\"rpg-shop-tabs\">\n @for ((tab,index) of tabs) {\n <div \n class=\"rpg-shop-tab\" \n class={{active: selectedTab() === index}} \n tabindex={index} \n click={selectTab(index)}\n >{{ tab.label }}</div>\n }\n </div>\n </Navigation>\n\n <div class=\"rpg-shop-content\">\n <div class=\"rpg-shop-grid\">\n <Navigation tabindex={selectedItem} controls={itemControls}> \n @for ((item,index) of filteredItems) { \n <div class=\"rpg-shop-card\" class={{disabled: isItemDisabled(item), selected: selectedItem() === index}} tabindex={index} click={selectItem(index)}>\n <div class=\"rpg-shop-card-icon\">\n @if (item.icon) {\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n }\n </div>\n <div class=\"rpg-shop-card-name\">{{ item.name }}</div>\n <div class=\"rpg-shop-card-price\">{{ item.price }} {{ goldTerm }}</div>\n @if (item.quantity !== undefined) {\n <div class=\"rpg-shop-card-qty\">x{{ item.quantity }}</div>\n }\n @if (item.equipped) {\n <div class=\"rpg-shop-card-tag\">Equipped</div>\n }\n </div>\n }\n </Navigation>\n </div>\n\n <div class=\"rpg-shop-details\">\n <div class=\"rpg-shop-details-header\">\n <div class=\"rpg-shop-details-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"80px\"\n height=\"80px\"\n objectFit=\"contain\"\n />\n </div>\n <h2 style=\"margin: 0;\">{{ currentItem()?.name || \"\" }}</h2>\n <p style=\"color: #ffd700; font-weight: bold; margin: 8px 0;\">{{ currentItem()?.price ?? 0 }} {{ goldTerm }}</p>\n @if (currentItem()?.quantity !== undefined) {\n <div class=\"rpg-shop-details-qty\">Qty: x{{ currentItem()?.quantity }}</div>\n }\n </div>\n <div>\n @if (currentItem()?.equipped) {\n <div class=\"rpg-shop-equipped\">Already equipped</div>\n }\n </div>\n <div class=\"rpg-shop-details-desc\">\n {{ currentItem()?.description || \"\" }}\n </div>\n <div>\n @if (displayStats().length > 0) {\n <div class=\"rpg-shop-stats\">\n @for ((stat,index) of displayStats) {\n <div class=\"rpg-shop-stat\" class={{positive: stat.delta > 0, negative: stat.delta < 0}}>\n <div class=\"rpg-shop-stat-key\">{{ stat.label }}</div>\n <div class=\"rpg-shop-stat-value\">\n {{ stat.delta > 0 ? '+' : '' }}{{ stat.delta }}\n </div>\n @if (stat.current !== undefined) {\n <div class=\"rpg-shop-stat-current\">{{ stat.current }} → {{ stat.next }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n <button class=\"rpg-shop-btn\" click={backToMode()}>Back</button>\n </div>\n </div>\n </div>\n }\n @if (quantityDialogOpen) {\n <div class=\"rpg-shop-modal\">\n <div class=\"rpg-shop-modal-card\">\n <div class=\"rpg-shop-modal-title\">{{ actionLabel }}</div>\n <div class=\"rpg-shop-modal-item\">{{ currentItem()?.name || \"\" }}</div>\n @if (currentItem()?.quantity !== undefined) {\n <div class=\"rpg-shop-modal-qty\">Available: x{{ currentItem()?.quantity }}</div>\n }\n <div class=\"rpg-shop-quantity\">\n <div class=\"rpg-shop-quantity-label\">Quantity</div>\n <div class=\"rpg-shop-quantity-controls\">\n <button class=\"rpg-shop-btn\" click={changeQuantity(-1)}>-</button>\n <div class=\"rpg-shop-quantity-value\">{{ quantity }}</div>\n <button class=\"rpg-shop-btn\" click={changeQuantity(1)}>+</button>\n </div>\n </div>\n <div class=\"rpg-shop-modal-total\">\n <span>Total</span>\n <span>{{ totalPrice() }} {{ goldTerm }}</span>\n </div>\n <div class=\"rpg-shop-modal-actions\">\n <button class=\"rpg-shop-btn rpg-shop-btn-secondary\" click={closeQuantityDialog()}>Cancel</button>\n <button class=\"rpg-shop-btn\" click={confirmTrade()}>\n {{ actionLabel() }} x{{ quantity() }}\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </DOMContainer>\n\n<script>\n import { mount, signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine)\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n })\n const goldTerm = engine.globalConfig.goldTerm || 'G'\n\n const selectedItem = signal(0)\n const selectedTab = signal(0)\n const tradeMode = signal('buy')\n const tradeView = signal('mode')\n const selectedModeIndex = signal(0)\n const quantity = signal(1)\n const quantityDialogOpen = signal(false)\n const defaultMessage = 'Welcome to my shop!'\n const tabs = [\n { id: 'item', label: 'Items' },\n { id: 'weapon', label: 'Weapons' },\n { id: 'armor', label: 'Armor' }\n ]\n\n const { data, onInteraction , onFinish } = defineProps()\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value\n const guiData = computed(() => resolveProp(data) || {})\n const shopMessage = computed(() => {\n const message = resolveProp(guiData().message)\n return message ? String(message) : defaultMessage\n })\n const face = computed(() => resolveProp(guiData().face))\n const hasFace = computed(() => {\n const value = face()\n return value && value.id\n })\n const buyItems = computed(() => guiData().items || [])\n const sellItems = computed(() => guiData().sellItems || [])\n const activeItems = computed(() => tradeMode() === 'buy' ? buyItems() : sellItems())\n const filteredItems = computed(() => {\n const tab = tabs[selectedTab()]\n const items = activeItems()\n if (!tab) return []\n return items.filter((item) => item?.type === tab.id)\n })\n const currentItem = computed(() => filteredItems()[selectedItem()])\n const gold = computed(() => currentPlayer()._gold())\n const actionLabel = computed(() => tradeMode() === 'buy' ? 'Buy' : 'Sell')\n const faceSheet = (graphicId, animationName) => ({\n definition: engine.getSpriteSheet(graphicId),\n playing: animationName || \"default\"\n })\n const maxQuantity = computed(() => {\n const item = currentItem()\n if (!item) return 0\n const price = item?.price || 0\n if (price <= 0) return 0\n if (tradeMode() === 'sell') {\n const qty = item?.quantity ?? 0\n return Math.max(0, qty)\n }\n return Math.max(1, Math.floor(gold() / price))\n })\n const totalPrice = computed(() => {\n const price = currentItem()?.price || 0\n return price * quantity()\n })\n const displayStats = computed(() => {\n const stats = currentItem()?.stats || {}\n const params = guiData().playerParams || {}\n const order = ['atk', 'def', 'pdef', 'sdef', 'str', 'dex', 'int', 'agi', 'maxHp', 'maxSp']\n const labels = {\n atk: 'ATK',\n def: 'DEF',\n pdef: 'PDEF',\n sdef: 'SDEF',\n str: 'STR',\n dex: 'DEX',\n int: 'INT',\n agi: 'AGI',\n maxHp: 'MAX HP',\n maxSp: 'MAX SP'\n }\n const orderedKeys = order.filter((key) => stats[key] !== undefined)\n const extraKeys = Object.keys(stats).filter((key) => !order.includes(key))\n const keys = orderedKeys.concat(extraKeys)\n const list = []\n for (const key of keys) {\n const delta = stats[key]\n if (delta === undefined || delta === 0) continue\n let current = params[key]\n if (current === undefined && key === 'def') current = params.pdef\n const next = current !== undefined ? current + delta : undefined\n list.push({\n key,\n label: labels[key] || key.toUpperCase(),\n delta,\n current,\n next\n })\n }\n return list\n })\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, 'wrap')\n const navTab = createTabindexNavigator(selectedTab, { count: () => tabs.length }, 'wrap')\n const navMode = createTabindexNavigator(selectedModeIndex, { count: () => 2 }, 'wrap')\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index)\n quantity.set(1)\n if (!isItemDisabled(filteredItems()[index])) {\n quantityDialogOpen.set(true)\n }\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedTab.set(index)\n selectedItem.set(0)\n }\n }\n\n function selectMode(mode) {\n return function() {\n tradeMode.set(mode)\n selectedModeIndex.set(mode === 'buy' ? 0 : 1)\n selectedItem.set(0)\n quantity.set(1)\n tradeView.set('items')\n }\n }\n\n function isItemDisabled(item) {\n if (!item) return true\n const price = item?.price || 0\n if (price <= 0) return true\n if (tradeMode() === 'sell') {\n const qty = item?.quantity ?? 0\n return qty <= 0\n }\n return gold() < price\n }\n\n function backToMode() {\n return function() {\n tradeView.set('mode')\n }\n }\n\n function changeQuantity(delta) {\n return function() {\n const limit = maxQuantity()\n if (limit <= 0) return\n const nextValue = Math.max(1, Math.min(limit, quantity() + delta))\n if (nextValue !== quantity()) {\n quantity.set(nextValue)\n }\n }\n }\n\n function closeQuantityDialog() {\n return function() {\n quantityDialogOpen.set(false)\n }\n }\n\n function confirmTrade() {\n return function() {\n const item = currentItem()\n if (!item || isItemDisabled(item)) {\n quantityDialogOpen.set(false)\n return\n }\n const action = tradeMode() === 'buy' ? 'buyItem' : 'sellItem'\n onInteraction(action, { id: item.id, nb: quantity() })\n quantityDialogOpen.set(false)\n }\n }\n\n effect(() => {\n const count = filteredItems().length\n if (selectedItem() >= count) {\n selectedItem.set(Math.max(0, count - 1))\n }\n })\n\n const modeControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n navMode.next(-1)\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n navMode.next(1)\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n const mode = selectedModeIndex() === 0 ? 'buy' : 'sell'\n tradeMode.set(mode)\n selectedItem.set(0)\n quantity.set(1)\n tradeView.set('items')\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n onFinish()\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n const itemControls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) {\n changeQuantity(1)()\n return\n }\n nav.next(-1)\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) {\n changeQuantity(-1)()\n return\n }\n nav.next(1)\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (quantityDialogOpen()) {\n const item = currentItem()\n if (!item || isItemDisabled(item)) {\n quantityDialogOpen.set(false)\n return\n }\n const action = tradeMode() === 'buy' ? 'buyItem' : 'sellItem'\n onInteraction(action, { id: item.id, nb: quantity() })\n quantityDialogOpen.set(false)\n return\n }\n const item = currentItem()\n if (!isItemDisabled(item)) {\n quantityDialogOpen.set(true)\n }\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (quantityDialogOpen()) {\n quantityDialogOpen.set(false)\n return\n }\n tradeView.set('mode')\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n const tabControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) return\n navTab.next(-1)\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) return\n navTab.next(1)\n }\n },\n gamepad: {\n enabled: true\n }\n })\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shop.ce.js","names":[],"sources":["../../../../src/components/gui/shop/shop.ce"],"sourcesContent":[" <DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-shop-container rpg-anim-fade-in\">\n <div class=\"rpg-shop-header\">\n <div class=\"rpg-shop-merchant\">\n <div>\n @if (hasFace) {\n <div class=\"rpg-shop-merchant-avatar\">\n <DOMSprite \n sheet={faceSheet(face().id, face().expression)} \n width=\"50px\"\n height=\"50px\"\n objectFit=\"contain\"\n /> \n </div>\n }\n </div>\n <div class=\"rpg-shop-merchant-info\">\n <p>{{ shopMessage() }}</p>\n </div>\n </div>\n <div class=\"rpg-shop-gold\">\n {{ gold() }} {{ goldTerm }}\n </div>\n </div>\n\n <div class=\"rpg-shop-body\">\n <div class=\"rpg-shop-left\">\n @if (tradeView() === 'mode') {\n <div class=\"rpg-shop-content rpg-shop-content-mode\">\n <div class=\"rpg-shop-details rpg-shop-details-mode\">\n <div class=\"rpg-shop-details-header\">\n <div class=\"rpg-shop-details-icon\">🛒</div>\n <h2 style=\"margin: 0;\">Choose an action</h2>\n </div>\n <div class=\"rpg-shop-trade\">\n <Navigation tabindex={selectedModeIndex} controls={modeControls}>\n <div class=\"rpg-shop-tabs rpg-shop-trade-tabs\">\n <div\n class=\"rpg-shop-tab\"\n class={{active: selectedModeIndex() === 0}}\n click={selectMode('buy')}\n >Buy</div>\n <div\n class=\"rpg-shop-tab\"\n class={{active: selectedModeIndex() === 1}}\n click={selectMode('sell')}\n >Sell</div>\n </div>\n </Navigation>\n </div>\n </div>\n </div>\n }\n @else {\n <div>\n <Navigation tabindex={selectedTab} controls={tabControls}> \n <div class=\"rpg-shop-tabs\">\n @for ((tab,index) of tabs) {\n <div \n class=\"rpg-shop-tab\" \n class={{active: selectedTab() === index}} \n tabindex={index} \n click={selectTab(index)}\n >{{ tab.label }}</div>\n }\n </div>\n </Navigation>\n\n <div class=\"rpg-shop-content\">\n <div class=\"rpg-shop-grid\">\n <Navigation tabindex={selectedItem} controls={itemControls}> \n @for ((item,index) of filteredItems) { \n <div class=\"rpg-shop-card\" class={{disabled: isItemDisabled(item), selected: selectedItem() === index}} tabindex={index} click={selectItem(index)}>\n <div class=\"rpg-shop-card-icon\">\n @if (item.icon) {\n <DOMSprite \n sheet={iconSheet(item.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n }\n </div>\n <div class=\"rpg-shop-card-name\">{{ item.name }}</div>\n <div class=\"rpg-shop-card-price\">{{ item.price }} {{ goldTerm }}</div>\n @if (item.quantity !== undefined) {\n <div class=\"rpg-shop-card-qty\">x{{ item.quantity }}</div>\n }\n @if (item.equipped) {\n <div class=\"rpg-shop-card-tag\">Equipped</div>\n }\n </div>\n }\n </Navigation>\n </div>\n\n <div class=\"rpg-shop-details\">\n <div class=\"rpg-shop-details-header\">\n <div class=\"rpg-shop-details-icon\">\n <DOMSprite \n sheet={iconSheet(currentItem()?.icon)} \n playing=\"default\" \n width=\"80px\"\n height=\"80px\"\n objectFit=\"contain\"\n />\n </div>\n <h2 style=\"margin: 0;\">{{ currentItem()?.name || \"\" }}</h2>\n <p style=\"color: #ffd700; font-weight: bold; margin: 8px 0;\">{{ currentItem()?.price ?? 0 }} {{ goldTerm }}</p>\n @if (currentItem()?.quantity !== undefined) {\n <div class=\"rpg-shop-details-qty\">Qty: x{{ currentItem()?.quantity }}</div>\n }\n </div>\n <div>\n @if (currentItem()?.equipped) {\n <div class=\"rpg-shop-equipped\">Already equipped</div>\n }\n </div>\n <div class=\"rpg-shop-details-desc\">\n {{ currentItem()?.description || \"\" }}\n </div>\n <div>\n @if (displayStats().length > 0) {\n <div class=\"rpg-shop-stats\">\n @for ((stat,index) of displayStats) {\n <div class=\"rpg-shop-stat\" class={{positive: stat.delta > 0, negative: stat.delta < 0}}>\n <div class=\"rpg-shop-stat-key\">{{ stat.label }}</div>\n <div class=\"rpg-shop-stat-value\">\n {{ stat.delta > 0 ? '+' : '' }}{{ stat.delta }}\n </div>\n @if (stat.current !== undefined) {\n <div class=\"rpg-shop-stat-current\">{{ stat.current }} → {{ stat.next }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n <button class=\"rpg-shop-btn\" click={backToMode()}>Back</button>\n </div>\n </div>\n </div>\n }\n @if (quantityDialogOpen) {\n <div class=\"rpg-shop-modal\">\n <div class=\"rpg-shop-modal-card\">\n <div class=\"rpg-shop-modal-title\">{{ actionLabel }}</div>\n <div class=\"rpg-shop-modal-item\">{{ currentItem()?.name || \"\" }}</div>\n @if (currentItem()?.quantity !== undefined) {\n <div class=\"rpg-shop-modal-qty\">Available: x{{ currentItem()?.quantity }}</div>\n }\n <div class=\"rpg-shop-quantity\">\n <div class=\"rpg-shop-quantity-label\">Quantity</div>\n <div class=\"rpg-shop-quantity-controls\">\n <button class=\"rpg-shop-btn\" click={changeQuantity(-1)}>-</button>\n <div class=\"rpg-shop-quantity-value\">{{ quantity }}</div>\n <button class=\"rpg-shop-btn\" click={changeQuantity(1)}>+</button>\n </div>\n </div>\n <div class=\"rpg-shop-modal-total\">\n <span>Total</span>\n <span>{{ totalPrice() }} {{ goldTerm }}</span>\n </div>\n <div class=\"rpg-shop-modal-actions\">\n <button class=\"rpg-shop-btn rpg-shop-btn-secondary\" click={closeQuantityDialog()}>Cancel</button>\n <button class=\"rpg-shop-btn\" click={confirmTrade()}>\n {{ actionLabel() }} x{{ quantity() }}\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </DOMContainer>\n\n<script>\n import { mount, signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine)\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId),\n playing: \"default\"\n })\n const goldTerm = engine.globalConfig.goldTerm || 'G'\n\n const selectedItem = signal(0)\n const selectedTab = signal(0)\n const tradeMode = signal('buy')\n const tradeView = signal('mode')\n const selectedModeIndex = signal(0)\n const quantity = signal(1)\n const quantityDialogOpen = signal(false)\n const defaultMessage = 'Welcome to my shop!'\n const tabs = [\n { id: 'item', label: 'Items' },\n { id: 'weapon', label: 'Weapons' },\n { id: 'armor', label: 'Armor' }\n ]\n\n const { data, onInteraction , onFinish } = defineProps()\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value\n const guiData = computed(() => resolveProp(data) || {})\n const shopMessage = computed(() => {\n const message = resolveProp(guiData().message)\n return message ? String(message) : defaultMessage\n })\n const face = computed(() => resolveProp(guiData().face))\n const hasFace = computed(() => {\n const value = face()\n return value && value.id\n })\n const buyItems = computed(() => guiData().items || [])\n const sellItems = computed(() => guiData().sellItems || [])\n const activeItems = computed(() => tradeMode() === 'buy' ? buyItems() : sellItems())\n const filteredItems = computed(() => {\n const tab = tabs[selectedTab()]\n const items = activeItems()\n if (!tab) return []\n return items.filter((item) => item?.type === tab.id)\n })\n const currentItem = computed(() => filteredItems()[selectedItem()])\n const gold = computed(() => currentPlayer()._gold())\n const actionLabel = computed(() => tradeMode() === 'buy' ? 'Buy' : 'Sell')\n const faceSheet = (graphicId, animationName) => ({\n definition: engine.getSpriteSheet(graphicId),\n playing: animationName || \"default\"\n })\n const maxQuantity = computed(() => {\n const item = currentItem()\n if (!item) return 0\n const price = item?.price || 0\n if (price <= 0) return 0\n if (tradeMode() === 'sell') {\n const qty = item?.quantity ?? 0\n return Math.max(0, qty)\n }\n return Math.max(1, Math.floor(gold() / price))\n })\n const totalPrice = computed(() => {\n const price = currentItem()?.price || 0\n return price * quantity()\n })\n const displayStats = computed(() => {\n const stats = currentItem()?.stats || {}\n const params = guiData().playerParams || {}\n const order = ['atk', 'def', 'pdef', 'sdef', 'str', 'dex', 'int', 'agi', 'maxHp', 'maxSp']\n const labels = {\n atk: 'ATK',\n def: 'DEF',\n pdef: 'PDEF',\n sdef: 'SDEF',\n str: 'STR',\n dex: 'DEX',\n int: 'INT',\n agi: 'AGI',\n maxHp: 'MAX HP',\n maxSp: 'MAX SP'\n }\n const orderedKeys = order.filter((key) => stats[key] !== undefined)\n const extraKeys = Object.keys(stats).filter((key) => !order.includes(key))\n const keys = orderedKeys.concat(extraKeys)\n const list = []\n for (const key of keys) {\n const delta = stats[key]\n if (delta === undefined || delta === 0) continue\n let current = params[key]\n if (current === undefined && key === 'def') current = params.pdef\n const next = current !== undefined ? current + delta : undefined\n list.push({\n key,\n label: labels[key] || key.toUpperCase(),\n delta,\n current,\n next\n })\n }\n return list\n })\n const nav = createTabindexNavigator(selectedItem, { count: () => filteredItems().length }, 'wrap')\n const navTab = createTabindexNavigator(selectedTab, { count: () => tabs.length }, 'wrap')\n const navMode = createTabindexNavigator(selectedModeIndex, { count: () => 2 }, 'wrap')\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index)\n quantity.set(1)\n if (!isItemDisabled(filteredItems()[index])) {\n quantityDialogOpen.set(true)\n }\n }\n }\n\n function selectTab(index) {\n return function() {\n selectedTab.set(index)\n selectedItem.set(0)\n }\n }\n\n function selectMode(mode) {\n return function() {\n tradeMode.set(mode)\n selectedModeIndex.set(mode === 'buy' ? 0 : 1)\n selectedItem.set(0)\n quantity.set(1)\n tradeView.set('items')\n }\n }\n\n function isItemDisabled(item) {\n if (!item) return true\n const price = item?.price || 0\n if (price <= 0) return true\n if (tradeMode() === 'sell') {\n const qty = item?.quantity ?? 0\n return qty <= 0\n }\n return gold() < price\n }\n\n function backToMode() {\n return function() {\n tradeView.set('mode')\n }\n }\n\n function changeQuantity(delta) {\n return function() {\n const limit = maxQuantity()\n if (limit <= 0) return\n const nextValue = Math.max(1, Math.min(limit, quantity() + delta))\n if (nextValue !== quantity()) {\n quantity.set(nextValue)\n }\n }\n }\n\n function closeQuantityDialog() {\n return function() {\n quantityDialogOpen.set(false)\n }\n }\n\n function confirmTrade() {\n return function() {\n const item = currentItem()\n if (!item || isItemDisabled(item)) {\n quantityDialogOpen.set(false)\n return\n }\n const action = tradeMode() === 'buy' ? 'buyItem' : 'sellItem'\n onInteraction(action, { id: item.id, nb: quantity() })\n quantityDialogOpen.set(false)\n }\n }\n\n effect(() => {\n const count = filteredItems().length\n if (selectedItem() >= count) {\n selectedItem.set(Math.max(0, count - 1))\n }\n })\n\n const modeControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n navMode.next(-1)\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n navMode.next(1)\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n const mode = selectedModeIndex() === 0 ? 'buy' : 'sell'\n tradeMode.set(mode)\n selectedItem.set(0)\n quantity.set(1)\n tradeView.set('items')\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n onFinish()\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n const itemControls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) {\n changeQuantity(1)()\n return\n }\n nav.next(-1)\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) {\n changeQuantity(-1)()\n return\n }\n nav.next(1)\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (quantityDialogOpen()) {\n const item = currentItem()\n if (!item || isItemDisabled(item)) {\n quantityDialogOpen.set(false)\n return\n }\n const action = tradeMode() === 'buy' ? 'buyItem' : 'sellItem'\n onInteraction(action, { id: item.id, nb: quantity() })\n quantityDialogOpen.set(false)\n return\n }\n const item = currentItem()\n if (!isItemDisabled(item)) {\n quantityDialogOpen.set(true)\n }\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (quantityDialogOpen()) {\n quantityDialogOpen.set(false)\n return\n }\n tradeView.set('mode')\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n const tabControls = signal({\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) return\n navTab.next(-1)\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n if (quantityDialogOpen()) return\n navTab.next(1)\n }\n },\n gamepad: {\n enabled: true\n }\n })\n</script>\n"],"mappings":";;;;AAWM,SAAwB,UAAM,SAAW;AACxB,UAAS,QAAG;CAC3B,MAAM,cAAc,eAAK,QAAA;CACzB,MAAM,SAAS,OAAC,gBAAA;CACxB,MAAM,gBAAgB,OAAG,MAAA;CACzB,MAAM,mBAAmB,OAAO,aAAS;CACzC,MAAM,aAAa,YAAW;EAC1B,YAAY,OAAM,eAAG,OAAA;EACrB,SAAS;EACZ;CACD,MAAM,WAAW,OAAO,aAAa,YAAU;CAC/C,MAAM,eAAe,OAAA,EAAA;CACrB,MAAM,cAAW,OAAA,EAAA;;CAEjB,MAAM,YAAW,OAAO,OAAQ;CAChC,MAAM,oBAAoB,OAAM,EAAA;CAChC,MAAM,WAAW,OAAI,EAAA;CACrB,MAAM,qBAAmB,OAAO,MAAQ;CACxC,MAAM,iBAAiB;CACvB,MAAM,OAAO;EACT;GAAE,IAAI;GAAQ,OAAO;GAAQ;EAC7B;GAAE,IAAI;GAAU,OAAO;GAAW;EAClC;GAAE,IAAI;GAAS,OAAO;GAAG;EAC5B;CACD,MAAM,EAAE,MAAM,eAAe,aAAW,aAAU;CAClD,MAAM,eAAe,UAAU,OAAM,UAAW,aAAa,OAAM,GAAA;CACnE,MAAM,UAAU,eAAe,YAAM,KAAA,IAAA,EAAA,CAAA;CACrC,MAAM,cAAc,eAAe;EAC/B,MAAM,UAAU,YAAY,SAAQ,CAAA,QAAQ;AAC5C,SAAO,UAAU,OAAO,QAAQ,GAAG;GACrC;CACF,MAAM,OAAO,eAAe,YAAS,SAAA,CAAA,KAAA,CAAA;CACrC,MAAM,UAAU,eAAe;EAC3B,MAAM,QAAQ,MAAM;AACpB,SAAO,SAAS,MAAM;GACxB;CACF,MAAM,WAAW,eAAe,SAAK,CAAA,SAAA,EAAA,CAAA;CACrC,MAAM,YAAY,eAAY,SAAU,CAAA,aAAA,EAAA,CAAA;CACxC,MAAM,cAAc,eAAS,WAAA,KAAA,QAAA,UAAA,GAAA,WAAA,CAAA;CAC7B,MAAM,gBAAgB,eAAO;EACzB,MAAM,MAAM,KAAK,aAAI;EACrB,MAAM,QAAM,aAAA;AACZ,MAAI,CAAC,IACD,QAAO,EAAE;AACb,SAAO,MAAM,QAAI,SAAW,MAAQ,SAAE,IAAW,GAAE;GACrD;CACF,MAAM,cAAc,eAAe,eAAc,CAAA,cAAM,EAAA;CACvD,MAAM,OAAO,eAAe,eAAQ,CAAA,OAAA,CAAA;CACpC,MAAM,cAAc,eAAe,WAAW,KAAK,QAAK,QAAA,OAAA;CACxD,MAAM,aAAa,WAAW,mBAAc;EACxC,YAAY,OAAO,eAAa,UAAU;EAC1C,SAAS,iBAAiB;EAC7B;CACD,MAAM,cAAc,eAAQ;EACxB,MAAM,OAAO,aAAY;AACzB,MAAI,CAAC,KAAA,QAAA;EAEL,MAAM,QAAQ,MAAM,SAAQ;AAC5B,MAAI,SAAS,EACT,QAAO;AACX,MAAI,WAAW,KAAK,QAAQ;GACxB,MAAM,MAAM,MAAM,YAAW;AAC7B,UAAO,KAAK,IAAI,GAAG,IAAI;;AAE3B,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,GAAG,MAAM,CAAA;GAC/C;CACF,MAAM,aAAa,eAAe;AAE9B,UADc,aAAa,EAAE,SAAS,KACvB,UAAU;GAC3B;CACF,MAAM,eAAe,eAAe;EAChC,MAAM,QAAQ,aAAa,EAAE,SAAS,EAAE;EACxC,MAAM,SAAS,SAAS,CAAC,gBAAgB,EAAA;EACzC,MAAM,QAAQ;GAAC;GAAO;GAAO;GAAQ;GAAI;GAAW;GAAK;GAAS;GAAK;GAAW;GAAM;EACxF,MAAM,SAAS;GACX,KAAK;GACL,KAAK;GACL,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,OAAO;GACP,OAAO;;EAEX,MAAM,cAAc,MAAK,QAAO,QAAS,MAAO,SAAC,KAAA,EAAA;EACjD,MAAM,YAAY,OAAO,KAAI,MAAO,CAAA,QAAS,QAAQ,CAAA,MAAO,SAAA,IAAA,CAAA;EAC5D,MAAM,OAAO,YAAY,OAAO,UAAQ;EACxC,MAAM,OAAO,EAAE;AACf,OAAK,MAAM,OAAO,MAAM;GACpB,MAAM,QAAQ,MAAM;AACpB,OAAI,UAAU,KAAA,KAAa,UAAU,EACjC;GACJ,IAAI,UAAU,OAAO;AACrB,OAAI,YAAY,KAAA,KAAa,QAAA,MACzB,WAAU,OAAO;GACrB,MAAM,OAAO,YAAY,KAAA,IAAU,UAAY,QAAG,KAAA;AAClD,QAAK,KAAK;IACN;IACA,OAAO,OAAO,QAAQ,IAAG,aAAc;IACvC;IACA;IACA;IACH,CAAC;;AAEN,SAAO;GACT;CACF,MAAM,MAAM,wBAAqB,cAAgB,EAAA,aAAa,eAAA,CAAA,QAAA,EAAA,OAAA;CAC9D,MAAM,SAAS,wBAAoB,aAAe,EAAA,aAAiB,KAAE,QAAA,EAAA,OAAA;CACrE,MAAM,UAAU,wBAAiB,mBAAA,EAAA,aAAA,GAAA,EAAA,OAAA;CACjC,SAAS,WAAW,OAAO;AACvB,SAAO,WAAY;AACf,gBAAa,IAAI,MAAM;AACvB,YAAS,IAAI,EAAE;AACf,OAAI,CAAC,eAAe,eAAe,CAAC,OAAK,CACrC,oBAAmB,IAAI,KAAK;;;CAIxC,SAAS,UAAU,OAAO;AACtB,SAAO,WAAY;AACf,eAAY,IAAI,MAAM;AACtB,gBAAa,IAAI,EAAE;;;CAG3B,SAAS,WAAW,MAAM;AACtB,SAAO,WAAY;AACf,aAAU,IAAI,KAAK;AACnB,qBAAkB,IAAG,SAAA,QAAA,IAAA,EAAA;AACrB,gBAAa,IAAI,EAAA;AACjB,YAAS,IAAI,EAAC;AACd,aAAQ,IAAA,QAAA;;;CAGhB,SAAS,eAAe,MAAK;AACzB,MAAI,CAAC,KACD,QAAO;EACX,MAAM,QAAQ,MAAM,SAAS;AAC7B,MAAI,SAAS,EACT,QAAO;AACX,MAAI,WAAW,KAAK,OAEhB,SADY,MAAM,YAAW,MACf;AAElB,SAAO,MAAM,GAAG;;CAEpB,SAAS,aAAa;AAClB,SAAO,WAAY;AACf,aAAU,IAAI,OAAO;;;CAG7B,SAAS,eAAe,OAAM;AAC1B,SAAO,WAAY;GACf,MAAM,QAAQ,aAAW;AACzB,OAAI,SAAS,EACT;GACJ,MAAM,YAAY,KAAK,IAAG,GAAA,KAAM,IAAA,OAAA,UAAA,GAAA,MAAA,CAAA;AAChC,OAAI,cAAc,UAAO,CACrB,UAAS,IAAI,UAAI;;;CAI7B,SAAS,sBAAQ;AACb,SAAM,WAAG;AACP,sBAAY,IAAA,MAAA;;;CAGlB,SAAI,eAAgB;AAChB,SAAO,WAAW;GAClB,MAAS,OAAA,aAAkB;;AAErB,uBAAgB,IAAA,MAAe;AAC/B;;AAGF,iBADe,WAAW,KAAC,QAAA,YAAA,YACR;IAAA,IAAA,KAAc;IAAC,IAAO,UAAA;IAAA,CAAA;AACzC,sBAAiB,IAAA,MAAA;;;;EAIrB,MAAM,QAAA,eAAuB,CAAA;AAC7B,MAAA,cAAkB,IAAE,MACpB,cAAiB,IAAC,KAAQ,IAAI,GAAA,QAAA,EAAA,CAAA;GAEhC;CACF,MAAI,eAAiB,OAAO;EACxB,MAAM;GACN,QAAM;GACN,MAAU,iBAAG;GACT,UAAO;GACP,UAAO;AACH,YAAQ,KAAG,GAAK;;;EAGxB,OAAO;;GAEP,MAAM,iBAAqB;GAC3B,UAAc;GACd,UAAM;AACF,YAAM,KAAU,EAAA;;GAEnB;EACD,QAAM;GACN,MAAM,iBAAqB;GACvB,UAAM;IACN,MAAO,OAAS,mBAAM,KAAA,IAAA,QAAA;AACzB,cAAA,IAAA,KAAA;AACK,iBAAW,IAAQ,EAAE;AACrB,aAAW,IAAC,EAAA;AACZ,cAAY,IAAE,QAAU;;GAE7B;EACD,QAAI;GACA,MAAK,iBAAa;GAClB,UAAO;AACV,cAAA;;GAED;EACA,SAAM,EACN,SAAM,MACL;EACJ,CAAC;CACF,MAAK,eAAA,OAAA;EACD,IAAA;GACI,QAAM;GACN,MAAK,iBAAa;GAClB,UAAM;GACN,UAAU;AACN,QAAA,oBAAwB,EAAA;AACxB,oBAAkB,EAAA,EAAA;AAClB;;AAEJ,QAAO,KAAK,GAAI;;GAEpB;EACA,MAAI;GACA,QAAO;GACV,MAAA,iBAAA;GACD,UAAM;GACF,UAAM;AACN,QAAM,oBAAmB,EAAA;AACnB,oBAAiB,GAAG,EAAE;AACtB;;AAEF,QAAI,KAAK,EAAC;;GAEjB;EACD,QAAQ;GACJ,MAAI,iBAAU;GACd,UAAU;AACN,QAAI,oBAAM,EAAA;KACV,MAAQ,OAAO,aAAA;AACf,SAAQ,CAAA,QAAM,eAAA,KAAA,EAAA;AAClB,yBAAA,IAAA,MAAA;AACM;;AAGA,mBADO,WAAmB,KAAA,QAAS,YAAA,YAC3B;MAAA,IAAA,KAAA;MAAA,IAAA,UAAA;MAAA,CAAA;AACT,wBAAmB,IAAA,MAAA;AACpB;;AAGA,QAAI,CAAA,eADS,aACG,CAAS,CACzB,oBAAuB,IAAE,KAAA;;GAGhC;EACD,QAAQ;GACJ,MAAM,iBAAS;GACf,UAAQ;AACJ,QAAC,oBAAA,EAAA;AACL,wBAAA,IAAA,MAAA;AACO;;AAEL,cAAM,IAAA,OAAA;;GAEZ;aAEA,SAAS,MACR;EACJ,CAAC;CACF,MAAM,cAAc,OAAE;EAClB,MAAM;GACF,QAAI;GACJ,MAAA,iBAAA;GACD,UAAA;GACH,UAAA;6BAES;AACL,WAAO,KAAS,GAAE;;GAErB;EACD,OAAI;GACJ,QAAA;;GAEA,UAAS;GACL,UAAO;AACH,QAAA,oBAAkB,CAClB;AACA,WAAA,KAAY,EAAC;;GAEpB;EACD,SAAI,EACJ,SAAA,MAAA;EAEH,CAAC;AAEM,QADW,EAAA,cAAO;EAAA,OAAA;EAAA,QAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qBAAA;EAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,OAAA,EAAA,KAAA,eAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,EAAA,EAAA,WAAA;EAAA,OAAA,eAAA,UAAA,MAAA,CAAA,IAAA,MAAA,CAAA,WAAA,CAAA;EAAA,OAAA;EAAA,QAAA;EAAA,WAAA;EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,aAAA,eAAA,aAAA,CAAA;EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iBAAA;EAAA,aAAA,eAAA,MAAA,GAAA,SAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iBAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iBAAA;EAAA,EAAA,CAAA,KAAA,eAAA,WAAA,KAAA,OAAA,QAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0CAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0CAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,2BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,yBAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,cAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kBAAA;EAAA,EAAA,EAAA,YAAA;EAAA,UAAA;EAAA,UAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,gBAAA,gBAAA,EAAA,QAAA,mBAAA,KAAA,GAAA,EAAA,CAAA;GAAA,OAAA,WAAA,MAAA;GAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,gBAAA,gBAAA,EAAA,QAAA,mBAAA,KAAA,GAAA,EAAA,CAAA;GAAA,OAAA,WAAA,OAAA;GAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,EAAA,YAAA,EAAA,SAAA,OAAA,EAAA,CAAA,EAAA,YAAA;EAAA,UAAA;EAAA,UAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iBAAA;EAAA,EAAA,KAAA,OAAA,KAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,gBAAA,gBAAA,EAAA,QAAA,aAAA,KAAA,OAAA,EAAA,CAAA;GAAA,UAAA;GAAA,OAAA,UAAA,MAAA;GAAA;EAAA,aAAA,IAAA;EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,iBAAA;EAAA,EAAA,EAAA,YAAA;EAAA,UAAA;EAAA,UAAA;EAAA,EAAA,KAAA,gBAAA,MAAA,UAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA,CAAA,iBAAA,gBAAA;IAAA,UAAA,eAAA,KAAA;IAAA,UAAA,cAAA,KAAA;IAAA,EAAA,CAAA;GAAA,UAAA;GAAA,OAAA,WAAA,MAAA;GAAA;EAAA,EAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,sBAAA;GAAA,EAAA,KAAA,KAAA,YAAA,EAAA,WAAA;GAAA,OAAA,eAAA,UAAA,KAAA,KAAA,CAAA;GAAA,SAAA;GAAA,OAAA;GAAA,QAAA;GAAA,WAAA;GAAA,CAAA,CAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,sBAAA;GAAA,aAAA,KAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,uBAAA;GAAA,aAAA,KAAA,QAAA;GAAA,CAAA;EAAA,KAAA,eAAA,KAAA,aAAA,KAAA,EAAA,QAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,qBAAA;GAAA,aAAA,MAAA,KAAA;GAAA,CAAA,CAAA;EAAA,KAAA,KAAA,gBAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,qBAAA;GAAA,aAAA;GAAA,CAAA,CAAA;EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oBAAA;EAAA,EAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,2BAAA;GAAA,EAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,yBAAA;IAAA,EAAA,EAAA,WAAA;IAAA,OAAA,eAAA,UAAA,aAAA,EAAA,KAAA,CAAA;IAAA,SAAA;IAAA,OAAA;IAAA,QAAA;IAAA,WAAA;IAAA,CAAA,CAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,cAAA;IAAA,aAAA,eAAA,aAAA,EAAA,QAAA,GAAA;IAAA,CAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,qDAAA;IAAA,aAAA,eAAA,aAAA,EAAA,SAAA,IAAA,SAAA;IAAA,CAAA;GAAA,KAAA,eAAA,aAAA,EAAA,aAAA,KAAA,EAAA,QAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,wBAAA;IAAA,aAAA,eAAA,WAAA,aAAA,EAAA,SAAA;IAAA,CAAA,CAAA;GAAA,CAAA;EAAA,EAAA,YAAA,EAAA,SAAA,OAAA,EAAA,KAAA,aAAA,EAAA,gBAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,qBAAA;GAAA,aAAA;GAAA,CAAA,CAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,yBAAA;GAAA,aAAA,eAAA,aAAA,EAAA,eAAA,GAAA;GAAA,CAAA;EAAA,EAAA,YAAA,EAAA,SAAA,OAAA,EAAA,KAAA,eAAA,cAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,kBAAA;GAAA,EAAA,KAAA,eAAA,MAAA,UAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,CAAA,iBAAA;IAAA,UAAA,KAAA,QAAA;IAAA,UAAA,KAAA,QAAA;IAAA,CAAA,EAAA;GAAA,EAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,qBAAA;IAAA,aAAA,KAAA;IAAA,CAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,uBAAA;IAAA,aAAA,KAAA,QAAA,IAAA,MAAA,KAAA,KAAA;IAAA,CAAA;GAAA,KAAA,eAAA,KAAA,YAAA,KAAA,EAAA,QAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,yBAAA;IAAA,aAAA,KAAA,UAAA,QAAA,KAAA;IAAA,CAAA,CAAA;GAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA;IAAA,OAAA;IAAA,OAAA,YAAA;IAAA;GAAA,aAAA;GAAA,CAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,KAAA,0BAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kBAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,uBAAA;EAAA,EAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,wBAAA;GAAA,aAAA;GAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,uBAAA;GAAA,aAAA,eAAA,aAAA,EAAA,QAAA,GAAA;GAAA,CAAA;EAAA,KAAA,eAAA,aAAA,EAAA,aAAA,KAAA,EAAA,QAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,sBAAA;GAAA,aAAA,eAAA,iBAAA,aAAA,EAAA,SAAA;GAAA,CAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,qBAAA;GAAA,EAAA,CAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,2BAAA;GAAA,aAAA;GAAA,CAAA,EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,8BAAA;GAAA,EAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA;KAAA,OAAA;KAAA,OAAA,eAAA,GAAA;KAAA;IAAA,aAAA;IAAA,CAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA,EAAA,OAAA,2BAAA;IAAA,aAAA;IAAA,CAAA;GAAA,EAAA,YAAA;IAAA,SAAA;IAAA,OAAA;KAAA,OAAA;KAAA,OAAA,eAAA,EAAA;KAAA;IAAA,aAAA;IAAA,CAAA;GAAA,CAAA,CAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,wBAAA;GAAA,EAAA,CAAA,EAAA,YAAA;GAAA,SAAA;GAAA,aAAA;GAAA,CAAA,EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,aAAA,eAAA,YAAA,GAAA,SAAA;GAAA,CAAA,CAAA,CAAA;EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA,EAAA,OAAA,0BAAA;GAAA,EAAA,CAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA;IAAA,OAAA;IAAA,OAAA,qBAAA;IAAA;GAAA,aAAA;GAAA,CAAA,EAAA,EAAA,YAAA;GAAA,SAAA;GAAA,OAAA;IAAA,OAAA;IAAA,OAAA,cAAA;IAAA;GAAA,aAAA,eAAA,aAAA,GAAA,OAAA,UAAA,CAAA;GAAA,CAAA,CAAA,CAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACN"}
|