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)
This commit is contained in:
+486
@@ -0,0 +1,486 @@
|
||||
'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';
|
||||
}
|
||||
Reference in New Issue
Block a user