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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/Game/AnimationManager.d.ts +1 -0
  3. package/dist/Game/AnimationManager.js +3 -0
  4. package/dist/Game/AnimationManager.js.map +1 -1
  5. package/dist/Game/ClientVisuals.d.ts +61 -0
  6. package/dist/Game/ClientVisuals.js +96 -0
  7. package/dist/Game/ClientVisuals.js.map +1 -0
  8. package/dist/Game/ClientVisuals.spec.d.ts +1 -0
  9. package/dist/Game/EventComponentResolver.d.ts +16 -0
  10. package/dist/Game/EventComponentResolver.js +52 -0
  11. package/dist/Game/EventComponentResolver.js.map +1 -0
  12. package/dist/Game/EventComponentResolver.spec.d.ts +1 -0
  13. package/dist/Game/Map.js +9 -0
  14. package/dist/Game/Map.js.map +1 -1
  15. package/dist/Game/Object.d.ts +2 -0
  16. package/dist/Game/Object.js +22 -8
  17. package/dist/Game/Object.js.map +1 -1
  18. package/dist/Game/Object.spec.d.ts +1 -0
  19. package/dist/Game/ProjectileManager.d.ts +11 -2
  20. package/dist/Game/ProjectileManager.js +19 -2
  21. package/dist/Game/ProjectileManager.js.map +1 -1
  22. package/dist/Gui/Gui.d.ts +3 -2
  23. package/dist/Gui/Gui.js +18 -6
  24. package/dist/Gui/Gui.js.map +1 -1
  25. package/dist/RpgClient.d.ts +85 -1
  26. package/dist/RpgClientEngine.d.ts +77 -2
  27. package/dist/RpgClientEngine.js +290 -31
  28. package/dist/RpgClientEngine.js.map +1 -1
  29. package/dist/components/animations/fx.ce.js +58 -0
  30. package/dist/components/animations/fx.ce.js.map +1 -0
  31. package/dist/components/animations/index.d.ts +1 -0
  32. package/dist/components/animations/index.js +3 -1
  33. package/dist/components/animations/index.js.map +1 -1
  34. package/dist/components/character.ce.js +192 -19
  35. package/dist/components/character.ce.js.map +1 -1
  36. package/dist/components/gui/dialogbox/index.ce.js +27 -12
  37. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  38. package/dist/components/gui/gameover.ce.js +4 -3
  39. package/dist/components/gui/gameover.ce.js.map +1 -1
  40. package/dist/components/gui/menu/equip-menu.ce.js +9 -8
  41. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  42. package/dist/components/gui/menu/exit-menu.ce.js +7 -5
  43. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  44. package/dist/components/gui/menu/items-menu.ce.js +8 -7
  45. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  46. package/dist/components/gui/menu/main-menu.ce.js +12 -11
  47. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  48. package/dist/components/gui/menu/options-menu.ce.js +7 -5
  49. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  50. package/dist/components/gui/menu/skills-menu.ce.js +4 -2
  51. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  52. package/dist/components/gui/notification/notification.ce.js +4 -1
  53. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  54. package/dist/components/gui/save-load.ce.js +10 -9
  55. package/dist/components/gui/save-load.ce.js.map +1 -1
  56. package/dist/components/gui/shop/shop.ce.js +17 -16
  57. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  58. package/dist/components/gui/title-screen.ce.js +4 -3
  59. package/dist/components/gui/title-screen.ce.js.map +1 -1
  60. package/dist/components/interaction-components.ce.js +20 -0
  61. package/dist/components/interaction-components.ce.js.map +1 -0
  62. package/dist/components/scenes/canvas.ce.js +12 -7
  63. package/dist/components/scenes/canvas.ce.js.map +1 -1
  64. package/dist/components/scenes/draw-map.ce.js +18 -13
  65. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  66. package/dist/i18n.d.ts +55 -0
  67. package/dist/i18n.js +60 -0
  68. package/dist/i18n.js.map +1 -0
  69. package/dist/i18n.spec.d.ts +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.js +5 -2
  72. package/dist/module.js +30 -3
  73. package/dist/module.js.map +1 -1
  74. package/dist/services/actionInput.d.ts +3 -1
  75. package/dist/services/actionInput.js +33 -1
  76. package/dist/services/actionInput.js.map +1 -1
  77. package/dist/services/interactions.d.ts +159 -0
  78. package/dist/services/interactions.js +460 -0
  79. package/dist/services/interactions.js.map +1 -0
  80. package/dist/services/interactions.spec.d.ts +1 -0
  81. package/dist/services/keyboardControls.d.ts +1 -0
  82. package/dist/services/keyboardControls.js +1 -0
  83. package/dist/services/keyboardControls.js.map +1 -1
  84. package/dist/services/standalone.d.ts +3 -1
  85. package/dist/services/standalone.js +31 -13
  86. package/dist/services/standalone.js.map +1 -1
  87. package/dist/utils/mapId.d.ts +1 -0
  88. package/dist/utils/mapId.js +6 -0
  89. package/dist/utils/mapId.js.map +1 -0
  90. package/package.json +4 -4
  91. package/src/Game/AnimationManager.ts +4 -0
  92. package/src/Game/ClientVisuals.spec.ts +56 -0
  93. package/src/Game/ClientVisuals.ts +184 -0
  94. package/src/Game/EventComponentResolver.spec.ts +84 -0
  95. package/src/Game/EventComponentResolver.ts +74 -0
  96. package/src/Game/Map.ts +10 -0
  97. package/src/Game/Object.spec.ts +59 -0
  98. package/src/Game/Object.ts +36 -12
  99. package/src/Game/ProjectileManager.spec.ts +111 -0
  100. package/src/Game/ProjectileManager.ts +24 -2
  101. package/src/Gui/Gui.spec.ts +67 -0
  102. package/src/Gui/Gui.ts +24 -7
  103. package/src/RpgClient.ts +96 -1
  104. package/src/RpgClientEngine.ts +378 -45
  105. package/src/components/animations/fx.ce +101 -0
  106. package/src/components/animations/index.ts +4 -2
  107. package/src/components/character.ce +243 -17
  108. package/src/components/gui/dialogbox/index.ce +35 -14
  109. package/src/components/gui/gameover.ce +4 -3
  110. package/src/components/gui/menu/equip-menu.ce +9 -8
  111. package/src/components/gui/menu/exit-menu.ce +4 -3
  112. package/src/components/gui/menu/items-menu.ce +8 -7
  113. package/src/components/gui/menu/main-menu.ce +12 -11
  114. package/src/components/gui/menu/options-menu.ce +4 -3
  115. package/src/components/gui/menu/skills-menu.ce +2 -1
  116. package/src/components/gui/notification/notification.ce +7 -1
  117. package/src/components/gui/save-load.ce +11 -10
  118. package/src/components/gui/shop/shop.ce +17 -16
  119. package/src/components/gui/title-screen.ce +4 -3
  120. package/src/components/interaction-components.ce +23 -0
  121. package/src/components/scenes/canvas.ce +12 -7
  122. package/src/components/scenes/draw-map.ce +16 -5
  123. package/src/i18n.spec.ts +39 -0
  124. package/src/i18n.ts +59 -0
  125. package/src/index.ts +3 -0
  126. package/src/module.ts +43 -10
  127. package/src/services/actionInput.spec.ts +54 -0
  128. package/src/services/actionInput.ts +68 -1
  129. package/src/services/interactions.spec.ts +175 -0
  130. package/src/services/interactions.ts +722 -0
  131. package/src/services/keyboardControls.ts +2 -1
  132. package/src/services/standalone.ts +39 -10
  133. package/src/utils/mapId.ts +2 -0
@@ -7,6 +7,7 @@ function component($$props) {
7
7
  useProps($$props);
8
8
  const defineProps = useDefineProps($$props);
9
9
  const engine = inject(RpgClientEngine);
10
+ const { t } = engine.i18n();
10
11
  const currentPlayer = engine.scene.currentPlayer;
11
12
  const keyboardControls = engine.globalConfig.keyboardControls;
12
13
  const iconSheet = (iconId) => ({
@@ -21,19 +22,19 @@ function component($$props) {
21
22
  const selectedModeIndex = signal(0);
22
23
  const quantity = signal(1);
23
24
  const quantityDialogOpen = signal(false);
24
- const defaultMessage = "Welcome to my shop!";
25
+ const defaultMessage = t("rpg.shop.default-message");
25
26
  const tabs = [
26
27
  {
27
28
  id: "item",
28
- label: "Items"
29
+ label: t("rpg.menu.items")
29
30
  },
30
31
  {
31
32
  id: "weapon",
32
- label: "Weapons"
33
+ label: t("rpg.menu.weapons")
33
34
  },
34
35
  {
35
36
  id: "armor",
36
- label: "Armor"
37
+ label: t("rpg.menu.armor")
37
38
  }
38
39
  ];
39
40
  const { data, onInteraction, onFinish } = defineProps();
@@ -59,7 +60,7 @@ function component($$props) {
59
60
  });
60
61
  const currentItem = computed(() => filteredItems()[selectedItem()]);
61
62
  const gold = computed(() => currentPlayer()._gold());
62
- const actionLabel = computed(() => tradeMode() === "buy" ? "Buy" : "Sell");
63
+ const actionLabel = computed(() => tradeMode() === "buy" ? t("rpg.shop.buy") : t("rpg.shop.sell"));
63
64
  const faceSheet = (graphicId, animationName) => ({
64
65
  definition: engine.getSpriteSheet(graphicId),
65
66
  playing: animationName || "default"
@@ -357,7 +358,7 @@ function component($$props) {
357
358
  }), h(DOMElement, {
358
359
  element: "h2",
359
360
  attrs: { style: "margin: 0;" },
360
- textContent: "Choose an action"
361
+ textContent: computed(() => t("rpg.shop.choose-action"))
361
362
  })]), h(DOMElement, {
362
363
  element: "div",
363
364
  attrs: { class: "rpg-shop-trade" }
@@ -373,14 +374,14 @@ function component($$props) {
373
374
  class: ["rpg-shop-tab", computed(() => ({ active: selectedModeIndex() === 0 }))],
374
375
  click: selectMode("buy")
375
376
  },
376
- textContent: "Buy"
377
+ textContent: computed(() => t("rpg.shop.buy"))
377
378
  }), h(DOMElement, {
378
379
  element: "div",
379
380
  attrs: {
380
381
  class: ["rpg-shop-tab", computed(() => ({ active: selectedModeIndex() === 1 }))],
381
382
  click: selectMode("sell")
382
383
  },
383
- textContent: "Sell"
384
+ textContent: computed(() => t("rpg.shop.sell"))
384
385
  })])))])), () => h(DOMElement, { element: "div" }, [h(Navigation, {
385
386
  tabindex: selectedTab,
386
387
  controls: tabControls
@@ -443,7 +444,7 @@ function component($$props) {
443
444
  cond(item.equipped, () => h(DOMElement, {
444
445
  element: "div",
445
446
  attrs: { class: "rpg-shop-card-tag" },
446
- textContent: "Equipped"
447
+ textContent: computed(() => t("rpg.shop.equipped"))
447
448
  }))
448
449
  ])))), h(DOMElement, {
449
450
  element: "div",
@@ -476,13 +477,13 @@ function component($$props) {
476
477
  cond(computed(() => currentItem()?.quantity !== void 0), () => h(DOMElement, {
477
478
  element: "div",
478
479
  attrs: { class: "rpg-shop-details-qty" },
479
- textContent: computed(() => "Qty: x" + currentItem()?.quantity)
480
+ textContent: computed(() => t("rpg.shop.qty") + ": x" + currentItem()?.quantity)
480
481
  }))
481
482
  ]),
482
483
  h(DOMElement, { element: "div" }, cond(computed(() => currentItem()?.equipped), () => h(DOMElement, {
483
484
  element: "div",
484
485
  attrs: { class: "rpg-shop-equipped" },
485
- textContent: "Already equipped"
486
+ textContent: computed(() => t("rpg.shop.already-equipped"))
486
487
  }))),
487
488
  h(DOMElement, {
488
489
  element: "div",
@@ -521,7 +522,7 @@ function component($$props) {
521
522
  class: "rpg-shop-btn",
522
523
  click: backToMode()
523
524
  },
524
- textContent: "Back"
525
+ textContent: computed(() => t("rpg.shop.back"))
525
526
  })
526
527
  ])])])), cond(quantityDialogOpen, () => h(DOMElement, {
527
528
  element: "div",
@@ -543,7 +544,7 @@ function component($$props) {
543
544
  cond(computed(() => currentItem()?.quantity !== void 0), () => h(DOMElement, {
544
545
  element: "div",
545
546
  attrs: { class: "rpg-shop-modal-qty" },
546
- textContent: computed(() => "Available: x" + currentItem()?.quantity)
547
+ textContent: computed(() => t("rpg.shop.available") + ": x" + currentItem()?.quantity)
547
548
  })),
548
549
  h(DOMElement, {
549
550
  element: "div",
@@ -551,7 +552,7 @@ function component($$props) {
551
552
  }, [h(DOMElement, {
552
553
  element: "div",
553
554
  attrs: { class: "rpg-shop-quantity-label" },
554
- textContent: "Quantity"
555
+ textContent: computed(() => t("rpg.shop.quantity"))
555
556
  }), h(DOMElement, {
556
557
  element: "div",
557
558
  attrs: { class: "rpg-shop-quantity-controls" }
@@ -583,7 +584,7 @@ function component($$props) {
583
584
  attrs: { class: "rpg-shop-modal-total" }
584
585
  }, [h(DOMElement, {
585
586
  element: "span",
586
- textContent: "Total"
587
+ textContent: computed(() => t("rpg.shop.total"))
587
588
  }), h(DOMElement, {
588
589
  element: "span",
589
590
  textContent: computed(() => totalPrice() + goldTerm)
@@ -597,7 +598,7 @@ function component($$props) {
597
598
  class: "rpg-shop-btn rpg-shop-btn-secondary",
598
599
  click: closeQuantityDialog()
599
600
  },
600
- textContent: "Cancel"
601
+ textContent: computed(() => t("rpg.menu.cancel"))
601
602
  }), h(DOMElement, {
602
603
  element: "button",
603
604
  attrs: {
@@ -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 import { getKeyboardControlBind } from \"../../../services/actionInput\";\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: getKeyboardControlBind(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: getKeyboardControlBind(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;\">{t(\"rpg.shop.choose-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 >{t(\"rpg.shop.buy\")}</div>\n <div\n class=\"rpg-shop-tab\"\n class={{active: selectedModeIndex() === 1}}\n click={selectMode('sell')}\n >{t(\"rpg.shop.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\">{t(\"rpg.shop.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\">{t(\"rpg.shop.qty\")}: x{{ currentItem()?.quantity }}</div>\n }\n </div>\n <div>\n @if (currentItem()?.equipped) {\n <div class=\"rpg-shop-equipped\">{t(\"rpg.shop.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()}>{t(\"rpg.shop.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\">{t(\"rpg.shop.available\")}: x{{ currentItem()?.quantity }}</div>\n }\n <div class=\"rpg-shop-quantity\">\n <div class=\"rpg-shop-quantity-label\">{t(\"rpg.shop.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>{t(\"rpg.shop.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()}>{t(\"rpg.menu.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 import { getKeyboardControlBind } from \"../../../services/actionInput\";\n\n const engine = inject(RpgClientEngine)\n const { t } = engine.i18n()\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls\n 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 = t(\"rpg.shop.default-message\")\n const tabs = [\n { id: 'item', label: t(\"rpg.menu.items\") },\n { id: 'weapon', label: t(\"rpg.menu.weapons\") },\n { id: 'armor', label: t(\"rpg.menu.armor\") }\n ]\n\n const { 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' ? t(\"rpg.shop.buy\") : t(\"rpg.shop.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: getKeyboardControlBind(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: getKeyboardControlBind(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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"}
@@ -9,6 +9,7 @@ function component($$props) {
9
9
  useProps($$props);
10
10
  const defineProps = useDefineProps($$props);
11
11
  const engine = inject(RpgClientEngine);
12
+ const { t } = engine.i18n();
12
13
  const guiService = inject(RpgGui);
13
14
  const keyboardControls = engine.globalConfig.keyboardControls;
14
15
  const { data, onInteraction } = defineProps({
@@ -19,13 +20,13 @@ function component($$props) {
19
20
  const { entries, title, subtitle, version, saveLoad, localActions } = data();
20
21
  const defaultEntries = [{
21
22
  id: "start",
22
- label: "Start"
23
+ label: t("rpg.title.start")
23
24
  }, {
24
25
  id: "load",
25
- label: "Load"
26
+ label: t("rpg.title.load")
26
27
  }];
27
28
  const resolveProp = (value) => typeof value === "function" ? value() : value;
28
- const titleText = computed(() => resolveProp(title) || "RPG");
29
+ const titleText = computed(() => resolveProp(title) || t("rpg.title.default"));
29
30
  const subtitleText = computed(() => resolveProp(subtitle) || "");
30
31
  const versionText = computed(() => resolveProp(version) || "");
31
32
  const localActionsEnabled = computed(() => resolveProp(localActions) === true);
@@ -1 +1 @@
1
- {"version":3,"file":"title-screen.ce.js","names":[],"sources":["../../../src/components/gui/title-screen.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-title-screen rpg-anim-fade-in\">\n <div class=\"rpg-ui-title-screen-header rpg-anim-float\">\n <div class=\"rpg-ui-title-screen-title\">{titleText()}</div>\n @if (subtitleText()) {\n <div class=\"rpg-ui-title-screen-subtitle\">{subtitleText()}</div>\n }\n </div>\n <Navigation tabindex={selectedEntry} controls={controls}>\n <div class=\"rpg-ui-menu rpg-ui-title-screen-menu rpg-anim-slide-up\">\n @for ((entry,index) of entryList()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isEntryDisabled(entry)}}\n data-selected={selectedEntry() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectEntry(index)}\n >{entry.label}</div>\n }\n </div>\n </Navigation>\n @if (versionText()) {\n <div class=\"rpg-ui-title-screen-version\">{versionText()}</div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect } from \"canvasengine\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { getKeyboardControlBind } from \"../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const guiService = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { data, onInteraction } = defineProps({\n entries: {\n default: () => []\n },\n saveLoad: {\n default: () => ({})\n },\n localActions: {\n default: false\n }\n });\n\n const { entries, title, subtitle, version, saveLoad, localActions } = data();\n\n const defaultEntries = [\n { id: \"start\", label: \"Start\" },\n { id: \"load\", label: \"Load\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || \"RPG\");\n const subtitleText = computed(() => resolveProp(subtitle) || \"\");\n const versionText = computed(() => resolveProp(version) || \"\");\n const localActionsEnabled = computed(() => resolveProp(localActions) === true);\n\n const entryList = computed(() => {\n const list = resolveProp(entries);\n if (Array.isArray(list) && list.length) return list;\n return defaultEntries;\n });\n\n const isEntryDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n return false;\n };\n\n const selectedEntry = signal(0);\n const selectableIndexes = computed(() => {\n const list = entryList();\n return list\n .map((entry, index) => (isEntryDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n if (!available.includes(current)) {\n selectedEntry.set(available[0]);\n }\n });\n\n const moveSelection = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedEntry.set(available[nextIndex]);\n };\n\n const triggerSelect = (index) => {\n const list = entryList();\n const entry = list[index];\n if (!entry || isEntryDisabled(entry)) return;\n if (localActionsEnabled()) {\n if (entry.id === \"start\") {\n guiService.hide(PrebuiltGui.TitleScreen);\n }\n if (entry.id === \"load\") {\n const config = resolveProp(saveLoad) || {};\n const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];\n guiService.display(PrebuiltGui.Save, {\n ...config,\n mode: config.mode || \"load\",\n slots\n });\n }\n }\n if (onInteraction) {\n onInteraction(\"select\", { id: entry.id, index, entry });\n }\n };\n\n function selectEntry(index) {\n return function() {\n selectedEntry.set(index);\n triggerSelect(index);\n };\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (guiService.isDisplaying(PrebuiltGui.Save)) return;\n moveSelection(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (guiService.isDisplaying(PrebuiltGui.Save)) return;\n moveSelection(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (guiService.isDisplaying(PrebuiltGui.Save)) return;\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"title-screen.ce.js","names":[],"sources":["../../../src/components/gui/title-screen.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-title-screen rpg-anim-fade-in\">\n <div class=\"rpg-ui-title-screen-header rpg-anim-float\">\n <div class=\"rpg-ui-title-screen-title\">{titleText()}</div>\n @if (subtitleText()) {\n <div class=\"rpg-ui-title-screen-subtitle\">{subtitleText()}</div>\n }\n </div>\n <Navigation tabindex={selectedEntry} controls={controls}>\n <div class=\"rpg-ui-menu rpg-ui-title-screen-menu rpg-anim-slide-up\">\n @for ((entry,index) of entryList()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isEntryDisabled(entry)}}\n data-selected={selectedEntry() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectEntry(index)}\n >{entry.label}</div>\n }\n </div>\n </Navigation>\n @if (versionText()) {\n <div class=\"rpg-ui-title-screen-version\">{versionText()}</div>\n }\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect } from \"canvasengine\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { getKeyboardControlBind } from \"../../services/actionInput\";\n\n const engine = inject(RpgClientEngine);\n const { t } = engine.i18n();\n const guiService = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { data, onInteraction } = defineProps({\n entries: {\n default: () => []\n },\n saveLoad: {\n default: () => ({})\n },\n localActions: {\n default: false\n }\n });\n\n const { entries, title, subtitle, version, saveLoad, localActions } = data();\n\n const defaultEntries = [\n { id: \"start\", label: t(\"rpg.title.start\") },\n { id: \"load\", label: t(\"rpg.title.load\") }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || t(\"rpg.title.default\"));\n const subtitleText = computed(() => resolveProp(subtitle) || \"\");\n const versionText = computed(() => resolveProp(version) || \"\");\n const localActionsEnabled = computed(() => resolveProp(localActions) === true);\n\n const entryList = computed(() => {\n const list = resolveProp(entries);\n if (Array.isArray(list) && list.length) return list;\n return defaultEntries;\n });\n\n const isEntryDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n return false;\n };\n\n const selectedEntry = signal(0);\n const selectableIndexes = computed(() => {\n const list = entryList();\n return list\n .map((entry, index) => (isEntryDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n if (!available.includes(current)) {\n selectedEntry.set(available[0]);\n }\n });\n\n const moveSelection = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedEntry.set(available[nextIndex]);\n };\n\n const triggerSelect = (index) => {\n const list = entryList();\n const entry = list[index];\n if (!entry || isEntryDisabled(entry)) return;\n if (localActionsEnabled()) {\n if (entry.id === \"start\") {\n guiService.hide(PrebuiltGui.TitleScreen);\n }\n if (entry.id === \"load\") {\n const config = resolveProp(saveLoad) || {};\n const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];\n guiService.display(PrebuiltGui.Save, {\n ...config,\n mode: config.mode || \"load\",\n slots\n });\n }\n }\n if (onInteraction) {\n onInteraction(\"select\", { id: entry.id, index, entry });\n }\n };\n\n function selectEntry(index) {\n return function() {\n selectedEntry.set(index);\n triggerSelect(index);\n };\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (guiService.isDisplaying(PrebuiltGui.Save)) return;\n moveSelection(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (guiService.isDisplaying(PrebuiltGui.Save)) return;\n moveSelection(1);\n }\n },\n action: {\n bind: getKeyboardControlBind(keyboardControls.action),\n keyDown() {\n if (guiService.isDisplaying(PrebuiltGui.Save)) return;\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { inject } from "../core/inject.js";
2
+ import { RpgClientEngine } from "../RpgClientEngine.js";
3
+ import { Container, computed, h, loop, useDefineProps, useProps } from "canvasengine";
4
+ //#region src/components/interaction-components.ce
5
+ function component($$props) {
6
+ useProps($$props);
7
+ const { object, bounds, hitboxBounds, graphicBounds } = useDefineProps($$props)();
8
+ const client = inject(RpgClientEngine);
9
+ const sprite = object();
10
+ return h(Container, null, loop(computed(() => client.interactions.getRenderedComponents(sprite, {
11
+ bounds: typeof bounds === "function" ? bounds() : void 0,
12
+ hitbox: typeof hitboxBounds === "function" ? hitboxBounds() : void 0,
13
+ graphic: typeof graphicBounds === "function" ? graphicBounds() : void 0
14
+ })), (entry) => h(Container, { dependencies: entry.dependencies }, h(entry.component, entry.props))));
15
+ }
16
+ var __ce_component = component;
17
+ //#endregion
18
+ export { __ce_component as default };
19
+
20
+ //# sourceMappingURL=interaction-components.ce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-components.ce.js","names":[],"sources":["../../src/components/interaction-components.ce"],"sourcesContent":["<Container>\n @for (entry of renderedComponents) {\n <Container dependencies={entry.dependencies}>\n <entry.component ...entry.props />\n </Container>\n }\n</Container>\n\n<script>\n import { computed } from \"canvasengine\";\n import { RpgClientEngine } from \"../RpgClientEngine\";\n import { inject } from \"../core/inject\";\n\n const { object, bounds, hitboxBounds, graphicBounds } = defineProps();\n const client = inject(RpgClientEngine);\n const sprite = object();\n\n const renderedComponents = computed(() => client.interactions.getRenderedComponents(sprite, {\n bounds: typeof bounds === \"function\" ? bounds() : undefined,\n hitbox: typeof hitboxBounds === \"function\" ? hitboxBounds() : undefined,\n graphic: typeof graphicBounds === \"function\" ? graphicBounds() : undefined,\n }));\n</script>\n"],"mappings":";;;;AAQC,SAAM,UAAA,SAAA;CACe,SAAM,OAAA;CAEpB,MAAG,EAAA,QAAa,QAAK,cAAY,kBADb,eAAU,OACG,EAAA;;CAEzC,MAAE,SAAQ,OAAQ;CAOd,OADe,EAAA,WAAc,MAAI,KALb,eAAgB,OAAA,aAAA,sBAAA,QAAA;EACtC,QAAM,OAAS,WAAQ,aAAA,OAAA,IAAA,KAAA;;EAEvB,SAAM,OAAA,kBAA8B,aAAa,cAAa,IAAA,KAAA;CAChE,CAAC,CAC4D,IAAG,UAAE,EAAS,WAAA,EAAA,cAAA,MAAA,aAAA,GAAA,EAAA,MAAA,WAAA,MAAA,KAAA,CAAA,CAAA,CACxD;AACd"}
@@ -2,7 +2,6 @@ import { inject } from "../../core/inject.js";
2
2
  import { RpgGui } from "../../Gui/Gui.js";
3
3
  import { RpgClientEngine } from "../../RpgClientEngine.js";
4
4
  import { Canvas, Container, Viewport, computed, cond, effect, h, loop, useDefineProps, useProps } from "canvasengine";
5
- import { delay } from "@rpgjs/common";
6
5
  import { NightAmbiant, SpriteShadows } from "@canvasengine/presets";
7
6
  //#region src/components/scenes/canvas.ce
8
7
  function component($$props) {
@@ -29,10 +28,15 @@ function component($$props) {
29
28
  effect(() => {
30
29
  if (sceneData() && !sceneData().component) throw new Error("Warning ! You need to define a component for the scene. Use provideLoadMap() to define a component for the scene.");
31
30
  });
32
- const onGuiFinish = (gui, data) => {
33
- delay(() => {
34
- guiService.guiClose(gui.name, data);
35
- });
31
+ const normalizeOpenId = (value) => {
32
+ const resolved = typeof value === "function" ? value() : value;
33
+ return typeof resolved === "string" && resolved.length > 0 ? resolved : void 0;
34
+ };
35
+ const onGuiFinish = (gui, data, guiOpenId) => {
36
+ const completedOpenId = normalizeOpenId(guiOpenId);
37
+ const currentOpenId = normalizeOpenId(gui.openId);
38
+ if (completedOpenId && currentOpenId && completedOpenId !== currentOpenId) return;
39
+ guiService.guiClose(gui.name, data, completedOpenId ?? currentOpenId);
36
40
  };
37
41
  const onGuiInteraction = (gui, name, data) => {
38
42
  guiService.guiInteraction(gui.name, name, data);
@@ -189,8 +193,9 @@ function component($$props) {
189
193
  }, cond(gui.display, () => h(gui.component, {
190
194
  data: gui.data,
191
195
  dependencies: gui.dependencies,
192
- onFinish: (data) => {
193
- onGuiFinish(gui, data);
196
+ guiOpenId: gui.openId,
197
+ onFinish: (data, guiOpenId) => {
198
+ onGuiFinish(gui, data, guiOpenId);
194
199
  },
195
200
  onInteraction: (name, data) => {
196
201
  onGuiInteraction(gui, name, data);
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.ce.js","names":[],"sources":["../../../src/components/scenes/canvas.ce"],"sourcesContent":["<Canvas width={engine.width} height={engine.height}>\n <Viewport worldWidth worldHeight clamp sortableChildren={true}>\n @if (lightingAmbientEnabled()) {\n <NightAmbiant\n spots={nightLights}\n darkness={lightingDarknessProps}\n haze={lightingHaze}\n />\n }\n @if (shadowEnabled()) {\n <SpriteShadows\n lights={shadowLights}\n ambientLight={shadowAmbientLight}\n minInfluence={shadowMinInfluence}\n falloffPower={shadowFalloffPower}\n mode={shadowMode}\n updateHz={shadowUpdateHz}\n scanHz={shadowScanHz}\n cullToViewport={shadowCullToViewport}\n shadowColor={shadowColor}\n />\n }\n <SceneMap />\n </Viewport>\n @for (gui of guiList) {\n <Container\n positionType=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n width={engine.width}\n height={engine.height}\n >\n @if (gui.display) {\n <gui.component data={gui.data} dependencies={gui.dependencies} onFinish={(data) => {\n onGuiFinish(gui, data)\n }} onInteraction={(name, data) => {\n onGuiInteraction(gui, name, data)\n }} /> \n }\n </Container>\n }\n</Canvas>\n\n<script>\n import { computed, effect } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { delay } from \"@rpgjs/common\";\n import { NightAmbiant, SpriteShadows } from '@canvasengine/presets'\n\n const engine = inject(RpgClientEngine);\n const SceneMap = engine.sceneMapComponent;\n const guiService = inject(RpgGui);\n const sceneData = engine.sceneMap.data\n const lighting = engine.sceneMap.lighting\n const guiList = computed(() => {\n return Object.values(guiService.gui()).filter((gui) => !gui.attachToSprite)\n })\n const worldWidth = computed(() => {\n const data = sceneData?.()\n const scale = Number(data?.params?.scale ?? 1) || 1\n return Number(data?.width ?? data?.params?.width ?? 2048) * scale\n })\n const worldHeight = computed(() => {\n const data = sceneData?.()\n const scale = Number(data?.params?.scale ?? 1) || 1\n return Number(data?.height ?? data?.params?.height ?? 2048) * scale\n })\n\n effect(() => {\n if (sceneData() && !sceneData().component) {\n throw new Error(\"Warning ! You need to define a component for the scene. Use provideLoadMap() to define a component for the scene.\")\n }\n })\n\n const onGuiFinish = (gui, data) => {\n delay(() => {\n guiService.guiClose(gui.name, data)\n })\n }\n\n const onGuiInteraction = (gui, name, data) => {\n guiService.guiInteraction(gui.name, name, data)\n }\n\n const clamp = {\n direction: \"all\"\n }\n const NIGHT_SPOT_RADIUS_SCALE = 4.25\n const NIGHT_SPOT_MIN_RADIUS = 170\n const NIGHT_SPOT_MIN_INTENSITY = 1\n const SHADOW_SPOT_RADIUS_SCALE = 12\n const SHADOW_SPOT_MIN_RADIUS = 480\n const SHADOW_SPOT_MIN_INTENSITY = 1.35\n\n const nightSpotRadius = (radius) => Math.max(radius * NIGHT_SPOT_RADIUS_SCALE, NIGHT_SPOT_MIN_RADIUS)\n const shadowSpotRadius = (radius) => Math.max(radius * SHADOW_SPOT_RADIUS_SCALE, SHADOW_SPOT_MIN_RADIUS)\n const nightSpotIntensity = (intensity, fallback) => Math.max(intensity ?? fallback, NIGHT_SPOT_MIN_INTENSITY)\n const shadowSpotIntensity = (intensity) => Math.max(intensity ?? 1.3, SHADOW_SPOT_MIN_INTENSITY)\n\n const lightingAmbient = computed(() => {\n const state = lighting?.()\n return state?.ambient ?? {}\n })\n\n const nightLights = computed(() => {\n const state = lighting?.()\n return (state?.spots ?? []).map((spot, index) => {\n const radius = spot.radius ?? 180\n return {\n x: spot.x,\n y: spot.y,\n radius: nightSpotRadius(radius),\n intensity: nightSpotIntensity(spot.intensity, index === 0 ? 1 : 0.92),\n flicker: spot.flicker,\n flickerSpeed: spot.flickerSpeed ?? 14,\n pulse: spot.pulse,\n pulseSpeed: spot.pulseSpeed,\n phase: spot.phase,\n }\n })\n })\n const hasLightSpots = computed(() => {\n const state = lighting?.()\n return (state?.spots?.length ?? 0) > 0\n })\n\n const lightingDarkness = computed(() => {\n const darkness = lightingAmbient().darkness\n return typeof darkness === \"number\" ? darkness : 0\n })\n\n const lightingAmbientEnabled = computed(() => {\n const state = lighting?.()\n return Boolean(state && lightingDarkness() > 0)\n })\n\n const lightingDarknessProps = computed(() => ({\n opacity: lightingDarkness(),\n color: lightingAmbient().darkColor ?? \"#080a12\",\n }))\n const lightingHaze = computed(() => ({\n color: lightingAmbient().fogColor ?? \"#12182a\",\n radius: lightingAmbient().fogRadius ?? 0.44,\n softness: lightingAmbient().fogSoftness ?? 0.3,\n opacity: lightingAmbient().fogOpacity ?? 0.35,\n }))\n\n const defaultSunLight = () => {\n const data = sceneData?.()\n const width = Number(data?.width ?? data?.params?.width ?? 2048)\n const height = Number(data?.height ?? data?.params?.height ?? 2048)\n const scale = Number(data?.params?.scale ?? 1) || 1\n const mapWidth = width * scale\n const mapHeight = height * scale\n\n return {\n x: -mapWidth * 0.35,\n y: -mapHeight * 0.45,\n z: 520,\n radius: Math.max(mapWidth, mapHeight) * 2.5,\n intensity: 0.85,\n shadowWeight: lightingDarkness() > 0 ? 2.2 : 1,\n enabled: true,\n }\n }\n\n const shadowState = computed(() => {\n const state = lighting?.()\n return state?.shadows ?? null\n })\n\n const shadowLights = computed(() => {\n const state = lighting?.()\n const defaultSun = defaultSunLight()\n const sun = {\n ...defaultSun,\n ...(state?.sun ?? {}),\n shadowWeight: state?.sun?.shadowWeight ?? defaultSun.shadowWeight,\n }\n const spotLights = (state?.spots ?? []).map((spot) => {\n const radius = spot.radius ?? 180\n return {\n x: spot.x,\n y: spot.y,\n z: 170,\n radius: shadowSpotRadius(radius),\n intensity: shadowSpotIntensity(spot.intensity),\n shadowWeight: 2.4,\n enabled: true,\n }\n })\n\n return [\n ...((sun.enabled === false || sun.intensity <= 0) ? [] : [sun]),\n ...spotLights,\n ]\n })\n\n const shadowAmbientLight = computed(() => {\n const shadows = shadowState()\n if (shadows?.ambientLight === null || shadows?.ambientLight?.enabled === false) {\n return null\n }\n return shadows?.ambientLight ?? { x: -0.18, y: -1, z: 420, intensity: 0.32, shadowWeight: 1 }\n })\n\n const shadowEnabled = computed(() => {\n const shadows = shadowState()\n return Boolean((shadows?.enabled || hasLightSpots()) && (shadowLights().length > 0 || shadowAmbientLight()))\n })\n\n const shadowMode = computed(() => shadowState()?.mode ?? \"strongest\")\n const shadowUpdateHz = computed(() => shadowState()?.updateHz ?? 60)\n const shadowScanHz = computed(() => shadowState()?.scanHz ?? 8)\n const shadowCullToViewport = computed(() => shadowState()?.cullToViewport ?? true)\n const shadowMinInfluence = computed(() => shadowState()?.minInfluence ?? 0.24)\n const shadowFalloffPower = computed(() => shadowState()?.falloffPower ?? 0.85)\n const shadowColor = computed(() => shadowState()?.shadowColor ?? \"#05070d\")\n</script>\n"],"mappings":";;;;;;;AAcM,SAAE,UAAc,SAAA;CACR,SAAU,OAAA;CACN,eAAc,OAAA;CACxB,MAAM,SAAE,OAAY,eAAA;CAC5B,MAAM,WAAE,OAAgB;CACxB,MAAM,aAAa,OAAE,MAAW;CAChC,MAAM,YAAC,OAAA,SAAA;CACP,MAAI,WAAA,OAAA,SAAA;CACJ,MAAK,UAAU,eAAA;EACX,OAAA,OAAQ,OAAA,WAAA,IAAA,CAAA,EAAA,QAAA,QAAA,CAAA,IAAA,cAAA;CACZ,CAAC;CACD,MAAM,aAAC,eAAA;EACH,MAAI,OAAA,YAAc;EAClB,MAAI,QAAM,OAAA,MAAA,QAAA,SAAA,CAAA,KAAA;EACV,OAAI,OAAO,MAAA,SAAA,MAAA,QAAA,SAAA,IAAA,IAAA;CACf,CAAC;CACD,MAAM,cAAW,eAAA;EACb,MAAI,OAAO,YAAY;EACvB,MAAI,QAAQ,OAAO,MAAM,QAAA,SAAA,CAAA,KAAA;EACzB,OAAE,OAAA,MAAA,UAAA,MAAA,QAAA,UAAA,IAAA,IAAA;CACN,CAAC;CACD,aAAW;EACP,IAAI,UAAI,KAAW,CAAC,UAAS,EAAA,WACzB,MAAK,IAAA,MAAA,mHAA+B;CAE5C,CAAC;CACD,MAAM,eAAE,KAAA,SAAA;EACJ,YAAI;GACN,WAAA,SAAA,IAAA,MAAA,IAAA;EACA,CAAA;;CAEF,MAAC,oBAAM,KAAA,MAAA,SAAA;EACL,WAAS,eAAmB,IAAI,MAAE,MAAA,IAAa;CACjD;CACA,MAAE,QAAS,EACT,WAAS,MACX;CACA,MAAE,0BAAuB;;CAEzB,MAAE,2BAAsB;CACxB,MAAE,2BAAwB;CAC1B,MAAE,yBAA0B;CAC5B,MAAE,4BAAyB;CAC3B,MAAE,mBAAuB,WAAU,KAAA,IAAA,SAAA,yBAAA,qBAAA;CACnC,MAAE,oBAAwB,WAAO,KAAA,IAAA,SAAA,0BAAA,sBAAA;CACjC,MAAI,sBAAqB,WAAc,aAAY,KAAM,IAAG,aAAI,UAAc,wBAAA;CAC9E,MAAG,uBAAA,cAAA,KAAA,IAAA,aAAA,KAAA,yBAAA;CACH,MAAE,kBAAmB,eAAe;EAEhC,QADa,WAAY,IACX,WAAW,CAAC;CAC9B,CAAC;CACD,MAAG,cAAA,eAAA;EAEC,SADI,WAAc,IACL,SAAW,CAAC,GAAA,KAAA,MAAA,UAAA;GACzB,MAAM,SAAQ,KAAO,UAAa;GAClC,OAAO;IACR,GAAA,KAAA;;IAES,QAAG,gBAAA,MAAA;IACN,WAAc,mBAAc,KAAU,WAAC,UAAA,IAAA,IAAA,GAAA;IACpC,SAAK,KAAO;IACnB,cAAA,KAAA,gBAAA;IACF,OAAA,KAAA;;IAEK,OAAW,KAAI;GACnB;EACA,CAAC;CACL,CAAC;CACD,MAAE,gBAAA,eAAA;EAEA,SAAA,WAAA,IAAM,OAAkB,UAAO,KAAM;CACvC,CAAC;CACD,MAAE,mBAAA,eAAA;;EAEA,OAAM,OAAQ,aAAA,WAAA,WAAA;CAChB,CAAC;CACD,MAAE,yBAAA,eAAA;EACA,MAAM,QAAA,WAAA;EACN,OAAM,QAAA,SAAA,iBAAwB,IAAA,CAAA;CAChC,CAAC;CACD,MAAE,wBAAM,gBAA2B;EACjC,SAAM,iBAAsB;EAC5B,OAAM,gBAAA,EAAA,aAA8B;;CAEtC,MAAE,eAAM,gBAA6B;EACnC,OAAM,gBAAmB,EAAC,YAAW;EACrC,QAAM,gBAAoB,EAAE,aAAW;EACvC,UAAM,gBAAsB,EAAC,eAAc;;CAE7C,EAAE;CACF,MAAI,wBAAyB;EACzB,MAAM,OAAO,YAAY;EAC1B,MAAA,QAAA,OAAA,MAAA,SAAA,MAAA,QAAA,SAAA,IAAA;;EAED,MAAM,QAAA,OAAc,MAAS,QAAM,SAAA,CAAA,KAAA;EACjC,MAAM,WAAQ,QAAW;EACzB,MAAM,YAAS,SAAY;EAC3B,OAAO;GACL,GAAA,CAAM,WAAC;GACL,GAAG,CAAA,YAAM;GACT,GAAG;GACH,QAAQ,KAAA,IAAA,UAAgB,SAAO,IAAA;GAC/B,WAAW;GACX,cAAc,iBAAO,IAAA,IAAA,MAAA;GACrB,SAAA;EACJ;CACJ;CACA,MAAM,cAAc,eAAK;EAErB,QADE,WAAA,IACD,WAAA;CACL,CAAC;CACD,MAAE,eAAmB,eAAe;EAChC,MAAM,QAAQ,WAAW;EACzB,MAAM,aAAS,gBAAoB;EACpC,MAAA,MAAA;;GAEK,GAAA,OAAA,OAAkB,CAAC;GACvB,cAAiB,OAAA,KAAA,gBAAkB,WAAA;EACnC;EACD,MAAA,cAAA,OAAA,SAAA,CAAA,GAAA,KAAA,SAAA;;GAEK,OAAA;IACE,GAAK,KAAG;IACP,GAAA,KAAQ;IAChB,GAAA;;IAEK,WAAA,oBAAmC,KAAK,SAAA;IACpC,cAAC;IACF,SAAA;GACP;EACF,CAAA;EACE,OAAO,CACP,GAAQ,IAAA,YAAiB,SAAC,IAAY,aAAK,IAAA,CAAA,IAAA,CAAA,GAAA,GAC3C,GAAA,UACA;CACJ,CAAC;;EAEC,MAAM,UAAA,YAAwB;EAC5B,IAAA,SAAa,iBAAY,QAAA,SAAA,cAAA,YAAA,OACzB,OAAW;EAEX,OAAM,SAAQ,gBAAa;GAAO,GAAC;GAAS,GAAG;GAAG,GAAA;GAAA,WAAA;GAAA,cAAA;EAAA;CACtD,CAAC;CACD,MAAI,gBAAkB,eAAS;;EAE3B,OAAO,SAAA,SAAA,WAAA,cAAA,OAAA,aAAA,EAAA,SAAA,KAAA,mBAAA,EAAA;CACX,CAAC;CACD,MAAM,aAAa,eAAO,YAAA,GAAA,QAAA,WAAA;CAC1B,MAAM,iBAAM,eAAA,YAAA,GAAA,YAAA,EAAA;CACZ,MAAM,eAAa,eAAc,YAAe,GAAC,UAAA,CAAA;CACjD,MAAM,uBAAe,eAAA,YAAA,GAAA,kBAAA,IAAA;CACrB,MAAM,qBAAc,eAAsB,YAAU,GAAA,gBAAA,GAAA;CACpD,MAAM,qBAAa,eAAA,YAAA,GAAA,gBAAA,GAAA;CACnB,MAAI,cAAA,eAAA,YAAA,GAAA,eAAA,SAAA;CAMD,OALD,EAAA,QAAA;EAAA,OAAA,OAAA;EAAA,QAAA,OAAA;CAAA,GAAA,CAAA,EAAA,UAAA;EAAA;EAAA;EAAA;EAAA,kBAAA;CAAA,GAAA;EAAA,KAAA,eAAA,uBAAA,CAAA,SAAA,EAAA,cAAA;GAAA,OAAA;GAAA,UAAA;GAAA,MAAA;EAAA,CAAA,CAAA;EAAA,KAAA,eAAA,cAAA,CAAA,SAAA,EAAA,eAAA;GAAA,QAAA;GAAA,cAAA;GAAA,cAAA;GAAA,cAAA;GAAA,MAAA;GAAA,UAAA;GAAA,QAAA;GAAA,gBAAA;GAAA;EAAA,CAAA,CAAA;EAAA,EAAA,QAAA;CAAA,CAAA,GAAA,KAAA,UAAA,QAAA,EAAA,WAAA;EAAA,cAAA;EAAA,KAAA;EAAA,MAAA;EAAA,OAAA;EAAA,QAAA;EAAA,OAAA,OAAA;EAAA,QAAA,OAAA;CAAA,GAAA,KAAA,IAAA,eAAA,EAAA,IAAA,WAAA;EAAA,MAAA,IAAA;EAAA,cAAA,IAAA;EAAA,WAAA,SAAA;;EAEM;EAAA,gBAAc,MAAa,SAAE;GAC3B,iBAAmB,KAAA,MAAA,IAAA;EACnB;CAAC,CAAA,CAAA,CAAA,CAAK,CAAC,CACd;;AAGC,IAAM,iBAAmB"}
1
+ {"version":3,"file":"canvas.ce.js","names":[],"sources":["../../../src/components/scenes/canvas.ce"],"sourcesContent":["<Canvas width={engine.width} height={engine.height}>\n <Viewport worldWidth worldHeight clamp sortableChildren={true}>\n @if (lightingAmbientEnabled()) {\n <NightAmbiant\n spots={nightLights}\n darkness={lightingDarknessProps}\n haze={lightingHaze}\n />\n }\n @if (shadowEnabled()) {\n <SpriteShadows\n lights={shadowLights}\n ambientLight={shadowAmbientLight}\n minInfluence={shadowMinInfluence}\n falloffPower={shadowFalloffPower}\n mode={shadowMode}\n updateHz={shadowUpdateHz}\n scanHz={shadowScanHz}\n cullToViewport={shadowCullToViewport}\n shadowColor={shadowColor}\n />\n }\n <SceneMap />\n </Viewport>\n @for (gui of guiList) {\n <Container\n positionType=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n width={engine.width}\n height={engine.height}\n >\n @if (gui.display) {\n <gui.component data={gui.data} dependencies={gui.dependencies} guiOpenId={gui.openId} onFinish={(data, guiOpenId) => {\n onGuiFinish(gui, data, guiOpenId)\n }} onInteraction={(name, data) => {\n onGuiInteraction(gui, name, data)\n }} /> \n }\n </Container>\n }\n</Canvas>\n\n<script>\n import { computed, effect } from \"canvasengine\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n import { NightAmbiant, SpriteShadows } from '@canvasengine/presets'\n\n const engine = inject(RpgClientEngine);\n const SceneMap = engine.sceneMapComponent;\n const guiService = inject(RpgGui);\n const sceneData = engine.sceneMap.data\n const lighting = engine.sceneMap.lighting\n const guiList = computed(() => {\n return Object.values(guiService.gui()).filter((gui) => !gui.attachToSprite)\n })\n const worldWidth = computed(() => {\n const data = sceneData?.()\n const scale = Number(data?.params?.scale ?? 1) || 1\n return Number(data?.width ?? data?.params?.width ?? 2048) * scale\n })\n const worldHeight = computed(() => {\n const data = sceneData?.()\n const scale = Number(data?.params?.scale ?? 1) || 1\n return Number(data?.height ?? data?.params?.height ?? 2048) * scale\n })\n\n effect(() => {\n if (sceneData() && !sceneData().component) {\n throw new Error(\"Warning ! You need to define a component for the scene. Use provideLoadMap() to define a component for the scene.\")\n }\n })\n\n const normalizeOpenId = (value) => {\n const resolved = typeof value === \"function\" ? value() : value\n return typeof resolved === \"string\" && resolved.length > 0 ? resolved : undefined\n }\n\n const onGuiFinish = (gui, data, guiOpenId) => {\n const completedOpenId = normalizeOpenId(guiOpenId)\n const currentOpenId = normalizeOpenId(gui.openId)\n if (completedOpenId && currentOpenId && completedOpenId !== currentOpenId) return\n guiService.guiClose(gui.name, data, completedOpenId ?? currentOpenId)\n }\n\n const onGuiInteraction = (gui, name, data) => {\n guiService.guiInteraction(gui.name, name, data)\n }\n\n const clamp = {\n direction: \"all\"\n }\n const NIGHT_SPOT_RADIUS_SCALE = 4.25\n const NIGHT_SPOT_MIN_RADIUS = 170\n const NIGHT_SPOT_MIN_INTENSITY = 1\n const SHADOW_SPOT_RADIUS_SCALE = 12\n const SHADOW_SPOT_MIN_RADIUS = 480\n const SHADOW_SPOT_MIN_INTENSITY = 1.35\n\n const nightSpotRadius = (radius) => Math.max(radius * NIGHT_SPOT_RADIUS_SCALE, NIGHT_SPOT_MIN_RADIUS)\n const shadowSpotRadius = (radius) => Math.max(radius * SHADOW_SPOT_RADIUS_SCALE, SHADOW_SPOT_MIN_RADIUS)\n const nightSpotIntensity = (intensity, fallback) => Math.max(intensity ?? fallback, NIGHT_SPOT_MIN_INTENSITY)\n const shadowSpotIntensity = (intensity) => Math.max(intensity ?? 1.3, SHADOW_SPOT_MIN_INTENSITY)\n\n const lightingAmbient = computed(() => {\n const state = lighting?.()\n return state?.ambient ?? {}\n })\n\n const nightLights = computed(() => {\n const state = lighting?.()\n return (state?.spots ?? []).map((spot, index) => {\n const radius = spot.radius ?? 180\n return {\n x: spot.x,\n y: spot.y,\n radius: nightSpotRadius(radius),\n intensity: nightSpotIntensity(spot.intensity, index === 0 ? 1 : 0.92),\n flicker: spot.flicker,\n flickerSpeed: spot.flickerSpeed ?? 14,\n pulse: spot.pulse,\n pulseSpeed: spot.pulseSpeed,\n phase: spot.phase,\n }\n })\n })\n const hasLightSpots = computed(() => {\n const state = lighting?.()\n return (state?.spots?.length ?? 0) > 0\n })\n\n const lightingDarkness = computed(() => {\n const darkness = lightingAmbient().darkness\n return typeof darkness === \"number\" ? darkness : 0\n })\n\n const lightingAmbientEnabled = computed(() => {\n const state = lighting?.()\n return Boolean(state && lightingDarkness() > 0)\n })\n\n const lightingDarknessProps = computed(() => ({\n opacity: lightingDarkness(),\n color: lightingAmbient().darkColor ?? \"#080a12\",\n }))\n const lightingHaze = computed(() => ({\n color: lightingAmbient().fogColor ?? \"#12182a\",\n radius: lightingAmbient().fogRadius ?? 0.44,\n softness: lightingAmbient().fogSoftness ?? 0.3,\n opacity: lightingAmbient().fogOpacity ?? 0.35,\n }))\n\n const defaultSunLight = () => {\n const data = sceneData?.()\n const width = Number(data?.width ?? data?.params?.width ?? 2048)\n const height = Number(data?.height ?? data?.params?.height ?? 2048)\n const scale = Number(data?.params?.scale ?? 1) || 1\n const mapWidth = width * scale\n const mapHeight = height * scale\n\n return {\n x: -mapWidth * 0.35,\n y: -mapHeight * 0.45,\n z: 520,\n radius: Math.max(mapWidth, mapHeight) * 2.5,\n intensity: 0.85,\n shadowWeight: lightingDarkness() > 0 ? 2.2 : 1,\n enabled: true,\n }\n }\n\n const shadowState = computed(() => {\n const state = lighting?.()\n return state?.shadows ?? null\n })\n\n const shadowLights = computed(() => {\n const state = lighting?.()\n const defaultSun = defaultSunLight()\n const sun = {\n ...defaultSun,\n ...(state?.sun ?? {}),\n shadowWeight: state?.sun?.shadowWeight ?? defaultSun.shadowWeight,\n }\n const spotLights = (state?.spots ?? []).map((spot) => {\n const radius = spot.radius ?? 180\n return {\n x: spot.x,\n y: spot.y,\n z: 170,\n radius: shadowSpotRadius(radius),\n intensity: shadowSpotIntensity(spot.intensity),\n shadowWeight: 2.4,\n enabled: true,\n }\n })\n\n return [\n ...((sun.enabled === false || sun.intensity <= 0) ? [] : [sun]),\n ...spotLights,\n ]\n })\n\n const shadowAmbientLight = computed(() => {\n const shadows = shadowState()\n if (shadows?.ambientLight === null || shadows?.ambientLight?.enabled === false) {\n return null\n }\n return shadows?.ambientLight ?? { x: -0.18, y: -1, z: 420, intensity: 0.32, shadowWeight: 1 }\n })\n\n const shadowEnabled = computed(() => {\n const shadows = shadowState()\n return Boolean((shadows?.enabled || hasLightSpots()) && (shadowLights().length > 0 || shadowAmbientLight()))\n })\n\n const shadowMode = computed(() => shadowState()?.mode ?? \"strongest\")\n const shadowUpdateHz = computed(() => shadowState()?.updateHz ?? 60)\n const shadowScanHz = computed(() => shadowState()?.scanHz ?? 8)\n const shadowCullToViewport = computed(() => shadowState()?.cullToViewport ?? true)\n const shadowMinInfluence = computed(() => shadowState()?.minInfluence ?? 0.24)\n const shadowFalloffPower = computed(() => shadowState()?.falloffPower ?? 0.85)\n const shadowColor = computed(() => shadowState()?.shadowColor ?? \"#05070d\")\n</script>\n"],"mappings":"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"}
@@ -11,18 +11,23 @@ function component($$props) {
11
11
  const projectiles = engine.projectiles.current;
12
12
  const map = engine.sceneMap?.data;
13
13
  const sceneComponent = computed(() => map()?.component);
14
- const mapParams = map()?.params;
15
14
  const weather = engine.sceneMap.weather;
16
- const backgroundMusic = {
17
- src: mapParams?.backgroundMusic,
18
- autoplay: true,
19
- loop: true
20
- };
21
- const backgroundAmbientSound = {
22
- src: mapParams?.backgroundAmbientSound,
23
- autoplay: true,
24
- loop: true
25
- };
15
+ const backgroundMusic = computed(() => {
16
+ const src = map()?.params?.backgroundMusic;
17
+ return src ? {
18
+ src,
19
+ autoplay: true,
20
+ loop: true
21
+ } : void 0;
22
+ });
23
+ const backgroundAmbientSound = computed(() => {
24
+ const src = map()?.params?.backgroundAmbientSound;
25
+ return src ? {
26
+ src,
27
+ autoplay: true,
28
+ loop: true
29
+ } : void 0;
30
+ });
26
31
  const shakeConfig = {
27
32
  trigger: engine.mapShakeTrigger,
28
33
  intensity: 10,
@@ -60,11 +65,11 @@ function component($$props) {
60
65
  };
61
66
  });
62
67
  return h(Container, {
63
- sound: backgroundMusic,
64
68
  shake: shakeConfig,
65
69
  freeze: engine.gamePause
66
70
  }, [
67
- h(Container, { sound: backgroundAmbientSound }),
71
+ cond(computed(() => backgroundMusic()), () => h(Container, { sound: computed(() => backgroundMusic()) })),
72
+ cond(computed(() => backgroundAmbientSound()), () => h(Container, { sound: computed(() => backgroundAmbientSound()) })),
68
73
  h(Container, null, cond(computed(() => map() && sceneComponent()), () => h(sceneComponent(), {
69
74
  data: computed(() => map().data),
70
75
  params: computed(() => map().params)
@@ -1 +1 @@
1
- {"version":3,"file":"draw-map.ce.js","names":[],"sources":["../../../src/components/scenes/draw-map.ce"],"sourcesContent":["<Container sound={backgroundMusic} shake={shakeConfig} freeze={engine.gamePause}>\n <Container sound={backgroundAmbientSound} />\n\n <Container>\n @if (map() && sceneComponent()) {\n <sceneComponent() data={map().data} params={map().params} />\n }\n </Container>\n\n @for (child of children) {\n <child />\n }\n\n @for (componentAnimation of componentAnimations) {\n <Container>\n @for (animation of componentAnimation.current) {\n <componentAnimation.component ...animation />\n }\n </Container>\n }\n\n <Container sortableChildren={true}>\n @for (projectile of projectiles() ; track projectile.props.id) {\n <projectile.component ...projectile.props />\n }\n </Container>\n\n @if (weatherProps()) {\n <Weather ...weatherProps() />\n }\n</Container>\n\n<script>\n import { computed, effect } from 'canvasengine'\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { Weather } from '@canvasengine/presets'\n\n const { children } = defineProps()\n const engine = inject(RpgClientEngine);\n const componentAnimations = engine.componentAnimations\n const projectiles = engine.projectiles.current\n const map = engine.sceneMap?.data\n const sceneComponent = computed(() => map()?.component)\n const mapParams = map()?.params\n const weather = engine.sceneMap.weather\n const backgroundMusic = { src: mapParams?.backgroundMusic, autoplay: true, loop: true }\n const backgroundAmbientSound = { src: mapParams?.backgroundAmbientSound, autoplay: true, loop: true }\n\n const shakeConfig = {\n trigger: engine.mapShakeTrigger,\n intensity: 10,\n duration: 500,\n frequency: 10,\n direction: 'both'\n }\n\n const weatherProps = computed(() => {\n const state = weather?.()\n if (!state) {\n return null\n }\n const validEffects = ['rain', 'snow', 'fog', 'cloud']\n if (!validEffects.includes(state.effect)) {\n return null\n }\n const params = state.params ?? {}\n return {\n effect: state.effect,\n speed: params.speed,\n windDirection: params.windDirection,\n windStrength: params.windStrength,\n density: params.density,\n maxDrops: params.maxDrops,\n height: params.height,\n scale: params.scale,\n sunIntensity: params.sunIntensity,\n sunAngle: params.sunAngle,\n raySpread: params.raySpread,\n rayTwinkle: params.rayTwinkle,\n rayTwinkleSpeed: params.rayTwinkleSpeed,\n zIndex: params.zIndex ?? 1000,\n alpha: params.alpha,\n blendMode: params.blendMode,\n }\n })\n</script>\n"],"mappings":";;;;;AASM,SAAQ,UAAW,SAAE;CACf,SAAA,OAAA;sBACV,eAAA,OAAA,EAAA;CAEF,MAAM,SAAE,OAAA,eAAsB;CAC9B,MAAK,sBAAS,OAAA;CACd,MAAM,cAAM,OAAa,YAAA;CACzB,MAAM,MAAG,OAAA,UAAmB;CAC5B,MAAM,iBAAA,eAAA,IAAA,GAAA,SAAA;CACN,MAAM,YAAS,IAAA,GAAA;CACf,MAAE,UAAA,OAAA,SAAA;;;;;;CAEF,MAAG,yBAA4B;EAAA,KAAK,WAAA;EAAA,UAAA;EAAA,MAAA;CAAA;CACpC,MAAK,cAAe;EAChB,SAAG,OAAW;EACd,WAAA;EACA,UAAS;;EAEV,WAAI;CACP;CACA,MAAE,eAAA,eAAA;EACA,MAAA,QAAS,UAAA;cAEJ,OAAA;EAGH,IAAA,CAAA;GADsB;GAAQ;GAAK;GAAO;EACjC,EAAA,SAAkB,MAAM,MAAM,GACvC,OAAS;EAET,MAAM,SAAE,MAAa,UAAA,CAAW;EAChC,OAAM;GACN,QAAM,MAAA;GACN,OAAM,OAAY;GAClB,eAAmB,OAAA;GACnB,cAAM,OAAiB;GACvB,SAAM,OAAY;GAClB,UAAc,OAAE;GAChB,QAAM,OAAA;GACN,OAAM,OAAA;;GAEN,UAAM,OAAc;GAClB,WAAS,OAAO;GAChB,YAAa,OAAA;GACb,iBAAa,OAAA;GACb,QAAU,OAAG,UAAA;GACb,OAAS,OAAO;GAClB,WAAA,OAAA;;CAEJ,CAAC;CAEO,OADY,EAAA,WAAU;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA,OAAA;CAAA,GAAA;EAAA,EAAA,WAAA,EAAA,OAAA,uBAAA,CAAA;EAAA,EAAA,WAAA,MAAA,KAAA,eAAA,IAAA,KAAA,eAAA,CAAA,SAAA,EAAA,eAAA,GAAA;GAAA,MAAA,eAAA,IAAA,EAAA,IAAA;GAAA,QAAA,eAAA,IAAA,EAAA,MAAA;EAAA,CAAA,CAAA,CAAA;EAAA,KAAA,WAAA,UAAA,EAAA,KAAA,CAAA;EAAA,KAAA,sBAAA,uBAAA,EAAA,WAAA,MAAA,KAAA,mBAAA,UAAA,cAAA,EAAA,mBAAA,WAAA,SAAA,CAAA,CAAA,CAAA;EAAA,EAAA,WAAA,EAAA,kBAAA,KAAA,GAAA,KAAA,eAAA,YAAA,CAAA,IAAA,eAAA,EAAA,WAAA,WAAA,WAAA,KAAA,GAAA,EAAA,QAAA,eAAA,WAAA,MAAA,GAAA,CAAA,CAAA;EAAA,KAAA,eAAA,aAAA,CAAA,SAAA,EAAA,SAAA,aAAA,CAAA,CAAA;CAAA,CACZ;AACZ;AAEA,IAAM,iBAAiB"}
1
+ {"version":3,"file":"draw-map.ce.js","names":[],"sources":["../../../src/components/scenes/draw-map.ce"],"sourcesContent":["<Container shake={shakeConfig} freeze={engine.gamePause}>\n @if (backgroundMusic()) {\n <Container sound={backgroundMusic()} />\n }\n\n @if (backgroundAmbientSound()) {\n <Container sound={backgroundAmbientSound()} />\n }\n\n <Container>\n @if (map() && sceneComponent()) {\n <sceneComponent() data={map().data} params={map().params} />\n }\n </Container>\n\n @for (child of children) {\n <child />\n }\n\n @for (componentAnimation of componentAnimations) {\n <Container>\n @for (animation of componentAnimation.current) {\n <componentAnimation.component ...animation />\n }\n </Container>\n }\n\n <Container sortableChildren={true}>\n @for (projectile of projectiles() ; track projectile.props.id) {\n <projectile.component ...projectile.props />\n }\n </Container>\n\n @if (weatherProps()) {\n <Weather ...weatherProps() />\n }\n</Container>\n\n<script>\n import { computed, effect } from 'canvasengine'\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { Weather } from '@canvasengine/presets'\n\n const { children } = defineProps()\n const engine = inject(RpgClientEngine);\n const componentAnimations = engine.componentAnimations\n const projectiles = engine.projectiles.current\n const map = engine.sceneMap?.data\n const sceneComponent = computed(() => map()?.component)\n const weather = engine.sceneMap.weather\n const backgroundMusic = computed(() => {\n const src = map()?.params?.backgroundMusic\n return src ? { src, autoplay: true, loop: true } : undefined\n })\n const backgroundAmbientSound = computed(() => {\n const src = map()?.params?.backgroundAmbientSound\n return src ? { src, autoplay: true, loop: true } : undefined\n })\n\n const shakeConfig = {\n trigger: engine.mapShakeTrigger,\n intensity: 10,\n duration: 500,\n frequency: 10,\n direction: 'both'\n }\n\n const weatherProps = computed(() => {\n const state = weather?.()\n if (!state) {\n return null\n }\n const validEffects = ['rain', 'snow', 'fog', 'cloud']\n if (!validEffects.includes(state.effect)) {\n return null\n }\n const params = state.params ?? {}\n return {\n effect: state.effect,\n speed: params.speed,\n windDirection: params.windDirection,\n windStrength: params.windStrength,\n density: params.density,\n maxDrops: params.maxDrops,\n height: params.height,\n scale: params.scale,\n sunIntensity: params.sunIntensity,\n sunAngle: params.sunAngle,\n raySpread: params.raySpread,\n rayTwinkle: params.rayTwinkle,\n rayTwinkleSpeed: params.rayTwinkleSpeed,\n zIndex: params.zIndex ?? 1000,\n alpha: params.alpha,\n blendMode: params.blendMode,\n }\n })\n</script>\n"],"mappings":";;;;;AASG,SAAS,UAAA,SAAA;CACM,SAAc,OAAI;CAEhC,MAAA,EAAA,aADwB,eAAc,OACtC,EAAA;CACJ,MAAI,SAAS,OAAA,eAAA;;CAEb,MAAM,cAAW,OAAU,YAAA;CAC3B,MAAK,MAAO,OAAA,UAAA;CACZ,MAAE,iBAAA,eAAA,IAAA,GAAA,SAAA;;CAEF,MAAM,kBAAE,eAAsB;EAC1B,MAAC,MAAS,IAAA,GAAA,QAAA;EACV,OAAO,MAAC;GAAA;GAAY,UAAC;GAAA,MAAmB;EAAO,IAAE,KAAA;CACrD,CAAC;CACD,MAAM,yBAAA,eAAA;EACF,MAAE,MAAS,IAAA,GAAA,QAAA;EACb,OAAA,MAAA;GAAA;GAAA,UAAA;GAAA,MAAA;EAAA,IAAA,KAAA;;CAEF,MAAG,cAAU;EACT,SAAM,OAAU;EAChB,WAAG;EACH,UAAA;EACA,WAAS;;CAEb;CACA,MAAK,eAAW,eAAgB;EAC9B,MAAA,QAAA,UAAA;EACA,IAAA,CAAA,OAAA,OAAA;EAIE,IAAA,CAAA;GADmB;GAAS;GAAM;GAAA;EAClB,EAAE,SAAS,MAAG,MAAK,GACnC,OAAS;;EAGT,OAAO;GACP,QAAY,MAAG;GACf,OAAM,OAAA;GACN,eAAmB,OAAO;GAC1B,cAAkB,OAAC;GACnB,SAAM,OAAc;GACpB,UAAc,OAAE;GAChB,QAAM,OAAA;GACJ,OAAS,OAAO;GAChB,cAAe,OAAK;GACrB,UAAA,OAAA;GACD,WAAM,OAAA;GACJ,YAAY,OAAO;GACnB,iBAAmB,OAAC;GACrB,QAAA,OAAA,UAAA;;GAED,WAAM,OAAc;EACpB;CACJ,CAAC;CAEK,OADa,EAAA,WAAA;EAAA,OAAA;EAAA,QAAA,OAAA;CAAA,GAAA;EAAA,KAAA,eAAA,gBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,OAAA,eAAA,gBAAA,CAAA,EAAA,CAAA,CAAA;EAAA,KAAA,eAAA,uBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,OAAA,eAAA,uBAAA,CAAA,EAAA,CAAA,CAAA;EAAA,EAAA,WAAA,MAAA,KAAA,eAAA,IAAA,KAAA,eAAA,CAAA,SAAA,EAAA,eAAA,GAAA;GAAA,MAAA,eAAA,IAAA,EAAA,IAAA;GAAA,QAAA,eAAA,IAAA,EAAA,MAAA;EAAA,CAAA,CAAA,CAAA;EAAA,KAAA,WAAA,UAAA,EAAA,KAAA,CAAA;EAAA,KAAA,sBAAA,uBAAA,EAAA,WAAA,MAAA,KAAA,mBAAA,UAAA,cAAA,EAAA,mBAAA,WAAA,SAAA,CAAA,CAAA,CAAA;EAAA,EAAA,WAAA,EAAA,kBAAA,KAAA,GAAA,KAAA,eAAA,YAAA,CAAA,IAAA,eAAA,EAAA,WAAA,WAAA,WAAA,KAAA,GAAA,EAAA,QAAA,eAAA,WAAA,MAAA,GAAA,CAAA,CAAA;EAAA,KAAA,eAAA,aAAA,CAAA,SAAA,EAAA,SAAA,aAAA,CAAA,CAAA;CAAA,CACA;AACb"}