Compare commits

...

170 commits

Author SHA1 Message Date
Renan LE CARO
f1cd138071 Build 29085904 2025-04-20 15:04:53 +02:00
Renan LE CARO
de485e5598 Build 29085898 2025-04-20 14:58:29 +02:00
Renan LE CARO
ae2f43be0e Build 29085883 2025-04-20 14:43:24 +02:00
Renan LE CARO
0cfd75e7b2 Record 2025-04-20 14:37:08 +02:00
Renan LE CARO
c88540488d wip 2025-04-20 13:41:12 +02:00
Renan LE CARO
b3949d8c41 wip 2025-04-20 13:12:10 +02:00
Renan LE CARO
4d7d57f17f wip 2025-04-20 12:56:50 +02:00
Renan LE CARO
1ba55bf2a6 wip 2025-04-20 10:58:26 +02:00
Renan LE CARO
70f3c2307a wip 2025-04-20 09:54:49 +02:00
Renan LE CARO
66952cb1ca Build 29085573 2025-04-20 09:33:55 +02:00
Renan LE CARO
a386c5f3d2 Prob lighting 2025-04-20 09:33:12 +02:00
Renan LE CARO
6adab3d07f Build 29084606 2025-04-19 17:26:45 +02:00
Renan LE CARO
603ebf319a Build 29084571 2025-04-19 16:51:56 +02:00
Renan LE CARO
1252bbca06 Removed precise physics option, uses the fastest ball speed instead 2025-04-19 16:50:26 +02:00
Renan LE CARO
b891e0fafb Build 29083446 2025-04-18 22:06:16 +02:00
Renan LE CARO
a388cd0898 Build 29083397 2025-04-18 21:17:32 +02:00
Renan LE CARO
d43dd90a86 wip 2025-04-18 17:15:47 +02:00
Renan LE CARO
530e94f704 Build 29080170 2025-04-16 15:30:42 +02:00
Renan LE CARO
21fa5f105e wip 2025-04-16 15:30:20 +02:00
Renan LE CARO
277aa5682b Build 29079818 2025-04-16 09:38:43 +02:00
Renan LE CARO
871a7f9c31 Build 29079805 2025-04-16 09:26:10 +02:00
Renan LE CARO
8e4e67e33b Build 29079087 2025-04-15 21:28:00 +02:00
Renan LE CARO
06843047d2 Added particle and sound effect when coin drops below the "waterline" of the puck 2025-04-15 21:25:27 +02:00
Renan LE CARO
354a6490e9 wip 2025-04-15 17:31:57 +02:00
Renan LE CARO
47ad04c49b wip 2025-04-15 16:47:04 +02:00
Renan LE CARO
64a85200b9 wip 2025-04-14 13:39:30 +02:00
Renan LE CARO
11c797bc59 Allow loading saves from newer versions 2025-04-13 14:53:22 +02:00
Renan LE CARO
0cb4945e7d Build 29075517 2025-04-13 09:58:09 +02:00
Renan LE CARO
2d383f02cb wip 2025-04-13 09:52:08 +02:00
Renan LE CARO
34f6aed001 Build 29074738 2025-04-12 20:58:24 +02:00
Renan LE CARO
19ee1d0d33 Build 29074681 2025-04-12 20:01:43 +02:00
Renan LE CARO
48ac639901 Build 29074419 2025-04-12 15:39:32 +02:00
Renan LE CARO
b15eb873b1 Build 29074385 2025-04-12 15:05:23 +02:00
Renan LE CARO
4418ca7926 Build 29074043 2025-04-12 09:24:07 +02:00
Renan LE CARO
7e8643ceed Build 29074010 2025-04-12 08:50:28 +02:00
Renan LE CARO
613b7cce58 Build 29073274 2025-04-11 20:34:51 +02:00
Renan LE CARO
a8e9fc6cb6 wip 2025-04-11 20:34:11 +02:00
Renan LE CARO
8099ced71b wip 2025-04-11 09:36:31 +02:00
Renan LE CARO
bf687c48ee wip 2025-04-11 08:15:58 +02:00
Renan LE CARO
ccb99ce17d Build 29072514 2025-04-11 07:55:06 +02:00
Renan LE CARO
96aae001b4 Build 29071903 2025-04-10 21:43:40 +02:00
Renan LE CARO
1b94bcd6be Build 29071900 2025-04-10 21:40:45 +02:00
Renan LE CARO
4bb5d820c5 Build 29071541 2025-04-10 15:41:44 +02:00
Renan LE CARO
c37b860fe3 Build 29071527 2025-04-10 15:27:38 +02:00
Renan LE CARO
9ae649743c Build 29071489 2025-04-10 14:49:28 +02:00
Renan LE CARO
16880533dd Build 29071397 2025-04-10 13:17:38 +02:00
Renan LE CARO
5f33aad670 Build 29070121 2025-04-09 16:01:36 +02:00
Renan LE CARO
59103db3c2 Puck => paddle 2025-04-09 15:32:05 +02:00
Renan LE CARO
3c8846fac2 Build 29069921 2025-04-09 12:41:40 +02:00
Renan LE CARO
520173b7f9 Build 29069918 2025-04-09 12:38:46 +02:00
Renan LE CARO
b565d47c56 Build 29069860 2025-04-09 11:40:16 +02:00
Renan LE CARO
13627b6c09 Build 29069848 2025-04-09 11:28:32 +02:00
Renan LE CARO
962fd8b0cd wip 2025-04-09 09:55:32 +02:00
Renan LE CARO
183a11f989 Fixed an issue with resizing and pacman level, changed ball attracts coins 2025-04-09 09:24:15 +02:00
Renan LE CARO
83b9c0dec5 wip 2025-04-08 21:54:19 +02:00
Renan LE CARO
f2bf1e3f9f Space before ? issue in english 2025-04-08 17:34:59 +02:00
Renan LE CARO
f627ba0ab6 wip 2025-04-08 17:34:29 +02:00
Renan LE CARO
7f413c8544 wip 2025-04-08 17:19:08 +02:00
Renan LE CARO
cf2d3f85ca Removed some unused translation, limited history to top 100 runs 2025-04-08 17:14:11 +02:00
Renan LE CARO
b530bf38d5 Build 29068637 2025-04-08 15:17:14 +02:00
Renan LE CARO
4651bb396c Build 29068622 2025-04-08 15:02:38 +02:00
Renan LE CARO
269f1b8b94 Build 29068588 2025-04-08 14:29:00 +02:00
Renan LE CARO
c6665d9b0e Build 29068568 2025-04-08 14:08:54 +02:00
Renan LE CARO
df8bfbb350 Build 29068563 2025-04-08 14:03:38 +02:00
Renan LE CARO
6ef13f2d19 wip 2025-04-08 10:36:30 +02:00
Renan LE CARO
e1c20627bc wip 2025-04-08 08:57:41 +02:00
Renan LE CARO
8eb2e049c8 Build 29067292 2025-04-07 16:52:42 +02:00
Renan LE CARO
eb846327e5 Build 29067205 2025-04-07 15:25:58 +02:00
Renan LE CARO
be49fb9d6e wip 2025-04-07 14:50:35 +02:00
Renan LE CARO
156c060b96 wip 2025-04-07 14:22:59 +02:00
Renan LE CARO
e78021ff83 wip 2025-04-07 14:08:48 +02:00
Renan LE CARO
9624c5b351 wip 2025-04-07 08:24:17 +02:00
Renan LE CARO
46228a2128 wip 2025-04-06 18:21:53 +02:00
Renan LE CARO
42abc6bc01 wip 2025-04-06 15:38:30 +02:00
Renan LE CARO
2f51f83514 wip 2025-04-06 11:57:52 +02:00
Renan LE CARO
ac2100860f wip 2025-04-06 11:36:32 +02:00
Renan LE CARO
ccd7f00a6a wip 2025-04-06 11:34:12 +02:00
Renan LE CARO
7664bf5dcd wip 2025-04-06 11:32:48 +02:00
Renan LE CARO
0a6e510663 wip 2025-04-06 11:31:17 +02:00
Renan LE CARO
c04b7d84d7 wip 2025-04-06 11:29:05 +02:00
Renan LE CARO
74cb0c9eab wip 2025-04-06 11:27:26 +02:00
Renan LE CARO
23c98589d1 wip 2025-04-06 10:49:12 +02:00
Renan LE CARO
8944f8ef4a wip 2025-04-06 10:47:44 +02:00
Renan LE CARO
ebbf482d0e wip 2025-04-06 10:41:46 +02:00
Renan LE CARO
6299f7e86b wip 2025-04-06 10:20:09 +02:00
Renan LE CARO
bdbf8b846c wip 2025-04-06 10:13:10 +02:00
Renan LE CARO
0cef60f90d Build 29064070 2025-04-05 11:10:55 +02:00
Renan LE CARO
e9f3f03bcf Build 29064068 2025-04-05 11:09:07 +02:00
Renan LE CARO
af85e6e50f Trying the web archiving thing 2025-04-05 10:38:18 +02:00
Renan LE CARO
b239bab852 Updated fastlane, added bundle generations for play store 2025-04-04 15:29:06 +02:00
Renan LE CARO
ec178e393d Build 29062849 2025-04-04 14:49:44 +02:00
Renan LE CARO
48695fd3d9 Updated description and video 2025-04-04 14:43:08 +02:00
Renan LE CARO
85ece0b975 Build 29062687 2025-04-04 12:07:51 +02:00
Renan LE CARO
f76c96019c Rendering things mostly
- "Miss warning" option is now on by default (ball's particles are red if catching it would be a "miss")
- "Show +X in gold"  option is now on by default (show a +X when combo increases)
- "High contrast" option added, off by default (applies lights layer again as "soft light" at the end of the render)
- "Colorful coins" option now applied at render time instead of coin spawn time, to make preview easier
- when settings are opened on pc, they show up on the side and the overlay is transparent to let you preview the changes
2025-04-04 12:07:24 +02:00
Renan LE CARO
7d518f14e5 Build 29062545 2025-04-04 09:45:35 +02:00
Renan LE CARO
51d112c942 Build 29061838 2025-04-03 21:59:01 +02:00
Renan LE CARO
99db15d776 Build 29061801 2025-04-03 21:22:13 +02:00
Renan LE CARO
00094d5efa Build 29061490 2025-04-03 16:10:51 +02:00
Renan LE CARO
ba7e368938 Graphics change, more light thanks to optimized computations 2025-04-03 15:15:00 +02:00
Renan LE CARO
83c79b6564 wip 2025-04-02 20:09:17 +02:00
Renan LE CARO
eb05f7d182 Build 29060283 2025-04-02 20:03:57 +02:00
Renan LE CARO
8104b8d4a9 wip 2025-04-02 20:00:09 +02:00
Renan LE CARO
c2ae98f057 Build 29060272 2025-04-02 19:52:47 +02:00
Renan LE CARO
d77a58438f Build 29060269 2025-04-02 19:50:05 +02:00
Renan LE CARO
b7dacaba0a Build 29060255 2025-04-02 19:36:03 +02:00
Renan LE CARO
5ce309d59f Build 29060245 2025-04-02 19:25:38 +02:00
Renan LE CARO
75972744cb Build 29060146 2025-04-02 17:46:34 +02:00
Renan LE CARO
c86031f4c0 Trying to sign apks directly 2025-04-02 17:14:28 +02:00
Renan LE CARO
b46f745310 Build 29060103 2025-04-02 17:03:53 +02:00
Renan LE CARO
a215237c17 Build 29060048 2025-04-02 16:09:00 +02:00
Renan LE CARO
866bf4164b Build 29059827 2025-04-02 12:27:38 +02:00
Renan LE CARO
47badbb930 Readme update 2025-04-02 11:29:36 +02:00
Renan LE CARO
a3ff7d81ad Build 29059721 2025-04-02 10:42:01 +02:00
Renan LE CARO
1cf82d6641 starting perk, settings icons 2025-04-02 10:41:35 +02:00
Renan LE CARO
991e7a1d85 Build 29058981 2025-04-01 22:21:43 +02:00
Renan LE CARO
b7b4879e6d Build 29058943 2025-04-01 21:43:36 +02:00
Renan LE CARO
9958717260 See fixes in readme 2025-04-01 21:37:07 +02:00
Renan LE CARO
92a0edabef Build 29058753 2025-04-01 18:33:58 +02:00
Renan LE CARO
2c75005127 wip 2025-04-01 18:26:40 +02:00
Renan LE CARO
b49abf9904 Build 29058637 2025-04-01 16:37:34 +02:00
Renan LE CARO
19729d4599 Build 29058469 2025-04-01 13:49:25 +02:00
Renan LE CARO
b2e6e3c9e4 Removed unused translations 2025-04-01 13:49:10 +02:00
Renan LE CARO
de99dd9ba8 Build 29058459 2025-04-01 13:39:09 +02:00
Renan LE CARO
b19cc5c0b4 Help update 2025-04-01 13:35:33 +02:00
Renan LE CARO
d31f8ef0b4 Help 2025-03-31 20:13:47 +02:00
Renan LE CARO
af65f22c70 Translations 2025-03-31 20:08:17 +02:00
Renan LE CARO
d52472a34d Updated translations to say "game" and not "run", this will make auto translation easier. 2025-03-31 14:47:31 +02:00
Renan LE CARO
f9800c352c
Added translation using Weblate (Russian) 2025-03-31 10:16:12 +02:00
Renan LE CARO
be5850e3f2
Added translation using Weblate (Spanish) 2025-03-31 10:16:12 +02:00
Renan LE CARO
12a34e9e5b
Added translation using Weblate (German) 2025-03-31 10:16:12 +02:00
Renan LE CARO
4371c1781f
Translated using Weblate (French)
Currently translated at 98.9% (296 of 299 strings)

Translation: Breakout 71/In app translations
Translate-URL: https://hosted.weblate.org/projects/breakout-71/in-app-translations/fr/
2025-03-30 19:46:11 +00:00
Renan LE CARO
583956d57c
Translated using Weblate (English)
Currently translated at 100.0% (299 of 299 strings)

Translation: Breakout 71/In app translations
Translate-URL: https://hosted.weblate.org/projects/breakout-71/in-app-translations/en/
2025-03-30 19:46:10 +00:00
Renan LE CARO
a3f167fa45 Added link to weblate 2025-03-30 21:30:08 +02:00
Renan LE CARO
7e316391d8 Balancing
- New perk : addiction, reward faster gameplay
- Balancing : hot start effect doubled
- Balancing : you earn an extra perk when playing well, and a reroll when playing perfectly
- Balancing : telekinesis limited to level 1
2025-03-30 21:07:58 +02:00
Renan LE CARO
27a2cd686e Build 2025-03-29 21:28:05 +01:00
Renan LE CARO
a4e24fd397 Extracted pure functions to make tests happy 2025-03-29 21:22:19 +01:00
Renan LE CARO
8d7d97608d Test fixes 2025-03-29 21:21:48 +01:00
Renan LE CARO
adfd3ecf83 Changelog update 2025-03-29 21:05:53 +01:00
Renan LE CARO
a328520191 Stats display 2025-03-29 20:45:54 +01:00
Renan LE CARO
23798c4e58 Made the "combo lost" text last 500ms instead of the pointless 150ms 2025-03-29 17:40:07 +01:00
Renan LE CARO
da89cdb647 Adjustments for looping 2025-03-29 15:00:44 +01:00
Renan LE CARO
e08c1e7b9e wip 2025-03-29 11:24:45 +01:00
Renan LE CARO
39b326a15b Overcomplicated looping mechanic 2025-03-29 09:25:17 +01:00
Renan LE CARO
5012076039 Looping mode 2025-03-28 19:40:59 +01:00
Renan LE CARO
3d5547e786 Looping works, almost 2025-03-28 11:58:58 +01:00
Renan LE CARO
46f87556e1 Draft of looping mode, shine bricks when hit but not broken 2025-03-28 10:21:14 +01:00
Renan LE CARO
59ef24c865 Adventure mode wip, not really fun 2025-03-27 10:52:31 +01:00
Renan LE CARO
6cf8fabf16 Wip : adventure mode 2025-03-26 14:04:54 +01:00
Renan LE CARO
395968bc52 Build 29049575 2025-03-26 08:35:49 +01:00
Renan LE CARO
e3e61b12b8 Added rerolls 2025-03-26 08:27:56 +01:00
Renan LE CARO
0ada53a063 Starting adventure mode 2025-03-26 08:01:12 +01:00
Renan LE CARO
a134821a94 Sacrifice : clear screen instead of doubling coins 2025-03-25 08:57:22 +01:00
Renan LE CARO
39b6738805 Build 29048147 2025-03-25 08:47:39 +01:00
Renan LE CARO
35ea8e952a Fix with explosions 2025-03-25 08:47:24 +01:00
Renan LE CARO
3a72ae005b Ascetism : render coins with red border if there's a combo 2025-03-25 08:33:09 +01:00
Renan LE CARO
fe5c33f999 Warn about unbounded 2025-03-25 08:24:24 +01:00
Renan LE CARO
80dd1f0758 Red border dashes 2025-03-25 08:22:58 +01:00
Renan LE CARO
83d335b05e Build 29046953 2025-03-24 12:53:09 +01:00
Renan LE CARO
8b8e49595d N hits : reset as soon as you break more bricks that demanded 2025-03-24 12:52:42 +01:00
Renan LE CARO
4710eaa152 Build 29046822 2025-03-24 10:42:48 +01:00
Renan LE CARO
c48b379098 Texts 2025-03-24 10:42:38 +01:00
Renan LE CARO
0589729fb8 Fixed starting speed of balls 2025-03-24 10:38:01 +01:00
Renan LE CARO
5a10f7d768 Passive income and clairvoyant adjusments 2025-03-24 10:19:15 +01:00
Renan LE CARO
41b3e6f00b Build 29046079 2025-03-23 22:19:28 +01:00
Renan LE CARO
f3790b3334 Added side kick, implosion, corner shot 2025-03-23 22:19:11 +01:00
Renan LE CARO
f49da76667 Fixed : combo display on small pucks 2025-03-23 21:34:56 +01:00
Renan LE CARO
af02565bf1 Clairvoyant perks, hps adjusments 2025-03-23 19:11:01 +01:00
Renan LE CARO
3745b527f5 Sturdy bricks now have a proper hit counter 2025-03-23 17:52:25 +01:00
Renan LE CARO
6899b5cf36 Build 29045721 2025-03-23 16:21:56 +01:00
Renan LE CARO
054b4a85c7 wip 2025-03-23 16:19:29 +01:00
86 changed files with 27120 additions and 5486 deletions

1
.gitignore vendored
View file

@ -13,3 +13,4 @@ node_modules
app/release/ app/release/
.parcel-cache/ .parcel-cache/
dist dist
keystore.properties

View file

@ -1,20 +0,0 @@
# Credits
I pulled many background patterns from https://pattern.monster/
They are displayed in [patterns.html](editor/patterns.html) for easy inclusion.
Some of the sound generating code was written by ChatGPT, and heavily
adapted to my usage over time.
Some of the pixel art is taken from google image search results, I hope to replace it by my own over time :
[Heart](https://www.youtube.com/watch?v=gdWiTfzXb1g)
[Mushroom](https://pixelartmaker.com/art/cce4295a92035ea)
https://prohama.com/whale-2-pattern/
https://prohama.com/shark-2-pattern/
https://prohama.com/bird-1-size-13x12/
https://prohama.com/pingwin-4-pattern/
https://prohama.com/dog-21-pattern/
I wanted an APK to start in fullscreen and be able to list it on fdroid and the play store. I started with an empty view and went to work trimming it down, with the help of that tutorial
https://github.com/fractalwrench/ApkGolf/blob/master/blog/BLOG_POST.md

98
Help.md
View file

@ -1,98 +0,0 @@
# Goal
The goal is to catch as many coins as possible during 7 levels.
Coins appear when you break bricks.
They fly around, bounce and roll, and you need to catch them with your puck to increase your score.
Your score is displayed in the top right corner of the screen.
You must delete all bricks to progress to the next level.
If you drop the ball, it's game over, unless you had the "extra life" upgrade.
# Upgrades
After clearing a level, you'll be able to pick upgrades among a small selection presented to you.
The upgrade you pick will apply until the end of the run. You will get more upgrade choices, and even the ability to pick
multiple upgrades at the end of the level if you play well : catch all coins, clear the level quickly and never miss.
You also get a free random upgrade at the beginning of each run. You can see which upgrades you have
(and a few more details) by clicking your score at the top right of the screen.
Upgrades apply to the whole run and can synergize. For example, if you combine "sapper" and "piercing", the first brick
you hit after a puck bounce will immediately be transformed to an explosive brick, and detonated by the same ball,
effectively giving you an explosive ball.
Some upgrades help with aiming, like "puck control balls". Some upgrades can be picked multiple times to increase the effect, you'll see for example "+1 ball level 2" which adds a third ball.
When you first play, only a few upgrades are available, you unlock the rest by simply playing and scoring points. There's a similar
mechanic for levels unlock. At the end of a run, the things you just unlocked will be shown, and you can check the full content in menu / unlocks.
Many upgrades impact your combo.
# Combo
Your "combo" is the number of coins spawned when a brick breaks. It is displayed on your puck, for example x4 means each
brick will spawn 4 coins. It will reset if you miss.
Many upgrades impact your combo :
### Single puck hit streak
The combo grows by one when breaking a brick, but resets when a ball hits the puck.
Once you combo is high, the puck will glow red, to remind you that it will hurt your combo to touch it with any ball.
The combo does not reset when the ball is lost, provided you have more than one ball.
### +3 base combo
The combo starts at 4, and resets to 4 if another upgrade resets it.
Picking this again will raise the starting combo by 3 each time.
There are no downsides to this upgrade.
### Shoot straight
The combo grow each time you break a brick.
The combo resets whenever the ball touches the left or right of the play area.
Once your combo is a bit high, the sides will glow red to let you know you shouldn't touch them.
### Sky is the limit
The combo grow each time you break a brick.
The combo resets whenever the ball touches the top of the play area.
Once your combo is a bit high, the top will glow red to let you know you shouldn't touch it.
### Picky eater
Each time you break a brick, if the ball and brick color are the same, your combo grows by one.
Otherwise, the combo resets, and the ball takes the color of the brick.
Bricks of the wrong colors should glow red once you have a small combo going.
### Compound interest
Each time you break a brick, your combo grows by one.
Each time a coin falls around your puck and is lost, your combo decreases by one.
Once you have a small combo going, the bottom of the screen will glow red around the puck, to remind you to catch all coins.
If you level this further, then the combo grows and shrinks faster.
### Hot start
Your combo starts at 15 at the beginning of the level.
Every second, it decreases by one.
If you level this further, the combo starts 15 points higher and shrinks 1 point / s more.
### Soft reset
Whenever your combo resets, it only looses half of its value.
However, whenever it should increase, it has 50% chance of staying the same.
If you pick it a second time, the effect is more pronounced : the combo keeps 66% of its value on reset, but only grows 33% of the time.
If you have many perks that grow the combo every time a brick breaks, then it will still grow every time just slower.
# Aiming
What decides how the ball flies away is only the position of the puck hit. If the ball hits the puck dead center, it will
bounce back up vertically, while in you hit more on one side, it will have more angle.
The puck speed and incoming angle have no impact on the ball direction after bouncing.
You might find that a smaller puck makes it a bit easier to aim near corners, but also makes it much harder to catch coins.
"Wind" and "puck controls ball" can help you aim even after the ball bounced to the wrong direction.
"Slower ball" gives you a bit more time to aim, particularly useful in later levels where the ball goes faster. The ball also
accelerates as you spend time in each level.

670
Readme.md
View file

@ -4,230 +4,528 @@ Break colourful bricks, catch bouncing coins and select powerful upgrades !
- [Play now](https://breakout.lecaro.me/) - [Play now](https://breakout.lecaro.me/)
- [Donate](https://paypal.me/renanlecaro) - [Donate](https://paypal.me/renanlecaro)
- [Discord](https://discord.gg/DZSPqyJkwP) - Bitcoin : bc1qlh8kywy3ttsuqqa08yx2rdc8dqhdvyt43wlxmr
- [Post your comments on itch.io](https://renanlecaro.itch.io/breakout71) - [Discord](https://discord.gg/bbcQw4x5zA)
- [Help and tips about the game](./Help.md) - [itch.io](https://renanlecaro.itch.io/breakout71)
- [Credits](./Credits.md) - [F-Droid](https://f-droid.org/en/packages/me.lecaro.breakout/)
- [Open source android version on F-Droid](https://f-droid.org/en/packages/me.lecaro.breakout/)
- [Google Play](https://play.google.com/store/apps/details?id=me.lecaro.breakout) - [Google Play](https://play.google.com/store/apps/details?id=me.lecaro.breakout)
- [GitLab](https://gitlab.com/lecarore/breakout71) - [GitLab](https://gitlab.com/lecarore/breakout71)
- [HackerNews thread](https://news.ycombinator.com/item?id=43183131)
# Current priorities
The goal of this project is to make a game used by many people.
The game is already pretty fun.
I'm now trying to translate it to (Lebanese) Arabic, Russian and (Chilean) Spanish.
Other translation are very welcome, contact me if you'd like to submit one.
# System requirements # Changelog
## To do
Breakout 71 can work offline (add it to home screen) and perform well even on low-end devices.
It's very lean and does not take much storage space (Roughly 0.1MB).
If the app stutters, turn on "fast mode" in the settings to render a simplified view that should be faster.
There's also an easy mode for kids (slower ball).
# Next ## Done
- stop scrolling back to top in menu - toast an error if storage is blocked
- render next level behind upgrade picker again - toast an error if migration fails
- sturdy bricks: map of remaining hits - in apk, video download doesn't work
# bugs
- perk : travel map
* [colin] parfois je dois appuyer plusieurs fois sur "Start a new run" pour vraiment commencer une nouvelle partie. dans ce cas, lhécran de jeu derrière se "désassombrit" comme si le jeu avait démarré plusieurs parties en même temps.
* [colin] lorsque le puck est trop petit, l'affichage du combo disparaît. mais c'est peut-être volontaire pour qu'il ne dépasse pas du puck ? afficher simplement le chiffre serait suffisant et tiendrait dans le puck
* [colin] le niveau bug parfois et ne peux pas démarrer. dans ce cas, la balle apparait comme démarrant sans être attachée au puck, comme si la partie avait déjà commencée. il faut redémarrer B71 pour que ça fonctionne
# UX
- instead of the free perk at level one, offer to skip lvl 1 and directly pick 4 perks, but only if you manage to clear lvl 1 with 4 upgrades.
- the onboarding feels weird, missing a tutorial
- It's a bit confusing at first to grasp that one upgrade is applied randomly at the start of the game
- on mobile, add an element that feels like it can be "grabbed" and make it shine while writing "Push here to play"
- add a clickable button to allow sound to play in chrome android
- add pwe manifest
- offline mode with service worker
- see how to do fullscreen on ios, or at least explain to do aA/hide toolbars
- translation
- when game resumes near bottom, be unvulnerable for .5s ? , once per level
# Game engine features
- save state in localstorage for easy resume of a game in progress
- ask for permanent storage - ask for permanent storage
- more help somewhere accessible - option: reuse past frame's light in new frame lighting computation when there are 150+ coins on screen, to limit the performance impact of rendering lots of lights
- limit GC by reusing coins and particles
- convert captures to mp4 unsing ffmpeg wasm because reddit refuses webm files ## 29084606
- disable zooming (for ios double tap)
- few puck bounces = more choices / upgrades - simpler and more readable encoding for save files
- show total score on end screen (score added to total) - removed check of payload signature on save file, seemed to fail because of the poor encoding of the name of the "côte d'ivoire" level
- handle back bouton in menu - automatic detection of the number of steps required for physics
- balls could collide with each other - trial runs detection fix
- manifest for PWA (android and apple)
- Offline mode web for iphone ## 29083397
- controller support on web/mobile
- enable export of gameplay capture in webview - highlight last used creative level
- endgame histograms could work as filters, when you hover a bar, all other histograms would show the stats of those runs only, without changing reference of categories - access autoplay mode from the menu
- would be nice to have a leaderboard for not using each perk too. Like "best runs without hot start" - access stress test mode from the menu, show real time stats
- restart run on r - Render bottom border differently to show how far the puck can go
- when missing, redo particle trail, but give speed to particle that matches ball direction - Corner Shot: scale like Need Some Space
- grey out irrelevant options in the settings
- Back to Creative Menu at the end of a Creative level
## 29080170
- don't show unlock toast at first startup for levels that are unlocked by default
- Droplet particle color should be gold for gold coins
- added levels: A Very Dangerous High-Five, The Boys
## 29079818
- Imported levels : Mario, Minesweeper and Target
- Fixed an issue with localstorage saving of custom levels
# graphics ## 29079805
- lights shadows with background gradient light map ? - combo text on paddle will be grey if we're at the base combo
- webgl rendering - transparency now rounds up
- shinier coins by applying glow to them - import level up to 21 x 21
- experiment with showing the combo somewhere else, maybe top center, maybe instead of score. - corrected icon of "padding"
- the white outline on bricks associated with picky eater kinda works but i feel it's more distracting than anything. maybe try something different ? put a cross on matching coloured bricks, or the contrary, grey out other bricks.
# New perks ideas ## 29079087
- [colin] Corner shot - the puck can go beyond the screen limits so as to make corner shots easier. - measured and improve the performance (test here https://breakout.lecaro.me/?stresstest)
- [colin] Mental charge - the puck is divided into two smaller pucks, then 3 smaller ones at lvl 2 - added a few levels
- [colin] Batteries - lvl1: recharge les pouvoirs du puck quand la balle touche le haut de l'écran (1 fois par lancer, se recharge en touchant le puck). lvl2: également après voir détruit 6 blocs. lvl3: également quand elle touche les bords de l'écran - autoplay mode (with wake lock and computer play https://breakout.lecaro.me/?autoplay )
- [colin] Combos extrêmes: lvl2 pour tous les combos, qui fait que le combo rapporte doubl ou triple, mais si sur un niveau la condition n'est pas respectée alors le perk ne donne plus de combo bonus pour ce niveau. - Added particle and sound effect when coin drops below the "waterline" of the puck
- [colin] Mytosis - les blocs bombe n'explosent pas mais relâchent une nouvelle balle à la place - slower coins fall once they are under the paddle
- [colin] Juggle - au début du niveau, chaque balle est lancée l'une après au lieu de toutes à la fois - in game level editor
- [colin] Side-kick - briser un bloc par le côté génère plus de coins que par le dessus ou le dessous. - allow loading newer save in outdated app (for rollback)
- game crashes when reaching level 12 (no level info in runLevels)
## 29074385
- added back some extra languages
- superhot: fixed particles durations and level duration
- bricks aattract coins : less powerfull
- bricks attract balls
- unbounded nerf : just adds padding around bricks, not combo add
- don't tell user to get -100 points to unlock level
- display colored coins when there's hypnosis or rainbow enabled
## 29071903
- new perk : hypnosis
- new perk : rainbow
- new perk : bricks attract coins
- Extra choice: wrong text for french "2 more choices"
- metamorphosis : when coins are spent, display them hollowed out
- super hot : starting level rework
- zen : added bombs to starting level
## 29071527
- super hot : time moves only when paddle moves. Later levels slow down even more the time when you're not moving.
- transparency : ball becomes transparent towards top of screen, +50% coins.
- space coins : coins bounce without loosing momentum
- trickledown : coins spawn at the top of the screen
- unlocked content : start with perk icon as level
- allow removing all starting perks, to get full random
- rename "puck" into paddle
- use french as base language to keep consistent formal/informal tone
- fixed memory leak in language detection code
## 29069860
- when rendering level icons, always use transparent background
- resized some levels to use as flags, added some missing languages as levels
- added machine translation, so that translators can try the game in their language first : ar,de,es,ko,ru,ur,uz,zh
- change translation keys to get better sorted files
- change fortunate ball to work more like coin magnet, carrying the balls around to catch them at next puck bounce
- add a test to forbid more than 5% grey bricks on black background, remove grey bricks border
- simplified texts to make translation easier
- fixed some issues around saved level unlocks
- change donation text to not suggest an amount
- limited history to top 100 runs
## 29068563
- review the "next unlocks" in score and game over
- As soon as upgrade condition is reached, toast
- As soon as level condition is reached, lock it in and tell the user
- extra life only saves your last ball, max 7 instead of 3
- Don't use "RAZ" in French explanations.
- explain ghost coin's slow down effect
- when there are only a few coins, make them brighter
- Perk : [colin] minefield
- clear scheduled sounds if sounds off
- show unlocked levels above game stats in gameover screen
- reduce resolution of lights even more (1/16)
## 29067205
- tooltip isn't readable at bottom of screen
- added levels as tributes to game players
- display closest unlock with current perks in score and gameover screens
- initial perk icon = first level
- fix starting perk option not working
- progress bar for unlock in unlocks menu
- display runs history
- in the runs history, only save perks that were chosen by the user
- migration to save past content to localStorage.recovery_data right before starting a new version
- mention unlock conditions in help
- show unlock condition in unlocks menu for perks as tooltip
- fallback for mobile user to see unlock conditions
- New perk : "limitless" raises the max of all perks by 1
- Boosted perk : side kick, now you just need to hit bricks from the left side to gain +lvl combo, hitting from the right side does -2xlvl combo
- add unlock conditions for levels in the form "reach high score X with perk A,B,C but without perk B,C,D"
- remove loop mode :
- remove basecombo
- remove mode
- clear old runs in other mode
- ignore scores in creative mode
- remove the slow mode
- adjusted the light effects
- added white border around dark grey bricks
- remove the opaque coin options, all coins are opaque, but dark grey ones have white border
- archive each version as an html file and apk
- publish 29062687 on play store
- redo video
- review fastlane text
- tried and cancelled native desktop app build with tauri because :
- there's no cross compilation, so no exe build on linux
- you need to sign executable differently for each platform
- the .deb and .rmp files were 3.8M for a 0.1M app
- the appimage was crazy big (100M)
- I'd need a mac to make a mac version that probably wouldn't run without doing the app store dance with apple
## 29062687
- tried and cancelled webgl rendering
- it's a lot of code
- i'm not great at it
- it requires a significant rewrite
- for most things, no perf difference
- the main goal of having more colorful backgrounds can be achieved by running the lights layer at lower res
- "Miss warning" option is now on by default (ball's particles are red if catching it would be a "miss")
- "Show +X in gold" option is now on by default (show a +X when combo increases)
- "High contrast" option added, off by default (applies lights layer again as "soft light" at the end of the render)
- "Colorful coins" option now applied at render time instead of coin spawn time, to make preview easier
- when settings are opened on pc, they show up on the side and the overlay is transparent to let you preview the changes
## 29062545
- Perks list now only lists upgrades that have been picked, or have banned levels
- After clearing a level, that level is dimmed in the clairvoyant level list [Bearded-Axe]
- limited clairvoyant to level one outside looped runs [obigre]
- yoyo now has more effect when the ball is at the top of the screen [obigre]
- telekinesis now has more effect when the ball is at the bottom of the screen
- "Top is lava" combo lost text is now spawned a bit lower to be more visible [obigre]
## 29061838
- New perk : Fountain toss [colin] - loosing coins makes your combo grow
- Boosted : Asceticism now decreases combo instead of resetting it
- Graphics : show respawn particles even in basic mode [obigre]
- Graphics : adjusted the brightness of the game a bit more
## 29061490
- Graphics : option to add more light (on by default)
- Graphics : option to make coins more readable (on by default)
- Graphics : background light effects optimization
- Graphics : all levels background have been checked (4 buggy ones removed) and will be assigned randomly
- Fixed : display gained combo was showing +0 sometimes
## 29060272
- Fixed: Strict sample size was counting destroyed bricks, now count hits as explained in the help
- Fixed: passive_income was resetting your combo if you moved around the end of the last level
- Fixed: a high score issues was systematically erasing the high score in the web version, i added a migration to load the best score for your top games to recover the high score.
- QOL: option to display gained combo as onscreen text
- QOL: publish an apk to itch.io with every build
- Internal: added a simple game data migration system
## 29059721
- QOL: icons in settings menu
- QOL: choose starting perks
- QOL: fixed issue with reloading with [R] key
- QOL: gameover screen restarts in the same game mode
- Fixed: Trampoline render sides in red.
- Fixed: tooltips stuck on mobile
- Fixed: issues with restarting a game with fullscreen on
## 29058981
- [jaceys] A visual indication of whether a ball has hit a brick this serve (as an option)
- Top down /reach: now only the lowest level of N bricks resets combo, and all other bricks do +N combo
- picky eater: don't reset if no brick of ball color
- main menu : show high score
- keep high score of past runs
- tooltip on stats
- fixed : looping didn't work
- two abstract levels, stripes and openings
- added reset button for perks in lab mode
## 29058469
- New game mode : loop / long game
- the goal is to build many different build centered on one perk
- At the end of level 7, you get to restart at level 1 for 6 levels.
- all your perks are banned except one
- The perk you keep is leveled up, and can be leveled up a second time during the next loop
- the perks you don't keep are "banned", meaning their max level is reduced by as many levels as you had picked
- unlocked after unlocking all perks
- New game mode : lab / creative
- the goal is to come up with 3 completely different but powerful play styles
- you freely create 3 builds from all the perks level available
- you play them against the levels of your choice
- try to make as much score as possible in total
- unlocked after unlocking all perks
- New levels :
- Pingwin
- Sunglasses
- Balloon
- Adjusted levels :
- orca is no longer made of bombs, but gray block
- New perks
- addiction : reward faster gameplay
- Adjusted perks
- Hot start : 30 combo per level instead of 15
- Telekinesis: limited to level 1
- Asceticism now gives +3 combo per lvl
- Fortunate ball has a stronger effect
- Bigger puck : puck can now cover the whole screen at higher levels, but not more
- Corner shot : higher levels let you move further away from the play area
- Forgiving : level 2 halves the penalty, level 3 is a third ..
- Helium : stronger anti gravity at higher levels
- Implosions : works like bigger-explosions at higher levels
- Metamorphosis : coins can stain more bricks at higher levels
- Re-spawn : now delay based and probabilistic, to scale more easily with higher levels. no need to hit the puck
- sacrifice : at level 2+ the combo is doubles/tripled just before clearing the screen of any bricks
- shunt : changed the math keep 25% of combo at level 1,50% at level 2,63% at level 3,70% at level 4..
- soft reset : same math as shunt
- smaller puck : now the puck can get as small as a ball
- Unbounded : at level 2+, the top of the level is gone too
- concave_puck : ball bounces straighter and straighter, to the point where you can't move it without another perk
- shocks lvl 2+ make bigger explosions
- trampoline: nerfed a little bit, now all sides and top hit reduce combo
- Quality of life
- Updated discord invite link that had expired
- Full screen is now a persistent option, when it's on the game will switch to full screen before starting
- Added an option to always get colored coins
- Made the "combo lost" text last 500ms instead of the pointless 150ms
- Added in-game help and credits, which can be translated
- Balancing : you earn an extra perk when playing well, and a reroll when playing perfectly
- added a prominent "donate" link after 5h of playing, and setting to hide it permanently
- disabled auto-release to F-Droid, i'll use the web version as the testing ground first
- added a white border around all coins, to make dark ones visible on dark bg
- [jaceys] counters for coins lost, misses, and boundary bounces, as well as a timer.
- Unlocked list : split perk and levels, added tooltips
## 29049575
- added rerolls
- Sacrifice : clear screen instead of doubling coins
## 29048147
- Ascetism : render coins with red border if there's a combo
- Warn about unbounded
- Red border dashes
# Ideas and features
## Easy perks ideas
- "+1 coin for each brick within a small radius of the broken brick" ?
- two for one : add a 2 for one upgrade combo to the choice lists
- cash out : double last level's gains
- snowball : Combo resets every 0.1s . +1 combo for each combo gained Since last reset.
- Chain reaction : +lvl*lvl combo per brick broken by an explosion, combo resets after explosion is over
- coins stained by balls
- fast pause : pause delay divided by {{lvl}} (helps with teleport)
- [colin] Capital - les vies non perdues à la fin du niveau rapportent un bonus de points - [colin] Capital - les vies non perdues à la fin du niveau rapportent un bonus de points
- bricks are invisible, but .. - ban 3 random perks from pool, gain 2 upgrades
- second puck (symmetric to the first one)
- offer next level choice after upgrade pick
- ban 3 random perks from pool, doesn't tell you which ones, gain 2 upgrades
- 3 random perks immediately, or maybe "all level get twice as many upgrades, but they are applied randomly, and you aren't told which ones you have."
- wrap left / right
- pause and cheat again
- wrap top / bottom : coins fall back from top of screen, ball flies to the top and comes back from the screen bottom ?
- faster coins, double value - faster coins, double value
- wind (puck positions adds force to coins and balls)
- balls repulse coins - balls repulse coins
- n% of coins missed respawn at the top - n% of coins missed respawn at the ball
- lightning : missing triggers and explosive lighting strike around ball path - +1 combo per brick broken after a wall bounce, reset otherwise
- coins repulse coins (could get really laggy) - combo climbs by 1 every 2 second, unless no coin was caught, then it resets
- balls repulse coins
- balls attract coins
- twice as many coins after a wall bounce, twice as little otherwise ?
- missile goes when you catch coin
- missile goes when you break a brick
- puck bounce +1 combo, hit nothing resets
- multiple hits on the same brick (show remaining resistance as number)
- bricks attract ball
- replay last level (remove score, restores lives if any, and rebuild )
- accelerometer controls coins and balls
- bricks attract coins
- breaking bricks stains neighbours
- extra kick after bouncing on puck
- transparents coins
- coins of different colors repulse
- bricks follow game of life pattern with one update every second
- 2x coins when ball goes downward / upward, half that amount otherwise ?
- new ball spawns when reaching combo X
- missing with combo triggers explosive lightning strike
- correction : pick one past upgrade to remove and replace by something else
- puck bounce predictions rendered with particles or lines (requires big refactor)
- the more balls are close to a brick, the more coins she spawns when breaking
- combo resets when puck moves
- [colin] mirror puck - a mirrored puck at the top of the screen follows as you move the bottom puck. it helps with keeping combos up and preventing the ball from touching the ceiling. it could appear as a hollow puck so as to not draw too much attention from the main bottom puck.
- [colin] side pucks - same as above but with two side pucks.
- [colin] ball coins - coins share the same physics as coins and bounce on walls and bricks
- [colin] bigger ball - self-explanatory
- [colin] smaller ball - yes.
- [colin] sturdy ball - does more damage to bricks, to conter sturdy bricks
- [colin] plot - plot the ball's trajectory as you position your puck
- [colin] golden corners - catch coins at the sides of the puck to double their value - [colin] golden corners - catch coins at the sides of the puck to double their value
- [colin] varied diet - your combo grows if you keep hitting different coloured bricks each time - [colin] varied diet - your combo grows by 2 when your ball changes color, but decreses by one when a brick is broken ?
- [colin] earthquake - when the puck hits any side of the screen with velocity, the screen shakes and a brick explodes/falls from the level. alternatively, any brick you catch with the puck gives you the coins at the current combo rate. each level lowers the amount of hits before a brick falls - [colin] trickle up - inverse of reach more or less
- [colin] statue - stand still to make the combo grow. move for too long and thi combo will quickly drop - Dividends — +1 combo per 10 coins lost (band-aid for players who struggle, useful addition when choosing Ascetism)
- [colin] piggy bank - bricks absorb coins that fall onto it, and release them back as they are broken, with added value - +lvl combo per bricks / resets after 5/lvl seconds without explosion ?
- [colin] trickle up - if you first hit is the lowest brick of a column, all bricks above get +1 coin inside - +lvl combo per bricks / resets after 5/lvl seconds without coin catch ?
- [colin] wormhole - the puck sometimes don't bounce the ball back up but teleports it to the top of the screen as if it fell through from bottom to top. higher levels reduce the times it takes to reload that effect - +lvl combo per bricks / resets after 5/lvl seconds without ball color change ?
- [colin] hitman - hit the marked brick for +5 combo. each level increases the combo you get for it. - +lvl combo per bricks / resets after 5/lvl seconds without sides hit ?
- [colin] sweet spot - place your puck directly below a moving spot at the top of the level to increase your combo - + lvl x n combo when destroying a brick after bouncing on a side/top n times ?
- ball attracted by bricks of the color of the ball - make stats a clairvoyant thing
- [colin]P ocket money — bricks absorb coins that touch them, which are released on brick destruction (with a bonus?)
- [colin] turn ball gravity on after a top bar hit, and until bouncing on puck
- fan : paddle motion creates upward draft that lifts coins and balls
## Medium difficulty perks ideas
- balls collision split them into 4 smaller balls, lvl times (requires rework)
- offer next level choice after upgrade pick
- [colin] mirror puck - a mirrored puck at the top of the screen follows as you move the bottom puck. it helps with keeping combos up and preventing the ball from touching the ceiling. it could appear as a hollow puck so as to not draw too much attention from the main bottom puck.
- [colin] Combos extrêmes: lvl2 pour tous les combos, qui fait que le combo rapporte double ou triple, mais si sur un niveau la condition n'est pas respectée alors le perk ne donne plus de combo bonus pour ce niveau.
- [colin] Mytosis - les blocs bombe n'explosent pas mais relâchent une nouvelle balle à la place (clashes with "shocks" and "sapper")
- [colin] Juggle - au début du niveau, chaque balle est lancée l'une après au lieu de toutes à la fois (needs some work)
- SUPER HOT (time moves when puck moves)
- bricks attract ball
- bricks attract coins
- wrap left / right
- correction : pick one past upgrade to remove and replace by something else
- +1 combo when ball goes downward, reset if upward
- 2x speed after bouncing on puck
- the more balls are close to a brick, the more combo is gained when breaking it. If only one ball, loose one point or reset
- ball avoids brick of wrong color - ball avoids brick of wrong color
- coins avoid ball of different color - puck slowly follows desired position, but +1 combo
- colored coins only (coins should be of the color of the ball to count )
## Hard perk ideas
- accelerometer controls coins and balls
- [colin] side pucks - same as above but with two side pucks : hard to know where to put them
- [colin] Perk: second puck in the middle of the screen
## ideas to sort
- wind : move coins based on puck movement not position
- double coin value when they hit the sides
- [colin]Brambles — coins that touch the walls and ceiling get stuck and are thrown back when the last brick is destroyed
- [colin]Ball of Greed — the ball can collect coins (might be worth dividing into levels: lvl 1, can collect coins only after two bounces on bricks or walls. lvl 2, can collect after 1 bounce. lvl 3, can collect coins anytime)(or change the ball collection radius as the level grows)
- [colin]Phantom ball — the ball phases through 2 bricks then becomes solid (lvl2: through 6 bricks, lvl3; through all bricks until it touches a wall)
- [colin]Cryptomoney — coins that should be generated by bricks are instantly collected, but count for half their value
- [colin]Relative time — ball speed depends on its position: if it's high up on thi screen it's fast, if it's lower it's slower
- ball attracted by bricks of the color of the ball
- level flips horizontally every time a ball bounces on puck - level flips horizontally every time a ball bounces on puck
- coins that hit the puck disappear, missed ones are scored
- [colin] close quarters - balle attirée par tous les blocs/par un bloc aléatoire, actif à portée de bloc (+1bloc au lvlup)/proportionnel à une force (+puissance au lvlup)… - [colin] close quarters - balle attirée par tous les blocs/par un bloc aléatoire, actif à portée de bloc (+1bloc au lvlup)/proportionnel à une force (+puissance au lvlup)…
- [colin] plusieurs perks qui déclenchent des effets quand une balle est perdue. par ex: +3 combo à chaque balle perdue, 5 blocs transformés en bombe, balle et coins ralentis, blocs régénérés… - [colin] plusieurs perks qui déclenchent des effets quand une balle est perdue. par ex: +3 combo à chaque balle perdue, 5 blocs transformés en bombe, balle et coins ralentis, blocs régénérés…
- [colin] faster style - augmente le combo en fonction de la vitesse de la balle - [colin] faster style - augmente le combo en fonction de la vitesse de la balle
- [colin] perk: analyzer - permet de voir les caractéristiques cachées des blocs (sturdy…)
- [colin] perk: roulette - gagne instantanément 2 perks aléatoires - [colin] perk: roulette - gagne instantanément 2 perks aléatoires
- combo climbs every time a ball bounces on puck (but bounce is random?)
- combo climbs by 1 every 2 second, unless no coin was caught, then it resets
# extra levels ## extra levels
- famous games - Good games :
- letters - FTL
- Nova drift
- Noita
- Enter the gungeon
- Zero Sivert
- Factorio
- Swarm
- Nuclear throne
- Brigador
- letters and an associated word or name
- famous characters and movies
- famous places : eiffel tower, taj mahal, etc..
- fruits - fruits
- animals - animals
- countries flags and shapes, with name as background - countries flags and shapes
# extra settings
- add a toggle to switch between the “coin” design and colored bubbles
- on mobile, relative movement of the touch would be amplified and added to the puck
- option : don't pause on mobile when lifting finger
# Premium: infinite mode
Allow players to loop the game, adding one hasard per loop, making it harder and harder to exploit each strategy.
The high score are separated from the main mode. The scores are added for unlock. You no longer get upgrades after the first 7 levels.
The score you make in each level is instead multiplied by the number of "upgrades" and "choices" you would have had.
The score is your "fuel", and lets you pick the next level from a list. Each level has a cost, preview, and one or two downgrades.
Each downgrade acts as a score multiplier.
Your goal is no longer to score higher, but to go farther
Possible challenges :
- Add negative coins that make the coin magnet less usage
- add negative bricks that clear coins and reset combo
- add a brick eating enemy that forces you to play fast
- add a force field for 10s that negates hots start
- other perks can be randomly turned off
- ball keeps accelerating until unplayable
- graphical effects like trail, contrast, blur to make it harder to see what's going on
- ball creates a draft behind itself that blows coins in odd patterns
- add red anti-coins that apply downgrades
- destroy your combo
- hurt your score
- behave like heavier coins.
- deactivate a perk for this level
- reduce your number of coins
- destroy all coins on screen
- lowers your combo
- reduce your choice for your next perk
# extend re-playability ## UX / gameplay
- chill game mode, to just relax your mind :
- no 7 levels limit
- no upgrades offered at the end of the level
- get a random perk
- every 7 level it's replaced by another random perk
- every 7 levels, +10 base combo and +1 piece
- avoid showing a +1 and -1 at the same time when a combo increase is reset
- explain to iOS users how to add the app to home screen to get fullscreen
- delayed start on mobile to let users place the puck where they want
- experiment with showing the combo somewhere else, maybe top center, maybe instead of score.
- display a multiplicator if it's not 100%, have some perks add to it
## Game engine features ideas
- add a clickable button to allow sound to play in chrome android
- save state in localstorage for easy resume of a game in progress
- handle back bouton in menu
- Offline mode web for iphone
- controller support on web/mobile
- leaderboard for not using each perk, like "best runs without hot start"
## Maybe one day
- https://weblate.org/fr/ quite annoying to have merge conflicts while pushing, i'll enable it later.
- auto-detect device performance at first startup and adjust settings accordingly (hard to do in any sort of useful way)
- [jaceys] Move the restart button out of the menu, so that it is more easily accessible (will allow user to choose starting perk instead)
- colored coins only (coins should be of the color of the ball to count, otherwise what ? i'd rather avoid negative points)
- coins avoid ball of different color (pointless)
- [colin] wormhole - the puck sometimes don't bounce the ball back up but teleports it to the top of the screen as if it fell through from bottom to top. higher levels reduce the times it takes to reload that effect (not sure how that to word that in 1 setence)
- [colin] Mental charge - the puck is divided into two smaller pucks, then 3 smaller ones at lvl 2 : what's the point ?
- [colin] sturdy ball - does more damage to bricks, to conter sturdy bricks :that's pierce now
- [colin] plot - plot the ball's trajectory as you position your puck : too hard when you add other perks
- [colin] piggy bank - bricks absorb coins that fall onto it, and release them back as they are broken, with added value : equivalent to Asceticism
- [colin] ball coins - coins share the same physics as coins and bounce on walls and bricks : really hard to balance with speeds and all
- non brick-shaped bricks, tilted bricks,moving blocks : very difficult because of engine optimisations
- 3 random perks immediately, or maybe "all level get twice as many upgrades, but they are applied randomly, and you aren't told which ones you have."
- coins repulse coins, could get really laggy ?
- russian roulette: 5/6 chances to get a free upgrade, 1/6 chance of game over. Not really fun
- [colin] bigger ball - self-explanatory, or is it ? what's the point ? physics would break now if ball bigger than bricks
- [colin] smaller ball - doable, but why
- [colin] earthquake - when the puck hits any side of the screen with velocity, the screen shakes and a brick explodes/falls from the level. alternatively, any brick you catch with the puck gives you the coins at the current combo rate. each level lowers the amount of hits before a brick falls. Problem : no limit on how often you can slam the puck around
- missile goes when you catch coin
- missile goes when you break a brick
- [colin] Batteries - lvl1: recharge les pouvoirs du puck quand la balle touche le haut de l'écran (1 fois par lancer, se recharge en touchant le puck). lvl2: également après voir détruit 6 blocs. lvl3: également quand elle touche les bords de l'écran : i'll probably just let the second puck replace this
- store much more details about run (level by level) as numbers only (instead of json that gets big false)
- [colin] hitman - hit the marked brick for +5 combo. each level increases the combo you get for it.
- [colin] sweet spot - place your puck directly below a moving spot at the top of the level to increase your combo
- [colin] reward the player with more choices/perks for breaking a brick while having reached an increasing combo thresholds. 5 combo, then 10, then 20, then 40 etc… once a threshold is reached you aren't rewarded for that threshold again until you start a rew run
- mobile option: relative movement of the touch would be amplified and added to the puck
- mobile option: don't pause on mobile when lifting finger
- translate fastlane presentation texts to french
- convert captures to mp4 unsing ffmpeg wasm because reddit refuses webm files
- disable zooming (for ios double tap)
- Waterline under the puck, coins slow down a lot, reflections
- webgl rendering: background gradient light map, shinier coins, quite hard
- on mobile, add an element that feels like it can be "grabbed" and make it shine while writing "Push here to play"
- hard mode : bricks take many hits, perks more rare, missing clears level score, missing coins deducts score.. - hard mode : bricks take many hits, perks more rare, missing clears level score, missing coins deducts score..
- architect mode :
- play 7 levels, each with a different build.
- Perk levels can only be used once, so if you take one for level 1, you won't have it to level 2-7.
- Your final score is your worst score times your best score
- You'll see the levels in advance
- stats by lack of perk, like "best score without using hot start". - stats by lack of perk, like "best score without using hot start".
- split screen multiplayer - split screen multiplayer
- Add color schemes into the game (ex : Catppuccin, Dracula, Terminal, etc) - Add color schemes into the game (ex : Catppuccin, Dracula, Terminal, etc)
Instead of automatically unlocking things at the end of each run, add the coins to the user's account,
and let them spend those coins on upgrades. The upgrades would then be explained. They could have a condition like
"reach high score of 1000" or 'reach high score of 99999 without using "hot start"'.
This requires recording a bit more info about each run.
I could unlock the "pro stand" at $999 that just holds the play area higher.
# increase skill ceiling
- reroll mechanic, rerolls are reward for better play
- make puck smaller as combo increases ?
- final bosses (large vertical level that scrolls down faster and faster) - final bosses (large vertical level that scrolls down faster and faster)
- when the player reaches the last level, allow them to loop the run, unlocking a permanent bonus for this run. For example: +5 combo, +1 life per loop… the counterpart would be hazards that slowly populate the levels. - add loop run where user levels can't be used in further loops (boring)
- add lab mode where you need to make three builds (complex, lots of clicking, not fun)
# Credits
I pulled many background patterns from https://pattern.monster/
I wanted an APK to start in fullscreen and be able to list it on fdroid and the play store. I started with an empty view and went to work trimming it down, with the help of that tutorial : https://github.com/fractalwrench/ApkGolf/blob/master/blog/BLOG_POST.md
Colin (obigre) brought a lot of fantastic ideas to the game, here's his website (in French) : https://colin-crapahute.bearblog.dev/
Tõnu Rääk made a Tiermaker template to share your favorite perk choices : https://tiermaker.com/create/breakout-71-perks-18086724
# Breakout games suggestions
Here are a few interesting games in the breakout genre :
- LBreakoutHD : https://sourceforge.net/p/lgames/code/HEAD/tree/trunk/lbreakouthd/
- Wizorb : https://store.steampowered.com/app/207420/Wizorb/
- Ricochet infinity : https://www.myabandonware.com/game/ricochet-infinity-dxm
- Whackerball : https://store.steampowered.com/app/2192170/Whackerball/
# PC game suggestions
Here are a few games I've sank a lot of time in, and that inspired breakout in some way
- Heat signature : https://www.humblebundle.com/store/heat-signature
- FTL : https://www.gog.com/en/game/faster_than_light
- Nova drift : https://www.gog.com/en/game/nova_drift
- Noita : https://www.gog.com/en/game/noita
- Enter the gungeon : https://www.gog.com/en/game/enter_the_gungeon
- Zero Sivert : https://store.steampowered.com/app/1782120/ZERO_Sievert/
- Factorio : https://www.factorio.com/
- Nuclear throne : https://store.steampowered.com/app/242680/Nuclear_Throne/ (don't buy on GOG it's outdated)
- Brigador : https://www.gog.com/en/game/brigador
- Teleglitch https://www.gog.com/en/game/teleglitch_die_more_edition
# How to install
# Colin's feedback (cwpute/obigre) Breakout 71 can be installed and work offline in many ways:
* reward the player with more choices/perks for breaking a brick while having reached an increasing combo thresholds. 5 combo, then 10, then 20, then 40 etc… once a threshold is reached you aren't rewarded for that threshold again until you start a rew run - Download an index.html file from [itch.io](https://renanlecaro.itch.io/breakout71) to play offline on your computer (latest version always)
* inspired by Balatro's score system : have some perks add to the multiplicator, and some others to the amount of coins in a brick (or the raw value of coins inside), so that you users want to improve both for maximized profit ! maybe tie one of the to perks that help you, and the other to perks that are bad to you, so that gambling players are forced to make their life harder - Download the latest apk from [itch.io](https://renanlecaro.itch.io/breakout71) to play offline on your android phone (latest version always)
- Add [the app](https://breakout.lecaro.me/) to your home screen on android, and it should play even when offline thanks to the service workers (latest version always)
- Install the latest version from the play store : https://play.google.com/store/apps/details?id=me.lecaro.breakout (updated from time to time)
- Install the latest version from Fdroid : https://f-droid.org/packages/me.lecaro.breakout/ (updated very rarely because of the updates publication lag)
- Download the index.html file or apk from my archive server : https://archive.lecaro.me/public-files/b71/ (any version including latests)
# System requirements
# other The game should perform well even on low-end devices. It's very lean and does not take much storage space (Roughly 0.1MB). The web version is supposed to work on iOS safari, Firefox ESR and chrome, on desktop and mobile.
If the app stutters, turn on "fast mode" in the settings to render a simplified view that should be faster. You can adjust many aspects of the game there, go have a look !
- balls have gravity : quite hard to balance the strenght of flying off the puck
- non brick-shaped bricks, tilted bricks,moving blocks : not yet

View file

@ -1,9 +1,27 @@
import java.util.Properties
import java.io.FileInputStream
plugins { plugins {
alias(libs.plugins.androidApplication) alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsKotlinAndroid) alias(libs.plugins.jetbrainsKotlinAndroid)
} }
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
android { android {
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
namespace = "me.lecaro.breakout" namespace = "me.lecaro.breakout"
compileSdk = 34 compileSdk = 34
@ -11,8 +29,8 @@ android {
applicationId = "me.lecaro.breakout" applicationId = "me.lecaro.breakout"
minSdk = 21 minSdk = 21
targetSdk = 34 targetSdk = 34
versionCode = 29045711 versionCode = 29085904
versionName = "29045711" versionName = "29085904"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables { vectorDrawables {
useSupportLibrary = true useSupportLibrary = true
@ -27,7 +45,7 @@ android {
getDefaultProguardFile("proguard-android-optimize.txt"), getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro" "proguard-rules.pro"
) )
signingConfig = signingConfigs.getByName("debug") signingConfig = signingConfigs.getByName("release")
} }
} }
compileOptions { compileOptions {
@ -49,22 +67,6 @@ android {
} }
} }
} }
dependencies {
//dependencies { implementation(libs.androidx.core)
// }
// implementation(libs.androidx.core.ktx)
// implementation(libs.androidx.lifecycle.runtime.ktx)
// implementation(libs.androidx.activity.compose)
// implementation(platform(libs.androidx.compose.bom))
// implementation(libs.androidx.ui)
// implementation(libs.androidx.ui.graphics)
// implementation(libs.androidx.ui.tooling.preview)
// implementation(libs.androidx.material3)
// testImplementation(libs.junit)
// androidTestImplementation(libs.androidx.junit)
// androidTestImplementation(libs.androidx.espresso.core)
// androidTestImplementation(platform(libs.androidx.compose.bom))
// androidTestImplementation(libs.androidx.ui.test.junit4)
// debugImplementation(libs.androidx.ui.tooling)
// debugImplementation(libs.androidx.ui.test.manifest)
//}

View file

@ -23,6 +23,14 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application> </application>
</manifest> </manifest>

File diff suppressed because one or more lines are too long

View file

@ -1,11 +1,7 @@
package me.lecaro.breakout package me.lecaro.breakout
import android.app.Activity
import android.app.DownloadManager
import android.content.ContentValues import android.content.ContentValues
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@ -20,13 +16,14 @@ import android.webkit.ValueCallback
import android.webkit.WebChromeClient import android.webkit.WebChromeClient
import android.webkit.WebView import android.webkit.WebView
import android.widget.Toast import android.widget.Toast
import androidx.core.content.FileProvider
import java.io.File import java.io.File
import java.net.URLDecoder
import java.nio.charset.StandardCharsets
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.jar.Manifest
const val CHOOSE_FILE_REQUEST_CODE = 548459 const val CHOOSE_FILE_REQUEST_CODE = 548459
const val PERM_REQUEST_CODE = 66622635
class MainActivity : android.app.Activity() { class MainActivity : android.app.Activity() {
@ -51,71 +48,79 @@ class MainActivity : android.app.Activity() {
private fun downloadFile(url: String) { private fun downloadFile(url: String) {
try { try {
if (!url.startsWith("data:")) {
Log.w("DL", "url ignored because it does not start with data:")
return
}
val sdf = SimpleDateFormat("yyyy-M-dd-hh-mm") val sdf = SimpleDateFormat("yyyy-M-dd-hh-mm")
val currentDate = sdf.format(Date()) val currentDate = sdf.format(Date())
val base64Data = url.substringAfterLast(',')
val decodedBytes = android.util.Base64.decode(base64Data, android.util.Base64.DEFAULT)
if (url.startsWith("data:application/json;base64,")) { if (url.startsWith("data:application/json;charset=utf-8,")) {
writeFile(decodedBytes, "breakout-71-save-$currentDate.json", "application/json")
} else if (url.startsWith("data:video/webm;base64,")) { val urlEncoded = url.substring("data:application/json;charset=utf-8,".length)
writeFile(decodedBytes, "breakout-71-gameplay-capture-$currentDate.webm", "video/webm") val str = URLDecoder.decode(urlEncoded, StandardCharsets.UTF_8.name())
} else { writeFileAndShare(str.toByteArray(), "breakout-71-save-$currentDate.json", "application/json")
Log.w("DL", "unexpected type " + url)
} }
if (url.startsWith("data:video/webm;base64,")) {
val base64Data = url.substring("data:video/webm;base64,".length)
val decodedBytes = android.util.Base64.decode(base64Data, android.util.Base64.DEFAULT)
writeFileAndShare(decodedBytes, "breakout-71-capture-$currentDate.webm", "video/webm")
}
} catch (e: Exception) { } catch (e: Exception) {
Log.e("DL", "Error ${e.message}") Log.e("DL", "Error ${e.message}")
Toast.makeText(this, "Error ${e.message}", Toast.LENGTH_LONG).show() Toast.makeText(this, "Error ${e.message}", Toast.LENGTH_LONG).show()
} }
} }
fun writeFile(decodedBytes:ByteArray,fileName:String, mime:String){ fun writeFileAndShare(bytes:ByteArray, fileName: String, mime: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// android 10
val contentValues = ContentValues().apply {
put(MediaStore.Downloads.DISPLAY_NAME, fileName)
put(MediaStore.Downloads.MIME_TYPE, mime)
put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}
val uri: Uri? = contentResolver.insert(
val jsonData = String(decodedBytes); MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { )
uri?.let {
contentResolver.openOutputStream(it)?.use { outputStream ->
val contentValues = ContentValues().apply { outputStream.write(bytes)
put(MediaStore.Downloads.DISPLAY_NAME, fileName)
put(MediaStore.Downloads.MIME_TYPE,mime )
put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}
val uri: Uri? = contentResolver.insert(
MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues
)
uri?.let {
contentResolver.openOutputStream(it)?.use { outputStream ->
outputStream.write(decodedBytes)
}
}
val shareIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
// Example: content://com.google.android.apps.photos.contentprovider/...
putExtra(Intent.EXTRA_STREAM, uri)
type = mime
}
startActivity(Intent.createChooser(shareIntent, null))
} else {
val dir = getExternalFilesDir(null)
val file = File(dir, fileName)
file.writeText(jsonData)
Toast.makeText(this, "Saved in $dir", Toast.LENGTH_LONG).show()
} }
}
val shareIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
type = mime
}
startActivity(Intent.createChooser(shareIntent, null))
} else {
val file = File(getExternalFilesDir(null), fileName)
file.writeBytes(bytes)
val uri = FileProvider.getUriForFile(
this,
"$packageName.fileprovider", // Adjust if your authority is different
file
)
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
type = mime
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
}
startActivity(Intent.createChooser(shareIntent, null))
}
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE); requestWindowFeature(Window.FEATURE_NO_TITLE);
@ -127,6 +132,7 @@ class MainActivity : android.app.Activity() {
webView.settings.domStorageEnabled = true webView.settings.domStorageEnabled = true
webView.settings.setSupportZoom(false) webView.settings.setSupportZoom(false)
webView.loadUrl("file:///android_asset/index.html?isInWebView=true") webView.loadUrl("file:///android_asset/index.html?isInWebView=true")
val activity = this; val activity = this;
@ -139,6 +145,7 @@ class MainActivity : android.app.Activity() {
return true return true
} }
override fun onShowFileChooser( override fun onShowFileChooser(
webView: WebView?, webView: WebView?,
filePathCallback: ValueCallback<Array<Uri>>?, filePathCallback: ValueCallback<Array<Uri>>?,
@ -154,13 +161,18 @@ class MainActivity : android.app.Activity() {
} catch (e: Exception) { } catch (e: Exception) {
Log.e("DL", "Error ${e.message}") Log.e("DL", "Error ${e.message}")
Toast.makeText(activity, "Error ${e.message}", Toast.LENGTH_LONG).show() Toast.makeText(activity, "Error ${e.message}", Toast.LENGTH_LONG).show()
return false return false
} }
} }
} }
webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength -> webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
Log.d("DL", "url: ${url}")
Log.d("DL", "userAgent: ${userAgent}")
Log.d("DL", "contentDisposition: ${contentDisposition}")
Log.d("DL", "mimetype: ${mimetype}")
Log.d("DL", "contentLength: ${contentLength}")
downloadFile(url) downloadFile(url)
}) })

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path
name="external_files"
path="." />
</paths>

View file

@ -19,6 +19,11 @@ fi
set -e set -e
set -x set -x
# clear output folders first, so that they are empty for failed builds
rm -rf ./build/*
rm -rf ./app/src/main/assets/*
rm -rf ./app/build/outputs/apk/release/*
rm -rf ./app/build/outputs/bundle/release/*
@ -32,17 +37,20 @@ echo "\"$versionCode\"" > src/data/version.json
# Update service worker # Update service worker
sed -i -e "s/VERSION = .*/ VERSION = '$versionCode'/" ./src/PWA/sw-b71.js sed -i -e "s/VERSION = .*/ VERSION = '$versionCode'/" ./src/PWA/sw-b71.js
# remove all exif metadata from pictures, because i think fdroid doesn't like that. odd # remove all exif metadata from pictures, because i think fdroid doesn't like that. odd
find -name '*.jp*g' -o -name '*.png' | xargs exiftool -all= -overwrite_original find -name '*.jp*g' -o -name '*.png' | xargs exiftool -all= -overwrite_original
npx prettier --write src/ npx prettier --write src/
npx jest npx jest
rm -rf build/*
# Actual js app build
npx parcel build src/index.html --dist-dir build npx parcel build src/index.html --dist-dir build
rm -rf ./app/src/main/assets/*
# Add public files to the web version, but not to the apk
cp public/* build cp public/* build
rm -rf ./app/src/main/assets/*
# Add only index.html file to the apk, it should be enough
cp build/index.html ./app/src/main/assets/ cp build/index.html ./app/src/main/assets/

4
checks.js Normal file
View file

@ -0,0 +1,4 @@
// npx nodemon checks.js
const fs= require('fs')
const english = JSON.parse(fs.readFileSync('./src/i18n/en.json'))
console.debug(Object.entries(english).sort((a,b)=>a[1].length-b[1].length).slice(-10,-1).map(([k,v])=>k+'\n'+k.split('').map(c=>'=').join('')+'\n\n'+v).join('\n\n'))

View file

@ -6,6 +6,13 @@ then
exit 1 exit 1
fi fi
if grep -rE "course|atout" src/i18n/fr.json
then
echo "Bad automatic translations"
exit 1
fi
set -e set -e
set -x set -x
@ -13,11 +20,20 @@ versionCode=$(($(date +%s) / 60))
bash ./build.sh $versionCode bash ./build.sh $versionCode
# Create a release commit and tag
# generate signed apk for itch.io
./gradlew assembleRelease
# generate signed bundle for play store
./gradlew bundleRelease
# Create a release commit
git add . git add .
git commit -m "Build $versionCode" git commit -m "Build $versionCode"
git tag -a $versionCode -m $versionCode
git push git push
# Auto tagging created random releases on fdroid, not great.
# git tag -a $versionCode -m $versionCode
# upload to breakout.lecaro.me # upload to breakout.lecaro.me
DOMAIN="breakout.lecaro.me" DOMAIN="breakout.lecaro.me"
@ -29,4 +45,12 @@ rsync -avz --delete --delete-excluded --exclude="*.sh" --exclude="node_modules"
# upload to itch.io , upload the index file directly # upload to itch.io , upload the index file directly
butler push "./build/index.html" renanlecaro/breakout71:latest --userversion $versionCode butler push "./build/index.html" renanlecaro/breakout71:latest --userversion $versionCode
butler push "./build/index.html" renanlecaro/breakout71:offline --userversion $versionCode butler push "./build/index.html" renanlecaro/breakout71:offline --userversion $versionCode
butler push app/build/outputs/apk/release/app-release.apk renanlecaro/breakout71:apk --userversion $versionCode
# archive the output files
FOLDER="/opt/mup-nginx-proxy/config/html/static_sites/archive.lecaro.me/public-files/b71/$versionCode"
ssh staging "mkdir -p $FOLDER"
rsync -vz "./build/index.html" staging:$FOLDER/b71-$versionCode.html
rsync -vz "./app/build/outputs/apk/release/app-release.apk" staging:$FOLDER/b71-$versionCode.apk

4795
dist/index.html vendored

File diff suppressed because one or more lines are too long

View file

@ -9,6 +9,10 @@ app.use(bodyParser.text({
limit:'1MB' limit:'1MB'
})); }));
app.get('/src/data/levels.json', (req, res) => {
res.json(JSON.parse(fs.readFileSync('src/data/levels.json')))
})
app.post('/src/data/levels.json', (req, res) => { app.post('/src/data/levels.json', (req, res) => {
if(req.body?.trim()) { if(req.body?.trim()) {
fs.writeFileSync('src/data/levels.json', req.body) fs.writeFileSync('src/data/levels.json', req.body)

View file

@ -1,44 +1,22 @@
<!-- Break colourful bricks, catch bouncing coins and select powerful upgrades ! -->
<p> <p>
This is a roguelite twist on the original Breakout/Arkanoid formula. This is a roguelike twist on the original Breakout formula:
The goal is to catch as many coins as possible during 7 levels. The goal is to catch as many coins as possible during 7 levels.
Coins appear when you break bricks. Coins appear when you break bricks.
They fly around, bounce and roll, and you need to catch them with your puck. They fly around, bounce and roll, and you need to catch them with your puck.
Your "combo" is the number of coins spawned when a brick breaks, it is displayed on your puck. At the end of the level, you get to pick upgrades.
Your score is displayed in the top right corner of the screen. There are 50+ different upgrades that impact the gameplay in various ways.
</p> Many upgrades will impact your combo, that's the number of coins spawned for each brick broken.
Your "combo" is displayed on your puck. Your score is displayed in the top right corner of the screen.
<p> Oh, and don't miss the ball, you don't have extra lives.
At the end of each level, you get to pick an upgrade from a random selection, vampire-survivor style.
Many upgrades impact your "combo". Upgrades apply to the whole run and can synergize.
For example, "hot start" increases your combo greatly at the start of each level, but makes it tick down rapidly.
If you combine it with "+1 ball", "piercing" and "bricks become bombs", you'll clear levels so fast that the combo
will still be high when the fireworks are over and your puck will be showered by coins.
</p>
<p>What decides how the ball flies away is only the position of the puck hit.
The puck speed and incoming angle have no impact.
You must delete all bricks to progress to the next level, and never drop the ball.
</p>
<p>
After clearing a level, you'll be able to pick upgrades among a small selection presented to you.
They'll apply until the end of the run.
A normal run lasts 7 levels, after which your score is recorded, and you can start again.
</p>
<p>
Each run is different, the levels and upgrades you see will change every time, and new ones get added to the pool
when you progress in the game.
</p> </p>
<p> <p>
The app should work offline and perform well even on low-end devices. The app should work offline and perform well even on low-end devices.
It's very lean and does not take much storage space (Roughly 0.1MB). It's very lean and does not take much storage space (Roughly 0.1MB).
If the app stutters, turn on "fast mode" in the settings to render a simplified view that should be faster. If the app stutters, turn on "fast mode" in the settings.
If the game is too fast, enable "kid mode" in the settings.
</p> </p>
<p> <p>
There's also an easy mode for kids (slower ball) and a color-blind mode (no color related game mechanics). The in-game help will tell you more about how to play. Now go have some fun, and come share your best runs on our Discord.
</p> </p>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 435 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 979 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 843 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 581 KiB

After

Width:  |  Height:  |  Size: 351 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 641 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

After

Width:  |  Height:  |  Size: 334 KiB

Before After
Before After

View file

@ -1 +1 @@
https://www.youtube.com/watch?v=Fmn9320W0Qc https://www.youtube.com/watch?v=FDJdtSbzCTo

View file

@ -8,6 +8,7 @@ espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.6.1" lifecycleRuntimeKtx = "2.6.1"
activityCompose = "1.7.0" activityCompose = "1.7.0"
composeBom = "2023.08.00" composeBom = "2023.08.00"
core = "1.13.0"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@ -24,6 +25,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-core = { group = "androidx.core", name = "core", version.ref = "core" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }

View file

@ -0,0 +1,4 @@
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

View file

@ -3,7 +3,7 @@
"version": "1.0.0", "version": "1.0.0",
"description": "A roguelite take on the breakout genre, optimised for short runs and replayability.", "description": "A roguelite take on the breakout genre, optimised for short runs and replayability.",
"scripts": { "scripts": {
"start": "rm -rf .parcel-cache && run-p dev:*", "start": "bash start.sh",
"dev:game-fe": "parcel src/*.html --lazy --no-hmr", "dev:game-fe": "parcel src/*.html --lazy --no-hmr",
"dev:editor-be": "nodemon editserver.js --watch editserver.js", "dev:editor-be": "nodemon editserver.js --watch editserver.js",
"test": "jest --watch" "test": "jest --watch"

View file

@ -16,6 +16,6 @@
], ],
"start_url": "/index.html?isPWA=true", "start_url": "/index.html?isPWA=true",
"display": "fullscreen", "display": "fullscreen",
"theme_color": "#5DA3EA", "theme_color": "#000000",
"background_color": "#ffffff" "background_color": "#ffffff"
} }

View file

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

25
src/addToTotalScore.ts Normal file
View file

@ -0,0 +1,25 @@
import { GameState } from "./types";
import { icons, upgrades } from "./loadGameData";
import { schedulGameSound } from "./gameStateMutators";
import { toast } from "./toast";
import { t } from "./i18n/i18n";
import { getTotalScore, setSettingValue } from "./settings";
export function addToTotalScore(gameState: GameState, points: number) {
if (gameState.creative) return;
const pastScore = getTotalScore();
const newScore = pastScore + points;
setSettingValue("breakout_71_total_score", newScore);
// Check unlocked upgrades
upgrades.forEach((u) => {
if (u.threshold > pastScore && u.threshold <= newScore) {
schedulGameSound(gameState, "colorChange", 0, 1);
toast(
icons["icon:" + u.id] +
"<strong>" +
t("gameOver.unlocked_perk") +
"</strong>",
);
}
});
}

View file

@ -25,28 +25,33 @@ closeModaleButton.title = t("play.close_modale_window_tooltip");
let lastClickedItemIndex = -1; let lastClickedItemIndex = -1;
export function requiredAsyncAlert<t>(p: {
title?: string;
content: (string | AsyncAlertAction<t>)[];
className?: string;
}): Promise<t> {
return asyncAlert({ ...p, allowClose: false });
}
export async function asyncAlert<t>({ export async function asyncAlert<t>({
title, title,
text, content = [],
actions,
allowClose = true, allowClose = true,
textAfterButtons = "", className = "",
actionsAsGrid = false,
}: { }: {
title?: string; title?: string;
text?: string; content: (string | AsyncAlertAction<t>)[];
actions?: AsyncAlertAction<t>[];
textAfterButtons?: string;
allowClose?: boolean; allowClose?: boolean;
actionsAsGrid?: boolean; className?: string;
}): Promise<t | void> { }): Promise<t | void> {
updateAlertsOpen(+1); updateAlertsOpen(+1);
return new Promise((resolve) => { return new Promise((resolve) => {
popupWrap.className = actionsAsGrid ? " actionsAsGrid" : ""; popupWrap.className = className;
closeModaleButton.style.display = allowClose ? "" : "none"; closeModaleButton.style.display = allowClose ? "" : "none";
const popup = document.createElement("div"); const popup = document.createElement("div");
let closed = false; let closed = false;
function closeWithResult(value: t | undefined) { function closeWithResult(value: t | undefined) {
if (closed) return; if (closed) return;
closed = true; closed = true;
@ -69,58 +74,81 @@ export async function asyncAlert<t>({
} }
if (title) { if (title) {
const p = document.createElement("h2"); const h1 = document.createElement("h1");
p.innerHTML = title; h1.innerHTML = title;
popup.appendChild(p); popup.appendChild(h1);
} }
if (text) { content
const p = document.createElement("div");
p.innerHTML = text;
popup.appendChild(p);
}
const buttons = document.createElement("section");
buttons.className = "actions";
popup.appendChild(buttons);
actions
?.filter((i) => i) ?.filter((i) => i)
.forEach( .forEach((entry, index) => {
({ text, value, help, disabled, className = "", icon = "" }, index) => { if (!entry) return;
const button = document.createElement("button"); if (typeof entry == "string") {
const p = document.createElement("div");
p.innerHTML = entry;
popup.appendChild(p);
return;
}
button.innerHTML = ` let addto: HTMLElement;
if (popup.lastChild?.nodeName == "SECTION") {
addto = popup.lastChild as HTMLElement;
} else {
addto = document.createElement("section");
addto.className = "actions";
popup.appendChild(addto);
}
const {
text,
value,
help,
disabled,
className = "",
icon = "",
tooltip,
} = entry;
const button = document.createElement("button");
button.innerHTML = `
${icon} ${icon}
<div> <div>
<strong>${text}</strong> <strong>${text}</strong>
<em>${help || ""}</em> <em>${help || ""}</em>
</div>`; </div>`;
if (disabled) { if (tooltip) {
button.setAttribute("disabled", "disabled"); button.setAttribute("data-tooltip", tooltip);
} else { }
button.addEventListener("click", (e) => { if (disabled) {
e.preventDefault(); button.setAttribute("disabled", "disabled");
e.stopPropagation(); } else {
closeWithResult(value); button.addEventListener("click", (e) => {
// Focus "same" button if it's still there e.preventDefault();
lastClickedItemIndex = index; e.stopPropagation();
}); closeWithResult(value);
} // Focus "same" button if it's still there
lastClickedItemIndex = index;
});
}
button.className = button.className =
className + (lastClickedItemIndex === index ? " needs-focus" : ""); className + (lastClickedItemIndex === index ? " needs-focus" : "");
buttons.appendChild(button);
},
);
if (textAfterButtons) {
const p = document.createElement("div");
p.className = "textAfterButtons";
p.innerHTML = textAfterButtons;
popup.appendChild(p);
}
addto.appendChild(button);
});
popup.addEventListener(
"click",
(e) => {
const target = e.target as HTMLElement;
if (target.getAttribute("data-resolve-to")) {
closeWithResult(target.getAttribute("data-resolve-to") as t);
}
},
true,
);
popupWrap.appendChild(popup); popupWrap.appendChild(popup);
( (
popupWrap.querySelector( popupWrap.querySelector(

122
src/creative.ts Normal file
View file

@ -0,0 +1,122 @@
import { GameState, Level, PerkId, RawLevel, Upgrade } from "./types";
import { allLevels, icons, transformRawLevel, upgrades } from "./loadGameData";
import { t } from "./i18n/i18n";
import { getSettingValue, getTotalScore, setSettingValue } from "./settings";
import {
confirmRestart,
creativeModeThreshold,
gameState,
restart,
} from "./game";
import { asyncAlert, requiredAsyncAlert } from "./asyncAlert";
import {
describeLevel,
highScoreText,
reasonLevelIsLocked,
sumOfValues,
} from "./game_utils";
import { getHistory } from "./gameOver";
import { noCreative } from "./upgrades";
import { levelIconHTML } from "./levelIcon";
export function creativeMode(gameState: GameState) {
return {
icon: icons["icon:creative"],
text: t("lab.menu_entry"),
help:
(getTotalScore() < creativeModeThreshold &&
t("lab.unlocks_at", { score: creativeModeThreshold })) ||
t("lab.help"),
disabled: getTotalScore() < creativeModeThreshold,
async value() {
openCreativeModePerksPicker();
},
};
}
export async function openCreativeModePerksPicker() {
let creativeModePerks: Partial<{ [id in PerkId]: number }> = getSettingValue(
"creativeModePerks",
{},
),
choice: Upgrade | Level | "reset" | void;
const customLevels = (getSettingValue("custom_levels", []) as RawLevel[]).map(
transformRawLevel,
);
while (
(choice = await asyncAlert<Upgrade | Level | "reset">({
title: t("lab.menu_entry"),
className: "actionsAsGrid",
content: [
t("lab.instructions"),
{
value: "reset",
text: t("lab.reset"),
disabled: !sumOfValues(creativeModePerks),
},
...upgrades
.filter((u) => !noCreative.includes(u.id))
.map((u) => ({
icon: u.icon,
text: u.name,
help:
(creativeModePerks[u.id] || 0) +
"/" +
(u.max + (creativeModePerks.limitless || 0)),
value: u,
className: creativeModePerks[u.id]
? "sandbox highlight"
: "sandbox ",
tooltip: u.help(creativeModePerks[u.id] || 1),
})),
t("lab.select_level"),
...allLevels.map((l, li) => {
const problem =
reasonLevelIsLocked(li, getHistory(), true)?.text || "";
return {
icon: icons[l.name],
text: l.name,
value: l,
disabled: !!problem,
tooltip: problem || describeLevel(l),
className:
getSettingValue("creativeModeLevel", "") === l.name
? "highlight"
: "",
};
}),
...customLevels.map((l) => ({
icon: levelIconHTML(l.bricks, l.size, l.color),
text: l.name,
value: l,
disabled: !l.bricks.filter((b) => b !== "_").length,
tooltip: describeLevel(l),
})),
],
}))
) {
if (choice === "reset") {
upgrades.forEach((u) => {
creativeModePerks[u.id] = 0;
});
} else if ("bricks" in choice) {
setSettingValue("creativeModePerks", creativeModePerks);
setSettingValue("creativeModeLevel", choice.name);
if (await confirmRestart(gameState)) {
restart({
perks: creativeModePerks,
level: choice,
isCreativeRun: true,
});
}
return;
} else if (choice) {
creativeModePerks[choice.id] =
((creativeModePerks[choice.id] || 0) + 1) %
(choice.max + 1 + (creativeModePerks.limitless || 0));
} else {
return;
}
}
}

View file

@ -13,15 +13,8 @@
"<svg xmlns='http://www.w3.org/2000/svg' width='40' height='59.428'><path d='M0 70.975V47.881m20-1.692L8.535 52.808v13.239L20 72.667l11.465-6.62V52.808zm0-32.95l11.465-6.62V-6.619L20-13.24 8.535-6.619V6.619L20 13.24m8.535 4.927v13.238L40 38.024l11.465-6.62V18.166L40 11.546zM20 36.333L0 47.88m0 0v23.094m0 0l20 11.548 20-11.548V47.88m0 0L20 36.333m0 0l20 11.549M0 11.547l-11.465 6.619v13.239L0 38.025l11.465-6.62v-13.24L0 11.548v-23.094l20-11.547 20 11.547v23.094M20 36.333V13.24' stroke-width='1' stroke='white' fill='none'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='40' height='59.428'><path d='M0 70.975V47.881m20-1.692L8.535 52.808v13.239L20 72.667l11.465-6.62V52.808zm0-32.95l11.465-6.62V-6.619L20-13.24 8.535-6.619V6.619L20 13.24m8.535 4.927v13.238L40 38.024l11.465-6.62V18.166L40 11.546zM20 36.333L0 47.88m0 0v23.094m0 0l20 11.548 20-11.548V47.88m0 0L20 36.333m0 0l20 11.549M0 11.547l-11.465 6.619v13.239L0 38.025l11.465-6.62v-13.24L0 11.548v-23.094l20-11.547 20 11.547v23.094M20 36.333V13.24' stroke-width='1' stroke='white' fill='none'/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='70' height='8'><path d='M-.02 22c8.373 0 11.938-4.695 16.32-9.662C20.785 7.258 25.728 2 35 2c9.272 0 14.215 5.258 18.7 10.338C58.082 17.305 61.647 22 70.02 22M-.02 14.002C8.353 14 11.918 9.306 16.3 4.339 20.785-.742 25.728-6 35-6 44.272-6 49.215-.742 53.7 4.339c4.382 4.967 7.947 9.661 16.32 9.664M70 6.004c-8.373-.001-11.918-4.698-16.3-9.665C49.215-8.742 44.272-14 35-14c-9.272 0-14.215 5.258-18.7 10.339C11.918 1.306 8.353 6-.02 6.002' stroke-width='1' stroke='white' fill='none'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='70' height='8'><path d='M-.02 22c8.373 0 11.938-4.695 16.32-9.662C20.785 7.258 25.728 2 35 2c9.272 0 14.215 5.258 18.7 10.338C58.082 17.305 61.647 22 70.02 22M-.02 14.002C8.353 14 11.918 9.306 16.3 4.339 20.785-.742 25.728-6 35-6 44.272-6 49.215-.742 53.7 4.339c4.382 4.967 7.947 9.661 16.32 9.664M70 6.004c-8.373-.001-11.918-4.698-16.3-9.665C49.215-8.742 44.272-14 35-14c-9.272 0-14.215 5.258-18.7 10.339C11.918 1.306 8.353 6-.02 6.002' stroke-width='1' stroke='white' fill='none'/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='45' height='51.96'><path d='M52.48 44.47a15 15 0 01-14.96 0 15 15 0 00-7.48 12.96M7.48 44.42a15 15 0 01-14.96 0M15 57.44c0-5.35-2.9-10.35-7.52-13.02a15 15 0 017.48-12.97M7.48 18.5a14.97 14.97 0 01-14.98-.03m15.02-.03A15 15 0 0115 5.47a15 15 0 00-4.4-10.62m23.8.05A15 15 0 0030 5.53a15 15 0 017.48 12.96 14.9 14.9 0 0015.02-.03m-22.5 13a15.13 15.13 0 017.52 13.01m-7.56-39a15 15 0 01-14.96 0M7.48 18.5a15 15 0 017.48 12.96 15 15 0 0015.04 0 15 15 0 017.48-12.96' stroke-width='1' stroke='white' fill='none'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='45' height='51.96'><path d='M52.48 44.47a15 15 0 01-14.96 0 15 15 0 00-7.48 12.96M7.48 44.42a15 15 0 01-14.96 0M15 57.44c0-5.35-2.9-10.35-7.52-13.02a15 15 0 017.48-12.97M7.48 18.5a14.97 14.97 0 01-14.98-.03m15.02-.03A15 15 0 0115 5.47a15 15 0 00-4.4-10.62m23.8.05A15 15 0 0030 5.53a15 15 0 017.48 12.96 14.9 14.9 0 0015.02-.03m-22.5 13a15.13 15.13 0 017.52 13.01m-7.56-39a15 15 0 01-14.96 0M7.48 18.5a15 15 0 017.48 12.96 15 15 0 0015.04 0 15 15 0 017.48-12.96' stroke-width='1' stroke='white' fill='none'/></svg>",
"<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"45.491\" height=\"44.293\" viewBox=\"0 0 12.036 11.719\"><path d=\"M-.036-.081h12.157V11.82H-.036z\" style=\"fill:#000;stroke:none;stroke-width:.112189;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"M.051.134h3.622v3.615h3.981V7.55h4.13v4.006\" style=\"fill:none;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='72' height='43.875'><path d='m14.296 7.185 7.236 7.234L36.002-.048l14.47 14.47 7.236-7.233L36-14.518Zm-7.275 7.251 7.258 7.26 7.259-7.26-7.258-7.259zm-28.798 14.76 7.237 7.237L-.023 21.916 14.452 36.39l7.26-7.258L0 7.42Zm50.746 7.193-7.258-7.258-7.26 7.258 7.26 7.26zm57.568.046 7.24-7.238L72 7.42 50.282 29.137l7.259 7.259L72.02 21.918Zm-28.993-.042-7.26-7.258-7.258 7.258 7.26 7.26zm.233 14.742L36 29.358 14.223 51.135l7.258 7.258L36 43.875l14.518 14.517ZM50.453 14.45l7.259 7.26 7.258-7.26-7.258-7.257z' stroke-width='1' stroke='white' fill='none'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='72' height='43.875'><path d='m14.296 7.185 7.236 7.234L36.002-.048l14.47 14.47 7.236-7.233L36-14.518Zm-7.275 7.251 7.258 7.26 7.259-7.26-7.258-7.259zm-28.798 14.76 7.237 7.237L-.023 21.916 14.452 36.39l7.26-7.258L0 7.42Zm50.746 7.193-7.258-7.258-7.26 7.258 7.26 7.26zm57.568.046 7.24-7.238L72 7.42 50.282 29.137l7.259 7.259L72.02 21.918Zm-28.993-.042-7.26-7.258-7.258 7.258 7.26 7.26zm.233 14.742L36 29.358 14.223 51.135l7.258 7.258L36 43.875l14.518 14.517ZM50.453 14.45l7.259 7.26 7.258-7.26-7.258-7.257z' stroke-width='1' stroke='white' fill='none'/></svg>",
"<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"88.718\" height=\"59.048\" viewBox=\"0 0 23.473 15.623\"><path d=\"M-.036-.081h23.591v15.862H-.036z\" style=\"fill:#000;stroke:none;stroke-width:.180422;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"M-1.054 7.864h26.127M-1.185 15.474h26.128M11.545 7.765V-2.431M4.444 8.028v7.389M17.637 8.06v7.39\" style=\"fill:#fff;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/></svg>",
"<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"45.491\" height=\"44.293\" viewBox=\"0 0 12.036 11.719\"><path d=\"M-.036-.081h12.157V11.82H-.036z\" style=\"fill:#000;stroke:none;stroke-width:.112189;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"M5.997 9.079c1.941-1.892 5.045-5.609 3.495-6.38-1.43-.71-2.665.599-3.317 1.603-.521-.96-1.47-2.616-2.839-1.655-1.898 1.334.838 5.026 2.661 6.432\" style=\"fill:none;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M27.26 5.415c-.55 0-.9.55-.65 1l2.45 4.75c.2.5.85.5 1.15.1l3.15-4.5c.3-.4 0-1.05-.55-1.1zM10.689 8.068c-.406-.051-.822.31-.778.748l.5 5.3c.05.5.6.8 1.05.5l4.55-3.05c.45-.3.4-.95-.05-1.15l-5.1-2.3a.605.605 0 0 0-.172-.048zM2.406 24.584a.635.635 0 0 0-.345.081l-4.75 2.4c-.45.2-.5.85-.1 1.15l4.45 3.15c.4.3 1 0 1.1-.5l.3-5.55c0-.412-.31-.712-.655-.73zm40 0a.635.635 0 0 0-.345.081l-4.75 2.4c-.45.2-.5.85-.1 1.15l4.45 3.15c.4.3 1 0 1.1-.5l.3-5.55c0-.412-.31-.712-.655-.73zm-22.17 3.108a.744.744 0 0 0-.675.723l.4 5.55c.05.5.6.8 1.05.5l4.45-2.95c.45-.25.4-.9-.05-1.15l-4.8-2.6a.702.702 0 0 0-.376-.073z' stroke='none' fill='white'/></svg>",
"<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"45.701\" height=\"36.148\" viewBox=\"0 0 12.092 9.564\"><path d=\"M-.036-.081h12.157V11.82H-.036z\" style=\"fill:#000;stroke:none;stroke-width:.112189;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\" transform=\"translate(0 -.76)\"/><path d=\"M.049 2.794c2.088-1.328 4.06-1.436 5.864-.036 1.804 1.401 5.21.78 6.074.013M.157 5.687C2.245 4.359 4.217 4.25 6.02 5.65c1.803 1.401 5.21.78 6.074.013M.137 8.792C2.225 7.465 4.197 7.356 6 8.757s5.21.779 6.074.013\" style=\"fill:none;stroke:#fff;stroke-width:.307999;stroke-linecap:square;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill;stop-color:#000\" transform=\"translate(0 -.76)\"/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M45.69 13.342c-1.677.945-3.557 1.6-5.48 1.588-1.922-.012-3.795-.691-5.462-1.653-1.668-.962-3.156-2.202-4.637-3.435-1.48-1.232-2.97-2.47-4.641-3.427-1.67-.957-3.547-1.628-5.47-1.628-1.923 0-3.8.67-5.47 1.628-1.67.956-3.161 2.195-4.641 3.427-1.48 1.233-2.97 2.473-4.637 3.435-1.667.962-3.54 1.641-5.463 1.653-1.922.012-3.802-.643-5.478-1.588v13.316c1.676-.945 3.556-1.6 5.478-1.588 1.923.012 3.796.691 5.463 1.653 1.668.962 3.156 2.202 4.637 3.435 1.48 1.232 2.97 2.47 4.641 3.427 1.67.957 3.547 1.628 5.47 1.628 1.923 0 3.8-.67 5.47-1.628 1.67-.956 3.161-2.195 4.641-3.427 1.48-1.233 2.97-2.473 4.637-3.435 1.667-.962 3.54-1.641 5.463-1.653 1.922-.012 3.802.643 5.478 1.588z' stroke-width='1' stroke='white' fill='none'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M45.69 13.342c-1.677.945-3.557 1.6-5.48 1.588-1.922-.012-3.795-.691-5.462-1.653-1.668-.962-3.156-2.202-4.637-3.435-1.48-1.232-2.97-2.47-4.641-3.427-1.67-.957-3.547-1.628-5.47-1.628-1.923 0-3.8.67-5.47 1.628-1.67.956-3.161 2.195-4.641 3.427-1.48 1.233-2.97 2.473-4.637 3.435-1.667.962-3.54 1.641-5.463 1.653-1.922.012-3.802-.643-5.478-1.588v13.316c1.676-.945 3.556-1.6 5.478-1.588 1.923.012 3.796.691 5.463 1.653 1.668.962 3.156 2.202 4.637 3.435 1.48 1.232 2.97 2.47 4.641 3.427 1.67.957 3.547 1.628 5.47 1.628 1.923 0 3.8-.67 5.47-1.628 1.67-.956 3.161-2.195 4.641-3.427 1.48-1.233 2.97-2.473 4.637-3.435 1.667-.962 3.54-1.641 5.463-1.653 1.922-.012 3.802.643 5.478 1.588z' stroke-width='1' stroke='white' fill='none'/></svg>",
"<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"45.491\" height=\"44.293\" viewBox=\"0 0 12.036 11.719\"><path d=\"M-.036-.081h12.157V11.82H-.036z\" style=\"fill:#000;stroke:none;stroke-width:.112189;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"M.058.132h6.413V6.34H2.006v4.024h8.68v-8.96H8.303v7.292H3.979\" style=\"fill:none;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"M3.73 3.095H.034v8.58\" style=\"fill:none;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/></svg>",
"<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"88.718\" height=\"59.048\" viewBox=\"0 0 23.473 15.623\"><path d=\"M-.036-.081h23.591v15.862H-.036z\" style=\"fill:#000;stroke:none;stroke-width:.180422;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"m23.463 8.674.044-8.608L11.47 6.941-.06.166\" style=\"fill:none;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/><path d=\"M11.472 6.937v8.574l11.943-6.896M11.507 15.438-.024 8.78\" style=\"fill:none;stroke:#fff;stroke-width:.307996;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;-inkscape-stroke:none;paint-order:markers stroke fill;stop-color:#000\"/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='20' height='40'><path d='M0 0v5.436c.385-.146.767.123 1.163.82.948 1.674 2.214 2.996 3.46 4.294C6.977 13.002 9.2 15.318 9.2 19.995c0 4.679-2.223 6.994-4.577 9.447-1.246 1.299-2.512 2.621-3.46 4.295-.396.698-.777.966-1.163.82V40h1.198v-.005c0-4.678 2.224-6.992 4.579-9.445 1.245-1.298 2.51-2.62 3.459-4.295.654-1.154 1.273-1.154 1.926 0 .95 1.673 2.214 2.997 3.46 4.295 2.353 2.452 4.578 4.767 4.578 9.445V40h.8v-5.442c-.252-.095-.504-.365-.762-.82-.95-1.675-2.214-2.998-3.46-4.296-2.353-2.452-4.576-4.768-4.576-9.447-.001-4.678 2.221-6.993 4.575-9.445 1.246-1.298 2.512-2.62 3.46-4.294.259-.456.511-.725.763-.82V0h-.8c0 4.676-2.224 6.991-4.577 9.442-1.246 1.298-2.512 2.621-3.46 4.296-.653 1.153-1.273 1.153-1.926 0-.948-1.675-2.214-2.998-3.46-4.296C3.424 6.991 1.2 4.676 1.2 0Z' stroke='none' fill='white'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='20' height='40'><path d='M0 0v5.436c.385-.146.767.123 1.163.82.948 1.674 2.214 2.996 3.46 4.294C6.977 13.002 9.2 15.318 9.2 19.995c0 4.679-2.223 6.994-4.577 9.447-1.246 1.299-2.512 2.621-3.46 4.295-.396.698-.777.966-1.163.82V40h1.198v-.005c0-4.678 2.224-6.992 4.579-9.445 1.245-1.298 2.51-2.62 3.459-4.295.654-1.154 1.273-1.154 1.926 0 .95 1.673 2.214 2.997 3.46 4.295 2.353 2.452 4.578 4.767 4.578 9.445V40h.8v-5.442c-.252-.095-.504-.365-.762-.82-.95-1.675-2.214-2.998-3.46-4.296-2.353-2.452-4.576-4.768-4.576-9.447-.001-4.678 2.221-6.993 4.575-9.445 1.246-1.298 2.512-2.62 3.46-4.294.259-.456.511-.725.763-.82V0h-.8c0 4.676-2.224 6.991-4.577 9.442-1.246 1.298-2.512 2.621-3.46 4.296-.653 1.153-1.273 1.153-1.926 0-.948-1.675-2.214-2.998-3.46-4.296C3.424 6.991 1.2 4.676 1.2 0Z' stroke='none' fill='white'/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='50' height='33.333'><path d='M25 .806v2.79h.8V.806Zm0 4.465v2.791h.8v-2.79Zm-2.043 3.902-2.32 1.55.444.665 2.32-1.55-.443-.665zm4.885 0-.444.665 2.32 1.55.445-.665zM-.4 10.61v2.79h.8v-2.79zm50 0v2.79h.8v-2.79zm-30.356 1.042-2.32 1.55.443.666 2.322-1.55-.444-.666zm12.311 0-.444.665 2.32 1.55.445-.664zm3.783 2.566-.444.666 2.321 1.55.444-.666zm-19.852.025-2.32 1.55.444.665 2.32-1.55zm-15.886.77v2.79h.8v-2.79Zm50 0v2.79h.8v-2.79Zm-50 4.465v2.79h.8v-2.79h-.8Zm50 0v2.79h.8v-2.79h-.8zM2.442 23.379l-.444.665 2.32 1.55.445-.665zm45.115 0-2.32 1.55.443.666 2.322-1.55-.444-.666zM6.155 25.86l-.444.665 2.32 1.55.445-.665zm37.69 0-2.322 1.55.444.665 2.321-1.55-.444-.666zM9.937 28.424l-.444.665 2.32 1.55.445-.665-2.321-1.55zm30.11.003-2.321 1.55.444.666 2.321-1.55zM25 29.737v2.79h.8v-2.79z' stroke='none' fill='white'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='33.333'><path d='M25 .806v2.79h.8V.806Zm0 4.465v2.791h.8v-2.79Zm-2.043 3.902-2.32 1.55.444.665 2.32-1.55-.443-.665zm4.885 0-.444.665 2.32 1.55.445-.665zM-.4 10.61v2.79h.8v-2.79zm50 0v2.79h.8v-2.79zm-30.356 1.042-2.32 1.55.443.666 2.322-1.55-.444-.666zm12.311 0-.444.665 2.32 1.55.445-.664zm3.783 2.566-.444.666 2.321 1.55.444-.666zm-19.852.025-2.32 1.55.444.665 2.32-1.55zm-15.886.77v2.79h.8v-2.79Zm50 0v2.79h.8v-2.79Zm-50 4.465v2.79h.8v-2.79h-.8Zm50 0v2.79h.8v-2.79h-.8zM2.442 23.379l-.444.665 2.32 1.55.445-.665zm45.115 0-2.32 1.55.443.666 2.322-1.55-.444-.666zM6.155 25.86l-.444.665 2.32 1.55.445-.665zm37.69 0-2.322 1.55.444.665 2.321-1.55-.444-.666zM9.937 28.424l-.444.665 2.32 1.55.445-.665-2.321-1.55zm30.11.003-2.321 1.55.444.666 2.321-1.55zM25 29.737v2.79h.8v-2.79z' stroke='none' fill='white'/></svg>",
"<svg xmlns='http://www.w3.org/2000/svg' width='69.282' height='40'><path d='M34.641-20v80m34.64-40L0-20m69.282 80L0 20m69.282 0L0 60m69.282-80L0 20m69.282-40v80M0-20v80M34.64 40l11.547-20m11.547 20l11.547 20M34.641 40h23.094m11.547-20L57.735 40M46.188 20L34.641 40l11.547 20h23.094L80.83 40 69.282 20H46.188zM34.641 40l11.547-20m11.547 20l11.547 20M34.641 40h23.094m11.547-20L57.735 40M46.188 20L34.641 40l11.547 20h23.094L80.83 40 69.282 20H46.188zM34.641 0l11.547-20M57.735 0l11.547 20M34.642 0h23.093m11.547-20L57.735 0M46.188-20L34.641 0l11.547 20h23.094L80.83 0 69.282-20H46.188zM34.641 40L23.094 20M11.547 40L0 60m34.64-20H11.548M0 20l11.547 20m11.547-20l11.547 20-11.547 20H0l-11.547-20L0 20h23.094zM34.641 0L23.094-20M11.547 0L0 20M34.64 0H11.548M0-20L11.547 0m11.547-20L34.641 0 23.094 20H0L-11.547 0 0-20h23.094z' stroke-width='1' stroke='white' fill='none'/></svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='69.282' height='40'><path d='M34.641-20v80m34.64-40L0-20m69.282 80L0 20m69.282 0L0 60m69.282-80L0 20m69.282-40v80M0-20v80M34.64 40l11.547-20m11.547 20l11.547 20M34.641 40h23.094m11.547-20L57.735 40M46.188 20L34.641 40l11.547 20h23.094L80.83 40 69.282 20H46.188zM34.641 40l11.547-20m11.547 20l11.547 20M34.641 40h23.094m11.547-20L57.735 40M46.188 20L34.641 40l11.547 20h23.094L80.83 40 69.282 20H46.188zM34.641 0l11.547-20M57.735 0l11.547 20M34.642 0h23.093m11.547-20L57.735 0M46.188-20L34.641 0l11.547 20h23.094L80.83 0 69.282-20H46.188zM34.641 40L23.094 20M11.547 40L0 60m34.64-20H11.548M0 20l11.547 20m11.547-20l11.547 20-11.547 20H0l-11.547-20L0 20h23.094zM34.641 0L23.094-20M11.547 0L0 20M34.64 0H11.548M0-20L11.547 0m11.547-20L34.641 0 23.094 20H0L-11.547 0 0-20h23.094z' stroke-width='1' stroke='white' fill='none'/></svg>",

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,9 @@
{ {
"_": "", "_": "",
"B": "black", "B": "black",
"W": "white", "W": "#FFFFFF",
"g": "#231f20", "g": "#231f20",
"y": "#ffd300", "y": "#FFD300",
"b": "#6262EA", "b": "#6262EA",
"t": "#5DA3EA", "t": "#5DA3EA",
"s": "#E67070", "s": "#E67070",

View file

@ -1 +1 @@
"29045711" "29085904"

View file

@ -8,6 +8,8 @@
box-sizing: border-box; box-sizing: border-box;
} }
@purple: #6262ea;
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
@ -31,6 +33,10 @@ body {
width: 100vw; width: 100vw;
} }
canvas:not(#game) {
display: none;
}
#score, #score,
#menu { #menu {
position: absolute; position: absolute;
@ -45,57 +51,65 @@ body {
min-width: 40px; min-width: 40px;
min-height: 40px; min-height: 40px;
line-height: 20px; line-height: 20px;
max-width: calc(100vw - 80px);
overflow: hidden;
&:hover, &:hover,
&:focus { &:focus {
background: rgba(0, 0, 0, 0.3); background: rgba(0, 0, 0, 0.3);
cursor: pointer; cursor: pointer;
} }
text-shadow: 0 0 4px rgba(0, 0, 0, 0.8);
text-shadow: 0 0 4px var(--level-background);
} }
#score { #score {
right: 0; right: 0;
color: white; color: white;
transition: color 0.3s; transition: color 0.3s;
&.active {
&.active .score {
color: gold; color: gold;
transition: color 0.01s; transition: color 0.01s;
} }
&.computer_controlled {
pointer-events: none;
}
span {
color: rgba(255, 255, 255, 0.8);
&.great {
color: lightgreen;
}
&.good {
color: white;
}
&.bad {
color: white;
}
}
} }
#menu { #menu {
left: 0; left: 0;
} }
#FPSDisplay {
z-index: 1;
white-space: nowrap;
padding: 10px;
line-height: 20px;
pointer-events: none;
user-select: none;
opacity: 0.8;
color: white;
padding: 0;
position: fixed;
bottom: 0;
left: 0;
transform-origin: top left;
transform: rotate(-90deg);
}
body.has-alert-open { body.has-alert-open {
height: auto; height: auto;
overflow: visible; overflow: visible;
} }
body:not(.has-alert-open) #popup { body:not(.has-alert-open) #popup {
display: none; display: none;
} }
#popup { #popup {
&::before { &::before {
z-index: 10; z-index: 4;
content: ""; content: "";
display: block; display: block;
position: fixed; position: fixed;
@ -107,7 +121,7 @@ body:not(.has-alert-open) #popup {
overflow: auto; overflow: auto;
& > div { & > div {
z-index: 11; z-index: 5;
position: relative; position: relative;
margin: auto; margin: auto;
padding: 20px 10px; padding: 20px 10px;
@ -116,23 +130,17 @@ body:not(.has-alert-open) #popup {
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
width: 100%; width: 100%;
max-width: 450px; max-width: 500px;
& > * { & > * {
padding: 0; padding: 0;
margin: 0; margin: 0 0 20px 0;
}
& > h2,
& > p {
margin-bottom: 20px;
} }
& > section { & > section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
margin-top: 20px;
button { button {
font: inherit; font: inherit;
@ -156,7 +164,8 @@ body:not(.has-alert-open) #popup {
&[disabled] { &[disabled] {
opacity: 0.5; opacity: 0.5;
filter: saturate(0); filter: saturate(0);
pointer-events: none; //pointer-events: none;
cursor: not-allowed;
} }
& > div { & > div {
@ -176,6 +185,10 @@ body:not(.has-alert-open) #popup {
filter: saturate(0); filter: saturate(0);
} }
} }
&[disabled] {
opacity: 0.2;
}
} }
} }
} }
@ -184,6 +197,16 @@ body:not(.has-alert-open) #popup {
&.actionsAsGrid > div { &.actionsAsGrid > div {
max-width: none; max-width: none;
& > div,
& > p,
& > h1,
& > h2 {
width: 100%;
max-width: 550px;
margin-left: auto;
margin-right: auto;
}
section { section {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
@ -192,7 +215,7 @@ body:not(.has-alert-open) #popup {
button#close-modale { button#close-modale {
color: white; color: white;
position: absolute; position: fixed;
top: 0; top: 0;
right: 0; right: 0;
width: 60px; width: 60px;
@ -201,7 +224,7 @@ body:not(.has-alert-open) #popup {
border: none; border: none;
cursor: pointer; cursor: pointer;
overflow: hidden; overflow: hidden;
z-index: 12; z-index: 6;
&:before { &:before {
content: "+"; content: "+";
@ -231,43 +254,17 @@ body:not(.has-alert-open) #popup {
color: white; color: white;
} }
} }
}
/*Unlocks progress bar*/ @media (min-width: 1400px) {
.progress { &.settings {
display: block; &:before {
padding: 5px 10px; opacity: 0;
background: #1c1c2f; }
color: #fff;
box-shadow: inset 3px 3px 5px rgba(0, 0, 0, 0.5);
border-radius: 5px;
text-align: center;
position: relative;
overflow: hidden;
& > .progress_bar_part { & > div {
display: block; margin-right: 0;
background: #4049ca; max-width: 400px;
box-shadow: inset 3px 3px 5px rgba(0, 0, 0, 0.5); }
left: 0;
position: absolute;
right: 0;
top: 0;
bottom: 0;
transform-origin: top left;
animation: grow 1s both ease-out;
z-index: 1;
}
& > span {
display: block;
position: relative;
z-index: 2;
}
@keyframes grow {
0% {
transform: scale(0, 1);
} }
} }
} }
@ -337,6 +334,7 @@ body:not(.has-alert-open) #popup {
} }
} }
} }
& > span:not(:hover):not(.active) > span > span { & > span:not(:hover):not(.active) > span > span {
opacity: 0; opacity: 0;
} }
@ -350,3 +348,240 @@ h2.histogram-title {
h2.histogram-title strong { h2.histogram-title strong {
color: #4049ca; color: #4049ca;
} }
.red-icon {
background: red;
img {
filter: saturate(0);
mix-blend-mode: luminosity;
}
}
.upgrade {
display: flex;
gap: 2px;
margin: 0 0 10px 0;
img {
width: 32px;
height: 32px;
}
p {
flex-grow: 1;
color: rgba(255, 255, 255, 0.6);
margin: 0 20px;
}
&.used p strong {
color: white;
}
& > span {
flex-grow: 0;
flex-shrink: 0;
width: 5px;
display: inline-block;
height: 32px;
align-self: center;
&.used {
background: #fff;
}
&.free {
background: #fff;
opacity: 0.25;
}
&.banned {
background: red;
}
}
&.used {
opacity: 1;
}
&.free {
opacity: 0.8;
}
&.banned {
opacity: 0.8;
}
}
#tooltip {
display: block;
position: fixed;
left: 0;
top: 0;
background: black;
color: white;
padding: 10px;
z-index: 5;
border-radius: 2px;
pointer-events: none;
user-select: none;
opacity: 1;
border: 1px solid white;
max-width: 300px;
}
#popup.history > div {
max-width: none;
table {
th:hover {
cursor: pointer;
background: black;
}
td,
th {
padding: 0 5px;
line-height: 20px;
text-align: right;
}
th:first-child,
td:first-child {
text-align: left;
}
img {
width: 20px;
height: auto;
pointer-events: none;
}
tr:nth-child(2n) {
background: rgba(0, 0, 0, 0.58);
}
}
}
.progress-inline {
position: absolute;
display: block;
background: grey;
left: 62px;
right: 2px;
height: 7px;
bottom: 2px;
border-radius: 2px;
span {
position: absolute;
inset: 1px;
transform-origin: top left;
background: white;
}
}
.toast {
position: fixed;
left: 0;
top: 40px;
display: flex;
align-items: center;
gap: 10px;
opacity: 0.8;
background: black;
border: 1px solid white;
border-radius: 2px;
padding-right: 10px;
pointer-events: none;
transition:
opacity 200ms,
transform 200ms;
z-index: 7;
&.hidden {
opacity: 0;
transform: translate(-20px, -20px) scale(0.5);
}
&.visible {
opacity: 0.8;
transform: none;
}
}
.gridEdit > div > span,
.palette > span {
display: inline-flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
border: 1px solid;
cursor: pointer;
&:hover {
border-color: gold;
z-index: 1;
position: relative;
box-shadow: inset 2px 2px 4px rgba(0, 0, 0, 0.2);
}
}
.gridEdit {
& > div {
display: flex;
& > span {
width: calc(min(500px, 100vw, 100vh - 200px) / var(--grid-size));
height: calc(min(500px, 100vw, 100vh - 200px) / var(--grid-size));
}
}
}
.palette {
display: flex;
flex-wrap: wrap;
& > span {
&[data-selected="true"] {
border: 2px solid white;
}
}
}
#stats {
position: fixed;
left: 0;
top: 40px;
width: 100vw;
max-width: 400px;
color: white;
z-index: 3;
pointer-events: none;
opacity: 1;
& > div {
background: rgba(38, 38, 38, 0.5);
position: relative;
> div {
background: @purple;
position: absolute;
inset: 0;
transform-origin: top left;
}
> strong {
position: relative;
padding: 0 5px;
}
}
}
.highlight {
position: relative;
&:before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(-45deg, @purple, transparent);
mix-blend-mode: screen;
opacity: 0.3;
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,115 +1,83 @@
import { allLevels, appVersion, upgrades } from "./loadGameData"; import { allLevels, appVersion, icons, upgrades } from "./loadGameData";
import { t } from "./i18n/i18n"; import { t } from "./i18n/i18n";
import { RunHistoryItem } from "./types"; import { GameState, RunHistoryItem } from "./types";
import { gameState, pause, restart } from "./game"; import { gameState, pause, restart } from "./game";
import { currentLevelInfo, findLast, pickedUpgradesHTMl } from "./game_utils"; import {
import { getTotalScore } from "./settings"; currentLevelInfo,
describeLevel,
findLast,
pickedUpgradesHTMl,
reasonLevelIsLocked,
} from "./game_utils";
import {
askForPersistentStorage,
getSettingValue,
getTotalScore,
setSettingValue,
} from "./settings";
import { stopRecording } from "./recording"; import { stopRecording } from "./recording";
import { asyncAlert } from "./asyncAlert"; import { asyncAlert } from "./asyncAlert";
import { rawUpgrades } from "./upgrades";
export function getUpgraderUnlockPoints() { import { run } from "jest";
let list = [] as { threshold: number; title: string }[]; import { editRawLevelList } from "./levelEditor";
import { openCreativeModePerksPicker } from "./creative";
upgrades.forEach((u) => {
if (u.threshold) {
list.push({
threshold: u.threshold,
title: u.name + " " + t("level_up.unlocked_perk"),
});
}
});
allLevels.forEach((l) => {
list.push({
threshold: l.threshold,
title: l.name + " " + t("level_up.unlocked_level"),
});
});
return list
.filter((o) => o.threshold)
.sort((a, b) => a.threshold - b.threshold);
}
export function addToTotalPlayTime(ms: number) { export function addToTotalPlayTime(ms: number) {
try { setSettingValue(
localStorage.setItem( "breakout_71_total_play_time",
"breakout_71_total_play_time", getSettingValue("breakout_71_total_play_time", 0) + ms,
JSON.stringify( );
JSON.parse(localStorage.getItem("breakout_71_total_play_time") || "0") +
ms,
),
);
} catch (e) {}
} }
export function gameOver(title: string, intro: string) { export function gameOver(title: string, intro: string) {
if (!gameState.running) return; if (!gameState.running) return;
if (gameState.isGameOver) return; if (gameState.isGameOver) return;
gameState.isGameOver = true; gameState.isGameOver = true;
pause(true); pause(true);
askForPersistentStorage();
stopRecording(); stopRecording();
addToTotalPlayTime(gameState.runStatistics.runTime); addToTotalPlayTime(gameState.runStatistics.runTime);
gameState.runStatistics.max_level = gameState.currentLevel + 1;
let animationDelay = -300; if (typeof gameState.startParams.isEditorTrialRun === "number") {
const getDelay = () => { editRawLevelList(gameState.startParams.isEditorTrialRun);
animationDelay += 800; restart({});
return "animation-delay:" + animationDelay + "ms;"; return;
}; }
if (gameState.startParams.isCreativeRun) {
openCreativeModePerksPicker();
restart({});
return;
}
// unlocks // unlocks
let unlocksInfo = "";
const endTs = getTotalScore(); const endTs = getTotalScore();
const startTs = endTs - gameState.score; const startTs = endTs - gameState.score;
const list = getUpgraderUnlockPoints(); const unlockedPerks = rawUpgrades.filter(
list (o) => o.threshold > startTs && o.threshold < endTs,
.filter((u) => u.threshold > startTs && u.threshold < endTs)
.forEach((u) => {
unlocksInfo += `
<p class="progress" >
<span>${u.title}</span>
<span class="progress_bar_part" style="${getDelay()}"></span>
</p>
`;
});
const previousUnlockAt =
findLast(list, (u) => u.threshold <= endTs)?.threshold || 0;
const nextUnlock = list.find((u) => u.threshold > endTs);
if (nextUnlock) {
const total = nextUnlock?.threshold - previousUnlockAt;
const done = endTs - previousUnlockAt;
intro += t("gameOver.next_unlock", {
points: nextUnlock.threshold - endTs,
});
const scaleX = (done / total).toFixed(2);
unlocksInfo += `
<p class="progress" >
<span>${nextUnlock.title}</span>
<span style="transform: scale(${scaleX},1);${getDelay()}" class="progress_bar_part"></span>
</p>
`;
list
.slice(list.indexOf(nextUnlock) + 1)
.slice(0, 3)
.forEach((u) => {
unlocksInfo += `
<p class="progress" >
<span>${u.title}</span>
</p>
`;
});
}
let unlockedItems = list.filter(
(u) => u.threshold > startTs && u.threshold < endTs,
); );
if (unlockedItems.length) {
unlocksInfo += `<p>${t("gameOver.unlocked_count", { count: unlockedItems.length })} ${unlockedItems.map((u) => u.title).join(", ")}</p>`; let unlocksInfo = unlockedPerks.length
} ? `
<h2>${unlockedPerks.length === 1 ? t("gameOver.unlocked_perk") : t("gameOver.unlocked_perk_plural", { count: unlockedPerks.length })}</h2>
${unlockedPerks
.map(
(u) => `
<div class="upgrade used">
${icons["icon:" + u.id]}
<p>
<strong>${u.name}</strong>
${u.help(1)}
</p>
</div>
`,
)
.join("\n")}
`
: "";
// Avoid the sad sound right as we restart a new games // Avoid the sad sound right as we restart a new games
gameState.combo = 1; gameState.combo = 1;
@ -117,49 +85,108 @@ export function gameOver(title: string, intro: string) {
asyncAlert({ asyncAlert({
allowClose: true, allowClose: true,
title, title,
text: ` content: [
${gameState.isCreativeModeRun ? `<p>${t("gameOver.test_run")}</p> ` : ""} getCreativeModeWarning(gameState) ||
`
<p>${intro}</p> <p>${intro}</p>
<p>${t("gameOver.cumulative_total", { startTs, endTs })}</p> <p>${t("gameOver.cumulative_total", { startTs, endTs })}</p>
${unlocksInfo}
`, `,
actions: [
{ {
icon: icons["icon:new_run"],
value: null, value: null,
text: t("gameOver.restart"), text: t("confirmRestart.yes"),
help: "", help: "",
}, },
`<div id="level-recording-container"></div>`,
unlocksInfo,
getHistograms(gameState),
], ],
textAfterButtons: `<div id="level-recording-container"></div> }).then(() =>
<p>${t("gameOver.upgrades_picked")}</p> restart({
<p>${pickedUpgradesHTMl(gameState)}</p> levelToAvoid: currentLevelInfo(gameState).name,
${getHistograms()} }),
`, );
}).then(() => restart({ levelToAvoid: currentLevelInfo(gameState).name }));
} }
export function getHistograms() { export function getCreativeModeWarning(gameState: GameState) {
if (gameState.creative) {
return "<p>" + t("gameOver.creative") + "</p>";
}
return "";
}
let runsHistory = [];
try {
runsHistory = JSON.parse(
localStorage.getItem("breakout_71_runs_history") || "[]",
)
.sort((a, b) => b.score - a.score)
.slice(0, 100) as RunHistoryItem[];
} catch (e) {}
export function getHistory() {
return runsHistory;
}
export function getHistograms(gameState: GameState) {
if (gameState.creative) return "";
let unlockedLevels = "";
let runStats = ""; let runStats = "";
try { try {
// Stores only top 100 runs const locked = allLevels
let runsHistory = JSON.parse( .map((l, li) => ({
localStorage.getItem("breakout_71_runs_history") || "[]", li,
) as RunHistoryItem[]; l,
runsHistory.sort((a, b) => a.score - b.score).reverse(); r: reasonLevelIsLocked(li, runsHistory, false)?.text,
runsHistory = runsHistory.slice(0, 100); }))
.filter((l) => l.r);
gameState.runStatistics.runTime = Math.round(
gameState.runStatistics.runTime,
);
const perks = { ...gameState.perks };
for (let id in perks) {
if (!perks[id]) {
delete perks[id];
}
}
runsHistory.push({ runsHistory.push({
...gameState.runStatistics, ...gameState.runStatistics,
perks: gameState.perks, perks,
appVersion, appVersion,
}); });
const unlocked = locked.filter(
({ li }) => !reasonLevelIsLocked(li, runsHistory, true),
);
if (unlocked.length) {
unlockedLevels = `
<h2>${unlocked.length === 1 ? t("unlocks.just_unlocked") : t("unlocks.just_unlocked_plural", { count: unlocked.length })}</h2>
${unlocked
.map(
({ l, r }) => `
<div class="upgrade used">
${icons[l.name]}
<p>
<strong>${l.name}</strong>
${describeLevel(l)}
</p>
</div>
`,
)
.join("\n")}
`;
}
// Generate some histogram // Generate some histogram
if (!gameState.isCreativeModeRun)
localStorage.setItem( localStorage.setItem(
"breakout_71_runs_history", "breakout_71_runs_history",
JSON.stringify(runsHistory, null, 2), JSON.stringify(runsHistory, null, 2),
); );
const makeHistogram = ( const makeHistogram = (
title: string, title: string,
@ -270,11 +297,11 @@ export function getHistograms() {
if (runStats) { if (runStats) {
runStats = runStats =
`<p>${t("gameOver.stats.intro", { count: runsHistory.length - 1 })}</p>` + `<p>${t("gameOver.stats_intro", { count: runsHistory.length - 1 })}</p>` +
runStats; runStats;
} }
} catch (e) { } catch (e) {
console.warn(e); console.warn(e);
} }
return runStats; return unlockedLevels + runStats;
} }

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@ import {
getMajorityValue, getMajorityValue,
makeEmptyPerksMap, makeEmptyPerksMap,
sample, sample,
sumOfKeys, sumOfValues,
} from "./game_utils"; } from "./game_utils";
describe("getMajorityValue", () => { describe("getMajorityValue", () => {
@ -31,16 +31,16 @@ describe("sample", () => {
}); });
describe("sumOfKeys", () => { describe("sumOfKeys", () => {
it("returns the sum of the keys of an array", () => { it("returns the sum of the keys of an array", () => {
expect(sumOfKeys({ a: 1, b: 2 })).toEqual(3); expect(sumOfValues({ a: 1, b: 2 })).toEqual(3);
}); });
it("returns 0 for an empty object", () => { it("returns 0 for an empty object", () => {
expect(sumOfKeys({})).toEqual(0); expect(sumOfValues({})).toEqual(0);
}); });
it("returns 0 for undefined", () => { it("returns 0 for undefined", () => {
expect(sumOfKeys(undefined)).toEqual(0); expect(sumOfValues(undefined)).toEqual(0);
}); });
it("returns 0 for null", () => { it("returns 0 for null", () => {
expect(sumOfKeys(null)).toEqual(0); expect(sumOfValues(null)).toEqual(0);
}); });
}); });
describe("makeEmptyPerksMap", () => { describe("makeEmptyPerksMap", () => {

View file

@ -1,5 +1,42 @@
import { Ball, GameState, PerkId, PerksMap } from "./types"; import {
Ball,
Coin,
GameState,
Level,
PerkId,
PerksMap,
RunHistoryItem,
UpgradeLike,
} from "./types";
import { icons, upgrades } from "./loadGameData"; import { icons, upgrades } from "./loadGameData";
import { t } from "./i18n/i18n";
import { clamp } from "./pure_functions";
import { rawUpgrades } from "./upgrades";
import { hashCode } from "./getLevelBackground";
import { getTotalScore } from "./settings";
import { isOptionOn } from "./options";
export function describeLevel(level: Level) {
let bricks = 0,
colors = new Set(),
bombs = 0;
level.bricks.forEach((color) => {
if (!color) return;
if (color === "black") {
bombs++;
return;
} else {
colors.add(color);
bricks++;
}
});
return t("unlocks.level_description", {
size: level.size,
bricks,
colors: colors.size,
bombs,
});
}
export function getMajorityValue(arr: string[]): string { export function getMajorityValue(arr: string[]): string {
const count: { [k: string]: number } = {}; const count: { [k: string]: number } = {};
@ -13,7 +50,7 @@ export function sample<T>(arr: T[]): T {
return arr[Math.floor(arr.length * Math.random())]; return arr[Math.floor(arr.length * Math.random())];
} }
export function sumOfKeys(obj: { [key: string]: number } | undefined | null) { export function sumOfValues(obj: { [key: string]: number } | undefined | null) {
if (!obj) return 0; if (!obj) return 0;
return Object.values(obj)?.reduce((a, b) => a + b, 0) || 0; return Object.values(obj)?.reduce((a, b) => a + b, 0) || 0;
} }
@ -46,36 +83,128 @@ export function getRowColIndex(gameState: GameState, row: number, col: number) {
return row * gameState.gridSize + col; return row * gameState.gridSize + col;
} }
export function getClosestBall(
gameState: GameState,
x: number,
y: number,
): Ball | null {
let closestBall: Ball | null = null;
let dist = 0;
gameState.balls.forEach((ball) => {
const d2 = (ball.x - x) * (ball.x - x) + (ball.y - y) * (ball.y - y);
if (d2 < dist || !closestBall) {
closestBall = ball;
dist = d2;
}
});
return closestBall;
}
export function getPossibleUpgrades(gameState: GameState) { export function getPossibleUpgrades(gameState: GameState) {
return upgrades return upgrades
.filter((u) => gameState.totalScoreAtRunStart >= u.threshold) .filter((u) => getTotalScore() >= u.threshold)
.filter((u) => !u?.requires || gameState.perks[u?.requires]); .filter((u) => !u?.requires || gameState.perks[u?.requires]);
} }
export function max_levels(gameState: GameState) { export function max_levels(gameState: GameState) {
if (gameState.creative) return 1;
return 7 + gameState.perks.extra_levels; return 7 + gameState.perks.extra_levels;
} }
export function pickedUpgradesHTMl(gameState: GameState) { export function pickedUpgradesHTMl(gameState: GameState) {
const upgradesList = getPossibleUpgrades(gameState)
.filter((u) => gameState.perks[u.id])
.map((u) => {
const newMax = Math.max(0, u.max + gameState.perks.limitless);
let bars = [];
for (let i = 0; i < Math.max(u.max, newMax, gameState.perks[u.id]); i++) {
if (i < gameState.perks[u.id]) {
bars.push('<span class="used"></span>');
} else if (i < newMax) {
bars.push('<span class="free"></span>');
} else {
bars.push('<span class="banned"></span>');
}
}
const state = (gameState.perks[u.id] && 1) || (!newMax && 2) || 3;
return {
state,
html: `
<div class="upgrade ${["??", "used", "banned", "free"][state]}">
${u.icon}
<p>
<strong>${u.name}</strong>
${u.help(Math.max(1, gameState.perks[u.id]))}
</p>
${bars.reverse().join("")}
</div>
`,
};
})
.sort((a, b) => a.state - b.state)
.map((a) => a.html);
return ` <p>${t("score_panel.upgrades_picked")}</p>` + upgradesList.join("");
}
export function levelsListHTMl(gameState: GameState, level: number) {
if (!gameState.perks.clairvoyant) return "";
if (gameState.creative) return "";
let list = ""; let list = "";
for (let u of upgrades) { for (let i = 0; i < max_levels(gameState); i++) {
for (let i = 0; i < gameState.perks[u.id]; i++) list += `<span style="opacity: ${i >= level ? 1 : 0.2}" title="${gameState.runLevels[i].name}">${icons[gameState.runLevels[i].name]}</span>`;
list += icons["icon:" + u.id] + " ";
} }
return list; return `<p>${t("score_panel.upcoming_levels")}</p><p>${list}</p>`;
} }
export function currentLevelInfo(gameState: GameState) { export function currentLevelInfo(gameState: GameState) {
return gameState.runLevels[ return gameState.level;
gameState.currentLevel % gameState.runLevels.length
];
} }
export function isTelekinesisActive(gameState: GameState, ball: Ball) { export function isPickyEatingPossible(gameState: GameState) {
return gameState.perks.telekinesis && ball.vy < 0; return gameState.bricks.indexOf(gameState.ballsColor) !== -1;
} }
export function isYoyoActive(gameState: GameState, ball: Ball) {
return gameState.perks.yoyo && ball.vy > 0; export function reachRedRowIndex(gameState: GameState) {
if (!gameState.perks.reach) return -1;
const { size } = gameState.level;
let minY = -1,
maxY = -1,
maxYCount = -1;
for (let y = 0; y < size; y++)
for (let x = 0; x < size; x++)
if (gameState.bricks[x + y * size]) {
if (minY == -1) minY = y;
if (maxY < y) {
maxY = y;
maxYCount = 0;
}
if (maxY == y) maxYCount++;
}
if (maxY < 1) return -1;
if (maxY == minY) return -1;
if (maxYCount === size) return -1;
return maxY;
}
export function telekinesisEffectRate(gameState: GameState, ball: Ball) {
return (
(gameState.perks.telekinesis &&
ball.vy < 0 &&
clamp((ball.y / gameState.gameZoneHeight) * 1.1 + 0.1, 0, 1)) ||
0
);
}
export function yoyoEffectRate(gameState: GameState, ball: Ball) {
return (
(gameState.perks.yoyo &&
ball.vy > 0 &&
clamp(1 - (ball.y / gameState.gameZoneHeight) * 1.1 + 0.1, 0, 1)) ||
0
);
} }
export function findLast<T>( export function findLast<T>(
@ -103,9 +232,6 @@ export function distanceBetween(
return Math.sqrt(distance2(a, b)); return Math.sqrt(distance2(a, b));
} }
export function clamp(value: number, min: number, max: number) {
return Math.max(min, Math.min(value, max));
}
export function defaultSounds() { export function defaultSounds() {
return { return {
aboutToPlaySound: { aboutToPlaySound: {
@ -116,6 +242,7 @@ export function defaultSounds() {
explode: { vol: 0, x: 0 }, explode: { vol: 0, x: 0 },
lifeLost: { vol: 0, x: 0 }, lifeLost: { vol: 0, x: 0 },
coinCatch: { vol: 0, x: 0 }, coinCatch: { vol: 0, x: 0 },
plouf: { vol: 0, x: 0 },
colorChange: { vol: 0, x: 0 }, colorChange: { vol: 0, x: 0 },
}, },
}; };
@ -149,25 +276,150 @@ export function shouldPierceByColor(
return true; return true;
} }
export function countBricksAbove(gameState: GameState, index: number) { export function isMovingWhilePassiveIncome(gameState: GameState) {
const col = index % gameState.gridSize; return !!(
const row = Math.floor(index / gameState.gridSize); gameState.lastPuckMove &&
let count = 0; gameState.perks.passive_income &&
for (let y = 0; y < row; y++) { gameState.lastPuckMove >
if (gameState.bricks[col + y * gameState.gridSize]) { gameState.levelTime - 250 * gameState.perks.passive_income
count++; );
}
}
return count;
} }
export function countBricksBelow(gameState: GameState, index: number) {
const col = index % gameState.gridSize; export function getHighScore() {
const row = Math.floor(index / gameState.gridSize); try {
let count = 0; return parseInt(localStorage.getItem("breakout-3-hs-short") || "0");
for (let y = row + 1; y < gameState.gridSize; y++) { } catch (e) {}
if (gameState.bricks[col + y * gameState.gridSize]) { return 0;
count++;
}
}
return count;
} }
export function highScoreText() {
if (getHighScore()) {
return t("main_menu.high_score", { score: getHighScore() });
}
return "";
}
let excluded: Set<PerkId>;
function isExcluded(id: PerkId) {
if (!excluded) {
excluded = new Set([
"extra_levels",
"extra_life",
"one_more_choice",
"instant_upgrade",
"shunt",
"slow_down",
]);
// Avoid excluding a perk that's needed for the required one
rawUpgrades.forEach((u) => {
if (u.requires) excluded.add(u.requires);
});
}
return excluded.has(id);
}
export function getLevelUnlockCondition(levelIndex: number) {
let required: UpgradeLike[] = [],
forbidden: UpgradeLike[] = [],
minScore = Math.max(-1000 + 100 * levelIndex, 0);
if (levelIndex > 20) {
const possibletargets = rawUpgrades
.slice(0, Math.floor(levelIndex / 2))
.map((u) => u)
.filter((u) => !isExcluded(u.id))
.sort(
(a, b) => hashCode(levelIndex + a.id) - hashCode(levelIndex + b.id),
);
const length = Math.min(3, Math.ceil(levelIndex / 30));
required = possibletargets.slice(0, length);
forbidden = possibletargets.slice(length, length + length);
}
return {
required,
forbidden,
minScore,
};
}
export function getBestScoreMatching(
history: RunHistoryItem[],
required: UpgradeLike[] = [],
forbidden: UpgradeLike[] = [],
) {
return Math.max(
0,
...history
.filter(
(r) =>
!required.find((u) => !r?.perks?.[u.id]) &&
!forbidden.find((u) => r?.perks?.[u.id]),
)
.map((r) => r.score),
);
}
export function reasonLevelIsLocked(
levelIndex: number,
history: RunHistoryItem[],
mentionBestScore: boolean,
): null | { reached: number; minScore: number; text: string } {
const { required, forbidden, minScore } = getLevelUnlockCondition(levelIndex);
const reached = getBestScoreMatching(history, required, forbidden);
let reachedText =
reached && mentionBestScore ? t("unlocks.reached", { reached }) : "";
if (reached >= minScore) {
return null;
} else if (!required.length && !forbidden.length) {
return {
reached,
minScore,
text: t("unlocks.minScore", { minScore }) + reachedText,
};
} else {
return {
reached,
minScore,
text:
t("unlocks.minScoreWithPerks", {
minScore,
required: required.map((u) => u.name).join(", "),
forbidden: forbidden.map((u) => u.name).join(", "),
}) + reachedText,
};
}
}
export function ballTransparency(ball: Ball, gameState: GameState) {
if (!gameState.perks.transparency) return 0;
return clamp(
gameState.perks.transparency *
(1 - (ball.y / gameState.gameZoneHeight) * 1.2),
0,
1,
);
}
export function getCoinRenderColor(gameState: GameState, coin: Coin) {
if (
gameState.perks.metamorphosis ||
isOptionOn("colorful_coins") ||
gameState.perks.hypnosis ||
gameState.perks.rainbow
)
return coin.color;
return "#ffd300";
}
export function getCornerOffset(gameState: GameState) {
return (
(gameState.levelTime
? gameState.perks.corner_shot * gameState.brickWidth
: 0) -
gameState.perks.unbounded * gameState.brickWidth
);
}
export const isInWebView = !!window.location.href.includes("isInWebView=true");

View file

@ -0,0 +1,14 @@
export function generateSaveFileContent() {
const localStorageContent: Record<string, string> = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i) as string;
// Avoid including recovery info in the recovery info
if (["recovery_data"].includes(key)) continue;
try {
const value = localStorage.getItem(key) as string;
localStorageContent[key] = JSON.parse(value);
} catch (e) {}
}
return localStorageContent;
}

View file

@ -2,14 +2,8 @@ import { RawLevel } from "./types";
import _backgrounds from "./data/backgrounds.json"; import _backgrounds from "./data/backgrounds.json";
const backgrounds = _backgrounds as string[]; const backgrounds = _backgrounds as string[];
export function getLevelBackground(level: RawLevel) { export function getLevelBackground(level: RawLevel) {
let svg = level.svg !== null && backgrounds[level.svg % backgrounds.length]; return backgrounds[hashCode(level.name) % backgrounds.length];
if (!level.color && !svg) {
svg = backgrounds[hashCode(level.name) % backgrounds.length];
}
return svg;
} }
export function hashCode(string: string) { export function hashCode(string: string) {

72
src/help.ts Normal file
View file

@ -0,0 +1,72 @@
import { allLevels, icons, upgrades } from "./loadGameData";
import { t } from "./i18n/i18n";
import { asyncAlert } from "./asyncAlert";
import { miniMarkDown } from "./pure_functions";
import {
catchRateBest,
catchRateGood,
levelTimeBest,
levelTimeGood,
missesBest,
missesGood,
wallBouncedBest,
wallBouncedGood,
} from "./pure_functions";
export function helpMenuEntry() {
return {
icon: icons["icon:help"],
text: t("help.title"),
help: t("help.help"),
async value() {
await asyncAlert({
title: t("help.title"),
allowClose: true,
content: [
miniMarkDown(
t("help.content", {
catchRateBest,
catchRateGood,
levelTimeBest,
levelTimeGood,
missesBest,
missesGood,
wallBouncedBest,
wallBouncedGood,
}),
),
miniMarkDown(t("help.upgrades")),
...upgrades.map(
(u) => `
<div class="upgrade used">
${u.icon}
<p>
<strong>${u.name}</strong><br/>
${u.help(1)}
</p>
</div>
${miniMarkDown(u.fullHelp)}
`,
),
"<h2>" + t("help.levels") + "</h2>",
...allLevels
.filter((l) => l.credit?.trim())
.map(
(l) => `
<div class="upgrade used">
${icons[l.name]}
<div>
<p>
<strong>${l.name}</strong>
</p>
${miniMarkDown(l.credit || "")}
</div>
</div>`,
),
],
});
},
};
}

445
src/i18n/ar.json Normal file
View file

@ -0,0 +1,445 @@
{
"confirmRestart.no": "يلغي",
"confirmRestart.text": "أنت على وشك بدء لعبة جديدة. هل أنت متأكد من رغبتك في المتابعة؟",
"confirmRestart.title": "بدء لعبة جديدة؟",
"confirmRestart.yes": "إعادة تشغيل اللعبة",
"editor.editing.bigger": "زيادة حجم المستوى",
"editor.editing.color": "اختر لونًا من قائمة الألوان (بحد أقصى 5 لكل مستوى)",
"editor.editing.copy": "نسخ رمز المستوى",
"editor.editing.copy_help": "ألصقه في قناة #levels في Discord الخاص بنا",
"editor.editing.credit": "الاعتمادات والمصدر",
"editor.editing.credit_prompt": "أدخل عنوان URL المصدر أو شرحًا لمستواك.",
"editor.editing.delete": "حذف المستوى",
"editor.editing.down": "انزل كل الطوب إلى الأسفل",
"editor.editing.help": "ثم انقر على البلاط لتلوينه.",
"editor.editing.left": "نقل جميع الطوب إلى اليسار",
"editor.editing.play": "العب هذا المستوى",
"editor.editing.rename": "اسم المستوى",
"editor.editing.rename_prompt": "الرجاء إدخال اسم جديد للمستوى",
"editor.editing.right": "حرك كل الطوب إلى اليمين",
"editor.editing.smaller": "تقليل حجم المستوى",
"editor.editing.title": "مستوى التحرير: {{name}}",
"editor.editing.up": "حرك كل الطوب لأعلى",
"editor.help": "إنشاء مستويات مخصصة ومشاركتها لتضمينها في اللعبة.",
"editor.import": "استيراد المستوى",
"editor.import_instruction": "الصق رمز المستوى لاستيراده في قائمة المستويات الخاصة بك",
"editor.locked": "احصل على مجموع نقاط قدره {{min}} لفتح القفل",
"editor.new_level": "مستوى جديد",
"editor.title": "محرر المستويات",
"gameOver.creative": "لن يتم تسجيل هذا التشغيل.",
"gameOver.cumulative_total": "لقد ارتفع مجموع درجاتك التراكمية من {{startTs}} إلى {{endTs}}.",
"gameOver.lost.summary": "لقد أسقطت الكرة بعد التقاط {{score}} قطعة نقدية.",
"gameOver.lost.title": "انتهت اللعبة",
"gameOver.stats.balls_lost": "الكرات المفقودة",
"gameOver.stats.bricks_broken": "الطوب المكسور",
"gameOver.stats.bricks_per_minute": "عدد الطوب المكسور في الدقيقة",
"gameOver.stats.catch_rate": "معدل الصيد",
"gameOver.stats.combo_avg": "مجموعة متوسطة",
"gameOver.stats.combo_max": "أقصى مجموعة",
"gameOver.stats.duration_per_level": "المدة لكل مستوى",
"gameOver.stats.hit_rate": "معدل الإصابة",
"gameOver.stats.intro": "",
"gameOver.stats.level_reached": "المستوى الذي تم الوصول إليه",
"gameOver.stats.total_score": "مجموع النقاط",
"gameOver.stats.upgrades_applied": "تم تطبيق الترقيات",
"gameOver.stats_intro": "ابحث أدناه عن إحصائيات لعبتك مقارنةً بأفضل {{count}} ألعاب لديك.",
"gameOver.unlocked_perk": "تم إلغاء قفل الترقية",
"gameOver.unlocked_perk_plural": "لقد قمت للتو بفتح {{count}} من الامتيازات",
"gameOver.win.summary": "انتهت اللعبة. لقد جمعت {{score}} عملة.",
"gameOver.win.title": "لقد أكملت هذه اللعبة",
"help.content": "## الهدف\n\nاجمع أكبر عدد ممكن من العملات المعدنية خلال 7 مستويات.\n\nتظهر العملات المعدنية عند كسر الطوب.\n\nاجمعها بمجدافك لزيادة نقاطك.\n\nتظهر نقاطك في الزاوية العلوية اليمنى من الشاشة.\n\nلا تسقط الكرة وإلا ستنتهي اللعبة.\n\nبعد تدمير جميع الطوب، ستتمكن من اختيار ترقية.\n\n## الترقيات\n\nستُطبق الترقيات التي تختارها حتى نهاية الجولة.\n\nيمكن اختيار بعضها عدة مرات لتأثير أقوى.\n\nبعضها يُساعد في التصويب، أو يُسهّل اللعبة بطرق أخرى.\n\nبعضها لا يُفيد إلا عند دمجه.\n\nستحصل دائمًا على ترقية واحدة في بداية كل لعبة.\n\nسيكون رمزها بمثابة طوب المستوى الأول.\n\nيمكنك اختيار ترقيات البدء من الإعدادات.\n\nتؤثر العديد من الترقيات على مجموعتك.\n\n## المجموعة\n\n\"مجموعتك\" هي عدد العملات المعدنية التي تظهر عند كسر طوبة.\nيظهر ذلك على مجدافك، على سبيل المثال، x4 يعني أن كل مكعب سيُنتج 4 عملات.\n\nمعظم الترقيات التي تزيد من قوة المجموعة تُضيف شرطًا لإعادة ضبطها.\n\nكما يُعاد ضبط المجموعة إذا عادت الكرة إلى\n\nدون أن تصطدم بأي مكعب.\n\nستظهر رسالة \"خطأ\" عند حدوث ذلك.\n\nحاول التصويب نحو مكعب في كل مرة.\n\n## التصويب\n\nموضع الكرة على المجداف هو ما يُحدد كيفية ارتدادها.\n\nإذا اصطدمت الكرة بالمجداف في منتصفه تمامًا، سترتد عموديًا.\n\nإذا ضربت أكثر على جانب واحد، ستكون زاوية ارتدادها أكبر.\n\nلا تؤثر سرعة المجداف وزاوية دخوله على اتجاه الكرة بعد ارتدادها.\n\nيمكن فتح العديد من الترقيات التي تُساعد في التصويب.\n\n## الفتح\n\nعند لعب Breakout 71 لأول مرة، تكون معظم الترقيات والمستويات مقفلة.\n\nيتم فتح الترقيات بمجرد اللعب وجمع العديد من العملات.\nتُفتح المستويات الأولى عند تحقيق أعلى نتيجة.\n\nتُضيف المستويات اللاحقة شرطًا لاختيار المزايا.\n\nيصبح تحقيق أعلى النتائج أسهل بكثير عند حصولك على ترقيات متعددة بعد كل مستوى.\n\n## إعادة رمي النرد والترقيات المجانية\n\nستحصل على ترقية إضافية لاختيارها عند لعبك الجيد:\n\n- إكمال المستوى في أقل من {{levelTimeGood}} ثانية\n- ضرب الجوانب أو القمة أقل من {{wallBouncedGood}} مرة\n- التقاط {{catchRateGood}}% من العملات\n- تفويت الطوب أقل من {{missesGood}} مرات\n\nستحصل أيضًا على إعادة رمي نرد تتيح لك تخطي الترقيات إذا كان أداؤك أفضل:\n\n- إكمال المستوى في أقل من {{levelTimeBest}} ثانية\n- ضرب الجوانب أو القمة أقل من {{wallBouncedBest}} مرات\n- التقاط {{catchRateBest}}% من العملات\n- تفويت الطوب أقل من {{missesBest}} مرات\n\nيُتيح لك خيار في الإعدادات عرض هذه الإحصائيات",
"help.help": "تعرف على المزيد حول اللعبة",
"help.levels": "المستويات",
"help.title": "يساعد",
"help.upgrades": "## الترقيات",
"history.columns.score": "نتيجة",
"history.columns.started": "تاريخ",
"history.help": "شاهد أفضل ألعابك {{count}} .",
"history.locked": "العب عشر مباريات على الأقل لفتح القفل",
"history.title": "سجل التشغيل",
"lab.help": "جرب أي بناء تريده",
"lab.instructions": "قم بتحديد الترقيات أدناه، ثم اختر المستوى للعب.",
"lab.menu_entry": "الوضع الإبداعي",
"lab.reset": "إعادة تعيين الكل إلى 0",
"lab.select_level": "حدد المستوى للعب عليه",
"lab.unlocks_at": "يتم فتحه عند إجمالي النتيجة {{score}}",
"level_up.after_buttons": "لقد انتهيت للتو من المستوى {{level}}/{{max}}.",
"level_up.before_buttons": "لقد اصطدت {{score}} عملة {{catchGain}} من أصل {{levelSpawnedCoins}} في {{time}} ثانية {{timeGain}}.\n\nأخطأت {{levelMisses}} مرات {{missesGain}} واصطدمت بالجدران أو السقف {{levelWallBounces}} مرات{{wallHitsGain}}.\n{{compliment}}",
"level_up.compliment_advice": "حاول التقاط جميع العملات المعدنية، ولا تفوت الطوب أبدًا، ولا تصطدم أبدًا بالجدران/السقف أو قم بتجاوز المستوى في أقل من 30 ثانية للحصول على ترقيات إضافية.",
"level_up.compliment_good": "أحسنت !",
"level_up.compliment_perfect": "رائع، استمر في ذلك!",
"level_up.pick_upgrade_title": "اختر ترقية",
"level_up.plus_one_upgrade": "(+1 ترقية)",
"level_up.plus_one_upgrade_and_reroll": "(+1 ترقية و+1 إعادة رمي)",
"level_up.reroll": "إعادة الرمي ({{count}})",
"level_up.reroll_help": "تقديم خيارات جديدة",
"level_up.upgrade_perk_to_level": "المستوى {{level}}",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
"main_menu.colorful_coins_help": "",
"main_menu.comboIncreaseTexts": "",
"main_menu.comboIncreaseTexts_help": "",
"main_menu.contrast": "",
"main_menu.contrast_help": "",
"main_menu.credit_levels": "",
"main_menu.donate": "لقد لعبت لمدة {{hours}} ساعة",
"main_menu.donate_help": "ماذا عن التبرع؟ يمكنك إخفاء هذا التذكير في الإعدادات.",
"main_menu.donation_reminder": "",
"main_menu.donation_reminder_help": "",
"main_menu.download_save_file": "",
"main_menu.download_save_file_help": "",
"main_menu.extra_bright": "",
"main_menu.extra_bright_help": "",
"main_menu.fullscreen": "",
"main_menu.fullscreen_help": "",
"main_menu.help_content": "",
"main_menu.help_help": "",
"main_menu.help_title": "",
"main_menu.help_upgrades": "",
"main_menu.high_score": "أعلى نتيجة : {{score}}",
"main_menu.kid": "",
"main_menu.kid_help": "",
"main_menu.language": "",
"main_menu.language_help": "",
"main_menu.load_save_file": "",
"main_menu.load_save_file_help": "",
"main_menu.max_coins": "",
"main_menu.max_coins_help": "",
"main_menu.max_particles": "",
"main_menu.max_particles_help": "",
"main_menu.mobile": "",
"main_menu.mobile_help": "",
"main_menu.normal": "لعبة جديدة",
"main_menu.normal_help": "العب 7 مستويات مع ميزة البدء العشوائية",
"main_menu.pointer_lock": "",
"main_menu.pointer_lock_help": "",
"main_menu.record": "",
"main_menu.record_download": "",
"main_menu.record_help": "",
"main_menu.red_miss": "",
"main_menu.red_miss_help": "",
"main_menu.reset": "",
"main_menu.reset_cancel": "",
"main_menu.reset_confirm": "",
"main_menu.reset_help": "",
"main_menu.reset_instruction": "",
"main_menu.save_file_error": "",
"main_menu.save_file_loaded": "",
"main_menu.save_file_loaded_help": "",
"main_menu.save_file_loaded_ok": "",
"main_menu.settings_help": "قم بتخصيص طريقة اللعب لتناسب احتياجاتك وذوقك",
"main_menu.settings_title": "إعدادات",
"main_menu.show_fps": "",
"main_menu.show_fps_help": "",
"main_menu.show_stats": "",
"main_menu.show_stats_help": "",
"main_menu.sounds": "",
"main_menu.sounds_help": "",
"main_menu.starting_perks": "",
"main_menu.starting_perks_checked": "",
"main_menu.starting_perks_full_random": "",
"main_menu.starting_perks_help": "",
"main_menu.starting_perks_unchecked": "",
"main_menu.title": "الاختراق 71",
"main_menu.unlocks": "المحتوى غير المقفل",
"main_menu.unlocks_help": "جرب الامتيازات والمستويات التي فتحتها",
"play.close_modale_window_tooltip": "يغلق",
"play.current_lvl": "المستوى {{level}}/{{max}}",
"play.menu_label": "قائمة طعام",
"play.menu_tooltip": "فتح القائمة الرئيسية",
"play.missed_ball": "يفتقد",
"play.mobile_press_to_play": "اضغط مع الاستمرار هنا للعب",
"play.score_tooltip": "شاهد نتيجتك وترقياتك والمزيد",
"play.stats.coins_catch_rate": "معدل صيد العملات المعدنية",
"play.stats.levelMisses": "الضربات الضائعة، حيث لم تصب أي شيء",
"play.stats.levelTime": "وقت المستوى",
"play.stats.levelWallBounces": "ارتدادات الحائط",
"score_panel.close_to_unlock": "فتح المستوى التالي:",
"score_panel.get_upgrades_to_unlock": "احصل على {{missingUpgrades}} واحصل على {{points}} نقطة إضافية لفتح المستوى \"{{level}}\"",
"score_panel.rerolls_count": "لقد جمعت {{rerolls}} إعادة تسجيل",
"score_panel.score_to_unlock": "احصل على {{points}} نقطة إضافية لفتح المستوى \"{{level}}\"",
"score_panel.title": "{{score}} نقطة في المستوى {{level}}/{{max}} ",
"score_panel.upcoming_levels": "المستويات القادمة :",
"score_panel.upgrades_picked": "الترقيات التي تم اختيارها في هذه اللعبة:",
"settings.autoplay": "",
"settings.autoplay_help": "",
"settings.basic": "الرسومات الأساسية",
"settings.basic_help": "أداء أفضل.",
"settings.colorful_coins": "عملات معدنية ملونة",
"settings.colorful_coins_help": "تظهر العملات المعدنية دائمًا بلون الطوب",
"settings.comboIncreaseTexts": "إظهار +X باللون الذهبي",
"settings.comboIncreaseTexts_help": "عندما تزيد المجموعة",
"settings.contrast": "تباين عالي",
"settings.contrast_help": "تقديم أكثر ألوانًا وظلامًا",
"settings.donation_reminder": "ذكّرني بالتبرع",
"settings.donation_reminder_help": "شاهد وقت اللعب ورابط التبرع في القائمة الرئيسية",
"settings.download_save_file": "تنزيل النتيجة والإحصائيات",
"settings.download_save_file_help": "احصل على ملف الحفظ",
"settings.extra_bright": "مشرق للغاية",
"settings.extra_bright_help": "يزيد من حجم الهالة حول العملات المعدنية والطوب.",
"settings.fullscreen": "تكبير الشاشة",
"settings.fullscreen_help": "ستحاول اللعبة الانتقال إلى وضع ملء الشاشة قبل البدء",
"settings.kid": "وضع الأطفال",
"settings.kid_help": "ابدأ الألعاب المستقبلية بـ \"الكرة الأبطأ\".",
"settings.language": "لغة",
"settings.language_help": "اختر لغة اللعبة",
"settings.load_save_file": "تحميل ملف الحفظ",
"settings.load_save_file_help": "حدد ملف الحفظ على جهازك",
"settings.max_coins": " {{max}} عملات معدنية على الشاشة كحد أقصى",
"settings.max_coins_help": "تجميلي فقط، لا يؤثر على النتيجة",
"settings.mobile": "الوضع المحمول",
"settings.mobile_help": "يترك مساحة تحت المجداف.",
"settings.pointer_lock": "قفل مؤشر الماوس",
"settings.pointer_lock_help": "يقوم بقفل وإخفاء مؤشر الماوس.",
"settings.precise_lighting": "",
"settings.precise_lighting_help": "",
"settings.probabilistic_lighting": "",
"settings.probabilistic_lighting_help": "",
"settings.record": "تسجيل مقاطع فيديو للعبة",
"settings.record_download": "تنزيل الفيديو ({{size}} ميجابايت)",
"settings.record_help": "احصل على فيديو لكل مستوى.",
"settings.red_miss": "تحذير ملكة جمال",
"settings.red_miss_help": "إظهار الجسيمات الحمراء حول الكرات التي تهبط دون إصابة.",
"settings.reset": "إعادة تعيين اللعبة",
"settings.reset_cancel": "لا",
"settings.reset_confirm": "نعم",
"settings.reset_help": "مسح أعلى الدرجات ووقت اللعب والإحصائيات",
"settings.reset_instruction": "سوف تفقد كل التقدم الذي أحرزته في اللعبة، هل أنت متأكد؟",
"settings.save_file_error": "خطأ في تحميل ملف الحفظ",
"settings.save_file_loaded": "حفظ الملف المحمّل",
"settings.save_file_loaded_help": "سيتم الآن إعادة تحميل التطبيق لتطبيق الحفظ الخاص بك",
"settings.save_file_loaded_ok": "نعم",
"settings.show_fps": "عداد FPS",
"settings.show_fps_help": "مراقبة أداء التطبيق",
"settings.show_stats": "عرض الإحصائيات في الوقت الحقيقي",
"settings.show_stats_help": "العملات المعدنية، الوقت، الارتدادات، الأخطاء",
"settings.smooth_lighting": "",
"settings.smooth_lighting_help": "",
"settings.sounds": "أصوات اللعبة",
"settings.sounds_help": "أصوات صفير وبلبل و برررر",
"settings.stress_test": "",
"settings.stress_test_help": "",
"starting_perks.checked": "عند بدء لعبة جديدة، ستُمنح إحدى هذه المزايا. انقر على أي ميزة لاستبعادها.",
"starting_perks.help": "اختر الترقيات الأولية الممكنة",
"starting_perks.random": "لقد تم إزالة جميع المزايا، وسيكون الاختيار عشوائيًا.",
"starting_perks.title": "امتيازات البداية",
"starting_perks.unchecked": "لا يتم تقديم الامتيازات المذكورة أدناه كامتيازات ابتدائية، ولكن يمكنك النقر عليها لإضافتها إلى المجموعة.",
"unlocks.greyed_out_help": "يمكن فتح الترقيات غير المفعّلة بزيادة مجموع نقاطك. يزداد مجموع النقاط مع كل نقطة تُسجّلها في اللعبة.",
"unlocks.intro": "مجموع نقاطك هو {{ts}}. تجد أدناه جميع الترقيات والمستويات التي تقدمها اللعبة. انقر على ترقية أو مستوى أدناه لبدء لعبة تجريبية بها.",
"unlocks.just_unlocked": "تم فتح المستوى",
"unlocks.just_unlocked_plural": "لقد قمت للتو بفتح {{count}} مستوى",
"unlocks.level": "<h2>لقد قمت بفتح {{unlocked}} مستوى من أصل {{out_of}}</h2>\n<p>إليك جميع مستويات اللعبة، انقر على أحدها لتجربته.</p> ",
"unlocks.level_description": "مستوى {{size}}×{{size}} مع {{bricks}} طوبة و {{colors}} لون و {{bombs}} قنبلة.",
"unlocks.minScore": "احصل على ${{minScore}} في جولة لفتح القفل.",
"unlocks.minScoreWithPerks": "احصل على ${{minScore}} في جولة مع {{required}} ولكن بدون {{forbidden}} لفتح القفل.",
"unlocks.minTotalScore": "تجميع إجمالي قدره{{score}}دولار",
"unlocks.reached": "أفضل نتيجة حصلت عليها كانت {{reached}}.",
"unlocks.title_upgrades": "لقد قمت بفتح {{unlocked}} ترقيات من أصل {{out_of}}",
"upgrades.addiction.name": "مدمن",
"upgrades.addiction.tooltip": "+{{lvl}} مجموعة / لبنة، يتم إعادة تعيين المجموعة لمدة {{delay}}ثانية بعد كسر لبنة.",
"upgrades.addiction.verbose_description": "يبدأ العد التنازلي بعد كسر أول لبنة من كل مستوى، ويتوقف عند تدمير جميع الطوب.",
"upgrades.asceticism.name": "الزهد",
"upgrades.asceticism.tooltip": "+{{combo}} مجموعة / لبنة، - {{combo}} عند التقاط العملة المعدنية",
"upgrades.asceticism.verbose_description": "سوف تحتاج إلى تخزين العملات المعدنية في مكان ما أثناء صعود مجموعتك.",
"upgrades.ball_attract_ball.help_plural": "قوة جذب أقوى",
"upgrades.ball_attract_ball.name": "جاذبية",
"upgrades.ball_attract_ball.tooltip": "الكرات تجذب الكرات",
"upgrades.ball_attract_ball.verbose_description": "الكرات التي تبعد أكثر من ثلاثة أرباع مساحة اللعبة ستبدأ بالتجاذب.\n\nتزداد قوة التجاذب كلما ابتعدت الكرات عن بعضها.\n\nستتطاير جزيئات قوس قزح رمزًا لقوة التجاذب. هذه الميزة متاحة فقط إذا كان لديك أكثر من كرة واحدة.",
"upgrades.ball_attracts_coins.name": "الكرات تجذب العملات المعدنية",
"upgrades.ball_attracts_coins.tooltip": "تتبع العملات المعدنية الكرة الأقرب وتسقط بشكل أبطأ",
"upgrades.ball_attracts_coins.verbose_description": "يمكن استخدام هذا المنتج لطلاء الكرات بالعملات المعدنية إذا تم دمجه مع \"الصبغة\" و\"عملات الأشباح\". كما أنه بديل لمغناطيس العملات المعدنية.",
"upgrades.ball_repulse_ball.help_plural": "قوة تنافر أقوى",
"upgrades.ball_repulse_ball.name": "المساحة الشخصية",
"upgrades.ball_repulse_ball.tooltip": "الكرات تصد الكرات",
"upgrades.ball_repulse_ball.verbose_description": "الكرات التي تبعد أقل من ربع عرض الشاشة ستبدأ بالتنافر. تزداد قوة التنافر كلما كانت الكرات قريبة من بعضها. ستنطلق الجسيمات للخارج لترمز إلى تطبيق هذه القوة. هذه الميزة متاحة فقط إذا كان لديك أكثر من كرة واحدة.",
"upgrades.base_combo.name": "أسس قوية",
"upgrades.base_combo.tooltip": "تبدأ المجموعة عند {{coins}} بدلاً من 1.",
"upgrades.base_combo.verbose_description": "عادةً ما تبدأ مجموعتك من ١ في بداية المستوى، وتُعاد ضبطها إلى ١ عندما تقفز دون أن تصطدم بأي شيء. مع هذه الميزة، تبدأ المجموعة أعلى بثلاث نقاط، لذا ستحصل دائمًا على ٤ عملات على الأقل لكل مكعب. عند إعادة ضبط مجموعتك، تعود إلى ٤ وليس ١. ستتألق كرتك قليلاً للإشارة إلى أن مجموعتها أعلى من ١.",
"upgrades.bigger_explosions.name": "كابوم",
"upgrades.bigger_explosions.tooltip": "انفجارات أكبر",
"upgrades.bigger_explosions.verbose_description": "الانفجار الافتراضي يُزيل مربعًا 3×3، ويصبح مربعًا 5×5، كما أن تأثير الضربة على العملات المعدنية أقوى بكثير. ستومض الشاشة بعد كل انفجار (باستثناء الوضع الأساسي).",
"upgrades.bigger_puck.name": "مجداف أكبر",
"upgrades.bigger_puck.tooltip": "احصل على المزيد من العملات المعدنية بسهولة.",
"upgrades.bigger_puck.verbose_description": "يجعل المضرب الأكبر من السهل عدم تفويت الكرة والتقاط المزيد من العملات المعدنية، كما يساعد أيضًا على تحديد زاوية الارتدادات بدقة (تعتمد زاوية الكرة فقط على المكان الذي تصطدم فيه بالمضرب).",
"upgrades.bricks_attract_ball.name": "الطوب يجذب الكرات",
"upgrades.bricks_attract_ball.tooltip": "تتجه الكرة نحو أول {{count}} من الطوب التي ستصطدم بها.",
"upgrades.bricks_attract_ball.verbose_description": "يكون التأثير أقوى في المستويات الأعلى. كما أن عدد الطوب الذي يمكن أن يصيب قبل توقف التأثير يكون أكبر. ويعود التأثير إلى قوته عندما تصطدم الكرة بالقرص.",
"upgrades.bricks_attract_coins.name": "الطوب يجذب العملات المعدنية",
"upgrades.bricks_attract_coins.tooltip": "يساعدهم على البقاء هناك",
"upgrades.bricks_attract_coins.verbose_description": "",
"upgrades.clairvoyant.name": "مستبصر",
"upgrades.clairvoyant.tooltip": "شاهد المستويات القادمة، نقاط الصحة للطوب واتجاه الكرة",
"upgrades.clairvoyant.verbose_description": "يساعدك على اختيار الترقيات المناسبة وفهم كيفية عمل الطوب المتين. يُضيف المستويان 2 و3 معلومات إضافية حول فائدة مشكوك فيها (متوفرة في وضع الحلقة).",
"upgrades.coin_magnet.help_plural": "تأثير أقوى على العملات المعدنية",
"upgrades.coin_magnet.name": "مغناطيس العملات المعدنية",
"upgrades.coin_magnet.tooltip": "المجداف يجذب العملات المعدنية",
"upgrades.coin_magnet.verbose_description": "يُوجِّه العملات المعدنية نحو المجداف. يكون التأثير أقوى إذا كانت العملة قريبة منه بالفعل.",
"upgrades.compound_interest.name": "الفائدة المركبة",
"upgrades.compound_interest.tooltip": "+{{lvl}} مجموعة لكل لبنة مكسورة، يتم إعادة تعيينها عند فقدان العملة المعدنية",
"upgrades.compound_interest.verbose_description": "ستزداد مجموعتك قطعةً قطعةً في كل مرة تكسر فيها لبنة، مما يُنتج المزيد من العملات مع كل قطعة تكسرها.\n\nمع ذلك، احرص على التقاط جميع هذه العملات بمجدافك، لأن أي عملة مفقودة ستُعيد ضبط مجموعتك.\n\nبمجرد أن تتجاوز مجموعتك الحد الأدنى، سيظهر خط أحمر في أسفل منطقة اللعب لتذكيرك بعدم وضع العملات هناك.",
"upgrades.concave_puck.name": "مجداف مقعر",
"upgrades.concave_puck.tooltip": "تحسين دقة التصويب العمودي",
"upgrades.concave_puck.verbose_description": "تبدأ الكرات المستوى بالصعود مباشرة إلى الأعلى، وترتد بزاوية أقل.",
"upgrades.corner_shot.name": "ضربة ركنية",
"upgrades.corner_shot.tooltip": "يسمح للمجداف الخاص بك بالتداخل مع حدود الشاشة",
"upgrades.corner_shot.verbose_description": "يُساعدك على التصويب في الزوايا. المستويات الأعلى تُتيح لك الوصول إلى مسافات أبعد.",
"upgrades.etherealcoins.name": "العملات المعدنية في الفضاء",
"upgrades.etherealcoins.tooltip": "لم تعد العملات المعدنية تتأثر بالجاذبية",
"upgrades.etherealcoins.verbose_description": "ستحافظ العملات المعدنية على سرعتها حتى بعد عدة ارتدادات، ولن تتأثر بالجاذبية بعد الآن.",
"upgrades.extra_levels.name": "5 دقائق إضافية",
"upgrades.extra_levels.tooltip": "العب {{count}} مستوى بدلاً من 7",
"upgrades.extra_levels.verbose_description": "يمكن أن تستمر اللعبة الافتراضية لسبعة مستويات كحد أقصى، تنتهي بعدها.\n\nيتيح لك كل مستوى من هذه الميزة الانتقال إلى مستوى أعلى. غالبًا ما تكون المستويات الأخيرة هي التي تحقق فيها أعلى النقاط، لذا قد يكون الفرق كبيرًا.",
"upgrades.extra_life.help_plural": "سترتد الكرة (الأخيرة) إلى الأسفل بدلاً من أن تضيع ({{lvl}} مرة).",
"upgrades.extra_life.name": "حياة إضافية",
"upgrades.extra_life.tooltip": "سترتد الكرة مرة واحدة على الخط السفلي قبل أن تضيع.",
"upgrades.extra_life.verbose_description": "عادةً، لديك كرة واحدة، وتنتهي اللعبة بمجرد إسقاطها.\n\nتضيف هذه الميزة شريطًا أبيض أسفل الشاشة يحفظ الكرة مرة واحدة، ثم ينكسر أثناء ذلك.\n\nستخسر مستوى واحدًا من هذه الميزة في كل مرة ترتد فيها كرة أسفل الشاشة.",
"upgrades.forgiving.name": "غفور",
"upgrades.forgiving.tooltip": "يؤدي فقدان الفواصل إلى تقليل المجموعة تدريجيًا بدلاً من تقليلها دفعة واحدة.",
"upgrades.forgiving.verbose_description": "أول خطأ في كل مستوى مجاني، ثم 10% من المجموعة، ثم 20% ..",
"upgrades.fountain_toss.name": "رمي النافورة",
"upgrades.fountain_toss.tooltip": "احصل على بعض المجموعات عندما تفوت بعض العملات المعدنية.",
"upgrades.fountain_toss.verbose_description": "عندما تفوتك عملة معدنية وكان مجموعتك أقل من {{max}}، فإن مجموعتك لديها احتمالية {{lvl}}/مجموعة لتنمو بمقدار واحد.",
"upgrades.ghost_coins.name": "عملات الأشباح",
"upgrades.ghost_coins.tooltip": "تمر العملات المعدنية ببطء عبر الطوب",
"upgrades.ghost_coins.verbose_description": "إنها ليست مشكلة، بل ميزة! تتحرك العملات المعدنية ببطء عبر الطوب. المستويات الأعلى تسمح لها بالتحرك بشكل أسرع.",
"upgrades.helium.name": "الهيليوم",
"upgrades.helium.tooltip": "انعكست الجاذبية إلى اليسار واليمين من المجداف",
"upgrades.helium.verbose_description": "يؤثر هذا على العملات المعدنية وسيسمح لها بالطفو حتى تصبح جاهزًا لالتقاطها.",
"upgrades.hot_start.name": "بداية ساخنة",
"upgrades.hot_start.tooltip": "ابدأ عند المجموعة {{start}}، -{{loss}} مجموعة في الثانية",
"upgrades.hot_start.verbose_description": "في بداية كل مستوى، تبدأ مجموعتك بـ +٣٠ نقطة، ثم تنخفض نقطة واحدة كل ثانية. يتراكم هذا التأثير مع مزايا أخرى.",
"upgrades.hypnosis.name": "التنويم المغناطيسي",
"upgrades.hypnosis.tooltip": "عندما يتغير لون الطوب، قم بنقل تلك العملة إلى الكرة الأقرب وقم بإعادة شحن قدرتها على تلطيخ الطوب.",
"upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "الانفجارات",
"upgrades.implosions.tooltip": "تؤدي الانفجارات إلى امتصاص العملات المعدنية بدلاً من تفجيرها",
"upgrades.implosions.verbose_description": "تُطبّق قوة الانفجار بطريقة أخرى. المستويات الأخرى تُشكّل \"انفجارًا أكبر\".",
"upgrades.instant_upgrade.name": "ترقية فورية",
"upgrades.instant_upgrade.tooltip": "+2 ترقية الآن، -1 اختيار حتى نهاية اللعبة.",
"upgrades.instant_upgrade.verbose_description": "اختر ترقيتين فورًا، لتحصل على واحدة مجانية وأخرى لاسترداد قيمة الميزة التي استخدمتها. مع كل قائمة تالية لاختيار الترقيات، ستجد خيارات أقل.",
"upgrades.left_is_lava.name": "تجنب الجانب الأيسر",
"upgrades.left_is_lava.tooltip": "+{{lvl}} مجموعة لكل طوبة مكسورة. تُعاد المجموعة إلى وضعها الطبيعي إذا ضربت الكرة الجانب الأيسر من الشاشة.",
"upgrades.left_is_lava.verbose_description": "كلما كسرتَ لبنة، ستزداد مجموعتكَ بواحدة، ما يعني أنك ستحصل على عملة إضافية من كل لبنة تكسرها لاحقًا.\n\nمع ذلك، ستُعاد ضبط مجموعتكَ بمجرد أن تصطدم كرتكَ بالجانب الأيسر.\n\nبمجرد أن ترتفع مجموعتكَ، يصبح الجانب الأيسر أحمر لتذكيرك بضرورة تجنب ضربها.\n\n",
"upgrades.limitless.name": "بلا حدود",
"upgrades.limitless.tooltip": "رفع المستوى الأقصى لجميع الترقيات بمقدار {{lvl}} ",
"upgrades.limitless.verbose_description": "يؤدي اختيار هذه الميزة أيضًا إلى رفع الحد الأقصى الخاص به بمقدار واحد، مما يتيح لك اختيارها مرة أخرى.",
"upgrades.metamorphosis.name": "التحول",
"upgrades.metamorphosis.tooltip": "يمكن لكل عملة أن تصبغ {{lvl}} من الطوب بلونها",
"upgrades.metamorphosis.verbose_description": "مع هذه الميزة، ستكون العملات بلون الطوبة التي أتت منها، وستُلوّن أول طوبة تلمسها بنفس اللون. تظهر العملات بسرعة الكرة التي كسرتها، ما يعني أنه يمكنك التصويب قليلاً باتجاه الطوب الذي تريد \"طلائه\". في المستوى 1، يُمكن لكل عملة تلوين طوبة واحدة قبل أن \"تُستهلك\" وتظهر فارغة.",
"upgrades.minefield.name": "حقل ألغام",
"upgrades.minefield.tooltip": "+{{lvl}} مجموعة لكل قنبلة على الشاشة",
"upgrades.minefield.verbose_description": "يضيف +lvl إلى المجموعة عند وضع لبنة، و-lvl عند تدميرها، ويرفع المجموعة الأساسية بمقدار عدد الطوب مضروبًا في المستوى",
"upgrades.multiball.name": "كرة متعددة",
"upgrades.multiball.tooltip": "ابدأ كل المستويات بـ {{count}} كرة.",
"upgrades.multiball.verbose_description": "بمجرد أن تسقط الكرة في Breakout 71، ستخسر.\n\nمع هذه الميزة، ستحصل على كرتين، ما يعني أنك قادر على تحمل خسارة إحداهما.\n\nتعود الكرات المفقودة في المستوى التالي.\n\nامتلاك أكثر من كرة واحدة يتيح لك الحصول على مزايا إضافية، وبالطبع يُسرّع من إنهاء المستوى.",
"upgrades.nbricks.name": "حجم العينة الصارم",
"upgrades.nbricks.tooltip": "اضرب {{lvl}} طوبة بالضبط لكل ارتداد للمجداف للحصول على +{{lvl}} مجموعة، وإلا فسيتم إعادة تعيينها",
"upgrades.nbricks.verbose_description": "ليس بالضرورة تدمير تلك الطوب، لكن عليك ضربها. الطوب المدمر بالانفجارات لا يُحتسب.",
"upgrades.one_more_choice.name": "خيار إضافي",
"upgrades.one_more_choice.tooltip": "ستوفر عمليات رفع المستوى الإضافية {{lvl}} خيارًا إضافيًا في القائمة",
"upgrades.one_more_choice.verbose_description": "ستحتوي كل قائمة ترقية على خيار إضافي. هذا لا يزيد من عدد الترقيات المتاحة.",
"upgrades.passive_income.name": "الدخل السلبي",
"upgrades.passive_income.tooltip": "+{{lvl}} مجموعة / لبنة، ما لم يتم تحريك المجداف في آخر {{time}}ثانية، ثم يتم إعادة تعيينه بدلاً من ذلك",
"upgrades.passive_income.verbose_description": "يمكن لبعض الامتيازات أن تساعد الكرات على القيام بما تريد دون الحاجة إلى القيام بأي شيء.",
"upgrades.picky_eater.name": "آكل انتقائي",
"upgrades.picky_eater.tooltip": "+{{lvl}} مجموعة لكل لبنة مكسورة، يتم إعادة تعيينها عند تغير لون الكرة",
"upgrades.picky_eater.verbose_description": "كلما كسرتَ لبنة من نفس لون كرتك، تزداد مجموعتك بمقدار كرة واحدة.\n\nإذا كان لونها مختلفًا، تأخذ الكرة اللون الجديد، لكن المجموعة تُعاد ضبطها، إلا في حال عدم وجود أي طوب متبقي من لون الكرة.\n\nبمجرد حصولك على مجموعة أعلى من الحد الأدنى، ستُحاط الطوب ذات اللون غير المناسب بإطار أحمر.\n\nإذا كان لديك أكثر من كرة، فسيتغير لونها جميعًا عند اصطدام إحداها بطوبة.",
"upgrades.pierce.name": "ثقب",
"upgrades.pierce.tooltip": "الكرة تخترق {{count}} طوبة بعد ارتداد المضرب",
"upgrades.pierce.verbose_description": "عادةً ما ترتد الكرة بمجرد ملامستها لأي شيء. مع هذه الميزة، ستواصل مسارها حتى كسر ثلاث طوبات.\n\nبعد ذلك، ترتد على الطوبة الرابعة، وستحتاج إلى لمس المضرب لإعادة ضبط العداد.",
"upgrades.pierce_color.name": "ثقب اللون",
"upgrades.pierce_color.tooltip": "+{{lvl}} ضرر للطوب من لون الكرة",
"upgrades.pierce_color.verbose_description": "كلما اصطدمت الكرة بقطعة من نفس اللون، ستمرّ دون عائق.\n\nوإذا اصطدمت بقطعة من لون مختلف، فستكسرها، وتأخذ لونها، وترتد.\n\nإذا كانت لديك قطع متينة، فقد ترتد الكرة عن قطعة من نفس اللون.",
"upgrades.puck_repulse_ball.help_plural": "قوة تنافر أقوى",
"upgrades.puck_repulse_ball.name": "هبوط ناعم",
"upgrades.puck_repulse_ball.tooltip": "المجداف يصد الكرات",
"upgrades.puck_repulse_ball.verbose_description": "عندما تقترب الكرة من المضرب، فإنها تبدأ في التباطؤ، وربما ترتد دون أن تلمس المضرب.",
"upgrades.rainbow.name": "قوس قزح",
"upgrades.rainbow.tooltip": "تظهر العملات المعدنية بألوان قوس قزح.",
"upgrades.rainbow.verbose_description": "مع كل مستوى، تزداد نسبة العملات الملونة. يعتمد اللون على وقت المستوى.",
"upgrades.reach.name": "من أعلى إلى أسفل",
"upgrades.reach.tooltip": "لمس مكعبات N في الصف السفلي يُعيد ضبط المجموعة. وإلا، فإن +N مجموعة",
"upgrades.reach.verbose_description": "إذا كان هناك صف واحد فقط من الطوب، أو إذا غطى الصف السفلي عرض اللعبة بالكامل، فلن تُحدث هذه الميزة أي فرق. وإلا، فإن كسر هذا الصف السفلي يُعيد ضبط المجموعة، بينما يؤدي كسر أي شيء آخر إلى زيادة المجموعة بمقدار عدد الطوب الموجود في ذلك الصف السفلي.\n\nسيتم تمييز الصف السفلي باللون الأحمر.",
"upgrades.respawn.name": "إعادة الظهور",
"upgrades.respawn.tooltip": "{{percent}}% من الطوب يظهر مرة أخرى بعد {{delay}}ثانية.",
"upgrades.respawn.verbose_description": "سوف يساعدك تأثير الجسيمات على معرفة مكان ظهور الطوب.",
"upgrades.right_is_lava.name": "تجنب الجانب الأيمن",
"upgrades.right_is_lava.tooltip": "+{{lvl}} مجموعة لكل مكعب. تُعاد المجموعة إلى وضعها الطبيعي إذا ضربت الكرة الجانب الأيسر من الشاشة.",
"upgrades.right_is_lava.verbose_description": "كلما كسرتَ لبنة، ستزداد مجموعتكَ بواحدة، ما يعني أنك ستحصل على عملة إضافية من كل لبنة تكسرها لاحقًا.\n\nمع ذلك، ستُعاد ضبط مجموعتكَ حالما تصطدم كرتكَ بالجانب الأيمن.\n\nبمجرد أن ترتفع مجموعتكَ، يصبح الجانب الأيمن أحمر لتذكيرك بضرورة تجنب ضربها.\n\n",
"upgrades.sacrifice.help_l1": "فقدان الحياة يزيل كل الطوب",
"upgrades.sacrifice.help_over": "خسارة حياة {{lvl}}× المجموعة ثم إزالة كل الطوب",
"upgrades.sacrifice.name": "تصحية",
"upgrades.sacrifice.verbose_description": "قد يؤدي هذا إلى ارتفاع المجموعة إلى حد كبير.",
"upgrades.sapper.help_plural": "أول {{lvl}} طوبة مكسورة تصبح قنابل.",
"upgrades.sapper.name": "مهندس",
"upgrades.sapper.tooltip": "الطوبة الأولى المكسورة تصبح قنبلة.",
"upgrades.sapper.verbose_description": "بدلاً من مجرد الاختفاء، ستُستبدل أول لبنة تكسرها ببنة قنبلة. ارتطام الكرة بالمضرب يُعيد تفعيل التأثير. رفع مستوى هذه الميزة سيسمح لك بوضع المزيد من القنابل.",
"upgrades.shocks.name": "الصدمات",
"upgrades.shocks.tooltip": "تصادمات الكرات المتفجرة",
"upgrades.shocks.verbose_description": "عندما تصطدم كرتان، فإنهما تتبادلان سرعتهما، ويحدث انفجار، ويكتسبان سرعة إضافية لفصلهما.",
"upgrades.shunt.name": "ناور",
"upgrades.shunt.tooltip": "احتفظ بـ {{percent}}% من مجموعتك بين المستويات",
"upgrades.shunt.verbose_description": "إذا كان لديك أيضًا بداية ساخنة، فسيتم إضافة البداية الساخنة إلى المجموعة الحالية",
"upgrades.side_flip.name": "اليد اليمنى",
"upgrades.side_flip.tooltip": "+{{lvl}} مجموعة لكل لبنة مكسورة من اليمين، -{{loss}} بخلاف ذلك",
"upgrades.side_flip.verbose_description": "اضرب الطوبة على جانبها الأيمن لتحصل على ضربة كومبو واحدة، لكن تجنب ضربها على الجانب الأيسر لأن ذلك سيُزيل ضربتين كومبو. الضرب من الأعلى والأسفل لا يُجدي نفعًا.",
"upgrades.side_kick.name": "عسراء",
"upgrades.side_kick.tooltip": "+{{lvl}} مجموعة لكل لبنة مكسورة من اليسار، -{{loss}} خلاف ذلك",
"upgrades.side_kick.verbose_description": "اضرب الطوبة على جانبها الأيسر لتحصل على ضربة كومبو واحدة، لكن تجنب ضربها على الجانب الأيمن لأن ذلك سيُزيل ضربتين كومبو. الضرب من الأعلى والأسفل لا يُجدي نفعًا.",
"upgrades.skip_last.help_plural": "سوف تنفجر آخر {{lvl}} طوبة.",
"upgrades.skip_last.name": "تنظيف سهل",
"upgrades.skip_last.tooltip": "الطوبة الاخيرة سوف تنفجر",
"upgrades.skip_last.verbose_description": "عليك كسر جميع الطوب للانتقال إلى المستوى التالي. مع ذلك، قد يكون من الصعب الحصول على الطوب الأخير.\n\nيمنحك إكمال المستوى مبكرًا خيارات إضافية عند الترقية. كما أن عدم تفويت الطوب أبدًا مفيد جدًا.\n\nلذا، إذا واجهت صعوبة في كسر الطوب الأخير، فإن الحصول على هذه الميزة بضع مرات قد يساعدك.",
"upgrades.slow_down.name": "كرة أبطأ",
"upgrades.slow_down.tooltip": "الكرة تتحرك بشكل أبطأ",
"upgrades.slow_down.verbose_description": "تبدأ الكرة ببطء نسبيًا، لكنها ستتسارع قليلًا مع كل مستوى.\n\nكما ستتسارع إذا قضيت وقتًا طويلًا في مستوى واحد.\n\nهذه الميزة تجعلها أسهل في التحكم.\n\nيمكنك الحصول عليها في البداية دائمًا بتفعيل وضع الأطفال في القائمة.",
"upgrades.smaller_puck.help_plural": "مجموعة مجداف أصغر وقاعدة أعلى",
"upgrades.smaller_puck.name": "مجداف أصغر",
"upgrades.smaller_puck.tooltip": "يمنح أيضًا +5 مجموعة أساسية",
"upgrades.smaller_puck.verbose_description": "هذا يُصغّر حجم المجداف، مما يُسهّل نظريًا بعض الضربات الزاوية، ولكنه في الواقع يزيد من الصعوبة.\n\nلهذا السبب ستحصل أيضًا على مكافأة رائعة قدرها +٥ عملات لكل طوبة تُكسرها بعد التقاط هذا.",
"upgrades.soft_reset.name": "إعادة الضبط الناعمة",
"upgrades.soft_reset.tooltip": "إعادة تعيين المجموعة تحافظ على {{percent}}%",
"upgrades.soft_reset.verbose_description": "الحد من تأثير إعادة تعيين المجموعة.",
"upgrades.streak_shots.name": "سلسلة الضربات",
"upgrades.streak_shots.tooltip": "مزيد من العملات المعدنية إذا قمت بكسر العديد من الطوب قبل القفز على المجداف.",
"upgrades.streak_shots.verbose_description": "في كل مرة تكسر فيها لبنة، تزداد مجموعتك بمقدار واحد.\n\nولكن، بمجرد أن تلمس الكرة مضربك، تُعاد المجموعة إلى قيمتها الافتراضية.\n\nبمجرد أن تتجاوز مجموعتك القيمة الأساسية، سيُحاط مضربك بإطار أحمر لتذكيرك بأنه سيدمر مجموعتك إذا لمسته بالكرة.",
"upgrades.sturdy_bricks.name": "طوب قوي",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} من الطوب نقاط الصحة، +{{percent}}% من العملات المعدنية التي تظهر عند الكسر",
"upgrades.sturdy_bricks.verbose_description": "كل مستوى من هذه الميزة يُضيف نقطة صحة واحدة لجميع الطوب. يمكنك رؤية عدد نقاط الصحة باستخدام ميزة \"الاستبصار\". يمكنك زيادة ضرر الكرة بالحصول على ميزة \"الثاقب\". كل مستوى من الميزة يُضيف +٥٠٪ من العملات المعدنية.",
"upgrades.superhot.name": "حار جدًا",
"upgrades.superhot.tooltip": "يتحرك الزمن عندما يتحرك المجداف.",
"upgrades.superhot.verbose_description": "سوبر هوت سوبر هوت سوبر هوت سوبر هوت سوبر هوت",
"upgrades.telekinesis.help_plural": "تأثير أقوى على الكرة",
"upgrades.telekinesis.name": "التحريك الذهني",
"upgrades.telekinesis.tooltip": "يتحكم المضرب في مسار الكرة",
"upgrades.telekinesis.verbose_description": "تتحكم بالكرة أثناء صعودها.",
"upgrades.top_is_lava.name": "السماء هي الحد",
"upgrades.top_is_lava.tooltip": "+{{lvl}} مجموعة لكل لبنة، يتم إعادة ضبطها عند الوصول إلى الجزء العلوي",
"upgrades.top_is_lava.verbose_description": "كلما كسرتَ لبنة، ستزداد مجموعتك بمقدار واحد. مع ذلك، ستُعاد ضبط مجموعتك بمجرد وصول الكرة إلى أعلى الشاشة.\n\nعندما تتجاوز مجموعتك الحد الأدنى، سيظهر شريط أحمر في الأعلى لتذكيرك بتجنب ضربها.",
"upgrades.trampoline.name": "الترامبولين",
"upgrades.trampoline.tooltip": "+{{lvl}} مجموعة لكل ارتداد للمضرب، -{{lvl}} مجموعة لكل ارتداد على أي حدود",
"upgrades.trampoline.verbose_description": "أحد ترقيات المجموعات النادرة التي لا تضيف شرط إعادة الضبط",
"upgrades.transparency.name": "الشفافية",
"upgrades.transparency.tooltip": "كلما كانت الكرة أعلى على الشاشة، زادت شفافيتها. وكلما زادت شفافيتها، زادت العملات التي تنتجها.",
"upgrades.transparency.verbose_description": "المستويات الأعلى تجعل الكرة شفافة بشكل أسرع وتزيد من مكافأة النقاط.",
"upgrades.trickledown.name": "اقتصاد التسرب",
"upgrades.trickledown.tooltip": "تظهر العملات المعدنية في الجزء العلوي من الشاشة.",
"upgrades.trickledown.verbose_description": "قد يساعدك هذا على وضع بعض العملات المعدنية جانبًا. ",
"upgrades.unbounded.name": "غير محدود",
"upgrades.unbounded.tooltip": "يضيف مساحة إلى يسار ويمين المستوى، ولكن مجدافك لا يمكنه الذهاب إلى هذا الحد.",
"upgrades.unbounded.verbose_description": "قد يساعدك ترقية أخرى على توسيع مدى مجدافك.",
"upgrades.viscosity.name": "اللزوجة",
"upgrades.viscosity.tooltip": "انخفاض أبطأ في قيمة العملة",
"upgrades.viscosity.verbose_description": "عادةً ما تتسارع العملات المعدنية بفعل الجاذبية والانفجارات إلى سرعات عالية جدًا.\n\nهذه الميزة تُبطئ سرعتها باستمرار، كما لو كانت في سائل لزج.\n\nهذا يُسهّل التقاطها، ويتكامل بشكل رائع مع الميزات التي تؤثر على حركة العملة.",
"upgrades.wind.help_plural": "قوة الرياح أقوى",
"upgrades.wind.name": "رياح",
"upgrades.wind.tooltip": "وضع المجداف يخلق الرياح",
"upgrades.wind.verbose_description": "تعتمد الرياح على وضعية المضرب: يسارًا يهب يسارًا، ويمينًا يهب يمينًا. تؤثر على الكرات والعملات المعدنية.",
"upgrades.yoyo.name": "يو يو",
"upgrades.yoyo.tooltip": "الكرة تسقط نحو المضرب",
"upgrades.yoyo.verbose_description": "إنه عكس التحريك الذهني، أي التحكم بالكرة أثناء سقوطها مرة أخرى إلى الأسفل.",
"upgrades.zen.name": "زين",
"upgrades.zen.tooltip": "+{{lvl}} مجموعة لكل لبنة، يتم إعادة ضبطها عند حدوث انفجار",
"upgrades.zen.verbose_description": "في نهاية المطاف، هذه لعبة غير عنيفة."
}

File diff suppressed because it is too large Load diff

445
src/i18n/de.json Normal file
View file

@ -0,0 +1,445 @@
{
"confirmRestart.no": "Abbrechen",
"confirmRestart.text": "Sie sind dabei, ein neues Spiel zu beginnen. Sind Sie sicher, dass Sie weitermachen wollen?",
"confirmRestart.title": "Ein neues Spiel beginnen?",
"confirmRestart.yes": "Spiel neu starten",
"editor.editing.bigger": "Levelgröße erhöhen",
"editor.editing.color": "Wählen Sie eine Farbe aus der Farbliste (max. 5 pro Level)",
"editor.editing.copy": "Levelcode kopieren",
"editor.editing.copy_help": "Fügen Sie es in den Kanal #levels in unserem Discord ein",
"editor.editing.credit": "Credits und Quelle",
"editor.editing.credit_prompt": "Geben Sie die Quell-URL oder Erklärung Ihres Levels ein.",
"editor.editing.delete": "Ebene löschen",
"editor.editing.down": "Bewegen Sie alle Steine nach unten",
"editor.editing.help": "Klicken Sie dann auf eine Kachel, um sie einzufärben.",
"editor.editing.left": "Bewege alle Steine nach links",
"editor.editing.play": "Spiele dieses Level",
"editor.editing.rename": "Ebenenname",
"editor.editing.rename_prompt": "Bitte geben Sie einen neuen Namen für das Level ein",
"editor.editing.right": "Bewege alle Steine nach rechts",
"editor.editing.smaller": "Verringern der Levelgröße",
"editor.editing.title": "Bearbeitungsebene: {{name}}",
"editor.editing.up": "Bewegen Sie alle Steine nach oben",
"editor.help": "Erstellen Sie benutzerdefinierte Level und geben Sie sie frei, um sie in das Spiel aufzunehmen.",
"editor.import": "Importieren einer Ebene",
"editor.import_instruction": "Fügen Sie einen Levelcode ein, um ihn in Ihre Levelliste zu importieren",
"editor.locked": "Erreichen Sie eine Gesamtpunktzahl von {{min}} , um freizuschalten",
"editor.new_level": "Neues Level",
"editor.title": "Level-Editor",
"gameOver.creative": "Dieser Lauf wird nicht aufgezeichnet.",
"gameOver.cumulative_total": "Ihre kumulative Gesamtpunktzahl ist von {{startTs}} auf {{endTs}}gestiegen.",
"gameOver.lost.summary": "Du hast den Ball fallen lassen, nachdem du {{score}} Münzen gefangen hast.",
"gameOver.lost.title": "Spiel vorbei",
"gameOver.stats.balls_lost": "Verlorene Bälle",
"gameOver.stats.bricks_broken": "Ziegelsteine gebrochen",
"gameOver.stats.bricks_per_minute": "Ziegelsteinbruch pro Minute",
"gameOver.stats.catch_rate": "Fangquote",
"gameOver.stats.combo_avg": "Durchschnittliche Combo",
"gameOver.stats.combo_max": "Max-Kombo",
"gameOver.stats.duration_per_level": "Dauer pro Stufe",
"gameOver.stats.hit_rate": "Trefferquote",
"gameOver.stats.intro": "",
"gameOver.stats.level_reached": "Erreichte Stufe",
"gameOver.stats.total_score": "Gesamtpunktzahl",
"gameOver.stats.upgrades_applied": "Angewandte Upgrades",
"gameOver.stats_intro": "Hier finden Sie Ihre Spielstatistik im Vergleich zu Ihren {{count}} besten Spielen.",
"gameOver.unlocked_perk": "Upgrade freigeschaltet",
"gameOver.unlocked_perk_plural": "Du hast soeben {{count}} Vergünstigungen freigeschaltet",
"gameOver.win.summary": "Das Spiel ist vorbei. Du hast {{score}} Münzen versteckt.",
"gameOver.win.title": "Du hast dieses Spiel abgeschlossen",
"help.content": "## Ziel\n\nSammle in 7 Levels so viele Münzen wie möglich ein.\nDie Münzen erscheinen, wenn du Ziegel zerbrichst.\nFangen Sie sie mit Ihrem Paddel auf, um Ihre Punktzahl zu erhöhen.\nIhr Punktestand wird in der oberen rechten Ecke des Bildschirms angezeigt.\nLassen Sie den Ball nicht fallen, sonst ist das Spiel vorbei.\n\nWenn du alle Ziegel zerstört hast, kannst du dir ein Upgrade aussuchen.\n\n## Upgrades\n\nDie Upgrades, die du wählst, gelten bis zum Ende des Laufs.\nEinige können mehrmals ausgewählt werden, um die Wirkung zu verstärken.\nEinige helfen beim Zielen oder machen das Spiel auf andere Weise einfacher.\nEinige sind nur in Kombination nützlich.\n\nZu Beginn eines jeden Spiels erhältst du immer ein Upgrade.\nIhr Symbol dient als Baustein des ersten Levels.\nDu kannst die Start-Upgrades in den Einstellungen auswählen.\n\nViele Upgrades wirken sich auf deine Kombo aus.\n\n## Combo\n\nDeine \"Combo\" ist die Anzahl der Münzen, die beim Zerbrechen eines Steins entstehen.\nSie wird auf deinem Paddel angezeigt, zum Beispiel x4 bedeutet, dass jeder Stein 4 Münzen hervorbringt.\nDie meisten Upgrades, die den Combo erhöhen, fügen auch eine Bedingung hinzu, um ihn zurückzusetzen.\nDie Kombo wird auch zurückgesetzt, wenn der Ball zum Schläger zurückkehrt, ohne einen Stein zu treffen.\nIn diesem Fall wird eine \"Miss\"-Meldung angezeigt.\n\nVersuchen Sie, jedes Mal auf einen Stein zu zielen.\n\n## Anvisieren\n\nNur die Position des Balls auf dem Schläger entscheidet darüber, wie der Ball abprallt.\nWenn der Ball das Paddel genau in der Mitte trifft, prallt er senkrecht nach oben ab.\nWenn du ihn mehr auf einer Seite triffst, hat er einen größeren Winkel.\nDie Paddelgeschwindigkeit und der Auftreffwinkel haben keinen Einfluss auf die Richtung des Balls nach dem Aufprall.\n\nViele Upgrades, die beim Zielen helfen, können freigeschaltet werden.\n\n## Freischaltungen\n\nWenn du Breakout 71 zum ersten Mal spielst, sind die meisten Upgrades und Levels gesperrt.\nUpgrades werden freigeschaltet, indem du einfach spielst und viele Münzen fängst.\nDie ersten Level werden durch das Erreichen einer hohen Punktzahl freigeschaltet.\nSpätere Levels fügen eine Bedingung hinzu, welche Vergünstigungen Sie auswählen können.\n\nEine hohe Punktzahl zu erreichen ist viel einfacher, wenn du nach jedem Level mehrere Upgrades erhältst.\n\n## Re-Rolls und kostenlose Upgrades\n\nWenn du gut spielst, bekommst du ein zusätzliches Upgrade, das du auswählen kannst:\n\n- Schaffe das Level in weniger als {{levelTimeGood}} Sekunden\n- Treffen Sie weniger als {{wallBouncedGood}} Mal die Seiten oder die Spitze\n- Fangen Sie {{catchRateGood}}% der Münzen\n- Verfehle die Steine weniger als {{missesGood}} Mal\n\nDu bekommst auch einen Re-Roll, mit dem du Upgrades überspringen kannst, wenn du noch besser abschneidest:\n\n- Schaffe ein Level in weniger als {{levelTimeBest}} Sekunden\n- Treffen Sie weniger als {{wallBouncedBest}} Mal die Seiten oder die Spitze\n- Fangen Sie {{catchRateBest}}% der Münzen\n- Verfehle die Steine weniger als {{missesBest}} Mal\n\nMit einer Option in den Einstellungen können Sie diese Statistiken anzeigen lassen",
"help.help": "Erfahren Sie mehr über das Spiel",
"help.levels": "Ebenen",
"help.title": "Hilfe",
"help.upgrades": "## Upgrades",
"history.columns.score": "Ergebnis",
"history.columns.started": "Datum",
"history.help": "Sehen Sie Ihre {{count}} besten Spiele.",
"history.locked": "Mindestens zehn Spiele spielen, um freizuschalten",
"history.title": "Läuft Geschichte",
"lab.help": "Versuchen Sie jede beliebige Konstruktion",
"lab.instructions": "Wählen Sie unten die Upgrades aus und wählen Sie dann ein Level, das Sie spielen möchten.",
"lab.menu_entry": "Kreativ-Modus",
"lab.reset": "Alle auf 0 zurücksetzen",
"lab.select_level": "Wählen Sie einen Level zum Spielen",
"lab.unlocks_at": "Wird freigeschaltet bei Gesamtpunktzahl {{score}}",
"level_up.after_buttons": "Du hast gerade Level {{level}}/{{max}}beendet.",
"level_up.before_buttons": "Du hast {{score}} Münzen {{catchGain}} aus {{levelSpawnedCoins}} in {{time}} Sekunden {{timeGain}}gefangen.\n\nDu hast {{levelMisses}} Mal danebengeschossen {{missesGain}} und {{levelWallBounces}} Mal die Wände oder die Decke getroffen{{wallHitsGain}}.\n\n{{compliment}}",
"level_up.compliment_advice": "Versuche, alle Münzen zu fangen, verpasse nie die Steine, stoße nie an die Wände/Decke oder schaffe das Level unter 30 Sekunden, um zusätzliche Upgrades zu erhalten.",
"level_up.compliment_good": "Gut gemacht!",
"level_up.compliment_perfect": "Beeindruckend, machen Sie weiter so!",
"level_up.pick_upgrade_title": "Wählen Sie ein Upgrade",
"level_up.plus_one_upgrade": "(+1 Aufwertung)",
"level_up.plus_one_upgrade_and_reroll": "(+1 Aufwertung und +1 Neuwurf)",
"level_up.reroll": "Neu würfeln ({{count}})",
"level_up.reroll_help": "Neue Wahlmöglichkeiten bieten",
"level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
"main_menu.colorful_coins_help": "",
"main_menu.comboIncreaseTexts": "",
"main_menu.comboIncreaseTexts_help": "",
"main_menu.contrast": "",
"main_menu.contrast_help": "",
"main_menu.credit_levels": "",
"main_menu.donate": "Sie haben seit {{hours}} Stunden gespielt",
"main_menu.donate_help": "Wie wäre es mit einer Spende? Sie können diese Erinnerung in den Einstellungen ausblenden.",
"main_menu.donation_reminder": "",
"main_menu.donation_reminder_help": "",
"main_menu.download_save_file": "",
"main_menu.download_save_file_help": "",
"main_menu.extra_bright": "",
"main_menu.extra_bright_help": "",
"main_menu.fullscreen": "",
"main_menu.fullscreen_help": "",
"main_menu.help_content": "",
"main_menu.help_help": "",
"main_menu.help_title": "",
"main_menu.help_upgrades": "",
"main_menu.high_score": "Hohe Punktzahl : {{score}}",
"main_menu.kid": "",
"main_menu.kid_help": "",
"main_menu.language": "",
"main_menu.language_help": "",
"main_menu.load_save_file": "",
"main_menu.load_save_file_help": "",
"main_menu.max_coins": "",
"main_menu.max_coins_help": "",
"main_menu.max_particles": "",
"main_menu.max_particles_help": "",
"main_menu.mobile": "",
"main_menu.mobile_help": "",
"main_menu.normal": "Neues Spiel",
"main_menu.normal_help": "Spiele 7 Levels mit einem zufälligen Startvorteil",
"main_menu.pointer_lock": "",
"main_menu.pointer_lock_help": "",
"main_menu.record": "",
"main_menu.record_download": "",
"main_menu.record_help": "",
"main_menu.red_miss": "",
"main_menu.red_miss_help": "",
"main_menu.reset": "",
"main_menu.reset_cancel": "",
"main_menu.reset_confirm": "",
"main_menu.reset_help": "",
"main_menu.reset_instruction": "",
"main_menu.save_file_error": "",
"main_menu.save_file_loaded": "",
"main_menu.save_file_loaded_help": "",
"main_menu.save_file_loaded_ok": "",
"main_menu.settings_help": "Passen Sie das Spiel an Ihre Bedürfnisse und Ihren Geschmack an",
"main_menu.settings_title": "Einstellungen",
"main_menu.show_fps": "",
"main_menu.show_fps_help": "",
"main_menu.show_stats": "",
"main_menu.show_stats_help": "",
"main_menu.sounds": "",
"main_menu.sounds_help": "",
"main_menu.starting_perks": "",
"main_menu.starting_perks_checked": "",
"main_menu.starting_perks_full_random": "",
"main_menu.starting_perks_help": "",
"main_menu.starting_perks_unchecked": "",
"main_menu.title": "Breakout 71",
"main_menu.unlocks": "Freigegebene Inhalte",
"main_menu.unlocks_help": "Freigegebene Vergünstigungen und Stufen ausprobieren",
"play.close_modale_window_tooltip": "Schließen Sie",
"play.current_lvl": "Stufe {{level}}/{{max}}",
"play.menu_label": "Menu",
"play.menu_tooltip": "Hauptmenü öffnen",
"play.missed_ball": "Miss",
"play.mobile_press_to_play": "Zum Abspielen hier drücken und halten",
"play.score_tooltip": "Sehen Sie Ihren Punktestand, Upgrades und mehr",
"play.stats.coins_catch_rate": "Fangrate der Münzen",
"play.stats.levelMisses": "Verfehlte Schüsse, bei denen man nichts trifft",
"play.stats.levelTime": "Level Zeit",
"play.stats.levelWallBounces": "Mauervorsprünge",
"score_panel.close_to_unlock": "Nächste Stufe freischalten:",
"score_panel.get_upgrades_to_unlock": "Holen Sie {{missingUpgrades}} und erzielen Sie {{points}} mehr Punkte, um Level \"{{level}}\" freizuschalten. \"",
"score_panel.rerolls_count": "Sie haben {{rerolls}} Wiederholungswürfe angesammelt",
"score_panel.score_to_unlock": "Erziele {{points}} mehr Punkte, um Level \"{{level}}\" freizuschalten. \"",
"score_panel.title": "{{score}} Punkte auf Stufe {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Kommende Stufen :",
"score_panel.upgrades_picked": "Die in diesem Spiel gewählten Upgrades laufen:",
"settings.autoplay": "",
"settings.autoplay_help": "",
"settings.basic": "Grundlegende Grafiken",
"settings.basic_help": "Bessere Leistung.",
"settings.colorful_coins": "Bunte Münzen",
"settings.colorful_coins_help": "Münzen spawnen immer in der Farbe des Steins",
"settings.comboIncreaseTexts": "+X in Gold anzeigen",
"settings.comboIncreaseTexts_help": "Wenn die Combo zunimmt",
"settings.contrast": "Hoher Kontrast",
"settings.contrast_help": "Buntes und dunkles Rendering",
"settings.donation_reminder": "Erinnern Sie mich an eine Spende",
"settings.donation_reminder_help": "Siehe Spielzeit und Spendenlink im Hauptmenü",
"settings.download_save_file": "Spielstand und Statistiken herunterladen",
"settings.download_save_file_help": "Abrufen einer Speicherdatei",
"settings.extra_bright": "Extra hell",
"settings.extra_bright_help": "Erhöht die Größe des Halos um Münzen und Ziegel.",
"settings.fullscreen": "Vollbild",
"settings.fullscreen_help": "Das Spiel versucht, vor dem Start in den Vollbildmodus zu wechseln",
"settings.kid": "Kinder-Modus",
"settings.kid_help": "Beginnen Sie künftige Spiele mit einem \"langsameren Ball\".",
"settings.language": "Sprache",
"settings.language_help": "Wählen Sie die Sprache des Spiels",
"settings.load_save_file": "Speicherdatei laden",
"settings.load_save_file_help": "Wählen Sie eine Speicherdatei auf Ihrem Gerät",
"settings.max_coins": " {{max}} Münzen auf dem Bildschirm maximal",
"settings.max_coins_help": "Nur kosmetisch, keine Auswirkung auf das Ergebnis",
"settings.mobile": "Mobiler Modus",
"settings.mobile_help": "Lässt Platz unter dem Paddel.",
"settings.pointer_lock": "Mauszeigersperre",
"settings.pointer_lock_help": "Sperrt und versteckt den Mauszeiger.",
"settings.precise_lighting": "",
"settings.precise_lighting_help": "",
"settings.probabilistic_lighting": "",
"settings.probabilistic_lighting_help": "",
"settings.record": "Spielvideos aufnehmen",
"settings.record_download": "Video herunterladen ({{size}} MB)",
"settings.record_help": "Holen Sie sich ein Video von jedem Level.",
"settings.red_miss": "Miss Warnung",
"settings.red_miss_help": "Zeigen Sie rote Partikel um Bälle, die ohne Treffer zu Boden gehen.",
"settings.reset": "Spiel zurücksetzen",
"settings.reset_cancel": "Nein",
"settings.reset_confirm": "Ja",
"settings.reset_help": "Löschen von Highscore, Spielzeit und Statistiken",
"settings.reset_instruction": "Sie verlieren alle Fortschritte, die Sie im Spiel gemacht haben, sind Sie sicher?",
"settings.save_file_error": "Fehler beim Laden einer Speicherdatei",
"settings.save_file_loaded": "Geladene Datei speichern",
"settings.save_file_loaded_help": "Die App wird nun neu geladen, um die Speicherung zu übernehmen.",
"settings.save_file_loaded_ok": "Ok",
"settings.show_fps": "FPS-Zähler",
"settings.show_fps_help": "Überwachen Sie die Leistung der Anwendung",
"settings.show_stats": "Echtzeit-Statistiken anzeigen",
"settings.show_stats_help": "Münzen, Zeit, Sprünge, Fehlschüsse",
"settings.smooth_lighting": "",
"settings.smooth_lighting_help": "",
"settings.sounds": "Spiel-Sounds",
"settings.sounds_help": "Piepsen, Bloops und Brrrr",
"settings.stress_test": "",
"settings.stress_test_help": "",
"starting_perks.checked": "Wenn Sie ein neues Spiel beginnen, wird Ihnen eine dieser Vergünstigungen angeboten. Klicken Sie auf eine Vergünstigung, um sie auszuschließen.",
"starting_perks.help": "Wählen Sie mögliche Start-Upgrades",
"starting_perks.random": "Alle Vorteile wurden gestrichen, die Auswahl erfolgt nach dem Zufallsprinzip.",
"starting_perks.title": "Startvorteile",
"starting_perks.unchecked": "Die folgenden Vergünstigungen werden nicht als Startvergünstigungen angeboten, aber Sie können sie durch Anklicken zum Pool hinzufügen.",
"unlocks.greyed_out_help": "Die ausgegrauten Upgrades können freigeschaltet werden, indem Sie Ihre Gesamtpunktzahl erhöhen. Die Gesamtpunktzahl erhöht sich jedes Mal, wenn Sie im Spiel punkten.",
"unlocks.intro": "Deine Gesamtpunktzahl ist {{ts}}. Nachfolgend finden Sie alle Upgrades und Levels, die das Spiel zu bieten hat. Klicken Sie auf ein Upgrade oder eine Stufe, um ein Testspiel damit zu starten.",
"unlocks.just_unlocked": "Level freigeschaltet",
"unlocks.just_unlocked_plural": "Du hast soeben {{count}} Stufen freigeschaltet",
"unlocks.level": "<h2>Du hast {{unlocked}} Stufen von {{out_of}}freigeschaltet </h2>\n<p>Hier sind alle Spielstufen, klicke eine an, um sie auszuprobieren.</p> ",
"unlocks.level_description": "Ein {{size}}x{{size}} Level mit {{bricks}} Steinen, {{colors}} Farben und {{bombs}} Bomben.",
"unlocks.minScore": "Erreiche ${{minScore}} in einem Lauf, um freizuschalten.",
"unlocks.minScoreWithPerks": "Erreiche ${{minScore}} in einem Durchgang mit {{required}} , aber ohne {{forbidden}} zu entsperren.",
"unlocks.minTotalScore": "Kumulieren Sie insgesamt ${{score}}",
"unlocks.reached": "Ihr bestes Ergebnis war {{reached}}.",
"unlocks.title_upgrades": "Du hast {{unlocked}} Upgrades von {{out_of}}freigeschaltet.",
"upgrades.addiction.name": "Sucht",
"upgrades.addiction.tooltip": "+{{lvl}} Combo / Stein, Combo wird {{delay}}s nach Zerbrechen eines Steins zurückgesetzt.",
"upgrades.addiction.verbose_description": "Der Countdown beginnt erst nach dem Zerbrechen des ersten Steins eines jeden Levels. Er stoppt, sobald alle Ziegel zerstört sind.",
"upgrades.asceticism.name": "Askese",
"upgrades.asceticism.tooltip": "+{{combo}} Combo / Ziegel, - {{combo}} bei Münzfang",
"upgrades.asceticism.verbose_description": "Sie müssen die Münzen irgendwo aufbewahren, während Ihre Combo aufsteigt.",
"upgrades.ball_attract_ball.help_plural": "Stärkere Anziehungskraft",
"upgrades.ball_attract_ball.name": "Schwerkraft",
"upgrades.ball_attract_ball.tooltip": "Bälle ziehen Bälle an",
"upgrades.ball_attract_ball.verbose_description": "Bälle, die mehr als \"3/4 der Spielfeldbreite\" entfernt sind, beginnen sich gegenseitig anzuziehen.\n\nDie Anziehungskraft ist stärker, wenn sie am weitesten voneinander entfernt sind.\n\nUm die Anziehungskraft zu symbolisieren, fliegen Regenbogenpartikel. Dieser Vorteil wird nur angeboten, wenn du bereits mehr als einen Ball hast.",
"upgrades.ball_attracts_coins.name": "Bälle ziehen Münzen an",
"upgrades.ball_attracts_coins.tooltip": "Die Münzen folgen der nächstgelegenen Kugel und fallen langsamer herunter.",
"upgrades.ball_attracts_coins.verbose_description": "Dies könnte verwendet werden, um die Kugeln mit Münzen \"anzumalen\", wenn man es mit \"Flecken\" und \"Geistermünzen\" kombiniert. Es funktioniert auch als Ersatz für einen Münzmagneten.",
"upgrades.ball_repulse_ball.help_plural": "Stärkere Abstoßungskraft",
"upgrades.ball_repulse_ball.name": "Persönlicher Raum",
"upgrades.ball_repulse_ball.tooltip": "Bälle stoßen Bälle ab",
"upgrades.ball_repulse_ball.verbose_description": "Kugeln, die weniger als ein Viertel der Bildschirmbreite entfernt sind, stoßen sich gegenseitig ab. Die Abstoßungskraft ist stärker, wenn sie sich nahe beieinander befinden. Um diese Kraft zu symbolisieren, werden Partikel herausgeschleudert. Dieser Vorteil wird nur angeboten, wenn Sie bereits mehr als einen Ball haben.",
"upgrades.base_combo.name": "Starke Grundlagen",
"upgrades.base_combo.tooltip": "Combo beginnt bei {{coins}} statt bei 1.",
"upgrades.base_combo.verbose_description": "Deine Combo beginnt normalerweise bei 1 am Anfang des Levels und wird auf 1 zurückgesetzt, wenn du herumspringst, ohne etwas zu treffen. Mit diesem Vorteil beginnt die Kombo 3 Punkte höher, sodass du immer mindestens 4 Münzen pro Stein erhältst. Immer, wenn deine Kombo zurückgesetzt wird, steht sie wieder bei 4 und nicht bei 1. Dein Ball wird ein wenig glitzern, um anzuzeigen, dass sein Combo höher als 1 ist.",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "Größere Explosionen",
"upgrades.bigger_explosions.verbose_description": "Die Standardexplosion räumt ein 3x3-Quadrat, mit dieser wird es zu einem 5x5-Quadrat, und der Schlag auf die Münzen ist auch wesentlich stärker. Der Bildschirm blinkt nach jeder Explosion (außer im Basismodus)",
"upgrades.bigger_puck.name": "Größeres Paddel",
"upgrades.bigger_puck.tooltip": "Einfach mehr Münzen fangen.",
"upgrades.bigger_puck.verbose_description": "Ein größeres Paddel macht es einfacher, den Ball nie zu verfehlen und mehr Münzen zu fangen. Außerdem kann man die Abpraller genau ausrichten (der Winkel des Balls hängt nur davon ab, wo er das Paddel trifft).",
"upgrades.bricks_attract_ball.name": "Ziegelsteine ziehen Bälle an",
"upgrades.bricks_attract_ball.tooltip": "Der Ball fliegt zu den ersten {{count}} Steinen, die er trifft.",
"upgrades.bricks_attract_ball.verbose_description": "Die Wirkung ist bei höheren Stufen stärker. Die Anzahl der Steine, die getroffen werden können, bevor der Effekt aufhört, ist ebenfalls höher. Der Effekt setzt wieder ein, wenn der Ball den Puck trifft.",
"upgrades.bricks_attract_coins.name": "Ziegelsteine ziehen Münzen an",
"upgrades.bricks_attract_coins.tooltip": "Hilft ihnen, dort oben zu bleiben",
"upgrades.bricks_attract_coins.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)",
"upgrades.coin_magnet.help_plural": "Stärkere Wirkung auf die Münzen",
"upgrades.coin_magnet.name": "Magnet für Münzen",
"upgrades.coin_magnet.tooltip": "Paddel zieht Münzen an",
"upgrades.coin_magnet.verbose_description": "Lenkt die Münzen auf das Paddel. Der Effekt ist stärker, wenn die Münze bereits in der Nähe ist.",
"upgrades.compound_interest.name": "Zinseszins",
"upgrades.compound_interest.tooltip": "+{{lvl}} Combo pro zerbrochenem Stein, Rücksetzung bei verlorener Münze",
"upgrades.compound_interest.verbose_description": "Deine Combo wächst jedes Mal um eins, wenn du einen Stein zerbrichst, und bringt mit jedem Stein, den du zerbrichst, mehr und mehr Münzen hervor.\nAchten Sie jedoch darauf, jede dieser Münzen mit Ihrem Paddel aufzufangen, da jede verlorene Münze Ihre Combo zurücksetzt.\nSobald deine Kombo über dem Minimum liegt, wird der Boden des Spielfelds mit einer roten Linie markiert, um dich daran zu erinnern, dass die Münzen nicht dorthin gehören.",
"upgrades.concave_puck.name": "Konkaves Paddel",
"upgrades.concave_puck.tooltip": "Verbessert die vertikale Zielgenauigkeit",
"upgrades.concave_puck.verbose_description": "Die Bälle gehen zu Beginn des Levels gerade nach oben und prallen in einem geringeren Winkel ab.",
"upgrades.corner_shot.name": "Eckball",
"upgrades.corner_shot.tooltip": "Lässt Ihr Paddel mit den Rändern des Bildschirms überlappen",
"upgrades.corner_shot.verbose_description": "Hilft beim Zielen in den Kurven. Weitere Stufen lassen Sie weiter hinausgehen.",
"upgrades.etherealcoins.name": "Münzen, im Weltraum",
"upgrades.etherealcoins.tooltip": "Münzen werden nicht mehr von der Schwerkraft beeinflusst",
"upgrades.etherealcoins.verbose_description": "Die Münzen behalten ihre Geschwindigkeit auch nach mehreren Aufprallvorgängen bei und werden nicht mehr durch die Schwerkraft beeinflusst.",
"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.help_plural": "Dein (letzter) Ball wird auf dem Boden aufspringen, anstatt verloren zu gehen ({{lvl}} mal).",
"upgrades.extra_life.name": "Extraleben",
"upgrades.extra_life.tooltip": "Der Ball prallt einmal auf der unteren Linie auf, bevor er verloren ist.",
"upgrades.extra_life.verbose_description": "Normalerweise hat man nur einen Ball, und das Spiel ist vorbei, sobald man ihn fallen lässt.\n\nDieser Vorteil fügt eine weiße Leiste am unteren Rand des Bildschirms hinzu, die einen Ball einmal speichert und dabei zerbricht.\n\nJedes Mal, wenn ein Ball am unteren Rand des Bildschirms aufprallt, verlierst du eine Stufe dieses Vorteils.",
"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% ...",
"upgrades.fountain_toss.name": "Springbrunnen-Wurf",
"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.ghost_coins.name": "Geistermünzen",
"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.helium.name": "Helium",
"upgrades.helium.tooltip": "Umgekehrte Schwerkraft links und rechts des Paddels",
"upgrades.helium.verbose_description": "Dies wirkt sich auf die Münzen aus und lässt sie nach oben treiben, bis Sie bereit sind, sie aufzuheben.",
"upgrades.hot_start.name": "Heißer Start",
"upgrades.hot_start.tooltip": "Start bei Kombo {{start}}, -{{loss}} Kombo pro Sekunde",
"upgrades.hot_start.verbose_description": "Zu Beginn eines jeden Levels beginnt deine Kombo mit +30 Punkten, aber dann wird sie jede Sekunde um einen Punkt verringert. Der Effekt ist mit anderen Perks stapelbar.",
"upgrades.hypnosis.name": "Hypnose",
"upgrades.hypnosis.tooltip": "Immer wenn ein Ziegelstein seine Farbe ändert, teleportierst du diese Münze zur nächsten Kugel und lädst ihre Fähigkeit, einen Ziegelstein zu färben, wieder auf.",
"upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "Implosionen",
"upgrades.implosions.tooltip": "Explosionen saugen Münzen an, anstatt sie wegzublasen",
"upgrades.implosions.verbose_description": "Die Explosionskraft wird in die andere Richtung angewendet. Weitere Stufen wirken als \"größere Explosion\".",
"upgrades.instant_upgrade.name": "Sofortiges Upgrade",
"upgrades.instant_upgrade.tooltip": "+2 Aufwertung jetzt, -1 Wahl bis Spielende.",
"upgrades.instant_upgrade.verbose_description": "Wählen Sie sofort zwei Upgrades aus, so dass Sie ein kostenloses Upgrade erhalten und eines, mit dem Sie das Upgrade, mit dem Sie diese Vergünstigung erhalten haben, zurückzahlen. Bei jedem weiteren Menü zur Auswahl von Upgrades gibt es weniger Optionen zur Auswahl.",
"upgrades.left_is_lava.name": "Linke Seite meiden",
"upgrades.left_is_lava.tooltip": "+{{lvl}} Combo pro zerbrochenem Stein. Combo wird zurückgesetzt, wenn der Ball die linke Seite des Bildschirms trifft.",
"upgrades.left_is_lava.verbose_description": "Jedes Mal, wenn du einen Ziegelstein zerbrichst, erhöht sich deine Kombo um eins, so dass du von allen weiteren Ziegelsteinen, die du zerbrichst, eine Münze mehr bekommst.\n\nAllerdings wird deine Combo zurückgesetzt, sobald dein Ball die linke Seite trifft.\n\nSobald deine Combo ansteigt, wird die linke Seite rot, um dich daran zu erinnern, dass du es vermeiden solltest, sie zu treffen.\n",
"upgrades.limitless.name": "Grenzenlos",
"upgrades.limitless.tooltip": "Erhöhe die maximale Stufe aller Aufwertungen um {{lvl}} ",
"upgrades.limitless.verbose_description": "Durch die Wahl dieses Vorteils wird auch sein eigenes Limit um eins erhöht, so dass man es erneut wählen kann.",
"upgrades.metamorphosis.name": "Metamorphose",
"upgrades.metamorphosis.tooltip": "Jede Münze kann {{lvl}} Steine mit ihrer Farbe färben",
"upgrades.metamorphosis.verbose_description": "Mit diesem Vorteil haben die Münzen die Farbe des Ziegels, aus dem sie stammen, und färben den ersten Ziegel, den sie berühren, in derselben Farbe. Die Münzen spawnen mit der Geschwindigkeit des Balls, der sie zerbrochen hat, was bedeutet, dass du ein bisschen in die Richtung der Ziegelsteine zielen kannst, die du \"anmalen\" willst. Auf Stufe 1 kann jede Münze 1 Ziegelstein einfärben, bevor sie \"verbraucht\" wird und hohl erscheint.",
"upgrades.minefield.name": "Minenfeld",
"upgrades.minefield.tooltip": "+{{lvl}} Kombo pro Bombenstein auf dem Bildschirm",
"upgrades.minefield.verbose_description": "Fügt +lvl zur Combo hinzu, wenn ein Ziegelstein platziert wird, -lvl, wenn er zerstört wird, und erhöht die Basiskombo um die Anzahl der Ziegelsteine mal lvl",
"upgrades.multiball.name": "Multi-Ball",
"upgrades.multiball.tooltip": "Beginne jedes Level mit {{count}} Bällen.",
"upgrades.multiball.verbose_description": "Sobald du den Ball in Breakout 71 fallen lässt, hast du verloren.\n\nMit diesem Vorteil erhalten Sie zwei Bälle und können es sich daher leisten, einen zu verlieren.\n\nDie verlorenen Bälle kommen im nächsten Level zurück.\n\nWenn du mehr als einen Ball hast, stehen dir weitere Vergünstigungen zur Verfügung, und du kannst das Level natürlich schneller abschließen.",
"upgrades.nbricks.name": "Strenger Stichprobenumfang",
"upgrades.nbricks.tooltip": "Triff genau {{lvl}} Steine pro Paddle Bounce für +{{lvl}} Combo, sonst wird er zurückgesetzt",
"upgrades.nbricks.verbose_description": "Ihr müsst die Steine nicht unbedingt zerstören, aber ihr müsst sie treffen. Durch Explosionen zerstörte Ziegelsteine zählen nicht.",
"upgrades.one_more_choice.name": "Extra Auswahl",
"upgrades.one_more_choice.tooltip": "Weitere Stufenaufstiege bieten {{lvl}} weitere Option(en) in der Liste",
"upgrades.one_more_choice.verbose_description": "Jedes Upgrade-Menü wird eine weitere Option enthalten. Erhöht nicht die Anzahl der Upgrades, die Sie auswählen können.",
"upgrades.passive_income.name": "Passives Einkommen",
"upgrades.passive_income.tooltip": "+{{lvl}} Combo / Brick, es sei denn, das Paddel hat sich in den letzten {{time}}s bewegt, dann wird es stattdessen zurückgesetzt",
"upgrades.passive_income.verbose_description": "Einige Vergünstigungen können den Bällen helfen, das zu tun, was du willst, ohne dass du etwas tun musst.",
"upgrades.picky_eater.name": "Wählerischer Esser",
"upgrades.picky_eater.tooltip": "+{{lvl}} Combo pro zerbrochenem Stein, wird bei Farbwechsel des Balls zurückgesetzt",
"upgrades.picky_eater.verbose_description": "Jedes Mal, wenn du einen Stein der gleichen Farbe wie deine Kugel zerstörst, erhöht sich deine Kombination um eins.\nWenn es eine andere Farbe ist, nimmt der Ball diese neue Farbe an, aber die Kombination wird zurückgesetzt, es sei denn, es sind keine Steine in der Farbe des Balls übrig.\nSobald du eine höhere Kombination als das Minimum erreicht hast, werden die Steine der falschen Farbe rot umrandet.\nWenn du mehr als eine Kugel hast, wechseln sie alle die Farbe, sobald eine von ihnen einen Stein trifft.",
"upgrades.pierce.name": "Piercing",
"upgrades.pierce.tooltip": "Der Ball durchdringt {{count}} Steine nach einem Paddle Bounce",
"upgrades.pierce.verbose_description": "Der Ball prallt normalerweise ab, sobald er etwas berührt. Mit diesem Vorteil setzt er seine Flugbahn für bis zu 3 Ziegelsteine gebrochen fort.\n\nDanach prallt er am 4. Ziegelstein ab, und du musst das Paddel berühren, um den Zähler zurückzusetzen.",
"upgrades.pierce_color.name": "Farbe durchstechen",
"upgrades.pierce_color.tooltip": "+{{lvl}} Schaden an Steinen der Farbe der Kugel",
"upgrades.pierce_color.verbose_description": "Wenn ein Ball auf einen gleichfarbigen Stein trifft, geht er ungehindert durch.\n\nSobald er einen andersfarbigen Stein erreicht, zerbricht er ihn, nimmt seine Farbe an und springt auf.\n\nWenn du robuste Steine hast, kann es sein, dass der Ball trotzdem an einem gleichfarbigen Stein abprallt.",
"upgrades.puck_repulse_ball.help_plural": "Stärkere Abstoßungskraft",
"upgrades.puck_repulse_ball.name": "Weiche Landung",
"upgrades.puck_repulse_ball.tooltip": "Paddel stößt Bälle ab",
"upgrades.puck_repulse_ball.verbose_description": "Wenn ein Ball in die Nähe des Schlägers kommt, wird er langsamer und springt möglicherweise sogar, ohne den Schläger zu berühren.",
"upgrades.rainbow.name": "Regenbogen",
"upgrades.rainbow.tooltip": "Münzen spawnen in Regenbogenfarben.",
"upgrades.rainbow.verbose_description": "Mit jedem Level steigt der Anteil der farbigen Münzen. Die Farbe hängt von der Levelzeit ab.",
"upgrades.reach.name": "Von oben nach unten",
"upgrades.reach.tooltip": " Das Berühren der N Steine der untersten Reihe setzt die Kombo zurück. Andernfalls: +N Combo",
"upgrades.reach.verbose_description": "Wenn es nur eine Reihe von Steinen gibt, oder wenn die unterste Reihe von Steinen die gesamte Breite des Spiels abdeckt, dann bewirkt dieser Vorteil nichts. Andernfalls wird die Combo zurückgesetzt, wenn diese unterste Reihe zerstört wird, während alles andere die Combo um die Anzahl der Steine in dieser untersten Reihe erhöht.\n\nDie unterste Reihe wird in rot hervorgehoben.",
"upgrades.respawn.name": "Neu spawnen",
"upgrades.respawn.tooltip": "{{percent}}% der Steine spawnen nach {{delay}}s erneut.",
"upgrades.respawn.verbose_description": "Einige Partikeleffekte lassen Sie wissen, wo Ziegelsteine erscheinen werden.",
"upgrades.right_is_lava.name": "Vermeiden Sie die rechte Seite",
"upgrades.right_is_lava.tooltip": "+{{lvl}} Kombo pro Stein. Combo wird zurückgesetzt, wenn der Ball die rechte Seite des Bildschirms trifft.",
"upgrades.right_is_lava.verbose_description": "Jedes Mal, wenn du einen Ziegelstein zerbrichst, erhöht sich deine Kombo um eins, so dass du von allen weiteren Ziegelsteinen, die du zerbrichst, eine Münze mehr bekommst.\n\nAllerdings wird deine Kombo zurückgesetzt, sobald dein Ball die rechte Seite trifft.\n\nSobald deine Combo ansteigt, wird die rechte Seite rot, um dich daran zu erinnern, dass du es vermeiden solltest, sie zu treffen.\n",
"upgrades.sacrifice.help_l1": "Der Verlust eines Lebens löscht alle Steine",
"upgrades.sacrifice.help_over": "Der Verlust eines Lebens {{lvl}}x die Combo löscht dann alle Steine",
"upgrades.sacrifice.name": "Opfern Sie",
"upgrades.sacrifice.verbose_description": "Damit könnte die Kombination ziemlich hoch werden.",
"upgrades.sapper.help_plural": "Die ersten {{lvl}} Steine, die zerbrochen werden, werden zu Bomben.",
"upgrades.sapper.name": "Sapper",
"upgrades.sapper.tooltip": "Der erste zerbrochene Ziegelstein wird zu einer Bombe.",
"upgrades.sapper.verbose_description": "Anstatt einfach zu verschwinden, wird der erste Stein, den du zerbrichst, durch einen Bombenstein ersetzt. Wenn du den Ball auf dem Paddel abprallen lässt, wird der Effekt wieder aktiviert. Wenn Sie diese Fähigkeit aufwerten, können Sie mehr Bomben platzieren.",
"upgrades.shocks.name": "Schocks",
"upgrades.shocks.tooltip": "Kollisionen mit explosiven Kugeln",
"upgrades.shocks.verbose_description": "Wenn zwei Kugeln zusammenstoßen, tauschen sie ihre Geschwindigkeit aus, lösen eine Explosion aus und gewinnen an Geschwindigkeit, um sie zu trennen.",
"upgrades.shunt.name": "Shunt",
"upgrades.shunt.tooltip": "Behalte {{percent}}% deines Combos zwischen den Levels",
"upgrades.shunt.verbose_description": "Wenn Sie auch Heißstart haben, wird der Heißstart einfach zur aktuellen Kombination hinzugefügt.",
"upgrades.side_flip.name": "Rechtshändig",
"upgrades.side_flip.tooltip": "+{{lvl}} Combo pro von rechts gebrochenem Stein, sonst -{{loss}} ",
"upgrades.side_flip.verbose_description": "Triff den Ziegelstein auf der rechten Seite, um einen Combo zu erhalten, aber vermeide es, ihn auf der linken Seite zu treffen, da dies 2 Combo entfernen würde. Schläge von oben und unten haben keinen Effekt.",
"upgrades.side_kick.name": "Linkshändig",
"upgrades.side_kick.tooltip": "+{{lvl}} Combo pro von links gebrochenem Stein, sonst -{{loss}} ",
"upgrades.side_kick.verbose_description": "Triff den Ziegelstein auf der linken Seite, um einen Combo zu erhalten, aber vermeide es, ihn auf der rechten Seite zu treffen, da dies 2 Combo entfernen würde. Schläge von oben und unten haben keinen Effekt.",
"upgrades.skip_last.help_plural": "Die letzten {{lvl}} Steine werden explodieren.",
"upgrades.skip_last.name": "Einfaches Aufräumen",
"upgrades.skip_last.tooltip": "Der letzte Stein wird explodieren.",
"upgrades.skip_last.verbose_description": "Du musst alle Steine zerbrechen, um die nächste Ebene zu erreichen. Es kann jedoch schwierig sein, die letzten Steine zu bekommen.\n\nWenn du ein Level früh beendest, hast du zusätzliche Möglichkeiten, um aufzurüsten. Es ist auch sehr vorteilhaft, nie die Steine zu verpassen.\n\nWenn es dir also schwerfällt, die letzten Steine zu zerbrechen, kann es helfen, wenn du diesen Vorteil ein paar Mal bekommst.",
"upgrades.slow_down.name": "Langsamer Ball",
"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.smaller_puck.help_plural": "Noch kleineres Paddel und höhere Basis-Kombination",
"upgrades.smaller_puck.name": "Kleineres Paddel",
"upgrades.smaller_puck.tooltip": "Gibt auch +5 Basis-Kombo",
"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.soft_reset.name": "Weicher Reset",
"upgrades.soft_reset.tooltip": "Combo-Rückstellungen halten {{percent}}%",
"upgrades.soft_reset.verbose_description": "Begrenzen Sie die Auswirkungen eines Combo-Resets.",
"upgrades.streak_shots.name": "Glückssträhne",
"upgrades.streak_shots.tooltip": "Mehr Münzen, wenn du viele Steine zerbrichst, bevor du auf das Paddel springst.",
"upgrades.streak_shots.verbose_description": "Jedes Mal, wenn du einen Stein zerbrichst, erhöht sich dein Combo um eins.\n\nSobald der Ball jedoch Ihr Paddel berührt, wird die Kombination auf ihren Standardwert zurückgesetzt.\n\nSobald deine Kombo den Basiswert übersteigt, wird dein Paddel rot umrandet, um dich daran zu erinnern, dass es deine Kombo zerstört, wenn du es mit dem Ball berührst.",
"upgrades.sturdy_bricks.name": "Stabile Ziegel",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} Ziegel HP, +{{percent}}% Münzen, die beim Zerbrechen erzeugt werden",
"upgrades.sturdy_bricks.verbose_description": "Jede Stufe dieses Vorteils fügt allen Steinen einen HP hinzu. Du kannst die HP-Zahl mit der Perk \"Hellseher\" sehen. Du kannst den Schaden der Kugeln erhöhen, indem du den \"Piercing\"-Perk bekommst. Jede Stufe des Vorteils erhöht den Spawn von Münzen um 50 %.",
"upgrades.superhot.name": "SUPER HEISS",
"upgrades.superhot.tooltip": "Die Zeit bewegt sich, wenn sich das Paddel bewegt.",
"upgrades.superhot.verbose_description": "SUPERHEISS SUPERHEISS SUPERHEISS SUPERHEISS",
"upgrades.telekinesis.help_plural": "Stärkere Wirkung auf den Ball",
"upgrades.telekinesis.name": "Telekinese",
"upgrades.telekinesis.tooltip": "Das Paddel steuert die Flugbahn des Balls",
"upgrades.telekinesis.verbose_description": "Du kontrollierst den Ball, während er nach oben fliegt.",
"upgrades.top_is_lava.name": "Der Himmel ist die Grenze",
"upgrades.top_is_lava.tooltip": "+{{lvl}} Combo pro Stein, wird zurückgesetzt, wenn die Spitze getroffen wird",
"upgrades.top_is_lava.verbose_description": "Jedes Mal, wenn du einen Stein zerbrichst, erhöht sich deine Kombo um eins. Allerdings wird deine Kombo zurückgesetzt, sobald dein Ball den oberen Rand des Bildschirms trifft.\n\nWenn deine Kombo über dem Minimum liegt, erscheint oben ein roter Balken, der dich daran erinnert, dass du es vermeiden solltest, ihn zu treffen.",
"upgrades.trampoline.name": "Trampolin",
"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.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.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.tooltip": "Die Münzen erscheinen am oberen Rand des Bildschirms.",
"upgrades.trickledown.verbose_description": "Es könnte Ihnen helfen, ein paar Münzen zur Seite zu legen.",
"upgrades.unbounded.name": "Polsterung",
"upgrades.unbounded.tooltip": "Fügt links und rechts des Levels Platz hinzu, aber dein Paddel kann nicht so weit gehen.",
"upgrades.unbounded.verbose_description": "Ein weiteres Upgrade könnte Ihnen helfen, die Reichweite Ihres Paddels zu vergrößern.",
"upgrades.viscosity.name": "Viskosität",
"upgrades.viscosity.tooltip": "Langsamerer Münzfall",
"upgrades.viscosity.verbose_description": "Münzen beschleunigen normalerweise durch Schwerkraft und Explosionen auf ziemlich hohe Geschwindigkeiten.\n\nMit dieser Fähigkeit werden sie ständig langsamer, als ob sie sich in einer Art zähflüssiger Flüssigkeit befänden.\n\nDas macht es einfacher, sie zu fangen, und lässt sich gut mit Perks kombinieren, die die Bewegung der Münze beeinflussen.",
"upgrades.wind.help_plural": "Stärkere Windkraft",
"upgrades.wind.name": "WIND",
"upgrades.wind.tooltip": "Paddelstellung erzeugt Wind",
"upgrades.wind.verbose_description": "Der Wind hängt von der Paddelposition ab: links bläst links, rechts bläst rechts. Wirkt sich sowohl auf Bälle als auch auf Münzen aus.",
"upgrades.yoyo.name": "Yo-Yo",
"upgrades.yoyo.tooltip": "Ball fällt in Richtung Paddel",
"upgrades.yoyo.verbose_description": "Es ist das Gegenteil von Telekinese, den Ball zu kontrollieren, während er wieder nach unten fällt.",
"upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "+{{lvl}} Combo pro Ziegel, wird bei einer Explosion zurückgesetzt",
"upgrades.zen.verbose_description": "Schließlich handelt es sich um ein gewaltfreies Spiel."
}

View file

@ -1,13 +1,35 @@
{ {
"confirmRestart.no": "Cancel", "confirmRestart.no": "Cancel",
"confirmRestart.text": "You're about to start a new run, is that really what you wanted ?", "confirmRestart.text": "You're about to start a new game. Are you sure you want to continue?",
"confirmRestart.title": "Start a new run ?", "confirmRestart.title": "Start a new game?",
"confirmRestart.yes": "Restart game", "confirmRestart.yes": "Restart game",
"editor.editing.bigger": "Increase level size",
"editor.editing.color": "Pick a color in the color list (max 5 per level)",
"editor.editing.copy": "Copy level code",
"editor.editing.copy_help": "Paste it in the #levels channel in our discord",
"editor.editing.credit": "Credits and source",
"editor.editing.credit_prompt": "Enter the source url or explanation of your level.",
"editor.editing.delete": "Delete level",
"editor.editing.down": "Move down all the bricks",
"editor.editing.help": "Then click a tile to color it.",
"editor.editing.left": "Move all bricks to the left",
"editor.editing.play": "Play this level",
"editor.editing.rename": "Level name",
"editor.editing.rename_prompt": "Please enter a new name for the level",
"editor.editing.right": "Move all bricks to the right",
"editor.editing.smaller": "Decrease level size",
"editor.editing.title": "Editing level : {{name}}",
"editor.editing.up": "Move up all the bricks",
"editor.help": "Create custom levels and share them for inclusion in the game.",
"editor.import": "Import a level",
"editor.import_instruction": "Paste a level code to import it in your level list",
"editor.locked": "Reach a total score of {{min}} to unlock",
"editor.new_level": "New level",
"editor.title": "Level Editor",
"gameOver.creative": "This run will not be recorded. ",
"gameOver.cumulative_total": "Your total cumulative score went from {{startTs}} to {{endTs}}.", "gameOver.cumulative_total": "Your total cumulative score went from {{startTs}} to {{endTs}}.",
"gameOver.lost.summary": "You dropped the ball after catching {{score}} coins.", "gameOver.lost.summary": "You dropped the ball after catching {{score}} coins.",
"gameOver.lost.title": "Game Over", "gameOver.lost.title": "Game Over",
"gameOver.next_unlock": "Score {{points}} more points to reach the next unlock",
"gameOver.restart": "Start a new run",
"gameOver.stats.balls_lost": "Balls lost", "gameOver.stats.balls_lost": "Balls lost",
"gameOver.stats.bricks_broken": "Bricks broken", "gameOver.stats.bricks_broken": "Bricks broken",
"gameOver.stats.bricks_per_minute": "Bricks broken per minute", "gameOver.stats.bricks_per_minute": "Bricks broken per minute",
@ -16,251 +38,408 @@
"gameOver.stats.combo_max": "Max combo", "gameOver.stats.combo_max": "Max combo",
"gameOver.stats.duration_per_level": "Duration per level", "gameOver.stats.duration_per_level": "Duration per level",
"gameOver.stats.hit_rate": "Hit rate", "gameOver.stats.hit_rate": "Hit rate",
"gameOver.stats.intro": "Find below your run statistics compared to your {{count}} best runs.", "gameOver.stats.intro": "",
"gameOver.stats.level_reached": "Level reached", "gameOver.stats.level_reached": "Level reached",
"gameOver.stats.total_score": "Total score", "gameOver.stats.total_score": "Total score",
"gameOver.stats.upgrades_applied": "Upgrades applied", "gameOver.stats.upgrades_applied": "Upgrades applied",
"gameOver.test_run": "This test run and its score are not being recorded", "gameOver.stats_intro": "Find below your game statistics compared to your {{count}} best games.",
"gameOver.unlocked_count": "You unlocked {{count}} item(s) :", "gameOver.unlocked_perk": "Upgrade unlocked",
"gameOver.upgrades_picked": "Upgrades active at the end of the run", "gameOver.unlocked_perk_plural": "You just unlocked {{count}} perks",
"gameOver.win.summary": "You cleared all levels for this run, catching {{score}} coins in total.", "gameOver.win.summary": "This game is over. You stashed {{score}} coins. ",
"gameOver.win.title": "Run finished", "gameOver.win.title": "You completed this game",
"level_up.after_buttons": "You just finished level {{level}}/{{max}} and picked those upgrades so far :", "help.content": "## Goal\n\nCatch as many coins as possible during 7 levels. \nCoins appear when you break bricks.\nCatch them with your paddle to increase your score.\nYour score is displayed in the top right corner of the screen.\nDon't drop the ball or it's game over.\n\nAfter destroying all bricks, you'll get to pick an upgrade.\n\n## Upgrades \n\nThe upgrades you pick will apply until the end of the run. \nSome can be picked multiple times for stronger effect.\nSome help with aiming, or make the game easier in some other ways. \nSome are only useful when combined.\n\nYou always get one upgrade at the beginning of each game. \nIts icon will serve as the bricks of the first level. \nYou can select starting upgrades in the settings.\n\nMany upgrades impact your combo. \n\n## Combo\n\nYour \"combo\" is the number of coins spawned when a brick breaks. \nIt is displayed on your paddle, for example x4 means each brick will spawn 4 coins. \nMost upgrades that increase the combo also add a condition to reset it. \nThe combo will also reset if the ball returns to the paddle without hitting any brick.\nA \"miss\" message will be shown when that happens. \n\nTry to aim towards a brick every time. \n\n## Aiming\n\nOnly the ball position on the paddle decides how it will bounce.\nIf the ball hits the paddle dead center, it will bounce back up vertically. \nIf you hit more on one side, it will have more angle. \nThe paddle speed and incoming angle have no impact on the ball direction after bouncing.\n\nMany upgrades that help with aiming can be unlocked.\n\n## Unlocks\n\nWhen playing Breakout 71 for the first time, most upgrades and levels are locked. \nUpgrades are unlocked by simply playing and catching many coins. \nThe first levels are unlocked by reaching a high score.\nLater levels add a condition about which perks you can select. \n\nReach high scores is much easier when you get multiple upgrades after each level. \n\n## Re-rolls and free upgrades\n\nYou'll get an extra upgrade to pick when you play well : \n\n- Clear the level under {{levelTimeGood}} seconds\n- Hit the sides or top less than {{wallBouncedGood}} times\n- Catch {{catchRateGood}}% of coins\n- Miss the bricks less than {{missesGood}} times \n\nYou will also get a re-roll that lets you skip upgrades if you do even better : \n\n- Clear a level under {{levelTimeBest}} seconds\n- Hit the sides or top less than {{wallBouncedBest}} times\n- Catch {{catchRateBest}}% of coins\n- Miss the bricks less than {{missesBest}} times \n\nAn option in the settings lets you display those statistics",
"help.help": "Learn more about the game",
"help.levels": "Levels",
"help.title": "Help",
"help.upgrades": "## Upgrades",
"history.columns.score": "Score",
"history.columns.started": "Date",
"history.help": "See your {{count}} best games.",
"history.locked": "Play at least ten games to unlock",
"history.title": "Runs history",
"lab.help": "Try any build you want",
"lab.instructions": "Select upgrades below, then pick a level to play. ",
"lab.menu_entry": "Creative mode",
"lab.reset": "Reset all to 0",
"lab.select_level": "Select a level to play on",
"lab.unlocks_at": "Unlocks at total score {{score}}",
"level_up.after_buttons": "You just finished level {{level}}/{{max}}.",
"level_up.before_buttons": "You caught {{score}} coins {{catchGain}} out of {{levelSpawnedCoins}} in {{time}} seconds {{timeGain}}.\n\nYou missed {{levelMisses}} times {{missesGain}} and hit the walls or ceiling {{levelWallBounces}} times{{wallHitsGain}}.\n\n{{compliment}}", "level_up.before_buttons": "You caught {{score}} coins {{catchGain}} out of {{levelSpawnedCoins}} in {{time}} seconds {{timeGain}}.\n\nYou missed {{levelMisses}} times {{missesGain}} and hit the walls or ceiling {{levelWallBounces}} times{{wallHitsGain}}.\n\n{{compliment}}",
"level_up.compliment_advice": "Try to catch all coins, never miss the bricks, never hit the walls/ceiling or clear the level under 30s to gain additional choices and upgrades.", "level_up.compliment_advice": "Try to catch all coins, never miss the bricks, never hit the walls/ceiling or clear the level under 30s to gain additional upgrades.",
"level_up.compliment_good": "Well done !", "level_up.compliment_good": "Well done !",
"level_up.compliment_perfect": "Impressive, keep it up !", "level_up.compliment_perfect": "Impressive, keep it up !",
"level_up.pick_upgrade_title": "Pick an upgrade", "level_up.pick_upgrade_title": "Pick an upgrade",
"level_up.plus_one_choice": "(+1 choice)", "level_up.plus_one_upgrade": "(+1 upgrade)",
"level_up.plus_one_upgrade": "(+1 upgrade and choice)", "level_up.plus_one_upgrade_and_reroll": "(+1 upgrade and +1 re-roll)",
"level_up.unlocked_level": " (Level)", "level_up.reroll": "Re-roll ({{count}})",
"level_up.unlocked_perk": " (Perk)", "level_up.reroll_help": "Offer new choices",
"level_up.upgrade_perk_to_level": " lvl {{level}}", "level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "Basic graphics", "main_menu.basic": "",
"main_menu.basic_help": "Better performance.", "main_menu.basic_help": "",
"main_menu.download_save_file": "Download score and stats", "main_menu.colorful_coins": "",
"main_menu.download_save_file_help": "Get a save file", "main_menu.colorful_coins_help": "",
"main_menu.footer_html": "<p> \n<span>Made in France by <a href=\"https://lecaro.me\">Renan LE CARO</a>.</span> \n<a href=\"https://paypal.me/renanlecaro\" target=\"_blank\">Donate</a>\n<a href=\"https://discord.gg/DZSPqyJkwP\" target=\"_blank\">Discord</a>\n<a href=\"https://f-droid.org/en/packages/me.lecaro.breakout/\" target=\"_blank\">F-Droid</a>\n<a href=\"https://play.google.com/store/apps/details?id=me.lecaro.breakout\" target=\"_blank\">Google Play</a>\n<a href=\"https://renanlecaro.itch.io/breakout71\" target=\"_blank\">itch.io</a> \n<a href=\"https://gitlab.com/lecarore/breakout71\" target=\"_blank\">Gitlab</a>\n<a href=\"https://breakout.lecaro.me/\" target=\"_blank\">Web version</a>\n<a href=\"https://news.ycombinator.com/item?id=43183131\" target=\"_blank\">HackerNews</a>\n<a href=\"https://breakout.lecaro.me/privacy.html\" target=\"_blank\">Privacy Policy</a>\n<span>v.{{appVersion}}</span>\n</p>\n", "main_menu.comboIncreaseTexts": "",
"main_menu.fullscreen": "Fullscreen", "main_menu.comboIncreaseTexts_help": "",
"main_menu.fullscreen_exit": "Exit Fullscreen", "main_menu.contrast": "",
"main_menu.fullscreen_exit_help": "Might not work on some machines", "main_menu.contrast_help": "",
"main_menu.fullscreen_help": "Might not work on some machines", "main_menu.credit_levels": "",
"main_menu.kid": "Kids mode", "main_menu.donate": "You've played for {{hours}} hours",
"main_menu.kid_help": "Start future runs with \"slower ball\".", "main_menu.donate_help": "How about donating? You can hide this reminder in the settings. ",
"main_menu.language": "Language", "main_menu.donation_reminder": "",
"main_menu.language_help": "Choose the game's language", "main_menu.donation_reminder_help": "",
"main_menu.load_save_file": "Load save file", "main_menu.download_save_file": "",
"main_menu.load_save_file_help": "Select a save file on your device", "main_menu.download_save_file_help": "",
"main_menu.max_coins": " {{max}} coins on screen maximum", "main_menu.extra_bright": "",
"main_menu.max_coins_help": "Cosmetic only, no effect on score", "main_menu.extra_bright_help": "",
"main_menu.max_particles": " {{max}} particles maximum", "main_menu.fullscreen": "",
"main_menu.max_particles_help": "Limits the number of particles show on screen for visual effect. ", "main_menu.fullscreen_help": "",
"main_menu.mobile": "Mobile mode", "main_menu.help_content": "",
"main_menu.mobile_help": "Leaves space under the puck.", "main_menu.help_help": "",
"main_menu.pointer_lock": "Mouse pointer lock", "main_menu.help_title": "",
"main_menu.pointer_lock_help": "Locks and hides the mouse cursor.", "main_menu.help_upgrades": "",
"main_menu.record": "Record gameplay videos", "main_menu.high_score": "High score : {{score}}",
"main_menu.record_download": "Download video ({{size}} MB)", "main_menu.kid": "",
"main_menu.record_help": "Get a video of each level.", "main_menu.kid_help": "",
"main_menu.reset": "Reset Game", "main_menu.language": "",
"main_menu.reset_cancel": "No", "main_menu.language_help": "",
"main_menu.reset_confirm": "Yes", "main_menu.load_save_file": "",
"main_menu.reset_help": "Erase high score and statistics", "main_menu.load_save_file_help": "",
"main_menu.reset_instruction": "You will loose all progress you made in the game, are you sure ?", "main_menu.max_coins": "",
"main_menu.resume": "Resume", "main_menu.max_coins_help": "",
"main_menu.resume_help": "Return to your run", "main_menu.max_particles": "",
"main_menu.save_file_error": "Error loading save file", "main_menu.max_particles_help": "",
"main_menu.save_file_loaded": "Save file loaded", "main_menu.mobile": "",
"main_menu.save_file_loaded_help": "The app will now reload to apply your save", "main_menu.mobile_help": "",
"main_menu.save_file_loaded_ok": "Ok", "main_menu.normal": "New Game",
"main_menu.normal_help": "Play 7 levels with a random starting perk",
"main_menu.pointer_lock": "",
"main_menu.pointer_lock_help": "",
"main_menu.record": "",
"main_menu.record_download": "",
"main_menu.record_help": "",
"main_menu.red_miss": "",
"main_menu.red_miss_help": "",
"main_menu.reset": "",
"main_menu.reset_cancel": "",
"main_menu.reset_confirm": "",
"main_menu.reset_help": "",
"main_menu.reset_instruction": "",
"main_menu.save_file_error": "",
"main_menu.save_file_loaded": "",
"main_menu.save_file_loaded_help": "",
"main_menu.save_file_loaded_ok": "",
"main_menu.settings_help": "Tailor the game play to your needs and taste", "main_menu.settings_help": "Tailor the game play to your needs and taste",
"main_menu.settings_title": "Settings", "main_menu.settings_title": "Settings",
"main_menu.show_fps": "FPS counter", "main_menu.show_fps": "",
"main_menu.show_fps_help": "Monitor the app's performance", "main_menu.show_fps_help": "",
"main_menu.sounds": "Game sounds", "main_menu.show_stats": "",
"main_menu.sounds_help": "Can slow down some phones.", "main_menu.show_stats_help": "",
"main_menu.sounds": "",
"main_menu.sounds_help": "",
"main_menu.starting_perks": "",
"main_menu.starting_perks_checked": "",
"main_menu.starting_perks_full_random": "",
"main_menu.starting_perks_help": "",
"main_menu.starting_perks_unchecked": "",
"main_menu.title": "Breakout 71", "main_menu.title": "Breakout 71",
"main_menu.unlocks": "Starting perk", "main_menu.unlocks": "Unlocked content",
"main_menu.unlocks_help": "Try perks and levels you unlocked", "main_menu.unlocks_help": "Try perks and levels you unlocked",
"play.close_modale_window_tooltip": "close ", "play.close_modale_window_tooltip": "close ",
"play.current_lvl": "L{{level}}/{{max}}", "play.current_lvl": "Level {{level}}/{{max}}",
"play.menu_label": "menu", "play.menu_label": "menu",
"play.menu_tooltip": "Open main menu",
"play.missed_ball": "miss", "play.missed_ball": "miss",
"play.mobile_press_to_play": "Press and hold here to play", "play.mobile_press_to_play": "Press and hold here to play",
"sandbox.help": "Test any perk combination", "play.score_tooltip": "See your score, upgrades and more",
"sandbox.instructions": "Select perks below and press \"start run\" to try them out in a test run. Scores and stats are not recorded.", "play.stats.coins_catch_rate": "Coins catch rate",
"sandbox.start": "Start test run", "play.stats.levelMisses": "Missed shots, where you hit nothing",
"sandbox.title": "Sandbox mode", "play.stats.levelTime": "Level time",
"sandbox.unlocks_at": "Unlocks at total score {{score}}", "play.stats.levelWallBounces": "Wall bounces",
"score_panel.restart": "Restart", "score_panel.close_to_unlock": "Next level unlock :",
"score_panel.restart_help": "Start a brand new run", "score_panel.get_upgrades_to_unlock": "Get {{missingUpgrades}} and score {{points}} more points to unlock level \"{{level}}\"",
"score_panel.resume": "Resume", "score_panel.rerolls_count": "You have accumulated {{rerolls}} rerolls",
"score_panel.resume_help": "Return to your run", "score_panel.score_to_unlock": "Score {{points}} more points to unlock level \"{{level}}\"",
"score_panel.test_run": "This is a test run, score is not recorded permanently",
"score_panel.title": "{{score}} points at level {{level}}/{{max}} ", "score_panel.title": "{{score}} points at level {{level}}/{{max}} ",
"score_panel.upgrades_picked": "Upgrades picked so far : ", "score_panel.upcoming_levels": "Upcoming levels :",
"unlocks.greyed_out_help": "The greyed out ones can be unlocked by increasing your total score. The total score increases every time you score in game.", "score_panel.upgrades_picked": "Upgrades picked in this game run : ",
"unlocks.intro": "Your total score is {{ts}}. Below are all the upgrades and levels the games has to offer.", "settings.autoplay": "Auto play",
"unlocks.level_description": "A {{size}}x{{size}} level with {{bricks}} bricks", "settings.autoplay_help": "Start a session with random upgrades and a computer controlled paddle",
"unlocks.title": "You unlocked {{percentUnlock}}% of the game.", "settings.basic": "Basic graphics",
"unlocks.unlocks_at": "Unlocks at total score {{threshold}}.", "settings.basic_help": "Better performance.",
"upgrades.asceticism.fullHelp": "You'll need to store the coins somewhere while your combo climbs. ", "settings.colorful_coins": "Colorful coins",
"upgrades.asceticism.help": "+1 combo / brick, com resets on coin catch", "settings.colorful_coins_help": "Coins always spawn of the color of the brick",
"settings.comboIncreaseTexts": "Show +X in gold",
"settings.comboIncreaseTexts_help": "When the combo increase",
"settings.contrast": "High Contrast",
"settings.contrast_help": "More colorful and dark rendering",
"settings.donation_reminder": "Remind me to donate",
"settings.donation_reminder_help": "See time played and donation link in main menu",
"settings.download_save_file": "Download score and stats",
"settings.download_save_file_help": "Get a save file",
"settings.extra_bright": "Extra bright",
"settings.extra_bright_help": "Increases the size of the halo around coins and bricks.",
"settings.fullscreen": "Fullscreen",
"settings.fullscreen_help": "Game will try to go full screen before starting",
"settings.kid": "Kids mode",
"settings.kid_help": "Start future games with \"slower ball\".",
"settings.language": "Language",
"settings.language_help": "Choose the game's language",
"settings.load_save_file": "Load save file",
"settings.load_save_file_help": "Select a save file on your device",
"settings.max_coins": " {{max}} coins on screen maximum",
"settings.max_coins_help": "Cosmetic only, no effect on score",
"settings.mobile": "Mobile mode",
"settings.mobile_help": "Leaves space under the paddle.",
"settings.pointer_lock": "Mouse pointer lock",
"settings.pointer_lock_help": "Locks and hides the mouse cursor.",
"settings.precise_lighting": "Precise lighting",
"settings.precise_lighting_help": "Use a smaller grid for background light effect",
"settings.probabilistic_lighting": "Persistence of vision",
"settings.probabilistic_lighting_help": "Improve performance when there are more than 150 coins by reusing some of the light of the previous frame",
"settings.record": "Record gameplay videos",
"settings.record_download": "Download video ({{size}} MB)",
"settings.record_help": "Get a video of each level.",
"settings.red_miss": "Miss warning",
"settings.red_miss_help": "Show red particles around balls going down without a hit.",
"settings.reset": "Reset Game",
"settings.reset_cancel": "No",
"settings.reset_confirm": "Yes",
"settings.reset_help": "Erase high score, play time and statistics",
"settings.reset_instruction": "You will lose all progress you made in the game, are you sure?",
"settings.save_file_error": "Error loading save file",
"settings.save_file_loaded": "Save file loaded",
"settings.save_file_loaded_help": "The app will now reload to apply your save",
"settings.save_file_loaded_ok": "Ok",
"settings.show_fps": "FPS counter",
"settings.show_fps_help": "Monitor the app's performance",
"settings.show_stats": "Show real time stats",
"settings.show_stats_help": "Coins, time, bounces, misses",
"settings.smooth_lighting": "Smooth lighting",
"settings.smooth_lighting_help": "Blur the background light effects to make them look less square. Increases lag.",
"settings.sounds": "Game sounds",
"settings.sounds_help": "Beeps, bloops and brrrr",
"settings.stress_test": "Stress test",
"settings.stress_test_help": "Start a bot controlled game with a very high number of coins, to test the performance limits of your device.",
"starting_perks.checked": "When you start a new game, one of those perks will be given to you. Click a perk to exclude it. ",
"starting_perks.help": "Choose possible starting upgrades",
"starting_perks.random": "All benefits have been removed, the choice will be random.",
"starting_perks.title": "Starting perks",
"starting_perks.unchecked": "The perks below are not offered as starting perks, but you can click to add them to the pool. ",
"unlocks.greyed_out_help": "The grayed out upgrades can be unlocked by increasing your total score. The total score increases every time you score in game.",
"unlocks.intro": "Your total score is {{ts}}. Below are all the upgrades and levels the games has to offer. Click an upgrade or level below to start a test game with it.",
"unlocks.just_unlocked": "Level unlocked",
"unlocks.just_unlocked_plural": "You just unlocked {{count}} levels",
"unlocks.level": "<h2>You unlocked {{unlocked}} levels out of {{out_of}}</h2>\n<p>Here are all the game levels, click one to try it out.</p> ",
"unlocks.level_description": "A {{size}}x{{size}} level with {{bricks}} bricks, {{colors}} colors and {{bombs}} bombs.",
"unlocks.minScore": "Reach ${{minScore}} in a run to unlock.",
"unlocks.minScoreWithPerks": "Reach ${{minScore}} in a run with {{required}} but without {{forbidden}} to unlock.",
"unlocks.minTotalScore": "Accumulate a total of ${{score}}",
"unlocks.reached": "Your best score was {{reached}}.",
"unlocks.title_upgrades": "You unlocked {{unlocked}} upgrades out of {{out_of}}",
"upgrades.addiction.name": "Addiction",
"upgrades.addiction.tooltip": "+{{lvl}} combo / brick, combo resets {{delay}}s after breaking a brick. ",
"upgrades.addiction.verbose_description": "The countdown only starts after breaking the first brick of each level. It stops as soon as all bricks are destroyed.",
"upgrades.asceticism.name": "Asceticism", "upgrades.asceticism.name": "Asceticism",
"upgrades.ball_attract_ball.fullHelp": "Balls that are more than half a screen width away will start attracting each other. \n\nThe attraction force is stronger when they are furthest away from each other.\n\nRainbow particles will fly to symbolize the attraction force. This perk is only offered if you have more than one ball already.", "upgrades.asceticism.tooltip": "+{{combo}} combo / brick, - {{combo}} on coin catch",
"upgrades.ball_attract_ball.help": "Balls attract balls", "upgrades.asceticism.verbose_description": "You'll need to store the coins somewhere while your combo climbs. ",
"upgrades.ball_attract_ball.help_plural": "Stronger attraction force", "upgrades.ball_attract_ball.help_plural": "Stronger attraction force",
"upgrades.ball_attract_ball.name": "Gravity", "upgrades.ball_attract_ball.name": "Gravity",
"upgrades.ball_attracts_coins.fullHelp": "Don't ask me how that works", "upgrades.ball_attract_ball.tooltip": "Balls attract balls",
"upgrades.ball_attracts_coins.help": "Balls attract coins", "upgrades.ball_attract_ball.verbose_description": "Balls that are more than \"3/4 of the game area width\" away will start attracting each other. \n\nThe attraction force is stronger when they are furthest away from each other.\n\nRainbow particles will fly to symbolize the attraction force. This perk is only offered if you have more than one ball already.",
"upgrades.ball_attracts_coins.name": "Fortunate ball", "upgrades.ball_attracts_coins.name": "Balls attract coins",
"upgrades.ball_repulse_ball.fullHelp": "Balls that are less than half a screen width away will start repulsing each other. The repulsion force is stronger if they are close to each other. Particles will jet out to symbolize this force being applied. This perk is only offered if you have more than one ball already.", "upgrades.ball_attracts_coins.tooltip": "Coins follow the nearest ball and fall down slower",
"upgrades.ball_repulse_ball.help": "Balls repulse balls", "upgrades.ball_attracts_coins.verbose_description": "This could be used to \"paint around\" the balls with coins if you combined it with \"stain\" and \"ghost coins\". It also works as a substitute for coin magnet. ",
"upgrades.ball_repulse_ball.help_plural": "Stronger repulsion force", "upgrades.ball_repulse_ball.help_plural": "Stronger repulsion force",
"upgrades.ball_repulse_ball.name": "Personal space", "upgrades.ball_repulse_ball.name": "Personal space",
"upgrades.base_combo.fullHelp": "Your combo (number of coins per bricks) normally starts at 1 at the beginning of the level, and resets to one when you bounce around without hitting anything. With this perk, the combo starts 3 points higher, so you'll always get at least 4 coins per brick. Whenever your combo reset, it will go back to 4 and not 1. Your ball will glitter a bit to indicate that its combo is higher than one.", "upgrades.ball_repulse_ball.tooltip": "Balls repulse balls",
"upgrades.base_combo.help": "Combo starts at {{coins}}.", "upgrades.ball_repulse_ball.verbose_description": "Balls that are less than a quarter screen width away will start repulsing each other. The repulsion force is stronger if they are close to each other. Particles will jet out to symbolize this force being applied. This perk is only offered if you have more than one ball already.",
"upgrades.base_combo.name": "+3 base combo", "upgrades.base_combo.name": "Strong foundations",
"upgrades.bigger_explosions.fullHelp": "The default explosion clears a 3x3 square, with this it becomes a 5x5 square, and the blow on the coins is also significantly stronger. The screen will flash after each explosion (except in basic mode)", "upgrades.base_combo.tooltip": "Combo starts at {{coins}} instead of 1.",
"upgrades.bigger_explosions.help": "Bigger explosions", "upgrades.base_combo.verbose_description": "Your combo normally starts at 1 at the beginning of the level, and resets to 1 when you bounce around without hitting anything. With this perk, the combo starts 3 points higher, so you'll always get at least 4 coins per brick. Whenever your combo reset, it will go back to 4 and not 1. Your ball will glitter a bit to indicate that its combo is higher than one.",
"upgrades.bigger_explosions.name": "Kaboom", "upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_puck.fullHelp": "A bigger puck makes it easier to never miss the ball and to catch more coins, and also to precisely angle the bounces (the ball's angle only depends on where it hits the puck). \n However, a large puck is harder to use around the sides of the level, and will make it sometimes unavoidable to miss (not hit anything) which comes with downsides. ", "upgrades.bigger_explosions.tooltip": "Bigger explosions",
"upgrades.bigger_puck.help": "Easily catch more coins.", "upgrades.bigger_explosions.verbose_description": "The default explosion clears a 3x3 square, with this it becomes a 5x5 square, and the blow on the coins is also significantly stronger. The screen will flash after each explosion (except in basic mode)",
"upgrades.bigger_puck.name": "Bigger puck", "upgrades.bigger_puck.name": "Bigger paddle",
"upgrades.coin_magnet.fullHelp": "Directs the coins to the puck. The effect is stronger if the coin is close to it already. Catching 90% or 100% of coins bring special bonuses in the game. \n\nAnother way to catch more coins is to hit bricks from the bottom. The ball's speed and direction impacts the spawned coin's velocity. ", "upgrades.bigger_puck.tooltip": "Easily catch more coins.",
"upgrades.coin_magnet.help": "Puck attracts coins", "upgrades.bigger_puck.verbose_description": "A bigger paddle makes it easier to never miss the ball and to catch more coins, and also to precisely angle the bounces (the ball's angle only depends on where it hits the paddle). ",
"upgrades.bricks_attract_ball.name": "Bricks attract balls",
"upgrades.bricks_attract_ball.tooltip": "Ball goes toward the first {{count}} bricks it will hit.",
"upgrades.bricks_attract_ball.verbose_description": "The effect is stronger at higher levels. The number of bricks that can hit before the effect stops is also higher. The effect rearms when the ball hits the puck.",
"upgrades.bricks_attract_coins.name": "Bricks attract coins",
"upgrades.bricks_attract_coins.tooltip": "Helps them stay up there",
"upgrades.bricks_attract_coins.verbose_description": "",
"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)",
"upgrades.coin_magnet.help_plural": "Stronger effect on the coins", "upgrades.coin_magnet.help_plural": "Stronger effect on the coins",
"upgrades.coin_magnet.name": "Coins magnet", "upgrades.coin_magnet.name": "Coins magnet",
"upgrades.compound_interest.fullHelp": "Your combo will grow by one every time you break a brick, spawning more and more coin with every brick you break. \n\nBe sure however to catch every one of those coins with your puck, as any lost coin will reset your combo. \n\nOnce your combo is above the minimum, the bottom of the play area will have a red line to remind you that coins should not go there.\n\nThis perk combines with other combo perks, the combo will rise faster but reset more easily.", "upgrades.coin_magnet.tooltip": "Paddle attracts coins",
"upgrades.compound_interest.help": "+1 combo per brick broken, resets on coin lost", "upgrades.coin_magnet.verbose_description": "Directs the coins to the paddle. The effect is stronger if the coin is close to it already.",
"upgrades.compound_interest.name": "Compound interest", "upgrades.compound_interest.name": "Compound interest",
"upgrades.concave_puck.fullHelp": "Balls starts the level going straight up, and bounces with less angle.", "upgrades.compound_interest.tooltip": "+{{lvl}} combo per brick broken, resets on coin lost",
"upgrades.concave_puck.help": " Helps with aiming straight up", "upgrades.compound_interest.verbose_description": "Your combo will grow by one every time you break a brick, spawning more and more coin with every brick you break. \nBe sure however to catch every one of those coins with your paddle, as any lost coin will reset your combo.\nOnce your combo is above the minimum, the bottom of the play area will have a red line to remind you that coins should not go there.",
"upgrades.concave_puck.name": "Concave puck", "upgrades.concave_puck.name": "Concave paddle",
"upgrades.etherealcoins.fullHelp": "You'll have to make sure that the coins fall down somehow", "upgrades.concave_puck.tooltip": "Improves vertical aiming precision",
"upgrades.etherealcoins.help": "Coins are no longer affected by gravity", "upgrades.concave_puck.verbose_description": "Balls starts the level going straight up, and bounces with less angle.",
"upgrades.corner_shot.name": "Corner shot",
"upgrades.corner_shot.tooltip": "Lets your paddle overlap with the borders of the screen",
"upgrades.corner_shot.verbose_description": "Helps with aiming in the corners. Further levels let you go further out. ",
"upgrades.etherealcoins.name": "Coins, in Space", "upgrades.etherealcoins.name": "Coins, in Space",
"upgrades.extra_levels.fullHelp": "The default run can last a max of 7 levels, after which the game is over and whatever score you reached is your run score. \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.etherealcoins.tooltip": "Coins are no longer affected by gravity",
"upgrades.extra_levels.help": "Play {{count}} levels instead of 7", "upgrades.etherealcoins.verbose_description": "The coins will maintain their speed even after several bounces, and will no longer be affected by gravity.",
"upgrades.extra_levels.name": "+1 level", "upgrades.extra_levels.name": "5 min more",
"upgrades.extra_life.fullHelp": "Normally, you have one ball per run, and the run is over as soon as you drop it.\n\nThis perk adds a white bar at the bottom of the screen that will save a ball once, and break in the process. \n\nYou'll loose one level of that perk every time a ball bounces at the bottom of the screen.", "upgrades.extra_levels.tooltip": "Play {{count}} levels instead of 7",
"upgrades.extra_life.help": "The ball will bounce once on the bottom line before being lost.", "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.help_plural": "The ball will bounce on the bottom {{lvl}} times before being lost.", "upgrades.extra_life.help_plural": "Your (last) ball will bounce on the bottom instead of being lost ({{lvl}} times).",
"upgrades.extra_life.name": "+1 life", "upgrades.extra_life.name": "Extra Life",
"upgrades.forgiving.fullHelp": "The first miss per level is free, then 10% of the combo, then 20% .. ", "upgrades.extra_life.tooltip": "The ball will bounce once on the bottom line before being lost.",
"upgrades.forgiving.help": "Missing breaks reduces combo progressively instead of all at once.", "upgrades.extra_life.verbose_description": "Normally, you have one ball, and the game is over as soon as you drop it.\n\nThis perk adds a white bar at the bottom of the screen that will save a ball once, and break in the process. \n\nYou'll lose one level of that perk every time a ball bounces at the bottom of the screen.",
"upgrades.forgiving.name": "Forgiving", "upgrades.forgiving.name": "Forgiving",
"upgrades.ghost_coins.fullHelp": "It's not a bug, it's a feature ! ", "upgrades.forgiving.tooltip": "Missing breaks reduces combo progressively instead of all at once.",
"upgrades.ghost_coins.help": "Coins pass through bricks", "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.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.ghost_coins.name": "Ghost coins", "upgrades.ghost_coins.name": "Ghost coins",
"upgrades.helium.fullHelp": "This affects the coins and will let the float up until you are ready to pick them up.", "upgrades.ghost_coins.tooltip": "Coins slowly pass through bricks",
"upgrades.helium.help": "Gravity reversed left and right of puck", "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.helium.name": "Helium", "upgrades.helium.name": "Helium",
"upgrades.hot_start.fullHelp": "At the start of every level, your combo will start at +15 points, but then every second it will be decreased by one.\n\nThis means the first 15 seconds in a level will spawn many more coins than the following ones, and you should make sure that you clear the level quickly. \n\nThe effect stacks with other combo related perks, so you might be able to raise the combo after the 15s timeout, but it will keep ticking down. \n\nEvery time you take the perk again, the effect will be more dramatic.", "upgrades.helium.tooltip": "Gravity reversed left and right of paddle",
"upgrades.hot_start.help": "Start at combo {{start}}, -{{lvl}} combo per second", "upgrades.helium.verbose_description": "This affects the coins and will let the float up until you are ready to pick them up.",
"upgrades.hot_start.name": "Hot start", "upgrades.hot_start.name": "Hot start",
"upgrades.instant_upgrade.fullHelp": "Immediately pick two upgrades, so that you get one free one and one to repay the one used to get this perk. Every further menu to pick upgrades will have fewer options to choose from.", "upgrades.hot_start.tooltip": "Start at combo {{start}}, -{{loss}} combo per second",
"upgrades.instant_upgrade.help": "-1 choice until run end.", "upgrades.hot_start.verbose_description": "At the start of every level, your combo will start at +30 points, but then every second it will be decreased by one. The effect stacks with other perks. ",
"upgrades.instant_upgrade.name": "+2 upgrades now", "upgrades.hypnosis.name": "Hypnosis",
"upgrades.left_is_lava.fullHelp": "Whenever you break a brick, your combo will increase by one, so you'll get one more coin from all the next bricks you break.\n\nHowever, your combo will reset as soon as your ball hits the left side . \n\nAs soon as your combo rises, the left side becomes red to remind you that you should avoid hitting them. \n\nThe effect stacks with other combo perks, combo rises faster with more upgrades but will also reset if any of the reset conditions are met.", "upgrades.hypnosis.tooltip": "Whenever a brick changes color, teleport that coin to the nearest ball and recharge its ability to stain a brick. ",
"upgrades.left_is_lava.help": "+1 combo per brick broken, resets on left side hit", "upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "Implosions",
"upgrades.implosions.tooltip": "Explosions suck coins in instead of blowing them out",
"upgrades.implosions.verbose_description": "The explosion force is applied the other way. Further levels act as \"bigger explosion\"",
"upgrades.instant_upgrade.name": "Instant upgrade",
"upgrades.instant_upgrade.tooltip": "+2 upgrade now, -1 choice until game end.",
"upgrades.instant_upgrade.verbose_description": "Immediately pick two upgrades, so that you get one free one and one to repay the one used to get this perk. Every further menu to pick upgrades will have fewer options to choose from.",
"upgrades.left_is_lava.name": "Avoid left side", "upgrades.left_is_lava.name": "Avoid left side",
"upgrades.metamorphosis.fullHelp": "With this perk, coins will be of the color of the brick they come from, and will color the first brick they touch in the same color. Coins spawn with the speed of the ball that broke them, which means you can aim a bit in the direction of the bricks you want to \"paint\".", "upgrades.left_is_lava.tooltip": "+{{lvl}} combo per brick broken. Combo resets if ball hits the left side of the screen",
"upgrades.metamorphosis.help": "Coins stain the bricks they touch", "upgrades.left_is_lava.verbose_description": "Whenever you break a brick, your combo will increase by one, so you'll get one more coin from all the next bricks you break.\n\nHowever, your combo will reset as soon as your ball hits the left side . \n\nAs soon as your combo rises, the left side becomes red to remind you that you should avoid hitting them. \n",
"upgrades.limitless.name": "Limitless",
"upgrades.limitless.tooltip": "Raise all upgrade's maximum level by {{lvl}} ",
"upgrades.limitless.verbose_description": "Choosing this perk also raises his own limit by one, letting you pick it again.",
"upgrades.metamorphosis.name": "Metamorphosis", "upgrades.metamorphosis.name": "Metamorphosis",
"upgrades.multiball.fullHelp": "As soon as you drop the ball in Breakout 71, you loose. \n\nWith this perk, you get two balls, and so you can afford to lose one. \n\nThe lost balls come back on the next level. \n\nHaving more than one balls makes some further perks available, and of course clears the level faster.", "upgrades.metamorphosis.tooltip": "Each coin can stain {{lvl}} brick(s) with its color",
"upgrades.multiball.help": "Start every levels with {{count}} balls.", "upgrades.metamorphosis.verbose_description": "With this perk, coins will be of the color of the brick they come from, and will color the first brick they touch in the same color. Coins spawn with the speed of the ball that broke them, which means you can aim a bit in the direction of the bricks you want to \"paint\". At level 1, each coin can color 1 bricks before it is \"spent\" and appears hollow. ",
"upgrades.multiball.name": "+1 ball", "upgrades.minefield.name": "Minefield",
"upgrades.nbricks.fullHelp": "You don't necessarily need to destroy those bricks, but you need to hit them. Bricks destroyed by explosions don't count", "upgrades.minefield.tooltip": "+{{lvl}} combo per bomb brick on screen",
"upgrades.nbricks.help": "Hit exactly {{lvl}} bricks per puck bounce for +{{lvl}} combo, otherwise it resets", "upgrades.minefield.verbose_description": "Adds +lvl to the combo when a brick is place, -lvl when it is destroyed, and raises the base combo by the number of bricks times lvl",
"upgrades.multiball.name": "Multi ball",
"upgrades.multiball.tooltip": "Start every levels with {{count}} balls.",
"upgrades.multiball.verbose_description": "As soon as you drop the ball in Breakout 71, you lose. \n\nWith this perk, you get two balls, and so you can afford to lose one. \n\nThe lost balls come back on the next level. \n\nHaving more than one balls makes some further perks available, and of course clears the level faster.",
"upgrades.nbricks.name": "Strict sample size", "upgrades.nbricks.name": "Strict sample size",
"upgrades.one_more_choice.fullHelp": "Every upgrade menu will have one more option. Doesn't increase the number of upgrades you can pick.", "upgrades.nbricks.tooltip": "Hit exactly {{lvl}} bricks per paddle bounce for +{{lvl}} combo, otherwise it resets",
"upgrades.one_more_choice.help": "Further level ups will offer one more option in the list", "upgrades.nbricks.verbose_description": "You don't necessarily need to destroy those bricks, but you need to hit them. Bricks destroyed by explosions don't count",
"upgrades.one_more_choice.name": "+1 choice until run end", "upgrades.one_more_choice.name": "Extra choice",
"upgrades.passive_income.fullHelp": "Some perks can help the balls do what you want without needing to do anything.", "upgrades.one_more_choice.tooltip": "Further level ups will offer {{lvl}} more option(s) in the list",
"upgrades.passive_income.help": "+1 combo / brick, combo resets when puck moves", "upgrades.one_more_choice.verbose_description": "Every upgrade menu will have one more option. Doesn't increase the number of upgrades you can pick.",
"upgrades.passive_income.name": "Passive income", "upgrades.passive_income.name": "Passive income",
"upgrades.picky_eater.fullHelp": "Whenever you break a brick the same color as your ball, your combo increases by one. \nIf it's a different color, the ball takes that new color, but the combo resets.\nThe bricks with the right color will get a white border. \nOnce you get a combo higher than your minimum, the bricks of the wrong color will get a red halo. \nIf you have more than one ball, they all change color whenever one of them hits a brick.", "upgrades.passive_income.tooltip": "+{{lvl}} combo / brick, unless the paddle moved in the last {{time}}s, then it resets instead",
"upgrades.picky_eater.help": "+1 combo per brick broken, resets on ball color change", "upgrades.passive_income.verbose_description": "Some perks can help the balls do what you want without needing to do anything.",
"upgrades.picky_eater.name": "Picky eater", "upgrades.picky_eater.name": "Picky eater",
"upgrades.pierce.fullHelp": "The ball normally bounces as soon as it touches something. With this perk, it will continue its trajectory for up to 3 bricks broken. \nAfter that, it will bounce on the 4th brick, and you'll need to touch the puck to reset the counter.", "upgrades.picky_eater.tooltip": "+{{lvl}} combo per brick broken, resets on ball color change",
"upgrades.pierce.help": "Ball pierces {{count}} bricks after a puck bounce", "upgrades.picky_eater.verbose_description": "Whenever you break a brick the same color as your ball, your combo increases by one. \nIf it's a different color, the ball takes that new color, but the combo resets, unless there were no bricks left of the ball's color. \nOnce you get a combo higher than your minimum, the bricks of the wrong color will get a red border. \nIf you have more than one ball, they all switch color whenever one of them hits a brick.",
"upgrades.pierce.name": "Piercing", "upgrades.pierce.name": "Piercing",
"upgrades.pierce_color.fullHelp": "Whenever a ball hits a brick of the same color, it will just go through unimpeded. \nOnce it reaches a brick of a different color, it will break it, take its color and bounce.", "upgrades.pierce.tooltip": "Ball pierces {{count}} bricks after a paddle bounce",
"upgrades.pierce_color.help": "Balls pierce bricks of their color", "upgrades.pierce.verbose_description": "The ball normally bounces as soon as it touches something. With this perk, it will continue its trajectory for up to 3 bricks broken. \n\nAfter that, it will bounce on the 4th brick, and you'll need to touch the paddle to reset the counter.",
"upgrades.pierce_color.name": "Color pierce", "upgrades.pierce_color.name": "Color pierce",
"upgrades.puck_repulse_ball.fullHelp": "When a ball gets close to the puck, it will start slowing down, and even potentially bouncing without touching the puck.", "upgrades.pierce_color.tooltip": "+{{lvl}} damage to bricks of the ball's color",
"upgrades.puck_repulse_ball.help": "Puck repulses balls", "upgrades.pierce_color.verbose_description": "Whenever a ball hits a brick of the same color, it will just go through unimpeded. \n\nOnce it reaches a brick of a different color, it will break it, take its color and bounce.\n\nIf you have sturdy bricks, the ball might still bounce off a brick of the same color.",
"upgrades.puck_repulse_ball.help_plural": "Stronger repulsion force", "upgrades.puck_repulse_ball.help_plural": "Stronger repulsion force",
"upgrades.puck_repulse_ball.name": "Soft landing", "upgrades.puck_repulse_ball.name": "Soft landing",
"upgrades.reach.fullHelp": "Try to lock the ball up to earn more combo", "upgrades.puck_repulse_ball.tooltip": "Paddle repulses balls",
"upgrades.reach.help": "+{{lvl}} combo / bricks , lowest brick of a pile resets combo", "upgrades.puck_repulse_ball.verbose_description": "When a ball gets close to the paddle, it will start slowing down, and even potentially bouncing without touching the paddle.",
"upgrades.rainbow.name": "Rainbow",
"upgrades.rainbow.tooltip": "Coins spawn with rainbow color.",
"upgrades.rainbow.verbose_description": "Each level increases the proportion of colored coins. The color depends on level time. ",
"upgrades.reach.name": "Top down", "upgrades.reach.name": "Top down",
"upgrades.respawn.fullHelp": "After breaking two or more bricks, when the ball hits the puck, the first brick will be put back in place, provided that space is free and the brick wasn't a bomb.\n\nSome particle effect will let you know where bricks will appear. Leveling this up lets you re-spawn up to 4 bricks at a time, but there should always be at least one destroyed.", "upgrades.reach.tooltip": " Touching the N bricks of the lowest row resets the combo. Otherwise, +N combo",
"upgrades.respawn.help": "The first brick hit of two+ will re-spawn", "upgrades.reach.verbose_description": "If there is only one row of bricks, or if the lowest row of bricks cover the whole width of the game, then this perk does nothing. Otherwise, breaking this lowest row resets the combo, while breaking anything else increases the combo by the number of bricks present on that lowest row. \n\nThe lowest row will be highlighted in red. ",
"upgrades.respawn.help_plural": "More bricks can re-spawn",
"upgrades.respawn.name": "Re-spawn", "upgrades.respawn.name": "Re-spawn",
"upgrades.right_is_lava.fullHelp": "Whenever you break a brick, your combo will increase by one, so you'll get one more coin from all the next bricks you break.\n\nHowever, your combo will reset as soon as your ball hits the right side . \n\nAs soon as your combo rises, the right side becomes red to remind you that you should avoid hitting them\n\nThe effect stacks with other combo perks, combo rises faster with more upgrades but will also reset if any\nof the reset conditions are met.", "upgrades.respawn.tooltip": "{{percent}}% of bricks re-spawn after {{delay}}s.",
"upgrades.right_is_lava.help": "+1 combo per brick broken, resets on right side hit", "upgrades.respawn.verbose_description": "Some particle effect will let you know where bricks will appear. ",
"upgrades.right_is_lava.name": "Avoid right side", "upgrades.right_is_lava.name": "Avoid right side",
"upgrades.sacrifice.fullHelp": "This is made visual when possible, otherwise it's just going to update their score value", "upgrades.right_is_lava.tooltip": "+{{lvl}} combo per brick. Combo resets if ball hits the right side of the screen",
"upgrades.sacrifice.help": "Loosing a life doubles the value of each coin on screen", "upgrades.right_is_lava.verbose_description": "Whenever you break a brick, your combo will increase by one, so you'll get one more coin from all the next bricks you break.\n\nHowever, your combo will reset as soon as your ball hits the right side. \n\nAs soon as your combo rises, the right side becomes red to remind you that you should avoid hitting them.\n",
"upgrades.sacrifice.help_l1": "Loosing a life clears all bricks",
"upgrades.sacrifice.help_over": "Loosing a life {{lvl}}x the combo then clears all bricks",
"upgrades.sacrifice.name": "Sacrifice", "upgrades.sacrifice.name": "Sacrifice",
"upgrades.sapper.fullHelp": "Instead of just disappearing, the first brick you break will be replaced by a bomb brick. \n\nBouncing the ball on the puck re-arms the effect. \n\nLeveling-up this perk will allow you to place more bombs.\n\nRemember that bombs impact the velocity of nearby coins, so too many explosions could make it hard to catch the fruits of your hard work.", "upgrades.sacrifice.verbose_description": "This might get the combo pretty high.",
"upgrades.sapper.help": "The first brick broken becomes a bomb.",
"upgrades.sapper.help_plural": "The first {{lvl}} bricks broken become bombs.", "upgrades.sapper.help_plural": "The first {{lvl}} bricks broken become bombs.",
"upgrades.sapper.name": "Sapper", "upgrades.sapper.name": "Sapper",
"upgrades.shocks.fullHelp": "That would spice up the game of pool", "upgrades.sapper.tooltip": "The first brick broken becomes a bomb.",
"upgrades.shocks.help": "Explosive balls collisions", "upgrades.sapper.verbose_description": "Instead of just disappearing, the first brick you break will be replaced by a bomb brick. Bouncing the ball on the paddle re-arms the effect. Leveling-up this perk will allow you to place more bombs.",
"upgrades.shocks.name": "Shocks", "upgrades.shocks.name": "Shocks",
"upgrades.shunt.fullHelp": "If you also have hot start, the hot start is just added to the current combo", "upgrades.shocks.tooltip": "Explosive balls collisions",
"upgrades.shunt.help": "Keep {{percent}}% of your combo between levels", "upgrades.shocks.verbose_description": "Whenever two balls collide, they exchange their speed, spawn an explosion, and gain added speed to separate them. ",
"upgrades.shunt.name": "Shunt", "upgrades.shunt.name": "Shunt",
"upgrades.skip_last.fullHelp": "You need to break all bricks to go to the next level. However, it can be hard to get the last ones. \n\nClearing a level early brings extra choices when upgrading. Never missing the bricks is also very beneficial. \n\nSo if you find it difficult to break the last bricks, getting this perk a few time can help.", "upgrades.shunt.tooltip": "Keep {{percent}}% of your combo between levels",
"upgrades.skip_last.help": "The last brick will explode.", "upgrades.shunt.verbose_description": "If you also have hot start, the hot start is just added to the current combo",
"upgrades.side_flip.name": "Right handed",
"upgrades.side_flip.tooltip": "+{{lvl}} combo per brick broken from the right, -{{loss}} otherwise",
"upgrades.side_flip.verbose_description": "Impact the brick on its right side to gain one combo, but avoid hitting it on the left side as the would remove 2 combo. Hitting from the top and bottom has no effect. ",
"upgrades.side_kick.name": "Left handed",
"upgrades.side_kick.tooltip": "+{{lvl}} combo per brick broken from the left, -{{loss}} otherwise",
"upgrades.side_kick.verbose_description": "Impact the brick on its left side to gain one combo, but avoid hitting it on the right side as the would remove 2 combo. Hitting from the top and bottom has no effect. ",
"upgrades.skip_last.help_plural": "The last {{lvl}} bricks will explode.", "upgrades.skip_last.help_plural": "The last {{lvl}} bricks will explode.",
"upgrades.skip_last.name": "Easy Cleanup", "upgrades.skip_last.name": "Easy Cleanup",
"upgrades.slow_down.fullHelp": "The ball starts relatively slow, but every level of your run 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.skip_last.tooltip": "The last brick will explode.",
"upgrades.slow_down.help": "Ball moves more slowly", "upgrades.skip_last.verbose_description": "You need to break all bricks to go to the next level. However, it can be hard to get the last ones. \n\nClearing a level early brings extra choices when upgrading. Never missing the bricks is also very beneficial. \n\nSo if you find it difficult to break the last bricks, getting this perk a few time can help.",
"upgrades.slow_down.name": "Slower ball", "upgrades.slow_down.name": "Slower ball",
"upgrades.smaller_puck.fullHelp": "This makes the puck 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.slow_down.tooltip": "Ball moves more slowly",
"upgrades.smaller_puck.help": "Also gives +5 base combo", "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 puck and higher base combo", "upgrades.smaller_puck.help_plural": "Even smaller paddle and higher base combo",
"upgrades.smaller_puck.name": "Smaller puck", "upgrades.smaller_puck.name": "Smaller paddle",
"upgrades.soft_reset.fullHelp": "Limit the impact of a combo reset.", "upgrades.smaller_puck.tooltip": "Also gives +5 base combo",
"upgrades.soft_reset.help": "Combo resets keeps {{percent}}%", "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.soft_reset.name": "Soft reset", "upgrades.soft_reset.name": "Soft reset",
"upgrades.streak_shots.fullHelp": "Every time you break a brick, your combo (number of coins per bricks) increases by one. \n\nHowever, as soon as the ball touches your puck, the combo is reset to its default value, and you'll just get one coin per brick.\n\nOnce your combo rises above the base value, your puck will become red to remind you that it will destroy your combo to touch it with the ball.\n\nThis can stack with other combo related perks, the combo will rise faster but reset more easily as any of the conditions is enough to reset it. ", "upgrades.soft_reset.tooltip": "Combo resets keeps {{percent}}%",
"upgrades.streak_shots.help": "More coins if you break many bricks at once.", "upgrades.soft_reset.verbose_description": "Limit the impact of a combo reset.",
"upgrades.streak_shots.name": "Single puck hit streak", "upgrades.streak_shots.name": "Hit streak",
"upgrades.sturdy_bricks.fullHelp": "With level one of this perk, the ball has a 20% chance to bounce harmlessly on bricks, \n but generates 10% more coins when it does break one. \n This +10% is not shown in the combo number. At level 4 the ball has 80% chance of bouncing and brings 40% more coins.", "upgrades.streak_shots.tooltip": "More coins if you break many bricks before bouncing on the paddle.",
"upgrades.sturdy_bricks.help": "Bricks sometimes resist hits but drop more coins.", "upgrades.streak_shots.verbose_description": "Every time you break a brick, your combo increases by one. \n\nHowever, as soon as the ball touches your paddle, the combo is reset to its default value.\n\nOnce your combo rises above the base value, your paddle will have a red border to remind you that it will destroy your combo to touch it with the ball.",
"upgrades.sturdy_bricks.help_plural": "Bricks resist more and drop more coins",
"upgrades.sturdy_bricks.name": "Sturdy bricks", "upgrades.sturdy_bricks.name": "Sturdy bricks",
"upgrades.telekinesis.fullHelp": "Right after the ball hits your puck, you'll be able to direct it left and right by moving your puck. \n\n\nThe effect stops when the ball hits a brick and resets the next time it touches the puck. It also does nothing when the ball is going downward after bouncing at the top.", "upgrades.sturdy_bricks.tooltip": "+{{lvl}} bricks HP, +{{percent}}% coins spawned when broken",
"upgrades.telekinesis.help": "Puck controls the ball's trajectory", "upgrades.sturdy_bricks.verbose_description": "Each level of this perk adds one HP to all bricks. You can see the HP number with the \"clairvoyant\" perk. You can increase ball damage by getting the \"piercing\" perk. Each level of the perk adds +50% coins spawn. ",
"upgrades.superhot.name": "SUPER HOT",
"upgrades.superhot.tooltip": "Time moves when the paddle moves.",
"upgrades.superhot.verbose_description": "SUPER HOT SUPER HOT SUPER HOT SUPER HOT",
"upgrades.telekinesis.help_plural": "Stronger effect on the ball", "upgrades.telekinesis.help_plural": "Stronger effect on the ball",
"upgrades.telekinesis.name": "Telekinesis", "upgrades.telekinesis.name": "Telekinesis",
"upgrades.top_is_lava.fullHelp": "Whenever you break a brick, your combo will increase by one. However, your combo will reset as soon as your ball hit the top of the screen. \n\nWhen your combo is above the minimum, a red bar will appear at the top to remind you that you should avoid hitting it. \n\nThe effect stacks with other combo perks.", "upgrades.telekinesis.tooltip": "Paddle controls the ball's trajectory",
"upgrades.top_is_lava.help": "More coins if you don't touch the top.", "upgrades.telekinesis.verbose_description": "You control the ball while it's going up. ",
"upgrades.top_is_lava.name": "Sky is the limit", "upgrades.top_is_lava.name": "Sky is the limit",
"upgrades.trampoline.fullHelp": "One of the rare combo upgrades that don't add a reset condition", "upgrades.top_is_lava.tooltip": "+{{lvl}} combo per brick, reset when the top is hit",
"upgrades.trampoline.help": "+{{lvl}} combo per puck bounce,-{{lvl}} combo per ceiling bounce", "upgrades.top_is_lava.verbose_description": "Whenever you break a brick, your combo will increase by one. However, your combo will reset as soon as your ball hit the top of the screen. \n\nWhen your combo is above the minimum, a red bar will appear at the top to remind you that you should avoid hitting it. ",
"upgrades.trampoline.name": "Trampoline", "upgrades.trampoline.name": "Trampoline",
"upgrades.unbounded.fullHelp": "I hope you've found a way to keep your ball on screen", "upgrades.trampoline.tooltip": "+{{lvl}} combo per paddle bounce,-{{lvl}} combo per bounce on any border",
"upgrades.unbounded.help": "+1 combo per brick, no more sides", "upgrades.trampoline.verbose_description": "One of the rare combo upgrades that don't add a reset condition",
"upgrades.unbounded.name": "Unbounded", "upgrades.transparency.name": "Transparency",
"upgrades.viscosity.fullHelp": "Coins normally accelerate with gravity and explosions to pretty high speeds. \n\nThis perk constantly makes them slow down, as if they were in some sort of viscous liquid. \n\nThis makes catching them easier, and combines nicely with perks that influence the coin's movement.", "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.viscosity.help": "Slower coin fall", "upgrades.transparency.verbose_description": "Higher levels make the ball transparent sooner and increase the point bonus.",
"upgrades.trickledown.name": "Trickle down economics",
"upgrades.trickledown.tooltip": "The coins appear at the top of the screen.",
"upgrades.trickledown.verbose_description": "It might help you put some coins aside.",
"upgrades.unbounded.name": "Padding",
"upgrades.unbounded.tooltip": "Adds space left and right of the level, but your paddle can't go that far. ",
"upgrades.unbounded.verbose_description": "Another upgrade might help you extends the reach of your paddle. ",
"upgrades.viscosity.name": "Viscosity", "upgrades.viscosity.name": "Viscosity",
"upgrades.wind.fullHelp": "The wind depends on where your puck is, if it's in the center of the screen nothing happens, if it's on the left it will blow left-wise, if it's on the right of the screen then it will blow right-wise. \n\nThe wind affects both the balls and coins.", "upgrades.viscosity.tooltip": "Slower coin fall",
"upgrades.wind.help": "Puck position creates wind", "upgrades.viscosity.verbose_description": "Coins normally accelerate with gravity and explosions to pretty high speeds. \n\nThis perk constantly makes them slow down, as if they were in some sort of viscous liquid. \n\nThis makes catching them easier, and combines nicely with perks that influence the coin's movement.",
"upgrades.wind.help_plural": "Stronger wind force", "upgrades.wind.help_plural": "Stronger wind force",
"upgrades.wind.name": "Wind", "upgrades.wind.name": "Wind",
"upgrades.yoyo.fullHelp": "It's the opposite of telekinesis", "upgrades.wind.tooltip": "Paddle position creates wind",
"upgrades.yoyo.help": "Ball falls toward puck", "upgrades.wind.verbose_description": "Wind depends on paddle position: left blows left, right blows right. Affects both balls and coins.",
"upgrades.yoyo.name": "Yo-yo", "upgrades.yoyo.name": "Yo-yo",
"upgrades.zen.fullHelp": "After all, this is a non-violent game", "upgrades.yoyo.tooltip": "Ball falls toward paddle",
"upgrades.zen.help": "+1 combo per bricks, reset when there's an explosion", "upgrades.yoyo.verbose_description": "It's the opposite of telekinesis, control the ball while it's falling back down.",
"upgrades.zen.name": "Zen" "upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "+{{lvl}} combo per bricks, reset when there's an explosion",
"upgrades.zen.verbose_description": "After all, this is a non-violent game. "
} }

445
src/i18n/es.json Normal file
View file

@ -0,0 +1,445 @@
{
"confirmRestart.no": "Cancelar",
"confirmRestart.text": "Estás a punto de empezar un nuevo partido: ¿es esto realmente lo que querías?",
"confirmRestart.title": "¿Empezar una nueva partida?",
"confirmRestart.yes": "Empezar una nueva partida",
"editor.editing.bigger": "Aumentar el tamaño del nivel",
"editor.editing.color": "Elige un color de la lista de colores (máximo 5 por nivel)",
"editor.editing.copy": "Copiar código de nivel",
"editor.editing.copy_help": "Pégalo en el canal #levels en nuestro discord",
"editor.editing.credit": "Créditos y fuente",
"editor.editing.credit_prompt": "Introduce la URL de origen o la explicación de tu nivel.",
"editor.editing.delete": "Eliminar nivel",
"editor.editing.down": "Baja todos los ladrillos",
"editor.editing.help": "Luego haz clic en un mosaico para colorearlo.",
"editor.editing.left": "Mueve todos los ladrillos hacia la izquierda",
"editor.editing.play": "Juega este nivel",
"editor.editing.rename": "Nombre del nivel",
"editor.editing.rename_prompt": "Por favor, introduzca un nuevo nombre para el nivel",
"editor.editing.right": "Mueve todos los ladrillos hacia la derecha",
"editor.editing.smaller": "Disminuir el tamaño del nivel",
"editor.editing.title": "Nivel de edición: {{name}}",
"editor.editing.up": "Mueve todos los ladrillos hacia arriba",
"editor.help": "Crea niveles personalizados y compártelos para incluirlos en el juego.",
"editor.import": "Importar un nivel",
"editor.import_instruction": "Pegue un código de nivel para importarlo en su lista de niveles",
"editor.locked": "Alcanza una puntuación total de {{min}} para desbloquear",
"editor.new_level": "Nuevo nivel",
"editor.title": "Editor de niveles",
"gameOver.creative": "Esta parte de la prueba no se grabará.",
"gameOver.cumulative_total": "Su puntuación total acumulada ha pasado de {{startTs}} a {{endTs}}.",
"gameOver.lost.summary": "Se te ha caído la bola después de coger {{score}} monedas.",
"gameOver.lost.title": "Pelota perdida",
"gameOver.stats.balls_lost": "Balas perdidas",
"gameOver.stats.bricks_broken": "Ladrillos rotos",
"gameOver.stats.bricks_per_minute": "Ladrillos rotos por minuto",
"gameOver.stats.catch_rate": "Monedas atrapadas",
"gameOver.stats.combo_avg": "Combo medio",
"gameOver.stats.combo_max": "Combinación máxima",
"gameOver.stats.duration_per_level": "Duración por nivel",
"gameOver.stats.hit_rate": "Precisión",
"gameOver.stats.intro": "A continuación se muestran las estadísticas de este juego en comparación con sus {{count}} mejores juegos.",
"gameOver.stats.level_reached": "Nivel alcanzado",
"gameOver.stats.total_score": "Puntuación total",
"gameOver.stats.upgrades_applied": "Mejoras aplicadas",
"gameOver.stats_intro": "Encuentra a continuación tus estadísticas de juego comparadas con tus {{count}} mejores juegos.",
"gameOver.unlocked_perk": "Actualización desbloqueada",
"gameOver.unlocked_perk_plural": "Has desbloqueado {{count}} mejoras",
"gameOver.win.summary": "Este juego ha terminado. Has acumulado {{score}} monedas.",
"gameOver.win.title": "Ha completado esta parte",
"help.content": "## Objetivo\n\nAtrapa tantas monedas como puedas durante 7 niveles.\nLas monedas aparecen al romper ladrillos.\nAtrápalas con tu pala para aumentar tu puntuación.\nTu puntuación se muestra en la esquina superior derecha de la pantalla.\nNo dejes caer la bola o se acabará la partida.\n\nDespués de destruir todos los ladrillos, podrás elegir una mejora.\n\n## Mejoras\n\nLas mejoras que elijas se aplicarán hasta el final de la partida.\n\nAlgunas se pueden elegir varias veces para un efecto más potente.\nAlgunas ayudan a apuntar o facilitan el juego de otras maneras.\n\nAlgunas solo son útiles al combinarlas.\n\nSiempre obtienes una mejora al principio de cada partida.\n\nSu icono servirá como los ladrillos del primer nivel.\n\nPuedes seleccionar las mejoras iniciales en la configuración.\n\nMuchas mejoras afectan a tu combo.\n\n## Combo\n\nTu \"combo\" es la cantidad de monedas que se generan al romper un ladrillo. Se muestra en tu paleta; por ejemplo, x4 significa que cada ladrillo generará 4 monedas.\nLa mayoría de las mejoras que aumentan el combo también añaden una condición para reiniciarlo.\nEl combo también se reiniciará si la pelota regresa a la paleta sin tocar ningún ladrillo.\nSe mostrará un mensaje de \"fallo\" cuando esto ocurra.\n\nIntenta apuntar a un ladrillo siempre.\n\n## Apuntar\n\nSolo la posición de la pelota en la paleta determina cómo rebotará.\nSi la pelota impacta en el centro de la paleta, rebotará verticalmente.\n\nSi golpeas más hacia un lado, tendrá mayor ángulo.\n\nLa velocidad de la paleta y el ángulo de entrada no afectan la dirección de la pelota después de rebotar.\n\nSe pueden desbloquear muchas mejoras que ayudan a apuntar.\n\n## Desbloqueos\n\nAl jugar Breakout 71 por primera vez, la mayoría de las mejoras y niveles están bloqueados.\nLas mejoras se desbloquean simplemente jugando y atrapando muchas monedas.\n\nLos primeros niveles se desbloquean al alcanzar una puntuación alta. Los niveles posteriores añaden una condición sobre las ventajas que puedes seleccionar.\n\nAlcanzar puntuaciones altas es mucho más fácil si consigues varias mejoras después de cada nivel.\n\n## Repeticiones y mejoras gratuitas\n\nRecibirás una mejora adicional si juegas bien:\n\n- Completa el nivel en menos de {{levelTimeGood}} segundos\n- Golpea los lados o la parte superior menos de {{wallBouncedGood}} veces\n- Atrapa el {{catchRateGood}}% de monedas\n- Falla los ladrillos menos de {{missesGood}} veces\n\nTambién recibirás una repetición que te permite saltarte mejoras si lo haces aún mejor:\n\n- Completa un nivel en menos de {{levelTimeBest}} segundos\n- Golpea los lados o la parte superior menos de {{wallBouncedBest}} veces\n- Atrapa el {{catchRateBest}}% de monedas\n- Falla los ladrillos menos de {{missesBest}} veces\n\nUna opción en la configuración te permite ver estas estadísticas",
"help.help": "Descubre más sobre el juego",
"help.levels": "Niveles",
"help.title": "Ayuda",
"help.upgrades": "## Actualizaciones",
"history.columns.score": "Puntuación",
"history.columns.started": "Fecha",
"history.help": "Enumera tus {{count}} mejores juegos.",
"history.locked": "Juega primero al menos diez partidos",
"history.title": "Historia",
"lab.help": "Prueba cualquier combinación de mejoras y niveles.",
"lab.instructions": "Selecciona las mejoras que aparecen a continuación y elige el nivel al que quieres jugar. .",
"lab.menu_entry": "Modo creativo",
"lab.reset": "Eliminar todas las mejoras",
"lab.select_level": "Selecciona un nivel para jugar",
"lab.unlocks_at": "Desbloqueado a partir de una puntuación total de {{score}}.",
"level_up.after_buttons": "Acabas de completar el nivel {{level}}/{{max}}.",
"level_up.before_buttons": "Has cogido {{score}} monedas {{catchGain}} en {{levelSpawnedCoins}} en {{time}} segundos {{timeGain}}.\n\nHas fallado los ladrillos {{levelMisses}} veces {{missesGain}} y tocado los bordes del área de juego {{levelWallBounces}} veces {{wallHitsGain}}.\n\n{{compliment}}",
"level_up.compliment_advice": "Intenta coger todas las piezas, no fallar nunca con los ladrillos, no tocar nunca las paredes o terminar el nivel en menos de 30 segundos para conseguir opciones extra y mejoras.",
"level_up.compliment_good": "¡Bien hecho!",
"level_up.compliment_perfect": "Impresionante, ¡seguid así!",
"level_up.pick_upgrade_title": "Elija una mejora",
"level_up.plus_one_upgrade": "(+1 mejora)",
"level_up.plus_one_upgrade_and_reroll": "(+1 mejora y +1 relanzamiento)",
"level_up.reroll": "Relanzamiento ({{count}})",
"level_up.reroll_help": "Nuevas opciones",
"level_up.upgrade_perk_to_level": " nivel {{level}}",
"main_menu.basic": "Gráficos simplificados",
"main_menu.basic_help": "Mejor rendimiento.",
"main_menu.colorful_coins": "Piezas de color",
"main_menu.colorful_coins_help": "Las piezas aparecen siempre en el color del ladrillo",
"main_menu.comboIncreaseTexts": "Mostrar una +X dorada",
"main_menu.comboIncreaseTexts_help": "Cuando el combo aumenta",
"main_menu.contrast": "Alto contraste",
"main_menu.contrast_help": "Más contraste y color",
"main_menu.credit_levels": "Niveles",
"main_menu.donate": "Has jugado {{hours}} horas",
"main_menu.donate_help": "¿Podrías donar unos euros? Puedes ocultar este recordatorio en los ajustes.",
"main_menu.donation_reminder": "Recuerde dar",
"main_menu.donation_reminder_help": "Mostrar el tiempo de juego y un enlace para donar en el menú principal",
"main_menu.download_save_file": "Guardar mis progresos",
"main_menu.download_save_file_help": "Obtener un archivo de copia de seguridad",
"main_menu.extra_bright": "Más luz",
"main_menu.extra_bright_help": "Mayor halo de luz alrededor de ladrillos y piezas.",
"main_menu.fullscreen": "Pantalla completa",
"main_menu.fullscreen_help": "El juego intentará cambiar a pantalla completa cuando lo inicies.",
"main_menu.help_content": "## Objetivo\n\nAtrapa tantas monedas como puedas a lo largo de los 7 niveles.\nLas monedas aparecen cuando rompes ladrillos.\nAtrápalas con tu disco para aumentar tu puntuación.\nTu puntuación aparece en la parte superior derecha de la pantalla.\nNo dejes caer la bola o se acaba el juego.\n\nCuando hayas roto todos los ladrillos, podrás elegir una mejora.\n\n## Mejoras\n\nLas mejoras que elijas serán válidas hasta el final del juego.\nAlgunas pueden seleccionarse varias veces para conseguir un efecto más potente.\nOtras ayudan a apuntar o simplifican el juego.\nAlgunas sólo son útiles cuando se combinan.\n\nSiempre obtienes una mejora al principio de cada partida.\nSu icono forma los ladrillos del primer nivel.\nPuedes seleccionar las mejoras iniciales en los ajustes.\n\nMuchas mejoras influyen en tu combo.\n\n## Combo\n\nTu 'combo' es el número de monedas generadas cuando se rompe un ladrillo.\nSe muestra en tu disco. Por ejemplo, x4 significa que cada ladrillo genera 4 monedas.\n\nLa mayoría de las mejoras que aumentan el combo también añaden una condición para restablecerlo.\nEl combo también se reinicia si la pelota vuelve a la raqueta sin golpear un ladrillo.\nEntonces se muestra un mensaje de \"Fallado\".\n\nIntenta golpear un ladrillo en cada rebote.\n\n## Apuntar\n\nSólo la posición de la pelota en la raqueta determina su ángulo de rebote.\nSi la pelota golpea la raqueta en el centro, rebotará verticalmente.\nSi golpea hacia un lado de la raqueta, el ángulo será mayor.\nLa velocidad de la raqueta y el ángulo de incidencia de la pelota no tienen ningún efecto.\n\nSe pueden desbloquear varias mejoras de puntería.\n\n## Desbloqueo\n\nCuando juegas a Breakout 71 por primera vez, la mayoría de las mejoras y niveles están bloqueados.\nLas mejoras se desbloquean simplemente jugando y cogiendo muchas monedas.\nLos primeros niveles se desbloquean consiguiendo una puntuación alta.\nLos niveles posteriores añaden una condición a las ventajas seleccionadas.\n\nConseguir puntuaciones altas es mucho más fácil cuando obtienes varias mejoras después de cada nivel.\n\n## Reintentos y mejoras gratis\n\nConseguirás una mejora extra si juegas bien:\n\n- Completa el nivel en menos de {{levelTimeGood}} segundos\n- Toca los bordes o la parte superior menos de {{wallBouncedGood}} veces\n- Atrapa el {{catchRateGood}}% de las monedas\n- Pierde los ladrillos menos de {{missesGood}} veces\n\nTambién obtendrás un potenciador que te permitirá ignorar las mejoras si lo haces aún mejor:\n\n- Completa un nivel en menos de {{levelTimeBest}} segundos\n- Toca los bordes o la parte superior menos de {{wallBouncedBest}} veces\n- Atrapa {{catchRateBest}} de monedas\n- Pierde ladrillos menos de {{missesBest}} veces\n\nUna opción en los ajustes te permite mostrar estas estadísticas",
"main_menu.help_help": "Descubra el juego en detalle",
"main_menu.help_title": "Ayuda",
"main_menu.help_upgrades": "## Mejoras",
"main_menu.high_score": "Puntuación máxima : {{score}}",
"main_menu.kid": "Modo Niños",
"main_menu.kid_help": "Bola más lenta",
"main_menu.language": "Idioma",
"main_menu.language_help": "Cambiar el idioma de la pantalla",
"main_menu.load_save_file": "Cargar una copia de seguridad",
"main_menu.load_save_file_help": "Desde un archivo",
"main_menu.max_coins": "{{max}} partes mostradas máximo",
"main_menu.max_coins_help": "Sólo visual, sin impacto en la puntuación",
"main_menu.max_particles": " {{max}} partículas máximas",
"main_menu.max_particles_help": "Limita el número de partículas mostradas en pantalla para efectos visuales",
"main_menu.mobile": "Modo móvil",
"main_menu.mobile_help": "Deja un espacio debajo de la raqueta.",
"main_menu.normal": "Pieza nueva",
"main_menu.normal_help": "Con una ventaja inicial aleatoria",
"main_menu.pointer_lock": "Bloqueo de puntero",
"main_menu.pointer_lock_help": "También oculta el cursor del ratón.",
"main_menu.record": "Grabar vídeos de partidos",
"main_menu.record_download": "Descargar el vídeo ({{size}} MB)",
"main_menu.record_help": "Consigue un vídeo de cada nivel.",
"main_menu.red_miss": "Balones perdidos",
"main_menu.red_miss_help": "Muestra partículas rojas alrededor de las bolas que bajan sin golpear un ladrillo.",
"main_menu.reset": "Reiniciar el juego",
"main_menu.reset_cancel": "No",
"main_menu.reset_confirm": "Sí",
"main_menu.reset_help": "Borrar resultados, estadísticas y horarios de los partidos",
"main_menu.reset_instruction": "¿Estás seguro de que perderás todos los progresos que hayas hecho en el juego?",
"main_menu.save_file_error": "Error al cargar el archivo de copia de seguridad",
"main_menu.save_file_loaded": "Copia de seguridad cargada",
"main_menu.save_file_loaded_help": "La aplicación se reiniciará",
"main_menu.save_file_loaded_ok": "Ok",
"main_menu.settings_help": "Adapta el juego a tus necesidades",
"main_menu.settings_title": "Parámetro",
"main_menu.show_fps": "Contador FPS",
"main_menu.show_fps_help": "Control del rendimiento del juego",
"main_menu.show_stats": "Estadísticas en tiempo real",
"main_menu.show_stats_help": "Piezas, tiempo, rebotes, fallos",
"main_menu.sounds": "Sonidos del juego",
"main_menu.sounds_help": "Ralentiza ciertos teléfonos.",
"main_menu.starting_perks": "Beneficios iniciales",
"main_menu.starting_perks_checked": "Cuando inicies una nueva partida, se te asignará una de estas ventajas. Haz clic en una ventaja para excluirla.",
"main_menu.starting_perks_full_random": "Se han eliminado todos los beneficios, la elección será aleatoria.",
"main_menu.starting_perks_help": "Elija sus prestaciones iniciales",
"main_menu.starting_perks_unchecked": "Las prestaciones que figuran a continuación no se proponen como prestaciones iniciales, pero puede hacer clic en ellas para añadirlas a las posibles prestaciones iniciales.",
"main_menu.title": "Breakout 71",
"main_menu.unlocks": "Contenido desbloqueado",
"main_menu.unlocks_help": "Prueba los objetos desbloqueados",
"play.close_modale_window_tooltip": "Cerrar",
"play.current_lvl": "Nivel {{level}}/{{max}}",
"play.menu_label": "Menú",
"play.menu_tooltip": "Abrir el menú principal",
"play.missed_ball": "fallado",
"play.mobile_press_to_play": "Mantener pulsado para jugar",
"play.score_tooltip": "Consulta tu puntuación, mejoras y mucho más",
"play.stats.coins_catch_rate": "Tasa de captura de monedas",
"play.stats.levelMisses": "Fallaste tiros, o no golpeaste ningún ladrillo",
"play.stats.levelTime": "Duración del nivel",
"play.stats.levelWallBounces": "Rebota en las paredes",
"score_panel.close_to_unlock": "Siguiente nivel desbloqueado:",
"score_panel.get_upgrades_to_unlock": "Consigue {{missingUpgrades}} y coge {{points}} monedas extra para desbloquear el nivel \"{{level}}\".",
"score_panel.rerolls_count": "Has acumulado {{rerolls}} rerolls",
"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.upgrades_picked": "Mejoras elegidas durante el juego :",
"settings.autoplay": "",
"settings.autoplay_help": "",
"settings.basic": "Gráficos básicos",
"settings.basic_help": "Mejor rendimiento.",
"settings.colorful_coins": "Monedas de colores",
"settings.colorful_coins_help": "Las monedas siempre aparecen del color del ladrillo.",
"settings.comboIncreaseTexts": "Mostrar +X en oro",
"settings.comboIncreaseTexts_help": "Cuando el combo aumenta",
"settings.contrast": "Alto contraste",
"settings.contrast_help": "Representación más colorida y oscura.",
"settings.donation_reminder": "Recuérdame que debo donar",
"settings.donation_reminder_help": "Ver el tiempo jugado y el enlace de donación en el menú principal",
"settings.download_save_file": "Descargar puntuación y estadísticas",
"settings.download_save_file_help": "Obtener un archivo guardado",
"settings.extra_bright": "Extra brillante",
"settings.extra_bright_help": "Aumenta el tamaño del halo alrededor de las monedas y los ladrillos.",
"settings.fullscreen": "Pantalla completa",
"settings.fullscreen_help": "El juego intentará pasar a pantalla completa antes de comenzar.",
"settings.kid": "Modo Niños",
"settings.kid_help": "Comience los juegos futuros con \"pelota más lenta\".",
"settings.language": "Idioma",
"settings.language_help": "Elige el idioma del juego",
"settings.load_save_file": "Cargar archivo guardado",
"settings.load_save_file_help": "Seleccione un archivo guardado en su dispositivo",
"settings.max_coins": " {{max}} monedas en pantalla máximo",
"settings.max_coins_help": "Solo cosmético, sin efecto en la puntuación.",
"settings.mobile": "Modo móvil",
"settings.mobile_help": "Deja espacio debajo de la paleta.",
"settings.pointer_lock": "Bloqueo del puntero del ratón",
"settings.pointer_lock_help": "Bloquea y oculta el cursor del mouse.",
"settings.precise_lighting": "",
"settings.precise_lighting_help": "",
"settings.probabilistic_lighting": "",
"settings.probabilistic_lighting_help": "",
"settings.record": "Grabar vídeos de juego",
"settings.record_download": "Descargar vídeo ({{size}} MB)",
"settings.record_help": "Obtenga un vídeo de cada nivel.",
"settings.red_miss": "Advertencia de pérdida",
"settings.red_miss_help": "Muestra partículas rojas alrededor de las bolas que caen sin impacto.",
"settings.reset": "Reiniciar Juego",
"settings.reset_cancel": "No",
"settings.reset_confirm": "Sí",
"settings.reset_help": "Borrar puntuaciones altas, tiempo de juego y estadísticas",
"settings.reset_instruction": "Perderás todo el progreso que hayas logrado en el juego, ¿estás seguro?",
"settings.save_file_error": "Error al cargar el archivo guardado",
"settings.save_file_loaded": "Guardar archivo cargado",
"settings.save_file_loaded_help": "La aplicación ahora se recargará para aplicar tu guardado.",
"settings.save_file_loaded_ok": "DE ACUERDO",
"settings.show_fps": "Contador de FPS",
"settings.show_fps_help": "Supervisar el rendimiento de la aplicación",
"settings.show_stats": "Mostrar estadísticas en tiempo real",
"settings.show_stats_help": "Monedas, tiempo, rebotes, fallos.",
"settings.smooth_lighting": "",
"settings.smooth_lighting_help": "",
"settings.sounds": "Sonidos del juego",
"settings.sounds_help": "Pitidos, bloops y brrrr",
"settings.stress_test": "",
"settings.stress_test_help": "",
"starting_perks.checked": "Al empezar una partida nueva, recibirás una de esas ventajas. Haz clic en una ventaja para excluirla.",
"starting_perks.help": "Elija posibles actualizaciones iniciales",
"starting_perks.random": "Se han eliminado todos los beneficios, la elección será aleatoria.",
"starting_perks.title": "Beneficios iniciales",
"starting_perks.unchecked": "Los beneficios a continuación no se ofrecen como beneficios iniciales, pero puedes hacer clic para agregarlos al grupo.",
"unlocks.greyed_out_help": "Los objetos en gris pueden desbloquearse aumentando tu puntuación total. La puntuación total aumenta cada vez que consigues puntos en el juego.",
"unlocks.intro": "Tu puntuación total es {{ts}}. A continuación encontrarás todas las mejoras y niveles que ofrece el juego. Haz clic en uno de ellos para probarlo en una partida de prueba.",
"unlocks.just_unlocked": "Nivel desbloqueado",
"unlocks.just_unlocked_plural": "Acabas de desbloquear {{count}} niveles",
"unlocks.level": "<h2>Has desbloqueado {{unlocked}} niveles en {{out_of}}</h2>\n<p>Aquí están todos los niveles del juego, haz clic en uno para probarlo. </p> ",
"unlocks.level_description": "Un nivel {{size}}x{{size}} con {{bricks}} ladrillos, {{colors}} colores y {{bombs}} bombas.",
"unlocks.minScore": "Alcanza una puntuación de ${{minScore}} en una partida para desbloquearla.",
"unlocks.minScoreWithPerks": "Alcanzar ${{minScore}} en un juego con {{required}} pero sin {{forbidden}}.",
"unlocks.minTotalScore": "Acumula un total de ${{score}}",
"unlocks.reached": "Tu mejor puntuación hasta ahora es {{reached}}.",
"unlocks.title_upgrades": "Has desbloqueado {{unlocked}} mejoras en {{out_of}}.",
"upgrades.addiction.name": "Adicción",
"upgrades.addiction.tooltip": "+{{lvl}} combo / ladrillo, combo perdido después de {{delay}}s sin romper ningún ladrillo",
"upgrades.addiction.verbose_description": "La cuenta atrás sólo comienza una vez que se ha destruido el primer ladrillo del nivel, y se detiene en cuanto no hay más ladrillos.",
"upgrades.asceticism.name": "Ascetismo",
"upgrades.asceticism.tooltip": "+{{combo}} combo por ladrillo roto, - {{combo}} cuando una pieza es atrapada",
"upgrades.asceticism.verbose_description": "Tendremos que encontrar una forma de almacenar las piezas mientras crece el combo.",
"upgrades.ball_attract_ball.help_plural": "Mayor fuerza de atracción",
"upgrades.ball_attract_ball.name": "Gravedad",
"upgrades.ball_attract_ball.tooltip": "Las pelotas atraen a las pelotas",
"upgrades.ball_attract_ball.verbose_description": "Las bolas que están separadas más de 3/4 de la anchura de la pantalla empiezan a atraerse. La fuerza de atracción es mayor cuanto más separadas están las bolas. Las partículas del arco iris volarán para simbolizar la fuerza de atracción. Esta ventaja sólo está disponible si ya tienes más de una bola en juego.",
"upgrades.ball_attracts_coins.name": "Balas de la suerte",
"upgrades.ball_attracts_coins.tooltip": "Las monedas van con la bola más cercana",
"upgrades.ball_attracts_coins.verbose_description": "Puedes utilizarlo para que las piezas orbiten la pelota y colorear los ladrillos cercanos, o como una especie de rincón imantado.",
"upgrades.ball_repulse_ball.help_plural": "Fuerza de repulsión más fuerte",
"upgrades.ball_repulse_ball.name": "Vuelo en formación",
"upgrades.ball_repulse_ball.tooltip": "Las balas repelen a las balas",
"upgrades.ball_repulse_ball.verbose_description": "Las bolas que están a menos de un cuarto de la anchura de la pantalla empiezan a repelerse. La fuerza de repulsión es mayor cuanto más cerca están una de otra. Se mostrarán partículas para simbolizar la aplicación de esta fuerza. Esta ventaja sólo está disponible si ya tienes más de una bola.",
"upgrades.base_combo.name": "Mejor base",
"upgrades.base_combo.tooltip": "El combo comienza en {{coins}} en lugar de 1.",
"upgrades.base_combo.verbose_description": "Tu combo normalmente empieza en 1 al principio del nivel y vuelve a 1 cuando rebotas sin golpear nada. Con esta función, el combo empieza 3 puntos más arriba, por lo que siempre conseguirás al menos 4 monedas por ladrillo. Cuando tu combo se reinicia, vuelve a ser 4 en lugar de 1. Tu bola parpadeará un poco para indicar que su combo es superior a 1.",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "Explosiones más violentas",
"upgrades.bigger_explosions.verbose_description": "La explosión por defecto arrasa un cuadrado de ladrillos de 3x3; con esta mejora, uno de 5x5. El viento que sopla las piezas también es mucho más fuerte. La pantalla parpadeará un poco después de cada explosión (excepto en el modo de gráficos básicos).",
"upgrades.bigger_puck.name": "Raqueta más grande",
"upgrades.bigger_puck.tooltip": "Atrapa más monedas fácilmente.",
"upgrades.bigger_puck.verbose_description": "Una raqueta grande significa que nunca se te escapa la pelota y que puedes coger más piezas, además de apuntar los rebotes con precisión. Sin embargo, una raqueta grande es más difícil de usar en los laterales del nivel.",
"upgrades.bricks_attract_ball.name": "Los ladrillos atraen bolas",
"upgrades.bricks_attract_ball.tooltip": "La pelota va hacia los primeros {{count}} ladrillos que golpea.",
"upgrades.bricks_attract_ball.verbose_description": "El efecto es más intenso en niveles más altos. La cantidad de ladrillos que pueden impactar antes de que el efecto se detenga también es mayor. El efecto se reactiva cuando el balón impacta el disco.",
"upgrades.bricks_attract_coins.name": "Los ladrillos atraen monedas",
"upgrades.bricks_attract_coins.tooltip": "Les ayuda a permanecer allí arriba.",
"upgrades.bricks_attract_coins.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.",
"upgrades.coin_magnet.help_plural": "Mayor efecto sobre las piezas",
"upgrades.coin_magnet.name": "Imán para monedas",
"upgrades.coin_magnet.tooltip": "La raqueta atrae monedas",
"upgrades.coin_magnet.verbose_description": "Dirige las piezas hacia la raqueta. El efecto es mayor en las piezas que ya están cerca de la raqueta.",
"upgrades.compound_interest.name": "Interés compuesto",
"upgrades.compound_interest.tooltip": "+{{lvl}} combo por ladrillo roto, se pone a cero cuando se pierde una pieza",
"upgrades.compound_interest.verbose_description": "Tu combo aumentará en uno cada vez que rompas un ladrillo. Si pierdes alguna pieza, tu combo volverá a cero.\n\nSi tu combo es superior al mínimo, aparecerá una línea roja en la parte inferior de la zona de juego para recordarte que las monedas no deben ir allí.",
"upgrades.concave_puck.name": "Raqueta cóncava",
"upgrades.concave_puck.tooltip": "Ayuda a evitar los bordes.",
"upgrades.concave_puck.verbose_description": "Las pelotas comienzan verticalmente al principio del nivel y rebotan en la raqueta más verticalmente y al revés.",
"upgrades.corner_shot.name": "Tiro de esquina",
"upgrades.corner_shot.tooltip": "Deja que tu raqueta salga del área enmarcada",
"upgrades.corner_shot.verbose_description": "Te ayuda a apuntar a las esquinas",
"upgrades.etherealcoins.name": "Moneda espacial",
"upgrades.etherealcoins.tooltip": "Las piezas ya no se ven afectadas por la gravedad",
"upgrades.etherealcoins.verbose_description": "Las monedas mantendrán su velocidad incluso después de varios rebotes y ya no se verán afectadas por la gravedad.",
"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.help_plural": "La (última) bola rebota hasta el fondo de la pantalla en lugar de perderse ( {{lvl}} veces).",
"upgrades.extra_life.name": "Segunda oportunidad",
"upgrades.extra_life.tooltip": "La pelota rebota una vez antes de perderse.",
"upgrades.extra_life.verbose_description": "Normalmente, sólo tienes una bola por ronda, y la ronda termina en cuanto la sueltas.\n\nEsta habilidad añade una barra blanca en la parte inferior de la pantalla que guardará una bola una vez, y se romperá en el proceso.\n\nPuedes coger varias vidas por adelantado, que se usan cada vez que una bola está a punto de perderse.",
"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.",
"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.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.ghost_coins.name": "Habitaciones fantasma",
"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.helium.name": "Helio",
"upgrades.helium.tooltip": "Las piezas flotan en lugar de caer alrededor de la raqueta.",
"upgrades.helium.verbose_description": "Las monedas esperarán a estar debajo de la raqueta para caer.",
"upgrades.hot_start.name": "Arranque en caliente",
"upgrades.hot_start.tooltip": "Combo a {{start}}, -{{loss}} combo por segundo",
"upgrades.hot_start.verbose_description": "Al principio de cada nivel, tu combo comenzará con +30 puntos, pero cada segundo se reducirá en un punto. ",
"upgrades.hypnosis.name": "Hipnosis",
"upgrades.hypnosis.tooltip": "Cada vez que un ladrillo cambia de color, teletransporta esa moneda a la bola más cercana y recarga su capacidad para manchar un ladrillo.",
"upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "Implosiones",
"upgrades.implosions.tooltip": "Las explosiones absorben las piezas en lugar de hacerlas estallar.",
"upgrades.implosions.verbose_description": "La fuerza de la explosión se aplica en sentido contrario. El nivel 2+ aumenta la potencia de la implosión.",
"upgrades.instant_upgrade.name": "Más vale pájaro en mano que ciento volando",
"upgrades.instant_upgrade.tooltip": "+2 de mejora ahora, -1 de elección hasta el final del juego.",
"upgrades.instant_upgrade.verbose_description": "Elige inmediatamente dos mejoras para conseguir una gratis y otra para pagar la que usaste para conseguir esta ventaja. Cada vez que elijas mejoras del siguiente menú, tendrás menos opciones.",
"upgrades.left_is_lava.name": "Evitar el lado izquierdo",
"upgrades.left_is_lava.tooltip": "+{{lvl}} combo por ladrillo, se pierde al tocar el borde izquierdo",
"upgrades.left_is_lava.verbose_description": "Cada vez que rompes un ladrillo, tu combo aumenta en uno, dándote una moneda extra cada vez que rompes un ladrillo.\n\nSin embargo, tu combo se reinicia en cuanto tu bola golpea el lado izquierdo.\n\nEn cuanto tu combo aumenta, el lado izquierdo se vuelve rojo para recordarte que debes evitar golpearlo.",
"upgrades.limitless.name": "Sin límites",
"upgrades.limitless.tooltip": "Aumenta el nivel máximo de todas las mejoras de {{lvl}} .",
"upgrades.limitless.verbose_description": "Elegir esta ventaja también aumenta su propio límite en un punto, permitiéndote elegirla de nuevo.",
"upgrades.metamorphosis.name": "Metamorfosis",
"upgrades.metamorphosis.tooltip": "Cada pieza puede manchar {{lvl}} ladrillo(s) con su color",
"upgrades.metamorphosis.verbose_description": "Con esta mejora, las monedas tendrán el color del ladrillo del que proceden y colorearán el primer ladrillo que toquen.\n\nLas piezas aparecen a la velocidad de la bola que las rompió, lo que significa que puedes apuntar un poco en la dirección de los ladrillos que quieres \"pintar\".",
"upgrades.minefield.name": "Campo de minas",
"upgrades.minefield.tooltip": "+{{lvl}} combo por ladrillo explosivo en pantalla",
"upgrades.minefield.verbose_description": "Añade +lvl al combo cuando se coloca un ladrillo, -lvl cuando se destruye y aumenta el combo básico en el número de ladrillos multiplicado por el nivel.",
"upgrades.multiball.name": "Bola múltiple",
"upgrades.multiball.tooltip": "Cada nivel comienza con {{count}} bolas.",
"upgrades.multiball.verbose_description": "En cuanto sueltas la bola en Breakout 71, pierdes.\n\nCon esta ventaja, tienes dos bolas, así que puedes permitirte perder una.\n\nLas bolas perdidas vuelven al siguiente nivel.\n\nTener más de una bala te permite obtener otras ventajas y, por supuesto, completar el nivel más rápidamente.",
"upgrades.nbricks.name": "Domiciliación bancaria",
"upgrades.nbricks.tooltip": "Golpea exactamente {{lvl}} ladrillos por rebote para +{{lvl}} combo, de lo contrario combo perdido",
"upgrades.nbricks.verbose_description": "Si tu bola rebota sin romper ningún ladrillo, cuenta como golpe. Los ladrillos destruidos por explosiones no cuentan.",
"upgrades.one_more_choice.name": "La respuesta D",
"upgrades.one_more_choice.tooltip": "1 opción de mejora adicional disponible hasta el final del juego",
"upgrades.one_more_choice.verbose_description": "Cada menú de mejoras tendrá una opción adicional. Esto no aumenta el número de mejoras que puede elegir, pero le ayuda a crear el perfil ideal. \"Respuesta D\" es una referencia a un sketch clásico.",
"upgrades.passive_income.name": "Ingresos pasivos",
"upgrades.passive_income.tooltip": "+{{lvl}} combo / ladrillo, a menos que la raqueta se haya movido en los últimos {{time}} segundos, en cuyo caso se pierde el combo.",
"upgrades.passive_income.verbose_description": "Algunas mejoras hacen que las pelotas se muevan sin necesidad de poner la raqueta en movimiento.",
"upgrades.picky_eater.name": "Comer por colores",
"upgrades.picky_eater.tooltip": "+{{lvl}} combo por ladrillo roto del color de la bola, combo perdido en caso contrario",
"upgrades.picky_eater.verbose_description": "Cada vez que rompes un ladrillo del mismo color que tu bola, tu combinación aumenta en uno.\nSi es de otro color, la bola adopta este nuevo color, pero la combinación se reinicia, a menos que no queden ladrillos del mismo color que la bola. Los ladrillos de color incorrecto se marcan con un círculo rojo. Si tienes más de una bola, todas cambian de color al mismo tiempo cuando una de ellas toca un ladrillo.",
"upgrades.pierce.name": "Bola perforadora",
"upgrades.pierce.tooltip": "La pelota golpea {{count}} ladrillos después de cada rebote en la raqueta.",
"upgrades.pierce.verbose_description": "Normalmente, la pelota rebota en cuanto golpea un ladrillo. Con esta mejora, continuará su trayectoria hasta que haya roto 3 ladrillos.\n\nDespués, rebotará en el cuarto ladrillo y tendrá que tocar la raqueta para poner a cero el contador.",
"upgrades.pierce_color.name": "Taladro de color",
"upgrades.pierce_color.tooltip": "+{{lvl}} de daño a los ladrillos del mismo color que la bola",
"upgrades.pierce_color.verbose_description": "Cada vez que una bola golpea un ladrillo del mismo color, lo atraviesa sin obstáculos.\n\nCuando choca contra un ladrillo de otro color, lo rompe, adopta su color y rebota.\n\nSi tienes ladrillos macizos, las cosas funcionan de otra manera.",
"upgrades.puck_repulse_ball.help_plural": "La fuerza de repulsión es mayor",
"upgrades.puck_repulse_ball.name": "Aterrizaje suave",
"upgrades.puck_repulse_ball.tooltip": "La raqueta repele las pelotas",
"upgrades.puck_repulse_ball.verbose_description": "Cuando una pelota se acerca a la raqueta, empieza a frenarse e incluso a botar sin tocar el disco.",
"upgrades.rainbow.name": "Arcoíris",
"upgrades.rainbow.tooltip": "Las monedas aparecen con colores del arco iris.",
"upgrades.rainbow.verbose_description": "Cada nivel aumenta la cantidad de monedas de colores. El color depende del tiempo transcurrido.",
"upgrades.reach.name": "Ataque aéreo",
"upgrades.reach.tooltip": "Romper uno de los N ladrillos de la línea inferior destruye el combo. De lo contrario, +N combo.",
"upgrades.reach.verbose_description": "Si sólo hay una fila de ladrillos, o si la fila más baja cubre todo el ancho del juego, esta ventaja no tiene efecto. De lo contrario, si se rompe esta fila inferior, se reinicia el combo; si se rompe cualquier otra fila, el combo aumenta en el número de ladrillos de esa fila.\n\nLa fila inferior de ladrillos se marcará con un círculo rojo para recordarte que no debes tocarla.",
"upgrades.respawn.name": "Reaparición",
"upgrades.respawn.tooltip": "{{percent}}% de los ladrillos reaparecen después de {{delay}}s.",
"upgrades.respawn.verbose_description": "Los efectos de partículas te mostrarán dónde aparecerán los ladrillos.",
"upgrades.right_is_lava.name": "Evitar el lado derecho",
"upgrades.right_is_lava.tooltip": "+{{lvl}} combo por ladrillo, perdido en el impacto con el lado derecho",
"upgrades.right_is_lava.verbose_description": "Cada vez que rompes un ladrillo, tu combo aumenta en uno, dándote una moneda extra cada vez que rompas los ladrillos siguientes.\n\nSin embargo, tu combo se reinicia en cuanto tu bola toca el lado derecho del área de juego.\n\nEn cuanto tu combo aumenta, el lado derecho se vuelve rojo para recordarte que debes evitar golpearlo.",
"upgrades.sacrifice.help_l1": "Perder una vida destruye todos los ladrillos",
"upgrades.sacrifice.help_over": "Perder una vida multiplica el combo por {{lvl}} y luego destruye todos los ladrillos de la pantalla",
"upgrades.sacrifice.name": "Sacrificio",
"upgrades.sacrifice.verbose_description": "El combo podría llegar muy alto.",
"upgrades.sapper.help_plural": "Los primeros {{lvl}} ladrillos rotos se convierten en bombas.",
"upgrades.sapper.name": "Zapador",
"upgrades.sapper.tooltip": "El primer ladrillo roto se convierte en una bomba.",
"upgrades.sapper.verbose_description": "En lugar de desaparecer, el primer ladrillo roto es sustituido por una bomba. Al rebotar la pelota en la raqueta, se restablece el efecto. A medida que subas de nivel, podrás colocar más bombas.",
"upgrades.shocks.name": "Choque",
"upgrades.shocks.tooltip": "Choque explosivo entre balas",
"upgrades.shocks.verbose_description": "Cuando dos balas chocan, intercambian velocidades, crean una explosión y ganan un poco de la velocidad que las separaba.",
"upgrades.shunt.name": "Derivación",
"upgrades.shunt.tooltip": "Aparca {{percent}}% de combo al cambiar de nivel",
"upgrades.shunt.verbose_description": "El arranque en caliente simplemente se añadirá a la combinación actual",
"upgrades.side_flip.name": "Derecha",
"upgrades.side_flip.tooltip": "+{{lvl}} combo por ladrillo roto de la derecha, -{{loss}} de lo contrario",
"upgrades.side_flip.verbose_description": "Golpea el ladrillo por su lado derecho para conseguir un combo, pero evita golpearlo por su lado izquierdo ya que esto cancelará dos combos. Golpear desde arriba y desde abajo no tiene efecto.",
"upgrades.side_kick.name": "Zurdos",
"upgrades.side_kick.tooltip": "+{{lvl}} combo por ladrillo roto de la izquierda, -{{loss}} de lo contrario",
"upgrades.side_kick.verbose_description": "Golpea el ladrillo por su lado izquierdo para conseguir un combo, pero evita golpearlo por su lado derecho ya que esto cancelará dos combos. Golpear desde arriba y desde abajo no tiene efecto.",
"upgrades.skip_last.help_plural": "Los últimos {{lvl}} ladrillos restantes se autodestruirán",
"upgrades.skip_last.name": "Fácil de limpiar",
"upgrades.skip_last.tooltip": "El último ladrillo se autodestruye.",
"upgrades.skip_last.verbose_description": "Tienes que romper todos los ladrillos para pasar al siguiente nivel.\n\nSin embargo, puede ser difícil conseguir los últimos ladrillos.\n\nCompletar un nivel antes de tiempo te da opciones extra al subir de nivel.\n\nNo quedarte nunca sin ladrillos también es una gran ventaja.\n\nAsí que si te cuesta romper los últimos ladrillos, conseguir esta ventaja unas cuantas veces puede ayudarte.",
"upgrades.slow_down.name": "Bola lenta",
"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.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.tooltip": "También da +5 combo",
"upgrades.smaller_puck.verbose_description": "Recibes una bonificación de combo permanente de +5 por elegir esta mejora.",
"upgrades.soft_reset.name": "Restablecimiento progresivo",
"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.streak_shots.name": "Secuencia de destrucción",
"upgrades.streak_shots.tooltip": "Más piezas si rompes varios ladrillos a la vez.",
"upgrades.streak_shots.verbose_description": "Cada vez que rompes un ladrillo, tu combo aumenta. El combo se pone a cero cuando la pelota golpea la raqueta. Una vez que tu combo supera el valor base, tu raqueta se vuelve roja para recordarte que tocarla con la pelota destruirá tu combo.",
"upgrades.sturdy_bricks.name": "Ladrillos macizos",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} puntos de vida de los ladrillos, +{{percent}}% monedas cuando se destruyen",
"upgrades.sturdy_bricks.verbose_description": "Cada nivel de esta mejora añade un PV a todos los ladrillos. Puedes comprobar el número de PV usando la cualificación \"Clarividente\". Puedes aumentar el daño de las balas obteniendo la mejora \"Bala perforante\". Cada nivel de esta mejora añade un 50% más de monedas.",
"upgrades.superhot.name": "Súper caliente",
"upgrades.superhot.tooltip": "El tiempo se mueve cuando se mueve la paleta.",
"upgrades.superhot.verbose_description": "SUPER CALIENTE SUPER CALIENTE SUPER CALIENTE SUPER CALIENTE",
"upgrades.telekinesis.help_plural": "Mayor efecto sobre el balón",
"upgrades.telekinesis.name": "Telequinesis",
"upgrades.telekinesis.tooltip": "Control de la trayectoria del balón",
"upgrades.telekinesis.verbose_description": "Controla la bola mientras sube.",
"upgrades.top_is_lava.name": "Icare",
"upgrades.top_is_lava.tooltip": "+{{lvl}} combo por ladrillo, perdido en el rebote del techo",
"upgrades.top_is_lava.verbose_description": "Cada vez que rompas un ladrillo, tu combo aumentará en uno. Sin embargo, tu combo se reiniciará en cuanto tu bola llegue a la parte superior de la pantalla.\n\nCuando tu combo supere el mínimo, aparecerá una barra roja en la parte superior de la pantalla para recordarte que debes evitar golpearla.",
"upgrades.trampoline.name": "Trampolín",
"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.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.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.tooltip": "Las monedas aparecen en la parte superior de la pantalla.",
"upgrades.trickledown.verbose_description": "Podría ayudarte a ahorrar algunas monedas. ",
"upgrades.unbounded.name": "Espacio libre",
"upgrades.unbounded.tooltip": "+{{lvl}} combo por ladrillo, más lados para mantener la pelota en juego, peligro",
"upgrades.unbounded.verbose_description": "Espero que hayas encontrado la forma de mantener tu bola en la pantalla. En el nivel 2+, el techo también desaparecerá. Se trata de una ventaja avanzada.",
"upgrades.viscosity.name": "Fluido viscoso",
"upgrades.viscosity.tooltip": "Las piezas caen más lentamente",
"upgrades.viscosity.verbose_description": "Las piezas normalmente se aceleran con la gravedad y las explosiones para alcanzar velocidades bastante altas.\n\nEsta habilidad las ralentiza constantemente, como si estuvieran en una especie de líquido viscoso.\n\nEsto facilita su captura y combina bien con mejoras que influyen en el movimiento de la pieza.",
"upgrades.wind.help_plural": "Viento más fuerte",
"upgrades.wind.name": "Viva el viento",
"upgrades.wind.tooltip": "La posición de la raqueta crea viento",
"upgrades.wind.verbose_description": "El viento depende de la posición de la raqueta en la pantalla, hacia la izquierda si está a la izquierda, hacia la derecha si está a la derecha.\nAfecta a pelotas y piezas.",
"upgrades.yoyo.name": "Yo-Yo",
"upgrades.yoyo.tooltip": "La pelota desciende hacia la raqueta.",
"upgrades.yoyo.verbose_description": "Es lo contrario de la Telequinesis: controlar la pelota mientras cae hacia la raqueta.",
"upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "+{{lvl}} combo por ladrillo, hasta que haya una explosión",
"upgrades.zen.verbose_description": "Básicamente es un juego no violento."
}

View file

@ -1,13 +1,35 @@
{ {
"confirmRestart.no": "Annuler ,continuer ma partie en cours", "confirmRestart.no": "Annuler",
"confirmRestart.text": "Vous êtes sur le point de commencer une nouvelle partie, est-ce vraiment ce que vous vouliez ?", "confirmRestart.text": "Vous êtes sur le point de commencer une nouvelle partie, est-ce vraiment ce que vous vouliez ?",
"confirmRestart.title": "Démarrer une nouvelle partie ?", "confirmRestart.title": "Démarrer une nouvelle partie?",
"confirmRestart.yes": "Commencer une nouvelle partie", "confirmRestart.yes": "Commencer une nouvelle partie",
"editor.editing.bigger": "Augmenter la taille du niveau",
"editor.editing.color": "Choisissez une couleur dans la liste des couleurs (max 5 par niveau)",
"editor.editing.copy": "Copier le code du niveau",
"editor.editing.copy_help": "Collez-le dans le canal #levels de notre discord",
"editor.editing.credit": "Crédits et source",
"editor.editing.credit_prompt": "Entrez l'url source ou l'explication de votre niveau.",
"editor.editing.delete": "Supprimer le niveau",
"editor.editing.down": "Déplacez toutes les briques vers le bas",
"editor.editing.help": "Cliquez ensuite sur une tuile pour la colorier.",
"editor.editing.left": "Déplacer toutes les briques vers la gauche",
"editor.editing.play": "Jouez à ce niveau",
"editor.editing.rename": "Nom du niveau",
"editor.editing.rename_prompt": "Veuillez saisir un nouveau nom pour le niveau",
"editor.editing.right": "Déplacer toutes les briques vers la droite",
"editor.editing.smaller": "Diminuer la taille du niveau",
"editor.editing.title": "Niveau d'édition : {{name}}",
"editor.editing.up": "Déplacez toutes les briques",
"editor.help": "Créez des niveaux personnalisés et partagez-les pour les inclure dans le jeu.",
"editor.import": "Importer un niveau",
"editor.import_instruction": "Collez un code de niveau pour l'importer dans votre liste de niveaux",
"editor.locked": "Atteignez un score total de {{min}} pour débloquer",
"editor.new_level": "Nouveau niveau",
"editor.title": "Éditeur de niveau",
"gameOver.creative": "Cette partie de test ne sera pas enregistrée.",
"gameOver.cumulative_total": "Votre score total cumulé est passé de {{startTs}} à {{endTs}}.", "gameOver.cumulative_total": "Votre score total cumulé est passé de {{startTs}} à {{endTs}}.",
"gameOver.lost.summary": "Vous avez fait tomber la balle après avoir attrapé {{score}} pièces.", "gameOver.lost.summary": "Vous avez fait tomber la balle après avoir attrapé {{score}} pièces.",
"gameOver.lost.title": "Balle perdue", "gameOver.lost.title": "Balle perdue",
"gameOver.next_unlock": "Marquez {{points}} points supplémentaires pour débloquer la prochaine amélioration ou le prochain niveau.",
"gameOver.restart": "Nouvelle partie",
"gameOver.stats.balls_lost": "Balles perdues", "gameOver.stats.balls_lost": "Balles perdues",
"gameOver.stats.bricks_broken": "Briques cassées", "gameOver.stats.bricks_broken": "Briques cassées",
"gameOver.stats.bricks_per_minute": "Briques cassées par minute", "gameOver.stats.bricks_per_minute": "Briques cassées par minute",
@ -16,251 +38,408 @@
"gameOver.stats.combo_max": "Combo maximum", "gameOver.stats.combo_max": "Combo maximum",
"gameOver.stats.duration_per_level": "Durée par niveau", "gameOver.stats.duration_per_level": "Durée par niveau",
"gameOver.stats.hit_rate": "Précision", "gameOver.stats.hit_rate": "Précision",
"gameOver.stats.intro": "Vous trouverez ci-dessous les statistiques de cette partie comparées à vos {{count}} meilleures parties.", "gameOver.stats.intro": "",
"gameOver.stats.level_reached": "Niveau atteint", "gameOver.stats.level_reached": "Niveau atteint",
"gameOver.stats.total_score": "Score total", "gameOver.stats.total_score": "Score total",
"gameOver.stats.upgrades_applied": "Mises à jour appliquées", "gameOver.stats.upgrades_applied": "Améliorations appliquées",
"gameOver.test_run": "Cette partie de test et son score ne sont pas enregistrés.", "gameOver.stats_intro": "Vous trouverez ci-dessous les statistiques de cette partie comparées à vos {{count}} meilleures parties.",
"gameOver.unlocked_count": "Vous avez débloqué {{count}} objet(s) :", "gameOver.unlocked_perk": "Amélioration débloquée",
"gameOver.upgrades_picked": "Amélioration actives en fin de partie", "gameOver.unlocked_perk_plural": "Vous avez débloqué {{count}} améliorations",
"gameOver.win.summary": "Vous avez nettoyé tous les niveaux pour cette partie, en attrapant {{score}} pièces au total.", "gameOver.win.summary": "Cette partie est terminée. Vous avez accumulé {{score}} pièces. ",
"gameOver.win.title": "Partie terminée", "gameOver.win.title": "Vous avez terminé cette partie",
"level_up.after_buttons": "Vous venez de terminer le niveau {{level}}/{{max}} et vous avez choisi ces améliorations jusqu'à présent :", "help.content": "## Objectif\n\nAttrapez un maximum de pièces au cours des 7 niveaux.\nLes pièces apparaissent lorsque vous cassez des briques.\nAttrapez-les avec votre palet pour augmenter votre score.\nVotre score est affiché en haut à droite de l'écran.\nNe laissez pas tomber la balle, sinon la partie est terminée.\n\nAprès avoir détruit toutes les briques, vous pourrez choisir une amélioration.\n\n## Améliorations\n\nLes améliorations que vous choisissez seront valables jusqu'à la fin de la partie.\nCertaines peuvent être sélectionnées plusieurs fois pour un effet plus puissant.\nD'autres aident à viser ou simplifient le jeu.\nCertaines ne sont utiles que lorsqu'elles sont combinées.\n\nVous obtenez toujours une amélioration au début de chaque partie.\nSon icône forme les briques du premier niveau.\nVous pouvez sélectionner les améliorations de départ dans les paramètres.\n\nDe nombreuses améliorations influencent votre combo.\n\n## Combo\n\nVotre « combo » correspond au nombre de pièces générées lorsqu'une brique se casse.\nIl est affiché sur votre palet. Par exemple, x4 signifie que chaque brique rapporte 4 pièces.\n\nLa plupart des améliorations qui augmentent le combo ajoutent également une condition pour le réinitialiser.\nLe combo se réinitialise également si la balle revient sur la raquette sans toucher de brique.\nUn message « Manqué » s'affiche alors.\n\nEssayez de viser vers un brique à chaque rebond.\n\n## Visée\n\nSeule la position de la balle sur la raquette détermine son angle de rebond.\nSi la balle touche la raquette en plein centre, elle rebondira verticalement.\nSi vous frappez sur le côté de la raquette, l'angle sera plus grand.\nLa vitesse de la raquette et l'angle d'incidence de la balle n'ont pas d'effet.\n\nDe nombreuses améliorations facilitant la visée peuvent être débloquées.\n\n## Déblocages\n\nLorsque vous jouez à Breakout 71 pour la première fois, la plupart des améliorations et des niveaux sont verrouillés.\nLes améliorations se débloquent simplement en jouant et en attrapant beaucoup de pièces.\nLes premiers niveaux se débloquent en atteignant un score élevé.\nLes niveaux suivants ajoutent une condition concernant les avantages sélectionnés.\n\nAtteindre des scores élevés est beaucoup plus facile lorsque vous obtenez plusieurs améliorations après chaque niveau.\n\n## Relances et améliorations gratuites\n\nVous obtiendrez une amélioration supplémentaire si vous jouez bien :\n\n- Terminez le niveau en moins de {{levelTimeGood}} secondes\n- Touchez les bords ou le haut moins de {{wallBouncedGood}} fois\n- Attrapez {{catchRateGood}} % de pièces\n- Manquez les briques moins de {{missesGood}} fois\n\nVous bénéficierez également d'une relance qui vous permettra d'ignorer les améliorations si vous faites encore mieux :\n\n- Terminez un niveau en moins de {{levelTimeBest}} secondes\n- Touchez les bords ou le haut moins de {{wallBouncedBest}} fois\n- Attrapez {{catchRateBest}} % de pièces\n- Manquez les briques moins de {{missesBest}} fois\n\nUne option dans les paramètres vous permet d'afficher ces statistiques ",
"help.help": "Découvrez le jeu en détail",
"help.levels": "Niveaux",
"help.title": "Aide",
"help.upgrades": "## Améliorations",
"history.columns.score": "Score",
"history.columns.started": "Date",
"history.help": "Liste vos {{count}} meilleurs parties.",
"history.locked": "Jouez d'abord au moins dix parties",
"history.title": "Historique",
"lab.help": "Essayez n'importe quel combinaison d'améliorations et de niveaux.",
"lab.instructions": "Sélectionnez les améliorations ci-dessous, puis choisissez le niveau à jouer. .",
"lab.menu_entry": "Mode créatif",
"lab.reset": "Retirer toutes les améliorations",
"lab.select_level": "Sélectionnez un niveau sur lequel jouer",
"lab.unlocks_at": "Déverrouillé à partir d'un score total de {{score}}",
"level_up.after_buttons": "Vous venez de terminer le niveau {{level}}/{{max}}.",
"level_up.before_buttons": "Vous avez attrapé {{score}} pièces {{catchGain}} sur {{levelSpawnedCoins}} en {{time}} secondes {{timeGain}}.\n\nVous avez raté les briques {{levelMisses}} fois {{missesGain}} et touché les bords de la zone de jeu {{levelWallBounces}} fois {{wallHitsGain}}.\n\n{{compliment}}", "level_up.before_buttons": "Vous avez attrapé {{score}} pièces {{catchGain}} sur {{levelSpawnedCoins}} en {{time}} secondes {{timeGain}}.\n\nVous avez raté les briques {{levelMisses}} fois {{missesGain}} et touché les bords de la zone de jeu {{levelWallBounces}} fois {{wallHitsGain}}.\n\n{{compliment}}",
"level_up.compliment_advice": "Essayez d'attraper toutes les pièces, de ne jamais rater les briques, de ne pas toucher les murs ou de terminer le niveau en moins de 30 secondes pour obtenir des choix supplémentaires et des améliorations.", "level_up.compliment_advice": "Essayez d'attraper toutes les pièces, de ne jamais rater les briques, de ne pas toucher les murs ou de terminer le niveau en moins de 30 secondes pour obtenir des choix supplémentaires et des améliorations.",
"level_up.compliment_good": "Bravo !", "level_up.compliment_good": "Bravo !",
"level_up.compliment_perfect": "Impressionnant, continuez comme ça !", "level_up.compliment_perfect": "Impressionnant, continuez comme ça !",
"level_up.pick_upgrade_title": "Choisir une amélioration", "level_up.pick_upgrade_title": "Choisir une amélioration",
"level_up.plus_one_choice": "(+1 choix)", "level_up.plus_one_upgrade": "(+1 upgrade)",
"level_up.plus_one_upgrade": "(+1 amélioration et +1 choix)", "level_up.plus_one_upgrade_and_reroll": "(+1 amélioration et +1 relance)",
"level_up.unlocked_level": " (Niveau)", "level_up.reroll": "Relancer ({{count}})",
"level_up.unlocked_perk": " (Amélioration)", "level_up.reroll_help": "Nouveaux choix",
"level_up.upgrade_perk_to_level": " niveau {{level}}", "level_up.upgrade_perk_to_level": " niveau {{level}}",
"main_menu.basic": "Graphismes simplifiés", "main_menu.basic": "",
"main_menu.basic_help": "Meilleures performances.", "main_menu.basic_help": "",
"main_menu.download_save_file": "Sauvegarder mes progrès", "main_menu.colorful_coins": "",
"main_menu.download_save_file_help": "Obtenir un fichier de sauvegarde", "main_menu.colorful_coins_help": "",
"main_menu.footer_html": " <p> \n<span>Programmé en France par <a href=\"https://lecaro.me\">Renan LE CARO</a>.</span>\n<a href=\"https://paypal.me/renanlecaro\" target=\"_blank\">Donner</a>\n<a href=\"https://discord.gg/DZSPqyJkwP\" target=\"_blank\">Discord</a>\n<a href=\"https://f-droid.org/en/packages/me.lecaro.breakout/\" target=\"_blank\">F-Droid</a>\n<a href=\"https://play.google.com/store/apps/details?id=me.lecaro.breakout\" target=\"_blank\">Google Play</a>\n<a href=\"https://renanlecaro.itch.io/breakout71\" target=\"_blank\">itch.io</a>\n<a href=\"https://gitlab.com/lecarore/breakout71\" target=\"_blank\">Gitlab</a>\n<a href=\"https://breakout.lecaro.me/\" target=\"_blank\">Version web</a>\n<a href=\"https://news.ycombinator.com/item?id=43183131\" target=\"_blank\">HackerNews</a>\n<a href=\"https://breakout.lecaro.me/privacy.html\" target=\"_blank\">Politique de confidentialité</a> \n<span>v.{{appVersion}}</span>\n</p>", "main_menu.comboIncreaseTexts": "",
"main_menu.fullscreen": "Plein écran", "main_menu.comboIncreaseTexts_help": "",
"main_menu.fullscreen_exit": "Quitter le plein écran", "main_menu.contrast": "",
"main_menu.fullscreen_exit_help": "Ne fonctionne pas toujours", "main_menu.contrast_help": "",
"main_menu.fullscreen_help": "Ne fonctionne pas toujours", "main_menu.credit_levels": "",
"main_menu.kid": "Mode enfants", "main_menu.donate": "Vous avez joué {{hours}} heures",
"main_menu.kid_help": "Balle plus lente", "main_menu.donate_help": "Pourriez-vous donner quelques euros ? Vous pouvez masquer ce rappel dans les paramètres.",
"main_menu.language": "Langue", "main_menu.donation_reminder": "",
"main_menu.language_help": "Changer la langue d'affichage", "main_menu.donation_reminder_help": "",
"main_menu.load_save_file": "Charger une sauvegarde", "main_menu.download_save_file": "",
"main_menu.load_save_file_help": "Depuis un fichier ", "main_menu.download_save_file_help": "",
"main_menu.max_coins": "{{max}} pièces affichées maximum", "main_menu.extra_bright": "",
"main_menu.max_coins_help": "Visuel uniquement, pas d'impact sur le score", "main_menu.extra_bright_help": "",
"main_menu.max_particles": " {{max}} particules maximum", "main_menu.fullscreen": "",
"main_menu.max_particles_help": "Limite le nombre de particules affichées à l'écran pour les effets visuels", "main_menu.fullscreen_help": "",
"main_menu.mobile": "Mode mobile", "main_menu.help_content": "",
"main_menu.mobile_help": "Laisse un espace sous le palet.", "main_menu.help_help": "",
"main_menu.pointer_lock": "Verrouillage du pointeur", "main_menu.help_title": "",
"main_menu.pointer_lock_help": "Cache aussi le curseur de la souris.", "main_menu.help_upgrades": "",
"main_menu.record": "Enregistrer des vidéos de jeu", "main_menu.high_score": "High score : {{score}}",
"main_menu.record_download": "Télécharger la vidéo ({{size}} MB)", "main_menu.kid": "",
"main_menu.record_help": "Obtenez une vidéo de chaque niveau.", "main_menu.kid_help": "",
"main_menu.reset": "Réinitialiser le jeu", "main_menu.language": "",
"main_menu.reset_cancel": "Non", "main_menu.language_help": "",
"main_menu.reset_confirm": "Oui", "main_menu.load_save_file": "",
"main_menu.reset_help": "Effacer les scores et statistiques", "main_menu.load_save_file_help": "",
"main_menu.reset_instruction": "Vous perdrez tous les progrès que vous avez faits dans le jeu, êtes-vous sûr ?", "main_menu.max_coins": "",
"main_menu.resume": "Retourner à la partie", "main_menu.max_coins_help": "",
"main_menu.resume_help": "Continuer la partie en cours", "main_menu.max_particles": "",
"main_menu.save_file_error": "Erreur lors du chargement du fichier de sauvegarde", "main_menu.max_particles_help": "",
"main_menu.save_file_loaded": "Sauvegarde chargée", "main_menu.mobile": "",
"main_menu.save_file_loaded_help": "L'appli va redémarrer", "main_menu.mobile_help": "",
"main_menu.save_file_loaded_ok": "Ok", "main_menu.normal": "Nouvelle Partie",
"main_menu.normal_help": "Avec un avantage de départ aléatoire",
"main_menu.pointer_lock": "",
"main_menu.pointer_lock_help": "",
"main_menu.record": "",
"main_menu.record_download": "",
"main_menu.record_help": "",
"main_menu.red_miss": "",
"main_menu.red_miss_help": "",
"main_menu.reset": "",
"main_menu.reset_cancel": "",
"main_menu.reset_confirm": "",
"main_menu.reset_help": "",
"main_menu.reset_instruction": "",
"main_menu.save_file_error": "",
"main_menu.save_file_loaded": "",
"main_menu.save_file_loaded_help": "",
"main_menu.save_file_loaded_ok": "",
"main_menu.settings_help": "Adaptez le jeu à vos besoins", "main_menu.settings_help": "Adaptez le jeu à vos besoins",
"main_menu.settings_title": "Paramètre", "main_menu.settings_title": "Paramètre",
"main_menu.show_fps": "Compteur de FPS", "main_menu.show_fps": "",
"main_menu.show_fps_help": "Surveiller la perf du jeu", "main_menu.show_fps_help": "",
"main_menu.sounds": "Sons du jeu", "main_menu.show_stats": "",
"main_menu.sounds_help": "Ralentis certains téléphones.", "main_menu.show_stats_help": "",
"main_menu.sounds": "",
"main_menu.sounds_help": "",
"main_menu.starting_perks": "",
"main_menu.starting_perks_checked": "",
"main_menu.starting_perks_full_random": "",
"main_menu.starting_perks_help": "",
"main_menu.starting_perks_unchecked": "",
"main_menu.title": "Breakout 71", "main_menu.title": "Breakout 71",
"main_menu.unlocks": "Améliorations et niveaux", "main_menu.unlocks": "Contenu débloqué",
"main_menu.unlocks_help": "Essayez les éléments débloqués", "main_menu.unlocks_help": "Essayez les éléments débloqués",
"play.close_modale_window_tooltip": "Fermer", "play.close_modale_window_tooltip": "Fermer",
"play.current_lvl": "Niveau {{level}}/{{max}}", "play.current_lvl": "Niveau {{level}}/{{max}}",
"play.menu_label": "Menu", "play.menu_label": "Menu",
"play.menu_tooltip": "Ouvrir le menu principal",
"play.missed_ball": "raté", "play.missed_ball": "raté",
"play.mobile_press_to_play": "Gardez le doigt ici pour jouer", "play.mobile_press_to_play": "Gardez le doigt ici pour jouer",
"sandbox.help": "Tester n'importe quelle combinaison d'améliorations", "play.score_tooltip": "Consultez votre score, améliorations et plus encore",
"sandbox.instructions": "Sélectionnez les amélioration ci-dessous et appuyez sur \"Démarrer la partie de test\" pour les tester. Les scores et les statistiques ne seront pas enregistrés.", "play.stats.coins_catch_rate": "Taux de capture des pièces ",
"sandbox.start": "Démarrer la partie de test", "play.stats.levelMisses": "Tirs ratés, ou vous n'avez touché aucune brique",
"sandbox.title": "Mode bac à sable", "play.stats.levelTime": "Durée du niveau",
"sandbox.unlocks_at": "Déverrouillé à partir d'un score total de {{score}}", "play.stats.levelWallBounces": "Rebonds sur les murs",
"score_panel.restart": "Redémarrer", "score_panel.close_to_unlock": "Prochain niveau débloqué : ",
"score_panel.restart_help": "Commencer une nouvelle partie", "score_panel.get_upgrades_to_unlock": "Obtenez {{missingUpgrades}} et attrapez {{points}} pièces supplémentaires pour débloquer le niveau « {{level}} »",
"score_panel.resume": "Continuer la partie", "score_panel.rerolls_count": "Vous avez accumulé {{rerolls}} rerolls",
"score_panel.resume_help": "Fermer cette fenêtre pour retourner au jeu", "score_panel.score_to_unlock": "Attrapez {{points}} pièces supplémentaires pour débloquer le niveau « {{level}} »",
"score_panel.test_run": "Il s'agit d'une partie d'essai, le score n'est pas enregistré.",
"score_panel.title": "{{score}} points au niveau {{level}}/{{max}} ", "score_panel.title": "{{score}} points au niveau {{level}}/{{max}} ",
"score_panel.upgrades_picked": "Améliorations choisies jusqu'à présent :", "score_panel.upcoming_levels": "Niveaux de la parties : ",
"score_panel.upgrades_picked": "Améliorations choisies pendant la partie :",
"settings.autoplay": "",
"settings.autoplay_help": "",
"settings.basic": "Graphismes simplifiés",
"settings.basic_help": "Meilleures performances.",
"settings.colorful_coins": "Pièces colorées",
"settings.colorful_coins_help": "Les pièces apparaissent toujours de la couleur de la brique",
"settings.comboIncreaseTexts": "Afficher un +X doré",
"settings.comboIncreaseTexts_help": "Quand le combo augmente",
"settings.contrast": "Contraste élevé",
"settings.contrast_help": "Affichage plus contrasté et coloré",
"settings.donation_reminder": "Me rappeler de donner",
"settings.donation_reminder_help": "Afficher le temps de jeu et un lien pour donner dans le menu principal",
"settings.download_save_file": "Sauvegarder mes progrès",
"settings.download_save_file_help": "Obtenir un fichier de sauvegarde",
"settings.extra_bright": "Plus de lumière",
"settings.extra_bright_help": "Plus grand halo lumineux autours des briques et pièces.",
"settings.fullscreen": "Plein écran",
"settings.fullscreen_help": "Le jeu essaiera de passer en plein écran quand vous le démarrez",
"settings.kid": "Mode enfants",
"settings.kid_help": "Balle plus lente",
"settings.language": "Langue",
"settings.language_help": "Changer la langue d'affichage",
"settings.load_save_file": "Charger une sauvegarde",
"settings.load_save_file_help": "Depuis un fichier ",
"settings.max_coins": "{{max}} pièces affichées maximum",
"settings.max_coins_help": "Visuel uniquement, pas d'impact sur le score",
"settings.mobile": "Mode mobile",
"settings.mobile_help": "Laisse un espace sous la raquette.",
"settings.pointer_lock": "Verrouillage du pointeur",
"settings.pointer_lock_help": "Cache aussi le curseur de la souris.",
"settings.precise_lighting": "",
"settings.precise_lighting_help": "",
"settings.probabilistic_lighting": "",
"settings.probabilistic_lighting_help": "",
"settings.record": "Enregistrer des vidéos de jeu",
"settings.record_download": "Télécharger la vidéo ({{size}} MB)",
"settings.record_help": "Obtenez une vidéo de chaque niveau.",
"settings.red_miss": "Balles ratées",
"settings.red_miss_help": "Afficher des particules rouges autours des balles qui redescendent sans avoir touché une brique.",
"settings.reset": "Réinitialiser le jeu",
"settings.reset_cancel": "Non",
"settings.reset_confirm": "Oui",
"settings.reset_help": "Effacer les scores, statistiques et temps de jeu",
"settings.reset_instruction": "Vous perdrez tous les progrès que vous avez faits dans le jeu, êtes-vous sûr ?",
"settings.save_file_error": "Erreur lors du chargement du fichier de sauvegarde",
"settings.save_file_loaded": "Sauvegarde chargée",
"settings.save_file_loaded_help": "L'appli va redémarrer",
"settings.save_file_loaded_ok": "Ok",
"settings.show_fps": "Compteur de FPS",
"settings.show_fps_help": "Surveiller la performance du jeu",
"settings.show_stats": "Statistiques en temps réel",
"settings.show_stats_help": "Pièces, temps, rebonds, ratés",
"settings.smooth_lighting": "",
"settings.smooth_lighting_help": "",
"settings.sounds": "Sons du jeu",
"settings.sounds_help": "Bips, bloops et brrrr",
"settings.stress_test": "",
"settings.stress_test_help": "",
"starting_perks.checked": "Lorsque vous démarrez une nouvelle partie, l'un de ces avantages vous sera attribué. Cliquez sur un avantage pour l'exclure.",
"starting_perks.help": "Choisissez les avantages de départ",
"starting_perks.random": "Tous les avantages ont été retirés, le choix sera aléatoire.",
"starting_perks.title": "Avantages de départ",
"starting_perks.unchecked": "Les avantages ci-dessous ne sont pas proposés comme avantages de départ, mais vous pouvez cliquer pour les ajouter aux avantages de départ possibles.",
"unlocks.greyed_out_help": "Les éléments grisées peuvent être débloquées en augmentant votre score total. Le score total augmente à chaque fois que vous marquez des points dans le jeu.", "unlocks.greyed_out_help": "Les éléments grisées peuvent être débloquées en augmentant votre score total. Le score total augmente à chaque fois que vous marquez des points dans le jeu.",
"unlocks.intro": "Votre score total est de {{ts}}. Vous trouverez ci-dessous toutes les améliorations et tous les niveaux que le jeu peut offrir.", "unlocks.intro": "Votre score total est de {{ts}}. Vous trouverez ci-dessous toutes les améliorations et tous les niveaux que le jeu peut offrir. Cliquez sur l'un d'entre eux pour les essayer dans une partie de test. ",
"unlocks.level_description": "Un niveau {{size}}x{{size}} avec {{bricks}} briques", "unlocks.just_unlocked": "Niveau débloqué",
"unlocks.title": "Vous avez débloqué {{percentUnlock}}% du jeu.", "unlocks.just_unlocked_plural": "Vous venez de débloquer {{count}} niveaux",
"unlocks.unlocks_at": "Déverrouillé au score total {{threshold}}.", "unlocks.level": "<h2>Vous avez débloqué {{unlocked}} niveaux sur {{out_of}}</h2>\n<p>Voici tous les niveaux du jeu, cliquez sur l'un d'eux pour l'essayer. </p> ",
"upgrades.asceticism.fullHelp": "Il faudra trouver un moyen de stocker les pièces pendant que le combo grandis. ", "unlocks.level_description": "Un niveau {{size}}x{{size}} avec {{bricks}} briques, {{colors}} couleurs et {{bombs}} bombes.",
"upgrades.asceticism.help": "+1 combo par brique cassée, RAZ quand une pièce est attrapée", "unlocks.minScore": "Atteignez un score de ${{minScore}} dans une partie pour débloquer.",
"unlocks.minScoreWithPerks": "Atteignez ${{minScore}} dans une partie avec {{required}} mais sans {{forbidden}}.",
"unlocks.minTotalScore": "Accumuler un total de ${{score}}",
"unlocks.reached": "Votre meilleur score pour l'instant est {{reached}}.",
"unlocks.title_upgrades": "Vous avez débloqué {{unlocked}} améliorations sur {{out_of}}",
"upgrades.addiction.name": "Addiction",
"upgrades.addiction.tooltip": "+{{lvl}} combo / brique, combo perdu après {{delay}}s sans casser de briques",
"upgrades.addiction.verbose_description": "Le décompte ne commence qu'à parti de la destruction de la première brique du niveau, et s'arrête dès qu'il n'y a plus de briques. ",
"upgrades.asceticism.name": "Ascétisme", "upgrades.asceticism.name": "Ascétisme",
"upgrades.ball_attract_ball.fullHelp": "Les balles qui sont éloignées de plus d'une demi-largeur d'écran commencent à s'attirer. La force d'attraction est plus forte lorsque les balles sont plus éloignées l'une de l'autre. Des particules arc-en-ciel voleront pour symboliser la force d'attraction. Cet avantage n'est offert que si vous avez déjà plus d'une balle en jeu.", "upgrades.asceticism.tooltip": "+{{combo}} combo par brique cassée, - {{combo}} quand une pièce est attrapée",
"upgrades.ball_attract_ball.help": "Les balles attirent les balles", "upgrades.asceticism.verbose_description": "Il faudra trouver un moyen de stocker les pièces pendant que le combo grandis. ",
"upgrades.ball_attract_ball.help_plural": "Force d'attraction plus forte", "upgrades.ball_attract_ball.help_plural": "Force d'attraction plus forte",
"upgrades.ball_attract_ball.name": "Gravité", "upgrades.ball_attract_ball.name": "Gravité",
"upgrades.ball_attracts_coins.fullHelp": "Ne me demandez pas pourquoi ça va que dans une sens. ", "upgrades.ball_attract_ball.tooltip": "Les balles attirent les balles",
"upgrades.ball_attracts_coins.help": "Les balles attirent les pièces", "upgrades.ball_attract_ball.verbose_description": "Les balles qui sont éloignées de plus de 3/4 de la largeur d'écran commencent à s'attirer. La force d'attraction est plus forte lorsque les balles sont plus éloignées l'une de l'autre. Des particules arc-en-ciel voleront pour symboliser la force d'attraction. Cet avantage n'est offert que si vous avez déjà plus d'une balle en jeu.",
"upgrades.ball_attracts_coins.name": "Balles de fortune", "upgrades.ball_attracts_coins.name": "Balles fortunées",
"upgrades.ball_repulse_ball.fullHelp": "Les balles qui se trouvent à moins d'une demi-largeur d'écran commencent à se repousser les unes les autres. La force de répulsion est plus forte si elles sont proches l'une de l'autre. Des particules seront affichées pour symboliser l'application de cette force. Cet avantage n'est offert que si vous avez déjà plus d'une balle.", "upgrades.ball_attracts_coins.tooltip": "Les pièces accompagnent la balle la plus proche ",
"upgrades.ball_repulse_ball.help": "Les balles repoussent les balles", "upgrades.ball_attracts_coins.verbose_description": "Vous pourriez l'utiliser pour que les pièces orbitent autours de la balle et colorent les briques à proximité, ou comme une sorte de coin magnet. ",
"upgrades.ball_repulse_ball.help_plural": "Force de répulsion plus forte", "upgrades.ball_repulse_ball.help_plural": "Force de répulsion plus forte",
"upgrades.ball_repulse_ball.name": "Vol en formation", "upgrades.ball_repulse_ball.name": "Vol en formation",
"upgrades.base_combo.fullHelp": "Votre combo (nombre de pièces par brique) commence normalement à 1 au début du niveau et revient à 1 lorsque vous rebondissez sans rien toucher. Avec cette caractéristique, le combo commence 3 points plus haut, ce qui fait que vous obtiendrez toujours au moins 4 pièces par brique. Lorsque votre combo est réinitialisé, il revient à 4 et non à 1. Votre balle scintillera un peu pour indiquer que son combo est supérieur à 1.", "upgrades.ball_repulse_ball.tooltip": "Les balles repoussent les balles",
"upgrades.base_combo.help": "Le combo commence à {{coins}}.", "upgrades.ball_repulse_ball.verbose_description": "Les balles qui se trouvent à moins d'un quart de largeur d'écran commencent à se repousser les unes les autres. La force de répulsion est plus forte si elles sont proches l'une de l'autre. Des particules seront affichées pour symboliser l'application de cette force. Cet avantage n'est offert que si vous avez déjà plus d'une balle.",
"upgrades.base_combo.name": "Combo +3", "upgrades.base_combo.name": "Meilleur base",
"upgrades.bigger_explosions.fullHelp": "L'explosion par défaut efface un carré de 3x3 briques, avec cette amélioration un carré de 5x5. Le vent soufflant les pièces est également beaucoup plus fort. L'écran clignotera un peu après chaque explosion (sauf en mode graphismes basiques).", "upgrades.base_combo.tooltip": "Le combo commence à {{coins}} au lieu de 1.",
"upgrades.bigger_explosions.help": "Explosions plus violentes", "upgrades.base_combo.verbose_description": "Votre combo commence normalement à 1 au début du niveau et revient à 1 lorsque vous rebondissez sans rien toucher. Avec cette caractéristique, le combo commence 3 points plus haut, ce qui fait que vous obtiendrez toujours au moins 4 pièces par brique. Lorsque votre combo est réinitialisé, il revient à 4 et non à 1. Votre balle scintillera un peu pour indiquer que son combo est supérieur à 1.",
"upgrades.bigger_explosions.name": "Kaboom", "upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_puck.fullHelp": "Un grand palet permet de ne jamais rater la balle et d'attraper plus de pièces, ainsi que d'orienter précisément les rebonds (l'angle de la balle ne dépend que de l'endroit où elle touche le palet). Cependant, un grand palet est plus difficile à utiliser sur les côtés du niveau.", "upgrades.bigger_explosions.tooltip": "Explosions plus violentes",
"upgrades.bigger_puck.help": "Attrapez facilement plus de pièces.", "upgrades.bigger_explosions.verbose_description": "L'explosion par défaut efface un carré de 3x3 briques, avec cette amélioration un carré de 5x5. Le vent soufflant les pièces est également beaucoup plus fort. L'écran clignotera un peu après chaque explosion (sauf en mode graphismes basiques).",
"upgrades.bigger_puck.name": "Palet plus grand", "upgrades.bigger_puck.name": "Raquette plus grande",
"upgrades.coin_magnet.fullHelp": "Dirige les pièces vers le palet. L'effet est plus fort si la pièce est déjà proche du palet. Attraper 90 % ou 100 % des pièces apporte des bonus spéciaux dans le jeu. Une autre façon d'attraper plus de pièces est de frapper les briques par le bas. La vitesse et la direction de la balle ont un impact sur la vitesse des pièces produites.", "upgrades.bigger_puck.tooltip": "Attrapez facilement plus de pièces.",
"upgrades.coin_magnet.help": "Le palet attire les pièces", "upgrades.bigger_puck.verbose_description": "Une grande raquette permet de ne jamais rater la balle et d'attraper plus de pièces, ainsi que d'orienter précisément les rebonds. Cependant, une grande raquette est plus difficile à utiliser sur les côtés du niveau.",
"upgrades.bricks_attract_ball.name": "Les briques attirent les balles",
"upgrades.bricks_attract_ball.tooltip": "La balle se dirige vers les {{count}} premières briques qu'elle touchera.",
"upgrades.bricks_attract_ball.verbose_description": "L'effet est plus fort à des niveaux plus élevés. Le nombre de briques pouvant être touchées avant que l'effet ne s'arrête est également plus élevé. L'effet se réarme lorsque la balle touche le palet.",
"upgrades.bricks_attract_coins.name": "Briques attirent les pièces",
"upgrades.bricks_attract_coins.tooltip": "Aide à garder les pièces en suspension",
"upgrades.bricks_attract_coins.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. ",
"upgrades.coin_magnet.help_plural": "Effet plus marqué sur les pièces", "upgrades.coin_magnet.help_plural": "Effet plus marqué sur les pièces",
"upgrades.coin_magnet.name": "Aimant pour pièces", "upgrades.coin_magnet.name": "Aimant pour pièces",
"upgrades.compound_interest.fullHelp": "Votre combo augmentera d'une unité à chaque fois que vous casserez une brique, générant de plus en plus de pièces à chaque fois que vous casserez une brique. Veillez cependant à attraper chacune de ces pièces avec votre palet, car toute pièce perdue remettra votre combo à zéro. \n \nSi votre combinaison est supérieure au minimum, une ligne rouge s'affichera au bas de la zone de jeu pour vous le rappeler que les pièces ne doivent pas aller à cet endroit.\n\nCet avantage se combine avec d'autres avantages de combo, le combo augmentera plus rapidement mais se réinitialisera plus souvent.", "upgrades.coin_magnet.tooltip": "La raquette attire les pièces",
"upgrades.compound_interest.help": "+1 combo par brique cassée, remise à zéro quand une pièce est perdu", "upgrades.coin_magnet.verbose_description": "Dirige les pièces vers la raquette. L'effet est plus fort sur les pièces déjà proche de la raquette. ",
"upgrades.compound_interest.name": "Intérêts", "upgrades.compound_interest.name": "Intérêts composés",
"upgrades.concave_puck.fullHelp": " Les balles démarrent verticalement en début de niveau, et rebondi sur le palet de manière plus verticale et inversée.", "upgrades.compound_interest.tooltip": "+{{lvl}} combo par brique cassée, remise à zéro quand une pièce est perdu",
"upgrades.concave_puck.help": "Aide à éviter les bords.", "upgrades.compound_interest.verbose_description": "Votre combo augmentera d'une unité à chaque fois que vous casserez une brique. Toute pièce perdue remettra votre combo à zéro. \n\nSi votre combo est supérieure au minimum, une ligne rouge s'affichera au bas de la zone de jeu pour vous le rappeler que les pièces ne doivent pas aller à cet endroit.",
"upgrades.concave_puck.name": "Palet concave", "upgrades.concave_puck.name": "Raquette concave",
"upgrades.etherealcoins.fullHelp": "Il faudrait vous assurer que les pièces tomberont bien quand même à un moment", "upgrades.concave_puck.tooltip": "Aide à éviter les bords.",
"upgrades.etherealcoins.help": "Les pièces ne subissent plus la gravité", "upgrades.concave_puck.verbose_description": "Les balles démarrent verticalement en début de niveau, et rebondi sur la raquette de manière plus verticale et inversée.",
"upgrades.corner_shot.name": "Tir en coin",
"upgrades.corner_shot.tooltip": "Laisse votre raquette sortir de la zone encadrée",
"upgrades.corner_shot.verbose_description": "Aide à viser dans les coins",
"upgrades.etherealcoins.name": "Monnaie spatiale ", "upgrades.etherealcoins.name": "Monnaie spatiale ",
"upgrades.extra_levels.fullHelp": "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.etherealcoins.tooltip": "Les pièces ne subissent plus la gravité ou la friction",
"upgrades.extra_levels.help": "Jouer {{count}} niveaux au lieu de 7", "upgrades.etherealcoins.verbose_description": "Les pièces garderont leur vitesse même après plusieurs rebonds, et ne subirons plus la gravité. ",
"upgrades.extra_levels.name": "+1 niveau", "upgrades.extra_levels.name": "Encore 5 minutes",
"upgrades.extra_life.fullHelp": "Normalement, vous n'avez qu'une seule balle par manche, et la manche est terminée dès que vous la laissez tomber.\nCette compétence ajoute une barre blanche en bas de l'écran qui sauvera une balle une fois, et se brisera au cours du processus.\nVous pouvez prendre plusieurs vies d'avances, elle seront utilisées à chaque fois qu'une balle est sur le point d'être perdue. ", "upgrades.extra_levels.tooltip": "Jouer {{count}} niveaux au lieu de 7",
"upgrades.extra_life.help": "La balle rebondit une fois avant d'être perdue.", "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.help_plural": "La balle rebondit {{lvl}} fois avant d'être perdue.", "upgrades.extra_life.help_plural": "La (dernière) balle rebondit en bas de l'écran au lieu d'être perdue ( {{lvl}} fois).",
"upgrades.extra_life.name": "+1 vie", "upgrades.extra_life.name": "Seconde chance",
"upgrades.forgiving.fullHelp": " La première brique ratée par niveau ne coûte rien, la suivante 10%, 20%, etc.", "upgrades.extra_life.tooltip": "La balle rebondit une fois avant d'être perdue.",
"upgrades.forgiving.help": "Rater les briques fait perdre un portion progressivement plu importante du combo", "upgrades.extra_life.verbose_description": "Normalement, vous n'avez qu'une seule balle par manche, et la manche est terminée dès que vous la laissez tomber.\n\nCette compétence ajoute une barre blanche en bas de l'écran qui sauvera une balle une fois, et se brisera au cours du processus.\n\nVous pouvez prendre plusieurs vies d'avances, elle seront utilisées à chaque fois qu'une balle est sur le point d'être perdue. ",
"upgrades.forgiving.name": "L'erreur est humaine", "upgrades.forgiving.name": "L'erreur est humaine",
"upgrades.ghost_coins.fullHelp": "Ce n'est pas une bug, c'est une fonctionnalité", "upgrades.forgiving.tooltip": "Rater les briques fait perdre un portion progressivement plu importante du combo",
"upgrades.ghost_coins.help": "Les pièces traversent les briques", "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.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.ghost_coins.name": "Pièces fantôme", "upgrades.ghost_coins.name": "Pièces fantôme",
"upgrades.helium.fullHelp": "Les pièces attendront d'être sous le palet pour tomber. ", "upgrades.ghost_coins.tooltip": "Les pièces traversent les briques doucement",
"upgrades.helium.help": "Les pièce flottent au lieu de tomber autours du palet", "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.helium.name": "Helium", "upgrades.helium.name": "Hélium",
"upgrades.hot_start.fullHelp": "Au début de chaque niveau, votre combo commencera à +15 points, mais à chaque seconde, il sera diminué d'un point. Cela signifie que les 15 premières secondes d'un niveau produiront beaucoup plus de pièces que les suivantes.\nVous devez vous assurer de terminer le niveau rapidement. L'effet se cumule avec d'autres avantages liés au combo, ce qui vous permet d'augmenter le combo après les 15 secondes, mais il continuera à diminuer chaque seconde. Chaque fois que vous reprenez la compétence, l'effet est encore plus prononcé.", "upgrades.helium.tooltip": "Les pièce flottent au lieu de tomber autours de la raquette.",
"upgrades.hot_start.help": "Combo à {{start}}, -{{lvl}} combo par seconde", "upgrades.helium.verbose_description": "Les pièces attendront d'être sous la raquette pour tomber. ",
"upgrades.hot_start.name": "Démarrage à chaud", "upgrades.hot_start.name": "Démarrage à chaud",
"upgrades.instant_upgrade.fullHelp": "Choisissez immédiatement deux améliorations, afin d'en obtenir une gratuite et une autre pour rembourser celle utilisée pour obtenir cet avantage. Chaque fois que vous choisirez des améliorations dans le menu suivant, vous aurez moins de choix.", "upgrades.hot_start.tooltip": "Combo à {{start}}, -{{loss}} combo par seconde",
"upgrades.instant_upgrade.help": "-1 choix jusqu'à la fin de la course.", "upgrades.hot_start.verbose_description": "Au début de chaque niveau, votre combo commencera à +30 points, mais à chaque seconde, il sera diminué d'un point. ",
"upgrades.instant_upgrade.name": "+2 améliorations maintenant", "upgrades.hypnosis.name": "Hypnose",
"upgrades.left_is_lava.fullHelp": "Chaque fois que vous cassez une brique, votre combo augmente d'une unité, ce qui vous permet d'obtenir une pièce de plus à chaque fois que vous cassez une brique.\n\nCependant, votre combinaison se réinitialise dès que votre balle touche le côté gauche.\n\nDès que votre combo augmente, le côté gauche devient rouge pour vous rappeler que vous devez éviter de le frapper.\n\nL'effet se cumule avec d'autres avantages de combo, le combo augmente plus rapidement avec plus d'améliorations, mais il se réinitialise également si l'une ou l'autre des conditions de réinitialisation est remplie. ", "upgrades.hypnosis.tooltip": "Chaque fois qu'une brique change de couleur, téléportez cette pièce vers la boule la plus proche et rechargez sa capacité à tacher une brique.",
"upgrades.left_is_lava.help": "Plus de pièces si vous ne touchez pas le côté gauche.", "upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "Implosions",
"upgrades.implosions.tooltip": "Les explosions aspirent les pièces au lieu de les faire exploser.",
"upgrades.implosions.verbose_description": "La force dexplosion est appliquée dans lautre sens. Les niveaux 2+ augmentent la puissance de l'implosion. ",
"upgrades.instant_upgrade.name": "Un tiens vaut deux tu l'auras",
"upgrades.instant_upgrade.tooltip": "+2 améliorations, -1 choix jusqu'à la fin de la partie.",
"upgrades.instant_upgrade.verbose_description": "Choisissez immédiatement deux améliorations, afin d'en obtenir une gratuite et une autre pour rembourser celle utilisée pour obtenir cet avantage. Chaque fois que vous choisirez des améliorations dans le menu suivant, vous aurez moins de choix.",
"upgrades.left_is_lava.name": "Éviter le côté gauche", "upgrades.left_is_lava.name": "Éviter le côté gauche",
"upgrades.metamorphosis.fullHelp": "Avec cette amélioration, les pièces seront de la couleur de la brique d'où elles proviennent et coloreront la première brique qu'elles toucheront. \n\nLes pièces apparaissent à la vitesse de la balle qui les a cassées, ce qui signifie que vous pouvez viser un peu dans la direction des briques que vous voulez \"peindre\".", "upgrades.left_is_lava.tooltip": "+{{lvl}} combo par brique, perdu en touchant le bord gauche",
"upgrades.metamorphosis.help": "Les pièces de monnaie tachent les briques qu'elles touchent", "upgrades.left_is_lava.verbose_description": "Chaque fois que vous cassez une brique, votre combo augmente d'une unité, ce qui vous permet d'obtenir une pièce de plus à chaque fois que vous cassez une brique.\n\nCependant, votre combinaison se réinitialise dès que votre balle touche le côté gauche.\n\nDès que votre combo augmente, le côté gauche devient rouge pour vous rappeler que vous devez éviter de le frapper.",
"upgrades.limitless.name": "Sans limites",
"upgrades.limitless.tooltip": "Augmenter le niveau maximum de toutes les mises à niveau de {{lvl}} ",
"upgrades.limitless.verbose_description": "Choisir cet avantage augmente également sa propre limite d'un point, vous permettant de le choisir à nouveau.",
"upgrades.metamorphosis.name": "Métamorphose", "upgrades.metamorphosis.name": "Métamorphose",
"upgrades.multiball.fullHelp": "Dès que vous laissez tomber la balle dans Breakout 71, vous perdez. \n\nAvec cet avantage, vous obtenez deux balles, et vous pouvez donc vous permettre d'en perdre une.\n\nLes balles perdues reviennent au niveau suivant. \n\nLe fait d'avoir plus d'une balle permet d'obtenir d'autres avantages et, bien sûr, de franchir le niveau plus rapidement.", "upgrades.metamorphosis.tooltip": "Chaque pièce peut tacher {{lvl}} brique(s) avec sa couleur",
"upgrades.multiball.help": "Chaque niveau commence avec {{count}} balles.", "upgrades.metamorphosis.verbose_description": "Avec cette amélioration, les pièces seront de la couleur de la brique d'où elles proviennent et coloreront la première brique qu'elles toucheront. Les pièces apparaissent à la vitesse de la balle qui les a cassées, ce qui signifie que vous pouvez viser un peu dans la direction des briques que vous voulez \"peindre\". Au à chaque niveau, chaque pièce peut colorier une brique de plus avant d'être \"épuisée\" et d'apparaître vide.",
"upgrades.multiball.name": "+1 balle", "upgrades.minefield.name": "Terrain miné",
"upgrades.nbricks.fullHelp": "Si votre balle rebondis sans casser une brique, ça compte quand même comme une frappe. Les briques détruites par des explosions ne comptent pas.", "upgrades.minefield.tooltip": "+{{lvl}} combo par brique explosive à l'écran",
"upgrades.nbricks.help": "Frappez exactement {{lvl}} briques par rebond pour +{{lvl}} combo, sinon RAZ", "upgrades.minefield.verbose_description": "Ajoute +lvl au combo lorsqu'une brique est placée, -lvl lorsqu'elle est détruite et augmente le combo de base du nombre de briques multiplié par le niveau",
"upgrades.multiball.name": "Multi balle",
"upgrades.multiball.tooltip": "Chaque niveau commence avec {{count}} balles.",
"upgrades.multiball.verbose_description": "Dès que vous laissez tomber la balle dans Breakout 71, vous perdez. \n\nAvec cet avantage, vous obtenez deux balles, et vous pouvez donc vous permettre d'en perdre une.\n\nLes balles perdues reviennent au niveau suivant. \n\nLe fait d'avoir plus d'une balle permet d'obtenir d'autres avantages et, bien sûr, de franchir le niveau plus rapidement.",
"upgrades.nbricks.name": "Prélèvement", "upgrades.nbricks.name": "Prélèvement",
"upgrades.one_more_choice.fullHelp": "Chaque menu d'amélioration comportera une option supplémentaire. Cela n'augmente pas le nombre d'améliorations que vous pouvez choisir, mais vous aide à créer le profile idéal. ", "upgrades.nbricks.tooltip": "Frappez exactement {{lvl}} briques par rebond pour +{{lvl}} combo, sinon combo perdu",
"upgrades.one_more_choice.help": "Les niveaux suivants offriront une option supplémentaire dans la liste d'améliorations.", "upgrades.nbricks.verbose_description": "Si votre balle rebondis sans casser une brique, ça compte quand même comme une frappe. Les briques détruites par des explosions ne comptent pas.",
"upgrades.one_more_choice.name": "+1 choix jusqu'à la fin de la course", "upgrades.one_more_choice.name": "La réponse D",
"upgrades.passive_income.fullHelp": "Certaines amélioration font bouger les balles sans avoir besoin de mettre le palet en mouvement.", "upgrades.one_more_choice.tooltip": "1 choix supplémentaire d'amélioration proposé jusqu'à la fin de la partie",
"upgrades.passive_income.help": "+1 combo par brique cassée, RAZ quand le palet bouge", "upgrades.one_more_choice.verbose_description": "Chaque menu d'amélioration comportera une option supplémentaire. Cela n'augmente pas le nombre d'améliorations que vous pouvez choisir, mais vous aide à créer le profile idéal. \"La réponse D\" est une référence à un sketch classique. ",
"upgrades.passive_income.name": "Revenu passif", "upgrades.passive_income.name": "Revenu passif",
"upgrades.picky_eater.fullHelp": "Chaque fois que vous cassez une brique de la même couleur que votre balle, votre combo augmente d'une unité.\n\nS'il s'agit d'une couleur différente, la balle adopte cette nouvelle couleur, mais la combinaison est réinitialisée.\n\nLes briques de la mauvaise couleur sont entourées en rouge.\n\nSi vous avez plus d'une balle, elles changent toutes de couleur lorsque l'une d'entre elles touche une brique.", "upgrades.passive_income.tooltip": "+{{lvl}} combo / brique, sauf si la raquette à bougé dans les {{time}} dernières secondes, combo perdu dans ce cas",
"upgrades.picky_eater.help": "Plus de pièces si vous cassez les briques couleur par couleur.", "upgrades.passive_income.verbose_description": "Certaines amélioration font bouger les balles sans avoir besoin de mettre la raquette en mouvement.",
"upgrades.picky_eater.name": "Mangeur par couleur", "upgrades.picky_eater.name": "Mangeur par couleur",
"upgrades.pierce.fullHelp": "Normalement , la balle rebondit dès qu'elle touche une brique. Avec cette caractéristique, elle continuera sa trajectoire jusqu'à 3 briques cassées.\n\nAprès cela, elle rebondira sur la quatrième brique et vous devez toucher le palet pour remettre le compteur à zéro.", "upgrades.picky_eater.tooltip": "+{{lvl}} combo par brique cassée la couleur de la balle, combo perdu sinon",
"upgrades.pierce.help": "La balle perce {{count}} briques après chaque rebond sur le palet", "upgrades.picky_eater.verbose_description": "Chaque fois que vous cassez une brique de la même couleur que votre balle, votre combo augmente d'une unité.\nS'il s'agit d'une couleur différente, la balle adopte cette nouvelle couleur, mais la combinaison est réinitialisée, sauf s'il n'y avais plus aucune brique de la couleur de la balle. Les briques de la mauvaise couleur sont entourées en rouge. Si vous avez plus d'une balle, elles changent toutes de couleur en même temps lorsque l'une d'entre elles touche une brique.",
"upgrades.pierce.name": "Balle perçante", "upgrades.pierce.name": "Balle perçante",
"upgrades.pierce_color.fullHelp": "Chaque fois qu'une balle touche une brique de la même couleur, elle la traverse sans encombre.\nLorsqu'elle atteint une brique de couleur différente, elle la casse, prend sa couleur et rebondit.", "upgrades.pierce.tooltip": "La balle perce {{count}} briques après chaque rebond sur la raquette.",
"upgrades.pierce_color.help": "Les balles transpercent les briques de leur couleur", "upgrades.pierce.verbose_description": "Normalement , la balle rebondit dès qu'elle touche une brique. Avec cette amélioration, elle continuera sa trajectoire jusqu'à avoir cassées 3 briques.\n\nAprès cela, elle rebondira sur la quatrième brique et devra toucher la raquette pour remettre le compteur à zéro.",
"upgrades.pierce_color.name": "Perceur de couleur", "upgrades.pierce_color.name": "Perceur de couleur",
"upgrades.puck_repulse_ball.fullHelp": "Lorsqu'une balle s'approche du palet, elle commence à ralentir, voire à rebondir sans toucher le palet. Beaucoup de choses sont liées à un passage par le palet dans le jeu, donc ça pourrait ouvrir des possibilités. ", "upgrades.pierce_color.tooltip": "+{{lvl}} dommage sur les briques de la couleur de la balle",
"upgrades.puck_repulse_ball.help": "Le palet repousse les balles", "upgrades.pierce_color.verbose_description": "Chaque fois qu'une balle touche une brique de la même couleur, elle la traverse sans encombre.\n\nLorsqu'elle atteint une brique de couleur différente, elle la casse, prend sa couleur et rebondit. \n\nSi vous avez des briques solides, le fonctionnement est un peu différent. ",
"upgrades.puck_repulse_ball.help_plural": "La force de répulsion est plus grande", "upgrades.puck_repulse_ball.help_plural": "La force de répulsion est plus grande",
"upgrades.puck_repulse_ball.name": "Atterrissage en douceur", "upgrades.puck_repulse_ball.name": "Atterrissage en douceur",
"upgrades.reach.fullHelp": "Essayez de bloquer la balle au dessus des briques pour plus de combo", "upgrades.puck_repulse_ball.tooltip": "La raquette repousse les balles",
"upgrades.reach.help": "+{{lvl}} combo / brique, la plus basse d'une colonne RAZ le combo", "upgrades.puck_repulse_ball.verbose_description": "Lorsqu'une balle s'approche de la raquette, elle commence à ralentir, voire à rebondir sans toucher le palet.",
"upgrades.rainbow.name": "Arc en ciel",
"upgrades.rainbow.tooltip": "Les pièces apparaissent avec la couleur de l'arc en ciel.",
"upgrades.rainbow.verbose_description": "Chaque niveau augment la proportion de pièces colorée. La couleur dépends du temps de jeu. ",
"upgrades.reach.name": "Attaque aérienne", "upgrades.reach.name": "Attaque aérienne",
"upgrades.respawn.fullHelp": "Après avoir cassé deux briques ou plus, lorsque la balle touche le palet, la première brique est remise en place, à condition que l'espace soit libre et que la brique ne soit pas une bombe.\n\nDes effets de particules vous indiqueront où les briques apparaîtront. \n\nEn montant en niveau, vous pouvez faire réapparaître jusqu'à 4 briques à la fois, mais il doit toujours y en avoir au moins une qui reste détruite.", "upgrades.reach.tooltip": "Casser une des N briques de la ligne la plus basse détruit le combo. Sinon, +N combo.",
"upgrades.respawn.help": "Certaines briques réapparaissent après avoir été détruites.", "upgrades.reach.verbose_description": "S'il n'y a qu'une seule rangée de briques, ou si la rangée la plus basse couvre toute la largeur du jeu, cet avantage est sans effet. Sinon, briser cette rangée la plus basse réinitialise le combo ; briser toute autre rangée augmente le combo du nombre de briques présentes sur cette rangée.\n\nLa rangée de briques du bas sera entourée en rouge pour vous rappeler de ne pas la toucher. ",
"upgrades.respawn.help_plural": "Plus de briques peuvent réapparaître",
"upgrades.respawn.name": "Réapparition ", "upgrades.respawn.name": "Réapparition ",
"upgrades.right_is_lava.fullHelp": "Chaque fois que vous cassez une brique, votre combo augmente d'une unité, ce qui vous permet d'obtenir une pièce de plus à chaque fois que vous cassez les briques suivantes.\n\nCependant, votre combinaison se réinitialise dès que votre balle touche le côté droit de la zone de jeu.\n\nDès que votre combo augmente, le côté droit devient rouge pour vous rappeler que vous devez éviter de le frapper.\n\nL'effet se cumule avec d'autres avantages de combo, le combo augmente plus rapidement avec plus d'améliorations, mais il se réinitialise également si l'une des conditions de réinitialisation est remplie.", "upgrades.respawn.tooltip": "{{percent}}% des briques réapparaissent après {{delay}}s.",
"upgrades.right_is_lava.help": "Plus de pièces si vous ne touchez pas le côté droit.", "upgrades.respawn.verbose_description": "Des effets de particules vous indiqueront où les briques apparaîtront. ",
"upgrades.right_is_lava.name": "Éviter le côté droit", "upgrades.right_is_lava.name": "Éviter le côté droit",
"upgrades.sacrifice.fullHelp": "Ceci n'est pas toujours représentable visuellement", "upgrades.right_is_lava.tooltip": "+{{lvl}} combo par brique, perdu en cas de choc avec le coté droit",
"upgrades.sacrifice.help": "Perdre une vie double la valeur de toutes les pièces à l'écran", "upgrades.right_is_lava.verbose_description": "Chaque fois que vous cassez une brique, votre combo augmente d'une unité, ce qui vous permet d'obtenir une pièce de plus à chaque fois que vous cassez les briques suivantes.\n\nCependant, votre combinaison se réinitialise dès que votre balle touche le côté droit de la zone de jeu.\n\nDès que votre combo augmente, le côté droit devient rouge pour vous rappeler que vous devez éviter de le frapper.",
"upgrades.sacrifice.help_l1": "Perdre une vie détruit toutes les briques",
"upgrades.sacrifice.help_over": "Perdre une vie multiplie le combo par {{lvl}} puis détruit toutes les briques à l'écran",
"upgrades.sacrifice.name": "Sacrifice", "upgrades.sacrifice.name": "Sacrifice",
"upgrades.sapper.fullHelp": "Au lieu de disparaître, la première brique cassée est remplacée par une bombe. Faire rebondir la balle sur le palet réarme l'effet. En montant en niveau, vous pourrez placer plus de bombes. N'oubliez pas que les bombes ont un impact sur la vitesse des pièces à proximité. Trop d'explosions peuvent rendre difficile la récupération des fruits de votre dur labeur.", "upgrades.sacrifice.verbose_description": "Le combo pourrait monter assez haut.",
"upgrades.sapper.help": "La première brique cassée devient une bombe.",
"upgrades.sapper.help_plural": "Les premières briques {{lvl}} cassées deviennent des bombes.", "upgrades.sapper.help_plural": "Les premières briques {{lvl}} cassées deviennent des bombes.",
"upgrades.sapper.name": "Sapeur", "upgrades.sapper.name": "Sapeur",
"upgrades.shocks.fullHelp": "Un peu comme jouer au billard avec des grenades", "upgrades.sapper.tooltip": "La première brique cassée devient une bombe.",
"upgrades.shocks.help": "Collision explosive entre balles", "upgrades.sapper.verbose_description": "Au lieu de disparaître, la première brique cassée est remplacée par une bombe. Faire rebondir la balle sur la raquette réarme l'effet. En montant en niveau, vous pourrez placer plus de bombes.",
"upgrades.shocks.name": "Choc", "upgrades.shocks.name": "Choc",
"upgrades.shunt.fullHelp": "Démarrage à chaud sera simplement ajouté au combo actuel", "upgrades.shocks.tooltip": "Collision explosive entre les balles",
"upgrades.shunt.help": "Garer {{percent}}% du combo au changement de niveau ", "upgrades.shocks.verbose_description": "Quand deux balles entrent en collision, elles échangent leurs vitesse, créent une explosion et gagnent un peu de vitesse qui les sépare. ",
"upgrades.shunt.name": "Shunt", "upgrades.shunt.name": "Shunt",
"upgrades.skip_last.fullHelp": "Vous devez casser toutes les briques pour passer au niveau suivant. \n\nCependant, il peut être difficile d'obtenir les dernières briques.\n\nTerminer un niveau plus tôt permet d'obtenir des choix supplémentaires lors de la mise à niveau. \n\nNe jamais manquer de briques est également très avantageux.\n\nDonc, si vous avez du mal à casser les dernières briques, obtenir cet avantage plusieurs fois peut vous aider.", "upgrades.shunt.tooltip": "Garer {{percent}}% du combo au changement de niveau ",
"upgrades.skip_last.help": "La dernière brique s'autodétruit.", "upgrades.shunt.verbose_description": "Démarrage à chaud sera simplement ajouté au combo actuel",
"upgrades.side_flip.name": "Droitier",
"upgrades.side_flip.tooltip": "+{{lvl}} combo par brique cassé de la droite, -{{loss}} sinon",
"upgrades.side_flip.verbose_description": "Impactez la brique sur son côté droit pour obtenir un combo, mais évitez de la frapper sur son côté gauche, car cela annulerait deux combos. Frapper du haut et du bas n'a aucun effet.",
"upgrades.side_kick.name": "Gaucher",
"upgrades.side_kick.tooltip": "+{{lvl}} combo par brique cassé de la gauche, -{{loss}} sinon",
"upgrades.side_kick.verbose_description": "Impactez la brique sur son côté gauche pour obtenir un combo, mais évitez de la frapper sur son côté droit, car cela annulerait deux combos. Frapper du haut et du bas n'a aucun effet.",
"upgrades.skip_last.help_plural": "Les {{lvl}} dernières briques restantes s'autodétruiront", "upgrades.skip_last.help_plural": "Les {{lvl}} dernières briques restantes s'autodétruiront",
"upgrades.skip_last.name": "Nettoyage facile", "upgrades.skip_last.name": "Nettoyage facile",
"upgrades.slow_down.fullHelp": "La balle démarre relativement lentement, mais à chaque niveau de votre course, 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 course en activant le mode enfant dans le menu.", "upgrades.skip_last.tooltip": "La dernière brique s'autodétruit.",
"upgrades.slow_down.help": "La balle se déplace plus lentement", "upgrades.skip_last.verbose_description": "Vous devez casser toutes les briques pour passer au niveau suivant. \n\nCependant, il peut être difficile d'obtenir les dernières briques.\n\nTerminer un niveau plus tôt permet d'obtenir des choix supplémentaires lors de la mise à niveau. \n\nNe jamais manquer de briques est également très avantageux.\n\nDonc, si vous avez du mal à casser les dernières briques, obtenir cet avantage plusieurs fois peut vous aider.",
"upgrades.slow_down.name": "Balle lente", "upgrades.slow_down.name": "Balle lente",
"upgrades.smaller_puck.fullHelp": "Le palet est donc plus petit, ce qui, en théorie, facilite certains tirs en coin, mais augmente surtout la difficulté.\n\nC'est pourquoi vous bénéficiez également d'un bonus de +5 pièces par brique pour toutes les briques que vous casserez après avoir choisi cette option.", "upgrades.slow_down.tooltip": "La balle se déplace plus lentement",
"upgrades.smaller_puck.help": "Donne aussi +5 combo", "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": "Palet encore plus petit et combinaison de base plus élevée", "upgrades.smaller_puck.help_plural": "La raquette rétrécie encore et le combo augmente encore.",
"upgrades.smaller_puck.name": "Palet plus petit", "upgrades.smaller_puck.name": "Raquette plus petite",
"upgrades.soft_reset.fullHelp": "Limite l'impact d'une réinitialisation du combo.", "upgrades.smaller_puck.tooltip": "Donne aussi +5 combo",
"upgrades.soft_reset.help": "La remise à zéro du combo conserve {{percent}}% des points", "upgrades.smaller_puck.verbose_description": "Vous bénéficiez d'un bonus permanent de +5 combo pour avoir choisi cette amélioration.",
"upgrades.soft_reset.name": "Réinitialisation progressive", "upgrades.soft_reset.name": "Réinitialisation progressive",
"upgrades.streak_shots.fullHelp": "Chaque fois que vous cassez une brique, votre combo (nombre de pièces par brique) augmente d'une unité. Cependant, dès que la balle touche votre palet, le combo est remis à sa valeur par défaut, et vous n'obtiendrez qu'une seule pièce par brique.\n\nUne fois que votre combinaison dépasse la valeur de base, votre palet devient rouge pour vous rappeler que le fait de le toucher avec la balle détruira votre combinaison.\n\nCela peut se cumuler avec d'autres avantages liés au combo, le combo augmentera plus rapidement mais se réinitialisera plus facilement car n'importe laquelle des conditions suffit à le réinitialiser.", "upgrades.soft_reset.tooltip": "La remise à zéro du combo conserve {{percent}}% des points",
"upgrades.streak_shots.help": "Plus de pièces si vous cassez plusieurs briques à la fois.", "upgrades.soft_reset.verbose_description": "Limite l'impact d'une réinitialisation du combo.",
"upgrades.streak_shots.name": "Séquence de destruction", "upgrades.streak_shots.name": "Séquence de destruction",
"upgrades.sturdy_bricks.fullHelp": "Avec le niveau 1 de cette compétence, la balle a 20 % de chances de rebondir sans casser les briques, mais génère 10% de pièces en plus lorsqu'elle en casse une.\n\nCe +10% n'est pas indiqué dans le nombre de combos. Au niveau 4, la balle a 80 % de chances de rebondir et rapporte 40 % de pièces en plus.", "upgrades.streak_shots.tooltip": "Plus de pièces si vous cassez plusieurs briques à la fois.",
"upgrades.sturdy_bricks.help": "Les briques résistent parfois aux coups mais font tomber plus de pièces.", "upgrades.streak_shots.verbose_description": "Chaque fois que vous cassez une brique, votre combo augmente. Le combo est remis à zéro quand la balle touche la raquette. Une fois que votre combo dépasse la valeur de base, votre raquette devient rouge pour vous rappeler que le fait de la toucher avec la balle détruira votre combo.",
"upgrades.sturdy_bricks.help_plural": "Les briques résistent davantage et font tomber plus de pièces",
"upgrades.sturdy_bricks.name": "Briques solides", "upgrades.sturdy_bricks.name": "Briques solides",
"upgrades.telekinesis.fullHelp": "Dès que la balle touche votre palet, vous pouvez la diriger vers la gauche ou la droite en déplaçant votre palet.\n\nL'effet s'arrête lorsque la balle touche une brique et se réinitialise la prochaine fois qu'elle touche le palet. Il ne fait rien non plus lorsque la balle descend après avoir rebondi au sommet.", "upgrades.sturdy_bricks.tooltip": "+{{lvl}} points de vie des briques, +{{percent}}% pièces quand elles sont détruites",
"upgrades.telekinesis.help": "Contrôler la trajectoire de la balle", "upgrades.sturdy_bricks.verbose_description": "Chaque niveau de cet amélioration ajoute un PV à toutes les briques. Vous pouvez consulter le nombre de PV avec l'avantage \"clairvoyant\". Vous pouvez augmenter les dégâts des balles en obtenant l'amélioration \"Balle perçante\". Chaque niveau de cet amélioration ajoute 50% de pièces en plus.",
"upgrades.superhot.name": "SUPER HOT",
"upgrades.superhot.tooltip": "Le temps avance quand la raquette bouge. ",
"upgrades.superhot.verbose_description": "SUPER HOT SUPER HOT SUPER HOT SUPER HOT",
"upgrades.telekinesis.help_plural": "Effet plus fort sur la balle", "upgrades.telekinesis.help_plural": "Effet plus fort sur la balle",
"upgrades.telekinesis.name": "Télékinésie", "upgrades.telekinesis.name": "Télékinésie",
"upgrades.top_is_lava.fullHelp": "Chaque fois que vous cassez une brique, votre combo augmente d'une unité. Cependant, votre combo sera réinitialisé dès que votre balle atteindra le haut de l'écran.\n\nLorsque votre combo est supérieur au minimum, une barre rouge apparaît en haut de l'écran pour vous rappeler que vous devez éviter de la frapper.\n\nCet effet s'ajoute aux autres avantages du combo.", "upgrades.telekinesis.tooltip": "Contrôler la trajectoire de la balle",
"upgrades.top_is_lava.help": "Plus de pièces si vous ne touchez pas le haut de la zone de jeu", "upgrades.telekinesis.verbose_description": "Vous contrôlez la balle pendant qu'elle monte.",
"upgrades.top_is_lava.name": "Icare ", "upgrades.top_is_lava.name": "Icare ",
"upgrades.trampoline.fullHelp": "Une des rares améliorations à ne pas avoir de condition de remise à zéro", "upgrades.top_is_lava.tooltip": "+{{lvl}} combo par brique, perdu en cas de rebond au plafond",
"upgrades.trampoline.help": "+{{lvl}} combo à chaque rebond d'une balle sur le palet,-{{lvl}} combo à chaque rebond au plafond", "upgrades.top_is_lava.verbose_description": "Chaque fois que vous cassez une brique, votre combo augmente d'une unité. Cependant, votre combo sera réinitialisé dès que votre balle atteindra le haut de l'écran.\n\nLorsque votre combo est supérieur au minimum, une barre rouge apparaît en haut de l'écran pour vous rappeler que vous devez éviter de la frapper.",
"upgrades.trampoline.name": "Trampoline", "upgrades.trampoline.name": "Trampoline",
"upgrades.unbounded.fullHelp": "J'espère que vous avez prévu un moyen de récupérer vos balles", "upgrades.trampoline.tooltip": "+{{lvl}} combo à chaque rebond d'une balle sur la raquette,-{{lvl}} combo à chaque rebond sur un des bords",
"upgrades.unbounded.help": "+1 combo par brique, plus de cotés", "upgrades.trampoline.verbose_description": "Une des rares améliorations à ne pas avoir de condition de remise à zéro",
"upgrades.unbounded.name": "Libérée, délivrée", "upgrades.transparency.name": "Camouflage",
"upgrades.viscosity.fullHelp": "Les pièces accélèrent normalement avec la gravité et les explosions pour atteindre des vitesses assez élevées. \n\nCette compétence les ralentit constamment, comme si elles se trouvaient dans une sorte de liquide visqueux.\n\nCela permet de les attraper plus facilement et se combine bien avec les améliorations qui influencent le mouvement de la pièce.", "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.viscosity.help": "Chute plus lente des pièces", "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.tooltip": "Les pièces apparaissent en haut de l'écran.",
"upgrades.trickledown.verbose_description": "Ça pourrait vous aider à mettre des pièces de coté. ",
"upgrades.unbounded.name": "Besoin d'espace",
"upgrades.unbounded.tooltip": "Plus d'espace autour des briques, mais la raquette ne peut pas aller aussi loin.",
"upgrades.unbounded.verbose_description": "Une autre amélioration pourrait vous permettre d'étendre la portée de votre raquette.",
"upgrades.viscosity.name": "Fluide visqueux ", "upgrades.viscosity.name": "Fluide visqueux ",
"upgrades.wind.fullHelp": "Le vent dépend de l'endroit où se trouve le palet, s'il est au centre de l'écran, il ne se passe rien, s'il est à gauche, il soufflera vers la gauche, s'il est à droite de l'écran, il soufflera vers la droite.\n\nLe vent affecte à la fois les balles et les pièces.", "upgrades.viscosity.tooltip": "Chute plus lente des pièces",
"upgrades.wind.help": "La position du palet crée du vent", "upgrades.viscosity.verbose_description": "Les pièces accélèrent normalement avec la gravité et les explosions pour atteindre des vitesses assez élevées. \n\nCette compétence les ralentit constamment, comme si elles se trouvaient dans une sorte de liquide visqueux.\n\nCela permet de les attraper plus facilement et se combine bien avec les améliorations qui influencent le mouvement de la pièce.",
"upgrades.wind.help_plural": "Force du vent plus importante", "upgrades.wind.help_plural": "Force du vent plus importante",
"upgrades.wind.name": "Vive le vent", "upgrades.wind.name": "Vive le vent",
"upgrades.yoyo.fullHelp": "C'est l'inverse de Télékinésie", "upgrades.wind.tooltip": "La position de la raquette crée du vent",
"upgrades.yoyo.help": "La balle descend vers le palet", "upgrades.wind.verbose_description": "Le vent dépend de la position de la raquette à l'écran, vers la gauche s'il est à gauche, vers la droite s'il est à droite. \nAffecte les balles et les pièces.",
"upgrades.yoyo.name": "Yo-yo", "upgrades.yoyo.name": "Yo-yo",
"upgrades.zen.fullHelp": "C'est quand même un jeu non violent à la base", "upgrades.yoyo.tooltip": "La balle se dirige vers la raquette en descendant.",
"upgrades.zen.help": "+1 combo par brique, jusqu'à ce qu'il y ait une explosion", "upgrades.yoyo.verbose_description": "C'est l'inverse de Télékinésie, contrôlez la balle alors qu'elle redescend vers la raquette.",
"upgrades.zen.name": "Zen" "upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "+{{lvl}} combo par brique, jusqu'à ce qu'il y ait une explosion",
"upgrades.zen.verbose_description": "C'est quand même un jeu non violent à la base."
} }

View file

@ -1,12 +1,107 @@
import fr from "./fr.json";
import en from "./en.json"; import en from "./en.json";
import fr from "./fr.json";
import ar from "./ar.json";
import ru from "./ru.json";
import es from "./es.json";
import tr from "./tr.json";
import de from "./de.json";
// import ko from "./ko.json";
// import ur from "./ur.json";
// import uz from "./uz.json";
// import zh from "./zh.json";
export const languages = [
{
text: "English",
value: "en",
strings: en,
levelName: "UK",
},
{
text: "Français",
value: "fr",
strings: fr,
levelName: "France",
},
{
text: "عربي",
value: "ar",
strings: ar,
levelName: "Lebanon",
},
{
text: "Español",
value: "es",
strings: es,
levelName: "Chile",
},
{
text: "Русский",
value: "ru",
strings: ru,
levelName: "Russia",
},
{
text: "Deutsch",
value: "de",
strings: de,
levelName: "Germany",
},
{
text: "Türkçe",
value: "tr",
strings: tr,
levelName: "Türkiye",
},
// {
// text: "汉语",
// value: "zh",
// strings: zh,
//
// levelName: "China",
// },
// {
// text: "o'zbek tili",
// value: "uz",
// strings: uz,
// levelName: "Uzbekistan",
// },
// {
// text: "اردو",
// value: "ur",
// strings: ur,
//
// levelName: "Pakistan",
// },
// {
// text: "한국인",
// value: "ko",
// strings: ko,
//
// levelName: "Korea",
// },
];
import { getSettingValue } from "../settings"; import { getSettingValue } from "../settings";
type translationKeys = keyof typeof en; type translationKeys = keyof typeof en;
type translation = { [key in translationKeys]: string }; type translation = { [key in translationKeys]: string };
const languages: Record<string, translation> = { fr, en }; const languagesMap: Record<string, translation> = {};
languages.forEach((l) => (languagesMap[l.value] = l.strings));
let defaultLang =
[...navigator.languages, navigator.language]
.filter((i) => i)
.map((i) => i.slice(0, 2).toLowerCase())
.find((k) => k in languagesMap) || "en";
export function getCurrentLang() { export function getCurrentLang() {
return getSettingValue("lang", getFirstBrowserLanguage()); return getSettingValue("lang", defaultLang);
} }
export function t( export function t(
@ -14,18 +109,9 @@ export function t(
params: { [key: string]: any } = {}, params: { [key: string]: any } = {},
): string { ): string {
const lang = getCurrentLang(); const lang = getCurrentLang();
let template = languages[lang]?.[key] || languages.en[key]; let template = languagesMap[lang]?.[key] || languagesMap.en[key];
for (let key in params) { for (let key in params) {
template = template.split("{{" + key + "}}").join(`${params[key]}`); template = template.split("{{" + key + "}}").join(`${params[key]}`);
} }
return template; return template;
} }
function getFirstBrowserLanguage() {
const preferred_languages = [...navigator.languages, navigator.language, "en"]
.filter((i) => i)
.map((i) => i.slice(0, 2).toLowerCase());
const supported = Object.keys(languages);
return preferred_languages.find((k) => supported.includes(k)) || "en";
}

336
src/i18n/ko.json Normal file
View file

@ -0,0 +1,336 @@
{
"confirmRestart.no": "취소",
"confirmRestart.text": "새 게임을 시작하려고 합니다. 계속하시겠습니까?",
"confirmRestart.title": "새 게임을 시작하시나요?",
"confirmRestart.yes": "게임 다시 시작",
"gameOver.creative": "이 실행은 기록되지 않습니다.",
"gameOver.cumulative_total": "총 누적 점수가 {{startTs}} 에서 {{endTs}}로 변경되었습니다.",
"gameOver.lost.summary": "동전 {{score}} 개를 잡은 후 공을 떨어뜨렸습니다.",
"gameOver.lost.title": "게임 오버",
"gameOver.stats.balls_lost": "공 분실",
"gameOver.stats.bricks_broken": "벽돌 깨짐",
"gameOver.stats.bricks_per_minute": "분당 깨진 벽돌 수",
"gameOver.stats.catch_rate": "캐치율",
"gameOver.stats.combo_avg": "평균 콤보",
"gameOver.stats.combo_max": "최대 콤보",
"gameOver.stats.duration_per_level": "레벨당 지속 시간",
"gameOver.stats.hit_rate": "적중률",
"gameOver.stats.intro": "아래에서 {{count}} 개의 베스트 게임과 비교한 게임 통계를 확인하세요.",
"gameOver.stats.level_reached": "도달한 레벨",
"gameOver.stats.total_score": "총점",
"gameOver.stats.upgrades_applied": "업그레이드 적용",
"gameOver.unlocked_perk": "업그레이드 잠금 해제",
"gameOver.unlocked_perk_plural": "방금 {{count}} 특전을 잠금 해제했습니다.",
"gameOver.win.summary": "이 부분은 끝났습니다. {{score}} 개의 코인을 모았습니다. ",
"gameOver.win.title": "이 게임을 완료했습니다.",
"history.columns.score": "점수",
"history.columns.started": "날짜",
"history.help": " {{count}} 개의 최고의 게임을 나열하세요.",
"history.locked": "잠금 해제하려면 최소 10개의 게임을 플레이하세요.",
"history.title": "기록 실행",
"lab.help": "원하는 빌드를 사용해 보세요.",
"lab.instructions": "아래에서 업그레이드를 선택한 다음 플레이할 레벨을 선택하세요.",
"lab.menu_entry": "크리에이티브 모드",
"lab.reset": "모두 0으로 초기화",
"lab.select_level": "플레이할 레벨 선택",
"lab.unlocks_at": "총점 {{score}}에서 잠금 해제",
"level_up.after_buttons": "레벨 {{level}}/{{max}}을 완료했습니다 .",
"level_up.before_buttons": " {{time}} 초 {{timeGain}}만에 {{levelSpawnedCoins}} 개 중 {{score}} 개의 코인 {{catchGain}} 개를 잡았습니다.\n\n벽돌을 {{levelMisses}} 번 {{missesGain}} 놓쳤고, 플레이 영역의 가장자리를 {{levelWallBounces}} 번 {{wallHitsGain}}만졌습니다.\n\n{{compliment}}",
"level_up.compliment_advice": "모든 코인을 잡고, 벽돌을 놓치지 말고, 벽/천장에 부딪히지 말고, 30초 이내에 레벨을 클리어하여 추가 업그레이드를 얻으세요.",
"level_up.compliment_good": "잘했어!",
"level_up.compliment_perfect": "인상적이네요, 계속하세요!",
"level_up.pick_upgrade_title": "업그레이드 선택",
"level_up.plus_one_upgrade": "(+1 업그레이드)",
"level_up.plus_one_upgrade_and_reroll": "(+1 업그레이드 및 +1 리롤)",
"level_up.reroll": "다시 롤 ({{count}})",
"level_up.reroll_help": "새로운 선택권 제공",
"level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "기본 그래픽",
"main_menu.basic_help": "더 나은 성능.",
"main_menu.colorful_coins": "다채로운 동전",
"main_menu.colorful_coins_help": "동전은 항상 벽돌 색으로 스폰됩니다.",
"main_menu.comboIncreaseTexts": "금색으로 +X 표시",
"main_menu.comboIncreaseTexts_help": "콤보 증가 시",
"main_menu.contrast": "높은 명암비",
"main_menu.contrast_help": "더 화려하고 어두운 렌더링",
"main_menu.credit_levels": "레벨",
"main_menu.donate": " {{hours}} 시간 동안 플레이했습니다.",
"main_menu.donate_help": "기부는 어때요? 설정에서 이 알림을 숨길 수 있습니다.",
"main_menu.donation_reminder": "기부 알림",
"main_menu.donation_reminder_help": "메인 메뉴에서 플레이 시간 및 기부 링크 보기",
"main_menu.download_save_file": "점수 및 통계 다운로드",
"main_menu.download_save_file_help": "저장 파일 가져오기",
"main_menu.extra_bright": "매우 밝음",
"main_menu.extra_bright_help": "동전과 벽돌 주위의 후광 크기를 증가시킵니다.",
"main_menu.fullscreen": "전체 화면",
"main_menu.fullscreen_help": "게임을 시작하기 전에 전체 화면으로 전환하려고 시도합니다.",
"main_menu.help_content": "## 목적\n\n7개 레벨에 걸쳐 최대한 많은 동전을 모아보세요.\n벽돌을 깨면 동전이 나옵니다.\n퍽으로 공을 잡아 점수를 높이세요.\n점수는 화면 오른쪽 상단에 표시됩니다.\n공을 떨어뜨리지 마세요. 그러면 게임이 끝나요.\n\n모든 벽돌을 파괴한 후 업그레이드를 선택할 수 있습니다.\n\n## 개선 사항\n\n선택한 업그레이드는 게임이 끝날 때까지 지속됩니다.\n더욱 강력한 효과를 위해 여러 번 선택할 수 있는 효과도 있습니다.\n어떤 것들은 조준을 돕거나 게임을 단순화합니다.\n어떤 것들은 결합해야만 유용합니다.\n\n각 게임을 시작할 때마다 항상 파워업을 받습니다.\n이 아이콘은 첫 번째 레벨의 벽돌을 형성합니다.\n설정에서 시작 업그레이드를 선택할 수 있습니다.\n\n콤보에 영향을 미치는 업그레이드는 다양합니다.\n\n## 콤보\n\n\"콤보\"는 벽돌이 깨질 때 생성되는 동전의 수입니다.\n이는 퍽에 표시됩니다. 예를 들어, x4는 벽돌 하나당 동전 4개가 나온다는 것을 의미합니다.\n\n대부분의 콤보 증가 업그레이드에는 이를 재설정하는 조건도 추가됩니다.\n공이 벽돌에 부딪히지 않고 패들로 돌아오면 콤보가 재설정됩니다.\n그러면 \"놓침\" 메시지가 표시됩니다.\n\n매번 튀어오를 때마다 벽돌을 맞추도록 노력하세요.\n\n## 목표\n\n라켓 위의 공의 위치만이 반동 각도를 결정합니다.\n공이 라켓의 정중앙에 맞으면 수직으로 튀어 오릅니다.\n라켓 측면에서 치면 각도가 더 커집니다.\n라켓 속도와 공의 입사각은 영향을 미치지 않습니다.\n\n조준을 더 쉽게 만들어 주는 업그레이드도 많이 있습니다.\n\n## 잠금 해제\n\nBreakout 71을 처음 플레이하면 대부분의 업그레이드와 레벨이 잠겨 있습니다.\n업그레이드는 플레이하고 많은 코인을 획득하면 간단히 잠금 해제됩니다.\n첫 번째 레벨은 높은 점수를 달성하면 잠금 해제됩니다.\n이후 레벨에서는 선택한 혜택에 대한 조건이 추가됩니다.\n\n각 레벨마다 여러 번 업그레이드를 받으면 높은 점수를 얻는 것이 훨씬 쉬워집니다.\n\n## 무료 재출시 및 개선\n\n잘 플레이하면 추가적인 보너스를 받게 됩니다:\n\n- {{levelTimeGood}} 초 이내에 레벨을 완료하세요\n- 가장자리 또는 상단을 {{wallBouncedGood}} 회 미만으로 만지세요.\n- {{catchRateGood}}% 코인 획득\n- 벽돌을 {{missesGood}} 회 이하로 놓칩니다.\n\n더 나은 성적을 거두면 업그레이드를 무시할 수 있는 부스트를 받게 됩니다.\n\n- {{levelTimeBest}} 초 이내에 레벨 완료\n- 가장자리 또는 상단을 {{wallBouncedBest}} 회 이하로 만지세요.\n- {{catchRateBest}}% 코인 획득\n- 벽돌을 {{missesBest}} 회 이하로 놓칩니다.\n\n설정에는 이러한 통계를 표시하는 옵션이 있습니다. ",
"main_menu.help_help": "게임에 대해 자세히 알아보기",
"main_menu.help_title": "도움말",
"main_menu.help_upgrades": "업그레이드 ## 업그레이드",
"main_menu.high_score": "최고 점수 : {{score}}",
"main_menu.kid": "키즈 모드",
"main_menu.kid_help": "'느린 공'으로 향후 게임을 시작하세요.",
"main_menu.language": "언어",
"main_menu.language_help": "게임 언어 선택",
"main_menu.load_save_file": "저장 파일 로드",
"main_menu.load_save_file_help": "장치에서 저장 파일을 선택합니다.",
"main_menu.max_coins": " 최대 화면의 {{max}} 동전",
"main_menu.max_coins_help": "장식용, 점수에 영향 없음",
"main_menu.max_particles": " 최대 {{max}} 입자",
"main_menu.max_particles_help": "시각적 효과를 위해 화면에 표시되는 파티클 수를 제한합니다.",
"main_menu.mobile": "모바일 모드",
"main_menu.mobile_help": "퍽 아래에 공간을 남깁니다.",
"main_menu.normal": "새 게임",
"main_menu.normal_help": "무작위 시작 특전으로 7개의 레벨을 플레이하세요",
"main_menu.pointer_lock": "마우스 포인터 잠금",
"main_menu.pointer_lock_help": "마우스 커서를 잠그고 숨깁니다.",
"main_menu.record": "게임 플레이 동영상 녹화",
"main_menu.record_download": "동영상 다운로드 ({{size}} MB)",
"main_menu.record_help": "각 레벨의 동영상을 확인하세요.",
"main_menu.red_miss": "경고 누락",
"main_menu.red_miss_help": "적중하지 않고 내려오는 공 주위에 빨간색 입자를 표시합니다.",
"main_menu.reset": "게임 초기화",
"main_menu.reset_cancel": "아니요",
"main_menu.reset_confirm": "예",
"main_menu.reset_help": "최고 점수, 플레이 시간 및 통계 삭제",
"main_menu.reset_instruction": "게임에서 진행했던 모든 진척도를 잃게 되나요?",
"main_menu.save_file_error": "저장 파일 로드 중 오류",
"main_menu.save_file_loaded": "로드된 파일 저장",
"main_menu.save_file_loaded_help": "이제 앱이 다시 로드되어 저장 내용을 적용합니다.",
"main_menu.save_file_loaded_ok": "확인",
"main_menu.settings_help": "필요와 취향에 맞게 게임 플레이를 조정하세요.",
"main_menu.settings_title": "설정",
"main_menu.show_fps": "FPS 카운터",
"main_menu.show_fps_help": "앱 성능 모니터링",
"main_menu.show_stats": "실시간 통계 표시",
"main_menu.show_stats_help": "코인, 시간, 바운스, 미스",
"main_menu.sounds": "게임 사운드",
"main_menu.sounds_help": "일부 휴대폰의 속도가 느려질 수 있습니다.",
"main_menu.starting_perks": "시작 특전",
"main_menu.starting_perks_checked": "새 게임을 시작하면 이러한 특전 중 하나가 주어집니다. 특전을 클릭하면 특전을 제외할 수 있습니다.",
"main_menu.starting_perks_full_random": "모든 혜택이 제거되었으며, 선택은 무작위로 이루어집니다.",
"main_menu.starting_perks_help": "가능한 시작 업그레이드 선택",
"main_menu.starting_perks_unchecked": "아래 특전은 시작 특전으로 제공되지는 않지만 클릭하여 풀에 추가할 수 있습니다.",
"main_menu.title": "브레이크아웃 71",
"main_menu.unlocks": "잠금 해제된 콘텐츠",
"main_menu.unlocks_help": "잠금 해제된 특전 및 레벨 체험하기",
"play.close_modale_window_tooltip": "닫기",
"play.current_lvl": "레벨 {{level}}/{{max}}",
"play.menu_label": "메뉴",
"play.menu_tooltip": "메인 메뉴 열기",
"play.missed_ball": "miss",
"play.mobile_press_to_play": "재생하려면 여기를 길게 누릅니다.",
"play.score_tooltip": "점수, 업그레이드 등을 확인하세요.",
"play.stats.coins_catch_rate": "코인 캐치율",
"play.stats.levelMisses": "아무것도 맞히지 못한 미스 샷",
"play.stats.levelTime": "레벨 시간",
"play.stats.levelWallBounces": "벽면 바운스",
"score_panel.close_to_unlock": "다음 레벨 잠금 해제 :",
"score_panel.get_upgrades_to_unlock": " {{missingUpgrades}} 을 획득하고 {{points}} 개의 추가 코인을 획득하여 레벨 \"{{level}}\"을 잠금 해제하세요.",
"score_panel.rerolls_count": "누적된 {{rerolls}} 회전 횟수가 있습니다.",
"score_panel.score_to_unlock": "추가 코인 {{points}} 개를 획득하여 레벨 \"{{level}}\"을 잠금 해제하세요.",
"score_panel.title": " 레벨 {{level}}에서{{score}} 포인트 /{{max}} ",
"score_panel.upcoming_levels": "다음 레벨 :",
"score_panel.upgrades_picked": "이 게임에서 선택한 업그레이드는 실행됩니다:",
"unlocks.greyed_out_help": "회색으로 표시된 업그레이드는 총 점수를 올리면 잠금 해제할 수 있습니다. 총 점수는 게임에서 점수를 획득할 때마다 증가합니다.",
"unlocks.intro": "총 점수는 {{ts}}입니다. 아래는 게임에서 제공하는 모든 업그레이드와 레벨입니다. 아래에서 업그레이드 또는 레벨을 클릭하여 테스트 게임을 시작하세요.",
"unlocks.just_unlocked": "레벨 잠금 해제",
"unlocks.just_unlocked_plural": "방금 {{count}} 레벨을 잠금 해제했습니다.",
"unlocks.level": "<h2> {{out_of}}개 중 {{unlocked}} 개 레벨을 잠금 해제했습니다. </h2>\n<p>다음은 모든 게임 레벨이며, 하나를 클릭하여 체험해 보세요.</p> ",
"unlocks.level_description": " {{bricks}} 개의 벽돌, {{colors}} 개의 색상, {{bombs}} 개의 폭탄이 있는 {{size}}x{{size}} 레벨입니다.",
"unlocks.minScore": "달리기에서 ${{minScore}} 에 도달하면 잠금이 해제됩니다.",
"unlocks.minScoreWithPerks": "잠금을 해제하려면 {{required}} 을 사용하지만 {{forbidden}} 을 사용하지 않고 실행하여{{minScore}} 달러에 도달하세요.",
"unlocks.minTotalScore": "총{{score}}달러 적립",
"unlocks.reached": "최고 점수는 {{reached}}입니다.",
"unlocks.title_upgrades": " {{out_of}}에서 {{unlocked}} 개의 업그레이드를 잠금 해제했습니다. ",
"upgrades.addiction.name": "중독",
"upgrades.addiction.tooltip": "+{{lvl}} 콤보 / 벽돌, 벽돌을 부수고 {{delay}}초 후에 콤보가 초기화됩니다.",
"upgrades.addiction.verbose_description": "카운트다운은 각 레벨의 첫 번째 벽돌을 부순 후에만 시작됩니다. 모든 벽돌이 파괴되면 카운트다운이 멈춥니다.",
"upgrades.asceticism.name": "금욕주의",
"upgrades.asceticism.tooltip": "+{{combo}} 콤보 / 벽돌, - {{combo}} 동전 잡기",
"upgrades.asceticism.verbose_description": "콤보가 올라가는 동안 코인을 어딘가에 보관해야 합니다.",
"upgrades.ball_attract_ball.help_plural": "더 강력한 끌어당기는 힘",
"upgrades.ball_attract_ball.name": "Gravity",
"upgrades.ball_attract_ball.tooltip": "공은 공을 끌어당깁니다",
"upgrades.ball_attract_ball.verbose_description": "\"게임 영역 너비의 3/4\" 이상 떨어져 있는 공은 서로 끌어당기기 시작합니다.\n\n공이 서로 가장 멀리 떨어져 있을수록 끌어당기는 힘이 더 강해집니다.\n\n무지개 입자가 날아다니며 끌어당기는 힘을 상징합니다. 이 특전은 이미 공이 두 개 이상 있는 경우에만 제공됩니다.",
"upgrades.ball_attracts_coins.name": "공은 동전을 끌어당깁니다",
"upgrades.ball_attracts_coins.tooltip": "동전은 가장 가까운 공을 따라 느리게 떨어집니다.",
"upgrades.ball_attracts_coins.verbose_description": "'얼룩' 및 '유령 동전'과 함께 사용하면 동전으로 공 주위를 '페인트칠'하는 데 사용할 수 있습니다. 동전 자석 대용으로도 사용할 수 있습니다.",
"upgrades.ball_repulse_ball.help_plural": "더 강력한 반발력",
"upgrades.ball_repulse_ball.name": "개인 공간",
"upgrades.ball_repulse_ball.tooltip": "공은 공을 튕겨냅니다",
"upgrades.ball_repulse_ball.verbose_description": "화면 너비의 1/4 이하로 떨어진 공은 서로 반발하기 시작합니다. 공이 서로 가까이 있으면 반발력이 더 강해집니다. 이 힘이 가해지는 것을 상징하기 위해 입자가 튀어 나옵니다. 이 특전은 공이 두 개 이상 있는 경우에만 제공됩니다.",
"upgrades.base_combo.name": "강력한 기반",
"upgrades.base_combo.tooltip": "콤보는 1이 아닌 {{coins}} 에서 시작합니다.",
"upgrades.base_combo.verbose_description": "콤보는 일반적으로 레벨이 시작될 때 1에서 시작되며, 아무것도 치지 않고 튕기면 1로 초기화됩니다. 이 특전을 사용하면 콤보가 3점 더 높게 시작되므로 항상 브릭당 최소 4개의 코인을 얻을 수 있습니다. 콤보가 초기화될 때마다 1이 아닌 4로 돌아갑니다. 콤보가 1보다 높다는 것을 알리기 위해 공이 약간 반짝입니다.",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "더 큰 폭발",
"upgrades.bigger_explosions.verbose_description": "기본 폭발은 3x3 정사각형을 지우고 5x5 정사각형이되며 동전에 대한 타격도 훨씬 더 강해집니다. 폭발할 때마다 화면이 깜박입니다(기본 모드 제외).",
"upgrades.bigger_puck.name": "더 큰 퍽",
"upgrades.bigger_puck.tooltip": "더 많은 코인을 쉽게 획득하세요.",
"upgrades.bigger_puck.verbose_description": "퍽이 크면 공을 놓치지 않고 더 많은 동전을 잡기 쉬울 뿐만 아니라 바운스 각도도 정확하게 맞출 수 있습니다(공의 각도는 퍽에 닿는 위치에 따라 달라집니다).\n\n그러나 큰 퍽은 레벨의 측면에서 사용하기가 더 어렵고 때때로 놓칠 수 있습니다.",
"upgrades.clairvoyant.name": "천리안",
"upgrades.clairvoyant.tooltip": "다음 레벨, 벽돌 HP 및 공 방향 보기",
"upgrades.clairvoyant.verbose_description": "올바른 업그레이드를 선택하고 튼튼한 브릭에 어떤 일이 일어나고 있는지 이해하는 데 도움이 됩니다. 레벨 2와 3은 모호한 유틸리티에 대한 추가 지식을 제공합니다(루프 모드에서 도달 가능).",
"upgrades.coin_magnet.help_plural": "코인에 더 강력한 효과",
"upgrades.coin_magnet.name": "동전 자석",
"upgrades.coin_magnet.tooltip": "퍽은 동전을 끌어당깁니다",
"upgrades.coin_magnet.verbose_description": "동전을 퍽으로 향하게 합니다. 동전이 이미 퍽에 가까이 있으면 효과가 더 강해집니다. 모든 동전을 잡으면 게임에서 특별한 보너스를 획득할 수 있습니다.\n\n더 많은 동전을 잡는 또 다른 방법은 바닥에서 벽돌을 치는 것입니다. 공의 속도와 방향은 스폰된 동전의 속도에 영향을 미칩니다.",
"upgrades.compound_interest.name": "복리 이자",
"upgrades.compound_interest.tooltip": "벽돌 깨질 때마다 +{{lvl}} 콤보, 코인 손실 시 초기화",
"upgrades.compound_interest.verbose_description": "벽돌을 부술 때마다 콤보가 하나씩 증가하며, 벽돌을 부술 때마다 점점 더 많은 코인을 생성합니다.\n\n하지만 코인을 놓치면 콤보가 초기화되므로 모든 코인을 퍽으로 모두 잡아야 합니다.\n\n콤보가 최소값을 넘으면 플레이 영역 하단에 빨간색 선이 표시되어 코인이 그쪽으로 이동해서는 안 된다는 것을 알려줍니다.",
"upgrades.concave_puck.name": "오목한 퍽",
"upgrades.concave_puck.tooltip": "수직 조준 정밀도 향상",
"upgrades.concave_puck.verbose_description": "공은 레벨이 똑바로 위로 올라가고 각도를 줄여서 튕기기 시작합니다.",
"upgrades.corner_shot.name": "코너 샷",
"upgrades.corner_shot.tooltip": "퍽이 화면 테두리와 겹치도록 합니다.",
"upgrades.corner_shot.verbose_description": "모서리 조준에 도움이 됩니다. 레벨이 높아질수록 더 멀리 나갈 수 있습니다.",
"upgrades.etherealcoins.name": "코인, 우주에서",
"upgrades.etherealcoins.tooltip": "코인은 더 이상 중력의 영향을 받지 않습니다.",
"upgrades.etherealcoins.verbose_description": "",
"upgrades.extra_levels.name": "5분 더",
"upgrades.extra_levels.tooltip": "7 대신 {{count}} 레벨 플레이",
"upgrades.extra_levels.verbose_description": "기본 게임은 최대 7레벨까지 플레이할 수 있으며, 그 이후에는 게임이 종료됩니다.\n\n이 특전의 각 레벨은 한 단계씩 더 높은 레벨로 올라갈 수 있습니다. 마지막 레벨에서 가장 많은 점수를 획득하는 경우가 많기 때문에 그 차이가 극적일 수 있습니다.",
"upgrades.extra_life.help_plural": "(마지막) 공이 손실되지 않고 바닥에{{lvl}} 번 튕겨집니다.",
"upgrades.extra_life.name": "엑스트라 라이프",
"upgrades.extra_life.tooltip": "공은 하프라인에서 한 번 튕긴 후 사라집니다.",
"upgrades.extra_life.verbose_description": "일반적으로 공은 하나이며, 공을 떨어뜨리는 순간 게임이 끝납니다.\n\n이 특전은 화면 하단에 흰색 막대가 추가되어 공을 한 번 저장하고 그 과정에서 중단할 수 있습니다.\n\n공이 화면 하단에 튕길 때마다 해당 특전의 레벨이 한 단계씩 감소합니다.",
"upgrades.forgiving.name": "용서",
"upgrades.forgiving.tooltip": "휴식 시간을 놓치면 콤보가 한 번에 감소하는 것이 아니라 점진적으로 감소합니다.",
"upgrades.forgiving.verbose_description": "레벨당 첫 번째 미스는 무료이며, 그 다음에는 콤보의 10%, 그 다음에는 20%입니다.",
"upgrades.fountain_toss.name": "분수 던지기",
"upgrades.fountain_toss.tooltip": "동전을 놓치면 콤보를 얻습니다.",
"upgrades.fountain_toss.verbose_description": "동전을 놓쳤는데 콤보가 {{max}}미만일 경우, 콤보가 {{lvl}}의 확률로 성장합니다. /의 확률로 콤보가 1만큼 성장합니다.",
"upgrades.ghost_coins.name": "유령 코인",
"upgrades.ghost_coins.tooltip": "동전이 벽돌을 천천히 통과합니다.",
"upgrades.ghost_coins.verbose_description": "버그가 아니라 기능입니다! 동전은 벽돌 사이를 천천히 날아갑니다. 레벨이 높을수록 더 빨리 움직입니다.",
"upgrades.helium.name": "헬륨",
"upgrades.helium.tooltip": "퍽의 좌우 중력 반전",
"upgrades.helium.verbose_description": "이렇게 하면 동전에 영향을 미치며 동전을 집어들 준비가 될 때까지 떠다니게 됩니다.",
"upgrades.hot_start.name": "핫 스타트",
"upgrades.hot_start.tooltip": "콤보 {{start}}, - 초당{{loss}} 콤보에서 시작",
"upgrades.hot_start.verbose_description": "모든 레벨이 시작될 때 콤보는 +30점으로 시작하지만, 매 초마다 1점씩 감소합니다. 이 효과는 다른 특전과 중첩됩니다.",
"upgrades.implosions.name": "영향",
"upgrades.implosions.tooltip": "폭발은 동전을 날려버리는 대신 빨아들입니다.",
"upgrades.implosions.verbose_description": "폭발력은 다른 방향으로 적용됩니다. 추가 레벨은 \"더 큰 폭발\"로 작용합니다.",
"upgrades.instant_upgrade.name": "즉시 업그레이드",
"upgrades.instant_upgrade.tooltip": "지금 +1 업그레이드, 게임 종료 시까지 -1 선택.",
"upgrades.instant_upgrade.verbose_description": "즉시 두 가지 업그레이드를 선택하면 무료 업그레이드 한 개와 이 특전을 받기 위해 사용한 업그레이드를 상환하는 업그레이드 한 개를 얻게 됩니다. 업그레이드를 선택할 수 있는 메뉴가 추가될 때마다 선택할 수 있는 옵션이 줄어듭니다.",
"upgrades.left_is_lava.name": "왼쪽을 피하십시오.",
"upgrades.left_is_lava.tooltip": "+{{lvl}} 벽돌을 부술 때마다 콤보. 공이 화면 왼쪽에 맞으면 콤보가 초기화됩니다.",
"upgrades.left_is_lava.verbose_description": "벽돌을 부술 때마다 콤보가 하나씩 증가하므로 다음에 부수는 모든 벽돌에서 코인을 하나 더 얻을 수 있습니다.\n\n하지만 콤보는 공이 왼쪽에 닿는 즉시 초기화됩니다.\n\n콤보가 올라가는 즉시 왼쪽이 빨간색으로 표시되어 부딪히지 않도록 주의해야 한다는 것을 알려줍니다.\n",
"upgrades.limitless.name": "무한한",
"upgrades.limitless.tooltip": "모든 업그레이드의 최대 레벨을 {{lvl}} 만큼 올립니다.",
"upgrades.limitless.verbose_description": "이 특전을 선택하면 자신의 한도도 하나씩 증가하여 다시 선택할 수 있습니다.",
"upgrades.metamorphosis.name": "메타모포시스",
"upgrades.metamorphosis.tooltip": "각 동전은 {{lvl}} 개의 벽돌을 해당 색상으로 얼룩지게 할 수 있습니다.",
"upgrades.metamorphosis.verbose_description": "이 특전을 사용하면 동전이 나온 벽돌의 색을 띠게 되며, 처음 닿는 벽돌도 같은 색으로 물들게 됩니다.\n\n동전은 벽돌을 부순 공의 속도로 생성되므로 '칠하고 싶은' 벽돌의 방향으로 살짝 조준하면 됩니다.",
"upgrades.minefield.name": "지뢰밭",
"upgrades.minefield.tooltip": "화면의 폭탄 벽돌 당 +{{lvl}} 콤보",
"upgrades.minefield.verbose_description": "벽돌을 놓으면 콤보에 + 레벨을, 파괴하면 - 레벨을 추가하고 기본 콤보에 벽돌 수에 레벨을 곱한 만큼 레벨을 올립니다.",
"upgrades.multiball.name": "멀티 볼",
"upgrades.multiball.tooltip": "각 레벨은 {{count}} 개의 공으로 시작합니다.",
"upgrades.multiball.verbose_description": "브레이크아웃 71에서 공을 떨어뜨리는 순간 패배합니다.\n\n이 특전으로 공 두 개를 얻게 되므로 공 하나를 잃어도 괜찮습니다.\n\n잃어버린 공은 다음 레벨에서 다시 돌아옵니다.\n\n공이 두 개 이상 있으면 추가 특전이 제공되며, 당연히 레벨을 더 빨리 클리어할 수 있습니다.",
"upgrades.nbricks.name": "엄격한 샘플 크기",
"upgrades.nbricks.tooltip": "퍽 바운스당 정확히 {{lvl}} 개의 벽돌을 쳐서 +{{lvl}} 콤보를 달성하고, 그렇지 않으면 초기화됩니다.",
"upgrades.nbricks.verbose_description": "반드시 벽돌을 파괴할 필요는 없지만, 벽돌을 쳐야 합니다. 폭발로 파괴된 벽돌은 포함되지 않습니다.",
"upgrades.one_more_choice.name": "추가 선택 사항",
"upgrades.one_more_choice.tooltip": "레벨을 더 올리면 목록에 {{lvl}} 개의 옵션이 추가됩니다.",
"upgrades.one_more_choice.verbose_description": "모든 업그레이드 메뉴에 옵션이 하나 더 추가됩니다. 선택할 수 있는 업그레이드 수가 증가하지는 않습니다.",
"upgrades.passive_income.name": "수동 소득",
"upgrades.passive_income.tooltip": "+{{lvl}} 콤보/브릭, 퍽이 지난 {{time}}초 동안 움직이지 않았다면 대신 재설정됩니다.",
"upgrades.passive_income.verbose_description": "일부 특전은 아무것도 하지 않아도 공이 원하는 것을 할 수 있도록 도와줍니다.",
"upgrades.picky_eater.name": "까다로운 식성",
"upgrades.picky_eater.tooltip": "벽돌 깨질 때마다 +{{lvl}} 콤보, 공 색이 바뀌면 초기화됨",
"upgrades.picky_eater.verbose_description": "공과 같은 색의 벽돌을 부술 때마다 콤보가 하나씩 증가합니다.\n다른 색이면 공은 새로운 색으로 바뀌지만 공과 같은 색의 벽돌이 남아 있지 않은 한 콤보는 초기화됩니다.\n최소값보다 높은 콤보를 얻으면 잘못된 색의 벽돌에는 빨간색 테두리가 생깁니다.\n공이 두 개 이상 있는 경우, 공 중 하나가 벽돌에 닿을 때마다 공의 색이 모두 바뀝니다.",
"upgrades.pierce.name": "피어싱",
"upgrades.pierce.tooltip": "퍽 바운드 후 공이 {{count}} 개의 벽돌을 관통했습니다.",
"upgrades.pierce.verbose_description": "공은 일반적으로 무언가에 닿는 즉시 튕깁니다. 이 특전을 사용하면 벽돌이 최대 3개까지 깨질 때까지 공의 궤적이 계속됩니다.\n\n그 후 4번째 벽돌에 닿으면 공이 튕기며, 카운터를 초기화하려면 퍽을 터치해야 합니다.",
"upgrades.pierce_color.name": "컬러 피어싱",
"upgrades.pierce_color.tooltip": "공 색깔의 벽돌에 +{{lvl}} 피해",
"upgrades.pierce_color.verbose_description": "공이 같은 색의 벽돌에 부딪힐 때마다 방해받지 않고 그냥 통과합니다.\n\n다른 색의 벽돌에 닿으면 벽돌을 부수고 그 색을 가져가서 튕겨 나갑니다.\n\n튼튼한 벽돌이 있다면 공이 같은 색의 벽돌에 닿아도 튕겨나갈 수 있습니다.",
"upgrades.puck_repulse_ball.help_plural": "반발력이 더 크다",
"upgrades.puck_repulse_ball.name": "연착륙",
"upgrades.puck_repulse_ball.tooltip": "퍽이 공을 튕겨냅니다",
"upgrades.puck_repulse_ball.verbose_description": "공이 퍽에 가까워지면 속도가 느려지기 시작하고 심지어 퍽에 닿지 않고 튕겨 나갈 수도 있습니다.",
"upgrades.reach.name": "하향식",
"upgrades.reach.tooltip": " 가장 아래 줄에 있는 N개의 벽돌을 터치하면 콤보가 초기화됩니다. 그렇지 않으면 +N 콤보",
"upgrades.reach.verbose_description": "벽돌이 한 줄만 있거나 가장 낮은 벽돌 줄이 게임의 전체 너비를 덮는 경우, 이 특전은 아무 효과가 없습니다. 그렇지 않으면 이 가장 낮은 줄을 부수면 콤보가 초기화되고, 다른 줄을 부수면 가장 낮은 줄에 있는 벽돌 수만큼 콤보가 증가합니다.\n\n가장 낮은 줄은 빨간색으로 강조 표시됩니다.",
"upgrades.respawn.name": "다시 생성",
"upgrades.respawn.tooltip": " {{delay}}초 후에{{percent}}%의 벽돌이 다시 생성됩니다.",
"upgrades.respawn.verbose_description": "일부 파티클 효과는 벽돌이 나타나는 위치를 알려줍니다.",
"upgrades.right_is_lava.name": "오른쪽을 피하십시오.",
"upgrades.right_is_lava.tooltip": "+{{lvl}} 벽돌당 콤보. 공이 화면 왼쪽에 맞으면 콤보가 초기화됩니다.",
"upgrades.right_is_lava.verbose_description": "벽돌을 부술 때마다 콤보가 하나씩 증가하므로 다음에 부수는 모든 벽돌에서 코인을 하나 더 얻을 수 있습니다.\n\n하지만 콤보는 공이 오른쪽에 닿는 즉시 초기화됩니다.\n\n콤보가 올라가는 즉시 오른쪽이 빨간색으로 표시되어 부딪히지 않도록 주의해야 한다는 것을 알려줍니다.\n",
"upgrades.sacrifice.help_l1": "생명을 잃으면 모든 벽돌이 사라집니다",
"upgrades.sacrifice.help_over": "콤보로 생명력 {{lvl}}을 잃으면 모든 벽돌을 클리어합니다.",
"upgrades.sacrifice.name": "희생",
"upgrades.sacrifice.verbose_description": "이렇게 하면 콤보가 꽤 높아질 수 있습니다.",
"upgrades.sapper.help_plural": "처음 깨진 {{lvl}} 개의 벽돌은 폭탄이 됩니다.",
"upgrades.sapper.name": "Sapper",
"upgrades.sapper.tooltip": "첫 번째 벽돌이 깨지면 폭탄이 됩니다.",
"upgrades.sapper.verbose_description": "처음 부순 벽돌은 그냥 사라지는 대신 폭탄 벽돌로 대체됩니다. 퍽에 공을 튕기면 효과가 다시 활성화됩니다. 이 특전을 레벨 업하면 더 많은 폭탄을 배치할 수 있습니다.\n\n폭탄은 주변 동전의 속도에 영향을 미치므로 너무 많이 폭발하면 노력의 결실을 얻기 어려울 수 있다는 점을 기억하세요.",
"upgrades.shocks.name": "쇼크",
"upgrades.shocks.tooltip": "폭발성 공 충돌",
"upgrades.shocks.verbose_description": "두 공이 충돌할 때마다 속도를 바꾸고 폭발을 일으키며 추가 속도를 얻어 분리합니다.",
"upgrades.shunt.name": "Shunt",
"upgrades.shunt.tooltip": "레벨 사이에 콤보의 {{percent}}% 유지",
"upgrades.shunt.verbose_description": "핫 스타트 기능도 있는 경우 현재 콤보에 핫 스타트 기능이 추가됩니다.",
"upgrades.side_flip.name": "오른손잡이",
"upgrades.side_flip.tooltip": "오른쪽에서 깨진 벽돌당 +{{lvl}} 콤보, 그렇지 않으면 -{{loss}} 콤보",
"upgrades.side_flip.verbose_description": "벽돌의 오른쪽을 타격하면 콤보 1개를 얻지만, 왼쪽을 타격하면 콤보 2개가 제거되므로 피하세요. 위쪽과 아래쪽에서 타격해도 효과가 없습니다.",
"upgrades.side_kick.name": "왼손잡이",
"upgrades.side_kick.tooltip": "왼쪽에서 깨진 벽돌당 +{{lvl}} 콤보, 그렇지 않으면 -{{loss}} 콤보",
"upgrades.side_kick.verbose_description": "벽돌의 왼쪽을 타격하면 콤보 1개를 얻지만, 오른쪽을 타격하면 콤보 2개가 제거되므로 피하세요. 위쪽과 아래쪽에서 타격해도 효과가 없습니다.",
"upgrades.skip_last.help_plural": "마지막 {{lvl}} 개의 벽돌이 폭발합니다.",
"upgrades.skip_last.name": "간편한 정리",
"upgrades.skip_last.tooltip": "마지막 벽돌이 폭발합니다.",
"upgrades.skip_last.verbose_description": "다음 레벨로 이동하려면 모든 벽돌을 깨야 합니다. 하지만 마지막 벽돌을 구하기는 어려울 수 있습니다.\n\n레벨을 일찍 클리어하면 업그레이드할 때 선택의 폭이 넓어집니다. 벽돌을 놓치지 않는 것도 매우 유리합니다.\n\n따라서 마지막 벽돌을 깨는 것이 어렵다면 이 특전을 몇 번 사용하면 도움이 될 수 있습니다.",
"upgrades.slow_down.name": "느린 공",
"upgrades.slow_down.tooltip": "공이 더 느리게 움직입니다.",
"upgrades.slow_down.verbose_description": "공은 비교적 느리게 시작하지만, 게임을 레벨이 올라갈수록 조금씩 더 빠르게 시작됩니다.\n\n또한 한 레벨에서 많은 시간을 보내면 속도가 빨라집니다.\n\n이 특전 덕분에 더 쉽게 관리할 수 있습니다.\n\n메뉴에서 어린이 모드를 활성화하면 매번 시작할 때마다 이 특전을 받을 수 있습니다.",
"upgrades.smaller_puck.help_plural": "더 작은 퍽과 더 높은 베이스 콤보",
"upgrades.smaller_puck.name": "더 작은 퍽",
"upgrades.smaller_puck.tooltip": "기본 콤보 +5 부여",
"upgrades.smaller_puck.verbose_description": "이렇게 하면 퍽이 작아져 이론적으로는 코너 샷이 더 쉬워지지만 실제로는 난이도만 높아집니다.\n\n그렇기 때문에 이 벽돌을 선택한 후 부수는 모든 벽돌에 대해 벽돌당 +5 코인이라는 좋은 보너스가 주어집니다.",
"upgrades.soft_reset.name": "소프트 리셋",
"upgrades.soft_reset.tooltip": "콤보 재설정은 {{percent}}%를 유지합니다.",
"upgrades.soft_reset.verbose_description": "콤보 재설정의 영향을 제한합니다.",
"upgrades.streak_shots.name": "히트 행진",
"upgrades.streak_shots.tooltip": "퍽을 튕기기 전에 벽돌을 많이 깨면 더 많은 코인을 획득할 수 있습니다.",
"upgrades.streak_shots.verbose_description": "벽돌을 부술 때마다 콤보(벽돌당 코인 개수)가 하나씩 증가합니다.\n\n하지만 공이 퍽에 닿는 순간 콤보는 기본값으로 초기화되며, 브릭당 코인 하나만 얻게 됩니다.\n\n콤보가 기본값 이상으로 올라가면 퍽이 빨간색으로 표시되어 공에 닿으면 콤보가 파괴된다는 것을 알려줍니다.",
"upgrades.sturdy_bricks.name": "견고한 벽돌",
"upgrades.sturdy_bricks.tooltip": "벽돌 HP +{{lvl}} , 깨질 때 생성되는 동전 비율 +{{percent}}%",
"upgrades.sturdy_bricks.verbose_description": "이 특성의 레벨이 올라갈 때마다 모든 브릭에 HP가 하나씩 추가됩니다. \"투시력\" 특전으로 HP 수치를 확인할 수 있습니다. \"관통\" 특전을 획득하면 공의 공격력을 높일 수 있습니다. 이 특성의 각 레벨은 동전 스폰을 +50% 추가합니다.",
"upgrades.telekinesis.help_plural": "공에 더 강력한 효과",
"upgrades.telekinesis.name": "염력",
"upgrades.telekinesis.tooltip": "퍽은 공의 궤적을 제어합니다.",
"upgrades.telekinesis.verbose_description": "공이 올라가는 동안 공을 컨트롤합니다.",
"upgrades.top_is_lava.name": "하늘이 한계입니다",
"upgrades.top_is_lava.tooltip": "+ 브릭당{{lvl}} 콤보, 상단 타격 시 초기화됨",
"upgrades.top_is_lava.verbose_description": "벽돌을 부술 때마다 콤보가 하나씩 증가합니다. 하지만 공이 화면 상단에 닿으면 콤보가 초기화됩니다.\n\n콤보가 최소값을 초과하면 상단에 빨간색 막대가 표시되어 부딪히지 않도록 주의해야 함을 알려줍니다.",
"upgrades.trampoline.name": "트램펄린",
"upgrades.trampoline.tooltip": "+ 퍽 바운스당{{lvl}} 콤보, 모든 테두리에서 바운스당{{lvl}} 콤보",
"upgrades.trampoline.verbose_description": "초기화 조건이 추가되지 않는 드문 콤보 업그레이드 중 하나입니다.",
"upgrades.trickledown.name": "흘러넘치다",
"upgrades.trickledown.tooltip": "동전은 화면 상단에 나타납니다.",
"upgrades.trickledown.verbose_description": "동전 몇 개를 따로 모아두는 데 도움이 될 수도 있습니다. ",
"upgrades.unbounded.help_no_ceiling": "벽돌당 +{{lvl}} 콤보, 측면 또는 천장 없음",
"upgrades.unbounded.name": "무제한",
"upgrades.unbounded.tooltip": "벽돌당 +{{lvl}} 콤보, 더 이상 공을 유지할 측면이 없음, 위험",
"upgrades.unbounded.verbose_description": "공을 화면에 계속 띄울 수 있는 방법을 찾으셨기를 바랍니다. 측면 타격에 대한 페널티가 더 이상 적용되지 않습니다. 레벨 2 이상에서는 천장도 사라집니다. 이것은 고급 특전입니다.",
"upgrades.viscosity.name": "점성",
"upgrades.viscosity.tooltip": "느린 코인 낙하",
"upgrades.viscosity.verbose_description": "동전은 일반적으로 중력과 폭발로 인해 상당히 빠른 속도로 가속됩니다.\n\n이 특성은 마치 점성이 있는 액체 속에 있는 것처럼 지속적으로 속도를 느리게 만듭니다.\n\n따라서 동전을 쉽게 잡을 수 있으며, 동전의 움직임에 영향을 주는 특전과 잘 어울립니다.",
"upgrades.wind.help_plural": "더 강력한 풍력",
"upgrades.wind.name": "바람",
"upgrades.wind.tooltip": "퍽 위치가 바람을 일으킵니다.",
"upgrades.wind.verbose_description": "바람은 퍽 위치에 따라 달라집니다: 왼쪽은 왼쪽으로, 오른쪽은 오른쪽으로 불어옵니다. 공과 동전 모두에 영향을 줍니다.",
"upgrades.yoyo.name": "Yo-yo",
"upgrades.yoyo.tooltip": "공이 퍽 쪽으로 떨어짐",
"upgrades.yoyo.verbose_description": "염력과 반대되는 개념으로, 공이 다시 떨어지는 동안 공을 제어합니다.",
"upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "벽돌당 +{{lvl}} 콤보, 폭발 시 초기화됨",
"upgrades.zen.verbose_description": "결국, 이 게임은 비폭력적인 게임입니다."
}

445
src/i18n/ru.json Normal file
View file

@ -0,0 +1,445 @@
{
"confirmRestart.no": "Отмена",
"confirmRestart.text": "Вы собираетесь начать новую игру. Вы уверены, что хотите продолжить?",
"confirmRestart.title": "Начать новую игру?",
"confirmRestart.yes": "Перезапустите игру",
"editor.editing.bigger": "Увеличить размер уровня",
"editor.editing.color": "Выберите цвет из списка цветов (максимум 5 на уровень)",
"editor.editing.copy": "Скопировать код уровня",
"editor.editing.copy_help": "Вставьте его в канал #levels в нашем Discord",
"editor.editing.credit": "Кредиты и источник",
"editor.editing.credit_prompt": "Введите исходный URL-адрес или пояснение вашего уровня.",
"editor.editing.delete": "Удалить уровень",
"editor.editing.down": "Сдвиньте все кирпичи вниз.",
"editor.editing.help": "Затем щелкните по плитке, чтобы раскрасить ее.",
"editor.editing.left": "Переместите все кирпичи влево.",
"editor.editing.play": "Пройти этот уровень",
"editor.editing.rename": "Название уровня",
"editor.editing.rename_prompt": "Введите новое название уровня.",
"editor.editing.right": "Переместите все кирпичи вправо.",
"editor.editing.smaller": "Уменьшить размер уровня",
"editor.editing.title": "Уровень редактирования: {{name}}",
"editor.editing.up": "Поднимите все кирпичи.",
"editor.help": "Создавайте собственные уровни и делитесь ими для включения в игру.",
"editor.import": "Импортировать уровень",
"editor.import_instruction": "Вставьте код уровня, чтобы импортировать его в список уровней.",
"editor.locked": "Наберите в общей сложности {{min}} очков, чтобы разблокировать",
"editor.new_level": "Новый уровень",
"editor.title": "Редактор уровней",
"gameOver.creative": "Этот забег не будет записываться.",
"gameOver.cumulative_total": "Ваш общий суммарный балл увеличился с {{startTs}} до {{endTs}}.",
"gameOver.lost.summary": "Вы уронили мяч, поймав {{score}} монет.",
"gameOver.lost.title": "Игра окончена",
"gameOver.stats.balls_lost": "Мячи потеряны",
"gameOver.stats.bricks_broken": "Кирпичи разбиты",
"gameOver.stats.bricks_per_minute": "Разбитых кирпичей в минуту",
"gameOver.stats.catch_rate": "Уровень улова",
"gameOver.stats.combo_avg": "Среднее комбо",
"gameOver.stats.combo_max": "Максимальная комбинация",
"gameOver.stats.duration_per_level": "Продолжительность за уровень",
"gameOver.stats.hit_rate": "Скорость попадания",
"gameOver.stats.intro": "",
"gameOver.stats.level_reached": "Достигнутый уровень",
"gameOver.stats.total_score": "Общий балл",
"gameOver.stats.upgrades_applied": "Примененные обновления",
"gameOver.stats_intro": "Ниже приведена статистика вашей игры по сравнению с вашими {{count}} лучшими играми.",
"gameOver.unlocked_perk": "Обновление разблокировано",
"gameOver.unlocked_perk_plural": "Вы только что разблокировали {{count}} привилегий",
"gameOver.win.summary": "Игра окончена. Вы спрятали {{score}} монет.",
"gameOver.win.title": "Вы завершили эту игру",
"help.content": "## Цель\n\nПоймайте как можно больше монет на протяжении 7 уровней.\nМонеты появляются, когда вы разбиваете кирпичи.\nЛовите их веслом, чтобы увеличить свой счет.\nВаш счет отображается в правом верхнем углу экрана.\nНе уроните мяч, иначе игра закончится.\n\nУничтожив все кирпичи, вы сможете выбрать улучшение.\n\n## Апгрейды\n\nВыбранные вами улучшения будут действовать до конца игры.\nНекоторые из них можно выбирать несколько раз для усиления эффекта.\nНекоторые помогают в прицеливании или облегчают игру другими способами.\nНекоторые полезны только в комбинации.\n\nВ начале каждой игры вы всегда получаете один апгрейд.\nЕго иконка будет служить кирпичом первого уровня.\nВыбрать стартовые апгрейды можно в настройках.\n\nМногие апгрейды влияют на ваши комбо.\n\n## Комбо\n\nВаше \"комбо\" - это количество монет, появляющихся при разрушении кирпича.\nОно отображается на вашем весле, например, x4 означает, что каждый кирпич порождает 4 монеты.\nБольшинство обновлений, увеличивающих комбо, также добавляют условие для его сброса.\nкомбо также сбрасывается, если мяч возвращается к ракетке, не задев кирпич.\n\nВ этом случае появится сообщение \"промах\".\n\nСтарайтесь каждый раз целиться в кирпич.\n\n## Прицеливание\n\nТолько положение мяча на лопатке определяет, как он отскочит.\nЕсли мяч попадет в центр площадки, он отскочит вертикально вверх.\nЕсли вы ударите с одной стороны, он отскочит под большим углом.\nСкорость весла и угол входа не влияют на направление мяча после отскока.\n\nМожно открыть множество улучшений, помогающих в прицеливании.\n\n## разблокирует\n\nПри первой игре в Breakout 71 большинство обновлений и уровней заблокированы.\nМодификации можно разблокировать, просто играя и собирая много монет.\nПервые уровни разблокируются при достижении высокого результата.\nПоследующие уровни добавляют условие, по которому вы можете выбрать те или иные привилегии.\n\nДобиваться высоких результатов гораздо проще, если после каждого уровня вы получаете несколько обновлений.\n\n## Повторные прокачки и бесплатные улучшения\n\nВы получите дополнительный апгрейд, если будете играть хорошо:\n\n- Пройдите уровень за {{levelTimeGood}} секунд\n- Ударьте по бокам или сверху менее {{wallBouncedGood}} раз\n- Поймайте {{catchRateGood}}% монет\n- Пропустите кирпичи менее {{missesGood}} раз\n\nВы также получите повторную прокачку, которая позволит вам пропустить обновления, если вы справитесь с заданием еще лучше:\n\n- Пройдите уровень за {{levelTimeBest}} секунды\n- Ударьте по бокам или сверху менее {{wallBouncedBest}} раз\n- Поймать {{catchRateBest}}% монет\n- Промахнитесь по кирпичам менее {{missesBest}} раз\n\nОпция в настройках позволяет отображать эту статистику",
"help.help": "Узнайте больше об игре",
"help.levels": "Уровни",
"help.title": "Помощь",
"help.upgrades": "## Обновления",
"history.columns.score": "Оценка",
"history.columns.started": "Дата",
"history.help": "Посмотрите свои {{count}} лучшие игры.",
"history.locked": "Сыграйте не менее десяти игр, чтобы разблокировать",
"history.title": "История побегов",
"lab.help": "Попробуйте любую сборку.",
"lab.instructions": "Выберите апгрейды ниже, а затем выберите уровень для игры.",
"lab.menu_entry": "Творческий режим",
"lab.reset": "Сбросить все в 0",
"lab.select_level": "Выберите уровень для игры",
"lab.unlocks_at": "Открывается при общем количестве очков {{score}}",
"level_up.after_buttons": "Вы только что закончили уровень {{level}}/{{max}}.",
"level_up.before_buttons": "Вы поймали {{score}} монет {{catchGain}} из {{levelSpawnedCoins}} за {{time}} секунды {{timeGain}}.\n\nВы промахнулись {{levelMisses}} раз {{missesGain}} и ударились о стены или потолок {{levelWallBounces}} раз{{wallHitsGain}}.\n\n{{compliment}}",
"level_up.compliment_advice": "Постарайтесь поймать все монеты, не промахнуться мимо кирпичей, не удариться о стены/потолок или пройти уровень за 30 секунд, чтобы получить дополнительные улучшения.",
"level_up.compliment_good": "Молодцы!",
"level_up.compliment_perfect": "Впечатляет, продолжайте в том же духе!",
"level_up.pick_upgrade_title": "Выберите обновление",
"level_up.plus_one_upgrade": "(+1 обновление)",
"level_up.plus_one_upgrade_and_reroll": "(+1 улучшение и +1 повторный бросок)",
"level_up.reroll": "Повторный бросок ({{count}})",
"level_up.reroll_help": "Предложите новые варианты",
"level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
"main_menu.colorful_coins_help": "",
"main_menu.comboIncreaseTexts": "",
"main_menu.comboIncreaseTexts_help": "",
"main_menu.contrast": "",
"main_menu.contrast_help": "",
"main_menu.credit_levels": "",
"main_menu.donate": "Вы играли {{hours}} часов",
"main_menu.donate_help": "Как насчет пожертвования? Вы можете скрыть это напоминание в настройках.",
"main_menu.donation_reminder": "",
"main_menu.donation_reminder_help": "",
"main_menu.download_save_file": "",
"main_menu.download_save_file_help": "",
"main_menu.extra_bright": "",
"main_menu.extra_bright_help": "",
"main_menu.fullscreen": "",
"main_menu.fullscreen_help": "",
"main_menu.help_content": "",
"main_menu.help_help": "",
"main_menu.help_title": "",
"main_menu.help_upgrades": "",
"main_menu.high_score": "Высокий балл : {{score}}",
"main_menu.kid": "",
"main_menu.kid_help": "",
"main_menu.language": "",
"main_menu.language_help": "",
"main_menu.load_save_file": "",
"main_menu.load_save_file_help": "",
"main_menu.max_coins": "",
"main_menu.max_coins_help": "",
"main_menu.max_particles": "",
"main_menu.max_particles_help": "",
"main_menu.mobile": "",
"main_menu.mobile_help": "",
"main_menu.normal": "НОВАЯ ИГРА",
"main_menu.normal_help": "Пройдите 7 уровней со случайным стартовым преимуществом",
"main_menu.pointer_lock": "",
"main_menu.pointer_lock_help": "",
"main_menu.record": "",
"main_menu.record_download": "",
"main_menu.record_help": "",
"main_menu.red_miss": "",
"main_menu.red_miss_help": "",
"main_menu.reset": "",
"main_menu.reset_cancel": "",
"main_menu.reset_confirm": "",
"main_menu.reset_help": "",
"main_menu.reset_instruction": "",
"main_menu.save_file_error": "",
"main_menu.save_file_loaded": "",
"main_menu.save_file_loaded_help": "",
"main_menu.save_file_loaded_ok": "",
"main_menu.settings_help": "Подстраивайте игровой процесс под свои потребности и вкус",
"main_menu.settings_title": "Настройки",
"main_menu.show_fps": "",
"main_menu.show_fps_help": "",
"main_menu.show_stats": "",
"main_menu.show_stats_help": "",
"main_menu.sounds": "",
"main_menu.sounds_help": "",
"main_menu.starting_perks": "",
"main_menu.starting_perks_checked": "",
"main_menu.starting_perks_full_random": "",
"main_menu.starting_perks_help": "",
"main_menu.starting_perks_unchecked": "",
"main_menu.title": "Прорыв 71",
"main_menu.unlocks": "Разблокированный контент",
"main_menu.unlocks_help": "Попробуйте преимущества и уровни, которые вы разблокировали",
"play.close_modale_window_tooltip": "Закрыть",
"play.current_lvl": "Уровень {{level}}/{{max}}",
"play.menu_label": "Меню",
"play.menu_tooltip": "Открыть главное меню",
"play.missed_ball": "Мисс",
"play.mobile_press_to_play": "Нажмите и удерживайте здесь, чтобы играть",
"play.score_tooltip": "Узнайте о своих оценках, обновлениях и многом другом",
"play.stats.coins_catch_rate": "Скорость добычи монет",
"play.stats.levelMisses": "Пропущенные выстрелы, когда вы не попали ни в кого",
"play.stats.levelTime": "Время уровня",
"play.stats.levelWallBounces": "Отскоки от стены",
"score_panel.close_to_unlock": "Разблокировка следующего уровня:",
"score_panel.get_upgrades_to_unlock": "Наберите {{missingUpgrades}} и наберите {{points}} больше очков, чтобы разблокировать уровень \"{{level}}\"",
"score_panel.rerolls_count": "Вы накопили {{rerolls}} повторных бросков",
"score_panel.score_to_unlock": "Наберите {{points}} больше очков, чтобы разблокировать уровень \"{{level}}\"",
"score_panel.title": "{{score}} очков на уровне {{level}}/{{max}} ",
"score_panel.upcoming_levels": "Предстоящие уровни :",
"score_panel.upgrades_picked": "Обновления, выбранные в этой игре, запускаются :",
"settings.autoplay": "",
"settings.autoplay_help": "",
"settings.basic": "Базовая графика",
"settings.basic_help": "Улучшенная производительность.",
"settings.colorful_coins": "Разноцветные монеты",
"settings.colorful_coins_help": "Монеты всегда спаунятся того же цвета, что и кирпичи",
"settings.comboIncreaseTexts": "Показать +X в золотом цвете",
"settings.comboIncreaseTexts_help": "Когда комбо увеличивается",
"settings.contrast": "Высокая контрастность",
"settings.contrast_help": "Более красочная и темная визуализация",
"settings.donation_reminder": "Напомните мне о пожертвовании",
"settings.donation_reminder_help": "Смотрите время игры и ссылку на пожертвование в главном меню",
"settings.download_save_file": "Скачать счет и статистику",
"settings.download_save_file_help": "Получить файл сохранения",
"settings.extra_bright": "Очень яркий",
"settings.extra_bright_help": "Увеличивает размер ореола вокруг монет и кирпичей.",
"settings.fullscreen": "ПОЛНЫЙ ЭКРАН",
"settings.fullscreen_help": "Игра пытается перейти в полноэкранный режим перед запуском",
"settings.kid": "Детский режим",
"settings.kid_help": "Начинайте будущие игры с \"медленного мяча\".",
"settings.language": "Язык",
"settings.language_help": "Выберите язык игры",
"settings.load_save_file": "Загрузить файл сохранения",
"settings.load_save_file_help": "Выберите файл сохранения на вашем устройстве",
"settings.max_coins": " {{max}} монет на экране максимум",
"settings.max_coins_help": "Только косметика, не влияет на результат",
"settings.mobile": "Мобильный режим",
"settings.mobile_help": "Оставляет место под лопаткой.",
"settings.pointer_lock": "Блокировка указателя мыши",
"settings.pointer_lock_help": "Фиксирует и скрывает курсор мыши.",
"settings.precise_lighting": "",
"settings.precise_lighting_help": "",
"settings.probabilistic_lighting": "",
"settings.probabilistic_lighting_help": "",
"settings.record": "Запись видеороликов игрового процесса",
"settings.record_download": "Скачать видео ({{size}} МБ)",
"settings.record_help": "Получите видеозапись каждого уровня.",
"settings.red_miss": "Мисс предупреждение",
"settings.red_miss_help": "Покажите красные частицы вокруг мячей, падающих без попадания.",
"settings.reset": "Перезагрузка игры",
"settings.reset_cancel": "Нет",
"settings.reset_confirm": "Да",
"settings.reset_help": "Сотрите высокий результат, время игры и статистику",
"settings.reset_instruction": "Вы потеряете весь прогресс, достигнутый в игре, вы уверены?",
"settings.save_file_error": "Ошибка при загрузке файла сохранения",
"settings.save_file_loaded": "Сохранить загруженный файл",
"settings.save_file_loaded_help": "Теперь приложение перезагрузится, чтобы применить ваше сохранение",
"settings.save_file_loaded_ok": "OK",
"settings.show_fps": "Счетчик FPS",
"settings.show_fps_help": "Контролируйте работу приложения",
"settings.show_stats": "Показывайте статистику в реальном времени",
"settings.show_stats_help": "Монеты, время, отскоки, промахи",
"settings.smooth_lighting": "",
"settings.smooth_lighting_help": "",
"settings.sounds": "Звуки игры",
"settings.sounds_help": "Бипы, блепы и брррр",
"settings.stress_test": "",
"settings.stress_test_help": "",
"starting_perks.checked": "Когда вы начнете новую игру, вам будет дано одно из этих преимуществ. Щелкните по перку, чтобы исключить его.",
"starting_perks.help": "Выберите возможные стартовые апгрейды",
"starting_perks.random": "Все преимущества были убраны, выбор будет случайным.",
"starting_perks.title": "Стартовые привилегии",
"starting_perks.unchecked": "Приведенные ниже привилегии не предлагаются в качестве стартовых, но вы можете нажать на них, чтобы добавить в пул.",
"unlocks.greyed_out_help": "Выделенные серым апгрейды можно разблокировать, увеличив общее количество очков. Общий счет увеличивается каждый раз, когда вы набираете очки в игре.",
"unlocks.intro": "Ваш общий счет составляет {{ts}}. Ниже представлены все обновления и уровни, которые предлагает игра. Нажмите на апгрейд или уровень ниже, чтобы начать тестовую игру с ним.",
"unlocks.just_unlocked": "Уровень разблокирован",
"unlocks.just_unlocked_plural": "Вы только что разблокировали {{count}} уровней",
"unlocks.level": "<h2>Вы разблокировали {{unlocked}} уровней из {{out_of}}</h2>\n<p>Здесь представлены все уровни игры, нажмите на один из них, чтобы опробовать его.</p> ",
"unlocks.level_description": "Уровень {{size}}x{{size}} с {{bricks}} кирпичами, {{colors}} цветами и {{bombs}} бомбами.",
"unlocks.minScore": "Достигните ${{minScore}} в беге, чтобы разблокировать игру.",
"unlocks.minScoreWithPerks": "Достигните ${{minScore}} в беге с {{required}} , но без {{forbidden}} для разблокировки.",
"unlocks.minTotalScore": "Накопите в общей сложности ${{score}}",
"unlocks.reached": "Ваш лучший результат - {{reached}}.",
"unlocks.title_upgrades": "Вы разблокировали {{unlocked}} обновлений из {{out_of}}",
"upgrades.addiction.name": "Наркомания",
"upgrades.addiction.tooltip": "+{{lvl}} комбо / кирпич, комбо сбрасывается на {{delay}}с после разрушения кирпича.",
"upgrades.addiction.verbose_description": "Отсчет начинается только после разрушения первого кирпича на каждом уровне. Он остановится, как только все кирпичи будут уничтожены.",
"upgrades.asceticism.name": "Аскетизм",
"upgrades.asceticism.tooltip": "+{{combo}} комбо/кирпич, - {{combo}} при ловле монет",
"upgrades.asceticism.verbose_description": "Вам нужно будет где-то хранить монеты, пока ваш комбо поднимается.",
"upgrades.ball_attract_ball.help_plural": "Более сильная сила притяжения",
"upgrades.ball_attract_ball.name": "Гравитация",
"upgrades.ball_attract_ball.tooltip": "Мячи притягивают мячи",
"upgrades.ball_attract_ball.verbose_description": "Шары, находящиеся на расстоянии более \"3/4 ширины игровой зоны\", начнут притягиваться друг к другу.\n\nСила притяжения сильнее, когда они находятся на наибольшем расстоянии друг от друга.\n\nРадужные частицы будут летать, символизируя силу притяжения. Это преимущество можно получить, только если у вас уже есть более одного шара.",
"upgrades.ball_attracts_coins.name": "Шарики притягивают монеты",
"upgrades.ball_attracts_coins.tooltip": "Монеты следуют за ближайшим шаром и падают медленнее",
"upgrades.ball_attracts_coins.verbose_description": "Это можно использовать, чтобы \"раскрасить\" шарики монетами, если совместить это с \"пятном\" и \"призрачными монетами\". Это также подходит в качестве замены магнита для монет.",
"upgrades.ball_repulse_ball.help_plural": "Более сильные силы отталкивания",
"upgrades.ball_repulse_ball.name": "Личное пространство",
"upgrades.ball_repulse_ball.tooltip": "Шарики отталкиваются от шариков",
"upgrades.ball_repulse_ball.verbose_description": "Шарики, находящиеся на расстоянии менее четверти ширины экрана, начнут отталкиваться друг от друга. Сила отталкивания будет сильнее, если они находятся близко друг к другу. Частицы будут вылетать из шара, символизируя действие этой силы. Эта возможность доступна только в том случае, если у вас уже есть несколько шаров.",
"upgrades.base_combo.name": "Прочный фундамент",
"upgrades.base_combo.tooltip": "Комбо начинается с {{coins}} вместо 1.",
"upgrades.base_combo.verbose_description": "Обычно ваше комбо начинается с 1 в начале уровня и сбрасывается до 1, когда вы подпрыгиваете, не попадая ни во что. С этим перком комбо начинается на 3 пункта выше, поэтому вы всегда будете получать не менее 4 монет за кирпич. Когда ваше комбо обнулится, оно вернется к 4, а не к 1. Ваш шарик будет немного блестеть, чтобы показать, что его комбо выше единицы.",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "Большие взрывы",
"upgrades.bigger_explosions.verbose_description": "Взрыв по умолчанию очищает квадрат 3x3, с этим взрывом он становится квадратом 5x5, а удар по монетам также значительно сильнее. После каждого взрыва экран будет мигать (кроме базового режима).",
"upgrades.bigger_puck.name": "Большое весло",
"upgrades.bigger_puck.tooltip": "Легко поймать больше монет.",
"upgrades.bigger_puck.verbose_description": "Большее весло позволяет никогда не промахиваться по мячу и ловить больше монет, а также точно определять угол отскока (угол наклона мяча зависит только от того, куда он попадает при ударе о весло).",
"upgrades.bricks_attract_ball.name": "Кирпичи притягивают мячи",
"upgrades.bricks_attract_ball.tooltip": "Мяч летит к первым {{count}} кирпичам, которых он коснется.",
"upgrades.bricks_attract_ball.verbose_description": "Эффект сильнее на более высоких уровнях. Количество кирпичей, которые могут ударить до того, как эффект прекратится, также больше. Эффект возобновляется, когда мяч касается шайбы.",
"upgrades.bricks_attract_coins.name": "Кирпичи притягивают монеты",
"upgrades.bricks_attract_coins.tooltip": "Помогает им оставаться на вершине",
"upgrades.bricks_attract_coins.verbose_description": "",
"upgrades.clairvoyant.name": "Ясновидящий",
"upgrades.clairvoyant.tooltip": "Просматривайте предстоящие уровни, количество кирпичей и направление движения мяча",
"upgrades.clairvoyant.verbose_description": "Поможет выбрать правильные апгрейды и понять, что происходит с прочными кирпичами. Уровни 2 и 3 дают дополнительные знания сомнительной полезности (достигаются в режиме цикла)",
"upgrades.coin_magnet.help_plural": "Более сильное воздействие на монеты",
"upgrades.coin_magnet.name": "Магнит для монет",
"upgrades.coin_magnet.tooltip": "Лопасть притягивает монеты",
"upgrades.coin_magnet.verbose_description": "Направляет монеты к лопатке. Эффект будет сильнее, если монета уже находится рядом с ним.",
"upgrades.compound_interest.name": "Сложные проценты",
"upgrades.compound_interest.tooltip": "+{{lvl}} комбо за каждый разбитый кирпич, сбрасывается при потере монеты",
"upgrades.compound_interest.verbose_description": "Каждый раз, когда вы разбиваете кирпич, ваше комбо будет увеличиваться на одну монету, и с каждым разбитым кирпичом будет появляться все больше и больше монет.\nОднако не забывайте ловить все монеты лопаткой, так как любая потерянная монета обнулит ваше комбо.\nКак только ваше комбо превысит минимальный уровень, в нижней части игрового поля появится красная линия, напоминающая вам, что монеты не должны попадать туда.",
"upgrades.concave_puck.name": "Вогнутое весло",
"upgrades.concave_puck.tooltip": "Повышает точность вертикальной наводки",
"upgrades.concave_puck.verbose_description": "Мячи начинают уровень, поднимаясь прямо вверх, и отскакивают под меньшим углом.",
"upgrades.corner_shot.name": "Угловой удар",
"upgrades.corner_shot.tooltip": "Позволяет накладывать паддл на границы экрана",
"upgrades.corner_shot.verbose_description": "Помогает прицеливаться на поворотах. Дальние уровни позволят вам выйти дальше.",
"upgrades.etherealcoins.name": "Монеты, в космосе",
"upgrades.etherealcoins.tooltip": "На монеты больше не действует гравитация",
"upgrades.etherealcoins.verbose_description": "Монеты сохранят свою скорость даже после нескольких подпрыгиваний, и на них больше не будет действовать гравитация.",
"upgrades.extra_levels.name": "Еще 5 минут",
"upgrades.extra_levels.tooltip": "Играйте {{count}} уровней вместо 7",
"upgrades.extra_levels.verbose_description": "По умолчанию игра может длиться максимум 7 уровней, после чего игра заканчивается.\n\nКаждый уровень этой привилегии позволяет вам подняться на один уровень выше. Последние уровни часто являются теми, где вы набираете больше всего очков, так что разница может быть значительной.",
"upgrades.extra_life.help_plural": "Ваш (последний) мяч отскочит на дно, а не будет потерян ({{lvl}} раз).",
"upgrades.extra_life.name": "Экстра жизнь",
"upgrades.extra_life.tooltip": "Мяч отскочит один раз на нижнюю линию, после чего будет потерян.",
"upgrades.extra_life.verbose_description": "Обычно у вас один шар, и игра заканчивается, как только вы его бросите.\n\nЭто преимущество добавляет белую полоску в нижней части экрана, которая сохранит шарик один раз и разобьется в процессе.\n\nВы будете терять один уровень этого перка каждый раз, когда мяч будет отскакивать в нижнюю часть экрана.",
"upgrades.forgiving.name": "Прощение",
"upgrades.forgiving.tooltip": "Пропущенные паузы уменьшают комбо постепенно, а не все сразу.",
"upgrades.forgiving.verbose_description": "Первый промах за уровень - бесплатно, затем 10% от комбо, затем 20%.",
"upgrades.fountain_toss.name": "Бросок фонтана",
"upgrades.fountain_toss.tooltip": "Получите несколько комбо, когда пропустите несколько монет.",
"upgrades.fountain_toss.verbose_description": "Если вы пропустили монету и ваша комбо была меньше {{max}}, то вероятность того, что ваша комбо вырастет на {{lvl}}/ комбо вырастет на единицу.",
"upgrades.ghost_coins.name": "Призрачные монеты",
"upgrades.ghost_coins.tooltip": "Монеты медленно проходят сквозь кирпичи",
"upgrades.ghost_coins.verbose_description": "Это не ошибка, это особенность! Монеты пролетают сквозь кирпичи медленно. На более высоких уровнях они движутся быстрее.",
"upgrades.helium.name": "Гелий",
"upgrades.helium.tooltip": "Гравитация изменяется слева и справа от весла",
"upgrades.helium.verbose_description": "Это повлияет на монеты и позволит им плавать до тех пор, пока вы не соберете их.",
"upgrades.hot_start.name": "Горячий старт",
"upgrades.hot_start.tooltip": "Начните с комбо {{start}}, -{{loss}} комбо в секунду",
"upgrades.hot_start.verbose_description": "В начале каждого уровня ваше комбо будет начинаться с +30 очков, но затем каждую секунду оно будет уменьшаться на одно. Эффект суммируется с другими перками.",
"upgrades.hypnosis.name": "Гипноз",
"upgrades.hypnosis.tooltip": "Когда кирпич меняет цвет, телепортируйте монету на ближайший шар и перезарядите её способность окрашивать кирпич.",
"upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "Имплозии",
"upgrades.implosions.tooltip": "Взрывы всасывают монеты, а не выдувают их.",
"upgrades.implosions.verbose_description": "Сила взрыва действует в обратном направлении. Дальние уровни действуют как \"больший взрыв\".",
"upgrades.instant_upgrade.name": "Мгновенное обновление",
"upgrades.instant_upgrade.tooltip": "+2 апгрейда сейчас, -1 выбор до конца игры.",
"upgrades.instant_upgrade.verbose_description": "Сразу же выберите два апгрейда, чтобы получить один бесплатный и один в качестве компенсации за тот, что был использован для получения этого перка. В каждом последующем меню выбора апгрейдов будет все меньше вариантов.",
"upgrades.left_is_lava.name": "Избегайте левой стороны",
"upgrades.left_is_lava.tooltip": "+{{lvl}} комбо за каждый разбитый кирпич. Комбо сбрасывается, если мяч попадает в левую часть экрана",
"upgrades.left_is_lava.verbose_description": "Каждый раз, когда вы разбиваете кирпич, ваше комбо увеличивается на один, так что вы получите на одну монету больше со всех следующих разбитых кирпичей.\n\nОднако ваше комбо обнуляется, как только ваш шарик попадает в левую сторону.\n\nКак только ваше комбо увеличится, левая сторона станет красной, чтобы напомнить вам, что вы должны избегать столкновения с ней.\n",
"upgrades.limitless.name": "Безграничный",
"upgrades.limitless.tooltip": "Повысьте максимальный уровень всех апгрейдов на {{lvl}} .",
"upgrades.limitless.verbose_description": "Выбрав это умение, вы также повышаете свой собственный лимит на один, что позволяет вам выбрать его снова.",
"upgrades.metamorphosis.name": "Метаморфозы",
"upgrades.metamorphosis.tooltip": "Каждая монета может окрасить {{lvl}} кирпичей в свой цвет",
"upgrades.metamorphosis.verbose_description": "С этим перком монеты будут иметь цвет кирпича, из которого они появились, и окрасят первый кирпич, которого они коснутся, в тот же цвет. Монеты рождаются со скоростью разбившего их шара, а значит, вы можете немного прицелиться в направлении кирпичей, которые хотите \"раскрасить\". На первом уровне каждая монета может окрасить 1 кирпич, прежде чем она будет \"потрачена\" и появится в пустоте.",
"upgrades.minefield.name": "Минное поле",
"upgrades.minefield.tooltip": "+{{lvl}} комбо за каждый кирпич с бомбой на экране",
"upgrades.minefield.verbose_description": "Добавляет +lvl к комбо, когда кирпич находится на месте, -lvl, когда он уничтожается, и повышает базовое комбо на количество кирпичей, умноженное на lvl.",
"upgrades.multiball.name": "Мультишар",
"upgrades.multiball.tooltip": "Начинайте каждый уровень с {{count}} шариков.",
"upgrades.multiball.verbose_description": "Как только вы бросите мяч в игре Breakout 71, вы проиграете.\n\nС этим преимуществом вы получаете два мяча, поэтому можете позволить себе потерять один.\n\nПотерянные мячи возвращаются на следующем уровне.\n\nНаличие более одного шара делает доступными некоторые дополнительные преимущества и, конечно, позволяет быстрее пройти уровень.",
"upgrades.nbricks.name": "Строгий размер выборки",
"upgrades.nbricks.tooltip": "Попадите точно в {{lvl}} кирпичей за один удар веслом, чтобы получить +{{lvl}} комбо, иначе оно сбрасывается.",
"upgrades.nbricks.verbose_description": "Вам не обязательно уничтожать кирпичи, но вы должны попасть в них. Кирпичи, разрушенные взрывами, не считаются.",
"upgrades.one_more_choice.name": "Дополнительный выбор",
"upgrades.one_more_choice.tooltip": "При дальнейшем повышении уровня будет предложено на {{lvl}} больше вариантов в списке",
"upgrades.one_more_choice.verbose_description": "В каждом меню апгрейдов появится еще одна опция. Это не увеличивает количество апгрейдов, которые вы можете выбрать.",
"upgrades.passive_income.name": "Пассивный доход",
"upgrades.passive_income.tooltip": "+{{lvl}} комбо/кирпич, если только паддл не двигался в течение последних {{time}}с, тогда он сбрасывается.",
"upgrades.passive_income.verbose_description": "Некоторые привилегии могут помочь шарам делать то, что вы хотите, без необходимости что-либо предпринимать.",
"upgrades.picky_eater.name": "Придирчивый едок",
"upgrades.picky_eater.tooltip": "+{{lvl}} комбо за каждый разбитый кирпич, сбрасывается при смене цвета шара",
"upgrades.picky_eater.verbose_description": "Когда вы разбиваете кирпич того же цвета, что и ваш шарик, ваше комбо увеличивается на единицу.\nЕсли кирпич другого цвета, то мяч принимает новый цвет, но комбо обнуляется, если только не осталось кирпичей того же цвета, что и мяч.\nКак только вы получите комбо выше минимального, кирпичи неправильного цвета будут обведены красной рамкой.\nЕсли у вас больше одного шара, они все меняют цвет, когда один из них попадает в кирпич.",
"upgrades.pierce.name": "Пирсинг",
"upgrades.pierce.tooltip": "Мяч пробивает {{count}} кирпичей после отскока от площадки",
"upgrades.pierce.verbose_description": "Обычно мяч отскакивает, как только коснется чего-нибудь. С этим преимуществом он будет продолжать двигаться по траектории до 3 разбитых кирпичей.\n\nПосле этого он отскочит на 4-м кирпиче, и вам нужно будет коснуться лопатки, чтобы сбросить счетчик.",
"upgrades.pierce_color.name": "Цветной пирсинг",
"upgrades.pierce_color.tooltip": "+{{lvl}} урона кирпичам цвета шара",
"upgrades.pierce_color.verbose_description": "Если шарик попадает в кирпич того же цвета, он просто беспрепятственно проходит сквозь него.\n\nЕсли он попадет в кирпич другого цвета, то разобьет его, возьмет его цвет и отскочит.\n\nЕсли у вас прочные кирпичи, мяч все равно может отскочить от кирпича того же цвета.",
"upgrades.puck_repulse_ball.help_plural": "Более сильные силы отталкивания",
"upgrades.puck_repulse_ball.name": "Мягкая посадка",
"upgrades.puck_repulse_ball.tooltip": "Лопасть отталкивает мячи",
"upgrades.puck_repulse_ball.verbose_description": "Когда мяч приблизится к лопатке, он начнет замедляться и даже может отскочить, не коснувшись лопатки.",
"upgrades.rainbow.name": "Радуга",
"upgrades.rainbow.tooltip": "Монеты спаунятся с радужным цветом.",
"upgrades.rainbow.verbose_description": "С каждым уровнем увеличивается доля цветных монет. Цвет зависит от времени прохождения уровня.",
"upgrades.reach.name": "Сверху вниз",
"upgrades.reach.tooltip": " Прикосновение к N кирпичам самого нижнего ряда сбрасывает комбо. В противном случае +N комбо",
"upgrades.reach.verbose_description": "Если есть только один ряд кирпичей или если самый нижний ряд кирпичей занимает всю ширину игры, то этот перк ничего не делает. В противном случае, разбив этот самый нижний ряд, вы сбрасываете комбо, а разбив любой другой, увеличиваете комбо на количество кирпичей в этом самом нижнем ряду.\n\nСамый нижний ряд будет выделен красным цветом.",
"upgrades.respawn.name": "Перерождение",
"upgrades.respawn.tooltip": "{{percent}}% кирпичей перерождаются через {{delay}}с.",
"upgrades.respawn.verbose_description": "Некоторые эффекты частиц позволят вам узнать, где будут появляться кирпичи.",
"upgrades.right_is_lava.name": "Избегайте правой стороны",
"upgrades.right_is_lava.tooltip": "+{{lvl}} комбо на кирпич. Комбо сбрасывается, если мяч попадает в правую часть экрана",
"upgrades.right_is_lava.verbose_description": "Каждый раз, когда вы разбиваете кирпич, ваше комбо увеличивается на один, так что вы получите на одну монету больше со всех следующих разбитых кирпичей.\n\nОднако, как только ваш шарик попадет в правую сторону, ваша комбинация обнулится.\n\nКак только ваше комбо увеличится, правая сторона станет красной, чтобы напомнить вам, что вы должны избегать столкновения с ней.\n",
"upgrades.sacrifice.help_l1": "Потеря жизни очищает все кирпичи",
"upgrades.sacrifice.help_over": "Потеряв жизнь {{lvl}}x, комбо затем очищает все кирпичи.",
"upgrades.sacrifice.name": "Жертвоприношение",
"upgrades.sacrifice.verbose_description": "Это может поднять комбо довольно высоко.",
"upgrades.sapper.help_plural": "Первые разбитые {{lvl}} кирпичей становятся бомбами.",
"upgrades.sapper.name": "Сапёр",
"upgrades.sapper.tooltip": "Первый разбитый кирпич превращается в бомбу.",
"upgrades.sapper.verbose_description": "Вместо того чтобы просто исчезнуть, первый разбитый вами кирпич будет заменен кирпичом с бомбой. Если ударить мячом по лопатке, эффект повторится. Повысив уровень этого умения, вы сможете устанавливать больше бомб.",
"upgrades.shocks.name": "Шоки",
"upgrades.shocks.tooltip": "Взрывные столкновения шаров",
"upgrades.shocks.verbose_description": "Когда два шара сталкиваются, они обмениваются скоростью, порождают взрыв и набирают дополнительную скорость, чтобы разделиться.",
"upgrades.shunt.name": "Шунт",
"upgrades.shunt.tooltip": "Сохраняйте {{percent}}% вашего комбо между уровнями",
"upgrades.shunt.verbose_description": "Если у вас также есть горячий старт, горячий старт просто добавляется к текущему комбо.",
"upgrades.side_flip.name": "Правая рука",
"upgrades.side_flip.tooltip": "+{{lvl}} комбо за каждый кирпич, разбитый справа, -{{loss}} в противном случае",
"upgrades.side_flip.verbose_description": "Ударьте кирпич с правой стороны, чтобы получить одно комбо, но избегайте ударов с левой стороны, так как это снимет 2 комбо. Удары сверху и снизу не дают никакого эффекта.",
"upgrades.side_kick.name": "Левая рука",
"upgrades.side_kick.tooltip": "+{{lvl}} комбо за каждый кирпич, разбитый слева, -{{loss}} в противном случае",
"upgrades.side_kick.verbose_description": "Ударьте кирпич с левой стороны, чтобы получить одно комбо, но избегайте ударов с правой стороны, так как это снимет 2 комбо. Удары сверху и снизу не дают никакого эффекта.",
"upgrades.skip_last.help_plural": "Последние {{lvl}} кирпичей взорвутся.",
"upgrades.skip_last.name": "Легкая очистка",
"upgrades.skip_last.tooltip": "Последний кирпич взорвется.",
"upgrades.skip_last.verbose_description": "Вам нужно разбить все кирпичи, чтобы перейти на следующий уровень. Однако получить последние может быть непросто.\n\nРаннее прохождение уровня дает дополнительные возможности при улучшении. Никогда не пропускать кирпичи также очень полезно.\n\nТак что если вам трудно разбить последние кирпичи, получите эту привилегию несколько раз.",
"upgrades.slow_down.name": "Медленный мяч",
"upgrades.slow_down.tooltip": "Мяч движется медленнее",
"upgrades.slow_down.verbose_description": "Мяч стартует относительно медленно, но с каждым уровнем вашей игры он будет стартовать все быстрее.\n\nОн также ускорится, если вы проведете много времени на одном уровне.\n\nЭто преимущество делает его более управляемым.\n\nВы можете получать его каждый раз в начале игры, включив детский режим в меню.",
"upgrades.smaller_puck.help_plural": "Еще меньшее весло и более высокий базовый комбо",
"upgrades.smaller_puck.name": "Маленькое весло",
"upgrades.smaller_puck.tooltip": "Также дает +5 базовых комбо",
"upgrades.smaller_puck.verbose_description": "Это уменьшает размер лепестка, что теоретически облегчает некоторые угловые удары, но на самом деле лишь повышает сложность игры.\n\nПоэтому вы также получите приятный бонус в виде +5 монет за кирпич за все кирпичи, которые вы разобьете после этого.",
"upgrades.soft_reset.name": "Мягкий сброс",
"upgrades.soft_reset.tooltip": "Комбо-сброс сохраняет {{percent}}%",
"upgrades.soft_reset.verbose_description": "Ограничьте влияние комбо-сброса.",
"upgrades.streak_shots.name": "Попадание в полосу",
"upgrades.streak_shots.tooltip": "Больше монет, если вы разобьете много кирпичей, прежде чем подпрыгнуть на лопатке.",
"upgrades.streak_shots.verbose_description": "Каждый раз, когда вы разбиваете кирпич, ваше комбо увеличивается на единицу.\n\nОднако как только мяч коснется вашего весла, комбо будет сброшено до стандартного значения.\n\nКак только ваше комбо поднимется выше базового значения, на лопатке появится красная рамка, напоминающая о том, что прикосновение мяча к ней уничтожит ваше комбо.",
"upgrades.sturdy_bricks.name": "Прочные кирпичи",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} кирпичей HP, +{{percent}}% монет, выпадающих при разрушении",
"upgrades.sturdy_bricks.verbose_description": "Каждый уровень этого перка добавляет один HP ко всем кирпичам. Вы можете увидеть количество HP с помощью перка \"Ясновидящий\". Вы можете увеличить урон от шаров, получив перк \"Пронзающий\". Каждый уровень этого перка добавляет +50% к спауну монет.",
"upgrades.superhot.name": "СУПЕР ГОРЯЧИЙ",
"upgrades.superhot.tooltip": "Время движется, когда движется весло.",
"upgrades.superhot.verbose_description": "СУПЕР ГОРЯЧИЙ СУПЕР ГОРЯЧИЙ СУПЕР ГОРЯЧИЙ СУПЕР ГОРЯЧИЙ",
"upgrades.telekinesis.help_plural": "Более сильное воздействие на мяч",
"upgrades.telekinesis.name": "Телекинез",
"upgrades.telekinesis.tooltip": "Паддл управляет траекторией полета мяча",
"upgrades.telekinesis.verbose_description": "Вы управляете мячом, пока он поднимается вверх.",
"upgrades.top_is_lava.name": "Небо - это предел",
"upgrades.top_is_lava.tooltip": "+{{lvl}} комбо за кирпич, сбрасывается при ударе сверху",
"upgrades.top_is_lava.verbose_description": "Каждый раз, когда вы разбиваете кирпич, ваше комбо увеличивается на один. Однако, как только ваш мяч попадет в верхнюю часть экрана, комбо обнуляется.\n\nКогда ваше комбо превысит минимальное значение, вверху появится красная полоска, напоминающая о том, что вам следует избегать ударов.",
"upgrades.trampoline.name": "Батут",
"upgrades.trampoline.tooltip": "+{{lvl}} комбо за отскок, -{{lvl}} комбо за отскок на любой границе",
"upgrades.trampoline.verbose_description": "Одно из редких комбо-улучшений, которое не добавляет условие сброса.",
"upgrades.transparency.name": "Прозрачность",
"upgrades.transparency.tooltip": "Чем выше шарик находится на экране, тем прозрачнее он становится. Чем прозрачнее шар, тем больше монет он приносит.",
"upgrades.transparency.verbose_description": "Более высокие уровни делают шар прозрачным быстрее и увеличивают бонус за очки.",
"upgrades.trickledown.name": "Экономика по принципу \"копеечной монеты",
"upgrades.trickledown.tooltip": "Монеты появляются в верхней части экрана.",
"upgrades.trickledown.verbose_description": "Это может помочь вам отложить несколько монет.",
"upgrades.unbounded.name": "Набивка",
"upgrades.unbounded.tooltip": "Добавляет пространство слева и справа от уровня, но ваше весло не может пройти так далеко.",
"upgrades.unbounded.verbose_description": "Еще одна модернизация может помочь вам увеличить радиус действия весла.",
"upgrades.viscosity.name": "Вязкость",
"upgrades.viscosity.tooltip": "Медленное падение монет",
"upgrades.viscosity.verbose_description": "Монеты обычно разгоняются с помощью гравитации и взрывов до довольно высоких скоростей.\n\nЭтот перк постоянно заставляет их замедляться, как будто они находятся в какой-то вязкой жидкости.\n\nЭто облегчает их поимку и отлично сочетается с перками, влияющими на движение монет.",
"upgrades.wind.help_plural": "Более сильная сила ветра",
"upgrades.wind.name": "Ветер",
"upgrades.wind.tooltip": "Положение весла создает ветер",
"upgrades.wind.verbose_description": "Ветер зависит от положения лопасти: левая дует влево, правая - вправо. Влияет как на шарики, так и на монеты.",
"upgrades.yoyo.name": "Йо-йо",
"upgrades.yoyo.tooltip": "Мяч падает на лопатку",
"upgrades.yoyo.verbose_description": "Это противоположность телекинезу: управляйте мячом, пока он падает обратно.",
"upgrades.zen.name": "Дзен",
"upgrades.zen.tooltip": "+{{lvl}} комбо за кирпич, сбрасывается при взрыве",
"upgrades.zen.verbose_description": "В конце концов, это ненасильственная игра."
}

445
src/i18n/tr.json Normal file
View file

@ -0,0 +1,445 @@
{
"confirmRestart.no": "İptal etmek",
"confirmRestart.text": "Yeni bir oyuna başlamak üzeresiniz. Devam etmek istediğinizden emin misiniz?",
"confirmRestart.title": "Yeni bir oyuna mı başlasam?",
"confirmRestart.yes": "Oyunu yeniden başlat",
"editor.editing.bigger": "Seviye boyutunu artır",
"editor.editing.color": "Renk listesinden bir renk seçin (seviye başına en fazla 5)",
"editor.editing.copy": "Kopyalama seviyesi kodu",
"editor.editing.copy_help": "Bunu Discord'umuzdaki #levels kanalına yapıştırın",
"editor.editing.credit": "Krediler ve kaynak",
"editor.editing.credit_prompt": "Seviyenizin kaynak URL'sini veya açıklamasını girin.",
"editor.editing.delete": "Seviyeyi Sil",
"editor.editing.down": "Tüm tuğlaları aşağı doğru hareket ettirin",
"editor.editing.help": "Daha sonra renklendirmek istediğiniz kutucuğa tıklayın.",
"editor.editing.left": "Tüm tuğlaları sola taşı",
"editor.editing.play": "Bu seviyeyi oyna",
"editor.editing.rename": "Seviye Adı",
"editor.editing.rename_prompt": "Lütfen seviye için yeni bir ad girin",
"editor.editing.right": "Tüm tuğlaları sağa taşı",
"editor.editing.smaller": "Seviye boyutunu azalt",
"editor.editing.title": "Düzenleme düzeyi : {{name}}",
"editor.editing.up": "Tüm tuğlaları yukarı taşı",
"editor.help": "Özel seviyeler yaratın ve bunları oyuna dahil etmek için paylaşın.",
"editor.import": "Bir seviyeyi içe aktar",
"editor.import_instruction": "Seviye listenize aktarmak için bir seviye kodunu yapıştırın",
"editor.locked": "Kilidi açmak için toplam {{min}} puanına ulaşın",
"editor.new_level": "Yeni seviye",
"editor.title": "Seviye Editörü",
"gameOver.creative": "Bu koşu kaydedilmeyecek.",
"gameOver.cumulative_total": "Toplam kümülatif puanınız {{startTs}} 'dan {{endTs}}'e çıktı.",
"gameOver.lost.summary": " {{score}} jeton yakaladıktan sonra topu düşürdün.",
"gameOver.lost.title": "Oyun bitti",
"gameOver.stats.balls_lost": "Kaybedilen toplar",
"gameOver.stats.bricks_broken": "Tuğlalar kırıldı",
"gameOver.stats.bricks_per_minute": "Dakikada kırılan tuğla sayısı",
"gameOver.stats.catch_rate": "Yakalama oranı",
"gameOver.stats.combo_avg": "Ortalama kombo",
"gameOver.stats.combo_max": "Maksimum kombo",
"gameOver.stats.duration_per_level": "Seviye başına süre",
"gameOver.stats.hit_rate": "İsabet oranı",
"gameOver.stats.intro": "",
"gameOver.stats.level_reached": "Seviyeye ulaşıldı",
"gameOver.stats.total_score": "Toplam Puan",
"gameOver.stats.upgrades_applied": "Uygulanan yükseltmeler",
"gameOver.stats_intro": "Aşağıda {{count}} en iyi oyunlarınızla karşılaştırıldığında oyun istatistiklerinizi bulabilirsiniz.",
"gameOver.unlocked_perk": "Yükseltme kilidi açıldı",
"gameOver.unlocked_perk_plural": "Az önce {{count}} avantajın kilidini açtınız",
"gameOver.win.summary": "Bu oyun bitti. {{score}} jeton sakladın.",
"gameOver.win.title": "Bu oyunu tamamladın",
"help.content": "## Hedef\n\n7 seviye boyunca mümkün olduğunca çok jeton topla. \nTuğlaları kırdığında jetonlar belirir.\nPuanını artırmak için küreğinle topla.\nPuanın ekranın sağ üst köşesinde gösterilir.\nTopu düşürme yoksa oyun biter.\n\nTüm tuğlaları yok ettikten sonra bir yükseltme seçebilirsin.\n\n## Yükseltmeler \n\nSeçtiğin yükseltmeler koşunun sonuna kadar geçerli olur. \nBazıları daha güçlü etki için birden fazla kez seçilebilir.\nBazıları nişan almaya yardımcı olur veya oyunu başka şekillerde kolaylaştırır. \nBazıları yalnızca birleştirildiğinde işe yarar.\n\nHer oyunun başında her zaman bir yükseltme alırsın. \nSimgesi ilk seviyenin tuğlaları olarak hizmet eder. \nAyarlardan başlangıç yükseltmelerini seçebilirsin.\n\nBirçok yükseltme kombonu etkiler. \n\n## Kombo\n\n\"Kombon\", bir tuğla kırıldığında ortaya çıkan jeton sayısıdır. \nKüreğinizde görüntülenir, örneğin x4 her tuğlanın 4 jeton üreteceği anlamına gelir. \nKomboyu artıran çoğu yükseltme, onu sıfırlamak için bir koşul da ekler. \nTop herhangi bir tuğlaya çarpmadan küreğe geri dönerse kombo da sıfırlanır. \nBu olduğunda bir \"ıskalama\" mesajı gösterilir. \n\nHer seferinde bir tuğlaya doğru nişan almaya çalışın. \n\n## Nişan Alma\n\nSadece küreğin üzerindeki top konumu nasıl sekeceğine karar verir. \nTop küreğin tam ortasına çarparsa, dikey olarak geri sekecektir. \nBir tarafa daha fazla vurursanız, daha fazla açıya sahip olacaktır. \nKürek hızı ve gelen açı, zıpladıktan sonra topun yönü üzerinde hiçbir etkiye sahip değildir. \n\nNişan almaya yardımcı olan birçok yükseltme açılabilir. \n\n## Kilit Açmalar\n\nBreakout 71'i ilk kez oynarken, çoğu yükseltme ve seviye kilitlenir. \nYükseltmeler, sadece oynayarak ve birçok jeton yakalayarak açılır. \nİlk seviyeler yüksek bir puana ulaşarak açılır.\nDaha sonraki seviyeler hangi avantajları seçebileceğinize dair bir koşul ekler.\n\nHer seviyeden sonra birden fazla yükseltme aldığınızda yüksek puanlara ulaşmak çok daha kolaydır.\n\n## Tekrar atışlar ve ücretsiz yükseltmeler\n\nİyi oynadığınızda seçebileceğiniz ekstra bir yükseltme elde edersiniz: \n\n- Seviyeyi {{levelTimeGood}} saniyenin altında tamamlayın\n- Kenarlara veya tepeye {{wallBouncedGood}} kereden az vurun\n- Paraların {{catchRateGood}}%'sini yakalayın\n- Tuğlaları {{missesGood}} kereden az ıskalayın\n\nDaha da iyi yaparsanız yükseltmeleri atlamanıza izin veren bir tekrar atış da elde edersiniz: \n\n- Seviyeyi {{levelTimeBest}} saniyenin altında tamamlayın\n- Kenarlara veya tepeye {{wallBouncedBest}} kereden az vurun\n- Paraların {{catchRateBest}}%'sini yakalayın\n- Tuğlaları {{missesBest}} kereden az ıskalayın\n\nAyarlardaki bir seçenek bu istatistikleri görüntülemenizi sağlar",
"help.help": "Oyun hakkında daha fazla bilgi edinin",
"help.levels": "Seviyeler",
"help.title": "Yardım",
"help.upgrades": "## Yükseltmeler",
"history.columns.score": "Gol",
"history.columns.started": "Tarih",
"history.help": "En iyi {{count}} oyununuzu görün.",
"history.locked": "Kilidi açmak için en az on oyun oynayın",
"history.title": "Koşu geçmişi",
"lab.help": "İstediğiniz herhangi bir yapıyı deneyin",
"lab.instructions": "Aşağıdan yükseltmeleri seçin, ardından oynayacağınız seviyeyi seçin.",
"lab.menu_entry": "Yaratıcı mod",
"lab.reset": "Hepsini 0'a 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.after_buttons": " {{level}}/{{max}}seviyesini yeni bitirdiniz.",
"level_up.before_buttons": " {{time}} saniyede {{levelSpawnedCoins}} üzerinden {{score}} jeton {{catchGain}} yakaladın {{timeGain}}.\n {{levelMisses}} kez {{missesGain}} ıskaladın ve {{levelWallBounces}} kez duvarlara veya tavana çarptın{{wallHitsGain}}.\n{{compliment}}",
"level_up.compliment_advice": "Tüm paraları toplamaya çalışın, tuğlaları asla kaçırmayın, duvarlara/tavana çarpmayın veya ek yükseltmeler kazanmak için 30 saniyenin altındaki seviyeyi temizlemeyin.",
"level_up.compliment_good": "Tebrikler !",
"level_up.compliment_perfect": "Çok etkileyici, böyle devam edin!",
"level_up.pick_upgrade_title": "Bir yükseltme seçin",
"level_up.plus_one_upgrade": "(+1 yükseltme)",
"level_up.plus_one_upgrade_and_reroll": "(+1 yükseltme ve +1 yeniden atma)",
"level_up.reroll": "Tekrar at ({{count}})",
"level_up.reroll_help": "Yeni seçenekler sunun",
"level_up.upgrade_perk_to_level": "Seviye {{level}}",
"main_menu.basic": "",
"main_menu.basic_help": "",
"main_menu.colorful_coins": "",
"main_menu.colorful_coins_help": "",
"main_menu.comboIncreaseTexts": "",
"main_menu.comboIncreaseTexts_help": "",
"main_menu.contrast": "",
"main_menu.contrast_help": "",
"main_menu.credit_levels": "",
"main_menu.donate": " {{hours}} saat oynadınız",
"main_menu.donate_help": "Bağış yapmaya ne dersiniz? Ayarlardan bu hatırlatıcıyı gizleyebilirsiniz.",
"main_menu.donation_reminder": "",
"main_menu.donation_reminder_help": "",
"main_menu.download_save_file": "",
"main_menu.download_save_file_help": "",
"main_menu.extra_bright": "",
"main_menu.extra_bright_help": "",
"main_menu.fullscreen": "",
"main_menu.fullscreen_help": "",
"main_menu.help_content": "",
"main_menu.help_help": "",
"main_menu.help_title": "",
"main_menu.help_upgrades": "",
"main_menu.high_score": "En yüksek puan : {{score}}",
"main_menu.kid": "",
"main_menu.kid_help": "",
"main_menu.language": "",
"main_menu.language_help": "",
"main_menu.load_save_file": "",
"main_menu.load_save_file_help": "",
"main_menu.max_coins": "",
"main_menu.max_coins_help": "",
"main_menu.max_particles": "",
"main_menu.max_particles_help": "",
"main_menu.mobile": "",
"main_menu.mobile_help": "",
"main_menu.normal": "Yeni Oyun",
"main_menu.normal_help": "Rastgele bir başlangıç avantajıyla 7 seviye oynayın",
"main_menu.pointer_lock": "",
"main_menu.pointer_lock_help": "",
"main_menu.record": "",
"main_menu.record_download": "",
"main_menu.record_help": "",
"main_menu.red_miss": "",
"main_menu.red_miss_help": "",
"main_menu.reset": "",
"main_menu.reset_cancel": "",
"main_menu.reset_confirm": "",
"main_menu.reset_help": "",
"main_menu.reset_instruction": "",
"main_menu.save_file_error": "",
"main_menu.save_file_loaded": "",
"main_menu.save_file_loaded_help": "",
"main_menu.save_file_loaded_ok": "",
"main_menu.settings_help": "Oyun tarzını ihtiyaçlarınıza ve zevkinize göre uyarlayın",
"main_menu.settings_title": "Ayarlar",
"main_menu.show_fps": "",
"main_menu.show_fps_help": "",
"main_menu.show_stats": "",
"main_menu.show_stats_help": "",
"main_menu.sounds": "",
"main_menu.sounds_help": "",
"main_menu.starting_perks": "",
"main_menu.starting_perks_checked": "",
"main_menu.starting_perks_full_random": "",
"main_menu.starting_perks_help": "",
"main_menu.starting_perks_unchecked": "",
"main_menu.title": "Kopuş 71",
"main_menu.unlocks": "Kilidi açılmış içerik",
"main_menu.unlocks_help": "Kilidini açtığınız avantajları ve seviyeleri deneyin",
"play.close_modale_window_tooltip": "Kapalı",
"play.current_lvl": "Seviye {{level}}/{{max}}",
"play.menu_label": "Menü",
"play.menu_tooltip": "Ana menüyü aç",
"play.missed_ball": "Kayıp",
"play.mobile_press_to_play": "Oynamak için buraya basın ve basılı tutun",
"play.score_tooltip": "Puanınızı, yükseltmelerinizi ve daha fazlasını görün",
"play.stats.coins_catch_rate": "Madeni para yakalama oranı",
"play.stats.levelMisses": "Hiçbir şeye isabet ettiremediğiniz şutlar",
"play.stats.levelTime": "Seviye zamanı",
"play.stats.levelWallBounces": "Duvar sıçramaları",
"score_panel.close_to_unlock": "Sonraki seviyenin kilidini aç:",
"score_panel.get_upgrades_to_unlock": " {{missingUpgrades}} alın ve \"{{level}}\" seviyesinin kilidini açmak için {{points}} puan daha kazanın",
"score_panel.rerolls_count": " {{rerolls}} yeniden atma biriktirdiniz",
"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.upgrades_picked": "Bu oyun çalışmasında seçilen yükseltmeler:",
"settings.autoplay": "",
"settings.autoplay_help": "",
"settings.basic": "Temel grafikler",
"settings.basic_help": "Daha iyi performans.",
"settings.colorful_coins": "Renkli madeni paralar",
"settings.colorful_coins_help": "Madeni paralar her zaman tuğlanın renginde ortaya çıkar",
"settings.comboIncreaseTexts": "Altında +X göster",
"settings.comboIncreaseTexts_help": "Kombo arttığında",
"settings.contrast": "Yüksek Kontrast",
"settings.contrast_help": "Daha renkli ve koyu görüntü oluşturma",
"settings.donation_reminder": "Bana bağış yapmayı hatırlat",
"settings.donation_reminder_help": "Oynanan süreyi ve bağış bağlantısını ana menüde görün",
"settings.download_save_file": "Puan ve istatistikleri indir",
"settings.download_save_file_help": "Bir kayıt dosyası al",
"settings.extra_bright": "Ekstra parlak",
"settings.extra_bright_help": "Madeni paraların ve tuğlaların etrafındaki hale boyutunu büyütür.",
"settings.fullscreen": "Tam ekran",
"settings.fullscreen_help": "Oyun başlamadan önce tam ekran olmaya çalışacak",
"settings.kid": "Çocuk modu",
"settings.kid_help": "Gelecek oyunlara \"daha yavaş top\" ile başlayın.",
"settings.language": "Dil",
"settings.language_help": "Oyunun dilini seçin",
"settings.load_save_file": "Kayıt dosyasını yükle",
"settings.load_save_file_help": "Cihazınızda bir kayıt dosyası seçin",
"settings.max_coins": "Ekranda maksimum {{max}} jeton var",
"settings.max_coins_help": "Sadece kozmetik, puan üzerinde etkisi yok",
"settings.mobile": "Mobil mod",
"settings.mobile_help": "Kürek altında boşluk bırakır.",
"settings.pointer_lock": "Fare işaretçisi kilidi",
"settings.pointer_lock_help": "Fare imlecini kilitler ve gizler.",
"settings.precise_lighting": "",
"settings.precise_lighting_help": "",
"settings.probabilistic_lighting": "",
"settings.probabilistic_lighting_help": "",
"settings.record": "Oyun videolarını kaydedin",
"settings.record_download": "Videoyu indir ({{size}} MB)",
"settings.record_help": "Her seviyenin videosunu edinin.",
"settings.red_miss": "Uyarıyı kaçırdım",
"settings.red_miss_help": "Vuruş yapmadan aşağı inen topların etrafında kırmızı parçacıklar göster.",
"settings.reset": "Oyunu Sıfırla",
"settings.reset_cancel": "HAYIR",
"settings.reset_confirm": "Evet",
"settings.reset_help": "En yüksek skoru, oyun süresini ve istatistikleri sil",
"settings.reset_instruction": "Oyunda kaydettiğiniz tüm ilerlemeyi kaybedeceksiniz, emin misiniz?",
"settings.save_file_error": "Kayıt dosyası yüklenirken hata oluştu",
"settings.save_file_loaded": "Yüklenen dosya kaydedildi",
"settings.save_file_loaded_help": "Uygulama şimdi kaydınızı uygulamak için yeniden yüklenecek",
"settings.save_file_loaded_ok": "TAMAM",
"settings.show_fps": "FPS Sayacı",
"settings.show_fps_help": "Uygulamanın performansını izleyin",
"settings.show_stats": "Gerçek zamanlı istatistikleri göster",
"settings.show_stats_help": "Paralar, zaman, sekmeler, ıskalar",
"settings.smooth_lighting": "",
"settings.smooth_lighting_help": "",
"settings.sounds": "Oyun sesleri",
"settings.sounds_help": "Bipler, blooplar ve brrrr",
"settings.stress_test": "",
"settings.stress_test_help": "",
"starting_perks.checked": "Yeni bir oyuna başladığınızda, bu avantajlardan biri size verilecektir. Bir avantajı hariç tutmak için tıklayın.",
"starting_perks.help": "Olası başlangıç yükseltmelerini seçin",
"starting_perks.random": "Tüm avantajlar kaldırıldı, seçim rastgele olacak.",
"starting_perks.title": "Başlangıç avantajları",
"starting_perks.unchecked": "Aşağıdaki avantajlar başlangıç avantajı olarak sunulmamaktadır, ancak havuza eklemek için tıklayabilirsiniz.",
"unlocks.greyed_out_help": "Grileştirilmiş yükseltmeler toplam puanınızı artırarak açılabilir. Toplam puan, oyunda her puan aldığınızda artar.",
"unlocks.intro": "Toplam puanınız {{ts}}. Aşağıda oyunun sunduğu tüm yükseltmeler ve seviyeler bulunmaktadır. Aşağıdaki bir yükseltmeye veya seviyeye tıklayarak onunla bir test oyunu başlatın.",
"unlocks.just_unlocked": "Seviye kilidi açıldı",
"unlocks.just_unlocked_plural": "Az önce {{count}} seviyenin kilidini açtınız",
"unlocks.level": "<h2> {{out_of}}seviyeden {{unlocked}} tanesinin kilidini açtın</h2>\n<p>İşte tüm oyun seviyeleri, denemek için birine tıkla.</p> ",
"unlocks.level_description": " {{bricks}} tuğla, {{colors}} renk ve {{bombs}} bombadan oluşan {{size}}x{{size}} büyüklüğünde bir seviye.",
"unlocks.minScore": "Kilidi açmak için bir koşuda ${{minScore}} 'a ulaşın.",
"unlocks.minScoreWithPerks": " {{required}} ile ancak {{forbidden}} olmadan bir koşuda ${{minScore}} 'a ulaşın.",
"unlocks.minTotalScore": "Toplam ${{score}}biriktirin",
"unlocks.reached": "En iyi skorunuz {{reached}}idi.",
"unlocks.title_upgrades": " {{out_of}}yükseltmeden {{unlocked}} tanesinin kilidini açtınız",
"upgrades.addiction.name": "Bağımlılık",
"upgrades.addiction.tooltip": "+{{lvl}} kombo / tuğla, kombo bir tuğlayı kırdıktan sonra {{delay}}saniye içinde sıfırlanır.",
"upgrades.addiction.verbose_description": "Geri sayım yalnızca her seviyenin ilk tuğlası kırıldıktan sonra başlar. Tüm tuğlalar yok edildiğinde durur.",
"upgrades.asceticism.name": "Zühd",
"upgrades.asceticism.tooltip": "+{{combo}} kombo / tuğla, - {{combo}} jeton yakalamada",
"upgrades.asceticism.verbose_description": "Kombonuz tırmanırken paraları bir yere saklamanız gerekecek.",
"upgrades.ball_attract_ball.help_plural": "Daha güçlü çekim kuvveti",
"upgrades.ball_attract_ball.name": "Yer çekimi",
"upgrades.ball_attract_ball.tooltip": "Toplar toplarını çeker",
"upgrades.ball_attract_ball.verbose_description": "\"Oyun alanının genişliğinin 3/4'ünden\" daha uzakta olan toplar birbirini çekmeye başlayacaktır. \n\nÇekim kuvveti, birbirlerinden en uzakta olduklarında daha güçlüdür. \n\nGökkuşağı parçacıkları çekim kuvvetini sembolize etmek için uçacaktır. Bu avantaj yalnızca birden fazla topunuz varsa sunulur.",
"upgrades.ball_attracts_coins.name": "Toplar madeni paraları çeker",
"upgrades.ball_attracts_coins.tooltip": "Madeni paralar en yakın topu takip eder ve daha yavaş düşer",
"upgrades.ball_attracts_coins.verbose_description": "\"Leke\" ve \"hayalet paralar\" ile birleştirdiğinizde, bu, paralarla topların \"etrafını boyamak\" için kullanılabilir. Ayrıca, para mıknatısı yerine de kullanılabilir.",
"upgrades.ball_repulse_ball.help_plural": "Daha güçlü itme kuvveti",
"upgrades.ball_repulse_ball.name": "Kişisel alan",
"upgrades.ball_repulse_ball.tooltip": "Toplar topları iter",
"upgrades.ball_repulse_ball.verbose_description": "Çeyrek ekran genişliğinden daha az uzaklıktaki toplar birbirini itmeye başlayacaktır. Birbirlerine yakınlarsa itme kuvveti daha güçlüdür. Parçacıklar bu kuvvetin uygulandığını sembolize etmek için dışarı fırlayacaktır. Bu avantaj yalnızca birden fazla topunuz varsa sunulur.",
"upgrades.base_combo.name": "Güçlü temeller",
"upgrades.base_combo.tooltip": "Kombo 1 yerine {{coins}} 'dan başlar.",
"upgrades.base_combo.verbose_description": "Kombonuz normalde seviyenin başında 1'den başlar ve hiçbir şeye çarpmadan zıpladığınızda 1'e sıfırlanır. Bu avantajla, kombo 3 puan daha yüksekte başlar, bu yüzden her zaman tuğla başına en az 4 jeton alırsınız. Kombonuz her sıfırlandığında, 1 yerine 4'e geri döner. Topunuz, kombosunun birden yüksek olduğunu belirtmek için biraz parıldayacaktır.",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "Daha büyük patlamalar",
"upgrades.bigger_explosions.verbose_description": "Varsayılan patlama 3x3 kareyi temizler, bununla 5x5 kare olur ve paralara gelen darbe de önemli ölçüde daha güçlüdür. Ekran her patlamadan sonra yanıp söner (temel mod hariç)",
"upgrades.bigger_puck.name": "Daha büyük kürek",
"upgrades.bigger_puck.tooltip": "Kolayca daha fazla para yakalayın.",
"upgrades.bigger_puck.verbose_description": "Daha büyük bir kürek, topu asla ıskalamamanızı ve daha fazla jeton yakalamanızı kolaylaştırır, ayrıca topun sekme açısını hassas bir şekilde ayarlamanızı sağlar (topun açısı yalnızca küreğe çarptığı yere bağlıdır).",
"upgrades.bricks_attract_ball.name": "Tuğlalar topları çeker",
"upgrades.bricks_attract_ball.tooltip": "Top çarpacağı ilk {{count}} tuğlaya doğru gider.",
"upgrades.bricks_attract_ball.verbose_description": "Etkisi daha yüksek seviyelerde daha güçlüdür. Etki durmadan önce vurabilecek tuğla sayısı da daha yüksektir. Etki, top diske çarptığında yeniden silahlanır.",
"upgrades.bricks_attract_coins.name": "Tuğlalar madeni paraları çeker",
"upgrades.bricks_attract_coins.tooltip": "Onların orada kalmalarına yardımcı olur",
"upgrades.bricks_attract_coins.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)",
"upgrades.coin_magnet.help_plural": "Madeni paralar üzerinde daha güçlü etki",
"upgrades.coin_magnet.name": "Madeni para mıknatısı",
"upgrades.coin_magnet.tooltip": "Kürek paraları çekiyor",
"upgrades.coin_magnet.verbose_description": "Madeni paraları küreğe yönlendirir. Madeni para zaten küreğe yakınsa etkisi daha güçlüdür.",
"upgrades.compound_interest.name": "Bileşik faiz",
"upgrades.compound_interest.tooltip": "+{{lvl}} kombo her kırılan tuğla için, jeton kaybedildiğinde sıfırlanır",
"upgrades.compound_interest.verbose_description": "Her tuğlayı kırdığınızda kombonuz bir artacak ve kırdığınız her tuğlayla birlikte daha fazla jeton ortaya çıkacaktır. \nAncak, bu jetonların her birini küreğinizle yakaladığınızdan emin olun, çünkü kaybedilen jeton kombonuzu sıfırlayacaktır.\nKombonuz minimumun üzerine çıktığında, oyun alanının alt kısmında jetonların oraya gitmemesi gerektiğini hatırlatan kırmızı bir çizgi olacaktır.",
"upgrades.concave_puck.name": "İçbükey kürek",
"upgrades.concave_puck.tooltip": "Dikey nişan alma hassasiyetini artırır",
"upgrades.concave_puck.verbose_description": "Toplar düz bir şekilde yukarı doğru çıkarak başlar ve daha az açıyla zıplar.",
"upgrades.corner_shot.name": "Köşe vuruşu",
"upgrades.corner_shot.tooltip": "Küreğinizin ekranın sınırlarıyla örtüşmesini sağlar",
"upgrades.corner_shot.verbose_description": "Köşelerde nişan almaya yardımcı olur. Daha ileri seviyeler daha uzağa gitmenizi sağlar.",
"upgrades.etherealcoins.name": "Uzayda Madeni Paralar",
"upgrades.etherealcoins.tooltip": "Madeni paralar artık yer çekiminden etkilenmiyor",
"upgrades.etherealcoins.verbose_description": "Paralar birkaç kez zıpladıktan sonra bile hızlarını koruyacak ve artık yer çekiminden etkilenmeyecekler.",
"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.help_plural": "(Son) topunuz kaybolmak yerine ({{lvl}} kez) dipte sekecektir.",
"upgrades.extra_life.name": "Ekstra Hayat",
"upgrades.extra_life.tooltip": "Top, kaybedilmeden önce alt çizgide bir kez sekecektir.",
"upgrades.extra_life.verbose_description": "Normalde bir topunuz vardır ve oyun onu bıraktığınız anda biter.\n\nBu yetenek, ekranın altına bir kez topu kurtaracak ve bu süreçte kırılacak beyaz bir çubuk ekler. \n\nEkranın altında bir top her zıpladığında bu yeteneğin bir seviyesini kaybedersiniz.",
"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...",
"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.verbose_description": "Bir jetonu kaçırdığınızda ve kombonuz {{max}}altındaysa, kombonuzun bir artma olasılığı {{lvl}}/ kombodur.",
"upgrades.ghost_coins.name": "Hayalet paralar",
"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.helium.name": "Helyum",
"upgrades.helium.tooltip": "Yerçekimi küreğin solunda ve sağında tersine döndü",
"upgrades.helium.verbose_description": "Bu, paraları etkileyecek ve siz onları almaya hazır olana kadar paraların havada asılı kalmasına neden olacaktır.",
"upgrades.hot_start.name": "Sıcak başlangıç",
"upgrades.hot_start.tooltip": " {{start}}kombosundan başla, saniyede{{loss}} kombo",
"upgrades.hot_start.verbose_description": "Her seviyenin başında kombonuz +30 puanla başlayacak, ancak daha sonra her saniye bir puan düşecek. Etki diğer avantajlarla birikiyor.",
"upgrades.hypnosis.name": "Hipnoz",
"upgrades.hypnosis.tooltip": "Bir tuğlanın rengi değiştiğinde, o parayı en yakın topa ışınlayın ve tuğlayı lekeleme yeteneğini yeniden yükleyin.",
"upgrades.hypnosis.verbose_description": "",
"upgrades.implosions.name": "İç patlamalar",
"upgrades.implosions.tooltip": "Patlamalar paraları dışarı atmak yerine içeri çekiyor",
"upgrades.implosions.verbose_description": "Patlama kuvveti diğer şekilde uygulanır. Daha ileri seviyeler \"daha büyük patlama\" olarak işlev görür.",
"upgrades.instant_upgrade.name": "Anında yükseltme",
"upgrades.instant_upgrade.tooltip": "Şimdi +2 yükseltme, oyun sonuna kadar -1 seçim.",
"upgrades.instant_upgrade.verbose_description": "Hemen iki yükseltme seçin, böylece birini ücretsiz, diğerini de bu avantajı elde etmek için kullanılanı geri ödeyin. Yükseltmeleri seçmek için her sonraki menüde seçebileceğiniz daha az seçenek olacak.",
"upgrades.left_is_lava.name": "Sol taraftan kaçının",
"upgrades.left_is_lava.tooltip": "+ Kırılan tuğla başına{{lvl}} kombo. Top ekranın sol tarafına çarparsa kombo sıfırlanır",
"upgrades.left_is_lava.verbose_description": "Bir tuğlayı kırdığınızda, kombonuz bir artacak, böylece kırdığınız sonraki tüm tuğlalardan bir jeton daha alacaksınız.\n\nAncak, kombonuz topunuz sol tarafa çarptığı anda sıfırlanacaktır. \n\nKombonuz yükseldiği anda, sol taraf kırmızıya dönerek onlara çarpmamanız gerektiğini hatırlatır.\n",
"upgrades.limitless.name": "Sınırsız",
"upgrades.limitless.tooltip": "Tüm yükseltmelerin maksimum seviyesini {{lvl}} kadar artırın",
"upgrades.limitless.verbose_description": "Bu yeteneği seçmek, onun kendi sınırını da bir arttırır ve tekrar seçmenize olanak tanır.",
"upgrades.metamorphosis.name": "Başkalaşım",
"upgrades.metamorphosis.tooltip": "Her madeni para, {{lvl}} tuğlayı kendi rengiyle lekeleyebilir",
"upgrades.metamorphosis.verbose_description": "Bu yetenekle, madeni paralar geldikleri tuğlanın renginde olacak ve dokundukları ilk tuğlayı aynı renge boyayacak. Madeni paralar onları kıran topun hızıyla ortaya çıkar, bu da \"boyamak\" istediğiniz tuğlalara doğru biraz nişan alabileceğiniz anlamına gelir. 1. seviyede, her madeni para \"harcanmadan\" ve içi boş görünmeden önce 1 tuğlayı boyayabilir.",
"upgrades.minefield.name": "Mayın tarlası",
"upgrades.minefield.tooltip": "Ekrandaki bomba tuğlası başına +{{lvl}} kombo",
"upgrades.minefield.verbose_description": "Bir tuğla yerleştirildiğinde komboya +lvl ekler, tuğla yok edildiğinde -lvl ekler ve temel komboyu tuğla sayısıyla lvl çarpımı kadar yükseltir",
"upgrades.multiball.name": "Çoklu top",
"upgrades.multiball.tooltip": "Her seviyeye {{count}} topla başlayın.",
"upgrades.multiball.verbose_description": "Breakout 71'de topu düşürdüğünüz anda kaybedersiniz. \n\nBu avantajla iki top elde edersiniz ve bu yüzden birini kaybetmeyi göze alabilirsiniz. \n\nKaybedilen toplar bir sonraki seviyede geri gelir. \n\nBirden fazla topa sahip olmak bazı ek avantajları kullanılabilir hale getirir ve tabii ki seviyeyi daha hızlı temizler.",
"upgrades.nbricks.name": "Sıkı örneklem büyüklüğü",
"upgrades.nbricks.tooltip": "Kürek sıçraması başına tam olarak {{lvl}} tuğla vurun +{{lvl}} kombo için, aksi takdirde sıfırlanır",
"upgrades.nbricks.verbose_description": "Bu tuğlaları yok etmeniz gerekmiyor ancak onlara vurmanız gerekiyor. Patlamalarla yok edilen tuğlalar sayılmaz",
"upgrades.one_more_choice.name": "Ekstra seçenek",
"upgrades.one_more_choice.tooltip": "Daha fazla seviye atlama, listede {{lvl}} daha fazla seçenek sunacak",
"upgrades.one_more_choice.verbose_description": "Her yükseltme menüsü bir seçeneğe daha sahip olacak. Seçebileceğiniz yükseltme sayısını artırmaz.",
"upgrades.passive_income.name": "Pasif gelir",
"upgrades.passive_income.tooltip": "+{{lvl}} kombo / tuğla, kürek son {{time}}saniyede hareket etmediği sürece, bunun yerine sıfırlanır",
"upgrades.passive_income.verbose_description": "Bazı özellikler, topların hiçbir şey yapmanıza gerek kalmadan istediğinizi yapmasına yardımcı olabilir.",
"upgrades.picky_eater.name": "Seçici yiyen",
"upgrades.picky_eater.tooltip": "+{{lvl}} kombo her tuğla kırıldığında, top rengi değiştiğinde sıfırlanır",
"upgrades.picky_eater.verbose_description": "Topunuzla aynı renkte bir tuğlayı kırdığınızda, kombonuz bir artar. \nEğer farklı bir renkteyse, top yeni rengi alır, ancak kombo sıfırlanır, tabii topun renginde tuğla kalmamışsa. \nMinimumunuzdan daha yüksek bir kombo elde ettiğinizde, yanlış renkteki tuğlalar kırmızı bir kenarlık alır. \nBirden fazla topunuz varsa, bunlardan biri bir tuğlaya çarptığında hepsi renk değiştirir.",
"upgrades.pierce.name": "Delme",
"upgrades.pierce.tooltip": "Kürek zıplamasından sonra top {{count}} tuğlayı deldi",
"upgrades.pierce.verbose_description": "Top normalde bir şeye dokunduğu anda zıplar. Bu avantajla, 3 tuğla kırılıncaya kadar yörüngesine devam eder. \n\nBundan sonra, 4. tuğlada zıplar ve sayacı sıfırlamak için küreğe dokunmanız gerekir.",
"upgrades.pierce_color.name": "Renk delme",
"upgrades.pierce_color.tooltip": "+{{lvl}} topun rengindeki tuğlalara hasar",
"upgrades.pierce_color.verbose_description": "Bir top aynı renkteki bir tuğlaya çarptığında, engellenmeden geçecektir. \n\nFarklı renkteki bir tuğlaya ulaştığında, onu kıracak, rengini alacak ve sekecektir.\n\nSağlam tuğlalarınız varsa, top yine de aynı renkteki bir tuğladan sekebilir.",
"upgrades.puck_repulse_ball.help_plural": "Daha güçlü itme kuvveti",
"upgrades.puck_repulse_ball.name": "Yumuşak iniş",
"upgrades.puck_repulse_ball.tooltip": "Kürek topları iter",
"upgrades.puck_repulse_ball.verbose_description": "Bir top küreğe yaklaştığında yavaşlamaya başlayacak ve hatta küreğe değmeden bile zıplamaya başlayacaktır.",
"upgrades.rainbow.name": "Gökkuşağı",
"upgrades.rainbow.tooltip": "Paralar gökkuşağı renklerinde ortaya çıkar.",
"upgrades.rainbow.verbose_description": "Her seviye renkli jetonların oranını artırır. Renk seviye zamanına bağlıdır.",
"upgrades.reach.name": "Yukarıdan aşağıya",
"upgrades.reach.tooltip": "En alt sıradaki N tuğlasına dokunmak komboyu sıfırlar. Aksi takdirde, +N kombo",
"upgrades.reach.verbose_description": "Eğer sadece bir sıra tuğla varsa veya en alttaki tuğla sırası oyunun tüm genişliğini kaplıyorsa, bu avantaj hiçbir işe yaramaz. Aksi takdirde, bu en alttaki sırayı kırmak komboyu sıfırlarken, başka bir şeyi kırmak komboyu o en alttaki sırada bulunan tuğla sayısı kadar artırır. \n\nEn alttaki sıra kırmızıyla vurgulanacaktır.",
"upgrades.respawn.name": "Yeniden canlanma",
"upgrades.respawn.tooltip": " {{delay}}saniye sonra tuğlaların %{{percent}}'ı yeniden ortaya çıkar.",
"upgrades.respawn.verbose_description": "Bazı parçacık efektleri tuğlaların nerede belireceğini size bildirecektir.",
"upgrades.right_is_lava.name": "Sağ taraftan kaçının",
"upgrades.right_is_lava.tooltip": "Tuğla başına +{{lvl}} kombo. Top ekranın sağ tarafına çarparsa kombo sıfırlanır",
"upgrades.right_is_lava.verbose_description": "Bir tuğlayı kırdığınızda, kombonuz bir artacak, böylece kırdığınız sonraki tüm tuğlalardan bir jeton daha alacaksınız.\n\nAncak, topunuz sağ tarafa çarptığı anda kombonuz sıfırlanacaktır.\n\nKombonuz yükseldiği anda, onlara çarpmaktan kaçınmanız gerektiğini hatırlatmak için sağ taraf kırmızı olur.",
"upgrades.sacrifice.help_l1": "Bir canı kaybetmek tüm tuğlaları temizler",
"upgrades.sacrifice.help_over": "Komboya {{lvl}}can eklendiğinde tüm tuğlalar temizlenir",
"upgrades.sacrifice.name": "Kurban etmek",
"upgrades.sacrifice.verbose_description": "Bu, komboyu oldukça yükseğe çıkarabilir.",
"upgrades.sapper.help_plural": "İlk kırılan {{lvl}} tuğla bombaya dönüşür.",
"upgrades.sapper.name": "Kazmacı",
"upgrades.sapper.tooltip": "İlk kırılan tuğla bombaya dönüşür.",
"upgrades.sapper.verbose_description": "Sadece ortadan kaybolmak yerine, kırdığınız ilk tuğla bir bomba tuğlasıyla değiştirilecektir. Kürek üzerinde topu sektirmek, efekti yeniden etkinleştirir. Bu yeteneği seviyelendirmek, daha fazla bomba yerleştirmenize olanak tanır.",
"upgrades.shocks.name": "Şoklar",
"upgrades.shocks.tooltip": "Patlayıcı top çarpışmaları",
"upgrades.shocks.verbose_description": "İki top çarpıştığında hızları değişir, bir patlama meydana gelir ve onları ayırmak için ek hız kazanırlar.",
"upgrades.shunt.name": "Şant",
"upgrades.shunt.tooltip": "Kombonuzun {{percent}}%'sini seviyeler arasında tutun",
"upgrades.shunt.verbose_description": "Eğer sıcak başlatma özelliğiniz de varsa, sıcak başlatma özelliği mevcut kombinasyona eklenir",
"upgrades.side_flip.name": "Sağ elini kullanan",
"upgrades.side_flip.tooltip": "Sağdan kırılan tuğla başına +{{lvl}} kombo, aksi takdirde -{{loss}} ",
"upgrades.side_flip.verbose_description": "Bir kombo kazanmak için tuğlanın sağ tarafına vurun, ancak sol tarafına vurmaktan kaçının çünkü bu 2 komboyu kaldırır. Üstten ve alttan vurmanın bir etkisi yoktur.",
"upgrades.side_kick.name": "Solak",
"upgrades.side_kick.tooltip": "Soldan kırılan tuğla başına +{{lvl}} kombo, aksi takdirde -{{loss}} ",
"upgrades.side_kick.verbose_description": "Tuğlanın sol tarafına vurarak bir kombo elde edin, ancak sağ tarafına vurmaktan kaçının çünkü bu 2 komboyu kaldırır. Üstten ve alttan vurmanın bir etkisi yoktur.",
"upgrades.skip_last.help_plural": "Son {{lvl}} tuğla patlayacak.",
"upgrades.skip_last.name": "Kolay Temizlik",
"upgrades.skip_last.tooltip": "Son tuğla patlayacak.",
"upgrades.skip_last.verbose_description": "Bir sonraki seviyeye geçmek için tüm tuğlaları kırmanız gerekir. Ancak son tuğlaları elde etmek zor olabilir. \n\nBir seviyeyi erken bitirmek, yükseltme sırasında ekstra seçenekler sunar. Tuğlaları asla kaçırmamak da çok faydalıdır. \n\nYani son tuğlaları kırmakta zorlanıyorsanız, bu yeteneği birkaç kez elde etmek yardımcı olabilir.",
"upgrades.slow_down.name": "Daha yavaş top",
"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.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.tooltip": "Ayrıca +5 temel kombo verir",
"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.soft_reset.name": "Yumuşak sıfırlama",
"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.streak_shots.name": "Vuruş serisi",
"upgrades.streak_shots.tooltip": "Kürek çekmeden önce çok sayıda tuğla kırarsanız daha fazla para kazanırsınız.",
"upgrades.streak_shots.verbose_description": "Her tuğlayı kırdığınızda, kombonuz bir artar. \n\nAncak, top küreğinize değdiği anda kombo varsayılan değerine sıfırlanır.\n\nKombonuz temel değerin üzerine çıktığında, küreğinizin topla dokunduğunuzda kombonuzu yok edeceğini size hatırlatmak için kırmızı bir kenarı olacaktır.",
"upgrades.sturdy_bricks.name": "Sağlam tuğlalar",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} tuğla HP, kırıldığında ortaya çıkan +{{percent}}% para",
"upgrades.sturdy_bricks.verbose_description": "Bu yeteneğin her seviyesi tüm tuğlalara bir HP ekler. HP sayısını \"clairvoyant\" yeteneğiyle görebilirsiniz. \"Piercing\" yeteneğini alarak top hasarını artırabilirsiniz. Yeteneğin her seviyesi +50% jeton spawn'ı ekler.",
"upgrades.superhot.name": "SÜPER SICAK",
"upgrades.superhot.tooltip": "Kürek hareket ettikçe zaman da hareket eder.",
"upgrades.superhot.verbose_description": "SÜPER SICAK SÜPER SICAK SÜPER SICAK SÜPER SICAK",
"upgrades.telekinesis.help_plural": "Top üzerinde daha güçlü etki",
"upgrades.telekinesis.name": "Telekinezi",
"upgrades.telekinesis.tooltip": "Kürek topun yörüngesini kontrol eder",
"upgrades.telekinesis.verbose_description": "Top yukarı doğru giderken onu kontrol ediyorsun.",
"upgrades.top_is_lava.name": "Sınır gökyüzüdür",
"upgrades.top_is_lava.tooltip": "Tuğla başına +{{lvl}} kombo, tepeye vurulduğunda sıfırlanır",
"upgrades.top_is_lava.verbose_description": "Bir tuğlayı kırdığınızda, kombonuz bir artar. Ancak, topunuz ekranın tepesine çarptığı anda kombonuz sıfırlanır. \n\nKombonuz minimumun üzerinde olduğunda, ona çarpmamanız gerektiğini hatırlatmak için üstte kırmızı bir çubuk belirir.",
"upgrades.trampoline.name": "Trambolin",
"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.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.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.tooltip": "Paralar ekranın üst kısmında görünür.",
"upgrades.trickledown.verbose_description": "Kenara biraz para ayırmanıza yardımcı olabilir.",
"upgrades.unbounded.name": "Dolgu",
"upgrades.unbounded.tooltip": "Seviyenin sağına ve soluna boşluk ekler, ancak küreğiniz o kadar uzağa gidemez.",
"upgrades.unbounded.verbose_description": "Bir diğer geliştirme ise küreğinizin erişim mesafesini uzatmanıza yardımcı olabilir.",
"upgrades.viscosity.name": "Viskozite",
"upgrades.viscosity.tooltip": "Daha yavaş para düşüşü",
"upgrades.viscosity.verbose_description": "Madeni paralar normalde yer çekimi ve patlamalarla oldukça yüksek hızlara ulaşır. \n\nBu yetenek, sanki bir tür viskoz sıvının içindeymiş gibi sürekli olarak yavaşlamalarını sağlar. \n\nBu, onları yakalamayı kolaylaştırır ve madeni paranın hareketini etkileyen yeteneklerle güzel bir şekilde birleşir.",
"upgrades.wind.help_plural": "Daha güçlü rüzgar kuvveti",
"upgrades.wind.name": "Rüzgâr",
"upgrades.wind.tooltip": "Kürek pozisyonu rüzgar yaratır",
"upgrades.wind.verbose_description": "Rüzgar küreğin pozisyonuna bağlıdır: sol sola eser, sağ sağa eser. Hem topları hem de paraları etkiler.",
"upgrades.yoyo.name": "Yo-yo",
"upgrades.yoyo.tooltip": "Top küreğe doğru düşer",
"upgrades.yoyo.verbose_description": "Telekinezinin tam tersi, topun aşağı düşerken kontrol edilmesi.",
"upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "Tuğla başına +{{lvl}} kombo, patlama olduğunda sıfırlanır",
"upgrades.zen.verbose_description": "Sonuçta bu şiddet içermeyen bir oyun."
}

336
src/i18n/ur.json Normal file
View file

@ -0,0 +1,336 @@
{
"confirmRestart.no": "منسوخ کریں۔",
"confirmRestart.text": "آپ ایک نیا گیم شروع کرنے والے ہیں۔ کیا آپ واقعی جاری رکھنا چاہتے ہیں؟",
"confirmRestart.title": "ایک نیا گیم شروع کریں؟",
"confirmRestart.yes": "گیم دوبارہ شروع کریں۔",
"gameOver.creative": "یہ رن ریکارڈ نہیں کیا جائے گا۔ ",
"gameOver.cumulative_total": "آپ کا کل مجموعی سکور {{startTs}} سے {{endTs}}ہو گیا۔",
"gameOver.lost.summary": "آپ نے {{score}} سکے پکڑنے کے بعد گیند کو گرا دیا۔",
"gameOver.lost.title": "کھیل ختم",
"gameOver.stats.balls_lost": "گیندیں ہار گئیں۔",
"gameOver.stats.bricks_broken": "اینٹیں ٹوٹ گئیں۔",
"gameOver.stats.bricks_per_minute": "فی منٹ ٹوٹی ہوئی اینٹ",
"gameOver.stats.catch_rate": "کیچ ریٹ",
"gameOver.stats.combo_avg": "اوسط کمبو",
"gameOver.stats.combo_max": "زیادہ سے زیادہ کومبو",
"gameOver.stats.duration_per_level": "فی لیول دورانیہ",
"gameOver.stats.hit_rate": "ہٹ ریٹ",
"gameOver.stats.intro": "اپنے {{count}} بہترین گیمز کے مقابلے اپنے گیم کے اعدادوشمار نیچے تلاش کریں۔",
"gameOver.stats.level_reached": "سطح تک پہنچ گئی۔",
"gameOver.stats.total_score": "کل سکور",
"gameOver.stats.upgrades_applied": "اپ گریڈز لاگو ہو گئے۔",
"gameOver.unlocked_perk": "اپ گریڈ غیر مقفل ہے۔",
"gameOver.unlocked_perk_plural": "آپ نے ابھی ابھی {{count}} فوائد کو غیر مقفل کیا ہے۔",
"gameOver.win.summary": "یہ کھیل ختم ہو گیا ہے۔ آپ نے {{score}} سکے چھپائے۔ ",
"gameOver.win.title": "آپ نے یہ گیم مکمل کر لی",
"history.columns.score": "سکور",
"history.columns.started": "تاریخ",
"history.help": "اپنے {{count}} بہترین گیمز دیکھیں۔",
"history.locked": "انلاک کرنے کے لیے کم از کم دس گیمز کھیلیں",
"history.title": "تاریخ چلاتا ہے۔",
"lab.help": "آپ چاہتے ہیں کسی بھی تعمیر کی کوشش کریں",
"lab.instructions": "ذیل میں اپ گریڈز کو منتخب کریں، پھر کھیلنے کے لیے ایک سطح منتخب کریں۔ ",
"lab.menu_entry": "تخلیقی موڈ",
"lab.reset": "سب کو 0 پر ری سیٹ کریں۔",
"lab.select_level": "کھیلنے کے لیے ایک سطح منتخب کریں۔",
"lab.unlocks_at": "کل سکور {{score}}پر کھولتا ہے ",
"level_up.after_buttons": "آپ نے ابھی لیول {{level}}/{{max}}مکمل کیا ہے۔",
"level_up.before_buttons": "آپ نے {{levelSpawnedCoins}} میں سے {{score}} سکے {{catchGain}} {{time}} سیکنڈز {{timeGain}}میں پکڑے۔\n\nآپ نے {{levelMisses}} بار {{missesGain}} یاد کیا اور دیواروں یا چھت سے {{levelWallBounces}} بار{{wallHitsGain}}ٹکرایا۔\n\n{{compliment}}",
"level_up.compliment_advice": "تمام سکے پکڑنے کی کوشش کریں، اینٹوں کو کبھی نہ چھوڑیں، کبھی بھی دیواروں/چھت سے نہ ٹکرائیں یا اضافی اپ گریڈ حاصل کرنے کے لیے 30 سے ​​کم کی سطح کو صاف کریں۔",
"level_up.compliment_good": "شاباش!",
"level_up.compliment_perfect": "متاثر کن، اسے جاری رکھیں!",
"level_up.pick_upgrade_title": "ایک اپ گریڈ چنیں۔",
"level_up.plus_one_upgrade": "(+1 اپ گریڈ)",
"level_up.plus_one_upgrade_and_reroll": "(+1 اپ گریڈ اور +1 ری رول)",
"level_up.reroll": "دوبارہ رول کریں ({{count}})",
"level_up.reroll_help": "نئے انتخاب پیش کریں۔",
"level_up.upgrade_perk_to_level": " ایل وی ایل {{level}}",
"main_menu.basic": "بنیادی گرافکس",
"main_menu.basic_help": "بہتر کارکردگی۔",
"main_menu.colorful_coins": "رنگین سکے ۔",
"main_menu.colorful_coins_help": "سکے ہمیشہ اینٹوں کے رنگ کے ہوتے ہیں۔",
"main_menu.comboIncreaseTexts": "+X کو سونے میں دکھائیں۔",
"main_menu.comboIncreaseTexts_help": "جب طومار بڑھ جائے۔",
"main_menu.contrast": "ہائی کنٹراسٹ",
"main_menu.contrast_help": "زیادہ رنگین اور گہرا رینڈرنگ",
"main_menu.credit_levels": "سطحیں",
"main_menu.donate": "آپ نے {{hours}} گھنٹے کھیلے ہیں۔",
"main_menu.donate_help": "عطیہ کرنے کے بارے میں کیا خیال ہے؟ آپ اس یاد دہانی کو ترتیبات میں چھپا سکتے ہیں۔ ",
"main_menu.donation_reminder": "مجھے عطیہ کرنے کی یاد دلائیں۔",
"main_menu.donation_reminder_help": "مین مینو میں وقت اور عطیہ کا لنک دیکھیں",
"main_menu.download_save_file": "اسکور اور اعدادوشمار ڈاؤن لوڈ کریں۔",
"main_menu.download_save_file_help": "ایک محفوظ فائل حاصل کریں۔",
"main_menu.extra_bright": "اضافی روشن",
"main_menu.extra_bright_help": "سککوں اور اینٹوں کے گرد ہالہ کا سائز بڑھاتا ہے۔",
"main_menu.fullscreen": "پوری اسکرین",
"main_menu.fullscreen_help": "گیم شروع ہونے سے پہلے پوری اسکرین پر جانے کی کوشش کرے گی۔",
"main_menu.help_content": "## مقصد\n\n7 سطحوں کے دوران زیادہ سے زیادہ سکے پکڑیں۔ \nجب آپ اینٹیں توڑتے ہیں تو سکے ظاہر ہوتے ہیں۔\nاپنا سکور بڑھانے کے لیے انہیں اپنے پک کے ساتھ پکڑیں۔\nآپ کا سکور اسکرین کے اوپری دائیں کونے میں ظاہر ہوتا ہے۔\nگیند کو نہ گراؤ ورنہ کھیل ختم ہو گیا ہے۔\n\nتمام اینٹوں کو تباہ کرنے کے بعد، آپ کو اپ گریڈ کرنا پڑے گا۔\n\n## اپ گریڈ \n\nاپ گریڈ جو آپ چنتے ہیں وہ رن کے اختتام تک لاگو ہوں گے۔ \nکچھ کو مضبوط اثر کے لیے کئی بار اٹھایا جا سکتا ہے۔\nکچھ مقصد میں مدد کرتے ہیں، یا کچھ اور طریقوں سے گیم کو آسان بناتے ہیں۔ \nکچھ صرف اس وقت مفید ہیں جب آپس میں مل جائیں۔\n\nآپ کو ہر گیم کے شروع میں ہمیشہ ایک اپ گریڈ ملتا ہے۔ \nاس کا آئیکن پہلی سطح کی اینٹوں کا کام کرے گا۔ \nآپ سیٹنگز میں اپ گریڈ شروع کرنے کا انتخاب کر سکتے ہیں۔\n\nبہت سے اپ گریڈ آپ کے کومبو کو متاثر کرتے ہیں۔ \n\n## کومبو\n\nآپ کا \"کومبو\" اینٹ کے ٹوٹنے پر بننے والے سکوں کی تعداد ہے۔ \nیہ آپ کے پک پر ظاہر ہوتا ہے، مثال کے طور پر x4 کا مطلب ہے کہ ہر اینٹ 4 سکے پیدا کرے گی۔ \nزیادہ تر اپ گریڈ جو طومار کو بڑھاتے ہیں اسے دوبارہ ترتیب دینے کی شرط بھی شامل کرتے ہیں۔ \nاگر گیند بغیر کسی اینٹ کو مارے پک میں واپس آجاتی ہے تو کامبو بھی ری سیٹ ہو جائے گا۔\nایسا ہونے پر ایک \"مس\" پیغام دکھایا جائے گا۔ \n\nہر بار ایک اینٹ کی طرف نشانہ بنانے کی کوشش کریں۔ \n\n## مقصد\n\nصرف پک پر گیند کی پوزیشن ہی فیصلہ کرتی ہے کہ یہ کیسے اچھالے گی۔\nاگر گیند پک ڈیڈ سینٹر سے ٹکرا جاتی ہے، تو یہ عمودی طور پر اوپر کی طرف اچھال جائے گی۔ \nاگر آپ ایک طرف زیادہ مارتے ہیں تو اس کا زاویہ زیادہ ہوگا۔ \nپک کی رفتار اور آنے والے زاویہ کا اچھالنے کے بعد گیند کی سمت پر کوئی اثر نہیں ہوتا ہے۔\n\nبہت سے اپ گریڈ جو مقصد میں مدد کرتے ہیں ان کو غیر مقفل کیا جا سکتا ہے۔\n\n## کھولتا ہے۔\n\nپہلی بار بریک آؤٹ 71 کھیلتے وقت، زیادہ تر اپ گریڈ اور لیولز مقفل ہوتے ہیں۔ \nاپ گریڈ صرف کھیل کر اور بہت سے سکے پکڑ کر انلاک ہو جاتے ہیں۔ \nاعلی اسکور پر پہنچ کر پہلی سطحیں کھل جاتی ہیں۔\nبعد کی سطحیں ایک شرط شامل کرتی ہیں کہ آپ کون سے مراعات منتخب کر سکتے ہیں۔ \n\nجب آپ ہر سطح کے بعد متعدد اپ گریڈ حاصل کرتے ہیں تو اعلی اسکور تک پہنچنا بہت آسان ہوتا ہے۔ \n\n## دوبارہ رول اور مفت اپ گریڈ\n\nجب آپ اچھی طرح کھیلیں گے تو آپ کو چننے کے لیے ایک اضافی اپ گریڈ ملے گا: \n\n- {{levelTimeGood}} سیکنڈ کے نیچے کی سطح کو صاف کریں۔\n- اطراف یا اوپر کو {{wallBouncedGood}} سے کم بار ماریں۔\n- سکے کا {{catchRateGood}}% پکڑیں۔\n- اینٹوں کو {{missesGood}} سے کم بار چھوڑیں۔ \n\nآپ کو ایک ری رول بھی ملے گا جو آپ کو اپ گریڈز کو چھوڑنے دیتا ہے اگر آپ اور بھی بہتر کرتے ہیں: \n\n- {{levelTimeBest}} سیکنڈ سے کم کی سطح کو صاف کریں۔\n- اطراف یا اوپر کو {{wallBouncedBest}} سے کم بار ماریں۔\n- سکے کا {{catchRateBest}}% پکڑیں۔\n- اینٹوں کو {{missesBest}} سے کم بار چھوڑیں۔ \n\nترتیبات میں ایک آپشن آپ کو ان اعدادوشمار کو ظاہر کرنے دیتا ہے۔",
"main_menu.help_help": "گیم کے بارے میں مزید جانیں۔",
"main_menu.help_title": "مدد",
"main_menu.help_upgrades": "## اپ گریڈ",
"main_menu.high_score": "اعلی اسکور: {{score}}",
"main_menu.kid": "بچوں کا موڈ",
"main_menu.kid_help": "\"سست گیند\" کے ساتھ مستقبل کے کھیل شروع کریں۔",
"main_menu.language": "زبان",
"main_menu.language_help": "گیم کی زبان کا انتخاب کریں۔",
"main_menu.load_save_file": "محفوظ فائل لوڈ کریں۔",
"main_menu.load_save_file_help": "اپنے آلے پر محفوظ فائل منتخب کریں۔",
"main_menu.max_coins": " اسکرین پر زیادہ سے زیادہ {{max}} سکے",
"main_menu.max_coins_help": "صرف کاسمیٹک، سکور پر کوئی اثر نہیں",
"main_menu.max_particles": " {{max}} ذرات زیادہ سے زیادہ",
"main_menu.max_particles_help": "بصری اثر کے لیے اسکرین پر دکھائے جانے والے ذرات کی تعداد کو محدود کرتا ہے۔ ",
"main_menu.mobile": "موبائل موڈ",
"main_menu.mobile_help": "پک کے نیچے جگہ چھوڑتا ہے۔",
"main_menu.normal": "نیا گیم",
"main_menu.normal_help": "بے ترتیب شروع ہونے والے پرک کے ساتھ 7 لیول کھیلیں",
"main_menu.pointer_lock": "ماؤس پوائنٹر لاک",
"main_menu.pointer_lock_help": "ماؤس کرسر کو لاک اور چھپاتا ہے۔",
"main_menu.record": "گیم پلے ویڈیوز ریکارڈ کریں۔",
"main_menu.record_download": "ویڈیو ڈاؤن لوڈ کریں ({{size}} MB)",
"main_menu.record_help": "ہر سطح کی ویڈیو حاصل کریں۔",
"main_menu.red_miss": "مس وارننگ",
"main_menu.red_miss_help": "بغیر کسی ہٹ کے نیچے جانے والی گیندوں کے گرد سرخ ذرات دکھائیں۔",
"main_menu.reset": "گیم ری سیٹ کریں۔",
"main_menu.reset_cancel": "نہیں",
"main_menu.reset_confirm": "جی ہاں",
"main_menu.reset_help": "اعلی اسکور، کھیل کا وقت اور اعدادوشمار کو مٹا دیں۔",
"main_menu.reset_instruction": "آپ گیم میں کی گئی تمام پیشرفت کھو دیں گے، کیا آپ کو یقین ہے؟",
"main_menu.save_file_error": "محفوظ فائل لوڈ کرنے میں خرابی۔",
"main_menu.save_file_loaded": "لوڈ فائل کو محفوظ کریں۔",
"main_menu.save_file_loaded_help": "ایپ اب آپ کی بچت کو لاگو کرنے کے لیے دوبارہ لوڈ کرے گی۔",
"main_menu.save_file_loaded_ok": "ٹھیک ہے",
"main_menu.settings_help": "گیم پلے کو اپنی ضروریات اور ذائقہ کے مطابق بنائیں",
"main_menu.settings_title": "ترتیبات",
"main_menu.show_fps": "ایف پی ایس کاؤنٹر",
"main_menu.show_fps_help": "ایپ کی کارکردگی کی نگرانی کریں۔",
"main_menu.show_stats": "حقیقی وقت کے اعدادوشمار دکھائیں۔",
"main_menu.show_stats_help": "سکے، وقت، اچھال، یاد آتی ہے۔",
"main_menu.sounds": "گیم کی آوازیں۔",
"main_menu.sounds_help": "کچھ فون سست کر سکتے ہیں۔",
"main_menu.starting_perks": "مراعات شروع ہو رہی ہیں۔",
"main_menu.starting_perks_checked": "جب آپ کوئی نیا گیم شروع کرتے ہیں تو ان میں سے ایک پرکس آپ کو دیا جائے گا۔ اسے خارج کرنے کے لیے پرک پر کلک کریں۔ ",
"main_menu.starting_perks_full_random": "تمام فوائد کو ہٹا دیا گیا ہے، انتخاب بے ترتیب ہو جائے گا.",
"main_menu.starting_perks_help": "ممکنہ ابتدائی اپ گریڈز کا انتخاب کریں۔",
"main_menu.starting_perks_unchecked": "نیچے دیے گئے مراعات ابتدائی مراعات کے طور پر پیش نہیں کیے جاتے ہیں، لیکن آپ انہیں پول میں شامل کرنے کے لیے کلک کر سکتے ہیں۔ ",
"main_menu.title": "بریک آؤٹ 71",
"main_menu.unlocks": "غیر مقفل مواد",
"main_menu.unlocks_help": "فوائد اور لیولز آزمائیں جنہیں آپ نے غیر مقفل کیا ہے۔",
"play.close_modale_window_tooltip": "بند کریں",
"play.current_lvl": "سطح {{level}}/{{max}}",
"play.menu_label": "مینو",
"play.menu_tooltip": "مین مینو کھولیں۔",
"play.missed_ball": "مس",
"play.mobile_press_to_play": "کھیلنے کے لیے یہاں دبائیں اور تھامیں۔",
"play.score_tooltip": "اپنا سکور، اپ گریڈ اور مزید دیکھیں",
"play.stats.coins_catch_rate": "سکے کیچ ریٹ",
"play.stats.levelMisses": "یاد شدہ شاٹس، جہاں آپ نے کچھ نہیں مارا۔",
"play.stats.levelTime": "سطح کا وقت",
"play.stats.levelWallBounces": "دیوار اچھالتی ہے۔",
"score_panel.close_to_unlock": "اگلی سطح کو غیر مقفل کریں:",
"score_panel.get_upgrades_to_unlock": "لیول \"{{level}}\" کو غیر مقفل کرنے کے لیے {{missingUpgrades}} حاصل کریں اور {{points}} مزید پوائنٹس حاصل کریں",
"score_panel.rerolls_count": "آپ نے {{rerolls}} دوبارہ رولز جمع کیے ہیں۔",
"score_panel.score_to_unlock": "سطح \"{{level}}\" کو غیر مقفل کرنے کے لیے مزید {{points}} پوائنٹس اسکور کریں",
"score_panel.title": " سطح پر{{score}} پوائنٹس {{level}}/{{max}} ",
"score_panel.upcoming_levels": "آنے والی سطحیں:",
"score_panel.upgrades_picked": "اس گیم رن میں اٹھائے گئے اپ گریڈ: ",
"unlocks.greyed_out_help": "آپ کے کل سکور کو بڑھا کر گرے آؤٹ اپ گریڈ کو غیر مقفل کیا جا سکتا ہے۔ جب بھی آپ گیم میں اسکور کرتے ہیں تو کل اسکور بڑھ جاتا ہے۔",
"unlocks.intro": "آپ کا کل سکور {{ts}}ہے۔ ذیل میں گیمز کی پیشکش کردہ تمام اپ گریڈ اور لیولز ہیں۔ اس کے ساتھ ٹیسٹ گیم شروع کرنے کے لیے نیچے کسی اپ گریڈ یا لیول پر کلک کریں۔",
"unlocks.just_unlocked": "سطح غیر مقفل ہے۔",
"unlocks.just_unlocked_plural": "آپ نے ابھی {{count}} سطحوں کو غیر مقفل کیا ہے۔",
"unlocks.level": "<h2>آپ نے {{out_of}}</h2>\n<p>میں سے {{unlocked}} لیولز کو غیر مقفل کر دیا ہے، گیم کی تمام سطحیں یہ ہیں، اسے آزمانے کے لیے ایک پر کلک کریں۔</p> ",
"unlocks.level_description": " {{bricks}} اینٹوں، {{colors}} رنگوں اور {{bombs}} بموں کے ساتھ ایک {{size}}x{{size}} سطح۔",
"unlocks.minScore": "انلاک کرنے کے لیے ایک دوڑ میں ${{minScore}} تک پہنچیں۔",
"unlocks.minScoreWithPerks": " {{required}} کے ساتھ ایک دوڑ میں ${{minScore}} تک پہنچیں لیکن انلاک کرنے کے لیے {{forbidden}} کے بغیر۔",
"unlocks.minTotalScore": "کل جمع کریں ${{score}}",
"unlocks.reached": "آپ کا بہترین اسکور {{reached}}تھا۔",
"unlocks.title_upgrades": "آپ نے {{out_of}}میں سے {{unlocked}} اپ گریڈ کو غیر مقفل کیا ",
"upgrades.addiction.name": "نشہ",
"upgrades.addiction.tooltip": "+{{lvl}} کومبو / اینٹ، اینٹ توڑنے کے بعد کومبو ری سیٹ {{delay}}s۔ ",
"upgrades.addiction.verbose_description": "الٹی گنتی ہر سطح کی پہلی اینٹ توڑنے کے بعد ہی شروع ہوتی ہے۔ تمام اینٹوں کے تباہ ہوتے ہی یہ رک جاتا ہے۔",
"upgrades.asceticism.name": "سنیاسی",
"upgrades.asceticism.tooltip": "+{{combo}} کومبو / اینٹ، - {{combo}} سکے کیچ پر",
"upgrades.asceticism.verbose_description": "جب آپ کا کمبو چڑھتا ہے تو آپ کو سکے کو کہیں ذخیرہ کرنے کی ضرورت ہوگی۔ ",
"upgrades.ball_attract_ball.help_plural": "مضبوط کشش قوت",
"upgrades.ball_attract_ball.name": "کشش ثقل",
"upgrades.ball_attract_ball.tooltip": "گیندیں گیندوں کو اپنی طرف متوجہ کرتی ہیں۔",
"upgrades.ball_attract_ball.verbose_description": "گیندیں جو \"کھیل کے رقبے کی چوڑائی کے 3/4\" سے زیادہ دور ہیں ایک دوسرے کو اپنی طرف متوجہ کرنا شروع کر دیں گی۔ \n\nکشش قوت اس وقت مضبوط ہوتی ہے جب وہ ایک دوسرے سے سب سے زیادہ دور ہوتے ہیں۔\n\nقوس قزح کے ذرات کشش قوت کی علامت کے لیے اڑیں گے۔ یہ فائدہ صرف اس صورت میں پیش کیا جاتا ہے جب آپ کے پاس پہلے سے ایک سے زیادہ بال موجود ہوں۔",
"upgrades.ball_attracts_coins.name": "گیندیں سککوں کو اپنی طرف متوجہ کرتی ہیں۔",
"upgrades.ball_attracts_coins.tooltip": "سکے قریب ترین گیند کی پیروی کرتے ہیں اور آہستہ آہستہ گرتے ہیں۔",
"upgrades.ball_attracts_coins.verbose_description": "اگر آپ اسے \"داغ\" اور \"بھوت سکوں\" کے ساتھ جوڑتے ہیں تو اسے سککوں کے ساتھ گیندوں کو \"آس پاس پینٹ\" کرنے کے لیے استعمال کیا جا سکتا ہے۔ یہ سکے مقناطیس کے متبادل کے طور پر بھی کام کرتا ہے۔ ",
"upgrades.ball_repulse_ball.help_plural": "مضبوط ریپلیشن فورس",
"upgrades.ball_repulse_ball.name": "ذاتی جگہ",
"upgrades.ball_repulse_ball.tooltip": "گیندیں گیندوں کو پسپا کرتی ہیں۔",
"upgrades.ball_repulse_ball.verbose_description": "ایک چوتھائی اسکرین کی چوڑائی سے کم فاصلے پر گیندیں ایک دوسرے کو پیچھے ہٹانا شروع کر دیں گی۔ اگر وہ ایک دوسرے کے قریب ہوں تو پسپا قوت زیادہ مضبوط ہوتی ہے۔ اس قوت کو لاگو کرنے کی علامت کے طور پر ذرات باہر نکلیں گے۔ یہ فائدہ صرف اس صورت میں پیش کیا جاتا ہے جب آپ کے پاس پہلے سے ایک سے زیادہ بال موجود ہوں۔",
"upgrades.base_combo.name": "مضبوط بنیادیں۔",
"upgrades.base_combo.tooltip": "کومبو 1 کی بجائے {{coins}} سے شروع ہوتا ہے۔",
"upgrades.base_combo.verbose_description": "آپ کا کومبو عام طور پر لیول کے آغاز میں 1 سے شروع ہوتا ہے، اور جب آپ کسی بھی چیز کو مارے بغیر ادھر ادھر اچھالتے ہیں تو 1 پر دوبارہ سیٹ ہو جاتا ہے۔ اس پرک کے ساتھ، کومبو 3 پوائنٹس زیادہ شروع ہوتا ہے، لہذا آپ کو ہمیشہ کم از کم 4 سکے فی اینٹ ملیں گے۔ جب بھی آپ کا کومبو ری سیٹ ہوگا، یہ 1 پر نہیں بلکہ 4 پر واپس چلا جائے گا۔ آپ کی گیند اس بات کی نشاندہی کرنے کے لیے تھوڑا سا چمکے گی کہ اس کا کومبو ایک سے اونچا ہے۔",
"upgrades.bigger_explosions.name": "کبوم",
"upgrades.bigger_explosions.tooltip": "بڑے دھماکے",
"upgrades.bigger_explosions.verbose_description": "پہلے سے طے شدہ دھماکہ 3x3 مربع کو صاف کرتا ہے، اس کے ساتھ یہ 5x5 مربع بن جاتا ہے، اور سککوں پر لگنے والا دھچکا بھی نمایاں طور پر مضبوط ہوتا ہے۔ اسکرین ہر دھماکے کے بعد چمکے گی (بنیادی حالت کے علاوہ)",
"upgrades.bigger_puck.name": "بڑا پک",
"upgrades.bigger_puck.tooltip": "آسانی سے مزید سکے پکڑیں۔",
"upgrades.bigger_puck.verbose_description": "ایک بڑا پک کبھی بھی گیند کو نہ چھوڑنا اور زیادہ سکے پکڑنا آسان بناتا ہے، اور باؤنسز کو بالکل ٹھیک زاویہ دینا بھی آسان بناتا ہے (گیند کا زاویہ صرف اس بات پر منحصر ہوتا ہے کہ یہ پک سے کہاں ٹکراتی ہے)۔ \n\nتاہم، سطح کے اطراف میں ایک بڑا پک استعمال کرنا مشکل ہے، اور اسے کبھی کبھی یاد کرنا ناگزیر بنا دے گا۔",
"upgrades.clairvoyant.name": "دعویدار",
"upgrades.clairvoyant.tooltip": "آنے والی سطحیں، اینٹوں کی HP اور گیند کی سمت دیکھیں",
"upgrades.clairvoyant.verbose_description": "آپ کو صحیح اپ گریڈ لینے اور یہ سمجھنے میں مدد کرتا ہے کہ مضبوط اینٹوں کے ساتھ کیا ہو رہا ہے۔ لیول 2 اور 3 مشکوک افادیت کا اضافی علم لاتے ہیں (لوپ موڈ میں قابل رسائی)",
"upgrades.coin_magnet.help_plural": "سککوں پر مضبوط اثر",
"upgrades.coin_magnet.name": "سکے مقناطیس",
"upgrades.coin_magnet.tooltip": "پک سکے کو اپنی طرف متوجہ کرتا ہے۔",
"upgrades.coin_magnet.verbose_description": "سکے کو پک کی طرف لے جاتا ہے۔ اگر سکہ پہلے ہی اس کے قریب ہو تو اثر زیادہ مضبوط ہوتا ہے۔ تمام سکے پکڑنے سے گیم میں خصوصی بونس ملتے ہیں۔ \n\nمزید سکے پکڑنے کا دوسرا طریقہ نیچے سے اینٹوں کو مارنا ہے۔ گیند کی رفتار اور سمت پیدا ہونے والے سکے کی رفتار کو متاثر کرتی ہے۔ ",
"upgrades.compound_interest.name": "مرکب سود",
"upgrades.compound_interest.tooltip": "+{{lvl}} کومبو فی اینٹ ٹوٹا ہوا، کھوئے ہوئے سکے پر دوبارہ سیٹ ہو گیا۔",
"upgrades.compound_interest.verbose_description": "جب بھی آپ اینٹ توڑیں گے تو آپ کا کمبو ایک ایک کرکے بڑھے گا، اور آپ کی ہر اینٹ کے ساتھ زیادہ سے زیادہ سکے پیدا ہوں گے۔ \n\nتاہم ان سکوں میں سے ہر ایک کو اپنے پک سے پکڑنا یقینی بنائیں، کیونکہ کوئی بھی کھویا ہوا سکہ آپ کے کومبو کو دوبارہ ترتیب دے گا۔ \n\nایک بار جب آپ کا کمبو کم از کم سے اوپر ہو جائے گا، تو پلے ایریا کے نیچے ایک سرخ لکیر ہو گی جو آپ کو یاد دلائے گی کہ سکے وہاں نہیں جانے چاہئیں۔",
"upgrades.concave_puck.name": "مقعر پک",
"upgrades.concave_puck.tooltip": "عمودی ہدف کی درستگی کو بہتر بناتا ہے۔",
"upgrades.concave_puck.verbose_description": "گیندیں سطح کو سیدھی اوپر جانے سے شروع کرتی ہیں، اور کم زاویہ کے ساتھ اچھالتی ہیں۔",
"upgrades.corner_shot.name": "کارنر شاٹ",
"upgrades.corner_shot.tooltip": "آپ کے پک کو اسکرین کی سرحدوں کے ساتھ اوورلیپ کرنے دیتا ہے۔",
"upgrades.corner_shot.verbose_description": "کونوں میں نشانہ بنانے میں مدد کرتا ہے۔ مزید سطحیں آپ کو مزید باہر جانے دیتی ہیں۔ ",
"upgrades.etherealcoins.name": "سکے، خلا میں",
"upgrades.etherealcoins.tooltip": "سکے اب کشش ثقل سے متاثر نہیں ہوتے ہیں۔",
"upgrades.etherealcoins.verbose_description": "",
"upgrades.extra_levels.name": "5 منٹ مزید",
"upgrades.extra_levels.tooltip": "7 کی بجائے {{count}} لیولز کھیلیں",
"upgrades.extra_levels.verbose_description": "پہلے سے طے شدہ گیم زیادہ سے زیادہ 7 لیول تک چل سکتی ہے، جس کے بعد گیم ختم ہو جاتی ہے۔ \n\nاس پرک کا ہر لیول آپ کو ایک لیول اوپر جانے دیتا ہے۔ آخری درجے اکثر وہ ہوتے ہیں جہاں آپ سب سے زیادہ سکور کرتے ہیں، لہذا فرق ڈرامائی ہو سکتا ہے۔",
"upgrades.extra_life.help_plural": "آپ کی (آخری) گیند ضائع ہونے کے بجائے نیچے کی طرف اچھال جائے گی ({{lvl}} بار)۔",
"upgrades.extra_life.name": "اضافی زندگی",
"upgrades.extra_life.tooltip": "گیند کھو جانے سے پہلے نیچے کی لائن پر ایک بار اچھال دے گی۔",
"upgrades.extra_life.verbose_description": "عام طور پر، آپ کے پاس ایک گیند ہوتی ہے، اور جیسے ہی آپ اسے گراتے ہیں گیم ختم ہو جاتا ہے۔\n\nیہ فائدہ اسکرین کے نچلے حصے میں ایک سفید بار کا اضافہ کرتا ہے جو ایک بار گیند کو بچائے گا، اور عمل میں ٹوٹ جائے گا۔ \n\nجب بھی کوئی گیند اسکرین کے نیچے اچھالتی ہے تو آپ اس پرک کا ایک لیول کھو دیں گے۔",
"upgrades.forgiving.name": "بخشنے والا",
"upgrades.forgiving.tooltip": "غائب وقفے ایک ہی وقت میں سب کی بجائے بتدریج کمبو کو کم کرتے ہیں۔",
"upgrades.forgiving.verbose_description": "پہلی مس فی لیول مفت ہے، پھر 10% کومبو، پھر 20% .. ",
"upgrades.fountain_toss.name": "فاؤنٹین ٹاس",
"upgrades.fountain_toss.tooltip": "جب آپ کو کچھ سکے چھوٹ جاتے ہیں تو کچھ کمبو حاصل کریں۔ ",
"upgrades.fountain_toss.verbose_description": "جب آپ کو کوئی سکہ چھوٹ جاتا ہے اور آپ کا طومار {{max}}سے کم ہوتا ہے، تو آپ کے طومار میں {{lvl}}/combo کے ایک سے بڑھنے کا امکان ہوتا ہے۔",
"upgrades.ghost_coins.name": "گھوسٹ سکے",
"upgrades.ghost_coins.tooltip": "سکے آہستہ آہستہ اینٹوں سے گزرتے ہیں۔",
"upgrades.ghost_coins.verbose_description": "یہ کوئی بگ نہیں ہے، یہ ایک خصوصیت ہے! سکے آہستہ آہستہ اینٹوں کے ذریعے اڑتے ہیں۔ اعلی درجے انہیں تیزی سے آگے بڑھنے دیتے ہیں۔ ",
"upgrades.helium.name": "ہیلیم",
"upgrades.helium.tooltip": "کشش ثقل پک کے بائیں اور دائیں الٹ گئی۔",
"upgrades.helium.verbose_description": "اس سے سککوں پر اثر پڑتا ہے اور جب تک آپ انہیں لینے کے لیے تیار نہیں ہوتے تب تک اسے تیرنے دیتے ہیں۔",
"upgrades.hot_start.name": "گرم آغاز",
"upgrades.hot_start.tooltip": "کمبو {{start}}، -{{loss}} کومبو فی سیکنڈ سے شروع کریں۔",
"upgrades.hot_start.verbose_description": "ہر سطح کے آغاز پر، آپ کا کومبو +30 پوائنٹس سے شروع ہوگا، لیکن پھر ہر سیکنڈ میں اس میں ایک کی کمی ہوگی۔ اثر دیگر مراعات کے ساتھ جمع ہوتا ہے۔ ",
"upgrades.implosions.name": "دھماکے",
"upgrades.implosions.tooltip": "دھماکے سکوں کو اڑانے کے بجائے اندر سے چوستے ہیں۔",
"upgrades.implosions.verbose_description": "دھماکے کی قوت کو دوسری طرح سے لاگو کیا جاتا ہے۔ مزید سطحیں \"بڑے دھماکے\" کے طور پر کام کرتی ہیں",
"upgrades.instant_upgrade.name": "فوری اپ گریڈ",
"upgrades.instant_upgrade.tooltip": "+1 ابھی اپ گریڈ کریں، گیم ختم ہونے تک -1 انتخاب۔",
"upgrades.instant_upgrade.verbose_description": "فوری طور پر دو اپ گریڈ منتخب کریں، تاکہ آپ کو ایک مفت ملے اور دوسرا اس پرک کو واپس کرنے کے لیے۔ اپ گریڈ لینے کے لیے ہر مزید مینو میں انتخاب کرنے کے لیے کم اختیارات ہوں گے۔",
"upgrades.left_is_lava.name": "بائیں طرف سے گریز کریں۔",
"upgrades.left_is_lava.tooltip": "+{{lvl}} کومبو فی اینٹ ٹوٹی۔ اگر گیند اسکرین کے بائیں جانب سے ٹکراتی ہے تو کومبو ری سیٹ ہوجاتا ہے۔",
"upgrades.left_is_lava.verbose_description": "جب بھی آپ اینٹ توڑیں گے، آپ کا کمبو ایک سے بڑھ جائے گا، اس لیے آپ کو اگلی تمام اینٹوں سے ایک اور سکہ ملے گا۔\n\nتاہم، جیسے ہی آپ کی گیند بائیں جانب سے ٹکرائے گی آپ کا کومبو ری سیٹ ہو جائے گا۔ \n\nجیسے ہی آپ کا کمبو بڑھتا ہے، بائیں طرف سرخ ہو جاتا ہے تاکہ آپ کو یاد دلایا جائے کہ آپ کو ان کو مارنے سے گریز کرنا چاہیے۔ \n",
"upgrades.limitless.name": "لامحدود",
"upgrades.limitless.tooltip": "تمام اپ گریڈ کی زیادہ سے زیادہ سطح کو {{lvl}} تک بڑھائیں ",
"upgrades.limitless.verbose_description": "اس پرک کو منتخب کرنے سے اس کی اپنی حد بھی ایک سے بڑھ جاتی ہے، جس سے آپ اسے دوبارہ منتخب کر سکتے ہیں۔",
"upgrades.metamorphosis.name": "میٹامورفوسس",
"upgrades.metamorphosis.tooltip": "ہر سکہ اپنے رنگ سے {{lvl}} اینٹوں کو داغ سکتا ہے۔",
"upgrades.metamorphosis.verbose_description": "اس پرک کے ساتھ، سکے اس اینٹ کے رنگ کے ہوں گے جس سے وہ آئے ہیں، اور پہلی اینٹ کو اسی رنگ میں رنگ دیں گے۔ \n\nسکے گیند کی رفتار کے ساتھ پھیلتے ہیں جس نے انہیں توڑ دیا، جس کا مطلب ہے کہ آپ جس اینٹوں کو \"پینٹ\" کرنا چاہتے ہیں اس کی سمت تھوڑا سا نشانہ بنا سکتے ہیں۔",
"upgrades.minefield.name": "مائن فیلڈ",
"upgrades.minefield.tooltip": "+ اسکرین پر{{lvl}} کومبو فی بم اینٹ",
"upgrades.minefield.verbose_description": "اینٹ رکھنے پر طومار میں +lvl کا اضافہ کرتا ہے، -lvl جب یہ تباہ ہو جاتا ہے، اور بیس کومبو کو اینٹوں کے اوقات کی تعداد سے بڑھاتا ہے lvl",
"upgrades.multiball.name": "ملٹی گیند",
"upgrades.multiball.tooltip": "ہر سطح کو {{count}} گیندوں سے شروع کریں۔",
"upgrades.multiball.verbose_description": "جیسے ہی آپ بریک آؤٹ 71 میں گیند چھوڑتے ہیں، آپ ہار جاتے ہیں۔ \n\nاس پرک کے ساتھ، آپ کو دو گیندیں ملتی ہیں، اور اس لیے آپ ایک کو کھونے کے متحمل ہو سکتے ہیں۔ \n\nکھوئی ہوئی گیندیں اگلی سطح پر واپس آجاتی ہیں۔ \n\nایک سے زیادہ گیندیں رکھنے سے کچھ مزید فوائد دستیاب ہوتے ہیں، اور یقیناً سطح تیزی سے صاف ہو جاتی ہے۔",
"upgrades.nbricks.name": "سخت نمونہ سائز",
"upgrades.nbricks.tooltip": "+{{lvl}} کومبو کے لیے بالکل {{lvl}} اینٹوں فی پک باؤنس مارو، بصورت دیگر یہ ری سیٹ ہو جاتا ہے۔",
"upgrades.nbricks.verbose_description": "ضروری نہیں کہ آپ کو ان اینٹوں کو تباہ کرنے کی ضرورت ہے، لیکن آپ کو انہیں مارنے کی ضرورت ہے۔ دھماکوں سے تباہ ہونے والی اینٹوں کا شمار نہیں ہوتا",
"upgrades.one_more_choice.name": "اضافی انتخاب",
"upgrades.one_more_choice.tooltip": "مزید لیول اپس فہرست میں {{lvl}} مزید اختیارات پیش کریں گے۔",
"upgrades.one_more_choice.verbose_description": "ہر اپ گریڈ مینو میں ایک اور اختیار ہوگا۔ اپ گریڈ کی تعداد میں اضافہ نہیں کرتا جو آپ چن سکتے ہیں۔",
"upgrades.passive_income.name": "غیر فعال آمدنی",
"upgrades.passive_income.tooltip": "+{{lvl}} کومبو / اینٹ، جب تک کہ پک آخری {{time}}سیکنڈ میں منتقل نہ ہو، پھر اس کی بجائے دوبارہ سیٹ ہو جائے",
"upgrades.passive_income.verbose_description": "کچھ مراعات گیندوں کو کچھ کرنے کی ضرورت کے بغیر جو آپ چاہتے ہیں کرنے میں مدد کر سکتے ہیں۔",
"upgrades.picky_eater.name": "چننے والا کھانے والا",
"upgrades.picky_eater.tooltip": "+{{lvl}} کومبو فی اینٹ ٹوٹا ہوا، گیند کے رنگ کی تبدیلی پر ری سیٹ",
"upgrades.picky_eater.verbose_description": "جب بھی آپ اپنی گیند کے رنگ کی اینٹ کو توڑتے ہیں تو آپ کا کمبو ایک سے بڑھ جاتا ہے۔ \nاگر یہ ایک مختلف رنگ ہے، تو گیند وہ نیا رنگ لیتی ہے، لیکن کومبو دوبارہ سیٹ ہو جاتا ہے، جب تک کہ گیند کے رنگ کی کوئی اینٹ نہ بچ جائے۔ \nایک بار جب آپ کو کم سے کم سے زیادہ کامبو مل جاتا ہے، تو غلط رنگ کی اینٹوں کو سرخ بارڈر مل جائے گا۔ \nاگر آپ کے پاس ایک سے زیادہ گیند ہیں، تو جب بھی ان میں سے کوئی ایک اینٹ سے ٹکراتی ہے تو وہ سب رنگ بدل جاتے ہیں۔",
"upgrades.pierce.name": "چھیدنا",
"upgrades.pierce.tooltip": "گیند پک باؤنس کے بعد {{count}} اینٹوں کو چھیدتی ہے۔",
"upgrades.pierce.verbose_description": "گیند عام طور پر جیسے ہی کسی چیز کو چھوتی ہے اچھال جاتی ہے۔ اس پرک کے ساتھ، یہ ٹوٹی ہوئی 3 اینٹوں تک اپنی رفتار کو جاری رکھے گا۔ \n\nاس کے بعد، یہ چوتھی اینٹ پر اچھال دے گا، اور کاؤنٹر کو دوبارہ ترتیب دینے کے لیے آپ کو پک کو چھونے کی ضرورت ہوگی۔",
"upgrades.pierce_color.name": "رنگ چھیدنا",
"upgrades.pierce_color.tooltip": "+{{lvl}} گیند کے رنگ کی اینٹوں کو نقصان",
"upgrades.pierce_color.verbose_description": "جب بھی کوئی گیند ایک ہی رنگ کی اینٹ سے ٹکرائے گی تو وہ بغیر کسی رکاوٹ کے گزرے گی۔ \n\nایک بار جب یہ کسی دوسرے رنگ کی اینٹ تک پہنچ جائے گا، تو وہ اسے توڑ دے گا، اس کا رنگ لے گا اور اچھال دے گا۔\n\nاگر آپ کے پاس مضبوط اینٹیں ہیں تو گیند اب بھی ایک ہی رنگ کی اینٹ سے اچھال سکتی ہے۔",
"upgrades.puck_repulse_ball.help_plural": "مکروہ قوت زیادہ ہے۔",
"upgrades.puck_repulse_ball.name": "نرم لینڈنگ",
"upgrades.puck_repulse_ball.tooltip": "پک گیندوں کو پیچھے ہٹاتا ہے۔",
"upgrades.puck_repulse_ball.verbose_description": "جب ایک گیند پک کے قریب آتی ہے، تو یہ سست ہونا شروع ہو جاتی ہے، اور پک کو چھوئے بغیر بھی ممکنہ طور پر اچھالنا شروع کر دیتی ہے۔",
"upgrades.reach.name": "اوپر نیچے",
"upgrades.reach.tooltip": " سب سے نچلی قطار کی N اینٹوں کو چھونے سے کامبو ری سیٹ ہو جاتا ہے۔ بصورت دیگر، +N کومبو",
"upgrades.reach.verbose_description": "اگر اینٹوں کی صرف ایک قطار ہے، یا اگر اینٹوں کی سب سے کم قطار کھیل کی پوری چوڑائی کا احاطہ کرتی ہے، تو یہ فائدہ کچھ نہیں کرتا ہے۔ بصورت دیگر، اس سب سے نچلی قطار کو توڑنے سے کامبو ری سیٹ ہو جاتا ہے، جب کہ کسی اور چیز کو توڑنے سے کمبو کو اس نچلی قطار میں موجود اینٹوں کی تعداد سے بڑھ جاتا ہے۔ \n\nسب سے نچلی قطار کو سرخ رنگ میں نمایاں کیا جائے گا۔ ",
"upgrades.respawn.name": "دوبارہ اگانا",
"upgrades.respawn.tooltip": " اینٹوں کا{{percent}}% {{delay}}سیکنڈ کے بعد دوبارہ پیدا ہوتا ہے۔",
"upgrades.respawn.verbose_description": "کچھ ذرہ اثر آپ کو بتائے گا کہ اینٹیں کہاں ظاہر ہوں گی۔ ",
"upgrades.right_is_lava.name": "دائیں طرف سے بچیں۔",
"upgrades.right_is_lava.tooltip": "+{{lvl}} کومبو فی اینٹ۔ اگر گیند اسکرین کے بائیں جانب سے ٹکراتی ہے تو کومبو ری سیٹ ہوجاتا ہے۔",
"upgrades.right_is_lava.verbose_description": "جب بھی آپ اینٹ توڑیں گے، آپ کا کمبو ایک سے بڑھ جائے گا، اس لیے آپ کو اگلی تمام اینٹوں سے ایک اور سکہ ملے گا۔\n\nتاہم، جیسے ہی آپ کی گیند دائیں طرف سے ٹکرائے گی آپ کا کومبو ری سیٹ ہو جائے گا۔ \n\nجیسے ہی آپ کا کمبو بڑھتا ہے، دائیں طرف آپ کو یاد دلانے کے لیے سرخ ہو جاتا ہے کہ آپ کو انہیں مارنے سے گریز کرنا چاہیے۔\n",
"upgrades.sacrifice.help_l1": "زندگی کھو دینے سے تمام اینٹیں صاف ہو جاتی ہیں۔",
"upgrades.sacrifice.help_over": "زندگی کو کھونے سے {{lvl}}x کمبو تمام اینٹوں کو صاف کر دیتا ہے۔",
"upgrades.sacrifice.name": "قربانی",
"upgrades.sacrifice.verbose_description": "اس سے کامبو بہت زیادہ ہو سکتا ہے۔",
"upgrades.sapper.help_plural": "ٹوٹی ہوئی پہلی {{lvl}} اینٹیں بم بن جاتی ہیں۔",
"upgrades.sapper.name": "سیپر",
"upgrades.sapper.tooltip": "پہلی اینٹ جو ٹوٹتی ہے وہ بم بن جاتی ہے۔",
"upgrades.sapper.verbose_description": "صرف غائب ہونے کے بجائے، آپ جو پہلی اینٹ توڑیں گے اسے بم کی اینٹ سے بدل دیا جائے گا۔ پک پر گیند کو اچھالنا اثر کو دوبارہ بازو بناتا ہے۔ اس پرک کو برابر کرنا آپ کو مزید بم رکھنے کی اجازت دے گا۔\n\nیاد رکھیں کہ بم قریبی سکوں کی رفتار کو متاثر کرتے ہیں، اس لیے بہت زیادہ دھماکے آپ کی محنت کے پھل کو پکڑنا مشکل بنا سکتے ہیں۔",
"upgrades.shocks.name": "جھٹکے",
"upgrades.shocks.tooltip": "دھماکہ خیز گیندوں کے تصادم",
"upgrades.shocks.verbose_description": "جب بھی دو گیندیں آپس میں ٹکراتی ہیں، وہ اپنی رفتار کا تبادلہ کرتے ہیں، ایک دھماکہ کرتے ہیں، اور انہیں الگ کرنے کے لیے اضافی رفتار حاصل کرتے ہیں۔ ",
"upgrades.shunt.name": "شنٹ",
"upgrades.shunt.tooltip": "سطحوں کے درمیان اپنے طومار کا {{percent}}% رکھیں",
"upgrades.shunt.verbose_description": "اگر آپ کے پاس بھی ہاٹ سٹارٹ ہے تو ہاٹ سٹارٹ کو ابھی موجودہ کومبو میں شامل کیا گیا ہے۔",
"upgrades.side_flip.name": "دائیں ہاتھ",
"upgrades.side_flip.tooltip": "+{{lvl}} کومبو فی اینٹ دائیں سے ٹوٹی ہوئی، -{{loss}} دوسری صورت میں",
"upgrades.side_flip.verbose_description": "ایک طومار حاصل کرنے کے لیے اس کے دائیں طرف کی اینٹ کو متاثر کریں، لیکن اسے بائیں جانب مارنے سے گریز کریں کیونکہ یہ 2 کومبو کو ہٹا دے گا۔ اوپر اور نیچے سے مارنے کا کوئی اثر نہیں ہوتا۔ ",
"upgrades.side_kick.name": "بائیں ہاتھ",
"upgrades.side_kick.tooltip": "+{{lvl}} کومبو فی اینٹ بائیں سے ٹوٹی ہوئی، -{{loss}} دوسری صورت میں",
"upgrades.side_kick.verbose_description": "ایک طومار حاصل کرنے کے لیے اس کے بائیں جانب کی اینٹ کو متاثر کریں، لیکن اسے دائیں جانب مارنے سے گریز کریں کیونکہ یہ 2 کومبو کو ہٹا دے گا۔ اوپر اور نیچے سے مارنے کا کوئی اثر نہیں ہوتا۔ ",
"upgrades.skip_last.help_plural": "آخری {{lvl}} اینٹیں پھٹ جائیں گی۔",
"upgrades.skip_last.name": "آسان صفائی",
"upgrades.skip_last.tooltip": "آخری اینٹ پھٹ جائے گی۔",
"upgrades.skip_last.verbose_description": "اگلی سطح پر جانے کے لیے آپ کو تمام اینٹوں کو توڑنے کی ضرورت ہے۔ تاہم، آخری کو حاصل کرنا مشکل ہو سکتا ہے۔ \n\nسطح کو جلد صاف کرنے سے اپ گریڈ کرتے وقت اضافی انتخاب ہوتے ہیں۔ اینٹوں کو کبھی نہ چھوڑنا بھی بہت فائدہ مند ہے۔ \n\nاس لیے اگر آپ کو آخری اینٹوں کو توڑنا مشکل ہو، تو اس پرک کو کچھ وقت حاصل کرنے سے مدد مل سکتی ہے۔",
"upgrades.slow_down.name": "سست گیند",
"upgrades.slow_down.tooltip": "گیند زیادہ آہستہ حرکت کرتی ہے۔",
"upgrades.slow_down.verbose_description": "گیند نسبتاً سست شروع ہوتی ہے، لیکن آپ کے کھیل کے ہر سطح پر یہ قدرے تیزی سے شروع ہوگی۔ \n\nاگر آپ ایک سطح پر بہت زیادہ وقت گزارتے ہیں تو یہ بھی تیز ہو جائے گا۔ \n\nیہ فائدہ اسے زیادہ قابل انتظام بناتا ہے۔ \n\nمینو میں کڈ موڈ کو فعال کر کے آپ اسے ہر بار شروع میں حاصل کر سکتے ہیں۔",
"upgrades.smaller_puck.help_plural": "یہاں تک کہ چھوٹے پک اور اعلی بیس کومبو",
"upgrades.smaller_puck.name": "چھوٹا پک",
"upgrades.smaller_puck.tooltip": "+5 بیس کومبو بھی دیتا ہے۔",
"upgrades.smaller_puck.verbose_description": "یہ پک کو چھوٹا بناتا ہے، جو نظریہ طور پر کچھ کونے کے شاٹس کو آسان بناتا ہے، لیکن واقعی صرف مشکل کو بڑھاتا ہے۔\n\nاسی لیے آپ کو ان تمام اینٹوں کے لیے +5 سکے فی اینٹ کا اچھا بونس بھی ملتا ہے جو آپ اسے چننے کے بعد توڑیں گے۔ ",
"upgrades.soft_reset.name": "نرم ری سیٹ",
"upgrades.soft_reset.tooltip": "کومبو ری سیٹس {{percent}}% رکھتا ہے",
"upgrades.soft_reset.verbose_description": "کومبو ری سیٹ کے اثرات کو محدود کریں۔",
"upgrades.streak_shots.name": "ہٹ اسٹریک",
"upgrades.streak_shots.tooltip": "مزید سکے اگر آپ پک پر اچھالنے سے پہلے کئی اینٹیں توڑ دیتے ہیں۔",
"upgrades.streak_shots.verbose_description": "جب بھی آپ اینٹ توڑتے ہیں، آپ کا طومار (فی اینٹ کے سکوں کی تعداد) ایک بڑھ جاتا ہے۔ \n\nتاہم، جیسے ہی گیند آپ کے پک کو چھوتی ہے، کامبو اپنی ڈیفالٹ ویلیو پر ری سیٹ ہو جاتا ہے، اور آپ کو فی اینٹ صرف ایک سکہ ملے گا۔\n\nایک بار جب آپ کا طومار بنیادی قدر سے اوپر آجاتا ہے، تو آپ کا پک سرخ ہو جائے گا تاکہ آپ کو یاد دلائے کہ یہ گیند کے ساتھ چھونے کے لیے آپ کے کومبو کو تباہ کر دے گا۔",
"upgrades.sturdy_bricks.name": "مضبوط اینٹیں ۔",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} اینٹیں HP، +{{percent}}% سکے ٹوٹنے پر پیدا ہوئے۔",
"upgrades.sturdy_bricks.verbose_description": "اس پرک کی ہر سطح تمام اینٹوں میں ایک HP کا اضافہ کرتی ہے۔ آپ HP نمبر کو \"clairvoyant\" پرک کے ساتھ دیکھ سکتے ہیں۔ آپ \"چھیدنے\" پرک حاصل کرکے گیند کے نقصان کو بڑھا سکتے ہیں۔ پرک کی ہر سطح میں +50% سکے شامل ہوتے ہیں۔ ",
"upgrades.telekinesis.help_plural": "گیند پر مضبوط اثر",
"upgrades.telekinesis.name": "Telekinesis",
"upgrades.telekinesis.tooltip": "پک گیند کی رفتار کو کنٹرول کرتا ہے۔",
"upgrades.telekinesis.verbose_description": "آپ گیند کو کنٹرول کرتے ہیں جب یہ اوپر جاتا ہے۔ ",
"upgrades.top_is_lava.name": "آسمان کی حد ہے۔",
"upgrades.top_is_lava.tooltip": "+{{lvl}} کومبو فی اینٹ، جب ٹاپ ہٹ ہو تو دوبارہ ترتیب دیں۔",
"upgrades.top_is_lava.verbose_description": "جب بھی آپ ایک اینٹ توڑیں گے، آپ کا کمبو ایک سے بڑھ جائے گا۔ تاہم، جیسے ہی آپ کی گیند اسکرین کے اوپری حصے سے ٹکرائے گی آپ کا کومبو ری سیٹ ہو جائے گا۔ \n\nجب آپ کا کمبو کم از کم سے اوپر ہو گا، تو آپ کو یاد دلانے کے لیے ایک سرخ بار اوپر نمودار ہو گا کہ آپ کو اسے مارنے سے گریز کرنا چاہیے۔ ",
"upgrades.trampoline.name": "ٹرامپولین",
"upgrades.trampoline.tooltip": "+{{lvl}} کومبو فی پک باؤنس، -{{lvl}} کومبو فی باؤنس کسی بھی بارڈر پر",
"upgrades.trampoline.verbose_description": "ایک نایاب کومبو اپ گریڈ جس میں ری سیٹ کی شرط شامل نہیں ہوتی ہے۔",
"upgrades.trickledown.name": "رن آف",
"upgrades.trickledown.tooltip": "سکے اسکرین کے اوپری حصے میں ظاہر ہوتے ہیں۔",
"upgrades.trickledown.verbose_description": "اس سے آپ کو کچھ سکے ایک طرف رکھنے میں مدد مل سکتی ہے۔ ",
"upgrades.unbounded.help_no_ceiling": "+{{lvl}} کومبو فی اینٹ، مزید سائیڈز یا چھت نہیں۔",
"upgrades.unbounded.name": "بے حد",
"upgrades.unbounded.tooltip": "+{{lvl}} کومبو فی اینٹ، گیند کو کھیل میں رکھنے کے لیے مزید سائیڈز نہیں، خطرہ",
"upgrades.unbounded.verbose_description": "مجھے امید ہے کہ آپ کو اپنی گیند کو اسکرین پر رکھنے کا کوئی طریقہ مل گیا ہے۔ اطراف کو مارنے کے جرمانے اب لاگو نہیں ہوں گے۔ سطح 2+ پر، چھت بھی غائب ہو جائے گی۔ یہ ایک اعلی درجے کا فائدہ ہے۔ ",
"upgrades.viscosity.name": "Viscosity",
"upgrades.viscosity.tooltip": "سکوں کا سست گرنا",
"upgrades.viscosity.verbose_description": "سکے عام طور پر کشش ثقل اور دھماکوں کے ساتھ بہت تیز رفتاری سے تیز ہوتے ہیں۔ \n\nیہ فائدہ انہیں مسلسل سست بناتا ہے، جیسے کہ وہ کسی قسم کے چپچپا مائع میں ہوں۔ \n\nیہ انہیں پکڑنا آسان بناتا ہے، اور سکے کی حرکت کو متاثر کرنے والے فوائد کے ساتھ اچھی طرح سے جوڑتا ہے۔",
"upgrades.wind.help_plural": "مضبوط ہوا کی طاقت",
"upgrades.wind.name": "ہوا",
"upgrades.wind.tooltip": "پک پوزیشن ہوا پیدا کرتی ہے۔",
"upgrades.wind.verbose_description": "ہوا پک پوزیشن پر منحصر ہے: بائیں سے چل رہی ہے بائیں، دائیں چل رہی ہے دائیں. گیندوں اور سکے دونوں کو متاثر کرتا ہے۔",
"upgrades.yoyo.name": "یو یو",
"upgrades.yoyo.tooltip": "گیند پک کی طرف گرتی ہے۔",
"upgrades.yoyo.verbose_description": "یہ telekinesis کے برعکس ہے، گیند کو کنٹرول کریں جب وہ نیچے گر رہی ہو۔",
"upgrades.zen.name": "زین",
"upgrades.zen.tooltip": "+{{lvl}} کومبو فی اینٹ، دھماکہ ہونے پر دوبارہ ترتیب دیں۔",
"upgrades.zen.verbose_description": "آخر یہ ایک غیر متشدد کھیل ہے۔ "
}

336
src/i18n/uz.json Normal file
View file

@ -0,0 +1,336 @@
{
"confirmRestart.no": "Bekor qilish",
"confirmRestart.text": "Siz yangi o'yinni boshlamoqchisiz. Davom etishni xohlaysizmi?",
"confirmRestart.title": "Yangi oʻyin boshlansinmi?",
"confirmRestart.yes": "O'yinni qayta ishga tushiring",
"gameOver.creative": "Bu yugurish yozib olinmaydi. ",
"gameOver.cumulative_total": "Sizning jami jami ballingiz {{startTs}} dan {{endTs}}gacha boʻldi.",
"gameOver.lost.summary": "Siz {{score}} ta tanga ushlaganingizdan keyin topni tashladingiz.",
"gameOver.lost.title": "Oʻyin tugadi",
"gameOver.stats.balls_lost": "Yo'qotilgan to'plar",
"gameOver.stats.bricks_broken": "Buzilgan g'ishtlar",
"gameOver.stats.bricks_per_minute": "Bir daqiqada singan g'ishtlar",
"gameOver.stats.catch_rate": "Tutish tezligi",
"gameOver.stats.combo_avg": "O'rtacha kombinatsiya",
"gameOver.stats.combo_max": "Maksimal kombinatsiya",
"gameOver.stats.duration_per_level": "Har bir daraja uchun muddat",
"gameOver.stats.hit_rate": "Dars tezligi",
"gameOver.stats.intro": "Quyida {{count}} ta eng yaxshi oʻyinlaringiz bilan taqqoslangan oʻyin statistikasini toping.",
"gameOver.stats.level_reached": "Darajaga erishildi",
"gameOver.stats.total_score": "Umumiy ball",
"gameOver.stats.upgrades_applied": "Yangilanishlar qoʻllanildi",
"gameOver.unlocked_perk": "Yangilash qulfdan chiqarildi",
"gameOver.unlocked_perk_plural": "Siz hozirgina {{count}} ta imtiyozni ochdingiz",
"gameOver.win.summary": "Bu o'yin tugadi. Siz {{score}} ta tanga saqladingiz. ",
"gameOver.win.title": "Siz bu oʻyinni tugatdingiz",
"history.columns.score": "Xol",
"history.columns.started": "Sana",
"history.help": " {{count}} ta eng yaxshi oʻyinlaringizni koʻring.",
"history.locked": "Qulfni ochish uchun kamida o'nta o'yin o'ynang",
"history.title": "Tarixni ishga tushiradi",
"lab.help": "O'zingiz xohlagan har qanday qurilishni sinab ko'ring",
"lab.instructions": "Quyida yangilanishlarni tanlang, song oynash uchun darajani tanlang. ",
"lab.menu_entry": "Ijodiy rejim",
"lab.reset": "Hammasini 0 ga qaytaring",
"lab.select_level": "O'ynash uchun darajani tanlang",
"lab.unlocks_at": "Umumiy ball {{score}}boʻyicha ochiladi ",
"level_up.after_buttons": "Siz {{level}}/{{max}}-darajani tugatdingiz.",
"level_up.before_buttons": "Siz {{time}} soniyada {{timeGain}} {{levelSpawnedCoins}} ta tangadan {{score}} {{catchGain}} tasini ushladingiz.\n\nSiz {{levelMisses}} marta {{missesGain}} oʻtkazib yubordingiz va devor yoki shiftga {{levelWallBounces}} marta{{wallHitsGain}}urdingiz.\n\n{{compliment}}",
"level_up.compliment_advice": "Barcha tangalarni qo'lga kiritishga harakat qiling, g'ishtlarni hech qachon o'tkazib yubormang, hech qachon devorga/shipga tegmang yoki qo'shimcha yangilanishlarga ega bo'lish uchun 30 yoshdan past darajani tozalang.",
"level_up.compliment_good": "Juda qoyil !",
"level_up.compliment_perfect": "Ta'sirli, davom eting!",
"level_up.pick_upgrade_title": "Yangilashni tanlang",
"level_up.plus_one_upgrade": "(+1 ta yangilash)",
"level_up.plus_one_upgrade_and_reroll": "(+1 ta yangilash va +1 qayta tiklash)",
"level_up.reroll": "Qayta tiklash ({{count}})",
"level_up.reroll_help": "Yangi tanlovlarni taklif qiling",
"level_up.upgrade_perk_to_level": " lvl {{level}}",
"main_menu.basic": "Asosiy grafik",
"main_menu.basic_help": "Yaxshiroq ishlash.",
"main_menu.colorful_coins": "Rangli tangalar",
"main_menu.colorful_coins_help": "Tangalar har doim g'isht rangida paydo bo'ladi",
"main_menu.comboIncreaseTexts": "+X ni oltin rangda korsating",
"main_menu.comboIncreaseTexts_help": "Kombo ko'payganda",
"main_menu.contrast": "Yuqori kontrast",
"main_menu.contrast_help": "Ko'proq rangli va quyuq render",
"main_menu.credit_levels": "Darajalar",
"main_menu.donate": "Siz {{hours}} soat oʻynadingiz",
"main_menu.donate_help": "Xayriya qilish haqida nima deyish mumkin? Ushbu eslatmani sozlamalarda yashirishingiz mumkin. ",
"main_menu.donation_reminder": "Xayriya qilishni eslating",
"main_menu.donation_reminder_help": "Asosiy menyuda oʻynagan vaqt va xayriya havolasini koʻring",
"main_menu.download_save_file": "Hisob va statistikani yuklab oling",
"main_menu.download_save_file_help": "Saqlash faylini oling",
"main_menu.extra_bright": "Qo'shimcha yorqin",
"main_menu.extra_bright_help": "Tangalar va g'ishtlar atrofidagi halo hajmini oshiradi.",
"main_menu.fullscreen": "Toʻliq ekran",
"main_menu.fullscreen_help": "O'yin boshlanishidan oldin to'liq ekranga o'tishga harakat qiladi",
"main_menu.help_content": "## Maqsad\n\n7 daraja davomida iloji boricha ko'proq tanga oling. \nG'ishtlarni sindirishda tangalar paydo bo'ladi.\nBallaringizni oshirish uchun ularni shaybangiz bilan tuting.\nSizning ballingiz ekranning yuqori o'ng burchagida ko'rsatiladi.\nTo'pni tashlamang, aks holda o'yin tugadi.\n\nBarcha g'ishtlarni yo'q qilgandan so'ng, siz yangilanishni tanlashingiz mumkin.\n\n## Yangilanishlar \n\nSiz tanlagan yangilanishlar ish oxirigacha amal qiladi. \nBa'zilari kuchliroq ta'sir qilish uchun bir necha marta tanlanishi mumkin.\nBa'zilar maqsadga erishishda yordam beradi yoki boshqa yo'llar bilan o'yinni osonlashtiradi. \nBa'zilari faqat birlashganda foydali bo'ladi.\n\nHar bir o'yin boshida har doim bitta yangilanish olasiz. \nUning belgisi birinchi darajadagi g'isht sifatida xizmat qiladi. \nSozlamalarda yangilanishlarni boshlashni tanlashingiz mumkin.\n\nKo'pgina yangilanishlar kombinatsiyangizga ta'sir qiladi. \n\n## Kombo\n\nSizning \"kombo\" - bu g'isht sindirilganda paydo bo'lgan tangalar soni. \nU shaybangizda ko'rsatiladi, masalan, x4 har bir g'ishtdan 4 ta tanga chiqishini bildiradi. \nKomboni oshiradigan ko'pgina yangilanishlar uni qayta tiklash shartini ham qo'shadi. \nAgar to'p hech qanday g'ishtga tegmasdan shaybaga qaytsa, kombinatsiya ham tiklanadi.\nBu sodir bo'lganda \"o'tkazib yuborilgan\" xabari ko'rsatiladi. \n\nHar safar g'isht tomon intiling. \n\n## Maqsad\n\nFaqat to'pning shaybadagi holati uning qanday sakrashini hal qiladi.\nAgar to'p shaybaning o'lik markaziga tegsa, u yana vertikal ravishda yuqoriga qaytadi. \nAgar siz bir tomondan ko'proq ursangiz, u ko'proq burchakka ega bo'ladi. \nShayba tezligi va kiruvchi burchak sakrashdan keyin to'p yo'nalishiga ta'sir qilmaydi.\n\nMaqsadga erishishga yordam beradigan ko'plab yangilanishlar qulfdan chiqarilishi mumkin.\n\n## Qulfni ochadi\n\nBreakout 71 birinchi marta oynalganda, kopchilik yangilanishlar va darajalar qulflanadi. \nYangilanishlar shunchaki o'ynash va ko'plab tangalarni olish orqali ochiladi. \nBirinchi darajalar yuqori ballga erishish orqali ochiladi.\nKeyingi darajalarda qaysi imtiyozlarni tanlashingiz mumkinligi haqida shart qoshiladi. \n\nHar bir darajadan keyin bir nechta yangilanishlarni olsangiz, yuqori ballga erishish osonroq bo'ladi. \n\n## Qayta roliklar va bepul yangilanishlar\n\nYaxshi o'ynaganingizda qo'shimcha yangilanish olasiz: \n\n- Darajani {{levelTimeGood}} soniya ichida tozalang\n- Yon tomonlarga yoki tepaga {{wallBouncedGood}} martadan kamroq urish\n- Tangalarning {{catchRateGood}}foizini ushlang\n- G'ishtlarni {{missesGood}} martadan kamroq o'tkazib yuboring \n\nBundan tashqari, agar siz yanada yaxshi ishlasangiz, yangilanishlarni o'tkazib yuborishga imkon beruvchi qayta rolik olasiz: \n\n- {{levelTimeBest}} soniyadan kamroq darajani tozalang\n- Yon tomonlarga yoki tepaga {{wallBouncedBest}} martadan kamroq urish\n- Tangalarning {{catchRateBest}}foizini ushlang\n- G'ishtlarni {{missesBest}} martadan kamroq o'tkazib yuboring \n\nSozlamalardagi parametr ushbu statistikani ko'rsatish imkonini beradi",
"main_menu.help_help": "O'yin haqida ko'proq bilib oling",
"main_menu.help_title": "Yordam",
"main_menu.help_upgrades": "## Yangilanishlar",
"main_menu.high_score": "Yuqori ball: {{score}}",
"main_menu.kid": "Bolalar rejimi",
"main_menu.kid_help": "Kelgusi o'yinlarni \"sekinroq to'p\" bilan boshlang.",
"main_menu.language": "Til",
"main_menu.language_help": "O'yin tilini tanlang",
"main_menu.load_save_file": "Saqlash faylini yuklang",
"main_menu.load_save_file_help": "Qurilmangizda saqlash faylini tanlang",
"main_menu.max_coins": " Ekranda maksimal {{max}} tanga",
"main_menu.max_coins_help": "Faqat kosmetika, ballga ta'siri yo'q",
"main_menu.max_particles": " maksimal {{max}} zarracha",
"main_menu.max_particles_help": "Vizual effekt uchun ekrandagi zarrachalar sonini cheklaydi. ",
"main_menu.mobile": "Mobil rejim",
"main_menu.mobile_help": "Shayba ostida bo'sh joy qoldiradi.",
"main_menu.normal": "Yangi O'yin",
"main_menu.normal_help": "Tasodifiy boshlang'ich imtiyoz bilan 7 darajani o'ynang",
"main_menu.pointer_lock": "Sichqoncha ko'rsatkichi qulfi",
"main_menu.pointer_lock_help": "Sichqoncha kursorini bloklaydi va yashiradi.",
"main_menu.record": "O'yin videolarini yozib oling",
"main_menu.record_download": "Videoni yuklab olish ({{size}} MB)",
"main_menu.record_help": "Har bir darajadagi videoni oling.",
"main_menu.red_miss": "Miss ogohlantirish",
"main_menu.red_miss_help": "To'plar atrofida qizil zarrachalar zarbasiz pastga tushayotganini ko'rsating.",
"main_menu.reset": "O'yinni tiklash",
"main_menu.reset_cancel": "Yo'q",
"main_menu.reset_confirm": "Ha",
"main_menu.reset_help": "Yuqori ball, o'yin vaqti va statistikani o'chirib tashlang",
"main_menu.reset_instruction": "Siz o'yinda erishgan barcha yutuqlaringizni yo'qotasiz, ishonchingiz komilmi?",
"main_menu.save_file_error": "Saqlash faylini yuklashda xatolik yuz berdi",
"main_menu.save_file_loaded": "Yuklangan faylni saqlang",
"main_menu.save_file_loaded_help": "Endi saqlashingizni qo'llash uchun ilova qayta yuklanadi",
"main_menu.save_file_loaded_ok": "KELISHDIKMI",
"main_menu.settings_help": "O'yinni sizning ehtiyojlaringiz va didingizga moslang",
"main_menu.settings_title": "Sozlamalar",
"main_menu.show_fps": "FPS hisoblagichi",
"main_menu.show_fps_help": "Ilovaning ishlashini kuzatib boring",
"main_menu.show_stats": "Haqiqiy vaqt statistikasini ko'rsatish",
"main_menu.show_stats_help": "Tangalar, vaqt, sakrashlar, o'tkazib yuborishlar",
"main_menu.sounds": "O'yin tovushlar",
"main_menu.sounds_help": "Ba'zi telefonlarni sekinlashtirishi mumkin.",
"main_menu.starting_perks": "Boshlang'ich imtiyozlar",
"main_menu.starting_perks_checked": "Yangi o'yinni boshlaganingizda, ushbu imtiyozlardan biri sizga beriladi. Imtiyozni istisno qilish uchun uni bosing. ",
"main_menu.starting_perks_full_random": "Barcha imtiyozlar olib tashlandi, tanlov tasodifiy bo'ladi.",
"main_menu.starting_perks_help": "Mumkin bo'lgan yangilanishlarni tanlang",
"main_menu.starting_perks_unchecked": "Quyidagi imtiyozlar boshlangich imtiyozlar sifatida taqdim etilmaydi, lekin ularni hovuzga qoshish uchun bosing. ",
"main_menu.title": "Breakout 71",
"main_menu.unlocks": "Qulfdan chiqarilgan kontent",
"main_menu.unlocks_help": "Imtiyoz va darajalarni sinab ko'ring",
"play.close_modale_window_tooltip": "Yopish",
"play.current_lvl": " {{level}}/{{max}}-daraja ",
"play.menu_label": "menyu",
"play.menu_tooltip": "Asosiy menyuni oching",
"play.missed_ball": "sog'indim",
"play.mobile_press_to_play": "Oʻynash uchun shu yerni bosing va ushlab turing",
"play.score_tooltip": "Ballaringizni, yangilanishlaringizni va boshqalarni ko'ring",
"play.stats.coins_catch_rate": "Tangalarni ushlash darajasi",
"play.stats.levelMisses": "O'tkazib yuborilgan zarbalar, siz hech narsa urmagan joy",
"play.stats.levelTime": "Darajali vaqt",
"play.stats.levelWallBounces": "Devor sakraydi",
"score_panel.close_to_unlock": "Keyingi darajadagi qulfni ochish:",
"score_panel.get_upgrades_to_unlock": "“{{level}}” darajasini ochish uchun {{missingUpgrades}} oling va yana {{points}} ball oling",
"score_panel.rerolls_count": "Siz {{rerolls}} ta qayta roʻyxatdan oʻtgansiz",
"score_panel.score_to_unlock": "“{{level}}” darajasini ochish uchun yana {{points}} ball toplang",
"score_panel.title": " {{level}}/{{max}} darajasida{{score}} ball ",
"score_panel.upcoming_levels": "Kelgusi darajalar:",
"score_panel.upgrades_picked": "Ushbu o'yinda tanlangan yangilanishlar ishlaydi: ",
"unlocks.greyed_out_help": "Kulrang yangilanishlarni umumiy ballingizni oshirish orqali ochish mumkin. O'yinda har safar to'p kiritganingizda umumiy ball ortadi.",
"unlocks.intro": "Sizning umumiy ballingiz: {{ts}}. Quyida o'yinlar taklif qiladigan barcha yangilanishlar va darajalar mavjud. U bilan sinov o'yinini boshlash uchun pastdagi yangilanish yoki darajani bosing.",
"unlocks.just_unlocked": "Daraja qulfdan chiqarildi",
"unlocks.just_unlocked_plural": "Siz hozirgina {{count}} darajani ochdingiz",
"unlocks.level": "<h2>Siz {{out_of}}</h2>\n<p>darajasidan {{unlocked}} tasini ochdingiz. Mana barcha oʻyin darajalari, sinab koʻrish uchun bittasini bosing.</p> ",
"unlocks.level_description": " {{bricks}} ta gʻisht, {{colors}} ta rang va {{bombs}} ta bombadan iborat {{size}}x{{size}} daraja.",
"unlocks.minScore": "Qulfni ochish uchun yugurishda ${{minScore}} ga erishing.",
"unlocks.minScoreWithPerks": "Qulfni ochish uchun {{required}} bilan, lekin {{forbidden}} siz yugurishda{{minScore}} dollarga erishing.",
"unlocks.minTotalScore": "Jami ${{score}}toʻplang ",
"unlocks.reached": "Eng yaxshi ballingiz: {{reached}}.",
"unlocks.title_upgrades": "Siz {{out_of}}ta yangilanishdan {{unlocked}} tasini ochdingiz ",
"upgrades.addiction.name": "Giyohvandlik",
"upgrades.addiction.tooltip": "+{{lvl}} kombinatsiya / g'isht, g'ishtni sindirgandan keyin {{delay}}soniyadan so'ng kombinatsiya qayta tiklanadi. ",
"upgrades.addiction.verbose_description": "Ortga hisoblash faqat har bir darajadagi birinchi g'ishtni sindirishdan keyin boshlanadi. Barcha g'ishtlar vayron bo'lishi bilanoq to'xtaydi.",
"upgrades.asceticism.name": "Asketizm",
"upgrades.asceticism.tooltip": "+{{combo}} kombinatsiya / g'isht, - tanga ushlashda {{combo}} ",
"upgrades.asceticism.verbose_description": "Kombo ko'tarilayotganda siz tangalarni biror joyda saqlashingiz kerak bo'ladi. ",
"upgrades.ball_attract_ball.help_plural": "Kuchli tortish kuchi",
"upgrades.ball_attract_ball.name": "Gravitatsiya",
"upgrades.ball_attract_ball.tooltip": "To'plar to'plarni tortadi",
"upgrades.ball_attract_ball.verbose_description": "“Oyin maydoni kengligining 3/4 qismidan” koproq masofada joylashgan toplar bir-birini oziga torta boshlaydi. \n\nUlar bir-biridan eng uzoqda bo'lganda, tortishish kuchi kuchliroq bo'ladi.\n\nKamalak zarralari tortishish kuchini ifodalash uchun uchadi. Agar sizda bir nechta to'p bo'lsa, bu imtiyoz faqat taqdim etiladi.",
"upgrades.ball_attracts_coins.name": "To'plar tangalarni tortadi",
"upgrades.ball_attracts_coins.tooltip": "Tangalar eng yaqin to'pni kuzatib boradi va sekinroq tushadi",
"upgrades.ball_attracts_coins.verbose_description": "Bu to'plarni tangalar bilan \"bo'yash\" uchun ishlatilishi mumkin, agar siz uni \"dog'\" va \"arvoh tangalar\" bilan birlashtirsangiz. Shuningdek, u tanga magnitining o'rnini bosuvchi vosita sifatida ishlaydi. ",
"upgrades.ball_repulse_ball.help_plural": "Kuchli itarilish kuchi",
"upgrades.ball_repulse_ball.name": "Shaxsiy maydon",
"upgrades.ball_repulse_ball.tooltip": "To'plar to'plarni qaytaradi",
"upgrades.ball_repulse_ball.verbose_description": "Ekranning tortdan bir qismidan kamroq masofada joylashgan toplar bir-birini qaytara boshlaydi. Agar ular bir-biriga yaqin bo'lsa, itarilish kuchi kuchliroq bo'ladi. Zarrachalar bu kuch qo'llanilishini ramziy qilish uchun tashqariga chiqadi. Agar sizda bir nechta to'p bo'lsa, bu imtiyoz faqat taqdim etiladi.",
"upgrades.base_combo.name": "Kuchli asoslar",
"upgrades.base_combo.tooltip": "Kombo 1 oʻrniga {{coins}} da boshlanadi.",
"upgrades.base_combo.verbose_description": "Sizning kombinatsiyangiz odatda daraja boshida 1 dan boshlanadi va hech narsaga tegmasdan sakrab o'tganingizda 1 ga qaytadi. Ushbu imtiyoz bilan kombinatsiya 3 ball yuqoriroq boshlanadi, shuning uchun siz har doim g'isht uchun kamida 4 tanga olasiz. Kombo qayta o'rnatilganda, u 1 emas, 4 ga qaytadi. Sizning to'pingiz bir oz yaltiroq bo'lib, uning kombinatsiyasi birdan yuqori ekanligini bildiradi.",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "Kattaroq portlashlar",
"upgrades.bigger_explosions.verbose_description": "Standart portlash 3x3 kvadratni tozalaydi, bu bilan u 5x5 kvadratga aylanadi va tangalardagi zarba ham sezilarli darajada kuchliroq bo'ladi. Har bir portlashdan keyin ekran miltillaydi (asosiy rejimdan tashqari)",
"upgrades.bigger_puck.name": "Kattaroq shayba",
"upgrades.bigger_puck.tooltip": "Ko'proq tangalarni osongina ushlang.",
"upgrades.bigger_puck.verbose_description": "Kattaroq shayba to'pni hech qachon o'tkazib yubormaslik va ko'proq tanga ushlashni osonlashtiradi, shuningdek, sakrashlarni aniq burchak bilan o'tkazishni osonlashtiradi (to'pning burchagi faqat uning qayerga tegishiga bog'liq). \n\nBiroq, katta shaybani sathning yon tomonlarida ishlatish qiyinroq va uni ba'zan o'tkazib yuborishdan qochib bo'lmaydi.",
"upgrades.clairvoyant.name": "Ko'ruvchi",
"upgrades.clairvoyant.tooltip": "Kelgusi darajalarni, HP g'ishtlarini va to'p yo'nalishini ko'ring",
"upgrades.clairvoyant.verbose_description": "To'g'ri yangilanishlarni tanlash va mustahkam g'isht bilan nima sodir bo'layotganini tushunishga yordam beradi. 2 va 3-darajalar shubhali yordam dasturi haqida qo'shimcha ma'lumot beradi (loop rejimida foydalanish mumkin)",
"upgrades.coin_magnet.help_plural": "Tangalarga kuchli ta'sir",
"upgrades.coin_magnet.name": "Tangalar magniti",
"upgrades.coin_magnet.tooltip": "Pak tangalarni tortadi",
"upgrades.coin_magnet.verbose_description": "Tangalarni shaybaga yo'naltiradi. Agar tanga allaqachon unga yaqin bo'lsa, ta'sir kuchliroq bo'ladi. Barcha tangalarni ushlash o'yinda maxsus bonuslarni olib keladi. \n\nKo'proq tangalarni qo'lga olishning yana bir usuli - pastdan g'ishtlarni urish. To'pning tezligi va yo'nalishi chiqarilgan tanga tezligiga ta'sir qiladi. ",
"upgrades.compound_interest.name": "Murakkab foiz",
"upgrades.compound_interest.tooltip": "+{{lvl}} ta gʻisht singan, tanga yoʻqolganida asl holatini tiklash",
"upgrades.compound_interest.verbose_description": "Har bir g'ishtni sindirganingizda sizning kombinatingiz bittaga o'sadi va har bir sindirgan g'isht bilan ko'proq tanga tug'iladi. \n\nShu bilan birga, o'sha tangalarning har birini o'z shaybangiz bilan ushlaganingizga ishonch hosil qiling, chunki har qanday yo'qolgan tanga kombinatingizni qayta tiklaydi. \n\nKombinatsiyangiz minimal qiymatdan oshib ketgandan so'ng, o'yin maydonining pastki qismida tangalar u erga tushmasligi kerakligini eslatish uchun qizil chiziq paydo bo'ladi.",
"upgrades.concave_puck.name": "Botiq shayba",
"upgrades.concave_puck.tooltip": "Vertikal nishonning aniqligini yaxshilaydi",
"upgrades.concave_puck.verbose_description": "To'plar balandlikni to'g'ridan-to'g'ri yuqoriga ko'tarishni boshlaydi va kamroq burchak bilan sakraydi.",
"upgrades.corner_shot.name": "Burchak zarbasi",
"upgrades.corner_shot.tooltip": "Shaybani ekran chegaralari bilan qoplash imkonini beradi",
"upgrades.corner_shot.verbose_description": "Burchaklarni nishonga olishga yordam beradi. Qo'shimcha darajalar sizga uzoqroqqa borish imkonini beradi. ",
"upgrades.etherealcoins.name": "Kosmosda tangalar",
"upgrades.etherealcoins.tooltip": "Tangalar endi tortishish kuchiga ta'sir qilmaydi",
"upgrades.etherealcoins.verbose_description": "",
"upgrades.extra_levels.name": "yana 5 daqiqa",
"upgrades.extra_levels.tooltip": "7 oʻrniga {{count}} daraja oʻynang",
"upgrades.extra_levels.verbose_description": "Standart o'yin maksimal 7 darajada davom etishi mumkin, shundan so'ng o'yin tugaydi. \n\nUshbu imtiyozning har bir darajasi bir daraja yuqoriga ko'tarilishingizga imkon beradi. Oxirgi darajalar ko'pincha siz eng ko'p ball to'playdigan darajalardir, shuning uchun farq keskin bo'lishi mumkin.",
"upgrades.extra_life.help_plural": "Sizning (oxirgi) to'pingiz yo'qolib ketish o'rniga pastki qismga sakraydi ({{lvl}} marta).",
"upgrades.extra_life.name": "Qo'shimcha hayot",
"upgrades.extra_life.tooltip": "To'p yo'qolishidan oldin pastki chiziqqa bir marta sakrab tushadi.",
"upgrades.extra_life.verbose_description": "Odatda, sizda bitta to'p bor va uni tushirishingiz bilan o'yin tugaydi.\n\nUshbu imtiyoz ekranning pastki qismida to'pni bir marta saqlaydigan va jarayonda buziladigan oq chiziqni qo'shadi. \n\nHar safar top ekranning pastki qismida sakraganda, siz ushbu imtiyozning bir darajasini yoqotasiz.",
"upgrades.forgiving.name": "Kechirimli",
"upgrades.forgiving.tooltip": "Yo'qolgan tanaffuslar kombinatsiyani birdaniga emas, asta-sekin kamaytiradi.",
"upgrades.forgiving.verbose_description": "Har bir daraja uchun birinchi o'tkazib yuborish bepul, keyin kombinatsiyaning 10%, keyin esa 20% .. ",
"upgrades.fountain_toss.name": "Favvora otish",
"upgrades.fountain_toss.tooltip": "Ba'zi tangalarni o'tkazib yuborganingizda, bir oz kombo oling. ",
"upgrades.fountain_toss.verbose_description": "Agar tangani otkazib yuborsangiz va kombinatingiz {{max}}dan past bolsa, kombinatingiz birga osishi {{lvl}}/kombo ehtimoliga ega boladi.",
"upgrades.ghost_coins.name": "Arvoh tangalar",
"upgrades.ghost_coins.tooltip": "Tangalar asta-sekin g'ishtlardan o'tadi",
"upgrades.ghost_coins.verbose_description": "Bu xato emas, bu xususiyat! Tangalar g'ishtlar orasidan asta-sekin uchadi. Yuqori darajalar ularga tezroq harakat qilish imkonini beradi. ",
"upgrades.helium.name": "Geliy",
"upgrades.helium.tooltip": "Gravitatsiya shaybaning chap va o'ng tomoniga teskari",
"upgrades.helium.verbose_description": "Bu tangalarga ta'sir qiladi va siz ularni olishga tayyor bo'lguningizcha suzishga imkon beradi.",
"upgrades.hot_start.name": "Issiq boshlanish",
"upgrades.hot_start.tooltip": "Kombodan boshlang {{start}}, - soniyada{{loss}} kombinatsiya",
"upgrades.hot_start.verbose_description": "Har bir darajaning boshida sizning kombinatsiyangiz +30 balldan boshlanadi, lekin keyin har soniyada u bittaga kamayadi. Effekt boshqa imtiyozlar bilan birga keladi. ",
"upgrades.implosions.name": "Portlashlar",
"upgrades.implosions.tooltip": "Portlashlar tangalarni puflash o'rniga ularni so'radi",
"upgrades.implosions.verbose_description": "Portlash kuchi boshqa yo'l bilan qo'llaniladi. Keyingi darajalar \"katta portlash\" rolini o'ynaydi",
"upgrades.instant_upgrade.name": "Darhol yangilash",
"upgrades.instant_upgrade.tooltip": "Endi +1 yangilang, o'yin oxirigacha -1 tanlov.",
"upgrades.instant_upgrade.verbose_description": "Darhol ikkita yangilanishni tanlang, shunda siz bitta bepulga ega bo'lasiz, ikkinchisi esa ushbu imtiyozni olish uchun ishlatilganini to'lash uchun. Yangilanishlarni tanlash uchun har bir keyingi menyuda tanlash uchun kamroq imkoniyatlar bo'ladi.",
"upgrades.left_is_lava.name": "Chap tomondan qoching",
"upgrades.left_is_lava.tooltip": "+ Har bir gisht uchun{{lvl}} ta singan. Agar to'p ekranning chap tomoniga tegsa, kombinatsiya tiklanadi",
"upgrades.left_is_lava.verbose_description": "Har safar g'ishtni sindirganingizda, kombinatsiyangiz bittaga ko'payadi, shuning uchun siz sindirgan barcha g'ishtlardan yana bitta tanga olasiz.\n\nBiroq, sizning to'pingiz chap tomonga tegishi bilanoq sizning kombinatsiyangiz qayta tiklanadi. \n\nKombinatsiyangiz ko'tarilgach, chap tomon qizil rangga aylanib, ularga tegmaslik kerakligini eslatadi. \n",
"upgrades.limitless.name": "Cheksiz",
"upgrades.limitless.tooltip": "Barcha yangilanishning maksimal darajasini {{lvl}} ga oshiring ",
"upgrades.limitless.verbose_description": "Bu imtiyozni tanlash, shuningdek, oz chegarasini bir marta oshirib, uni yana tanlash imkonini beradi.",
"upgrades.metamorphosis.name": "Metamorfoz",
"upgrades.metamorphosis.tooltip": "Har bir tanga oʻz rangi bilan {{lvl}} ta gʻishtni boʻyash mumkin",
"upgrades.metamorphosis.verbose_description": "Ushbu imtiyoz bilan tangalar ular kelgan g'isht rangida bo'ladi va ular tegib turgan birinchi g'ishtni bir xil rangda bo'yashadi. \n\nTangalar ularni sindirib tashlagan to'pning tezligi bilan tug'iladi, ya'ni siz \"bo'yash\" kerak bo'lgan g'ishtlar yo'nalishi bo'yicha bir oz mo'ljal olishingiz mumkin.",
"upgrades.minefield.name": "Minalar maydoni",
"upgrades.minefield.tooltip": "Ekranda har bir bomba gʻishtiga +{{lvl}} ta kombinatsiya",
"upgrades.minefield.verbose_description": "G'isht qo'yilganda kombinatsiyaga +lvl qo'shadi, vayron bo'lganda -lvl va asosiy kombinatsiyani g'ishtlar soniga lvl marta oshiradi",
"upgrades.multiball.name": "Ko'p to'p",
"upgrades.multiball.tooltip": "Har bir darajani {{count}} ball bilan boshlang.",
"upgrades.multiball.verbose_description": "Breakout 71da to'pni tashlaganingizdan so'ng yutqazasiz. \n\nUshbu imtiyoz bilan siz ikkita to'pga ega bo'lasiz va shuning uchun siz bitta to'pni yo'qotishingiz mumkin. \n\nYo'qotilgan to'plar keyingi bosqichga qaytadi. \n\nBir nechta to'pga ega bo'lish qo'shimcha imtiyozlarni beradi va, albatta, darajani tezroq tozalaydi.",
"upgrades.nbricks.name": "Qattiq namuna o'lchami",
"upgrades.nbricks.tooltip": "+{{lvl}} ta kombo uchun har bir shaybaga aniq {{lvl}} gʻisht bosing, aks holda u qayta tiklanadi",
"upgrades.nbricks.verbose_description": "Siz bu g'ishtlarni yo'q qilishingiz shart emas, lekin ularni urishingiz kerak. Portlashlar natijasida vayron bo'lgan g'ishtlar hisobga olinmaydi",
"upgrades.one_more_choice.name": "Qo'shimcha tanlov",
"upgrades.one_more_choice.tooltip": "Keyingi darajaga koʻtarilganlar roʻyxatda yana {{lvl}} ta variantni taklif qiladi",
"upgrades.one_more_choice.verbose_description": "Har bir yangilash menyusida yana bitta variant bo'ladi. Siz tanlay oladigan yangilanishlar sonini oshirmaydi.",
"upgrades.passive_income.name": "Passiv daromad",
"upgrades.passive_income.tooltip": "+{{lvl}} kombinatsiya / g'isht, agar pak oxirgi {{time}}soniyada harakatlanmasa, uning o'rniga qayta tiklanadi",
"upgrades.passive_income.verbose_description": "Ba'zi imtiyozlar to'plarga hech narsa qilmasdan xohlagan narsani qilishga yordam beradi.",
"upgrades.picky_eater.name": "Tanlangan yeyuvchi",
"upgrades.picky_eater.tooltip": "Har bir gʻisht singan +{{lvl}} kombinatsiya, toʻp rangi oʻzgarganda tiklanadi",
"upgrades.picky_eater.verbose_description": "Har safar to'pingiz bilan bir xil rangdagi g'ishtni sindirsangiz, kombinatsiyangiz bittaga ko'payadi. \nAgar u boshqa rangda bo'lsa, to'p yangi rangni oladi, lekin agar to'p rangidan g'isht qolmagan bo'lsa, kombinatsiya qayta o'rnatiladi. \nMinimaldan yuqori kombinatsiyani olganingizdan so'ng, noto'g'ri rangdagi g'ishtlar qizil chegaraga ega bo'ladi. \nAgar sizda bir nechta to'p bo'lsa, ulardan biri g'ishtga tegsa, ularning barchasi rangi o'zgaradi.",
"upgrades.pierce.name": "Pirsing",
"upgrades.pierce.tooltip": "Top sakrashdan keyin {{count}} ta gishtni teshib otadi",
"upgrades.pierce.verbose_description": "To'p odatda biror narsaga tegishi bilanoq sakraydi. Ushbu imtiyoz bilan u 3 tagacha singan g'isht uchun traektoriyasini davom ettiradi. \n\nShundan so'ng, u 4-g'isht ustida sakrab chiqadi va hisoblagichni qayta o'rnatish uchun shaybaga teginishingiz kerak bo'ladi.",
"upgrades.pierce_color.name": "Rangli pirs",
"upgrades.pierce_color.tooltip": "+{{lvl}} shar rangidagi g'ishtlarga zarar",
"upgrades.pierce_color.verbose_description": "To'p bir xil rangdagi g'ishtga tegsa, u to'siqsiz o'tib ketadi. \n\nBoshqa rangdagi g'ishtga etib borgach, uni buzadi, rangini oladi va sakrab chiqadi.\n\nAgar sizda mustahkam g'isht bo'lsa, to'p hali ham bir xil rangdagi g'ishtdan sakrab tushishi mumkin.",
"upgrades.puck_repulse_ball.help_plural": "Qaytaruvchi kuch kattaroq",
"upgrades.puck_repulse_ball.name": "Yumshoq qo'nish",
"upgrades.puck_repulse_ball.tooltip": "Shayba to'plarni qaytaradi",
"upgrades.puck_repulse_ball.verbose_description": "To'p shaybaga yaqinlashganda, u sekinlashadi va hatto shaybaga tegmasdan sakrab tushishi mumkin.",
"upgrades.reach.name": "Yuqoridan pastga",
"upgrades.reach.tooltip": " Eng past qatordagi N ta g'ishtga teginish kombinatsiyani tiklaydi. Aks holda, +N kombinatsiyasi",
"upgrades.reach.verbose_description": "Agar faqat bitta g'isht qatori bo'lsa yoki eng past g'isht qatori o'yinning butun kengligini qoplasa, unda bu perk hech narsa qilmaydi. Aks holda, bu eng past qatorni buzish kombinatsiyani qayta o'rnatadi, boshqa narsalarni buzish esa kombinatsiyani eng pastki qatordagi g'ishtlar soniga oshiradi. \n\nEng pastki qator qizil rang bilan ta'kidlanadi. ",
"upgrades.respawn.name": "Qayta tug'ilish",
"upgrades.respawn.tooltip": "{{percent}}% gʻisht {{delay}}soniyadan keyin qayta tiklanadi.",
"upgrades.respawn.verbose_description": "Ba'zi zarracha effektlari g'ishtlar qaerda paydo bo'lishini sizga ma'lum qiladi. ",
"upgrades.right_is_lava.name": "O'ng tomondan qoching",
"upgrades.right_is_lava.tooltip": "Har bir gʻisht uchun +{{lvl}} ta kombinatsiya. Agar to'p ekranning chap tomoniga tegsa, kombinatsiya tiklanadi",
"upgrades.right_is_lava.verbose_description": "Har safar g'ishtni sindirganingizda, kombinatsiyangiz bittaga ko'payadi, shuning uchun siz sindirgan barcha g'ishtlardan yana bitta tanga olasiz.\n\nBiroq, sizning to'pingiz o'ng tomonga tegishi bilanoq sizning kombinatsiyangiz qayta tiklanadi. \n\nKombinatsiyangiz ko'tarilgach, o'ng tomon qizil rangga ega bo'lib, ularga tegmaslik kerakligini eslatadi.\n",
"upgrades.sacrifice.help_l1": "Hayotni yo'qotish barcha g'ishtlarni tozalaydi",
"upgrades.sacrifice.help_over": "Komboni {{lvl}}marta yo'qotish barcha g'ishtlarni tozalaydi",
"upgrades.sacrifice.name": "Qurbonlik",
"upgrades.sacrifice.verbose_description": "Bu kombinatsiyani juda yuqori darajaga olib kelishi mumkin.",
"upgrades.sapper.help_plural": "Birinchi singan {{lvl}} ta g'isht bombaga aylanadi.",
"upgrades.sapper.name": "Sapper",
"upgrades.sapper.tooltip": "Birinchi singan g'isht bombaga aylanadi.",
"upgrades.sapper.verbose_description": "Faqat g'oyib bo'lish o'rniga, siz sindirgan birinchi g'isht bomba g'ishtiga almashtiriladi. To'pni shaybaga tepish effektni qaytadan kuchaytiradi. Ushbu imtiyozni yuqori darajaga ko'tarish sizga ko'proq bomba joylashtirish imkonini beradi.\n\nYodingizda bo'lsin, bombalar yaqin atrofdagi tangalarning tezligiga ta'sir qiladi, shuning uchun juda ko'p portlashlar sizning mashaqqatli mehnatingiz samarasini qo'lga kiritishni qiyinlashtirishi mumkin.",
"upgrades.shocks.name": "Shoklar",
"upgrades.shocks.tooltip": "Portlovchi to'plarning to'qnashuvi",
"upgrades.shocks.verbose_description": "Har safar ikkita to'p to'qnashganda, ular tezligini almashtiradilar, portlash chiqaradilar va ularni ajratish uchun qo'shimcha tezlikka ega bo'ladilar. ",
"upgrades.shunt.name": "Shunt",
"upgrades.shunt.tooltip": "Darajalar oʻrtasida kombinatsiyangizning {{percent}}foizini saqlang",
"upgrades.shunt.verbose_description": "Agar sizda ham issiq start mavjud bo'lsa, issiq ishga tushirish joriy kombinatsiyaga qo'shiladi",
"upgrades.side_flip.name": "O'ng qo'l",
"upgrades.side_flip.tooltip": "+ o'ngdan singan har bir g'isht uchun{{lvl}} kombinatsiya, - aks holda{{loss}} ",
"upgrades.side_flip.verbose_description": "Bitta kombinatsiyaga ega bo'lish uchun g'ishtni o'ng tomoniga uring, lekin uni chap tomonga urmang, chunki bu 2 ta kombinatsiyani olib tashlaydi. Yuqoridan va pastdan urish hech qanday ta'sir qilmaydi. ",
"upgrades.side_kick.name": "Chapaqay",
"upgrades.side_kick.tooltip": "+{{lvl}} har bir g'isht chapdan singan, - aks holda{{loss}} ",
"upgrades.side_kick.verbose_description": "Bitta kombinatsiyaga ega bo'lish uchun g'ishtni chap tomoniga uring, lekin uni o'ng tomonga urmang, chunki bu 2 ta kombinatsiyani olib tashlaydi. Yuqoridan va pastdan urish hech qanday ta'sir qilmaydi. ",
"upgrades.skip_last.help_plural": "Oxirgi {{lvl}} ta g'isht portlaydi.",
"upgrades.skip_last.name": "Oson tozalash",
"upgrades.skip_last.tooltip": "Oxirgi g'isht portlaydi.",
"upgrades.skip_last.verbose_description": "Keyingi bosqichga o'tish uchun barcha g'ishtlarni sindirish kerak. Biroq, oxirgilarini olish qiyin bo'lishi mumkin. \n\nDarajani erta tozalash yangilashda qo'shimcha tanlovlarni olib keladi. G'ishtlarni hech qachon o'tkazib yubormaslik ham juda foydali. \n\nShunday qilib, agar siz oxirgi g'ishtlarni sindirish qiyin bo'lsa, bu imtiyozni bir necha marta olish yordam berishi mumkin.",
"upgrades.slow_down.name": "Sekinroq to'p",
"upgrades.slow_down.tooltip": "To'p sekinroq harakat qiladi",
"upgrades.slow_down.verbose_description": "To'p nisbatan sekin boshlanadi, lekin o'yiningizning har bir darajasi biroz tezroq boshlanadi. \n\nAgar siz bir darajada ko'p vaqt sarflasangiz, u ham tezlashadi. \n\nUshbu imtiyoz uni yanada qulayroq qiladi. \n\nMenyuda bola rejimini yoqish orqali uni har safar boshida olishingiz mumkin.",
"upgrades.smaller_puck.help_plural": "Hatto kichikroq shayba va yuqori tayanch kombinatsiyasi",
"upgrades.smaller_puck.name": "Kichikroq shayba",
"upgrades.smaller_puck.tooltip": "Shuningdek, +5 ta asosiy kombinatsiyani beradi",
"upgrades.smaller_puck.verbose_description": "Bu shaybani kichikroq qiladi, bu nazariy jihatdan ba'zi burchak zarbalarini osonlashtiradi, lekin haqiqatan ham qiyinchilikni oshiradi.\n\nShuning uchun siz tanlaganingizdan keyin sindiradigan barcha g'ishtlar uchun har bir g'isht uchun +5 tangadan iborat yoqimli bonusga ega bo'lasiz. ",
"upgrades.soft_reset.name": "Yumshoq tiklash",
"upgrades.soft_reset.tooltip": "Kombo sozlamalari {{percent}}% saqlaydi",
"upgrades.soft_reset.verbose_description": "Kombo qayta o'rnatishning ta'sirini cheklang.",
"upgrades.streak_shots.name": "Hit chizig'i",
"upgrades.streak_shots.tooltip": "Shaybaga sakrashdan oldin ko'p g'ishtlarni sindirib tashlasangiz, ko'proq tangalar.",
"upgrades.streak_shots.verbose_description": "Har safar g'ishtni sindirganingizda, kombinatsiyangiz (bir g'isht uchun tangalar soni) bittaga ortadi. \n\nBiroq, to'p sizning shaybangizga tegishi bilanoq, kombo o'zining standart qiymatiga qayta tiklanadi va siz har bir g'isht uchun bitta tanga olasiz.\n\nKombinatsiyangiz asosiy qiymatdan yuqoriga ko'tarilgach, shaybangiz qizil rangga aylanadi, bu sizga to'p bilan teginish uchun kombinatsiyangizni yo'q qilishini eslatadi.",
"upgrades.sturdy_bricks.name": "Qattiq g'ishtlar",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} gʻisht HP, +{{percent}}% tangalar singanida paydo boʻladi",
"upgrades.sturdy_bricks.verbose_description": "Ushbu imtiyozning har bir darajasi barcha g'ishtlarga bitta HP qo'shadi. Siz HP raqamini \"ko'rsatuvchi\" imtiyoz bilan ko'rishingiz mumkin. \"Percing\" imtiyozini qo'lga kiritish orqali to'pga yetkazilgan zararni oshirishingiz mumkin. Perkning har bir darajasi +50% tangalar paydo bo'lishini qo'shadi. ",
"upgrades.telekinesis.help_plural": "To'pga kuchli ta'sir",
"upgrades.telekinesis.name": "Telekinez",
"upgrades.telekinesis.tooltip": "Shayba to'pning harakatini boshqaradi",
"upgrades.telekinesis.verbose_description": "Siz to'pni yuqoriga ko'tarilayotganda nazorat qilasiz. ",
"upgrades.top_is_lava.name": "Osmon chegaradir",
"upgrades.top_is_lava.tooltip": "Har bir gʻisht uchun +{{lvl}} kombinatsiyasi, tepaga urilganda asl holatini tiklash",
"upgrades.top_is_lava.verbose_description": "Qachonki siz g'ishtni sindirsangiz, kombinatingiz bittaga ko'payadi. Biroq, sizning to'pingiz ekranning yuqori qismiga tegishi bilan sizning kombinatsiyangiz qayta tiklanadi. \n\nKombinatsiyangiz minimal qiymatdan yuqori bo'lsa, tepada qizil chiziq paydo bo'lib, unga tegmaslik kerakligini eslatadi. ",
"upgrades.trampoline.name": "Trampolin",
"upgrades.trampoline.tooltip": "+ har bir shaybaga sakrash uchun{{lvl}} kombinatsiya,- istalgan chegarada har bir sakrash uchun{{lvl}} ta kombinatsiya",
"upgrades.trampoline.verbose_description": "Qayta tiklash shartini qo'shmaydigan noyob kombinatsiyalangan yangilanishlardan biri",
"upgrades.trickledown.name": "Oqim oqimi",
"upgrades.trickledown.tooltip": "Tangalar ekranning yuqori qismida ko'rinadi.",
"upgrades.trickledown.verbose_description": "Bu sizga tangalarni chetga surib qo'yishga yordam berishi mumkin. ",
"upgrades.unbounded.help_no_ceiling": "Har bir gʻisht uchun +{{lvl}} kombinatsiya, boshqa yon tomonlar yoki shiftlar yoʻq",
"upgrades.unbounded.name": "Cheklanmagan",
"upgrades.unbounded.tooltip": "Har bir g'isht uchun +{{lvl}} kombinati, to'pni o'yinda ushlab turish uchun boshqa tomonlar yo'q, xavf",
"upgrades.unbounded.verbose_description": "Umid qilamanki, siz to'pingizni ekranda ushlab turish yo'lini topdingiz. Yon tomonlarga zarba berish uchun jazo endi qo'llanilmaydi. 2+ darajasida shift ham yo'qoladi. Bu rivojlangan imtiyoz. ",
"upgrades.viscosity.name": "Yopishqoqlik",
"upgrades.viscosity.tooltip": "Tanganing tushishi sekinroq",
"upgrades.viscosity.verbose_description": "Tangalar odatda tortishish va portlashlar bilan juda yuqori tezlikka tezlashadi. \n\nBu imtiyoz ularni doimo sekinlashtiradi, go'yo ular qandaydir yopishqoq suyuqlikda bo'lgandek. \n\nBu ularni ushlashni osonlashtiradi va tanga harakatiga ta'sir qiluvchi imtiyozlar bilan yaxshi uyg'unlashadi.",
"upgrades.wind.help_plural": "Kuchli shamol kuchi",
"upgrades.wind.name": "Shamol",
"upgrades.wind.tooltip": "Shayba holati shamol hosil qiladi",
"upgrades.wind.verbose_description": "Shamol shayba holatiga bog'liq: chap chapga, o'ngga esa o'ngga. To'plarga ham, tangalarga ham ta'sir qiladi.",
"upgrades.yoyo.name": "Yo-yo",
"upgrades.yoyo.tooltip": "To'p shayba tomon tushadi",
"upgrades.yoyo.verbose_description": "Bu telekinezning teskarisi, to'p pastga tushayotganda uni boshqaring.",
"upgrades.zen.name": "Zen",
"upgrades.zen.tooltip": "Har bir gʻisht uchun +{{lvl}} kombinatsiya, portlash sodir boʻlganda asliga qaytariladi",
"upgrades.zen.verbose_description": "Axir, bu zo'ravonliksiz o'yin. "
}

336
src/i18n/zh.json Normal file
View file

@ -0,0 +1,336 @@
{
"confirmRestart.no": "取消",
"confirmRestart.text": "您即将开始一个新游戏。您确定要继续吗?",
"confirmRestart.title": "开始新游戏?",
"confirmRestart.yes": "重启游戏",
"gameOver.creative": "本次运行将不记录在案。",
"gameOver.cumulative_total": "您的累计总分从 {{startTs}} 升至 {{endTs}}。",
"gameOver.lost.summary": "您在抓到 {{score}} 枚硬币后掉了球。",
"gameOver.lost.title": "游戏结束",
"gameOver.stats.balls_lost": "失球",
"gameOver.stats.bricks_broken": "碎砖",
"gameOver.stats.bricks_per_minute": "每分钟碎砖量",
"gameOver.stats.catch_rate": "捕获率",
"gameOver.stats.combo_avg": "平均组合",
"gameOver.stats.combo_max": "最大组合",
"gameOver.stats.duration_per_level": "每级持续时间",
"gameOver.stats.hit_rate": "命中率",
"gameOver.stats.intro": "下面是您的游戏统计与您的 {{count}} 最佳游戏的比较。",
"gameOver.stats.level_reached": "达到的水平",
"gameOver.stats.total_score": "总分",
"gameOver.stats.upgrades_applied": "已应用的升级",
"gameOver.unlocked_perk": "已解锁升级",
"gameOver.unlocked_perk_plural": "您刚刚解锁了 {{count}} 项特权",
"gameOver.win.summary": "游戏结束。您藏了 {{score}} 枚金币。",
"gameOver.win.title": "您完成了此游戏",
"history.columns.score": "得分",
"history.columns.started": "日期",
"history.help": "查看您的 {{count}} 最佳游戏。",
"history.locked": "玩至少十场游戏解锁",
"history.title": "运行历史",
"lab.help": "尝试你想要的任何构建",
"lab.instructions": "选择下面的升级,然后选择要玩的关卡。",
"lab.menu_entry": "创意模式",
"lab.reset": "全部重置为 0",
"lab.select_level": "选择游戏级别",
"lab.unlocks_at": "总分 {{score}}时解锁",
"level_up.after_buttons": "您刚刚完成了 {{level}}/{{max}}关卡。",
"level_up.before_buttons": "你在 {{time}} 秒 {{timeGain}}内从 {{levelSpawnedCoins}} 个硬币中抓到了 {{score}} 个硬币 {{catchGain}} 。\n\n您失误了 {{levelMisses}} 次 {{missesGain}} ,撞到墙壁或天花板 {{levelWallBounces}} 次{{wallHitsGain}}。\n\n{{compliment}}",
"level_up.compliment_advice": "尽量捕捉所有金币,不要错过砖块,不要撞到墙壁/天花板,或者在 30 秒内通关,以获得额外升级。",
"level_up.compliment_good": "干得好!",
"level_up.compliment_perfect": "令人印象深刻,继续努力 ",
"level_up.pick_upgrade_title": "选择升级",
"level_up.plus_one_upgrade": "(+1升级)",
"level_up.plus_one_upgrade_and_reroll": "(+1升级和+1再滚动",
"level_up.reroll": "重掷 ({{count}})",
"level_up.reroll_help": "提供新的选择",
"level_up.upgrade_perk_to_level": " 等级 {{level}}",
"main_menu.basic": "基本图形",
"main_menu.basic_help": "更好的性能。",
"main_menu.colorful_coins": "五颜六色的硬币",
"main_menu.colorful_coins_help": "硬币总是以砖块的颜色生成",
"main_menu.comboIncreaseTexts": "用金色显示 +X",
"main_menu.comboIncreaseTexts_help": "当组合增加时",
"main_menu.contrast": "高对比度",
"main_menu.contrast_help": "色彩更丰富,渲染更暗",
"main_menu.credit_levels": "级别",
"main_menu.donate": "您已经玩了 {{hours}} 小时",
"main_menu.donate_help": "捐款如何?您可以在设置中隐藏此提醒。",
"main_menu.donation_reminder": "提醒我捐款",
"main_menu.donation_reminder_help": "参见主菜单中的播放时间和捐赠链接",
"main_menu.download_save_file": "下载比分和统计数据",
"main_menu.download_save_file_help": "获取保存文件",
"main_menu.extra_bright": "特别明亮",
"main_menu.extra_bright_help": "增大硬币和砖块周围的光环。",
"main_menu.fullscreen": "全屏",
"main_menu.fullscreen_help": "游戏开始前会尝试全屏",
"main_menu.help_content": "## 目标\n\n在 7 个关卡中尽可能多地捕捉硬币。\n打碎砖块时会出现金币。\n用冰球接住它们以提高得分。\n您的分数显示在屏幕右上角。\n不要掉球否则游戏结束。\n\n摧毁所有砖块后您可以选择升级。\n\n## 升级\n\n你选择的升级会一直持续到运行结束。\n有些升级可以多次选择以获得更强的效果。\n有些升级有助于瞄准或在其他方面让游戏更轻松。\n有些只有在组合时才有用。\n\n每局游戏开始时你总会获得一种升级。\n它的图标将作为第一关的砖块。\n您可以在设置中选择初始升级。\n\n许多升级会影响您的连击。\n\n## 组合\n\n您的 \"连击 \"是指砖块破碎时产生的金币数量。\n它显示在你的冰球上例如 x4 表示每块砖会产生 4 枚硬币。\n大多数增加连击数的升级还会添加重置连击数的条件。\n如果球回到冰球上时没有击中任何砖块连击也会重置。\n此时会显示 \"未击中 \"信息。\n\n尽量每次都瞄准砖块。\n\n## 瞄准\n\n只有球在冰球上的位置才能决定它的反弹方式。\n如果球击中冰球的正中间它将垂直弹起。\n如果击中一侧较多则角度会更大。\n冰球速度和入球角度对球反弹后的方向没有影响。\n\n可以解锁许多有助于瞄准的升级。\n\n## 解锁\n\n第一次玩《突围 71》时大部分升级和关卡都是锁定的。\n升级可通过简单的游戏和捕捉许多硬币来解锁。\n达到高分即可解锁第一个关卡。\n后面的关卡会增加一个条件规定你可以选择哪些福利。\n\n如果在每个关卡后都能获得多种升级那么获得高分就容易多了。\n\n## 重卷和免费升级\n\n当你发挥出色时你将获得额外的升级选项\n\n- 在 {{levelTimeGood}} 秒内通关\n- 击中两侧或顶部少于 {{wallBouncedGood}} 次\n- 捕获 {{catchRateGood}}%的金币\n- 错过砖块少于 {{missesGood}} 次\n\n如果您做得更好您还会获得一次重新滚动的机会让您可以跳过升级\n\n- 在 {{levelTimeBest}} 秒内通关\n- 击中两侧或顶部少于 {{wallBouncedBest}} 次\n- 捕获 {{catchRateBest}}个%的金币\n- 错过砖块少于 {{missesBest}} 次\n\n设置中的一个选项可让您显示这些统计数据",
"main_menu.help_help": "了解更多游戏信息",
"main_menu.help_title": "帮助",
"main_menu.help_upgrades": "## Upgrades",
"main_menu.high_score": "最高分 : {{score}}",
"main_menu.kid": "儿童模式",
"main_menu.kid_help": "用 \"慢速球 \"开始今后的比赛。",
"main_menu.language": "语言",
"main_menu.language_help": "选择游戏语言",
"main_menu.load_save_file": "加载保存文件",
"main_menu.load_save_file_help": "选择设备上的保存文件",
"main_menu.max_coins": " {{max}} 屏幕上的硬币最大值",
"main_menu.max_coins_help": "仅用于美容,不影响评分",
"main_menu.max_particles": " {{max}} 粒子最大值",
"main_menu.max_particles_help": "限制屏幕上显示的粒子数量,以达到视觉效果。",
"main_menu.mobile": "移动模式",
"main_menu.mobile_help": "在冰球下方留出空间。",
"main_menu.normal": "新游戏",
"main_menu.normal_help": "玩 7 个关卡,随机获得初始装备",
"main_menu.pointer_lock": "鼠标指针锁定",
"main_menu.pointer_lock_help": "锁定和隐藏鼠标指针。",
"main_menu.record": "录制游戏视频",
"main_menu.record_download": "下载视频 ({{size}} MB)",
"main_menu.record_help": "获取每个关卡的视频。",
"main_menu.red_miss": "警告小姐",
"main_menu.red_miss_help": "在未命中的球周围显示红色颗粒。",
"main_menu.reset": "重置游戏",
"main_menu.reset_cancel": "没有",
"main_menu.reset_confirm": "是",
"main_menu.reset_help": "清除高分、游戏时间和统计数据",
"main_menu.reset_instruction": "你会失去在游戏中取得的所有进展,你确定吗?",
"main_menu.save_file_error": "加载保存文件出错",
"main_menu.save_file_loaded": "加载的保存文件",
"main_menu.save_file_loaded_help": "应用程序现在将重新加载,应用您保存的内容",
"main_menu.save_file_loaded_ok": "好的",
"main_menu.settings_help": "根据自己的需求和口味定制游戏玩法",
"main_menu.settings_title": "设置",
"main_menu.show_fps": "FPS 计数器",
"main_menu.show_fps_help": "监控应用程序的性能",
"main_menu.show_stats": "显示实时统计数据",
"main_menu.show_stats_help": "硬币、时间、弹跳、失误",
"main_menu.sounds": "游戏声音",
"main_menu.sounds_help": "可能会降低某些手机的运行速度。",
"main_menu.starting_perks": "起步福利",
"main_menu.starting_perks_checked": "当你开始一个新游戏时,你将获得其中一项福利。点击一项福利即可将其排除在外。",
"main_menu.starting_perks_full_random": "所有福利均已取消,选择将是随机的。",
"main_menu.starting_perks_help": "选择可能的初始升级",
"main_menu.starting_perks_unchecked": "以下福利不作为起始福利提供,但您可以点击将其添加到福利池中。",
"main_menu.title": "突围 71",
"main_menu.unlocks": "解锁内容",
"main_menu.unlocks_help": "尝试您解锁的特权和等级",
"play.close_modale_window_tooltip": "关闭",
"play.current_lvl": "级别 {{level}}/{{max}}",
"play.menu_label": "菜单",
"play.menu_tooltip": "打开主菜单",
"play.missed_ball": "眷恋",
"play.mobile_press_to_play": "长按此处播放",
"play.score_tooltip": "查看您的分数、升级和更多信息",
"play.stats.coins_catch_rate": "硬币捕获率",
"play.stats.levelMisses": "投篮不中,一无所获",
"play.stats.levelTime": "电平时间",
"play.stats.levelWallBounces": "墙面反弹",
"score_panel.close_to_unlock": "下一级解锁 ",
"score_panel.get_upgrades_to_unlock": "获得 {{missingUpgrades}} 并获得 {{points}} 更多分数,即可解锁\"{{level}}\"关卡。\"",
"score_panel.rerolls_count": "您已积累了 {{rerolls}} 次重掷机会",
"score_panel.score_to_unlock": "获得 {{points}} 更多分数,解锁\"{{level}}\"关卡\"",
"score_panel.title": "{{score}} 点, {{level}}级/{{max}} ",
"score_panel.upcoming_levels": "即将到来的级别 ",
"score_panel.upgrades_picked": "在本游戏中挑选的升级运行:",
"unlocks.greyed_out_help": "灰色部分的升级可以通过提高总分来解锁。每次在游戏中得分,总分都会增加。",
"unlocks.intro": "您的总分是 {{ts}}。以下是游戏提供的所有升级和关卡。 点击下面的升级或关卡即可开始测试游戏。",
"unlocks.just_unlocked": "等级已解锁",
"unlocks.just_unlocked_plural": "您刚刚解锁了 {{count}} 个关卡",
"unlocks.level": "<h2>你解锁了 {{unlocked}} 个关卡中的 {{out_of}}个关卡 </h2>\n<p>以下是所有游戏关卡,点击其中一个即可体验。</p> ",
"unlocks.level_description": "一个有 {{bricks}} 块砖、 {{colors}} 种颜色和 {{bombs}} 个炸弹的 {{size}}x{{size}} 关卡。",
"unlocks.minScore": "在运行中达到{{minScore}} 美元即可解锁。",
"unlocks.minScoreWithPerks": "在有 {{required}} 但没有 {{forbidden}} 解锁的情况下,达到{{minScore}} 美元。",
"unlocks.minTotalScore": "累计共计{{score}}美元",
"unlocks.reached": "你的最好成绩是 {{reached}}。",
"unlocks.title_upgrades": "您解锁了 {{out_of}}中的 {{unlocked}} 项升级",
"upgrades.addiction.name": "成瘾",
"upgrades.addiction.tooltip": "+{{lvl}} 连击/砖块,击碎砖块后连击重置 {{delay}}秒。",
"upgrades.addiction.verbose_description": "倒计时只在打碎每个关卡的第一块砖后开始。一旦所有砖块都被摧毁,倒计时就会停止。",
"upgrades.asceticism.name": "禁欲主义",
"upgrades.asceticism.tooltip": "+{{combo}} 连击/砖块,- {{combo}} 接住硬币",
"upgrades.asceticism.verbose_description": "在您的组合攀升时,您需要将金币存放在某个地方。",
"upgrades.ball_attract_ball.help_plural": "更强的吸引力",
"upgrades.ball_attract_ball.name": "重力",
"upgrades.ball_attract_ball.tooltip": "球吸引球",
"upgrades.ball_attract_ball.verbose_description": "距离超过 \"游戏区域宽度的 3/4 \"的球将开始相互吸引。\n\n相距最远时吸引力更强。\n\n彩虹粒子会飞起象征着吸引力。只有当您已经拥有一个以上的球时才会获得此福利。",
"upgrades.ball_attracts_coins.name": "球吸引硬币",
"upgrades.ball_attracts_coins.tooltip": "硬币跟随最近的球,下落速度较慢",
"upgrades.ball_attracts_coins.verbose_description": "如果将它与 \"染色剂 \"和 \"幽灵硬币 \"结合起来,就可以在球周围 \"涂满 \"硬币。它还可以代替硬币磁铁。",
"upgrades.ball_repulse_ball.help_plural": "更强的斥力",
"upgrades.ball_repulse_ball.name": "个人空间",
"upgrades.ball_repulse_ball.tooltip": "球击退球",
"upgrades.ball_repulse_ball.verbose_description": "距离小于四分之一屏幕宽度的球将开始相互排斥。如果彼此距离较近,斥力会更大。粒子会喷射而出,象征着这种力量的作用。只有当你已经拥有一个以上的小球时,才会获得此福利。",
"upgrades.base_combo.name": "坚实的基础",
"upgrades.base_combo.tooltip": "连击从 {{coins}} 开始,而不是从 1 开始。",
"upgrades.base_combo.verbose_description": "在关卡开始时,您的连击数通常从 1 开始,当您在没有击中任何东西的情况下四处弹跳时,连击数会重置为 1。有了这个装备连击开始时会高出 3 点,因此每块砖至少能得到 4 个金币。每当你的连击重置时,它就会回到 4 而不是 1。你的小球会闪烁一下表示连击数高于 1。",
"upgrades.bigger_explosions.name": "Kaboom",
"upgrades.bigger_explosions.tooltip": "更大的爆炸",
"upgrades.bigger_explosions.verbose_description": "默认爆炸清除的是 3x3 的正方形,而这个爆炸则变成了 5x5 的正方形,对硬币的冲击力也明显增强。每次爆炸后屏幕都会闪烁(基本模式除外)",
"upgrades.bigger_puck.name": "更大的冰球",
"upgrades.bigger_puck.tooltip": "轻松捕捉更多硬币",
"upgrades.bigger_puck.verbose_description": "冰球越大,就越不容易失球,也就越容易抓到更多的硬币,还能精确地调整反弹的角度(球的角度只取决于它击中冰球的位置)。\n\n不过大冰球在关卡两侧比较难用有时难免会失误。",
"upgrades.clairvoyant.name": "千里眼",
"upgrades.clairvoyant.tooltip": "查看即将到来的关卡、砖块 HP 和球的方向",
"upgrades.clairvoyant.verbose_description": "帮助你选择正确的升级方式,了解坚固砖块的作用。第 2 级和第 3 级将带来更多有用性存疑的知识(可在循环模式中达到)",
"upgrades.coin_magnet.help_plural": "对硬币的影响更强",
"upgrades.coin_magnet.name": "硬币磁铁",
"upgrades.coin_magnet.tooltip": "冰球吸引硬币",
"upgrades.coin_magnet.verbose_description": "将硬币导向冰球。如果硬币已经接近冰球,效果会更强。捕捉到所有硬币可在游戏中获得特殊奖励。\n\n另一种捕捉更多硬币的方法是从底部击打砖块。球的速度和方向会影响产生硬币的速度。",
"upgrades.compound_interest.name": "复利",
"upgrades.compound_interest.tooltip": "每击碎一块砖+{{lvl}} 连击,丢失硬币时重置",
"upgrades.compound_interest.verbose_description": "每打破一块砖,你的连击数就会增加一个,每打破一块砖,就会产生越来越多的硬币。\n\n不过一定要用冰球接住每一枚硬币因为丢失的任何一枚硬币都会重置您的连击。\n\n一旦您的连击数超过最低连击数游戏区域的底部就会出现一条红线提醒您硬币不能放在那里。",
"upgrades.concave_puck.name": "凹面冰球",
"upgrades.concave_puck.tooltip": "提高垂直瞄准精度",
"upgrades.concave_puck.verbose_description": "球在关卡开始时直线上升,反弹角度较小。",
"upgrades.corner_shot.name": "角球射门",
"upgrades.corner_shot.tooltip": "让冰球与屏幕边界重叠",
"upgrades.corner_shot.verbose_description": "有助于在拐角处瞄准。更高的级别可以让你走得更远。",
"upgrades.etherealcoins.name": "太空硬币",
"upgrades.etherealcoins.tooltip": "硬币不再受重力影响",
"upgrades.etherealcoins.verbose_description": "",
"upgrades.extra_levels.name": "再过 5 分钟",
"upgrades.extra_levels.tooltip": "玩 {{count}} 关而不是7关",
"upgrades.extra_levels.verbose_description": "默认游戏最多可持续 7 个关卡,之后游戏结束。\n\n每升一级就能提高一级。最后一关往往是你得分最多的关卡因此差别会非常大。",
"upgrades.extra_life.help_plural": "您的(最后一个)球将弹到底部,而不是丢失({{lvl}} 次)。",
"upgrades.extra_life.name": "额外生活",
"upgrades.extra_life.tooltip": "球会在底线反弹一次,然后就会丢失。",
"upgrades.extra_life.verbose_description": "通常情况下,您只有一个球,一旦掉落,游戏就结束了。\n\n这项功能在屏幕下方增加了一个白色条可以保存一个球并在保存过程中断开。\n\n每当有一个球弹到屏幕底部你就会失去一级特权。",
"upgrades.forgiving.name": "宽容",
"upgrades.forgiving.tooltip": "缺少休息时间会逐渐减少连击次数,而不是一次性减少。",
"upgrades.forgiving.verbose_description": "每级的第一次失误是免费的,然后是连击的 10%,接着是 20%。",
"upgrades.fountain_toss.name": "喷泉抛掷",
"upgrades.fountain_toss.tooltip": "当你错过一些硬币时,可以获得一些连击。",
"upgrades.fountain_toss.verbose_description": "当您错过一枚硬币且您的连击低于 {{max}}时,您的连击概率为 {{lvl}}/连击增长 1。/连击数增加 1。",
"upgrades.ghost_coins.name": "幽灵硬币",
"upgrades.ghost_coins.tooltip": "硬币慢慢穿过砖块",
"upgrades.ghost_coins.verbose_description": "这不是一个错误,而是一个功能! 硬币穿过砖块的速度很慢。级别越高,速度越快。",
"upgrades.helium.name": "氦气",
"upgrades.helium.tooltip": "冰球左右重力反转",
"upgrades.helium.verbose_description": "这会影响硬币,让它们浮起来,直到您准备好拾取它们。",
"upgrades.hot_start.name": "热启动",
"upgrades.hot_start.tooltip": "从连击 {{start}}开始,-每秒{{loss}} 次连击",
"upgrades.hot_start.verbose_description": "在每级开始时,你的连击会从 +30 点开始,但之后每秒会减少一点。该效果可与其他特殊效果叠加。",
"upgrades.implosions.name": "爆破",
"upgrades.implosions.tooltip": "爆炸将硬币吸入而不是炸出",
"upgrades.implosions.verbose_description": "爆炸力是反向作用的。更高的楼层起到 \"更大爆炸 \"的作用",
"upgrades.instant_upgrade.name": "即时升级",
"upgrades.instant_upgrade.tooltip": "现在+1升级游戏结束前-1选择。",
"upgrades.instant_upgrade.verbose_description": "立即选择两项升级,这样你就可以获得一项免费升级和一项用来偿还获得这项福利的升级。以后每次选择升级的菜单可选项都会减少。",
"upgrades.left_is_lava.name": "避免左侧",
"upgrades.left_is_lava.tooltip": "每击碎一块砖块可获得 +{{lvl}} 连击。如果球击中屏幕左侧,连击会重置",
"upgrades.left_is_lava.verbose_description": "每击碎一块砖,您的连击数就会增加一个,这样您就能从接下来击碎的所有砖块中多获得一个硬币。\n\n不过一旦您的球击中左边的砖块您的连击数就会重置。\n\n当您的连击数上升时左侧的砖块就会变成红色提醒您应避免击中它们。\n",
"upgrades.limitless.name": "无限",
"upgrades.limitless.tooltip": "将所有升级的最高等级提高 {{lvl}} ",
"upgrades.limitless.verbose_description": "选择该装备还能将自己的上限提高一个,让你再次选择。",
"upgrades.metamorphosis.name": "变形记",
"upgrades.metamorphosis.tooltip": "每枚硬币可以给 {{lvl}} 块砖染上它的颜色",
"upgrades.metamorphosis.verbose_description": "有了这项功能,硬币就会变成它们所来自的砖块的颜色,并会给它们接触到的第一块砖块染上相同的颜色。\n\n硬币的生成速度与打碎它们的球的速度相同这意味着你可以稍微瞄准一下你想要 \"上色 \"的砖块的方向。",
"upgrades.minefield.name": "雷区",
"upgrades.minefield.tooltip": "屏幕上每块炸弹砖 +{{lvl}} 连击",
"upgrades.minefield.verbose_description": "放置砖块时,连击加成+lvl摧毁砖块时连击加成-lvl并通过砖块数量乘以 lvl 来提升基础连击。",
"upgrades.multiball.name": "多球",
"upgrades.multiball.tooltip": "每关开始时都有 {{count}} 个球。",
"upgrades.multiball.verbose_description": "在 \"突围 71 \"游戏中,只要你掉了球,你就输了。\n\n有了这项福利您可以得到两个球因此您可以承受失去一个球的代价。\n\n失去的球会在下一关重新出现。\n\n拥有一个以上的球就能获得更多特权当然也能更快通关。",
"upgrades.nbricks.name": "严格的样本量",
"upgrades.nbricks.tooltip": "每次冰球反弹正好击中 {{lvl}} 块砖头,可获得+{{lvl}} 连击,否则重置",
"upgrades.nbricks.verbose_description": "您不一定要摧毁这些砖块,但您需要击中它们。被爆炸摧毁的砖块不算数",
"upgrades.one_more_choice.name": "额外选择",
"upgrades.one_more_choice.tooltip": "进一步提升等级后,列表中将增加 {{lvl}} 个选项",
"upgrades.one_more_choice.verbose_description": "每个升级菜单都将增加一个选项。 不会增加可选择的升级次数。",
"upgrades.passive_income.name": "被动收入",
"upgrades.passive_income.tooltip": "+{{lvl}} 连击/砖块,除非冰球在最后 {{time}}秒内移动,否则会重置",
"upgrades.passive_income.verbose_description": "有些福利可以帮助球做你想做的事情,而不需要做任何事情。",
"upgrades.picky_eater.name": "挑食",
"upgrades.picky_eater.tooltip": "每击碎一块砖+{{lvl}} 连击,球颜色改变时重置",
"upgrades.picky_eater.verbose_description": "每当您击碎一块与小球颜色相同的砖块时,您的连击次数就会增加一次。\n如果是不同颜色的砖块球就会变成新的颜色但连击数会重置除非没有与球颜色相同的砖块了。\n一旦您的连击数高于最低连击数错误颜色的砖块就会出现红色边框。\n如果您有多个球每当其中一个球击中砖块时它们都会转换颜色。",
"upgrades.pierce.name": "穿孔",
"upgrades.pierce.tooltip": "冰球反弹后击穿 {{count}} 块砖",
"upgrades.pierce.verbose_description": "通常情况下,球一碰到东西就会弹起。有了这个特殊效果,它的弹跳轨迹将持续长达 3 砖块。\n\n之后它会在第 4 块砖头上弹起,你需要触碰冰球来重置计数器。",
"upgrades.pierce_color.name": "颜色穿刺",
"upgrades.pierce_color.tooltip": "+ 对球颜色的砖块造成{{lvl}} 伤害",
"upgrades.pierce_color.verbose_description": "每当小球击中一块相同颜色的砖块时,它就会毫无阻碍地穿过砖块。\n\n一旦球碰到不同颜色的砖块它就会打破砖块拿走砖块的颜色并反弹。\n\n如果你有坚固的砖块小球仍有可能从相同颜色的砖块上弹起。",
"upgrades.puck_repulse_ball.help_plural": "斥力更大",
"upgrades.puck_repulse_ball.name": "软着陆",
"upgrades.puck_repulse_ball.tooltip": "冰球击退小球",
"upgrades.puck_repulse_ball.verbose_description": "当球接近冰球时,速度会开始减慢,甚至有可能在不接触冰球的情况下反弹。",
"upgrades.reach.name": "自上而下",
"upgrades.reach.tooltip": "触碰最下面一行的 N 块砖会重置连击。否则,+N 连击",
"upgrades.reach.verbose_description": "如果只有一排砖块,或者最下面一排砖块覆盖了游戏的整个宽度,那么这个特权就不起任何作用。否则,击碎最低一排砖块会重置连击,而击碎其他砖块则会增加连击,增加的幅度为最低一排砖块的数量。\n\n最低一排将以红色标示。",
"upgrades.respawn.name": "重生",
"upgrades.respawn.tooltip": "{{percent}}% 的砖块会在 {{delay}}秒后重新生成。",
"upgrades.respawn.verbose_description": "一些粒子效果会让你知道砖块会出现在哪里。",
"upgrades.right_is_lava.name": "避免右侧",
"upgrades.right_is_lava.tooltip": "每块砖头 +{{lvl}} 连击。如果球击中屏幕左侧,连击会重置",
"upgrades.right_is_lava.verbose_description": "每击碎一块砖,您的连击数就会增加一个,这样您就能从接下来击碎的所有砖块中多获得一个硬币。\n\n不过只要您的球击中右侧您的连击数就会重置。\n\n当您的连击数上升时右边的砖块就会变成红色提醒您应避免击中它们。\n",
"upgrades.sacrifice.help_l1": "失去生命能清除所有砖块",
"upgrades.sacrifice.help_over": "失去一条生命 {{lvl}}x 连击后清除所有砖块",
"upgrades.sacrifice.name": "牺牲",
"upgrades.sacrifice.verbose_description": "这可能会让组合非常高。",
"upgrades.sapper.help_plural": "第一块被击碎的 {{lvl}} 砖会变成炸弹。",
"upgrades.sapper.name": "军士",
"upgrades.sapper.tooltip": "第一块砖头碎了就会变成炸弹。",
"upgrades.sapper.verbose_description": "你打碎的第一块砖头不会消失,取而代之的是一块炸弹砖。将球反弹到冰球上可重新获得效果。提升该装备的等级可以让你放置更多的炸弹。\n\n请记住炸弹会影响附近硬币的速度因此过多的爆炸会让您很难捕捉到您辛勤工作的成果。",
"upgrades.shocks.name": "减震器",
"upgrades.shocks.tooltip": "爆炸球碰撞",
"upgrades.shocks.verbose_description": "每当两个球相撞,它们就会交换速度,产生爆炸,并获得额外的速度将它们分开。",
"upgrades.shunt.name": "分流器",
"upgrades.shunt.tooltip": "在各关卡之间保持 {{percent}}%的连击率",
"upgrades.shunt.verbose_description": "如果您也有热启动,则热启动会添加到当前组合中",
"upgrades.side_flip.name": "右手",
"upgrades.side_flip.tooltip": "每块砖块从右侧被击碎时,连击数+{{lvl}} ,否则-{{loss}} 。",
"upgrades.side_flip.verbose_description": "撞击砖块的右侧可获得一次连击,但要避免撞击其左侧,因为这样会消除 2 次连击。从顶部和底部击打没有效果。",
"upgrades.side_kick.name": "左撇子",
"upgrades.side_kick.tooltip": "每从左侧击碎一块砖+{{lvl}} 连击,否则-{{loss}} 连击",
"upgrades.side_kick.verbose_description": "撞击砖块的左侧可获得一次连击,但要避免撞击砖块的右侧,因为这样会消除两次连击。从顶部和底部击打没有效果。",
"upgrades.skip_last.help_plural": "最后 {{lvl}} 块砖头将爆炸。",
"upgrades.skip_last.name": "轻松清理",
"upgrades.skip_last.tooltip": "最后一块砖会爆炸。",
"upgrades.skip_last.verbose_description": "您需要打破所有砖块才能进入下一关。不过,要拿到最后一块砖可能很难。\n\n提前通关会在升级时带来额外的选择。绝不漏掉砖块也非常有益。\n\n因此如果你觉得很难打碎最后一块砖那么多打几次就会有帮助。",
"upgrades.slow_down.name": "球速较慢",
"upgrades.slow_down.tooltip": "球移动更慢",
"upgrades.slow_down.verbose_description": "球的启动速度相对较慢,但每升一级,球的启动速度就会加快一些。\n\n如果您在一个关卡中花费大量时间球速也会加快。\n\n这项功能让您更容易掌握。\n\n每次开始时您都可以通过在菜单中启用儿童模式来获得它。",
"upgrades.smaller_puck.help_plural": "更小的冰球和更高的底座组合",
"upgrades.smaller_puck.name": "更小的冰球",
"upgrades.smaller_puck.tooltip": "同时提供 +5 基础连击",
"upgrades.smaller_puck.verbose_description": "这使得冰球变小,理论上可以让一些角球射门变得更容易,但实际上只是提高了难度。\n\n这就是为什么你在选中这个选项后还能获得每块砖+5金币的额外奖励。",
"upgrades.soft_reset.name": "软重置",
"upgrades.soft_reset.tooltip": "组合重置保持 {{percent}}%。",
"upgrades.soft_reset.verbose_description": "限制组合重置的影响。",
"upgrades.streak_shots.name": "连击",
"upgrades.streak_shots.tooltip": "如果在弹上冰球前打破很多砖块,就能获得更多金币。",
"upgrades.streak_shots.verbose_description": "每击碎一块砖,您的连击数(每块砖的金币数)就会增加一个。\n\n不过只要球碰到你的冰球连击数就会重置为默认值每块砖头只能获得一枚硬币。\n\n一旦你的连击数超过了基础值你的冰球就会变成红色提醒你用球碰到它将会破坏你的连击数。",
"upgrades.sturdy_bricks.name": "坚固的砖块",
"upgrades.sturdy_bricks.tooltip": "+{{lvl}} 砖块 HP+{{percent}}破碎时产生的 % 硬币",
"upgrades.sturdy_bricks.verbose_description": "每升一级,所有砖块都会增加一级 HP。您可以通过 \"千里眼 \"装备查看 HP 数值。获得 \"穿刺 \"装备可以增加球的伤害。该装备每升一级都会增加 50% 的金币。",
"upgrades.telekinesis.help_plural": "对球的影响更强",
"upgrades.telekinesis.name": "遥感",
"upgrades.telekinesis.tooltip": "冰球控制球的轨迹",
"upgrades.telekinesis.verbose_description": "球上升时由你控制。",
"upgrades.top_is_lava.name": "天高任鸟飞",
"upgrades.top_is_lava.tooltip": "每块砖+{{lvl}} 连击,击中顶部后重置",
"upgrades.top_is_lava.verbose_description": "每打破一块砖,您的连击次数就会增加一次。不过,一旦您的球击中屏幕上方,您的连击数就会重置。\n\n当您的连击数超过最低连击数时顶部会出现一个红条提醒您应避免撞击。",
"upgrades.trampoline.name": "蹦床",
"upgrades.trampoline.tooltip": "每次冰球反弹+{{lvl}} 连击,每次反弹在任何边界上-{{lvl}} 连击",
"upgrades.trampoline.verbose_description": "罕见的不增加重置条件的组合升级之一",
"upgrades.trickledown.name": "径流",
"upgrades.trickledown.tooltip": "硬币出现在屏幕顶部。",
"upgrades.trickledown.verbose_description": "它可能会帮助你存下一些硬币。 ",
"upgrades.unbounded.help_no_ceiling": "每块砖+{{lvl}} 组合,没有更多的侧面或天花板",
"upgrades.unbounded.name": "无界",
"upgrades.unbounded.tooltip": "每块砖+{{lvl}} 连击,没有更多的边来保持球在游戏中,危险",
"upgrades.unbounded.verbose_description": "我希望你们已经找到了让球保持在屏幕上的方法。击中边线的惩罚不再适用。2 级以上时,天花板也会消失。这是一项高级福利。",
"upgrades.viscosity.name": "粘度",
"upgrades.viscosity.tooltip": "硬币下落速度减慢",
"upgrades.viscosity.verbose_description": "硬币通常会在重力和爆炸的作用下加速到相当高的速度。\n\n而这项功能会让它们不断减速就像在某种粘性液体中一样。\n\n这样就能更容易地捕捉它们并与影响硬币移动的特效完美结合。",
"upgrades.wind.help_plural": "更强的风力",
"upgrades.wind.name": "风",
"upgrades.wind.tooltip": "冰球位置产生风",
"upgrades.wind.verbose_description": "风力取决于冰球的位置:左风吹左,右风吹右。对球和硬币都有影响。",
"upgrades.yoyo.name": "溜溜球",
"upgrades.yoyo.tooltip": "球落向冰球",
"upgrades.yoyo.verbose_description": "它与心灵遥感相反,在球回落时对其进行控制。",
"upgrades.zen.name": "禅宗",
"upgrades.zen.tooltip": "每个砖块 +{{lvl}} 连击,爆炸时重置",
"upgrades.zen.verbose_description": "毕竟,这是一款非暴力游戏。"
}

View file

@ -13,6 +13,7 @@
content="A breakout game with roguelite mechanics. Break bricks, catch coins, pick upgrades, repeat. Play for free on mobile and desktop." content="A breakout game with roguelite mechanics. Break bricks, catch coins, pick upgrades, repeat. Play for free on mobile and desktop."
/> />
<link rel="manifest" href="./PWA/manifest.json" /> <link rel="manifest" href="./PWA/manifest.json" />
<meta name="theme-color" content="#000000" id="themeColor" />
<style> <style>
@import "game.less"; @import "game.less";
@ -22,11 +23,13 @@
<body> <body>
<button id="menu"><span id="menuLabel">menu</span></button> <button id="menu"><span id="menuLabel">menu</span></button>
<button id="score"></button> <button id="score"></button>
<div id="FPSDisplay"></div> <div id="stats" style="display: none"></div>
<canvas id="game"></canvas> <canvas id="game"></canvas>
<div id="popup"> <div id="popup">
<button id="close-modale"></button> <button id="close-modale"></button>
</div> </div>
<div id="tooltip" style="display: none"></div>
<script type="module"> <script type="module">
import "./game.ts"; import "./game.ts";
</script> </script>

303
src/levelEditor.ts Normal file
View file

@ -0,0 +1,303 @@
import { icons, transformRawLevel } from "./loadGameData";
import { t } from "./i18n/i18n";
import {
commitSettingsChangesToLocalStorage,
getSettingValue,
getTotalScore,
setSettingValue,
} from "./settings";
import { asyncAlert } from "./asyncAlert";
import { Palette, RawLevel } from "./types";
import { levelIconHTML } from "./levelIcon";
import _palette from "./data/palette.json";
import { restart } from "./game";
import { describeLevel } from "./game_utils";
const palette = _palette as Palette;
const MAX_LEVEL_SIZE = 21;
const MIN_LEVEL_SIZE = 2;
export function levelEditorMenuEntry() {
const min = 10000;
const disabled = getTotalScore() < min;
return {
icon: icons["icon:editor"],
text: t("editor.title"),
disabled,
help: disabled ? t("editor.locked", { min }) : t("editor.help"),
async value() {
openLevelEditorLevelsList().then();
},
};
}
async function openLevelEditorLevelsList() {
const rawList = getSettingValue("custom_levels", []) as RawLevel[];
const customLevels = rawList.map(transformRawLevel);
let choice = await asyncAlert({
title: t("editor.title"),
content: [
...customLevels.map((l, li) => ({
text: l.name,
icon: levelIconHTML(l.bricks, l.size, l.color),
value() {
editRawLevelList(li);
},
help: l.credit || describeLevel(l),
})),
{
text: t("editor.new_level"),
icon: icons["icon:editor"],
value() {
rawList.push({
color: "",
size: 6,
bricks: "____________________________________",
name: "custom level" + (rawList.length + 1),
credit: "",
});
setSettingValue("custom_levels", rawList);
editRawLevelList(rawList.length - 1);
},
},
{
text: t("editor.import"),
help: t("editor.import_instruction"),
value() {
const code = prompt(t("editor.import_instruction"))?.trim();
if (code) {
let [name, credit] = code.match(/\[([^\]]+)]/gi);
let bricks = code
.split(name)[1]
.split(credit)[0]
.replace(/\s/gi, "");
name = name.slice(1, -1);
credit = credit.slice(1, -1);
name ||= "Imported on " + new Date().toISOString().slice(0, 10);
credit ||= "";
const size = Math.sqrt(bricks.length);
if (
Math.floor(size) === size &&
size >= MIN_LEVEL_SIZE &&
size <= MAX_LEVEL_SIZE
) {
rawList.push({
color: automaticBackgroundColor(bricks.split("")),
size,
bricks,
name,
credit,
});
setSettingValue("custom_levels", rawList);
}
}
openLevelEditorLevelsList();
},
},
],
});
if (typeof choice == "function") choice();
}
export async function editRawLevelList(nth: number, color = "W") {
let rawList = getSettingValue("custom_levels", []) as RawLevel[];
const level = rawList[nth];
const bricks = level.bricks.split("");
let grid = "";
for (let y = 0; y < level.size; y++) {
grid += '<div style="background: ' + (level.color || "black") + ';">';
for (let x = 0; x < level.size; x++) {
const c = bricks[y * level.size + x];
grid += `<span data-resolve-to="paint_brick:${x}:${y}" style="background: ${palette[c]}">${c == "B" ? "💣" : ""}</span>`;
}
grid += "</div>";
}
const levelColors = new Set(bricks);
levelColors.delete("_");
levelColors.delete("B");
let colorList =
'<div class="palette">' +
Object.entries(palette)
.filter(([key, value]) => key !== "_")
.filter(
([key, value]) =>
levelColors.size < 5 || levelColors.has(key) || key === "B",
)
.map(
([key, value]) =>
`<span data-resolve-to="set_color:${key}" data-selected="${key == color}" style="background: ${value}">${key == "B" ? "💣" : ""}</span>`,
)
.join("") +
"</div>";
const clicked = await asyncAlert<string | null>({
title: t("editor.editing.title", { name: level.name }),
content: [
t("editor.editing.color"),
colorList,
t("editor.editing.help"),
`<div class="gridEdit" style="--grid-size:${level.size};">${grid}</div>`,
{
icon: icons["icon:new_run"],
text: t("editor.editing.play"),
value: "play",
},
{
text: t("editor.editing.rename"),
value: "rename",
help: level.name,
},
{
text: t("editor.editing.credit"),
value: "credit",
help: level.credit,
},
{
text: t("editor.editing.delete"),
value: "delete",
},
{
text: t("editor.editing.copy"),
value: "copy",
help: t("editor.editing.copy_help"),
disabled:
!level.name ||
!level.credit ||
bricks.filter((b) => b !== "_").length < 6,
},
{
text: t("editor.editing.bigger"),
value: "size:+1",
disabled: level.size >= MAX_LEVEL_SIZE,
},
{
text: t("editor.editing.smaller"),
value: "size:-1",
disabled: level.size <= MIN_LEVEL_SIZE,
},
{
text: t("editor.editing.left"),
value: "move:-1:0",
},
{
text: t("editor.editing.right"),
value: "move:1:0",
},
{
text: t("editor.editing.up"),
value: "move:0:-1",
},
{
text: t("editor.editing.down"),
value: "move:0:1",
},
],
});
if (!clicked) return;
if (typeof clicked === "string") {
const [action, a, b] = clicked.split(":");
if (action == "paint_brick") {
const x = parseInt(a),
y = parseInt(b);
bricks[y * level.size + x] =
bricks[y * level.size + x] === color ? "_" : color;
level.bricks = bricks.join("");
}
if (action == "set_color") {
color = a;
}
if (action == "size") {
const newSize = level.size + parseInt(a);
const newBricks = [];
for (let y = 0; y < newSize; y++) {
for (let x = 0; x < newSize; x++) {
newBricks.push(
(x < level.size && y < level.size && bricks[y * level.size + x]) ||
"_",
);
}
}
level.size = newSize;
level.bricks = newBricks.join("");
}
if (action == "move") {
const dx = parseInt(a),
dy = parseInt(b);
const newBricks = [];
for (let y = 0; y < level.size; y++) {
for (let x = 0; x < level.size; x++) {
const tx = x - dx;
const ty = y - dy;
if (tx < 0 || tx >= level.size || ty < 0 || ty >= level.size) {
newBricks.push("_");
} else {
newBricks.push(bricks[ty * level.size + tx]);
}
}
}
level.bricks = newBricks.join("");
}
if (action === "play") {
restart({
level: transformRawLevel(level),
isEditorTrialRun: nth,
perks: {
base_combo: 7,
},
});
return;
}
if (action === "copy") {
let text = "```\n[" + level.name?.replace(/\[|\]/gi, " ") + "]";
bricks.forEach((b, bi) => {
if (!(bi % level.size)) text += "\n";
text += b;
});
text +=
"\n[" +
(level.credit?.replace(/\[|\]/gi, " ") || "Missing credits!") +
"]\n```";
navigator.clipboard.writeText(text);
// return
}
if (action === "rename") {
const name = prompt(t("editor.editing.rename_prompt"), level.name);
if (name) {
level.name = name;
}
}
if (action === "credit") {
const credit = prompt(
t("editor.editing.credit_prompt"),
level.credit || "",
);
if (credit !== "null") {
level.credit = credit || "";
}
}
if (action === "delete") {
rawList = rawList.filter((l, li) => li !== nth);
setSettingValue("custom_levels", rawList);
openLevelEditorLevelsList();
return;
}
}
level.color = automaticBackgroundColor(bricks);
setSettingValue("custom_levels", rawList);
editRawLevelList(nth, color);
}
function automaticBackgroundColor(bricks: string[]) {
return bricks.filter((b) => b === "g").length >
bricks.filter((b) => b !== "_").length * 0.05
? "#115988"
: "";
}

View file

@ -12,7 +12,7 @@ export function levelIconHTML(
levelSize: number, levelSize: number,
color: string, color: string,
) { ) {
const size = 40; const size = 46;
const c = levelIconHTMLCanvas; const c = levelIconHTMLCanvas;
const ctx = levelIconHTMLCanvasCtx; const ctx = levelIconHTMLCanvasCtx;
@ -20,12 +20,8 @@ export function levelIconHTML(
c.width = size; c.width = size;
c.height = size; c.height = size;
if (color) { ctx.clearRect(0, 0, size, size);
ctx.fillStyle = color;
ctx.fillRect(0, 0, size, size);
} else {
ctx.clearRect(0, 0, size, size);
}
const pxSize = size / levelSize; const pxSize = size / levelSize;
for (let x = 0; x < levelSize; x++) { for (let x = 0; x < levelSize; x++) {
for (let y = 0; y < levelSize; y++) { for (let y = 0; y < levelSize; y++) {

View file

@ -33,20 +33,23 @@ body {
& > div { & > div {
display: grid; display: grid;
grid-template-columns: auto auto; grid-template-columns: auto auto;
grid-template-areas: ". name" "buttons bricks"; grid-template-areas: "name credits" "buttons bricks";
.name {
& > *:nth-child(1) {
grid-area: name; grid-area: name;
width: 100px;
}
.credits {
grid-area: credits;
} }
& > div:nth-child(2) { .buttons {
grid-area: buttons; grid-area: buttons;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-end; align-items: flex-end;
} }
& > div:nth-child(3) { .level-bricks-preview {
grid-area: bricks; grid-area: bricks;
} }
} }

View file

@ -1,7 +1,7 @@
import { Palette, RawLevel } from "../types"; import { Level, Palette, RawLevel } from "../types";
import _backgrounds from "../data/backgrounds.json"; import _backgrounds from "../data/backgrounds.json";
import _palette from "../data/palette.json"; import _palette from "../data/palette.json";
import _allLevels from "../data/levels.json"; // import _allLevels from "../data/levels.json";
import { getLevelBackground, hashCode } from "../getLevelBackground"; import { getLevelBackground, hashCode } from "../getLevelBackground";
import { createRoot } from "react-dom/client"; import { createRoot } from "react-dom/client";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
@ -11,28 +11,36 @@ const backgrounds = _backgrounds as string[];
const palette = _palette as Palette; const palette = _palette as Palette;
let allLevels = _allLevels as RawLevel[]; // let allLevels = _allLevels ;
let allLevels = null;
function App() { function App() {
const [selected, setSelected] = useState("W"); const [selected, setSelected] = useState("W");
const [applying, setApplying] = useState(""); const [applying, setApplying] = useState("");
const [levels, setLevels] = useState(allLevels); const [levels, setLevels] = useState([]);
const updateLevel = useCallback( useEffect(() => {
(index: number, change: Partial<RawLevel>) => { fetch("http://localhost:4400/src/data/levels.json")
setLevels((list) => .then((r) => r.json())
list.map((l, li) => (li === index ? { ...l, ...change } : l)), .then((list) => {
); setLevels(list as RawLevel[]);
}, allLevels = list;
[], });
);
const deleteLevel = useCallback((li: number) => {
if (confirm("Delete level")) {
setLevels(allLevels.filter((l, i) => i !== li));
}
}, []); }, []);
const updateLevel = (index: number, change: Partial<RawLevel>) => {
setLevels((list) =>
list.map((l, li) => (li === index ? { ...l, ...change } : l)),
);
};
const deleteLevel = (index: number) => {
if (confirm("Delete level")) {
setLevels(levels.filter((l, i) => i !== index));
}
};
useEffect(() => { useEffect(() => {
if (!allLevels || JSON.stringify(allLevels) === JSON.stringify(levels))
return;
const timoutId = setTimeout(() => { const timoutId = setTimeout(() => {
return fetch("http://localhost:4400/src/data/levels.json", { return fetch("http://localhost:4400/src/data/levels.json", {
method: "POST", method: "POST",
@ -53,7 +61,7 @@ function App() {
> >
<div id={"levels"}> <div id={"levels"}>
{levels.map((level, li) => { {levels.map((level, li) => {
const { name, bricks, size, svg, color } = level; const { name, credit, bricks, size, svg, color } = level;
const brickButtons = []; const brickButtons = [];
for (let x = 0; x < size; x++) { for (let x = 0; x < size; x++) {
@ -97,11 +105,19 @@ function App() {
return ( return (
<div key={li}> <div key={li}>
<input <input
className={"name"}
type="text" type="text"
value={name} value={name}
onChange={(e) => updateLevel(li, { name: e.target.value })} onChange={(e) => updateLevel(li, { name: e.target.value })}
/> />
<div> <input
className={"credit"}
type="text"
value={credit || ""}
onChange={(e) => updateLevel(li, { credit: e.target.value })}
/>
<div className={"buttons"}>
<button onClick={() => deleteLevel(li)}>Delete</button> <button onClick={() => deleteLevel(li)}>Delete</button>
<button onClick={() => updateLevel(li, resizeLevel(level, -1))}> <button onClick={() => updateLevel(li, resizeLevel(level, -1))}>
- -

View file

@ -1,6 +1,7 @@
import _palette from "./data/palette.json"; import _palette from "./data/palette.json";
import _rawLevelsList from "./data/levels.json"; import _rawLevelsList from "./data/levels.json";
import _appVersion from "./data/version.json"; import _appVersion from "./data/version.json";
import { rawUpgrades } from "./upgrades";
describe("json data checks", () => { describe("json data checks", () => {
it("_rawLevelsList has icon levels", () => { it("_rawLevelsList has icon levels", () => {
@ -8,6 +9,14 @@ describe("json data checks", () => {
_rawLevelsList.filter((l) => l.name.startsWith("icon:")).length, _rawLevelsList.filter((l) => l.name.startsWith("icon:")).length,
).toBeGreaterThan(10); ).toBeGreaterThan(10);
}); });
it("all upgrades have icons", () => {
const missingIcon = rawUpgrades.filter(
(u) => !_rawLevelsList.find((l) => l.name == "icon:" + u.id),
);
expect(missingIcon).toEqual([]);
});
it("_rawLevelsList has non-icon few levels", () => { it("_rawLevelsList has non-icon few levels", () => {
expect( expect(
_rawLevelsList.filter((l) => !l.name.startsWith("icon:")).length, _rawLevelsList.filter((l) => !l.name.startsWith("icon:")).length,
@ -19,9 +28,9 @@ describe("json data checks", () => {
.filter((l) => { .filter((l) => {
const uniqueBricks = l.bricks const uniqueBricks = l.bricks
.split("") .split("")
.filter((b) => b !== "_" && b !== "black") .filter((b) => b !== "_" && b !== "B")
.filter((a, b, c) => c.indexOf(a) === b); .filter((a, b, c) => c.indexOf(a) === b);
return uniqueBricks.length > 5; return uniqueBricks.length > 5 && !l.name.startsWith("icon:");
}) })
.map((l) => l.name); .map((l) => l.name);
expect(levelsWithManyBrickColors).toEqual([]); expect(levelsWithManyBrickColors).toEqual([]);
@ -29,6 +38,18 @@ describe("json data checks", () => {
it("Has a few colors", () => { it("Has a few colors", () => {
expect(Object.keys(_palette).length).toBeGreaterThan(10); expect(Object.keys(_palette).length).toBeGreaterThan(10);
}); });
it("Avoids dark bricks on dark bg", () => {
const levelsWithDarkBricksAndBG = _rawLevelsList
.filter((l) => !l.color && !l.name.match(/^icon:/))
.map((l) => ({
name: l.name,
bricks: l.bricks.split("").filter((c) => c !== "_").length,
darkBricks: l.bricks.split("").filter((c) => c === "g").length,
}))
.filter((l) => l.darkBricks > 0.05 * l.bricks);
expect(levelsWithDarkBricksAndBG).toEqual([]);
});
it("Has an _appVersion", () => { it("Has an _appVersion", () => {
expect(parseInt(_appVersion)).toBeGreaterThan(2000); expect(parseInt(_appVersion)).toBeGreaterThan(2000);
}); });

View file

@ -14,32 +14,32 @@ export const appVersion = _appVersion as string;
export const icons = {} as { [k: string]: string }; export const icons = {} as { [k: string]: string };
export const allLevels = rawLevelsList export function transformRawLevel(level: RawLevel) {
.map((level) => { const bricks = level.bricks
const bricks = level.bricks .split("")
.split("") .map((c) => palette[c])
.map((c) => palette[c]) .slice(0, level.size * level.size);
.slice(0, level.size * level.size); const bricksCount = bricks.filter((i) => i).length;
const icon = levelIconHTML(bricks, level.size, level.color); const icon = levelIconHTML(bricks, level.size, level.color);
icons[level.name] = icon; icons[level.name] = icon;
return { return {
...level, ...level,
bricks, bricks,
icon, bricksCount,
svg: getLevelBackground(level), icon,
}; color: level.color || "#000000",
}) svg: getLevelBackground(level),
.filter((l) => !l.name.startsWith("icon:")) sortKey: ((Math.random() + 3) / 3.5) * bricksCount,
.map((l, li) => ({ };
...l, }
threshold:
li < 8 export const allLevelsAndIcons = rawLevelsList.map(
? 0 transformRawLevel,
: Math.round( ) as Level[];
Math.min(Math.pow(10, 1 + (li + l.size) / 30) * 10, 5000) * li,
), export const allLevels = allLevelsAndIcons.filter(
sortKey: ((Math.random() + 3) / 3.5) * l.bricks.filter((i) => i).length, (l) => !l.name.startsWith("icon:"),
})) as Level[]; );
export const upgrades = rawUpgrades.map((u) => ({ export const upgrades = rawUpgrades.map((u) => ({
...u, ...u,

143
src/migrations.ts Normal file
View file

@ -0,0 +1,143 @@
import { RunHistoryItem } from "./types";
import _appVersion from "./data/version.json";
import { generateSaveFileContent } from "./generateSaveFileContent";
import { getLevelUnlockCondition, reasonLevelIsLocked } from "./game_utils";
import { allLevels } from "./loadGameData";
import { toast } from "./toast";
// The page will be reloaded if any migrations were run
let migrationsRun = 0;
function migrate(name: string, cb: () => void) {
if (!localStorage.getItem(name)) {
try {
cb();
console.debug("Ran migration : " + name);
localStorage.setItem(name, "" + Date.now());
migrationsRun++;
} catch (e) {
toast((e as Error).message);
console.warn("Migration " + name + " failed : ", e);
}
}
}
function afterMigration() {
// Avoid a boot loop by setting the hash before reloading
// We can't set the query string as it is used for other things
if (migrationsRun && !window.location.hash) {
window.location.hash = "#reloadAfterMigration";
window.location.reload();
}
if (!migrationsRun) {
window.location.hash = "";
}
}
migrate("save_data_before_upgrade_to_" + _appVersion, () => {
localStorage.setItem(
"recovery_data",
JSON.stringify(generateSaveFileContent()),
);
});
migrate("migrate_high_scores", () => {
const old = localStorage.getItem("breakout-3-hs");
if (old) {
localStorage.setItem("breakout-3-hs-short", old);
localStorage.removeItem("breakout-3-hs");
}
});
migrate("recover_high_scores", () => {
let runsHistory = JSON.parse(
localStorage.getItem("breakout_71_runs_history") || "[]",
) as RunHistoryItem[];
runsHistory.forEach((r) => {
const currentHS = parseInt(
localStorage.getItem("breakout-3-hs-" + (r.mode || "short")) || "0",
);
if (r.score > currentHS) {
localStorage.setItem(
"breakout-3-hs-" + (r.mode || "short"),
"" + r.score,
);
}
});
});
migrate("remove_long_and_creative_mode_data", () => {
let runsHistory = JSON.parse(
localStorage.getItem("breakout_71_runs_history") || "[]",
) as RunHistoryItem[];
let cleaned = runsHistory.filter((r) => {
if (!r.perks) return false;
if ("mode" in r) {
if (r.mode !== "short") {
return false;
}
}
return true;
});
if (cleaned.length !== runsHistory.length)
localStorage.setItem("breakout_71_runs_history", JSON.stringify(cleaned));
});
migrate("compact_runs_data_again", () => {
let runsHistory = JSON.parse(
localStorage.getItem("breakout_71_runs_history") || "[]",
) as RunHistoryItem[];
runsHistory = runsHistory.filter((r) => {
if (!r.perks) return false;
if ("mode" in r) {
if (r.mode !== "short") {
return false;
}
delete r.mode;
}
return true;
});
runsHistory.forEach((r) => {
r.runTime = Math.round(r.runTime);
if (r.perks) {
for (let key in r.perks) {
if (!r.perks[key]) {
delete r.perks[key];
}
}
}
if ("best_level_score" in r) {
delete r.best_level_score;
}
if ("worst_level_score" in r) {
delete r.worst_level_score;
}
});
localStorage.setItem("breakout_71_runs_history", JSON.stringify(runsHistory));
});
migrate("set_breakout_71_unlocked_levels" + _appVersion, () => {
// We want to lock any level unlocked by an app upgrade too
let runsHistory = JSON.parse(
localStorage.getItem("breakout_71_runs_history") || "[]",
) as RunHistoryItem[];
let breakout_71_unlocked_levels = JSON.parse(
localStorage.getItem("breakout_71_unlocked_levels") || "[]",
) as string[];
allLevels
.filter((l, li) => !reasonLevelIsLocked(li, runsHistory, false))
.forEach((l) => {
if (!breakout_71_unlocked_levels.includes(l.name)) {
breakout_71_unlocked_levels.push(l.name);
}
});
localStorage.setItem(
"breakout_71_unlocked_levels",
JSON.stringify(breakout_71_unlocked_levels),
);
});
afterMigration();

View file

@ -0,0 +1,53 @@
import { GameState, UpgradeLike } from "./types";
import { getSettingValue, setSettingValue } from "./settings";
import { allLevels, icons } from "./loadGameData";
import { getLevelUnlockCondition } from "./game_utils";
import { t } from "./i18n/i18n";
import { toast } from "./toast";
import { schedulGameSound } from "./gameStateMutators";
let list: {
minScore: number;
forbidden: UpgradeLike[];
required: UpgradeLike[];
}[];
let unlocked = new Set(
getSettingValue("breakout_71_unlocked_levels", []) as string[],
);
export function monitorLevelsUnlocks(gameState: GameState) {
if (gameState.creative) return;
if (!list) {
list = allLevels.map((l, li) => ({
name: l.name,
li,
l,
...getLevelUnlockCondition(li),
}));
}
list.forEach(({ name, minScore, forbidden, required, l }) => {
// Already unlocked
if (unlocked.has(name)) return;
// Score not reached yet
if (gameState.score < minScore) return;
if (!minScore) return;
if (gameState.score < minScore) return;
// We are missing a required perk
if (required.find((id) => !gameState.perks[id])) return;
// We have a forbidden perk
if (forbidden.find((id) => gameState.perks[id])) return;
// Level just got unlocked
unlocked.add(name);
setSettingValue(
"breakout_71_unlocked_levels",
getSettingValue("breakout_71_unlocked_levels", []).concat([name]),
);
toast(icons[name] + "<strong>" + t("unlocks.just_unlocked") + "</strong>");
schedulGameSound(gameState, "colorChange", 0, 1);
});
}

View file

@ -1,46 +1,87 @@
import { GameState, RunParams } from "./types"; import { GameState, PerkId, RunParams } from "./types";
import { getTotalScore } from "./settings"; import { allLevels, allLevelsAndIcons, upgrades } from "./loadGameData";
import { allLevels, upgrades } from "./loadGameData";
import { import {
defaultSounds, defaultSounds,
getHighScore,
getPossibleUpgrades, getPossibleUpgrades,
highScoreText,
reasonLevelIsLocked,
makeEmptyPerksMap, makeEmptyPerksMap,
sumOfKeys, sumOfValues,
} from "./game_utils"; } from "./game_utils";
import { dontOfferTooSoon, resetBalls } from "./gameStateMutators"; import { dontOfferTooSoon, resetBalls } from "./gameStateMutators";
import { isOptionOn } from "./options"; import { isOptionOn } from "./options";
import { getHistory } from "./gameOver";
import { getSettingValue, getTotalScore } from "./settings";
import { isBlackListedForStart, isStartingPerk } from "./startingPerks";
export function newGameState(params: RunParams): GameState { export function getRunLevels(
const totalScoreAtRunStart = getTotalScore(); params: RunParams,
randomGift: PerkId | undefined,
) {
const unlockedBefore = new Set(
getSettingValue("breakout_71_unlocked_levels", []),
);
const history = getHistory();
const unlocked = allLevels.filter(
(l, li) =>
unlockedBefore.has(l.name) || !reasonLevelIsLocked(li, history, false),
);
const firstLevel = params?.level const firstLevel = params?.level
? allLevels.filter((l) => l.name === params?.level) ? [params.level]
: []; : allLevelsAndIcons.filter((l) => l.name == "icon:" + randomGift);
const restInRandomOrder = allLevels const restInRandomOrder = unlocked
.filter((l) => totalScoreAtRunStart >= l.threshold) .filter((l) => l.name !== params?.level?.name)
.filter((l) => l.name !== params?.level)
.filter((l) => l.name !== params?.levelToAvoid) .filter((l) => l.name !== params?.levelToAvoid)
.sort(() => Math.random() - 0.5); .sort(() => Math.random() - 0.5);
const runLevels = firstLevel.concat( return firstLevel
restInRandomOrder.slice(0, 7 + 3).sort((a, b) => a.sortKey - b.sortKey), .concat(
); restInRandomOrder.slice(0, 7 + 3).sort((a, b) => a.sortKey - b.sortKey),
)
.concat(restInRandomOrder.slice(7 + 3));
}
export function newGameState(params: RunParams): GameState {
const highScore = getHighScore();
const perks = { ...makeEmptyPerksMap(upgrades), ...(params?.perks || {}) }; const perks = { ...makeEmptyPerksMap(upgrades), ...(params?.perks || {}) };
let randomGift: PerkId | undefined = undefined;
if (!sumOfValues(perks)) {
let giftable = upgrades.filter((u) => isStartingPerk(u));
if (!giftable.length) {
giftable = upgrades.filter((u) => !isBlackListedForStart(u));
}
randomGift =
(isOptionOn("easy") && "slow_down") ||
giftable[Math.floor(Math.random() * giftable.length)].id;
perks[randomGift] = 1;
}
const runLevels = getRunLevels(params, randomGift);
const gameState: GameState = { const gameState: GameState = {
startParams: params,
runLevels, runLevels,
level: runLevels[0],
currentLevel: 0, currentLevel: 0,
upgradesOfferedFor: -1, upgradesOfferedFor: -1,
perks, perks,
puckWidth: 200, puckWidth: 200,
baseSpeed: 12, baseSpeed: 12,
combo: 1, combo: 1,
lastCombo: 1,
gridSize: 12, gridSize: 12,
running: false, running: false,
isGameOver: false, isGameOver: false,
ballStickToPuck: true, ballStickToPuck: true,
puckPosition: 400, puckPosition: 400,
lastPuckPosition: 400,
lastPuckMove: 0,
pauseTimeout: null, pauseTimeout: null,
canvasWidth: 0, canvasWidth: 0,
canvasHeight: 0, canvasHeight: 0,
@ -53,24 +94,25 @@ export function newGameState(params: RunParams): GameState {
score: 0, score: 0,
lastScoreIncrease: -1000, lastScoreIncrease: -1000,
lastExplosion: -1000, lastExplosion: -1000,
highScore: parseFloat(localStorage.getItem("breakout-3-hs") || "0"), lastBrickBroken: 0,
highScore,
balls: [], balls: [],
ballsColor: "white", ballsColor: "#FFFFFF",
bricks: [], bricks: [],
brickHP: [],
lights: { indexMin: 0, total: 0, list: [] }, lights: { indexMin: 0, total: 0, list: [] },
particles: { indexMin: 0, total: 0, list: [] }, particles: { indexMin: 0, total: 0, list: [] },
texts: { indexMin: 0, total: 0, list: [] }, texts: { indexMin: 0, total: 0, list: [] },
coins: { indexMin: 0, total: 0, list: [] }, coins: { indexMin: 0, total: 0, list: [] },
respawns: { indexMin: 0, total: 0, list: [] },
levelStartScore: 0, levelStartScore: 0,
levelMisses: 0, levelMisses: 0,
levelSpawnedCoins: 0, levelSpawnedCoins: 0,
lastPlayedCoinGrab: 0, puckColor: "#FFFFFF",
puckColor: "#FFF",
ballSize: 20, ballSize: 20,
coinSize: 14, coinSize: 14,
puckHeight: 20, puckHeight: 20,
totalScoreAtRunStart,
isCreativeModeRun: sumOfKeys(perks) > 1,
pauseUsesDuringRun: 0, pauseUsesDuringRun: 0,
keyboardPuckSpeed: 0, keyboardPuckSpeed: 0,
lastTick: performance.now(), lastTick: performance.now(),
@ -88,7 +130,6 @@ export function newGameState(params: RunParams): GameState {
wall_bounces: 0, wall_bounces: 0,
upgrades_picked: 1, upgrades_picked: 1,
max_combo: 1, max_combo: 1,
max_level: 0,
}, },
lastOffered: {}, lastOffered: {},
levelTime: 0, levelTime: 0,
@ -97,19 +138,16 @@ export function newGameState(params: RunParams): GameState {
needsRender: true, needsRender: true,
autoCleanUses: 0, autoCleanUses: 0,
...defaultSounds(), ...defaultSounds(),
rerolls: 0,
creative:
params?.computer_controlled ||
sumOfValues(params.perks) > 1 ||
(params.level && !params.level.name.startsWith("icon:")),
}; };
resetBalls(gameState); resetBalls(gameState);
if (!sumOfKeys(gameState.perks)) {
const giftable = getPossibleUpgrades(gameState).filter((u) => u.giftable);
const randomGift =
(isOptionOn("easy") && "slow_down") ||
giftable[Math.floor(Math.random() * giftable.length)].id;
perks[randomGift] = 1;
dontOfferTooSoon(gameState, randomGift);
}
for (let perk of upgrades) { for (let perk of upgrades) {
if (gameState.perks[perk.id]) { if (perks[perk.id]) {
dontOfferTooSoon(gameState, perk.id); dontOfferTooSoon(gameState, perk.id);
} }
} }

98
src/openScorePanel.ts Normal file
View file

@ -0,0 +1,98 @@
import { GameState } from "./types";
import { asyncAlert } from "./asyncAlert";
import { t } from "./i18n/i18n";
import {
getLevelUnlockCondition,
levelsListHTMl,
max_levels,
pickedUpgradesHTMl,
reasonLevelIsLocked,
} from "./game_utils";
import { getCreativeModeWarning, getHistory } from "./gameOver";
import { pause } from "./game";
import { allLevels, icons } from "./loadGameData";
import { firstWhere } from "./pure_functions";
import { getSettingValue, getTotalScore } from "./settings";
export async function openScorePanel(gameState: GameState) {
pause(true);
await asyncAlert({
title: t("score_panel.title", {
score: gameState.score,
level: gameState.currentLevel + 1,
max: max_levels(gameState),
}),
content: [
getCreativeModeWarning(gameState),
pickedUpgradesHTMl(gameState),
levelsListHTMl(gameState, gameState.currentLevel),
getNearestUnlockHTML(gameState),
gameState.rerolls
? t("score_panel.rerolls_count", { rerolls: gameState.rerolls })
: "",
],
allowClose: true,
});
}
export function getNearestUnlockHTML(gameState: GameState) {
if (gameState.creative) return "";
const unlocked = new Set(getSettingValue("breakout_71_unlocked_levels", []));
const firstUnlockable = firstWhere(allLevels, (l, li) => {
if (unlocked.has(l.name)) return;
const reason = reasonLevelIsLocked(li, getHistory(), false);
if (!reason) return;
const { minScore, forbidden, required } = getLevelUnlockCondition(li);
const missing = required.filter((u) => !gameState?.perks?.[u.id]);
// we can't have a forbidden perk
if (forbidden.find((u) => gameState?.perks?.[u.id])) {
return;
}
// All required upgrades need to be unlocked
if (missing.find((u) => u.threshold > getTotalScore())) {
return;
}
return {
l,
li,
minScore,
forbidden,
required,
missing,
reason,
};
});
if (!firstUnlockable) return "";
let missingPoints = Math.max(0, firstUnlockable.minScore - gameState.score);
let missingUpgrades = firstUnlockable.missing.map((u) => u.name).join(", ");
const title =
(missingUpgrades &&
t("score_panel.get_upgrades_to_unlock", {
missingUpgrades,
points: missingPoints,
level: firstUnlockable.l.name,
})) ||
t("score_panel.score_to_unlock", {
points: missingPoints,
level: firstUnlockable.l.name,
});
return `
<p>${t("score_panel.close_to_unlock")}</p>
<div class="upgrade used">
${icons[firstUnlockable.l.name]}
<p>
<strong>${title}</strong>
${firstUnlockable.reason?.text}
</p>
</div>
`;
}

View file

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

87
src/pure_functions.ts Normal file
View file

@ -0,0 +1,87 @@
import { getSettingValue } from "./settings";
export function clamp(value: number, min: number, max: number) {
return Math.max(min, Math.min(value, max));
}
export function comboKeepingRate(level: number) {
return clamp(1 - (1 / (1 + level)) * 1.5, 0, 1);
}
export function hoursSpentPlaying() {
try {
const timePlayed = getSettingValue("breakout_71_total_play_time", 0);
return Math.floor(timePlayed / 1000 / 60 / 60);
} catch (e) {
return 0;
}
}
export function miniMarkDown(md: string) {
let html: { tagName: string; text: string }[] = [];
let lastNode: { tagName: string; text: string } | null = null;
md.split("\n").forEach((line) => {
const titlePrefix = line.match(/^#+ /)?.[0];
if (titlePrefix) {
if (lastNode) html.push(lastNode);
lastNode = {
tagName: "h" + (titlePrefix.length - 1),
text: line.slice(titlePrefix.length),
};
} else if (line.startsWith("- ")) {
if (lastNode?.tagName !== "ul") {
if (lastNode) html.push(lastNode);
lastNode = { tagName: "ul", text: "" };
}
lastNode.text += "<li>" + line.slice(2) + "</li>";
} else if (!line.trim()) {
if (lastNode) html.push(lastNode);
lastNode = null;
} else {
if (lastNode?.tagName !== "p") {
if (lastNode) html.push(lastNode);
lastNode = { tagName: "p", text: "" };
}
lastNode.text += line + " ";
}
});
if (lastNode) {
html.push(lastNode);
}
return html
.map(
(h) =>
"<" +
h.tagName +
">" +
h.text.replace(
/\bhttps?:\/\/[^\s<>]+/gi,
(a) => `<a href="${a}">${a}</a>`,
) +
"</" +
h.tagName +
">",
)
.join("\n");
}
export function firstWhere<Input, Output>(
arr: Input[],
mapper: (item: Input, index: number) => Output | undefined,
): Output | undefined {
for (let i = 0; i < arr.length; i++) {
const result = mapper(arr[i], i);
if (typeof result !== "undefined") return result;
}
}
export const wallBouncedBest = 3,
wallBouncedGood = 10,
levelTimeBest = 30,
levelTimeGood = 60,
catchRateBest = 95,
catchRateGood = 90,
missesBest = 3,
missesGood = 6;

View file

@ -1,9 +1,10 @@
import { gameCanvas } from "./render"; import { gameCanvas } from "./render";
import { max_levels } from "./game_utils"; import { isInWebView, max_levels } from "./game_utils";
import { getAudioRecordingTrack } from "./sounds"; import { getAudioRecordingTrack } from "./sounds";
import { t } from "./i18n/i18n"; import { t } from "./i18n/i18n";
import { GameState } from "./types"; import { GameState } from "./types";
import { isOptionOn } from "./options"; import { isOptionOn } from "./options";
import { toast } from "./toast";
let mediaRecorder: MediaRecorder | null, let mediaRecorder: MediaRecorder | null,
captureStream: MediaStream, captureStream: MediaStream,
@ -40,7 +41,7 @@ export function drawMainCanvasOnSmallCanvas(gameState: GameState) {
); );
// Here we don't use drawText as we don't want to cache a picture for each distinct value of score // Here we don't use drawText as we don't want to cache a picture for each distinct value of score
recordCanvasCtx.fillStyle = "#FFF"; recordCanvasCtx.fillStyle = "#FFFFFF";
recordCanvasCtx.textBaseline = "top"; recordCanvasCtx.textBaseline = "top";
recordCanvasCtx.font = "12px monospace"; recordCanvasCtx.font = "12px monospace";
recordCanvasCtx.textAlign = "right"; recordCanvasCtx.textAlign = "right";
@ -88,6 +89,7 @@ export function startRecordingGame(gameState: GameState) {
const recordedChunks: Blob[] = []; const recordedChunks: Blob[] = [];
const instance = new MediaRecorder(captureStream, { const instance = new MediaRecorder(captureStream, {
// Required for less mushy result
videoBitsPerSecond: 3500000, videoBitsPerSecond: 3500000,
}); });
mediaRecorder = instance; mediaRecorder = instance;
@ -107,6 +109,7 @@ export function startRecordingGame(gameState: GameState) {
) { ) {
await new Promise((r) => setTimeout(r, 200)); await new Promise((r) => setTimeout(r, 200));
} }
const video = document.createElement("video"); const video = document.createElement("video");
video.autoplay = true; video.autoplay = true;
video.controls = false; video.controls = false;
@ -124,13 +127,13 @@ export function startRecordingGame(gameState: GameState) {
const a = document.createElement("a"); const a = document.createElement("a");
a.download = captureFileName("webm"); a.download = captureFileName("webm");
a.target = "_blank"; a.target = "_blank";
if (window.location.href.endsWith("index.html?isInWebView=true")) {
if (isInWebView) {
a.href = await blobToBase64(blob); a.href = await blobToBase64(blob);
} else { } else {
a.href = video.src; a.href = video.src;
} }
a.textContent = t("settings.record_download", {
a.textContent = t("main_menu.record_download", {
size: (blob.size / 1000000).toFixed(2), size: (blob.size / 1000000).toFixed(2),
}); });
targetDiv.appendChild(a); targetDiv.appendChild(a);
@ -144,8 +147,10 @@ function blobToBase64(blob: Blob): Promise<string> {
reader.onload = function () { reader.onload = function () {
resolve(reader.result); resolve(reader.result);
}; };
reader.onerror = function (e) { reader.onerror = function () {
const e = reader.error;
console.error(e); console.error(e);
toast(e?.message || "Failed to convert the video to a data url");
reject(new Error("Failed to readAsDataURL of the video ")); reject(new Error("Failed to readAsDataURL of the video "));
}; };

File diff suppressed because it is too large Load diff

95
src/runHistoryViewer.ts Normal file
View file

@ -0,0 +1,95 @@
import { getHistory } from "./gameOver";
import { icons } from "./loadGameData";
import { t } from "./i18n/i18n";
import { asyncAlert } from "./asyncAlert";
import { rawUpgrades } from "./upgrades";
export function runHistoryViewerMenuEntry() {
const history = getHistory();
return {
icon: icons["icon:history"],
text: t("history.title"),
disabled: history.length < 10,
help:
history.length < 10
? t("history.locked")
: t("history.help", { count: history.length }),
async value() {
let sort = 0;
let sortDir = -1;
let columns = [
{
label: t("history.columns.started"),
field: (r) => r.started,
render(v) {
return new Date(v).toISOString().slice(0, 10);
},
},
{
label: t("history.columns.score"),
field: (r) => r.score,
},
...rawUpgrades.map((u) => ({
label: icons["icon:" + u.id],
tooltip: u.name,
field: (r) => r.perks?.[u.id] || 0,
render(v) {
if (!v) return "-";
return v;
},
})),
];
while (true) {
const header = columns
.map(
(c, ci) =>
`<th data-tooltip="${c.tooltip || ""}" data-resolve-to="sort:${ci}">${c.label}</th>`,
)
.join("");
const toString = (v) => v.toString();
const tbody = history
.sort(
(a, b) =>
sortDir * (columns[sort].field(a) - columns[sort].field(b)),
)
.map(
(h) =>
"<tr>" +
columns
.map((c) => {
const value = c.field(h) ?? 0;
const render = c.render || toString;
return "<td>" + render(value) + "</td>";
})
.join("") +
"</tr>",
)
.join("");
const result = await asyncAlert({
title: t("history.title"),
className: "history",
content: [
`
<table>
<thead><tr>${header}</tr></thead>
<tbody>${tbody}</tbody>
</table>
`,
],
});
if (!result) return;
if (result.startsWith("sort:")) {
const newSort = parseInt(result.split(":")[1]);
if (newSort == sort) {
sortDir *= -1;
} else {
sortDir = -1;
sort = newSort;
}
}
}
},
};
}

View file

@ -1,51 +1,84 @@
// Settings // Settings
import { GameState } from "./types"; import { toast } from "./toast";
let cachedSettings: { [key: string]: unknown } = {}; let cachedSettings: { [key: string]: unknown } = {};
let warnedUserAboutLSIssue = false;
export function getSettingValue<T>(key: string, defaultValue: T) { try {
if (typeof cachedSettings[key] == "undefined") { for (let key in localStorage) {
try { try {
const ls = localStorage.getItem(key); cachedSettings[key] = JSON.parse(localStorage.getItem(key) || "null");
if (ls) cachedSettings[key] = JSON.parse(ls) as T;
} catch (e) { } catch (e) {
if (!warnedUserAboutLSIssue) {
warnedUserAboutLSIssue = true;
toast(`Storage issue : ${(e as Error)?.message}`);
}
console.warn(e); console.warn(e);
} }
} }
} catch (e) {
console.warn(e);
}
export function getSettingValue<T>(key: string, defaultValue: T) {
return (cachedSettings[key] as T) ?? defaultValue; return (cachedSettings[key] as T) ?? defaultValue;
} }
// We avoid using localstorage synchronously for perf reasons
let needsSaving: Set<string> = new Set();
export function setSettingValue<T>(key: string, value: T) { export function setSettingValue<T>(key: string, value: T) {
needsSaving.add(key);
cachedSettings[key] = value; cachedSettings[key] = value;
}
export function commitSettingsChangesToLocalStorage() {
try { try {
localStorage.setItem(key, JSON.stringify(value)); for (let key of needsSaving) {
localStorage.setItem(key, JSON.stringify(cachedSettings[key]));
}
needsSaving.clear();
} catch (e) { } catch (e) {
if (!warnedUserAboutLSIssue) {
warnedUserAboutLSIssue = true;
toast(`Storage issue : ${(e as Error)?.message}`);
}
console.warn(e); console.warn(e);
} }
} }
setInterval(() => commitSettingsChangesToLocalStorage(), 500);
export function getTotalScore() { export function getTotalScore() {
return getSettingValue("breakout_71_total_score", 0); return getSettingValue("breakout_71_total_score", 0);
} }
export function addToTotalScore(gameState: GameState, points: number) { export function getCurrentMaxCoins() {
if (gameState.isCreativeModeRun) return; return Math.pow(2, getSettingValue("max_coins", 2)) * 200;
setSettingValue("breakout_71_total_score", getTotalScore() + points);
} }
export function getCurrentMaxCoins() {
return Math.pow(2, getSettingValue("max_coins", 1)) * 200;
}
export function getCurrentMaxParticles() { export function getCurrentMaxParticles() {
return Math.pow(2, getSettingValue("max_particles", 1)) * 200; return getCurrentMaxCoins();
} }
export function cycleMaxCoins() { export function cycleMaxCoins() {
setSettingValue("max_coins", (getSettingValue("max_coins", 1) + 1) % 6); setSettingValue("max_coins", (getSettingValue("max_coins", 2) + 1) % 7);
} }
export function cycleMaxParticles() {
setSettingValue( let asked = false;
"max_particles",
(getSettingValue("max_particles", 1) + 1) % 6, export async function askForPersistentStorage() {
); if (asked) return;
asked = true;
if (!navigator.storage) return;
if (!navigator.storage.persist) return;
if (!navigator.storage.persisted) return;
if (await navigator.storage.persisted()) {
return;
}
const persistent = await navigator.storage.persist();
if (!persistent) {
console.warn("No storage granted");
}
} }

View file

@ -16,7 +16,8 @@ export function playPendingSounds(gameState: GameState) {
}; };
if (ex.vol) { if (ex.vol) {
sounds[soundName]( sounds[soundName](
Math.min(2, ex.vol), // In stress test, dim the sounds but play them
Math.min(1, ex.vol),
pixelsToPan(gameState, ex.x), pixelsToPan(gameState, ex.x),
gameState.combo, gameState.combo,
); );
@ -25,13 +26,21 @@ export function playPendingSounds(gameState: GameState) {
} }
} }
export const sounds = { export const sounds = {
wallBeep: (vol: number, pan: number, combo: number) => { wallBeep: (volume: number, pan: number) => {
if (!isOptionOn("sound")) return; if (!isOptionOn("sound")) return;
createSingleBounceSound(800, pan, vol);
createSingleBounceSound(800, pan, volume);
},
plouf: (volume: number, pan: number) => {
if (!isOptionOn("sound")) return;
createSingleBounceSound(500, pan, volume * 0.5);
// createWaterDropSound(800, pan, volume*0.2, 0.2,'triangle')
}, },
comboIncreaseMaybe: (volume: number, pan: number, combo: number) => { comboIncreaseMaybe: (volume: number, pan: number, combo: number) => {
if (!isOptionOn("sound")) return; if (!isOptionOn("sound")) return;
let delta = 0; let delta = 0;
if (!isNaN(lastComboPlayed)) { if (!isNaN(lastComboPlayed)) {
if (lastComboPlayed < combo) delta = 1; if (lastComboPlayed < combo) delta = 1;
@ -49,6 +58,16 @@ export const sounds = {
if (!isOptionOn("sound")) return; if (!isOptionOn("sound")) return;
createSingleBounceSound(1200, pan, volume, 0.1, "triangle"); createSingleBounceSound(1200, pan, volume, 0.1, "triangle");
}, },
// void: (volume: number, pan: number) => {
// if (!isOptionOn("sound")) return;
// createSingleBounceSound(1200, pan, volume, 0.5, "sawtooth");
// createSingleBounceSound(600, pan, volume, 0.3, "sawtooth");
// },
// freeze: (volume: number, pan: number) => {
// if (!isOptionOn("sound")) return;
// createSingleBounceSound(220, pan, volume, 0.5, "square");
// createSingleBounceSound(440, pan, volume, 0.5, "square");
// },
explode: (volume: number, pan: number, combo: number) => { explode: (volume: number, pan: number, combo: number) => {
if (!isOptionOn("sound")) return; if (!isOptionOn("sound")) return;
createExplosionSound(pan); createExplosionSound(pan);

66
src/startingPerks.ts Normal file
View file

@ -0,0 +1,66 @@
import { asyncAlert } from "./asyncAlert";
import { PerkId, Upgrade } from "./types";
import { t } from "./i18n/i18n";
import { icons, upgrades } from "./loadGameData";
import { getSettingValue, getTotalScore, setSettingValue } from "./settings";
import { isOptionOn } from "./options";
import { notStartingPerk } from "./upgrades";
export function startingPerkMenuButton() {
return {
disabled: isOptionOn("easy"),
icon: icons["icon:starting_perks"],
text: t("starting_perks.title"),
help: t("starting_perks.help"),
async value() {
await openStartingPerksEditor();
},
};
}
export function isBlackListedForStart(u: Upgrade) {
return !!(
notStartingPerk.includes(u.id) ||
u.requires ||
u.threshold > getTotalScore()
);
}
export function isStartingPerk(u: Upgrade): boolean {
return (
!isBlackListedForStart(u) && getSettingValue("start_with_" + u.id, u.gift)
);
}
export async function openStartingPerksEditor() {
const avaliable = upgrades.filter((u) => !isBlackListedForStart(u));
const buttons = avaliable.map((u) => {
const checked = isStartingPerk(u);
return {
icon: u.icon,
text: u.name,
tooltip: u.help(1),
value: [u],
checked,
};
});
const checkedList = buttons.filter((b) => b.checked);
const perks: Upgrade[] | null | void = await asyncAlert({
title: t("starting_perks.title"),
className: "actionsAsGrid",
content: [
checkedList.length
? t("starting_perks.checked")
: t("starting_perks.random"),
...checkedList,
t("starting_perks.unchecked"),
...buttons.filter((b) => !b.checked),
],
});
if (perks) {
perks?.forEach((perk) => {
setSettingValue("start_with_" + perk.id, !isStartingPerk(perk));
});
openStartingPerksEditor();
}
}

15
src/toast.ts Normal file
View file

@ -0,0 +1,15 @@
let div = document.createElement("div");
div.classList = "hidden toast";
document.body.appendChild(div);
let timeout: NodeJS.Timeout | undefined;
export function toast(html: string) {
div.classList = "toast visible";
div.innerHTML = html;
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => {
timeout = undefined;
div.classList = "hidden toast";
}, 1500);
}

61
src/tooltip.ts Normal file
View file

@ -0,0 +1,61 @@
import { isOptionOn } from "./options";
export function setupTooltips() {
const tooltip = document.getElementById("tooltip") as HTMLDivElement;
if (isOptionOn("mobile-mode")) {
tooltip.style.display = "none";
return;
}
function updateTooltipPosition(e: MouseEvent) {
tooltip.style.transform = `translate(${e.clientX}px,${e.clientY}px) translate(${e.clientX > window.innerWidth / 2 ? "-100%" : "0"},${e.clientY > (window.innerHeight * 2) / 3 ? "-100%" : "20px"})`;
}
function closeToolTip() {
tooltip.style.display = "none";
hovering = null;
}
let hovering: HTMLElement | null = null;
document.body.addEventListener(
"mouseenter",
(e: MouseEvent) => {
let parent: HTMLElement | null = e.target as HTMLElement;
while (parent && !parent.hasAttribute("data-tooltip")) {
parent = parent.parentElement;
}
if (parent?.getAttribute("data-tooltip")?.trim()) {
hovering = parent as HTMLElement;
tooltip.innerHTML = hovering.getAttribute("data-tooltip") || "";
tooltip.style.display = "";
updateTooltipPosition(e);
} else {
closeToolTip();
}
},
true,
);
setInterval(() => {
if (hovering) {
if (!document.body.contains(hovering)) {
closeToolTip();
}
}
}, 200);
document.body.addEventListener(
"mousemove",
(e) => {
if (!tooltip.style.display) {
updateTooltipPosition(e);
}
},
true,
);
document.body.addEventListener(
"mouseleave",
(e) => {
closeToolTip();
},
true,
);
}

69
src/types.d.ts vendored
View file

@ -7,24 +7,25 @@ export type RawLevel = {
name: string; name: string;
size: number; size: number;
bricks: string; bricks: string;
svg: number | null;
color: string; color: string;
credit?: string;
}; };
export type Level = { export type Level = {
name: string; name: string;
size: number; size: number;
bricks: colorString[]; bricks: colorString[];
bricksCount: number;
svg: string; svg: string;
color: string; color: string;
threshold: number;
sortKey: number; sortKey: number;
credit?: string;
}; };
export type Palette = { [k: string]: string }; export type Palette = { [k: string]: string };
export type Upgrade = { export type Upgrade = {
threshold: number; threshold: number;
giftable: boolean; gift: boolean;
id: PerkId; id: PerkId;
name: string; name: string;
icon: string; icon: string;
@ -75,13 +76,14 @@ export type Coin = {
previousY: number; previousY: number;
vx: number; vx: number;
vy: number; vy: number;
sx: number; // sx: number;
sy: number; // sy: number;
a: number; a: number;
sa: number; sa: number;
weight: number; weight: number;
destroyed?: boolean; destroyed?: boolean;
coloredABrick?: boolean; collidedLastFrame?: boolean;
metamorphosisPoints: number;
}; };
export type Ball = { export type Ball = {
x: number; x: number;
@ -92,16 +94,14 @@ export type Ball = {
vy: number; vy: number;
previousVX: number; previousVX: number;
previousVY: number; previousVY: number;
sx: number; // sx: number;
sy: number; // sy: number;
// Uses of the pierce perk only // Ability to pierce N HP
piercedSinceBounce: number; piercePoints: number;
// Any bounce counts, even if brick resisted the hit // Any bounce counts, even if brick resisted the hit
hitSinceBounce: number; hitSinceBounce: number;
// Brick was really broken ,but could have been respawned as a bomb // Brick was really broken ,but could have been respawned as a bomb
brokenSinceBounce: number; brokenSinceBounce: number;
// Bricks that have been destroyed (and not replaced by something else)
hitItem: { index: number; color: string }[];
sapperUses: number; sapperUses: number;
destroyed?: boolean; destroyed?: boolean;
}; };
@ -132,11 +132,10 @@ interface LightFlash extends BaseFlash {
// type: "ball"; // type: "ball";
} }
export type Flash = ParticleFlash | TextFlash | LightFlash;
export type RunStats = { export type RunStats = {
started: number; started: number;
levelsPlayed: number; levelsPlayed: number;
loops: number;
runTime: number; runTime: number;
coins_spawned: number; coins_spawned: number;
score: number; score: number;
@ -147,7 +146,6 @@ export type RunStats = {
wall_bounces: number; wall_bounces: number;
upgrades_picked: number; upgrades_picked: number;
max_combo: number; max_combo: number;
max_level: number;
}; };
export type PerksMap = { export type PerksMap = {
@ -162,7 +160,7 @@ export type ReusableArray<T> = {
}; };
export type RunHistoryItem = RunStats & { export type RunHistoryItem = RunStats & {
perks?: PerksMap; perks?: Partial<PerksMap>;
appVersion?: string; appVersion?: string;
}; };
export type GameState = { export type GameState = {
@ -192,6 +190,8 @@ export type GameState = {
// 10 levels selected randomly at start for the run // 10 levels selected randomly at start for the run
runLevels: Level[]; runLevels: Level[];
// Current level displayed
level: Level;
// Width of the puck in pixels, changed by some perks and resizes // Width of the puck in pixels, changed by some perks and resizes
puckWidth: number; puckWidth: number;
// perks the user currently has // perks the user currently has
@ -200,6 +200,8 @@ export type GameState = {
baseSpeed: number; baseSpeed: number;
// Score multiplier // Score multiplier
combo: number; combo: number;
// Combo at the start of the tick
lastCombo: number;
// Whether the game is running or paused // Whether the game is running or paused
running: boolean; running: boolean;
isGameOver: boolean; isGameOver: boolean;
@ -208,6 +210,7 @@ export type GameState = {
needsRender: boolean; needsRender: boolean;
// Position of the center of the puck on the canvas in pixels, from the left of the canvas. // Position of the center of the puck on the canvas in pixels, from the left of the canvas.
puckPosition: number; puckPosition: number;
lastPuckPosition: number;
// Will be set if the game is about to be paused. Game pause is delayed by a few milliseconds if you pause a few times in a run, // Will be set if the game is about to be paused. Game pause is delayed by a few milliseconds if you pause a few times in a run,
// to avoid abuse of the "release to pause" feature on mobile. // to avoid abuse of the "release to pause" feature on mobile.
pauseTimeout: NodeJS.Timeout | null; pauseTimeout: NodeJS.Timeout | null;
@ -218,6 +221,7 @@ export type GameState = {
lastScoreIncrease: number; lastScoreIncrease: number;
// levelTime of the last explosion, for screen shake // levelTime of the last explosion, for screen shake
lastExplosion: number; lastExplosion: number;
lastBrickBroken: number;
// High score at the beginning of the run // High score at the beginning of the run
highScore: number; highScore: number;
// Balls currently in game, game over if it's empty // Balls currently in game, game over if it's empty
@ -226,15 +230,26 @@ export type GameState = {
ballsColor: colorString; ballsColor: colorString;
// Array of bricks to display. 'black' means bomb. '' means no brick. // Array of bricks to display. 'black' means bomb. '' means no brick.
bricks: colorString[]; bricks: colorString[];
// Number of times a brick has been hit already
brickHP: number[];
particles: ReusableArray<ParticleFlash>; particles: ReusableArray<ParticleFlash>;
texts: ReusableArray<TextFlash>; texts: ReusableArray<TextFlash>;
lights: ReusableArray<LightFlash>; lights: ReusableArray<LightFlash>;
coins: ReusableArray<Coin>; coins: ReusableArray<Coin>;
// Bricks that should respawn destroyed
respawns: ReusableArray<{
index: number;
color: string;
time: number;
destroyed?: boolean;
}>;
levelStartScore: number; levelStartScore: number;
levelMisses: number; levelMisses: number;
levelSpawnedCoins: number; levelSpawnedCoins: number;
lastPlayedCoinGrab: number; levelLostCoins: number;
// MAX_COINS: number; // MAX_COINS: number;
// MAX_PARTICLES: number; // MAX_PARTICLES: number;
@ -242,8 +257,6 @@ export type GameState = {
ballSize: number; ballSize: number;
coinSize: number; coinSize: number;
puckHeight: number; puckHeight: number;
totalScoreAtRunStart: number;
isCreativeModeRun: boolean;
pauseUsesDuringRun: number; pauseUsesDuringRun: number;
keyboardPuckSpeed: number; keyboardPuckSpeed: number;
lastTick: number; lastTick: number;
@ -251,6 +264,7 @@ export type GameState = {
runStatistics: RunStats; runStatistics: RunStats;
lastOffered: Partial<{ [k in PerkId]: number }>; lastOffered: Partial<{ [k in PerkId]: number }>;
levelTime: number; levelTime: number;
lastPuckMove: number;
winAt: number; winAt: number;
levelWallBounces: number; levelWallBounces: number;
autoCleanUses: number; autoCleanUses: number;
@ -262,14 +276,23 @@ export type GameState = {
explode: { vol: number; x: number }; explode: { vol: number; x: number };
lifeLost: { vol: number; x: number }; lifeLost: { vol: number; x: number };
coinCatch: { vol: number; x: number }; coinCatch: { vol: number; x: number };
plouf: { vol: number; x: number };
colorChange: { vol: number; x: number }; colorChange: { vol: number; x: number };
}; };
rerolls: number;
creative: boolean;
startParams: RunParams;
}; };
export type RunParams = { export type RunParams = {
level?: string; level?: Level;
levelToAvoid?: string; levelToAvoid?: string;
perkToAvoid?: PerkId;
perks?: Partial<PerksMap>; perks?: Partial<PerksMap>;
computer_controlled?: boolean;
isEditorTrialRun?: number;
isCreativeRun?: boolean;
stress?: boolean;
}; };
export type OptionDef = { export type OptionDef = {
default: boolean; default: boolean;
@ -277,3 +300,9 @@ export type OptionDef = {
help: string; help: string;
}; };
export type OptionId = keyof typeof options; export type OptionId = keyof typeof options;
export type UpgradeLike = {
id: PerkId;
name: string;
requires: string;
threshold: number;
};

File diff suppressed because it is too large Load diff

9
start.sh Normal file
View file

@ -0,0 +1,9 @@
source ~/.nvm/nvm.sh;
nvm install v21
nvm use v21
rm -rf .parcel-cache
npx run-p dev:*