@rpgjs/client 5.0.0-alpha.43 → 5.0.0-alpha.44

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 (137) hide show
  1. package/dist/Game/AnimationManager.js +25 -24
  2. package/dist/Game/AnimationManager.js.map +1 -1
  3. package/dist/Game/Event.js +11 -10
  4. package/dist/Game/Event.js.map +1 -1
  5. package/dist/Game/Map.js +78 -94
  6. package/dist/Game/Map.js.map +1 -1
  7. package/dist/Game/Object.js +182 -216
  8. package/dist/Game/Object.js.map +1 -1
  9. package/dist/Game/Player.js +11 -10
  10. package/dist/Game/Player.js.map +1 -1
  11. package/dist/Gui/Gui.js +440 -473
  12. package/dist/Gui/Gui.js.map +1 -1
  13. package/dist/Gui/NotificationManager.js +48 -50
  14. package/dist/Gui/NotificationManager.js.map +1 -1
  15. package/dist/Resource.js +132 -113
  16. package/dist/Resource.js.map +1 -1
  17. package/dist/RpgClientEngine.js +1333 -1486
  18. package/dist/RpgClientEngine.js.map +1 -1
  19. package/dist/Sound.js +162 -92
  20. package/dist/Sound.js.map +1 -1
  21. package/dist/_virtual/_@oxc-project_runtime@0.115.0/helpers/decorate.js +9 -0
  22. package/dist/_virtual/_@oxc-project_runtime@0.115.0/helpers/decorateMetadata.js +6 -0
  23. package/dist/components/animations/animation.ce.js +22 -19
  24. package/dist/components/animations/animation.ce.js.map +1 -1
  25. package/dist/components/animations/hit.ce.js +67 -68
  26. package/dist/components/animations/hit.ce.js.map +1 -1
  27. package/dist/components/animations/index.js +9 -8
  28. package/dist/components/animations/index.js.map +1 -1
  29. package/dist/components/character.ce.js +390 -314
  30. package/dist/components/character.ce.js.map +1 -1
  31. package/dist/components/dynamics/parse-value.js +42 -52
  32. package/dist/components/dynamics/parse-value.js.map +1 -1
  33. package/dist/components/dynamics/text.ce.js +71 -139
  34. package/dist/components/dynamics/text.ce.js.map +1 -1
  35. package/dist/components/gui/box.ce.js +26 -25
  36. package/dist/components/gui/box.ce.js.map +1 -1
  37. package/dist/components/gui/dialogbox/index.ce.js +202 -149
  38. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  39. package/dist/components/gui/gameover.ce.js +190 -138
  40. package/dist/components/gui/gameover.ce.js.map +1 -1
  41. package/dist/components/gui/hud/hud.ce.js +90 -33
  42. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  43. package/dist/components/gui/index.js +14 -0
  44. package/dist/components/gui/menu/equip-menu.ce.js +478 -346
  45. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  46. package/dist/components/gui/menu/exit-menu.ce.js +52 -33
  47. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  48. package/dist/components/gui/menu/items-menu.ce.js +341 -226
  49. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  50. package/dist/components/gui/menu/main-menu.ce.js +414 -205
  51. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  52. package/dist/components/gui/menu/options-menu.ce.js +46 -26
  53. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  54. package/dist/components/gui/menu/skills-menu.ce.js +104 -50
  55. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  56. package/dist/components/gui/mobile/index.js +18 -21
  57. package/dist/components/gui/mobile/index.js.map +1 -1
  58. package/dist/components/gui/mobile/mobile.ce.js +76 -15
  59. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  60. package/dist/components/gui/notification/notification.ce.js +62 -36
  61. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  62. package/dist/components/gui/save-load.ce.js +386 -239
  63. package/dist/components/gui/save-load.ce.js.map +1 -1
  64. package/dist/components/gui/shop/shop.ce.js +649 -319
  65. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  66. package/dist/components/gui/title-screen.ce.js +187 -145
  67. package/dist/components/gui/title-screen.ce.js.map +1 -1
  68. package/dist/components/index.js +4 -0
  69. package/dist/components/prebuilt/hp-bar.ce.js +114 -104
  70. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  71. package/dist/components/prebuilt/index.js +2 -0
  72. package/dist/components/prebuilt/light-halo.ce.js +92 -74
  73. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  74. package/dist/components/scenes/canvas.ce.js +58 -42
  75. package/dist/components/scenes/canvas.ce.js.map +1 -1
  76. package/dist/components/scenes/draw-map.ce.js +87 -64
  77. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  78. package/dist/components/scenes/event-layer.ce.js +26 -16
  79. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  80. package/dist/core/inject.js +11 -10
  81. package/dist/core/inject.js.map +1 -1
  82. package/dist/core/setup.js +13 -13
  83. package/dist/core/setup.js.map +1 -1
  84. package/dist/index.js +44 -41
  85. package/dist/module.js +169 -168
  86. package/dist/module.js.map +1 -1
  87. package/dist/node_modules/.pnpm/@signe_di@2.8.3/node_modules/@signe/di/dist/index.js +209 -298
  88. package/dist/node_modules/.pnpm/@signe_di@2.8.3/node_modules/@signe/di/dist/index.js.map +1 -1
  89. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js +430 -507
  90. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js.map +1 -1
  91. package/dist/node_modules/.pnpm/@signe_room@2.8.3/node_modules/@signe/room/dist/index.js +2062 -2571
  92. package/dist/node_modules/.pnpm/@signe_room@2.8.3/node_modules/@signe/room/dist/index.js.map +1 -1
  93. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/chunk-7QVYU63E.js +8 -3
  94. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/chunk-7QVYU63E.js.map +1 -1
  95. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/client/index.js +78 -101
  96. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/client/index.js.map +1 -1
  97. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/index.js +264 -401
  98. package/dist/node_modules/.pnpm/@signe_sync@2.8.3/node_modules/@signe/sync/dist/index.js.map +1 -1
  99. package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js +9 -7
  100. package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js.map +1 -1
  101. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js +106 -165
  102. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +1 -1
  103. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js +361 -461
  104. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
  105. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/index.js +2 -0
  106. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js +3633 -4280
  107. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
  108. package/dist/presets/animation.js +37 -25
  109. package/dist/presets/animation.js.map +1 -1
  110. package/dist/presets/faceset.js +49 -22
  111. package/dist/presets/faceset.js.map +1 -1
  112. package/dist/presets/icon.js +13 -13
  113. package/dist/presets/icon.js.map +1 -1
  114. package/dist/presets/index.js +15 -14
  115. package/dist/presets/index.js.map +1 -1
  116. package/dist/presets/lpc.js +96 -93
  117. package/dist/presets/lpc.js.map +1 -1
  118. package/dist/presets/rmspritesheet.js +40 -39
  119. package/dist/presets/rmspritesheet.js.map +1 -1
  120. package/dist/services/AbstractSocket.js +10 -8
  121. package/dist/services/AbstractSocket.js.map +1 -1
  122. package/dist/services/keyboardControls.js +20 -18
  123. package/dist/services/keyboardControls.js.map +1 -1
  124. package/dist/services/loadMap.js +120 -36
  125. package/dist/services/loadMap.js.map +1 -1
  126. package/dist/services/mmorpg.js +128 -136
  127. package/dist/services/mmorpg.js.map +1 -1
  128. package/dist/services/save.js +74 -66
  129. package/dist/services/save.js.map +1 -1
  130. package/dist/services/standalone.js +165 -167
  131. package/dist/services/standalone.js.map +1 -1
  132. package/dist/utils/getEntityProp.js +49 -51
  133. package/dist/utils/getEntityProp.js.map +1 -1
  134. package/package.json +8 -8
  135. package/src/components/character.ce +1 -1
  136. package/src/components/scenes/draw-map.ce +3 -1
  137. package/dist/index.js.map +0 -1
@@ -1,322 +1,652 @@
1
- import { useProps, useDefineProps, signal, computed, createTabindexNavigator, effect, h, DOMContainer, DOMElement, cond, DOMSprite, Navigation, loop } from 'canvasengine';
2
- import { inject } from '../../../core/inject.js';
3
- import { RpgClientEngine } from '../../../RpgClientEngine.js';
4
-
1
+ import { inject } from "../../../core/inject.js";
2
+ import { RpgClientEngine } from "../../../RpgClientEngine.js";
3
+ import { DOMContainer, DOMElement, DOMSprite, Navigation, computed, cond, createTabindexNavigator, effect, h, loop, signal, useDefineProps, useProps } from "canvasengine";
4
+ //#region src/components/gui/shop/shop.ce
5
5
  function component($$props) {
6
- useProps($$props);
7
- const defineProps = useDefineProps($$props);
8
- var engine = inject(RpgClientEngine);
9
- var currentPlayer = engine.scene.currentPlayer;
10
- var keyboardControls = engine.globalConfig.keyboardControls;
11
- var iconSheet = function (iconId) { return ({
12
- definition: engine.getSpriteSheet(iconId),
13
- playing: "default"
14
- }); };
15
- var goldTerm = engine.globalConfig.goldTerm || 'G';
16
- var selectedItem = signal(0);
17
- var selectedTab = signal(0);
18
- var tradeMode = signal('buy');
19
- var tradeView = signal('mode');
20
- var selectedModeIndex = signal(0);
21
- var quantity = signal(1);
22
- var quantityDialogOpen = signal(false);
23
- var defaultMessage = 'Welcome to my shop!';
24
- var tabs = [
25
- { id: 'item', label: 'Items' },
26
- { id: 'weapon', label: 'Weapons' },
27
- { id: 'armor', label: 'Armor' }
28
- ];
29
- var _a = defineProps(), data = _a.data, onInteraction = _a.onInteraction, onFinish = _a.onFinish;
30
- var resolveProp = function (value) { return typeof value === "function" ? value() : value; };
31
- var guiData = computed(function () { return resolveProp(data) || {}; });
32
- var shopMessage = computed(function () {
33
- var message = resolveProp(guiData().message);
34
- return message ? String(message) : defaultMessage;
35
- });
36
- var face = computed(function () { return resolveProp(guiData().face); });
37
- var hasFace = computed(function () {
38
- var value = face();
39
- return value && value.id;
40
- });
41
- var buyItems = computed(function () { return guiData().items || []; });
42
- var sellItems = computed(function () { return guiData().sellItems || []; });
43
- var activeItems = computed(function () { return tradeMode() === 'buy' ? buyItems() : sellItems(); });
44
- var filteredItems = computed(function () {
45
- var tab = tabs[selectedTab()];
46
- var items = activeItems();
47
- if (!tab)
48
- return [];
49
- return items.filter(function (item) { return (item === null || item === void 0 ? void 0 : item.type) === tab.id; });
50
- });
51
- var currentItem = computed(function () { return filteredItems()[selectedItem()]; });
52
- var gold = computed(function () { return currentPlayer()._gold(); });
53
- var actionLabel = computed(function () { return tradeMode() === 'buy' ? 'Buy' : 'Sell'; });
54
- var faceSheet = function (graphicId, animationName) { return ({
55
- definition: engine.getSpriteSheet(graphicId),
56
- playing: animationName || "default"
57
- }); };
58
- var maxQuantity = computed(function () {
59
- var _a;
60
- var item = currentItem();
61
- if (!item)
62
- return 0;
63
- var price = (item === null || item === void 0 ? void 0 : item.price) || 0;
64
- if (price <= 0)
65
- return 0;
66
- if (tradeMode() === 'sell') {
67
- var qty = (_a = item === null || item === void 0 ? void 0 : item.quantity) !== null && _a !== void 0 ? _a : 0;
68
- return Math.max(0, qty);
69
- }
70
- return Math.max(1, Math.floor(gold() / price));
71
- });
72
- var totalPrice = computed(function () {
73
- var _a;
74
- var price = ((_a = currentItem()) === null || _a === void 0 ? void 0 : _a.price) || 0;
75
- return price * quantity();
76
- });
77
- var displayStats = computed(function () {
78
- var _a;
79
- var stats = ((_a = currentItem()) === null || _a === void 0 ? void 0 : _a.stats) || {};
80
- var params = guiData().playerParams || {};
81
- var order = ['atk', 'def', 'pdef', 'sdef', 'str', 'dex', 'int', 'agi', 'maxHp', 'maxSp'];
82
- var labels = {
83
- atk: 'ATK',
84
- def: 'DEF',
85
- pdef: 'PDEF',
86
- sdef: 'SDEF',
87
- str: 'STR',
88
- dex: 'DEX',
89
- int: 'INT',
90
- agi: 'AGI',
91
- maxHp: 'MAX HP',
92
- maxSp: 'MAX SP'
93
- };
94
- var orderedKeys = order.filter(function (key) { return stats[key] !== undefined; });
95
- var extraKeys = Object.keys(stats).filter(function (key) { return !order.includes(key); });
96
- var keys = orderedKeys.concat(extraKeys);
97
- var list = [];
98
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
99
- var key = keys_1[_i];
100
- var delta = stats[key];
101
- if (delta === undefined || delta === 0)
102
- continue;
103
- var current = params[key];
104
- if (current === undefined && key === 'def')
105
- current = params.pdef;
106
- var next = current !== undefined ? current + delta : undefined;
107
- list.push({
108
- key: key,
109
- label: labels[key] || key.toUpperCase(),
110
- delta: delta,
111
- current: current,
112
- next: next
113
- });
114
- }
115
- return list;
116
- });
117
- var nav = createTabindexNavigator(selectedItem, { count: function () { return filteredItems().length; } }, 'wrap');
118
- var navTab = createTabindexNavigator(selectedTab, { count: function () { return tabs.length; } }, 'wrap');
119
- var navMode = createTabindexNavigator(selectedModeIndex, { count: function () { return 2; } }, 'wrap');
120
- function selectItem(index) {
121
- return function () {
122
- selectedItem.set(index);
123
- quantity.set(1);
124
- if (!isItemDisabled(filteredItems()[index])) {
125
- quantityDialogOpen.set(true);
126
- }
127
- };
128
- }
129
- function selectTab(index) {
130
- return function () {
131
- selectedTab.set(index);
132
- selectedItem.set(0);
133
- };
134
- }
135
- function selectMode(mode) {
136
- return function () {
137
- tradeMode.set(mode);
138
- selectedModeIndex.set(mode === 'buy' ? 0 : 1);
139
- selectedItem.set(0);
140
- quantity.set(1);
141
- tradeView.set('items');
142
- };
143
- }
144
- function isItemDisabled(item) {
145
- var _a;
146
- if (!item)
147
- return true;
148
- var price = (item === null || item === void 0 ? void 0 : item.price) || 0;
149
- if (price <= 0)
150
- return true;
151
- if (tradeMode() === 'sell') {
152
- var qty = (_a = item === null || item === void 0 ? void 0 : item.quantity) !== null && _a !== void 0 ? _a : 0;
153
- return qty <= 0;
154
- }
155
- return gold() < price;
156
- }
157
- function backToMode() {
158
- return function () {
159
- tradeView.set('mode');
160
- };
6
+ useProps($$props);
7
+ const defineProps = useDefineProps($$props);
8
+ var engine = inject(RpgClientEngine);
9
+ var currentPlayer = engine.scene.currentPlayer;
10
+ var keyboardControls = engine.globalConfig.keyboardControls;
11
+ var iconSheet = function(iconId) {
12
+ return {
13
+ definition: engine.getSpriteSheet(iconId),
14
+ playing: "default"
15
+ };
16
+ };
17
+ var goldTerm = engine.globalConfig.goldTerm || "G";
18
+ var selectedItem = signal(0);
19
+ var selectedTab = signal(0);
20
+ var tradeMode = signal("buy");
21
+ var tradeView = signal("mode");
22
+ var selectedModeIndex = signal(0);
23
+ var quantity = signal(1);
24
+ var quantityDialogOpen = signal(false);
25
+ var defaultMessage = "Welcome to my shop!";
26
+ var tabs = [
27
+ {
28
+ id: "item",
29
+ label: "Items"
30
+ },
31
+ {
32
+ id: "weapon",
33
+ label: "Weapons"
34
+ },
35
+ {
36
+ id: "armor",
37
+ label: "Armor"
38
+ }
39
+ ];
40
+ var _a = defineProps(), data = _a.data, onInteraction = _a.onInteraction, onFinish = _a.onFinish;
41
+ var resolveProp = function(value) {
42
+ return typeof value === "function" ? value() : value;
43
+ };
44
+ var guiData = computed(function() {
45
+ return resolveProp(data) || {};
46
+ });
47
+ var shopMessage = computed(function() {
48
+ var message = resolveProp(guiData().message);
49
+ return message ? String(message) : defaultMessage;
50
+ });
51
+ var face = computed(function() {
52
+ return resolveProp(guiData().face);
53
+ });
54
+ var hasFace = computed(function() {
55
+ var value = face();
56
+ return value && value.id;
57
+ });
58
+ var buyItems = computed(function() {
59
+ return guiData().items || [];
60
+ });
61
+ var sellItems = computed(function() {
62
+ return guiData().sellItems || [];
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();
70
+ if (!tab) return [];
71
+ return items.filter(function(item) {
72
+ return (item === null || item === void 0 ? void 0 : item.type) === tab.id;
73
+ });
74
+ });
75
+ var currentItem = computed(function() {
76
+ return filteredItems()[selectedItem()];
77
+ });
78
+ var gold = computed(function() {
79
+ return currentPlayer()._gold();
80
+ });
81
+ var actionLabel = computed(function() {
82
+ return tradeMode() === "buy" ? "Buy" : "Sell";
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();
93
+ if (!item) return 0;
94
+ var price = (item === null || item === void 0 ? void 0 : item.price) || 0;
95
+ if (price <= 0) return 0;
96
+ if (tradeMode() === "sell") {
97
+ var qty = (_a = item === null || item === void 0 ? void 0 : item.quantity) !== null && _a !== void 0 ? _a : 0;
98
+ return Math.max(0, qty);
99
+ }
100
+ return Math.max(1, Math.floor(gold() / price));
101
+ });
102
+ var totalPrice = computed(function() {
103
+ var _a;
104
+ return (((_a = currentItem()) === null || _a === void 0 ? void 0 : _a.price) || 0) * quantity();
105
+ });
106
+ var displayStats = computed(function() {
107
+ var _a;
108
+ var stats = ((_a = currentItem()) === null || _a === void 0 ? void 0 : _a.stats) || {};
109
+ var params = guiData().playerParams || {};
110
+ var order = [
111
+ "atk",
112
+ "def",
113
+ "pdef",
114
+ "sdef",
115
+ "str",
116
+ "dex",
117
+ "int",
118
+ "agi",
119
+ "maxHp",
120
+ "maxSp"
121
+ ];
122
+ var labels = {
123
+ atk: "ATK",
124
+ def: "DEF",
125
+ pdef: "PDEF",
126
+ sdef: "SDEF",
127
+ str: "STR",
128
+ dex: "DEX",
129
+ int: "INT",
130
+ agi: "AGI",
131
+ maxHp: "MAX HP",
132
+ maxSp: "MAX SP"
133
+ };
134
+ var orderedKeys = order.filter(function(key) {
135
+ return stats[key] !== void 0;
136
+ });
137
+ var extraKeys = Object.keys(stats).filter(function(key) {
138
+ return !order.includes(key);
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];
145
+ if (delta === void 0 || delta === 0) continue;
146
+ var current = params[key];
147
+ if (current === void 0 && key === "def") current = params.pdef;
148
+ var next = current !== void 0 ? current + delta : void 0;
149
+ list.push({
150
+ key,
151
+ label: labels[key] || key.toUpperCase(),
152
+ delta,
153
+ current,
154
+ next
155
+ });
156
+ }
157
+ return list;
158
+ });
159
+ var nav = createTabindexNavigator(selectedItem, { count: function() {
160
+ return filteredItems().length;
161
+ } }, "wrap");
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");
168
+ function selectItem(index) {
169
+ return function() {
170
+ selectedItem.set(index);
171
+ quantity.set(1);
172
+ if (!isItemDisabled(filteredItems()[index])) quantityDialogOpen.set(true);
173
+ };
174
+ }
175
+ function selectTab(index) {
176
+ return function() {
177
+ selectedTab.set(index);
178
+ selectedItem.set(0);
179
+ };
180
+ }
181
+ function selectMode(mode) {
182
+ return function() {
183
+ tradeMode.set(mode);
184
+ selectedModeIndex.set(mode === "buy" ? 0 : 1);
185
+ selectedItem.set(0);
186
+ quantity.set(1);
187
+ tradeView.set("items");
188
+ };
189
+ }
190
+ function isItemDisabled(item) {
191
+ var _a;
192
+ if (!item) return true;
193
+ var price = (item === null || item === void 0 ? void 0 : item.price) || 0;
194
+ if (price <= 0) return true;
195
+ if (tradeMode() === "sell") return ((_a = item === null || item === void 0 ? void 0 : item.quantity) !== null && _a !== void 0 ? _a : 0) <= 0;
196
+ return gold() < price;
197
+ }
198
+ function backToMode() {
199
+ return function() {
200
+ tradeView.set("mode");
201
+ };
202
+ }
203
+ function changeQuantity(delta) {
204
+ return function() {
205
+ var limit = maxQuantity();
206
+ if (limit <= 0) return;
207
+ var nextValue = Math.max(1, Math.min(limit, quantity() + delta));
208
+ if (nextValue !== quantity()) quantity.set(nextValue);
209
+ };
210
+ }
211
+ function closeQuantityDialog() {
212
+ return function() {
213
+ quantityDialogOpen.set(false);
214
+ };
215
+ }
216
+ function confirmTrade() {
217
+ return function() {
218
+ var item = currentItem();
219
+ if (!item || isItemDisabled(item)) {
220
+ quantityDialogOpen.set(false);
221
+ return;
222
+ }
223
+ onInteraction(tradeMode() === "buy" ? "buyItem" : "sellItem", {
224
+ id: item.id,
225
+ nb: quantity()
226
+ });
227
+ quantityDialogOpen.set(false);
228
+ };
229
+ }
230
+ effect(function() {
231
+ var count = filteredItems().length;
232
+ if (selectedItem() >= count) selectedItem.set(Math.max(0, count - 1));
233
+ });
234
+ var modeControls = signal({
235
+ left: {
236
+ repeat: true,
237
+ bind: keyboardControls.left,
238
+ throttle: 150,
239
+ keyDown: function() {
240
+ navMode.next(-1);
241
+ }
242
+ },
243
+ right: {
244
+ repeat: true,
245
+ bind: keyboardControls.right,
246
+ throttle: 150,
247
+ keyDown: function() {
248
+ navMode.next(1);
249
+ }
250
+ },
251
+ action: {
252
+ bind: keyboardControls.action,
253
+ keyDown: function() {
254
+ var mode = selectedModeIndex() === 0 ? "buy" : "sell";
255
+ tradeMode.set(mode);
256
+ selectedItem.set(0);
257
+ quantity.set(1);
258
+ tradeView.set("items");
259
+ }
260
+ },
261
+ escape: {
262
+ bind: keyboardControls.escape,
263
+ keyDown: function() {
264
+ onFinish();
265
+ }
266
+ },
267
+ gamepad: { enabled: true }
268
+ });
269
+ var itemControls = signal({
270
+ up: {
271
+ repeat: true,
272
+ bind: keyboardControls.up,
273
+ throttle: 150,
274
+ keyDown: function() {
275
+ if (quantityDialogOpen()) {
276
+ changeQuantity(1)();
277
+ return;
278
+ }
279
+ nav.next(-1);
280
+ }
281
+ },
282
+ down: {
283
+ repeat: true,
284
+ bind: keyboardControls.down,
285
+ throttle: 150,
286
+ keyDown: function() {
287
+ if (quantityDialogOpen()) {
288
+ changeQuantity(-1)();
289
+ return;
290
+ }
291
+ nav.next(1);
292
+ }
293
+ },
294
+ action: {
295
+ bind: keyboardControls.action,
296
+ keyDown: function() {
297
+ if (quantityDialogOpen()) {
298
+ var item_1 = currentItem();
299
+ if (!item_1 || isItemDisabled(item_1)) {
300
+ quantityDialogOpen.set(false);
301
+ return;
302
+ }
303
+ onInteraction(tradeMode() === "buy" ? "buyItem" : "sellItem", {
304
+ id: item_1.id,
305
+ nb: quantity()
306
+ });
307
+ quantityDialogOpen.set(false);
308
+ return;
309
+ }
310
+ if (!isItemDisabled(currentItem())) quantityDialogOpen.set(true);
311
+ }
312
+ },
313
+ escape: {
314
+ bind: keyboardControls.escape,
315
+ keyDown: function() {
316
+ if (quantityDialogOpen()) {
317
+ quantityDialogOpen.set(false);
318
+ return;
319
+ }
320
+ tradeView.set("mode");
321
+ }
322
+ },
323
+ gamepad: { enabled: true }
324
+ });
325
+ var tabControls = signal({
326
+ left: {
327
+ repeat: true,
328
+ bind: keyboardControls.left,
329
+ throttle: 150,
330
+ keyDown: function() {
331
+ if (quantityDialogOpen()) return;
332
+ navTab.next(-1);
333
+ }
334
+ },
335
+ right: {
336
+ repeat: true,
337
+ bind: keyboardControls.right,
338
+ throttle: 150,
339
+ keyDown: function() {
340
+ if (quantityDialogOpen()) return;
341
+ navTab.next(1);
342
+ }
343
+ },
344
+ gamepad: { enabled: true }
345
+ });
346
+ return h(DOMContainer, {
347
+ width: "100%",
348
+ height: "100%"
349
+ }, h(DOMElement, {
350
+ element: "div",
351
+ attrs: { class: "rpg-shop-container rpg-anim-fade-in" }
352
+ }, [h(DOMElement, {
353
+ element: "div",
354
+ attrs: { class: "rpg-shop-header" }
355
+ }, [h(DOMElement, {
356
+ element: "div",
357
+ attrs: { class: "rpg-shop-merchant" }
358
+ }, [h(DOMElement, { element: "div" }, cond(hasFace, () => h(DOMElement, {
359
+ element: "div",
360
+ attrs: { class: "rpg-shop-merchant-avatar" }
361
+ }, h(DOMSprite, {
362
+ sheet: computed(() => faceSheet(face().id, face().expression)),
363
+ width: "50px",
364
+ height: "50px",
365
+ objectFit: "contain"
366
+ })))), h(DOMElement, {
367
+ element: "div",
368
+ attrs: { class: "rpg-shop-merchant-info" }
369
+ }, h(DOMElement, {
370
+ element: "p",
371
+ textContent: computed(() => shopMessage())
372
+ }))]), h(DOMElement, {
373
+ element: "div",
374
+ attrs: { class: "rpg-shop-gold" },
375
+ textContent: computed(() => gold() + goldTerm)
376
+ })]), h(DOMElement, {
377
+ element: "div",
378
+ attrs: { class: "rpg-shop-body" }
379
+ }, h(DOMElement, {
380
+ element: "div",
381
+ attrs: { class: "rpg-shop-left" }
382
+ }, [cond(computed(() => tradeView() === "mode"), () => h(DOMElement, {
383
+ element: "div",
384
+ attrs: { class: "rpg-shop-content rpg-shop-content-mode" }
385
+ }, h(DOMElement, {
386
+ element: "div",
387
+ attrs: { class: "rpg-shop-details rpg-shop-details-mode" }
388
+ }, [h(DOMElement, {
389
+ element: "div",
390
+ attrs: { class: "rpg-shop-details-header" }
391
+ }, [h(DOMElement, {
392
+ element: "div",
393
+ attrs: { class: "rpg-shop-details-icon" },
394
+ textContent: "🛒"
395
+ }), h(DOMElement, {
396
+ element: "h2",
397
+ attrs: { style: "margin: 0;" },
398
+ textContent: "Choose an action"
399
+ })]), h(DOMElement, {
400
+ element: "div",
401
+ attrs: { class: "rpg-shop-trade" }
402
+ }, h(Navigation, {
403
+ tabindex: selectedModeIndex,
404
+ controls: modeControls
405
+ }, h(DOMElement, {
406
+ element: "div",
407
+ attrs: { class: "rpg-shop-tabs rpg-shop-trade-tabs" }
408
+ }, [h(DOMElement, {
409
+ element: "div",
410
+ attrs: {
411
+ class: ["rpg-shop-tab", computed(() => ({ active: selectedModeIndex() === 0 }))],
412
+ click: selectMode("buy")
413
+ },
414
+ textContent: "Buy"
415
+ }), h(DOMElement, {
416
+ element: "div",
417
+ attrs: {
418
+ class: ["rpg-shop-tab", computed(() => ({ active: selectedModeIndex() === 1 }))],
419
+ click: selectMode("sell")
420
+ },
421
+ textContent: "Sell"
422
+ })])))])), () => h(DOMElement, { element: "div" }, [h(Navigation, {
423
+ tabindex: selectedTab,
424
+ controls: tabControls
425
+ }, h(DOMElement, {
426
+ element: "div",
427
+ attrs: { class: "rpg-shop-tabs" }
428
+ }, loop(tabs, (tab, index) => h(DOMElement, {
429
+ element: "div",
430
+ attrs: {
431
+ class: ["rpg-shop-tab", computed(() => ({ active: selectedTab() === index }))],
432
+ tabindex: index,
433
+ click: selectTab(index)
434
+ },
435
+ textContent: tab.label
436
+ })))), h(DOMElement, {
437
+ element: "div",
438
+ attrs: { class: "rpg-shop-content" }
439
+ }, [h(DOMElement, {
440
+ element: "div",
441
+ attrs: { class: "rpg-shop-grid" }
442
+ }, h(Navigation, {
443
+ tabindex: selectedItem,
444
+ controls: itemControls
445
+ }, loop(filteredItems, (item, index) => h(DOMElement, {
446
+ element: "div",
447
+ attrs: {
448
+ class: ["rpg-shop-card", computed(() => ({
449
+ disabled: isItemDisabled(item),
450
+ selected: selectedItem() === index
451
+ }))],
452
+ tabindex: index,
453
+ click: selectItem(index)
454
+ }
455
+ }, [
456
+ h(DOMElement, {
457
+ element: "div",
458
+ attrs: { class: "rpg-shop-card-icon" }
459
+ }, cond(item.icon, () => h(DOMSprite, {
460
+ sheet: computed(() => iconSheet(item.icon)),
461
+ playing: "default",
462
+ width: "48px",
463
+ height: "48px",
464
+ objectFit: "contain"
465
+ }))),
466
+ h(DOMElement, {
467
+ element: "div",
468
+ attrs: { class: "rpg-shop-card-name" },
469
+ textContent: item.name
470
+ }),
471
+ h(DOMElement, {
472
+ element: "div",
473
+ attrs: { class: "rpg-shop-card-price" },
474
+ textContent: item.price + goldTerm
475
+ }),
476
+ cond(computed(() => item.quantity !== void 0), () => h(DOMElement, {
477
+ element: "div",
478
+ attrs: { class: "rpg-shop-card-qty" },
479
+ textContent: "x" + item.quantity
480
+ })),
481
+ cond(item.equipped, () => h(DOMElement, {
482
+ element: "div",
483
+ attrs: { class: "rpg-shop-card-tag" },
484
+ textContent: "Equipped"
485
+ }))
486
+ ])))), h(DOMElement, {
487
+ element: "div",
488
+ attrs: { class: "rpg-shop-details" }
489
+ }, [
490
+ h(DOMElement, {
491
+ element: "div",
492
+ attrs: { class: "rpg-shop-details-header" }
493
+ }, [
494
+ h(DOMElement, {
495
+ element: "div",
496
+ attrs: { class: "rpg-shop-details-icon" }
497
+ }, h(DOMSprite, {
498
+ sheet: computed(() => iconSheet(currentItem()?.icon)),
499
+ playing: "default",
500
+ width: "80px",
501
+ height: "80px",
502
+ objectFit: "contain"
503
+ })),
504
+ h(DOMElement, {
505
+ element: "h2",
506
+ attrs: { style: "margin: 0;" },
507
+ textContent: computed(() => currentItem()?.name || "")
508
+ }),
509
+ h(DOMElement, {
510
+ element: "p",
511
+ attrs: { style: "color: #ffd700; font-weight: bold; margin: 8px 0;" },
512
+ textContent: computed(() => currentItem()?.price ?? 0 + goldTerm)
513
+ }),
514
+ cond(computed(() => currentItem()?.quantity !== void 0), () => h(DOMElement, {
515
+ element: "div",
516
+ attrs: { class: "rpg-shop-details-qty" },
517
+ textContent: computed(() => "Qty: x" + currentItem()?.quantity)
518
+ }))
519
+ ]),
520
+ h(DOMElement, { element: "div" }, cond(currentItem()?.equipped, () => h(DOMElement, {
521
+ element: "div",
522
+ attrs: { class: "rpg-shop-equipped" },
523
+ textContent: "Already equipped"
524
+ }))),
525
+ h(DOMElement, {
526
+ element: "div",
527
+ attrs: { class: "rpg-shop-details-desc" },
528
+ textContent: computed(() => currentItem()?.description || "")
529
+ }),
530
+ h(DOMElement, { element: "div" }, cond(computed(() => displayStats().length > 0), () => h(DOMElement, {
531
+ element: "div",
532
+ attrs: { class: "rpg-shop-stats" }
533
+ }, loop(displayStats, (stat, index) => h(DOMElement, {
534
+ element: "div",
535
+ attrs: { class: ["rpg-shop-stat", {
536
+ positive: stat.delta > 0,
537
+ negative: stat.delta < 0
538
+ }] }
539
+ }, [
540
+ h(DOMElement, {
541
+ element: "div",
542
+ attrs: { class: "rpg-shop-stat-key" },
543
+ textContent: stat.label
544
+ }),
545
+ h(DOMElement, {
546
+ element: "div",
547
+ attrs: { class: "rpg-shop-stat-value" },
548
+ textContent: stat.delta > 0 ? "+" : "" + stat.delta
549
+ }),
550
+ cond(computed(() => stat.current !== void 0), () => h(DOMElement, {
551
+ element: "div",
552
+ attrs: { class: "rpg-shop-stat-current" },
553
+ textContent: stat.current + " → " + stat.next
554
+ }))
555
+ ]))))),
556
+ h(DOMElement, {
557
+ element: "button",
558
+ attrs: {
559
+ class: "rpg-shop-btn",
560
+ click: backToMode()
561
+ },
562
+ textContent: "Back"
563
+ })
564
+ ])])])), cond(quantityDialogOpen, () => h(DOMElement, {
565
+ element: "div",
566
+ attrs: { class: "rpg-shop-modal" }
567
+ }, h(DOMElement, {
568
+ element: "div",
569
+ attrs: { class: "rpg-shop-modal-card" }
570
+ }, [
571
+ h(DOMElement, {
572
+ element: "div",
573
+ attrs: { class: "rpg-shop-modal-title" },
574
+ textContent: actionLabel
575
+ }),
576
+ h(DOMElement, {
577
+ element: "div",
578
+ attrs: { class: "rpg-shop-modal-item" },
579
+ textContent: computed(() => currentItem()?.name || "")
580
+ }),
581
+ cond(computed(() => currentItem()?.quantity !== void 0), () => h(DOMElement, {
582
+ element: "div",
583
+ attrs: { class: "rpg-shop-modal-qty" },
584
+ textContent: computed(() => "Available: x" + currentItem()?.quantity)
585
+ })),
586
+ h(DOMElement, {
587
+ element: "div",
588
+ attrs: { class: "rpg-shop-quantity" }
589
+ }, [h(DOMElement, {
590
+ element: "div",
591
+ attrs: { class: "rpg-shop-quantity-label" },
592
+ textContent: "Quantity"
593
+ }), h(DOMElement, {
594
+ element: "div",
595
+ attrs: { class: "rpg-shop-quantity-controls" }
596
+ }, [
597
+ h(DOMElement, {
598
+ element: "button",
599
+ attrs: {
600
+ class: "rpg-shop-btn",
601
+ click: changeQuantity(-1)
602
+ },
603
+ textContent: "-"
604
+ }),
605
+ h(DOMElement, {
606
+ element: "div",
607
+ attrs: { class: "rpg-shop-quantity-value" },
608
+ textContent: quantity
609
+ }),
610
+ h(DOMElement, {
611
+ element: "button",
612
+ attrs: {
613
+ class: "rpg-shop-btn",
614
+ click: changeQuantity(1)
615
+ },
616
+ textContent: "+"
617
+ })
618
+ ])]),
619
+ h(DOMElement, {
620
+ element: "div",
621
+ attrs: { class: "rpg-shop-modal-total" }
622
+ }, [h(DOMElement, {
623
+ element: "span",
624
+ textContent: "Total"
625
+ }), h(DOMElement, {
626
+ element: "span",
627
+ textContent: computed(() => totalPrice() + goldTerm)
628
+ })]),
629
+ h(DOMElement, {
630
+ element: "div",
631
+ attrs: { class: "rpg-shop-modal-actions" }
632
+ }, [h(DOMElement, {
633
+ element: "button",
634
+ attrs: {
635
+ class: "rpg-shop-btn rpg-shop-btn-secondary",
636
+ click: closeQuantityDialog()
637
+ },
638
+ textContent: "Cancel"
639
+ }), h(DOMElement, {
640
+ element: "button",
641
+ attrs: {
642
+ class: "rpg-shop-btn",
643
+ click: confirmTrade()
644
+ },
645
+ textContent: computed(() => actionLabel() + " x" + quantity())
646
+ })])
647
+ ])))]))]));
161
648
  }
162
- function changeQuantity(delta) {
163
- return function () {
164
- var limit = maxQuantity();
165
- if (limit <= 0)
166
- return;
167
- var nextValue = Math.max(1, Math.min(limit, quantity() + delta));
168
- if (nextValue !== quantity()) {
169
- quantity.set(nextValue);
170
- }
171
- };
172
- }
173
- function closeQuantityDialog() {
174
- return function () {
175
- quantityDialogOpen.set(false);
176
- };
177
- }
178
- function confirmTrade() {
179
- return function () {
180
- var item = currentItem();
181
- if (!item || isItemDisabled(item)) {
182
- quantityDialogOpen.set(false);
183
- return;
184
- }
185
- var action = tradeMode() === 'buy' ? 'buyItem' : 'sellItem';
186
- onInteraction(action, { id: item.id, nb: quantity() });
187
- quantityDialogOpen.set(false);
188
- };
189
- }
190
- effect(function () {
191
- var count = filteredItems().length;
192
- if (selectedItem() >= count) {
193
- selectedItem.set(Math.max(0, count - 1));
194
- }
195
- });
196
- var modeControls = signal({
197
- left: {
198
- repeat: true,
199
- bind: keyboardControls.left,
200
- throttle: 150,
201
- keyDown: function () {
202
- navMode.next(-1);
203
- }
204
- },
205
- right: {
206
- repeat: true,
207
- bind: keyboardControls.right,
208
- throttle: 150,
209
- keyDown: function () {
210
- navMode.next(1);
211
- }
212
- },
213
- action: {
214
- bind: keyboardControls.action,
215
- keyDown: function () {
216
- var mode = selectedModeIndex() === 0 ? 'buy' : 'sell';
217
- tradeMode.set(mode);
218
- selectedItem.set(0);
219
- quantity.set(1);
220
- tradeView.set('items');
221
- }
222
- },
223
- escape: {
224
- bind: keyboardControls.escape,
225
- keyDown: function () {
226
- onFinish();
227
- }
228
- },
229
- gamepad: {
230
- enabled: true
231
- }
232
- });
233
- var itemControls = signal({
234
- up: {
235
- repeat: true,
236
- bind: keyboardControls.up,
237
- throttle: 150,
238
- keyDown: function () {
239
- if (quantityDialogOpen()) {
240
- changeQuantity(1)();
241
- return;
242
- }
243
- nav.next(-1);
244
- }
245
- },
246
- down: {
247
- repeat: true,
248
- bind: keyboardControls.down,
249
- throttle: 150,
250
- keyDown: function () {
251
- if (quantityDialogOpen()) {
252
- changeQuantity(-1)();
253
- return;
254
- }
255
- nav.next(1);
256
- }
257
- },
258
- action: {
259
- bind: keyboardControls.action,
260
- keyDown: function () {
261
- if (quantityDialogOpen()) {
262
- var item_1 = currentItem();
263
- if (!item_1 || isItemDisabled(item_1)) {
264
- quantityDialogOpen.set(false);
265
- return;
266
- }
267
- var action = tradeMode() === 'buy' ? 'buyItem' : 'sellItem';
268
- onInteraction(action, { id: item_1.id, nb: quantity() });
269
- quantityDialogOpen.set(false);
270
- return;
271
- }
272
- var item = currentItem();
273
- if (!isItemDisabled(item)) {
274
- quantityDialogOpen.set(true);
275
- }
276
- }
277
- },
278
- escape: {
279
- bind: keyboardControls.escape,
280
- keyDown: function () {
281
- if (quantityDialogOpen()) {
282
- quantityDialogOpen.set(false);
283
- return;
284
- }
285
- tradeView.set('mode');
286
- }
287
- },
288
- gamepad: {
289
- enabled: true
290
- }
291
- });
292
- var tabControls = signal({
293
- left: {
294
- repeat: true,
295
- bind: keyboardControls.left,
296
- throttle: 150,
297
- keyDown: function () {
298
- if (quantityDialogOpen())
299
- return;
300
- navTab.next(-1);
301
- }
302
- },
303
- right: {
304
- repeat: true,
305
- bind: keyboardControls.right,
306
- throttle: 150,
307
- keyDown: function () {
308
- if (quantityDialogOpen())
309
- return;
310
- navTab.next(1);
311
- }
312
- },
313
- gamepad: {
314
- enabled: true
315
- }
316
- });
317
- let $this = h(DOMContainer, { width: '100%', height: '100%' }, h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-container rpg-anim-fade-in' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-header' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-merchant' } }, [h(DOMElement, { element: "div" }, cond(hasFace, () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-merchant-avatar' } }, h(DOMSprite, { sheet: computed(() => faceSheet(face().id, face().expression)), width: '50px', height: '50px', objectFit: 'contain' })))), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-merchant-info' } }, h(DOMElement, { element: "p", textContent: computed(() => shopMessage()) }))]), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-gold' }, textContent: computed(() => gold() + goldTerm) })]), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-body' } }, h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-left' } }, [cond(computed(() => tradeView() === 'mode'), () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-content rpg-shop-content-mode' } }, h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details rpg-shop-details-mode' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details-header' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details-icon' }, textContent: '🛒' }), h(DOMElement, { element: "h2", attrs: { style: 'margin: 0;' }, textContent: 'Choose an action' })]), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-trade' } }, h(Navigation, { tabindex: selectedModeIndex, controls: modeControls }, h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-tabs rpg-shop-trade-tabs' } }, [h(DOMElement, { element: "div", attrs: { class: ['rpg-shop-tab', computed(() => ({ active: selectedModeIndex() === 0 }))], click: selectMode('buy') }, textContent: 'Buy' }), h(DOMElement, { element: "div", attrs: { class: ['rpg-shop-tab', computed(() => ({ active: selectedModeIndex() === 1 }))], click: selectMode('sell') }, textContent: 'Sell' })])))])), () => h(DOMElement, { element: "div" }, [h(Navigation, { tabindex: selectedTab, controls: tabControls }, h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-tabs' } }, loop(tabs, (tab, index) => h(DOMElement, { element: "div", attrs: { class: ['rpg-shop-tab', computed(() => ({ active: selectedTab() === index }))], tabindex: index, click: selectTab(index) }, textContent: tab.label })))), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-content' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-grid' } }, h(Navigation, { tabindex: selectedItem, controls: itemControls }, loop(filteredItems, (item, index) => h(DOMElement, { element: "div", attrs: { class: ['rpg-shop-card', computed(() => ({ disabled: isItemDisabled(item), selected: selectedItem() === index }))], tabindex: index, click: selectItem(index) } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-card-icon' } }, cond(item.icon, () => h(DOMSprite, { sheet: computed(() => iconSheet(item.icon)), playing: 'default', width: '48px', height: '48px', objectFit: 'contain' }))), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-card-name' }, textContent: item.name }), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-card-price' }, textContent: item.price + goldTerm }), cond(computed(() => item.quantity !== undefined), () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-card-qty' }, textContent: 'x' + item.quantity })), cond(item.equipped, () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-card-tag' }, textContent: 'Equipped' }))])))), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details-header' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details-icon' } }, h(DOMSprite, { sheet: computed(() => iconSheet(currentItem()?.icon)), playing: 'default', width: '80px', height: '80px', objectFit: 'contain' })), h(DOMElement, { element: "h2", attrs: { style: 'margin: 0;' }, textContent: computed(() => currentItem()?.name || "") }), h(DOMElement, { element: "p", attrs: { style: 'color: #ffd700; font-weight: bold; margin: 8px 0;' }, textContent: computed(() => currentItem()?.price ?? 0 + goldTerm) }), cond(computed(() => currentItem()?.quantity !== undefined), () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details-qty' }, textContent: computed(() => 'Qty: x' + currentItem()?.quantity) }))]), h(DOMElement, { element: "div" }, cond(currentItem()?.equipped, () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-equipped' }, textContent: 'Already equipped' }))), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-details-desc' }, textContent: computed(() => currentItem()?.description || "") }), h(DOMElement, { element: "div" }, cond(computed(() => displayStats().length > 0), () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-stats' } }, loop(displayStats, (stat, index) => h(DOMElement, { element: "div", attrs: { class: ['rpg-shop-stat', { positive: stat.delta > 0, negative: stat.delta < 0 }] } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-stat-key' }, textContent: stat.label }), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-stat-value' }, textContent: stat.delta > 0 ? '+' : '' + stat.delta }), cond(computed(() => stat.current !== undefined), () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-stat-current' }, textContent: stat.current + ' → ' + stat.next }))]))))), h(DOMElement, { element: "button", attrs: { class: 'rpg-shop-btn', click: backToMode() }, textContent: 'Back' })])])])), cond(quantityDialogOpen, () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal' } }, h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal-card' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal-title' }, textContent: actionLabel }), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal-item' }, textContent: computed(() => currentItem()?.name || "") }), cond(computed(() => currentItem()?.quantity !== undefined), () => h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal-qty' }, textContent: computed(() => 'Available: x' + currentItem()?.quantity) })), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-quantity' } }, [h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-quantity-label' }, textContent: 'Quantity' }), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-quantity-controls' } }, [h(DOMElement, { element: "button", attrs: { class: 'rpg-shop-btn', click: changeQuantity(-1) }, textContent: '-' }), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-quantity-value' }, textContent: quantity }), h(DOMElement, { element: "button", attrs: { class: 'rpg-shop-btn', click: changeQuantity(1) }, textContent: '+' })])]), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal-total' } }, [h(DOMElement, { element: "span", textContent: 'Total' }), h(DOMElement, { element: "span", textContent: computed(() => totalPrice() + goldTerm) })]), h(DOMElement, { element: "div", attrs: { class: 'rpg-shop-modal-actions' } }, [h(DOMElement, { element: "button", attrs: { class: 'rpg-shop-btn rpg-shop-btn-secondary', click: closeQuantityDialog() }, textContent: 'Cancel' }), h(DOMElement, { element: "button", attrs: { class: 'rpg-shop-btn', click: confirmTrade() }, textContent: computed(() => actionLabel() + ' x' + quantity()) })])])))]))]));
318
- return $this
319
- }
320
-
649
+ //#endregion
321
650
  export { component as default };
322
- //# sourceMappingURL=shop.ce.js.map
651
+
652
+ //# sourceMappingURL=shop.ce.js.map