Skip to content

Commit 9c1d799

Browse files
committed
fix(items): equipe same item for different slot
1 parent 248bd03 commit 9c1d799

2 files changed

Lines changed: 27 additions & 12 deletions

File tree

worldboss-app/src/services/inventory.service.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ async function equipItem(characterId, itemId) {
4242

4343
const loadout = await getOrCreateLoadout(characterId);
4444

45+
// Verify enough unequipped copies are available
46+
const equippedList = [
47+
loadout.weaponId, loadout.armorId, loadout.helmetId,
48+
loadout.bootsId, loadout.accessory1Id, loadout.accessory2Id,
49+
];
50+
const equippedCount = equippedList.filter((id) => id === itemId).length;
51+
if (charItem.quantity - equippedCount < 1) {
52+
return { success: false, message: `Toutes vos copies de **${itemDef.name}** sont déjà équipées.` };
53+
}
54+
4555
let slotField = typeToSlot(itemDef.type);
4656

4757
if (!slotField) {

worldboss-app/src/utils/embed.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -405,21 +405,25 @@ function buildInventoryMessage(user, userItems, loadout, ap = null) {
405405
const TYPE_ICON = { weapon: '⚔️', armor: '🧥', helmet: '🪖', boots: '👢', accessory: '💍', consumable: '🧪' };
406406
const TYPE_LABEL = { weapon: 'Armes', armor: 'Armures', helmet: 'Casques', boots: 'Bottes', accessory: 'Accessoires', consumable: 'Consommables' };
407407

408-
const equippedIds = new Set(
409-
[loadout?.weaponId, loadout?.armorId, loadout?.helmetId, loadout?.bootsId, loadout?.accessory1Id, loadout?.accessory2Id].filter(Boolean),
410-
);
408+
const equippedList = [
409+
loadout?.weaponId, loadout?.armorId, loadout?.helmetId,
410+
loadout?.bootsId, loadout?.accessory1Id, loadout?.accessory2Id,
411+
].filter(Boolean);
411412

412413
const groups = {};
413414
for (const ui of userItems) {
414415
const item = ITEMS[ui.itemId];
415416
if (!item) continue;
416417
if (!groups[item.type]) groups[item.type] = [];
417-
const rarity = RARITY_EMOJI[item.rarity] ?? '⚪';
418-
const qty = ui.quantity > 1 ? ` ×${ui.quantity}` : '';
419-
const statsStr = item.stats
418+
const rarity = RARITY_EMOJI[item.rarity] ?? '⚪';
419+
const qty = ui.quantity > 1 ? ` ×${ui.quantity}` : '';
420+
const statsStr = item.stats
420421
? Object.entries(item.stats).map(([k, v]) => `\`${v > 0 ? '+' : ''}${v} ${k.toUpperCase()}\``).join(' ')
421422
: '';
422-
const equipped = equippedIds.has(ui.itemId) ? ' · ✅ **équipé**' : '';
423+
const equippedCount = equippedList.filter((id) => id === ui.itemId).length;
424+
const equipped = equippedCount > 0
425+
? ` · ✅ **équipé${equippedCount > 1 ? ` ×${equippedCount}` : ''}**`
426+
: '';
423427
groups[item.type].push(
424428
`> ${rarity} **${item.name}**${qty}${statsStr ? ` · ${statsStr}` : ''}${equipped}`,
425429
);
@@ -473,7 +477,9 @@ function buildInventoryMessage(user, userItems, loadout, ap = null) {
473477
// ── Select menu équiper ────────────────────────────────────────────────────
474478
const equipable = userItems.filter((ui) => {
475479
const item = ITEMS[ui.itemId];
476-
return item && item.type !== 'consumable';
480+
if (!item || item.type === 'consumable') return false;
481+
const ec = equippedList.filter((id) => id === ui.itemId).length;
482+
return ui.quantity - ec >= 1;
477483
});
478484

479485
const rows = [];
@@ -482,14 +488,13 @@ function buildInventoryMessage(user, userItems, loadout, ap = null) {
482488
const { StringSelectMenuBuilder } = require('discord.js');
483489

484490
const equipOptions = equipable.map((ui) => {
485-
const item = ITEMS[ui.itemId];
486-
const rarity = RARITY_EMOJI[item.rarity] ?? '⚪';
491+
const item = ITEMS[ui.itemId];
492+
const rarity = RARITY_EMOJI[item.rarity] ?? '⚪';
487493
const statsStr = item.stats
488494
? Object.entries(item.stats).map(([k, v]) => `${v > 0 ? '+' : ''}${v} ${k.toUpperCase()}`).join(', ')
489495
: '';
490-
const tag = equippedIds.has(ui.itemId) ? ' ✅' : '';
491496
return {
492-
label: `${rarity} ${item.name}${tag}`.slice(0, 100),
497+
label: `${rarity} ${item.name}`.slice(0, 100),
493498
description: `${TYPE_LABEL[item.type] ?? item.type} · ${RARITY_LABEL[item.rarity] ?? item.rarity}${statsStr ? ` · ${statsStr}` : ''}`.slice(0, 100),
494499
value: `equip:${ui.itemId}`,
495500
};

0 commit comments

Comments
 (0)