Files
neon-survivors/js/i18n.js
T
neon-survivors-dev 796880375e NEON SURVIVORS v1.1 — full-featured bullet-heaven survivor game
Vanilla JS + Canvas, zero dependencies, offline-first PWA.

Gameplay:
- 11 weapons x8 levels + 11 evolutions (chest-based), incl. timed mines
- 13 passives, crit system with directional hit-sparks & hit-stop
- 10 characters w/ unique mods + unlock conditions, gold cosmetic skins
- 3 biomes (Neon Graveyard / Frozen Hollow / Magma Rift) each with own
  spawn tables, boss plans and music flavor; Endless mode + surges;
  4 difficulty grades; breakable crystal-lamp props
- Elite random affixes (Swift/Sturdy/Volatile), 4 bosses, win flow
- Achievements (23) w/ gold rewards, run history, daily seeded challenge

Tech:
- Cinematic canvas main-menu scene, game-feel FX suite (trails, muzzle,
  status tints, low-HP pulse), viewport culling + particle pooling
- WebAudio synth SFX + generative per-biome soundtrack
- Gamepad support, remappable keys, touch joystick, fullscreen
- i18n VI/EN, localStorage saves w/ export-import codes
- Cloudflare Workers leaderboard scaffold (KV) w/ signed submits
- Headless integrity test-suite (node test/integrity.js)
2026-08-23 07:01:22 +00:00

487 lines
22 KiB
JavaScript

'use strict';
/* ============================================================
NEON SURVIVORS — i18n.js : Vietnamese / English dictionaries
============================================================ */
const I18N = {
/* ============================ TIẾNG VIỆT ============================ */
vi: {
tagline: 'Sống sót giữa biển quái vật. Nâng cấp vũ khí. Tiến hóa. Hạ Tử Thần.',
btn_play: 'CHƠI NGAY',
btn_codex: 'Bách Khoa Toàn Thư',
btn_options: 'Tùy Chọn',
btn_resume: 'Tiếp Tục',
btn_restart: 'Chơi Lại',
btn_quitmenu: 'Về Menu Chính',
btn_continue: 'Tiếp Tục',
btn_start: 'Vào Trận',
scr_chars: 'Chọn Nhân Vật',
st_select: 'Chọn Màn Chơi',
st_endless: 'Chế độ Vô tận',
st_grade: 'Độ khó',
st_best: 'Kỷ lục',
st_graveyard: 'Nghĩa Địa Neon',
st_graveyard_d: 'Nơi bắt đầu. Nhịp quái chuẩn.',
st_frostcave: 'Hang Băng Vĩnh Cửu',
st_frostcave_d: 'Bóng ma sớm hơn, trùm dày hơn. HP +12%, vàng +25%.',
st_magmalands: 'Vực Magma',
st_magmalands_d: 'Địa ngục thật sự. HP +28%, vàng +50%.',
st_lock_frost: 'Mở khi đạt mốc 10 phút',
st_lock_magma: 'Mở khi thắng 1 ván',
toast_surge: '⚡ CƠN THỊNH NỘ ĐANG ĐẾN!',
toast_endless_on: '∞ Vô tận tiếp tục…',
prop_break: '+Vàng!',
en_lamp: 'Đèn Pha Lê',
cx_ach: 'Thành Tựu',
btn_daily: 'Thử Thách Hôm Nay',
btn_history: 'Lịch Sử',
btn_close: 'Đóng',
daily_best: 'Kỷ lục hôm nay',
toast_daily_record: '⚡ Kỷ lục daily mới!',
hist_empty: 'Chưa có ván nào — ra trận thôi!',
hist_run: 'Ván',
hist_win: 'THẮNG',
save_title: 'Chuyển Save',
save_copy: '📋 Sao chép',
save_import: '📥 Nhập',
save_bad: 'Mã không hợp lệ!',
save_ok: 'Đã nạp save! Đang tải lại…',
tut_move: 'Di chuyển để né — vũ khí tự bắn. Diệt quái để hút XP!',
tut_choose: 'Lên cấp! Chọn một nâng cấp bên dưới 👇',
tut_boss: '⚠️ TRÙM! Rất trâu — giữ khoảng cách và né đòn!',
scr_pause: 'TẠM DỪNG',
scr_over: 'BẠN ĐÃ GỤC NGÃ',
scr_win: 'CHIẾN THẮNG!',
tip_move: 'WASD / Phím mũi tên để di chuyển — vũ khí tấn công tự động.',
// Level up
lv_title: 'LÊN CẤP!',
lv_choose: 'Chọn một nâng cấp',
lv_reroll: '🎲 Bốc Lại ({n})',
lv_skip: 'Bỏ Qua (+{n} 🪙)',
// Chest
ch_evolved_title: '⚡ TIẾN HÓA! ⚡',
ch_loot_title: '🎁 RƯƠNG BÁU VẬT',
ch_gold: '+{n} vàng',
// End screen rows
es_time: 'Thời gian sống sót',
es_kills: 'Quái đã diệt',
es_gold: 'Vàng kiếm được',
es_level: 'Cấp độ đạt được',
es_best: 'Kỷ lục của bạn',
es_newrec: '✦ KỶ LỤC MỚI ✦',
// Options
opt_audio: 'Âm thanh',
opt_video: 'Hình ảnh',
opt_gameplay: 'Lối chơi',
opt_language: 'Ngôn ngữ / Language',
opt_controls: 'Điều khiển',
bind_up: 'Di chuyển lên', bind_down: 'Di chuyển xuống',
bind_left: 'Sang trái', bind_right: 'Sang phải',
bind_press: 'Nhấn phím…',
fullscreen: 'Toàn màn hình',
master: 'Âm lượng chung', music: 'Nhạc nền', sfx: 'Hiệu ứng âm thanh',
shake: 'Rung màn hình', dmgnum: 'Số sát thương nổi',
particles: 'Hiệu ứng hạt', fps: 'Hiện FPS',
autopause: 'Tự động tạm dừng khi mất tiêu điểm',
lang: 'Ngôn ngữ',
reset: '🗑️ Xóa toàn bộ dữ liệu lưu',
reset_confirm: 'Xóa TOÀN BỘ tiến trình, vàng và mở khóa?',
yes: 'Xóa hết!', no: 'Thôi',
q_low: 'Thấp', q_med: 'Vừa', q_high: 'Cao',
// Codex
cx_weapons: '⚔ Vũ Khí', cx_passives: '🔮 Vật Phẩm', cx_enemies: '👹 Quái Vật', cx_chars: '🧙 Nhân Vật',
cx_locked: 'Chưa mở khóa',
cx_maxed: 'Đã tối đa',
cx_evo: 'Tiến hóa khi đầy cấp + có "{p}", mở rương để kích hoạt',
cx_stats: 'HP {hp} · Sát thương {dm} · Tốc {sp}',
// Char stats
cstat_hp: 'HP', cstat_spd: 'Tốc độ', cstat_dmg: 'ST',
cond_free: 'Luôn sẵn sàng',
cond_kills500: 'Diệt tổng cộng 500 quái',
cond_time10: 'Sống sót đến phút 10',
cond_gold2000: 'Kiếm tổng cộng 2.000 vàng',
cond_boss1: 'Hạ trùm đầu tiên',
cond_time15: 'Sống sót đến phút 15',
cond_win: 'Thắng 1 ván bất kỳ',
cond_kills5000: 'Diệt tổng cộng 5.000 quái',
// Meta shop
ms_title: 'Nâng Cường Vĩnh Viễn',
ms_cost: 'Mua · {c} 🪙',
ms_max: 'ĐÃ TỐI ĐA',
ms_might: 'Cuồng Nộ', ms_might_d: '+5% sát thương mỗi cấp.',
ms_armor: 'Giáp Thân', ms_armor_d: '+1 giáp mỗi cấp (giảm sát thương nhận vào).',
ms_hp: 'Sinh Lực', ms_hp_d: '+10% HP tối đa mỗi cấp.',
ms_regen: 'Tái Tạo', ms_regen_d: '+0.3 HP/giây mỗi cấp.',
ms_spd: 'Thần Tốc', ms_spd_d: '+4% tốc chạy mỗi cấp.',
ms_luck: 'May Mắn', ms_luck_d: '+10% may mắn mỗi cấp (quái rơi đồ tốt hơn).',
ms_growth: 'Tuệ Tăng', ms_growth_d: '+6% kinh nghiệm mỗi cấp.',
ms_greed: 'Tham Lam', ms_greed_d: '+15% vàng nhặt được mỗi cấp.',
ms_cd: 'Định Độ', ms_cd_d: '-4% thời gian hồi chiêu mỗi cấp.',
ms_revive: 'Hồi Sinh', ms_revive_d: 'Hồi sinh 1 lần khi gục ngã, mỗi cấp.',
ms_reroll: 'Bốc Lại', ms_reroll_d: '+1 lượt bốc lại nâng cấp mỗi trận, mỗi cấp.',
ms_magnet: 'Nam Châm', ms_magnet_d: '+20% bán kính hút vật phẩm mỗi cấp.',
// Toasts
toast_boss: '☠ TRÙM XUẤT HIỆN ☠',
toast_elite: '⚠ Quái Tinh Anh xuất hiện!',
toast_revive: '✨ HỒI SINH! Đứng dậy và chiến đấu!',
toast_unlock: '🏆 Nhân vật mới: {c}',
// Developer mode
opt_dev: 'Chế độ nhà phát triển',
dev_hint: 'Bật để thấy nút 🔧 trong trận đấu.',
dev_title: 'CÔNG CỤ NHÀ PHÁT TRIỂN',
dev_gold: '💰 Vàng',
dev_level: '⬆️ Cấp độ',
dev_weapons: '⚔️ Vũ khí',
dev_passives: '🔮 Vật phẩm',
dev_cheats: '⚡ Gian lận',
dev_world: '🌍 Thế giới',
dev_meta: '👤 Meta',
dev_god: 'Bất tử',
dev_onehit: 'Một hit nổ',
dev_speed: 'Tốc độ game',
dev_nuke: '💥 Quét màn hình',
dev_magnet: '🧲 Hút hết đồ',
dev_heal: '❤️ Hồi đầy máu',
dev_killall: '💀 Diệt quái gần',
dev_skip1: '+1 phút',
dev_skip5: '+5 phút',
dev_spawn_elite: '👹 Spawn Tinh Anh',
dev_spawn_boss: '☠ Spawn Trùm:',
dev_unlockall: 'Mở khóa mọi nhân vật',
dev_add: '+1',
dev_maxb: 'MAX',
dev_get: 'NHẬN',
dev_set: 'Đặt',
// Weapon upgrade lines
up_dmg: '+{n} sát thương', up_n: '+{n} viên/diện tác động', up_cd: '{n}s hồi chiêu',
up_pierce: '+{n} lực xuyên', up_spd: 'Tăng tốc độ bay', up_area: 'Tăng diện tích',
up_dur: 'Tăng thời gian tồn tại', up_kb: 'Tăng đẩy lùi', up_misc: 'Nâng cấp sức mạnh',
new_weapon: 'Vũ khí mới!', new_passive: 'Vật phẩm mới!',
// ---- Weapons ----
w_wand: 'Đũa Phép', w_wand_d: 'Tự động bắn phép vào kẻ địch gần nhất.',
e_wand: 'Bão Thần Tín', e_wand_d: 'Trận mưa phép liên hồi, xuyên phá mọi thứ.',
w_whip: 'Roi Da', w_whip_d: 'Tự động quất roi về phía kẻ địch gần nhất.',
e_whip: 'Roi Máu', e_whip_d: 'Quất đồng thời cả hai phía, hút máu kẻ địch.',
w_knife: 'Phi Đao', w_knife_d: 'Phóng dao nhanh theo hướng di chuyển.',
e_knife: 'Ngàn Lưỡi Dao', e_knife_d: 'Vũ bão lưỡi dao xuyên phá hàng loạt.',
w_orb: 'Quả Cầu Bảo Vệ', w_orb_d: 'Các quả cầu quay quanh người bạn.',
e_orb: 'Vành Tân Tinh', e_orb_d: 'Vành đai cầu lớn, va chạm nổ tán xạ.',
w_axe: 'Rìu Chiến', w_axe_d: 'Ném rìu vòng cung cao, xuyên xuyên suốt, sát thương khủng.',
e_axe: 'Phán Quyết', e_axe_d: 'Mưa rìu khổng lồ xoáy tròn như lốc xoáy chết chóc.',
w_garlic: 'Hào Quang Thánh', w_garlic_d: 'Vùng thánh ánh sáng thiêu đốt quái vật xung quanh.',
e_garlic: 'Nuốt Linh Hồn', e_garlic_d: 'Hào quang khổng lồ, mỗi mạng quái hồi máu bạn.',
w_light: 'Thiên Lôi', w_light_d: 'Sét đánh ngẫu nhiên xuống kẻ địch.',
e_light: 'Cuồng Lôi Chiến', e_light_d: 'Sét dây chuyền, làm choáng cả vùng trời.',
w_fire: 'Cầu Lửa', w_fire_d: 'Quả cầu lửa nổ lan, để lại vệt cháy.',
e_fire: 'Địa Ngục Hỏa', e_fire_d: 'Đại nổ địa ngục, mặt đất cháy âm ỉ lâu dài.',
w_frost: 'Băng Tinh', w_frost_d: 'Mảnh băng xuyên qua, làm chậm kẻ địch.',
e_frost: 'Tuyệt Đối Không', e_frost_d: 'Đóng băng kẻ địch thành băng, vỡ tan thành nghìn mảnh.',
w_cross: 'Thánh Giá', w_cross_d: 'Chiếu bay ra rồi quay về, cứa mọi thứ trên đường.',
e_cross: 'Thiên Kiếm', e_cross_d: 'Thánh kiếm khổng lồ xoay tít, vô hạn xuyên phá.',
w_mine: 'Mìn Hẹn Giờ', w_mine_d: 'Rơi mìn phía sau; chạm vào hoặc hết giờ là NỔ TO.',
e_mine: 'Vườn Pháo Hoa', e_mine_d: 'Rải cả cụm mìn siêu lớn — mỗi quả một màn pháo.',
c_hana: 'Hana', c_hana_t: '+15% tỉ lệ chí mạng, +30% sát thương chí mạng',
c_bram: 'Bram', c_bram_t: '+20% diện tích, +10% HP, đi chậm hơn chút',
skin_base: 'Gốc',
skin_cycle: 'Đổi màu đã sở hữu',
ms_need_gold: 'Không đủ vàng!',
btn_board: 'Bảng Xếp Hạng',
lb_title: '🥇 Bảng Xếp Hạng',
lb_name: 'Tên hiển thị',
lb_server: 'Máy chủ (URL Worker)',
lb_empty: 'Chưa có điểm nào.',
lb_off: 'Chưa cấu hình máy chủ trong Tuỳ chọn.',
lb_sent: '📤 Đã gửi điểm!',
lb_fail: '⚠️ Gửi thất bại.',
lb_you: 'Bạn',
lb_scope_daily: '⚡ Hôm nay',
lb_time: 'Thời gian',
lb_score: 'Điểm',
// ---- Passives ----
p_might: 'Sức Mạnh', p_might_d: '+10% sát thương mỗi cấp.',
p_armor: 'Giáp Trận', p_armor_d: '-1 sát thương nhận vào mỗi cấp.',
p_hp: 'Tim Khổng Lồ', p_hp_d: '+20% HP tối đa mỗi cấp.',
p_regen: 'Hồi Phục', p_regen_d: '+0.6 HP/giây mỗi cấp.',
p_cd: 'Siêu Dẫn', p_cd_d: '-8% thời gian hồi chiêu mỗi cấp.',
p_area: 'Mở Rộng', p_area_d: '+12% tầm và diện tích mỗi cấp.',
p_spd: 'Viên Đạn Nhanh', p_spd_d: '+15% tốc độ đạn mỗi cấp.',
p_dur: 'Bền Bỉ', p_dur_d: '+15% thời gian hiệu ứng mỗi cấp.',
p_move: 'Giày Gió', p_move_d: '+10% tốc chạy mỗi cấp.',
p_mag: 'Nam Châm', p_mag_d: '+30% bán kính hút mỗi cấp.',
p_luck: 'May Mắn', p_luck_d: '+10% may mắn, +2% chí mạng mỗi cấp.',
p_greed: 'Tham Lam', p_greed_d: '+20% vàng nhặt được mỗi cấp.',
p_growth: 'Tuệ Tăng', p_growth_d: '+10% kinh nghiệm mỗi cấp.',
// ---- Characters ----
c_kaito: 'Kaito', c_kaito_t: 'Nhà mạo hiểm cân bằng: không buff, không điểm yếu.',
c_mira: 'Mira', c_mira_t: '+1 Giáp · +10% HP',
c_bolt: 'Bolt', c_bolt_t: '+12% tốc chạy · +15% tốc đạn',
c_luna: 'Luna', c_luna_t: '+18% diện tích · +10% hồi chiêu',
c_rook: 'Rook', c_rook_t: '+20% sát thương · -5% tốc chạy',
c_nyx: 'Nyx', c_nyx_t: '+0.4 HP/s · +40% nam châm',
c_sera: 'Sera', c_sera_t: '-12% hồi chiêu · +5% may mắn',
c_vane: 'Vane', c_vane_t: '+15% may mắn · +10% vàng',
// ---- Enemies ----
en_bat: 'Dơi Máu', en_zombie: 'Thây Ma', en_imp: 'Tiểu Quỷ',
en_arch: 'Cung Thủ Xương', en_brute: 'Cao Bồi Da Gai', en_ghost: 'Bóng Ma',
en_spit: 'Xạ Hỏa Quỷ', en_garg: 'Gar-gô-yl',
bn_wolf: '🐺 Sói Đầu Lớn', bn_lich: '💀 Pháp Sư Xương',
bn_behemoth: '👹 Quái Vật Địa Ngục', bn_death: '⚰ TỬ THẦN',
},
/* ============================ ENGLISH ============================ */
en: {
tagline: 'Survive the horde. Upgrade weapons. Evolve. Slay Death itself.',
btn_play: 'PLAY',
btn_codex: 'Codex',
btn_options: 'Options',
btn_resume: 'Resume',
btn_restart: 'Play Again',
btn_quitmenu: 'Main Menu',
btn_continue: 'Continue',
btn_start: 'START',
scr_chars: 'Choose Character',
st_select: 'Select Stage',
st_endless: 'Endless Mode',
st_grade: 'Difficulty Grade',
st_best: 'Best',
st_graveyard: 'Neon Graveyard',
st_graveyard_d: 'Where it all begins. Standard pace.',
st_frostcave: 'Frozen Hollow',
st_frostcave_d: 'Early ghosts, denser bosses. +12% HP, +25% gold.',
st_magmalands: 'Magma Rift',
st_magmalands_d: 'True hell. +28% HP, +50% gold.',
st_lock_frost: 'Unlocks at the 10-minute mark',
st_lock_magma: 'Unlocks after your first win',
toast_surge: '⚡ A SURGE IS COMING!',
toast_endless_on: '∞ Endless continues…',
prop_break: '+Gold!',
en_lamp: 'Crystal Lamp',
cx_ach: 'Achievements',
btn_daily: 'Daily Challenge',
btn_history: 'History',
btn_close: 'Close',
daily_best: "Today's best",
toast_daily_record: "⚡ New daily record!",
hist_empty: 'No runs yet — get out there!',
hist_run: 'Run',
hist_win: 'WIN',
save_title: 'Save Transfer',
save_copy: '📋 Copy',
save_import: '📥 Import',
save_bad: 'Invalid code!',
save_ok: 'Save loaded! Reloading…',
tut_move: 'Move to dodge — weapons fire automatically. Kill enemies to collect XP!',
tut_choose: 'Level up! Pick one upgrade below 👇',
tut_boss: '⚠️ BOSS! Very tanky — dodge and keep your distance!',
scr_pause: 'PAUSED',
scr_over: 'YOU HAVE FALLEN',
scr_win: 'VICTORY!',
tip_move: 'Move with WASD / Arrow keys — weapons fire automatically.',
lv_title: 'LEVEL UP!',
lv_choose: 'Pick one upgrade',
lv_reroll: '🎲 Reroll ({n})',
lv_skip: 'Skip (+{n} 🪙)',
ch_evolved_title: '⚡ EVOLUTION! ⚡',
ch_loot_title: '🎁 TREASURE CHEST',
ch_gold: '+{n} gold',
es_time: 'Time survived',
es_kills: 'Enemies slain',
es_gold: 'Gold earned',
es_level: 'Level reached',
es_best: 'Your best',
es_newrec: '✦ NEW RECORD ✦',
opt_audio: 'Audio',
opt_video: 'Video',
opt_gameplay: 'Gameplay',
opt_language: 'Language / Ngôn ngữ',
opt_controls: 'Controls',
bind_up: 'Move up', bind_down: 'Move down',
bind_left: 'Move left', bind_right: 'Move right',
bind_press: 'Press a key…',
fullscreen: 'Fullscreen',
master: 'Master volume', music: 'Music volume', sfx: 'SFX volume',
shake: 'Screen shake', dmgnum: 'Floating damage numbers',
particles: 'Particle effects', fps: 'Show FPS',
autopause: 'Auto-pause on focus loss',
lang: 'Language',
reset: '🗑️ Erase all saved data',
reset_confirm: 'Erase ALL progress, gold and unlocks?',
yes: 'Erase it!', no: 'Cancel',
q_low: 'Low', q_med: 'Med', q_high: 'High',
cx_weapons: '⚔ Weapons', cx_passives: '🔮 Items', cx_enemies: '👹 Monsters', cx_chars: '🧙 Heroes',
cx_locked: 'Locked',
cx_maxed: 'Maxed out',
cx_evo: 'Evolves at max level + owning "{p}". Open a chest to trigger',
cx_stats: 'HP {hp} · DMG {dm} · SPD {sp}',
cstat_hp: 'HP', cstat_spd: 'Speed', cstat_dmg: 'DMG',
cond_free: 'Always available',
cond_kills500: 'Slay 500 total enemies',
cond_time10: 'Survive to minute 10',
cond_gold2000: 'Earn 2,000 total gold',
cond_boss1: 'Defeat the first boss',
cond_time15: 'Survive to minute 15',
cond_win: 'Win any run',
cond_kills5000: 'Slay 5,000 total enemies',
ms_title: 'Permanent Upgrades',
ms_cost: 'Buy · {c} 🪙',
ms_max: 'MAXED OUT',
ms_might: 'Might', ms_might_d: '+5% damage per rank.',
ms_armor: 'Plating', ms_armor_d: '+1 armor per rank (reduces damage taken).',
ms_hp: 'Vitality', ms_hp_d: '+10% max HP per rank.',
ms_regen: 'Renewal', ms_regen_d: '+0.3 HP/sec per rank.',
ms_spd: 'Fleet Foot', ms_spd_d: '+4% move speed per rank.',
ms_luck: 'Fortune', ms_luck_d: '+10% luck per rank (better drops).',
ms_growth: 'Insight', ms_growth_d: '+6% experience per rank.',
ms_greed: 'Greed', ms_greed_d: '+15% gold picked up per rank.',
ms_cd: 'Overclock', ms_cd_d: '-4% weapon cooldown per rank.',
ms_revive: 'Second Wind', ms_revive_d: 'Revive once on death, per rank.',
ms_reroll: 'Rerolls', ms_reroll_d: '+1 upgrade reroll per run, per rank.',
ms_magnet: 'Attractor', ms_magnet_d: '+20% pickup radius per rank.',
toast_boss: '☠ BOSS INCOMING ☠',
toast_elite: '⚠ Elite monster appeared!',
toast_revive: '✨ REVIVED! Back to the fight!',
toast_unlock: '🏆 New character: {c}',
// Developer mode
opt_dev: 'Developer mode',
dev_hint: 'Enable to reveal the 🔧 tool in runs.',
dev_title: 'DEVELOPER TOOLS',
dev_gold: '💰 Gold',
dev_level: '⬆️ Level',
dev_weapons: '⚔️ Weapons',
dev_passives: '🔮 Items',
dev_cheats: '⚡ Cheats',
dev_world: '🌍 World',
dev_meta: '👤 Meta',
dev_god: 'God mode',
dev_onehit: 'One-hit kill',
dev_speed: 'Game speed',
dev_nuke: '💥 Screen nuke',
dev_magnet: '🧲 Vacuum pickups',
dev_heal: '❤️ Full heal',
dev_killall: '💀 Kill nearby',
dev_skip1: '+1 minute',
dev_skip5: '+5 minutes',
dev_spawn_elite: '👹 Spawn Elite',
dev_spawn_boss: '☠ Spawn Boss:',
dev_unlockall: 'Unlock all characters',
dev_add: '+1',
dev_maxb: 'MAX',
dev_get: 'GET',
dev_set: 'Set',
up_dmg: '+{n} damage', up_n: '+{n} projectile/instance', up_cd: '{n}s cooldown',
up_pierce: '+{n} pierce', up_spd: 'Faster projectiles', up_area: 'Bigger area',
up_dur: 'Longer duration', up_kb: 'More knockback', up_misc: 'Power improved',
new_weapon: 'New weapon!', new_passive: 'New item!',
w_wand: 'Magic Wand', w_wand_d: 'Fires bolts at the nearest enemy.',
e_wand: 'Holy Storm', e_wand_d: 'Relentless piercing bolt barrage.',
w_whip: 'Leather Whip', w_whip_d: 'Auto-swings toward the nearest enemy.',
e_whip: 'Bloodthirster', e_whip_d: 'Strikes both sides at once and lifesteals.',
w_knife: 'Thrown Knife', w_knife_d: 'Flings fast knives where you move.',
e_knife: 'Thousand Blades', e_knife_d: 'A storm of piercing blades.',
w_orb: 'Guard Orbs', w_orb_d: 'Orbs orbit around you.',
e_orb: 'Nova Ring', e_orb_d: 'Ring of huge orbs that burst into shrapnel.',
w_axe: 'Battle Axe', w_axe_d: 'High-arcing throw, pierces everything, huge damage.',
e_axe: 'Executioner', e_axe_d: 'A whirlwind of giant spinning axes.',
w_garlic: 'Holy Aura', w_garlic_d: 'Sacred light burns nearby monsters.',
e_garlic: 'Soul Eater', e_garlic_d: 'Massive aura; each kill heals you.',
w_light: 'Thunderbolt', w_light_d: 'Lightning strikes random enemies.',
e_light: 'Warstorm', e_light_d: 'Chain lightning that stuns the battlefield.',
w_fire: 'Fireball', w_fire_d: 'Exploding fireball leaving burning ground.',
e_fire: 'Hellfire', e_fire_d: 'Hellish blast; ground scorched far longer.',
w_frost: 'Frost Shard', w_frost_d: 'Piercing shard that slows enemies.',
e_frost: 'Absolute Zero', e_frost_d: 'Freezes enemies solid, shattering for bonus damage.',
w_cross: 'Holy Cross', w_cross_d: 'Flies out then returns, cutting everything en route.',
e_cross: 'Heaven\'s Edge', e_cross_d: 'A colossal spinning blade with infinite pierce.',
w_mine: 'Fuse Mines', w_mine_d: 'Drops mines behind you; contact or timer = BIG boom.',
e_mine: 'Firework Garden', e_mine_d: 'Scatters clusters of huge mines — each one a show.',
c_hana: 'Hana', c_hana_t: '+15% crit chance, +30% crit damage',
c_bram: 'Bram', c_bram_t: '+20% area, +10% HP, slightly slower',
skin_base: 'Default',
skin_cycle: 'Cycle owned colors',
ms_need_gold: 'Not enough gold!',
btn_board: 'Leaderboard',
lb_title: '🥇 Leaderboard',
lb_name: 'Display name',
lb_server: 'Server (Worker URL)',
lb_empty: 'No scores yet.',
lb_off: 'Server not configured in Options.',
lb_sent: '📤 Score submitted!',
lb_fail: '⚠️ Submit failed.',
lb_you: 'You',
lb_scope_daily: '⚡ Today',
lb_time: 'Time',
lb_score: 'Score',
p_might: 'Strength', p_might_d: '+10% damage per level.',
p_armor: 'Armor', p_armor_d: '-1 damage taken per level.',
p_hp: 'Giant Heart', p_hp_d: '+20% max HP per level.',
p_regen: 'Recovery', p_regen_d: '+0.6 HP/sec per level.',
p_cd: 'Superconductor', p_cd_d: '-8% weapon cooldown per level.',
p_area: 'Expansion', p_area_d: '+12% range and area per level.',
p_spd: 'Hypersonic', p_spd_d: '+15% projectile speed per level.',
p_dur: 'Persistence', p_dur_d: '+15% effect duration per level.',
p_move: 'Wind Shoes', p_move_d: '+10% move speed per level.',
p_mag: 'Magnet', p_mag_d: '+30% pickup radius per level.',
p_luck: 'Luck', p_luck_d: '+10% luck, +2% crit chance per level.',
p_greed: 'Greed', p_greed_d: '+20% gold gained per level.',
p_growth: 'Growth', p_growth_d: '+10% experience per level.',
c_kaito: 'Kaito', c_kaito_t: 'The adventurer — no buffs, no weakness.',
c_mira: 'Mira', c_mira_t: '+1 Armor · +10% HP',
c_bolt: 'Bolt', c_bolt_t: '+12% move speed · +15% proj speed',
c_luna: 'Luna', c_luna_t: '+18% area · +10% cooldown',
c_rook: 'Rook', c_rook_t: '+20% damage · -5% move speed',
c_nyx: 'Nyx', c_nyx_t: '+0.4 HP/s · +40% magnet',
c_sera: 'Sera', c_sera_t: '-12% cooldown · +5% luck',
c_vane: 'Vane', c_vane_t: '+15% luck · +10% gold',
en_bat: 'Blood Bat', en_zombie: 'Zombie', en_imp: 'Imp',
en_arch: 'Bone Archer', en_brute: 'Thug Brute', en_ghost: 'Wraith',
en_spit: 'Spitter', en_garg: 'Gargoyle',
bn_wolf: '🐺 Alpha Werewolf', bn_lich: '💀 Bone Lich',
bn_behemoth: '👹 Hell Behemoth', bn_death: '⚰ DEATH',
}};
/** Translate key with {var} substitution. */
function tr(key, vars) {
let lang = 'vi';
if (typeof Store !== 'undefined' && Store.data) lang = Store.data.settings.lang || 'vi';
const dict = I18N[lang] || I18N.vi;
let s = dict[key] || I18N.vi[key] || I18N.en[key] || key;
if (vars) for (const k in vars) s = s.split('{' + k + '}').join(String(vars[k]));
return s;
}
function currentLang() {
return (typeof Store !== 'undefined' && Store.data) ? (Store.data.settings.lang || 'vi') : 'vi';
}