- Graze slow-mo, perfect-wave FRENZY (x3 amber), ghost records, dynamic hunter titles - Daily Hub: 7-day login calendar, animated lucky wheel, boss chest keys, pet eggs with rarity tiers + pity counter and real stat perks - Seeded daily challenge (server-consistent modifiers, local top-5), hourly Golden Herd stampede, weekly Raid Colossus with damage tiers - Rebirth prestige with Ancient Gem permanent perk shop - Weapon mastery stars (+2%/level), bestiary milestone gems - Weekly season points with Bronze..Diamond rank badges - Shareable PNG result card on game over
302 lines
11 KiB
JavaScript
302 lines
11 KiB
JavaScript
/* Neon Rampage — i18n (EN / VI). Original strings. */
|
|
(function () {
|
|
'use strict';
|
|
|
|
var DICT = {
|
|
en: {
|
|
'menu.title': 'NEON RAMPAGE',
|
|
'menu.subtitle': 'Stone-age survival — dinosaur waves, alphas, cards & arena',
|
|
'menu.campaign': 'CAMPAIGN',
|
|
'menu.arena': 'ARENA (vs Bots)',
|
|
'menu.shop': 'SHOP',
|
|
'menu.heroes': 'HEROES',
|
|
'menu.rank': 'LEADERBOARD',
|
|
'menu.settings': 'SETTINGS',
|
|
'menu.howto': 'HOW TO PLAY',
|
|
'menu.coins': 'Coins',
|
|
'menu.bestScore': 'Best score',
|
|
'menu.bestWave': 'Best wave',
|
|
|
|
'how.title': 'How to play',
|
|
'how.move': 'Move — WASD / Arrows (or left stick)',
|
|
'how.aim': 'Aim — mouse (or right stick), hold to fire',
|
|
'how.ult': 'Ultimate — R when the nova is charged',
|
|
'how.bomb': 'Bomb — Q, wipes bullets & blasts everything',
|
|
'how.pause': 'Pause — P or Esc',
|
|
'how.onfire': 'Keep hunting to fill the fire bar and go ON FIRE: double damage for a few seconds. Hesitate too long and you hit the hangover.',
|
|
'how.cards': 'Clear a wave, pick 1 of 3 cards. An alpha dinosaur every 5th wave.',
|
|
'how.close': 'Back',
|
|
|
|
'shop.tabWeapons': 'WEAPONS',
|
|
'shop.tabHeroes': 'HEROES',
|
|
'shop.tabSkins': 'SKINS',
|
|
'shop.owned': 'OWNED',
|
|
'shop.buy': 'BUY',
|
|
'shop.equip': 'EQUIP',
|
|
'shop.equipped': 'EQUIPPED',
|
|
'shop.notEnough': 'Not enough coins',
|
|
'shop.bought': 'Purchased!',
|
|
'shop.locked': 'Locked',
|
|
'shop.bombs': 'Spare bombs',
|
|
|
|
'hero.talent': 'Talent',
|
|
'hero.statHp': 'HP',
|
|
'hero.statSpeed': 'Speed',
|
|
'hero.statDmg': 'Damage',
|
|
|
|
'hud.wave': 'WAVE',
|
|
'hud.left': 'left',
|
|
'hud.boss': 'TRÙM',
|
|
'hud.onFire': 'ON FIRE!',
|
|
'hud.ultReady': 'ULT READY [R]',
|
|
'hud.score': 'SCORE',
|
|
'hud.paused': 'PAUSED',
|
|
'hud.resume': 'RESUME',
|
|
'hud.quit': 'QUIT TO MENU',
|
|
|
|
'announce.wave': 'WAVE',
|
|
'announce.boss': 'ALPHA DINOSAUR INCOMING',
|
|
'announce.waveClear': 'WAVE CLEAR',
|
|
'announce.onFire': 'ON FIRE!',
|
|
'announce.hangover': 'HANGOVER…',
|
|
'announce.go': 'GO!',
|
|
|
|
'card.pickTitle': 'CHOOSE A CARD',
|
|
'card.pickHint': 'The next wave starts after you pick',
|
|
'card.rarityCommon': 'COMMON',
|
|
'card.rarityRare': 'RARE',
|
|
'card.rarityEpic': 'EPIC',
|
|
|
|
'over.title': 'YOU WERE EATEN',
|
|
'over.win': 'VICTORY!',
|
|
'over.score': 'Score',
|
|
'over.wave': 'Wave reached',
|
|
'over.kills': 'Kills',
|
|
'over.combo': 'Best combo',
|
|
'over.coinsEarned': 'Coins earned',
|
|
'over.newRecord': 'NEW RECORD!',
|
|
'over.retry': 'PLAY AGAIN',
|
|
'over.menu': 'MENU',
|
|
'over.revive': 'REVIVE',
|
|
'over.reviveHint': 'Revive once with full HP',
|
|
|
|
'arena.setup': 'ARENA SETUP',
|
|
'arena.bots': 'Bots',
|
|
'arena.target': 'Target kills',
|
|
'arena.start': 'FIGHT',
|
|
'arena.back': 'BACK',
|
|
'arena.you': 'YOU',
|
|
'arena.leader': 'FIRST TO {n} KILLS',
|
|
'arena.timeLeft': 'Time',
|
|
|
|
'set.title': 'SETTINGS',
|
|
'set.language': 'Language',
|
|
'set.sfx': 'SFX volume',
|
|
'set.music': 'Music volume',
|
|
'set.autofire': 'Auto-fire',
|
|
'set.autoaim': 'Auto-aim nearest (F)',
|
|
'menu.daily': 'Daily Hub',
|
|
'daily.title': '🎁 Daily Hub',
|
|
'daily.calendar': '📅 Login Calendar',
|
|
'daily.claim': 'Claim today',
|
|
'daily.claimed': 'Come back tomorrow!',
|
|
'daily.wheel': '🎡 Lucky Wheel (1 free spin / day)',
|
|
'daily.spin': 'SPIN',
|
|
'daily.spun': 'Next spin tomorrow',
|
|
'daily.chest': '🗝️ Treasure Chest',
|
|
'daily.open': 'Open chest',
|
|
'daily.nokey': 'Slay bosses to earn keys',
|
|
'daily.day': 'Day',
|
|
'chal.title': '🎯 Daily Challenge',
|
|
'chal.play': 'PLAY CHALLENGE',
|
|
'chal.best': "Today's best",
|
|
'raid.title': '⚔️ Weekly Raid Colossus',
|
|
'raid.play': 'ATTACK THE COLOSSUS',
|
|
'raid.my': 'Your damage',
|
|
'raid.pool': 'Pool',
|
|
'over.share': 'Share result',
|
|
'prest.title': '♻️ Rebirth — Ancient Gems',
|
|
'prest.go': 'REBIRTH NOW',
|
|
'set.onehit': 'One-hit mode (campaign)',
|
|
'set.shake': 'Screen shake',
|
|
'set.name': 'Player name',
|
|
'set.reset': 'Reset profile',
|
|
'set.resetConfirm': 'Erase all progress? This cannot be undone.',
|
|
'set.done': 'DONE',
|
|
|
|
'rank.title': 'LEADERBOARD',
|
|
'rank.colPlayer': 'Player',
|
|
'rank.colScore': 'Score',
|
|
'rank.colWave': 'Wave',
|
|
'rank.empty': 'No runs yet — go make a mess.',
|
|
|
|
'toast.notEnough': 'Not enough coins',
|
|
'toast.saved': 'Saved',
|
|
'common.ok': 'OK',
|
|
'common.cancel': 'CANCEL'
|
|
},
|
|
|
|
vi: {
|
|
'menu.title': 'NEON RAMPAGE',
|
|
'menu.subtitle': 'Sinh tồn thời tiền sử — khủng long, trùm, thẻ bài & đấu trường',
|
|
'menu.campaign': 'CHIẾN DỊCH',
|
|
'menu.arena': 'ĐẤU TRƯỜNG (vs Bot)',
|
|
'menu.shop': 'CỬA HÀNG',
|
|
'menu.heroes': 'TƯỚNG',
|
|
'menu.rank': 'BẢNG XẾP HẠNG',
|
|
'menu.settings': 'CÀI ĐẶT',
|
|
'menu.howto': 'HƯỚNG DẪN',
|
|
'menu.coins': 'Xu',
|
|
'menu.bestScore': 'Điểm cao nhất',
|
|
'menu.bestWave': 'Wave cao nhất',
|
|
|
|
'how.title': 'Cách chơi',
|
|
'how.move': 'Di chuyển — WASD / Phím mũi tên (hoặc trái cần)',
|
|
'how.aim': 'Ngắm — chuột (hoặc phải cần), giữ để bắn',
|
|
'how.ult': 'Chiêu cuối — R khi nổ tung đã đầy',
|
|
'how.bomb': 'Bom — Q, xoá đạn & nổ tung mọi thứ',
|
|
'how.pause': 'Tạm dừng — P hoặc Esc',
|
|
'how.onfire': 'Săn liên tục để đầy thanh lửa và bùng cháy ON FIRE: sát thương x2 vài giây. Nghỉ quá lâu sẽ dính đau đầu.',
|
|
'how.cards': 'Sống sót qua wave chọn 1 trong 3 thẻ. Mỗi wave 5 có KHỦNG LONG TRÙM.',
|
|
'how.close': 'Quay lại',
|
|
|
|
'shop.tabWeapons': 'SÚNG',
|
|
'shop.tabHeroes': 'TƯỚNG',
|
|
'shop.tabSkins': 'TRANG PHỤC',
|
|
'shop.owned': 'ĐÃ CÓ',
|
|
'shop.buy': 'MUA',
|
|
'shop.equip': 'TRANG BỊ',
|
|
'shop.equipped': 'ĐANG DÙNG',
|
|
'shop.notEnough': 'Không đủ xu',
|
|
'shop.bought': 'Đã mua!',
|
|
'shop.locked': 'Đã khoá',
|
|
'shop.bombs': 'Bom dự trữ',
|
|
|
|
'hero.talent': 'Năng lực',
|
|
'hero.statHp': 'Máu',
|
|
'hero.statSpeed': 'Tốc độ',
|
|
'hero.statDmg': 'Sát thương',
|
|
|
|
'hud.wave': 'WAVE',
|
|
'hud.left': 'còn lại',
|
|
'hud.boss': 'TRÙM',
|
|
'hud.onFire': 'BẮT LỬA!',
|
|
'hud.ultReady': 'CHIÊU CUỐI SẴN SÒNG [R]',
|
|
'hud.score': 'ĐIỂM',
|
|
'hud.paused': 'TẠM DỪNG',
|
|
'hud.resume': 'TIẾP TỤC',
|
|
'hud.quit': 'THOÁT VỀ MENU',
|
|
|
|
'announce.wave': 'WAVE',
|
|
'announce.boss': 'KHỦNG LONG TRÙM XUẤT HIỆN',
|
|
'announce.waveClear': 'WAVE SỐNG SÓT',
|
|
'announce.onFire': 'BẮT LỬA!',
|
|
'announce.hangover': 'ĐAU ĐẦU…',
|
|
'announce.go': 'CHIẾN!',
|
|
|
|
'card.pickTitle': 'CHỌN MỘT THẺ',
|
|
'card.pickHint': 'Wave mới bắt đầu sau khi bạn chọn',
|
|
'card.rarityCommon': 'THƯỜNG',
|
|
'card.rarityRare': 'QUÝ',
|
|
'card.rarityEpic': 'SỬ THI',
|
|
|
|
'over.title': 'BỊ NUỐT RỒI',
|
|
'over.win': 'CHIẾN THẮNG!',
|
|
'over.score': 'Điểm',
|
|
'over.wave': 'Wave đạt được',
|
|
'over.kills': 'Hạ gục',
|
|
'over.combo': 'Combo tốt nhất',
|
|
'over.coinsEarned': 'Xu kiếm được',
|
|
'over.newRecord': 'KỶ LỤC MỚI!',
|
|
'over.retry': 'CHƠI LẠI',
|
|
'over.menu': 'VỀ MENU',
|
|
'over.revive': 'HỒI SINH',
|
|
'over.reviveHint': 'Hồi sinh 1 lần với đầy máu',
|
|
|
|
'arena.setup': 'CHUẨN BỊ ĐẤU TRƯỜNG',
|
|
'arena.bots': 'Số bot',
|
|
'arena.target': 'Số hạ gục cần đạt',
|
|
'arena.start': 'CHIẾN THÔI',
|
|
'arena.back': 'QUAY LẠI',
|
|
'arena.you': 'BẠN',
|
|
'arena.leader': 'ĐẠT {n} HẠ GỤC ĐỂ THẮNG',
|
|
'arena.timeLeft': 'Thời gian',
|
|
|
|
'set.title': 'CÀI ĐẶT',
|
|
'set.language': 'Ngôn ngữ',
|
|
'set.sfx': 'Âm lượng hiệu ứng',
|
|
'set.music': 'Âm lượng nhạc',
|
|
'set.autofire': 'Tự động bắn',
|
|
'set.autoaim': 'Tự ngắm mục tiêu gần nhất (F)',
|
|
'menu.daily': 'Ưu đãi hôm nay',
|
|
'daily.title': '🎁 Ưu Đãi Hôm Nay',
|
|
'daily.calendar': '📅 Lịch Điểm Danh',
|
|
'daily.claim': 'Nhận thưởng hôm nay',
|
|
'daily.claimed': 'Mai quay lại nhé!',
|
|
'daily.wheel': '🎡 Vòng Quay May Mắn (1 lượt/ngày)',
|
|
'daily.spin': 'QUAY',
|
|
'daily.spun': 'Ngày mai quay tiếp',
|
|
'daily.chest': '🗝️ Rương Báu Vật',
|
|
'daily.open': 'Mở rương',
|
|
'daily.nokey': 'Diệt trùm để kiếm chìa khóa',
|
|
'daily.day': 'Ngày',
|
|
'chal.title': '🎯 Thử Thách Hôm Nay',
|
|
'chal.play': 'CHƠI THỬ THÁCH',
|
|
'chal.best': 'Kỷ lục hôm nay',
|
|
'raid.title': '⚔️ Koloss Raid Tuần',
|
|
'raid.play': 'TẤN CÔNG KOLOSS',
|
|
'raid.my': 'Sát thương của bạn',
|
|
'raid.pool': 'Máu bầy',
|
|
'over.share': 'Chia sẻ kết quả',
|
|
'prest.title': '♻️ Tái Sinh — Ngọc Xưa',
|
|
'prest.go': 'TÁI SINH NGAY',
|
|
'set.onehit': 'Chế độ một-hit (chiến dịch)',
|
|
'set.shake': 'Rung màn hình',
|
|
'set.name': 'Tên người chơi',
|
|
'set.reset': 'Xoá toàn bộ dữ liệu',
|
|
'set.resetConfirm': 'Xoá toàn bộ tiến trình? Không thể hoàn tác.',
|
|
'set.done': 'XONG',
|
|
|
|
'rank.title': 'BẢNG XẾP HẠNG',
|
|
'rank.colPlayer': 'Người chơi',
|
|
'rank.colScore': 'Điểm',
|
|
'rank.colWave': 'Wave',
|
|
'rank.empty': 'Chưa có lần nào — ra trận đi!',
|
|
|
|
'toast.notEnough': 'Không đủ xu',
|
|
'toast.saved': 'Đã lưu',
|
|
'common.ok': 'ĐỒNG Ý',
|
|
'common.cancel': 'HUỶ'
|
|
}
|
|
};
|
|
|
|
var US = (window.US = window.US || {});
|
|
var lang = 'en';
|
|
|
|
US.i18n = {
|
|
setLang: function (l) {
|
|
lang = DICT[l] ? l : 'en';
|
|
},
|
|
getLang: function () {
|
|
return lang;
|
|
},
|
|
t: function (key, vars) {
|
|
var s = (DICT[lang] && DICT[lang][key]) || DICT.en[key] || key;
|
|
if (vars) {
|
|
Object.keys(vars).forEach(function (k) {
|
|
s = s.replace('{' + k + '}', String(vars[k]));
|
|
});
|
|
}
|
|
return s;
|
|
},
|
|
// Apply to all elements carrying data-i18n="key"
|
|
apply: function () {
|
|
var els = document.querySelectorAll('[data-i18n]');
|
|
for (var i = 0; i < els.length; i++) {
|
|
els[i].textContent = US.i18n.t(els[i].getAttribute('data-i18n'));
|
|
}
|
|
document.documentElement.lang = lang;
|
|
}
|
|
};
|
|
})();
|