fix: match exact lineup, remove teleport tab and warp button, overhaul character build modal with offline/online interactive controls and 23 new character portraits

This commit is contained in:
CAtlas0784 committed 2026-10-16 22:53:35 +07:00
1 parent 372cdb55f1
commit 9ec9110905
30 files changed
+723 -551

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+21 -10
View File
@@ -541,31 +541,42 @@ body {
} }
.eidolon-pip { .eidolon-pip {
width: 25px; width: 28px;
height: 25px; height: 28px;
border-radius: 4px; border-radius: 6px;
border: 1px solid var(--border-color); border: 1.5px solid rgba(255, 255, 255, 0.2);
background: transparent; background: rgba(255, 255, 255, 0.05);
color: var(--text-muted); color: #cbd5e1;
font-size: 0.75rem; font-size: 0.8rem;
font-weight: 800; font-weight: 800;
cursor: pointer; cursor: pointer;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: var(--transition); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
user-select: none;
} }
.eidolon-pip:hover { .eidolon-pip:hover {
border-color: var(--accent-cyan); border-color: var(--accent-cyan);
color: var(--text-main); background: rgba(56, 189, 248, 0.15);
color: #fff;
transform: translateY(-2px);
} }
.eidolon-pip.active { .eidolon-pip.active {
background: linear-gradient(135deg, #0284c7, #38bdf8); background: linear-gradient(135deg, #0284c7, #38bdf8);
border-color: #38bdf8; border-color: #38bdf8;
color: #0b0d14; color: #0b0d14;
box-shadow: 0 0 10px rgba(56, 189, 248, 0.6); box-shadow: 0 0 12px rgba(56, 189, 248, 0.6);
font-weight: 900;
}
.modal-eidolon-pip {
width: 38px;
height: 38px;
font-size: 0.95rem;
border-radius: 8px;
} }
/* ========================================================================== /* ==========================================================================
+34 -68
View File
@@ -53,7 +53,6 @@
<button class="tab-btn" data-tab="tab-equipment">🗡️ กรวยแสง & รีลิกส์ (Equipment)</button> <button class="tab-btn" data-tab="tab-equipment">🗡️ กรวยแสง & รีลิกส์ (Equipment)</button>
<button class="tab-btn" data-tab="tab-persistent" id="tab-btn-persistent">💾 จัดการเซฟ GaC (Persistent)</button> <button class="tab-btn" data-tab="tab-persistent" id="tab-btn-persistent">💾 จัดการเซฟ GaC (Persistent)</button>
<button class="tab-btn" data-tab="tab-exrank">⚡ Ex-Rank (สกิลพิเศษ)</button> <button class="tab-btn" data-tab="tab-exrank">⚡ Ex-Rank (สกิลพิเศษ)</button>
<button class="tab-btn" data-tab="tab-teleport">🚀 วาร์ปฉาก (Teleport)</button>
<button class="tab-btn" data-tab="tab-json">📝 จัดการไฟล์ JSON</button> <button class="tab-btn" data-tab="tab-json">📝 จัดการไฟล์ JSON</button>
<button class="tab-btn" data-tab="tab-settings">⚙️ ตั้งค่า & ข้อมูลโหมด</button> <button class="tab-btn" data-tab="tab-settings">⚙️ ตั้งค่า & ข้อมูลโหมด</button>
</nav> </nav>
@@ -130,9 +129,6 @@
<button class="btn btn-gold" id="btn-quick-max-all"> <button class="btn btn-gold" id="btn-quick-max-all">
⭐ ปรับเลเวล 80 & ปลด E6 ตัวละครทั้งหมด (Max All) ⭐ ปรับเลเวล 80 & ปลด E6 ตัวละครทั้งหมด (Max All)
</button> </button>
<button class="btn btn-primary" id="btn-quick-warp-express">
🚂 วาร์ปกลับห้องรับรองรถไฟ Astral Express ทันที
</button>
<button class="btn btn-secondary" id="btn-quick-sync-persistent"> <button class="btn btn-secondary" id="btn-quick-sync-persistent">
💾 ซิงค์ข้อมูล Persistent / เซฟล่าสุด 💾 ซิงค์ข้อมูล Persistent / เซฟล่าสุด
</button> </button>
@@ -303,63 +299,7 @@
</div> </div>
</section> </section>
<!-- 6. Teleport Tab --> <!-- 6. JSON Management Tab -->
<section id="tab-teleport" class="tab-content">
<div class="grid-2">
<!-- Presets -->
<div class="card">
<div class="card-title">📍 จุดวาร์ปปลอดภัยยอดนิยม (Safe Presets)</div>
<p class="card-subtitle">คลิกจุดวาร์ปเพื่อย้ายฉากของผู้เล่นในไฟล์เซฟได้ทันที</p>
<div id="teleport-presets-list" style="display: flex; flex-direction: column; gap: 0.6rem;">
<!-- Rendered by JS -->
</div>
</div>
<!-- Custom Coordinate Warp -->
<div class="card">
<div class="card-title">🎯 กำหนดพิกัดวาร์ปเอง (Custom Teleport)</div>
<p class="card-subtitle">ใส่ PlaneID, FloorID และ EntryID ตามต้องการ</p>
<form id="form-custom-teleport">
<div class="grid-2" style="gap: 0.75rem;">
<div class="form-group">
<label class="form-label">Plane ID</label>
<input type="number" id="tp-plane" class="form-input" required placeholder="20001">
</div>
<div class="form-group">
<label class="form-label">Floor ID</label>
<input type="number" id="tp-floor" class="form-input" required placeholder="20001001">
</div>
</div>
<div class="form-group">
<label class="form-label">Entry ID</label>
<input type="number" id="tp-entry" class="form-input" required placeholder="2000101">
</div>
<div class="grid-3" style="gap: 0.75rem;">
<div class="form-group">
<label class="form-label">X</label>
<input type="number" id="tp-x" class="form-input" placeholder="0">
</div>
<div class="form-group">
<label class="form-label">Y</label>
<input type="number" id="tp-y" class="form-input" placeholder="0">
</div>
<div class="form-group">
<label class="form-label">Z</label>
<input type="number" id="tp-z" class="form-input" placeholder="0">
</div>
</div>
<button type="submit" class="btn btn-primary" style="width: 100%; margin-top: 0.5rem;">
🚀 ยืนยันการวาร์ป (Execute Teleport)
</button>
</form>
</div>
</div>
</section>
<!-- 7. JSON Management Tab -->
<section id="tab-json" class="tab-content"> <section id="tab-json" class="tab-content">
<div class="card"> <div class="card">
<div class="card-title" style="flex-wrap: wrap; gap: 0.75rem;"> <div class="card-title" style="flex-wrap: wrap; gap: 0.75rem;">
@@ -467,27 +407,53 @@
<div class="grid-2" style="gap: 1rem; margin-bottom: 1rem;"> <div class="grid-2" style="gap: 1rem; margin-bottom: 1rem;">
<div class="form-group"> <div class="form-group">
<label class="form-label">ระดับเลเวล (Level 1-80)</label> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.35rem;">
<label class="form-label" style="margin: 0;">ระดับเลเวล (Level 1-80)</label>
<div style="display: flex; gap: 0.25rem;">
<button type="button" class="btn btn-sm btn-secondary btn-lvl-preset" data-lvl="1" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">1</button>
<button type="button" class="btn btn-sm btn-secondary btn-lvl-preset" data-lvl="20" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">20</button>
<button type="button" class="btn btn-sm btn-secondary btn-lvl-preset" data-lvl="60" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">60</button>
<button type="button" class="btn btn-sm btn-secondary btn-lvl-preset" data-lvl="70" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">70</button>
<button type="button" class="btn btn-sm btn-primary btn-lvl-preset" data-lvl="80" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">80</button>
</div>
</div>
<input type="number" id="modal-char-level" class="form-input" min="1" max="80" value="80"> <input type="number" id="modal-char-level" class="form-input" min="1" max="80" value="80">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">การเลื่อนขั้น (Ascension 0-6)</label> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.35rem;">
<label class="form-label" style="margin: 0;">การเลื่อนขั้น (Ascension 0-6)</label>
<div style="display: flex; gap: 0.25rem;">
<button type="button" class="btn btn-sm btn-secondary btn-prom-preset" data-prom="0" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">0</button>
<button type="button" class="btn btn-sm btn-secondary btn-prom-preset" data-prom="3" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">3</button>
<button type="button" class="btn btn-sm btn-primary btn-prom-preset" data-prom="6" style="padding: 0.15rem 0.45rem; font-size: 0.75rem;">6</button>
</div>
</div>
<input type="number" id="modal-char-promotion" class="form-input" min="0" max="6" value="6"> <input type="number" id="modal-char-promotion" class="form-input" min="0" max="6" value="6">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">Eidolon (E0 - E6)</label> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.35rem;">
<div class="eidolon-buttons" id="modal-char-eidolon-btns" style="margin-top: 0.35rem;"> <label class="form-label" style="margin: 0;">Eidolon (E0 - E6)</label>
<div style="display: flex; gap: 0.4rem;">
<button type="button" class="btn btn-sm btn-secondary" id="btn-modal-quick-e0" style="padding: 0.2rem 0.6rem; font-size: 0.75rem;">
E0 (รีเซ็ต)
</button>
<button type="button" class="btn btn-sm btn-gold" id="btn-modal-quick-e6" style="padding: 0.2rem 0.6rem; font-size: 0.75rem;">
⭐ ปลด E6 เต็ม
</button>
</div>
</div>
<div class="eidolon-buttons" id="modal-char-eidolon-btns" style="margin-top: 0.5rem; gap: 0.5rem;">
<!-- Injected pips --> <!-- Injected pips -->
</div> </div>
</div> </div>
<div style="display: flex; gap: 0.75rem; margin-top: 1.5rem; justify-content: flex-end;"> <div style="display: flex; gap: 0.75rem; margin-top: 1.5rem; justify-content: flex-end; flex-wrap: wrap;">
<button class="btn btn-gold" id="btn-modal-max-skills"> <button type="button" class="btn btn-gold" id="btn-modal-max-skills">
⭐ อัพสกิล & Traces ทั้งหมด (10/10) ⭐ อัพสกิล & Traces ทั้งหมด (10/10)
</button> </button>
<button class="btn btn-success" id="btn-modal-save-avatar"> <button type="button" class="btn btn-success" id="btn-modal-save-avatar">
💾 บันทึกตัวละคร 💾 บันทึกตัวละคร
</button> </button>
</div> </div>
+489 -328
View File
File diff suppressed because it is too large. Load diff
+138
View File
@@ -534,6 +534,144 @@ export const AVATAR_METADATA = {
path: "Remembrance", path: "Remembrance",
element: "Wind", element: "Wind",
rarity: 5 rarity: 5
},
1014: {
names: { en: "Saber", th: "Saber (เซเบอร์)", "zh-CN": "阿尔托莉雅·潘德拉贡 (塞巴)", "zh-TW": "阿爾托莉雅·潘德拉貢", ja: "セイバー", ko: "세이버", ru: "Сэйбер" },
path: "Destruction",
element: "Wind",
rarity: 5
},
1015: {
names: { en: "Archer", th: "Archer (อาร์เชอร์)", "zh-CN": "卫宫士郎 (红A/阿茶)", "zh-TW": "衛宮士郎 (紅A)", ja: "アーチャー", ko: "아처", ru: "Арчер" },
path: "Hunt",
element: "Quantum",
rarity: 5
},
1321: {
names: { en: "Dahlia", th: "Dahlia (ดาเลีย)", "zh-CN": "达莉亚", "zh-TW": "達莉亞", ja: "ダリア", ko: "달리아", ru: "Далия" },
path: "Nihility",
element: "Fire",
rarity: 5
},
1406: {
names: { en: "Cipher", th: "Cipher (ไซเฟอร์)", "zh-CN": "赛弗", "zh-TW": "賽弗", ja: "サイファー", ko: "사이퍼", ru: "Сайфер" },
path: "Nihility",
element: "Quantum",
rarity: 5
},
1412: {
names: { en: "Cerydra", th: "Cerydra (เซอรีดรา)", "zh-CN": "塞利德拉", "zh-TW": "塞利德拉", ja: "セリドラ", ko: "세리드라", ru: "Серидра" },
path: "Harmony",
element: "Wind",
rarity: 5
},
1413: {
names: { en: "Evernight", th: "Evernight (เอเวอร์ไนท์)", "zh-CN": "永夜", "zh-TW": "永夜", ja: "エバーナイト", ko: "에버나이트", ru: "Эвернайт" },
path: "Remembrance",
element: "Ice",
rarity: 5
},
1414: {
names: { en: "Dan Heng • Permeating Thunder", th: "Dan Heng PT (ดันเฮงร่างใหม่)", "zh-CN": "丹恒·行者", "zh-TW": "丹恆·行者", ja: "丹恒・行者", ko: "단항·행자", ru: "Дань Хэн • Странник" },
path: "Preservation",
element: "Physical",
rarity: 5
},
1415: {
names: { en: "Cyrene", th: "Cyrene (ซีรีน)", "zh-CN": "赛琳", "zh-TW": "賽琳", ja: "サイリーン", ko: "키레네", ru: "Кирена" },
path: "Remembrance",
element: "Ice",
rarity: 5
},
1501: {
names: { en: "Sparxie", th: "Sparxie (สปาร์กซี่)", "zh-CN": "斯帕克茜", "zh-TW": "斯帕克茜", ja: "スパーキー", ko: "스팍시", ru: "Спаркси" },
path: "Elation",
element: "Fire",
rarity: 5
},
1502: {
names: { en: "Yaoguang", th: "Yaoguang (เย่ากวง)", "zh-CN": "瑶光", "zh-TW": "瑤光", ja: "瑤光", ko: "요광", ru: "Яогуан" },
path: "Elation",
element: "Physical",
rarity: 5
},
1503: {
names: { en: "Pearl", th: "Pearl (เพิร์ล)", "zh-CN": "佩尔 (Pearl)", "zh-TW": "佩爾", ja: "パール", ko: "펄", ru: "Перл" },
path: "Elation",
element: "Ice",
rarity: 5
},
1504: {
names: { en: "Ashveil", th: "Ashveil (แอชเวล)", "zh-CN": "灰纱", "zh-TW": "灰紗", ja: "アッシュヴェイル", ko: "애쉬베일", ru: "Эшвейл" },
path: "Hunt",
element: "Lightning",
rarity: 5
},
1505: {
names: { en: "Evanescia", th: "Evanescia (เอวาเนสเซีย)", "zh-CN": "埃瓦内西亚", "zh-TW": "埃瓦內西亞", ja: "エヴァネシア", ko: "에바네시아", ru: "Эванесия" },
path: "Elation",
element: "Physical",
rarity: 5
},
1506: {
names: { en: "Silver Wolf Lv.999", th: "Silver Wolf Lv.999 (ซิลเวอร์วูล์ฟ Lv.999)", "zh-CN": "银狼 Lv.999", "zh-TW": "銀狼 Lv.999", ja: "銀狼 Lv.999", ko: "은랑 Lv.999", ru: "Серебряный Волк Lv.999" },
path: "Elation",
element: "Imaginary",
rarity: 5
},
1507: {
names: { en: "Mortenax Blade", th: "Mortenax Blade (มอร์เทแนกซ์ เบลด)", "zh-CN": "摩天之刃", "zh-TW": "摩天之刃", ja: "摩天の刃", ko: "모르테낙스 블레이드", ru: "Мортенакс Блейд" },
path: "Nihility",
element: "Fire",
rarity: 5
},
1508: {
names: { en: "Tohsaka Rin", th: "Tohsaka Rin (โทซากะ ริน)", "zh-CN": "远坂凛", "zh-TW": "遠坂凜", ja: "遠坂凛", ko: "토오사카 린", ru: "Рин Тосака" },
path: "Erudition",
element: "Quantum",
rarity: 5
},
1509: {
names: { en: "Gilgamesh", th: "Gilgamesh (กิลกาเมช)", "zh-CN": "吉尔伽美什 (金闪闪)", "zh-TW": "吉爾伽美什", ja: "ギルガメッシュ", ko: "길가메시", ru: "Гильгамеш" },
path: "Destruction",
element: "Lightning",
rarity: 5
},
1510: {
names: { en: "Himeko Nova", th: "Himeko Nova (ฮิเมโกะ โนวา)", "zh-CN": "姬子·新星", "zh-TW": "姬子·新星", ja: "姫子・ノヴァ", ko: "히메코 노바", ru: "Химеко Нова" },
path: "Erudition",
element: "Fire",
rarity: 5
},
1511: {
names: { en: "Nihilux", th: "Nihilux (นิฮิลักซ์)", "zh-CN": "虚无之神·尼希卢克斯", "zh-TW": "虛無之神·尼希盧克斯", ja: "ニヒラックス", ko: "니힐룩스", ru: "Нихилюкс" },
path: "Elation",
element: "Quantum",
rarity: 5
},
1512: {
names: { en: "Robin • Summeretto", th: "Robin • Summeretto (โรบิน ซัมเมอร์)", "zh-CN": "知更鸟·夏日", "zh-TW": "知更鳥·夏日", ja: "ロビン・サマー", ko: "로빈·서머", ru: "Зарянка • Лето" },
path: "Remembrance",
element: "Wind",
rarity: 5
},
1513: {
names: { en: "Aventurine • Waveflair", th: "Aventurine • Waveflair (อเวนทูรีน คลื่นทะเล)", "zh-CN": "砂金·夏日浪潮", "zh-TW": "砂金·夏日浪潮", ja: "アベンチュリン・サマー", ko: "어벤츄린·웨이브", ru: "Авантюрин • Волна" },
path: "Elation",
element: "Quantum",
rarity: 5
},
8009: {
names: { en: "Trailblazer (Elation ♂)", th: "ผู้บุกเบิก (ปีติ ♂)", "zh-CN": "开拓者 (欢愉 ♂)", "zh-TW": "開拓者 (歡愉 ♂)", ja: "開拓者 (愉悦 ♂)", ko: "개척자 (환락 ♂)", ru: "Первопроходец (Радость ♂)" },
path: "Elation",
element: "Lightning",
rarity: 5
},
8010: {
names: { en: "Trailblazer (Elation ♀)", th: "ผู้บุกเบิก (ปีติ ♀)", "zh-CN": "开拓者 (欢愉 ♀)", "zh-TW": "開拓者 (歡愉 ♀)", ja: "開拓者 (愉悦 ♀)", ko: "개척자 (환락 ♀)", ru: "Первопроходец (Радость ♀)" },
path: "Elation",
element: "Lightning",
rarity: 5
} }
}; };
+26 -13
View File
@@ -119,7 +119,8 @@ export const TRANSLATIONS = {
Preservation: "อนุรักษ์", Preservation: "อนุรักษ์",
Abundance: "เฟื่องฟู", Abundance: "เฟื่องฟู",
Remembrance: "ความทรงจำ", Remembrance: "ความทรงจำ",
Unknown: "ไม่ระบุ" Unknown: "ไม่ระบุ",
Elation: "ปีติ (Elation)"
} }
}, },
@@ -215,7 +216,8 @@ export const TRANSLATIONS = {
Preservation: "Preservation", Preservation: "Preservation",
Abundance: "Abundance", Abundance: "Abundance",
Remembrance: "Remembrance", Remembrance: "Remembrance",
Unknown: "Unknown" Unknown: "Unknown",
Elation: "Elation"
} }
}, },
@@ -311,7 +313,8 @@ export const TRANSLATIONS = {
Preservation: "存护", Preservation: "存护",
Abundance: "丰饶", Abundance: "丰饶",
Remembrance: "记忆", Remembrance: "记忆",
Unknown: "未知" Unknown: "未知",
Elation: "欢愉"
} }
}, },
@@ -407,7 +410,8 @@ export const TRANSLATIONS = {
Preservation: "存護", Preservation: "存護",
Abundance: "豐饒", Abundance: "豐饒",
Remembrance: "記憶", Remembrance: "記憶",
Unknown: "未知" Unknown: "未知",
Elation: "歡愉"
} }
}, },
@@ -503,7 +507,8 @@ export const TRANSLATIONS = {
Preservation: "存護", Preservation: "存護",
Abundance: "豊穣", Abundance: "豊穣",
Remembrance: "記憶", Remembrance: "記憶",
Unknown: "不明" Unknown: "不明",
Elation: "愉悦"
} }
}, },
@@ -599,7 +604,8 @@ export const TRANSLATIONS = {
Preservation: "보존", Preservation: "보존",
Abundance: "풍요", Abundance: "풍요",
Remembrance: "기억", Remembrance: "기억",
Unknown: "알 수 없음" Unknown: "알 수 없음",
Elation: "환락"
} }
}, },
@@ -695,7 +701,8 @@ export const TRANSLATIONS = {
Preservation: "Bảo Hộ", Preservation: "Bảo Hộ",
Abundance: "Trù Phú", Abundance: "Trù Phú",
Remembrance: "Ký Ức", Remembrance: "Ký Ức",
Unknown: "Không xác định" Unknown: "Không xác định",
Elation: "Vui Vẻ"
} }
}, },
@@ -791,7 +798,8 @@ export const TRANSLATIONS = {
Preservation: "Pelestarian", Preservation: "Pelestarian",
Abundance: "Kelimpahan", Abundance: "Kelimpahan",
Remembrance: "Ingatan", Remembrance: "Ingatan",
Unknown: "Tidak Diketahui" Unknown: "Tidak Diketahui",
Elation: "Kegembiraan"
} }
}, },
@@ -887,7 +895,8 @@ export const TRANSLATIONS = {
Preservation: "Conservación", Preservation: "Conservación",
Abundance: "Abundancia", Abundance: "Abundancia",
Remembrance: "Reminiscencia", Remembrance: "Reminiscencia",
Unknown: "Desconocido" Unknown: "Desconocido",
Elation: "Exultación"
} }
}, },
@@ -983,7 +992,8 @@ export const TRANSLATIONS = {
Preservation: "Préservation", Preservation: "Préservation",
Abundance: "Abondance", Abundance: "Abondance",
Remembrance: "Souvenir", Remembrance: "Souvenir",
Unknown: "Inconnu" Unknown: "Inconnu",
Elation: "Allégresse"
} }
}, },
@@ -1079,7 +1089,8 @@ export const TRANSLATIONS = {
Preservation: "Bewahrung", Preservation: "Bewahrung",
Abundance: "Überfluss", Abundance: "Überfluss",
Remembrance: "Erinnerung", Remembrance: "Erinnerung",
Unknown: "Unbekannt" Unknown: "Unbekannt",
Elation: "Frohsinn"
} }
}, },
@@ -1175,7 +1186,8 @@ export const TRANSLATIONS = {
Preservation: "Сохранение", Preservation: "Сохранение",
Abundance: "Изобилие", Abundance: "Изобилие",
Remembrance: "Память", Remembrance: "Память",
Unknown: "Неизвестно" Unknown: "Неизвестно",
Elation: "Радость"
} }
}, },
@@ -1271,7 +1283,8 @@ export const TRANSLATIONS = {
Preservation: "Preservação", Preservation: "Preservação",
Abundance: "Abundância", Abundance: "Abundância",
Remembrance: "Recordação", Remembrance: "Recordação",
Unknown: "Desconhecido" Unknown: "Desconhecido",
Elation: "Alegria"
} }
} }
}; };
-128
View File
@@ -1,128 +0,0 @@
import { getCurrentLanguage } from './i18n.js';
export const PRESET_TELEPORTS = [
{
names: {
th: "Astral Express - ขบวนรถไฟแอสทรัล (ห้องรับรอง)",
en: "Astral Express - Parlor Car",
"zh-CN": "星穹列车 - 观景车厢",
"zh-TW": "星穹列車 - 觀景車廂",
ja: "星穹列車 - 客室",
ko: "은하열차 - 객실",
ru: "Звёздный экспресс - Общий вагон"
},
plane_id: 20001,
floor_id: 20001001,
entry_id: 2000101,
x: 0,
y: 0,
z: 0
},
{
names: {
th: "สถานีอวกาศ Herta - โซนควบคุมหลัก (Master Control Zone)",
en: "Herta Space Station - Master Control Zone",
"zh-CN": "空间站「黑塔」 - 主控舱段",
"zh-TW": "太空站「黑塔」 - 主控艙段",
ja: "宇宙ステーション「ヘルタ」 - 主制御部分",
ko: "우주정거장 「헤르타」 - 메인 컨트롤 구역",
ru: "Космическая станция «Герта» - Главная контрольная зона"
},
plane_id: 10001,
floor_id: 10001001,
entry_id: 1000101,
x: 0,
y: 0,
z: 0
},
{
names: {
th: "Jarilo-VI (Belobog) - เขตการปกครอง (Administrative District)",
en: "Jarilo-VI - Administrative District",
"zh-CN": "雅利洛-VI - 行政区",
"zh-TW": "雅利洛-VI - 行政區",
ja: "ヤリーロ-VI - 行政区",
ko: "야릴로-VI - 행정구역",
ru: "Ярило-VI - Административный район"
},
plane_id: 10101,
floor_id: 10101001,
entry_id: 1010101,
x: 10250,
y: 51,
z: 32670
},
{
names: {
th: "Jarilo-VI (Underworld) - เมือง Boulder (Boulder Town)",
en: "Jarilo-VI - Boulder Town",
"zh-CN": "雅利洛-VI - 磐岩镇",
"zh-TW": "雅利洛-VI - 磐岩鎮",
ja: "ヤリーロ-VI - ボルダータウン",
ko: "야릴로-VI - 볼더 타운",
ru: "Ярило-VI - Камнеград"
},
plane_id: 10102,
floor_id: 10102001,
entry_id: 1010201,
x: -20560,
y: -286,
z: 57320
},
{
names: {
th: "Xianzhou Luofu - ท่าเรือเรือบินดาวกลาง (Central Starskiff Haven)",
en: "Xianzhou Luofu - Central Starskiff Haven",
"zh-CN": "仙舟「罗浮」 - 星槎海中枢",
"zh-TW": "仙舟「羅浮」 - 星槎海中樞",
ja: "仙舟「羅浮」 - 星槎海中枢",
ko: "선주 「나부」 - 별뗏목 바다 중추",
ru: "Сяньчжоу: Лофу - Центральная гавань Приюта звёздных яликов"
},
plane_id: 10202,
floor_id: 10202001,
entry_id: 1020201,
x: 8320,
y: -3486,
z: -25080
},
{
names: {
th: "Penacony - The Reverie (Dreamscape Hotel)",
en: "Penacony - The Reverie (Dreamscape)",
"zh-CN": "匹诺康尼 - 「白日梦」酒店-梦境",
"zh-TW": "匹諾康尼 - 「白日夢」飯店-夢境",
ja: "ピノコニー - 「レバリー」ホテル-夢境",
ko: "페나코니 - 「레버리」 호텔-꿈속",
ru: "Пенакония - Отель «Грёзы» (Мир грёз)"
},
plane_id: 10301,
floor_id: 10301001,
entry_id: 1030101,
x: 0,
y: 0,
z: 0
},
{
names: {
th: "Penacony - ชั่วโมงทอง (Golden Hour)",
en: "Penacony - Golden Hour",
"zh-CN": "匹诺康尼 - 黄金的时刻",
"zh-TW": "匹諾康尼 - 黃金的時刻",
ja: "ピノコニー - 黄金の刻",
ko: "페나코니 - 황금의 순간",
ru: "Пенакония - Золотой миг"
},
plane_id: 10302,
floor_id: 10302001,
entry_id: 1030201,
x: -3556,
y: 1539,
z: -378220
}
];
export function getTeleportName(preset, langOverride = null) {
const lang = langOverride || getCurrentLanguage();
return preset.names?.[lang] || preset.names?.en || preset.names?.th || "Teleport Point";
}
+15 -4
View File
@@ -8,7 +8,10 @@ const ids = [
1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112,
1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1217, 1218, 1220, 1221, 1222, 1223, 1225, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1217, 1218, 1220, 1221, 1222, 1223, 1225,
1005, 1006, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1312, 1313, 1314, 1315, 1317, 1005, 1006, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1312, 1313, 1314, 1315, 1317,
1401, 1402, 1403, 1404, 1405, 1407, 1408, 1409, 1410 1401, 1402, 1403, 1404, 1405, 1407, 1408, 1409, 1410,
1014, 1015, 1321, 1406, 1412, 1413, 1414, 1415,
1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513,
8009, 8010
]; ];
const targetDir = path.join(__dirname, '..', 'assets', 'avatars'); const targetDir = path.join(__dirname, '..', 'assets', 'avatars');
@@ -53,12 +56,20 @@ async function processId(id) {
ok = await fetchUrl(rawUrl, dest); ok = await fetchUrl(rawUrl, dest);
if (ok) return { id, status: 'ok (raw)' }; if (ok) return { id, status: 'ok (raw)' };
// Fallbacks for trailblazer female variants if not directly mapped // Fallbacks for special & collab variants
if ([8004, 8006, 8008].includes(id) && fs.existsSync(path.join(targetDir, '8002.png'))) { if (id === 1506 && fs.existsSync(path.join(targetDir, '1006.png'))) {
fs.copyFileSync(path.join(targetDir, '1006.png'), dest);
return { id, status: 'fallback 1006 (Silver Wolf)' };
}
if (id === 1511 && fs.existsSync(path.join(targetDir, '1308.png'))) {
fs.copyFileSync(path.join(targetDir, '1308.png'), dest);
return { id, status: 'fallback 1308 (Acheron)' };
}
if ([8004, 8006, 8008, 8010].includes(id) && fs.existsSync(path.join(targetDir, '8002.png'))) {
fs.copyFileSync(path.join(targetDir, '8002.png'), dest); fs.copyFileSync(path.join(targetDir, '8002.png'), dest);
return { id, status: 'fallback 8002' }; return { id, status: 'fallback 8002' };
} }
if ([8003, 8005, 8007].includes(id) && fs.existsSync(path.join(targetDir, '8001.png'))) { if ([8003, 8005, 8007, 8009].includes(id) && fs.existsSync(path.join(targetDir, '8001.png'))) {
fs.copyFileSync(path.join(targetDir, '8001.png'), dest); fs.copyFileSync(path.join(targetDir, '8001.png'), dest);
return { id, status: 'fallback 8001' }; return { id, status: 'fallback 8001' };
} }