Build 29126616

This commit is contained in:
Renan LE CARO 2025-05-18 21:37:12 +02:00
parent 810df5962a
commit 7f50b67c60
22 changed files with 209 additions and 30 deletions

View file

@ -16,6 +16,7 @@ Break colourful bricks, catch bouncing coins and select powerful upgrades !
## Done
## 29126551
- picky eater : +1 combo per color on screen per brick
- New perk : wrap up - balls touching the top of the screen teleport just above your paddle, aiming upward

View file

@ -29,8 +29,8 @@ android {
applicationId = "me.lecaro.breakout"
minSdk = 21
targetSdk = 34
versionCode = 29126551
versionName = "29126551"
versionCode = 29126616
versionName = "29126616"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true

File diff suppressed because one or more lines are too long

50
dist/index.html vendored

File diff suppressed because one or more lines are too long

View file

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

View file

@ -77,6 +77,12 @@
"bricks": "_gggg_gBBBBggBBBBggBBBBggBBBBg_gggg_",
"credit": ""
},
{
"name": "icon:chill",
"size": 7,
"bricks": "__GGG___G_G_G_G__G__GG__G__GG_GGG_G_G_G_G___GGG__",
"credit": ""
},
{
"name": "icon:clairvoyant",
"size": 9,
@ -554,7 +560,7 @@
{
"name": "icon:wrap_up",
"size": 8,
"bricks": "___y__b___b__b____b__b___b__b____b__b___b__b____b__y____WWW_____",
"bricks": "____y______b______b______b_____Wb_____b__b___b____b_y______WWW__",
"credit": ""
},
{

View file

@ -1 +1 @@
"29126551"
"29126616"

View file

@ -179,7 +179,7 @@ export function normalizeGameState(gameState: GameState) {
gameState.baseSpeed = Math.max(
3,
gameState.gameZoneWidth / 12 / 10 +
gameState.currentLevel / 3 +
gameState.currentLevel / 3 / (1 + gameState.perks.chill * 10) +
gameState.levelTime / (30 * 1000) -
gameState.perks.slow_down * 2,
);

View file

@ -102,8 +102,12 @@ export function getPossibleUpgrades(gameState: GameState) {
.filter((u) => !u?.requires || gameState.perks[u?.requires]);
}
export function renderMaxLevel(gameState: GameState) {
return gameState.perks.chill ? "∞" : max_levels(gameState);
}
export function max_levels(gameState: GameState) {
if (gameState.creative) return 1;
if (gameState.perks.chill) return gameState.currentLevel + 2;
return 7 + gameState.perks.extra_levels;
}

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "عوامة",
"upgrades.buoy.tooltip": "تطفو العملات المعدنية لمدة {{duration}} ثانية على الخط السفلي.",
"upgrades.buoy.verbose_description": "يكون التأثير أكثر وضوحًا في الوضع المحمول",
"upgrades.chill.name": "",
"upgrades.chill.tooltip": "",
"upgrades.chill.verbose_description": "",
"upgrades.clairvoyant.name": "مستبصر",
"upgrades.clairvoyant.tooltip": "شاهد المستويات القادمة، نقاط الصحة للطوب واتجاه الكرة",
"upgrades.clairvoyant.verbose_description": "يساعدك على اختيار الترقيات المناسبة وفهم كيفية عمل الطوب المتين. يُضيف المستويان 2 و3 معلومات إضافية حول فائدة مشكوك فيها (متوفرة في وضع الحلقة).",

View file

@ -10527,6 +10527,116 @@
</concept_node>
</children>
</folder_node>
<folder_node>
<name>chill</name>
<children>
<concept_node>
<name>name</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>false</approved>
</translation>
<translation>
<language>es-CL</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</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>
<name>tooltip</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>false</approved>
</translation>
<translation>
<language>es-CL</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</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>
<name>verbose_description</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>false</approved>
</translation>
<translation>
<language>es-CL</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
<translation>
<language>ru-RU</language>
<approved>false</approved>
</translation>
<translation>
<language>tr-TR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>clairvoyant</name>
<children>

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "Boje",
"upgrades.buoy.tooltip": "Münzen schweben {{duration}} Sekunden lang auf der unteren Linie.",
"upgrades.buoy.verbose_description": "Der Effekt ist im mobilen Modus am deutlichsten sichtbar",
"upgrades.chill.name": "",
"upgrades.chill.tooltip": "",
"upgrades.chill.verbose_description": "",
"upgrades.clairvoyant.name": "Hellsichtig",
"upgrades.clairvoyant.tooltip": "Sehen Sie die nächsten Levels, die HP der Steine und die Ballrichtung",
"upgrades.clairvoyant.verbose_description": "Hilft dir, die richtigen Upgrades auszuwählen und zu verstehen, was es mit den robusten Steinen auf sich hat. Level 2 und 3 bringen zusätzliches Wissen von zweifelhaftem Nutzen (erreichbar im Loop-Modus)",

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "Buoy",
"upgrades.buoy.tooltip": "Coins float for {{duration}} seconds on the bottom line. ",
"upgrades.buoy.verbose_description": "Effect is most visible in mobile mode",
"upgrades.chill.name": "Chill",
"upgrades.chill.tooltip": "No upgrades, unlimited levels.",
"upgrades.chill.verbose_description": "The ball will also accelerates much slower. ",
"upgrades.clairvoyant.name": "Clairvoyant",
"upgrades.clairvoyant.tooltip": "See upcoming levels, bricks HP and ball direction",
"upgrades.clairvoyant.verbose_description": "Helps you pick the right upgrades and understand what's going on with sturdy bricks. Level 2 and 3 bring additional knowledge of dubious utility (reachable in loop mode)",

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "Boya",
"upgrades.buoy.tooltip": "Las monedas flotan durante {{duration}} segundos en la línea inferior.",
"upgrades.buoy.verbose_description": "El efecto es más visible en el modo móvil.",
"upgrades.chill.name": "",
"upgrades.chill.tooltip": "",
"upgrades.chill.verbose_description": "",
"upgrades.clairvoyant.name": "Perspicaz",
"upgrades.clairvoyant.tooltip": "Revela los niveles, el PV de los ladrillos y la dirección de las balas",
"upgrades.clairvoyant.verbose_description": "Te ayuda a elegir las mejoras adecuadas y a entender qué ocurre con los \"ladrillos macizos\". Los niveles 2 y 3 (en modo bucle) proporcionan información adicional de dudosa utilidad.",

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "Bouée",
"upgrades.buoy.tooltip": "Les pièces flottent pendant {{duration}} secondes sur la ligne du bas.",
"upgrades.buoy.verbose_description": "L'effet est plus visible en mode mobile",
"upgrades.chill.name": "",
"upgrades.chill.tooltip": "",
"upgrades.chill.verbose_description": "",
"upgrades.clairvoyant.name": "Clairvoyant",
"upgrades.clairvoyant.tooltip": "Révèle les niveaux, PV des briques et direction des balles",
"upgrades.clairvoyant.verbose_description": "Vous aide à choisir les bonnes améliorations et à comprendre ce qu'il se passe avec \"briques solides\". Les niveaux 2 et 3 (en mode loop) amènent des informations complémentaires d'une utilité douteuse. ",

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "Буй",
"upgrades.buoy.tooltip": "Монеты плавают в течение {{duration}} секунд на нижней строке.",
"upgrades.buoy.verbose_description": "Эффект наиболее заметен в мобильном режиме.",
"upgrades.chill.name": "",
"upgrades.chill.tooltip": "",
"upgrades.chill.verbose_description": "",
"upgrades.clairvoyant.name": "Ясновидящий",
"upgrades.clairvoyant.tooltip": "Просматривайте предстоящие уровни, количество кирпичей и направление движения мяча",
"upgrades.clairvoyant.verbose_description": "Поможет выбрать правильные апгрейды и понять, что происходит с прочными кирпичами. Уровни 2 и 3 дают дополнительные знания сомнительной полезности (достигаются в режиме цикла)",

View file

@ -294,6 +294,9 @@
"upgrades.buoy.name": "Şamandıra",
"upgrades.buoy.tooltip": "Madeni paralar alt satırda {{duration}} saniye boyunca yüzer.",
"upgrades.buoy.verbose_description": "Etkisi mobil modda en iyi şekilde görülür",
"upgrades.chill.name": "",
"upgrades.chill.tooltip": "",
"upgrades.chill.verbose_description": "",
"upgrades.clairvoyant.name": "Durugörü sahibi",
"upgrades.clairvoyant.tooltip": "Yaklaşan seviyeleri, tuğla HP'sini ve top yönünü görün",
"upgrades.clairvoyant.verbose_description": "Doğru yükseltmeleri seçmenize ve sağlam tuğlalarla neler olup bittiğini anlamanıza yardımcı olur. Seviye 2 ve 3, şüpheli fayda hakkında ek bilgi getirir (döngü modunda erişilebilir)",

View file

@ -1,7 +1,11 @@
import { GameState, PerkId } from "./types";
import { asyncAlert } from "./asyncAlert";
import { t } from "./i18n/i18n";
import { levelsListHTMl, max_levels, pickedUpgradesHTMl } from "./game_utils";
import {
levelsListHTMl,
pickedUpgradesHTMl,
renderMaxLevel,
} from "./game_utils";
import { getCreativeModeWarning, getHistory } from "./gameOver";
import { pause } from "./game";
import { allLevels, icons, upgrades } from "./loadGameData";
@ -21,7 +25,7 @@ export async function openScorePanel(gameState: GameState) {
title: t("score_panel.title", {
score: gameState.score,
level: gameState.currentLevel + 1,
max: max_levels(gameState),
max: renderMaxLevel(gameState),
}),
content: [

View file

@ -20,6 +20,7 @@ import {
levelsListHTMl,
max_levels,
pickedUpgradesHTMl,
renderMaxLevel,
upgradeLevelAndMaxDisplay,
} from "./game_utils";
import { getFirstUnlockable, getNearestUnlockHTML } from "./openScorePanel";
@ -33,6 +34,7 @@ import {
import { toast } from "./toast";
export async function openUpgradesPicker(gameState: GameState) {
if (gameState.perks.chill) return;
const catchRate =
gameState.levelCoughtCoins / (gameState.levelSpawnedCoins || 1);
@ -137,7 +139,7 @@ export async function openUpgradesPicker(gameState: GameState) {
.sort((a, b) => a.score - b.score)
.filter((u) => gameState.perks[u.id] < u.max + gameState.perks.limitless);
let recommendation = settingsChangeRecommendations();
while (true) {
while (true && !gameState.perks.chill) {
// refresh the list if you pick extra one_more_choice
const offered = sorted.slice(
0,
@ -190,7 +192,7 @@ export async function openUpgradesPicker(gameState: GameState) {
>({
title: t("level_up.title", {
level: gameState.currentLevel,
max: max_levels(gameState),
max: renderMaxLevel(gameState),
}),
content: [
t("level_up.upgrade_perks", {

View file

@ -1,5 +1,5 @@
import { gameCanvas } from "./render";
import { isInWebView, max_levels } from "./game_utils";
import { isInWebView, max_levels, renderMaxLevel } from "./game_utils";
import { getAudioRecordingTrack } from "./sounds";
import { t } from "./i18n/i18n";
import { GameState } from "./types";
@ -53,7 +53,7 @@ export function drawMainCanvasOnSmallCanvas(gameState: GameState) {
recordCanvasCtx.textAlign = "left";
recordCanvasCtx.fillText(
"Level " + (gameState.currentLevel + 1) + "/" + max_levels(gameState),
"Level " + (gameState.currentLevel + 1) + "/" + renderMaxLevel(gameState),
12,
12,
);

View file

@ -9,6 +9,7 @@ import {
isPickyEatingPossible,
max_levels,
reachRedRowIndex,
renderMaxLevel,
telekinesisEffectRate,
yoyoEffectRate,
zoneLeftBorderX,
@ -71,7 +72,7 @@ export function render(gameState: GameState) {
if (gameState.currentLevel || gameState.levelTime) {
menuLabel.innerText = t("play.current_lvl", {
level: gameState.currentLevel + 1,
max: max_levels(gameState),
max: renderMaxLevel(gameState),
});
} else {
menuLabel.innerText = t("play.menu_label");

View file

@ -12,6 +12,7 @@ export const noCreative: PerkId[] = [
"extra_levels",
"shunt",
"one_more_choice",
"chill",
];
export const categories = {
@ -980,4 +981,15 @@ export const rawUpgrades = [
help: (lvl: number) => t("upgrades.wrap_up.tooltip"),
fullHelp: (lvl: number) => t("upgrades.wrap_up.verbose_description"),
},
{
category: categories.beginner,
requires: "",
threshold: 5000,
gift: false,
id: "chill",
max: 1,
name: t("upgrades.chill.name"),
help: (lvl: number) => t("upgrades.chill.tooltip"),
fullHelp: (lvl: number) => t("upgrades.chill.verbose_description"),
},
] as const;