This commit is contained in:
Renan LE CARO 2025-04-11 09:36:31 +02:00
parent bf687c48ee
commit 8099ced71b
16 changed files with 2031 additions and 1937 deletions

View file

@ -28,8 +28,8 @@ Some upgrades currently are not really useful
# Changelog # Changelog
## To do ## To do
- rework unbounded to just add padding around bricks
- bricks attract balls - bricks attract balls
- rework unbounded to just add padding around bricks
## Done ## Done

298
dist/index.html vendored

File diff suppressed because one or more lines are too long

View file

@ -16,13 +16,13 @@ import {
sumOfValues, sumOfValues,
} from "./game_utils"; } from "./game_utils";
import { getHistory } from "./gameOver"; import { getHistory } from "./gameOver";
import {noCreative} from "./upgrades";
export function creativeMode(gameState: GameState) { export function creativeMode(gameState: GameState) {
return { return {
icon: icons["icon:creative"], icon: icons["icon:creative"],
text: t("lab.menu_entry"), text: t("lab.menu_entry"),
help: help:
// highScoreForMode("creative") ||
(getTotalScore() < creativeModeThreshold && (getTotalScore() < creativeModeThreshold &&
t("lab.unlocks_at", { score: creativeModeThreshold })) || t("lab.unlocks_at", { score: creativeModeThreshold })) ||
t("lab.help"), t("lab.help"),
@ -40,13 +40,6 @@ export async function openCreativeModePerksPicker() {
), ),
choice: Upgrade | Level | "reset" | void; choice: Upgrade | Level | "reset" | void;
let noCreative: PerkId[] = [
"extra_levels",
"shunt",
"one_more_choice",
"instant_upgrade",
];
while ( while (
(choice = await asyncAlert<Upgrade | Level | "reset">({ (choice = await asyncAlert<Upgrade | Level | "reset">({
title: t("lab.menu_entry"), title: t("lab.menu_entry"),

View file

@ -568,13 +568,13 @@ async function openSettingsMenu() {
actions.push({ actions.push({
icon: icons[languages.find((l) => l.value === getCurrentLang())?.levelName], icon: icons[languages.find((l) => l.value === getCurrentLang())?.levelName],
text: t("main_menu.language"), text: t("settings.language"),
help: t("main_menu.language_help"), help: t("settings.language_help"),
async value() { async value() {
const pick = await asyncAlert({ const pick = await asyncAlert({
title: t("main_menu.language"), title: t("settings.language"),
content: [ content: [
t("main_menu.language_help"), t("settings.language_help"),
...languages.map((l) => ({ ...l, icon: icons[l.levelName] })), ...languages.map((l) => ({ ...l, icon: icons[l.levelName] })),
], ],
allowClose: true, allowClose: true,
@ -607,8 +607,8 @@ async function openSettingsMenu() {
} }
actions.push({ actions.push({
icon: icons["icon:download"], icon: icons["icon:download"],
text: t("main_menu.download_save_file"), text: t("settings.download_save_file"),
help: t("main_menu.download_save_file_help"), help: t("settings.download_save_file_help"),
async value() { async value() {
const signedPayload = generateSaveFileContent(); const signedPayload = generateSaveFileContent();
@ -647,8 +647,8 @@ async function openSettingsMenu() {
actions.push({ actions.push({
icon: icons["icon:upload"], icon: icons["icon:upload"],
text: t("main_menu.load_save_file"), text: t("settings.load_save_file"),
help: t("main_menu.load_save_file_help"), help: t("settings.load_save_file_help"),
async value() { async value() {
if (!document.getElementById("save_file_picker")) { if (!document.getElementById("save_file_picker")) {
let input: HTMLInputElement = document.createElement("input"); let input: HTMLInputElement = document.createElement("input");
@ -705,20 +705,20 @@ async function openSettingsMenu() {
localStorage.setItem(key, localStorageContent[key]); localStorage.setItem(key, localStorageContent[key]);
} }
await asyncAlert({ await asyncAlert({
title: t("main_menu.save_file_loaded"), title: t("settings.save_file_loaded"),
content: [ content: [
t("main_menu.save_file_loaded_help"), t("settings.save_file_loaded_help"),
{ text: t("main_menu.save_file_loaded_ok") }, { text: t("settings.save_file_loaded_ok") },
], ],
}); });
window.location.reload(); window.location.reload();
} }
} catch (e: any) { } catch (e: any) {
await asyncAlert({ await asyncAlert({
title: t("main_menu.save_file_error"), title: t("settings.save_file_error"),
content: [ content: [
e.message, e.message,
{ text: t("main_menu.save_file_loaded_ok") }, { text: t("settings.save_file_loaded_ok") },
], ],
}); });
} }
@ -732,8 +732,8 @@ async function openSettingsMenu() {
actions.push({ actions.push({
icon: icons["icon:coins"], icon: icons["icon:coins"],
text: t("main_menu.max_coins", { max: getCurrentMaxCoins() }), text: t("settings.max_coins", { max: getCurrentMaxCoins() }),
help: t("main_menu.max_coins_help"), help: t("settings.max_coins_help"),
async value() { async value() {
cycleMaxCoins(); cycleMaxCoins();
await openSettingsMenu(); await openSettingsMenu();
@ -741,8 +741,8 @@ async function openSettingsMenu() {
}); });
actions.push({ actions.push({
icon: icons["icon:particles"], icon: icons["icon:particles"],
text: t("main_menu.max_particles", { max: getCurrentMaxParticles() }), text: t("settings.max_particles", { max: getCurrentMaxParticles() }),
help: t("main_menu.max_particles_help"), help: t("settings.max_particles_help"),
async value() { async value() {
cycleMaxParticles(); cycleMaxParticles();
await openSettingsMenu(); await openSettingsMenu();
@ -751,20 +751,20 @@ async function openSettingsMenu() {
actions.push({ actions.push({
icon: icons["icon:reset"], icon: icons["icon:reset"],
text: t("main_menu.reset"), text: t("settings.reset"),
help: t("main_menu.reset_help"), help: t("settings.reset_help"),
async value() { async value() {
if ( if (
await asyncAlert({ await asyncAlert({
title: t("main_menu.reset"), title: t("settings.reset"),
content: [ content: [
t("main_menu.reset_instruction"), t("settings.reset_instruction"),
{ {
text: t("main_menu.reset_confirm"), text: t("settings.reset_confirm"),
value: true, value: true,
}, },
{ {
text: t("main_menu.reset_cancel"), text: t("settings.reset_cancel"),
value: false, value: false,
}, },
], ],

View file

@ -281,7 +281,7 @@ export function getHistograms(gameState: GameState) {
if (runStats) { if (runStats) {
runStats = runStats =
`<p>${t("gameOver.stats.intro", { count: runsHistory.length - 1 })}</p>` + `<p>${t("gameOver.stats_intro", { count: runsHistory.length - 1 })}</p>` +
runStats; runStats;
} }
} catch (e) { } catch (e) {

View file

@ -16,15 +16,15 @@ import {
export function helpMenuEntry() { export function helpMenuEntry() {
return { return {
icon: icons["icon:help"], icon: icons["icon:help"],
text: t("main_menu.help_title"), text: t("help.title"),
help: t("main_menu.help_help"), help: t("help.help"),
async value() { async value() {
await asyncAlert({ await asyncAlert({
title: t("main_menu.help_title"), title: t("help.title"),
allowClose: true, allowClose: true,
content: [ content: [
miniMarkDown( miniMarkDown(
t("main_menu.help_content", { t("help.content", {
catchRateBest, catchRateBest,
catchRateGood, catchRateGood,
levelTimeBest, levelTimeBest,
@ -35,7 +35,7 @@ export function helpMenuEntry() {
wallBouncedGood, wallBouncedGood,
}), }),
), ),
miniMarkDown(t("main_menu.help_upgrades")), miniMarkDown(t("help.upgrades")),
...upgrades.map( ...upgrades.map(
(u) => ` (u) => `
<div class="upgrade used"> <div class="upgrade used">
@ -49,7 +49,7 @@ export function helpMenuEntry() {
${miniMarkDown(u.fullHelp)} ${miniMarkDown(u.fullHelp)}
`, `,
), ),
"<h2>" + t("main_menu.credit_levels") + "</h2>", "<h2>" + t("help.levels") + "</h2>",
...allLevels ...allLevels
.filter((l) => l.credit?.trim()) .filter((l) => l.credit?.trim())
.map( .map(

View file

@ -15,14 +15,19 @@
"gameOver.stats.combo_max": "أقصى مجموعة", "gameOver.stats.combo_max": "أقصى مجموعة",
"gameOver.stats.duration_per_level": "المدة لكل مستوى", "gameOver.stats.duration_per_level": "المدة لكل مستوى",
"gameOver.stats.hit_rate": "معدل الإصابة", "gameOver.stats.hit_rate": "معدل الإصابة",
"gameOver.stats.intro": "ابحث أدناه عن إحصائيات لعبتك مقارنةً بأفضل {{count}} ألعاب لديك.",
"gameOver.stats.level_reached": "المستوى الذي تم الوصول إليه", "gameOver.stats.level_reached": "المستوى الذي تم الوصول إليه",
"gameOver.stats.total_score": "مجموع النقاط", "gameOver.stats.total_score": "مجموع النقاط",
"gameOver.stats.upgrades_applied": "تم تطبيق الترقيات", "gameOver.stats.upgrades_applied": "تم تطبيق الترقيات",
"gameOver.stats_intro": "ابحث أدناه عن إحصائيات لعبتك مقارنةً بأفضل {{count}} ألعاب لديك.",
"gameOver.unlocked_perk": "تم إلغاء قفل الترقية", "gameOver.unlocked_perk": "تم إلغاء قفل الترقية",
"gameOver.unlocked_perk_plural": "لقد قمت للتو بفتح {{count}} من الامتيازات", "gameOver.unlocked_perk_plural": "لقد قمت للتو بفتح {{count}} من الامتيازات",
"gameOver.win.summary": "انتهت اللعبة. لقد جمعت {{score}} عملة.", "gameOver.win.summary": "انتهت اللعبة. لقد جمعت {{score}} عملة.",
"gameOver.win.title": "لقد أكملت هذه اللعبة", "gameOver.win.title": "لقد أكملت هذه اللعبة",
"help.content": "## الهدف\n\nاجمع أكبر عدد ممكن من العملات المعدنية خلال 7 مستويات.\n\nتظهر العملات المعدنية عند كسر الطوب.\n\nاجمعها بمجدافك لزيادة نقاطك.\n\nتظهر نقاطك في الزاوية العلوية اليمنى من الشاشة.\n\nلا تسقط الكرة وإلا ستنتهي اللعبة.\n\nبعد تدمير جميع الطوب، ستتمكن من اختيار ترقية.\n\n## الترقيات\n\nستُطبق الترقيات التي تختارها حتى نهاية الجولة.\n\nيمكن اختيار بعضها عدة مرات لتأثير أقوى.\n\nبعضها يُساعد في التصويب، أو يُسهّل اللعبة بطرق أخرى.\n\nبعضها لا يُفيد إلا عند دمجه.\n\nستحصل دائمًا على ترقية واحدة في بداية كل لعبة.\n\nسيكون رمزها بمثابة طوب المستوى الأول.\n\nيمكنك اختيار ترقيات البدء من الإعدادات.\n\nتؤثر العديد من الترقيات على مجموعتك.\n\n## المجموعة\n\n\"مجموعتك\" هي عدد العملات المعدنية التي تظهر عند كسر طوبة.\nيظهر ذلك على مجدافك، على سبيل المثال، x4 يعني أن كل مكعب سيُنتج 4 عملات.\n\nمعظم الترقيات التي تزيد من قوة المجموعة تُضيف شرطًا لإعادة ضبطها.\n\nكما يُعاد ضبط المجموعة إذا عادت الكرة إلى\n\nدون أن تصطدم بأي مكعب.\n\nستظهر رسالة \"خطأ\" عند حدوث ذلك.\n\nحاول التصويب نحو مكعب في كل مرة.\n\n## التصويب\n\nموضع الكرة على المجداف هو ما يُحدد كيفية ارتدادها.\n\nإذا اصطدمت الكرة بالمجداف في منتصفه تمامًا، سترتد عموديًا.\n\nإذا ضربت أكثر على جانب واحد، ستكون زاوية ارتدادها أكبر.\n\nلا تؤثر سرعة المجداف وزاوية دخوله على اتجاه الكرة بعد ارتدادها.\n\nيمكن فتح العديد من الترقيات التي تُساعد في التصويب.\n\n## الفتح\n\nعند لعب Breakout 71 لأول مرة، تكون معظم الترقيات والمستويات مقفلة.\n\nيتم فتح الترقيات بمجرد اللعب وجمع العديد من العملات.\nتُفتح المستويات الأولى عند تحقيق أعلى نتيجة.\n\nتُضيف المستويات اللاحقة شرطًا لاختيار المزايا.\n\nيصبح تحقيق أعلى النتائج أسهل بكثير عند حصولك على ترقيات متعددة بعد كل مستوى.\n\n## إعادة رمي النرد والترقيات المجانية\n\nستحصل على ترقية إضافية لاختيارها عند لعبك الجيد:\n\n- إكمال المستوى في أقل من {{levelTimeGood}} ثانية\n- ضرب الجوانب أو القمة أقل من {{wallBouncedGood}} مرة\n- التقاط {{catchRateGood}}% من العملات\n- تفويت الطوب أقل من {{missesGood}} مرات\n\nستحصل أيضًا على إعادة رمي نرد تتيح لك تخطي الترقيات إذا كان أداؤك أفضل:\n\n- إكمال المستوى في أقل من {{levelTimeBest}} ثانية\n- ضرب الجوانب أو القمة أقل من {{wallBouncedBest}} مرات\n- التقاط {{catchRateBest}}% من العملات\n- تفويت الطوب أقل من {{missesBest}} مرات\n\nيُتيح لك خيار في الإعدادات عرض هذه الإحصائيات",
"help.help": "تعرف على المزيد حول اللعبة",
"help.levels": "المستويات",
"help.title": "يساعد",
"help.upgrades": "## الترقيات",
"history.columns.score": "نتيجة", "history.columns.score": "نتيجة",
"history.columns.started": "تاريخ", "history.columns.started": "تاريخ",
"history.help": "شاهد أفضل ألعابك {{count}} .", "history.help": "شاهد أفضل ألعابك {{count}} .",
@ -45,73 +50,13 @@
"level_up.reroll": "إعادة الرمي ({{count}})", "level_up.reroll": "إعادة الرمي ({{count}})",
"level_up.reroll_help": "تقديم خيارات جديدة", "level_up.reroll_help": "تقديم خيارات جديدة",
"level_up.upgrade_perk_to_level": "المستوى {{level}}", "level_up.upgrade_perk_to_level": "المستوى {{level}}",
"main_menu.basic": "الرسومات الأساسية",
"main_menu.basic_help": "أداء أفضل.",
"main_menu.colorful_coins": "عملات معدنية ملونة",
"main_menu.colorful_coins_help": "تظهر العملات المعدنية دائمًا بلون الطوب",
"main_menu.comboIncreaseTexts": "إظهار +X باللون الذهبي",
"main_menu.comboIncreaseTexts_help": "عندما تزيد المجموعة",
"main_menu.contrast": "تباين عالي",
"main_menu.contrast_help": "تقديم أكثر ألوانًا وظلامًا",
"main_menu.credit_levels": "المستويات",
"main_menu.donate": "لقد لعبت لمدة {{hours}} ساعة", "main_menu.donate": "لقد لعبت لمدة {{hours}} ساعة",
"main_menu.donate_help": "ماذا عن التبرع؟ يمكنك إخفاء هذا التذكير في الإعدادات.", "main_menu.donate_help": "ماذا عن التبرع؟ يمكنك إخفاء هذا التذكير في الإعدادات.",
"main_menu.donation_reminder": "ذكّرني بالتبرع",
"main_menu.donation_reminder_help": "شاهد وقت اللعب ورابط التبرع في القائمة الرئيسية",
"main_menu.download_save_file": "تنزيل النتيجة والإحصائيات",
"main_menu.download_save_file_help": "احصل على ملف الحفظ",
"main_menu.extra_bright": "مشرق للغاية",
"main_menu.extra_bright_help": "يزيد من حجم الهالة حول العملات المعدنية والطوب.",
"main_menu.fullscreen": "تكبير الشاشة",
"main_menu.fullscreen_help": "ستحاول اللعبة الانتقال إلى وضع ملء الشاشة قبل البدء",
"main_menu.help_content": "## الهدف\n\nاجمع أكبر عدد ممكن من العملات المعدنية خلال 7 مستويات.\n\nتظهر العملات المعدنية عند كسر الطوب.\n\nاجمعها بمجدافك لزيادة نقاطك.\n\nتظهر نقاطك في الزاوية العلوية اليمنى من الشاشة.\n\nلا تسقط الكرة وإلا ستنتهي اللعبة.\n\nبعد تدمير جميع الطوب، ستتمكن من اختيار ترقية.\n\n## الترقيات\n\nستُطبق الترقيات التي تختارها حتى نهاية الجولة.\n\nيمكن اختيار بعضها عدة مرات لتأثير أقوى.\n\nبعضها يُساعد في التصويب، أو يُسهّل اللعبة بطرق أخرى.\n\nبعضها لا يُفيد إلا عند دمجه.\n\nستحصل دائمًا على ترقية واحدة في بداية كل لعبة.\n\nسيكون رمزها بمثابة طوب المستوى الأول.\n\nيمكنك اختيار ترقيات البدء من الإعدادات.\n\nتؤثر العديد من الترقيات على مجموعتك.\n\n## المجموعة\n\n\"مجموعتك\" هي عدد العملات المعدنية التي تظهر عند كسر طوبة.\nيظهر ذلك على مجدافك، على سبيل المثال، x4 يعني أن كل مكعب سيُنتج 4 عملات.\n\nمعظم الترقيات التي تزيد من قوة المجموعة تُضيف شرطًا لإعادة ضبطها.\n\nكما يُعاد ضبط المجموعة إذا عادت الكرة إلى\n\nدون أن تصطدم بأي مكعب.\n\nستظهر رسالة \"خطأ\" عند حدوث ذلك.\n\nحاول التصويب نحو مكعب في كل مرة.\n\n## التصويب\n\nموضع الكرة على المجداف هو ما يُحدد كيفية ارتدادها.\n\nإذا اصطدمت الكرة بالمجداف في منتصفه تمامًا، سترتد عموديًا.\n\nإذا ضربت أكثر على جانب واحد، ستكون زاوية ارتدادها أكبر.\n\nلا تؤثر سرعة المجداف وزاوية دخوله على اتجاه الكرة بعد ارتدادها.\n\nيمكن فتح العديد من الترقيات التي تُساعد في التصويب.\n\n## الفتح\n\nعند لعب Breakout 71 لأول مرة، تكون معظم الترقيات والمستويات مقفلة.\n\nيتم فتح الترقيات بمجرد اللعب وجمع العديد من العملات.\nتُفتح المستويات الأولى عند تحقيق أعلى نتيجة.\n\nتُضيف المستويات اللاحقة شرطًا لاختيار المزايا.\n\nيصبح تحقيق أعلى النتائج أسهل بكثير عند حصولك على ترقيات متعددة بعد كل مستوى.\n\n## إعادة رمي النرد والترقيات المجانية\n\nستحصل على ترقية إضافية لاختيارها عند لعبك الجيد:\n\n- إكمال المستوى في أقل من {{levelTimeGood}} ثانية\n- ضرب الجوانب أو القمة أقل من {{wallBouncedGood}} مرة\n- التقاط {{catchRateGood}}% من العملات\n- تفويت الطوب أقل من {{missesGood}} مرات\n\nستحصل أيضًا على إعادة رمي نرد تتيح لك تخطي الترقيات إذا كان أداؤك أفضل:\n\n- إكمال المستوى في أقل من {{levelTimeBest}} ثانية\n- ضرب الجوانب أو القمة أقل من {{wallBouncedBest}} مرات\n- التقاط {{catchRateBest}}% من العملات\n- تفويت الطوب أقل من {{missesBest}} مرات\n\nيُتيح لك خيار في الإعدادات عرض هذه الإحصائيات",
"main_menu.help_help": "تعرف على المزيد حول اللعبة",
"main_menu.help_title": "يساعد",
"main_menu.help_upgrades": "## الترقيات",
"main_menu.high_score": "أعلى نتيجة : {{score}}", "main_menu.high_score": "أعلى نتيجة : {{score}}",
"main_menu.kid": "وضع الأطفال",
"main_menu.kid_help": "ابدأ الألعاب المستقبلية بـ \"الكرة الأبطأ\".",
"main_menu.language": "لغة",
"main_menu.language_help": "اختر لغة اللعبة",
"main_menu.load_save_file": "تحميل ملف الحفظ",
"main_menu.load_save_file_help": "حدد ملف الحفظ على جهازك",
"main_menu.max_coins": " {{max}} عملات معدنية على الشاشة كحد أقصى",
"main_menu.max_coins_help": "تجميلي فقط، لا يؤثر على النتيجة",
"main_menu.max_particles": " {{max}} جسيمات كحد أقصى",
"main_menu.max_particles_help": "يحدد عدد الجسيمات التي تظهر على الشاشة للتأثير البصري.",
"main_menu.mobile": "الوضع المحمول",
"main_menu.mobile_help": "يترك مساحة تحت المجداف.",
"main_menu.normal": "لعبة جديدة", "main_menu.normal": "لعبة جديدة",
"main_menu.normal_help": "العب 7 مستويات مع ميزة البدء العشوائية", "main_menu.normal_help": "العب 7 مستويات مع ميزة البدء العشوائية",
"main_menu.pointer_lock": "قفل مؤشر الماوس",
"main_menu.pointer_lock_help": "يقوم بقفل وإخفاء مؤشر الماوس.",
"main_menu.record": "تسجيل مقاطع فيديو للعبة",
"main_menu.record_download": "تنزيل الفيديو ({{size}} ميجابايت)",
"main_menu.record_help": "احصل على فيديو لكل مستوى.",
"main_menu.red_miss": "تحذير ملكة جمال",
"main_menu.red_miss_help": "إظهار الجسيمات الحمراء حول الكرات التي تهبط دون إصابة.",
"main_menu.reset": "إعادة تعيين اللعبة",
"main_menu.reset_cancel": "لا",
"main_menu.reset_confirm": "نعم",
"main_menu.reset_help": "مسح أعلى الدرجات ووقت اللعب والإحصائيات",
"main_menu.reset_instruction": "سوف تفقد كل التقدم الذي أحرزته في اللعبة، هل أنت متأكد؟",
"main_menu.save_file_error": "خطأ في تحميل ملف الحفظ",
"main_menu.save_file_loaded": "حفظ الملف المحمّل",
"main_menu.save_file_loaded_help": "سيتم الآن إعادة تحميل التطبيق لتطبيق الحفظ الخاص بك",
"main_menu.save_file_loaded_ok": "نعم",
"main_menu.settings_help": "قم بتخصيص طريقة اللعب لتناسب احتياجاتك وذوقك", "main_menu.settings_help": "قم بتخصيص طريقة اللعب لتناسب احتياجاتك وذوقك",
"main_menu.settings_title": "إعدادات", "main_menu.settings_title": "إعدادات",
"main_menu.show_fps": "عداد FPS",
"main_menu.show_fps_help": "مراقبة أداء التطبيق",
"main_menu.show_stats": "عرض الإحصائيات في الوقت الحقيقي",
"main_menu.show_stats_help": "العملات المعدنية، الوقت، الارتدادات، الأخطاء",
"main_menu.sounds": "أصوات اللعبة",
"main_menu.sounds_help": "قد يؤدي إلى إبطاء بعض الهواتف.",
"main_menu.starting_perks": "امتيازات البداية",
"main_menu.starting_perks_checked": "عند بدء لعبة جديدة، ستُمنح إحدى هذه المزايا. انقر على أي ميزة لاستبعادها.",
"main_menu.starting_perks_full_random": "لقد تم إزالة جميع المزايا، وسيكون الاختيار عشوائيًا.",
"main_menu.starting_perks_help": "اختر الترقيات الأولية الممكنة",
"main_menu.starting_perks_unchecked": "لا يتم تقديم الامتيازات المذكورة أدناه كامتيازات ابتدائية، ولكن يمكنك النقر عليها لإضافتها إلى المجموعة.",
"main_menu.title": "الاختراق 71", "main_menu.title": "الاختراق 71",
"main_menu.unlocks": "المحتوى غير المقفل", "main_menu.unlocks": "المحتوى غير المقفل",
"main_menu.unlocks_help": "جرب الامتيازات والمستويات التي فتحتها", "main_menu.unlocks_help": "جرب الامتيازات والمستويات التي فتحتها",
@ -133,6 +78,61 @@
"score_panel.title": "{{score}} نقطة في المستوى {{level}}/{{max}} ", "score_panel.title": "{{score}} نقطة في المستوى {{level}}/{{max}} ",
"score_panel.upcoming_levels": "المستويات القادمة :", "score_panel.upcoming_levels": "المستويات القادمة :",
"score_panel.upgrades_picked": "الترقيات التي تم اختيارها في هذه اللعبة:", "score_panel.upgrades_picked": "الترقيات التي تم اختيارها في هذه اللعبة:",
"settings.basic": "الرسومات الأساسية",
"settings.basic_help": "أداء أفضل.",
"settings.colorful_coins": "عملات معدنية ملونة",
"settings.colorful_coins_help": "تظهر العملات المعدنية دائمًا بلون الطوب",
"settings.comboIncreaseTexts": "إظهار +X باللون الذهبي",
"settings.comboIncreaseTexts_help": "عندما تزيد المجموعة",
"settings.contrast": "تباين عالي",
"settings.contrast_help": "تقديم أكثر ألوانًا وظلامًا",
"settings.donation_reminder": "ذكّرني بالتبرع",
"settings.donation_reminder_help": "شاهد وقت اللعب ورابط التبرع في القائمة الرئيسية",
"settings.download_save_file": "تنزيل النتيجة والإحصائيات",
"settings.download_save_file_help": "احصل على ملف الحفظ",
"settings.extra_bright": "مشرق للغاية",
"settings.extra_bright_help": "يزيد من حجم الهالة حول العملات المعدنية والطوب.",
"settings.fullscreen": "تكبير الشاشة",
"settings.fullscreen_help": "ستحاول اللعبة الانتقال إلى وضع ملء الشاشة قبل البدء",
"settings.kid": "وضع الأطفال",
"settings.kid_help": "ابدأ الألعاب المستقبلية بـ \"الكرة الأبطأ\".",
"settings.language": "لغة",
"settings.language_help": "اختر لغة اللعبة",
"settings.load_save_file": "تحميل ملف الحفظ",
"settings.load_save_file_help": "حدد ملف الحفظ على جهازك",
"settings.max_coins": " {{max}} عملات معدنية على الشاشة كحد أقصى",
"settings.max_coins_help": "تجميلي فقط، لا يؤثر على النتيجة",
"settings.max_particles": " {{max}} جسيمات كحد أقصى",
"settings.max_particles_help": "يحدد عدد الجسيمات التي تظهر على الشاشة للتأثير البصري.",
"settings.mobile": "الوضع المحمول",
"settings.mobile_help": "يترك مساحة تحت المجداف.",
"settings.pointer_lock": "قفل مؤشر الماوس",
"settings.pointer_lock_help": "يقوم بقفل وإخفاء مؤشر الماوس.",
"settings.record": "تسجيل مقاطع فيديو للعبة",
"settings.record_download": "تنزيل الفيديو ({{size}} ميجابايت)",
"settings.record_help": "احصل على فيديو لكل مستوى.",
"settings.red_miss": "تحذير ملكة جمال",
"settings.red_miss_help": "إظهار الجسيمات الحمراء حول الكرات التي تهبط دون إصابة.",
"settings.reset": "إعادة تعيين اللعبة",
"settings.reset_cancel": "لا",
"settings.reset_confirm": "نعم",
"settings.reset_help": "مسح أعلى الدرجات ووقت اللعب والإحصائيات",
"settings.reset_instruction": "سوف تفقد كل التقدم الذي أحرزته في اللعبة، هل أنت متأكد؟",
"settings.save_file_error": "خطأ في تحميل ملف الحفظ",
"settings.save_file_loaded": "حفظ الملف المحمّل",
"settings.save_file_loaded_help": "سيتم الآن إعادة تحميل التطبيق لتطبيق الحفظ الخاص بك",
"settings.save_file_loaded_ok": "نعم",
"settings.show_fps": "عداد FPS",
"settings.show_fps_help": "مراقبة أداء التطبيق",
"settings.show_stats": "عرض الإحصائيات في الوقت الحقيقي",
"settings.show_stats_help": "العملات المعدنية، الوقت، الارتدادات، الأخطاء",
"settings.sounds": "أصوات اللعبة",
"settings.sounds_help": "قد يؤدي إلى إبطاء بعض الهواتف.",
"starting_perks.checked": "عند بدء لعبة جديدة، ستُمنح إحدى هذه المزايا. انقر على أي ميزة لاستبعادها.",
"starting_perks.help": "اختر الترقيات الأولية الممكنة",
"starting_perks.random": "لقد تم إزالة جميع المزايا، وسيكون الاختيار عشوائيًا.",
"starting_perks.title": "امتيازات البداية",
"starting_perks.unchecked": "لا يتم تقديم الامتيازات المذكورة أدناه كامتيازات ابتدائية، ولكن يمكنك النقر عليها لإضافتها إلى المجموعة.",
"unlocks.greyed_out_help": "يمكن فتح الترقيات غير المفعّلة بزيادة مجموع نقاطك. يزداد مجموع النقاط مع كل نقطة تُسجّلها في اللعبة.", "unlocks.greyed_out_help": "يمكن فتح الترقيات غير المفعّلة بزيادة مجموع نقاطك. يزداد مجموع النقاط مع كل نقطة تُسجّلها في اللعبة.",
"unlocks.intro": "مجموع نقاطك هو {{ts}}. تجد أدناه جميع الترقيات والمستويات التي تقدمها اللعبة. انقر على ترقية أو مستوى أدناه لبدء لعبة تجريبية بها.", "unlocks.intro": "مجموع نقاطك هو {{ts}}. تجد أدناه جميع الترقيات والمستويات التي تقدمها اللعبة. انقر على ترقية أو مستوى أدناه لبدء لعبة تجريبية بها.",
"unlocks.just_unlocked": "تم فتح المستوى", "unlocks.just_unlocked": "تم فتح المستوى",

File diff suppressed because it is too large Load diff

View file

@ -15,14 +15,19 @@
"gameOver.stats.combo_max": "Max combo", "gameOver.stats.combo_max": "Max combo",
"gameOver.stats.duration_per_level": "Duration per level", "gameOver.stats.duration_per_level": "Duration per level",
"gameOver.stats.hit_rate": "Hit rate", "gameOver.stats.hit_rate": "Hit rate",
"gameOver.stats.intro": "Find below your game statistics compared to your {{count}} best games.",
"gameOver.stats.level_reached": "Level reached", "gameOver.stats.level_reached": "Level reached",
"gameOver.stats.total_score": "Total score", "gameOver.stats.total_score": "Total score",
"gameOver.stats.upgrades_applied": "Upgrades applied", "gameOver.stats.upgrades_applied": "Upgrades applied",
"gameOver.stats_intro": "Find below your game statistics compared to your {{count}} best games.",
"gameOver.unlocked_perk": "Upgrade unlocked", "gameOver.unlocked_perk": "Upgrade unlocked",
"gameOver.unlocked_perk_plural": "You just unlocked {{count}} perks", "gameOver.unlocked_perk_plural": "You just unlocked {{count}} perks",
"gameOver.win.summary": "This game is over. You stashed {{score}} coins. ", "gameOver.win.summary": "This game is over. You stashed {{score}} coins. ",
"gameOver.win.title": "You completed this game", "gameOver.win.title": "You completed this game",
"help.content": "## Goal\n\nCatch as many coins as possible during 7 levels. \nCoins appear when you break bricks.\nCatch them with your paddle to increase your score.\nYour score is displayed in the top right corner of the screen.\nDon't drop the ball or it's game over.\n\nAfter destroying all bricks, you'll get to pick an upgrade.\n\n## Upgrades \n\nThe upgrades you pick will apply until the end of the run. \nSome can be picked multiple times for stronger effect.\nSome help with aiming, or make the game easier in some other ways. \nSome are only useful when combined.\n\nYou always get one upgrade at the beginning of each game. \nIts icon will serve as the bricks of the first level. \nYou can select starting upgrades in the settings.\n\nMany upgrades impact your combo. \n\n## Combo\n\nYour \"combo\" is the number of coins spawned when a brick breaks. \nIt is displayed on your paddle, for example x4 means each brick will spawn 4 coins. \nMost upgrades that increase the combo also add a condition to reset it. \nThe combo will also reset if the ball returns to the paddle without hitting any brick.\nA \"miss\" message will be shown when that happens. \n\nTry to aim towards a brick every time. \n\n## Aiming\n\nOnly the ball position on the paddle decides how it will bounce.\nIf the ball hits the paddle dead center, it will bounce back up vertically. \nIf you hit more on one side, it will have more angle. \nThe paddle speed and incoming angle have no impact on the ball direction after bouncing.\n\nMany upgrades that help with aiming can be unlocked.\n\n## Unlocks\n\nWhen playing Breakout 71 for the first time, most upgrades and levels are locked. \nUpgrades are unlocked by simply playing and catching many coins. \nThe first levels are unlocked by reaching a high score.\nLater levels add a condition about which perks you can select. \n\nReach high scores is much easier when you get multiple upgrades after each level. \n\n## Re-rolls and free upgrades\n\nYou'll get an extra upgrade to pick when you play well : \n\n- Clear the level under {{levelTimeGood}} seconds\n- Hit the sides or top less than {{wallBouncedGood}} times\n- Catch {{catchRateGood}}% of coins\n- Miss the bricks less than {{missesGood}} times \n\nYou will also get a re-roll that lets you skip upgrades if you do even better : \n\n- Clear a level under {{levelTimeBest}} seconds\n- Hit the sides or top less than {{wallBouncedBest}} times\n- Catch {{catchRateBest}}% of coins\n- Miss the bricks less than {{missesBest}} times \n\nAn option in the settings lets you display those statistics",
"help.help": "Learn more about the game",
"help.levels": "Levels",
"help.title": "Help",
"help.upgrades": "## Upgrades",
"history.columns.score": "Score", "history.columns.score": "Score",
"history.columns.started": "Date", "history.columns.started": "Date",
"history.help": "See your {{count}} best games.", "history.help": "See your {{count}} best games.",
@ -45,73 +50,13 @@
"level_up.reroll": "Re-roll ({{count}})", "level_up.reroll": "Re-roll ({{count}})",
"level_up.reroll_help": "Offer new choices", "level_up.reroll_help": "Offer new choices",
"level_up.upgrade_perk_to_level": " lvl {{level}}", "level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "Basic graphics",
"main_menu.basic_help": "Better performance.",
"main_menu.colorful_coins": "Colorful coins",
"main_menu.colorful_coins_help": "Coins always spawn of the color of the brick",
"main_menu.comboIncreaseTexts": "Show +X in gold",
"main_menu.comboIncreaseTexts_help": "When the combo increase",
"main_menu.contrast": "High Contrast",
"main_menu.contrast_help": "More colorful and dark rendering",
"main_menu.credit_levels": "Levels",
"main_menu.donate": "You've played for {{hours}} hours", "main_menu.donate": "You've played for {{hours}} hours",
"main_menu.donate_help": "How about donating? You can hide this reminder in the settings. ", "main_menu.donate_help": "How about donating? You can hide this reminder in the settings. ",
"main_menu.donation_reminder": "Remind me to donate",
"main_menu.donation_reminder_help": "See time played and donation link in main menu",
"main_menu.download_save_file": "Download score and stats",
"main_menu.download_save_file_help": "Get a save file",
"main_menu.extra_bright": "Extra bright",
"main_menu.extra_bright_help": "Increases the size of the halo around coins and bricks.",
"main_menu.fullscreen": "Fullscreen",
"main_menu.fullscreen_help": "Game will try to go full screen before starting",
"main_menu.help_content": "## Goal\n\nCatch as many coins as possible during 7 levels. \nCoins appear when you break bricks.\nCatch them with your paddle to increase your score.\nYour score is displayed in the top right corner of the screen.\nDon't drop the ball or it's game over.\n\nAfter destroying all bricks, you'll get to pick an upgrade.\n\n## Upgrades \n\nThe upgrades you pick will apply until the end of the run. \nSome can be picked multiple times for stronger effect.\nSome help with aiming, or make the game easier in some other ways. \nSome are only useful when combined.\n\nYou always get one upgrade at the beginning of each game. \nIts icon will serve as the bricks of the first level. \nYou can select starting upgrades in the settings.\n\nMany upgrades impact your combo. \n\n## Combo\n\nYour \"combo\" is the number of coins spawned when a brick breaks. \nIt is displayed on your paddle, for example x4 means each brick will spawn 4 coins. \nMost upgrades that increase the combo also add a condition to reset it. \nThe combo will also reset if the ball returns to the \n\n without hitting any brick.\nA \"miss\" message will be shown when that happens. \n\nTry to aim towards a brick every time. \n\n## Aiming\n\nOnly the ball position on the paddle decides how it will bounce.\nIf the ball hits the paddle dead center, it will bounce back up vertically. \nIf you hit more on one side, it will have more angle. \nThe paddle speed and incoming angle have no impact on the ball direction after bouncing.\n\nMany upgrades that help with aiming can be unlocked.\n\n## Unlocks\n\nWhen playing Breakout 71 for the first time, most upgrades and levels are locked. \nUpgrades are unlocked by simply playing and catching many coins. \nThe first levels are unlocked by reaching a high score.\nLater levels add a condition about which perks you can select. \n\nReach high scores is much easier when you get multiple upgrades after each level. \n\n## Re-rolls and free upgrades\n\nYou'll get an extra upgrade to pick when you play well : \n\n- Clear the level under {{levelTimeGood}} seconds\n- Hit the sides or top less than {{wallBouncedGood}} times\n- Catch {{catchRateGood}}% of coins\n- Miss the bricks less than {{missesGood}} times \n\nYou will also get a re-roll that lets you skip upgrades if you do even better : \n\n- Clear a level under {{levelTimeBest}} seconds\n- Hit the sides or top less than {{wallBouncedBest}} times\n- Catch {{catchRateBest}}% of coins\n- Miss the bricks less than {{missesBest}} times \n\nAn option in the settings lets you display those statistics",
"main_menu.help_help": "Learn more about the game",
"main_menu.help_title": "Help",
"main_menu.help_upgrades": "## Upgrades",
"main_menu.high_score": "High score : {{score}}", "main_menu.high_score": "High score : {{score}}",
"main_menu.kid": "Kids mode",
"main_menu.kid_help": "Start future games with \"slower ball\".",
"main_menu.language": "Language",
"main_menu.language_help": "Choose the game's language",
"main_menu.load_save_file": "Load save file",
"main_menu.load_save_file_help": "Select a save file on your device",
"main_menu.max_coins": " {{max}} coins on screen maximum",
"main_menu.max_coins_help": "Cosmetic only, no effect on score",
"main_menu.max_particles": " {{max}} particles maximum",
"main_menu.max_particles_help": "Limits the number of particles show on screen for visual effect. ",
"main_menu.mobile": "Mobile mode",
"main_menu.mobile_help": "Leaves space under the paddle.",
"main_menu.normal": "New Game", "main_menu.normal": "New Game",
"main_menu.normal_help": "Play 7 levels with a random starting perk", "main_menu.normal_help": "Play 7 levels with a random starting perk",
"main_menu.pointer_lock": "Mouse pointer lock",
"main_menu.pointer_lock_help": "Locks and hides the mouse cursor.",
"main_menu.record": "Record gameplay videos",
"main_menu.record_download": "Download video ({{size}} MB)",
"main_menu.record_help": "Get a video of each level.",
"main_menu.red_miss": "Miss warning",
"main_menu.red_miss_help": "Show red particles around balls going down without a hit.",
"main_menu.reset": "Reset Game",
"main_menu.reset_cancel": "No",
"main_menu.reset_confirm": "Yes",
"main_menu.reset_help": "Erase high score, play time and statistics",
"main_menu.reset_instruction": "You will lose all progress you made in the game, are you sure?",
"main_menu.save_file_error": "Error loading save file",
"main_menu.save_file_loaded": "Save file loaded",
"main_menu.save_file_loaded_help": "The app will now reload to apply your save",
"main_menu.save_file_loaded_ok": "Ok",
"main_menu.settings_help": "Tailor the game play to your needs and taste", "main_menu.settings_help": "Tailor the game play to your needs and taste",
"main_menu.settings_title": "Settings", "main_menu.settings_title": "Settings",
"main_menu.show_fps": "FPS counter",
"main_menu.show_fps_help": "Monitor the app's performance",
"main_menu.show_stats": "Show real time stats",
"main_menu.show_stats_help": "Coins, time, bounces, misses",
"main_menu.sounds": "Game sounds",
"main_menu.sounds_help": "Can slow down some phones.",
"main_menu.starting_perks": "Starting perks",
"main_menu.starting_perks_checked": "When you start a new game, one of those perks will be given to you. Click a perk to exclude it. ",
"main_menu.starting_perks_full_random": "All benefits have been removed, the choice will be random.",
"main_menu.starting_perks_help": "Choose possible starting upgrades",
"main_menu.starting_perks_unchecked": "The perks below are not offered as starting perks, but you can click to add them to the pool. ",
"main_menu.title": "Breakout 71", "main_menu.title": "Breakout 71",
"main_menu.unlocks": "Unlocked content", "main_menu.unlocks": "Unlocked content",
"main_menu.unlocks_help": "Try perks and levels you unlocked", "main_menu.unlocks_help": "Try perks and levels you unlocked",
@ -133,6 +78,61 @@
"score_panel.title": "{{score}} points at level {{level}}/{{max}} ", "score_panel.title": "{{score}} points at level {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Upcoming levels :", "score_panel.upcoming_levels": "Upcoming levels :",
"score_panel.upgrades_picked": "Upgrades picked in this game run : ", "score_panel.upgrades_picked": "Upgrades picked in this game run : ",
"settings.basic": "Basic graphics",
"settings.basic_help": "Better performance.",
"settings.colorful_coins": "Colorful coins",
"settings.colorful_coins_help": "Coins always spawn of the color of the brick",
"settings.comboIncreaseTexts": "Show +X in gold",
"settings.comboIncreaseTexts_help": "When the combo increase",
"settings.contrast": "High Contrast",
"settings.contrast_help": "More colorful and dark rendering",
"settings.donation_reminder": "Remind me to donate",
"settings.donation_reminder_help": "See time played and donation link in main menu",
"settings.download_save_file": "Download score and stats",
"settings.download_save_file_help": "Get a save file",
"settings.extra_bright": "Extra bright",
"settings.extra_bright_help": "Increases the size of the halo around coins and bricks.",
"settings.fullscreen": "Fullscreen",
"settings.fullscreen_help": "Game will try to go full screen before starting",
"settings.kid": "Kids mode",
"settings.kid_help": "Start future games with \"slower ball\".",
"settings.language": "Language",
"settings.language_help": "Choose the game's language",
"settings.load_save_file": "Load save file",
"settings.load_save_file_help": "Select a save file on your device",
"settings.max_coins": " {{max}} coins on screen maximum",
"settings.max_coins_help": "Cosmetic only, no effect on score",
"settings.max_particles": " {{max}} particles maximum",
"settings.max_particles_help": "Limits the number of particles show on screen for visual effect. ",
"settings.mobile": "Mobile mode",
"settings.mobile_help": "Leaves space under the paddle.",
"settings.pointer_lock": "Mouse pointer lock",
"settings.pointer_lock_help": "Locks and hides the mouse cursor.",
"settings.record": "Record gameplay videos",
"settings.record_download": "Download video ({{size}} MB)",
"settings.record_help": "Get a video of each level.",
"settings.red_miss": "Miss warning",
"settings.red_miss_help": "Show red particles around balls going down without a hit.",
"settings.reset": "Reset Game",
"settings.reset_cancel": "No",
"settings.reset_confirm": "Yes",
"settings.reset_help": "Erase high score, play time and statistics",
"settings.reset_instruction": "You will lose all progress you made in the game, are you sure?",
"settings.save_file_error": "Error loading save file",
"settings.save_file_loaded": "Save file loaded",
"settings.save_file_loaded_help": "The app will now reload to apply your save",
"settings.save_file_loaded_ok": "Ok",
"settings.show_fps": "FPS counter",
"settings.show_fps_help": "Monitor the app's performance",
"settings.show_stats": "Show real time stats",
"settings.show_stats_help": "Coins, time, bounces, misses",
"settings.sounds": "Game sounds",
"settings.sounds_help": "Can slow down some phones.",
"starting_perks.checked": "When you start a new game, one of those perks will be given to you. Click a perk to exclude it. ",
"starting_perks.help": "Choose possible starting upgrades",
"starting_perks.random": "All benefits have been removed, the choice will be random.",
"starting_perks.title": "Starting perks",
"starting_perks.unchecked": "The perks below are not offered as starting perks, but you can click to add them to the pool. ",
"unlocks.greyed_out_help": "The grayed out upgrades can be unlocked by increasing your total score. The total score increases every time you score in game.", "unlocks.greyed_out_help": "The grayed out upgrades can be unlocked by increasing your total score. The total score increases every time you score in game.",
"unlocks.intro": "Your total score is {{ts}}. Below are all the upgrades and levels the games has to offer. Click an upgrade or level below to start a test game with it.", "unlocks.intro": "Your total score is {{ts}}. Below are all the upgrades and levels the games has to offer. Click an upgrade or level below to start a test game with it.",
"unlocks.just_unlocked": "Level unlocked", "unlocks.just_unlocked": "Level unlocked",

View file

@ -15,14 +15,19 @@
"gameOver.stats.combo_max": "Combo maximum", "gameOver.stats.combo_max": "Combo maximum",
"gameOver.stats.duration_per_level": "Durée par niveau", "gameOver.stats.duration_per_level": "Durée par niveau",
"gameOver.stats.hit_rate": "Précision", "gameOver.stats.hit_rate": "Précision",
"gameOver.stats.intro": "Vous trouverez ci-dessous les statistiques de cette partie comparées à vos {{count}} meilleures parties.",
"gameOver.stats.level_reached": "Niveau atteint", "gameOver.stats.level_reached": "Niveau atteint",
"gameOver.stats.total_score": "Score total", "gameOver.stats.total_score": "Score total",
"gameOver.stats.upgrades_applied": "Améliorations appliquées", "gameOver.stats.upgrades_applied": "Améliorations appliquées",
"gameOver.stats_intro": "Vous trouverez ci-dessous les statistiques de cette partie comparées à vos {{count}} meilleures parties.",
"gameOver.unlocked_perk": "Amélioration débloquée", "gameOver.unlocked_perk": "Amélioration débloquée",
"gameOver.unlocked_perk_plural": "Vous avez débloqué {{count}} améliorations", "gameOver.unlocked_perk_plural": "Vous avez débloqué {{count}} améliorations",
"gameOver.win.summary": "Cette partie est terminée. Vous avez accumulé {{score}} pièces. ", "gameOver.win.summary": "Cette partie est terminée. Vous avez accumulé {{score}} pièces. ",
"gameOver.win.title": "Vous avez terminé cette partie", "gameOver.win.title": "Vous avez terminé cette partie",
"help.content": "## Objectif\n\nAttrapez un maximum de pièces au cours des 7 niveaux.\nLes pièces apparaissent lorsque vous cassez des briques.\nAttrapez-les avec votre palet pour augmenter votre score.\nVotre score est affiché en haut à droite de l'écran.\nNe laissez pas tomber la balle, sinon la partie est terminée.\n\nAprès avoir détruit toutes les briques, vous pourrez choisir une amélioration.\n\n## Améliorations\n\nLes améliorations que vous choisissez seront valables jusqu'à la fin de la partie.\nCertaines peuvent être sélectionnées plusieurs fois pour un effet plus puissant.\nD'autres aident à viser ou simplifient le jeu.\nCertaines ne sont utiles que lorsqu'elles sont combinées.\n\nVous obtenez toujours une amélioration au début de chaque partie.\nSon icône forme les briques du premier niveau.\nVous pouvez sélectionner les améliorations de départ dans les paramètres.\n\nDe nombreuses améliorations influencent votre combo.\n\n## Combo\n\nVotre « combo » correspond au nombre de pièces générées lorsqu'une brique se casse.\nIl est affiché sur votre palet. Par exemple, x4 signifie que chaque brique rapporte 4 pièces.\n\nLa plupart des améliorations qui augmentent le combo ajoutent également une condition pour le réinitialiser.\nLe combo se réinitialise également si la balle revient sur la raquette sans toucher de brique.\nUn message « Manqué » s'affiche alors.\n\nEssayez de viser vers un brique à chaque rebond.\n\n## Visée\n\nSeule la position de la balle sur la raquette détermine son angle de rebond.\nSi la balle touche la raquette en plein centre, elle rebondira verticalement.\nSi vous frappez sur le côté de la raquette, l'angle sera plus grand.\nLa vitesse de la raquette et l'angle d'incidence de la balle n'ont pas d'effet.\n\nDe nombreuses améliorations facilitant la visée peuvent être débloquées.\n\n## Déblocages\n\nLorsque vous jouez à Breakout 71 pour la première fois, la plupart des améliorations et des niveaux sont verrouillés.\nLes améliorations se débloquent simplement en jouant et en attrapant beaucoup de pièces.\nLes premiers niveaux se débloquent en atteignant un score élevé.\nLes niveaux suivants ajoutent une condition concernant les avantages sélectionnés.\n\nAtteindre des scores élevés est beaucoup plus facile lorsque vous obtenez plusieurs améliorations après chaque niveau.\n\n## Relances et améliorations gratuites\n\nVous obtiendrez une amélioration supplémentaire si vous jouez bien :\n\n- Terminez le niveau en moins de {{levelTimeGood}} secondes\n- Touchez les bords ou le haut moins de {{wallBouncedGood}} fois\n- Attrapez {{catchRateGood}} % de pièces\n- Manquez les briques moins de {{missesGood}} fois\n\nVous bénéficierez également d'une relance qui vous permettra d'ignorer les améliorations si vous faites encore mieux :\n\n- Terminez un niveau en moins de {{levelTimeBest}} secondes\n- Touchez les bords ou le haut moins de {{wallBouncedBest}} fois\n- Attrapez {{catchRateBest}} % de pièces\n- Manquez les briques moins de {{missesBest}} fois\n\nUne option dans les paramètres vous permet d'afficher ces statistiques ",
"help.help": "Découvrez le jeu en détail",
"help.levels": "Niveaux",
"help.title": "Aide",
"help.upgrades": "## Améliorations",
"history.columns.score": "Score", "history.columns.score": "Score",
"history.columns.started": "Date", "history.columns.started": "Date",
"history.help": "Liste vos {{count}} meilleurs parties.", "history.help": "Liste vos {{count}} meilleurs parties.",
@ -45,73 +50,13 @@
"level_up.reroll": "Relancer ({{count}})", "level_up.reroll": "Relancer ({{count}})",
"level_up.reroll_help": "Nouveaux choix", "level_up.reroll_help": "Nouveaux choix",
"level_up.upgrade_perk_to_level": " niveau {{level}}", "level_up.upgrade_perk_to_level": " niveau {{level}}",
"main_menu.basic": "Graphismes simplifiés",
"main_menu.basic_help": "Meilleures performances.",
"main_menu.colorful_coins": "Pièces colorées",
"main_menu.colorful_coins_help": "Les pièces apparaissent toujours de la couleur de la brique",
"main_menu.comboIncreaseTexts": "Afficher un +X doré",
"main_menu.comboIncreaseTexts_help": "Quand le combo augmente",
"main_menu.contrast": "Contraste élevé",
"main_menu.contrast_help": "Affichage plus contrasté et coloré",
"main_menu.credit_levels": "Niveaux",
"main_menu.donate": "Vous avez joué {{hours}} heures", "main_menu.donate": "Vous avez joué {{hours}} heures",
"main_menu.donate_help": "Pourriez-vous donner quelques euros ? Vous pouvez masquer ce rappel dans les paramètres.", "main_menu.donate_help": "Pourriez-vous donner quelques euros ? Vous pouvez masquer ce rappel dans les paramètres.",
"main_menu.donation_reminder": "Me rappeler de donner",
"main_menu.donation_reminder_help": "Afficher le temps de jeu et un lien pour donner dans le menu principal",
"main_menu.download_save_file": "Sauvegarder mes progrès",
"main_menu.download_save_file_help": "Obtenir un fichier de sauvegarde",
"main_menu.extra_bright": "Plus de lumière",
"main_menu.extra_bright_help": "Plus grand halo lumineux autours des briques et pièces.",
"main_menu.fullscreen": "Plein écran",
"main_menu.fullscreen_help": "Le jeu essaiera de passer en plein écran quand vous le démarrez",
"main_menu.help_content": "## Objectif\n\nAttrapez un maximum de pièces au cours des 7 niveaux.\nLes pièces apparaissent lorsque vous cassez des briques.\nAttrapez-les avec votre palet pour augmenter votre score.\nVotre score est affiché en haut à droite de l'écran.\nNe laissez pas tomber la balle, sinon la partie est terminée.\n\nAprès avoir détruit toutes les briques, vous pourrez choisir une amélioration.\n\n## Améliorations\n\nLes améliorations que vous choisissez seront valables jusqu'à la fin de la partie.\nCertaines peuvent être sélectionnées plusieurs fois pour un effet plus puissant.\nD'autres aident à viser ou simplifient le jeu.\nCertaines ne sont utiles que lorsqu'elles sont combinées.\n\nVous obtenez toujours une amélioration au début de chaque partie.\nSon icône forme les briques du premier niveau.\nVous pouvez sélectionner les améliorations de départ dans les paramètres.\n\nDe nombreuses améliorations influencent votre combo.\n\n## Combo\n\nVotre « combo » correspond au nombre de pièces générées lorsqu'une brique se casse.\nIl est affiché sur votre palet. Par exemple, x4 signifie que chaque brique rapporte 4 pièces.\n\nLa plupart des améliorations qui augmentent le combo ajoutent également une condition pour le réinitialiser.\nLe combo se réinitialise également si la balle revient sur la raquette sans toucher de brique.\nUn message « Manqué » s'affiche alors.\n\nEssayez de viser vers un brique à chaque rebond.\n\n## Visée\n\nSeule la position de la balle sur la raquette détermine son angle de rebond.\nSi la balle touche la raquette en plein centre, elle rebondira verticalement.\nSi vous frappez sur le côté de la raquette, l'angle sera plus grand.\nLa vitesse de la raquette et l'angle d'incidence de la balle n'ont pas d'effet.\n\nDe nombreuses améliorations facilitant la visée peuvent être débloquées.\n\n## Déblocages\n\nLorsque vous jouez à Breakout 71 pour la première fois, la plupart des améliorations et des niveaux sont verrouillés.\nLes améliorations se débloquent simplement en jouant et en attrapant beaucoup de pièces.\nLes premiers niveaux se débloquent en atteignant un score élevé.\nLes niveaux suivants ajoutent une condition concernant les avantages sélectionnés.\n\nAtteindre des scores élevés est beaucoup plus facile lorsque vous obtenez plusieurs améliorations après chaque niveau.\n\n## Relances et améliorations gratuites\n\nVous obtiendrez une amélioration supplémentaire si vous jouez bien :\n\n- Terminez le niveau en moins de {{levelTimeGood}} secondes\n- Touchez les bords ou le haut moins de {{wallBouncedGood}} fois\n- Attrapez {{catchRateGood}} % de pièces\n- Manquez les briques moins de {{missesGood}} fois\n\nVous bénéficierez également d'une relance qui vous permettra d'ignorer les améliorations si vous faites encore mieux :\n\n- Terminez un niveau en moins de {{levelTimeBest}} secondes\n- Touchez les bords ou le haut moins de {{wallBouncedBest}} fois\n- Attrapez {{catchRateBest}} % de pièces\n- Manquez les briques moins de {{missesBest}} fois\n\nUne option dans les paramètres vous permet d'afficher ces statistiques ",
"main_menu.help_help": "Découvrez le jeu en détail",
"main_menu.help_title": "Aide",
"main_menu.help_upgrades": "## Améliorations",
"main_menu.high_score": "High score : {{score}}", "main_menu.high_score": "High score : {{score}}",
"main_menu.kid": "Mode enfants",
"main_menu.kid_help": "Balle plus lente",
"main_menu.language": "Langue",
"main_menu.language_help": "Changer la langue d'affichage",
"main_menu.load_save_file": "Charger une sauvegarde",
"main_menu.load_save_file_help": "Depuis un fichier ",
"main_menu.max_coins": "{{max}} pièces affichées maximum",
"main_menu.max_coins_help": "Visuel uniquement, pas d'impact sur le score",
"main_menu.max_particles": " {{max}} particules maximum",
"main_menu.max_particles_help": "Limite le nombre de particules affichées à l'écran pour les effets visuels",
"main_menu.mobile": "Mode mobile",
"main_menu.mobile_help": "Laisse un espace sous la raquette.",
"main_menu.normal": "Nouvelle Partie", "main_menu.normal": "Nouvelle Partie",
"main_menu.normal_help": "Avec un avantage de départ aléatoire", "main_menu.normal_help": "Avec un avantage de départ aléatoire",
"main_menu.pointer_lock": "Verrouillage du pointeur",
"main_menu.pointer_lock_help": "Cache aussi le curseur de la souris.",
"main_menu.record": "Enregistrer des vidéos de jeu",
"main_menu.record_download": "Télécharger la vidéo ({{size}} MB)",
"main_menu.record_help": "Obtenez une vidéo de chaque niveau.",
"main_menu.red_miss": "Balles ratées",
"main_menu.red_miss_help": "Afficher des particules rouges autours des balles qui redescendent sans avoir touché une brique.",
"main_menu.reset": "Réinitialiser le jeu",
"main_menu.reset_cancel": "Non",
"main_menu.reset_confirm": "Oui",
"main_menu.reset_help": "Effacer les scores, statistiques et temps de jeu",
"main_menu.reset_instruction": "Vous perdrez tous les progrès que vous avez faits dans le jeu, êtes-vous sûr ?",
"main_menu.save_file_error": "Erreur lors du chargement du fichier de sauvegarde",
"main_menu.save_file_loaded": "Sauvegarde chargée",
"main_menu.save_file_loaded_help": "L'appli va redémarrer",
"main_menu.save_file_loaded_ok": "Ok",
"main_menu.settings_help": "Adaptez le jeu à vos besoins", "main_menu.settings_help": "Adaptez le jeu à vos besoins",
"main_menu.settings_title": "Paramètre", "main_menu.settings_title": "Paramètre",
"main_menu.show_fps": "Compteur de FPS",
"main_menu.show_fps_help": "Surveiller la performance du jeu",
"main_menu.show_stats": "Statistiques en temps réel",
"main_menu.show_stats_help": "Pièces, temps, rebonds, ratés",
"main_menu.sounds": "Sons du jeu",
"main_menu.sounds_help": "Ralentis certains téléphones.",
"main_menu.starting_perks": "Avantages de départ",
"main_menu.starting_perks_checked": "Lorsque vous démarrez une nouvelle partie, l'un de ces avantages vous sera attribué. Cliquez sur un avantage pour l'exclure.",
"main_menu.starting_perks_full_random": "Tous les avantages ont été retirés, le choix sera aléatoire.",
"main_menu.starting_perks_help": "Choisissez les avantages de départ",
"main_menu.starting_perks_unchecked": "Les avantages ci-dessous ne sont pas proposés comme avantages de départ, mais vous pouvez cliquer pour les ajouter aux avantages de départ possibles.",
"main_menu.title": "Breakout 71", "main_menu.title": "Breakout 71",
"main_menu.unlocks": "Contenu débloqué", "main_menu.unlocks": "Contenu débloqué",
"main_menu.unlocks_help": "Essayez les éléments débloqués", "main_menu.unlocks_help": "Essayez les éléments débloqués",
@ -133,6 +78,61 @@
"score_panel.title": "{{score}} points au niveau {{level}}/{{max}} ", "score_panel.title": "{{score}} points au niveau {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Niveaux de la parties : ", "score_panel.upcoming_levels": "Niveaux de la parties : ",
"score_panel.upgrades_picked": "Améliorations choisies pendant la partie :", "score_panel.upgrades_picked": "Améliorations choisies pendant la partie :",
"settings.basic": "Graphismes simplifiés",
"settings.basic_help": "Meilleures performances.",
"settings.colorful_coins": "Pièces colorées",
"settings.colorful_coins_help": "Les pièces apparaissent toujours de la couleur de la brique",
"settings.comboIncreaseTexts": "Afficher un +X doré",
"settings.comboIncreaseTexts_help": "Quand le combo augmente",
"settings.contrast": "Contraste élevé",
"settings.contrast_help": "Affichage plus contrasté et coloré",
"settings.donation_reminder": "Me rappeler de donner",
"settings.donation_reminder_help": "Afficher le temps de jeu et un lien pour donner dans le menu principal",
"settings.download_save_file": "Sauvegarder mes progrès",
"settings.download_save_file_help": "Obtenir un fichier de sauvegarde",
"settings.extra_bright": "Plus de lumière",
"settings.extra_bright_help": "Plus grand halo lumineux autours des briques et pièces.",
"settings.fullscreen": "Plein écran",
"settings.fullscreen_help": "Le jeu essaiera de passer en plein écran quand vous le démarrez",
"settings.kid": "Mode enfants",
"settings.kid_help": "Balle plus lente",
"settings.language": "Langue",
"settings.language_help": "Changer la langue d'affichage",
"settings.load_save_file": "Charger une sauvegarde",
"settings.load_save_file_help": "Depuis un fichier ",
"settings.max_coins": "{{max}} pièces affichées maximum",
"settings.max_coins_help": "Visuel uniquement, pas d'impact sur le score",
"settings.max_particles": " {{max}} particules maximum",
"settings.max_particles_help": "Limite le nombre de particules affichées à l'écran pour les effets visuels",
"settings.mobile": "Mode mobile",
"settings.mobile_help": "Laisse un espace sous la raquette.",
"settings.pointer_lock": "Verrouillage du pointeur",
"settings.pointer_lock_help": "Cache aussi le curseur de la souris.",
"settings.record": "Enregistrer des vidéos de jeu",
"settings.record_download": "Télécharger la vidéo ({{size}} MB)",
"settings.record_help": "Obtenez une vidéo de chaque niveau.",
"settings.red_miss": "Balles ratées",
"settings.red_miss_help": "Afficher des particules rouges autours des balles qui redescendent sans avoir touché une brique.",
"settings.reset": "Réinitialiser le jeu",
"settings.reset_cancel": "Non",
"settings.reset_confirm": "Oui",
"settings.reset_help": "Effacer les scores, statistiques et temps de jeu",
"settings.reset_instruction": "Vous perdrez tous les progrès que vous avez faits dans le jeu, êtes-vous sûr ?",
"settings.save_file_error": "Erreur lors du chargement du fichier de sauvegarde",
"settings.save_file_loaded": "Sauvegarde chargée",
"settings.save_file_loaded_help": "L'appli va redémarrer",
"settings.save_file_loaded_ok": "Ok",
"settings.show_fps": "Compteur de FPS",
"settings.show_fps_help": "Surveiller la performance du jeu",
"settings.show_stats": "Statistiques en temps réel",
"settings.show_stats_help": "Pièces, temps, rebonds, ratés",
"settings.sounds": "Sons du jeu",
"settings.sounds_help": "Ralentis certains téléphones.",
"starting_perks.checked": "Lorsque vous démarrez une nouvelle partie, l'un de ces avantages vous sera attribué. Cliquez sur un avantage pour l'exclure.",
"starting_perks.help": "Choisissez les avantages de départ",
"starting_perks.random": "Tous les avantages ont été retirés, le choix sera aléatoire.",
"starting_perks.title": "Avantages de départ",
"starting_perks.unchecked": "Les avantages ci-dessous ne sont pas proposés comme avantages de départ, mais vous pouvez cliquer pour les ajouter aux avantages de départ possibles.",
"unlocks.greyed_out_help": "Les éléments grisées peuvent être débloquées en augmentant votre score total. Le score total augmente à chaque fois que vous marquez des points dans le jeu.", "unlocks.greyed_out_help": "Les éléments grisées peuvent être débloquées en augmentant votre score total. Le score total augmente à chaque fois que vous marquez des points dans le jeu.",
"unlocks.intro": "Votre score total est de {{ts}}. Vous trouverez ci-dessous toutes les améliorations et tous les niveaux que le jeu peut offrir. Cliquez sur l'un d'entre eux pour les essayer dans une partie de test. ", "unlocks.intro": "Votre score total est de {{ts}}. Vous trouverez ci-dessous toutes les améliorations et tous les niveaux que le jeu peut offrir. Cliquez sur l'un d'entre eux pour les essayer dans une partie de test. ",
"unlocks.just_unlocked": "Niveau débloqué", "unlocks.just_unlocked": "Niveau débloqué",

View file

@ -15,14 +15,19 @@
"gameOver.stats.combo_max": "Максимальная комбинация", "gameOver.stats.combo_max": "Максимальная комбинация",
"gameOver.stats.duration_per_level": "Продолжительность за уровень", "gameOver.stats.duration_per_level": "Продолжительность за уровень",
"gameOver.stats.hit_rate": "Скорость попадания", "gameOver.stats.hit_rate": "Скорость попадания",
"gameOver.stats.intro": "Ниже приведена статистика вашей игры по сравнению с вашими {{count}} лучшими играми.",
"gameOver.stats.level_reached": "Достигнутый уровень", "gameOver.stats.level_reached": "Достигнутый уровень",
"gameOver.stats.total_score": "Общий балл", "gameOver.stats.total_score": "Общий балл",
"gameOver.stats.upgrades_applied": "Примененные обновления", "gameOver.stats.upgrades_applied": "Примененные обновления",
"gameOver.stats_intro": "Ниже приведена статистика вашей игры по сравнению с вашими {{count}} лучшими играми.",
"gameOver.unlocked_perk": "Обновление разблокировано", "gameOver.unlocked_perk": "Обновление разблокировано",
"gameOver.unlocked_perk_plural": "Вы только что разблокировали {{count}} привилегий", "gameOver.unlocked_perk_plural": "Вы только что разблокировали {{count}} привилегий",
"gameOver.win.summary": "Игра окончена. Вы спрятали {{score}} монет.", "gameOver.win.summary": "Игра окончена. Вы спрятали {{score}} монет.",
"gameOver.win.title": "Вы завершили эту игру", "gameOver.win.title": "Вы завершили эту игру",
"help.content": "## Цель\n\nПоймайте как можно больше монет на протяжении 7 уровней.\nМонеты появляются, когда вы разбиваете кирпичи.\nЛовите их веслом, чтобы увеличить свой счет.\nВаш счет отображается в правом верхнем углу экрана.\nНе уроните мяч, иначе игра закончится.\n\nУничтожив все кирпичи, вы сможете выбрать улучшение.\n\n## Апгрейды\n\nВыбранные вами улучшения будут действовать до конца игры.\nНекоторые из них можно выбирать несколько раз для усиления эффекта.\nНекоторые помогают в прицеливании или облегчают игру другими способами.\nНекоторые полезны только в комбинации.\n\nВ начале каждой игры вы всегда получаете один апгрейд.\nЕго иконка будет служить кирпичом первого уровня.\nВыбрать стартовые апгрейды можно в настройках.\n\nМногие апгрейды влияют на ваши комбо.\n\n## Комбо\n\nВаше \"комбо\" - это количество монет, появляющихся при разрушении кирпича.\nОно отображается на вашем весле, например, x4 означает, что каждый кирпич порождает 4 монеты.\nБольшинство обновлений, увеличивающих комбо, также добавляют условие для его сброса.\nкомбо также сбрасывается, если мяч возвращается к ракетке, не задев кирпич.\n\nВ этом случае появится сообщение \"промах\".\n\nСтарайтесь каждый раз целиться в кирпич.\n\n## Прицеливание\n\nТолько положение мяча на лопатке определяет, как он отскочит.\nЕсли мяч попадет в центр площадки, он отскочит вертикально вверх.\nЕсли вы ударите с одной стороны, он отскочит под большим углом.\nСкорость весла и угол входа не влияют на направление мяча после отскока.\n\nМожно открыть множество улучшений, помогающих в прицеливании.\n\n## разблокирует\n\nПри первой игре в Breakout 71 большинство обновлений и уровней заблокированы.\nМодификации можно разблокировать, просто играя и собирая много монет.\nПервые уровни разблокируются при достижении высокого результата.\nПоследующие уровни добавляют условие, по которому вы можете выбрать те или иные привилегии.\n\nДобиваться высоких результатов гораздо проще, если после каждого уровня вы получаете несколько обновлений.\n\n## Повторные прокачки и бесплатные улучшения\n\nВы получите дополнительный апгрейд, если будете играть хорошо:\n\n- Пройдите уровень за {{levelTimeGood}} секунд\n- Ударьте по бокам или сверху менее {{wallBouncedGood}} раз\n- Поймайте {{catchRateGood}}% монет\n- Пропустите кирпичи менее {{missesGood}} раз\n\nВы также получите повторную прокачку, которая позволит вам пропустить обновления, если вы справитесь с заданием еще лучше:\n\n- Пройдите уровень за {{levelTimeBest}} секунды\n- Ударьте по бокам или сверху менее {{wallBouncedBest}} раз\n- Поймать {{catchRateBest}}% монет\n- Промахнитесь по кирпичам менее {{missesBest}} раз\n\nОпция в настройках позволяет отображать эту статистику",
"help.help": "Узнайте больше об игре",
"help.levels": "Уровни",
"help.title": "Помощь",
"help.upgrades": "## Обновления",
"history.columns.score": "Оценка", "history.columns.score": "Оценка",
"history.columns.started": "Дата", "history.columns.started": "Дата",
"history.help": "Посмотрите свои {{count}} лучшие игры.", "history.help": "Посмотрите свои {{count}} лучшие игры.",
@ -45,73 +50,13 @@
"level_up.reroll": "Повторный бросок ({{count}})", "level_up.reroll": "Повторный бросок ({{count}})",
"level_up.reroll_help": "Предложите новые варианты", "level_up.reroll_help": "Предложите новые варианты",
"level_up.upgrade_perk_to_level": " lvl {{level}}", "level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "Базовая графика",
"main_menu.basic_help": "Улучшенная производительность.",
"main_menu.colorful_coins": "Разноцветные монеты",
"main_menu.colorful_coins_help": "Монеты всегда спаунятся того же цвета, что и кирпичи",
"main_menu.comboIncreaseTexts": "Показать +X в золотом цвете",
"main_menu.comboIncreaseTexts_help": "Когда комбо увеличивается",
"main_menu.contrast": "Высокая контрастность",
"main_menu.contrast_help": "Более красочная и темная визуализация",
"main_menu.credit_levels": "Уровни",
"main_menu.donate": "Вы играли {{hours}} часов", "main_menu.donate": "Вы играли {{hours}} часов",
"main_menu.donate_help": "Как насчет пожертвования? Вы можете скрыть это напоминание в настройках.", "main_menu.donate_help": "Как насчет пожертвования? Вы можете скрыть это напоминание в настройках.",
"main_menu.donation_reminder": "Напомните мне о пожертвовании",
"main_menu.donation_reminder_help": "Смотрите время игры и ссылку на пожертвование в главном меню",
"main_menu.download_save_file": "Скачать счет и статистику",
"main_menu.download_save_file_help": "Получить файл сохранения",
"main_menu.extra_bright": "Очень яркий",
"main_menu.extra_bright_help": "Увеличивает размер ореола вокруг монет и кирпичей.",
"main_menu.fullscreen": "ПОЛНЫЙ ЭКРАН",
"main_menu.fullscreen_help": "Игра пытается перейти в полноэкранный режим перед запуском",
"main_menu.help_content": "## Цель\n\nПоймайте как можно больше монет на протяжении 7 уровней.\nМонеты появляются, когда вы разбиваете кирпичи.\nЛовите их веслом, чтобы увеличить свой счет.\nВаш счет отображается в правом верхнем углу экрана.\nНе уроните мяч, иначе игра закончится.\n\nУничтожив все кирпичи, вы сможете выбрать улучшение.\n\n## Апгрейды\n\nВыбранные вами улучшения будут действовать до конца игры.\nНекоторые из них можно выбирать несколько раз для усиления эффекта.\nНекоторые помогают в прицеливании или облегчают игру другими способами.\nНекоторые полезны только в комбинации.\n\nВ начале каждой игры вы всегда получаете один апгрейд.\nЕго иконка будет служить кирпичом первого уровня.\nВыбрать стартовые апгрейды можно в настройках.\n\nМногие апгрейды влияют на ваши комбо.\n\n## Комбо\n\nВаше \"комбо\" - это количество монет, появляющихся при разрушении кирпича.\nОно отображается на вашем весле, например, x4 означает, что каждый кирпич порождает 4 монеты.\nБольшинство обновлений, увеличивающих комбо, также добавляют условие для его сброса.\nКомбо также сбрасывается, если мяч возвращается в\n\n не попав ни в один кирпич.\nВ этом случае появится сообщение \"промах\".\n\nСтарайтесь каждый раз целиться в кирпич.\n\n## Прицеливание\n\nТолько положение мяча на лопатке определяет, как он отскочит.\nЕсли мяч попадет в центр площадки, он отскочит вертикально вверх.\nЕсли вы ударите с одной стороны, он отскочит под большим углом.\nСкорость весла и угол входа не влияют на направление мяча после отскока.\n\nМожно открыть множество улучшений, помогающих в прицеливании.\n\n## Unlocks\n\nПри первой игре в Breakout 71 большинство обновлений и уровней заблокированы.\nМодификации можно разблокировать, просто играя и собирая много монет.\nПервые уровни разблокируются при достижении высокого результата.\nПоследующие уровни добавляют условие, по которому вы можете выбрать те или иные привилегии.\n\nДобиваться высоких результатов гораздо проще, если после каждого уровня вы получаете несколько обновлений.\n\n## Повторные прокачки и бесплатные улучшения\n\nВы получите дополнительный апгрейд, если будете играть хорошо:\n\n- Пройдите уровень за {{levelTimeGood}} секунд\n- Ударьте по бокам или сверху менее {{wallBouncedGood}} раз\n- Поймайте {{catchRateGood}}% монет\n- Пропустите кирпичи менее {{missesGood}} раз\n\nВы также получите повторную прокачку, которая позволит вам пропустить обновления, если вы справитесь с заданием еще лучше:\n\n- Пройдите уровень за {{levelTimeBest}} секунды\n- Ударьте по бокам или сверху менее {{wallBouncedBest}} раз\n- Поймать {{catchRateBest}}% монет\n- Промахнитесь по кирпичам менее {{missesBest}} раз\n\nОпция в настройках позволяет отображать эту статистику",
"main_menu.help_help": "Узнайте больше об игре",
"main_menu.help_title": "Помощь",
"main_menu.help_upgrades": "## Обновления",
"main_menu.high_score": "Высокий балл : {{score}}", "main_menu.high_score": "Высокий балл : {{score}}",
"main_menu.kid": "Детский режим",
"main_menu.kid_help": "Начинайте будущие игры с \"медленного мяча\".",
"main_menu.language": "Язык",
"main_menu.language_help": "Выберите язык игры",
"main_menu.load_save_file": "Загрузить файл сохранения",
"main_menu.load_save_file_help": "Выберите файл сохранения на вашем устройстве",
"main_menu.max_coins": " {{max}} монет на экране максимум",
"main_menu.max_coins_help": "Только косметика, не влияет на результат",
"main_menu.max_particles": " {{max}} частиц максимум",
"main_menu.max_particles_help": "Ограничивает количество частиц, отображаемых на экране для визуального эффекта.",
"main_menu.mobile": "Мобильный режим",
"main_menu.mobile_help": "Оставляет место под лопаткой.",
"main_menu.normal": "НОВАЯ ИГРА", "main_menu.normal": "НОВАЯ ИГРА",
"main_menu.normal_help": "Пройдите 7 уровней со случайным стартовым преимуществом", "main_menu.normal_help": "Пройдите 7 уровней со случайным стартовым преимуществом",
"main_menu.pointer_lock": "Блокировка указателя мыши",
"main_menu.pointer_lock_help": "Фиксирует и скрывает курсор мыши.",
"main_menu.record": "Запись видеороликов игрового процесса",
"main_menu.record_download": "Скачать видео ({{size}} МБ)",
"main_menu.record_help": "Получите видеозапись каждого уровня.",
"main_menu.red_miss": "Мисс предупреждение",
"main_menu.red_miss_help": "Покажите красные частицы вокруг мячей, падающих без попадания.",
"main_menu.reset": "Перезагрузка игры",
"main_menu.reset_cancel": "Нет",
"main_menu.reset_confirm": "Да",
"main_menu.reset_help": "Сотрите высокий результат, время игры и статистику",
"main_menu.reset_instruction": "Вы потеряете весь прогресс, достигнутый в игре, вы уверены?",
"main_menu.save_file_error": "Ошибка при загрузке файла сохранения",
"main_menu.save_file_loaded": "Сохранить загруженный файл",
"main_menu.save_file_loaded_help": "Теперь приложение перезагрузится, чтобы применить ваше сохранение",
"main_menu.save_file_loaded_ok": "OK",
"main_menu.settings_help": "Подстраивайте игровой процесс под свои потребности и вкус", "main_menu.settings_help": "Подстраивайте игровой процесс под свои потребности и вкус",
"main_menu.settings_title": "Настройки", "main_menu.settings_title": "Настройки",
"main_menu.show_fps": "Счетчик FPS",
"main_menu.show_fps_help": "Контролируйте работу приложения",
"main_menu.show_stats": "Показывайте статистику в реальном времени",
"main_menu.show_stats_help": "Монеты, время, отскоки, промахи",
"main_menu.sounds": "Звуки игры",
"main_menu.sounds_help": "Может замедлять работу некоторых телефонов.",
"main_menu.starting_perks": "Стартовые привилегии",
"main_menu.starting_perks_checked": "Когда вы начнете новую игру, вам будет дано одно из этих преимуществ. Щелкните по перку, чтобы исключить его.",
"main_menu.starting_perks_full_random": "Все преимущества были убраны, выбор будет случайным.",
"main_menu.starting_perks_help": "Выберите возможные стартовые апгрейды",
"main_menu.starting_perks_unchecked": "Приведенные ниже привилегии не предлагаются в качестве стартовых, но вы можете нажать на них, чтобы добавить в пул.",
"main_menu.title": "Прорыв 71", "main_menu.title": "Прорыв 71",
"main_menu.unlocks": "Разблокированный контент", "main_menu.unlocks": "Разблокированный контент",
"main_menu.unlocks_help": "Попробуйте преимущества и уровни, которые вы разблокировали", "main_menu.unlocks_help": "Попробуйте преимущества и уровни, которые вы разблокировали",
@ -133,6 +78,61 @@
"score_panel.title": "{{score}} очков на уровне {{level}}/{{max}} ", "score_panel.title": "{{score}} очков на уровне {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Предстоящие уровни :", "score_panel.upcoming_levels": "Предстоящие уровни :",
"score_panel.upgrades_picked": "Обновления, выбранные в этой игре, запускаются :", "score_panel.upgrades_picked": "Обновления, выбранные в этой игре, запускаются :",
"settings.basic": "Базовая графика",
"settings.basic_help": "Улучшенная производительность.",
"settings.colorful_coins": "Разноцветные монеты",
"settings.colorful_coins_help": "Монеты всегда спаунятся того же цвета, что и кирпичи",
"settings.comboIncreaseTexts": "Показать +X в золотом цвете",
"settings.comboIncreaseTexts_help": "Когда комбо увеличивается",
"settings.contrast": "Высокая контрастность",
"settings.contrast_help": "Более красочная и темная визуализация",
"settings.donation_reminder": "Напомните мне о пожертвовании",
"settings.donation_reminder_help": "Смотрите время игры и ссылку на пожертвование в главном меню",
"settings.download_save_file": "Скачать счет и статистику",
"settings.download_save_file_help": "Получить файл сохранения",
"settings.extra_bright": "Очень яркий",
"settings.extra_bright_help": "Увеличивает размер ореола вокруг монет и кирпичей.",
"settings.fullscreen": "ПОЛНЫЙ ЭКРАН",
"settings.fullscreen_help": "Игра пытается перейти в полноэкранный режим перед запуском",
"settings.kid": "Детский режим",
"settings.kid_help": "Начинайте будущие игры с \"медленного мяча\".",
"settings.language": "Язык",
"settings.language_help": "Выберите язык игры",
"settings.load_save_file": "Загрузить файл сохранения",
"settings.load_save_file_help": "Выберите файл сохранения на вашем устройстве",
"settings.max_coins": " {{max}} монет на экране максимум",
"settings.max_coins_help": "Только косметика, не влияет на результат",
"settings.max_particles": " {{max}} частиц максимум",
"settings.max_particles_help": "Ограничивает количество частиц, отображаемых на экране для визуального эффекта.",
"settings.mobile": "Мобильный режим",
"settings.mobile_help": "Оставляет место под лопаткой.",
"settings.pointer_lock": "Блокировка указателя мыши",
"settings.pointer_lock_help": "Фиксирует и скрывает курсор мыши.",
"settings.record": "Запись видеороликов игрового процесса",
"settings.record_download": "Скачать видео ({{size}} МБ)",
"settings.record_help": "Получите видеозапись каждого уровня.",
"settings.red_miss": "Мисс предупреждение",
"settings.red_miss_help": "Покажите красные частицы вокруг мячей, падающих без попадания.",
"settings.reset": "Перезагрузка игры",
"settings.reset_cancel": "Нет",
"settings.reset_confirm": "Да",
"settings.reset_help": "Сотрите высокий результат, время игры и статистику",
"settings.reset_instruction": "Вы потеряете весь прогресс, достигнутый в игре, вы уверены?",
"settings.save_file_error": "Ошибка при загрузке файла сохранения",
"settings.save_file_loaded": "Сохранить загруженный файл",
"settings.save_file_loaded_help": "Теперь приложение перезагрузится, чтобы применить ваше сохранение",
"settings.save_file_loaded_ok": "OK",
"settings.show_fps": "Счетчик FPS",
"settings.show_fps_help": "Контролируйте работу приложения",
"settings.show_stats": "Показывайте статистику в реальном времени",
"settings.show_stats_help": "Монеты, время, отскоки, промахи",
"settings.sounds": "Звуки игры",
"settings.sounds_help": "Может замедлять работу некоторых телефонов.",
"starting_perks.checked": "Когда вы начнете новую игру, вам будет дано одно из этих преимуществ. Щелкните по перку, чтобы исключить его.",
"starting_perks.help": "Выберите возможные стартовые апгрейды",
"starting_perks.random": "Все преимущества были убраны, выбор будет случайным.",
"starting_perks.title": "Стартовые привилегии",
"starting_perks.unchecked": "Приведенные ниже привилегии не предлагаются в качестве стартовых, но вы можете нажать на них, чтобы добавить в пул.",
"unlocks.greyed_out_help": "Выделенные серым апгрейды можно разблокировать, увеличив общее количество очков. Общий счет увеличивается каждый раз, когда вы набираете очки в игре.", "unlocks.greyed_out_help": "Выделенные серым апгрейды можно разблокировать, увеличив общее количество очков. Общий счет увеличивается каждый раз, когда вы набираете очки в игре.",
"unlocks.intro": "Ваш общий счет составляет {{ts}}. Ниже представлены все обновления и уровни, которые предлагает игра. Нажмите на апгрейд или уровень ниже, чтобы начать тестовую игру с ним.", "unlocks.intro": "Ваш общий счет составляет {{ts}}. Ниже представлены все обновления и уровни, которые предлагает игра. Нажмите на апгрейд или уровень ниже, чтобы начать тестовую игру с ним.",
"unlocks.just_unlocked": "Уровень разблокирован", "unlocks.just_unlocked": "Уровень разблокирован",

View file

@ -7,79 +7,79 @@ import { hoursSpentPlaying } from "./pure_functions";
export const options = { export const options = {
sound: { sound: {
default: true, default: true,
name: t("main_menu.sounds"), name: t("settings.sounds"),
help: t("main_menu.sounds_help"), help: t("settings.sounds_help"),
}, },
"mobile-mode": { "mobile-mode": {
default: window.innerHeight > window.innerWidth, default: window.innerHeight > window.innerWidth,
name: t("main_menu.mobile"), name: t("settings.mobile"),
help: t("main_menu.mobile_help"), help: t("settings.mobile_help"),
}, },
basic: { basic: {
default: false, default: false,
name: t("main_menu.basic"), name: t("settings.basic"),
help: t("main_menu.basic_help"), help: t("settings.basic_help"),
}, },
colorful_coins: { colorful_coins: {
default: false, default: false,
name: t("main_menu.colorful_coins"), name: t("settings.colorful_coins"),
help: t("main_menu.colorful_coins_help"), help: t("settings.colorful_coins_help"),
}, },
extra_bright: { extra_bright: {
default: true, default: true,
name: t("main_menu.extra_bright"), name: t("settings.extra_bright"),
help: t("main_menu.extra_bright_help"), help: t("settings.extra_bright_help"),
}, },
contrast: { contrast: {
default: false, default: false,
name: t("main_menu.contrast"), name: t("settings.contrast"),
help: t("main_menu.contrast_help"), help: t("settings.contrast_help"),
}, },
show_fps: { show_fps: {
default: false, default: false,
name: t("main_menu.show_fps"), name: t("settings.show_fps"),
help: t("main_menu.show_fps_help"), help: t("settings.show_fps_help"),
}, },
show_stats: { show_stats: {
default: false, default: false,
name: t("main_menu.show_stats"), name: t("settings.show_stats"),
help: t("main_menu.show_stats_help"), help: t("settings.show_stats_help"),
}, },
pointerLock: { pointerLock: {
default: false, default: false,
name: t("main_menu.pointer_lock"), name: t("settings.pointer_lock"),
help: t("main_menu.pointer_lock_help"), help: t("settings.pointer_lock_help"),
}, },
easy: { easy: {
default: false, default: false,
name: t("main_menu.kid"), name: t("settings.kid"),
help: t("main_menu.kid_help"), help: t("settings.kid_help"),
}, },
// Could not get the sharing to work without loading androidx and all the modern android things so for now I'll just disable sharing in the android app // Could not get the sharing to work without loading androidx and all the modern android things so for now I'll just disable sharing in the android app
record: { record: {
default: false, default: false,
name: t("main_menu.record"), name: t("settings.record"),
help: t("main_menu.record_help"), help: t("settings.record_help"),
}, },
fullscreen: { fullscreen: {
default: false, default: false,
name: t("main_menu.fullscreen"), name: t("settings.fullscreen"),
help: t("main_menu.fullscreen_help"), help: t("settings.fullscreen_help"),
}, },
donation_reminder: { donation_reminder: {
default: hoursSpentPlaying() > 5, default: hoursSpentPlaying() > 5,
name: t("main_menu.donation_reminder"), name: t("settings.donation_reminder"),
help: t("main_menu.donation_reminder_help"), help: t("settings.donation_reminder_help"),
}, },
red_miss: { red_miss: {
default: true, default: true,
name: t("main_menu.red_miss"), name: t("settings.red_miss"),
help: t("main_menu.red_miss_help"), help: t("settings.red_miss_help"),
}, },
comboIncreaseTexts: { comboIncreaseTexts: {
default: true, default: true,
name: t("main_menu.comboIncreaseTexts"), name: t("settings.comboIncreaseTexts"),
help: t("main_menu.comboIncreaseTexts_help"), help: t("settings.comboIncreaseTexts_help"),
}, },
} as const satisfies { [k: string]: OptionDef }; } as const satisfies { [k: string]: OptionDef };

View file

@ -130,7 +130,7 @@ export function startRecordingGame(gameState: GameState) {
a.href = video.src; a.href = video.src;
} }
a.textContent = t("main_menu.record_download", { a.textContent = t("settings.record_download", {
size: (blob.size / 1000000).toFixed(2), size: (blob.size / 1000000).toFixed(2),
}); });
targetDiv.appendChild(a); targetDiv.appendChild(a);

View file

@ -4,13 +4,14 @@ import { t } from "./i18n/i18n";
import { icons, upgrades } from "./loadGameData"; import { icons, upgrades } from "./loadGameData";
import { getSettingValue, getTotalScore, setSettingValue } from "./settings"; import { getSettingValue, getTotalScore, setSettingValue } from "./settings";
import { isOptionOn } from "./options"; import { isOptionOn } from "./options";
import {notStartingPerk} from "./upgrades";
export function startingPerkMenuButton() { export function startingPerkMenuButton() {
return { return {
disabled: isOptionOn("easy"), disabled: isOptionOn("easy"),
icon: icons["icon:starting_perks"], icon: icons["icon:starting_perks"],
text: t("main_menu.starting_perks"), text: t("starting_perks.title"),
help: t("main_menu.starting_perks_help"), help: t("starting_perks.help"),
async value() { async value() {
await openStartingPerksEditor(); await openStartingPerksEditor();
}, },
@ -19,15 +20,15 @@ export function startingPerkMenuButton() {
export function isBlackListedForStart(u: Upgrade) { export function isBlackListedForStart(u: Upgrade) {
return !!( return !!(
notStartingPerk.includes(u.id) ||
u.requires || u.requires ||
["instant_upgrade"].includes(u.id) ||
u.threshold > getTotalScore() u.threshold > getTotalScore()
); );
} }
export function isStartingPerk(u: Upgrade): boolean { export function isStartingPerk(u: Upgrade): boolean {
return ( return (
!isBlackListedForStart(u) && !isBlackListedForStart(u) &&
getSettingValue("start_with_" + u.id, u.giftable) getSettingValue("start_with_" + u.id, u.gift)
); );
} }
@ -46,14 +47,14 @@ export async function openStartingPerksEditor() {
const checkedList = buttons.filter((b) => b.checked); const checkedList = buttons.filter((b) => b.checked);
const perks: Upgrade[] | null | void = await asyncAlert({ const perks: Upgrade[] | null | void = await asyncAlert({
title: t("main_menu.starting_perks"), title: t("starting_perks.title"),
className: "actionsAsGrid", className: "actionsAsGrid",
content: [ content: [
checkedList.length checkedList.length
? t("main_menu.starting_perks_checked") ? t("starting_perks.checked")
: t("main_menu.starting_perks_full_random"), : t("starting_perks.random"),
...checkedList, ...checkedList,
t("main_menu.starting_perks_unchecked"), t("starting_perks.unchecked"),
...buttons.filter((b) => !b.checked), ...buttons.filter((b) => !b.checked),
], ],
}); });

2
src/types.d.ts vendored
View file

@ -26,7 +26,7 @@ export type Palette = { [k: string]: string };
export type Upgrade = { export type Upgrade = {
threshold: number; threshold: number;
giftable: boolean; gift: boolean;
id: PerkId; id: PerkId;
name: string; name: string;
icon: string; icon: string;

View file

@ -1,12 +1,30 @@
import { t } from "./i18n/i18n"; import { t } from "./i18n/i18n";
import { comboKeepingRate } from "./pure_functions"; import { comboKeepingRate } from "./pure_functions";
import {PerkId} from "./types";
// Those perks are excluded from creative mode
export const noCreative: PerkId[] = [
"extra_levels",
"shunt",
"one_more_choice",
"instant_upgrade",
];
// Those perks are excluded from the starting perks list
export const notStartingPerk: PerkId[] = [
"instant_upgrade",
];
export const rawUpgrades = [ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 0, threshold: 0,
giftable: false, gift: false,
id: "extra_life", id: "extra_life",
max: 7, max: 7,
name: t("upgrades.extra_life.name"), name: t("upgrades.extra_life.name"),
@ -21,7 +39,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 0, threshold: 0,
id: "base_combo", id: "base_combo",
giftable: true, gift: true,
max: 7, max: 7,
name: t("upgrades.base_combo.name"), name: t("upgrades.base_combo.name"),
help: (lvl: number) => help: (lvl: number) =>
@ -31,7 +50,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 0, threshold: 0,
giftable: false, gift: false,
id: "slow_down", id: "slow_down",
max: 2, max: 2,
name: t("upgrades.slow_down.name"), name: t("upgrades.slow_down.name"),
@ -41,7 +61,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 0, threshold: 0,
giftable: false, gift: false,
id: "bigger_puck", id: "bigger_puck",
max: 2, max: 2,
name: t("upgrades.bigger_puck.name"), name: t("upgrades.bigger_puck.name"),
@ -51,7 +72,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 0, threshold: 0,
giftable: false, gift: false,
id: "viscosity", id: "viscosity",
max: 3, max: 3,
@ -62,7 +84,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 50, threshold: 50,
giftable: false, gift: false,
id: "skip_last", id: "skip_last",
max: 7, max: 7,
name: t("upgrades.skip_last.name"), name: t("upgrades.skip_last.name"),
@ -76,7 +99,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 100, threshold: 100,
id: "streak_shots", id: "streak_shots",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.streak_shots.name"), name: t("upgrades.streak_shots.name"),
help: (lvl: number) => t("upgrades.streak_shots.tooltip", { lvl }), help: (lvl: number) => t("upgrades.streak_shots.tooltip", { lvl }),
@ -88,7 +112,8 @@ export const rawUpgrades = [
threshold: 200, threshold: 200,
id: "left_is_lava", id: "left_is_lava",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.left_is_lava.name"), name: t("upgrades.left_is_lava.name"),
@ -100,7 +125,8 @@ export const rawUpgrades = [
threshold: 300, threshold: 300,
id: "right_is_lava", id: "right_is_lava",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.right_is_lava.name"), name: t("upgrades.right_is_lava.name"),
help: (lvl: number) => t("upgrades.right_is_lava.tooltip", { lvl }), help: (lvl: number) => t("upgrades.right_is_lava.tooltip", { lvl }),
@ -111,7 +137,8 @@ export const rawUpgrades = [
threshold: 400, threshold: 400,
id: "top_is_lava", id: "top_is_lava",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.top_is_lava.name"), name: t("upgrades.top_is_lava.name"),
help: (lvl: number) => t("upgrades.top_is_lava.tooltip", { lvl }), help: (lvl: number) => t("upgrades.top_is_lava.tooltip", { lvl }),
@ -122,7 +149,8 @@ export const rawUpgrades = [
threshold: 500, threshold: 500,
id: "telekinesis", id: "telekinesis",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.telekinesis.name"), name: t("upgrades.telekinesis.name"),
help: (lvl: number) => help: (lvl: number) =>
@ -134,7 +162,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 700, threshold: 700,
giftable: false, gift: false,
id: "coin_magnet", id: "coin_magnet",
max: 3, max: 3,
name: t("upgrades.coin_magnet.name"), name: t("upgrades.coin_magnet.name"),
@ -149,7 +178,8 @@ export const rawUpgrades = [
threshold: 800, threshold: 800,
id: "multiball", id: "multiball",
giftable: true, gift: true,
max: 6, max: 6,
name: t("upgrades.multiball.name"), name: t("upgrades.multiball.name"),
help: (lvl: number) => t("upgrades.multiball.tooltip", { count: lvl + 1 }), help: (lvl: number) => t("upgrades.multiball.tooltip", { count: lvl + 1 }),
@ -159,7 +189,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 1000, threshold: 1000,
giftable: false, gift: false,
id: "smaller_puck", id: "smaller_puck",
max: 2, max: 2,
name: t("upgrades.smaller_puck.name"), name: t("upgrades.smaller_puck.name"),
@ -173,7 +204,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 1500, threshold: 1500,
id: "pierce", id: "pierce",
giftable: false, gift: false,
max: 3, max: 3,
name: t("upgrades.pierce.name"), name: t("upgrades.pierce.name"),
help: (lvl: number) => t("upgrades.pierce.tooltip", { count: 3 * lvl }), help: (lvl: number) => t("upgrades.pierce.tooltip", { count: 3 * lvl }),
@ -184,7 +216,8 @@ export const rawUpgrades = [
threshold: 2000, threshold: 2000,
id: "picky_eater", id: "picky_eater",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.picky_eater.name"), name: t("upgrades.picky_eater.name"),
help: (lvl: number) => t("upgrades.picky_eater.tooltip", { lvl }), help: (lvl: number) => t("upgrades.picky_eater.tooltip", { lvl }),
@ -194,7 +227,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 2500, threshold: 2500,
giftable: false, gift: false,
id: "metamorphosis", id: "metamorphosis",
max: 1, max: 1,
name: t("upgrades.metamorphosis.name"), name: t("upgrades.metamorphosis.name"),
@ -206,7 +240,8 @@ export const rawUpgrades = [
threshold: 3000, threshold: 3000,
id: "compound_interest", id: "compound_interest",
giftable: true, gift: true,
max: 1, max: 1,
name: t("upgrades.compound_interest.name"), name: t("upgrades.compound_interest.name"),
help: (lvl: number) => t("upgrades.compound_interest.tooltip", { lvl }), help: (lvl: number) => t("upgrades.compound_interest.tooltip", { lvl }),
@ -216,7 +251,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 4000, threshold: 4000,
id: "hot_start", id: "hot_start",
giftable: true, gift: true,
max: 3, max: 3,
name: t("upgrades.hot_start.name"), name: t("upgrades.hot_start.name"),
help: (lvl: number) => help: (lvl: number) =>
@ -231,7 +267,8 @@ export const rawUpgrades = [
threshold: 6000, threshold: 6000,
id: "sapper", id: "sapper",
giftable: false, gift: false,
max: 7, max: 7,
name: t("upgrades.sapper.name"), name: t("upgrades.sapper.name"),
help: (lvl: number) => help: (lvl: number) =>
@ -245,7 +282,8 @@ export const rawUpgrades = [
threshold: 9000, threshold: 9000,
id: "bigger_explosions", id: "bigger_explosions",
giftable: false, gift: false,
max: 1, max: 1,
name: t("upgrades.bigger_explosions.name"), name: t("upgrades.bigger_explosions.name"),
help: (lvl: number) => t("upgrades.bigger_explosions.tooltip"), help: (lvl: number) => t("upgrades.bigger_explosions.tooltip"),
@ -255,7 +293,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 13000, threshold: 13000,
giftable: false, gift: false,
adventure: false, adventure: false,
id: "extra_levels", id: "extra_levels",
max: 3, max: 3,
@ -268,7 +307,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 15000, threshold: 15000,
giftable: false, gift: false,
id: "pierce_color", id: "pierce_color",
max: 4, max: 4,
name: t("upgrades.pierce_color.name"), name: t("upgrades.pierce_color.name"),
@ -278,7 +318,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 18000, threshold: 18000,
giftable: false, gift: false,
id: "soft_reset", id: "soft_reset",
max: 3, max: 3,
name: t("upgrades.soft_reset.name"), name: t("upgrades.soft_reset.name"),
@ -291,7 +332,8 @@ export const rawUpgrades = [
{ {
requires: "multiball", requires: "multiball",
threshold: 21000, threshold: 21000,
giftable: false, gift: false,
id: "ball_repulse_ball", id: "ball_repulse_ball",
max: 3, max: 3,
name: t("upgrades.ball_repulse_ball.name"), name: t("upgrades.ball_repulse_ball.name"),
@ -304,7 +346,8 @@ export const rawUpgrades = [
{ {
requires: "multiball", requires: "multiball",
threshold: 25000, threshold: 25000,
giftable: false, gift: false,
id: "ball_attract_ball", id: "ball_attract_ball",
max: 3, max: 3,
name: t("upgrades.ball_attract_ball.name"), name: t("upgrades.ball_attract_ball.name"),
@ -318,7 +361,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 30000, threshold: 30000,
giftable: false, gift: false,
id: "puck_repulse_ball", id: "puck_repulse_ball",
max: 2, max: 2,
name: t("upgrades.puck_repulse_ball.name"), name: t("upgrades.puck_repulse_ball.name"),
@ -332,7 +376,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 35000, threshold: 35000,
giftable: false, gift: false,
id: "wind", id: "wind",
max: 3, max: 3,
name: t("upgrades.wind.name"), name: t("upgrades.wind.name"),
@ -344,7 +389,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 40000, threshold: 40000,
giftable: false, gift: false,
id: "sturdy_bricks", id: "sturdy_bricks",
max: 4, max: 4,
name: t("upgrades.sturdy_bricks.name"), name: t("upgrades.sturdy_bricks.name"),
@ -359,7 +405,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 45000, threshold: 45000,
giftable: false, gift: false,
id: "respawn", id: "respawn",
max: 4, max: 4,
name: t("upgrades.respawn.name"), name: t("upgrades.respawn.name"),
@ -373,7 +420,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 50000, threshold: 50000,
giftable: false, gift: false,
id: "one_more_choice", id: "one_more_choice",
max: 3, max: 3,
name: t("upgrades.one_more_choice.name"), name: t("upgrades.one_more_choice.name"),
@ -384,7 +432,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 55000, threshold: 55000,
giftable: false, gift: false,
id: "instant_upgrade", id: "instant_upgrade",
max: 2, max: 2,
adventure: false, adventure: false,
@ -395,7 +444,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 60000, threshold: 60000,
giftable: false, gift: false,
id: "concave_puck", id: "concave_puck",
max: 1, max: 1,
name: t("upgrades.concave_puck.name"), name: t("upgrades.concave_puck.name"),
@ -406,7 +456,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 65000, threshold: 65000,
giftable: false, gift: false,
id: "helium", id: "helium",
max: 1, max: 1,
name: t("upgrades.helium.name"), name: t("upgrades.helium.name"),
@ -417,7 +468,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 70000, threshold: 70000,
giftable: true, gift: true,
id: "asceticism", id: "asceticism",
max: 1, max: 1,
name: t("upgrades.asceticism.name"), name: t("upgrades.asceticism.name"),
@ -428,7 +480,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 75000, threshold: 75000,
giftable: false, gift: false,
id: "unbounded", id: "unbounded",
max: 1, max: 1,
name: t("upgrades.unbounded.name"), name: t("upgrades.unbounded.name"),
@ -442,7 +495,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 80000, threshold: 80000,
giftable: false, gift: false,
id: "shunt", id: "shunt",
max: 3, max: 3,
name: t("upgrades.shunt.name"), name: t("upgrades.shunt.name"),
@ -456,7 +510,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 85000, threshold: 85000,
giftable: false, gift: false,
id: "yoyo", id: "yoyo",
max: 1, max: 1,
name: t("upgrades.yoyo.name"), name: t("upgrades.yoyo.name"),
@ -467,7 +522,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 90000, threshold: 90000,
giftable: true, gift: true,
id: "nbricks", id: "nbricks",
max: 3, max: 3,
name: t("upgrades.nbricks.name"), name: t("upgrades.nbricks.name"),
@ -478,7 +534,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 95000, threshold: 95000,
giftable: false, gift: false,
id: "etherealcoins", id: "etherealcoins",
max: 1, max: 1,
name: t("upgrades.etherealcoins.name"), name: t("upgrades.etherealcoins.name"),
@ -488,7 +545,8 @@ export const rawUpgrades = [
{ {
requires: "multiball", requires: "multiball",
threshold: 100000, threshold: 100000,
giftable: false, gift: false,
id: "shocks", id: "shocks",
max: 1, max: 1,
name: t("upgrades.shocks.name"), name: t("upgrades.shocks.name"),
@ -498,7 +556,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 105000, threshold: 105000,
giftable: true, gift: true,
id: "zen", id: "zen",
max: 1, max: 1,
name: t("upgrades.zen.name"), name: t("upgrades.zen.name"),
@ -508,7 +567,8 @@ export const rawUpgrades = [
{ {
requires: "extra_life", requires: "extra_life",
threshold: 110000, threshold: 110000,
giftable: false, gift: false,
id: "sacrifice", id: "sacrifice",
max: 1, max: 1,
name: t("upgrades.sacrifice.name"), name: t("upgrades.sacrifice.name"),
@ -522,7 +582,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 115000, threshold: 115000,
giftable: true, gift: true,
id: "trampoline", id: "trampoline",
max: 1, max: 1,
name: t("upgrades.trampoline.name"), name: t("upgrades.trampoline.name"),
@ -533,7 +594,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 120000, threshold: 120000,
giftable: false, gift: false,
id: "ghost_coins", id: "ghost_coins",
max: 3, max: 3,
name: t("upgrades.ghost_coins.name"), name: t("upgrades.ghost_coins.name"),
@ -543,7 +605,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 125000, threshold: 125000,
giftable: false, gift: false,
id: "forgiving", id: "forgiving",
max: 1, max: 1,
name: t("upgrades.forgiving.name"), name: t("upgrades.forgiving.name"),
@ -554,7 +617,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 130000, threshold: 130000,
giftable: false, gift: false,
id: "ball_attracts_coins", id: "ball_attracts_coins",
max: 3, max: 3,
name: t("upgrades.ball_attracts_coins.name"), name: t("upgrades.ball_attracts_coins.name"),
@ -565,7 +629,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 135000, threshold: 135000,
// a bit too hard when starting up // a bit too hard when starting up
giftable: false, gift: false,
id: "reach", id: "reach",
max: 1, max: 1,
name: t("upgrades.reach.name"), name: t("upgrades.reach.name"),
@ -576,7 +641,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 140000, threshold: 140000,
giftable: true, gift: true,
id: "passive_income", id: "passive_income",
max: 4, max: 4,
name: t("upgrades.passive_income.name"), name: t("upgrades.passive_income.name"),
@ -587,7 +653,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 145000, threshold: 145000,
giftable: false, gift: false,
id: "clairvoyant", id: "clairvoyant",
max: 1, max: 1,
name: t("upgrades.clairvoyant.name"), name: t("upgrades.clairvoyant.name"),
@ -598,7 +665,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 150000, threshold: 150000,
giftable: true, gift: true,
id: "side_kick", id: "side_kick",
max: 3, max: 3,
name: t("upgrades.side_kick.name"), name: t("upgrades.side_kick.name"),
@ -610,7 +678,8 @@ export const rawUpgrades = [
requires: "", requires: "",
threshold: 150000, threshold: 150000,
giftable: true, gift: true,
id: "side_flip", id: "side_flip",
max: 3, max: 3,
name: t("upgrades.side_flip.name"), name: t("upgrades.side_flip.name"),
@ -621,7 +690,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 155000, threshold: 155000,
giftable: false, gift: false,
id: "implosions", id: "implosions",
max: 1, max: 1,
name: t("upgrades.implosions.name"), name: t("upgrades.implosions.name"),
@ -631,7 +701,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 160000, threshold: 160000,
giftable: false, gift: false,
id: "corner_shot", id: "corner_shot",
max: 1, max: 1,
name: t("upgrades.corner_shot.name"), name: t("upgrades.corner_shot.name"),
@ -641,7 +712,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 165000, threshold: 165000,
giftable: false, gift: false,
id: "addiction", id: "addiction",
max: 7, max: 7,
name: t("upgrades.addiction.name"), name: t("upgrades.addiction.name"),
@ -652,7 +724,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 170000, threshold: 170000,
giftable: false, gift: false,
id: "fountain_toss", id: "fountain_toss",
max: 7, max: 7,
name: t("upgrades.fountain_toss.name"), name: t("upgrades.fountain_toss.name"),
@ -663,7 +736,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 175000, threshold: 175000,
giftable: false, gift: false,
id: "limitless", id: "limitless",
max: 1, max: 1,
name: t("upgrades.limitless.name"), name: t("upgrades.limitless.name"),
@ -673,7 +747,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 180000, threshold: 180000,
giftable: false, gift: false,
id: "minefield", id: "minefield",
max: 3, max: 3,
name: t("upgrades.minefield.name"), name: t("upgrades.minefield.name"),
@ -683,7 +758,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 185000, threshold: 185000,
giftable: false, gift: false,
id: "trickledown", id: "trickledown",
max: 1, max: 1,
name: t("upgrades.trickledown.name"), name: t("upgrades.trickledown.name"),
@ -693,7 +769,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 190000, threshold: 190000,
giftable: false, gift: false,
id: "transparency", id: "transparency",
max: 3, max: 3,
name: t("upgrades.transparency.name"), name: t("upgrades.transparency.name"),
@ -703,7 +780,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 195000, threshold: 195000,
giftable: false, gift: false,
id: "superhot", id: "superhot",
max: 3, max: 3,
name: t("upgrades.superhot.name"), name: t("upgrades.superhot.name"),
@ -713,7 +791,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 200000, threshold: 200000,
giftable: false, gift: false,
id: "bricks_attract_coins", id: "bricks_attract_coins",
max: 3, max: 3,
name: t("upgrades.bricks_attract_coins.name"), name: t("upgrades.bricks_attract_coins.name"),
@ -723,7 +802,8 @@ export const rawUpgrades = [
{ {
requires: "", requires: "",
threshold: 205000, threshold: 205000,
giftable: false, gift: false,
id: "rainbow", id: "rainbow",
max: 7, max: 7,
name: t("upgrades.rainbow.name"), name: t("upgrades.rainbow.name"),
@ -733,7 +813,8 @@ export const rawUpgrades = [
{ {
requires: "metamorphosis", requires: "metamorphosis",
threshold: 210000, threshold: 210000,
giftable: false, gift: false,
id: "hypnosis", id: "hypnosis",
max: 1, max: 1,
name: t("upgrades.hypnosis.name"), name: t("upgrades.hypnosis.name"),