From 750973de382829bd9fe6592d741e2b4b24dd052b Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 3 Aug 2026 21:47:10 +0200 Subject: [PATCH] fix: correct badge item detection by checking classname prefix Badge item_names already start with 'badge_' (e.g. badge_citycpa3), so checking for badge__icon.png produces a double prefix (badge_badge_citycpa3_icon.png). Now uses item_name.startsWith('badge_') instead, which correctly identifies badge items without depending on icon files existing in the directory. --- src/lib/services/catalog-audit.ts | 6 ++---- src/lib/services/repair-icons.ts | 11 ++++------- src/lib/services/repair-nitros.ts | 4 ++++ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/lib/services/catalog-audit.ts b/src/lib/services/catalog-audit.ts index b0d99994..d2e4aad7 100644 --- a/src/lib/services/catalog-audit.ts +++ b/src/lib/services/catalog-audit.ts @@ -240,11 +240,9 @@ export async function runCatalogAudit( itemId: item.id, message: `"${item.item_name}" (ID ${item.id}) has no catalog_items entry — not purchasable`, }); - // Only include items that actually have a .nitro asset — a catalog - // entry for a furni without a bundle would be un-placeable in-game. // Badge items use .gif files, not .nitro bundles. if ( - !iconSet.has(`badge_${item.item_name}_icon.png`) && + !item.item_name.startsWith("badge_") && nitroSet.has(`${item.item_name}.nitro`) ) { missingCatalogEntries.push({ @@ -316,7 +314,7 @@ export async function runCatalogAudit( for (let i = 0; i < items.length; i++) { const item = items[i]; // Badge items use .gif files, not .nitro bundles. - if (iconSet.has(`badge_${item.item_name}_icon.png`)) continue; + if (item.item_name.startsWith("badge_")) continue; if (!nitroSet.has(`${item.item_name}.nitro`)) { missingNitroClassnames.push(item.item_name); issues.push({ diff --git a/src/lib/services/repair-icons.ts b/src/lib/services/repair-icons.ts index f62ae456..c43f1552 100644 --- a/src/lib/services/repair-icons.ts +++ b/src/lib/services/repair-icons.ts @@ -159,13 +159,11 @@ export async function repairMissingIcons( const processItem = async (classname: string) => { const fileName = `${classname}_icon.png`; - const badgeFileName = `badge_${classname}_icon.png`; - // Badge items store icons as badge__icon.png, not _icon.png. - const presentDirs = iconDirs.filter( - (dir) => - existsSync(path.join(dir, fileName)) || - existsSync(path.join(dir, badgeFileName)), + // Badge items store icons as badge__icon.png (the classname already + // includes the `badge_` prefix, so fileName matches correctly). + const presentDirs = iconDirs.filter((dir) => + existsSync(path.join(dir, fileName)), ); const missingDirs = iconDirs.filter((dir) => !presentDirs.includes(dir)); @@ -239,7 +237,6 @@ export async function repairMissingIcons( for (const source of sources) { const iconCandidates = [ `${classname}_icon.png`, - `badge_${classname}_icon.png`, // Variant classnames (e.g. `table_silo_med*10`) often only exist // on sources under their base name (e.g. `table_silo_med_icon.png`) // or with the `*` replaced by `_` (e.g. `table_silo_med_10_icon.png`). diff --git a/src/lib/services/repair-nitros.ts b/src/lib/services/repair-nitros.ts index 8717402d..556dbfdf 100644 --- a/src/lib/services/repair-nitros.ts +++ b/src/lib/services/repair-nitros.ts @@ -154,6 +154,10 @@ export async function repairMissingNitros( onEvent?.({ type: "started", total }); const processItem = async (classname: string) => { + // Badge items use .gif files, not .nitro bundles. + if (classname.startsWith("badge_")) { + return { status: "skipped" } as const; + } const fileName = `${classname}.nitro`; const presentDirs = nitroDirs.filter((dir) =>