@rpgjs/client 5.0.0-beta.2 → 5.0.0-beta.3

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 (75) hide show
  1. package/dist/Game/Map.js +2 -2
  2. package/dist/Game/Object.js.map +1 -1
  3. package/dist/Gui/Gui.js.map +1 -1
  4. package/dist/Gui/NotificationManager.js.map +1 -1
  5. package/dist/RpgClientEngine.js +2 -1
  6. package/dist/RpgClientEngine.js.map +1 -1
  7. package/dist/Sound.js.map +1 -1
  8. package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.js +1 -1
  9. package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.127.0}/helpers/decorateMetadata.js +1 -1
  10. package/dist/components/animations/animation.ce.js +2 -4
  11. package/dist/components/animations/animation.ce.js.map +1 -1
  12. package/dist/components/animations/hit.ce.js +17 -24
  13. package/dist/components/animations/hit.ce.js.map +1 -1
  14. package/dist/components/character.ce.js +75 -222
  15. package/dist/components/character.ce.js.map +1 -1
  16. package/dist/components/dynamics/text.ce.js +14 -25
  17. package/dist/components/dynamics/text.ce.js.map +1 -1
  18. package/dist/components/gui/box.ce.js +4 -7
  19. package/dist/components/gui/box.ce.js.map +1 -1
  20. package/dist/components/gui/dialogbox/index.ce.js +37 -54
  21. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  22. package/dist/components/gui/gameover.ce.js +36 -61
  23. package/dist/components/gui/gameover.ce.js.map +1 -1
  24. package/dist/components/gui/hud/hud.ce.js +18 -28
  25. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  26. package/dist/components/gui/menu/equip-menu.ce.js +108 -163
  27. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  28. package/dist/components/gui/menu/exit-menu.ce.js +4 -4
  29. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  30. package/dist/components/gui/menu/items-menu.ce.js +47 -66
  31. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  32. package/dist/components/gui/menu/main-menu.ce.js +58 -77
  33. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  34. package/dist/components/gui/menu/options-menu.ce.js +3 -3
  35. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  36. package/dist/components/gui/menu/skills-menu.ce.js +10 -16
  37. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  38. package/dist/components/gui/mobile/mobile.ce.js +3 -3
  39. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  40. package/dist/components/gui/notification/notification.ce.js +13 -19
  41. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  42. package/dist/components/gui/save-load.ce.js +68 -247
  43. package/dist/components/gui/save-load.ce.js.map +1 -1
  44. package/dist/components/gui/shop/shop.ce.js +84 -123
  45. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  46. package/dist/components/gui/title-screen.ce.js +38 -65
  47. package/dist/components/gui/title-screen.ce.js.map +1 -1
  48. package/dist/components/prebuilt/hp-bar.ce.js +39 -43
  49. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  50. package/dist/components/prebuilt/light-halo.ce.js +33 -58
  51. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  52. package/dist/components/scenes/canvas.ce.js +11 -19
  53. package/dist/components/scenes/canvas.ce.js.map +1 -1
  54. package/dist/components/scenes/draw-map.ce.js +20 -25
  55. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  56. package/dist/components/scenes/event-layer.ce.js +4 -4
  57. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  58. package/dist/core/setup.js.map +1 -1
  59. package/dist/module.js.map +1 -1
  60. package/dist/node_modules/.pnpm/@signe_di@2.9.0/node_modules/@signe/di/dist/index.js.map +1 -1
  61. package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js +1 -1
  62. package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js.map +1 -1
  63. package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js +1 -1
  64. package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js.map +1 -1
  65. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js.map +1 -1
  66. package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/index.js.map +1 -1
  67. package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
  68. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js +27 -27
  69. package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
  70. package/dist/services/keyboardControls.js.map +1 -1
  71. package/dist/services/mmorpg.js +2 -1
  72. package/dist/services/mmorpg.js.map +1 -1
  73. package/package.json +7 -7
  74. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js +0 -457
  75. package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js.map +0 -1
@@ -5,39 +5,15 @@ import { DOMContainer, DOMElement, DOMSprite, Navigation, computed, cond, create
5
5
  function component($$props) {
6
6
  useProps($$props);
7
7
  const defineProps = useDefineProps($$props);
8
- var __assign = this && this.__assign || function() {
9
- __assign = Object.assign || function(t) {
10
- for (var s, i = 1, n = arguments.length; i < n; i++) {
11
- s = arguments[i];
12
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
13
- }
14
- return t;
15
- };
16
- return __assign.apply(this, arguments);
17
- };
18
- var __spreadArray = this && this.__spreadArray || function(to, from, pack) {
19
- if (pack || arguments.length === 2) {
20
- for (var i = 0, l = from.length, ar; i < l; i++) if (ar || !(i in from)) {
21
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
- ar[i] = from[i];
23
- }
24
- }
25
- return to.concat(ar || Array.prototype.slice.call(from));
26
- };
27
- var engine = inject(RpgClientEngine);
28
- var keyboardControls = engine.globalConfig.keyboardControls;
29
- var currentPlayer = engine.scene.currentPlayer;
30
- var selectedTab = signal(0);
31
- var selectedItem = signal(0);
32
- var _a = defineProps(), data = _a.data, onInteraction = _a.onInteraction, onBack = _a.onBack;
33
- var equips = computed(function() {
34
- var _a;
35
- return (_a = data().equips) !== null && _a !== void 0 ? _a : data().items;
36
- });
37
- var slots = computed(function() {
38
- return data().slots;
39
- });
40
- var defaultSlots = [{
8
+ const engine = inject(RpgClientEngine);
9
+ const keyboardControls = engine.globalConfig.keyboardControls;
10
+ const currentPlayer = engine.scene.currentPlayer;
11
+ const selectedTab = signal(0);
12
+ const selectedItem = signal(0);
13
+ const { data, onInteraction, onBack } = defineProps();
14
+ const equips = computed(() => data().equips ?? data().items);
15
+ const slots = computed(() => data().slots);
16
+ const defaultSlots = [{
41
17
  id: "weapon",
42
18
  label: "Weapon",
43
19
  types: ["weapon"]
@@ -46,108 +22,88 @@ function component($$props) {
46
22
  label: "Armor",
47
23
  types: ["armor"]
48
24
  }];
49
- var resolveProp = function(value) {
50
- return typeof value === "function" ? value() : value;
51
- };
52
- var safeEquips = computed(function() {
53
- var list = resolveProp(equips);
25
+ const resolveProp = (value) => typeof value === "function" ? value() : value;
26
+ const safeEquips = computed(() => {
27
+ const list = resolveProp(equips);
54
28
  return Array.isArray(list) ? list : [];
55
29
  });
56
- var slotList = computed(function() {
57
- var list = resolveProp(slots);
30
+ const slotList = computed(() => {
31
+ const list = resolveProp(slots);
58
32
  if (Array.isArray(list) && list.length) return list;
59
33
  return defaultSlots;
60
34
  });
61
- var currentSlot = computed(function() {
62
- return slotList()[selectedTab()];
63
- });
64
- var equippedIds = computed(function() {
65
- var _a, _b;
66
- var equipped = ((_b = (_a = currentPlayer()).equipments) === null || _b === void 0 ? void 0 : _b.call(_a)) || [];
67
- return new Set(equipped.map(function(it) {
68
- var _a, _b, _c;
69
- return (_c = (_b = (_a = it === null || it === void 0 ? void 0 : it.id) === null || _a === void 0 ? void 0 : _a.call(it)) !== null && _b !== void 0 ? _b : it === null || it === void 0 ? void 0 : it.id) !== null && _c !== void 0 ? _c : it === null || it === void 0 ? void 0 : it.name;
70
- }));
35
+ const currentSlot = computed(() => slotList()[selectedTab()]);
36
+ const equippedIds = computed(() => {
37
+ const equipped = currentPlayer().equipments?.() || [];
38
+ return new Set(equipped.map((it) => it?.id?.() ?? it?.id ?? it?.name));
71
39
  });
72
- var equippedOverrides = signal({});
73
- effect(function() {
74
- var next = {};
75
- safeEquips().forEach(function(item) {
76
- if ((item === null || item === void 0 ? void 0 : item.id) && typeof item.equipped === "boolean") next[item.id] = item.equipped;
40
+ const equippedOverrides = signal({});
41
+ effect(() => {
42
+ const next = {};
43
+ safeEquips().forEach((item) => {
44
+ if (item?.id && typeof item.equipped === "boolean") next[item.id] = item.equipped;
77
45
  });
78
46
  equippedOverrides.set(next);
79
47
  });
80
- var itemEquipped = function(item) {
48
+ const itemEquipped = (item) => {
81
49
  if (!item) return false;
82
- var overrides = equippedOverrides();
50
+ const overrides = equippedOverrides();
83
51
  if (Object.prototype.hasOwnProperty.call(overrides, item.id)) return overrides[item.id];
84
52
  if (typeof item.equipped === "boolean") return item.equipped;
85
53
  return equippedIds().has(item.id);
86
54
  };
87
- var slotTypes = function(slot) {
55
+ const slotTypes = (slot) => {
88
56
  if (!slot) return [];
89
57
  if (Array.isArray(slot.types)) return slot.types;
90
58
  if (slot.type) return [slot.type];
91
59
  if (slot.id) return [slot.id];
92
60
  return [];
93
61
  };
94
- var slotItems = computed(function() {
95
- var slot = currentSlot();
62
+ const slotItems = computed(() => {
63
+ const slot = currentSlot();
96
64
  if (!slot) return [];
97
- var types = new Set(slotTypes(slot));
98
- return safeEquips().filter(function(item) {
99
- return item && types.has(item.type);
100
- });
65
+ const types = new Set(slotTypes(slot));
66
+ return safeEquips().filter((item) => item && types.has(item.type));
101
67
  });
102
- var currentEquippedItem = computed(function() {
103
- return slotItems().find(function(item) {
104
- return itemEquipped(item);
105
- }) || null;
68
+ const currentEquippedItem = computed(() => {
69
+ return slotItems().find((item) => itemEquipped(item)) || null;
106
70
  });
107
- var listEntries = computed(function() {
108
- var items = slotItems().map(function(item) {
109
- return __assign(__assign({}, item), {
110
- kind: "item",
111
- tag: itemEquipped(item) ? "Equipped" : ""
112
- });
113
- });
71
+ const listEntries = computed(() => {
72
+ const items = slotItems().map((item) => ({
73
+ ...item,
74
+ kind: "item",
75
+ tag: itemEquipped(item) ? "Equipped" : ""
76
+ }));
114
77
  if (!currentEquippedItem()) return items;
115
- return __spreadArray([{
78
+ return [{
116
79
  id: "__unequip__",
117
80
  name: "Unequip",
118
81
  description: "Remove the current equipment",
119
82
  kind: "unequip",
120
83
  tag: ""
121
- }], items, true);
84
+ }, ...items];
122
85
  });
123
- var currentEntry = computed(function() {
124
- return listEntries()[selectedItem()];
125
- });
126
- var detailsItem = computed(function() {
127
- var entry = currentEntry();
128
- if ((entry === null || entry === void 0 ? void 0 : entry.kind) === "item") return entry;
86
+ const currentEntry = computed(() => listEntries()[selectedItem()]);
87
+ const detailsItem = computed(() => {
88
+ const entry = currentEntry();
89
+ if (entry?.kind === "item") return entry;
129
90
  return currentEquippedItem();
130
91
  });
131
- var equippedText = computed(function() {
132
- var slot = currentSlot();
92
+ const equippedText = computed(() => {
93
+ const slot = currentSlot();
133
94
  if (!slot) return "";
134
- var equipped = currentEquippedItem();
135
- return equipped ? "".concat(slot.label, ": ").concat(equipped.name) : "".concat(slot.label, ": Empty");
136
- });
137
- computed(function() {
138
- return listEntries().length === 0;
95
+ const equipped = currentEquippedItem();
96
+ return equipped ? `${slot.label}: ${equipped.name}` : `${slot.label}: Empty`;
139
97
  });
140
- var nav = createTabindexNavigator(selectedItem, { count: function() {
141
- return listEntries().length;
142
- } }, "wrap");
143
- var playerParams = computed(function() {
144
- var _a, _b;
145
- var menuData = data();
146
- if (menuData === null || menuData === void 0 ? void 0 : menuData.playerStats) return menuData.playerStats;
147
- if (menuData === null || menuData === void 0 ? void 0 : menuData.playerParams) return menuData.playerParams;
148
- return ((_b = (_a = currentPlayer()) === null || _a === void 0 ? void 0 : _a._param) === null || _b === void 0 ? void 0 : _b.call(_a)) || {};
98
+ computed(() => listEntries().length === 0);
99
+ const nav = createTabindexNavigator(selectedItem, { count: () => listEntries().length }, "wrap");
100
+ const playerParams = computed(() => {
101
+ const menuData = data();
102
+ if (menuData?.playerStats) return menuData.playerStats;
103
+ if (menuData?.playerParams) return menuData.playerParams;
104
+ return currentPlayer()?._param?.() || {};
149
105
  });
150
- var statOrder = [
106
+ const statOrder = [
151
107
  "atk",
152
108
  "def",
153
109
  "pdef",
@@ -159,7 +115,7 @@ function component($$props) {
159
115
  "maxHp",
160
116
  "maxSp"
161
117
  ];
162
- var statLabels = {
118
+ const statLabels = {
163
119
  atk: "ATK",
164
120
  def: "DEF",
165
121
  pdef: "PDEF",
@@ -171,11 +127,11 @@ function component($$props) {
171
127
  maxHp: "MAX HP",
172
128
  maxSp: "MAX SP"
173
129
  };
174
- var getItemStats = function(item) {
130
+ const getItemStats = (item) => {
175
131
  if (!item) return {};
176
- var stats = item.stats || item.params || {};
132
+ const stats = item.stats || item.params || {};
177
133
  if (Object.keys(stats).length) return stats;
178
- var keys = [
134
+ const keys = [
179
135
  "atk",
180
136
  "def",
181
137
  "pdef",
@@ -187,29 +143,24 @@ function component($$props) {
187
143
  "maxHp",
188
144
  "maxSp"
189
145
  ];
190
- var direct = {};
191
- keys.forEach(function(key) {
146
+ const direct = {};
147
+ keys.forEach((key) => {
192
148
  if (item[key] !== void 0) direct[key] = item[key];
193
149
  });
194
150
  return direct;
195
151
  };
196
- var buildStatsList = function(deltaStats) {
197
- var params = playerParams() || {};
198
- var orderedKeys = statOrder.filter(function(key) {
199
- return deltaStats[key] !== void 0;
200
- });
201
- var extraKeys = Object.keys(deltaStats).filter(function(key) {
202
- return !statOrder.includes(key);
203
- });
204
- var keys = orderedKeys.concat(extraKeys);
205
- var list = [];
206
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
207
- var key = keys_1[_i];
208
- var delta = deltaStats[key];
152
+ const buildStatsList = (deltaStats) => {
153
+ const params = playerParams() || {};
154
+ const orderedKeys = statOrder.filter((key) => deltaStats[key] !== void 0);
155
+ const extraKeys = Object.keys(deltaStats).filter((key) => !statOrder.includes(key));
156
+ const keys = orderedKeys.concat(extraKeys);
157
+ const list = [];
158
+ for (const key of keys) {
159
+ const delta = deltaStats[key];
209
160
  if (delta === void 0 || delta === 0) continue;
210
- var current = params[key];
161
+ let current = params[key];
211
162
  if (current === void 0 && key === "def") current = params.pdef;
212
- var next = current !== void 0 ? current + delta : void 0;
163
+ const next = current !== void 0 ? current + delta : void 0;
213
164
  list.push({
214
165
  key,
215
166
  label: statLabels[key] || key.toUpperCase(),
@@ -220,50 +171,50 @@ function component($$props) {
220
171
  }
221
172
  return list;
222
173
  };
223
- var displayStats = computed(function() {
224
- var entry = currentEntry();
225
- var equipped = currentEquippedItem();
174
+ const displayStats = computed(() => {
175
+ const entry = currentEntry();
176
+ const equipped = currentEquippedItem();
226
177
  if (!entry) return [];
227
178
  if (entry.kind === "unequip") {
228
179
  if (!equipped) return [];
229
- var stats_1 = getItemStats(equipped);
230
- var delta_1 = {};
231
- Object.keys(stats_1).forEach(function(key) {
232
- delta_1[key] = -stats_1[key];
180
+ const stats = getItemStats(equipped);
181
+ const delta = {};
182
+ Object.keys(stats).forEach((key) => {
183
+ delta[key] = -stats[key];
233
184
  });
234
- return buildStatsList(delta_1);
185
+ return buildStatsList(delta);
235
186
  }
236
187
  if (entry.kind === "item") {
237
- var equippedStats_1 = getItemStats(equipped);
238
- var nextStats_1 = getItemStats(entry);
239
- var delta_2 = {};
240
- new Set(__spreadArray(__spreadArray([], Object.keys(nextStats_1), true), Object.keys(equippedStats_1), true)).forEach(function(key) {
241
- delta_2[key] = (nextStats_1[key] || 0) - (equippedStats_1[key] || 0);
188
+ const equippedStats = getItemStats(equipped);
189
+ const nextStats = getItemStats(entry);
190
+ const delta = {};
191
+ new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)]).forEach((key) => {
192
+ delta[key] = (nextStats[key] || 0) - (equippedStats[key] || 0);
242
193
  });
243
- return buildStatsList(delta_2);
194
+ return buildStatsList(delta);
244
195
  }
245
196
  return [];
246
197
  });
247
- var applyEquipState = function(slot, itemId, equip) {
248
- var types = slotTypes(slot);
249
- var next = __assign({}, equippedOverrides());
250
- if (types.length) safeEquips().forEach(function(item) {
198
+ const applyEquipState = (slot, itemId, equip) => {
199
+ const types = slotTypes(slot);
200
+ const next = { ...equippedOverrides() };
201
+ if (types.length) safeEquips().forEach((item) => {
251
202
  if (!item) return;
252
203
  if (types.includes(item.type)) next[item.id] = false;
253
204
  });
254
205
  if (itemId) next[itemId] = equip;
255
206
  equippedOverrides.set(next);
256
207
  };
257
- var commitSelection = function(index) {
258
- var entry = listEntries()[index];
208
+ const commitSelection = (index) => {
209
+ const entry = listEntries()[index];
259
210
  if (!entry) return;
260
211
  if (entry.kind === "unequip") {
261
- var equipped = currentEquippedItem();
212
+ const equipped = currentEquippedItem();
262
213
  if (equipped && onInteraction) onInteraction("equipItem", {
263
214
  id: equipped.id,
264
215
  equip: false
265
216
  });
266
- applyEquipState(currentSlot(), equipped === null || equipped === void 0 ? void 0 : equipped.id, false);
217
+ applyEquipState(currentSlot(), equipped?.id, false);
267
218
  return;
268
219
  }
269
220
  if (entry.kind === "item" && onInteraction) {
@@ -286,15 +237,13 @@ function component($$props) {
286
237
  commitSelection(index);
287
238
  };
288
239
  }
289
- var iconSheet = function(iconId) {
290
- return { definition: engine.getSpriteSheet(iconId) };
291
- };
292
- var controls = signal({
240
+ const iconSheet = (iconId) => ({ definition: engine.getSpriteSheet(iconId) });
241
+ const controls = signal({
293
242
  up: {
294
243
  repeat: true,
295
244
  bind: keyboardControls.up,
296
245
  throttle: 150,
297
- keyDown: function() {
246
+ keyDown() {
298
247
  if (!listEntries().length) return;
299
248
  nav.next(-1);
300
249
  }
@@ -303,12 +252,10 @@ function component($$props) {
303
252
  repeat: true,
304
253
  bind: keyboardControls.left,
305
254
  throttle: 150,
306
- keyDown: function() {
307
- var tabs = slotList();
255
+ keyDown() {
256
+ const tabs = slotList();
308
257
  if (!tabs.length) return;
309
- selectedTab.update(function(value) {
310
- return (value - 1 + tabs.length) % tabs.length;
311
- });
258
+ selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);
312
259
  selectedItem.set(0);
313
260
  }
314
261
  },
@@ -316,12 +263,10 @@ function component($$props) {
316
263
  repeat: true,
317
264
  bind: keyboardControls.right,
318
265
  throttle: 150,
319
- keyDown: function() {
320
- var tabs = slotList();
266
+ keyDown() {
267
+ const tabs = slotList();
321
268
  if (!tabs.length) return;
322
- selectedTab.update(function(value) {
323
- return (value + 1) % tabs.length;
324
- });
269
+ selectedTab.update((value) => (value + 1) % tabs.length);
325
270
  selectedItem.set(0);
326
271
  }
327
272
  },
@@ -329,28 +274,28 @@ function component($$props) {
329
274
  repeat: true,
330
275
  bind: keyboardControls.down,
331
276
  throttle: 150,
332
- keyDown: function() {
277
+ keyDown() {
333
278
  if (!listEntries().length) return;
334
279
  nav.next(1);
335
280
  }
336
281
  },
337
282
  action: {
338
283
  bind: keyboardControls.action,
339
- keyDown: function() {
284
+ keyDown() {
340
285
  if (!listEntries().length) return;
341
286
  commitSelection(selectedItem());
342
287
  }
343
288
  },
344
289
  escape: {
345
290
  bind: keyboardControls.escape,
346
- keyDown: function() {
291
+ keyDown() {
347
292
  if (onBack) onBack();
348
293
  }
349
294
  },
350
295
  gamepad: { enabled: true }
351
296
  });
352
- effect(function() {
353
- var count = listEntries().length;
297
+ effect(() => {
298
+ const count = listEntries().length;
354
299
  if (!count) {
355
300
  selectedItem.set(0);
356
301
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"equip-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/equip-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">Equip</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(detailsItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">\n {detailsItem()?.name || currentSlot()?.label || \"Equip\"}\n </div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {detailsItem()?.description || \"\"}\n </div>\n @if (displayStats().length > 0) {\n <div class=\"rpg-ui-equip-stats\">\n @for ((stat,index) of displayStats) {\n <div class=\"rpg-ui-equip-stat\" class={{positive: stat.delta > 0, negative: stat.delta < 0}}>\n <div class=\"rpg-ui-equip-stat-key\">{stat.label}</div>\n <div class=\"rpg-ui-equip-stat-value\">\n {stat.delta > 0 ? \"+\" : \"\"}{stat.delta}\n </div>\n @if (stat.current) {\n <div class=\"rpg-ui-equip-stat-current\">{stat.current} -> {stat.next}</div>\n }\n </div>\n }\n </div>\n }\n <div class=\"rpg-ui-menu-panel-details-meta\">\n <span>{equippedText()}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of slotList) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((entry,index) of listEntries) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n @if (entry?.icon) {\n <DOMSprite \n sheet={iconSheet(entry.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n }\n </div>\n <span>{entry.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">{entry.tag || \"\"}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const currentPlayer = engine.scene.currentPlayer;\n\n const selectedTab = signal(0);\n const selectedItem = signal(0);\n const { data, onInteraction, onBack } = defineProps();\n\n const equips = computed(() => data().equips ?? data().items);\n const slots = computed(() => data().slots);\n\n const defaultSlots = [\n { id: \"weapon\", label: \"Weapon\", types: [\"weapon\"] },\n { id: \"armor\", label: \"Armor\", types: [\"armor\"] }\n ];\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeEquips = computed(() => {\n const list = resolveProp(equips);\n return Array.isArray(list) ? list : [];\n });\n const slotList = computed(() => {\n const list = resolveProp(slots);\n if (Array.isArray(list) && list.length) return list;\n return defaultSlots;\n });\n\n const currentSlot = computed(() => slotList()[selectedTab()]);\n\n const equippedIds = computed(() => {\n const equipped = currentPlayer().equipments?.() || [];\n return new Set(equipped.map((it) => it?.id?.() ?? it?.id ?? it?.name));\n });\n const equippedOverrides = signal({});\n\n effect(() => {\n const next = {};\n safeEquips().forEach((item) => {\n if (item?.id && typeof item.equipped === \"boolean\") {\n next[item.id] = item.equipped;\n }\n });\n equippedOverrides.set(next);\n });\n\n const itemEquipped = (item) => {\n if (!item) return false;\n const overrides = equippedOverrides();\n if (Object.prototype.hasOwnProperty.call(overrides, item.id)) {\n return overrides[item.id];\n }\n if (typeof item.equipped === \"boolean\") return item.equipped;\n return equippedIds().has(item.id);\n };\n\n const slotTypes = (slot) => {\n if (!slot) return [];\n if (Array.isArray(slot.types)) return slot.types;\n if (slot.type) return [slot.type];\n if (slot.id) return [slot.id];\n return [];\n };\n\n const slotItems = computed(() => {\n const slot = currentSlot();\n if (!slot) return [];\n const types = new Set(slotTypes(slot));\n return safeEquips().filter((item) => item && types.has(item.type));\n });\n\n const currentEquippedItem = computed(() => {\n const list = slotItems();\n return list.find((item) => itemEquipped(item)) || null;\n });\n\n const listEntries = computed(() => {\n const items = slotItems().map((item) => ({\n ...item,\n kind: \"item\",\n tag: itemEquipped(item) ? \"Equipped\" : \"\"\n }));\n const equipped = currentEquippedItem();\n if (!equipped) return items;\n return [\n {\n id: \"__unequip__\",\n name: \"Unequip\",\n description: \"Remove the current equipment\",\n kind: \"unequip\",\n tag: \"\"\n },\n ...items\n ];\n });\n\n const currentEntry = computed(() => listEntries()[selectedItem()]);\n const detailsItem = computed(() => {\n const entry = currentEntry();\n if (entry?.kind === \"item\") return entry;\n return currentEquippedItem();\n });\n\n const equippedText = computed(() => {\n const slot = currentSlot();\n if (!slot) return \"\";\n const equipped = currentEquippedItem();\n return equipped ? `${slot.label}: ${equipped.name}` : `${slot.label}: Empty`;\n });\n const listEmpty = computed(() => listEntries().length === 0);\n\n const nav = createTabindexNavigator(selectedItem, { count: () => listEntries().length }, \"wrap\");\n\n const playerParams = computed(() => {\n const menuData = data();\n if (menuData?.playerStats) return menuData.playerStats;\n if (menuData?.playerParams) return menuData.playerParams;\n return currentPlayer()?._param?.() || {};\n });\n const statOrder = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const statLabels = {\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\n const getItemStats = (item) => {\n if (!item) return {};\n const stats = item.stats || item.params || {};\n if (Object.keys(stats).length) return stats;\n const keys = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const direct = {};\n keys.forEach((key) => {\n if (item[key] !== undefined) direct[key] = item[key];\n });\n return direct;\n };\n\n const buildStatsList = (deltaStats) => {\n const params = playerParams() || {};\n const orderedKeys = statOrder.filter((key) => deltaStats[key] !== undefined);\n const extraKeys = Object.keys(deltaStats).filter((key) => !statOrder.includes(key));\n const keys = orderedKeys.concat(extraKeys);\n const list = [];\n for (const key of keys) {\n const delta = deltaStats[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: statLabels[key] || key.toUpperCase(),\n delta,\n current,\n next\n });\n }\n return list;\n };\n\n const displayStats = computed(() => {\n const entry = currentEntry();\n const equipped = currentEquippedItem();\n if (!entry) return [];\n if (entry.kind === \"unequip\") {\n \n if (!equipped) return [];\n const stats = getItemStats(equipped);\n const delta = {};\n Object.keys(stats).forEach((key) => {\n delta[key] = -stats[key];\n });\n return buildStatsList(delta);\n }\n if (entry.kind === \"item\") {\n const equippedStats = getItemStats(equipped);\n const nextStats = getItemStats(entry);\n const delta = {};\n const keys = new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)]);\n keys.forEach((key) => {\n delta[key] = (nextStats[key] || 0) - (equippedStats[key] || 0);\n });\n return buildStatsList(delta);\n }\n return [];\n });\n\n const applyEquipState = (slot, itemId, equip) => {\n const types = slotTypes(slot);\n const next = { ...equippedOverrides() };\n if (types.length) {\n safeEquips().forEach((item) => {\n if (!item) return;\n if (types.includes(item.type)) {\n next[item.id] = false;\n }\n });\n }\n if (itemId) {\n next[itemId] = equip;\n }\n equippedOverrides.set(next);\n };\n\n const commitSelection = (index) => {\n const entry = listEntries()[index];\n if (!entry) return;\n if (entry.kind === \"unequip\") {\n const equipped = currentEquippedItem();\n if (equipped && onInteraction) {\n onInteraction(\"equipItem\", { id: equipped.id, equip: false });\n }\n applyEquipState(currentSlot(), equipped?.id, false);\n return;\n }\n if (entry.kind === \"item\" && onInteraction) {\n if (!itemEquipped(entry)) {\n onInteraction(\"equipItem\", { id: entry.id, equip: true });\n }\n applyEquipState(currentSlot(), entry.id, true);\n }\n };\n\n function selectTab(index) {\n return function() {\n selectedTab.set(index);\n selectedItem.set(0);\n }\n }\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n commitSelection(index);\n }\n }\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (!listEntries().length) return;\n commitSelection(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n effect(() => {\n const count = listEntries().length;\n if (!count) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"equip-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/equip-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">Equip</div>\n <div class=\"rpg-ui-menu-panel-body rpg-ui-menu-panel-body-stacked\">\n <div>\n <div class=\"rpg-ui-menu-panel-details rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-hero\">\n <div class=\"rpg-ui-menu-panel-hero-icon\">\n <DOMSprite \n sheet={iconSheet(detailsItem()?.icon)} \n playing=\"default\" \n width=\"48px\"\n height=\"48px\"\n objectFit=\"contain\"\n />\n </div>\n <div>\n <div class=\"rpg-ui-menu-panel-details-title\">\n {detailsItem()?.name || currentSlot()?.label || \"Equip\"}\n </div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n {detailsItem()?.description || \"\"}\n </div>\n @if (displayStats().length > 0) {\n <div class=\"rpg-ui-equip-stats\">\n @for ((stat,index) of displayStats) {\n <div class=\"rpg-ui-equip-stat\" class={{positive: stat.delta > 0, negative: stat.delta < 0}}>\n <div class=\"rpg-ui-equip-stat-key\">{stat.label}</div>\n <div class=\"rpg-ui-equip-stat-value\">\n {stat.delta > 0 ? \"+\" : \"\"}{stat.delta}\n </div>\n @if (stat.current) {\n <div class=\"rpg-ui-equip-stat-current\">{stat.current} -> {stat.next}</div>\n }\n </div>\n }\n </div>\n }\n <div class=\"rpg-ui-menu-panel-details-meta\">\n <span>{equippedText()}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"rpg-ui-menu-panel-list rpg-ui-menu rpg-ui-menu-panel-list-full\">\n <div class=\"rpg-ui-menu-tabs\">\n @for ((tab,tabIndex) of slotList) {\n <div\n class=\"rpg-ui-menu-tab\"\n class={{active: selectedTab() === tabIndex}}\n tabindex={tabIndex}\n click={selectTab(tabIndex)}\n >{tab.label}</div>\n }\n </div>\n <Navigation tabindex={selectedItem} controls={controls}>\n @for ((entry,index) of listEntries) {\n <div\n class=\"rpg-ui-menu-item rpg-ui-menu-row\"\n data-selected={selectedItem() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectItem(index)}\n >\n <div class=\"rpg-ui-menu-row-main\">\n <div class=\"rpg-ui-menu-row-icon\">\n @if (entry?.icon) {\n <DOMSprite \n sheet={iconSheet(entry.icon)} \n playing=\"default\" \n width=\"28px\"\n height=\"28px\"\n objectFit=\"contain\"\n />\n }\n </div>\n <span>{entry.name}</span>\n </div>\n <span class=\"rpg-ui-menu-row-end\">{entry.tag || \"\"}</span>\n </div>\n }\n </Navigation>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, createTabindexNavigator, effect } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const currentPlayer = engine.scene.currentPlayer;\n\n const selectedTab = signal(0);\n const selectedItem = signal(0);\n const { data, onInteraction, onBack } = defineProps();\n\n const equips = computed(() => data().equips ?? data().items);\n const slots = computed(() => data().slots);\n\n const defaultSlots = [\n { id: \"weapon\", label: \"Weapon\", types: [\"weapon\"] },\n { id: \"armor\", label: \"Armor\", types: [\"armor\"] }\n ];\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const safeEquips = computed(() => {\n const list = resolveProp(equips);\n return Array.isArray(list) ? list : [];\n });\n const slotList = computed(() => {\n const list = resolveProp(slots);\n if (Array.isArray(list) && list.length) return list;\n return defaultSlots;\n });\n\n const currentSlot = computed(() => slotList()[selectedTab()]);\n\n const equippedIds = computed(() => {\n const equipped = currentPlayer().equipments?.() || [];\n return new Set(equipped.map((it) => it?.id?.() ?? it?.id ?? it?.name));\n });\n const equippedOverrides = signal({});\n\n effect(() => {\n const next = {};\n safeEquips().forEach((item) => {\n if (item?.id && typeof item.equipped === \"boolean\") {\n next[item.id] = item.equipped;\n }\n });\n equippedOverrides.set(next);\n });\n\n const itemEquipped = (item) => {\n if (!item) return false;\n const overrides = equippedOverrides();\n if (Object.prototype.hasOwnProperty.call(overrides, item.id)) {\n return overrides[item.id];\n }\n if (typeof item.equipped === \"boolean\") return item.equipped;\n return equippedIds().has(item.id);\n };\n\n const slotTypes = (slot) => {\n if (!slot) return [];\n if (Array.isArray(slot.types)) return slot.types;\n if (slot.type) return [slot.type];\n if (slot.id) return [slot.id];\n return [];\n };\n\n const slotItems = computed(() => {\n const slot = currentSlot();\n if (!slot) return [];\n const types = new Set(slotTypes(slot));\n return safeEquips().filter((item) => item && types.has(item.type));\n });\n\n const currentEquippedItem = computed(() => {\n const list = slotItems();\n return list.find((item) => itemEquipped(item)) || null;\n });\n\n const listEntries = computed(() => {\n const items = slotItems().map((item) => ({\n ...item,\n kind: \"item\",\n tag: itemEquipped(item) ? \"Equipped\" : \"\"\n }));\n const equipped = currentEquippedItem();\n if (!equipped) return items;\n return [\n {\n id: \"__unequip__\",\n name: \"Unequip\",\n description: \"Remove the current equipment\",\n kind: \"unequip\",\n tag: \"\"\n },\n ...items\n ];\n });\n\n const currentEntry = computed(() => listEntries()[selectedItem()]);\n const detailsItem = computed(() => {\n const entry = currentEntry();\n if (entry?.kind === \"item\") return entry;\n return currentEquippedItem();\n });\n\n const equippedText = computed(() => {\n const slot = currentSlot();\n if (!slot) return \"\";\n const equipped = currentEquippedItem();\n return equipped ? `${slot.label}: ${equipped.name}` : `${slot.label}: Empty`;\n });\n const listEmpty = computed(() => listEntries().length === 0);\n\n const nav = createTabindexNavigator(selectedItem, { count: () => listEntries().length }, \"wrap\");\n\n const playerParams = computed(() => {\n const menuData = data();\n if (menuData?.playerStats) return menuData.playerStats;\n if (menuData?.playerParams) return menuData.playerParams;\n return currentPlayer()?._param?.() || {};\n });\n const statOrder = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const statLabels = {\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\n const getItemStats = (item) => {\n if (!item) return {};\n const stats = item.stats || item.params || {};\n if (Object.keys(stats).length) return stats;\n const keys = [\"atk\", \"def\", \"pdef\", \"sdef\", \"str\", \"dex\", \"int\", \"agi\", \"maxHp\", \"maxSp\"];\n const direct = {};\n keys.forEach((key) => {\n if (item[key] !== undefined) direct[key] = item[key];\n });\n return direct;\n };\n\n const buildStatsList = (deltaStats) => {\n const params = playerParams() || {};\n const orderedKeys = statOrder.filter((key) => deltaStats[key] !== undefined);\n const extraKeys = Object.keys(deltaStats).filter((key) => !statOrder.includes(key));\n const keys = orderedKeys.concat(extraKeys);\n const list = [];\n for (const key of keys) {\n const delta = deltaStats[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: statLabels[key] || key.toUpperCase(),\n delta,\n current,\n next\n });\n }\n return list;\n };\n\n const displayStats = computed(() => {\n const entry = currentEntry();\n const equipped = currentEquippedItem();\n if (!entry) return [];\n if (entry.kind === \"unequip\") {\n \n if (!equipped) return [];\n const stats = getItemStats(equipped);\n const delta = {};\n Object.keys(stats).forEach((key) => {\n delta[key] = -stats[key];\n });\n return buildStatsList(delta);\n }\n if (entry.kind === \"item\") {\n const equippedStats = getItemStats(equipped);\n const nextStats = getItemStats(entry);\n const delta = {};\n const keys = new Set([...Object.keys(nextStats), ...Object.keys(equippedStats)]);\n keys.forEach((key) => {\n delta[key] = (nextStats[key] || 0) - (equippedStats[key] || 0);\n });\n return buildStatsList(delta);\n }\n return [];\n });\n\n const applyEquipState = (slot, itemId, equip) => {\n const types = slotTypes(slot);\n const next = { ...equippedOverrides() };\n if (types.length) {\n safeEquips().forEach((item) => {\n if (!item) return;\n if (types.includes(item.type)) {\n next[item.id] = false;\n }\n });\n }\n if (itemId) {\n next[itemId] = equip;\n }\n equippedOverrides.set(next);\n };\n\n const commitSelection = (index) => {\n const entry = listEntries()[index];\n if (!entry) return;\n if (entry.kind === \"unequip\") {\n const equipped = currentEquippedItem();\n if (equipped && onInteraction) {\n onInteraction(\"equipItem\", { id: equipped.id, equip: false });\n }\n applyEquipState(currentSlot(), equipped?.id, false);\n return;\n }\n if (entry.kind === \"item\" && onInteraction) {\n if (!itemEquipped(entry)) {\n onInteraction(\"equipItem\", { id: entry.id, equip: true });\n }\n applyEquipState(currentSlot(), entry.id, true);\n }\n };\n\n function selectTab(index) {\n return function() {\n selectedTab.set(index);\n selectedItem.set(0);\n }\n }\n\n function selectItem(index) {\n return function() {\n selectedItem.set(index);\n commitSelection(index);\n }\n }\n\n const iconSheet = (iconId) => ({\n definition: engine.getSpriteSheet(iconId)\n });\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(-1);\n }\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value - 1 + tabs.length) % tabs.length);\n selectedItem.set(0);\n }\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n throttle: 150,\n keyDown() {\n const tabs = slotList();\n if (!tabs.length) return;\n selectedTab.update((value) => (value + 1) % tabs.length);\n selectedItem.set(0);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!listEntries().length) return;\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (!listEntries().length) return;\n commitSelection(selectedItem());\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n\n effect(() => {\n const count = listEntries().length;\n if (!count) {\n selectedItem.set(0);\n return;\n }\n if (selectedItem() >= count) {\n selectedItem.set(count - 1);\n }\n });\n</script>\n"],"mappings":"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"}
@@ -5,21 +5,21 @@ import { DOMContainer, DOMElement, h, signal, useDefineProps, useProps } from "c
5
5
  function component($$props) {
6
6
  useProps($$props);
7
7
  const defineProps = useDefineProps($$props);
8
- var keyboardControls = inject(RpgClientEngine).globalConfig.keyboardControls;
9
- var _a = defineProps(), onConfirm = _a.onConfirm, onBack = _a.onBack;
8
+ const keyboardControls = inject(RpgClientEngine).globalConfig.keyboardControls;
9
+ const { onConfirm, onBack } = defineProps();
10
10
  return h(DOMContainer, {
11
11
  width: "100%",
12
12
  height: "100%",
13
13
  controls: signal({
14
14
  action: {
15
15
  bind: keyboardControls.action,
16
- keyDown: function() {
16
+ keyDown() {
17
17
  if (onConfirm) onConfirm();
18
18
  }
19
19
  },
20
20
  escape: {
21
21
  bind: keyboardControls.escape,
22
- keyDown: function() {
22
+ keyDown() {
23
23
  if (onBack) onBack();
24
24
  }
25
25
  },
@@ -1 +1 @@
1
- {"version":3,"file":"exit-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/exit-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={controls}>\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">Exit</div>\n <div class=\"rpg-ui-menu-panel-body\">\n <div class=\"rpg-ui-menu-panel-details\">\n <div class=\"rpg-ui-menu-panel-details-title\">Leave the game?</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n Press Action to confirm or Escape to go back.\n </div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onConfirm, onBack } = defineProps();\n\n const controls = signal({\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (onConfirm) onConfirm();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":";;;;AASM,SAAW,UAAA,SAAA;AACJ,UAAA,QAAA;CACP,MAAG,cAAA,eAAA,QAAA;wBACK,OAAA,gBAAA,CAAA,aAAA;CAEd,IAAC,KAAM,aAAA,EAAA,YAAA,GAAA,WAAA,SAAA,GAAA;AAqBC,QADI,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAnBC,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;AAErB,SAAM,UACN,YAAiB;;;GAGvB,QAAM;IACF,MAAM,iBAAE;IACR,SAAS,WAAC;AACN,SAAA,OACI,SAAI;;IAEf;GACD,SAAI,EACA,SAAS,MACZ;GACJ,CAAC;EACU,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"exit-menu.ce.js","names":[],"sources":["../../../../src/components/gui/menu/exit-menu.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={controls}>\n <div class=\"rpg-ui-menu-panel rpg-ui-panel\">\n <div class=\"rpg-ui-menu-panel-header\">Exit</div>\n <div class=\"rpg-ui-menu-panel-body\">\n <div class=\"rpg-ui-menu-panel-details\">\n <div class=\"rpg-ui-menu-panel-details-title\">Leave the game?</div>\n <div class=\"rpg-ui-menu-panel-details-desc\">\n Press Action to confirm or Escape to go back.\n </div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { signal } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n\n const engine = inject(RpgClientEngine);\n const keyboardControls = engine.globalConfig.keyboardControls;\n const { onConfirm, onBack } = defineProps();\n\n const controls = signal({\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (onConfirm) onConfirm();\n }\n },\n escape: {\n bind: keyboardControls.escape,\n keyDown() {\n if (onBack) onBack();\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":";;;;AASM,SAAW,UAAA,SAAA;AACJ,UAAA,QAAA;CACP,MAAG,cAAA,eAAA,QAAA;0BACK,OAAA,gBAAA,CAAA,aAAA;CAEd,MAAC,EAAM,WAAA,WAAA,aAAA;AAqBC,QADI,EAAA,cAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAnBC,OAAS;GAClB,QAAQ;IACR,MAAS,iBAAkB;;AAErB,SAAM,UACN,YAAiB;;;GAGvB,QAAM;IACF,MAAM,iBAAE;IACR,UAAU;AACN,SAAA,OACI,SAAI;;IAEf;GACD,SAAI,EACA,SAAS,MACZ;GACJ,CACW;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,4BAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,0BAAA;EAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,6BAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mCAAA;EAAA,aAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,kCAAA;EAAA,aAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACH"}