This commit is contained in:
Renan LE CARO 2025-04-21 13:16:16 +02:00
parent 6b6e393d3b
commit 5ba93500b4
14 changed files with 548 additions and 561 deletions

View file

@ -24,6 +24,7 @@ Other translation are very welcome, contact me if you'd like to submit one.
## To do ## To do
## Done ## Done
- new perk : sticky coins (coins stick to bricks)
- left/top/right is laval perks : at level 2+, the corresponding borders completely disappears (reachable with limitless) - left/top/right is laval perks : at level 2+, the corresponding borders completely disappears (reachable with limitless)
- new perk : three cushion (gain point for indirect hits) - new perk : three cushion (gain point for indirect hits)
- live stats: coins still in the air appear as "lost" in the catch percentage, as in the final computation - live stats: coins still in the air appear as "lost" in the catch percentage, as in the final computation

868
dist/index.html vendored

File diff suppressed because one or more lines are too long

View file

@ -50,7 +50,7 @@ import {
} from "./game"; } from "./game";
import {stopRecording} from "./recording"; import {stopRecording} from "./recording";
import {isOptionOn} from "./options"; import {isOptionOn} from "./options";
import {clamp, comboKeepingRate} from "./pure_functions"; import {clamp, coinsBoostedCombo, comboKeepingRate, shouldCoinsStick} from "./pure_functions";
import {addToTotalScore} from "./addToTotalScore"; import {addToTotalScore} from "./addToTotalScore";
import {hashCode} from "./getLevelBackground"; import {hashCode} from "./getLevelBackground";
@ -219,7 +219,6 @@ export function baseCombo(gameState: GameState) {
return ( return (
1 + 1 +
gameState.perks.base_combo * 3 + gameState.perks.base_combo * 3 +
gameState.perks.smaller_puck * 5 +
mineFieldBonus mineFieldBonus
); );
} }
@ -385,7 +384,7 @@ export function explosionAt(
c.vx += (((dx / d2) * 10 * size) / c.weight) * factor; c.vx += (((dx / d2) * 10 * size) / c.weight) * factor;
c.vy += (((dy / d2) * 10 * size) / c.weight) * factor; c.vy += (((dy / d2) * 10 * size) / c.weight) * factor;
}); });
gameState.lastExplosion = Date.now(); gameState.lastExplosion = gameState.levelTime;
if (gameState.perks.implosions) { if (gameState.perks.implosions) {
spawnImplosion(gameState, 7 * size, x, y, "#FFFFFF"); spawnImplosion(gameState, 7 * size, x, y, "#FFFFFF");
@ -419,10 +418,6 @@ export function explodeBrick(
const x = brickCenterX(gameState, index), const x = brickCenterX(gameState, index),
y = brickCenterY(gameState, index); y = brickCenterY(gameState, index);
// if (color === "transparent") {
// schedulGameSound(gameState, "void", x, 1);
// resetCombo(gameState, x, y);
// }
setBrick(gameState, index, ""); setBrick(gameState, index, "");
explosionAt(gameState, index, x, y, ball, 0); explosionAt(gameState, index, x, y, ball, 0);
if (gameState.perks.minefield) { if (gameState.perks.minefield) {
@ -437,25 +432,7 @@ export function explodeBrick(
setBrick(gameState, index, ""); setBrick(gameState, index, "");
let coinsToSpawn = gameState.combo; let coinsToSpawn = coinsBoostedCombo(gameState)
if (gameState.lastCombo > coinsToSpawn) {
// In case a reset happens in the same frame as a spawn, i want the combo to stay high (for minefield and zen in particular)
coinsToSpawn = gameState.lastCombo;
}
if (gameState.perks.sturdy_bricks) {
// +10% per level
coinsToSpawn += Math.ceil(
((2 + gameState.perks.sturdy_bricks) / 2) * coinsToSpawn,
);
}
if (gameState.perks.transparency) {
coinsToSpawn = Math.ceil(
coinsToSpawn *
(1 +
(ballTransparency(ball, gameState) * gameState.perks.transparency) /
2),
);
}
gameState.levelSpawnedCoins += coinsToSpawn; gameState.levelSpawnedCoins += coinsToSpawn;
gameState.runStatistics.coins_spawned += coinsToSpawn; gameState.runStatistics.coins_spawned += coinsToSpawn;
@ -565,7 +542,7 @@ export function explodeBrick(
resetCombo(gameState, ball.x, ball.y); resetCombo(gameState, ball.x, ball.y);
} }
schedulGameSound(gameState, "colorChange", ball.x, 0.8); schedulGameSound(gameState, "colorChange", ball.x, 0.8);
gameState.lastExplosion = gameState.levelTime; // gameState.lastExplosion = gameState.levelTime;
gameState.ballsColor = color; gameState.ballsColor = color;
if (!isOptionOn("basic")) { if (!isOptionOn("basic")) {
gameState.balls.forEach((ball) => { gameState.balls.forEach((ball) => {
@ -905,34 +882,41 @@ export function coinBrickHitCheck(gameState: GameState, coin: Coin) {
hitsSomething(x, y, radius)) || hitsSomething(x, y, radius)) ||
undefined; undefined;
if (gameState.perks.ghost_coins) { if (typeof (vhit ?? hhit ?? chit) !== "undefined") {
// slow down if (shouldCoinsStick(gameState)) {
if (typeof (vhit ?? hhit ?? chit) !== "undefined") { if(coin.collidedLastFrame) {
coin.x = previousX
coin.y = previousY
}
coin.vx = 0
coin.vy = 0
} else if (gameState.perks.ghost_coins) {
// slow down
coin.vy *= 1 - 0.2 / gameState.perks.ghost_coins; coin.vy *= 1 - 0.2 / gameState.perks.ghost_coins;
coin.vx *= 1 - 0.2 / gameState.perks.ghost_coins; coin.vx *= 1 - 0.2 / gameState.perks.ghost_coins;
} } else {
} else { if (typeof vhit !== "undefined" || typeof chit !== "undefined") {
if (typeof vhit !== "undefined" || typeof chit !== "undefined") { coin.y = coin.previousY;
coin.y = coin.previousY; coin.vy *= -1;
coin.vy *= -1;
// Roll on corners // Roll on corners
const leftHit = gameState.bricks[brickIndex(x - radius, y + radius)]; const leftHit = gameState.bricks[brickIndex(x - radius, y + radius)];
const rightHit = gameState.bricks[brickIndex(x + radius, y + radius)]; const rightHit = gameState.bricks[brickIndex(x + radius, y + radius)];
if (leftHit && !rightHit) { if (leftHit && !rightHit) {
coin.vx += 1; coin.vx += 1;
coin.sa -= 1; coin.sa -= 1;
}
if (!leftHit && rightHit) {
coin.vx -= 1;
coin.sa += 1;
}
} }
if (!leftHit && rightHit) { if (typeof hhit !== "undefined" || typeof chit !== "undefined") {
coin.vx -= 1; coin.x = coin.previousX;
coin.sa += 1; coin.vx *= -1;
} }
} }
if (typeof hhit !== "undefined" || typeof chit !== "undefined") {
coin.x = coin.previousX;
coin.vx *= -1;
}
} }
return vhit ?? hhit ?? chit; return vhit ?? hhit ?? chit;
} }
@ -985,6 +969,7 @@ export function bordersHitCheck(
hhit = 1; hhit = 1;
} }
return hhit + vhit * 2; return hhit + vhit * 2;
} }
@ -1227,7 +1212,10 @@ export function gameStateTick(
} }
const speed = (Math.abs(coin.vx) + Math.abs(coin.vy)) * 10; const speed = (Math.abs(coin.vx) + Math.abs(coin.vy)) * 10;
const hitBorder = bordersHitCheck(gameState, coin, coin.size / 2, frames); const hitBorder = bordersHitCheck(gameState, coin, coin.size / 2, frames);
if ( if (
coin.previousY < gameState.gameZoneHeight && coin.previousY < gameState.gameZoneHeight &&
coin.y > gameState.gameZoneHeight && coin.y > gameState.gameZoneHeight &&
@ -1282,8 +1270,8 @@ export function gameStateTick(
Math.random() / coin.points < (1 / gameState.combo) * gameState.perks.fountain_toss Math.random() / coin.points < (1 / gameState.combo) * gameState.perks.fountain_toss
) { ) {
increaseCombo(gameState, 1, increaseCombo(gameState, 1,
clamp(coin.x,20, gameState.canvasWidth-20 ), clamp(coin.x, 20, gameState.canvasWidth - 20),
clamp(coin.y,20, gameState.gameZoneHeight-20 ) clamp(coin.y, 20, gameState.gameZoneHeight - 20)
); );
} }
} }
@ -1314,6 +1302,7 @@ export function gameStateTick(
} }
} }
// Sound and slow down
if ( if (
(!gameState.perks.ghost_coins && typeof hitBrick !== "undefined") || (!gameState.perks.ghost_coins && typeof hitBrick !== "undefined") ||
hitBorder hitBorder
@ -1328,10 +1317,12 @@ export function gameStateTick(
if (speed > 20 && !coin.collidedLastFrame) { if (speed > 20 && !coin.collidedLastFrame) {
schedulGameSound(gameState, "coinBounce", coin.x, 0.2); schedulGameSound(gameState, "coinBounce", coin.x, 0.2);
} }
coin.collidedLastFrame = true;
} else {
coin.collidedLastFrame = false;
} }
// remember collision
coin.collidedLastFrame = !!(
typeof hitBrick !== "undefined" ||
hitBorder
)
}); });
gameState.balls.forEach((ball) => ballTick(gameState, ball, frames)); gameState.balls.forEach((ball) => ballTick(gameState, ball, frames));

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": "أول خطأ في كل مستوى مجاني، ثم 10% من المجموعة، ثم 20% ..", "upgrades.forgiving.verbose_description": "أول خطأ في كل مستوى مجاني، ثم 10% من المجموعة، ثم 20% ..",
"upgrades.fountain_toss.name": "رمي النافورة", "upgrades.fountain_toss.name": "رمي النافورة",
"upgrades.fountain_toss.tooltip": "احصل على بعض المجموعات عندما تفوت بعض العملات المعدنية.", "upgrades.fountain_toss.tooltip": "احصل على بعض المجموعات عندما تفوت بعض العملات المعدنية.",
"upgrades.fountain_toss.verbose_description": "عندما تفوتك عملة معدنية وكان مجموعتك أقل من {{max}}، فإن مجموعتك لديها احتمالية {{lvl}}/مجموعة لتنمو بمقدار واحد.", "upgrades.fountain_toss.verbose_description": "",
"upgrades.ghost_coins.name": "عملات الأشباح", "upgrades.ghost_coins.name": "عملات الأشباح",
"upgrades.ghost_coins.tooltip": "تمر العملات المعدنية ببطء عبر الطوب", "upgrades.ghost_coins.tooltip": "تمر العملات المعدنية ببطء عبر الطوب",
"upgrades.ghost_coins.verbose_description": "إنها ليست مشكلة، بل ميزة! تتحرك العملات المعدنية ببطء عبر الطوب. المستويات الأعلى تسمح لها بالتحرك بشكل أسرع.", "upgrades.ghost_coins.verbose_description": "إنها ليست مشكلة، بل ميزة! تتحرك العملات المعدنية ببطء عبر الطوب. المستويات الأعلى تسمح لها بالتحرك بشكل أسرع.",
@ -401,10 +401,9 @@
"upgrades.slow_down.name": "كرة أبطأ", "upgrades.slow_down.name": "كرة أبطأ",
"upgrades.slow_down.tooltip": "الكرة تتحرك بشكل أبطأ", "upgrades.slow_down.tooltip": "الكرة تتحرك بشكل أبطأ",
"upgrades.slow_down.verbose_description": "تبدأ الكرة ببطء نسبيًا، لكنها ستتسارع قليلًا مع كل مستوى.\n\nكما ستتسارع إذا قضيت وقتًا طويلًا في مستوى واحد.\n\nهذه الميزة تجعلها أسهل في التحكم.\n\nيمكنك الحصول عليها في البداية دائمًا بتفعيل وضع الأطفال في القائمة.", "upgrades.slow_down.verbose_description": "تبدأ الكرة ببطء نسبيًا، لكنها ستتسارع قليلًا مع كل مستوى.\n\nكما ستتسارع إذا قضيت وقتًا طويلًا في مستوى واحد.\n\nهذه الميزة تجعلها أسهل في التحكم.\n\nيمكنك الحصول عليها في البداية دائمًا بتفعيل وضع الأطفال في القائمة.",
"upgrades.smaller_puck.help_plural": "مجموعة مجداف أصغر وقاعدة أعلى",
"upgrades.smaller_puck.name": "مجداف أصغر", "upgrades.smaller_puck.name": "مجداف أصغر",
"upgrades.smaller_puck.tooltip": "يمنح أيضًا +5 مجموعة أساسية", "upgrades.smaller_puck.tooltip": "",
"upgrades.smaller_puck.verbose_description": "هذا يُصغّر حجم المجداف، مما يُسهّل نظريًا بعض الضربات الزاوية، ولكنه في الواقع يزيد من الصعوبة.\n\nلهذا السبب ستحصل أيضًا على مكافأة رائعة قدرها +٥ عملات لكل طوبة تُكسرها بعد التقاط هذا.", "upgrades.smaller_puck.verbose_description": "",
"upgrades.soft_reset.name": "إعادة الضبط الناعمة", "upgrades.soft_reset.name": "إعادة الضبط الناعمة",
"upgrades.soft_reset.tooltip": "إعادة تعيين المجموعة تحافظ على {{percent}}%", "upgrades.soft_reset.tooltip": "إعادة تعيين المجموعة تحافظ على {{percent}}%",
"upgrades.soft_reset.verbose_description": "الحد من تأثير إعادة تعيين المجموعة.", "upgrades.soft_reset.verbose_description": "الحد من تأثير إعادة تعيين المجموعة.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+{{lvl}} مجموعة لكل ارتداد للمضرب، -{{lvl}} مجموعة لكل ارتداد على أي حدود", "upgrades.trampoline.tooltip": "+{{lvl}} مجموعة لكل ارتداد للمضرب، -{{lvl}} مجموعة لكل ارتداد على أي حدود",
"upgrades.trampoline.verbose_description": "أحد ترقيات المجموعات النادرة التي لا تضيف شرط إعادة الضبط", "upgrades.trampoline.verbose_description": "أحد ترقيات المجموعات النادرة التي لا تضيف شرط إعادة الضبط",
"upgrades.transparency.name": "الشفافية", "upgrades.transparency.name": "الشفافية",
"upgrades.transparency.tooltip": "كلما كانت الكرة أعلى على الشاشة، زادت شفافيتها. وكلما زادت شفافيتها، زادت العملات التي تنتجها.", "upgrades.transparency.tooltip": "",
"upgrades.transparency.verbose_description": "المستويات الأعلى تجعل الكرة شفافة بشكل أسرع وتزيد من مكافأة النقاط.", "upgrades.transparency.verbose_description": "المستويات الأعلى تجعل الكرة شفافة بشكل أسرع وتزيد من مكافأة النقاط.",
"upgrades.trickledown.name": "اقتصاد التسرب", "upgrades.trickledown.name": "اقتصاد التسرب",
"upgrades.trickledown.tooltip": "تظهر العملات المعدنية في الجزء العلوي من الشاشة.", "upgrades.trickledown.tooltip": "تظهر العملات المعدنية في الجزء العلوي من الشاشة.",

View file

@ -14450,41 +14450,6 @@
<folder_node> <folder_node>
<name>smaller_puck</name> <name>smaller_puck</name>
<children> <children>
<concept_node>
<name>help_plural</name>
<description/>
<comment/>
<translations>
<translation>
<language>ar-LB</language>
<approved>false</approved>
</translation>
<translation>
<language>de-DE</language>
<approved>false</approved>
</translation>
<translation>
<language>en-US</language>
<approved>true</approved>
</translation>
<translation>
<language>es-CL</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>true</approved>
</translation>
<translation>
<language>ru-RU</language>
<approved>false</approved>
</translation>
<translation>
<language>tr-TR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>name</name> <name>name</name>
<description/> <description/>
@ -15678,7 +15643,7 @@
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>ru-RU</language> <language>ru-RU</language>

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": "Der erste Fehlschuss pro Level ist kostenlos, dann 10% der Combo, dann 20% ...", "upgrades.forgiving.verbose_description": "Der erste Fehlschuss pro Level ist kostenlos, dann 10% der Combo, dann 20% ...",
"upgrades.fountain_toss.name": "Springbrunnen-Wurf", "upgrades.fountain_toss.name": "Springbrunnen-Wurf",
"upgrades.fountain_toss.tooltip": "Gewinnen Sie etwas Combo, wenn Sie einige Münzen verpassen.", "upgrades.fountain_toss.tooltip": "Gewinnen Sie etwas Combo, wenn Sie einige Münzen verpassen.",
"upgrades.fountain_toss.verbose_description": "Wenn du eine Münze verpasst und deine Combo unter {{max}}war, hat deine Combo eine Wahrscheinlichkeit von {{lvl}}/Combo um eins zu erhöhen.", "upgrades.fountain_toss.verbose_description": "",
"upgrades.ghost_coins.name": "Geistermünzen", "upgrades.ghost_coins.name": "Geistermünzen",
"upgrades.ghost_coins.tooltip": "Münzen gehen langsam durch Ziegelsteine", "upgrades.ghost_coins.tooltip": "Münzen gehen langsam durch Ziegelsteine",
"upgrades.ghost_coins.verbose_description": "Das ist kein Bug, sondern ein Feature! Die Münzen fliegen nur langsam durch die Ziegel. Höhere Stufen lassen sie schneller fliegen.", "upgrades.ghost_coins.verbose_description": "Das ist kein Bug, sondern ein Feature! Die Münzen fliegen nur langsam durch die Ziegel. Höhere Stufen lassen sie schneller fliegen.",
@ -401,10 +401,9 @@
"upgrades.slow_down.name": "Langsamer Ball", "upgrades.slow_down.name": "Langsamer Ball",
"upgrades.slow_down.tooltip": "Der Ball bewegt sich langsamer", "upgrades.slow_down.tooltip": "Der Ball bewegt sich langsamer",
"upgrades.slow_down.verbose_description": "Der Ball fängt relativ langsam an, aber mit jeder Spielstufe wird er ein bisschen schneller.\n\nEr wird auch schneller, wenn du viel Zeit in einem Level verbringst.\n\nDieser Vorteil macht ihn überschaubarer.\n\nDu kannst ihn jedes Mal beim Start erhalten, indem du den Kindermodus im Menü aktivierst.", "upgrades.slow_down.verbose_description": "Der Ball fängt relativ langsam an, aber mit jeder Spielstufe wird er ein bisschen schneller.\n\nEr wird auch schneller, wenn du viel Zeit in einem Level verbringst.\n\nDieser Vorteil macht ihn überschaubarer.\n\nDu kannst ihn jedes Mal beim Start erhalten, indem du den Kindermodus im Menü aktivierst.",
"upgrades.smaller_puck.help_plural": "Noch kleineres Paddel und höhere Basis-Kombination",
"upgrades.smaller_puck.name": "Kleineres Paddel", "upgrades.smaller_puck.name": "Kleineres Paddel",
"upgrades.smaller_puck.tooltip": "Gibt auch +5 Basis-Kombo", "upgrades.smaller_puck.tooltip": "",
"upgrades.smaller_puck.verbose_description": "Dadurch wird das Paddel kleiner, was theoretisch einige Eckschüsse einfacher macht, aber eigentlich nur den Schwierigkeitsgrad erhöht.\n\nDeshalb gibt es auch einen netten Bonus von +5 Münzen pro Ziegelstein für alle Ziegelsteine, die du nach der Auswahl dieser Option zerstörst.", "upgrades.smaller_puck.verbose_description": "",
"upgrades.soft_reset.name": "Weicher Reset", "upgrades.soft_reset.name": "Weicher Reset",
"upgrades.soft_reset.tooltip": "Combo-Rückstellungen halten {{percent}}%", "upgrades.soft_reset.tooltip": "Combo-Rückstellungen halten {{percent}}%",
"upgrades.soft_reset.verbose_description": "Begrenzen Sie die Auswirkungen eines Combo-Resets.", "upgrades.soft_reset.verbose_description": "Begrenzen Sie die Auswirkungen eines Combo-Resets.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+{{lvl}} Combo pro Paddelabprall, -{{lvl}} Combo pro Abprall an einer beliebigen Grenze", "upgrades.trampoline.tooltip": "+{{lvl}} Combo pro Paddelabprall, -{{lvl}} Combo pro Abprall an einer beliebigen Grenze",
"upgrades.trampoline.verbose_description": "Eine der seltenen Combo-Upgrades, die keine Rücksetzbedingung hinzufügen", "upgrades.trampoline.verbose_description": "Eine der seltenen Combo-Upgrades, die keine Rücksetzbedingung hinzufügen",
"upgrades.transparency.name": "Transparenz", "upgrades.transparency.name": "Transparenz",
"upgrades.transparency.tooltip": "Je höher der Ball auf dem Bildschirm ist, desto transparenter wird er. Je transparenter sie ist, desto mehr Münzen produziert sie.", "upgrades.transparency.tooltip": "",
"upgrades.transparency.verbose_description": "Je höher die Stufe, desto eher wird der Ball transparent und desto höher ist der Punktebonus.", "upgrades.transparency.verbose_description": "Je höher die Stufe, desto eher wird der Ball transparent und desto höher ist der Punktebonus.",
"upgrades.trickledown.name": "Trickle down economics", "upgrades.trickledown.name": "Trickle down economics",
"upgrades.trickledown.tooltip": "Die Münzen erscheinen am oberen Rand des Bildschirms.", "upgrades.trickledown.tooltip": "Die Münzen erscheinen am oberen Rand des Bildschirms.",

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": "The first miss per level is free, then 10% of the combo, then 20% .. ", "upgrades.forgiving.verbose_description": "The first miss per level is free, then 10% of the combo, then 20% .. ",
"upgrades.fountain_toss.name": "Fountain toss", "upgrades.fountain_toss.name": "Fountain toss",
"upgrades.fountain_toss.tooltip": "Gain some combo when you miss some coins. ", "upgrades.fountain_toss.tooltip": "Gain some combo when you miss some coins. ",
"upgrades.fountain_toss.verbose_description": "When you miss a coin and your combo was under {{max}}, your combo has a probability of {{lvl}}/combo to grow by one.", "upgrades.fountain_toss.verbose_description": "When you miss a coin and your combo was under level*30, your combo has a probability of level/combo to grow by one.",
"upgrades.ghost_coins.name": "Ghost coins", "upgrades.ghost_coins.name": "Ghost coins",
"upgrades.ghost_coins.tooltip": "Coins slowly pass through bricks", "upgrades.ghost_coins.tooltip": "Coins slowly pass through bricks",
"upgrades.ghost_coins.verbose_description": "It's not a bug, it's a feature ! Coins fly through bricks slowly. Higher levels let them move faster. ", "upgrades.ghost_coins.verbose_description": "It's not a bug, it's a feature ! Coins fly through bricks slowly. Higher levels let them move faster. ",
@ -401,15 +401,14 @@
"upgrades.slow_down.name": "Slower ball", "upgrades.slow_down.name": "Slower ball",
"upgrades.slow_down.tooltip": "Ball moves more slowly", "upgrades.slow_down.tooltip": "Ball moves more slowly",
"upgrades.slow_down.verbose_description": "The ball starts relatively slow, but every level of your game it will start a bit faster. \n\nIt will also accelerate if you spend a lot of time in one level. \n\nThis perk makes it more manageable. \n\nYou can get it at the start every time by enabling kid mode in the menu.", "upgrades.slow_down.verbose_description": "The ball starts relatively slow, but every level of your game it will start a bit faster. \n\nIt will also accelerate if you spend a lot of time in one level. \n\nThis perk makes it more manageable. \n\nYou can get it at the start every time by enabling kid mode in the menu.",
"upgrades.smaller_puck.help_plural": "Even smaller paddle and higher base combo",
"upgrades.smaller_puck.name": "Smaller paddle", "upgrades.smaller_puck.name": "Smaller paddle",
"upgrades.smaller_puck.tooltip": "Also gives +5 base combo", "upgrades.smaller_puck.tooltip": "Also gives +{{percent}}% coins",
"upgrades.smaller_puck.verbose_description": "This makes the paddle smaller, which in theory makes some corner shots easier, but really just raises the difficulty.\n\nThat's why you also get a nice bonus of +5 coins per brick for all bricks you'll break after picking this. ", "upgrades.smaller_puck.verbose_description": "This makes the paddle smaller, which in theory makes some corner shots easier, but really just raises the difficulty.\n\nThat's why you also get a nice bonus of +50% coins spawn.",
"upgrades.soft_reset.name": "Soft reset", "upgrades.soft_reset.name": "Soft reset",
"upgrades.soft_reset.tooltip": "Combo resets keeps {{percent}}%", "upgrades.soft_reset.tooltip": "Combo resets keeps {{percent}}%",
"upgrades.soft_reset.verbose_description": "Limit the impact of a combo reset.", "upgrades.soft_reset.verbose_description": "Limit the impact of a combo reset.",
"upgrades.sticky_coins.name": "Dust bunnies", "upgrades.sticky_coins.name": "Sticky coins",
"upgrades.sticky_coins.tooltip": "Coins stick to things, and can be dislodged by explosions", "upgrades.sticky_coins.tooltip": "Coins stick to bricks, and can be dislodged by explosions",
"upgrades.sticky_coins.verbose_description": "", "upgrades.sticky_coins.verbose_description": "",
"upgrades.streak_shots.name": "Hit streak", "upgrades.streak_shots.name": "Hit streak",
"upgrades.streak_shots.tooltip": "More coins if you break many bricks before bouncing on the paddle.", "upgrades.streak_shots.tooltip": "More coins if you break many bricks before bouncing on the paddle.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+{{lvl}} combo per paddle bounce,-{{lvl}} combo per bounce on any border", "upgrades.trampoline.tooltip": "+{{lvl}} combo per paddle bounce,-{{lvl}} combo per bounce on any border",
"upgrades.trampoline.verbose_description": "One of the rare combo upgrades that don't add a reset condition", "upgrades.trampoline.verbose_description": "One of the rare combo upgrades that don't add a reset condition",
"upgrades.transparency.name": "Transparency", "upgrades.transparency.name": "Transparency",
"upgrades.transparency.tooltip": "The higher the ball is on the screen, the more transparent it becomes, and the more coins it produces (+{{percent}} % at full transparency).", "upgrades.transparency.tooltip": "Ball becomes transparent at the top of the screen. +{{percent}} % coins when all balls are at full transparency",
"upgrades.transparency.verbose_description": "Higher levels make the ball transparent sooner and increase the point bonus.", "upgrades.transparency.verbose_description": "Higher levels make the ball transparent sooner and increase the point bonus.",
"upgrades.trickledown.name": "Trickle down economics", "upgrades.trickledown.name": "Trickle down economics",
"upgrades.trickledown.tooltip": "The coins appear at the top of the screen.", "upgrades.trickledown.tooltip": "The coins appear at the top of the screen.",

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": " El primer ladrillo perdido por nivel no cuesta nada, el siguiente 10%, 20% y así sucesivamente.", "upgrades.forgiving.verbose_description": " El primer ladrillo perdido por nivel no cuesta nada, el siguiente 10%, 20% y así sucesivamente.",
"upgrades.fountain_toss.name": "Moneda en la fuente", "upgrades.fountain_toss.name": "Moneda en la fuente",
"upgrades.fountain_toss.tooltip": "A veces ganas un pequeño combo cuando pierdes monedas.", "upgrades.fountain_toss.tooltip": "A veces ganas un pequeño combo cuando pierdes monedas.",
"upgrades.fountain_toss.verbose_description": "Cuando se pierde una moneda mientras tu combo estaba por debajo de {{max}}, tu combo tiene una probabilidad de {{lvl}}/combo de incrementarse.", "upgrades.fountain_toss.verbose_description": "",
"upgrades.ghost_coins.name": "Habitaciones fantasma", "upgrades.ghost_coins.name": "Habitaciones fantasma",
"upgrades.ghost_coins.tooltip": "Las monedas atraviesan los ladrillos lentamente", "upgrades.ghost_coins.tooltip": "Las monedas atraviesan los ladrillos lentamente",
"upgrades.ghost_coins.verbose_description": "No es un error, ¡es una característica! Las piezas atraviesan los ladrillos lentamente. Los niveles más altos permiten que las monedas pasen más rápido a través de los ladrillos.", "upgrades.ghost_coins.verbose_description": "No es un error, ¡es una característica! Las piezas atraviesan los ladrillos lentamente. Los niveles más altos permiten que las monedas pasen más rápido a través de los ladrillos.",
@ -401,10 +401,9 @@
"upgrades.slow_down.name": "Bola lenta", "upgrades.slow_down.name": "Bola lenta",
"upgrades.slow_down.tooltip": "El balón se mueve más despacio", "upgrades.slow_down.tooltip": "El balón se mueve más despacio",
"upgrades.slow_down.verbose_description": "La bola empieza relativamente despacio, pero con cada nivel del juego empieza un poco más rápido, y también se acelera si pasas mucho tiempo en un nivel.\n\nEsta ventaja hace que la bola sea más fácil de manejar.\n\nPuedes conseguirla al principio de cada partida activando el modo niño en el menú.", "upgrades.slow_down.verbose_description": "La bola empieza relativamente despacio, pero con cada nivel del juego empieza un poco más rápido, y también se acelera si pasas mucho tiempo en un nivel.\n\nEsta ventaja hace que la bola sea más fácil de manejar.\n\nPuedes conseguirla al principio de cada partida activando el modo niño en el menú.",
"upgrades.smaller_puck.help_plural": "La raqueta se encoge aún más y el combo vuelve a aumentar.",
"upgrades.smaller_puck.name": "Raqueta más pequeña", "upgrades.smaller_puck.name": "Raqueta más pequeña",
"upgrades.smaller_puck.tooltip": "También da +5 combo", "upgrades.smaller_puck.tooltip": "",
"upgrades.smaller_puck.verbose_description": "Recibes una bonificación de combo permanente de +5 por elegir esta mejora.", "upgrades.smaller_puck.verbose_description": "",
"upgrades.soft_reset.name": "Restablecimiento progresivo", "upgrades.soft_reset.name": "Restablecimiento progresivo",
"upgrades.soft_reset.tooltip": "Al reiniciar el combo se conserva el {{percent}}% de los puntos", "upgrades.soft_reset.tooltip": "Al reiniciar el combo se conserva el {{percent}}% de los puntos",
"upgrades.soft_reset.verbose_description": "Limita el impacto de un reinicio de combo.", "upgrades.soft_reset.verbose_description": "Limita el impacto de un reinicio de combo.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+{{lvl}} combo cada vez que una pelota rebota en la raqueta,-{{lvl}} combo cada vez que una pelota rebota en uno de los bordes", "upgrades.trampoline.tooltip": "+{{lvl}} combo cada vez que una pelota rebota en la raqueta,-{{lvl}} combo cada vez que una pelota rebota en uno de los bordes",
"upgrades.trampoline.verbose_description": "Una de las pocas mejoras que no tiene una condición de reinicio", "upgrades.trampoline.verbose_description": "Una de las pocas mejoras que no tiene una condición de reinicio",
"upgrades.transparency.name": "Transparencia", "upgrades.transparency.name": "Transparencia",
"upgrades.transparency.tooltip": "Cuanto más alta esté la bola en la pantalla, más transparente se volverá. Cuanto más transparente sea, más monedas producirá.", "upgrades.transparency.tooltip": "",
"upgrades.transparency.verbose_description": "Los niveles más altos hacen que la pelota se vuelva transparente más rápidamente y aumentan la bonificación de puntos.", "upgrades.transparency.verbose_description": "Los niveles más altos hacen que la pelota se vuelva transparente más rápidamente y aumentan la bonificación de puntos.",
"upgrades.trickledown.name": "Escorrentía", "upgrades.trickledown.name": "Escorrentía",
"upgrades.trickledown.tooltip": "Las monedas aparecen en la parte superior de la pantalla.", "upgrades.trickledown.tooltip": "Las monedas aparecen en la parte superior de la pantalla.",

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": " La première brique ratée par niveau ne coûte rien, la suivante 10%, 20%, etc.", "upgrades.forgiving.verbose_description": " La première brique ratée par niveau ne coûte rien, la suivante 10%, 20%, etc.",
"upgrades.fountain_toss.name": "Pièce dans la fontaine", "upgrades.fountain_toss.name": "Pièce dans la fontaine",
"upgrades.fountain_toss.tooltip": "Gagnez parfois un peu de combo quand vous perdez des pièces.", "upgrades.fountain_toss.tooltip": "Gagnez parfois un peu de combo quand vous perdez des pièces.",
"upgrades.fountain_toss.verbose_description": "Quand une pièce est perdue alors que votre combo était en dessous de {{max}}, votre combo à une probabilité de {{lvl}}/combo d'être incrémenté", "upgrades.fountain_toss.verbose_description": "",
"upgrades.ghost_coins.name": "Pièces fantôme", "upgrades.ghost_coins.name": "Pièces fantôme",
"upgrades.ghost_coins.tooltip": "Les pièces traversent les briques doucement", "upgrades.ghost_coins.tooltip": "Les pièces traversent les briques doucement",
"upgrades.ghost_coins.verbose_description": "Ce n'est pas une bug, c'est une fonctionnalité ! Les pièces passent à travers les briques doucement. Les niveaux plus élevés permettent aux pièce de traverser les briques plus vite.", "upgrades.ghost_coins.verbose_description": "Ce n'est pas une bug, c'est une fonctionnalité ! Les pièces passent à travers les briques doucement. Les niveaux plus élevés permettent aux pièce de traverser les briques plus vite.",
@ -401,10 +401,9 @@
"upgrades.slow_down.name": "Balle lente", "upgrades.slow_down.name": "Balle lente",
"upgrades.slow_down.tooltip": "La balle se déplace plus lentement", "upgrades.slow_down.tooltip": "La balle se déplace plus lentement",
"upgrades.slow_down.verbose_description": "La balle démarre relativement lentement, mais à chaque niveau de votre partie, elle démarre un peu plus vite, et elle accélère également si vous passez beaucoup de temps dans un niveau.\n\nCet avantage rend la balle plus facile à gérer. \n\nVous pouvez l'obtenir au début de chaque partie en activant le mode enfant dans le menu.", "upgrades.slow_down.verbose_description": "La balle démarre relativement lentement, mais à chaque niveau de votre partie, elle démarre un peu plus vite, et elle accélère également si vous passez beaucoup de temps dans un niveau.\n\nCet avantage rend la balle plus facile à gérer. \n\nVous pouvez l'obtenir au début de chaque partie en activant le mode enfant dans le menu.",
"upgrades.smaller_puck.help_plural": "La raquette rétrécie encore et le combo augmente encore.",
"upgrades.smaller_puck.name": "Raquette plus petite", "upgrades.smaller_puck.name": "Raquette plus petite",
"upgrades.smaller_puck.tooltip": "Donne aussi +5 combo", "upgrades.smaller_puck.tooltip": "",
"upgrades.smaller_puck.verbose_description": "Vous bénéficiez d'un bonus permanent de +5 combo pour avoir choisi cette amélioration.", "upgrades.smaller_puck.verbose_description": "",
"upgrades.soft_reset.name": "Réinitialisation progressive", "upgrades.soft_reset.name": "Réinitialisation progressive",
"upgrades.soft_reset.tooltip": "La remise à zéro du combo conserve {{percent}}% des points", "upgrades.soft_reset.tooltip": "La remise à zéro du combo conserve {{percent}}% des points",
"upgrades.soft_reset.verbose_description": "Limite l'impact d'une réinitialisation du combo.", "upgrades.soft_reset.verbose_description": "Limite l'impact d'une réinitialisation du combo.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+{{lvl}} combo à chaque rebond d'une balle sur la raquette,-{{lvl}} combo à chaque rebond sur un des bords", "upgrades.trampoline.tooltip": "+{{lvl}} combo à chaque rebond d'une balle sur la raquette,-{{lvl}} combo à chaque rebond sur un des bords",
"upgrades.trampoline.verbose_description": "Une des rares améliorations à ne pas avoir de condition de remise à zéro", "upgrades.trampoline.verbose_description": "Une des rares améliorations à ne pas avoir de condition de remise à zéro",
"upgrades.transparency.name": "Camouflage", "upgrades.transparency.name": "Camouflage",
"upgrades.transparency.tooltip": "Plus la balle est haut à l'écran, plus elle devient transparente et plus elle produit de pièces (+{{percent}} % à transparence maximum).", "upgrades.transparency.tooltip": "",
"upgrades.transparency.verbose_description": "Les niveaux plus élevés rendent la balle transparente plus tôt et augmentent le bonus de points.", "upgrades.transparency.verbose_description": "Les niveaux plus élevés rendent la balle transparente plus tôt et augmentent le bonus de points.",
"upgrades.trickledown.name": "Ruissellement", "upgrades.trickledown.name": "Ruissellement",
"upgrades.trickledown.tooltip": "Les pièces apparaissent en haut de l'écran.", "upgrades.trickledown.tooltip": "Les pièces apparaissent en haut de l'écran.",

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": "Первый промах за уровень - бесплатно, затем 10% от комбо, затем 20%.", "upgrades.forgiving.verbose_description": "Первый промах за уровень - бесплатно, затем 10% от комбо, затем 20%.",
"upgrades.fountain_toss.name": "Бросок фонтана", "upgrades.fountain_toss.name": "Бросок фонтана",
"upgrades.fountain_toss.tooltip": "Получите несколько комбо, когда пропустите несколько монет.", "upgrades.fountain_toss.tooltip": "Получите несколько комбо, когда пропустите несколько монет.",
"upgrades.fountain_toss.verbose_description": "Если вы пропустили монету и ваша комбо была меньше {{max}}, то вероятность того, что ваша комбо вырастет на {{lvl}}/ комбо вырастет на единицу.", "upgrades.fountain_toss.verbose_description": "",
"upgrades.ghost_coins.name": "Призрачные монеты", "upgrades.ghost_coins.name": "Призрачные монеты",
"upgrades.ghost_coins.tooltip": "Монеты медленно проходят сквозь кирпичи", "upgrades.ghost_coins.tooltip": "Монеты медленно проходят сквозь кирпичи",
"upgrades.ghost_coins.verbose_description": "Это не ошибка, это особенность! Монеты пролетают сквозь кирпичи медленно. На более высоких уровнях они движутся быстрее.", "upgrades.ghost_coins.verbose_description": "Это не ошибка, это особенность! Монеты пролетают сквозь кирпичи медленно. На более высоких уровнях они движутся быстрее.",
@ -401,10 +401,9 @@
"upgrades.slow_down.name": "Медленный мяч", "upgrades.slow_down.name": "Медленный мяч",
"upgrades.slow_down.tooltip": "Мяч движется медленнее", "upgrades.slow_down.tooltip": "Мяч движется медленнее",
"upgrades.slow_down.verbose_description": "Мяч стартует относительно медленно, но с каждым уровнем вашей игры он будет стартовать все быстрее.\n\nОн также ускорится, если вы проведете много времени на одном уровне.\n\nЭто преимущество делает его более управляемым.\n\nВы можете получать его каждый раз в начале игры, включив детский режим в меню.", "upgrades.slow_down.verbose_description": "Мяч стартует относительно медленно, но с каждым уровнем вашей игры он будет стартовать все быстрее.\n\nОн также ускорится, если вы проведете много времени на одном уровне.\n\nЭто преимущество делает его более управляемым.\n\nВы можете получать его каждый раз в начале игры, включив детский режим в меню.",
"upgrades.smaller_puck.help_plural": "Еще меньшее весло и более высокий базовый комбо",
"upgrades.smaller_puck.name": "Маленькое весло", "upgrades.smaller_puck.name": "Маленькое весло",
"upgrades.smaller_puck.tooltip": "Также дает +5 базовых комбо", "upgrades.smaller_puck.tooltip": "",
"upgrades.smaller_puck.verbose_description": "Это уменьшает размер лепестка, что теоретически облегчает некоторые угловые удары, но на самом деле лишь повышает сложность игры.\n\nПоэтому вы также получите приятный бонус в виде +5 монет за кирпич за все кирпичи, которые вы разобьете после этого.", "upgrades.smaller_puck.verbose_description": "",
"upgrades.soft_reset.name": "Мягкий сброс", "upgrades.soft_reset.name": "Мягкий сброс",
"upgrades.soft_reset.tooltip": "Комбо-сброс сохраняет {{percent}}%", "upgrades.soft_reset.tooltip": "Комбо-сброс сохраняет {{percent}}%",
"upgrades.soft_reset.verbose_description": "Ограничьте влияние комбо-сброса.", "upgrades.soft_reset.verbose_description": "Ограничьте влияние комбо-сброса.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+{{lvl}} комбо за отскок, -{{lvl}} комбо за отскок на любой границе", "upgrades.trampoline.tooltip": "+{{lvl}} комбо за отскок, -{{lvl}} комбо за отскок на любой границе",
"upgrades.trampoline.verbose_description": "Одно из редких комбо-улучшений, которое не добавляет условие сброса.", "upgrades.trampoline.verbose_description": "Одно из редких комбо-улучшений, которое не добавляет условие сброса.",
"upgrades.transparency.name": "Прозрачность", "upgrades.transparency.name": "Прозрачность",
"upgrades.transparency.tooltip": "Чем выше шарик находится на экране, тем прозрачнее он становится. Чем прозрачнее шар, тем больше монет он приносит.", "upgrades.transparency.tooltip": "",
"upgrades.transparency.verbose_description": "Более высокие уровни делают шар прозрачным быстрее и увеличивают бонус за очки.", "upgrades.transparency.verbose_description": "Более высокие уровни делают шар прозрачным быстрее и увеличивают бонус за очки.",
"upgrades.trickledown.name": "Экономика по принципу \"копеечной монеты", "upgrades.trickledown.name": "Экономика по принципу \"копеечной монеты",
"upgrades.trickledown.tooltip": "Монеты появляются в верхней части экрана.", "upgrades.trickledown.tooltip": "Монеты появляются в верхней части экрана.",

View file

@ -303,7 +303,7 @@
"upgrades.forgiving.verbose_description": "Her seviyede ilk ıskalama bedava, sonra kombonun %10'u, sonra %20'si...", "upgrades.forgiving.verbose_description": "Her seviyede ilk ıskalama bedava, sonra kombonun %10'u, sonra %20'si...",
"upgrades.fountain_toss.name": "Çeşme atışı", "upgrades.fountain_toss.name": "Çeşme atışı",
"upgrades.fountain_toss.tooltip": "Birkaç jetonu kaçırdığınızda bir miktar kombo kazanın.", "upgrades.fountain_toss.tooltip": "Birkaç jetonu kaçırdığınızda bir miktar kombo kazanın.",
"upgrades.fountain_toss.verbose_description": "Bir jetonu kaçırdığınızda ve kombonuz {{max}}altındaysa, kombonuzun bir artma olasılığı {{lvl}}/ kombodur.", "upgrades.fountain_toss.verbose_description": "",
"upgrades.ghost_coins.name": "Hayalet paralar", "upgrades.ghost_coins.name": "Hayalet paralar",
"upgrades.ghost_coins.tooltip": "Madeni paralar yavaşça tuğlaların arasından geçiyor", "upgrades.ghost_coins.tooltip": "Madeni paralar yavaşça tuğlaların arasından geçiyor",
"upgrades.ghost_coins.verbose_description": "Bu bir hata değil, bir özellik! Madeni paralar tuğlaların içinden yavaşça uçar. Daha yüksek seviyeler daha hızlı hareket etmelerini sağlar.", "upgrades.ghost_coins.verbose_description": "Bu bir hata değil, bir özellik! Madeni paralar tuğlaların içinden yavaşça uçar. Daha yüksek seviyeler daha hızlı hareket etmelerini sağlar.",
@ -401,10 +401,9 @@
"upgrades.slow_down.name": "Daha yavaş top", "upgrades.slow_down.name": "Daha yavaş top",
"upgrades.slow_down.tooltip": "Top daha yavaş hareket ediyor", "upgrades.slow_down.tooltip": "Top daha yavaş hareket ediyor",
"upgrades.slow_down.verbose_description": "Top nispeten yavaş başlar, ancak oyununuzun her seviyesinde biraz daha hızlı başlayacaktır. \n\nAyrıca bir seviyede çok zaman geçirirseniz hızlanacaktır. \n\nBu avantaj onu daha yönetilebilir hale getirir. \n\nMenüde çocuk modunu etkinleştirerek her seferinde başlangıçta alabilirsiniz.", "upgrades.slow_down.verbose_description": "Top nispeten yavaş başlar, ancak oyununuzun her seviyesinde biraz daha hızlı başlayacaktır. \n\nAyrıca bir seviyede çok zaman geçirirseniz hızlanacaktır. \n\nBu avantaj onu daha yönetilebilir hale getirir. \n\nMenüde çocuk modunu etkinleştirerek her seferinde başlangıçta alabilirsiniz.",
"upgrades.smaller_puck.help_plural": "Daha küçük kürek ve daha yüksek taban kombinasyonu",
"upgrades.smaller_puck.name": "Daha küçük kürek", "upgrades.smaller_puck.name": "Daha küçük kürek",
"upgrades.smaller_puck.tooltip": "Ayrıca +5 temel kombo verir", "upgrades.smaller_puck.tooltip": "",
"upgrades.smaller_puck.verbose_description": "Bu, küreği daha küçük yapar, bu da teoride bazı köşe vuruşlarını kolaylaştırır, ancak gerçekte sadece zorluğu artırır.\n\nBu yüzden, bunu seçtikten sonra kıracağınız tüm tuğlalar için tuğla başına +5 jetonluk güzel bir bonus da alırsınız.", "upgrades.smaller_puck.verbose_description": "",
"upgrades.soft_reset.name": "Yumuşak sıfırlama", "upgrades.soft_reset.name": "Yumuşak sıfırlama",
"upgrades.soft_reset.tooltip": "Kombo sıfırlamaları % {{percent}}tutar", "upgrades.soft_reset.tooltip": "Kombo sıfırlamaları % {{percent}}tutar",
"upgrades.soft_reset.verbose_description": "Bir kombo sıfırlamanın etkisini sınırlayın.", "upgrades.soft_reset.verbose_description": "Bir kombo sıfırlamanın etkisini sınırlayın.",
@ -434,7 +433,7 @@
"upgrades.trampoline.tooltip": "+ kürek sıçraması başına{{lvl}} kombo,- herhangi bir sınırda sıçrama başına{{lvl}} kombo", "upgrades.trampoline.tooltip": "+ kürek sıçraması başına{{lvl}} kombo,- herhangi bir sınırda sıçrama başına{{lvl}} kombo",
"upgrades.trampoline.verbose_description": "Sıfırlama koşulu eklemeyen nadir kombo yükseltmelerinden biri", "upgrades.trampoline.verbose_description": "Sıfırlama koşulu eklemeyen nadir kombo yükseltmelerinden biri",
"upgrades.transparency.name": "Şeffaflık", "upgrades.transparency.name": "Şeffaflık",
"upgrades.transparency.tooltip": "Top ekranda ne kadar yüksekteyse o kadar şeffaf olur. Ne kadar şeffafsa o kadar çok jeton üretir.", "upgrades.transparency.tooltip": "",
"upgrades.transparency.verbose_description": "Daha yüksek seviyeler topun daha çabuk şeffaf olmasını sağlar ve puan bonusunu artırır.", "upgrades.transparency.verbose_description": "Daha yüksek seviyeler topun daha çabuk şeffaf olmasını sağlar ve puan bonusunu artırır.",
"upgrades.trickledown.name": "Sızma ekonomisi", "upgrades.trickledown.name": "Sızma ekonomisi",
"upgrades.trickledown.tooltip": "Paralar ekranın üst kısmında görünür.", "upgrades.trickledown.tooltip": "Paralar ekranın üst kısmında görünür.",

View file

@ -1,4 +1,6 @@
import { getSettingValue } from "./settings"; import { getSettingValue } from "./settings";
import {GameState} from "./types";
import {ballTransparency} from "./game_utils";
export function clamp(value: number, min: number, max: number) { export function clamp(value: number, min: number, max: number) {
return Math.max(min, Math.min(value, max)); return Math.max(min, Math.min(value, max));
@ -17,6 +19,26 @@ export function hoursSpentPlaying() {
} }
} }
export function shouldCoinsStick(gameState:GameState){
return gameState.perks.sticky_coins && (!gameState.lastExplosion || gameState.lastExplosion < gameState.levelTime - 300 * gameState.perks.sticky_coins)
}
export function coinsBoostedCombo(gameState:GameState){
let boost = 1+gameState.perks.sturdy_bricks / 2 + gameState.perks.smaller_puck/2
if(gameState.perks.transparency){
let min=1;
gameState.balls.forEach(ball=>{
const bt=ballTransparency(ball, gameState)
if(bt<min){
min=bt
}
})
boost+=min*gameState.perks.transparency / 2
}
return Math.ceil(Math.max(gameState.combo,gameState.lastCombo) * boost)
}
export function miniMarkDown(md: string) { export function miniMarkDown(md: string) {
let html: { tagName: string; text: string }[] = []; let html: { tagName: string; text: string }[] = [];
let lastNode: { tagName: string; text: string } | null = null; let lastNode: { tagName: string; text: string } | null = null;

View file

@ -19,7 +19,7 @@ import { gameState, lastMeasuredFPS, startWork } from "./game";
import { isOptionOn } from "./options"; import { isOptionOn } from "./options";
import { import {
catchRateBest, catchRateBest,
catchRateGood, catchRateGood, coinsBoostedCombo,
levelTimeBest, levelTimeBest,
levelTimeGood, levelTimeGood,
missesBest, missesBest,
@ -270,7 +270,7 @@ export function render(gameState: GameState) {
startWork("render:explosionshake"); startWork("render:explosionshake");
ctx.globalAlpha = 1; ctx.globalAlpha = 1;
ctx.globalCompositeOperation = "source-over"; ctx.globalCompositeOperation = "source-over";
const lastExplosionDelay = Date.now() - gameState.lastExplosion + 5; const lastExplosionDelay = gameState.levelTime - gameState.lastExplosion + 5;
const shaked = lastExplosionDelay < 200 && !isOptionOn("basic"); const shaked = lastExplosionDelay < 200 && !isOptionOn("basic");
if (shaked) { if (shaked) {
const amplitude = const amplitude =
@ -440,11 +440,12 @@ export function render(gameState: GameState) {
); );
startWork("render:combotext"); startWork("render:combotext");
if (gameState.combo > 1) { const spawns=coinsBoostedCombo(gameState)
if (spawns > 1) {
ctx.globalCompositeOperation = "source-over"; ctx.globalCompositeOperation = "source-over";
ctx.globalAlpha = 1; ctx.globalAlpha = 1;
const comboText = "x " + gameState.combo; const comboText = spawns.toString();
const comboTextWidth = (comboText.length * gameState.puckHeight) / 1.8; const comboTextWidth = (comboText.length * gameState.puckHeight) / 1.8;
const totalWidth = comboTextWidth + gameState.coinSize * 2; const totalWidth = comboTextWidth + gameState.coinSize * 2;
const left = gameState.puckPosition - totalWidth / 2; const left = gameState.puckPosition - totalWidth / 2;

View file

@ -189,10 +189,7 @@ export const rawUpgrades = [
id: "smaller_puck", id: "smaller_puck",
max: 2, max: 2,
name: t("upgrades.smaller_puck.name"), name: t("upgrades.smaller_puck.name"),
help: (lvl: number) => help: (lvl: number) => t("upgrades.smaller_puck.tooltip", {percent:50*lvl}),
lvl == 1
? t("upgrades.smaller_puck.tooltip")
: t("upgrades.smaller_puck.help_plural"),
fullHelp: t("upgrades.smaller_puck.verbose_description"), fullHelp: t("upgrades.smaller_puck.verbose_description"),
}, },
{ {
@ -721,8 +718,7 @@ export const rawUpgrades = [
id: "fountain_toss", id: "fountain_toss",
max: 7, max: 7,
name: t("upgrades.fountain_toss.name"), name: t("upgrades.fountain_toss.name"),
help: (lvl: number) => help: () => t("upgrades.fountain_toss.tooltip"),
t("upgrades.fountain_toss.tooltip", { lvl, max: lvl * 30 }),
fullHelp: t("upgrades.fountain_toss.verbose_description"), fullHelp: t("upgrades.fountain_toss.verbose_description"),
}, },
{ {