From a0574c987c7cd5c9d1c3d7b8692c821bc901ef29 Mon Sep 17 00:00:00 2001 From: gunshiz Date: Thu, 17 Sep 2026 17:53:26 +0700 Subject: [PATCH] fix : use correct icon for % stats --- components/public/material-poster.tsx | 1 + drizzle/meta/_journal.json | 9 ++++++++- lib/guides/schemas.test.ts | 11 +++++++---- lib/guides/stats.ts | 1 + public/icon/stats/atk-percent.webp | Bin 0 -> 516 bytes public/icon/stats/def-percent.webp | Bin 0 -> 500 bytes public/icon/stats/hp-percent.webp | Bin 0 -> 700 bytes 7 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 public/icon/stats/atk-percent.webp create mode 100644 public/icon/stats/def-percent.webp create mode 100644 public/icon/stats/hp-percent.webp diff --git a/components/public/material-poster.tsx b/components/public/material-poster.tsx index 4eed65c..6ee30e3 100644 --- a/components/public/material-poster.tsx +++ b/components/public/material-poster.tsx @@ -39,6 +39,7 @@ function statLabel(key: string): string { function statIconName(key: string): string | null { const normalized = key.toLowerCase().replace(/[^a-z]/gu, ""); + if (key.includes("%") && ["hp", "atk", "def"].includes(normalized)) return `${normalized}-percent`; if (["hp", "atk", "def", "em", "er"].includes(normalized)) return normalized; if (["critrate", "crit", "criticalrate"].includes(normalized)) return "critrate"; if (["critdmg", "critdamage", "criticaldamage"].includes(normalized)) return "critdmg"; diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 2b1add0..5d5da49 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -323,6 +323,13 @@ "when": 1789637567192, "tag": "0045_simple_argent", "breakpoints": true + }, + { + "idx": 46, + "version": "7", + "when": 1789641217244, + "tag": "0046_spicy_lucky_pierre", + "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/lib/guides/schemas.test.ts b/lib/guides/schemas.test.ts index 91b5ce5..c69c1f1 100644 --- a/lib/guides/schemas.test.ts +++ b/lib/guides/schemas.test.ts @@ -104,12 +104,15 @@ describe("structured guide validation", () => { expect(artifactSectionSchema.safeParse({ ...base, recommendedGroups: [{ ...first, note: "x".repeat(2_001) }] }).success).toBe(false); }); - it("accepts flat artifact substats with the same icons as their percentage variants", () => { + it("uses distinct icons for flat and percentage HP, ATK, and DEF stats", () => { const result = artifactSectionSchema.safeParse({ expectedVersion: 1, groups: artifactGroups, sands: [], goblet: [], circlet: [], substats: ["ATK", "HP", "DEF"], targetGroups: [], talents: [], note: null }); expect(result.success).toBe(true); - expect(targetStatIconName("ATK")).toBe(recommendedStatIconName("ATK%")); - expect(targetStatIconName("HP")).toBe(recommendedStatIconName("HP%")); - expect(targetStatIconName("DEF")).toBe(recommendedStatIconName("DEF%")); + expect(recommendedStatIconName("ATK%")).toBe("atk-percent"); + expect(recommendedStatIconName("HP%")).toBe("hp-percent"); + expect(recommendedStatIconName("DEF%")).toBe("def-percent"); + expect(targetStatIconName("ATK")).toBe("atk"); + expect(targetStatIconName("HP")).toBe("hp"); + expect(targetStatIconName("DEF")).toBe("def"); }); it("maps elemental damage recommendations to Lunaris element icons", () => { diff --git a/lib/guides/stats.ts b/lib/guides/stats.ts index fdd7d91..c141219 100644 --- a/lib/guides/stats.ts +++ b/lib/guides/stats.ts @@ -48,6 +48,7 @@ export function recommendedStatIconName(value: string): string | null { if (value.endsWith(" DMG%")) return "elemental-bonus"; const base = value.replace(/%$/, "").toLowerCase(); + if (value.endsWith("%") && ["hp", "atk", "def"].includes(base)) return `${base}-percent`; return ["hp", "atk", "def", "em", "er"].includes(base) ? base : null; } diff --git a/public/icon/stats/atk-percent.webp b/public/icon/stats/atk-percent.webp new file mode 100644 index 0000000000000000000000000000000000000000..854d9ac9c99aba84ee5868a64f2aba1898f99d92 GIT binary patch literal 516 zcmV+f0{i_^Nk&He0RRA3MM6+kP&il$0000G0000x0027x06|PpNT>k-00BoJ5J=%B z7ZDK#$hoa;t)l1pEpbxfP`Z>dmU4Wi#G!Qf%6OjNo$t-}zN2+S{~5S#+emFsx0lmT zz}PlloAv?bc1n`&7rFgAxihjbBdLt1WUeE(Z7h)U!bVck>y$=vHfs6$dR66!Ucx_N zX@!^Yz+)2a#)8LgWPiV-Uo&0jmrTwZ9g@jGnH-kEimbk_1&228cYw$BVt=w@@&h0zYc_PZ(ZB1=nCs$)3~da~{#^)6$ea$m%=QnIi9;}JF)q44=syw&3w z;FKd|?BR$U>GAZDu#YRrMM2@@@93xSJ0Q0PQ%9#&i{c{dIfpd0g|vK72OdJ z9(};6!AE42vUkL&LAOY+a6tVN$aJITPgJ)M`*Yo=D4P&R+lgZsJjLLVhe)XlLc5dE*d4>-d+W$$K!EimMjf9FxOj=kR^0} z@-fhA3DBARsJ%rOGUyBd%uSx_j%Z!sQgpMfT14JjvS&%F1psxQ9A_51wW7BH09rLf zWA8$%)^!xQtvXE|XBMsI5xUg(x@)v%y>EzP-PHFm%lamH$72G(zFN&wcRWG{!11tK z>x_HXvIS#G6mPXU(8sBfdV8;jc-L+Ufs5V(xfmVwy!0;x< zQ&p!H&>QFi^i4wDsoKE0PUssrH-Sro>Ke>7zbM4wr<_{f!1;m$pwk(=)e(F(tDU9Q zy%ltt!=973j?&mLOn)k0Apyi1bA{1N|uPuhTlQ}09H^qAT9s^0FVO!odGI5 q06YLbZ8n%mBqJiBA_xG04T)(001!7*Pz88}xc~tE`<%c40000H=G_Yb literal 0 HcmV?d00001 diff --git a/public/icon/stats/hp-percent.webp b/public/icon/stats/hp-percent.webp new file mode 100644 index 0000000000000000000000000000000000000000..b510b2bfd0c78dff6290152c3bfd0f316f75edd9 GIT binary patch literal 700 zcmV;t0z>^$Nk&Gr0ssJ4MM6+kP&il$0000G0000x0027x06|PpNJ9bu00C!UkZt7H zKf%}F7ZEXV_Nzci*0!~k^R)VcpaV-#GcLljkhhUJbA#)S0!_0}gTl<5{2`UAEXmKZ ze*Kn1PHS0|Wh$N=iKVP~_ibPfPZtv2g5k1h1pl>UtP z)Pru!CehGN$Zp)za;5_&rPLad9@ASSPp`>EqZiWJ4U3f) zX*W}g2^;QDEhcRqJv6-fK*CMENPQx855Gt1e5FSoTl>~d;vP%-Q;Ve{zVVW2)YQ$29B!OP$Boe)d@80(5@tMWEFprnhcJj!-+N3mJ3<06?$C zN)}eM?lVg?dhx4BL1V#J7POkDG?9J&G^ep-@G}77h~<10eaeMaDW8pgNAah5t2<+B z!()+(g%@be25&JwgPw>Sf%VmF_$=M5v>a3~!Z&KUOg61PvQ!Nj{Jegp)~h`GU>0jM zEL1H3XtexJFUB5I^L~^-XIOaaCvyPmL0>#jH3w!oZ_O880Dz^2o$pjb4z1>0fc34! z!dL4LM`JM11sFa9M(H`8_;~#pEcAS|>y7b_8qNT~Qg>njU_8PrCxBXSL7xmbP}Qr@ zXay^?+N-hAFD;?d9r()gja5SZp=!oVF9P*i!_HW|oI|Sxz|CJmLHZnf?P2KrjQ@oL z09H^qAW8rL0MG*fodGI506YLbZ8n%lq$47sBnSY24T)(003TpH26lmemyh$%0RH=& i!K-w>ZT