From 139ba95421f88784f40800c6f98bf9b19028a1b0 Mon Sep 17 00:00:00 2001 From: CAtlas0784 Date: Sat, 17 Oct 2026 01:15:40 +0700 Subject: [PATCH] feat: redesign Quick Actions with 6 practical tools and set 50% default starting energy --- index.html | 68 ++++++++++-- js/app.js | 308 ++++++++++++++++++++++++++++++++++++++++++++++++----- js/i18n.js | 247 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 590 insertions(+), 33 deletions(-) diff --git a/index.html b/index.html index 65993d6..0558600 100644 --- a/index.html +++ b/index.html @@ -134,14 +134,64 @@
-
⚡ ดำเนินการด่วน
-

ส่งคำสั่งไปยังเซิร์ฟเวอร์ทันที

-
- - + + + + + + + + + + + +
@@ -599,8 +649,8 @@
- - 140/140 + + 70/140
diff --git a/js/app.js b/js/app.js index 390f211..6392a66 100644 --- a/js/app.js +++ b/js/app.js @@ -46,8 +46,12 @@ const el = { lineupContainer: document.getElementById('lineup-container'), toggleCreativeMode: document.getElementById('toggle-creative-mode'), badgeCreativeMode: document.getElementById('badge-creative-mode'), - btnQuickMaxAll: document.getElementById('btn-quick-max-all'), - btnQuickSyncPersistent: document.getElementById('btn-quick-sync-persistent'), + btnQuickEnergy50: document.getElementById('btn-quick-energy-50'), + btnQuickEnergy100: document.getElementById('btn-quick-energy-100'), + btnQuickUnlockAllAvatars: document.getElementById('btn-quick-unlock-all-avatars'), + btnQuickAddAllLcs: document.getElementById('btn-quick-add-all-lcs'), + btnQuickTeleportTrain: document.getElementById('btn-quick-teleport-train'), + btnQuickClearLineup: document.getElementById('btn-quick-clear-lineup'), // Avatars avatarsGrid: document.getElementById('avatars-grid'), @@ -1112,9 +1116,10 @@ function openAvatarDetailModal(avatarItem) { el.checkTraceStats.checked = (anchorSkills['9'] ?? skills[`${aid}201`] ?? 1) > 0; } - // Ultimate Energy + // Ultimate Energy (Default 50% as standard in Star Rail) const maxSp = av?.sp_max ?? 140; - const currentSp = av?.sp_value ?? maxSp; + const defaultStartingSp = Math.floor(maxSp * 0.5); + const currentSp = (av?.sp_value !== undefined && av?.sp_value !== null) ? av.sp_value : defaultStartingSp; if (el.rangeCharEnergy && el.valCharEnergy) { el.rangeCharEnergy.max = maxSp; el.rangeCharEnergy.value = currentSp; @@ -1233,10 +1238,11 @@ async function maxAllBuildForCurrentAvatar() { // Skills & Traces maxSkillsForAvatar(); - // Energy 100% + // Energy (Default 50% standard starting energy) if (el.rangeCharEnergy && el.valCharEnergy) { - el.rangeCharEnergy.value = el.rangeCharEnergy.max; - el.valCharEnergy.textContent = `${el.rangeCharEnergy.max}/${el.rangeCharEnergy.max}`; + const half = Math.floor(parseInt(el.rangeCharEnergy.max, 10) * 0.5); + el.rangeCharEnergy.value = half; + el.valCharEnergy.textContent = `${half}/${el.rangeCharEnergy.max}`; } // Lightcone @@ -1266,6 +1272,10 @@ async function saveAvatarDetails() { target.rank = rank; } + const maxSp = parseInt(el.rangeCharEnergy?.max, 10) || 140; + const defaultSp = Math.floor(maxSp * 0.5); + const currentSp = el.rangeCharEnergy ? parseInt(el.rangeCharEnergy.value, 10) : defaultSp; + if (!state.fullFreesrData) { state.fullFreesrData = { avatars: {}, lightcones: [], relics: [] }; } @@ -1279,8 +1289,8 @@ async function saveAvatarDetails() { level, promotion, techniques: [], - sp_value: parseInt(el.rangeCharEnergy?.value, 10) || 140, - sp_max: parseInt(el.rangeCharEnergy?.max, 10) || 140, + sp_value: currentSp, + sp_max: maxSp, data: { rank, skills: {}, @@ -1294,9 +1304,8 @@ async function saveAvatarDetails() { av.promotion = promotion; av.data = av.data || {}; av.data.rank = rank; - if (el.rangeCharEnergy) { - av.sp_value = parseInt(el.rangeCharEnergy.value, 10) || av.sp_max || 140; - } + av.sp_max = maxSp; + av.sp_value = currentSp; // Extract skills values const basicVal = parseInt(el.rangeSkillBasic?.value, 10) || 6; @@ -1393,6 +1402,262 @@ async function saveAvatarDetails() { } } +// ============================================================================ +// Quick Action Functions +// ============================================================================ + +// 1. Quick Set Team Energy (50% or 100%) +async function quickSetTeamEnergy(ratio = 0.5) { + try { + state.statusData = state.statusData || {}; + const lineups = state.statusData.lineups || DEFAULT_LINEUP; + if (!state.fullFreesrData) { + state.fullFreesrData = { avatars: {}, lightcones: [], relics: [] }; + } + state.fullFreesrData.avatars = state.fullFreesrData.avatars || {}; + + const lineupIds = Object.values(lineups).filter(id => id && id > 0); + if (lineupIds.length === 0) { + showToast(t('slotEmpty') || 'ไม่มีตัวละครในทีม', 'warning'); + return; + } + + lineupIds.forEach(aid => { + if (!state.fullFreesrData.avatars[aid]) { + state.fullFreesrData.avatars[aid] = { + owner_uid: 0, + avatar_id: aid, + level: 80, + promotion: 6, + techniques: [], + sp_max: 140, + sp_value: 70, + data: { rank: 6, skills: {} } + }; + } + const av = state.fullFreesrData.avatars[aid]; + const maxSp = av.sp_max || 140; + av.sp_max = maxSp; + av.sp_value = Math.floor(maxSp * ratio); + }); + + if (state.isConnected) { + await saveFreesrChangesToServer(); + } + + if (ratio === 0.5) { + showToast(t('toastEnergy50') || 'ตั้งค่าพลังงานทีม 50% (มาตรฐานเกม) เรียบร้อยแล้ว', 'success'); + } else { + showToast(t('toastEnergy100') || 'ตั้งค่าพลังงานทีม 100% (อัลติพร้อมใช้) เรียบร้อยแล้ว', 'success'); + } + } catch (err) { + showToast(err.message, 'error'); + } +} + +// 2. Quick Unlock All 70+ Avatars +async function quickUnlockAllAvatars() { + try { + if (!state.fullFreesrData) { + state.fullFreesrData = { avatars: {}, lightcones: [], relics: [] }; + } + state.fullFreesrData.avatars = state.fullFreesrData.avatars || {}; + + const allIds = Object.keys(AVATAR_METADATA).map(id => parseInt(id, 10)); + allIds.forEach(aid => { + if (!state.fullFreesrData.avatars[aid]) { + state.fullFreesrData.avatars[aid] = { + owner_uid: 0, + avatar_id: aid, + level: 80, + promotion: 6, + techniques: [], + sp_max: 140, + sp_value: 70, // 50% standard starting energy + data: { + rank: 6, + skills: { + [`${aid}001`]: 6, + [`${aid}002`]: 10, + [`${aid}003`]: 10, + [`${aid}004`]: 10, + [`${aid}007`]: 1, + [`${aid}101`]: 1, + [`${aid}102`]: 1, + [`${aid}103`]: 1, + [`${aid}201`]: 1 + }, + skills_by_anchor_type: { + "1": 6, "2": 10, "3": 10, "4": 10, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1 + } + } + }; + } else { + const av = state.fullFreesrData.avatars[aid]; + av.level = 80; + av.promotion = 6; + av.data = av.data || {}; + av.data.rank = 6; + if (!av.sp_value) av.sp_value = 70; + } + }); + + initAvatarsList(); + state.avatarsList.forEach(a => { + a.level = 80; + a.promotion = 6; + a.rank = 6; + }); + + if (state.isConnected) { + if (state.serverMode === 'gac') { + await apiCall('/api/avatar/max_all', 'POST', {}).catch(() => {}); + await saveFreesrChangesToServer().catch(() => {}); + } else { + await saveFreesrChangesToServer(); + } + } + + renderAvatarsGrid(); + if (el.statAvatars) el.statAvatars.textContent = Object.keys(state.fullFreesrData.avatars).length; + showToast(t('toastUnlockedAll') || 'ปลดล็อกตัวละครครบทุกตัว (70+ ตัว E6) เรียบร้อยแล้ว', 'success'); + } catch (err) { + showToast(err.message, 'error'); + } +} + +// 3. Quick Add All 5-Star Signature Light Cones +async function quickAddAll5StarLightcones() { + try { + if (!state.fullFreesrData) { + state.fullFreesrData = { avatars: {}, lightcones: [], relics: [] }; + } + state.fullFreesrData.lightcones = state.fullFreesrData.lightcones || []; + + const existingLcIds = new Set(state.fullFreesrData.lightcones.map(lc => lc.item_id)); + let nextUniqueId = 1000; + state.fullFreesrData.lightcones.forEach(lc => { + if (lc.unique_id >= nextUniqueId) nextUniqueId = lc.unique_id + 1; + }); + + let addedCount = 0; + for (const idStr in LIGHTCONE_METADATA) { + const meta = LIGHTCONE_METADATA[idStr]; + const itemId = parseInt(idStr, 10); + if (meta.rarity === 5 && !existingLcIds.has(itemId)) { + state.fullFreesrData.lightcones.push({ + unique_id: nextUniqueId++, + item_id: itemId, + level: 80, + promotion: 6, + rank: 5, + equip_avatar: 0 + }); + existingLcIds.add(itemId); + addedCount++; + } + } + + if (state.isConnected) { + await saveFreesrChangesToServer(); + } + loadEquipment(); + showToast(t('toastAddedAllLcs') || `เพิ่มกรวยแสง 5 ดาวทั้งหมด (${addedCount} ชิ้น) เข้าคลังแล้ว`, 'success'); + } catch (err) { + showToast(err.message, 'error'); + } +} + +// 4. Quick Teleport to Astral Express Parlor Car +async function quickTeleportAstralExpress() { + const trainLoc = { + plane_id: 20001, + floor_id: 20001001, + entry_id: 2000101, + x: 0, + y: 0, + z: 0, + rot_y: 0 + }; + try { + if (state.fullFreesrData) { + state.fullFreesrData.scene = { + plane_id: trainLoc.plane_id, + floor_id: trainLoc.floor_id, + entry_id: trainLoc.entry_id + }; + state.fullFreesrData.position = { + x: trainLoc.x, + y: trainLoc.y, + z: trainLoc.z, + rot_y: trainLoc.rot_y + }; + } + + if (state.isConnected) { + if (state.serverMode === 'gac') { + await apiCall('/api/teleport', 'POST', trainLoc).catch(async () => { + await apiCall('/api/persistent', 'POST', { + scene: { plane_id: trainLoc.plane_id, floor_id: trainLoc.floor_id, entry_id: trainLoc.entry_id }, + position: { x: trainLoc.x, y: trainLoc.y, z: trainLoc.z, rot_y: trainLoc.rot_y } + }); + }); + } else { + await saveFreesrChangesToServer(); + } + } + + if (el.lblPlaneId) el.lblPlaneId.textContent = trainLoc.plane_id; + if (el.lblFloorId) el.lblFloorId.textContent = trainLoc.floor_id; + if (el.lblCoordinates) el.lblCoordinates.textContent = `X: ${trainLoc.x}, Y: ${trainLoc.y}, Z: ${trainLoc.z}`; + showToast(t('toastTeleportedTrain') || 'วาร์ปกลับสู่ Astral Express Parlor Car เรียบร้อยแล้ว', 'success'); + } catch (err) { + showToast(err.message, 'error'); + } +} + +// 5. Quick Clear Lineup Slots +async function quickClearLineup() { + try { + state.statusData = state.statusData || {}; + let currentLineup = state.statusData.lineups || DEFAULT_LINEUP; + if (Array.isArray(currentLineup)) { + const mapped = {}; + currentLineup.forEach((id, idx) => { mapped[idx] = id; }); + currentLineup = mapped; + } + + const cleared = {}; + Object.keys(currentLineup).forEach(k => { + cleared[k] = 0; + }); + if (!state.creativeMode) { + cleared[0] = 0; cleared[1] = 0; cleared[2] = 0; cleared[3] = 0; + } + + state.statusData.lineups = cleared; + if (state.fullFreesrData) { + state.fullFreesrData.lineups = cleared; + if (state.fullFreesrData.battle_config) { + state.fullFreesrData.battle_config.custom_battle_lineup = cleared; + } + } + + if (state.isConnected) { + if (state.serverMode === 'gac') { + await apiCall('/api/persistent', 'POST', { lineups: cleared }); + } else { + await saveFreesrChangesToServer(); + } + } + + renderLineup(cleared); + showToast(t('toastLineupCleared') || 'ล้างตัวละครในทีมเรียบร้อยแล้ว', 'info'); + } catch (err) { + showToast(err.message, 'error'); + } +} + // Max all avatars async function maxAllAvatars() { if (!confirm(t('confirmMaxAll'))) return; @@ -2101,18 +2366,13 @@ function setupEvents() { } // Quick Action Buttons on Dashboard - el.btnQuickMaxAll.addEventListener('click', maxAllAvatars); - el.btnMaxAllAvatars.addEventListener('click', maxAllAvatars); - - el.btnQuickSyncPersistent.addEventListener('click', async () => { - try { - await apiCall('/api/persistent'); - showToast('ซิงค์ข้อมูล Persistent เรียบร้อย', 'success'); - refreshStatus(); - } catch (err) { - showToast(`Sync failed: ${err.message}`, 'error'); - } - }); + el.btnQuickEnergy50?.addEventListener('click', () => quickSetTeamEnergy(0.5)); + el.btnQuickEnergy100?.addEventListener('click', () => quickSetTeamEnergy(1.0)); + el.btnQuickUnlockAllAvatars?.addEventListener('click', quickUnlockAllAvatars); + el.btnQuickAddAllLcs?.addEventListener('click', quickAddAll5StarLightcones); + el.btnQuickTeleportTrain?.addEventListener('click', quickTeleportAstralExpress); + el.btnQuickClearLineup?.addEventListener('click', quickClearLineup); + el.btnMaxAllAvatars?.addEventListener('click', maxAllAvatars); // Persistent Form Submit el.formPersistentChars.addEventListener('submit', async (e) => { diff --git a/js/i18n.js b/js/i18n.js index 1b0c802..dab6cdf 100644 --- a/js/i18n.js +++ b/js/i18n.js @@ -26,6 +26,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "โหมดสร้างสรรค์", "badgeCreative": "โหมดสร้างสรรค์", "toastSlotRemoved": "ลบ Slot {slot} เรียบร้อยแล้ว", + "quickActionsBadge": "คำสั่งด่วน", + "qaEnergy50Title": "พลังงานทีม 50%", + "qaEnergy50Desc": "ค่าเริ่มต้นมาตรฐานเมื่อเข้าสู้", + "qaEnergy100Title": "พลังงานทีม 100%", + "qaEnergy100Desc": "พร้อมกดท่าไม้ตายทันที", + "qaUnlockAllTitle": "ปลดล็อกตัวละครครบทุกตัว", + "qaUnlockAllDesc": "เพิ่มครบ 70+ ตัว E6 เต็มคลัง", + "qaAddLcsTitle": "เพิ่มกรวยแสง 5★ ทั้งหมด", + "qaAddLcsDesc": "กรวยแสงประจำตัว S5 เข้าคลัง", + "qaTeleportTitle": "วาร์ปกลับรถไฟ Astral Express", + "qaTeleportDesc": "กลับสู่ Parlor Car จุดปลอดภัย", + "qaClearLineupTitle": "ล้างตัวละครในทีม", + "qaClearLineupDesc": "เคลียร์ทุกช่องเพื่อจัดทีมใหม่", + "toastEnergy50": "ตั้งค่าพลังงานทีม 50% (มาตรฐานเกม) เรียบร้อยแล้ว", + "toastEnergy100": "ตั้งค่าพลังงานทีม 100% (อัลติพร้อมใช้) เรียบร้อยแล้ว", + "toastUnlockedAll": "ปลดล็อกตัวละครครบทุกตัว (70+ ตัว E6) เรียบร้อยแล้ว", + "toastAddedAllLcs": "เพิ่มกรวยแสง 5 ดาวประจำตัวละครทั้งหมดเข้าคลังแล้ว", + "toastTeleportedTrain": "วาร์ปตัวละครกลับสู่ Astral Express Parlor Car เรียบร้อยแล้ว", + "toastLineupCleared": "ล้างตัวละครในทีมเรียบร้อยแล้ว", "modalAddLcTitle": "🗡️ เพิ่มกรวยแสงลง FreeSR", "modalAddRelicTitle": "🛡️ เพิ่มรีลิกส์ลง FreeSR", "lblSelectLc": "เลือกกรวยแสง", @@ -224,6 +243,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Creative Mode", "badgeCreative": "Creative", "toastSlotRemoved": "Removed Slot {slot}", + "quickActionsBadge": "Quick Tools", + "qaEnergy50Title": "Team Energy 50%", + "qaEnergy50Desc": "Standard starting battle energy", + "qaEnergy100Title": "Team Energy 100%", + "qaEnergy100Desc": "Instant Ultimate ready", + "qaUnlockAllTitle": "Unlock All Avatars", + "qaUnlockAllDesc": "Add all 70+ characters at E6", + "qaAddLcsTitle": "Add All 5★ Light Cones", + "qaAddLcsDesc": "All signature S5 light cones to inventory", + "qaTeleportTitle": "Teleport to Astral Express", + "qaTeleportDesc": "Return to Parlor Car safe hub", + "qaClearLineupTitle": "Clear Team Lineup", + "qaClearLineupDesc": "Empty all slots to rebuild team", + "toastEnergy50": "Team energy set to 50% (standard)", + "toastEnergy100": "Team energy set to 100% (instant burst)", + "toastUnlockedAll": "Unlocked all 70+ characters at E6", + "toastAddedAllLcs": "Added all 5★ signature light cones to inventory", + "toastTeleportedTrain": "Teleported to Astral Express Parlor Car", + "toastLineupCleared": "Lineup cleared successfully", "modalAddLcTitle": "🗡️ Add Light Cone to FreeSR", "modalAddRelicTitle": "🛡️ Add Relic to FreeSR", "lblSelectLc": "Select Light Cone", @@ -422,6 +460,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "创造模式", "badgeCreative": "创造模式", "toastSlotRemoved": "已移除槽位 {slot}", + "quickActionsBadge": "快捷指令", + "qaEnergy50Title": "全队能量 50%", + "qaEnergy50Desc": "进战标准初始能量", + "qaEnergy100Title": "全队能量 100%", + "qaEnergy100Desc": "立即释放终结技", + "qaUnlockAllTitle": "解锁全角色", + "qaUnlockAllDesc": "添加全部 70+ 角色满魂", + "qaAddLcsTitle": "添加全部五星光锥", + "qaAddLcsDesc": "专武叠影5阶入库", + "qaTeleportTitle": "传送至星穹列车", + "qaTeleportDesc": "返回车厢安全区", + "qaClearLineupTitle": "清空编队", + "qaClearLineupDesc": "重置全部槽位重新配队", + "toastEnergy50": "已将全队能量设为 50%", + "toastEnergy100": "已将全队能量设为 100%", + "toastUnlockedAll": "已解锁全部角色(满魂)", + "toastAddedAllLcs": "已添加全部五星光锥至背包", + "toastTeleportedTrain": "已传送至星穹列车观景车厢", + "toastLineupCleared": "已清空编队角色", "modalAddLcTitle": "🗡️ 添加光锥至 FreeSR", "modalAddRelicTitle": "🛡️ 添加遗器至 FreeSR", "lblSelectLc": "选择光锥", @@ -620,6 +677,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "創造模式", "badgeCreative": "創造模式", "toastSlotRemoved": "已移除槽位 {slot}", + "quickActionsBadge": "快捷指令", + "qaEnergy50Title": "全隊能量 50%", + "qaEnergy50Desc": "進戰標準初始能量", + "qaEnergy100Title": "全隊能量 100%", + "qaEnergy100Desc": "立即施放終結技", + "qaUnlockAllTitle": "解鎖全角色", + "qaUnlockAllDesc": "新增全部 70+ 角色滿魂", + "qaAddLcsTitle": "新增全部五星光錐", + "qaAddLcsDesc": "專武疊影5階入庫", + "qaTeleportTitle": "傳送至星穹列車", + "qaTeleportDesc": "返回車廂安全區", + "qaClearLineupTitle": "清空隊伍", + "qaClearLineupDesc": "重設全部槽位重新組隊", + "toastEnergy50": "已將全隊能量設為 50%", + "toastEnergy100": "已將全隊能量設為 100%", + "toastUnlockedAll": "已解鎖全部角色(滿魂)", + "toastAddedAllLcs": "已新增全部五星光錐至背包", + "toastTeleportedTrain": "已傳送至星穹列車觀景車廂", + "toastLineupCleared": "已清空隊伍角色", "modalAddLcTitle": "🗡️ 新增光錐至 FreeSR", "modalAddRelicTitle": "🛡️ 新增遺器至 FreeSR", "lblSelectLc": "選擇光錐", @@ -818,6 +894,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "クリエイティブモード", "badgeCreative": "クリエイティブ", "toastSlotRemoved": "スロット {slot} を削除しました", + "quickActionsBadge": "クイックツール", + "qaEnergy50Title": "チームEP 50%", + "qaEnergy50Desc": "戦闘開始時の標準EP", + "qaEnergy100Title": "チームEP 100%", + "qaEnergy100Desc": "必殺技即時発動可能", + "qaUnlockAllTitle": "全キャラ解放", + "qaUnlockAllDesc": "70体以上の全キャラを完凸で追加", + "qaAddLcsTitle": "全★5光円錐を追加", + "qaAddLcsDesc": "モチーフ光円錐(重畳5)を倉庫に追加", + "qaTeleportTitle": "星穹列車へテレポート", + "qaTeleportDesc": "安全エリアの客車へ帰還", + "qaClearLineupTitle": "編成をクリア", + "qaClearLineupDesc": "全スロットをリセットして再編成", + "toastEnergy50": "チームEPを50%に設定しました", + "toastEnergy100": "チームEPを100%に設定しました", + "toastUnlockedAll": "全キャラ(完凸)を解放しました", + "toastAddedAllLcs": "全★5光円錐を追加しました", + "toastTeleportedTrain": "星穹列車の客車へテレポートしました", + "toastLineupCleared": "編成をクリアしました", "modalAddLcTitle": "🗡️ FreeSRに光円錐を追加", "modalAddRelicTitle": "🛡️ FreeSRに遺物を追加", "lblSelectLc": "光円錐を選択", @@ -1016,6 +1111,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "크리에이티브 모드", "badgeCreative": "크리에이티브", "toastSlotRemoved": "슬롯 {slot}이(가) 삭제되었습니다", + "quickActionsBadge": "빠른 작업", + "qaEnergy50Title": "파티 에너지 50%", + "qaEnergy50Desc": "전투 진입 기본 표준 에너지", + "qaEnergy100Title": "파티 에너지 100%", + "qaEnergy100Desc": "필살기 즉시 사용 가능", + "qaUnlockAllTitle": "전체 캐릭터 해금", + "qaUnlockAllDesc": "70명 이상의 모든 캐릭터 풀돌 추가", + "qaAddLcsTitle": "모든 5★ 광추 추가", + "qaAddLcsDesc": "전용 광추 5중첩 가방 추가", + "qaTeleportTitle": "은하열차로 워프", + "qaTeleportDesc": "안전 구역인 객차로 귀환", + "qaClearLineupTitle": "파티 비우기", + "qaClearLineupDesc": "모든 슬롯 초기화 후 재편성", + "toastEnergy50": "파티 에너지를 50%로 설정했습니다", + "toastEnergy100": "파티 에너지를 100%로 설정했습니다", + "toastUnlockedAll": "모든 캐릭터(풀돌)를 해금했습니다", + "toastAddedAllLcs": "모든 5★ 광추를 추가했습니다", + "toastTeleportedTrain": "은하열차 객차로 워프했습니다", + "toastLineupCleared": "파티를 초기화했습니다", "modalAddLcTitle": "🗡️ FreeSR에 광추 추가", "modalAddRelicTitle": "🛡️ FreeSR에 유물 추가", "lblSelectLc": "광추 선택", @@ -1214,6 +1328,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Chế độ sáng tạo", "badgeCreative": "Sáng tạo", "toastSlotRemoved": "Đã xóa vị trí {slot}", + "quickActionsBadge": "Lệnh Nhanh", + "qaEnergy50Title": "Năng lượng đội 50%", + "qaEnergy50Desc": "Năng lượng khởi đầu tiêu chuẩn", + "qaEnergy100Title": "Năng lượng đội 100%", + "qaEnergy100Desc": "Sẵn sàng dùng Tuyệt Kỹ ngay", + "qaUnlockAllTitle": "Mở khóa toàn bộ nhân vật", + "qaUnlockAllDesc": "Thêm đầy đủ hơn 70 nhân vật Tinh Hồn 6", + "qaAddLcsTitle": "Thêm toàn bộ Nón 5★", + "qaAddLcsDesc": "Nón trấn Tích Tầng 5 vào kho", + "qaTeleportTitle": "Dịch chuyển về Đội Tàu Astral", + "qaTeleportDesc": "Trở về Toa Tàu an toàn", + "qaClearLineupTitle": "Xóa đội hình", + "qaClearLineupDesc": "Dọn sạch vị trí để xếp đội mới", + "toastEnergy50": "Đã đặt năng lượng đội về 50%", + "toastEnergy100": "Đã sạc đầy 100% năng lượng đội", + "toastUnlockedAll": "Đã mở khóa toàn bộ nhân vật Tinh Hồn 6", + "toastAddedAllLcs": "Đã thêm toàn bộ Nón Ánh Sáng 5 sao", + "toastTeleportedTrain": "Đã dịch chuyển về Toa Tàu Astral", + "toastLineupCleared": "Đã xóa sạch đội hình", "modalAddLcTitle": "🗡️ Thêm Nón Ánh Sáng vào FreeSR", "modalAddRelicTitle": "🛡️ Thêm Di Vật vào FreeSR", "lblSelectLc": "Chọn Nón Ánh Sáng", @@ -1412,6 +1545,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Mode Kreatif", "badgeCreative": "Kreatif", "toastSlotRemoved": "Slot {slot} berhasil dihapus", + "quickActionsBadge": "Tindakan Cepat", + "qaEnergy50Title": "Energi Tim 50%", + "qaEnergy50Desc": "Energi awal standar saat masuk battle", + "qaEnergy100Title": "Energi Tim 100%", + "qaEnergy100Desc": "Ultimate langsung siap pakai", + "qaUnlockAllTitle": "Buka Semua Karakter", + "qaUnlockAllDesc": "Tambah 70+ karakter E6 ke tas", + "qaAddLcsTitle": "Tambah Semua Light Cone 5★", + "qaAddLcsDesc": "Light Cone signature S5 ke inventaris", + "qaTeleportTitle": "Teleport ke Astral Express", + "qaTeleportDesc": "Kembali ke Parlor Car zona aman", + "qaClearLineupTitle": "Kosongkan Tim", + "qaClearLineupDesc": "Kosongkan semua slot untuk susun ulang", + "toastEnergy50": "Energi tim diatur ke 50%", + "toastEnergy100": "Energi tim diatur ke 100%", + "toastUnlockedAll": "Berhasil membuka semua karakter (E6)", + "toastAddedAllLcs": "Berhasil menambahkan semua Light Cone 5★", + "toastTeleportedTrain": "Teleportasi ke Parlor Car berhasil", + "toastLineupCleared": "Susunan tim berhasil dikosongkan", "modalAddLcTitle": "🗡️ Tambah Light Cone ke FreeSR", "modalAddRelicTitle": "🛡️ Tambah Relic ke FreeSR", "lblSelectLc": "Pilih Light Cone", @@ -1610,6 +1762,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Modo creativo", "badgeCreative": "Creativo", "toastSlotRemoved": "Posición {slot} eliminada", + "quickActionsBadge": "Herramientas Rápidas", + "qaEnergy50Title": "Energía de equipo 50%", + "qaEnergy50Desc": "Energía inicial estándar en batalla", + "qaEnergy100Title": "Energía de equipo 100%", + "qaEnergy100Desc": "Habilidad definitiva lista al instante", + "qaUnlockAllTitle": "Desbloquear todos los personajes", + "qaUnlockAllDesc": "Añadir más de 70 personajes con E6", + "qaAddLcsTitle": "Añadir todos los conos de luz 5★", + "qaAddLcsDesc": "Conos de luz distintivos S5 al inventario", + "qaTeleportTitle": "Teletransporte al Expreso Astral", + "qaTeleportDesc": "Volver al vagón panorámico (zona segura)", + "qaClearLineupTitle": "Vaciar equipo", + "qaClearLineupDesc": "Limpiar casillas para formar nuevo equipo", + "toastEnergy50": "Energía del equipo ajustada al 50%", + "toastEnergy100": "Energía del equipo ajustada al 100%", + "toastUnlockedAll": "Todos los personajes desbloqueados (E6)", + "toastAddedAllLcs": "Todos los conos de 5★ añadidos", + "toastTeleportedTrain": "Teletransportado al Expreso Astral", + "toastLineupCleared": "Equipo vaciado correctamente", "modalAddLcTitle": "🗡️ Añadir cono de luz a FreeSR", "modalAddRelicTitle": "🛡️ Añadir reliquia a FreeSR", "lblSelectLc": "Seleccionar cono de luz", @@ -1808,6 +1979,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Mode créatif", "badgeCreative": "Créatif", "toastSlotRemoved": "Emplacement {slot} supprimé", + "quickActionsBadge": "Outils Rapides", + "qaEnergy50Title": "Énergie d'équipe 50%", + "qaEnergy50Desc": "Énergie de départ standard en combat", + "qaEnergy100Title": "Énergie d'équipe 100%", + "qaEnergy100Desc": "Ultime prêt instantanément", + "qaUnlockAllTitle": "Débloquer tous les personnages", + "qaUnlockAllDesc": "Ajouter 70+ personnages au rang E6", + "qaAddLcsTitle": "Ajouter tous les cônes 5★", + "qaAddLcsDesc": "Cônes signatures S5 à l'inventaire", + "qaTeleportTitle": "Téléportation à l'Astral Express", + "qaTeleportDesc": "Retourner au wagon-salon (zone sûre)", + "qaClearLineupTitle": "Vider l'équipe", + "qaClearLineupDesc": "Effacer les emplacements pour recomposer", + "toastEnergy50": "Énergie d'équipe réglée à 50%", + "toastEnergy100": "Énergie d'équipe réglée à 100%", + "toastUnlockedAll": "Tous les personnages débloqués (E6)", + "toastAddedAllLcs": "Tous les cônes de lumière 5★ ajoutés", + "toastTeleportedTrain": "Téléporté au wagon-salon de l'Astral Express", + "toastLineupCleared": "Équipe réinitialisée", "modalAddLcTitle": "🗡️ Ajouter cône de lumière à FreeSR", "modalAddRelicTitle": "🛡️ Ajouter relique à FreeSR", "lblSelectLc": "Sélectionner cône de lumière", @@ -2006,6 +2196,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Kreativmodus", "badgeCreative": "Kreativ", "toastSlotRemoved": "Platz {slot} entfernt", + "quickActionsBadge": "Schnellbefehle", + "qaEnergy50Title": "Team-Energie 50%", + "qaEnergy50Desc": "Standard-Startenergie im Kampf", + "qaEnergy100Title": "Team-Energie 100%", + "qaEnergy100Desc": "Ultimate sofort einsatzbereit", + "qaUnlockAllTitle": "Alle Figuren freischalten", + "qaUnlockAllDesc": "Alle 70+ Figuren auf E6 hinzufügen", + "qaAddLcsTitle": "Alle 5★-Lichtkegel hinzufügen", + "qaAddLcsDesc": "Signatur-Lichtkegel (S5) ins Inventar", + "qaTeleportTitle": "Zum Astralexpress teleportieren", + "qaTeleportDesc": "Zurück zum Parlor Car (Sicherheitszone)", + "qaClearLineupTitle": "Team leeren", + "qaClearLineupDesc": "Alle Plätze leeren für neues Team", + "toastEnergy50": "Team-Energie auf 50% gesetzt", + "toastEnergy100": "Team-Energie auf 100% gesetzt", + "toastUnlockedAll": "Alle Figuren auf E6 freigeschaltet", + "toastAddedAllLcs": "Alle 5★-Lichtkegel hinzugefügt", + "toastTeleportedTrain": "Zum Astralexpress teleportiert", + "toastLineupCleared": "Team-Plätze geleert", "modalAddLcTitle": "🗡️ Lichtkegel zu FreeSR hinzufügen", "modalAddRelicTitle": "🛡️ Relikt zu FreeSR hinzufügen", "lblSelectLc": "Lichtkegel auswählen", @@ -2204,6 +2413,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Творческий режим", "badgeCreative": "Творческий", "toastSlotRemoved": "Слот {slot} удален", + "quickActionsBadge": "Быстрые команды", + "qaEnergy50Title": "Энергия отряда 50%", + "qaEnergy50Desc": "Стандартная начальная энергия", + "qaEnergy100Title": "Энергия отряда 100%", + "qaEnergy100Desc": "Сверхспособность сразу готова", + "qaUnlockAllTitle": "Разблокировать всех героев", + "qaUnlockAllDesc": "Добавить 70+ героев с Эйдолонами 6", + "qaAddLcsTitle": "Добавить все 5★ конусы", + "qaAddLcsDesc": "Сигнатурные конусы (Н5) в инвентарь", + "qaTeleportTitle": "Телепорт на Звёздный экспресс", + "qaTeleportDesc": "Возврат в общий вагон", + "qaClearLineupTitle": "Очистить отряд", + "qaClearLineupDesc": "Сбросить слоты для нового состава", + "toastEnergy50": "Энергия отряда установлена на 50%", + "toastEnergy100": "Энергия отряда установлена на 100%", + "toastUnlockedAll": "Все персонажи разблокированы (Э6)", + "toastAddedAllLcs": "Все 5★ световые конусы добавлены", + "toastTeleportedTrain": "Телепортирован в общий вагон экспресса", + "toastLineupCleared": "Слоты отряда очищены", "modalAddLcTitle": "🗡️ Добавить световой конус в FreeSR", "modalAddRelicTitle": "🛡️ Добавить реликвию в FreeSR", "lblSelectLc": "Выберите световой конус", @@ -2402,6 +2630,25 @@ export const TRANSLATIONS = { "lblCreativeMode": "Modo Criativo", "badgeCreative": "Criativo", "toastSlotRemoved": "Espaço {slot} removido", + "quickActionsBadge": "Ações Rápidas", + "qaEnergy50Title": "Energia da Equipe 50%", + "qaEnergy50Desc": "Energia inicial padrão de batalha", + "qaEnergy100Title": "Energia da Equipe 100%", + "qaEnergy100Desc": "Perícia Suprema pronta na hora", + "qaUnlockAllTitle": "Desbloquear Todos os Personagens", + "qaUnlockAllDesc": "Adicionar todos os 70+ personagens E6", + "qaAddLcsTitle": "Adicionar Todos os Cones 5★", + "qaAddLcsDesc": "Cones de Luz assinatura S5 ao inventário", + "qaTeleportTitle": "Teleporte para o Expresso Astral", + "qaTeleportDesc": "Retornar ao Vagão Panorâmico seguro", + "qaClearLineupTitle": "Limpar Equipe", + "qaClearLineupDesc": "Esvaziar espaços para nova formação", + "toastEnergy50": "Energia da equipe definida em 50%", + "toastEnergy100": "Energia da equipe definida em 100%", + "toastUnlockedAll": "Todos os personagens desbloqueados (E6)", + "toastAddedAllLcs": "Todos os Cones de Luz 5★ adicionados", + "toastTeleportedTrain": "Teleportado para o Expresso Astral", + "toastLineupCleared": "Equipe limpa com sucesso", "modalAddLcTitle": "🗡️ Adicionar Cone de Luz ao FreeSR", "modalAddRelicTitle": "🛡️ Adicionar Relíquia ao FreeSR", "lblSelectLc": "Selecionar Cone de Luz",