Translations

This commit is contained in:
Renan LE CARO 2025-03-31 20:08:17 +02:00
parent d52472a34d
commit af65f22c70
14 changed files with 515 additions and 315 deletions

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.

View file

@ -7,29 +7,11 @@ Break colourful bricks, catch bouncing coins and select powerful upgrades !
- Bitcoin : bc1qlh8kywy3ttsuqqa08yx2rdc8dqhdvyt43wlxmr - Bitcoin : bc1qlh8kywy3ttsuqqa08yx2rdc8dqhdvyt43wlxmr
- [Discord](https://discord.gg/DZSPqyJkwP) - [Discord](https://discord.gg/DZSPqyJkwP)
- [Post your comments on itch.io](https://renanlecaro.itch.io/breakout71) - [Post your comments on itch.io](https://renanlecaro.itch.io/breakout71)
- [Help and tips about the game](./Help.md)
- [F-Droid](https://f-droid.org/en/packages/me.lecaro.breakout/) - [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)
- [Translation with weblate](https://hosted.weblate.org/engage/breakout-71/-/en/) - [Translation with weblate](https://hosted.weblate.org/engage/breakout-71/-/en/)
# System requirements
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).
# Looping
Once you have unlocked all upgrades, you'll get an option to play a longer game.
In the mode, you can "loop" the game up to 7 times after your initial run.
Each loop is shorter, and you can't use the perk levels you used in past levels, except
for one perk that you can keep improving. If you completely exhaust a perk, it won't be
offered at all in later loops. The perk you keep improving instantly gains +1 level and +2 max levels
Each loop is one level shorter. The ball starts slightly faster.
The game is over when you run loose the ball or finish the 7th loop.
# changelog # changelog
@ -220,8 +202,14 @@ The game is over when you run loose the ball or finish the 7th loop.
- countries flags and shapes - countries flags and shapes
## extend re-playability ## extend re-playability
- 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
@ -254,43 +242,3 @@ This requires recording a bit more info about each run.
- missile goes when you break a brick - 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 - [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
# 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
Colin (obigre) brought a lot of fantastic ideas to the game, here's his website (in French) : https://colin-crapahute.bearblog.dev/
# Other noteworthy games in the breakout genre
LBreakoutHD : nice and open source remake
https://sourceforge.net/p/lgames/code/HEAD/tree/trunk/lbreakouthd/
Wizorb
https://store.steampowered.com/app/207420/Wizorb/
Rollers of the realm : narratif, chaque balle est un aventurier
https://store.steampowered.com/app/262470/Rollers_of_the_Realm/
Breakout multiplayer : pvp with air console style multiplayer
https://casmo.itch.io/breakout-multiplayer
Breakout Hero (made as part of a PICO-8 tutorial )
https://krystman.itch.io/breakout-hero

109
dist/index.html vendored

File diff suppressed because one or more lines are too long

View file

@ -24,13 +24,15 @@
"size": 9, "size": 9,
"bricks": "ttttttt__tWWWWWWW_tWrrWttW_tWWWWWWW_ttttttt_____t______ttttt____ttttt_____t_t", "bricks": "ttttttt__tWWWWWWW_tWrrWttW_tWWWWWWW_ttttttt_____t______ttttt____ttttt_____t_t",
"svg": null, "svg": null,
"color": "" "color": "",
"credit": "https://steamcommunity.com/sharedfiles/filedetails/?id=487035876"
}, },
{ {
"name": "Creeper", "name": "Creeper",
"size": 10, "size": 10,
"bricks": "___________ccGGccGG__cGccGcGc__GBBccBBc__cBBGcBBc__GccBBGGc__ccBBBBcG__GGBBBBcG__cGBccBGc___________", "bricks": "___________ccGGccGG__cGccGcGc__GBBccBBc__cBBGcBBc__GccBBGGc__ccBBBBcG__GGBBBBcG__cGBccBGc___________",
"svg": 22 "svg": 22,
"credit": "https://en.wikipedia.org/wiki/Creeper_(Minecraft)"
}, },
{ {
"name": "Stairs", "name": "Stairs",
@ -57,7 +59,8 @@
"size": 15, "size": 15,
"bricks": "__________________RRR___RRR_____RSSSR_RSSSR___RSWWSSRSSSSSR__RSWSSSSSSSSSR__RSSSSSSSSSSSR__RSWSSSSSSSSSR___RSSSSSSSSSR_____RSSSSSSSR_______RSSSSSR_________RSSSR___________RSR_____________R____________________________________", "bricks": "__________________RRR___RRR_____RSSSR_RSSSR___RSWWSSRSSSSSR__RSWSSSSSSSSSR__RSSSSSSSSSSSR__RSWSSSSSSSSSR___RSSSSSSSSSR_____RSSSSSSSR_______RSSSSSR_________RSSSR___________RSR_____________R____________________________________",
"svg": 17, "svg": 17,
"color": "" "color": "",
"credit": "https://www.youtube.com/watch?v=gdWiTfzXb1g"
}, },
{ {
"name": "Swiss", "name": "Swiss",
@ -105,7 +108,8 @@
"size": 12, "size": 12,
"bricks": "____yyyy______yyyyyyyy___yyyyByyyyy__yyyyyyyyy__yyyyyyyy____yyyyyy______yyyyyy___S_Syyyyyyyy_____yyyyyyyyy___yyyyyyyyyy___yyyyyyyy______yyyy", "bricks": "____yyyy______yyyyyyyy___yyyyByyyyy__yyyyyyyyy__yyyyyyyy____yyyyyy______yyyyyy___S_Syyyyyyyy_____yyyyyyyyy___yyyyyyyyyy___yyyyyyyy______yyyy",
"svg": 7, "svg": 7,
"color": "" "color": "",
"credit": "https://en.wikipedia.org/wiki/Pacman"
}, },
{ {
"name": "Ship", "name": "Ship",
@ -118,21 +122,24 @@
"size": 13, "size": 13,
"bricks": "________________a_____a_______a___a_______aaaaaaa_____aaBaaaBaa___aaaaaaaaaaa__aaaaaaaaaaa__a_aaaaaaa_a__a_a_____a_a_____aa_aa_____________________________", "bricks": "________________a_____a_______a___a_______aaaaaaa_____aaBaaaBaa___aaaaaaaaaaa__aaaaaaaaaaa__a_aaaaaaa_a__a_a_____a_a_____aa_aa_____________________________",
"svg": 29, "svg": 29,
"color": "" "color": "",
"credit": "https://en.wikipedia.org/wiki/Space_invaders"
}, },
{ {
"name": "Space mushroom", "name": "Space mushroom",
"size": 10, "size": 10,
"bricks": "______________WW_______WWWW_____WWWWWW___WWBWWBWW__WWWWWWWW____W__W_____W_WW_W___W_W__W_W", "bricks": "______________WW_______WWWW_____WWWWWW___WWBWWBWW__WWWWWWWW____W__W_____W_WW_W___W_W__W_W",
"svg": 6, "svg": 6,
"color": "" "color": "",
"credit": "https://en.wikipedia.org/wiki/Space_invaders"
}, },
{ {
"name": "Wololo", "name": "Wololo",
"size": 9, "size": 9,
"bricks": "____WW_OOW___WW__OWW__W___OWWWbbbW_WWW_WbW_WOW__WWb__OW__bbb__O___W_W__O___W_W__O", "bricks": "____WW_OOW___WW__OWW__W___OWWWbbbW_WWW_WbW_WOW__WWb__OW__bbb__O___W_W__O___W_W__O",
"svg": null, "svg": null,
"color": "" "color": "",
"credit": "https://aoe.heavengames.com/theacademy/unitsboatsandbuildings/priest/"
}, },
{ {
"name": "Small heart", "name": "Small heart",
@ -153,14 +160,16 @@
"size": 10, "size": 10,
"bricks": "___________gggggggg__gggggggg__gggggggg__gggggggg__vvvggvvv__gggggggg__gggggggg__gggggggg_____________________", "bricks": "___________gggggggg__gggggggg__gggggggg__gggggggg__vvvggvvv__gggggggg__gggggggg__gggggggg_____________________",
"svg": null, "svg": null,
"color": "#154b07" "color": "#154b07",
"credit": "https://minecraft.wiki/w/Enderman"
}, },
{ {
"name": "Mushroom", "name": "Mushroom",
"size": 16, "size": 16,
"bricks": "_____________________rrrrWW________WWrrrrWWWW_____WWrrrrrrWWWW____WrrWWWWrrWWW___rrrWWWWWWrrrrr__rrrWWWWWWrrWWr__WrrWWWWWWrWWWW__WWrrWWWWrrWWWW__WWrrrrrrrrrWWr__WrrWWWWWWWWrrr_____WWBWWBWW_______WWWBWWBWWW______WWWWWWWWWW_______WWWWWWWW____________________", "bricks": "_____________________rrrrWW________WWrrrrWWWW_____WWrrrrrrWWWW____WrrWWWWrrWWW___rrrWWWWWWrrrrr__rrrWWWWWWrrWWr__WrrWWWWWWrWWWW__WWrrWWWWrrWWWW__WWrrrrrrrrrWWr__WrrWWWWWWWWrrr_____WWBWWBWW_______WWWBWWBWWW______WWWWWWWWWW_______WWWWWWWW____________________",
"svg": null, "svg": null,
"color": "" "color": "",
"credit": "https://pixelartmaker.com/art/cce4295a92035ea"
}, },
{ {
"name": "Tulip", "name": "Tulip",
@ -275,7 +284,8 @@
"bricks": "___sssss_______sssssss______WWsWWsss_____WBsBWsss_____WBsBWsss_____WWsWWsss_____sssssss_______ssssss_____WWWWWWss_______WssWs__s_____ssss__sss___sssssssssss__sssssssss_ss", "bricks": "___sssss_______sssssss______WWsWWsss_____WBsBWsss_____WBsBWsss_____WWsWWsss_____sssssss_______ssssss_____WWWWWWss_______WssWs__s_____ssss__sss___sssssssssss__sssssssss_ss",
"svg": null, "svg": null,
"color": "", "color": "",
"squared": false "squared": false,
"credit": "https://en.wikipedia.org/wiki/Worms_(series)"
}, },
{ {
"name": "Ocean Sunrise", "name": "Ocean Sunrise",
@ -412,7 +422,8 @@
"name": "Cute dog", "name": "Cute dog",
"size": 9, "size": 9,
"bricks": "__________O_____O_OOOWWWOOOOOWWWWWOOOOeWWWWOO_eBeWWBW__eBeWWBW___eWBWW_____WRW____________", "bricks": "__________O_____O_OOOWWWOOOOOWWWWWOOOOeWWWWOO_eBeWWBW__eBeWWBW___eWBWW_____WRW____________",
"svg": null "svg": null,
"credit": "https://prohama.com/dog-21-pattern/"
}, },
{ {
"name": "icon:extra_life", "name": "icon:extra_life",
@ -630,35 +641,40 @@
"size": 18, "size": 18,
"bricks": "_________________________llll_________lll_llllll_lll___lsssllllllllsssl__lsssllllllllsssl__lsssllBllBllsssl__lssllWllllWllssl___ll__llllll__ll_________llll_______________ll______________llll______________ll________________________________________________________________________________________________________________________________________", "bricks": "_________________________llll_________lll_llllll_lll___lsssllllllllsssl__lsssllllllllsssl__lsssllBllBllsssl__lssllWllllWllssl___ll__llllll__ll_________llll_______________ll______________llll______________ll________________________________________________________________________________________________________________________________________",
"svg": 25, "svg": 25,
"color": "" "color": "",
"credit": "https://prohama.com/elephant-5-pattern/"
}, },
{ {
"name": "Orca", "name": "Orca",
"size": 20, "size": 20,
"bricks": "____________________________________________________________________________________________BBBBB____BBB_BBB___BBBBBBB____BBBBB___BBBBBBBBB____BBB___BBBBWBBWWW_____BBBBBBBBBBBWWWW_____BBBBBBBBBBWWWWW_____BBBBBBBBBWWWWW_______BBBBBBBWWWWW___________WWBBWWW______________BBB_BB______________BB__B______________________________________________________________________________________________________________________________", "bricks": "____________________________________________________________________________________________BBBBB____BBB_BBB___BBBBBBB____BBBBB___BBBBBBBBB____BBB___BBBBWBBWWW_____BBBBBBBBBBBWWWW_____BBBBBBBBBBWWWWW_____BBBBBBBBBWWWWW_______BBBBBBBWWWWW___________WWBBWWW______________BBB_BB______________BB__B______________________________________________________________________________________________________________________________",
"svg": null, "svg": null,
"color": "#1c71d8" "color": "#1c71d8",
"credit": "https://prohama.com/whale-2-pattern/"
}, },
{ {
"name": "Shark", "name": "Shark",
"size": 17, "size": 17,
"bricks": "__________________________________________g_______________ggg____________ggggggg_________ggggggggg_______ggggggggggg_____gggggWWWggggg____gBgWWWWWWWgBg___ggWWWWrWrWWWWgg__ggWWWrrrrrWWWgg_ggWWWrrrrrrrWWWggggWWrrrrrrrrrWWgggWWWrWrWrWrWrWWWggWWrrWWWWWWWrrWWggWWWWWWWWWWWWWWWg_________________", "bricks": "__________________________________________g_______________ggg____________ggggggg_________ggggggggg_______ggggggggggg_____gggggWWWggggg____gBgWWWWWWWgBg___ggWWWWrWrWWWWgg__ggWWWrrrrrWWWgg_ggWWWrrrrrrrWWWggggWWrrrrrrrrrWWgggWWWrWrWrWrWrWWWggWWrrWWWWWWWrrWWggWWWWWWWWWWWWWWWg_________________",
"svg": null, "svg": null,
"color": "#3584e4" "color": "#3584e4",
"credit": "https://prohama.com/shark-2-pattern/"
}, },
{ {
"name": "Bird", "name": "Bird",
"size": 13, "size": 13,
"bricks": "_______RRR____R____RSSSR___RR__RSSWWWR__RSR_RSWWBWR__RSSRRSWWWWyy_RSSSRSWWWR___RSSSSSSRR_____RRSSyyyy______RSyyyyy___RRRRSyyyy____RSSSRyyy_____RRRR______________________", "bricks": "_______RRR____R____RSSSR___RR__RSSWWWR__RSR_RSWWBWR__RSSRRSWWWWyy_RSSSRSWWWR___RSSSSSSRR_____RRSSyyyy______RSyyyyy___RRRRSyyyy____RSSSRyyy_____RRRR______________________",
"svg": null, "svg": null,
"color": "" "color": "",
"credit": "https://prohama.com/bird-1-size-13x12/"
}, },
{ {
"name": "Tux", "name": "Tux",
"size": 14, "size": 14,
"bricks": "_____gggg________gggggggg_____gggggggggg____gggggggggg___gggggggggggg__gggWBggWBggg__gggBBggBBggg__ggggyyyygggg_ggggggyyggggggggggWWWWWWggggg_gWWWWWWWWg_g__WWWWWWWWWW____WWWWWWWWWW____yyy____yyy__", "bricks": "_____gggg________gggggggg_____gggggggggg____gggggggggg___gggggggggggg__gggWBggWBggg__gggBBggBBggg__ggggyyyygggg_ggggggyyggggggggggWWWWWWggggg_gWWWWWWWWg_g__WWWWWWWWWW____WWWWWWWWWW____yyy____yyy__",
"svg": null, "svg": null,
"color": "#62a0ea" "color": "#62a0ea",
"credit": "https://prohama.com/pingwin-4-pattern/"
}, },
{ {
"name": "Armenia", "name": "Armenia",
@ -1052,5 +1068,44 @@
"bricks": "__________________________l__WWWWW_lWWWyylllly_WWWWW_ly_______l__________________", "bricks": "__________________________l__WWWWW_lWWWyylllly_WWWWW_ly_______l__________________",
"svg": null, "svg": null,
"color": "" "color": ""
},
{
"name": "icon:help",
"size": 8,
"bricks": "___tt_____tttt___tt__tt__tt__tt_____tt_____tt______________tt___",
"svg": null,
"color": ""
},
{
"name": "Pingwin",
"size": 13,
"bricks": "______gggg________ggWWgg_______gWWgWgy______ggWWWg_______ggggg_______gggWWW______gggggWWW___gggggggWWW____ggggggWWW_____ggggWWWW____gggWWWWW______ggWWWW________gWWyyy___",
"svg": null,
"color": "#3584e4",
"credit": "https://prohama.com/pingwin-2-pattern/"
},
{
"name": "Dog",
"size": 16,
"bricks": "__gg_ggggg_gg___ggWWgWWWWWgWWgg_gWWgWWWWWWWgWWg_gWWgWWWWWWWgWWg_gggWWWWWWWWWggg__gWggWWWWWggWg___gWggWWWWWggWg___gWWWWgggWWWWg____gWgWWgWWgWg_____gWWggsggWWg______gWgsssgWg________ggsssgg___________ggg_______________________________________________________",
"svg": null,
"color": "#62a0ea",
"credit": "https://prohama.com/dog-8-pattern/"
},
{
"name": "sunglasses",
"size": 24,
"bricks": "____________________________________________________ggggg______ggggg_______gg___g______g___gg_____gg________________gg___gg__________________gg_gggggggggg____gggggggggggggtttttggggggggbbbbbgggggtWWWttttggggbbbbWWWbgg_gtWttttttggggbbbbWbbbg__gtttttttgg__ggbbbbbbbg__gtttttttg____gbbbbbbbg__ggtttttgg____ggbbbbbgg___ggtttgg______ggbbbgg_____ggggg________ggggg___________________________________________________________________________________________________________________________________________________________________________________________________________________________",
"svg": null,
"color": "#1a5fb4",
"credit": "https://prohama.com/sunglasses-pattern-1/"
},
{
"name": "Balloon",
"size": 21,
"bricks": "_____bbbWbbbWbbb_________PWbWPWbWPWbWP_______bWbbbWbbbWbbbWb_____WbbbWbbbWbbbWbbbW___WPWbWPWbWPWbWPWbWPW__bWbbbWbbbWbbbWbbbWb__bbbPbbbPbbbPbbbPbbb__bbPPPbPPPbPPPbPPPbb___PPWPPPWPPPWPPPWPP____PWbWPWbWPWbWPWbWP_____PWPPPWPPPWPPPWP_______PPWPPPWPPPWPP_________WbWPWbWPWbW___________bbbbbbbbb_____________b_____b______________b_____b______________b_____b______________WWWWWWW_______________PPPPP________________PPPPP________________PPPPP________",
"svg": null,
"color": "",
"credit": "https://prohama.com/balloon-1/"
} }
] ]

View file

@ -67,7 +67,7 @@ body {
} }
span { span {
color: rgba(255, 255, 255, 0.4); color: rgba(255, 255, 255, 0.8);
&.great { &.great {
color: lightgreen; color: lightgreen;
@ -119,7 +119,7 @@ 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;

View file

@ -63,6 +63,7 @@ import {
import { isOptionOn, options, toggleOption } from "./options"; import { isOptionOn, options, toggleOption } from "./options";
import { hashCode } from "./getLevelBackground"; import { hashCode } from "./getLevelBackground";
import { hoursSpentPlaying } from "./pure_functions"; import { hoursSpentPlaying } from "./pure_functions";
import {helpMenuEntry} from "./help";
export function play() { export function play() {
if (applyFullScreenChoice()) return; if (applyFullScreenChoice()) return;
@ -555,6 +556,7 @@ export async function openMainMenu() {
openSettingsMenu(); openSettingsMenu();
}, },
}, },
helpMenuEntry()
]; ];
const cb = await asyncAlert<() => void>({ const cb = await asyncAlert<() => void>({

48
src/help.ts Normal file
View file

@ -0,0 +1,48 @@
import {allLevels, icons, upgrades} from "./loadGameData";
import {t} from "./i18n/i18n";
import {asyncAlert} from "./asyncAlert";
import {miniMarkDown} from "./pure_functions";
export function helpMenuEntry() {
return {
icon: icons['icon:help'],
text: t('main_menu.help_title'),
help: t('main_menu.help_help'),
async value() {
await asyncAlert({
title:t('main_menu.help_title'),
allowClose:true,
content:[
miniMarkDown(t('main_menu.help_content')),
t('main_menu.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)}
`),
miniMarkDown(t('main_menu.credits')),
t('main_menu.credit_levels'),
...allLevels.filter(l=>l.credit?.startsWith('http')).map(l=>`
<div class="upgrade used">
${icons[l.name]}
<p>
<strong>${l.name}</strong><br/>
<a href="${l.credit}" target="_blank">${l.credit}</a>
</p>
</div>`)
]
})
}
}
}

View file

@ -812,6 +812,36 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>credit_levels</name>
<description/>
<comment/>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>credits</name>
<description/>
<comment/>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>donate</name> <name>donate</name>
<description/> <description/>
@ -947,6 +977,66 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>help_content</name>
<description/>
<comment/>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>help_help</name>
<description/>
<comment/>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>help_title</name>
<description/>
<comment/>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>help_upgrades</name>
<description/>
<comment/>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-FR</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>kid</name> <name>kid</name>
<description/> <description/>
@ -1972,11 +2062,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2022,11 +2112,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2072,11 +2162,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2137,11 +2227,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2187,11 +2277,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2252,11 +2342,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2302,11 +2392,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2352,11 +2442,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2402,11 +2492,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2452,11 +2542,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2517,11 +2607,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2567,11 +2657,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2617,11 +2707,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2667,11 +2757,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2717,11 +2807,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2767,11 +2857,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2832,11 +2922,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2882,11 +2972,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2932,11 +3022,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -2982,11 +3072,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3032,11 +3122,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3082,11 +3172,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3132,11 +3222,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3182,11 +3272,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3232,11 +3322,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3282,11 +3372,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3332,11 +3422,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3382,11 +3472,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3432,11 +3522,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3482,11 +3572,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3532,11 +3622,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3582,11 +3672,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3647,11 +3737,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3697,11 +3787,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3747,11 +3837,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3797,11 +3887,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3862,11 +3952,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3927,11 +4017,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -3977,11 +4067,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4027,11 +4117,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4077,11 +4167,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4142,11 +4232,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4192,11 +4282,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4257,11 +4347,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4307,11 +4397,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4357,11 +4447,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4407,11 +4497,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4472,11 +4562,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4522,11 +4612,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4572,11 +4662,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4637,11 +4727,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4687,11 +4777,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4752,11 +4842,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
@ -4802,11 +4892,11 @@
<translations> <translations>
<translation> <translation>
<language>en-US</language> <language>en-US</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
<translation> <translation>
<language>fr-FR</language> <language>fr-FR</language>
<approved>true</approved> <approved>false</approved>
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>

View file

@ -49,6 +49,8 @@
"main_menu.basic_help": "Better performance.", "main_menu.basic_help": "Better performance.",
"main_menu.colorful_coins": "Colorful coins", "main_menu.colorful_coins": "Colorful coins",
"main_menu.colorful_coins_help": "Coins always spawn of the color of the brick", "main_menu.colorful_coins_help": "Coins always spawn of the color of the brick",
"main_menu.credit_levels": "<h2>Levels source or reference link</h2>",
"main_menu.credits": "# Credits\n\nI pulled many background patterns from https://pattern.monster/\n\nSome of the sound generating code was written by ChatGPT, and heavily\nadapted to my usage over time.\n\nI 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\n\nColin (obigre) brought a lot of fantastic ideas to the game, here's his website (in French) : https://colin-crapahute.bearblog.dev/\n\n# Other breakout games \n\nHere are a few interesting games in the breakout genre :\n\n- LBreakoutHD : nice and open source remake https://sourceforge.net/p/lgames/code/HEAD/tree/trunk/lbreakouthd/\n- Wizorb https://store.steampowered.com/app/207420/Wizorb/\n- Rollers of the realm : https://store.steampowered.com/app/262470/Rollers_of_the_Realm/\n- Breakout multiplayer : pvp with air console style multiplayer https://casmo.itch.io/breakout-multiplayer \n- Ricochet infinity : https://www.myabandonware.com/game/ricochet-infinity-dxm\n- My own earlier attempts at the genre https://breakout-v1.lecaro.me/ (chill, closer to original breakout concept) and https://breakout-v2.lecaro.me/ (multiplayer)\n\n# More PC games with high replay value\n\n- FTL : https://www.gog.com/en/game/faster_than_light\n- Nova drift : https://www.gog.com/en/game/nova_drift\n- Noita : https://www.gog.com/en/game/noita\n- Enter the gungeon : https://www.gog.com/en/game/enter_the_gungeon\n- Zero Sivert : https://store.steampowered.com/app/1782120/ZERO_Sievert/\n- Factorio : https://www.factorio.com/\n- Nuclear throne : https://store.steampowered.com/app/242680/Nuclear_Throne/ (don't buy on GOG it's outdated) \n- Brigador : https://www.gog.com/en/game/brigador\n- Teleglitch https://www.gog.com/en/game/teleglitch_die_more_edition\n",
"main_menu.donate": "You've played for {{hours}} hours", "main_menu.donate": "You've played for {{hours}} hours",
"main_menu.donate_help": "How about donating {{suggestion}} € ? You can hide this reminder in the settings. ", "main_menu.donate_help": "How about donating {{suggestion}} € ? You can hide this reminder in the settings. ",
"main_menu.donation_reminder": "Remind me to donate", "main_menu.donation_reminder": "Remind me to donate",
@ -58,13 +60,17 @@
"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.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.fullscreen": "Fullscreen", "main_menu.fullscreen": "Fullscreen",
"main_menu.fullscreen_help": "Game will try to go full screen before starting", "main_menu.fullscreen_help": "Game will try to go full screen before starting",
"main_menu.help_content": "# Goal\n\nThe goal is to catch as many coins as possible during 7 levels. \nCoins appear when you break bricks.\nThey fly around, bounce and roll, and you need to catch them with your puck to increase your score. \nYour score is displayed in the top right corner of the screen.\nYou must delete all bricks to progress to the next level. \nIf you drop the ball, it's game over, unless you had the \"extra life\" upgrade.\n\n# Upgrades \n\nAfter clearing a level, you'll be able to pick upgrades among a small selection presented to you. \n\nThe upgrade you pick will apply until the end of the run. You will get more upgrade if you play well : catch all coins, clear the level quickly, never miss the bricks, never bounce on the sides or ceiling.\n\nIf you play very well, you'll also get \"rerolls\" that allow you to shuffle the list of upgrades that are offered to you. Once an upgrade is offered, it's less likely to reappear afterward. \n\nYou also get a free random upgrade at the beginning of each run. There's also an easy mode for kids, where the game will always start with the \"slower ball\" upgrade. You can see which upgrades you have and more by clicking your score at the top right of the screen. \n\nUpgrades apply to the whole run and can synergize, or really work against each other. Most of the fun of the game is discovering which ones work best together.\n\nSome upgrades help with aiming, like \"Telekinesis\". 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.\n\nWhen you first play, only a few upgrades are available, you unlock the rest by simply playing and scoring points. There's a similar \nmechanic 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.\n\nMany upgrades impact your combo. \n\n# Combo\n\nYour \"combo\" is the number of coins spawned when a brick breaks. It is displayed on your puck, for example x4 means each\nbrick will spawn 4 coins. It will reset if you miss. \n\nMany upgrades will increase the combo when you break a brick, but also add a condition to reset it. So the more upgrades you pick, the faster it will climb, but the more likely it will be that it returns to it's base value. \n\n# Aiming\n\nWhat 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. \n\nThe puck speed and incoming angle have no impact on the ball direction after bouncing.\n\nYou might find that a smaller puck makes it a bit easier to aim near corners, but also makes it much harder to catch coins.\n\n\"Wind\" and \"puck controls ball\" can help you aim even after the ball bounced to the wrong direction.\n\n\"Slower ball\" gives you a bit more time to aim, particularly useful in later levels where the ball goes faster. The ball also\naccelerates as you spend time in each level. \n\n# System requirements \n\nThe 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.\n\nIf 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 ! \n\n# Playing offline \n\nBreakout 71 can work offline in many ways:\n\n- play store : https://play.google.com/store/apps/details?id=me.lecaro.breakout\n- fdroid : https://f-droid.org/packages/me.lecaro.breakout/\n- html file on pc : https://renanlecaro.itch.io/breakout71\n\n",
"main_menu.help_help": "Learn more about general aspects of the game",
"main_menu.help_title": "Help and credits",
"main_menu.help_upgrades": "<h2>Upgrades</h2>",
"main_menu.kid": "Kids mode", "main_menu.kid": "Kids mode",
"main_menu.kid_help": "Start future games with \"slower ball\".", "main_menu.kid_help": "Start future games with \"slower ball\".",
"main_menu.language": "Language", "main_menu.language": "Language",
"main_menu.language_help": "Choose the game's language", "main_menu.language_help": "Choose the game's language",
"main_menu.load_save_file": "Load save file", "main_menu.load_save_file": "Load save file",
"main_menu.load_save_file_help": "Select a save file on your device", "main_menu.load_save_file_help": "Select a save file on your device",
"main_menu.loop_run": "New long game", "main_menu.loop_run": "New long game (experimental)",
"main_menu.loop_run_help": "Allows you to loop up to 7 times", "main_menu.loop_run_help": "Allows you to loop up to 7 times",
"main_menu.max_coins": " {{max}} coins on screen maximum", "main_menu.max_coins": " {{max}} coins on screen maximum",
"main_menu.max_coins_help": "Cosmetic only, no effect on score", "main_menu.max_coins_help": "Cosmetic only, no effect on score",
@ -169,7 +175,7 @@
"upgrades.etherealcoins.fullHelp": "You'll have to make sure that the coins fall down somehow", "upgrades.etherealcoins.fullHelp": "You'll have to make sure that the coins fall down somehow",
"upgrades.etherealcoins.help": "Coins are no longer affected by gravity", "upgrades.etherealcoins.help": "Coins are no longer affected by gravity",
"upgrades.etherealcoins.name": "Coins, in Space", "upgrades.etherealcoins.name": "Coins, in Space",
"upgrades.extra_levels.fullHelp": "The default game 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.extra_levels.fullHelp": "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_levels.help": "Play {{count}} levels instead of 7", "upgrades.extra_levels.help": "Play {{count}} levels instead of 7",
"upgrades.extra_levels.name": "+1 level", "upgrades.extra_levels.name": "+1 level",
"upgrades.extra_life.fullHelp": "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 loose one level of that perk every time a ball bounces at the bottom of the screen.", "upgrades.extra_life.fullHelp": "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 loose one level of that perk every time a ball bounces at the bottom of the screen.",
@ -271,7 +277,7 @@
"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.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.sturdy_bricks.help": "+{{lvl}} bricks HP, +{{percent}}% coins spawned when broken", "upgrades.sturdy_bricks.help": "+{{lvl}} bricks HP, +{{percent}}% coins spawned when broken",
"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.telekinesis.fullHelp": "Right after the ball hits your puck, you'll be able to direct it left and right by moving your puck. \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.telekinesis.help": "Puck controls the ball's trajectory", "upgrades.telekinesis.help": "Puck controls the ball's trajectory",
"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",

View file

@ -49,6 +49,8 @@
"main_menu.basic_help": "Meilleures performances.", "main_menu.basic_help": "Meilleures performances.",
"main_menu.colorful_coins": "Pièces colorées", "main_menu.colorful_coins": "Pièces colorées",
"main_menu.colorful_coins_help": "Les pièces apparaissent toujours de la couleur de la brique", "main_menu.colorful_coins_help": "Les pièces apparaissent toujours de la couleur de la brique",
"main_menu.credit_levels": "<h2>Source ou référence des niveaux</h2>",
"main_menu.credits": "",
"main_menu.donate": "Vous avez joué {{hours}} heures", "main_menu.donate": "Vous avez joué {{hours}} heures",
"main_menu.donate_help": "Pourriez-vous donner {{suggestion}} € ? Vous pouvez masquer ce rappel dans les paramètres.", "main_menu.donate_help": "Pourriez-vous donner {{suggestion}} € ? Vous pouvez masquer ce rappel dans les paramètres.",
"main_menu.donation_reminder": "Me rappeler de donner", "main_menu.donation_reminder": "Me rappeler de donner",
@ -58,13 +60,17 @@
"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.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.fullscreen": "Plein écran", "main_menu.fullscreen": "Plein écran",
"main_menu.fullscreen_help": "Le jeu essaiera de passer en plein écran quand vous le démarrez", "main_menu.fullscreen_help": "Le jeu essaiera de passer en plein écran quand vous le démarrez",
"main_menu.help_content": "# Objectif\n\nLe but est d'attraper un maximum de pièces au cours des 7 niveaux.\nLes pièces apparaissent lorsque vous cassez des briques.\nElles volent, rebondissent et roulent, et vous devez les attraper avec votre palet pour augmenter votre score.\nVotre score est affiché en haut à droite de l'écran.\nVous devez supprimer toutes les briques pour passer au niveau suivant.\nSi vous laissez tomber la balle, la partie est terminée, sauf si vous aviez l'amélioration « Vie supplémentaire ».\n\n# Améliorations\n\nAprès avoir terminé un niveau, vous pourrez choisir des améliorations parmi une petite sélection qui vous sera présentée.\nL'amélioration choisie sera valable jusqu'à la fin de la partie. Vous aurez plus de choix d'améliorations, et même la possibilité d'en choisir plusieurs à la fin du niveau si vous jouez bien : attrapez toutes les pièces, terminez le niveau rapidement et ne ratez jamais votre cible.\nVous obtenez également une amélioration aléatoire gratuite au début de chaque partie. Vous pouvez voir vos améliorations (et quelques détails supplémentaires) en cliquant sur votre score en haut à droite de l'écran.\n\nLes améliorations s'appliquent à l'ensemble de la partie et peuvent être synergiques. Par exemple, si vous combinez « sapeur » et « perforant », la première brique que vous touchez après un rebond de palet se transformera immédiatement en brique explosive et explosera avec la même balle, vous donnant ainsi une balle explosive.\n\nCertaines améliorations facilitent la visée, comme les « balles de contrôle de palet ». Certaines améliorations peuvent être sélectionnées plusieurs fois pour augmenter leur effet. Par exemple, « +1 balle niveau 2 » ajoute une troisième balle.\n\nLors de votre première partie, seules quelques améliorations sont disponibles ; vous débloquez les autres en jouant et en marquant des points. Un mécanisme similaire s'applique au déblocage des niveaux. À la fin d'une partie, les éléments que vous venez de débloquer seront affichés et vous pourrez consulter leur contenu complet dans le menu / Déblocages.\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 brise. L'affichage est sur votre palet. Par exemple, x4 signifie que chaque brique rapporte 4 pièces. Le jeu se réinitialise si vous ratez votre tentative.\n\n# Configuration requise\n\nBreakout 71 peut fonctionner hors ligne (ajoutez-le à l'écran d'accueil) et fonctionne bien même sur les appareils bas de gamme.\nL'application est très simple et occupe peu d'espace de stockage (environ 0,1 Mo).\nSi l'application est instable, activez le « mode rapide » dans les paramètres pour afficher une vue simplifiée et plus rapide. Il existe également un mode facile pour les enfants (balle plus lente).\n\n# Boucle\n\nUne fois toutes les améliorations débloquées, vous aurez la possibilité de jouer une partie plus longue.\nDans ce mode, vous pouvez boucler le jeu jusqu'à 7 fois après votre première tentative.\n\nChaque boucle est plus courte et vous ne pouvez pas utiliser les niveaux d'avantages utilisés dans les niveaux précédents, à l'exception d'un avantage que vous pouvez améliorer continuellement. Si vous épuisez complètement un avantage, il ne sera plus proposé dans les boucles suivantes. L'avantage que vous améliorez gagne instantanément +1 niveau et +2 niveaux max.\nChaque boucle est plus courte d'un niveau. La balle démarre légèrement plus vite.\nLa partie se termine lorsque vous perdez le ballon ou terminez la 7e boucle.\n\n# Visée\n\nSeule la position du palet frappé détermine la trajectoire du ballon. Si le ballon touche le palet en plein centre, il rebondira verticalement, tandis que si vous frappez davantage d'un côté, l'angle sera plus grand.\nLa vitesse du palet et l'angle d'arrivée n'ont aucun impact sur la direction du ballon après le rebond.\n\nUn palet plus petit facilitera peut-être la visée près des coins, mais rendra aussi beaucoup plus difficile la capture de pièces.\nLes options « Vent » et « Palet contrôle le ballon » peuvent vous aider à viser même après un rebond dans la mauvaise direction.\n« Balle plus lente » vous donne un peu plus de temps pour viser, ce qui est particulièrement utile dans les niveaux avancés où la balle va plus vite. La balle accélère également à mesure que vous progressez dans chaque niveau.",
"main_menu.help_help": "Découvrez le jeu en détail",
"main_menu.help_title": "Aide et crédits",
"main_menu.help_upgrades": "<h2>Améliorations</h2>",
"main_menu.kid": "Mode enfants", "main_menu.kid": "Mode enfants",
"main_menu.kid_help": "Balle plus lente", "main_menu.kid_help": "Balle plus lente",
"main_menu.language": "Langue", "main_menu.language": "Langue",
"main_menu.language_help": "Changer la langue d'affichage", "main_menu.language_help": "Changer la langue d'affichage",
"main_menu.load_save_file": "Charger une sauvegarde", "main_menu.load_save_file": "Charger une sauvegarde",
"main_menu.load_save_file_help": "Depuis un fichier ", "main_menu.load_save_file_help": "Depuis un fichier ",
"main_menu.loop_run": "Nouvelle partie longue", "main_menu.loop_run": "Nouvelle partie longue (expérimental)",
"main_menu.loop_run_help": "Permet de boucler le jeu jusqu'à 7 fois", "main_menu.loop_run_help": "Permet de boucler le jeu jusqu'à 7 fois",
"main_menu.max_coins": "{{max}} pièces affichées maximum", "main_menu.max_coins": "{{max}} pièces affichées maximum",
"main_menu.max_coins_help": "Visuel uniquement, pas d'impact sur le score", "main_menu.max_coins_help": "Visuel uniquement, pas d'impact sur le score",
@ -120,7 +126,7 @@
"score_panel.upgrades_picked": "Améliorations choisies jusqu'à présent :", "score_panel.upgrades_picked": "Améliorations choisies jusqu'à présent :",
"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. Cliquez sur l'un d'entre eux pour commencer une nouvelle partie rapide. ", "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 commencer une nouvelle partie rapide. ",
"unlocks.level": "Voci tous les niveaux du jeu. Cliquez sur un niveau pour commencer une nouvelle partie avec ce niveau de départ. ", "unlocks.level": "Voici tous les niveaux du jeu. Cliquez sur un niveau pour commencer une nouvelle partie avec ce niveau de départ. ",
"unlocks.level_description": "Un niveau {{size}}x{{size}} avec {{bricks}} briques", "unlocks.level_description": "Un niveau {{size}}x{{size}} avec {{bricks}} briques",
"unlocks.title": "Vous avez débloqué {{percentUnlock}}% du jeu.", "unlocks.title": "Vous avez débloqué {{percentUnlock}}% du jeu.",
"unlocks.unlocks_at": "Déverrouillé au score total {{threshold}}.", "unlocks.unlocks_at": "Déverrouillé au score total {{threshold}}.",

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

@ -53,7 +53,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 +97,23 @@ 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

@ -15,3 +15,40 @@ export function hoursSpentPlaying() {
return 0; return 0;
} }
} }
export function miniMarkDown(md: string) {
let html = []
let lastNode = 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')
}

2
src/types.d.ts vendored
View file

@ -9,6 +9,7 @@ export type RawLevel = {
bricks: string; bricks: string;
svg: number | null; svg: number | null;
color: string; color: string;
credit?: string;
}; };
export type Level = { export type Level = {
name: string; name: string;
@ -19,6 +20,7 @@ export type Level = {
color: string; color: string;
threshold: number; threshold: number;
sortKey: number; sortKey: number;
credit?: string;
}; };
export type Palette = { [k: string]: string }; export type Palette = { [k: string]: string };