diff --git a/assets/lightcones/23065.png b/assets/lightcones/23065.png new file mode 100644 index 0000000..ee7d4e6 Binary files /dev/null and b/assets/lightcones/23065.png differ diff --git a/js/app.js b/js/app.js index a158392..eda0411 100644 --- a/js/app.js +++ b/js/app.js @@ -1423,6 +1423,7 @@ const SIGNATURE_LIGHTCONES = { 1404: 23037, // Anaxa -> If Time Were a Flower 1405: 23038, // Tribbie 1406: 23039, // Mydei + 1511: 23065, // Aeon ★ Aha -> Upon the First Echo of "Aha" 8001: 24001, // Trailblazer Male Destruction -> On the Fall of an Aeon 8002: 24001, // Trailblazer Female Destruction 8003: 24002, // Trailblazer Male Preservation -> Texture of Memories @@ -1442,9 +1443,27 @@ const RECOMMENDED_RELIC_BUILDS = { Hunt: { cavern: 120, planar: 309, name: "Valorous (4) + Rutilant Arena (2)" }, Destruction: { cavern: 119, planar: 315, name: "Iron Cavalry (4) + Kalpagni (2)" }, Erudition: { cavern: 115, planar: 306, name: "Grand Duke (4) + Inert Salsotto (2)" }, - Remembrance: { cavern: 114, planar: 310, name: "Messenger (4) + Broken Keel (2)" } + Remembrance: { cavern: 114, planar: 310, name: "Messenger (4) + Broken Keel (2)" }, + Elation: { cavern: 115, planar: 306, name: "Grand Duke (4) + Inert Salsotto (2)" } }; +// Lightcone Art URL Resolvers (Local asset -> Gachabase -> StarRailRes) +function getLightconeArtSrc(lcId) { + const id = parseInt(lcId, 10); + if (id === 23065) { + return './assets/lightcones/23065.png'; + } + return `https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/image/light_cone_preview/${id}.png`; +} + +function getLightconeArtFallback(lcId) { + const id = parseInt(lcId, 10); + if (id === 23065) { + return 'https://cdn.gachabase.net/hsr/assets/500cfc18698932759756f6b3ba4db417.png'; + } + return `https://cdn.jsdelivr.net/gh/Mar-7th/StarRailRes@master/image/light_cone_preview/${id}.png`; +} + // Modal Sub-tabs Handler function switchModalSubtab(targetId) { const tabBtns = document.querySelectorAll('.modal-subtab-btn'); @@ -1522,12 +1541,14 @@ function getLightconePassiveDesc(lcId, rank = 5) { 23032: `ทำให้ Energy Regeneration Rate ของผู้สวมใส่เพิ่มขึ้น ${12 + (r - 1) * 2}% เมื่อปล่อยสกิลต่อสู้หรือท่าไม้ตาย จะเพิ่ม CRIT DMG ของพันธมิตร ${48 + (r - 1) * 8}%`, 23034: `ทำให้ CRIT Rate ของผู้สวมใส่เพิ่มขึ้น ${12 + (r - 1) * 2}% เมื่อปล่อยท่าไม้ตาย จะสร้าง DMG น้ำแข็งเพิ่มเติม ${60 + (r - 1) * 10}% ของ ATK แก่ศัตรูทั้งหมด`, 23036: `ทำให้ HP สูงสุดของผู้สวมใส่เพิ่มขึ้น ${30 + (r - 1) * 5}% และเมื่ออยู่ในสนามรบ สมาชิกทีมทุกคนสร้าง DMG เพิ่มขึ้น ${24 + (r - 1) * 4}%`, + 23065: `ทำให้ความเร็วพื้นฐานของผู้สวมใส่เพิ่มขึ้น ${12 + (r - 1) * 3} เมื่อใช้สกิลการต่อสู้กับเพื่อนร่วมทีม 1 ตัว จะได้รับ "Punchline" 10 แต้ม (เกิดได้สูงสุด 1 ครั้งทุกๆ 1 เทิร์น) และทำให้เพื่อนร่วมทีมทั้งหมดเมิน DEF ศัตรู ${16 + (r - 1) * 4}% เมื่อสร้าง DMG ในการต่อสู้นี้ (ไม่ซ้อนทับ)`, 24001: `เมื่อผู้สวมใส่โจมตี จะเพิ่ม ATK ${8 + (r - 1) * 2}% สูงสุด 4 ชั้น และเมื่อทำลายจุดอ่อนศัตรู จะเพิ่ม DMG ${12 + (r - 1) * 3}% เป็นเวลา 2 เทิร์น` }; if (passives[id]) return passives[id]; const meta = LIGHTCONE_METADATA[id]; + if (meta?.desc) return meta.desc; const pathName = meta ? translatePath(meta.path) : "สายต่อสู้"; return `เพิ่มค่าสถานะพื้นฐานตามสาย ${pathName} และเพิ่มประสิทธิภาพความเสียหายและการสนับสนุน ${12 + (r - 1) * 3}% เมื่อเข้าสู่การต่อสู้`; } @@ -1557,8 +1578,8 @@ function updateModalLcFullView(lcId, rank = 5, level = 80) { if (el.modalLcFullImg) { el.modalLcFullImg.style.display = 'block'; if (el.modalLcNoArt) el.modalLcNoArt.style.display = 'none'; - const primarySrc = `https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/image/light_cone_preview/${id}.png`; - const fallbackSrc = `https://cdn.jsdelivr.net/gh/Mar-7th/StarRailRes@master/image/light_cone_preview/${id}.png`; + const primarySrc = getLightconeArtSrc(id); + const fallbackSrc = getLightconeArtFallback(id); el.modalLcFullImg.src = primarySrc; el.modalLcFullImg.onerror = function() { if (this.src !== fallbackSrc) { @@ -1766,8 +1787,15 @@ function renderModalOverviewTab(avatarId) { // Equipped LC Card Glance if (el.overviewLcThumb) { - el.overviewLcThumb.src = `https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/icon/light_cone/${lcId}.png`; - el.overviewLcThumb.onerror = function() { this.src = './assets/logo.png'; }; + el.overviewLcThumb.src = getLightconeArtSrc(lcId); + el.overviewLcThumb.onerror = function() { + const fallback = getLightconeArtFallback(lcId); + if (this.src !== fallback) { + this.src = fallback; + } else { + this.src = './assets/logo.png'; + } + }; } if (el.overviewLcName) el.overviewLcName.textContent = lcInfo.name || `Light Cone ${lcId}`; if (el.overviewLcRank) el.overviewLcRank.textContent = `S${lcRank} • Lv.${lcLevel}`; @@ -2650,9 +2678,9 @@ function renderShowcaseCard(avatarId) { const baseDef = meta.rarity === 5 ? 600 : 573; const baseSpd = 100; - const lcHp = lcMeta.rarity === 5 ? 1164 : (lcMeta.rarity === 4 ? 953 : 846); - const lcAtk = lcMeta.rarity === 5 ? 582 : (lcMeta.rarity === 4 ? 423 : 317); - const lcDef = lcMeta.rarity === 5 ? 529 : (lcMeta.rarity === 4 ? 396 : 264); + const lcHp = lcMeta.hp || (lcMeta.rarity === 5 ? 1164 : (lcMeta.rarity === 4 ? 953 : 846)); + const lcAtk = lcMeta.atk || (lcMeta.rarity === 5 ? 582 : (lcMeta.rarity === 4 ? 423 : 317)); + const lcDef = lcMeta.def || (lcMeta.rarity === 5 ? 529 : (lcMeta.rarity === 4 ? 396 : 264)); // 2. Relics & Set Bonuses const avatarRelics = (state.fullFreesrData?.relics || []).filter(r => r.equip_avatar === aid); @@ -2757,8 +2785,8 @@ function renderShowcaseCard(avatarId) { const primaryPortrait = `https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/image/character_portrait/${aid}.png`; const fallbackPortrait = `https://cdn.jsdelivr.net/gh/Mar-7th/StarRailRes@master/image/character_portrait/${aid}.png`; - const lcArtThumb = `https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/image/light_cone_preview/${lcId}.png`; - const fallbackLcThumb = `https://cdn.jsdelivr.net/gh/Mar-7th/StarRailRes@master/image/light_cone_preview/${lcId}.png`; + const lcArtThumb = getLightconeArtSrc(lcId); + const fallbackLcThumb = getLightconeArtFallback(lcId); el.showcaseCardContainer.innerHTML = ` @@ -3457,8 +3485,8 @@ function renderLightconesGrid() { ` : ''; - const primaryImg = `https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/image/light_cone_preview/${lc.item_id}.png`; - const fallbackImg = `https://cdn.jsdelivr.net/gh/Mar-7th/StarRailRes@master/image/light_cone_preview/${lc.item_id}.png`; + const primaryImg = getLightconeArtSrc(lc.item_id); + const fallbackImg = getLightconeArtFallback(lc.item_id); card.innerHTML = ` ${meta.name} @@ -3563,15 +3591,18 @@ function showLcInspector(lc) { avatarOpts += ``; }); - const hp = lcMeta.rarity === 5 ? 1164 : (lcMeta.rarity === 4 ? 953 : 846); - const atk = lcMeta.rarity === 5 ? 582 : (lcMeta.rarity === 4 ? 423 : 317); - const def = lcMeta.rarity === 5 ? 529 : (lcMeta.rarity === 4 ? 396 : 264); + const hp = lcMeta.hp || (lcMeta.rarity === 5 ? 1164 : (lcMeta.rarity === 4 ? 953 : 846)); + const atk = lcMeta.atk || (lcMeta.rarity === 5 ? 582 : (lcMeta.rarity === 4 ? 423 : 317)); + const def = lcMeta.def || (lcMeta.rarity === 5 ? 529 : (lcMeta.rarity === 4 ? 396 : 264)); + + const primaryThumb = getLightconeArtSrc(lc.item_id); + const fallbackThumb = getLightconeArtFallback(lc.item_id); el.eqInspectorCard.style.display = 'flex'; el.eqInspectorCard.innerHTML = `
- ${lcInfo.name} + ${lcInfo.name}
${lcInfo.name}
${'★'.repeat(lcInfo.rarity || 5)}
diff --git a/js/equipment-data.js b/js/equipment-data.js index 0718277..355fbac 100644 --- a/js/equipment-data.js +++ b/js/equipment-data.js @@ -3098,6 +3098,31 @@ export const LIGHTCONE_METADATA = { "rarity": 5, "path": "Elation" }, + "23065": { + "names": { + "th": "เสียงสะท้อนแรกของ \"Aha\"", + "en": "Upon the First Echo of \"Aha\"", + "zh-CN": "「阿哈」最初的啼鸣", + "zh-TW": "「阿哈」最初的啼鳴", + "ja": "「アハ」最初の啼き声", + "ko": "「아하」 최초의 울음소리", + "ru": "При первом эхе Ахи", + "vi": "Tiếng Vọng Đầu Tiên Của \"Aha\"", + "id": "Upon the First Echo of \"Aha\"", + "es": "Tras el primer eco de Aha", + "fr": "Au premier écho d'Aha", + "de": "Beim ersten Echo von Aha", + "pt": "No Primeiro Eco de Aha" + }, + "rarity": 5, + "path": "Elation", + "hp": 952, + "atk": 582, + "def": 529, + "skill_name": "IMPROV TOUR", + "desc": "เพิ่มความเร็วพื้นฐานของผู้สวมใส่ 12 เมื่อใช้สกิลการต่อสู้กับเป้าหมายฝ่ายเรา 1 ตัว จะได้รับ \"Punchline\" 10 แต้ม เอฟเฟกต์นี้เกิดขึ้นได้มากสุด 1 ครั้งในทุก 1 เทิร์น จากนั้นจะทำให้ฝ่ายเราทั้งหมดเพิกเฉยต่อ DEF ของเป้าหมายศัตรู 16% เมื่อสร้าง DMG ในการต่อสู้นี้ โดยเอฟเฟกต์นี้ไม่สามารถซ้อนทับได้", + "desc_en": "Increases the wearer's base Speed by 12. When using a Skill on one other ally, gains 10 Punchline. This effect can trigger at most once every interval of 1 turn(s). Then, causes all allies to ignore 16% of the enemy target's DEF when dealing DMG during this combat. This effect cannot be stacked." + }, "24000": { "names": { "th": "On the Fall of an Aeon",