mirror of
https://gitlab.com/lecarore/breakout71.git
synced 2025-05-05 03:07:14 -04:00
wip
This commit is contained in:
parent
cee5c6bc60
commit
45f9b516fc
23 changed files with 1069 additions and 797 deletions
|
@ -396,6 +396,9 @@ Break colourful bricks, catch bouncing coins and select powerful upgrades !
|
|||
|
||||
## Easy perk ideas
|
||||
|
||||
- when the ball teleport, probability that it's duplicated instead
|
||||
- combo resets on teleport
|
||||
- combo resets when hitting puck without a teleport
|
||||
- teleport ball to puck as soon as it hits something (% chance)
|
||||
- allow dropping balls that are about to miss.
|
||||
- square coins : coins loose all horizontal momentum when hitting something.
|
||||
|
@ -418,7 +421,6 @@ Break colourful bricks, catch bouncing coins and select powerful upgrades !
|
|||
- [colin] golden corners - catch coins at the sides of the puck to double their value
|
||||
- [colin] varied diet - your combo grows by 2 when your ball changes color, but decreses by one when a brick is broken ?
|
||||
- [colin] trickle up - inverse of reach more or less
|
||||
- Dividends — +1 combo per 10 coins lost (band-aid for players who struggle, useful addition when choosing Ascetism)
|
||||
- +lvl combo per bricks / resets after 5/lvl seconds without explosion ?
|
||||
- +lvl combo per bricks / resets after 5/lvl seconds without coin catch ?
|
||||
- +lvl combo per bricks / resets after 5/lvl seconds without ball color change ?
|
||||
|
|
|
@ -29,8 +29,8 @@ android {
|
|||
applicationId = "me.lecaro.breakout"
|
||||
minSdk = 21
|
||||
targetSdk = 34
|
||||
versionCode = 29099215
|
||||
versionName = "29099215"
|
||||
versionCode = 29100127
|
||||
versionName = "29100127"
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables {
|
||||
useSupportLibrary = true
|
||||
|
|
File diff suppressed because one or more lines are too long
217
dist/index.html
vendored
217
dist/index.html
vendored
File diff suppressed because one or more lines are too long
|
@ -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}`;
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
]
|
|
@ -1 +1 @@
|
|||
"29099215"
|
||||
"29100127"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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% ..",
|
||||
|
|
1020
src/i18n/b71.babel
1020
src/i18n/b71.babel
File diff suppressed because it is too large
Load diff
|
@ -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% ...",
|
||||
|
|
|
@ -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% .. ",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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%.",
|
||||
|
|
|
@ -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...",
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
2
src/types.d.ts
vendored
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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: "",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue