This commit is contained in:
Renan LE CARO 2025-04-30 16:29:49 +02:00
parent cee5c6bc60
commit 45f9b516fc
23 changed files with 1069 additions and 797 deletions

View file

@ -1,5 +1,5 @@
// The version of the cache.
const VERSION = "29099215";
const VERSION = "29100127";
// The name of the cache
const CACHE_NAME = `breakout-71-${VERSION}`;

View file

@ -149,6 +149,12 @@
"bricks": "__________t__W_tt_WWW_t__W_ttt______",
"credit": ""
},
{
"name": "icon:extra_life",
"size": 8,
"bricks": "_________WW__WW_WGGWWGGWWGGGGGGWWGGGGGGW_WGGGGW___WGGW_____WW___",
"credit": ""
},
{
"name": "icon:forgiving",
"size": 8,
@ -167,6 +173,12 @@
"bricks": "__bbb___bbbbb_bbybybbbbbbbbbbbyyybbbbbbbbbbb_b_bb",
"credit": ""
},
{
"name": "icon:gold_medal",
"size": 10,
"bricks": "tttttttttttttttttttttt______ttttt____ttt_tttggttt___tgyygt____gyyyyg____gyyyyg_____gyyg_______gg____",
"credit": ""
},
{
"name": "icon:golden_goose",
"size": 8,
@ -251,6 +263,12 @@
"bricks": "_ggg____gbgg___gbbgg__gbbbg__gbbgg__gbgg___ggg___",
"credit": ""
},
{
"name": "icon:no_medal",
"size": 10,
"bricks": "gggggggggggggggggggggg______ggggg____ggg_g_gggg_g___gg__gg____g____g____g____g_____g__g_______gg____",
"credit": ""
},
{
"name": "icon:one_more_choice",
"size": 7,
@ -377,6 +395,12 @@
"bricks": "________ttttr__ttttr__________W______________WWW_",
"credit": ""
},
{
"name": "icon:silver_medal",
"size": 10,
"bricks": "bbbbbbbbbbbbbbbbbbbbbb______bbbbb____bbb_bbbggbbb___bgllgb____gllllg____gllllg_____gllg_______gg____",
"credit": ""
},
{
"name": "icon:skip_last",
"size": 5,
@ -1446,17 +1470,9 @@
"credit": "White n black by Topenvy"
},
{
"name": "icon:locked",
"size": 8,
"bricks": "__eeee____e__e____e__e____e__e___llllll__llllll__llllll__llllll_",
"svg": null,
"color": ""
},
{
"color": "#000000",
"name": "italy",
"size": 8,
"bricks": "_________GGWWrr__GGWWrr__GGWWrr__GGWWrr_________________________",
"name": "italy",
"credit": "italia by Topenvy"
}
]
]

View file

@ -1 +1 @@
"29099215"
"29100127"

View file

@ -467,6 +467,7 @@ h2.histogram-title strong {
}
&.capped {
opacity: 0.5;
> span:first-child {
color: #fff;
background: #000;
@ -501,24 +502,28 @@ h2.histogram-title strong {
button {
color: #fff;
background: gold;
align-self: flex-start;
font-weight: bold;
padding: 5px;
border-radius: 5px;
box-shadow:
0 4px 0 gold,
0 4px 10px black;
border: 2px solid white;
cursor: pointer;
text-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
text-shadow: 0 0 2px #185fa8;
user-select: none;
background: linear-gradient(#5da3ea, #3e86ce);
border: 2px solid #fff;
border-radius: 5px;
align-self: flex-start;
padding: 5px;
font-weight: bold;
transition:
transform 0.2s,
box-shadow 0.2s;
box-shadow: 0 1px 0 black inset, 0 2px #5da3ea, 0 4px white;
&:hover{
background: #5da3ea;
}
&:active {
transform: translate(0, 4px);
box-shadow:
0 0px 0 gold,
0 0px 10px black;
box-shadow: 0 1px 0 black inset, 0 0px #5da3ea, 0 0px white;
}
transition:
transform 0.2s,
box-shadow 0.2s;

View file

@ -1783,7 +1783,7 @@ export function ballTick(gameState: GameState, ball: Ball, frames: number) {
ball.vy > 0 &&
(ballIsUnderPuck ||
(gameState.balls.length < 2 &&
gameState.extra_lives &&
gameState.perks.extra_life &&
ball.y > ylimit + gameState.puckHeight / 2))
) {
if (ballIsUnderPuck) {
@ -2002,9 +2002,9 @@ export function ballTick(gameState: GameState, ball: Ball, frames: number) {
}
function justLostALife(gameState: GameState, ball: Ball, x: number, y: number) {
gameState.extra_lives -= 1;
if (gameState.extra_lives < 0) {
gameState.extra_lives = 0;
gameState.perks.extra_life -= 1;
if (gameState.perks.extra_life < 0) {
gameState.perks.extra_life = 0;
} else if (gameState.perks.sacrifice) {
gameState.combo *= gameState.perks.sacrifice;
gameState.bricks.forEach(

View file

@ -68,25 +68,26 @@
"lab.reset": "إعادة ضبط",
"lab.select_level": "حدد المستوى للعب عليه",
"lab.unlocks_at": "يتم فتحه عند إجمالي النتيجة {{score}}",
"level_up.add_perks": "",
"level_up.challenges.catchRateGood.description": "",
"level_up.challenges.catchRateGood.name": "",
"level_up.challenges.intro": "",
"level_up.challenges.levelMisses.description": "",
"level_up.challenges.levelMisses.name": "",
"level_up.challenges.levelTime.description": "",
"level_up.challenges.levelTime.name": "",
"level_up.challenges.levelWallBounces.description": "",
"level_up.challenges.levelWallBounces.name": "",
"level_up.go": "",
"level_up.instructions": "",
"level_up.go_with_upgrades": "",
"level_up.gold": "",
"level_up.maxed_upgrade": "",
"level_up.missed.best": "",
"level_up.missed.catchRate.best": "",
"level_up.missed.catchRate.good": "",
"level_up.missed.good": "",
"level_up.missed.levelMisses.best": "",
"level_up.missed.levelMisses.good": "",
"level_up.missed.levelTime.best": "",
"level_up.missed.levelTime.good": "",
"level_up.missed.levelWallBounces.best": "",
"level_up.missed.levelWallBounces.good": "",
"level_up.no_points": "",
"level_up.no": "",
"level_up.pick": "",
"level_up.pick_upgrade": "",
"level_up.silver": "",
"level_up.title": "لقد انتهيت للتو من المستوى {{level}}/{{max}}.",
"level_up.upgrade": "",
"level_up.upgrade_perk_to_level": "",
"level_up.upgrade_perks": "",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
@ -169,11 +170,12 @@
"play.stats.levelTime": "وقت المستوى",
"play.stats.levelWallBounces": "ارتدادات الحائط",
"score_panel.close_to_unlock": "فتح المستوى التالي:",
"score_panel.extra_lives_count": "",
"score_panel.get_upgrades_to_unlock": "احصل على {{missingUpgrades}} واحصل على {{points}} نقطة إضافية لفتح المستوى \"{{level}}\"",
"score_panel.score_to_unlock": "احصل على {{points}} نقطة إضافية لفتح المستوى \"{{level}}\"",
"score_panel.title": "{{score}} نقطة في المستوى {{level}}/{{max}} ",
"score_panel.upcoming_levels": "المستويات القادمة :",
"score_panel.upcoming_levels": "",
"score_panel.upgrade_point_count": "",
"score_panel.upgrade_points_count": "المستويات القادمة :",
"score_panel.upgrades_picked": "الترقيات التي تم اختيارها في هذه اللعبة:",
"settings.autoplay": "التشغيل التلقائي",
"settings.autoplay_help": "ابدأ جلسة مع ترقيات عشوائية ومجداف يتم التحكم فيه بواسطة الكمبيوتر",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "5 دقائق إضافية",
"upgrades.extra_levels.tooltip": "العب {{count}} مستوى بدلاً من 7",
"upgrades.extra_levels.verbose_description": "يمكن أن تستمر اللعبة الافتراضية لسبعة مستويات كحد أقصى، تنتهي بعدها.\n\nيتيح لك كل مستوى من هذه الميزة الانتقال إلى مستوى أعلى. غالبًا ما تكون المستويات الأخيرة هي التي تحقق فيها أعلى النقاط، لذا قد يكون الفرق كبيرًا.",
"upgrades.extra_life.name": "",
"upgrades.extra_life.tooltip": "",
"upgrades.extra_life.verbose_description": "",
"upgrades.forgiving.name": "غفور",
"upgrades.forgiving.tooltip": "يؤدي فقدان الفواصل إلى تقليل المجموعة تدريجيًا بدلاً من تقليلها دفعة واحدة.",
"upgrades.forgiving.verbose_description": "أول خطأ في كل مستوى مجاني، ثم 10% من المجموعة، ثم 20% ..",

File diff suppressed because it is too large Load diff

View file

@ -68,25 +68,26 @@
"lab.reset": "Zurücksetzen",
"lab.select_level": "Wähle ein Level zum Spielen",
"lab.unlocks_at": "Wird bei Gesamtpunktzahl {{score}} freigeschaltet",
"level_up.add_perks": "",
"level_up.challenges.catchRateGood.description": "",
"level_up.challenges.catchRateGood.name": "",
"level_up.challenges.intro": "",
"level_up.challenges.levelMisses.description": "",
"level_up.challenges.levelMisses.name": "",
"level_up.challenges.levelTime.description": "",
"level_up.challenges.levelTime.name": "",
"level_up.challenges.levelWallBounces.description": "",
"level_up.challenges.levelWallBounces.name": "",
"level_up.go": "",
"level_up.instructions": "",
"level_up.go_with_upgrades": "",
"level_up.gold": "",
"level_up.maxed_upgrade": "",
"level_up.missed.best": "",
"level_up.missed.catchRate.best": "",
"level_up.missed.catchRate.good": "",
"level_up.missed.good": "",
"level_up.missed.levelMisses.best": "",
"level_up.missed.levelMisses.good": "",
"level_up.missed.levelTime.best": "",
"level_up.missed.levelTime.good": "",
"level_up.missed.levelWallBounces.best": "",
"level_up.missed.levelWallBounces.good": "",
"level_up.no_points": "",
"level_up.no": "",
"level_up.pick": "",
"level_up.pick_upgrade": "",
"level_up.silver": "",
"level_up.title": "Du hast gerade Level {{level}}/{{max}} beendet.",
"level_up.upgrade": "",
"level_up.upgrade_perk_to_level": "",
"level_up.upgrade_perks": "",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
@ -169,11 +170,12 @@
"play.stats.levelTime": "Zeit pro Level",
"play.stats.levelWallBounces": "Wandaufpralle",
"score_panel.close_to_unlock": "Nächstes Level freischalten:",
"score_panel.extra_lives_count": "",
"score_panel.get_upgrades_to_unlock": "Hole {{missingUpgrades}} und erziele {{points}} mehr Punkte, um Level \"{{level}}\" freizuschalten.",
"score_panel.score_to_unlock": "Erziele {{points}} mehr Punkte, um Level \"{{level}}\" freizuschalten.",
"score_panel.title": "{{score}} Punkte in Level {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Kommende Level:",
"score_panel.upcoming_levels": "",
"score_panel.upgrade_point_count": "",
"score_panel.upgrade_points_count": "Kommende Level:",
"score_panel.upgrades_picked": "In diesem Spiel freigeschaltete Upgrades:",
"settings.autoplay": "Automatisch spielen",
"settings.autoplay_help": "Starte eine Sitzung mit zufälligen Upgrades und einem computergesteuerten Paddel",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "5 min mehr",
"upgrades.extra_levels.tooltip": "Spielen Sie {{count}} Stufen statt 7",
"upgrades.extra_levels.verbose_description": "Das Standardspiel kann maximal 7 Stufen dauern, danach ist das Spiel vorbei.\n\nMit jeder Stufe dieses Vorteils können Sie eine Stufe höher gehen. Die letzten Level sind oft diejenigen, in denen man die meisten Punkte macht, so dass der Unterschied dramatisch sein kann.",
"upgrades.extra_life.name": "",
"upgrades.extra_life.tooltip": "",
"upgrades.extra_life.verbose_description": "",
"upgrades.forgiving.name": "Verzeihen",
"upgrades.forgiving.tooltip": "Durch fehlende Pausen wird die Kombo schrittweise reduziert, anstatt auf einmal.",
"upgrades.forgiving.verbose_description": "Der erste Fehlschuss pro Level ist kostenlos, dann 10% der Combo, dann 20% ...",

View file

@ -68,25 +68,26 @@
"lab.reset": "Reset",
"lab.select_level": "Select a level to play on",
"lab.unlocks_at": "Unlocks at total score {{score}}",
"level_up.add_perks": "Add perks to your build",
"level_up.challenges.catchRateGood.description": "You'll get a gold medal (+1 choices, +1 upgrade point) for catching {{gold}}% of coins. You'll get a silver medal (+1 upgrade point) if you catch {{silver}}%. This level you caught {{caught}} coins out of {{total}}",
"level_up.challenges.catchRateGood.name": "{{value}}% coins caught ",
"level_up.challenges.intro": "Play well to earn extra upgrades and choices",
"level_up.challenges.levelMisses.description": "You'll get a gold medal (+1 choices, +1 upgrade point) if you miss all bricks less than {{gold}} times. You'll get a silver medal (+1 upgrade point) under {{silver}} missed shots. ",
"level_up.challenges.levelMisses.name": "{{value}} missed shots",
"level_up.challenges.levelTime.description": "You'll get a gold medal (+1 choices, +1 upgrade point) if you clear the level under {{gold}}s . You'll get a silver medal (+1 upgrade point) under {{silver}}s. ",
"level_up.challenges.levelTime.name": "{{value}}s play time",
"level_up.challenges.levelWallBounces.description": "You'll get a gold medal (+1 choices, +1 upgrade point) if the ball bounces less than {{gold}} times on the wall and ceiling. You'll get a silver medal (+1 upgrade point) if if the ball bounces less than {{silver}} times. ",
"level_up.challenges.levelWallBounces.name": "{{value}} wall bounces",
"level_up.go": "Continue to level \"{{name}}\"",
"level_up.instructions": "You can use your {{count}} lives to buy upgrades below or keep them to be safe. ",
"level_up.go_with_upgrades": "Spend your {{count}} upgrade points first",
"level_up.gold": "You gained one choice and upgrade point.",
"level_up.maxed_upgrade": "\"{{name}}\" is at max level",
"level_up.missed.best": "Expert challenge",
"level_up.missed.catchRate.best": "Catch {{target}}% of coins to gain one more choice.",
"level_up.missed.catchRate.good": "Catch {{target}}% of coins to gain one more life and choice.",
"level_up.missed.good": "Enthusiast challenge",
"level_up.missed.levelMisses.best": "Miss the bricks less than {{target}} times to gain one more choice.",
"level_up.missed.levelMisses.good": "Miss the bricks less than {{target}} times to gain one more life and choice.",
"level_up.missed.levelTime.best": "Clear the level in less than {{target}} seconds to gain one more choice.",
"level_up.missed.levelTime.good": "Clear the level in less than {{target}} seconds to gain one more life and choice.",
"level_up.missed.levelWallBounces.best": "Hit the walls less than {{target}} times to gain one more choice.",
"level_up.missed.levelWallBounces.good": "Hit the walls less than {{target}} times to gain one more life and choice.",
"level_up.no_points": "You've spent all your extra lives.",
"level_up.no": "You did not meet the reward condition.",
"level_up.pick": "Pick",
"level_up.pick_upgrade": "Get \"{{name}}\"",
"level_up.silver": "You gained an upgrade point.",
"level_up.title": "Level {{level}}/{{max}} cleared",
"level_up.upgrade": "Upgrade",
"level_up.upgrade_perk_to_level": "Upgrade \"{{name}}\" to level {{level}}",
"level_up.upgrade_perks": "Your current perks",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
@ -169,11 +170,12 @@
"play.stats.levelTime": "Level time",
"play.stats.levelWallBounces": "Wall bounces",
"score_panel.close_to_unlock": "Next level unlock :",
"score_panel.extra_lives_count": "You have accumulated {{count}} upgrade points.",
"score_panel.get_upgrades_to_unlock": "Get {{missingUpgrades}} and score {{points}} more points to unlock level \"{{level}}\"",
"score_panel.score_to_unlock": "Score {{points}} more points to unlock level \"{{level}}\"",
"score_panel.title": "{{score}} points at level {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Upcoming levels :",
"score_panel.upcoming_levels": "Upcoming levels",
"score_panel.upgrade_point_count": "You have accumulated {{count}} upgrade points.",
"score_panel.upgrade_points_count": "Upcoming levels :",
"score_panel.upgrades_picked": "Upgrades picked : ",
"settings.autoplay": "Auto play",
"settings.autoplay_help": "Start a session with random upgrades and a computer controlled paddle",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "5 min more",
"upgrades.extra_levels.tooltip": "Play {{count}} levels instead of 7",
"upgrades.extra_levels.verbose_description": "The default game can last a max of 7 levels, after which the game is over. \n\nEach level of this perk lets you go one level higher. The last levels are often the ones where you make the most score, so the difference can be dramatic.",
"upgrades.extra_life.name": "Extra life",
"upgrades.extra_life.tooltip": "Saves your last ball if it's about to be lost",
"upgrades.extra_life.verbose_description": "The life will be consumed in the process. Extra lives show as while lines behind the puck.",
"upgrades.forgiving.name": "Forgiving",
"upgrades.forgiving.tooltip": "Keep most of your combo when missing",
"upgrades.forgiving.verbose_description": "The first miss per level is free, then 10% of the combo, then 20% .. ",

View file

@ -68,25 +68,26 @@
"lab.reset": "Reiniciar",
"lab.select_level": "Selecciona un nivel para jugar",
"lab.unlocks_at": "Desbloqueado a partir de una puntuación total de {{score}}.",
"level_up.add_perks": "",
"level_up.challenges.catchRateGood.description": "",
"level_up.challenges.catchRateGood.name": "",
"level_up.challenges.intro": "",
"level_up.challenges.levelMisses.description": "",
"level_up.challenges.levelMisses.name": "",
"level_up.challenges.levelTime.description": "",
"level_up.challenges.levelTime.name": "",
"level_up.challenges.levelWallBounces.description": "",
"level_up.challenges.levelWallBounces.name": "",
"level_up.go": "",
"level_up.instructions": "",
"level_up.go_with_upgrades": "",
"level_up.gold": "",
"level_up.maxed_upgrade": "",
"level_up.missed.best": "",
"level_up.missed.catchRate.best": "",
"level_up.missed.catchRate.good": "",
"level_up.missed.good": "",
"level_up.missed.levelMisses.best": "",
"level_up.missed.levelMisses.good": "",
"level_up.missed.levelTime.best": "",
"level_up.missed.levelTime.good": "",
"level_up.missed.levelWallBounces.best": "",
"level_up.missed.levelWallBounces.good": "",
"level_up.no_points": "",
"level_up.no": "",
"level_up.pick": "",
"level_up.pick_upgrade": "",
"level_up.silver": "",
"level_up.title": "Acabas de completar el nivel {{level}}/{{max}}.",
"level_up.upgrade": "",
"level_up.upgrade_perk_to_level": "",
"level_up.upgrade_perks": "",
"main_menu.basic": "Gráficos simplificados",
"main_menu.basic_help": "Mejor rendimiento.",
"main_menu.colorful_coins": "Piezas de color",
@ -169,11 +170,12 @@
"play.stats.levelTime": "Duración del nivel",
"play.stats.levelWallBounces": "Rebota en las paredes",
"score_panel.close_to_unlock": "Siguiente nivel desbloqueado:",
"score_panel.extra_lives_count": "",
"score_panel.get_upgrades_to_unlock": "Consigue {{missingUpgrades}} y coge {{points}} monedas extra para desbloquear el nivel \"{{level}}\".",
"score_panel.score_to_unlock": "Coge {{points}} monedas más para desbloquear el nivel \"{{level}}\".",
"score_panel.title": "{{score}} puntos en {{level}}/{{max}} nivel",
"score_panel.upcoming_levels": "Niveles de partido :",
"score_panel.upcoming_levels": "",
"score_panel.upgrade_point_count": "",
"score_panel.upgrade_points_count": "Niveles de partido :",
"score_panel.upgrades_picked": "Mejoras elegidas durante el juego :",
"settings.autoplay": "Auto-reproducción",
"settings.autoplay_help": "Comienza una sesión con mejoras aleatorias y una paleta controlada por computadora.",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "5 minutos más",
"upgrades.extra_levels.tooltip": "Juega {{count}} niveles en lugar de 7",
"upgrades.extra_levels.verbose_description": "El juego suele durar 7 niveles, tras los cuales se acaba la partida y la puntuación que hayas alcanzado es tu puntuación del juego.\n\nElegir esta mejora te permite prolongar el juego un nivel. Los últimos niveles suelen ser en los que más puntos consigues, así que la diferencia puede ser espectacular.",
"upgrades.extra_life.name": "",
"upgrades.extra_life.tooltip": "",
"upgrades.extra_life.verbose_description": "",
"upgrades.forgiving.name": "Errar es humano",
"upgrades.forgiving.tooltip": "Perder los ladrillos significa perder una porción progresivamente mayor del combo",
"upgrades.forgiving.verbose_description": " El primer ladrillo perdido por nivel no cuesta nada, el siguiente 10%, 20% y así sucesivamente.",

View file

@ -68,25 +68,26 @@
"lab.reset": "Réinitialiser",
"lab.select_level": "Sélectionnez un niveau sur lequel jouer",
"lab.unlocks_at": "Déverrouillé à partir d'un score total de {{score}}",
"level_up.add_perks": "",
"level_up.challenges.catchRateGood.description": "",
"level_up.challenges.catchRateGood.name": "",
"level_up.challenges.intro": "",
"level_up.challenges.levelMisses.description": "",
"level_up.challenges.levelMisses.name": "",
"level_up.challenges.levelTime.description": "",
"level_up.challenges.levelTime.name": "",
"level_up.challenges.levelWallBounces.description": "",
"level_up.challenges.levelWallBounces.name": "",
"level_up.go": "",
"level_up.instructions": "",
"level_up.go_with_upgrades": "",
"level_up.gold": "",
"level_up.maxed_upgrade": "",
"level_up.missed.best": "",
"level_up.missed.catchRate.best": "",
"level_up.missed.catchRate.good": "",
"level_up.missed.good": "",
"level_up.missed.levelMisses.best": "",
"level_up.missed.levelMisses.good": "",
"level_up.missed.levelTime.best": "",
"level_up.missed.levelTime.good": "",
"level_up.missed.levelWallBounces.best": "",
"level_up.missed.levelWallBounces.good": "",
"level_up.no_points": "",
"level_up.no": "",
"level_up.pick": "",
"level_up.pick_upgrade": "",
"level_up.silver": "",
"level_up.title": "Vous venez de terminer le niveau {{level}}/{{max}}.",
"level_up.upgrade": "",
"level_up.upgrade_perk_to_level": "",
"level_up.upgrade_perks": "",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
@ -169,11 +170,12 @@
"play.stats.levelTime": "Durée du niveau",
"play.stats.levelWallBounces": "Rebonds sur les murs",
"score_panel.close_to_unlock": "Prochain niveau débloqué : ",
"score_panel.extra_lives_count": "",
"score_panel.get_upgrades_to_unlock": "Obtenez {{missingUpgrades}} et attrapez {{points}} pièces supplémentaires pour débloquer le niveau « {{level}} »",
"score_panel.score_to_unlock": "Attrapez {{points}} pièces supplémentaires pour débloquer le niveau « {{level}} »",
"score_panel.title": "{{score}} points au niveau {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Niveaux de la parties : ",
"score_panel.upcoming_levels": "",
"score_panel.upgrade_point_count": "",
"score_panel.upgrade_points_count": "Niveaux de la parties : ",
"score_panel.upgrades_picked": "Améliorations choisies :",
"settings.autoplay": "Lecture automatique",
"settings.autoplay_help": "Démarrez une session avec des mises à niveau aléatoires et une pagaie contrôlée par ordinateur",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "Encore 5 minutes",
"upgrades.extra_levels.tooltip": "Jouer {{count}} niveaux au lieu de 7",
"upgrades.extra_levels.verbose_description": "La partie dure normalement 7 niveaux, après quoi le jeu est terminé et le score que vous avez atteint est votre score de partie.\n\nChoisir cette amélioration vous permet de prolonger la partie d'un niveau. Les derniers niveaux sont souvent ceux où vous faites le plus de points, la différence peut donc être spectaculaire.",
"upgrades.extra_life.name": "",
"upgrades.extra_life.tooltip": "",
"upgrades.extra_life.verbose_description": "",
"upgrades.forgiving.name": "L'erreur est humaine",
"upgrades.forgiving.tooltip": "Rater les briques fait perdre un portion progressivement plu importante du combo",
"upgrades.forgiving.verbose_description": " La première brique ratée par niveau ne coûte rien, la suivante 10%, 20%, etc.",

View file

@ -68,25 +68,26 @@
"lab.reset": "Перезагрузить",
"lab.select_level": "Выберите уровень для игры",
"lab.unlocks_at": "Открывается при общем количестве очков {{score}}",
"level_up.add_perks": "",
"level_up.challenges.catchRateGood.description": "",
"level_up.challenges.catchRateGood.name": "",
"level_up.challenges.intro": "",
"level_up.challenges.levelMisses.description": "",
"level_up.challenges.levelMisses.name": "",
"level_up.challenges.levelTime.description": "",
"level_up.challenges.levelTime.name": "",
"level_up.challenges.levelWallBounces.description": "",
"level_up.challenges.levelWallBounces.name": "",
"level_up.go": "",
"level_up.instructions": "",
"level_up.go_with_upgrades": "",
"level_up.gold": "",
"level_up.maxed_upgrade": "",
"level_up.missed.best": "",
"level_up.missed.catchRate.best": "",
"level_up.missed.catchRate.good": "",
"level_up.missed.good": "",
"level_up.missed.levelMisses.best": "",
"level_up.missed.levelMisses.good": "",
"level_up.missed.levelTime.best": "",
"level_up.missed.levelTime.good": "",
"level_up.missed.levelWallBounces.best": "",
"level_up.missed.levelWallBounces.good": "",
"level_up.no_points": "",
"level_up.no": "",
"level_up.pick": "",
"level_up.pick_upgrade": "",
"level_up.silver": "",
"level_up.title": "Вы только что закончили уровень {{level}}/{{max}}.",
"level_up.upgrade": "",
"level_up.upgrade_perk_to_level": "",
"level_up.upgrade_perks": "",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
@ -169,11 +170,12 @@
"play.stats.levelTime": "Время уровня",
"play.stats.levelWallBounces": "Отскоки от стены",
"score_panel.close_to_unlock": "Разблокировка следующего уровня:",
"score_panel.extra_lives_count": "",
"score_panel.get_upgrades_to_unlock": "Наберите {{missingUpgrades}} и наберите {{points}} больше очков, чтобы разблокировать уровень \"{{level}}\"",
"score_panel.score_to_unlock": "Наберите {{points}} больше очков, чтобы разблокировать уровень \"{{level}}\"",
"score_panel.title": "{{score}} очков на уровне {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Предстоящие уровни :",
"score_panel.upcoming_levels": "",
"score_panel.upgrade_point_count": "",
"score_panel.upgrade_points_count": "Предстоящие уровни :",
"score_panel.upgrades_picked": "Обновления, выбранные в этой игре, запускаются :",
"settings.autoplay": "Автоматическое воспроизведение",
"settings.autoplay_help": "Начните сеанс со случайными улучшениями и компьютерным веслом",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "Еще 5 минут",
"upgrades.extra_levels.tooltip": "Играйте {{count}} уровней вместо 7",
"upgrades.extra_levels.verbose_description": "По умолчанию игра может длиться максимум 7 уровней, после чего игра заканчивается.\n\nКаждый уровень этой привилегии позволяет вам подняться на один уровень выше. Последние уровни часто являются теми, где вы набираете больше всего очков, так что разница может быть значительной.",
"upgrades.extra_life.name": "",
"upgrades.extra_life.tooltip": "",
"upgrades.extra_life.verbose_description": "",
"upgrades.forgiving.name": "Прощение",
"upgrades.forgiving.tooltip": "Пропущенные паузы уменьшают комбо постепенно, а не все сразу.",
"upgrades.forgiving.verbose_description": "Первый промах за уровень - бесплатно, затем 10% от комбо, затем 20%.",

View file

@ -68,25 +68,26 @@
"lab.reset": "Sıfırla",
"lab.select_level": "Oynamak için bir seviye seçin",
"lab.unlocks_at": "Toplam puan {{score}}olduğunda açılır",
"level_up.add_perks": "",
"level_up.challenges.catchRateGood.description": "",
"level_up.challenges.catchRateGood.name": "",
"level_up.challenges.intro": "",
"level_up.challenges.levelMisses.description": "",
"level_up.challenges.levelMisses.name": "",
"level_up.challenges.levelTime.description": "",
"level_up.challenges.levelTime.name": "",
"level_up.challenges.levelWallBounces.description": "",
"level_up.challenges.levelWallBounces.name": "",
"level_up.go": "",
"level_up.instructions": "",
"level_up.go_with_upgrades": "",
"level_up.gold": "",
"level_up.maxed_upgrade": "",
"level_up.missed.best": "",
"level_up.missed.catchRate.best": "",
"level_up.missed.catchRate.good": "",
"level_up.missed.good": "",
"level_up.missed.levelMisses.best": "",
"level_up.missed.levelMisses.good": "",
"level_up.missed.levelTime.best": "",
"level_up.missed.levelTime.good": "",
"level_up.missed.levelWallBounces.best": "",
"level_up.missed.levelWallBounces.good": "",
"level_up.no_points": "",
"level_up.no": "",
"level_up.pick": "",
"level_up.pick_upgrade": "",
"level_up.silver": "",
"level_up.title": " {{level}}/{{max}}seviyesini yeni bitirdiniz.",
"level_up.upgrade": "",
"level_up.upgrade_perk_to_level": "",
"level_up.upgrade_perks": "",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
@ -169,11 +170,12 @@
"play.stats.levelTime": "Seviye zamanı",
"play.stats.levelWallBounces": "Duvar sıçramaları",
"score_panel.close_to_unlock": "Sonraki seviyenin kilidini aç:",
"score_panel.extra_lives_count": "",
"score_panel.get_upgrades_to_unlock": " {{missingUpgrades}} alın ve \"{{level}}\" seviyesinin kilidini açmak için {{points}} puan daha kazanın",
"score_panel.score_to_unlock": "\"{{level}}\" seviyesini açmak için {{points}} puan daha kazanın",
"score_panel.title": " {{level}}/{{max}} seviyesinde{{score}} puan",
"score_panel.upcoming_levels": "Yaklaşan seviyeler :",
"score_panel.upcoming_levels": "",
"score_panel.upgrade_point_count": "",
"score_panel.upgrade_points_count": "Yaklaşan seviyeler :",
"score_panel.upgrades_picked": "Bu oyun çalışmasında seçilen yükseltmeler:",
"settings.autoplay": "Otomatik oynatma",
"settings.autoplay_help": "Rastgele yükseltmeler ve bilgisayar kontrollü bir kürekle bir oturum başlatın",
@ -313,6 +315,9 @@
"upgrades.extra_levels.name": "5 dakika daha",
"upgrades.extra_levels.tooltip": "7 yerine {{count}} seviye oyna",
"upgrades.extra_levels.verbose_description": "Varsayılan oyun en fazla 7 seviye sürebilir, ardından oyun biter. \n\nBu avantajın her seviyesi bir seviye daha yukarı çıkmanızı sağlar. Son seviyeler genellikle en fazla puanı aldığınız seviyelerdir, bu yüzden fark dramatik olabilir.",
"upgrades.extra_life.name": "",
"upgrades.extra_life.tooltip": "",
"upgrades.extra_life.verbose_description": "",
"upgrades.forgiving.name": "Bağışlayıcı",
"upgrades.forgiving.tooltip": "Molaları kaçırmak, komboyu bir kerede azaltmak yerine kademeli olarak azaltır.",
"upgrades.forgiving.verbose_description": "Her seviyede ilk ıskalama bedava, sonra kombonun %10'u, sonra %20'si...",

View file

@ -144,7 +144,7 @@ export function newGameState(params: RunParams): GameState {
needsRender: true,
autoCleanUses: 0,
...defaultSounds(),
extra_lives: 0,
upgrade_points: 0,
creative:
params?.computer_controlled ||
sumOfValues(params.perks) > 1 ||

View file

@ -28,8 +28,10 @@ export async function openScorePanel(gameState: GameState) {
pickedUpgradesHTMl(gameState),
levelsListHTMl(gameState, gameState.currentLevel),
getNearestUnlockHTML(gameState),
gameState.extra_lives
? t("score_panel.extra_lives_count", { count: gameState.extra_lives })
gameState.upgrade_points
? t("score_panel.upgrade_point_count", {
count: gameState.upgrade_points,
})
: "",
],
allowClose: true,
@ -90,7 +92,7 @@ export function getNearestUnlockHTML(gameState: GameState) {
return `
<p>${t("score_panel.close_to_unlock")}</p>
<div class="upgrade used">
<div class="upgrade">
${icons[firstUnlockable.l.name]}
<p>
<strong>${title}</strong>

View file

@ -11,7 +11,7 @@ import {
} from "./pure_functions";
import { t } from "./i18n/i18n";
import { icons, upgrades } from "./loadGameData";
import { asyncAlert } from "./asyncAlert";
import { asyncAlert, requiredAsyncAlert } from "./asyncAlert";
import {
escapeAttribute,
getPossibleUpgrades,
@ -26,100 +26,82 @@ export async function openUpgradesPicker(gameState: GameState) {
gameState.levelCoughtCoins / (gameState.levelSpawnedCoins || 1);
let choices = 3;
let livesWon = 1;
let missedOpportunities = [];
const good = ""; // '<strong>'+t('level_up.missed.good')+'</strong>: '
const best = ""; //'<strong>'+t('level_up.missed.best')+'</strong>: '
if (gameState.levelWallBounces < wallBouncedGood) {
choices++;
livesWon++;
} else {
missedOpportunities.push(
good +
t("level_up.missed.levelWallBounces.good", {
target: wallBouncedGood,
}),
);
}
if (gameState.levelWallBounces < wallBouncedBest) {
choices++;
} else {
missedOpportunities.push(
best +
t("level_up.missed.levelWallBounces.best", {
target: wallBouncedBest,
}),
);
let upgradesWon = 1;
let medals = [];
function challengeResult(
name: String,
description: String,
medal: "gold" | "silver" | "no",
) {
if (medal === "gold") {
choices++;
upgradesWon++;
}
if (medal === "silver") {
upgradesWon++;
}
medals.push(`<div class="upgrade" data-tooltip="${escapeAttribute(description)}">
${icons["icon:" + medal + "_medal"]}
<p>
<strong>${name}</strong><br/>
${{gold:t('level_up.gold'),silver:t('level_up.silver'),no:t('level_up.no'),}[medal] }
</p>
</div>`);
}
if (gameState.levelTime < levelTimeGood * 1000) {
choices++;
livesWon++;
} else {
missedOpportunities.push(
good +
t("level_up.missed.levelTime.good", {
target: levelTimeGood,
}),
);
}
if (gameState.levelTime < levelTimeBest * 1000) {
choices++;
} else {
missedOpportunities.push(
best +
t("level_up.missed.levelTime.best", {
target: levelTimeBest,
}),
);
}
challengeResult(
t("level_up.challenges.levelWallBounces.name", {
value: gameState.levelWallBounces,
}),
t("level_up.challenges.levelWallBounces.description", {
silver: wallBouncedGood,
gold: wallBouncedBest,
}),
(gameState.levelWallBounces < wallBouncedBest && "gold") ||
(gameState.levelWallBounces < wallBouncedGood && "silver") ||
"no",
);
if (catchRate > catchRateGood / 100) {
choices++;
livesWon++;
} else {
missedOpportunities.push(
good +
t("level_up.missed.catchRate.good", {
target: catchRateGood,
}),
);
}
if (catchRate > catchRateBest / 100) {
choices++;
} else {
missedOpportunities.push(
best +
t("level_up.missed.catchRate.best", {
target: catchRateBest,
}),
);
}
challengeResult(
t("level_up.challenges.levelTime.name", {
value: Math.ceil(gameState.levelTime / 1000),
}),
t("level_up.challenges.levelTime.description", {
silver: levelTimeGood,
gold: levelTimeBest,
}),
(gameState.levelTime < levelTimeBest * 1000 && "gold") ||
(gameState.levelTime < levelTimeGood * 1000 && "silver") ||
"no",
);
if (gameState.levelMisses < missesGood) {
choices++;
livesWon++;
} else {
missedOpportunities.push(
good +
t("level_up.missed.levelMisses.good", {
target: missesGood,
}),
);
}
if (gameState.levelMisses < missesBest) {
choices++;
} else {
missedOpportunities.push(
best +
t("level_up.missed.levelMisses.best", {
target: missesBest,
}),
);
}
challengeResult(
t("level_up.challenges.catchRateGood.name", {
value: Math.floor(catchRate * 100),
}),
t("level_up.challenges.catchRateGood.description", {
silver: catchRateGood,
gold: catchRateBest,
caught: gameState.levelCoughtCoins,
total: gameState.levelSpawnedCoins,
}),
(catchRate > catchRateBest / 100 && "gold") ||
(catchRate > catchRateGood / 100 && "silver") ||
"no",
);
gameState.extra_lives += livesWon;
challengeResult(
t("level_up.challenges.levelMisses.name", { value: gameState.levelMisses }),
t("level_up.challenges.levelMisses.description", {
silver: missesGood,
gold: missesBest,
}),
(gameState.levelMisses < missesBest && "gold") ||
(gameState.levelMisses < missesGood && "silver") ||
"no",
);
gameState.upgrade_points += upgradesWon;
let offered: PerkId[] = getPossibleUpgrades(gameState)
.map((u) => ({
@ -150,60 +132,68 @@ export async function openUpgradesPicker(gameState: GameState) {
dontOfferTooSoon(gameState, u.id);
});
const upgradeId = await asyncAlert<PerkId | null>({
const actions = list.map((u) => {
const max = u.max + gameState.perks.limitless;
const lvl = gameState.perks[u.id];
const button =
!gameState.upgrade_points || gameState.perks[u.id] >= max
? ""
: ` <button data-resolve-to="${u.id}">${
lvl ? t("level_up.upgrade") : t("level_up.pick")
}</button>`;
const lvlInfo = lvl ? upgradeLevelAndMaxDisplay(u, gameState) : "";
const help =u.help(Math.max(1, lvl))
return {
u,button,
html: `<div class="upgrade choice ${
(!lvl && gameState.upgrade_points && " ") ||
(lvl && "used") ||
"greyed-out"
}" >
${icons["icon:" + u.id]}
<p data-tooltip="${escapeAttribute(lvl ? help: u.fullHelp(Math.max(1, lvl)))}">
<strong>${u.name}</strong> ${lvlInfo}
${lvl ? '':help}
</p>
${button}
</div>`,
};
});
const forcePick = gameState.upgrade_points>0 && !!actions.find(a=>a.button!=='')
const upgradeId = await requiredAsyncAlert<PerkId | null>({
title: t("level_up.title", {
level: gameState.currentLevel,
max: max_levels(gameState),
}),
content: [
{
disabled:forcePick,
text: t("level_up.go", { name: gameState.level.name }),
help: forcePick
? t("level_up.go_with_upgrades", {
count: gameState.upgrade_points,
})
: "",
icon: icons[gameState.level.name],
value: null,
},
gameState.extra_lives
? `<p>${t("level_up.instructions", {
count: gameState.extra_lives,
gain: livesWon,
})}</p>`
: `<p>${t("level_up.no_points")}</p>`,
...list.map((u) => {
const max = u.max + gameState.perks.limitless;
const lvl = gameState.perks[u.id];
t("level_up.upgrade_perks"),
const button =
!gameState.extra_lives || gameState.perks[u.id] >= max
? ""
: ` <button data-resolve-to="${u.id}">${
lvl ? t("level_up.upgrade") : t("level_up.pick")
}</button>`;
...actions.filter((a) => gameState.perks[a.u.id]).map((a) => a.html),
const lvlInfo = lvl ? upgradeLevelAndMaxDisplay(u, gameState) : "";
return `<div class="upgrade choice ${
(!lvl && gameState.extra_lives && "free") ||
(lvl && "used") ||
"greyed-out"
}" >
${icons["icon:" + u.id]}
<p data-tooltip="${escapeAttribute(u.fullHelp(Math.max(1, lvl)))}">
<strong>${u.name}</strong> ${lvlInfo}
${u.help(Math.max(1, lvl))}
</p>
${button}
</div>`;
}),
...missedOpportunities.map(
(reason) =>
`<div class="upgrade choice greyed-out" >
${icons["icon:locked"]}
<p>
${reason}
</p>
</div>`,
),
levelsListHTMl(gameState, gameState.currentLevel),
t("level_up.add_perks"),
...actions.filter((a) => !gameState.perks[a.u.id]).map((a) => a.html),
t("level_up.challenges.intro"),
...medals,
getNearestUnlockHTML(gameState),
levelsListHTMl(gameState, gameState.currentLevel),
`<div id="level-recording-container"></div>`,
],
});
@ -211,7 +201,7 @@ export async function openUpgradesPicker(gameState: GameState) {
if (upgradeId) {
gameState.perks[upgradeId]++;
gameState.runStatistics.upgrades_picked++;
gameState.extra_lives--;
gameState.upgrade_points--;
} else {
return;
}

View file

@ -368,11 +368,11 @@ export function render(gameState: GameState) {
});
//
startWork("render:extra_life");
if (gameState.extra_lives) {
if (gameState.perks.extra_life) {
ctx.globalAlpha = gameState.balls.length > 1 ? 0.2 : 1;
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = gameState.puckColor;
for (let i = 0; i < gameState.extra_lives; i++) {
for (let i = 0; i < gameState.perks.extra_life; i++) {
ctx.fillRect(
gameState.offsetXRoundedDown,
gameState.gameZoneHeight - gameState.puckHeight / 2 + 2 * i,

2
src/types.d.ts vendored
View file

@ -280,7 +280,7 @@ export type GameState = {
plouf: { vol: number; x: number };
colorChange: { vol: number; x: number };
};
extra_lives: number;
upgrade_points: number;
creative: boolean;
startParams: RunParams;
};

View file

@ -31,6 +31,19 @@ export const rawUpgrades = [
fullHelp: (lvl: number) =>
t("upgrades.slow_down.verbose_description", { lvl }),
},
{
category: categories.beginner,
requires: "",
threshold: 0,
gift: false,
id: "extra_life",
max: 7,
name: t("upgrades.extra_life.name"),
help: (lvl: number) => t("upgrades.extra_life.tooltip"),
fullHelp: (lvl: number) =>
t("upgrades.extra_life.verbose_description", { lvl }),
},
{
category: categories.beginner,
requires: "",