feat: redesign Quick Actions with 6 practical tools and set 50% default starting energy

This commit is contained in:
CAtlas0784 committed 2026-10-17 01:15:40 +07:00
1 parent caa29bdd30
commit 139ba95421
3 files changed
+590 -33

No files matched your search

+59 -9
View File
@@ -134,14 +134,64 @@
<!-- Quick Actions Card -->
<div class="card">
<div class="card-title" data-i18n="quickActionsTitle">⚡ ดำเนินการด่วน</div>
<p class="card-subtitle" data-i18n="quickActionsSubtitle">ส่งคำสั่งไปยังเซิร์ฟเวอร์ทันที</p>
<div style="display: flex; flex-direction: column; gap: 0.75rem;">
<button class="btn btn-gold" id="btn-quick-max-all" data-i18n="btnMaxAll">
⭐ ปรับเลเวล 80 & ปลด E6 ตัวละครทั้งหมด
<div class="card-title" style="display: flex; justify-content: space-between; align-items: center;">
<span data-i18n="quickActionsTitle">⚡ ดำเนินการด่วน</span>
<span class="btn-sm btn-secondary" style="font-size: 0.75rem;" data-i18n="quickActionsBadge">คำสั่งด่วน</span>
</div>
<p class="card-subtitle" data-i18n="quickActionsSubtitle">เครื่องมือจัดการทีมและเซิร์ฟเวอร์แบบทันที</p>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 0.75rem;">
<!-- 1. Set Team Energy to 50% (Standard) -->
<button type="button" class="btn btn-secondary" id="btn-quick-energy-50" style="display: flex; align-items: center; justify-content: flex-start; gap: 0.6rem; text-align: left; padding: 0.75rem 0.9rem;">
<span style="font-size: 1.35rem; line-height: 1;">🔋</span>
<div>
<div style="font-weight: 700; font-size: 0.875rem;" data-i18n="qaEnergy50Title">พลังงานทีม 50%</div>
<div style="font-size: 0.725rem; color: var(--text-muted);" data-i18n="qaEnergy50Desc">ค่าเริ่มต้นมาตรฐานเมื่อเข้าสู้</div>
</div>
</button>
<button class="btn btn-secondary" id="btn-quick-sync-persistent" data-i18n="btnSyncPersistent">
💾 ซิงค์ข้อมูล Persistent ล่าสุด
<!-- 2. Set Team Energy to 100% (Instant Burst) -->
<button type="button" class="btn btn-primary" id="btn-quick-energy-100" style="display: flex; align-items: center; justify-content: flex-start; gap: 0.6rem; text-align: left; padding: 0.75rem 0.9rem;">
<span style="font-size: 1.35rem; line-height: 1;">💥</span>
<div>
<div style="font-weight: 700; font-size: 0.875rem;" data-i18n="qaEnergy100Title">พลังงานทีม 100%</div>
<div style="font-size: 0.725rem; opacity: 0.85;" data-i18n="qaEnergy100Desc">พร้อมกดท่าไม้ตายทันที</div>
</div>
</button>
<!-- 3. Unlock All Avatars -->
<button type="button" class="btn btn-gold" id="btn-quick-unlock-all-avatars" style="display: flex; align-items: center; justify-content: flex-start; gap: 0.6rem; text-align: left; padding: 0.75rem 0.9rem;">
<span style="font-size: 1.35rem; line-height: 1;">👥</span>
<div>
<div style="font-weight: 700; font-size: 0.875rem;" data-i18n="qaUnlockAllTitle">ปลดล็อกตัวละครครบทุกตัว</div>
<div style="font-size: 0.725rem; opacity: 0.85;" data-i18n="qaUnlockAllDesc">เพิ่มครบ 70+ ตัว E6 เต็มคลัง</div>
</div>
</button>
<!-- 4. Add All 5-Star Light Cones -->
<button type="button" class="btn btn-secondary" id="btn-quick-add-all-lcs" style="display: flex; align-items: center; justify-content: flex-start; gap: 0.6rem; text-align: left; padding: 0.75rem 0.9rem;">
<span style="font-size: 1.35rem; line-height: 1;">🗡️</span>
<div>
<div style="font-weight: 700; font-size: 0.875rem;" data-i18n="qaAddLcsTitle">เพิ่มกรวยแสง 5★ ทั้งหมด</div>
<div style="font-size: 0.725rem; color: var(--text-muted);" data-i18n="qaAddLcsDesc">กรวยแสงประจำตัว S5 เข้าคลัง</div>
</div>
</button>
<!-- 5. Teleport to Astral Express -->
<button type="button" class="btn btn-secondary" id="btn-quick-teleport-train" style="display: flex; align-items: center; justify-content: flex-start; gap: 0.6rem; text-align: left; padding: 0.75rem 0.9rem;">
<span style="font-size: 1.35rem; line-height: 1;">🚂</span>
<div>
<div style="font-weight: 700; font-size: 0.875rem;" data-i18n="qaTeleportTitle">วาร์ปกลับรถไฟ Astral Express</div>
<div style="font-size: 0.725rem; color: var(--text-muted);" data-i18n="qaTeleportDesc">กลับสู่ Parlor Car จุดปลอดภัย</div>
</div>
</button>
<!-- 6. Clear Lineup Slots -->
<button type="button" class="btn btn-danger" id="btn-quick-clear-lineup" style="display: flex; align-items: center; justify-content: flex-start; gap: 0.6rem; text-align: left; padding: 0.75rem 0.9rem;">
<span style="font-size: 1.35rem; line-height: 1;">🧹</span>
<div>
<div style="font-weight: 700; font-size: 0.875rem;" data-i18n="qaClearLineupTitle">ล้างตัวละครในทีม</div>
<div style="font-size: 0.725rem; opacity: 0.85;" data-i18n="qaClearLineupDesc">เคลียร์ทุกช่องเพื่อจัดทีมใหม่</div>
</div>
</button>
</div>
</div>
@@ -599,8 +649,8 @@
</div>
</div>
<div style="display: flex; gap: 0.75rem; align-items: center;">
<input type="range" id="range-char-energy" min="0" max="140" value="140" class="skill-range" style="flex: 1;">
<span id="val-char-energy" style="font-weight: 800; font-family: monospace; min-width: 60px; text-align: right;">140/140</span>
<input type="range" id="range-char-energy" min="0" max="140" value="70" class="skill-range" style="flex: 1;">
<span id="val-char-energy" style="font-weight: 800; font-family: monospace; min-width: 60px; text-align: right;">70/140</span>
</div>
</div>
</div>
+284 -24
View File
@@ -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) => {
+247
View File
@@ -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",