mirror of
https://gitlab.com/lecarore/breakout71.git
synced 2025-04-23 13:36:15 -04:00
Translations
This commit is contained in:
parent
d52472a34d
commit
af65f22c70
14 changed files with 515 additions and 315 deletions
|
@ -24,13 +24,15 @@
|
|||
"size": 9,
|
||||
"bricks": "ttttttt__tWWWWWWW_tWrrWttW_tWWWWWWW_ttttttt_____t______ttttt____ttttt_____t_t",
|
||||
"svg": null,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://steamcommunity.com/sharedfiles/filedetails/?id=487035876"
|
||||
},
|
||||
{
|
||||
"name": "Creeper",
|
||||
"size": 10,
|
||||
"bricks": "___________ccGGccGG__cGccGcGc__GBBccBBc__cBBGcBBc__GccBBGGc__ccBBBBcG__GGBBBBcG__cGBccBGc___________",
|
||||
"svg": 22
|
||||
"svg": 22,
|
||||
"credit": "https://en.wikipedia.org/wiki/Creeper_(Minecraft)"
|
||||
},
|
||||
{
|
||||
"name": "Stairs",
|
||||
|
@ -57,7 +59,8 @@
|
|||
"size": 15,
|
||||
"bricks": "__________________RRR___RRR_____RSSSR_RSSSR___RSWWSSRSSSSSR__RSWSSSSSSSSSR__RSSSSSSSSSSSR__RSWSSSSSSSSSR___RSSSSSSSSSR_____RSSSSSSSR_______RSSSSSR_________RSSSR___________RSR_____________R____________________________________",
|
||||
"svg": 17,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://www.youtube.com/watch?v=gdWiTfzXb1g"
|
||||
},
|
||||
{
|
||||
"name": "Swiss",
|
||||
|
@ -105,7 +108,8 @@
|
|||
"size": 12,
|
||||
"bricks": "____yyyy______yyyyyyyy___yyyyByyyyy__yyyyyyyyy__yyyyyyyy____yyyyyy______yyyyyy___S_Syyyyyyyy_____yyyyyyyyy___yyyyyyyyyy___yyyyyyyy______yyyy",
|
||||
"svg": 7,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://en.wikipedia.org/wiki/Pacman"
|
||||
},
|
||||
{
|
||||
"name": "Ship",
|
||||
|
@ -118,21 +122,24 @@
|
|||
"size": 13,
|
||||
"bricks": "________________a_____a_______a___a_______aaaaaaa_____aaBaaaBaa___aaaaaaaaaaa__aaaaaaaaaaa__a_aaaaaaa_a__a_a_____a_a_____aa_aa_____________________________",
|
||||
"svg": 29,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://en.wikipedia.org/wiki/Space_invaders"
|
||||
},
|
||||
{
|
||||
"name": "Space mushroom",
|
||||
"size": 10,
|
||||
"bricks": "______________WW_______WWWW_____WWWWWW___WWBWWBWW__WWWWWWWW____W__W_____W_WW_W___W_W__W_W",
|
||||
"svg": 6,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://en.wikipedia.org/wiki/Space_invaders"
|
||||
},
|
||||
{
|
||||
"name": "Wololo",
|
||||
"size": 9,
|
||||
"bricks": "____WW_OOW___WW__OWW__W___OWWWbbbW_WWW_WbW_WOW__WWb__OW__bbb__O___W_W__O___W_W__O",
|
||||
"svg": null,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://aoe.heavengames.com/theacademy/unitsboatsandbuildings/priest/"
|
||||
},
|
||||
{
|
||||
"name": "Small heart",
|
||||
|
@ -153,14 +160,16 @@
|
|||
"size": 10,
|
||||
"bricks": "___________gggggggg__gggggggg__gggggggg__gggggggg__vvvggvvv__gggggggg__gggggggg__gggggggg_____________________",
|
||||
"svg": null,
|
||||
"color": "#154b07"
|
||||
"color": "#154b07",
|
||||
"credit": "https://minecraft.wiki/w/Enderman"
|
||||
},
|
||||
{
|
||||
"name": "Mushroom",
|
||||
"size": 16,
|
||||
"bricks": "_____________________rrrrWW________WWrrrrWWWW_____WWrrrrrrWWWW____WrrWWWWrrWWW___rrrWWWWWWrrrrr__rrrWWWWWWrrWWr__WrrWWWWWWrWWWW__WWrrWWWWrrWWWW__WWrrrrrrrrrWWr__WrrWWWWWWWWrrr_____WWBWWBWW_______WWWBWWBWWW______WWWWWWWWWW_______WWWWWWWW____________________",
|
||||
"svg": null,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://pixelartmaker.com/art/cce4295a92035ea"
|
||||
},
|
||||
{
|
||||
"name": "Tulip",
|
||||
|
@ -275,7 +284,8 @@
|
|||
"bricks": "___sssss_______sssssss______WWsWWsss_____WBsBWsss_____WBsBWsss_____WWsWWsss_____sssssss_______ssssss_____WWWWWWss_______WssWs__s_____ssss__sss___sssssssssss__sssssssss_ss",
|
||||
"svg": null,
|
||||
"color": "",
|
||||
"squared": false
|
||||
"squared": false,
|
||||
"credit": "https://en.wikipedia.org/wiki/Worms_(series)"
|
||||
},
|
||||
{
|
||||
"name": "Ocean Sunrise",
|
||||
|
@ -412,7 +422,8 @@
|
|||
"name": "Cute dog",
|
||||
"size": 9,
|
||||
"bricks": "__________O_____O_OOOWWWOOOOOWWWWWOOOOeWWWWOO_eBeWWBW__eBeWWBW___eWBWW_____WRW____________",
|
||||
"svg": null
|
||||
"svg": null,
|
||||
"credit": "https://prohama.com/dog-21-pattern/"
|
||||
},
|
||||
{
|
||||
"name": "icon:extra_life",
|
||||
|
@ -630,35 +641,40 @@
|
|||
"size": 18,
|
||||
"bricks": "_________________________llll_________lll_llllll_lll___lsssllllllllsssl__lsssllllllllsssl__lsssllBllBllsssl__lssllWllllWllssl___ll__llllll__ll_________llll_______________ll______________llll______________ll________________________________________________________________________________________________________________________________________",
|
||||
"svg": 25,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://prohama.com/elephant-5-pattern/"
|
||||
},
|
||||
{
|
||||
"name": "Orca",
|
||||
"size": 20,
|
||||
"bricks": "____________________________________________________________________________________________BBBBB____BBB_BBB___BBBBBBB____BBBBB___BBBBBBBBB____BBB___BBBBWBBWWW_____BBBBBBBBBBBWWWW_____BBBBBBBBBBWWWWW_____BBBBBBBBBWWWWW_______BBBBBBBWWWWW___________WWBBWWW______________BBB_BB______________BB__B______________________________________________________________________________________________________________________________",
|
||||
"svg": null,
|
||||
"color": "#1c71d8"
|
||||
"color": "#1c71d8",
|
||||
"credit": "https://prohama.com/whale-2-pattern/"
|
||||
},
|
||||
{
|
||||
"name": "Shark",
|
||||
"size": 17,
|
||||
"bricks": "__________________________________________g_______________ggg____________ggggggg_________ggggggggg_______ggggggggggg_____gggggWWWggggg____gBgWWWWWWWgBg___ggWWWWrWrWWWWgg__ggWWWrrrrrWWWgg_ggWWWrrrrrrrWWWggggWWrrrrrrrrrWWgggWWWrWrWrWrWrWWWggWWrrWWWWWWWrrWWggWWWWWWWWWWWWWWWg_________________",
|
||||
"svg": null,
|
||||
"color": "#3584e4"
|
||||
"color": "#3584e4",
|
||||
"credit": "https://prohama.com/shark-2-pattern/"
|
||||
},
|
||||
{
|
||||
"name": "Bird",
|
||||
"size": 13,
|
||||
"bricks": "_______RRR____R____RSSSR___RR__RSSWWWR__RSR_RSWWBWR__RSSRRSWWWWyy_RSSSRSWWWR___RSSSSSSRR_____RRSSyyyy______RSyyyyy___RRRRSyyyy____RSSSRyyy_____RRRR______________________",
|
||||
"svg": null,
|
||||
"color": ""
|
||||
"color": "",
|
||||
"credit": "https://prohama.com/bird-1-size-13x12/"
|
||||
},
|
||||
{
|
||||
"name": "Tux",
|
||||
"size": 14,
|
||||
"bricks": "_____gggg________gggggggg_____gggggggggg____gggggggggg___gggggggggggg__gggWBggWBggg__gggBBggBBggg__ggggyyyygggg_ggggggyyggggggggggWWWWWWggggg_gWWWWWWWWg_g__WWWWWWWWWW____WWWWWWWWWW____yyy____yyy__",
|
||||
"svg": null,
|
||||
"color": "#62a0ea"
|
||||
"color": "#62a0ea",
|
||||
"credit": "https://prohama.com/pingwin-4-pattern/"
|
||||
},
|
||||
{
|
||||
"name": "Armenia",
|
||||
|
@ -1052,5 +1068,44 @@
|
|||
"bricks": "__________________________l__WWWWW_lWWWyylllly_WWWWW_ly_______l__________________",
|
||||
"svg": null,
|
||||
"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/"
|
||||
}
|
||||
]
|
||||
]
|
|
@ -67,7 +67,7 @@ body {
|
|||
}
|
||||
|
||||
span {
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
|
||||
&.great {
|
||||
color: lightgreen;
|
||||
|
@ -119,7 +119,7 @@ body:not(.has-alert-open) #popup {
|
|||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
width: 100%;
|
||||
max-width: 450px;
|
||||
max-width: 500px;
|
||||
|
||||
& > * {
|
||||
padding: 0;
|
||||
|
|
|
@ -63,6 +63,7 @@ import {
|
|||
import { isOptionOn, options, toggleOption } from "./options";
|
||||
import { hashCode } from "./getLevelBackground";
|
||||
import { hoursSpentPlaying } from "./pure_functions";
|
||||
import {helpMenuEntry} from "./help";
|
||||
|
||||
export function play() {
|
||||
if (applyFullScreenChoice()) return;
|
||||
|
@ -555,6 +556,7 @@ export async function openMainMenu() {
|
|||
openSettingsMenu();
|
||||
},
|
||||
},
|
||||
helpMenuEntry()
|
||||
];
|
||||
|
||||
const cb = await asyncAlert<() => void>({
|
||||
|
|
48
src/help.ts
Normal file
48
src/help.ts
Normal 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>`)
|
||||
|
||||
]
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -812,6 +812,36 @@
|
|||
</translation>
|
||||
</translations>
|
||||
</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>
|
||||
<name>donate</name>
|
||||
<description/>
|
||||
|
@ -947,6 +977,66 @@
|
|||
</translation>
|
||||
</translations>
|
||||
</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>
|
||||
<name>kid</name>
|
||||
<description/>
|
||||
|
@ -1972,11 +2062,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2022,11 +2112,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2072,11 +2162,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2137,11 +2227,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2187,11 +2277,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2252,11 +2342,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2302,11 +2392,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2352,11 +2442,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2402,11 +2492,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2452,11 +2542,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2517,11 +2607,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2567,11 +2657,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2617,11 +2707,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2667,11 +2757,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2717,11 +2807,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2767,11 +2857,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2832,11 +2922,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2882,11 +2972,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2932,11 +3022,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -2982,11 +3072,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3032,11 +3122,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3082,11 +3172,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3132,11 +3222,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3182,11 +3272,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3232,11 +3322,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3282,11 +3372,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3332,11 +3422,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3382,11 +3472,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3432,11 +3522,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3482,11 +3572,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3532,11 +3622,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3582,11 +3672,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3647,11 +3737,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3697,11 +3787,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3747,11 +3837,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3797,11 +3887,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3862,11 +3952,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3927,11 +4017,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -3977,11 +4067,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4027,11 +4117,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4077,11 +4167,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4142,11 +4232,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4192,11 +4282,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4257,11 +4347,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4307,11 +4397,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4357,11 +4447,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4407,11 +4497,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4472,11 +4562,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4522,11 +4612,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4572,11 +4662,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4637,11 +4727,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4687,11 +4777,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4752,11 +4842,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
@ -4802,11 +4892,11 @@
|
|||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>true</approved>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
"main_menu.basic_help": "Better performance.",
|
||||
"main_menu.colorful_coins": "Colorful coins",
|
||||
"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_help": "How about donating {{suggestion}} € ? You can hide this reminder in the settings. ",
|
||||
"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.fullscreen": "Fullscreen",
|
||||
"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_help": "Start future games with \"slower ball\".",
|
||||
"main_menu.language": "Language",
|
||||
"main_menu.language_help": "Choose the game's language",
|
||||
"main_menu.load_save_file": "Load save file",
|
||||
"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.max_coins": " {{max}} coins on screen maximum",
|
||||
"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.help": "Coins are no longer affected by gravity",
|
||||
"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.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.",
|
||||
|
@ -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.help": "+{{lvl}} bricks HP, +{{percent}}% coins spawned when broken",
|
||||
"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_plural": "Stronger effect on the ball",
|
||||
"upgrades.telekinesis.name": "Telekinesis",
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
"main_menu.basic_help": "Meilleures performances.",
|
||||
"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.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_help": "Pourriez-vous donner {{suggestion}} € ? Vous pouvez masquer ce rappel dans les paramètres.",
|
||||
"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.fullscreen": "Plein écran",
|
||||
"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_help": "Balle plus lente",
|
||||
"main_menu.language": "Langue",
|
||||
"main_menu.language_help": "Changer la langue d'affichage",
|
||||
"main_menu.load_save_file": "Charger une sauvegarde",
|
||||
"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.max_coins": "{{max}} pièces affichées maximum",
|
||||
"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 :",
|
||||
"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.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.title": "Vous avez débloqué {{percentUnlock}}% du jeu.",
|
||||
"unlocks.unlocks_at": "Déverrouillé au score total {{threshold}}.",
|
||||
|
|
|
@ -33,20 +33,23 @@ body {
|
|||
& > div {
|
||||
display: grid;
|
||||
grid-template-columns: auto auto;
|
||||
grid-template-areas: ". name" "buttons bricks";
|
||||
|
||||
& > *:nth-child(1) {
|
||||
grid-template-areas: "name credits" "buttons bricks";
|
||||
.name{
|
||||
grid-area: name;
|
||||
width: 100px;
|
||||
}
|
||||
.credits{
|
||||
grid-area: credits;
|
||||
}
|
||||
|
||||
& > div:nth-child(2) {
|
||||
.buttons {
|
||||
grid-area: buttons;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
& > div:nth-child(3) {
|
||||
.level-bricks-preview {
|
||||
grid-area: bricks;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ function App() {
|
|||
>
|
||||
<div id={"levels"}>
|
||||
{levels.map((level, li) => {
|
||||
const { name, bricks, size, svg, color } = level;
|
||||
const { name,credit, bricks, size, svg, color } = level;
|
||||
|
||||
const brickButtons = [];
|
||||
for (let x = 0; x < size; x++) {
|
||||
|
@ -97,11 +97,23 @@ function App() {
|
|||
return (
|
||||
<div key={li}>
|
||||
<input
|
||||
className={"name"}
|
||||
type="text"
|
||||
value={name}
|
||||
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={() => updateLevel(li, resizeLevel(level, -1))}>
|
||||
-
|
||||
|
|
|
@ -1,17 +1,54 @@
|
|||
export function clamp(value: number, min: number, max: number) {
|
||||
return Math.max(min, Math.min(value, max));
|
||||
return Math.max(min, Math.min(value, max));
|
||||
}
|
||||
|
||||
export function comboKeepingRate(level: number) {
|
||||
return clamp(1 - (1 / (1 + level)) * 1.5, 0, 1);
|
||||
return clamp(1 - (1 / (1 + level)) * 1.5, 0, 1);
|
||||
}
|
||||
|
||||
export function hoursSpentPlaying() {
|
||||
try {
|
||||
const timePlayed =
|
||||
localStorage.getItem("breakout_71_total_play_time") || "0";
|
||||
return Math.floor(parseFloat(timePlayed) / 1000 / 60 / 60);
|
||||
} catch (e) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
const timePlayed =
|
||||
localStorage.getItem("breakout_71_total_play_time") || "0";
|
||||
return Math.floor(parseFloat(timePlayed) / 1000 / 60 / 60);
|
||||
} catch (e) {
|
||||
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
2
src/types.d.ts
vendored
|
@ -9,6 +9,7 @@ export type RawLevel = {
|
|||
bricks: string;
|
||||
svg: number | null;
|
||||
color: string;
|
||||
credit?: string;
|
||||
};
|
||||
export type Level = {
|
||||
name: string;
|
||||
|
@ -19,6 +20,7 @@ export type Level = {
|
|||
color: string;
|
||||
threshold: number;
|
||||
sortKey: number;
|
||||
credit?: string;
|
||||
};
|
||||
|
||||
export type Palette = { [k: string]: string };
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue