Merge
This commit is contained in:
11
README.md
11
README.md
@@ -17,7 +17,7 @@ See [CONTRIBUTING](CONTRIBUTING.md).
|
|||||||
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/).
|
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/).
|
||||||
|
|
||||||
If you'd rather compile on your own, follow these instructions.
|
If you'd rather compile on your own, follow these instructions.
|
||||||
First, make sure you have [Java 8](https://www.java.com/en/download/) and [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
First, make sure you have [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
@@ -49,11 +49,6 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux,
|
|||||||
Gradle may take up to several minutes to download files. Be patient. <br>
|
Gradle may take up to several minutes to download files. Be patient. <br>
|
||||||
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
||||||
|
|
||||||
### Feature Requests
|
|
||||||
|
|
||||||
[](https://feathub.com/Anuken/Mindustry)
|
|
||||||
|
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
[<img src="https://static.itch.io/images/badge.svg"
|
[<img src="https://static.itch.io/images/badge.svg"
|
||||||
@@ -67,3 +62,7 @@ After building, the output .JAR file should be in `/desktop/build/libs/Mindustry
|
|||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
alt="Get it on F-Droid"
|
alt="Get it on F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/io.anuke.mindustry/)
|
height="80">](https://f-droid.org/packages/io.anuke.mindustry/)
|
||||||
|
|
||||||
|
### Feature Requests
|
||||||
|
|
||||||
|
[](https://feathub.com/Anuken/Mindustry)
|
||||||
|
|||||||
@@ -29,6 +29,13 @@ load.system = System
|
|||||||
load.mod = Mods
|
load.mod = Mods
|
||||||
load.scripts = Scripts
|
load.scripts = Scripts
|
||||||
|
|
||||||
|
be.update = A new Bleeding Edge build is available:
|
||||||
|
be.update.confirm = Download it and restart now?
|
||||||
|
be.updating = Updating...
|
||||||
|
be.ignore = Ignore
|
||||||
|
be.noupdates = No updates found.
|
||||||
|
be.check = Check for updates
|
||||||
|
|
||||||
schematic = Schematic
|
schematic = Schematic
|
||||||
schematic.add = Save Schematic...
|
schematic.add = Save Schematic...
|
||||||
schematics = Schematics
|
schematics = Schematics
|
||||||
@@ -148,6 +155,7 @@ server.kicked.nameEmpty = Your chosen name is invalid.
|
|||||||
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
||||||
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Game over!
|
||||||
|
server.kicked.serverRestarting = The server is restarting.
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
||||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
||||||
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
||||||
@@ -638,6 +646,7 @@ setting.screenshake.name = Screen Shake
|
|||||||
setting.effects.name = Display Effects
|
setting.effects.name = Display Effects
|
||||||
setting.destroyedblocks.name = Display Destroyed Blocks
|
setting.destroyedblocks.name = Display Destroyed Blocks
|
||||||
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
|
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
|
||||||
|
setting.coreselect.name = Allow Schematic Cores
|
||||||
setting.sensitivity.name = Controller Sensitivity
|
setting.sensitivity.name = Controller Sensitivity
|
||||||
setting.saveinterval.name = Save Interval
|
setting.saveinterval.name = Save Interval
|
||||||
setting.seconds = {0} seconds
|
setting.seconds = {0} seconds
|
||||||
@@ -749,6 +758,7 @@ rules.enemyCheat = Infinite AI (Red Team) Resources
|
|||||||
rules.unitdrops = Unit Drops
|
rules.unitdrops = Unit Drops
|
||||||
rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier
|
rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier
|
||||||
rules.unithealthmultiplier = Unit Health Multiplier
|
rules.unithealthmultiplier = Unit Health Multiplier
|
||||||
|
rules.blockhealthmultiplier = Block Health Multiplier
|
||||||
rules.playerhealthmultiplier = Player Health Multiplier
|
rules.playerhealthmultiplier = Player Health Multiplier
|
||||||
rules.playerdamagemultiplier = Player Damage Multiplier
|
rules.playerdamagemultiplier = Player Damage Multiplier
|
||||||
rules.unitdamagemultiplier = Unit Damage Multiplier
|
rules.unitdamagemultiplier = Unit Damage Multiplier
|
||||||
|
|||||||
@@ -1,241 +1,257 @@
|
|||||||
credits.text = Vytvořil [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
credits.text = Vytvořil [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
||||||
credits = Kredity
|
credits = Titulky
|
||||||
contributors = Překladatelé a Sponzoři
|
contributors = Překladatelé a sponzoři
|
||||||
discord = Připoj se k Mindustry na Discordu!
|
discord = Připoj se k Mindustry na Discord serveru!
|
||||||
link.discord.description = Oficiální Mindustry chatroom na Discordu!
|
link.discord.description = Oficiální kanál Mindustry na serveru Discord
|
||||||
link.reddit.description = The Mindustry subreddit
|
link.reddit.description = Mindustry na Redditu
|
||||||
link.github.description = Zdrojový kód hry
|
link.github.description = Zdrojový kód hry
|
||||||
link.changelog.description = Seznam úprav
|
link.changelog.description = Seznam úprav
|
||||||
link.dev-builds.description = Nestabilní verze vývoje hry
|
link.dev-builds.description = Nestabilní vývojová verze hry
|
||||||
link.trello.description = Oficiální Trello board pro plánované funkce
|
link.trello.description = Oficiální Trello nástěnka s plánovanými novinkami
|
||||||
link.itch.io.description = itch.io stránka pro stažení PC nebo webové verze
|
link.itch.io.description = Stránka na itch.io s odkazy na stažení hry
|
||||||
link.google-play.description = Google Play store
|
link.google-play.description = Obchod Google Play
|
||||||
link.wiki.description = Oficiální Mindustry wiki
|
link.f-droid.description = Katalog F-Droid
|
||||||
linkfail = Nepodařilo se otevřít odkaz!\nURL byla zkopírována do schránky.
|
link.wiki.description = Oficiální Wiki Mindustry
|
||||||
|
link.feathub.description = Navrhni něco nového do hry!
|
||||||
|
linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky.
|
||||||
screenshot = Snímek obrazovky uložen {0}
|
screenshot = Snímek obrazovky uložen {0}
|
||||||
screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro snímek obrazovky.
|
screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky.
|
||||||
gameover = Konec hry
|
gameover = Konec hry
|
||||||
gameover.pvp = [accent] {0}[] Tým Vyhrál!
|
gameover.pvp = [accent]{0}[] tým vyhrál!
|
||||||
highscore = [accent]Nový rekord!
|
highscore = [accent]Nový rekord!
|
||||||
copied = Copied.
|
copied = Zkopírováno.
|
||||||
|
|
||||||
load.sound = Zvuky
|
load.sound = Zvuky
|
||||||
load.map = Mapy
|
load.map = Mapy
|
||||||
load.image = Obrázky
|
load.image = Obrázky
|
||||||
load.content = Obsah
|
load.content = Obsah
|
||||||
load.system = System
|
load.system = Systém
|
||||||
load.mod = Módy
|
load.mod = Modifikace
|
||||||
schematic = Schematic
|
load.scripts = Skripty
|
||||||
schematic.add = Save Schematic...
|
|
||||||
schematics = Schematics
|
schematic = Šablona
|
||||||
schematic.replace = A schematic by that name already exists. Replace it?
|
schematic.add = Uložit šablonu...
|
||||||
schematic.import = Import Schematic...
|
schematics = Šablony
|
||||||
schematic.exportfile = Export File
|
schematic.replace = Šablona tohoto jména již existuje. Chceš ji nahradit?
|
||||||
schematic.importfile = Import File
|
schematic.import = Importovat šablonu...
|
||||||
schematic.browseworkshop = Browse Workshop
|
schematic.exportfile = Exportovat soubor
|
||||||
schematic.copy = Copy to Clipboard
|
schematic.importfile = Importovat soubor
|
||||||
schematic.copy.import = Import from Clipboard
|
schematic.browseworkshop = Procházet dílnu
|
||||||
schematic.shareworkshop = Share on Workshop
|
schematic.copy = Zkopírovat do schránky
|
||||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic
|
schematic.copy.import = Importovat ze schránky
|
||||||
schematic.saved = Schematic saved.
|
schematic.shareworkshop = Sdílet skrze Steam Workshop
|
||||||
schematic.delete.confirm = This schematic will be utterly eradicated.
|
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Převrátit šablonu
|
||||||
schematic.rename = Rename Schematic
|
schematic.saved = Šablona byla uložena.
|
||||||
schematic.info = {0}x{1}, {2} blocks
|
schematic.delete.confirm = Šablona bude kompletně vyhlazena.
|
||||||
|
schematic.rename = Přejmenovat šablonu
|
||||||
|
schematic.info = {0}x{1}, {2} bloků
|
||||||
|
|
||||||
stat.wave = Vln poraženo:[accent] {0}
|
stat.wave = Vln poraženo:[accent] {0}
|
||||||
stat.enemiesDestroyed = Nepřátel zničeno:[accent] {0}
|
stat.enemiesDestroyed = Nepřátel zničeno:[accent] {0}
|
||||||
stat.built = Budov postaveno:[accent] {0}
|
stat.built = Budov postaveno:[accent] {0}
|
||||||
stat.destroyed = Budov zničeno:[accent] {0}
|
stat.destroyed = Budov zničeno:[accent] {0}
|
||||||
stat.deconstructed = Budov rozebráno:[accent] {0}
|
stat.deconstructed = Budov rozebráno:[accent] {0}
|
||||||
stat.delivered = Materiálu odesláno:
|
stat.delivered = Materiálu vysláno:
|
||||||
stat.rank = Závěrečné hodnocení: [accent]{0}
|
stat.rank = Celková známka: [accent]{0}
|
||||||
launcheditems = [accent]Odeslané předměty
|
|
||||||
launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue.
|
launcheditems = [accent]Vyslané předměty[]
|
||||||
map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"?
|
launchinfo = [unlaunched][Je třeba [LAUNCH] Tvé jádro, abys získal věci vyznačené modře.
|
||||||
level.highscore = Nejvyšší skóre: [accent]{0}
|
map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"?
|
||||||
level.select = Výběr levelu
|
level.highscore = Nejvyšší skóre: [accent]{0}[]
|
||||||
|
level.select = Výběr úrovně
|
||||||
level.mode = Herní mód:
|
level.mode = Herní mód:
|
||||||
showagain = Znovu neukazovat !
|
showagain = Znovu neukazovat
|
||||||
coreattack = < Jádro je pod útokem! >
|
coreattack = < Jádro je pod útokem! >
|
||||||
nearpoint = [[ [scarlet]IHNED OPUSŤTE PROSTOR VÝSADKŮ[] ]\nNebezpečí okamžité smrti
|
nearpoint = [ [scarlet]IHNED OPUSŤTE PROSTOR VÝSADKU[] ]\nNebezpečí okamžité smrti!
|
||||||
database = Databáze objektů
|
database = Databáze objektů ve hře
|
||||||
savegame = Uložit hru
|
savegame = Uložit hru
|
||||||
loadgame = Načíst hru
|
loadgame = Načíst hru
|
||||||
joingame = Připojit se ke hře
|
joingame = Připojit se ke hře
|
||||||
customgame = Vlastní hra
|
customgame = Vlastní hra
|
||||||
newgame = Nová hra
|
newgame = Nová hra
|
||||||
none = <žádný>
|
none = <žádný>
|
||||||
minimap = Minimapa
|
minimap = Mapička
|
||||||
position = Position
|
position = Pozice
|
||||||
close = Zavřít
|
close = Zavřít
|
||||||
website = Web. stránky
|
website = Webové stránky
|
||||||
quit = Ukončit
|
quit = Ukončit
|
||||||
save.quit = Uložit a ukončit
|
save.quit = Uložit a ukončit
|
||||||
maps = Mapy
|
maps = Mapy
|
||||||
maps.browse = Procházet mapy
|
maps.browse = Procházet mapy
|
||||||
continue = Pokračovat
|
continue = Pokračovat
|
||||||
maps.none = [LIGHT_GRAY]Žádné mapy nebyly nalezeny!
|
maps.none = [LIGHT_GRAY]Mapy nebyly nalezeny.
|
||||||
invalid = Neplatné
|
invalid = Neplatné
|
||||||
preparingconfig = Připravuji Config
|
pickcolor = Vyber barvu
|
||||||
preparingcontent = Připravuji obsah
|
preparingconfig = Připravuji konfiguraci
|
||||||
uploadingcontent = Nahrávám obsah
|
preparingcontent = Připravuji obsah hry
|
||||||
uploadingpreviewfile = Nahrávám prohlížecí soubor
|
uploadingcontent = Nahrávám obsah hry
|
||||||
|
uploadingpreviewfile = Nahrávám soubor s náhledem
|
||||||
committingchanges = Provádím změny
|
committingchanges = Provádím změny
|
||||||
done = Hotovo
|
done = Hotovo
|
||||||
feature.unsupported = Your device does not support this feature.
|
feature.unsupported = Tvoje zařízení nepodporuje tuto vlastnost hry.
|
||||||
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
|
|
||||||
mods.alpha = [accent](Alpha)
|
mods.alphainfo = Měj na paměti, že modifikace jsou stále v alfa fázi vývoje a mohou být [scarlet]velmi chybové[].\nNahlaš, prosím, jakékoliv závady na GitHub nebo Discord serveru Mindustry. Děkujeme!
|
||||||
mods = Mods
|
mods.alpha = [accent](Alfa)[]
|
||||||
mods.none = [LIGHT_GRAY]No mods found!
|
mods = Modifikace
|
||||||
mods.guide = Modding Guide
|
mods.none = [LIGHT_GRAY]Modifikace nebyly nalezeny.[]
|
||||||
mods.report = Report Bug
|
mods.guide = Průvodce modifikacemi
|
||||||
mods.openfolder = Open Mod Folder
|
mods.report = Nahlásit závadu
|
||||||
mod.enabled = [lightgray]Enabled
|
mods.openfolder = Otevřít složku s modifikacemi
|
||||||
mod.disabled = [scarlet]Disabled
|
mod.enabled = [lightgray]Povoleno[]
|
||||||
mod.disable = Disable
|
mod.disabled = [scarlet]Zakázáno[]
|
||||||
mod.delete.error = Unable to delete mod. File may be in use.
|
mod.disable = Zakázat
|
||||||
mod.missingdependencies = [scarlet]Missing dependencies: {0}
|
mod.delete.error = Nebylo možnost smazat modifikaci. Soubor může být používán.
|
||||||
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled.
|
mod.requiresversion = [scarlet]Minimální požadovaná verze hry:: [accent]{0}[]
|
||||||
mod.enable = Enable
|
mod.missingdependencies = [scarlet]Chybějící závislosti: {0}
|
||||||
mod.requiresrestart = The game will now close to apply the mod changes.
|
mod.erroredcontent = [scarlet]Chyby v obsahu
|
||||||
mod.reloadrequired = [scarlet]Reload Required
|
mod.errors = Při načítání obsahu hry se vyskytly problémy.
|
||||||
mod.import = Import Mod
|
mod.noerrorplay = [scarlet]Máš modifikace s chybami.[] Buď zakaž dotčené modifikace, nebo oprav chyby před tím, než začneš hrát.
|
||||||
mod.import.github = Import GitHub Mod
|
mod.nowdisabled = [scarlet]Modifikaci '{0}' chybí tyto závislosti: [accent]{1}\n[lightgray]Tyto modifikace je třeba nejprve stáhnout.\nTato modifikace bude nyní automaticky zakázána.
|
||||||
mod.remove.confirm = This mod will be deleted.
|
mod.enable = Povolit
|
||||||
mod.author = [LIGHT_GRAY]Author:[] {0}
|
mod.requiresrestart = Hra bude ukončena, aby bylo možné nasadit modifikace.
|
||||||
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
|
mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry.
|
||||||
mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again.
|
mod.import = Importovat modifikaci
|
||||||
mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods.
|
mod.import.github = Import modifikaci z GitHubu
|
||||||
|
mod.item.remove = Tato položka je součástí [accent]'{0}'[] modifikace. Pokud ji chcete odstranit, odinstalujte tuto modifikaci.
|
||||||
|
mod.remove.confirm = Tato modifikace bude odstraněna.
|
||||||
|
mod.author = [LIGHT_GRAY]Autor:[] {0}
|
||||||
|
mod.missing = Toto uložení hra obsahuje modifikace, které byly nedávno aktualizovány, nebo již nejsou nainstalovány. Použití tohoto uložení může vést k chybám. Jsi si jist, že chceš nahrát toto uložení hry?\n[lightgray]Modifikace:\n{0}
|
||||||
|
mod.preview.missing = Než vystavíš svou modifikaci v dílně, musíš přidat obrázek pro náhled.\nUmísti obrázek pojmenovaný [accent]preview.png[] do složky modifikace a zkus to znovu.
|
||||||
|
mod.folder.missing = V dílně mohou být publikovány pouze modifikace ve formě složky.\nAbys převedl modifikaci na formu složky, jednoduše rozbal zip soubor do složky a smaž starý zip soubor. Potom znovu spusť hru nebo znovu načti modifikace.
|
||||||
|
mod.scripts.unsupported = Tvoje zařízení nepodporuje skripty. Některé modifikace nemusí správně fungovat.
|
||||||
|
|
||||||
about.button = O hře
|
about.button = O hře
|
||||||
name = Jméno:
|
name = Jméno:
|
||||||
noname = Nejdřív si vyber[accent] herní jméno[].
|
noname = Nejdřív si vyber [accent]jméno ve hře[].
|
||||||
filename = Jméno složky:
|
filename = Název souboru:
|
||||||
unlocked = Nový blok odemčen!
|
unlocked = Byl odemmknut nový blok!
|
||||||
completed = [accent]Dokončeno
|
completed = [accent]Dokončeno
|
||||||
techtree = Technologie
|
techtree = Technologie
|
||||||
research.list = [LIGHT_GRAY]Výzkum:
|
research.list = [LIGHT_GRAY]Výzkum:
|
||||||
research = Výzkum
|
research = Výzkum
|
||||||
researched = [LIGHT_GRAY]{0} vyzkoumán(o).
|
researched = Výzkumu dokončeno: [LIGHT_GRAY]{0}[].
|
||||||
players = {0} hráčů online
|
players = Hráčů: {0}
|
||||||
players.single = {0} hráč online
|
players.single = Hráč: {0}
|
||||||
server.closing = [accent]Zavírám server...
|
server.closing = [accent]Ukončuji server...
|
||||||
server.kicked.kick = Byl jsi vykopnut ze serveru!
|
server.kicked.kick = Byl jsi vykopnut ze serveru!
|
||||||
server.kicked.whitelist = Na server ti nebyl udělen přístup.
|
server.kicked.whitelist = Na server Ti nebyl udělen přístup.
|
||||||
server.kicked.serverClose = Server je zavřený.
|
server.kicked.serverClose = Server není otevřený.
|
||||||
server.kicked.vote = Byl jsi odhlasován a vykopnut. Sbohem.
|
server.kicked.vote = Bylo odhlasováno, že budeš vykopnut ze serveru. Tak čau.
|
||||||
server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru!
|
server.kicked.clientOutdated = Byl detekována zastaralá verze klienta hry. Aktualizuj si hru!
|
||||||
server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci!
|
server.kicked.serverOutdated = Byl detekována zastaralá verze serveru. Požádej hostitele o aktualizaci!
|
||||||
server.kicked.banned = Jsi zabanován na tomto serveru.
|
server.kicked.banned = Byl Ti zakázán přístup na tento server.
|
||||||
server.kicked.typeMismatch = Tento server není kompatibilní s verzí tvého klienta
|
server.kicked.typeMismatch = Tento server není kompatibilní s verzí Tvého klienta.
|
||||||
server.kicked.playerLimit = Tento server je plný, vyčkej na volné místo.
|
server.kicked.playerLimit = Tento server je plný, vyčkej prosím, až se uvolní místo.
|
||||||
server.kicked.recentKick = Před nedávnem jsi byl vykopnut.\nPočkej než se znovu připojíš.
|
server.kicked.recentKick = Před nedávnem jsi byl vykopnut z tohoto serveru.\nPočkej proto chvíli, než se zkusíš znovu připojit.
|
||||||
server.kicked.nameInUse = Někdo se stejným jménem\nje aktuálně na serveru.
|
server.kicked.nameInUse = Někdo se stejným jménem jako Ty\nje aktuálně přihlášen na serveru.
|
||||||
server.kicked.nameEmpty = Tvé jméno je neplatné.
|
server.kicked.nameEmpty = Tvé jméno není platné. Možná je prostě jen není nastaveno?
|
||||||
server.kicked.idInUse = Již jsi na tomhle serveru připojen! Připojování se dvěma účty není povoleno.
|
server.kicked.idInUse = Na tomhle serveru jsi již připojen. Připojování se pod dvěma účty není dovoleno!
|
||||||
server.kicked.customClient = Tento server nepodporuje vlastní verze hry. Stáhni si oficiální verzi.
|
server.kicked.customClient = Tento server nepodporuje upravené verze hry. Stáhni si, prosím. oficiální verzi.
|
||||||
server.kicked.gameover = Konec hry!
|
server.kicked.gameover = Konec hry!
|
||||||
server.versions = Verze klienta:[accent] {0}[]\nVerze serveru:[accent] {1}[]
|
server.versions = Verze klienta: [accent]{0}[]\nVerze serveru: [accent]{1}[]
|
||||||
host.info = [accent]hostitel[] hostuje server na portu [scarlet]6567[]. \nKdokoliv na stejné [LIGHT_GRAY]wifi nebo místní síti[] by měl vidět server ve svém listu serverů.\n\nJestli chcete aby se uživatelé připojovali odkudkoliv pomocí IP, [accent]přesměrování portů[] je nutné.\n\n[LIGHT_GRAY]Poznámka: Jestli někdo má problém s připojením ke své LAN hře, ujistěte se že má Mindustry povolený přístup k místní síti v nastavení Firewallu.
|
host.info = Tento [accent]hostitel[] hostuje server na portu [scarlet]6567[]. \nKdokoliv na stejné [LIGHT_GRAY]síti Wifi nebo LAN (místní)[] by měl vidět server ve svém listu serverů.\n\nJestliže chcete, aby se uživatelé připojovali odkudkoliv pomocí adresy IP, může být nezbytné nastavit [accent]přesměrování portů[].\n\n[LIGHT_GRAY]Poznámka: Jestliže má někdo problém s připojením k LAN hře, ujisti se, že má program Mindustry povolený přístup k místní síti v nastavení místního firewallu.
|
||||||
join.info = Tady můžeš vložit [accent]IP serveru[] ke kterému se chceš připojit, nebo objevit [accent]Servery Místní sítě[] ke kterým se chceš připojit.\nLAN i Multiplayer jsou podporovány.\n\n[LIGHT_GRAY]Poznámka: Není žádný globální seznam serverů; Pokud se budeš chtít připojit k někomu pomocí IP, budeš jí muset znát od hostitele.
|
join.info = Zde můžeš vložit [accent]adresu IP serveru[], ke kterému se chceš připojit, nebo zkusit nalézt [accent]servery v místní síti[], ke kterým se můžeš připojit.\nJsou podporovány režimy hry více hráčů přes LAN i WAN.\n\n[LIGHT_GRAY]Poznámka: Neexistuje automatický globální seznam serverů Mindustry. Pokud se chceš k někomu připojit pomocí adresy IP, budeš ji muset znát od hostitele.
|
||||||
hostserver = Hostovat hru
|
hostserver = Hostovat hru více hráčů
|
||||||
invitefriends = Pozvat přátele
|
invitefriends = Pozvat přátele
|
||||||
hostserver.mobile = Hostovat\nHru
|
hostserver.mobile = Hostovat\nhru
|
||||||
host = Hostitel
|
host = Hostitel
|
||||||
hosting = [accent]Otevírám server...
|
hosting = [accent]Otevírám server...
|
||||||
hosts.refresh = Obnovit
|
hosts.refresh = Obnovit
|
||||||
hosts.discovering = Hledám hry LAN
|
hosts.discovering = Hledám hry v místní síti (LAN)
|
||||||
hosts.discovering.any = Hledám hry
|
hosts.discovering.any = Hledám hry
|
||||||
server.refreshing = Obnovuji servery
|
server.refreshing = Aktualizuji stav serverů
|
||||||
hosts.none = [lightgray]Žádné místní hry nebyly nalezeny!
|
hosts.none = [lightgray]Žádné místní hry nebyly nalezeny![]
|
||||||
host.invalid = [scarlet]Nejde se připojit k hostiteli.
|
host.invalid = [scarlet]Nejde se připojit k hostiteli.[]
|
||||||
trace = Vystopovat hráče
|
trace = Vystopovat hráče
|
||||||
trace.playername = Jméno hráče: [accent]{0}
|
trace.playername = Jméno hráče: [accent]{0}[]
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = Adresa IP: [accent]{0}[]
|
||||||
trace.id = Unikátní ID: [accent]{0}
|
trace.id = Unikátní ID: [accent]{0}[]
|
||||||
trace.mobile = Mobilní klient: [accent]{0}
|
trace.mobile = Mobilní klient hry: [accent]{0}[]
|
||||||
trace.modclient = Vlastní Klient: [accent]{0}
|
trace.modclient = Upravený klient hry: [accent]{0}[]
|
||||||
invalidid = Neplatná IP klienta! Poslat zprávu o chybě.
|
invalidid = Neplatná adresa IP klienta! Zašli prosím zprávu o chybě.
|
||||||
server.bans = Bany.
|
server.bans = Zákazy
|
||||||
server.bans.none = Žádní hráči s banem nebyli nalezeni.
|
server.bans.none = Žádní hráči se zákazem nebyli nalezeni.
|
||||||
server.admins = Admini
|
server.admins = Správci
|
||||||
server.admins.none = Žádní admini nebyli nalezeni.
|
server.admins.none = Žádní správci nebyli nalezeni.
|
||||||
server.add = Přidat server
|
server.add = Přidat server
|
||||||
server.delete = Jsi si jistý že chceš smazat tento server?
|
server.delete = Jsi si jistý, že chceš smazat tento server?
|
||||||
server.edit = Upravit server
|
server.edit = Upravit server
|
||||||
server.outdated = [crimson]Zastaralý server![]
|
server.outdated = [crimson]Zastaralá verze serveru![]
|
||||||
server.outdated.client = [crimson]Zastaralý klient![]
|
server.outdated.client = [crimson]Zastaralá verze klienta![]
|
||||||
server.version = [lightgray]Verze: {0} {1}
|
server.version = [lightgray]Verze: {0} {1}[]
|
||||||
server.custombuild = [yellow]Vlastní verze
|
server.custombuild = [yellow]Upravená verze hry[]
|
||||||
confirmban = Jsi si jistý že chceš zabanovat tohoto hráče?
|
confirmban = Jsi si jistý, že chceš zakázat tohoto hráče?
|
||||||
confirmkick = Jsi si jistý že chceš vykopnout tohoto hráče?
|
confirmkick = Jsi si jistý, že chceš vykopnout tohoto hráče?
|
||||||
confirmvotekick = Jsi si jistý že chceš hlasovat pro vykopnutí tohoto hráče?
|
confirmvotekick = Jsi si jistý, že chceš hlasovat pro vykopnutí tohoto hráče?
|
||||||
confirmunban = Jsi si jistý že chceš odbanovat tohoto hráče
|
confirmunban = Jsi si jistý, že chceš zrušit zákaz pro tohoto hráče?
|
||||||
confirmadmin = Jsi si jistý že chceš tohoto hráče pasovat na admina?
|
confirmadmin = Jsi si jistý, že chceš tohoto hráče povýšit na admina?
|
||||||
confirmunadmin = Jsi si jistý že chceš odebrat práva tomuto hráči?
|
confirmunadmin = Jsi si jistý, že chceš odebrat správcovská práva tomuto hráči?
|
||||||
joingame.title = Připojit se ke hře
|
joingame.title = Připojit se ke hře
|
||||||
joingame.ip = Adresa:
|
joingame.ip = Adresa IP:
|
||||||
disconnect = Odpojen.
|
disconnect = Odpojeno.
|
||||||
disconnect.error = Chyba připojení.
|
disconnect.error = Chyba připojení.
|
||||||
disconnect.closed = Připojení bylo uzavřeno.
|
disconnect.closed = Připojení bylo uzavřeno.
|
||||||
disconnect.timeout = Vypršel čas pro připojení.
|
disconnect.timeout = Vypršel čas pro připojení.
|
||||||
disconnect.data = Chyba načtení dat světa!
|
disconnect.data = Chyba načtení dat ze serveru!
|
||||||
cantconnect = Není možno připojit se ke hře ([accent]{0}[]).
|
cantconnect = Není možno se připojit ke hře ([accent]{0}[]).
|
||||||
connecting = [accent]Připojuji se...
|
connecting = [accent]Připojuji se...
|
||||||
connecting.data = [accent]Načítám data světa...
|
connecting.data = [accent]Načítám data ze serveru...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
server.addressinuse = Adresu již někdo používá!
|
server.addressinuse = Adresu již někdo používá!
|
||||||
server.invalidport = Neplatné číslo portu!
|
server.invalidport = Neplatné číslo portu!
|
||||||
server.error = [crimson]Chyba při hostování serveru: [accent]{0}
|
server.error = [crimson]Chyba při hostování serveru.[]
|
||||||
save.new = Nové uložení
|
save.new = Nové uložení hry
|
||||||
save.overwrite = Jsi si jistý že chceš přepsat\ntento ukládaci slot?
|
save.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry?
|
||||||
overwrite = Přepsat
|
overwrite = Přepsat
|
||||||
save.none = Žádné uložené pozice nebyly nalezeny
|
save.none = Žádné uložené pozice nebyly nalezeny.
|
||||||
saveload = [accent]Ukládám...
|
saveload = [accent]Ukládám...[]
|
||||||
savefail = Nepodařilo se uložit hru!
|
savefail = Nepodařilo se uložit hru!
|
||||||
save.delete.confirm = Jsi si jistý že chceš smazat toto uložení?
|
save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry?
|
||||||
save.delete = Smazat
|
save.delete = Smazat
|
||||||
save.export = Exportovat uložení
|
save.export = Exportovat uložení hry
|
||||||
save.import.invalid = [accent]Toto uložení je neplatné!
|
save.import.invalid = [accent]Toto uložení není v pořádku![]
|
||||||
save.import.fail = [crimson]Nepodařilo se importovat uložení: [accent]{0}
|
save.import.fail = [crimson]Nepodařilo se importovat uložení hry: [accent]{0}[]
|
||||||
save.export.fail = [crimson]Nepodařilo se exportovat uložení: [accent]{0}
|
save.export.fail = [crimson]Nepodařilo se exportovat uložení hry: [accent]{0}[]
|
||||||
save.import = Importovat uložení
|
save.import = Importovat uložení hry
|
||||||
save.newslot = Uložit hru:
|
save.newslot = Uložit hru:
|
||||||
save.rename = Přejmenovat
|
save.rename = Přejmenovat
|
||||||
save.rename.text = Nové jméno:
|
save.rename.text = Nové jméno:
|
||||||
selectslot = Vyber uložení.
|
selectslot = Vyber pozici pro uložení hry.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Pozice {0}[]
|
||||||
editmessage = Upravit zprávu
|
editmessage = Upravit zprávu
|
||||||
save.corrupted = [accent]Uložení je poškozené nebo neplatné\nPokud jsi právě aktualizoval svou hru, je to možná změnou formátu pro ukládání a [scarlet]NE[] chyba hry.
|
save.corrupted = [accent]Uložení je poškozené nebo neplatné.
|
||||||
empty = <Prázný>
|
empty = <Prázný>
|
||||||
on = On
|
on = On
|
||||||
off = Off
|
off = Off
|
||||||
save.autosave = Automatické uložení: {0}
|
save.autosave = Automatické uložení: {0}
|
||||||
save.map = Mapa: {0}
|
save.map = Mapa: {0}
|
||||||
save.wave = Vlna {0}
|
save.wave = Vlna: {0}
|
||||||
save.mode = Herní mod: {0}
|
save.mode = Herní mod: {0}
|
||||||
save.date = Naposledy uloženo: {0}
|
save.date = Naposledy uloženo: {0}
|
||||||
save.playtime = Herní čas: {0}
|
save.playtime = Herní čas: {0}
|
||||||
warning = Varování.
|
warning = Varování.
|
||||||
confirm = Potvrdit
|
confirm = Potvrdit
|
||||||
delete = Smazat
|
delete = Smazat
|
||||||
view.workshop = Prohlédnout ve workshopu
|
view.workshop = Prohlédnout v dílně
|
||||||
workshop.listing = Edit Workshop Listing
|
workshop.listing = Upravit popis v dílně
|
||||||
ok = OK
|
ok = OK
|
||||||
open = Otevřít
|
open = Otevřít
|
||||||
customize = Přizpůsobit
|
customize = Přizpůsobit pravidla
|
||||||
cancel = Zrušit
|
cancel = Zrušit
|
||||||
openlink = Otevřít Odkaz
|
openlink = Otevřít odkaz
|
||||||
copylink = Zkopírovat Odkaz
|
copylink = Zkopírovat odkaz
|
||||||
back = Zpět
|
back = Zpět
|
||||||
data.export = Exportuj Data
|
data.export = Exportuj data
|
||||||
data.import = Importuj Data
|
data.import = Importuj data
|
||||||
data.exported = Data exportována.
|
data.exported = Data exportována.
|
||||||
data.invalid = Neplatná herní data.
|
data.invalid = Herní data nejsou v pořádku.
|
||||||
data.import.confirm = Import externích dat smaže[scarlet] všechna[] vaše současná herní data.\n[accent]To nelze vrátit zpět![]\n\nPo importu data se hra ukončí.
|
data.import.confirm = Import externích dat smaže [scarlet]všechna[] Tvoje současná herní data.\n[accent]Toto nelze vrátit zpět![]\n\nPo importu dat se hra bezprostředně sama ukončí.
|
||||||
classic.export = Exportovat klasická data
|
classic.export = Exportovat data pro verzi Classic
|
||||||
classic.export.text = [accent]Mindustry[] právě mělo významně velkou aktualizaci.\nKlasické (v3.5 build 40) uložení nebo mapa byly detekovány. Chtěl by jsi exportovat toto uložení do domácího adresáře tvého zařízení , pro pozdější použití v klasické verzi Mindustry ?
|
classic.export.text = [accent]Mindustry[] mělo významnou aktualizaci.\nByly detekovány uložení hry nebo mapy pro předchozí verzi Classic (v3.5 build 40). Chtěl bys exportovat tato uložení do domovského zařízení Tvého telefonu, pro pozdější použití v této verzi Mindustry Classic?
|
||||||
quit.confirm = Jsi si jistý že chceš ukončit ?
|
quit.confirm = Jsi si jistý, že chceš ukončit hru?
|
||||||
quit.confirm.tutorial = Jste si vážně jist?\nTutoriál se dá znovu spustit v[accent] Nastavení->Hra->Spusť Tutoriál.[]
|
quit.confirm.tutorial = Jsi si jistý?\nTutoriál je možné znovu spustit v [accent]Nastavení->Hra->Zopáknout si výuku[].
|
||||||
loading = [accent]Načítám...
|
loading = [accent]Načítám...
|
||||||
reloading = [accent]načítám módy ...
|
reloading = [accent]Načítám modifikace...
|
||||||
saving = [accent]Ukládám...
|
saving = [accent]Ukládám...
|
||||||
cancelbuilding = [accent][[{0}][] to clear plan
|
cancelbuilding = [accent][[{0}][] to clear plan
|
||||||
selectschematic = [accent][[{0}][] to select+copy
|
selectschematic = [accent][[{0}][] to select+copy
|
||||||
@@ -246,8 +262,8 @@ wave.waiting = [LIGHT_GRAY]Vlna za {0}
|
|||||||
wave.waveInProgress = [LIGHT_GRAY]Vlna v pohybu
|
wave.waveInProgress = [LIGHT_GRAY]Vlna v pohybu
|
||||||
waiting = [LIGHT_GRAY]Čekám...
|
waiting = [LIGHT_GRAY]Čekám...
|
||||||
waiting.players = Čekání na hráče...
|
waiting.players = Čekání na hráče...
|
||||||
wave.enemies = [LIGHT_GRAY]{0} Nepřátel zbývá
|
wave.enemies = [LIGHT_GRAY]{0} zbývajících nepřátel
|
||||||
wave.enemy = [LIGHT_GRAY]{0} Nepřítel zbývá
|
wave.enemy = [LIGHT_GRAY]{0} zbývající nepřítel
|
||||||
loadimage = Nahrát obrázek
|
loadimage = Nahrát obrázek
|
||||||
saveimage = Uložit obrázek
|
saveimage = Uložit obrázek
|
||||||
unknown = Neznámý
|
unknown = Neznámý
|
||||||
@@ -420,12 +436,12 @@ launch = Vyslat
|
|||||||
launch.title = Vyslání úspěšné
|
launch.title = Vyslání úspěšné
|
||||||
launch.next = [LIGHT_GRAY]další možnost až ve vlně {0}
|
launch.next = [LIGHT_GRAY]další možnost až ve vlně {0}
|
||||||
launch.unable2 = [scarlet]Není možno vyslat.[]
|
launch.unable2 = [scarlet]Není možno vyslat.[]
|
||||||
launch.confirm = Toto vyšle veškeré suroviny ve tvém jádru .\nJiž se na tuto základnu nebudeš moci vrátit.
|
launch.confirm = Chystáš se opustit tuto základnu. Kliknutím na OK vyšleš veškeré suroviny ve tvém jádře.\nJiž se na tuto základnu nebudeš moci vrátit.
|
||||||
launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až v pozdější fázi.
|
launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až v pozdější vlně.
|
||||||
uncover = Odkrýt
|
uncover = Odkrýt
|
||||||
configure = Přizpůsobit vybavení
|
configure = Přizpůsobit vybavení
|
||||||
bannedblocks = Banned Blocks
|
bannedblocks = Zakázané bloky
|
||||||
addall = Add All
|
addall = Přidat vše
|
||||||
configure.locked = [LIGHT_GRAY]Dosáhni vlny {0}\nk nastavení svého vybavení.
|
configure.locked = [LIGHT_GRAY]Dosáhni vlny {0}\nk nastavení svého vybavení.
|
||||||
configure.invalid = Hodnota musí být mezi 0 a{0}.
|
configure.invalid = Hodnota musí být mezi 0 a{0}.
|
||||||
zone.unlocked = [LIGHT_GRAY]{0} odemčeno.
|
zone.unlocked = [LIGHT_GRAY]{0} odemčeno.
|
||||||
@@ -642,9 +658,9 @@ keybind.screenshot.name = Sníměk mapy
|
|||||||
keybind.move_x.name = Pohyb na X
|
keybind.move_x.name = Pohyb na X
|
||||||
keybind.move_y.name = Pohyb na Y
|
keybind.move_y.name = Pohyb na Y
|
||||||
keybind.schematic_select.name = Select Region
|
keybind.schematic_select.name = Select Region
|
||||||
keybind.schematic_menu.name = Schematic Menu
|
keybind.schematic_menu.name = Šablona Menu
|
||||||
keybind.schematic_flip_x.name = Flip Schematic X
|
keybind.schematic_flip_x.name = Flip Šablona X
|
||||||
keybind.schematic_flip_y.name = Flip Schematic Y
|
keybind.schematic_flip_y.name = Flip Šablona Y
|
||||||
keybind.fullscreen.name = Toggle Fullscreen
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Vybrat/Střílet
|
keybind.select.name = Vybrat/Střílet
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
@@ -671,18 +687,18 @@ keybind.drop_unit.name = Zahodit jednotku
|
|||||||
keybind.zoom_minimap.name = Přiblížit minimapu
|
keybind.zoom_minimap.name = Přiblížit minimapu
|
||||||
mode.help.title = Popis módů
|
mode.help.title = Popis módů
|
||||||
mode.survival.name = Survival
|
mode.survival.name = Survival
|
||||||
mode.survival.description = Normální mód .Limitované suroviny a automatické přepínání vln.
|
mode.survival.description = Normální mód. Limitované suroviny a automatické přepínání vln.
|
||||||
mode.sandbox.name = Sandbox
|
mode.sandbox.name = Sandbox
|
||||||
mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel.
|
mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel.
|
||||||
mode.editor.name = Editor
|
mode.editor.name = Editor
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti.
|
mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti.
|
||||||
mode.attack.name = Útok
|
mode.attack.name = Útok
|
||||||
mode.attack.description = Bez vln znič nepř@telsou základnu.
|
mode.attack.description = Bez vln znič nepřátelskou základnu.
|
||||||
mode.custom = Custom Rules
|
mode.custom = Custom Rules
|
||||||
rules.infiniteresources = Nekonečno surovin
|
rules.infiniteresources = Nekonečno surovin
|
||||||
rules.wavetimer = Časovač vln
|
rules.wavetimer = Časovač vln
|
||||||
rules.waves = Wlny
|
rules.waves = Vlny
|
||||||
rules.attack = Attack Mode
|
rules.attack = Attack Mode
|
||||||
rules.enemyCheat = Infinite AI Resources
|
rules.enemyCheat = Infinite AI Resources
|
||||||
rules.unitdrops = Unit Drops
|
rules.unitdrops = Unit Drops
|
||||||
@@ -708,7 +724,7 @@ rules.title.enemy = Nepřátelé
|
|||||||
rules.title.unit = Jednotky
|
rules.title.unit = Jednotky
|
||||||
content.item.name = Předměty
|
content.item.name = Předměty
|
||||||
content.liquid.name = Tekutiny
|
content.liquid.name = Tekutiny
|
||||||
content.unit.name = jednotky
|
content.unit.name = Jednotky
|
||||||
content.block.name = Blocks
|
content.block.name = Blocks
|
||||||
content.mech.name = Mechy
|
content.mech.name = Mechy
|
||||||
item.copper.name = Měď
|
item.copper.name = Měď
|
||||||
@@ -726,7 +742,7 @@ item.sand.name = Písek
|
|||||||
item.blast-compound.name = Výbušná směs
|
item.blast-compound.name = Výbušná směs
|
||||||
item.pyratite.name = Pyratite
|
item.pyratite.name = Pyratite
|
||||||
item.metaglass.name = Tvrzené sklo
|
item.metaglass.name = Tvrzené sklo
|
||||||
item.scrap.name = Scrap
|
item.scrap.name = Šrot
|
||||||
liquid.water.name = Voda
|
liquid.water.name = Voda
|
||||||
liquid.slag.name = Rostavené železo
|
liquid.slag.name = Rostavené železo
|
||||||
liquid.oil.name = Ropa
|
liquid.oil.name = Ropa
|
||||||
@@ -738,20 +754,20 @@ mech.delta-mech.name = Delta
|
|||||||
mech.delta-mech.weapon = Obloukový generátor
|
mech.delta-mech.weapon = Obloukový generátor
|
||||||
mech.delta-mech.ability = Průtok
|
mech.delta-mech.ability = Průtok
|
||||||
mech.tau-mech.name = Tau
|
mech.tau-mech.name = Tau
|
||||||
mech.tau-mech.weapon = Restruktní Laser
|
mech.tau-mech.weapon = Restruktní laser
|
||||||
mech.tau-mech.ability = Opravná dávka
|
mech.tau-mech.ability = Opravná dávka
|
||||||
mech.omega-mech.name = Omega
|
mech.omega-mech.name = Omega
|
||||||
mech.omega-mech.weapon = Rojové střely
|
mech.omega-mech.weapon = Rojové střely
|
||||||
mech.omega-mech.ability = Obrněná Konfigurace
|
mech.omega-mech.ability = Obrněná konfigurace
|
||||||
mech.dart-ship.name = Šipka
|
mech.dart-ship.name = Šipka
|
||||||
mech.dart-ship.weapon = Opakovač
|
mech.dart-ship.weapon = Opakovač
|
||||||
mech.javelin-ship.name = Oštěp
|
mech.javelin-ship.name = Oštěp
|
||||||
mech.javelin-ship.weapon = Dávka Raket
|
mech.javelin-ship.weapon = Dávka raket
|
||||||
mech.javelin-ship.ability = Výbojový Posilovač
|
mech.javelin-ship.ability = Výbojový posilovač
|
||||||
mech.trident-ship.name = Trojzubec
|
mech.trident-ship.name = Trojzubec
|
||||||
mech.trident-ship.weapon = Bombová zátoka
|
mech.trident-ship.weapon = Bombová zátoka
|
||||||
mech.glaive-ship.name = Glaiva
|
mech.glaive-ship.name = Glaiva
|
||||||
mech.glaive-ship.weapon = Plamenný Opakovač
|
mech.glaive-ship.weapon = Plamenný opakovač
|
||||||
item.explosiveness = [LIGHT_GRAY]Výbušnost: {0}%
|
item.explosiveness = [LIGHT_GRAY]Výbušnost: {0}%
|
||||||
item.flammability = [LIGHT_GRAY]Zápalnost: {0}%
|
item.flammability = [LIGHT_GRAY]Zápalnost: {0}%
|
||||||
item.radioactivity = [LIGHT_GRAY]Radioaktivita: {0}%
|
item.radioactivity = [LIGHT_GRAY]Radioaktivita: {0}%
|
||||||
@@ -767,34 +783,35 @@ mech.buildspeed = [LIGHT_GRAY]Rychlost stavění: {0}%
|
|||||||
liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Viskozita: {0}
|
liquid.viscosity = [LIGHT_GRAY]Viskozita: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Teplota: {0}
|
liquid.temperature = [LIGHT_GRAY]Teplota: {0}
|
||||||
block.sand-boulder.name = Sand Boulder
|
|
||||||
|
block.sand-boulder.name = Balvan písku
|
||||||
block.grass.name = Tráva
|
block.grass.name = Tráva
|
||||||
block.salt.name = sůl
|
block.salt.name = Sůl
|
||||||
block.saltrocks.name = Solný kámen
|
block.saltrocks.name = Solný kámen
|
||||||
block.pebbles.name = Pebbles
|
block.pebbles.name = Oblázky
|
||||||
block.tendrils.name = Tendrils
|
block.tendrils.name = Tendrils
|
||||||
block.sandrocks.name = Písečný kámen
|
block.sandrocks.name = Písečný kámen
|
||||||
block.spore-pine.name = Spore Pine
|
block.spore-pine.name = Spórová borovice
|
||||||
block.sporerocks.name = Spore Rocks
|
block.sporerocks.name = Spórové kamení
|
||||||
block.rock.name = Rock
|
block.rock.name = Kámen
|
||||||
block.snowrock.name = Sněhový kámen
|
block.snowrock.name = Sněhový kámen
|
||||||
block.snow-pine.name = Snow Pine
|
block.snow-pine.name = Sněžná borovice
|
||||||
block.shale.name = Shale
|
block.shale.name = Břidlice
|
||||||
block.shale-boulder.name = Shale Boulder
|
block.shale-boulder.name = Břidličný balvan
|
||||||
block.moss.name = Mech
|
block.moss.name = Mech
|
||||||
block.shrubs.name = Shrubs
|
block.shrubs.name = Křoví
|
||||||
block.spore-moss.name = Spore Moss
|
block.spore-moss.name = Spórový mech
|
||||||
block.shalerocks.name = Shale Rocks
|
block.shalerocks.name = Břidlicové kamení
|
||||||
block.scrap-wall.name = Stará zeď
|
block.scrap-wall.name = Stará zeď
|
||||||
block.scrap-wall-large.name = Velá stará zeď
|
block.scrap-wall-large.name = Velá stará zeď
|
||||||
block.scrap-wall-huge.name = obří stará zeď
|
block.scrap-wall-huge.name = Obří stará zeď
|
||||||
block.scrap-wall-gigantic.name = Gigantická stará zeď
|
block.scrap-wall-gigantic.name = Gigantická stará zeď
|
||||||
block.thruster.name = Thruster
|
block.thruster.name = Thruster
|
||||||
block.kiln.name = Kiln
|
block.kiln.name = Pec
|
||||||
block.graphite-press.name = Graphitový lis
|
block.graphite-press.name = Graphitový lis
|
||||||
block.multi-press.name = Všětraný lys
|
block.multi-press.name = Všětraný lis
|
||||||
block.constructing = {0} [LIGHT_GRAY](Constructing)
|
block.constructing = {0} [LIGHT_GRAY](Ve výstavbě)
|
||||||
block.spawn.name = Nepřátelský Spawn
|
block.spawn.name = Nepřátelský spawn
|
||||||
block.core-shard.name = Core: Shard
|
block.core-shard.name = Core: Shard
|
||||||
block.core-foundation.name = Core: Foundation
|
block.core-foundation.name = Core: Foundation
|
||||||
block.core-nucleus.name = Core: Nucleus
|
block.core-nucleus.name = Core: Nucleus
|
||||||
@@ -836,14 +853,14 @@ block.dark-panel-6.name = Dark Panel 6
|
|||||||
block.dark-metal.name = Dark Metal
|
block.dark-metal.name = Dark Metal
|
||||||
block.ignarock.name = Igna Rock
|
block.ignarock.name = Igna Rock
|
||||||
block.hotrock.name = Hot Rock
|
block.hotrock.name = Hot Rock
|
||||||
block.magmarock.name = Magma Rock
|
block.magmarock.name = Magmatický kámen
|
||||||
block.cliffs.name = Cliffs
|
block.cliffs.name = Útesy
|
||||||
block.copper-wall.name = Měděná zeď
|
block.copper-wall.name = Měděná zeď
|
||||||
block.copper-wall-large.name = Velká měděná zeď
|
block.copper-wall-large.name = Velká měděná zeď
|
||||||
block.titanium-wall.name = Titanium Zeď
|
block.titanium-wall.name = Titaniová zeď
|
||||||
block.titanium-wall-large.name = Velká Titanium Zeď
|
block.titanium-wall-large.name = Velká titaniová zeď
|
||||||
block.plastanium-wall.name = Plastanium Zeď
|
block.plastanium-wall.name = Plastaniová zeď
|
||||||
block.plastanium-wall-large.name = Velká Plastanium Zeď
|
block.plastanium-wall-large.name = Velká plastaniová zeď
|
||||||
block.phase-wall.name = Fázová stěna
|
block.phase-wall.name = Fázová stěna
|
||||||
block.phase-wall-large.name = Velká fázová stěna
|
block.phase-wall-large.name = Velká fázová stěna
|
||||||
block.thorium-wall.name = Thoriová stěna
|
block.thorium-wall.name = Thoriová stěna
|
||||||
@@ -857,14 +874,14 @@ block.hail.name = Hail
|
|||||||
block.lancer.name = Lancer
|
block.lancer.name = Lancer
|
||||||
block.conveyor.name = Dopravník
|
block.conveyor.name = Dopravník
|
||||||
block.titanium-conveyor.name = Titániový dopravník
|
block.titanium-conveyor.name = Titániový dopravník
|
||||||
block.armored-conveyor.name = Armored Conveyor
|
block.armored-conveyor.name = Obrněný dopravník
|
||||||
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
block.armored-conveyor.description = Přepravuje předměty stejně rychle jako titaniový přepravník. Je obrněný a déle vydrží, avšak nepřijímá předměty z boku z ničeho jiného než jiných přepravníků.
|
||||||
block.junction.name = Křižovatka
|
block.junction.name = Křižovatka
|
||||||
block.router.name = Směrovač
|
block.router.name = Směrovač
|
||||||
block.distributor.name = Distributor
|
block.distributor.name = Distributor
|
||||||
block.sorter.name = Dělička
|
block.sorter.name = Dělička
|
||||||
block.inverted-sorter.name = Inverted Sorter
|
block.inverted-sorter.name = Obrácená třídička
|
||||||
block.message.name = Message
|
block.message.name = Zpráva
|
||||||
block.overflow-gate.name = Brána přetečení
|
block.overflow-gate.name = Brána přetečení
|
||||||
block.silicon-smelter.name = Silicon Smelter
|
block.silicon-smelter.name = Silicon Smelter
|
||||||
block.phase-weaver.name = Tkalcovna pro fázovou tkaninu
|
block.phase-weaver.name = Tkalcovna pro fázovou tkaninu
|
||||||
@@ -911,24 +928,24 @@ block.salvo.name = Salva
|
|||||||
block.ripple.name = Vlnění
|
block.ripple.name = Vlnění
|
||||||
block.phase-conveyor.name = Fázový přepravník
|
block.phase-conveyor.name = Fázový přepravník
|
||||||
block.bridge-conveyor.name = Mostový přepravník
|
block.bridge-conveyor.name = Mostový přepravník
|
||||||
block.plastanium-compressor.name = Kompresor na Plastanium
|
block.plastanium-compressor.name = Kompresor na plastanium
|
||||||
block.pyratite-mixer.name = Pyratit mixér
|
block.pyratite-mixer.name = Pyratit mixér
|
||||||
block.blast-mixer.name = Výbušninový mixér
|
block.blast-mixer.name = Výbušninový mixér
|
||||||
block.solar-panel.name = Solární panel
|
block.solar-panel.name = Solární panel
|
||||||
block.solar-panel-large.name = Velký solární panel
|
block.solar-panel-large.name = Velký solární panel
|
||||||
block.oil-extractor.name = Ropný Extraktor
|
block.oil-extractor.name = Ropný extraktor
|
||||||
block.command-center.name = Řídící středisko
|
block.command-center.name = Řídící středisko
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Továrna na Spirit Drony
|
block.spirit-factory.name = Továrna na Spirit drony
|
||||||
block.phantom-factory.name = Továrna na Fantom Drony
|
block.phantom-factory.name = Továrna na Fantom drony
|
||||||
block.wraith-factory.name = Továrna na Wraithy
|
block.wraith-factory.name = Továrna na Wraithy
|
||||||
block.ghoul-factory.name = Továrna na Ghůl Bombardéry
|
block.ghoul-factory.name = Továrna na Ghůl bombardéry
|
||||||
block.dagger-factory.name = Továrna na Dagger Mechy
|
block.dagger-factory.name = Továrna na Dagger mechy
|
||||||
block.crawler-factory.name = Crawler Mech Factory
|
block.crawler-factory.name = Továrna na Crawler mechy
|
||||||
block.titan-factory.name = Továrna na Titán Mechy
|
block.titan-factory.name = Továrna na Titán mechy
|
||||||
block.fortress-factory.name = Továrna na Fortress Mechy
|
block.fortress-factory.name = Továrna na Fortress mechy
|
||||||
block.revenant-factory.name = Továrna na Revenanty
|
block.revenant-factory.name = Továrna na Revenanty
|
||||||
block.repair-point.name = Opravný Bod
|
block.repair-point.name = Opravný bod
|
||||||
block.pulse-conduit.name = Pulzní potrubí
|
block.pulse-conduit.name = Pulzní potrubí
|
||||||
block.phase-conduit.name = Fázové potrubí
|
block.phase-conduit.name = Fázové potrubí
|
||||||
block.liquid-router.name = Směrovač tekutin
|
block.liquid-router.name = Směrovač tekutin
|
||||||
@@ -936,23 +953,23 @@ block.liquid-tank.name = Nádrž na tekutiny
|
|||||||
block.liquid-junction.name = Křižovatka tekutin
|
block.liquid-junction.name = Křižovatka tekutin
|
||||||
block.bridge-conduit.name = Mostové potrubí
|
block.bridge-conduit.name = Mostové potrubí
|
||||||
block.rotary-pump.name = Rotační pumpa
|
block.rotary-pump.name = Rotační pumpa
|
||||||
block.thorium-reactor.name = Thoriový Reaktor
|
block.thorium-reactor.name = Thoriový reaktor
|
||||||
block.mass-driver.name = Hromadný Distributor
|
block.mass-driver.name = Hromadný distributor
|
||||||
block.blast-drill.name = Tlakovzdušný vrt
|
block.blast-drill.name = Tlakovzdušný vrt
|
||||||
block.thermal-pump.name = Termální pumpa
|
block.thermal-pump.name = Termální pumpa
|
||||||
block.thermal-generator.name = Termální Generátor
|
block.thermal-generator.name = Termální generátor
|
||||||
block.alloy-smelter.name = Slitinová pec
|
block.alloy-smelter.name = Slitinová pec
|
||||||
block.mender.name = Mender
|
block.mender.name = Mender
|
||||||
block.mend-projector.name = Opravný projektor
|
block.mend-projector.name = Opravný projektor
|
||||||
block.surge-wall.name = Impulzní stěna
|
block.surge-wall.name = Impulzní stěna
|
||||||
block.surge-wall-large.name = Velká Impulzní stěna
|
block.surge-wall-large.name = Velká impulzní stěna
|
||||||
block.cyclone.name = Cyklón
|
block.cyclone.name = Cyklón
|
||||||
block.fuse.name = Fůze
|
block.fuse.name = Fůze
|
||||||
block.shock-mine.name = Šoková mina
|
block.shock-mine.name = Šoková mina
|
||||||
block.overdrive-projector.name = Vysokorychlostní projektor
|
block.overdrive-projector.name = Vysokorychlostní projektor
|
||||||
block.force-projector.name = Silový projektor
|
block.force-projector.name = Silový projektor
|
||||||
block.arc.name = Oblouk
|
block.arc.name = Oblouk
|
||||||
block.rtg-generator.name = RTG Generátor
|
block.rtg-generator.name = RTG generátor
|
||||||
block.spectre.name = Spektr
|
block.spectre.name = Spektr
|
||||||
block.meltdown.name = Meltdown
|
block.meltdown.name = Meltdown
|
||||||
block.container.name = Kontejnér
|
block.container.name = Kontejnér
|
||||||
@@ -965,14 +982,14 @@ team.orange.name = oranžová
|
|||||||
team.derelict.name = derelict
|
team.derelict.name = derelict
|
||||||
team.green.name = zelená
|
team.green.name = zelená
|
||||||
team.purple.name = fialová
|
team.purple.name = fialová
|
||||||
unit.spirit.name = Spirit Dron
|
unit.spirit.name = Spirit dron
|
||||||
unit.draug.name = Draug Miner Drone
|
unit.draug.name = Draug Miner Drone
|
||||||
unit.phantom.name = Fantom Dron
|
unit.phantom.name = Fantom dron
|
||||||
unit.dagger.name = Dagger
|
unit.dagger.name = Dagger
|
||||||
unit.crawler.name = Crawler
|
unit.crawler.name = Crawler
|
||||||
unit.titan.name = Titán
|
unit.titan.name = Titán
|
||||||
unit.ghoul.name = Ghůl Bombardér
|
unit.ghoul.name = Ghůl bombardér
|
||||||
unit.wraith.name = Bojovník Wraith
|
unit.wraith.name = Wraith
|
||||||
unit.fortress.name = Pevnost
|
unit.fortress.name = Pevnost
|
||||||
unit.revenant.name = Revenant
|
unit.revenant.name = Revenant
|
||||||
unit.eruptor.name = Eruptor
|
unit.eruptor.name = Eruptor
|
||||||
@@ -980,31 +997,31 @@ unit.chaos-array.name = Chaos Array
|
|||||||
unit.eradicator.name = Eradicator
|
unit.eradicator.name = Eradicator
|
||||||
unit.lich.name = Lich
|
unit.lich.name = Lich
|
||||||
unit.reaper.name = Reaper
|
unit.reaper.name = Reaper
|
||||||
tutorial.next = [lightgray]<Tap to continue>
|
tutorial.next = [lightgray]<Klikni pro pokračování>
|
||||||
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro = Vítej v [scarlet] Mindustry Tutoriálu.[]\nZačni [accent] těžením mědi[] - klikni na měděnou žílu v blízkosti jádra.\n\n[accent]{0}/{1} copper
|
||||||
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro.mobile = Vítej v [scarlet] Mindustry Tutoriálu.[]\nPohybuj se táhnutím do stran.\nPřibližuj a oddaluj [accent]2 prsty [].\nZačni [accent] těžením mědi[] - přibliž se k měděné žíle v blízkosti jádra a klepni na ni.\n\n[accent]{0}/{1} mědi
|
||||||
tutorial.drill = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\npolož jeden na měděnou rudu.
|
tutorial.drill = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\nPostav jeden na měděnou rudu.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\nKlepni na vrt v záložce dole vpravo.\nVyber [accent] mechanický vrt[].\nPolož ho klepnutím na měděnou žílu a následně potvrď [accent] fajfkou[] níže.\nStiskni [accent] X [] pro zrušení stavby.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = Každý blok má jiné vlastnosti. Každý vrt může těžit pouze některé suroviny.\nNa tyto vlastnosti se můžeš podívat [accent] klepnutím na "?" ve stavebním menu.[]\n\n[accent] Nyní se podívej na vlastnosti mechanického vrtu.[]
|
||||||
tutorial.conveyor = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníku od vrtu až k jádru.
|
tutorial.conveyor = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníku od vrtu až k jádru.
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníku od vrtu až k jádru.\n[accent] Pokládej dopravníky v řadě dlouhým stiskem prstu[] a táhnutím v požadovaném směru.\n\n[accent]{0}/{1} přepravníků položeno v řadě\n[accent]0/1 předmětů doručeno
|
||||||
tutorial.turret = Defenzivní stavby musí být postaveny za účelem obrany vůči[LIGHT_GRAY] nepříteli[].\nPostav střílnu Duo blízko svého jádra.
|
tutorial.turret = Defenzivní stavby musí být postaveny za účelem obrany vůči[LIGHT_GRAY] nepříteli[].\nPostav střílnu Duo blízko svého jádra.
|
||||||
tutorial.drillturret = Duo střílny požadují[accent] měd jako střelivo []ke střelbě.\nPolož vrt blízko střílny pro zásobování mědí.
|
tutorial.drillturret = Duo střílny požadují[accent] měděnou munici []jako střelivo.\nPolož mechanický vrt blízko střílny pro zásobování mědí.
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = Během boje můžeš[accent] pauznout hru.[]\nBěhem pauzy je možné plánovat stavbu budov.\n\n[accent]Pauzni mezerníkem.
|
||||||
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
|
tutorial.pause.mobile = Během boje můžeš[accent] pauznout hru.[]\nBěhem pauzy je možné plánovat stavbu budov.\n\n[accent]Pauzu dáš tímhle tlačítkem vlevo nahoře.
|
||||||
tutorial.unpause = Now press space again to unpause.
|
tutorial.unpause = Teď zmáčkni mezerník znova a odpauzuj hru.
|
||||||
tutorial.unpause.mobile = Now press it again to unpause.
|
tutorial.unpause.mobile = Teď ho zmáčkni znova a odpauzuj hru.
|
||||||
tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking = Často je nutné bloky i ničit.\n[accent]Drž pravé tlačítko[] a táhni pro výběr oblasti bloků ke zničení.[]\n\n[accent]Znič všechny bloky šrotu vlevo od tvého jádra.
|
||||||
tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking.mobile = Často je nutné bloky i ničit.\n[accent]Vyber rozebírací mód[] a klepni na blok, který chceš zničit.\nZnič celou oblast delším stiskem prstu[] a táhnutím v nějakém směru.\nZmáčkni fajfku pro potvrzení zničení.\n\n[accent]Znič všechny bloky šrotu vlevo od tvého jádra.
|
||||||
tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[]
|
tutorial.withdraw = Někdy je třeba odebírat předměty přímo z bloků.\n[accent]Klikni na blok[], ve kterém jsou předměty a pak [accent]klikni na předmět[] z jeho inventáře.\nVícero předmětů může být odebráno [accent]kliknutím a držením[].\n\n[accent]Odeber nějakou měď z jádra.[]
|
||||||
tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[]
|
tutorial.deposit = Vložit předměty dovnitř bloku můžeš přetažením z tvé lodi na cílový blok.\n\n[accent]Vlož svou měď zpět do jádra.[]
|
||||||
tutorial.waves = [LIGHT_GRAY] nepřítel[] je přibližuje.\n\nBraň své jádro po dobu dvou vln, postav více střílen.
|
tutorial.waves = [LIGHT_GRAY] Nepřítel[] se přibližuje.\n\nUbraň své jádro po dobu 2 vln, postav více střílen.
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = [lightgray] Nepřítel[] se přibližuje.\n\nUbraň své jádro po dobu 2 vln. Tvá loď bude automaticky střílet po nepřátelských jednotkách.\nPostav více střílen a vrtů. Natěž více mědi.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Jakmile dosáhneš určité vlny, budeš moci[accent] vyslat jádro[]. Opustíš tím svou základnu a[accent] získáš suroviny uložené v jádře.[]\nZískané suroviny mohou být použity pro výzkum nových technologií.\n\n[accent]Stiskni tlačítko vyslat jádro.
|
||||||
item.copper.description = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků.
|
item.copper.description = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků.
|
||||||
item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin.
|
item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin.
|
||||||
item.metaglass.description = Vemi důležitá suočást všeho so se týká tekutin
|
item.metaglass.description = Vemi důležitá součást všeho co se týká tekutin
|
||||||
item.graphite.description = Stlačený uhlík nedílná součást většiny infrastruktur
|
item.graphite.description = Stlačený uhlík, používaný jako munice a v elektronických komponentách.
|
||||||
item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin.
|
item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin.
|
||||||
item.coal.description = Běžné a snadno dostupné palivo, pochází z Ostravy.
|
item.coal.description = Běžné a snadno dostupné palivo, pochází z Ostravy.
|
||||||
item.titanium.description = Vzácný, velice lehký kov, používá se rozsáhle v trasportu tekutin, vrtech a letounech.
|
item.titanium.description = Vzácný, velice lehký kov, používá se rozsáhle v trasportu tekutin, vrtech a letounech.
|
||||||
@@ -1022,29 +1039,29 @@ liquid.slag.description = Rostavený scrap pou žívá se k vírobě olova mědi
|
|||||||
liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení.
|
liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení.
|
||||||
liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení.
|
liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení.
|
||||||
mech.alpha-mech.description = Standartní mech. Má slušnou rychlost a poškození; Může vytvořit až 3 drony Pro zvýšenou ofenzivní způsobilost.
|
mech.alpha-mech.description = Standartní mech. Má slušnou rychlost a poškození; Může vytvořit až 3 drony Pro zvýšenou ofenzivní způsobilost.
|
||||||
mech.delta-mech.description = Rychlý, Lehce obrněný mech vytvořený pro udeř a uteč akce. Působí malé poškození vůči struktůrám, ale může zneškodnit velkou skupinu nepřátelských jednotek velmi rychle svýmy elektro-obloukovými zbraněmi
|
mech.delta-mech.description = Rychlý, lehce obrněný mech vytvořený pro udeř a uteč akce. Působí malé poškození vůči struktůrám, ale může zneškodnit velkou skupinu nepřátelských jednotek velmi rychle svýmy elektro-obloukovými zbraněmi
|
||||||
mech.tau-mech.description = Podpůrný mech. Léčí spojenecké stavby a jednotky střelbou do nich. Může léčit i spojence ve svém poli působení.
|
mech.tau-mech.description = Podpůrný mech. Léčí spojenecké stavby a jednotky střelbou do nich. Může léčit i spojence ve svém poli působení.
|
||||||
mech.omega-mech.description = Objemný a velice dovře obrněný mech, určen pro útok v přední linii. Jeho schopnost obrnění blokuje až 90% příchozího poškození.
|
mech.omega-mech.description = Objemný a velice dovře obrněný mech, určen pro útok v přední linii. Jeho schopnost obrnění blokuje až 90% příchozího poškození.
|
||||||
mech.dart-ship.description = Standartní loď. Poměrně rychlý a lehký, má malou ofenzívu a pomalou rychlost těžení.
|
mech.dart-ship.description = Standartní loď. Poměrně rychlá a lehká, má malou ofenzívu a pomalou rychlost těžení.
|
||||||
mech.javelin-ship.description = Loď stylu udeř a uteč. Zpočátku pomalý ale umí akcelerovat do obrovské rychlosti a létat u nepřátelských základen a působit značné škody svými elektrickými zbraněmi a raketami.
|
mech.javelin-ship.description = Loď stylu udeř a uteč. Zpočátku pomalý ale umí akcelerovat do obrovské rychlosti a létat u nepřátelských základen a působit značné škody svými elektrickými zbraněmi a raketami.
|
||||||
mech.trident-ship.description = Těžký bombardér. Docela dobře obrněný.
|
mech.trident-ship.description = Těžký bombardér. Docela dobře obrněný.
|
||||||
mech.glaive-ship.description = Obrovská, Dobře obrněná střelecká loď. Vybavena zápalným opakovačem. Dobrá akcelerace a maximální rychlost.
|
mech.glaive-ship.description = Obrovská, dobře obrněná střelecká loď. Vybavena zápalným opakovačem. Dobrá akcelerace a maximální rychlost.
|
||||||
unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core.
|
unit.draug.description = Jednoduchý těžící dron. Levný a postradatelný. Automaticky těží měď a olovo v blízkosti. Natěžené suroviny donese do nejbližšího jádra.
|
||||||
unit.spirit.description = Startovní dron. Standartně se objevuje u jádra. Automaticky těží rudy a opravuje stavby.
|
unit.spirit.description = Startovní dron. Standartně se objevuje u jádra. Automaticky těží rudy a opravuje stavby.
|
||||||
unit.phantom.description = Pokročilý dron. Automaticky těží rudy a opravuje stavby. Podstatně víc efektivní než Spirit dron.
|
unit.phantom.description = Pokročilý dron. Automaticky těží rudy a opravuje stavby. Podstatně víc efektivní než Spirit dron.
|
||||||
unit.dagger.description = Základní pozemní jednotka. Efektivní ve velkém počtu.
|
unit.dagger.description = Základní pozemní jednotka. Efektivní ve velkém počtu.
|
||||||
unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies.
|
unit.crawler.description = Pozemní jednotka zkonstruovaná z okřesané železné kostry a připlácnutých výbušnin. Vydrží málo a exploduje při kontaktu.
|
||||||
unit.titan.description = Pokročilá, obrněná pozemní jednotka. Útočí jak na pozemní tak vzdušné nepřátelské jednotky.
|
unit.titan.description = Pokročilá, obrněná pozemní jednotka. Útočí jak na pozemní tak vzdušné nepřátelské jednotky.
|
||||||
unit.fortress.description = Težká, pozemní artilérní jednotka.
|
unit.fortress.description = Težká, pozemní artilérní jednotka.
|
||||||
unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire.
|
unit.eruptor.description = Těžký protibudovní mech. Střílí proud žhavé kapaliny na nepřátelské budovy. Zapaluje a roztavuje vše v cestě.
|
||||||
unit.wraith.description = Rychlý, udeř a uteč stíhací letoun.
|
unit.wraith.description = Rychlý, udeř a uteč stíhací letoun.
|
||||||
unit.ghoul.description = Těžký, kobercový bombardér.
|
unit.ghoul.description = Těžký, kobercový bombardér.
|
||||||
unit.revenant.description = A heavy, hovering missile array.
|
unit.revenant.description = A heavy, hovering missile array.
|
||||||
block.message.description = Stores a message. Used for communication between allies.
|
block.message.description = Ukládá zprávu. Používá se pro komunikaci mezi spojenci.
|
||||||
block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite.
|
block.graphite-press.description = Přeměňuje neforemné kusy uhlí do ušlechtilých výlisků graphitu.
|
||||||
block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently.
|
block.multi-press.description = Vylepšená verze graphitového lisu. Využívá vodu a energii k rychlejšímu a efektivnějšímu zpracování uhlí.
|
||||||
block.silicon-smelter.description = Redukuje písek s vysoce čistým koksem za účelem výroby křemíku.
|
block.silicon-smelter.description = Redukuje písek s vysoce čistým koksem za účelem výroby křemíku.
|
||||||
block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power.
|
block.kiln.description = Přetavuje písek a olovo do metaskla. Vyžaduje malé množství energie.
|
||||||
block.plastanium-compressor.description = Produkuje plastánium za pomocí titánia a ropy.
|
block.plastanium-compressor.description = Produkuje plastánium za pomocí titánia a ropy.
|
||||||
block.phase-weaver.description = Produkuje fázovou tkaninu z radioaktivního thoria a velkého množství písku.
|
block.phase-weaver.description = Produkuje fázovou tkaninu z radioaktivního thoria a velkého množství písku.
|
||||||
block.alloy-smelter.description = Produkuje impulzní slitinu z titánia, olova, křemíku a mědi.
|
block.alloy-smelter.description = Produkuje impulzní slitinu z titánia, olova, křemíku a mědi.
|
||||||
@@ -1053,7 +1070,7 @@ block.blast-mixer.description = Používá ropu k přeměně pyratitu do méně
|
|||||||
block.pyratite-mixer.description = Míchá uhlí, olovo a písek do velice hořlavého pyratitu.
|
block.pyratite-mixer.description = Míchá uhlí, olovo a písek do velice hořlavého pyratitu.
|
||||||
block.melter.description = Taví kámen při velice vysokých teplotách na lávu.
|
block.melter.description = Taví kámen při velice vysokých teplotách na lávu.
|
||||||
block.separator.description = Vystaví kámen velkému tlaku vody k získání různých materiálů obsažené v kameni.
|
block.separator.description = Vystaví kámen velkému tlaku vody k získání různých materiálů obsažené v kameni.
|
||||||
block.spore-press.description = Compresses spore pods into oil.
|
block.spore-press.description = Vylisuje ze spórů ropu.
|
||||||
block.pulverizer.description = Drtí kámen na písek. Užitečné když se v oblasti nenalézá písek.
|
block.pulverizer.description = Drtí kámen na písek. Užitečné když se v oblasti nenalézá písek.
|
||||||
block.coal-centrifuge.description = Solidifes oil into chunks of coal.
|
block.coal-centrifuge.description = Solidifes oil into chunks of coal.
|
||||||
block.incinerator.description = Zbaví tě přebytku předmětů.
|
block.incinerator.description = Zbaví tě přebytku předmětů.
|
||||||
@@ -1064,10 +1081,10 @@ block.item-void.description = Likviduje jakéhokoliv vstupní předmět bež pou
|
|||||||
block.liquid-source.description = Nekonečný zdroj tekutin. Jen pro Sandbox.
|
block.liquid-source.description = Nekonečný zdroj tekutin. Jen pro Sandbox.
|
||||||
block.copper-wall.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.
|
block.copper-wall.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.
|
||||||
block.copper-wall-large.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.\nZabírá více polí.
|
block.copper-wall-large.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.\nZabírá více polí.
|
||||||
block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies.
|
block.titanium-wall.description = Středně dobrý obranný blok.\nPoskytuje středně dobrou obranu proti nepřátelům.
|
||||||
block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles.
|
block.titanium-wall-large.description = Středně dobrý obranný blok.\nPoskytuje středně dobrou obranu proti nepřátelům.\nZabírá více polí.
|
||||||
block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.
|
block.plastanium-wall.description = Speciální typ zdi, která je schopná absorbovat elektrické oblouky a blokuje energetické připojení.
|
||||||
block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles.
|
block.plastanium-wall-large.description = Speciální typ zdi, která je schopná absorbovat elektrické oblouky a blokuje energetické připojení.\nZabírá více polí.
|
||||||
block.thorium-wall.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům.
|
block.thorium-wall.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům.
|
||||||
block.thorium-wall-large.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům..\nZabírá více polí.
|
block.thorium-wall-large.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům..\nZabírá více polí.
|
||||||
block.phase-wall.description = Né tak silná jako zeď Thoria ale odráží nepřátelské projektily dokud nejsou moc silné.
|
block.phase-wall.description = Né tak silná jako zeď Thoria ale odráží nepřátelské projektily dokud nejsou moc silné.
|
||||||
@@ -1076,7 +1093,7 @@ block.surge-wall.description = Nejsilnější defenzivní blok.\nMá malou šanc
|
|||||||
block.surge-wall-large.description = Nejsilnější defenzivní blok.\nMá malou šanci vystřelit elektrický paprsek vůči útočníkovi.\nZabírá více polí.
|
block.surge-wall-large.description = Nejsilnější defenzivní blok.\nMá malou šanci vystřelit elektrický paprsek vůči útočníkovi.\nZabírá více polí.
|
||||||
block.door.description = Malé dveře, které se dají otevřít nebo zavřít kliknutím na ně.\nKdyž otevřené nepřátelé mohou střílet a dostat se skrz.
|
block.door.description = Malé dveře, které se dají otevřít nebo zavřít kliknutím na ně.\nKdyž otevřené nepřátelé mohou střílet a dostat se skrz.
|
||||||
block.door-large.description = Velké dveře, které se dají otevřít nebo zavřít kliknutím na ně.\nKdyž otevřené nepřátelé mohou střílet a dostat se skrz.\nZabírá více polí.
|
block.door-large.description = Velké dveře, které se dají otevřít nebo zavřít kliknutím na ně.\nKdyž otevřené nepřátelé mohou střílet a dostat se skrz.\nZabírá více polí.
|
||||||
block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency.
|
block.mender.description = Pravidelně opravuje bloky ve svém okolí. Mezi vlnami opraví zátarasy.\nVolitelně lze využít křemíku pro posílení dosahu a efektivity.
|
||||||
block.mend-projector.description = Kontinuálně léčí bloky v poli svého působení.
|
block.mend-projector.description = Kontinuálně léčí bloky v poli svého působení.
|
||||||
block.overdrive-projector.description = Zrychluje funkce blízkých struktůr jako jsou vrty a dopravníky.
|
block.overdrive-projector.description = Zrychluje funkce blízkých struktůr jako jsou vrty a dopravníky.
|
||||||
block.force-projector.description = Vytvoří okolo sebe šestihrané silové pole, chrání jednotky a budovy uvnitř sebe vůči střelám.
|
block.force-projector.description = Vytvoří okolo sebe šestihrané silové pole, chrání jednotky a budovy uvnitř sebe vůči střelám.
|
||||||
@@ -1104,13 +1121,13 @@ block.bridge-conduit.description = Pokročilý blok přepravy tekutin. Dovoluje
|
|||||||
block.phase-conduit.description = Pokročilý blok přepravy tekutin. Používá energii k teleportu tekutin do druhého bodu přez několik polí.
|
block.phase-conduit.description = Pokročilý blok přepravy tekutin. Používá energii k teleportu tekutin do druhého bodu přez několik polí.
|
||||||
block.power-node.description = Vysílá energii mezi propojenými uzly. Dokáže se propojit až se čtyřmi uzly či stavbami najednou. Uzel bude dostávat zásobu energie a bude ji distribuovat mezi připojené bloky.
|
block.power-node.description = Vysílá energii mezi propojenými uzly. Dokáže se propojit až se čtyřmi uzly či stavbami najednou. Uzel bude dostávat zásobu energie a bude ji distribuovat mezi připojené bloky.
|
||||||
block.power-node-large.description = Má větší dosah než standartní energetický uzel and a dokáže propojit až 6 staveb nebo uzly.
|
block.power-node-large.description = Má větší dosah než standartní energetický uzel and a dokáže propojit až 6 staveb nebo uzly.
|
||||||
block.surge-tower.description = An extremely long-range power node with fewer available connections.
|
block.surge-tower.description = Energetický uzel s extrémním dosahem, ale méně dostupnými přípojkami.
|
||||||
block.battery.description = Ukládá energii kdykoliv kdy je nadbytek ,poskytuje energii kdykolik když je pokles energie v síti, tak dlouho doku zbývá kapacita.
|
block.battery.description = Ukládá energii kdykoliv kdy je nadbytek ,poskytuje energii kdykolik když je pokles energie v síti, tak dlouho doku zbývá kapacita.
|
||||||
block.battery-large.description = Uloží více energie než standartní baterie.
|
block.battery-large.description = Uloží více energie než standartní baterie.
|
||||||
block.combustion-generator.description = Generuje energii spalováním ropy nebo jinných hořlavých materiálů.
|
block.combustion-generator.description = Generuje energii spalováním ropy nebo jinných hořlavých materiálů.
|
||||||
block.thermal-generator.description = Generuje obrovské množství energie z lávy.
|
block.thermal-generator.description = Generuje obrovské množství energie z lávy.
|
||||||
block.turbine-generator.description = Více efektivní než spalovací generátor, ale vyžaduje dodatečný přísun vody.
|
block.turbine-generator.description = Více efektivní než spalovací generátor, ale vyžaduje dodatečný přísun vody.
|
||||||
block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite.
|
block.differential-generator.description = Generuje velké množství energie. Využívá teplotního rozdílu mezi chladící kapalinou a hořícím pyratitem.
|
||||||
block.rtg-generator.description = Rádioizotopní Termoelektrický Generátor nevyžaduje chlazení, za to generuje méně energie než Thoriový generátor.
|
block.rtg-generator.description = Rádioizotopní Termoelektrický Generátor nevyžaduje chlazení, za to generuje méně energie než Thoriový generátor.
|
||||||
block.solar-panel.description = Poskytuje malé množství energie ze slunce.
|
block.solar-panel.description = Poskytuje malé množství energie ze slunce.
|
||||||
block.solar-panel-large.description = Poskytuje mnohem lepší zdroj energie než standartní solární panel, za to je mnohem nákladnější na stavbu.
|
block.solar-panel-large.description = Poskytuje mnohem lepší zdroj energie než standartní solární panel, za to je mnohem nákladnější na stavbu.
|
||||||
@@ -1123,17 +1140,17 @@ block.blast-drill.description = Ultimátní vrt, vyžaduje velké množství ene
|
|||||||
block.water-extractor.description = Extrahuje vodu ze země. Vhodný k použití když se v oblasti nenachází zdroj vody.
|
block.water-extractor.description = Extrahuje vodu ze země. Vhodný k použití když se v oblasti nenachází zdroj vody.
|
||||||
block.cultivator.description = Kultivuje půdu vodou za účelem získání biohmoty.
|
block.cultivator.description = Kultivuje půdu vodou za účelem získání biohmoty.
|
||||||
block.oil-extractor.description = Vyžaduje velké množství energie na extrakci ropy z písku. Použíj ho když se v oblasti nenachází žádný zdroj ropy.
|
block.oil-extractor.description = Vyžaduje velké množství energie na extrakci ropy z písku. Použíj ho když se v oblasti nenachází žádný zdroj ropy.
|
||||||
block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen.
|
block.core-shard.description = První verze jádra. V případě, že je zničeno, veškerý kontakt s regionem je ztracen. Nedopusťte aby se to stalo.
|
||||||
block.core-foundation.description = The second version of the core. Better armored. Stores more resources.
|
block.core-foundation.description = Druhá, lépe obrněná verze jádra. Pojme více surovin.
|
||||||
block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources.
|
block.core-nucleus.description = Třetí a finální iterace vývoje jádra. Extrémně obrněná, extrémně prostorná.
|
||||||
block.vault.description = Ukládá velké množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY] Odbavovač[] lže použít pro odbavení předmětů z trezoru.
|
block.vault.description = Ukládá velké množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY] Odbavovač[] lze použít pro odbavení předmětů z trezoru.
|
||||||
block.container.description = Ukládá malé množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY] Odbavovač[] lze použít pro odbavení předmětů z kontejnéru.
|
block.container.description = Ukládá malé množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY] Odbavovač[] lze použít pro odbavení předmětů z kontejnéru.
|
||||||
block.unloader.description = Vykládá předměty z kontejnéru, trezoru nebo jádra na dopravník nebo přímo do produktivních bloků. Druh předmětu pro vykládání lze měti kliknutím na odbavovač.
|
block.unloader.description = Vykládá předměty z kontejnéru, trezoru nebo jádra na dopravník nebo přímo do produktivních bloků. Druh předmětu pro vykládání lze změnit kliknutím na odbavovač.
|
||||||
block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished.
|
block.launch-pad.description = Posílá dávky předmětů do vesmíru bez nutnosti vysílat jádro. Nedokončený.
|
||||||
block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently.
|
block.launch-pad-large.description = Vylepšený Launch Pad. Větší úložný prostor, častěji vysílán do vesmíru.
|
||||||
block.duo.description = Malá, levná střílna.
|
block.duo.description = Malá, levná střílna.
|
||||||
block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units.
|
block.scatter.description = Protivzdušná střílna střední velikosti. Střílí hrstky olova nebo šrotu.
|
||||||
block.scorch.description = Burns any ground enemies close to it. Highly effective at close range.
|
block.scorch.description = Spálí nepřátele v blízkosti na prach. Velmi efektivní na malé vzdálenosti.
|
||||||
block.hail.description = Malá artilérní střílna.
|
block.hail.description = Malá artilérní střílna.
|
||||||
block.wave.description = Středně vělká, rychle pálící střílna, která střílí krystalizované bubliny.
|
block.wave.description = Středně vělká, rychle pálící střílna, která střílí krystalizované bubliny.
|
||||||
block.lancer.description = Středně velká střílna, která střílí nabité elektrické paprsky.
|
block.lancer.description = Středně velká střílna, která střílí nabité elektrické paprsky.
|
||||||
@@ -1145,22 +1162,22 @@ block.ripple.description = Velká artilérní střílna, která vystřelí něko
|
|||||||
block.cyclone.description = Velká rychle pálící střílna.
|
block.cyclone.description = Velká rychle pálící střílna.
|
||||||
block.spectre.description = Velká střílna, která vystřelí dva mocné projektily naráz.
|
block.spectre.description = Velká střílna, která vystřelí dva mocné projektily naráz.
|
||||||
block.meltdown.description = Velká střílna, která vystřelí mocný paprsek dalekého dosahu.
|
block.meltdown.description = Velká střílna, která vystřelí mocný paprsek dalekého dosahu.
|
||||||
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
block.command-center.description = Umožňuje zadávat příkazy k pohybu spojeneckých jednotek po mapě.\nUmožňuje výběr mezi patrolováním, útokem na nepřítele, či návratem k jádru nebo továrně. Pokud se na mapě nenachází nepřátelské jádro, jednotky budou patrolovat v útočném režimu.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produkuje těžící Draug drony.
|
||||||
block.spirit-factory.description = Produkuje lehké drony, kteří teží minerály a opravují budovy
|
block.spirit-factory.description = Produkuje lehké drony, kteří teží minerály a opravují budovy
|
||||||
block.phantom-factory.description = Produkuje pokročilé drony kteří jsou podstatně efektivnější jak spirit droni.
|
block.phantom-factory.description = Produkuje pokročilé drony kteří jsou podstatně efektivnější jak spirit droni.
|
||||||
block.wraith-factory.description = Produkuje rychlé, udeř a uteč stíhače.
|
block.wraith-factory.description = Produkuje rychlé, udeř a uteč stíhače.
|
||||||
block.ghoul-factory.description = Produkuje těžké kobercové bombardéry.
|
block.ghoul-factory.description = Produkuje těžké kobercové bombardéry.
|
||||||
block.revenant-factory.description = Produkuje vzdušné, težké laserové stíhače..
|
block.revenant-factory.description = Produkuje vzdušné, težké laserové stíhače..
|
||||||
block.dagger-factory.description = Produkuje standartní pozemní jednotky.
|
block.dagger-factory.description = Produkuje standardní pozemní jednotky.
|
||||||
block.crawler-factory.description = Produces fast self-destructing swarm units.
|
block.crawler-factory.description = Produces fast self-destructing swarm units.
|
||||||
block.titan-factory.description = Produkuje pokročilé, orněné pozemní jednotky.
|
block.titan-factory.description = Produkuje pokročilé, orněné pozemní jednotky.
|
||||||
block.fortress-factory.description = Produkuje těžké artilérní, pozmení jednotky.
|
block.fortress-factory.description = Produkuje těžké artilérní, pozmení jednotky.
|
||||||
block.repair-point.description = Kontinuálně léčí nejbližší budovy a jednotky.
|
block.repair-point.description = Kontinuálně léčí nejbližší budovy a jednotky.
|
||||||
block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it.
|
block.dart-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za základního útočného mecha.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
block.delta-mech-pad.description = Zanech zde své aktuální plavidlo a změn ho na rychlého, lehce obrněného mecha určeného pro udeř a uteč operace.\nPoužíj ho poklikáním když se nacházíš nad ním.
|
block.delta-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za rychlého, lehce obrněného mecha určeného pro udeř a uteč operace.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
block.tau-mech-pad.description = Zanech zde své aktuální plavidlo a změn ho na na podpůrného mecha, který léčí spojenecké budovy a jednotky.\nPoužíj ho poklikáním když se nacházíš nad ním.
|
block.tau-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za na podpůrného mecha, který léčí spojenecké budovy a jednotky.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
block.omega-mech-pad.description = Zanech zde své aktuální plavidlo a změn ho na objemného dobře obrněného mecha, určeného pro útok v přední linii.\nPoužíj ho poklikáním když se nacházíš nad ním.
|
block.omega-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za objemného dobře obrněného mecha, určeného pro útok v přední linii.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
block.javelin-ship-pad.description = Zanech zde své aktuální plavidlo a změn ho na silný a rychlý stíhač s bleskovými zbraněmi.\nPoužíj ho poklikáním když se nacházíš nad ním.
|
block.javelin-ship-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za silný a rychlý stíhač s bleskovými zbraněmi.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
block.trident-ship-pad.description = Zanech zde své aktuální plavidlo a změň ho do docela dobře obrněného těžkého bombardéru.\nPoužíj ho poklikáním když se nacházíš nad ním.
|
block.trident-ship-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za docela dobře obrněného těžkého bombardéru.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
block.glaive-ship-pad.description = Zanech zde své aktuální plavidlo a změn ho na velkou, dobře obrněnou střeleckou loď.\nPoužíj ho poklikáním když se nacházíš nad ním.
|
block.glaive-ship-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za velkou, dobře obrněnou střeleckou loď.\nAktivuj kliknutím, když se nacházíš nad platformou.
|
||||||
|
|||||||
@@ -12,11 +12,12 @@ link.itch.io.description = Pagina di itch.io con download per PC e versione web
|
|||||||
link.google-play.description = Elenco di Google Play Store
|
link.google-play.description = Elenco di Google Play Store
|
||||||
link.f-droid.description = Catalogo F-Droid
|
link.f-droid.description = Catalogo F-Droid
|
||||||
link.wiki.description = Wiki ufficiale di Mindustry
|
link.wiki.description = Wiki ufficiale di Mindustry
|
||||||
|
link.feathub.description = Suggerisci nuove funzionalità
|
||||||
linkfail = Impossibile aprire il link! L'URL è stato copiato.
|
linkfail = Impossibile aprire il link! L'URL è stato copiato.
|
||||||
screenshot = Screenshot salvato a {0}
|
screenshot = Screenshot salvato a {0}
|
||||||
screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera.
|
screenshot.invalid = Mappa troppo pesante, probabilmente non c'è abbastanza spazio sul disco.
|
||||||
gameover = Il Nucleo è stato distrutto.
|
gameover = Il Nucleo è stato distrutto.
|
||||||
gameover.pvp = La squadra [accent] {0}[] ha vinto!
|
gameover.pvp = La squadra[accent] {0}[] ha vinto!
|
||||||
highscore = [YELLOW]Nuovo record!
|
highscore = [YELLOW]Nuovo record!
|
||||||
|
|
||||||
copied = Copiato.
|
copied = Copiato.
|
||||||
@@ -26,7 +27,7 @@ load.image = Immagini
|
|||||||
load.content = Contenuti
|
load.content = Contenuti
|
||||||
load.system = Sistema
|
load.system = Sistema
|
||||||
load.mod = Mods
|
load.mod = Mods
|
||||||
load.scripts = Testi
|
load.scripts = Scripts
|
||||||
|
|
||||||
schematic = Schematica
|
schematic = Schematica
|
||||||
schematic.add = Salva Schematica...
|
schematic.add = Salva Schematica...
|
||||||
@@ -54,7 +55,7 @@ stat.delivered = Riorse lanciate:
|
|||||||
stat.rank = Livello finale: [accent]{0}
|
stat.rank = Livello finale: [accent]{0}
|
||||||
|
|
||||||
launcheditems = [accent]Oggetti Lanciati
|
launcheditems = [accent]Oggetti Lanciati
|
||||||
launchinfo = [unlaunched][[LAUNCH] il tuo Nucleo per ottenere gli oggetti indicati in blu.
|
launchinfo = [unlaunched][LANCIA] il tuo Nucleo per ottenere gli oggetti indicati in blu.
|
||||||
map.delete = Sei sicuro di voler eliminare la mappa"[accent]{0}[]"?
|
map.delete = Sei sicuro di voler eliminare la mappa"[accent]{0}[]"?
|
||||||
level.highscore = Miglior Punteggio: [accent]{0}
|
level.highscore = Miglior Punteggio: [accent]{0}
|
||||||
level.select = Selezione del Livello
|
level.select = Selezione del Livello
|
||||||
@@ -68,7 +69,7 @@ loadgame = Carica
|
|||||||
joingame = Unisciti al Gioco
|
joingame = Unisciti al Gioco
|
||||||
customgame = Gioco Personalizzato
|
customgame = Gioco Personalizzato
|
||||||
newgame = Nuova partita
|
newgame = Nuova partita
|
||||||
none = <niente>
|
none = < niente >
|
||||||
minimap = Minimappa
|
minimap = Minimappa
|
||||||
position = Posizione
|
position = Posizione
|
||||||
close = Chiuso
|
close = Chiuso
|
||||||
@@ -88,30 +89,32 @@ committingchanges = Applico le modifiche
|
|||||||
done = Fatto
|
done = Fatto
|
||||||
feature.unsupported = Il tuo dispositivo non supporta questa funzione.
|
feature.unsupported = Il tuo dispositivo non supporta questa funzione.
|
||||||
|
|
||||||
mods.alphainfo = Tieni a mente che queste Mod sono in alpha, e[scarlet] possono contenere molti bug[].\Segnala tutti i problemi che trovi su GitHub o Discord di Mindustry.
|
mods.alphainfo = Tieni a mente che queste mods sono in alpha, e[scarlet] possono contenere molti bug[].\Segnala tutti i problemi che trovi su GitHub o Discord di Mindustry.
|
||||||
mods.alpha = [accent](Alpha)
|
mods.alpha = [accent](Alpha)
|
||||||
mods = Mods
|
mods = Mods
|
||||||
mods.none = [LIGHT_GRAY]Nessuna Mod trovata!
|
mods.none = [LIGHT_GRAY]Nessuna mod trovata!
|
||||||
mods.guide = Guida per il modding!
|
mods.guide = Guida per il modding!
|
||||||
mods.report = Segnala un Bug
|
mods.report = Segnala un Bug
|
||||||
mods.openfolder = Apri Cartella Mod
|
mods.openfolder = Apri Cartella Mods
|
||||||
mod.enabled = [lightgray]Abilitato
|
mod.enabled = [lightgray]Abilitato
|
||||||
mod.disabled = [scarlet]Disabilitato
|
mod.disabled = [scarlet]Disabilitato
|
||||||
mod.disable = Disabilita
|
mod.disable = Disabilita
|
||||||
mod.delete.error = Impossibile eliminare questa Mod. Il file potrebbe essere in uso.
|
mod.delete.error = Impossibile eliminare questa mod. Il file potrebbe essere in uso.
|
||||||
|
mod.requiresversion = [scarlet]Versione minima richiesta: [accent]{0}
|
||||||
mod.missingdependencies = [scarlet]Dipendenze mancanti: {0}
|
mod.missingdependencies = [scarlet]Dipendenze mancanti: {0}
|
||||||
mod.nowdisabled = [scarlet]Alla Mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste Mod devono essere scaricate prima.\nQuesta Mod verrà disabilitata automaticamente.
|
mod.nowdisabled = [scarlet]Alla mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste mods devono essere scaricate prima.\nQuesta mod verrà disabilitata automaticamente.
|
||||||
mod.enable = Abilita
|
mod.enable = Abilita
|
||||||
mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti.
|
mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti.
|
||||||
mod.reloadrequired = [scarlet]Riavvio necessario
|
mod.reloadrequired = [scarlet]Riavvio necessario
|
||||||
mod.import = Importa una Mod
|
mod.import = Importa una mod
|
||||||
mod.import.github = Importa una Mod da GitHub
|
mod.import.github = Importa una mod da GitHub
|
||||||
mod.item.remove = Questo item fa parte della Mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa Mod.
|
mod.item.remove = Questo item fa parte della mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa mod.
|
||||||
mod.remove.confirm = Questa Mod verrà eliminata.
|
mod.remove.confirm = Questa mod verrà eliminata.
|
||||||
mod.author = [LIGHT_GRAY]Autore:[] {0}
|
mod.author = [LIGHT_GRAY]Autore:[] {0}
|
||||||
mod.missing = Questo salvataggio contiene Mod che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0}
|
mod.missing = Questo salvataggio contiene delle mods che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0}
|
||||||
mod.preview.missing = Prima di pubblicare questa Mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine[accent] con nome preview.png[] nella cartella della Mod e riprova.
|
mod.preview.missing = Prima di pubblicare questa mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine[accent] con nome preview.png[] nella cartella della mods e riprova.
|
||||||
mod.folder.missing = Solo le Mod in una cartella possono essere pubblicate nel Workshop.\nPer convertire una Mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods.
|
mod.folder.missing = Solo le mods in una cartella possono essere pubblicate nel Workshop.\nPer convertire una mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods.
|
||||||
|
mod.scripts.unsupported = Il tuo dispositivo non supporta gli script per le mods. Alcune mods non funzioneranno correttamente.
|
||||||
|
|
||||||
about.button = Info
|
about.button = Info
|
||||||
name = Nome:
|
name = Nome:
|
||||||
@@ -142,12 +145,12 @@ server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi c
|
|||||||
server.kicked.customClient = Questo server non supporta i client personalizzati. Scarica la versione ufficiale dal sito.
|
server.kicked.customClient = Questo server non supporta i client personalizzati. Scarica la versione ufficiale dal sito.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Game over!
|
||||||
server.versions = Your version:[accent] {0}[]\nVersione server:[accent] {1}[]
|
server.versions = Your version:[accent] {0}[]\nVersione server:[accent] {1}[]
|
||||||
host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]rete wifi o locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite il tuo IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall.
|
host.info = Il pulsante [accent]host[] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]rete wifi o locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\nSe vuoi che le persone siano in grado di connettersi ovunque tramite il tuo IP, è richiesto il [accent]port forwarding[].\n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall.
|
||||||
join.info = Qui è possibile inserire l'[accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\nSono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco automatico dei server globali; se desideri connetterti a qualcuno tramite il suo IP, è necessario chiedere all'host il proprio IP.
|
join.info = Qui è possibile inserire l'[accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\nSono supportati sia il multiplayer LAN che WAN.\n\n[LIGHT_GRAY]Nota: non esiste un elenco automatico dei server globali; se desideri connetterti a qualcuno tramite il suo IP, è necessario chiedere all'host il proprio IP.
|
||||||
hostserver = Ospita Server
|
hostserver = Ospita Server
|
||||||
invitefriends = Invita amici
|
invitefriends = Invita amici
|
||||||
hostserver.mobile = Ospita\nServer
|
hostserver.mobile = Ospita\nServer
|
||||||
host = Host
|
host = Ospita
|
||||||
hosting = [accent] Apertura del server...
|
hosting = [accent] Apertura del server...
|
||||||
hosts.refresh = Aggiorna
|
hosts.refresh = Aggiorna
|
||||||
hosts.discovering = Ricerca partite LAN
|
hosts.discovering = Ricerca partite LAN
|
||||||
@@ -213,7 +216,7 @@ selectslot = Seleziona un salvataggio.
|
|||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
editmessage = Modifica Messaggio
|
editmessage = Modifica Messaggio
|
||||||
save.corrupted = [orang]Salvataggio corrotto o non valido!
|
save.corrupted = [orang]Salvataggio corrotto o non valido!
|
||||||
empty = <vuoto>
|
empty = < vuoto >
|
||||||
on = On
|
on = On
|
||||||
off = Off
|
off = Off
|
||||||
save.autosave = Salvataggio Automatico: {0}
|
save.autosave = Salvataggio Automatico: {0}
|
||||||
@@ -280,7 +283,7 @@ publishing = [accent]Pubblicazione...
|
|||||||
publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up!
|
publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up!
|
||||||
publish.error = Error publishing item: {0}
|
publish.error = Error publishing item: {0}
|
||||||
steam.error = Failed to initialize Steam services.\nError: {0}
|
steam.error = Failed to initialize Steam services.\nError: {0}
|
||||||
editor.brush = Pennello
|
editor.brush = Dimensioni Pennello
|
||||||
editor.openin = Apri nell'editor
|
editor.openin = Apri nell'editor
|
||||||
editor.oregen = Generazione dei minerali
|
editor.oregen = Generazione dei minerali
|
||||||
editor.oregen.info = Generazione dei minerali:
|
editor.oregen.info = Generazione dei minerali:
|
||||||
@@ -297,7 +300,7 @@ editor.newmap = Nuova mappa
|
|||||||
workshop = Workshop
|
workshop = Workshop
|
||||||
waves.title = Ondate
|
waves.title = Ondate
|
||||||
waves.remove = Rimuovi
|
waves.remove = Rimuovi
|
||||||
waves.never = <mai>
|
waves.never = < mai >
|
||||||
waves.every = sempre
|
waves.every = sempre
|
||||||
waves.waves = ondata/e
|
waves.waves = ondata/e
|
||||||
waves.perspawn = per spawn
|
waves.perspawn = per spawn
|
||||||
@@ -309,14 +312,14 @@ waves.copy = Copia negli appunti
|
|||||||
waves.load = Carica dagli appunti
|
waves.load = Carica dagli appunti
|
||||||
waves.invalid = Onde dagli appunti non valide.
|
waves.invalid = Onde dagli appunti non valide.
|
||||||
waves.copied = Onde copiate.
|
waves.copied = Onde copiate.
|
||||||
waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita.
|
waves.none = Nessun nemico definiti.\nNota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita.
|
||||||
editor.default = [LIGHT_GRAY]<Predefinito>
|
editor.default = [LIGHT_GRAY]< Predefinito >
|
||||||
details = Dettagli...
|
details = Dettagli...
|
||||||
edit = Modifica...
|
edit = Modifica...
|
||||||
editor.name = Nome:
|
editor.name = Nome:
|
||||||
editor.spawn = Piazza un'unità
|
editor.spawn = Piazza un'unità
|
||||||
editor.removeunit = Rimuovi un'unità
|
editor.removeunit = Rimuovi un'unità
|
||||||
editor.teams = Squadre
|
editor.teams = Colore Squadre
|
||||||
editor.errorload = Errore nel caricamento di:\n[accent]{0}
|
editor.errorload = Errore nel caricamento di:\n[accent]{0}
|
||||||
editor.errorsave = Errore nel salvataggio di:\n[accent]{0}
|
editor.errorsave = Errore nel salvataggio di:\n[accent]{0}
|
||||||
editor.errorimage = Quella è un'immagine, non una mappa.\n\nSe vuoi importare una mappa vecchia clicca su "Importa una mappa vecchia" nell'editor.
|
editor.errorimage = Quella è un'immagine, non una mappa.\n\nSe vuoi importare una mappa vecchia clicca su "Importa una mappa vecchia" nell'editor.
|
||||||
@@ -335,14 +338,14 @@ editor.saved = Salvato!
|
|||||||
editor.save.noname = La tua mappa non ha un nome! Impostane uno nelle informazioni della mappa.
|
editor.save.noname = La tua mappa non ha un nome! Impostane uno nelle informazioni della mappa.
|
||||||
editor.save.overwrite = La tua mappa sovrascrive quelle incluse! Imposta un nome diverso nelle informazioni della mappa.
|
editor.save.overwrite = La tua mappa sovrascrive quelle incluse! Imposta un nome diverso nelle informazioni della mappa.
|
||||||
editor.import.exists = [scarlet]Impossibile importare:[] esiste già una mappa chiamata '{0}' che non può essere sovrascritta!
|
editor.import.exists = [scarlet]Impossibile importare:[] esiste già una mappa chiamata '{0}' che non può essere sovrascritta!
|
||||||
editor.import = Importando...
|
editor.import = Importa
|
||||||
editor.importmap = Importa mappa
|
editor.importmap = Importa mappa
|
||||||
editor.importmap.description = Importa mappa preesistente
|
editor.importmap.description = Importa mappa preesistente
|
||||||
editor.importfile = Importa file
|
editor.importfile = Importa file
|
||||||
editor.importfile.description = Importa un file mappa esterno
|
editor.importfile.description = Importa un file mappa esterno
|
||||||
editor.importimage = Importa mappa terreno
|
editor.importimage = Importa mappa terreno
|
||||||
editor.importimage.description = Importa immagine esterna terreno
|
editor.importimage.description = Importa immagine esterna terreno
|
||||||
editor.export = Esportazione...
|
editor.export = Esporta
|
||||||
editor.exportfile = Esporta file
|
editor.exportfile = Esporta file
|
||||||
editor.exportfile.description = Esporta file mappa
|
editor.exportfile.description = Esporta file mappa
|
||||||
editor.exportimage = Esporta immagine
|
editor.exportimage = Esporta immagine
|
||||||
@@ -437,8 +440,8 @@ launch.confirm = Questo trasporterà tutte le risorse nel tuo Nucleo.\nNon riusc
|
|||||||
launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive
|
launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive
|
||||||
uncover = Scopri
|
uncover = Scopri
|
||||||
configure = Configura l'equipaggiamento
|
configure = Configura l'equipaggiamento
|
||||||
bannedblocks = Blocchi banditi
|
bannedblocks = Blocchi Banditi
|
||||||
addall = Aggiungi tutti
|
addall = Aggiungi Tutti
|
||||||
configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento.
|
configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento.
|
||||||
configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}.
|
configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}.
|
||||||
zone.unlocked = [LIGHT_GRAY]{0} sbloccata.
|
zone.unlocked = [LIGHT_GRAY]{0} sbloccata.
|
||||||
@@ -448,14 +451,14 @@ zone.resources = Risorse Trovate:
|
|||||||
zone.objective = [lightgray]Obiettivo: [accent]{0}
|
zone.objective = [lightgray]Obiettivo: [accent]{0}
|
||||||
zone.objective.survival = Sopravvivere
|
zone.objective.survival = Sopravvivere
|
||||||
zone.objective.attack = Distruggere il Nucleo Nemico
|
zone.objective.attack = Distruggere il Nucleo Nemico
|
||||||
add = Aggiungi...
|
add = Aggiungi
|
||||||
boss.health = Vita del Boss
|
boss.health = Vita del Boss
|
||||||
|
|
||||||
connectfail = [crimson] Impossibile connettersi al server: [accent] {0}
|
connectfail = [crimson]Impossibile connettersi al server:[accent] {0}
|
||||||
error.unreachable = Server irraggiungibile. L'indirizzo è scritto correttamente?
|
error.unreachable = Server irraggiungibile. L'indirizzo è scritto correttamente?
|
||||||
error.invalidaddress = Indirizzo invalido.
|
error.invalidaddress = Indirizzo non valido.
|
||||||
error.timedout = Timeout!\n Assicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto!
|
error.timedout = Timeout!\nAssicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto!
|
||||||
error.mismatch = Errore pacchetti:\nPossibile discordanza della versione client / server.\n Assicurati che tu e l'host possiediate l'ultima versione di Mindustry!
|
error.mismatch = Errore pacchetti:\nPossibile discordanza della versione client/server.\nAssicurati che tu e l'host possiediate l'ultima versione di Mindustry!
|
||||||
error.alreadyconnected = Già connesso.
|
error.alreadyconnected = Già connesso.
|
||||||
error.mapnotfound = Mappa non trovata
|
error.mapnotfound = Mappa non trovata
|
||||||
error.io = Errore I/O di rete.
|
error.io = Errore I/O di rete.
|
||||||
@@ -478,7 +481,7 @@ zone.crags.name = Dirupi
|
|||||||
zone.fungalPass.name = Passaggio Fungoso
|
zone.fungalPass.name = Passaggio Fungoso
|
||||||
|
|
||||||
zone.groundZero.description = La posizione ottimale per cominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nProcedi.
|
zone.groundZero.description = La posizione ottimale per cominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nProcedi.
|
||||||
zone.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature rigide non possono contenerle per sempre.\n Inizia la scoperta dell'energia. Costruisci generatori a combustione. Impara a usare i riparatori.
|
zone.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature rigide non possono contenerle per sempre.\nInizia la scoperta dell'energia. Costruisci generatori a combustione. Impara a usare i riparatori.
|
||||||
zone.desertWastes.description = Questi rifiuti sono vasti, imprevedibili ed attraversati da strutture settoriali abbandonate.\n\nIl carbone è presente nella regione. Bruciatelo per ottenere energia o sintetizzate la grafite.\n\n[lightgray]Questa posizione di atterraggio non può essere garantita.
|
zone.desertWastes.description = Questi rifiuti sono vasti, imprevedibili ed attraversati da strutture settoriali abbandonate.\n\nIl carbone è presente nella regione. Bruciatelo per ottenere energia o sintetizzate la grafite.\n\n[lightgray]Questa posizione di atterraggio non può essere garantita.
|
||||||
zone.saltFlats.description = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro Nucleo. Non lasciare nulla in piedi.
|
zone.saltFlats.description = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro Nucleo. Non lasciare nulla in piedi.
|
||||||
zone.craters.description = L'acqua si è accumulata in questo cratere, reliquia delle vecchie guerre. Recupera l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa l'acqua per raffreddare torrette e trivelle.
|
zone.craters.description = L'acqua si è accumulata in questo cratere, reliquia delle vecchie guerre. Recupera l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa l'acqua per raffreddare torrette e trivelle.
|
||||||
@@ -487,20 +490,21 @@ zone.stainedMountains.description = Più nell'entroterra si trovano le montagne,
|
|||||||
zone.overgrowth.description = Quest'area è invasa, più vicina alla fonte delle spore.\nIl nemico ha stabilito qui un avamposto. Costruisci unità col pugnale. Distruggilo. Riprenditi ciò che è stato perso.
|
zone.overgrowth.description = Quest'area è invasa, più vicina alla fonte delle spore.\nIl nemico ha stabilito qui un avamposto. Costruisci unità col pugnale. Distruggilo. Riprenditi ciò che è stato perso.
|
||||||
zone.tarFields.description = La periferia di una zona di produzione di petrolio, tra le montagne e il deserto. Una delle poche aree con riserve di catrame utilizzabili.\nAnche se abbandonata, questa zona ha alcune pericolose forze nemiche nelle vicinanze. Non sottovalutarlo.\n\n[lightgray]Ricerca la tecnologia di lavorazione del petrolio, se possibile.
|
zone.tarFields.description = La periferia di una zona di produzione di petrolio, tra le montagne e il deserto. Una delle poche aree con riserve di catrame utilizzabili.\nAnche se abbandonata, questa zona ha alcune pericolose forze nemiche nelle vicinanze. Non sottovalutarlo.\n\n[lightgray]Ricerca la tecnologia di lavorazione del petrolio, se possibile.
|
||||||
zone.desolateRift.description = Una zona estremamente pericolosa. Risorse abbondanti, ma poco spazio. Alto rischio di distruzione. Lascia il prima possibile. Non lasciarti ingannare dalla lunga distanza tra gli attacchi nemici.
|
zone.desolateRift.description = Una zona estremamente pericolosa. Risorse abbondanti, ma poco spazio. Alto rischio di distruzione. Lascia il prima possibile. Non lasciarti ingannare dalla lunga distanza tra gli attacchi nemici.
|
||||||
zone.nuclearComplex.description = Un ex impianto per la produzione e la lavorazione del torio, ridotto in rovina.\n[lightgray] Ricerca il torio ed i suoi numerosi usi.\n\nIl nemico è presente qui in gran numero, alla costante ricerca di aggressori.
|
zone.nuclearComplex.description = Un ex impianto per la produzione e la lavorazione del torio, ridotto in rovina.\n[lightgray]Ricerca il torio ed i suoi numerosi usi.\n\nIl nemico è presente qui in gran numero, alla costante ricerca di aggressori.
|
||||||
zone.fungalPass.description = Un'area di transizione tra alte montagne e terre più basse, piene di spore. Qui si trova una piccola base di ricognizione nemica.\nDistruggila.\nUsa le unità Pugnale e Strisciatore. Elimina i due nuclei.
|
zone.fungalPass.description = Un'area di transizione tra alte montagne e terre più basse, piene di spore. Qui si trova una piccola base di ricognizione nemica.\nDistruggila.\nUsa le unità Pugnale e Strisciatore. Elimina i due nuclei.
|
||||||
zone.impact0078.description = <inserisci descrizione>
|
zone.impact0078.description = < inserisci descrizione >
|
||||||
zone.crags.description = <inserisci descrizione>
|
zone.crags.description = < inserisci descrizione >
|
||||||
|
|
||||||
settings.language = Lingua
|
settings.language = Lingua
|
||||||
settings.data = Importa/Esporta salvataggio
|
settings.data = Importa/Esporta salvataggio
|
||||||
settings.reset = Ripristina Impostazioni
|
settings.reset = Ripristina Impostazioni
|
||||||
settings.rebind = Modifica
|
settings.rebind = Modifica
|
||||||
|
settings.resetKey = Ripristina
|
||||||
settings.controls = Controlli
|
settings.controls = Controlli
|
||||||
settings.game = Gioco
|
settings.game = Gioco
|
||||||
settings.sound = Suoni
|
settings.sound = Suoni
|
||||||
settings.graphics = Grafica
|
settings.graphics = Grafica
|
||||||
settings.cleardata = Elimina Dati di Gioco...
|
settings.cleardata = Elimina Dati di Gioco
|
||||||
settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata!
|
settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata!
|
||||||
settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente.
|
settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente.
|
||||||
paused = [accent]< In Pausa >
|
paused = [accent]< In Pausa >
|
||||||
@@ -513,7 +517,7 @@ error.title = [crimson]Si è verificato un errore
|
|||||||
error.crashtitle = Si è verificato un errore
|
error.crashtitle = Si è verificato un errore
|
||||||
blocks.input = Ingresso
|
blocks.input = Ingresso
|
||||||
blocks.output = Uscita
|
blocks.output = Uscita
|
||||||
blocks.booster = Booster
|
blocks.booster = Potenziamenti
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [LIGHT_GRAY]???
|
||||||
blocks.powercapacity = Capacità Energetica
|
blocks.powercapacity = Capacità Energetica
|
||||||
blocks.powershot = Danno/Colpo
|
blocks.powershot = Danno/Colpo
|
||||||
@@ -675,23 +679,23 @@ keybind.dash.name = Scatto
|
|||||||
keybind.schematic_select.name = Seleziona Regione
|
keybind.schematic_select.name = Seleziona Regione
|
||||||
keybind.schematic_menu.name = Menu Schematica
|
keybind.schematic_menu.name = Menu Schematica
|
||||||
keybind.schematic_flip_x.name = Ruota Schematica Orizzontalmente
|
keybind.schematic_flip_x.name = Ruota Schematica Orizzontalmente
|
||||||
keybind.schematic_flip_y.name = Flip Schematic Verticalmente
|
keybind.schematic_flip_y.name = Ruota Schematica Verticalmente
|
||||||
keybind.category_prev.name = Categoria Precedente
|
keybind.category_prev.name = Categoria Precedente
|
||||||
keybind.category_next.name = Categoria Successiva
|
keybind.category_next.name = Categoria Successiva
|
||||||
keybind.block_select_left.name = Seleziona Blocco Sinistra
|
keybind.block_select_left.name = Seleziona Blocco Sinistra
|
||||||
keybind.block_select_right.name = Seleziona Blocco Destra
|
keybind.block_select_right.name = Seleziona Blocco Destra
|
||||||
keybind.block_select_up.name = Seleziona Blocco Su
|
keybind.block_select_up.name = Seleziona Blocco Su
|
||||||
keybind.block_select_down.name = Seleziona Blocco Giù
|
keybind.block_select_down.name = Seleziona Blocco Giù
|
||||||
keybind.block_select_01.name = Categoria/Seleziona Blocco 1
|
keybind.block_select_01.name = Seleziona Categoria/Blocco 1
|
||||||
keybind.block_select_02.name = Categoria/Seleziona Blocco 2
|
keybind.block_select_02.name = Seleziona Categoria/Blocco 2
|
||||||
keybind.block_select_03.name = Categoria/Seleziona Blocco 3
|
keybind.block_select_03.name = Seleziona Categoria/Blocco 3
|
||||||
keybind.block_select_04.name = Categoria/Seleziona Blocco 4
|
keybind.block_select_04.name = Seleziona Categoria/Blocco 4
|
||||||
keybind.block_select_05.name = Categoria/Seleziona Blocco 5
|
keybind.block_select_05.name = Seleziona Categoria/Blocco 5
|
||||||
keybind.block_select_06.name = Categoria/Seleziona Blocco 6
|
keybind.block_select_06.name = Seleziona Categoria/Blocco 6
|
||||||
keybind.block_select_07.name = Categoria/Seleziona Blocco 7
|
keybind.block_select_07.name = Seleziona Categoria/Blocco 7
|
||||||
keybind.block_select_08.name = Categoria/Seleziona Blocco 8
|
keybind.block_select_08.name = Seleziona Categoria/Blocco 8
|
||||||
keybind.block_select_09.name = Categoria/Seleziona Blocco 9
|
keybind.block_select_09.name = Seleziona Categoria/Blocco 9
|
||||||
keybind.block_select_10.name = Categoria/Seleziona Blocco 10
|
keybind.block_select_10.name = Seleziona Categoria/Blocco 10
|
||||||
keybind.fullscreen.name = Schermo Intero
|
keybind.fullscreen.name = Schermo Intero
|
||||||
keybind.select.name = Seleziona/Spara
|
keybind.select.name = Seleziona/Spara
|
||||||
keybind.diagonal_placement.name = Posizionamento Diagonale
|
keybind.diagonal_placement.name = Posizionamento Diagonale
|
||||||
@@ -708,7 +712,7 @@ keybind.chat.name = Chat
|
|||||||
keybind.player_list.name = Lista dei Giocatori
|
keybind.player_list.name = Lista dei Giocatori
|
||||||
keybind.console.name = Console
|
keybind.console.name = Console
|
||||||
keybind.rotate.name = Ruota
|
keybind.rotate.name = Ruota
|
||||||
keybind.rotateplaced.name = Ruota Blocco Esistente (Premuto)
|
keybind.rotateplaced.name = Ruota Blocco Esistente (premuto)
|
||||||
keybind.toggle_menus.name = Mostra/Nascondi HUD
|
keybind.toggle_menus.name = Mostra/Nascondi HUD
|
||||||
keybind.chat_history_prev.name = Scorri Chat vero l'alto
|
keybind.chat_history_prev.name = Scorri Chat vero l'alto
|
||||||
keybind.chat_history_next.name = Scorri Chat verso il basso
|
keybind.chat_history_next.name = Scorri Chat verso il basso
|
||||||
@@ -987,12 +991,13 @@ block.titan-factory.name = Fabbrica Mech Titano
|
|||||||
block.fortress-factory.name = Fabbrica Mech Fortezza
|
block.fortress-factory.name = Fabbrica Mech Fortezza
|
||||||
block.revenant-factory.name = Fabbrica Combattenti Superstiti
|
block.revenant-factory.name = Fabbrica Combattenti Superstiti
|
||||||
block.repair-point.name = Punto di Riparazione
|
block.repair-point.name = Punto di Riparazione
|
||||||
block.pulse-conduit.name = Condotto Attiva
|
block.pulse-conduit.name = Condotto a Impulsi
|
||||||
block.phase-conduit.name = Condotta di Fase
|
block.plated-conduit.name = Condotto Placcato
|
||||||
|
block.phase-conduit.name = Condotto di Fase
|
||||||
block.liquid-router.name = Distributore di Liquidi
|
block.liquid-router.name = Distributore di Liquidi
|
||||||
block.liquid-tank.name = Serbatoio
|
block.liquid-tank.name = Serbatoio
|
||||||
block.liquid-junction.name = Giunzione Liquida
|
block.liquid-junction.name = Giunzione Liquida
|
||||||
block.bridge-conduit.name = Condotta Sopraelevata
|
block.bridge-conduit.name = Condotto Sopraelevato
|
||||||
block.rotary-pump.name = Pompa a Turbina
|
block.rotary-pump.name = Pompa a Turbina
|
||||||
block.thorium-reactor.name = Reattore al Torio
|
block.thorium-reactor.name = Reattore al Torio
|
||||||
block.mass-driver.name = Lancia Materiali
|
block.mass-driver.name = Lancia Materiali
|
||||||
@@ -1038,31 +1043,31 @@ unit.chaos-array.name = Matrice del Caos
|
|||||||
unit.eradicator.name = Estirpatore
|
unit.eradicator.name = Estirpatore
|
||||||
unit.lich.name = Lich
|
unit.lich.name = Lich
|
||||||
unit.reaper.name = Mietitore
|
unit.reaper.name = Mietitore
|
||||||
tutorial.next = [lightgray]<Clicca per continuare>
|
tutorial.next = [lightgray]< Clicca per continuare >
|
||||||
tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame
|
tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando del rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame
|
||||||
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro.mobile = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nScorri sullo schermo per muoverti.\n[accent]Avvicina due dita[] per eseguire lo zoom in/out.\nInizia [accent] scavando del rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame
|
||||||
tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame.
|
tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame.
|
||||||
tutorial.drill.mobile = Ora crea una trivella. \n[accent] Le trivelle []scavano da sole e sono più efficienti. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento.
|
tutorial.drill.mobile = Ora crea una trivella.\n[accent] Le trivelle []scavano da sole e sono più efficienti.\nTocca la scheda della trivella in basso a destra.\nSeleziona la [accent]Trivella Meccanica[].\nPiazzala su una vena di rame toccando, quindi premi il [accent]segno di spunta[] in basso per confermare la selezione.\nCon il tasto [accent]X[] puoi annullare il posizionamento.
|
||||||
tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. []
|
tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. []
|
||||||
tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo. \nCrea una linea di nastri dalla trivella al Nucleo.
|
tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo.\nCrea una linea di nastri dalla trivella al Nucleo.
|
||||||
tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati
|
tutorial.conveyor.mobile = [accent]I nastri trasportatori[] sono usati per trasportare oggetti nel Nucleo.\nCrea una linea di nastri trasportatori dalla trivella al Nucleo.\n[accent]Piazzali in linea tenendo premuto per qualche secondo e trascinando il dito in una direzione.\n\n[accent]Piazza 2 nastri trasportatori con lo strumento linea, quindi trasporta un oggetto fino al Nucleo.
|
||||||
tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base.
|
tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] [].\nCostruisci una torretta Duo vicino alla tua base.
|
||||||
tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto.
|
tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto.
|
||||||
tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent]Premi spazio per mettere in pausa.
|
tutorial.pause = Durante la battaglia puoi[accent] mettere in pausa il gioco.[]\nPuoi disporre gli edifici mentre il gioco è in pausa.\n\nPer mettere in pausa, premi [accent]spazio[].
|
||||||
tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa.
|
tutorial.pause.mobile = Durante la battaglia puoi[accent] mettere in pausa il gioco.[]\nPuoi disporre gli edifici mentre il gioco è in pausa.\n\nPer mettere in pausa, premi il bottone in alto a sinistra.
|
||||||
tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa.
|
tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa.
|
||||||
tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa.
|
tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa.
|
||||||
tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area .
|
tutorial.breaking = I blocchi spesso devono essere distrutti.\n[accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione.[]\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area.
|
||||||
tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area.
|
tutorial.breaking.mobile = I blocchi spesso devono essere distrutti.\n[accent]Seleziona la modalità di decostruzione[], quindi tocca un blocco per iniziare a smantellarlo.\nDistruggi un'area tenendo premuto il dito per alcuni secondi[] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione.\n\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area.
|
||||||
tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo. []
|
tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario.\nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo. []
|
||||||
tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel Nucleo. []
|
tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione.\n[accent]Rimetti il rame nel Nucleo. []
|
||||||
tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse.
|
tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse.
|
||||||
tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette.
|
tutorial.waves.mobile = Il [lightgray]nemico si avvicina.\n\nDifendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette.
|
||||||
tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il Nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial.
|
tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il Nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n[accent]Decolla e conferma per terminare il tutorial.
|
||||||
|
|
||||||
item.copper.description = Un utile materiale, usato dappertutto
|
item.copper.description = Un materiale utile, usato dappertutto.
|
||||||
item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto.
|
item.lead.description = Un materiale di base, molto usato nei blocchi per il trasporto.
|
||||||
item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento.
|
item.metaglass.description = Un durissimo composto di vetro. Ampiamente usato per trasporto di liquidi ed immagazzinamento.
|
||||||
item.graphite.description = Carbone mineralizzato, utilizzato per munizioni ed isolamento elettrico.
|
item.graphite.description = Carbone mineralizzato, utilizzato per munizioni ed isolamento elettrico.
|
||||||
item.sand.description = Un materiale di base che viene usato molto nei processi di fusione, sia come lega che come reagente.
|
item.sand.description = Un materiale di base che viene usato molto nei processi di fusione, sia come lega che come reagente.
|
||||||
item.coal.description = Un combustibile comune facilmente ottenibile.
|
item.coal.description = Un combustibile comune facilmente ottenibile.
|
||||||
@@ -1079,7 +1084,7 @@ item.pyratite.description = Una sostanza molto infiammabile che viene utilizzata
|
|||||||
liquid.water.description = Il liquido più utile. Comunemente usato per il raffreddamento di macchinari ed il trattamento dei rifiuti.
|
liquid.water.description = Il liquido più utile. Comunemente usato per il raffreddamento di macchinari ed il trattamento dei rifiuti.
|
||||||
liquid.slag.description = Diversi tipi di metalli fusi, mescolati insieme. Può essere separato nei suoi minerali costituenti o spruzzato sulle unità nemiche come un'arma.
|
liquid.slag.description = Diversi tipi di metalli fusi, mescolati insieme. Può essere separato nei suoi minerali costituenti o spruzzato sulle unità nemiche come un'arma.
|
||||||
liquid.oil.description = Un liquido usato nella produzione avanzata.\nPuò essere convertito in carbone per uso combustibile o spruzzato ed incendiato come arma.
|
liquid.oil.description = Un liquido usato nella produzione avanzata.\nPuò essere convertito in carbone per uso combustibile o spruzzato ed incendiato come arma.
|
||||||
liquid.cryofluid.description = Un liquido inerte e non corrosivo creato da acqua e titanio.\nIl liquido più efficiente per il raffreddamento.
|
liquid.cryofluid.description = Un liquido inerte e non corrosivo creato da acqua e titanio.\nÈ il liquido più efficiente per il raffreddamento.
|
||||||
mech.alpha-mech.description = Il mech standard. È abbastanza veloce e produce abbastanza danni, può anche generare 3 droni per aumentare il suo danno complessivo.
|
mech.alpha-mech.description = Il mech standard. È abbastanza veloce e produce abbastanza danni, può anche generare 3 droni per aumentare il suo danno complessivo.
|
||||||
mech.delta-mech.description = Un mech veloce, poco armato fatto per giocare a tocca e fuga con il nemico. Fa poco danno alle strutture, ma può uccidere un gran nummero di nemici grazie alle sue armi ad alto voltaggio.
|
mech.delta-mech.description = Un mech veloce, poco armato fatto per giocare a tocca e fuga con il nemico. Fa poco danno alle strutture, ma può uccidere un gran nummero di nemici grazie alle sue armi ad alto voltaggio.
|
||||||
mech.tau-mech.description = Un mech di supporto. Cura i blocchi danneggiati sparandogli contro. Può spegnere fuochi e curare i compagni di squadra.
|
mech.tau-mech.description = Un mech di supporto. Cura i blocchi danneggiati sparandogli contro. Può spegnere fuochi e curare i compagni di squadra.
|
||||||
@@ -1099,7 +1104,7 @@ unit.eruptor.description = Un mech pesante progettato per abbattere le strutture
|
|||||||
unit.wraith.description = Un'unità d'intercezione rapida ed efficiente.
|
unit.wraith.description = Un'unità d'intercezione rapida ed efficiente.
|
||||||
unit.ghoul.description = Un bombardiere pesante. Utilizza composti esplosivi o pirite come munizioni.
|
unit.ghoul.description = Un bombardiere pesante. Utilizza composti esplosivi o pirite come munizioni.
|
||||||
unit.revenant.description = Un pesante lanciamissili volante.
|
unit.revenant.description = Un pesante lanciamissili volante.
|
||||||
block.message.description = Stores a message. Used for communication between allies.
|
block.message.description = Memorizza un messaggio. Utilizzato per la comunicazione tra alleati.
|
||||||
block.graphite-press.description = Comprime pezzi di carbone in fogli di grafite puri.
|
block.graphite-press.description = Comprime pezzi di carbone in fogli di grafite puri.
|
||||||
block.multi-press.description = Una versione aggiornata della pressa per grafite. Impiega acqua ed energia per elaborare il carbone in modo rapido ed efficiente.
|
block.multi-press.description = Una versione aggiornata della pressa per grafite. Impiega acqua ed energia per elaborare il carbone in modo rapido ed efficiente.
|
||||||
block.silicon-smelter.description = Fonde sabbia e carbone riscaldati per ottenere silicio.
|
block.silicon-smelter.description = Fonde sabbia e carbone riscaldati per ottenere silicio.
|
||||||
@@ -1108,7 +1113,7 @@ block.plastanium-compressor.description = Produce plastanio da petrolio e titani
|
|||||||
block.phase-weaver.description = Produce tessuto di fase da torio radioattivo ed elevate quantità di sabbia.
|
block.phase-weaver.description = Produce tessuto di fase da torio radioattivo ed elevate quantità di sabbia.
|
||||||
block.alloy-smelter.description = Produce leghe di sovratensione da titanio, piombo, silicio e rame.
|
block.alloy-smelter.description = Produce leghe di sovratensione da titanio, piombo, silicio e rame.
|
||||||
block.cryofluidmixer.description = Combina acqua e titanio in criofluido che è molto più efficiente per il raffreddamento.
|
block.cryofluidmixer.description = Combina acqua e titanio in criofluido che è molto più efficiente per il raffreddamento.
|
||||||
block.blast-mixer.description = Frantuma e mescola le spore con la pirite per produrre Composto Esplosivo.
|
block.blast-mixer.description = Frantuma e mescola le spore con la pirite per produrre composto esplosivo.
|
||||||
block.pyratite-mixer.description = Mescola carbone, piombo e sabbia in pirite altamente infiammabile.
|
block.pyratite-mixer.description = Mescola carbone, piombo e sabbia in pirite altamente infiammabile.
|
||||||
block.melter.description = Riscalda la pietra a temperature molto elevate per ottenere scoria liquida.
|
block.melter.description = Riscalda la pietra a temperature molto elevate per ottenere scoria liquida.
|
||||||
block.separator.description = Sottopone le scoria a centrifugazione per ottenere i vari minerali contenuti.
|
block.separator.description = Sottopone le scoria a centrifugazione per ottenere i vari minerali contenuti.
|
||||||
@@ -1122,23 +1127,23 @@ block.item-source.description = Produce oggetti infiniti, esiste solo nella moda
|
|||||||
block.item-void.description = Elimina gli oggetti che vi entrano senza bisogno di energia, esiste solo nella modalità creativa.
|
block.item-void.description = Elimina gli oggetti che vi entrano senza bisogno di energia, esiste solo nella modalità creativa.
|
||||||
block.liquid-source.description = Emette continuamente liquidi. Esiste solo nella modalità creativa.
|
block.liquid-source.description = Emette continuamente liquidi. Esiste solo nella modalità creativa.
|
||||||
block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate.
|
block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate.
|
||||||
block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. \nOccupa più tessere.
|
block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate.\nOccupa più tessere.
|
||||||
block.titanium-wall.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici.
|
block.titanium-wall.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici.
|
||||||
block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. \nOccupa più blocchi
|
block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici.\nOccupa più tessere
|
||||||
block.plastanium-wall.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche del nodo d'energia.
|
block.plastanium-wall.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche del nodo d'energia.
|
||||||
block.plastanium-wall-large.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche dei nodi d'energia.\nSi estende su più blocchi.
|
block.plastanium-wall-large.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche dei nodi d'energia.\nSi estende su più tessere.
|
||||||
block.thorium-wall.description = Un forte blocco difensivo.\nBuona protezione dai nemici.
|
block.thorium-wall.description = Un forte blocco difensivo.\nBuona protezione dai nemici.
|
||||||
block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più blocchi
|
block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più tessere.
|
||||||
block.phase-wall.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.
|
block.phase-wall.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.
|
||||||
block.phase-wall-large.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.\nOccupa più blocchi
|
block.phase-wall-large.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.\nOccupa più tessere.
|
||||||
block.surge-wall.description = Il blocco difensivo più forte. \nHa una piccola possibilità di innescare un fulmine verso l'attaccante.
|
block.surge-wall.description = Il blocco difensivo più forte.\nHa una piccola possibilità di innescare un fulmine verso l'attaccante.
|
||||||
block.surge-wall-large.description = Il blocco difensivo più forte. \n Ha una piccola possibilità di innescare un fulmine verso l'attaccante.\nOccupa più blocchi
|
block.surge-wall-large.description = Il blocco difensivo più forte.\nHa una piccola possibilità di innescare un fulmine verso l'attaccante.\nOccupa più tessere.
|
||||||
block.door.description = Una piccola porta che può essere aperta e chiusa toccandola. \nSe aperta, i nemici possono sparare ed attraversare.
|
block.door.description = Una piccola porta che può essere aperta e chiusa toccandola.\nSe aperta, i nemici possono sparare ed attraversare.
|
||||||
block.door-large.description = Una grande porta che può essere aperta e chiusa toccandola. \nSe aperta, i nemici possono sparare ed attraversare. \nOccupa più blocchi
|
block.door-large.description = Una grande porta che può essere aperta e chiusa toccandola.\nSe aperta, i nemici possono sparare ed attraversare.\nOccupa più tessere.
|
||||||
block.mender.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del silicio per aumentarne portata ed efficienza.
|
block.mender.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del silicio per aumentarne portata ed efficienza.
|
||||||
block.mend-projector.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del tessuto di fase per aumentarne portata ed efficienza.
|
block.mend-projector.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del tessuto di fase per aumentarne portata ed efficienza.
|
||||||
block.overdrive-projector.description = Aumenta la velocità di edifici vicini come trivelle e nastri trasportatori.
|
block.overdrive-projector.description = Aumenta la velocità di edifici vicini come trivelle e nastri trasportatori.
|
||||||
block.force-projector.description = Crea un campo di forza esagonale attorno a sé, proteggendo gli edifici e le unità all'interno da danni causati da proiettili
|
block.force-projector.description = Crea un campo di forza esagonale attorno a sé, proteggendo gli edifici e le unità all'interno da danni causati da proiettili.
|
||||||
block.shock-mine.description = Danneggia i nemici che la calpestano. Quasi invisibile al nemico.
|
block.shock-mine.description = Danneggia i nemici che la calpestano. Quasi invisibile al nemico.
|
||||||
block.conveyor.description = Nastro di base. Sposta gli oggetti in avanti e li deposita automaticamente in altri blocchi. Ruotabile.
|
block.conveyor.description = Nastro di base. Sposta gli oggetti in avanti e li deposita automaticamente in altri blocchi. Ruotabile.
|
||||||
block.titanium-conveyor.description = Nastro avanzato. Sposta gli oggetti più velocemente dei nastri standard.
|
block.titanium-conveyor.description = Nastro avanzato. Sposta gli oggetti più velocemente dei nastri standard.
|
||||||
@@ -1149,22 +1154,24 @@ block.sorter.description = Divide gli oggetti. Se l'oggetto corrisponde a quello
|
|||||||
block.inverted-sorter.description = Elabora gli oggetti come uno smistatore standard, ma in uscita dà gli elementi selezionati ai lati.
|
block.inverted-sorter.description = Elabora gli oggetti come uno smistatore standard, ma in uscita dà gli elementi selezionati ai lati.
|
||||||
block.router.description = Accetta gli elementi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Utile per suddividere i materiali da una fonte a più destinazioni.
|
block.router.description = Accetta gli elementi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Utile per suddividere i materiali da una fonte a più destinazioni.
|
||||||
block.distributor.description = Un distributore avanzato che divide gli oggetti in altre 7 direzioni allo stesso modo.
|
block.distributor.description = Un distributore avanzato che divide gli oggetti in altre 7 direzioni allo stesso modo.
|
||||||
block.overflow-gate.description = Una combinazione di un incrocio e di un distributore , che distribuisce sui suoi lati se in nastro difronte si satura.
|
block.overflow-gate.description = Una combinazione di un incrocio e di un distributore, che distribuisce sui suoi lati se in nastro difronte si satura.
|
||||||
block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie diversi oggetti e poi li spara su un'altra Lancia Materiali a lungo raggio.
|
block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie diversi oggetti e poi li spara su un'altra Lìlancia materiali a lungo raggio.
|
||||||
block.mechanical-pump.description = Una pompa economica con potenza lenta, ma nessun consumo di energia.
|
block.mechanical-pump.description = Una pompa economica a bassa efficienza, ma nessun consumo di energia.
|
||||||
block.rotary-pump.description = Una pompa avanzata che raddoppia la velocità consumando energia.
|
block.rotary-pump.description = Una pompa avanzata che raddoppia la velocità consumando energia.
|
||||||
block.thermal-pump.description = La pompa migliore. Tre volte più veloce di una pompa meccanica e l'unica pompa in grado di recuperare la lava.
|
block.thermal-pump.description = La pompa migliore. Tre volte più veloce di una pompa meccanica e l'unica pompa in grado di recuperare la lava.
|
||||||
block.conduit.description = Condotto di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altri condotti.
|
block.conduit.description = Condotto di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altri condotti.
|
||||||
block.pulse-conduit.description = Condotto avanzato. Trasporta più liquido e più velocemente dei condotti standard.
|
block.pulse-conduit.description = Condotto avanzato. Trasporta più liquido e più velocemente dei condotti standard.
|
||||||
|
block.plated-conduit.description = Trasferisce i liquidi alla stessa velocità del Condotto a Impulsi, ma è più resistente. Non accetta liquidi dai lati da parte di condotti diversi.\nMeno perdite.
|
||||||
block.liquid-router.description = Accetta i liquidi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Può anche immagazzinare una certa quantità di liquido. Utile per suddividere i liquidi da una fonte verso più destinazioni.
|
block.liquid-router.description = Accetta i liquidi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Può anche immagazzinare una certa quantità di liquido. Utile per suddividere i liquidi da una fonte verso più destinazioni.
|
||||||
block.liquid-tank.description = Conserva una grande quantità di liquidi. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali o come protezione per il raffreddamento di blocchi vitali.
|
block.liquid-tank.description = Conserva una grande quantità di liquidi. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali o come protezione per il raffreddamento di blocchi vitali.
|
||||||
block.liquid-junction.description = Permette di incrociare condotti che trasportano liquidi diversi in posizioni diverse.
|
block.liquid-junction.description = Permette di incrociare condotti che trasportano liquidi diversi in posizioni diverse.
|
||||||
block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici.
|
block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici.
|
||||||
block.phase-conduit.description = Condotto avanzato. Consuma energia per teletrasportare i liquidi in un altro condotto di fase collegato.
|
block.phase-conduit.description = Condotto avanzato. Consuma energia per teletrasportare i liquidi in un altro condotto di fase collegato.
|
||||||
block.power-node.description = Trasmette energia tra i nodi collegati. È possibile creare fino a quattro collegamenti.\nClicca sul nodo per configurare i collegamenti.
|
block.power-node.description = Trasmette energia tra i nodi collegati. È possibile creare fino a quattro collegamenti.\nClicca sul nodo per configurare i collegamenti.
|
||||||
block.power-node-large.description = Ha un raggio maggiore rispetto al nodo energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti.
|
block.power-node-large.description = Ha un raggio maggiore rispetto al Nodo Energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti.
|
||||||
block.surge-tower.description = Un nodo di alimentazione a lungo raggio solo due connessioni disponibili.\nClicca sul nodo per configurare i collegamenti.
|
block.surge-tower.description = Un nodo di alimentazione a lungo raggio solo due connessioni disponibili.\nClicca sul nodo per configurare i collegamenti.
|
||||||
block.battery.description = Accumula energia ogni volta che c'è abbondanza e fornisce energia ogni volta che c'è carenza, purché rimanga carica.
|
block.diode.description = L'energia della batteria può attraversare questo blocco in una sola direzione, ma solo se l'altra parte ha meno energia.
|
||||||
|
block.battery.description = Accumula energia ogni volta che c'è abbondanza e fornisce energia ogni volta che c'è carenza, purché sia carica.
|
||||||
block.battery-large.description = Immagazzina molta più energia di una normale batteria.
|
block.battery-large.description = Immagazzina molta più energia di una normale batteria.
|
||||||
block.combustion-generator.description = Genera energia bruciando combustibile.
|
block.combustion-generator.description = Genera energia bruciando combustibile.
|
||||||
block.thermal-generator.description = Genera una grande quantità di energia dalla lava.
|
block.thermal-generator.description = Genera una grande quantità di energia dalla lava.
|
||||||
@@ -1172,10 +1179,10 @@ block.turbine-generator.description = Più efficiente di un generatore a combust
|
|||||||
block.differential-generator.description = Genera grandi quantità di energia. Utilizza la differenza di temperatura tra criofluido e pirite in combustione.
|
block.differential-generator.description = Genera grandi quantità di energia. Utilizza la differenza di temperatura tra criofluido e pirite in combustione.
|
||||||
block.rtg-generator.description = Un generatore che sfrutta il calore del decadimento di materiale radioattivo per produrre energia.\nNon richiede raffreddamento ma fornisce meno energia di un reattore al torio.
|
block.rtg-generator.description = Un generatore che sfrutta il calore del decadimento di materiale radioattivo per produrre energia.\nNon richiede raffreddamento ma fornisce meno energia di un reattore al torio.
|
||||||
block.solar-panel.description = Fornisce una piccola quantità di energia dal sole.
|
block.solar-panel.description = Fornisce una piccola quantità di energia dal sole.
|
||||||
block.solar-panel-large.description = Fornisce un'alimentazione molto migliore rispetto a un pannello solare standard, ma è anche molto più costoso da costruire.
|
block.solar-panel-large.description = Fornisce un'alimentazione migliore rispetto a un pannello solare standard, ma è anche molto più costoso da costruire.
|
||||||
block.thorium-reactor.description = Genera enormi quantità di energia dal torio altamente radioattivo. Richiede un raffreddamento costante. Esploderà violentemente se vengono fornite quantità insufficienti di refrigerante.
|
block.thorium-reactor.description = Genera enormi quantità di energia dal torio altamente radioattivo. Richiede un raffreddamento costante. Esploderà violentemente se vengono fornite quantità insufficienti di refrigerante.
|
||||||
block.impact-reactor.description = Un generatore avanzato, in grado di creare enormi quantità di energia alla massima efficienza. Richiede un significativo apporto di energia per avviare il processo.
|
block.impact-reactor.description = Un generatore avanzato, in grado di creare enormi quantità di energia alla massima efficienza. Richiede un significativo apporto di energia per avviare il processo.
|
||||||
block.mechanical-drill.description = Una trivella economica. Se posizionato su riquadri appropriati, estrae minerali a un ritmo lento e costante.
|
block.mechanical-drill.description = Una trivella economica. Se posizionata su slot appropriati, estrae minerali a un ritmo lento e costante.
|
||||||
block.pneumatic-drill.description = Una trivella migliorata più veloce ed in grado di elaborare materiali più duri sfruttando la pressione dell'aria.
|
block.pneumatic-drill.description = Una trivella migliorata più veloce ed in grado di elaborare materiali più duri sfruttando la pressione dell'aria.
|
||||||
block.laser-drill.description = Consente di perforare ancora più velocemente attraverso la tecnologia laser, ma richiede energia. Inoltre, con questa trivella è possibile recuperare il torio radioattivo.
|
block.laser-drill.description = Consente di perforare ancora più velocemente attraverso la tecnologia laser, ma richiede energia. Inoltre, con questa trivella è possibile recuperare il torio radioattivo.
|
||||||
block.blast-drill.description = La trivella migliore. Richiede grandi quantità di energia.
|
block.blast-drill.description = La trivella migliore. Richiede grandi quantità di energia.
|
||||||
@@ -1187,7 +1194,7 @@ block.core-foundation.description = La seconda versione del Nucleo. Meglio coraz
|
|||||||
block.core-nucleus.description = La terza ed ultima versione del Nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse.
|
block.core-nucleus.description = La terza ed ultima versione del Nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse.
|
||||||
block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal deposito.
|
block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal deposito.
|
||||||
block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore.
|
block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore.
|
||||||
block.unloader.description = Scarica gli oggetti da un contenitore, caveau o Nucleo su un trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore.
|
block.unloader.description = Scarica gli oggetti da un contenitore, deposito o Nucleo su un nastro trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore.
|
||||||
block.launch-pad.description = Lancia oggetti nel tuo Nucleo senza necessità di un lasciare la zona.
|
block.launch-pad.description = Lancia oggetti nel tuo Nucleo senza necessità di un lasciare la zona.
|
||||||
block.launch-pad-large.description = Una versione migliore dell'Ascensore Spaziale, immagazzina più oggetti. Lancia oggetti più frequentemente.
|
block.launch-pad-large.description = Una versione migliore dell'Ascensore Spaziale, immagazzina più oggetti. Lancia oggetti più frequentemente.
|
||||||
block.duo.description = Una torretta piccola ed economica.
|
block.duo.description = Una torretta piccola ed economica.
|
||||||
@@ -1204,7 +1211,7 @@ block.ripple.description = Una grande torretta di artiglieria che spara più col
|
|||||||
block.cyclone.description = Una grande torretta a fuoco rapido.
|
block.cyclone.description = Una grande torretta a fuoco rapido.
|
||||||
block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente.
|
block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente.
|
||||||
block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio.
|
block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio.
|
||||||
block.command-center.description = Da istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del Nucleo nemico o la ritirata verso il proprio Nucleo o fabbrica.\nQuando non è presente un Nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco.
|
block.command-center.description = Dà istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del Nucleo nemico o la ritirata verso il proprio Nucleo o fabbrica.\nQuando non è presente un Nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco.
|
||||||
block.draug-factory.description = Produce droni per la raccolta mineraria.
|
block.draug-factory.description = Produce droni per la raccolta mineraria.
|
||||||
block.spirit-factory.description = Produce droni che riparano blocchi.
|
block.spirit-factory.description = Produce droni che riparano blocchi.
|
||||||
block.phantom-factory.description = Produce droni avanzati che seguono il giocatore e lo assistono nella costruzione.
|
block.phantom-factory.description = Produce droni avanzati che seguono il giocatore e lo assistono nella costruzione.
|
||||||
@@ -1216,10 +1223,10 @@ block.crawler-factory.description = Produce unità di sciame veloci ed autodistr
|
|||||||
block.titan-factory.description = Produce unità terrestri avanzate e corazzate.
|
block.titan-factory.description = Produce unità terrestri avanzate e corazzate.
|
||||||
block.fortress-factory.description = Produce unità di terra di artiglieria pesante.
|
block.fortress-factory.description = Produce unità di terra di artiglieria pesante.
|
||||||
block.repair-point.description = Cura continuamente l'unità danneggiata più vicina.
|
block.repair-point.description = Cura continuamente l'unità danneggiata più vicina.
|
||||||
block.dart-mech-pad.description = Trasforma la tua nave in un mech di attacco di base. \nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
block.dart-mech-pad.description = Trasforma la tua nave in un mech di attacco di base.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
block.delta-mech-pad.description = Trasforma la tua nave in un mech veloce e leggermente corazzato, ideale per colpire e scappare. \nUsa il blocco toccando due volte mentre ti ci trovi sopra.
|
block.delta-mech-pad.description = Trasforma la tua nave in un mech veloce e leggermente corazzato, ideale per colpire e scappare.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
block.tau-mech-pad.description = Trasforma la tua nave in un mech di supporto in grado di curare edifici ed unità alleate. \n Usa il blocco toccando due volte mentre sei in piedi su di esso.
|
block.tau-mech-pad.description = Trasforma la tua nave in un mech di supporto in grado di curare edifici ed unità alleate.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
block.omega-mech-pad.description = Trasforma la tua nave in un mech voluminoso e ben corazzato, creato per gli assalti in prima linea. \nUsa il blocco toccando due volte mentre sei in piedi su di esso.
|
block.omega-mech-pad.description = Trasforma la tua nave in un mech voluminoso e ben corazzato, creato per gli assalti in prima linea.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
block.javelin-ship-pad.description = Trasforma la tua nave in un intercettore forte e veloce con armi elettriche.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
block.javelin-ship-pad.description = Trasforma la tua nave in un intercettore forte e veloce con armi elettriche.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
block.trident-ship-pad.description = Trasforma la tua nave in un bombardiere pesante e ben corazzato. \nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
block.trident-ship-pad.description = Trasforma la tua nave in un bombardiere pesante e ben corazzato.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
block.glaive-ship-pad.description = Trasforma la tua nave in una nave grande e ben corazzata. \nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
block.glaive-ship-pad.description = Trasforma la tua nave in una nave grande e ben corazzata.\nUsa il blocco toccando due volte mentre ti trovi su di esso.
|
||||||
|
|||||||
@@ -7,14 +7,15 @@ link.reddit.description = Mindustry 레딧
|
|||||||
link.github.description = 게임 소스코드
|
link.github.description = 게임 소스코드
|
||||||
link.changelog.description = 새로 추가된 것들
|
link.changelog.description = 새로 추가된 것들
|
||||||
link.dev-builds.description = 불안정한 개발 빌드들
|
link.dev-builds.description = 불안정한 개발 빌드들
|
||||||
link.trello.description = 다음 출시될 기능들을 게시한 공식 Trello 보드
|
link.trello.description = 출시 예정중인 기능들을 게시한 공식 Trello 보드
|
||||||
link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트
|
link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트
|
||||||
link.google-play.description = Google Play 스토어 정보
|
link.google-play.description = Google Play 스토어 정보
|
||||||
link.f-droid.description = F-Droid 카탈로그
|
link.f-droid.description = F-Droid 카탈로그
|
||||||
link.wiki.description = 공식 Mindustry 위키
|
link.wiki.description = 공식 Mindustry 위키
|
||||||
|
link.feathub.description = 기능 아이디어 건의하기
|
||||||
linkfail = 링크를 여는 데 실패했습니다!\nURL이 기기의 클립보드에 복사되었습니다.
|
linkfail = 링크를 여는 데 실패했습니다!\nURL이 기기의 클립보드에 복사되었습니다.
|
||||||
screenshot = 스크린샷이 {0} 경로에 저장되었습니다.
|
screenshot = 스크린 샷이 {0} 경로에 저장되었습니다.
|
||||||
screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가 충분하지 않습니다.
|
screenshot.invalid = 맵이 너무 커서 스크린 샷을 찍을 메모리가 충분하지 않습니다.
|
||||||
gameover = 게임 오버
|
gameover = 게임 오버
|
||||||
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
||||||
highscore = [accent]최고점수 달성!
|
highscore = [accent]최고점수 달성!
|
||||||
@@ -35,11 +36,11 @@ schematic.replace = 이 설계도와 같은 이름의 설계도가 이미 존재
|
|||||||
schematic.import = 설계도 불러오기
|
schematic.import = 설계도 불러오기
|
||||||
schematic.exportfile = 파일 내보내기
|
schematic.exportfile = 파일 내보내기
|
||||||
schematic.importfile = 파일 불러오기
|
schematic.importfile = 파일 불러오기
|
||||||
schematic.browseworkshop = 워크샵 탐색
|
schematic.browseworkshop = Workshop 탐색
|
||||||
schematic.copy = 클립보드에 복사하기
|
schematic.copy = 클립보드에 복사하기
|
||||||
schematic.copy.import = 클립보드에서 붙여넣기
|
schematic.copy.import = 클립보드에서 붙여넣기
|
||||||
schematic.shareworkshop = 워크샵에 공유
|
schematic.shareworkshop = 워크샵에 공유
|
||||||
schematic.flip = 좌우 뒤집기 :[accent][[{0}][] / 상하 뒤집기 : [accent][[{1}][]
|
schematic.flip = 좌우 뒤집기 : [accent][[{0}][] / 상하 뒤집기 : [accent][[{1}][]
|
||||||
schematic.saved = 설계도 저장됨.
|
schematic.saved = 설계도 저장됨.
|
||||||
schematic.delete.confirm = 삭제된 설계도는 복구할 수 없습니다. 정말로 삭제하시겠습니까?
|
schematic.delete.confirm = 삭제된 설계도는 복구할 수 없습니다. 정말로 삭제하시겠습니까?
|
||||||
schematic.rename = 설계도명 변경
|
schematic.rename = 설계도명 변경
|
||||||
@@ -94,7 +95,7 @@ mods.alpha = [scarlet](Alpha)
|
|||||||
mods = 모드
|
mods = 모드
|
||||||
mods.none = [LIGHT_GRAY]추가한 모드가 없습니다!
|
mods.none = [LIGHT_GRAY]추가한 모드가 없습니다!
|
||||||
mods.guide = 모드 가이드
|
mods.guide = 모드 가이드
|
||||||
mods.report = 버그 신고
|
mods.report = 문제 신고
|
||||||
mods.openfolder = 모드 폴더 열기
|
mods.openfolder = 모드 폴더 열기
|
||||||
mod.enabled = [lightgray]활성화
|
mod.enabled = [lightgray]활성화
|
||||||
mod.disabled = [scarlet]비활성화
|
mod.disabled = [scarlet]비활성화
|
||||||
@@ -102,7 +103,10 @@ mod.disable = 비활성화
|
|||||||
mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다.
|
mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다.
|
||||||
mod.requiresversion = [scarlet]게임의 버전이 낮아 모드를 활성화할 수 없습니다!\n[scarlet]요구되는 게임 버전 : [accent]{0}
|
mod.requiresversion = [scarlet]게임의 버전이 낮아 모드를 활성화할 수 없습니다!\n[scarlet]요구되는 게임 버전 : [accent]{0}
|
||||||
mod.missingdependencies = [scarlet]의존되는 모드: {0}
|
mod.missingdependencies = [scarlet]의존되는 모드: {0}
|
||||||
mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 :[accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다.
|
mod.erroredcontent = [scarlet]컨텐츠 오류
|
||||||
|
mod.errors = 컨텐츠를 불러오는 중 오류가 발생하였습니다.
|
||||||
|
mod.noerrorplay = [scarlet]모드에 오류가 존재합니다.[] 해당 오류가 발생하는 모드를 비활성화하거나 모드의 오류를 고친 후 플레이가 가능합니다.
|
||||||
|
mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 : [accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다.
|
||||||
mod.enable = 활성화
|
mod.enable = 활성화
|
||||||
mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종료합니다.
|
mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종료합니다.
|
||||||
mod.reloadrequired = [scarlet]새로고침 예정됨
|
mod.reloadrequired = [scarlet]새로고침 예정됨
|
||||||
@@ -111,7 +115,7 @@ mod.import.github = 깃허브 모드 추가
|
|||||||
mod.item.remove = 이것은 모드[accent] '{0}'[]의 자원입니다. 이 자원을 삭제하려면, 이 모드를 제거해야합니다.
|
mod.item.remove = 이것은 모드[accent] '{0}'[]의 자원입니다. 이 자원을 삭제하려면, 이 모드를 제거해야합니다.
|
||||||
mod.remove.confirm = 이 모드를 삭제하시겠습니까?
|
mod.remove.confirm = 이 모드를 삭제하시겠습니까?
|
||||||
mod.author = [LIGHT_GRAY]제작자 : [] {0}
|
mod.author = [LIGHT_GRAY]제작자 : [] {0}
|
||||||
mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0}
|
mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 현재 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0}
|
||||||
mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요.
|
mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요.
|
||||||
mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오.
|
mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오.
|
||||||
mod.scripts.unsupported = 당신의 기기는 모드스크립트를 지원하지 않습니다. 모드의 일부 기능이 작동하지 않을 수 있습니다.
|
mod.scripts.unsupported = 당신의 기기는 모드스크립트를 지원하지 않습니다. 모드의 일부 기능이 작동하지 않을 수 있습니다.
|
||||||
@@ -594,8 +598,8 @@ unit.persecond = /초
|
|||||||
unit.timesspeed = x 배
|
unit.timesspeed = x 배
|
||||||
unit.percent = %
|
unit.percent = %
|
||||||
unit.items = 자원
|
unit.items = 자원
|
||||||
unit.thousands = 천
|
unit.thousands = k
|
||||||
unit.millions = 백만
|
unit.millions = mil
|
||||||
category.general = 일반
|
category.general = 일반
|
||||||
category.power = 전력
|
category.power = 전력
|
||||||
category.liquids = 액체
|
category.liquids = 액체
|
||||||
@@ -635,7 +639,7 @@ setting.sensitivity.name = 컨트롤러 감도
|
|||||||
setting.saveinterval.name = 저장 간격
|
setting.saveinterval.name = 저장 간격
|
||||||
setting.seconds = {0} 초
|
setting.seconds = {0} 초
|
||||||
setting.blockselecttimeout.name = 블록 선택 시간 초과
|
setting.blockselecttimeout.name = 블록 선택 시간 초과
|
||||||
setting.milliseconds = {0} 밀리초
|
setting.milliseconds = {0} ms
|
||||||
setting.fullscreen.name = 전체 화면
|
setting.fullscreen.name = 전체 화면
|
||||||
setting.borderlesswindow.name = 테두리 없는 창모드[LIGHT_GRAY] (재시작이 필요할 수 있습니다)
|
setting.borderlesswindow.name = 테두리 없는 창모드[LIGHT_GRAY] (재시작이 필요할 수 있습니다)
|
||||||
setting.fps.name = FPS 표시
|
setting.fps.name = FPS 표시
|
||||||
@@ -683,20 +687,20 @@ keybind.schematic_flip_x.name = 설계도 X축 뒤집기
|
|||||||
keybind.schematic_flip_y.name = 설계도 Y축 뒤집기
|
keybind.schematic_flip_y.name = 설계도 Y축 뒤집기
|
||||||
keybind.category_prev.name = 이전 목록
|
keybind.category_prev.name = 이전 목록
|
||||||
keybind.category_next.name = 다음 목록
|
keybind.category_next.name = 다음 목록
|
||||||
keybind.block_select_left.name = 블럭 왼쪽 선택
|
keybind.block_select_left.name = 블록 왼쪽 선택
|
||||||
keybind.block_select_right.name = 블럭 오른쪽 선택
|
keybind.block_select_right.name = 블록 오른쪽 선택
|
||||||
keybind.block_select_up.name = 블럭 위쪽 선택
|
keybind.block_select_up.name = 블록 위쪽 선택
|
||||||
keybind.block_select_down.name = 블럭 아래쪽 선택
|
keybind.block_select_down.name = 블록 아래쪽 선택
|
||||||
keybind.block_select_01.name = 카테고리/블럭 선택 1
|
keybind.block_select_01.name = 카테고리/블록 선택 1
|
||||||
keybind.block_select_02.name = 카테고리/블럭 선택 2
|
keybind.block_select_02.name = 카테고리/블록 선택 2
|
||||||
keybind.block_select_03.name = 카테고리/블럭 선택 3
|
keybind.block_select_03.name = 카테고리/블록 선택 3
|
||||||
keybind.block_select_04.name = 카테고리/블럭 선택 4
|
keybind.block_select_04.name = 카테고리/블록 선택 4
|
||||||
keybind.block_select_05.name = 카테고리/블럭 선택 5
|
keybind.block_select_05.name = 카테고리/블록 선택 5
|
||||||
keybind.block_select_06.name = 카테고리/블럭 선택 6
|
keybind.block_select_06.name = 카테고리/블록 선택 6
|
||||||
keybind.block_select_07.name = 카테고리/블럭 선택 7
|
keybind.block_select_07.name = 카테고리/블록 선택 7
|
||||||
keybind.block_select_08.name = 카테고리/블럭 선택 8
|
keybind.block_select_08.name = 카테고리/블록 선택 8
|
||||||
keybind.block_select_09.name = 카테고리/블럭 선택 9
|
keybind.block_select_09.name = 카테고리/블록 선택 9
|
||||||
keybind.block_select_10.name = 카테고리/블럭 선택 10
|
keybind.block_select_10.name = 카테고리/블록 선택 10
|
||||||
keybind.fullscreen.name = 전체 화면
|
keybind.fullscreen.name = 전체 화면
|
||||||
keybind.select.name = 선택/공격
|
keybind.select.name = 선택/공격
|
||||||
keybind.diagonal_placement.name = 대각선 설치
|
keybind.diagonal_placement.name = 대각선 설치
|
||||||
@@ -716,8 +720,8 @@ keybind.console.name = 콘솔
|
|||||||
keybind.rotate.name = 회전
|
keybind.rotate.name = 회전
|
||||||
keybind.rotateplaced.name = 기존 회전 (고정)
|
keybind.rotateplaced.name = 기존 회전 (고정)
|
||||||
keybind.toggle_menus.name = 메뉴 보이기/숨기기
|
keybind.toggle_menus.name = 메뉴 보이기/숨기기
|
||||||
keybind.chat_history_prev.name = 이전 채팅기록
|
keybind.chat_history_prev.name = 이전 채팅 기록
|
||||||
keybind.chat_history_next.name = 다음 채팅기록
|
keybind.chat_history_next.name = 다음 채팅 기록
|
||||||
keybind.chat_scroll.name = 채팅 스크롤
|
keybind.chat_scroll.name = 채팅 스크롤
|
||||||
keybind.drop_unit.name = 유닛 처치 시 자원획득
|
keybind.drop_unit.name = 유닛 처치 시 자원획득
|
||||||
keybind.zoom_minimap.name = 미니맵 확대
|
keybind.zoom_minimap.name = 미니맵 확대
|
||||||
@@ -730,11 +734,11 @@ mode.editor.name = 편집기
|
|||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다.
|
mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다.
|
||||||
mode.attack.name = 공격
|
mode.attack.name = 공격
|
||||||
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다.
|
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간 팀 코어가 있어야 플레이 가능합니다.
|
||||||
mode.custom = 사용자 정의 규칙
|
mode.custom = 사용자 정의 규칙
|
||||||
|
|
||||||
rules.infiniteresources = 무한 자원
|
rules.infiniteresources = 무한 자원
|
||||||
rules.reactorexplosions = 원자로 폭발 허가여부
|
rules.reactorexplosions = 원자로 폭발 허가 여부
|
||||||
rules.wavetimer = 단계 대기시간
|
rules.wavetimer = 단계 대기시간
|
||||||
rules.waves = 단계 활성화
|
rules.waves = 단계 활성화
|
||||||
rules.attack = 공격 모드
|
rules.attack = 공격 모드
|
||||||
@@ -750,7 +754,7 @@ rules.respawntime = 플레이어 부활 대기 시간 : [LIGHT_GRAY] (초)
|
|||||||
rules.wavespacing = 단계 간격 : [LIGHT_GRAY] (초)
|
rules.wavespacing = 단계 간격 : [LIGHT_GRAY] (초)
|
||||||
rules.buildcostmultiplier = 건설 소모 배수
|
rules.buildcostmultiplier = 건설 소모 배수
|
||||||
rules.buildspeedmultiplier = 건설 속도 배수
|
rules.buildspeedmultiplier = 건설 속도 배수
|
||||||
rules.waitForWaveToEnd = 단계가 끝날때까지 기다리는중
|
rules.waitForWaveToEnd = 단계가 끝날때까지 기다리는 중
|
||||||
rules.dropzoneradius = 소환 충격파 범위 : [LIGHT_GRAY] (타일)
|
rules.dropzoneradius = 소환 충격파 범위 : [LIGHT_GRAY] (타일)
|
||||||
rules.respawns = 단계당 최대 플레이어 부활 횟수
|
rules.respawns = 단계당 최대 플레이어 부활 횟수
|
||||||
rules.limitedRespawns = 플레이어 부활 제한
|
rules.limitedRespawns = 플레이어 부활 제한
|
||||||
@@ -810,7 +814,7 @@ mech.trident-ship.name = 트라이던트
|
|||||||
mech.trident-ship.weapon = 폭탄 저장고
|
mech.trident-ship.weapon = 폭탄 저장고
|
||||||
mech.glaive-ship.name = 글레이브
|
mech.glaive-ship.name = 글레이브
|
||||||
mech.glaive-ship.weapon = 중무장 인화성 소총
|
mech.glaive-ship.weapon = 중무장 인화성 소총
|
||||||
item.corestorable = [lightgray]코어 잔여 저장공간: {0}
|
item.corestorable = [lightgray]코어 저장 가능 여부 : {0}
|
||||||
item.explosiveness = [LIGHT_GRAY]폭발성 : {0}
|
item.explosiveness = [LIGHT_GRAY]폭발성 : {0}
|
||||||
item.flammability = [LIGHT_GRAY]인화성 : {0}
|
item.flammability = [LIGHT_GRAY]인화성 : {0}
|
||||||
item.radioactivity = [LIGHT_GRAY]방사능 : {0}
|
item.radioactivity = [LIGHT_GRAY]방사능 : {0}
|
||||||
@@ -1117,7 +1121,7 @@ block.cryofluidmixer.description = 물과 티타늄을 냉각에 훨씬 더 효
|
|||||||
block.blast-mixer.description = 포자를 사용하여 파이라타이트를 폭발성 화합물로 변환시킵니다.
|
block.blast-mixer.description = 포자를 사용하여 파이라타이트를 폭발성 화합물로 변환시킵니다.
|
||||||
block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다.
|
block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다.
|
||||||
block.melter.description = 고철을 녹여 파도의 탄약 혹은 원심 분리기에 사용할 수 있는 액체인 광재로 만듭니다.
|
block.melter.description = 고철을 녹여 파도의 탄약 혹은 원심 분리기에 사용할 수 있는 액체인 광재로 만듭니다.
|
||||||
block.separator.description = 광재룰 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다.
|
block.separator.description = 광재를 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다.
|
||||||
block.spore-press.description = 포자를 압축해 기름을 추출합니다.
|
block.spore-press.description = 포자를 압축해 기름을 추출합니다.
|
||||||
block.pulverizer.description = 고철을 갈아 모래로 만듭니다. 맵에 모래가 부족할 때 유용합니다.
|
block.pulverizer.description = 고철을 갈아 모래로 만듭니다. 맵에 모래가 부족할 때 유용합니다.
|
||||||
block.coal-centrifuge.description = 석유로 석탄을 만듭니다.
|
block.coal-centrifuge.description = 석유로 석탄을 만듭니다.
|
||||||
|
|||||||
@@ -12,13 +12,14 @@ link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
|||||||
link.google-play.description = Strona na sklepie Google Play
|
link.google-play.description = Strona na sklepie Google Play
|
||||||
link.f-droid.description = F-Droid catalogue listing
|
link.f-droid.description = F-Droid catalogue listing
|
||||||
link.wiki.description = Oficjana Wiki Mindustry
|
link.wiki.description = Oficjana Wiki Mindustry
|
||||||
|
link.feathub.description = Zaproponuj nowe funkcje
|
||||||
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
|
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
|
||||||
screenshot = Zapisano zdjęcie w {0}
|
screenshot = Zapisano zdjęcie w {0}
|
||||||
screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia.
|
screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia.
|
||||||
gameover = Koniec Gry
|
gameover = Koniec Gry
|
||||||
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
||||||
highscore = [YELLOW] Nowy rekord!
|
highscore = [YELLOW] Nowy rekord!
|
||||||
copied = Copied.
|
copied = Skopiowano.
|
||||||
|
|
||||||
load.sound = Dźwięki
|
load.sound = Dźwięki
|
||||||
load.map = Mapy
|
load.map = Mapy
|
||||||
@@ -26,6 +27,14 @@ load.image = Obrazy
|
|||||||
load.content = Treść
|
load.content = Treść
|
||||||
load.system = System
|
load.system = System
|
||||||
load.mod = Mody
|
load.mod = Mody
|
||||||
|
load.scripts = Skrypty
|
||||||
|
|
||||||
|
be.update = Nowa wersja Bleeding Edge jest dostępna:
|
||||||
|
be.update.confirm = Pobrać i zainstalować teraz?
|
||||||
|
be.updating = Aktualizowanie...
|
||||||
|
be.ignore = Zignoruj
|
||||||
|
be.noupdates = Nie znaleziono aktualizacji.
|
||||||
|
be.check = Sprawdź aktualizacje
|
||||||
|
|
||||||
schematic = Schemat
|
schematic = Schemat
|
||||||
schematic.add = Zapisz schemat...
|
schematic.add = Zapisz schemat...
|
||||||
@@ -80,7 +89,6 @@ continue = Kontynuuj
|
|||||||
maps.none = [lightgray]Nie znaleziono żadnych map!
|
maps.none = [lightgray]Nie znaleziono żadnych map!
|
||||||
invalid = Nieprawidłowy
|
invalid = Nieprawidłowy
|
||||||
pickcolor = Wybierz kolor
|
pickcolor = Wybierz kolor
|
||||||
|
|
||||||
preparingconfig = Przygotowywanie Konfiguracji
|
preparingconfig = Przygotowywanie Konfiguracji
|
||||||
preparingcontent = Przygotowywanie Zawartości
|
preparingcontent = Przygotowywanie Zawartości
|
||||||
uploadingcontent = Przesyłanie Zawartości
|
uploadingcontent = Przesyłanie Zawartości
|
||||||
@@ -100,22 +108,28 @@ mod.enabled = [lightgray]Włączony
|
|||||||
mod.disabled = [scarlet]Wyłączony
|
mod.disabled = [scarlet]Wyłączony
|
||||||
mod.disable = Wyłącz
|
mod.disable = Wyłącz
|
||||||
mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu.
|
mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu.
|
||||||
|
mod.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0}
|
||||||
mod.missingdependencies = [scarlet]Brakujące zależności: {0}
|
mod.missingdependencies = [scarlet]Brakujące zależności: {0}
|
||||||
|
mod.erroredcontent = [scarlet]Content Errors
|
||||||
|
mod.errors = Wystąpił błąd podczas ładowania treści.
|
||||||
|
mod.noerrorplay = [scarlet]Twoje mody zawierają błędy.[] Wyłącz je lub napraw błędy przed rozpoczęciem gry.
|
||||||
mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony.
|
mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony.
|
||||||
mod.enable = Włącz
|
mod.enable = Włącz
|
||||||
mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda.
|
mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda.
|
||||||
mod.reloadrequired = [scarlet]Wymagany restart
|
mod.reloadrequired = [scarlet]Wymagany restart
|
||||||
mod.import = Importuj Mod
|
mod.import = Importuj Mod
|
||||||
mod.import.github = Importuj mod z GitHuba
|
mod.import.github = Importuj mod z GitHuba
|
||||||
|
mod.item.remove = Ten przedmiot jest częścią moda[accent] '{0}'[]. Aby usunąć go, odinstaluj modyfikację.
|
||||||
mod.remove.confirm = Ten mod zostanie usunięty.
|
mod.remove.confirm = Ten mod zostanie usunięty.
|
||||||
mod.author = [LIGHT_GRAY]Autor:[] {0}
|
mod.author = [LIGHT_GRAY]Autor:[] {0}
|
||||||
mod.missing = Ten zapis zawiera mody, które zostały niedawno zaktualizowane, bądź nie są już zainstalowane. Zapis może zostać uszkodzony. Czy jesteś pewien, że chcesz go załadować?\n[lightgray]Mody:\n{0}
|
mod.missing = Ten zapis zawiera mody, które zostały niedawno zaktualizowane, bądź nie są już zainstalowane. Zapis może zostać uszkodzony. Czy jesteś pewien, że chcesz go załadować?\n[lightgray]Mody:\n{0}
|
||||||
mod.preview.missing = Przed opublikowaniem tego moda na Warsztacie musisz dodać zdjęcie podglądowe.\nDodaj zdjęcie o nazwie[accent] preview.png[] do folderu moda i spróbuj jeszcze raz.
|
mod.preview.missing = Przed opublikowaniem tego moda na Warsztacie musisz dodać zdjęcie podglądowe.\nDodaj zdjęcie o nazwie[accent] preview.png[] do folderu moda i spróbuj jeszcze raz.
|
||||||
mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę bądź załaduj ponownie mody.
|
mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę lub załaduj ponownie mody.
|
||||||
|
mod.scripts.unsupported = Twoje urządzenie nie wspiera skryptów. Niektóre mody mogą nie działać poprawnie.
|
||||||
|
|
||||||
about.button = O Grze
|
about.button = O Grze
|
||||||
name = Nazwa:
|
name = Nazwa:
|
||||||
noname = Najpierw wybierz[accent] nazwę gracza[]
|
noname = Najpierw wybierz[accent] nazwę gracza[].
|
||||||
filename = Nazwa Pliku:
|
filename = Nazwa Pliku:
|
||||||
unlocked = Odblokowano nową zawartość!
|
unlocked = Odblokowano nową zawartość!
|
||||||
completed = [accent]Ukończony
|
completed = [accent]Ukończony
|
||||||
@@ -123,8 +137,8 @@ techtree = Drzewo Technologiczne
|
|||||||
research.list = [lightgray]Badania:
|
research.list = [lightgray]Badania:
|
||||||
research = Badaj
|
research = Badaj
|
||||||
researched = [lightgray]{0} zbadane.
|
researched = [lightgray]{0} zbadane.
|
||||||
players = {0} graczy online
|
players = {0} graczy
|
||||||
players.single = {0} gracz online
|
players.single = {0} gracz
|
||||||
server.closing = [accent] Zamykanie serwera...
|
server.closing = [accent] Zamykanie serwera...
|
||||||
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
||||||
server.kicked.whitelist = Nie ma cię tu na białej liście.
|
server.kicked.whitelist = Nie ma cię tu na białej liście.
|
||||||
@@ -141,6 +155,7 @@ server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
|
|||||||
server.kicked.idInUse = Jesteś już na serwerze! Łączenie się z dwóch kont nie jest dozwolone.
|
server.kicked.idInUse = Jesteś już na serwerze! Łączenie się z dwóch kont nie jest dozwolone.
|
||||||
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
|
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
|
||||||
server.kicked.gameover = Koniec gry!
|
server.kicked.gameover = Koniec gry!
|
||||||
|
server.kicked.serverRestarting = Restart serwera.
|
||||||
server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[]
|
server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[]
|
||||||
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[]. \nKażdy w tej samej sieci [lightgray]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[lightgray]Notka: Jeśli ktokolwiek ma problem z dołączeniem do gry lokalnej, upewnij się, że udostępniłeś Mindustry dostęp do sieci w ustawieniach zapory (firewall). Zauważ, że niektóre sieci publiczne mogą nie zezwalać na wykrycie serwerów.
|
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[]. \nKażdy w tej samej sieci [lightgray]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[lightgray]Notka: Jeśli ktokolwiek ma problem z dołączeniem do gry lokalnej, upewnij się, że udostępniłeś Mindustry dostęp do sieci w ustawieniach zapory (firewall). Zauważ, że niektóre sieci publiczne mogą nie zezwalać na wykrycie serwerów.
|
||||||
join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[lightgray]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP.
|
join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[lightgray]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP.
|
||||||
@@ -240,7 +255,7 @@ data.exported = Dane wyeksportowane.
|
|||||||
data.invalid = Nieprawidłowe dane gry.
|
data.invalid = Nieprawidłowe dane gry.
|
||||||
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
|
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
|
||||||
classic.export = Eksportuj Dane Wersji Klasycznej
|
classic.export = Eksportuj Dane Wersji Klasycznej
|
||||||
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nWykryto zapis lub mapę z wersji classic (v3.5 build 40) - czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic?
|
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nWykryto zapis lub mapę z wersji classic (v3.5 build 40) - czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, aby móc używać ich w Mindustry Classic?
|
||||||
quit.confirm = Czy na pewno chcesz wyjść?
|
quit.confirm = Czy na pewno chcesz wyjść?
|
||||||
quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[]
|
quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[]
|
||||||
loading = [accent]Ładowanie...
|
loading = [accent]Ładowanie...
|
||||||
@@ -248,7 +263,7 @@ reloading = [accent]Przeładowywanie Modów...
|
|||||||
saving = [accent]Zapisywanie...
|
saving = [accent]Zapisywanie...
|
||||||
cancelbuilding = [accent][[{0}][] by wyczyścić plan
|
cancelbuilding = [accent][[{0}][] by wyczyścić plan
|
||||||
selectschematic = [accent][[{0}][] by wybrać+skopiować
|
selectschematic = [accent][[{0}][] by wybrać+skopiować
|
||||||
pausebuilding = [accent][[{0}][] by wtrzymać budowę
|
pausebuilding = [accent][[{0}][] by wstrzymać budowę
|
||||||
resumebuilding = [scarlet][[{0}][] by kontynuować budowę
|
resumebuilding = [scarlet][[{0}][] by kontynuować budowę
|
||||||
wave = [accent]Fala {0}
|
wave = [accent]Fala {0}
|
||||||
wave.waiting = Fala za {0}
|
wave.waiting = Fala za {0}
|
||||||
@@ -414,7 +429,6 @@ load = Wczytaj
|
|||||||
save = Zapisz
|
save = Zapisz
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
ping = Ping: {0}ms
|
ping = Ping: {0}ms
|
||||||
|
|
||||||
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
|
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
|
||||||
settings = Ustawienia
|
settings = Ustawienia
|
||||||
tutorial = Poradnik
|
tutorial = Poradnik
|
||||||
@@ -456,7 +470,7 @@ boss.health = Zdrowie Bossa
|
|||||||
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
|
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
|
||||||
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
|
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
|
||||||
error.invalidaddress = Niepoprawny adres.
|
error.invalidaddress = Niepoprawny adres.
|
||||||
error.timedout = Przekroczono limit czasu!/nUpewnij się, że host ma ustawione przekierowanie portu oraz poprawność wpisanego adresu!
|
error.timedout = Przekroczono limit czasu!\nUpewnij się, że host ma ustawione przekierowanie portu oraz poprawność wpisanego adresu!
|
||||||
error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij się, że ty i host macie najnowszą wersję Mindustry!
|
error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij się, że ty i host macie najnowszą wersję Mindustry!
|
||||||
error.alreadyconnected = Jesteś już połączony.
|
error.alreadyconnected = Jesteś już połączony.
|
||||||
error.mapnotfound = Plik mapy nie został znaleziony!
|
error.mapnotfound = Plik mapy nie został znaleziony!
|
||||||
@@ -493,10 +507,12 @@ zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru,
|
|||||||
zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdzenie.
|
zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdzenie.
|
||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
|
|
||||||
settings.language = Język
|
settings.language = Język
|
||||||
settings.data = Dane Gry
|
settings.data = Dane Gry
|
||||||
settings.reset = Przywróć Domyślne
|
settings.reset = Przywróć Domyślne
|
||||||
settings.rebind = Zmień
|
settings.rebind = Zmień
|
||||||
|
settings.resetKey = Resetuj
|
||||||
settings.controls = Sterowanie
|
settings.controls = Sterowanie
|
||||||
settings.game = Gra
|
settings.game = Gra
|
||||||
settings.sound = Dźwięk
|
settings.sound = Dźwięk
|
||||||
@@ -563,8 +579,8 @@ bar.heat = Ciepło
|
|||||||
bar.power = Prąd
|
bar.power = Prąd
|
||||||
bar.progress = Postęp Budowy
|
bar.progress = Postęp Budowy
|
||||||
bar.spawned = Jednostki: {0}/{1}
|
bar.spawned = Jednostki: {0}/{1}
|
||||||
bar.input = Input
|
bar.input = Wejście
|
||||||
bar.output = Output
|
bar.output = Wyjście
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
||||||
@@ -590,6 +606,8 @@ unit.persecond = /sekundę
|
|||||||
unit.timesspeed = x prędkość
|
unit.timesspeed = x prędkość
|
||||||
unit.percent = %
|
unit.percent = %
|
||||||
unit.items = przedmioty
|
unit.items = przedmioty
|
||||||
|
unit.thousands = tys.
|
||||||
|
unit.millions = mln
|
||||||
category.general = Główne
|
category.general = Główne
|
||||||
category.power = Prąd
|
category.power = Prąd
|
||||||
category.liquids = Płyny
|
category.liquids = Płyny
|
||||||
@@ -621,19 +639,20 @@ setting.difficulty.normal = Normalny
|
|||||||
setting.difficulty.hard = Trudny
|
setting.difficulty.hard = Trudny
|
||||||
setting.difficulty.insane = Szalony
|
setting.difficulty.insane = Szalony
|
||||||
setting.difficulty.name = Poziom trudności
|
setting.difficulty.name = Poziom trudności
|
||||||
setting.screenshake.name = Wstrząsy ekranu
|
setting.screenshake.name = Siła wstrząsów ekranu
|
||||||
setting.effects.name = Wyświetlanie efektów
|
setting.effects.name = Wyświetlanie efektów
|
||||||
setting.destroyedblocks.name = Wyświetl zniszczone bloki
|
setting.destroyedblocks.name = Wyświetl zniszczone bloki
|
||||||
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
|
setting.conveyorpathfinding.name = Ustalanie ścieżki przenośników
|
||||||
|
setting.coreselect.name = Zezwalaj na schematyczne rdzenie
|
||||||
setting.sensitivity.name = Czułość kontrolera
|
setting.sensitivity.name = Czułość kontrolera
|
||||||
setting.saveinterval.name = Interwał automatycznego zapisywania
|
setting.saveinterval.name = Interwał automatycznego zapisywania
|
||||||
setting.seconds = {0} sekund
|
setting.seconds = {0} sekund
|
||||||
setting.blockselecttimeout.name = Block Select Timeout
|
setting.blockselecttimeout.name = Block Select Timeout
|
||||||
setting.milliseconds = {0} millisekund
|
setting.milliseconds = {0} milisekund
|
||||||
setting.fullscreen.name = Pełny ekran
|
setting.fullscreen.name = Pełny ekran
|
||||||
setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu)
|
setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu)
|
||||||
setting.fps.name = Pokazuj FPS oraz ping
|
setting.fps.name = Pokazuj FPS oraz ping
|
||||||
setting.blockselectkeys.name = Show Block Select Keys
|
setting.blockselectkeys.name = Pokazuj skróty klawiszowe bloków
|
||||||
setting.vsync.name = Synchronizacja pionowa
|
setting.vsync.name = Synchronizacja pionowa
|
||||||
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
|
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
|
||||||
setting.minimap.name = Pokaż Minimapę
|
setting.minimap.name = Pokaż Minimapę
|
||||||
@@ -653,7 +672,7 @@ public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[accent]Każd
|
|||||||
public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi.
|
public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi.
|
||||||
uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
|
uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
|
||||||
uiscale.cancel = Anuluj i Wyjdź
|
uiscale.cancel = Anuluj i Wyjdź
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Efekt Bloom
|
||||||
keybind.title = Zmień
|
keybind.title = Zmień
|
||||||
keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
|
keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
|
||||||
category.general.name = Ogólne
|
category.general.name = Ogólne
|
||||||
@@ -662,15 +681,15 @@ category.multiplayer.name = Wielu graczy
|
|||||||
command.attack = Atakuj
|
command.attack = Atakuj
|
||||||
command.rally = Zbierz
|
command.rally = Zbierz
|
||||||
command.retreat = Wycofaj
|
command.retreat = Wycofaj
|
||||||
placement.blockselectkeys = \n[lightgray]Key: [{0},
|
placement.blockselectkeys = \n[lightgray]Klawisz: [{0},
|
||||||
keybind.clear_building.name = Wyczyść budynek
|
keybind.clear_building.name = Wyczyść budynek
|
||||||
keybind.press = Naciśnij wybrany klawisz...
|
keybind.press = Naciśnij wybrany klawisz...
|
||||||
keybind.press.axis = Naciśnij oś lub klawisz...
|
keybind.press.axis = Naciśnij oś lub klawisz...
|
||||||
keybind.screenshot.name = Zrzut ekranu mapy
|
keybind.screenshot.name = Zrzut ekranu mapy
|
||||||
keybind.toggle_power_lines.name = Toggle Power Lines
|
keybind.toggle_power_lines.name = Zmień widoczność linii energetycznych
|
||||||
keybind.move_x.name = Poruszanie w poziomie
|
keybind.move_x.name = Poruszanie w poziomie
|
||||||
keybind.move_y.name = Poruszanie w pionie
|
keybind.move_y.name = Poruszanie w pionie
|
||||||
keybind.mouse_move.name = Follow Mouse
|
keybind.mouse_move.name = Podążaj Za Myszą
|
||||||
keybind.dash.name = Dash
|
keybind.dash.name = Dash
|
||||||
keybind.schematic_select.name = Wybierz region
|
keybind.schematic_select.name = Wybierz region
|
||||||
keybind.schematic_menu.name = Menu schematów
|
keybind.schematic_menu.name = Menu schematów
|
||||||
@@ -682,16 +701,16 @@ keybind.block_select_left.name = Block Select Left
|
|||||||
keybind.block_select_right.name = Block Select Right
|
keybind.block_select_right.name = Block Select Right
|
||||||
keybind.block_select_up.name = Block Select Up
|
keybind.block_select_up.name = Block Select Up
|
||||||
keybind.block_select_down.name = Block Select Down
|
keybind.block_select_down.name = Block Select Down
|
||||||
keybind.block_select_01.name = Category/Block Select 1
|
keybind.block_select_01.name = Wybór bloku/kategorii 1
|
||||||
keybind.block_select_02.name = Category/Block Select 2
|
keybind.block_select_02.name = Wybór bloku/kategorii 2
|
||||||
keybind.block_select_03.name = Category/Block Select 3
|
keybind.block_select_03.name = Wybór bloku/kategorii 3
|
||||||
keybind.block_select_04.name = Category/Block Select 4
|
keybind.block_select_04.name = Wybór bloku/kategorii 4
|
||||||
keybind.block_select_05.name = Category/Block Select 5
|
keybind.block_select_05.name = Wybór bloku/kategorii 5
|
||||||
keybind.block_select_06.name = Category/Block Select 6
|
keybind.block_select_06.name = Wybór bloku/kategorii 6
|
||||||
keybind.block_select_07.name = Category/Block Select 7
|
keybind.block_select_07.name = Wybór bloku/kategorii 7
|
||||||
keybind.block_select_08.name = Category/Block Select 8
|
keybind.block_select_08.name = Wybór bloku/kategorii 8
|
||||||
keybind.block_select_09.name = Category/Block Select 9
|
keybind.block_select_09.name = Wybór bloku/kategorii 9
|
||||||
keybind.block_select_10.name = Category/Block Select 10
|
keybind.block_select_10.name = Wybór bloku/kategorii 10
|
||||||
keybind.fullscreen.name = Przełącz Pełny Ekran
|
keybind.fullscreen.name = Przełącz Pełny Ekran
|
||||||
keybind.select.name = Zaznacz
|
keybind.select.name = Zaznacz
|
||||||
keybind.diagonal_placement.name = Budowa po skosie
|
keybind.diagonal_placement.name = Budowa po skosie
|
||||||
@@ -736,6 +755,7 @@ rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespo
|
|||||||
rules.unitdrops = Surowce ze zniszczonych jednostek
|
rules.unitdrops = Surowce ze zniszczonych jednostek
|
||||||
rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek
|
rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek
|
||||||
rules.unithealthmultiplier = Mnożnik życia jednostek
|
rules.unithealthmultiplier = Mnożnik życia jednostek
|
||||||
|
rules.blockhealthmultiplier = Mnożnik życia bloków
|
||||||
rules.playerhealthmultiplier = Mnożnik życia gracza
|
rules.playerhealthmultiplier = Mnożnik życia gracza
|
||||||
rules.playerdamagemultiplier = Mnożnik obrażeń gracza
|
rules.playerdamagemultiplier = Mnożnik obrażeń gracza
|
||||||
rules.unitdamagemultiplier = Mnożnik obrażeń jednostek
|
rules.unitdamagemultiplier = Mnożnik obrażeń jednostek
|
||||||
@@ -804,6 +824,7 @@ mech.trident-ship.name = Trójząb
|
|||||||
mech.trident-ship.weapon = Wnęka bombowa
|
mech.trident-ship.weapon = Wnęka bombowa
|
||||||
mech.glaive-ship.name = Glewia
|
mech.glaive-ship.name = Glewia
|
||||||
mech.glaive-ship.weapon = Zapalający Karabin
|
mech.glaive-ship.weapon = Zapalający Karabin
|
||||||
|
item.corestorable = [lightgray]Przechowywalne w rdzeniu: {0}
|
||||||
item.explosiveness = [lightgray]Wybuchowość: {0}
|
item.explosiveness = [lightgray]Wybuchowość: {0}
|
||||||
item.flammability = [lightgray]Palność: {0}
|
item.flammability = [lightgray]Palność: {0}
|
||||||
item.radioactivity = [lightgray]Promieniotwórczość: {0}
|
item.radioactivity = [lightgray]Promieniotwórczość: {0}
|
||||||
@@ -1124,8 +1145,8 @@ block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia
|
|||||||
block.copper-wall-large.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.\nObejmuje wiele kratek.
|
block.copper-wall-large.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.\nObejmuje wiele kratek.
|
||||||
block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.
|
block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.
|
||||||
block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek.
|
block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek.
|
||||||
block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.
|
block.plastanium-wall.description = Specjajny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów.
|
||||||
block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles.
|
block.plastanium-wall-large.description = Specjajny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów.\nObejmuje wiele kratek.
|
||||||
block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami.
|
block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami.
|
||||||
block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek.
|
block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek.
|
||||||
block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków.
|
block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków.
|
||||||
@@ -1164,7 +1185,7 @@ block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Uży
|
|||||||
block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają.
|
block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają.
|
||||||
block.power-node-large.description = Posiada większy zasięg niż zwykły węzeł prądu. Można podłączyć do sześciu źródeł zasilania, zlewów lub węzłów.
|
block.power-node-large.description = Posiada większy zasięg niż zwykły węzeł prądu. Można podłączyć do sześciu źródeł zasilania, zlewów lub węzłów.
|
||||||
block.surge-tower.description = Węzęł prądu z bardzo dużym zasięgiem, posiadający mniej możliwych podłączeń.
|
block.surge-tower.description = Węzęł prądu z bardzo dużym zasięgiem, posiadający mniej możliwych podłączeń.
|
||||||
block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored.
|
block.diode.description = Energia może przepływać przez ten blok tylko w jednym kierunku, ale tylko kiedy inne strony mają zmagazynowane mniej energii.
|
||||||
block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz dostarcza energię kiedy jest jej brak, dopóki jest w niej miejsce.
|
block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz dostarcza energię kiedy jest jej brak, dopóki jest w niej miejsce.
|
||||||
block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria.
|
block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria.
|
||||||
block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów.
|
block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów.
|
||||||
@@ -1205,7 +1226,7 @@ block.ripple.description = Duża wieża artyleryjska, która strzela jednocześn
|
|||||||
block.cyclone.description = Duża szybkostrzelna wieża.
|
block.cyclone.description = Duża szybkostrzelna wieża.
|
||||||
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
||||||
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
||||||
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia / fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia/fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
||||||
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
||||||
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
||||||
block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie.
|
block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie.
|
||||||
@@ -1217,7 +1238,7 @@ block.crawler-factory.description = Produkuje szybkie jednostki lądowe typu "ka
|
|||||||
block.titan-factory.description = Produkuje zaawansowane, opancerzone jednostki lądowe.
|
block.titan-factory.description = Produkuje zaawansowane, opancerzone jednostki lądowe.
|
||||||
block.fortress-factory.description = Produkuje naziemne jednostki ciężkiej artylerii.
|
block.fortress-factory.description = Produkuje naziemne jednostki ciężkiej artylerii.
|
||||||
block.repair-point.description = Bez przerw ulecza najbliższą zniszczoną jednostkę w jego zasięgu.
|
block.repair-point.description = Bez przerw ulecza najbliższą zniszczoną jednostkę w jego zasięgu.
|
||||||
block.dart-mech-pad.description = Umożliwia transformacje w podstawowego mecha bojowego.\nUżyj klikając podczas stania na nim.
|
block.dart-mech-pad.description = Umożliwia transformację w podstawowego mecha bojowego.\nUżyj klikając podczas stania na nim.
|
||||||
block.delta-mech-pad.description = Opuść swój obecny statek i zamień go na szybki, lekko opancerzony mech stworzony do ataków typu uderz-uciekaj.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
block.delta-mech-pad.description = Opuść swój obecny statek i zamień go na szybki, lekko opancerzony mech stworzony do ataków typu uderz-uciekaj.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.tau-mech-pad.description = Opuść swój obecny statek i zamień go na mech wsparcia który może leczyć sojusznicze struktury i jednostki.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
block.tau-mech-pad.description = Opuść swój obecny statek i zamień go na mech wsparcia który może leczyć sojusznicze struktury i jednostki.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.omega-mech-pad.description = Opuść swój obecny statek i zamień go na masywny, dobrze opancerzony mech, przeznaczony do ataków na froncie.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
block.omega-mech-pad.description = Opuść swój obecny statek i zamień go na masywny, dobrze opancerzony mech, przeznaczony do ataków na froncie.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ link.dev-builds.description = Desenvolvimentos instáveis
|
|||||||
link.trello.description = Trello oficial para atualizações planejadas
|
link.trello.description = Trello oficial para atualizações planejadas
|
||||||
link.itch.io.description = Página da Itch.io com os downloads
|
link.itch.io.description = Página da Itch.io com os downloads
|
||||||
link.google-play.description = Página da google play store
|
link.google-play.description = Página da google play store
|
||||||
link.f-droid.description = F-Droid catalogue listing
|
link.f-droid.description = Listamento de catalogo do F-Droide
|
||||||
link.wiki.description = Wiki oficial do Mindustry
|
link.wiki.description = Wiki oficial do Mindustry
|
||||||
linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência.
|
linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência.
|
||||||
screenshot = Screenshot salvo para {0}
|
screenshot = Screenshot salvo para {0}
|
||||||
screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura de tela.
|
screenshot.invalid = Mapa grande demais, Voce pode estar potencialmente sem memória suficiente para captura de tela.
|
||||||
gameover = O núcleo foi destruído.
|
gameover = O núcleo foi destruído.
|
||||||
gameover.pvp = O time[accent] {0}[] ganhou!
|
gameover.pvp = O time[accent] {0}[] ganhou!
|
||||||
highscore = [YELLOW]Novo recorde!
|
highscore = [YELLOW]Novo recorde!
|
||||||
@@ -26,6 +26,7 @@ load.image = Imagens
|
|||||||
load.content = Conteúdo
|
load.content = Conteúdo
|
||||||
load.system = Sistema
|
load.system = Sistema
|
||||||
load.mod = Mods
|
load.mod = Mods
|
||||||
|
load.scripts = Scripts
|
||||||
|
|
||||||
schematic = Esquema
|
schematic = Esquema
|
||||||
schematic.add = Salvar Esquema...
|
schematic.add = Salvar Esquema...
|
||||||
@@ -41,8 +42,8 @@ schematic.shareworkshop = Compartilhar na Oficina
|
|||||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema
|
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema
|
||||||
schematic.saved = Esquema salvo.
|
schematic.saved = Esquema salvo.
|
||||||
schematic.delete.confirm = Esse Esquema será totalmente erradicado.
|
schematic.delete.confirm = Esse Esquema será totalmente erradicado.
|
||||||
schematic.rename = Rename Schematic
|
schematic.rename = Renomear esquema
|
||||||
schematic.info = {0}x{1}, {2} blocks
|
schematic.info = {0}x{1}, {2} blocos
|
||||||
|
|
||||||
stat.wave = Hordas derrotadas:[accent] {0}
|
stat.wave = Hordas derrotadas:[accent] {0}
|
||||||
stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0}
|
stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0}
|
||||||
@@ -99,19 +100,24 @@ mod.enabled = [lightgray]Ativado
|
|||||||
mod.disabled = [scarlet]Desativado
|
mod.disabled = [scarlet]Desativado
|
||||||
mod.disable = Desati-\nvar
|
mod.disable = Desati-\nvar
|
||||||
mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso.
|
mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso.
|
||||||
mod.requiresversion = [scarlet]Requer versão [accent]{0} [scarlet]do jogo.
|
mod.requiresversion = [scarlet]Requer no mínimo versão [accent]{0} [scarlet]do jogo.
|
||||||
mod.missingdependencies = [scarlet]Dependências ausentes: {0}
|
mod.missingdependencies = [scarlet]Dependências ausentes: {0}
|
||||||
|
mod.erroredcontent = [scarlet]Erros no Conteúdo
|
||||||
|
mod.errors = Erros ocorreram ao carregar o conteúdo.
|
||||||
|
mod.noerrorplay = [scarlet]Você tem mods com erros.[] Desative os mods afetados ou conserte os erros antes de jogar.
|
||||||
mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes:[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente.
|
mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes:[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente.
|
||||||
mod.enable = Ativar
|
mod.enable = Ativar
|
||||||
mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod.
|
mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod.
|
||||||
mod.reloadrequired = [scarlet]Recarregamento necessário
|
mod.reloadrequired = [scarlet]Recarregamento necessário
|
||||||
mod.import = Importar Mod
|
mod.import = Importar Mod
|
||||||
mod.import.github = Importar Mod do GitHub
|
mod.import.github = Importar Mod do GitHub
|
||||||
mod.remove.confirm = Esse Mod será deletado.
|
mod.item.remove = Este item é parte do mod[accent] '{0}'[]. Para removê-lo, desinstale esse mod.
|
||||||
|
mod.remove.confirm = Este mod será deletado.
|
||||||
mod.author = [LIGHT_GRAY]Author:[] {0}
|
mod.author = [LIGHT_GRAY]Author:[] {0}
|
||||||
mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. O jogo salvo pode se corromper. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0}
|
mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. Pode ocorrer uma corrupção no salvamento. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0}
|
||||||
mod.preview.missing = Antes de publicar esse mod na Oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do Mod e tente novamente.
|
mod.preview.missing = Antes de publicar esse mod na Oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do Mod e tente novamente.
|
||||||
mod.folder.missing = Somente Mods no formato de pasta serão publicados na Oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os Mods.
|
mod.folder.missing = Somente Mods no formato de pasta serão publicados na Oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os Mods.
|
||||||
|
mod.scripts.unsupported = Seu dispositivo não suporta scripts de mods. Alguns mods não funcionarão corretamente.
|
||||||
|
|
||||||
about.button = Sobre
|
about.button = Sobre
|
||||||
name = Nome:
|
name = Nome:
|
||||||
@@ -189,9 +195,9 @@ disconnect.data = Falha ao abrir os dados do mundo!
|
|||||||
cantconnect = Impossível conectar ([accent]{0}[]).
|
cantconnect = Impossível conectar ([accent]{0}[]).
|
||||||
connecting = [accent]Conectando...
|
connecting = [accent]Conectando...
|
||||||
connecting.data = [accent]Carregando dados do mundo...
|
connecting.data = [accent]Carregando dados do mundo...
|
||||||
server.port = Porte:
|
server.port = Port:
|
||||||
server.addressinuse = Senha em uso!
|
server.addressinuse = Senha em uso!
|
||||||
server.invalidport = Numero de porta invalido!
|
server.invalidport = Numero de port inválido!
|
||||||
server.error = [crimson]Erro ao hospedar o servidor: [accent]{0}
|
server.error = [crimson]Erro ao hospedar o servidor: [accent]{0}
|
||||||
save.new = Novo salvamento
|
save.new = Novo salvamento
|
||||||
save.overwrite = Você tem certeza que quer sobrescrever este salvamento?
|
save.overwrite = Você tem certeza que quer sobrescrever este salvamento?
|
||||||
@@ -273,11 +279,11 @@ workshop.error = Erro buscando os detalhes da Oficina: {0}
|
|||||||
map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados!
|
map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados!
|
||||||
workshop.menu = Selecione oquê você gostaria de fazer com esse Item.
|
workshop.menu = Selecione oquê você gostaria de fazer com esse Item.
|
||||||
workshop.info = Informação do Item
|
workshop.info = Informação do Item
|
||||||
changelog = Changelog (optional):
|
changelog = Mudanças (opcional):
|
||||||
eula = EULA da Steam
|
eula = EULA da Steam
|
||||||
missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked.
|
missing = Este item foi deletado ou movido.\n[lightgray]O listamento da oficina foi automaticamente des-ligado.
|
||||||
publishing = [accent]Publishing...
|
publishing = [accent]Publicando...
|
||||||
publish.confirm = você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer!
|
publish.confirm = Você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer!
|
||||||
publish.error = Erro publicando o Item: {0}
|
publish.error = Erro publicando o Item: {0}
|
||||||
steam.error = Falha em iniciar os serviços da Steam.\nError: {0}
|
steam.error = Falha em iniciar os serviços da Steam.\nError: {0}
|
||||||
|
|
||||||
@@ -364,11 +370,11 @@ toolmode.replaceall = Substituir tudo
|
|||||||
toolmode.replaceall.description = Substituir todos os blocos no mapa
|
toolmode.replaceall.description = Substituir todos os blocos no mapa
|
||||||
toolmode.orthogonal = Linha reta
|
toolmode.orthogonal = Linha reta
|
||||||
toolmode.orthogonal.description = Desenha apenas linhas retas.
|
toolmode.orthogonal.description = Desenha apenas linhas retas.
|
||||||
toolmode.square = Square
|
toolmode.square = Quadrado
|
||||||
toolmode.square.description = Pincel quadrado.
|
toolmode.square.description = Pincel quadrado.
|
||||||
toolmode.eraseores = Apagar minérios
|
toolmode.eraseores = Apagar minérios
|
||||||
toolmode.eraseores.description = Apaga apenas minérios.
|
toolmode.eraseores.description = Apaga apenas minérios.
|
||||||
toolmode.fillteams = Encher times
|
toolmode.fillteams = Preencher times
|
||||||
toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem.
|
toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem.
|
||||||
toolmode.drawteams = Desenhar times
|
toolmode.drawteams = Desenhar times
|
||||||
toolmode.drawteams.description = Muda o time do qual o bloco pertence.
|
toolmode.drawteams.description = Muda o time do qual o bloco pertence.
|
||||||
@@ -490,8 +496,8 @@ zone.tarFields.description = Nos arredores de uma zona de produção de petróle
|
|||||||
zone.desolateRift.description = Uma zona extremamente perigosa. Recursos abundantes, porém pouco espaço. Alto risco de destruição. Saia o mais rápido possível. Não seja enganado pelo longo espaço de tempo entre os ataques inimigos.
|
zone.desolateRift.description = Uma zona extremamente perigosa. Recursos abundantes, porém pouco espaço. Alto risco de destruição. Saia o mais rápido possível. Não seja enganado pelo longo espaço de tempo entre os ataques inimigos.
|
||||||
zone.nuclearComplex.description = Uma antiga instalação para produção e processamento de tório, reduzido a ruínas.\n[lightgray]Pesquise o tório e seus muitos usos.\n\nO inimigo está presente aqui em grandes números, constantemente à procura de atacantes.
|
zone.nuclearComplex.description = Uma antiga instalação para produção e processamento de tório, reduzido a ruínas.\n[lightgray]Pesquise o tório e seus muitos usos.\n\nO inimigo está presente aqui em grandes números, constantemente à procura de atacantes.
|
||||||
zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos.
|
zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos.
|
||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insira descrição aqui>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <Insira descrição aqui>
|
||||||
|
|
||||||
settings.language = Idioma
|
settings.language = Idioma
|
||||||
settings.data = Dados do jogo
|
settings.data = Dados do jogo
|
||||||
@@ -506,7 +512,7 @@ settings.cleardata = Apagar dados...
|
|||||||
settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito!
|
settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito!
|
||||||
settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, incluindo jogos salvos, mapas, teclas personalizadas e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente.
|
settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, incluindo jogos salvos, mapas, teclas personalizadas e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente.
|
||||||
paused = Pausado
|
paused = Pausado
|
||||||
clear = Clear
|
clear = Limpo
|
||||||
banned = [scarlet]Banido
|
banned = [scarlet]Banido
|
||||||
yes = Sim
|
yes = Sim
|
||||||
no = Não
|
no = Não
|
||||||
@@ -515,7 +521,7 @@ error.title = [crimson]Ocorreu um Erro.
|
|||||||
error.crashtitle = Ocorreu um Erro
|
error.crashtitle = Ocorreu um Erro
|
||||||
blocks.input = Entrada
|
blocks.input = Entrada
|
||||||
blocks.output = Saída
|
blocks.output = Saída
|
||||||
blocks.booster = Booster
|
blocks.booster = Apoio
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [LIGHT_GRAY]???
|
||||||
blocks.powercapacity = Capacidade de Energia
|
blocks.powercapacity = Capacidade de Energia
|
||||||
blocks.powershot = Energia/tiro
|
blocks.powershot = Energia/tiro
|
||||||
@@ -591,12 +597,14 @@ unit.persecond = por segundo
|
|||||||
unit.timesspeed = x Velocidade
|
unit.timesspeed = x Velocidade
|
||||||
unit.percent = %
|
unit.percent = %
|
||||||
unit.items = itens
|
unit.items = itens
|
||||||
|
unit.thousands = k
|
||||||
|
unit.millions = m
|
||||||
category.general = Geral
|
category.general = Geral
|
||||||
category.power = Poder
|
category.power = Energia
|
||||||
category.liquids = Líquidos
|
category.liquids = Líquidos
|
||||||
category.items = Itens
|
category.items = Itens
|
||||||
category.crafting = Construindo
|
category.crafting = Entrada/Saída
|
||||||
category.shooting = Atirando
|
category.shooting = Atiradores
|
||||||
category.optional = Melhoras opcionais
|
category.optional = Melhoras opcionais
|
||||||
setting.landscape.name = Travar panorama
|
setting.landscape.name = Travar panorama
|
||||||
setting.shadows.name = Sombras
|
setting.shadows.name = Sombras
|
||||||
@@ -651,7 +659,7 @@ setting.chatopacity.name = Opacidade do chat
|
|||||||
setting.lasersopacity.name = Opacidade do laser
|
setting.lasersopacity.name = Opacidade do laser
|
||||||
setting.playerchat.name = Mostrar chat em jogo
|
setting.playerchat.name = Mostrar chat em jogo
|
||||||
public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública.
|
public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública.
|
||||||
public.beta = Note that beta versions of the game cannot make public lobbies.
|
public.beta = Note que as versões beta do jogo não podem fazer salas publicas.
|
||||||
uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings...
|
uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancelar e sair
|
uiscale.cancel = Cancelar e sair
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
@@ -719,10 +727,10 @@ keybind.zoom_minimap.name = Zoom do minimapa
|
|||||||
mode.help.title = Descrição dos modos
|
mode.help.title = Descrição dos modos
|
||||||
mode.survival.name = Sobrevivência
|
mode.survival.name = Sobrevivência
|
||||||
mode.survival.description = O modo normal. Recursos limitados e hordas automáticas.
|
mode.survival.description = O modo normal. Recursos limitados e hordas automáticas.
|
||||||
mode.sandbox.name = Sandbox
|
mode.sandbox.name = Caixa de areia
|
||||||
mode.sandbox.description = Recursos infinitos e sem tempo para ataques.
|
mode.sandbox.description = Recursos infinitos e sem tempo para ataques.
|
||||||
mode.editor.name = Editor
|
mode.editor.name = Editor
|
||||||
mode.pvp.name = JXJ
|
mode.pvp.name = JxJ
|
||||||
mode.pvp.description = Lutar contra outros jogadores locais.
|
mode.pvp.description = Lutar contra outros jogadores locais.
|
||||||
mode.attack.name = Ataque
|
mode.attack.name = Ataque
|
||||||
mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga.
|
mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga.
|
||||||
@@ -805,6 +813,7 @@ mech.trident-ship.name = Tridente
|
|||||||
mech.trident-ship.weapon = Carga de bombas
|
mech.trident-ship.weapon = Carga de bombas
|
||||||
mech.glaive-ship.name = Glaive
|
mech.glaive-ship.name = Glaive
|
||||||
mech.glaive-ship.weapon = Repetidor de fogo
|
mech.glaive-ship.weapon = Repetidor de fogo
|
||||||
|
item.corestorable = [lightgray]Armazenável no núcleo: {0}
|
||||||
item.explosiveness = [LIGHT_GRAY]Explosibilidade: {0}
|
item.explosiveness = [LIGHT_GRAY]Explosibilidade: {0}
|
||||||
item.flammability = [LIGHT_GRAY]Inflamabilidade: {0}
|
item.flammability = [LIGHT_GRAY]Inflamabilidade: {0}
|
||||||
item.radioactivity = [LIGHT_GRAY]Radioatividade: {0}
|
item.radioactivity = [LIGHT_GRAY]Radioatividade: {0}
|
||||||
@@ -980,9 +989,9 @@ block.spirit-factory.name = Fábrica de drone de reparo Spirit
|
|||||||
block.phantom-factory.name = Fábrica de drone de construção Phantom
|
block.phantom-factory.name = Fábrica de drone de construção Phantom
|
||||||
block.wraith-factory.name = Fábrica de lutadores Wraith
|
block.wraith-factory.name = Fábrica de lutadores Wraith
|
||||||
block.ghoul-factory.name = Fábrica de Bombardeiros Ghoul
|
block.ghoul-factory.name = Fábrica de Bombardeiros Ghoul
|
||||||
block.dagger-factory.name = Fábrica de mech Dagger
|
block.dagger-factory.name = Fábrica de Mecas Dagger
|
||||||
block.crawler-factory.name = Fábrica de mech Crawler
|
block.crawler-factory.name = Fábrica de Mecas Crawler
|
||||||
block.titan-factory.name = Fábrica de mech titan
|
block.titan-factory.name = Fábrica de Mecas Titan
|
||||||
block.fortress-factory.name = Fábrica de mech Fortress
|
block.fortress-factory.name = Fábrica de mech Fortress
|
||||||
block.revenant-factory.name = Fábrica de lutadores Revenant
|
block.revenant-factory.name = Fábrica de lutadores Revenant
|
||||||
block.repair-point.name = Ponto de Reparo
|
block.repair-point.name = Ponto de Reparo
|
||||||
@@ -1039,7 +1048,7 @@ unit.eradicator.name = Erradicador
|
|||||||
unit.lich.name = Lich
|
unit.lich.name = Lich
|
||||||
unit.reaper.name = Ceifador
|
unit.reaper.name = Ceifador
|
||||||
tutorial.next = [lightgray]<Toque para continuar>
|
tutorial.next = [lightgray]<Toque para continuar>
|
||||||
tutorial.intro = Você entrou no[scarlet] Tutorial do Mindustry.[]\nComeçe[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper
|
tutorial.intro = Você entrou no[scarlet] Tutorial do Mindustry.[]\nUse[accent] [[WASD][] para se mover.\n[accent]Roda do mouse[] para aumentar e diminuir o zoom.\nComece[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper
|
||||||
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
||||||
tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nColoque uma num veio de cobre.
|
tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nColoque uma num veio de cobre.
|
||||||
tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento.
|
tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento.
|
||||||
@@ -1047,7 +1056,7 @@ tutorial.blockinfo = Cada bloco tem diferentes status. Cada broca pode extrair c
|
|||||||
tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o núcleo.\nFaça uma linha de Esteiras da mineradora até o núcleo.
|
tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o núcleo.\nFaça uma linha de Esteiras da mineradora até o núcleo.
|
||||||
tutorial.conveyor.mobile = [accent]Esteiras[] são usadas para transportar itens até o núcleo.\nFaça uma linha de esteiras da broca até o núcleo.\n[accent] Coloque uma linha segurando por alguns segundos[] e arrastando em uma direção.\n\n[accent]{0}/{1} esteiras colocadas em linha\n[accent]0/1 itens entregues
|
tutorial.conveyor.mobile = [accent]Esteiras[] são usadas para transportar itens até o núcleo.\nFaça uma linha de esteiras da broca até o núcleo.\n[accent] Coloque uma linha segurando por alguns segundos[] e arrastando em uma direção.\n\n[accent]{0}/{1} esteiras colocadas em linha\n[accent]0/1 itens entregues
|
||||||
tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] o inimigo[].\nConstrua uma torre dupla perto de sua base.
|
tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] o inimigo[].\nConstrua uma torre dupla perto de sua base.
|
||||||
tutorial.drillturret = Torretas duplas precisam de[accent] cobre[] como munição para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado.
|
tutorial.drillturret = Torres duplas precisam de[accent] cobre[] como munição para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado.
|
||||||
tutorial.pause = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione a barra de espaço para pausar.
|
tutorial.pause = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione a barra de espaço para pausar.
|
||||||
tutorial.pause.mobile = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione este botão no canto superior direito para pausar.
|
tutorial.pause.mobile = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione este botão no canto superior direito para pausar.
|
||||||
tutorial.unpause = Agora pressione novamente a barra de espaço para despausar.
|
tutorial.unpause = Agora pressione novamente a barra de espaço para despausar.
|
||||||
@@ -1102,7 +1111,7 @@ unit.revenant.description = Uma matriz de mísseis pesada e flutuante.
|
|||||||
block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados.
|
block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados.
|
||||||
block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro.
|
block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro.
|
||||||
block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente.
|
block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente.
|
||||||
block.silicon-smelter.description = Reduz areia com carvão puro. Produz silício silicio.
|
block.silicon-smelter.description = Reduz areia a silicio usando carvão puro. Produz silício.
|
||||||
block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia.
|
block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia.
|
||||||
block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio.
|
block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio.
|
||||||
block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar.
|
block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar.
|
||||||
@@ -1138,9 +1147,9 @@ block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao to
|
|||||||
block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficiência.
|
block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficiência.
|
||||||
block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficiência.
|
block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficiência.
|
||||||
block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficiência.
|
block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficiência.
|
||||||
block.force-projector.description = Cria um campo de forca hexagonal em volta de si mesmo, Protegendo construções e unidades dentro de dano por balas.
|
block.force-projector.description = Cria um campo de força hexagonal ao redor de si, protegendo construções e unidades.\nSuperaquece se suportar muito dano. Pode usar líquidos para evitar superaquecimento. Pode-se usar tecido de fase para aumentar o tamanho do escudo.
|
||||||
block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo.
|
block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo.
|
||||||
block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionavel.
|
block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionável.
|
||||||
block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões.
|
block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões.
|
||||||
block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes.
|
block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes.
|
||||||
block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes.
|
block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes.
|
||||||
@@ -1176,7 +1185,7 @@ block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos qu
|
|||||||
block.solar-panel.description = Gera pequenas quantidades de energia do sol.
|
block.solar-panel.description = Gera pequenas quantidades de energia do sol.
|
||||||
block.solar-panel-large.description = Uma versão significantemente mais eficiente que o painel solar padrão.
|
block.solar-panel-large.description = Uma versão significantemente mais eficiente que o painel solar padrão.
|
||||||
block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido.
|
block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido.
|
||||||
block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process.
|
block.impact-reactor.description = Um gerador avançado, capaz de criar quantidades enormes de energia em seu poder total. Requer uma entrada significativa de energia ao iniciar.
|
||||||
block.mechanical-drill.description = Uma broca barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente.
|
block.mechanical-drill.description = Uma broca barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente.
|
||||||
block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de processar materiais mais duros usando a pressão do ar
|
block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de processar materiais mais duros usando a pressão do ar
|
||||||
block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora
|
block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ load.mod = มอด
|
|||||||
schematic = Schematic
|
schematic = Schematic
|
||||||
schematic.add = กำลังบันทึก Schematic...
|
schematic.add = กำลังบันทึก Schematic...
|
||||||
schematics = Schematics
|
schematics = Schematics
|
||||||
schematic.replace = มี schematic ที่ใช้ชื่อนี้แล้ว. แทนที่มัน?
|
schematic.replace = มี schematic ที่ใช้ชื่อนี้แล้ว. แทนที่เลยไม?
|
||||||
schematic.import = นำเข้า Schematic...
|
schematic.import = นำเข้า Schematic...
|
||||||
schematic.exportfile = ส่งออก File
|
schematic.exportfile = ส่งออก File
|
||||||
schematic.importfile = นำเข้า File
|
schematic.importfile = นำเข้า File
|
||||||
@@ -60,7 +60,7 @@ level.mode = เกมโหมด:
|
|||||||
showagain = ไม่แสดงอีกในครั้งต่อไป
|
showagain = ไม่แสดงอีกในครั้งต่อไป
|
||||||
coreattack = < Core กำลังถูกโจมตี! >
|
coreattack = < Core กำลังถูกโจมตี! >
|
||||||
nearpoint = [[ [scarlet]ออกจากดรอปพอยท์ด่วน IMMEDIATELY[] ]\nการทำลายล้างกำลังใกล้เข้ามา
|
nearpoint = [[ [scarlet]ออกจากดรอปพอยท์ด่วน IMMEDIATELY[] ]\nการทำลายล้างกำลังใกล้เข้ามา
|
||||||
database = Core Database
|
database = ฐานข้อมูหลัง
|
||||||
savegame = เซฟเกม
|
savegame = เซฟเกม
|
||||||
loadgame = โหลดเกม
|
loadgame = โหลดเกม
|
||||||
joingame = เข้าร่วมเกม
|
joingame = เข้าร่วมเกม
|
||||||
@@ -116,7 +116,7 @@ noname = ใส่ชื่อ[accent] ผู้เล่น[] ก่อน.
|
|||||||
filename = ชื่อไฟล์:
|
filename = ชื่อไฟล์:
|
||||||
unlocked = content ใหม่ปลดล็อค!
|
unlocked = content ใหม่ปลดล็อค!
|
||||||
completed = [accent]สำเร็จ
|
completed = [accent]สำเร็จ
|
||||||
techtree = สายวิจัย
|
techtree = ความคืบหน้าในการวิจัย
|
||||||
research.list = [lightgray]วิจัย:
|
research.list = [lightgray]วิจัย:
|
||||||
research = วิจัย
|
research = วิจัย
|
||||||
researched = [lightgray]{0} วิจัยแล้ว.
|
researched = [lightgray]{0} วิจัยแล้ว.
|
||||||
@@ -126,9 +126,9 @@ server.closing = [accent]กำลังปิดเซิฟเวอร์...
|
|||||||
server.kicked.kick = คุณถูกเตะออกจากเซิฟเวอร์!
|
server.kicked.kick = คุณถูกเตะออกจากเซิฟเวอร์!
|
||||||
server.kicked.whitelist = คุณไม่ได้อยู่ใน whitelisted
|
server.kicked.whitelist = คุณไม่ได้อยู่ใน whitelisted
|
||||||
server.kicked.serverClose = เซิฟเวอร์ถูกปิด.
|
server.kicked.serverClose = เซิฟเวอร์ถูกปิด.
|
||||||
server.kicked.vote = คุณถูกโหวตเตะออก. บายบาย.
|
server.kicked.vote = คุณถูกโหวตเตะออก. บัยบาย.
|
||||||
server.kicked.clientOutdated = client ล่าสมัย! กรุณาอัปเดตเกมของคุณ!
|
server.kicked.clientOutdated = client เก่า! กรุณาอัปเดตเกมของคุณ!
|
||||||
server.kicked.serverOutdated = server ล่าสมัย! โปรดถามเจ้าของเซิฟเพื่ออัปเดต!
|
server.kicked.serverOutdated = server เก่า! โปรดถามเจ้าของเซิฟเพื่ออัปเดต!
|
||||||
server.kicked.banned = คุณถูกแบนในเซิฟเวอร์นี้
|
server.kicked.banned = คุณถูกแบนในเซิฟเวอร์นี้
|
||||||
server.kicked.typeMismatch = เซิฟเวอร์นี้ไม่เข้ากับ build type ของคุณ.
|
server.kicked.typeMismatch = เซิฟเวอร์นี้ไม่เข้ากับ build type ของคุณ.
|
||||||
server.kicked.playerLimit = เซิฟเวอร์เต็ม. กรุณารอให้เซิฟเวอร์ว่างก่อน.
|
server.kicked.playerLimit = เซิฟเวอร์เต็ม. กรุณารอให้เซิฟเวอร์ว่างก่อน.
|
||||||
@@ -598,7 +598,7 @@ category.items = ไอเท็ม
|
|||||||
category.crafting = นำเข้า/ส่งออก
|
category.crafting = นำเข้า/ส่งออก
|
||||||
category.shooting = การยิง
|
category.shooting = การยิง
|
||||||
category.optional = การเพิ่มประสิทธิภาพทางเลือก
|
category.optional = การเพิ่มประสิทธิภาพทางเลือก
|
||||||
setting.landscape.name = ล็อค Landscape
|
setting.landscape.name = ล็อค Landscape แนวนอน
|
||||||
setting.shadows.name = เงา
|
setting.shadows.name = เงา
|
||||||
setting.blockreplace.name = แนะนำบล็อคโดยอัตโนมัติ
|
setting.blockreplace.name = แนะนำบล็อคโดยอัตโนมัติ
|
||||||
setting.linear.name = การกรองเชิงเส้น
|
setting.linear.name = การกรองเชิงเส้น
|
||||||
@@ -761,26 +761,26 @@ item.scrap.name = เศษเหล็ก
|
|||||||
liquid.water.name = น้ำ
|
liquid.water.name = น้ำ
|
||||||
liquid.slag.name = กากแร่
|
liquid.slag.name = กากแร่
|
||||||
liquid.oil.name = น้ำมัน
|
liquid.oil.name = น้ำมัน
|
||||||
liquid.cryofluid.name = ไครโยฟลูอิด
|
liquid.cryofluid.name = โครโรฟิวล์
|
||||||
mech.alpha-mech.name = อัลฟ้า
|
mech.alpha-mech.name = อัลฟ้า
|
||||||
mech.alpha-mech.weapon = เฮฟวี้รีพีทเตอร์
|
mech.alpha-mech.weapon = เฮฟวี้รีพีทเตอร์
|
||||||
mech.alpha-mech.ability = รีเจเนเรชั่น
|
mech.alpha-mech.ability = รีเจเนเรชั่น
|
||||||
mech.delta-mech.name = เดลต้า
|
mech.delta-mech.name = เดลต้า
|
||||||
mech.delta-mech.weapon = เครื่องกำเนิดประกายไฟฟ้า
|
mech.delta-mech.weapon = เครื่องกำเนิดประกายไฟฟ้า
|
||||||
mech.delta-mech.ability = ปล่อย
|
mech.delta-mech.ability = ปล่อยสายฟ้า
|
||||||
mech.tau-mech.name = เทา
|
mech.tau-mech.name = เทา
|
||||||
mech.tau-mech.weapon = รีสตัคเลเซอร์
|
mech.tau-mech.weapon = รีสตัคเลเซอร์
|
||||||
mech.tau-mech.ability = เบิสต์ซ่อมแซม
|
mech.tau-mech.ability = เบิสต์ซ่อมแซม
|
||||||
mech.omega-mech.name = โอเมก้า
|
mech.omega-mech.name = โอเมก้า
|
||||||
mech.omega-mech.weapon = ฝูงขีปนาวุธ
|
mech.omega-mech.weapon = ขีปนาวุธมหาปลัย
|
||||||
mech.omega-mech.ability = ตัวเสริมเกราะ
|
mech.omega-mech.ability = ตัวเสริมเกราะ
|
||||||
mech.dart-ship.name = ลูกดอก (Dart)
|
mech.dart-ship.name = ลูกดอก (Dart)
|
||||||
mech.dart-ship.weapon = รีพีตเตอร์
|
mech.dart-ship.weapon = รีพีตเตอร์
|
||||||
mech.javelin-ship.name = หอก (Javelin)
|
mech.javelin-ship.name = จาวาลีน (Javelin)
|
||||||
mech.javelin-ship.weapon = ขีปนาวุธเบิสต์
|
mech.javelin-ship.weapon = ขีปนาวุธเบิสต์
|
||||||
mech.javelin-ship.ability = ดิสชาร์จบูสเตอร์
|
mech.javelin-ship.ability = ดิสชาร์จบูสเตอร์
|
||||||
mech.trident-ship.name = ตรีศูล (Trident)
|
mech.trident-ship.name = ตรีศูล (Trident)
|
||||||
mech.trident-ship.weapon = ห้องเก็บระเบิด
|
mech.trident-ship.weapon = ตัวปล่อยระเบิด
|
||||||
mech.glaive-ship.name = เกลฟว์
|
mech.glaive-ship.name = เกลฟว์
|
||||||
mech.glaive-ship.weapon = รีพีตเตอร์ไฟ
|
mech.glaive-ship.weapon = รีพีตเตอร์ไฟ
|
||||||
item.explosiveness = [lightgray]ค่าการระเบิด: {0}%
|
item.explosiveness = [lightgray]ค่าการระเบิด: {0}%
|
||||||
@@ -809,8 +809,8 @@ block.sandrocks.name = หินทราย
|
|||||||
block.spore-pine.name = ต้นสนสปอร์
|
block.spore-pine.name = ต้นสนสปอร์
|
||||||
block.sporerocks.name = หินสปอร์
|
block.sporerocks.name = หินสปอร์
|
||||||
block.rock.name = หิน
|
block.rock.name = หิน
|
||||||
block.snowrock.name = หินหิมะ
|
block.snowrock.name = ก้อนหิมะ
|
||||||
block.snow-pine.name = ต้นสนหิมะ
|
block.snow-pine.name = ต้นสนที่คลุมหิมะ
|
||||||
block.shale.name = หินดินดาน
|
block.shale.name = หินดินดาน
|
||||||
block.shale-boulder.name = ก้อนหินดินดาน
|
block.shale-boulder.name = ก้อนหินดินดาน
|
||||||
block.moss.name = ตะไคร่น้ำ
|
block.moss.name = ตะไคร่น้ำ
|
||||||
@@ -905,9 +905,8 @@ block.cryofluidmixer.name = เครื่องผสมไครโยฟล
|
|||||||
block.melter.name = เตาหลอม
|
block.melter.name = เตาหลอม
|
||||||
block.incinerator.name = เตาเผาขยะ
|
block.incinerator.name = เตาเผาขยะ
|
||||||
block.spore-press.name = เครื่องอัดสปอร์
|
block.spore-press.name = เครื่องอัดสปอร์
|
||||||
block.separator.name =
|
block.separator.name = เครื่องแยก
|
||||||
เครื่องแยก
|
block.coal-centrifuge.name = เครื่องผลิตถ่านหิน
|
||||||
block.coal-centrifuge.name = เครื่องปั่นเหวี่งถ่านหิน
|
|
||||||
block.power-node.name = โหนดพลังงาน
|
block.power-node.name = โหนดพลังงาน
|
||||||
block.power-node-large.name = โหนดพลังงานขนาดใหญ่
|
block.power-node-large.name = โหนดพลังงานขนาดใหญ่
|
||||||
block.surge-tower.name = เสาเสิร์จ
|
block.surge-tower.name = เสาเสิร์จ
|
||||||
@@ -916,7 +915,7 @@ block.battery.name = แบตเตอรี่
|
|||||||
block.battery-large.name = แบตเตอรี่ขนาดใหญ่
|
block.battery-large.name = แบตเตอรี่ขนาดใหญ่
|
||||||
block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าเผาไหม้
|
block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าเผาไหม้
|
||||||
block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ
|
block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ
|
||||||
block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเชี่ยว
|
block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเตอร์
|
||||||
block.impact-reactor.name = เตาปฏิกรณ์อิมแพ็ค
|
block.impact-reactor.name = เตาปฏิกรณ์อิมแพ็ค
|
||||||
block.mechanical-drill.name = เครื่องขุดเชิงกล
|
block.mechanical-drill.name = เครื่องขุดเชิงกล
|
||||||
block.pneumatic-drill.name = เครื่องขุดนิวมาติก
|
block.pneumatic-drill.name = เครื่องขุดนิวมาติก
|
||||||
@@ -930,7 +929,7 @@ block.trident-ship-pad.name = ฐานปล่อยยานตรีศู
|
|||||||
block.glaive-ship-pad.name = ฐานปล่อยยานเกลฟว์
|
block.glaive-ship-pad.name = ฐานปล่อยยานเกลฟว์
|
||||||
block.omega-mech-pad.name = ฐานปล่อยเม็คโอเมก้า
|
block.omega-mech-pad.name = ฐานปล่อยเม็คโอเมก้า
|
||||||
block.tau-mech-pad.name = ฐานปล่อยเม็คเทา (Tau)
|
block.tau-mech-pad.name = ฐานปล่อยเม็คเทา (Tau)
|
||||||
block.conduit.name = รางน้ำ
|
block.conduit.name = ท่อน้ำ
|
||||||
block.mechanical-pump.name = ปั๊มเชิงกล
|
block.mechanical-pump.name = ปั๊มเชิงกล
|
||||||
block.item-source.name = จุดกำเนิดไอเท็ม
|
block.item-source.name = จุดกำเนิดไอเท็ม
|
||||||
block.item-void.name = จุดลบไอเท็ม
|
block.item-void.name = จุดลบไอเท็ม
|
||||||
@@ -943,8 +942,8 @@ block.wave.name = เวฟ
|
|||||||
block.swarmer.name = สวอร์มเมอร์
|
block.swarmer.name = สวอร์มเมอร์
|
||||||
block.salvo.name = ซาวโว
|
block.salvo.name = ซาวโว
|
||||||
block.ripple.name = ริปเปิ้ล
|
block.ripple.name = ริปเปิ้ล
|
||||||
block.phase-conveyor.name = สายพานเฟส
|
block.phase-conveyor.name = สายพานความเร็วแสง
|
||||||
block.bridge-conveyor.name = สะพานสายพาน
|
block.bridge-conveyor.name = สะพาน
|
||||||
block.plastanium-compressor.name = เครื่องอัดพลาสตาเนียม
|
block.plastanium-compressor.name = เครื่องอัดพลาสตาเนียม
|
||||||
block.pyratite-mixer.name = เครื่องผสมไพราไทต์
|
block.pyratite-mixer.name = เครื่องผสมไพราไทต์
|
||||||
block.blast-mixer.name = เครื่องผสมสารประกอบระเบิด
|
block.blast-mixer.name = เครื่องผสมสารประกอบระเบิด
|
||||||
@@ -964,11 +963,11 @@ block.fortress-factory.name = โรงงานผลิตฟอร์เท
|
|||||||
block.revenant-factory.name = โรงงานผลิตยานไฟต์เตอร์เรเวแนนท์
|
block.revenant-factory.name = โรงงานผลิตยานไฟต์เตอร์เรเวแนนท์
|
||||||
block.repair-point.name = จุดซ่อมแซม
|
block.repair-point.name = จุดซ่อมแซม
|
||||||
block.pulse-conduit.name = รางน้ำโพวส์
|
block.pulse-conduit.name = รางน้ำโพวส์
|
||||||
block.phase-conduit.name = รางน้ำเฟส
|
block.phase-conduit.name = ท่อน้ำความเร็วแสง
|
||||||
block.liquid-router.name = เร้าเตอร์ของเหลว
|
block.liquid-router.name = เร้าเตอร์ของเหลว
|
||||||
block.liquid-tank.name = แทงค์เก็บของเหลว
|
block.liquid-tank.name = แทงค์น้ำ
|
||||||
block.liquid-junction.name = ทางแยกของเหลว
|
block.liquid-junction.name = ทางแยกของเหลว
|
||||||
block.bridge-conduit.name = สะพานรางน้ำ
|
block.bridge-conduit.name = ท่อน้ำยกระดับ
|
||||||
block.rotary-pump.name = ปั๊มโรตารี้
|
block.rotary-pump.name = ปั๊มโรตารี้
|
||||||
block.thorium-reactor.name = เตาปฏิกรณ์ทอเรี่ยม
|
block.thorium-reactor.name = เตาปฏิกรณ์ทอเรี่ยม
|
||||||
block.mass-driver.name = แมสไดรฟ์เวอร์
|
block.mass-driver.name = แมสไดรฟ์เวอร์
|
||||||
@@ -982,8 +981,8 @@ block.surge-wall.name = กำแพงเสิร์จ
|
|||||||
block.surge-wall-large.name = กำแพงเสิร์จขนาดใหญ่
|
block.surge-wall-large.name = กำแพงเสิร์จขนาดใหญ่
|
||||||
block.cyclone.name = ไซโคลน
|
block.cyclone.name = ไซโคลน
|
||||||
block.fuse.name = ฟิวส์
|
block.fuse.name = ฟิวส์
|
||||||
block.shock-mine.name = กับระเบิดไฟฟ้าซ็อต
|
block.shock-mine.name = กับระเบิดไฟฟ้า
|
||||||
block.overdrive-projector.name = โอเวอร์ไดรฟ์โปรเจ็คเตอร์
|
block.overdrive-projector.name = เครื่องเร่งประสิทธิภาพ
|
||||||
block.force-projector.name = ฟอร์สโปรเจ็คเตอร์
|
block.force-projector.name = ฟอร์สโปรเจ็คเตอร์
|
||||||
block.arc.name = อาร์ค
|
block.arc.name = อาร์ค
|
||||||
block.rtg-generator.name = เครื่องกำเนิดไฟฟ้า อาร์ทีจี
|
block.rtg-generator.name = เครื่องกำเนิดไฟฟ้า อาร์ทีจี
|
||||||
@@ -1013,7 +1012,7 @@ unit.eruptor.name = อีรัฟเตอร์
|
|||||||
unit.chaos-array.name = เคออสอาเรย์
|
unit.chaos-array.name = เคออสอาเรย์
|
||||||
unit.eradicator.name = อีเรดิเคเตอร์
|
unit.eradicator.name = อีเรดิเคเตอร์
|
||||||
unit.lich.name = ลิช
|
unit.lich.name = ลิช
|
||||||
unit.reaper.name = รีฟเฟอร์
|
unit.reaper.name = รีฟเปอร์
|
||||||
tutorial.next = [lightgray]<กดเพื่อดำเนินการต่อ>
|
tutorial.next = [lightgray]<กดเพื่อดำเนินการต่อ>
|
||||||
tutorial.intro = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nใช้ [[WASD] เพื่อเคลื่อนที่.\n[accent]กด [[Ctrl] ค้างระหว่างกลิ้งลูกกลิ้งเม้าส์[] เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น
|
tutorial.intro = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nใช้ [[WASD] เพื่อเคลื่อนที่.\n[accent]กด [[Ctrl] ค้างระหว่างกลิ้งลูกกลิ้งเม้าส์[] เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น
|
||||||
tutorial.intro.mobile = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nเลื่อนหน้าจอเพื่อเคลื่อนที่.\n[accent]ใส่สองนิ้ว []เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น
|
tutorial.intro.mobile = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nเลื่อนหน้าจอเพื่อเคลื่อนที่.\n[accent]ใส่สองนิ้ว []เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น
|
||||||
@@ -1110,7 +1109,7 @@ block.phase-wall-large.description = A wall coated with special phase-based refl
|
|||||||
block.surge-wall.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม.
|
block.surge-wall.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม.
|
||||||
block.surge-wall-large.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม.\nคลอบคลุมหลายช่อง.
|
block.surge-wall-large.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม.\nคลอบคลุมหลายช่อง.
|
||||||
block.door.description = ประตูขนาดเล็ก. สามารถเปิดได้โดยการกด.
|
block.door.description = ประตูขนาดเล็ก. สามารถเปิดได้โดยการกด.
|
||||||
block.door-large.description = ประตูขนาดใหญ่. สามารถเปิดได้โดยการกด.\nคลอบคลุมหลายช่อง.
|
block.door-large.description = ประตูขนาดใหญ่. สามารถเปิดและปิดได้โดยการกด.\nคลอบคลุมหลายช่อง.
|
||||||
block.mender.description = ซ่อมแซมบล็อคในวงของมันเป็นระยะๆ. ช่วยซ่อมแซมแนวป้องกันระหว่าง wave.\nสามารถใช้ซิลิก้อนเพื่อเพิ่มรัศมีและประสิทธิภาพได้
|
block.mender.description = ซ่อมแซมบล็อคในวงของมันเป็นระยะๆ. ช่วยซ่อมแซมแนวป้องกันระหว่าง wave.\nสามารถใช้ซิลิก้อนเพื่อเพิ่มรัศมีและประสิทธิภาพได้
|
||||||
block.mend-projector.description = เมนเดอร์ที่ได้รับการอัปเกรด. ซ่อมแซมบล็อคในระยะของมัน.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพได้.
|
block.mend-projector.description = เมนเดอร์ที่ได้รับการอัปเกรด. ซ่อมแซมบล็อคในระยะของมัน.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพได้.
|
||||||
block.overdrive-projector.description = เพิ่มความเร็วของสิ่งก่อสร้างรอบๆ.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพ.
|
block.overdrive-projector.description = เพิ่มความเร็วของสิ่งก่อสร้างรอบๆ.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพ.
|
||||||
@@ -1123,7 +1122,7 @@ block.bridge-conveyor.description = บล็อคขนส่งไอเท
|
|||||||
block.phase-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ใช้พลังงานเพื่อส่งไอเท็มไปยังสายพานเฟสอีกอัน ข้ามได้หลายช่อง.
|
block.phase-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ใช้พลังงานเพื่อส่งไอเท็มไปยังสายพานเฟสอีกอัน ข้ามได้หลายช่อง.
|
||||||
block.sorter.description = แยกไอเท็ม. ถ้าไอเท็มตรงกับที่เลือกไว้, จะผ่านได้. แต่ถ้าไม่ตรง, ไอเท็มจะออกทางซ้ายหรือขวา (ใช้ทางที่ไอเท็มเข้าเป็นหลัก)
|
block.sorter.description = แยกไอเท็ม. ถ้าไอเท็มตรงกับที่เลือกไว้, จะผ่านได้. แต่ถ้าไม่ตรง, ไอเท็มจะออกทางซ้ายหรือขวา (ใช้ทางที่ไอเท็มเข้าเป็นหลัก)
|
||||||
block.inverted-sorter.description = แยกไอเท็มคล้ายเครื่องแยกธรรมดา, แต่ไอเท็มที่เลือกจะออกข้างแทน.
|
block.inverted-sorter.description = แยกไอเท็มคล้ายเครื่องแยกธรรมดา, แต่ไอเท็มที่เลือกจะออกข้างแทน.
|
||||||
block.router.description = รับไอเท็มแล้วส่งออก 3 ทางเท่ากัน. มีประโยชน์สำหรับแยกไอเท็มจากแหล่งเดียวไปหลายที่.\n\n[scarlet]อย่าวางไว้ติดกับทางส่งไอเท็มเข้าเพราะของออกจะไปอุดตันได้.[]
|
block.router.description = รับไอเท็มแล้วส่งออก 3 ทางเท่าๆกัน. มีประโยชน์สำหรับแยกไอเท็มจากแหล่งเดียวไปหลายที่.\n\n[scarlet]อย่าวางไว้ติดกับทางส่งไอเท็มเข้าเพราะของออกจะไปอุดตันได้.[]
|
||||||
block.distributor.description = เร้าเตอร์ขั้นสูง. แยกไอเท็มออก 7 ทางอย่างเท่าๆกัน.
|
block.distributor.description = เร้าเตอร์ขั้นสูง. แยกไอเท็มออก 7 ทางอย่างเท่าๆกัน.
|
||||||
block.overflow-gate.description = ของจะออกจากข้างๆเมื่อทางข้างหน้ถูกบล็อคเท่านั้น.
|
block.overflow-gate.description = ของจะออกจากข้างๆเมื่อทางข้างหน้ถูกบล็อคเท่านั้น.
|
||||||
block.mass-driver.description = บล็อคขนส่งไอเท็มขั้นสุดยอด. รวบรวมไอเท็มจำนวนหนึ่งแล้วยิงไปหาแมสไดรเวอร์อีกอันที่อยู่ไกลออกไป. ต้องใช้พลังงานในการใช้งาน.
|
block.mass-driver.description = บล็อคขนส่งไอเท็มขั้นสุดยอด. รวบรวมไอเท็มจำนวนหนึ่งแล้วยิงไปหาแมสไดรเวอร์อีกอันที่อยู่ไกลออกไป. ต้องใช้พลังงานในการใช้งาน.
|
||||||
@@ -1150,7 +1149,7 @@ block.differential-generator.description = ผลิตไฟฟ้าจำน
|
|||||||
block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ.
|
block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ.
|
||||||
block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย.
|
block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย.
|
||||||
block.solar-panel-large.description = เวอร์ชั่นของแผงโซล่าเซลล์ที่มีประสิทธิภาพมากขึ้นกว่าแผงโซล่าเซลล์ธรรมดา.
|
block.solar-panel-large.description = เวอร์ชั่นของแผงโซล่าเซลล์ที่มีประสิทธิภาพมากขึ้นกว่าแผงโซล่าเซลล์ธรรมดา.
|
||||||
block.thorium-reactor.description = ผลิตพลังงานจำนวนมากจากทอเรี่ยม. ตำเป็นต้องใช้สารหล่อเย็นตลอดเวลา. จะระเบิดอย่างรุนแรงหากไม่ได้รับสารหล่อเย็นในจำนวนที่ต้องการ. จำนวนพลังงานที่ผลิตขึ้นอยู่กับความเต็ม และผลิตพลังงานเริ่มต้นที่ความสามารถสูงสุด.
|
block.thorium-reactor.description = ผลิตพลังงานจำนวนมากจากทอเรี่ยม. จำเป็นต้องใช้สารหล่อเย็นตลอดเวลา. จะระเบิดอย่างรุนแรงหากไม่ได้รับสารหล่อเย็นในจำนวนที่ต้องการ. จำนวนพลังงานที่ผลิตขึ้นอยู่กับความเต็ม และผลิตพลังงานเริ่มต้นที่ความสามารถสูงสุด.
|
||||||
block.impact-reactor.description = เครื่องกำเนิดไฟฟ้าขั้นสูง, สามารถผลิตไฟฟ้าได้จำนวนมหาศาลที่ประสิทธิภาพสูงสุด. จำเป็นต้องใช้พลังงานจำนวนมากในการสตาร์ทเครื่อง.
|
block.impact-reactor.description = เครื่องกำเนิดไฟฟ้าขั้นสูง, สามารถผลิตไฟฟ้าได้จำนวนมหาศาลที่ประสิทธิภาพสูงสุด. จำเป็นต้องใช้พลังงานจำนวนมากในการสตาร์ทเครื่อง.
|
||||||
block.mechanical-drill.description = เครื่องขุดราคาถูก. เมื่อวางบนบล็อคที่ถูกต้อง, จะส่งไอเท็มของมันออกมาเรื่อยๆแบบไม่มีที่สิ้นสุด. ขุดได้แค่ทรัพยากรพื้นฐาน.
|
block.mechanical-drill.description = เครื่องขุดราคาถูก. เมื่อวางบนบล็อคที่ถูกต้อง, จะส่งไอเท็มของมันออกมาเรื่อยๆแบบไม่มีที่สิ้นสุด. ขุดได้แค่ทรัพยากรพื้นฐาน.
|
||||||
block.pneumatic-drill.description = เครื่องขุดได้รับการปรับปรุง, สามารถขุดไทเทเนี่ยมได้. ขุดไวกว่าเครื่องขุดเชิงกล.
|
block.pneumatic-drill.description = เครื่องขุดได้รับการปรับปรุง, สามารถขุดไทเทเนี่ยมได้. ขุดไวกว่าเครื่องขุดเชิงกล.
|
||||||
@@ -1186,16 +1185,16 @@ block.draug-factory.description = ผลิตโดรนขุดเจาะ
|
|||||||
block.spirit-factory.description = ผลิตโดรนซ่อมแซมสปิริต.
|
block.spirit-factory.description = ผลิตโดรนซ่อมแซมสปิริต.
|
||||||
block.phantom-factory.description = ผลิตโดรนก่อสร้างขั้นสูง.
|
block.phantom-factory.description = ผลิตโดรนก่อสร้างขั้นสูง.
|
||||||
block.wraith-factory.description = ผลิตยูนิตเร็ว โจมตีแบบ hit-and-run (จู่โจมแล้วหนี)
|
block.wraith-factory.description = ผลิตยูนิตเร็ว โจมตีแบบ hit-and-run (จู่โจมแล้วหนี)
|
||||||
block.ghoul-factory.description = ผลิตยานทิ้งระเบิดปูพรมหนัก (heavy carpet bomber)
|
block.ghoul-factory.description = ผลิตยานทิ้งระเบิดแบบโหดๆ (heavy carpet bomber)
|
||||||
block.revenant-factory.description = ผลิตยูนิตที่ใช้ขีปนาวุธเป็นหลัก.
|
block.revenant-factory.description = ผลิตยูนิตที่ใช้ขีปนาวุธเป็นหลัก.
|
||||||
block.dagger-factory.description = ผลิตยูนิตภาคพื้นดินพื้นฐาน.
|
block.dagger-factory.description = ผลิตยูนิตภาคพื้นดินพื้นฐาน.
|
||||||
block.crawler-factory.description = ผลิตยูนิตพลีชีพเร็ว.
|
block.crawler-factory.description = ผลิตยูนิตที่ระเบิดตัวเอง.
|
||||||
block.titan-factory.description = ผลิตยูนิตภาคพื้นดินเสริมเกราะขั้นสูง.
|
block.titan-factory.description = ผลิตยูนิตภาคพื้นดินเสริมเกราะขั้นสูง.
|
||||||
block.fortress-factory.description = ผลิตยูนิตหนักติดปืนใหญ่.
|
block.fortress-factory.description = ผลิตยูนิตที่ถึกและติดปืนใหญ่.
|
||||||
block.repair-point.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีอย่างต่อเนื่อง.
|
block.repair-point.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีอย่างต่อเนื่อง.
|
||||||
block.dart-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คโจมตีพื้นฐาน.\nใช้โดยการกดเมื่อยืนทับมัน.
|
block.dart-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คโจมตีพื้นฐาน.\nใช้โดยการกดเมื่อยืนทับมัน.
|
||||||
block.delta-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คเกราะบางโจมตีแบบ hit-and-run (จู่โจมแล้วหนี).\nใช้โดยการกดเมื่อยืนทับมัน.
|
block.delta-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คเกราะบางโจมตีแบบ hit-and-run (จูค).\nใช้โดยการกดเมื่อยืนทับมัน.
|
||||||
block.tau-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คสนับสนุนขั้นสูง.\nใช้โดยการกดเมื่อยืนทับมัน.
|
block.tau-mech-pad.description = ใช้เปลี่ยนร่างเป็นตัวที่ฮีลได้ดีมาก.\nใช้โดยการกดเมื่อยืนทับมัน.
|
||||||
block.omega-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คใช้ขีปนาวุธเกราะหนา.\nใช้โดยการกดเมื่อยืนทับมัน.
|
block.omega-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คใช้ขีปนาวุธเกราะหนา.\nใช้โดยการกดเมื่อยืนทับมัน.
|
||||||
block.javelin-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นอินเทอร์เซ็ปเตอร์เร็วแบะเกราะบาง.\nใช้โดยการกดเมื่อยืนทับมัน.
|
block.javelin-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นอินเทอร์เซ็ปเตอร์เร็วแบะเกราะบาง.\nใช้โดยการกดเมื่อยืนทับมัน.
|
||||||
block.trident-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นยานทิ้งระเบิดสนับสนุน.\nใช้โดยการกดเมื่อยืนทับมัน.
|
block.trident-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นยานทิ้งระเบิดสนับสนุน.\nใช้โดยการกดเมื่อยืนทับมัน.
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ link.dev-builds.description = Нестабільні версії
|
|||||||
link.trello.description = Офіційна дошка Trello для запланованих функцій
|
link.trello.description = Офіційна дошка Trello для запланованих функцій
|
||||||
link.itch.io.description = Itch.io сторінка, на якій можна завантажити гру
|
link.itch.io.description = Itch.io сторінка, на якій можна завантажити гру
|
||||||
link.google-play.description = Завантажити для Android з Google Play
|
link.google-play.description = Завантажити для Android з Google Play
|
||||||
link.f-droid.description = Перелік каталогу F-Droid
|
link.f-droid.description = Завантажити для Android з F-Droid
|
||||||
link.wiki.description = Офіційна Mindustry wiki
|
link.wiki.description = Офіційна Mindustry wiki
|
||||||
|
link.feathub.description = Запропонувати нові функції
|
||||||
linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну.
|
linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну.
|
||||||
screenshot = Зняток мапи збережено в {0}
|
screenshot = Зняток мапи збережено в {0}
|
||||||
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
|
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
|
||||||
@@ -27,6 +28,13 @@ load.system = Система
|
|||||||
load.mod = Модифікації
|
load.mod = Модифікації
|
||||||
load.scripts = Скрипти
|
load.scripts = Скрипти
|
||||||
|
|
||||||
|
be.update = Доступна нова збірка Bleeding Edge:
|
||||||
|
be.update.confirm = Завантажити і перезавантажити зараз?
|
||||||
|
be.updating = Оновлення…
|
||||||
|
be.ignore = Ігнорувати
|
||||||
|
be.noupdates = Оновлень не знайдено.
|
||||||
|
be.check = Перевірити на наявність оновлень
|
||||||
|
|
||||||
schematic = Схема
|
schematic = Схема
|
||||||
schematic.add = Зберегти схему…
|
schematic.add = Зберегти схему…
|
||||||
schematics = Схеми
|
schematics = Схеми
|
||||||
@@ -37,7 +45,7 @@ schematic.importfile = Імпортувати файл
|
|||||||
schematic.browseworkshop = Переглянути в Майстерні
|
schematic.browseworkshop = Переглянути в Майстерні
|
||||||
schematic.copy = Копіювати в буфер обміну
|
schematic.copy = Копіювати в буфер обміну
|
||||||
schematic.copy.import = Імпортувати з клавіатури
|
schematic.copy.import = Імпортувати з клавіатури
|
||||||
schematic.shareworkshop = Поширити в Майстерні
|
schematic.shareworkshop = Поширити в Майстерню
|
||||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Відобразити схему
|
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Відобразити схему
|
||||||
schematic.saved = Схема збережена.
|
schematic.saved = Схема збережена.
|
||||||
schematic.delete.confirm = Ця схема буде повністю випалена.
|
schematic.delete.confirm = Ця схема буде повністю випалена.
|
||||||
@@ -67,7 +75,7 @@ customgame = Користувацька гра
|
|||||||
newgame = Нова гра
|
newgame = Нова гра
|
||||||
none = <нічого>
|
none = <нічого>
|
||||||
minimap = Мінімапа
|
minimap = Мінімапа
|
||||||
position = Позиція
|
position = Місцерозташування
|
||||||
close = Закрити
|
close = Закрити
|
||||||
website = Веб-сайт
|
website = Веб-сайт
|
||||||
quit = Вихід
|
quit = Вихід
|
||||||
@@ -97,22 +105,25 @@ mod.author = [LIGHT_GRAY]Автор:[] {0}
|
|||||||
mods.alpha = [scarlet](Альфа)
|
mods.alpha = [scarlet](Альфа)
|
||||||
mods = Модифікації
|
mods = Модифікації
|
||||||
mods.none = [LIGHT_GRAY]Модифікацій не знайдено!
|
mods.none = [LIGHT_GRAY]Модифікацій не знайдено!
|
||||||
mods.guide = Посібник зі створення модифицій
|
mods.guide = Посібник з модифицій
|
||||||
mods.report = Повідомити про ваду
|
mods.report = Повідомити про ваду
|
||||||
mods.openfolder = Відкрити теку модифікацій
|
mods.openfolder = Відкрити теку модифікацій
|
||||||
mod.enabled = [lightgray]Увімкнено
|
mod.enabled = [lightgray]Увімкнено
|
||||||
mod.disabled = [scarlet]Вимкнено
|
mod.disabled = [scarlet]Вимкнено
|
||||||
mod.disable = Вимкнути
|
mod.disable = Вимкн.
|
||||||
mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
|
mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
|
||||||
mod.requiresversion = [scarlet]Необхідна версія гри: [accent]{0}
|
mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0}
|
||||||
|
mod.erroredcontent = [scarlet]Помилки при завантаженнні
|
||||||
|
mod.errors = Сталася помилка при завантаження змісту.
|
||||||
|
mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх.
|
||||||
mod.missingdependencies = [scarlet]Відсутні залежності: {0}
|
mod.missingdependencies = [scarlet]Відсутні залежності: {0}
|
||||||
mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена.
|
mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена.
|
||||||
mod.enable = Увімкнути
|
mod.enable = Увімк.
|
||||||
mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій.
|
mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій.
|
||||||
mod.reloadrequired = [scarlet]Потрібно перезавантаження
|
mod.reloadrequired = [scarlet]Потрібно перезавантаження
|
||||||
mod.import = Імпортувати модифікацію
|
mod.import = Імпортувати модифікацію
|
||||||
mod.import.github = Імпортувати модификацію з GitHub
|
mod.import.github = Завантажити мод з GitHub
|
||||||
mod.item.remove =Цей предмет є частиною модифікації [accent] '«{0}»[]. Щоб видалити його, видаліть цю модифікацію.
|
mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію.
|
||||||
mod.remove.confirm = Цю модифікацію буде видалено.
|
mod.remove.confirm = Цю модифікацію буде видалено.
|
||||||
mod.author = [LIGHT_GRAY]Автор:[] {0}
|
mod.author = [LIGHT_GRAY]Автор:[] {0}
|
||||||
mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0}
|
mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0}
|
||||||
@@ -133,7 +144,7 @@ players = Гравців: {0}
|
|||||||
players.single = {0} гравець на сервері
|
players.single = {0} гравець на сервері
|
||||||
server.closing = [accent]Закриття сервера…
|
server.closing = [accent]Закриття сервера…
|
||||||
server.kicked.kick = Ви були вигнані з сервера!
|
server.kicked.kick = Ви були вигнані з сервера!
|
||||||
server.kicked.whitelist = Ви не в білому спискі сервері.
|
server.kicked.whitelist = Ви не в білому спискі сервера!
|
||||||
server.kicked.serverClose = Сервер закрито.
|
server.kicked.serverClose = Сервер закрито.
|
||||||
server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте.
|
server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте.
|
||||||
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
||||||
@@ -147,6 +158,7 @@ server.kicked.nameEmpty = Ваше ім’я має містити принай
|
|||||||
server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не дозволяється.
|
server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не дозволяється.
|
||||||
server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію.
|
server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію.
|
||||||
server.kicked.gameover = Гра завершена!
|
server.kicked.gameover = Гра завершена!
|
||||||
|
server.kicked.serverRestarting = Сервер перезавантажується
|
||||||
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
||||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережі[], повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то[accent] переадресація порту []обов’язкова.\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережі[], повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то[accent] переадресація порту []обов’язкова.\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
||||||
join.info = Тут ви можете ввести [accent]IP сервера[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача сервера дати свій ip.
|
join.info = Тут ви можете ввести [accent]IP сервера[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача сервера дати свій ip.
|
||||||
@@ -209,8 +221,8 @@ save.delete.confirm = Ви дійсно хочете видалити це зб
|
|||||||
save.delete = Видалити
|
save.delete = Видалити
|
||||||
save.export = Експортувати збереження
|
save.export = Експортувати збереження
|
||||||
save.import.invalid = [accent]Це збереження недійсне!
|
save.import.invalid = [accent]Це збереження недійсне!
|
||||||
save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0}
|
save.import.fail = [crimson]Не вдалося завантажити збереження: [accent]{0}
|
||||||
save.export.fail = [crimson]Не вдалося експортувати збереження: [accent]{0}
|
save.export.fail = [crimson]Не вдалося вивантажити збереження: [accent]{0}
|
||||||
save.import = Імпортувати збереження
|
save.import = Імпортувати збереження
|
||||||
save.newslot = Ім’я збереження:
|
save.newslot = Ім’я збереження:
|
||||||
save.rename = Перейменувати
|
save.rename = Перейменувати
|
||||||
@@ -240,12 +252,12 @@ cancel = Скасувати
|
|||||||
openlink = Відкрити посилання
|
openlink = Відкрити посилання
|
||||||
copylink = Скопіювати посилання
|
copylink = Скопіювати посилання
|
||||||
back = Назад
|
back = Назад
|
||||||
data.export = Експортувати дані
|
data.export = Вивантажити дані
|
||||||
data.import = Импортувати дані
|
data.import = Завантажити дані
|
||||||
data.exported = Дані імпортовано.
|
data.exported = Дані вивантажено.
|
||||||
data.invalid = Це не дійсні ігрові дані.
|
data.invalid = Це не дійсні ігрові дані.
|
||||||
data.import.confirm = Імпорт зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється.
|
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється.
|
||||||
classic.export = Експортувати класичні дані
|
classic.export = Вивантажити класичні дані
|
||||||
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic?
|
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic?
|
||||||
quit.confirm = Ви впевнені, що хочете вийти?
|
quit.confirm = Ви впевнені, що хочете вийти?
|
||||||
quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання?
|
quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання?
|
||||||
@@ -317,7 +329,7 @@ waves.invalid = Недійсні хвилі у буфері обміну.
|
|||||||
waves.copied = Хвилі скопійовані.
|
waves.copied = Хвилі скопійовані.
|
||||||
waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
||||||
editor.default = [lightgray]<За замовчуванням>
|
editor.default = [lightgray]<За замовчуванням>
|
||||||
details = Деталі…
|
details = Подробиці…
|
||||||
edit = Редагувати…
|
edit = Редагувати…
|
||||||
editor.name = Назва:
|
editor.name = Назва:
|
||||||
editor.spawn = Створити бойову одиницю
|
editor.spawn = Створити бойову одиницю
|
||||||
@@ -325,7 +337,7 @@ editor.removeunit = Видалити бойову одиницю
|
|||||||
editor.teams = Команди
|
editor.teams = Команди
|
||||||
editor.errorload = Помилка завантаження зображення:\n[accent] {0}
|
editor.errorload = Помилка завантаження зображення:\n[accent] {0}
|
||||||
editor.errorsave = Помилка збереження зображення:\n[accent]{0}
|
editor.errorsave = Помилка збереження зображення:\n[accent]{0}
|
||||||
editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо Ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі.
|
editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі.
|
||||||
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
|
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
|
||||||
editor.errornot = Це не мапа.
|
editor.errornot = Це не мапа.
|
||||||
editor.errorheader = Цей файл мапи недійсний або пошкоджений.
|
editor.errorheader = Цей файл мапи недійсний або пошкоджений.
|
||||||
@@ -426,8 +438,8 @@ abandon = Покинути
|
|||||||
abandon.text = Ця зона і всі її ресурси будуть втрачені.
|
abandon.text = Ця зона і всі її ресурси будуть втрачені.
|
||||||
locked = Заблоковано
|
locked = Заблоковано
|
||||||
complete = [lightgray]Досягнута:
|
complete = [lightgray]Досягнута:
|
||||||
requirement.wave = Досягніть хвилі {0} у {1}
|
requirement.wave = Досягніть хвилі {0} у зоні «{1}»
|
||||||
requirement.core = Знишьте вороже ядро у {0}
|
requirement.core = Знищьте вороже ядро у {0}
|
||||||
requirement.unlock = Розблокуйте {0}
|
requirement.unlock = Розблокуйте {0}
|
||||||
resume = Відновити зону:\n[lightgray]{0}
|
resume = Відновити зону:\n[lightgray]{0}
|
||||||
bestwave = [lightgray]Найкраща хвиля: {0}
|
bestwave = [lightgray]Найкраща хвиля: {0}
|
||||||
@@ -436,16 +448,16 @@ launch.title = Запуск вдалий
|
|||||||
launch.next = [lightgray]наступна можливість на {0}-тій хвилі
|
launch.next = [lightgray]наступна можливість на {0}-тій хвилі
|
||||||
launch.unable2 = [scarlet]ЗАПУСК неможливий.[]
|
launch.unable2 = [scarlet]ЗАПУСК неможливий.[]
|
||||||
launch.confirm = Це видалить всі ресурси у Вашому ядрі.\nВи не зможете повернутися до цієї бази.
|
launch.confirm = Це видалить всі ресурси у Вашому ядрі.\nВи не зможете повернутися до цієї бази.
|
||||||
launch.skip.confirm = Якщо Ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль.
|
launch.skip.confirm = Якщо ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль.
|
||||||
uncover = Розкрити
|
uncover = Розкрити
|
||||||
configure = Вивантажити конфігурацію
|
configure = Вивантажити конфігурацію
|
||||||
bannedblocks = Заборонені блоки
|
bannedblocks = Заборонені блоки
|
||||||
addall = Додати все
|
addall = Додати все
|
||||||
configure.locked = [lightgray]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі.
|
configure.locked = {0}[lightgray]Тільки після цього можливість розблокувати вивантаження ресурсів буде доступна.
|
||||||
configure.invalid = Кількість повинна бути числом між 0 та {0}.
|
configure.invalid = Кількість повинна бути числом між 0 та {0}.
|
||||||
zone.unlocked = Зона «[lightgray]{0}» тепер розблокована.
|
zone.unlocked = Зона «[lightgray]{0}» тепер розблокована.
|
||||||
zone.requirement.complete = Ви досягли {0}-тої хвилі,\nВимоги до зони «{1}» виконані.
|
zone.requirement.complete = Ви досягли {0}-тої хвилі. \nВимоги до зони «{1}» виконані.
|
||||||
zone.config.unlocked = Loadout unlocked:[lightgray]\n{0}
|
zone.config.unlocked = Вивантаження розблоковано:[lightgray]\n{0}
|
||||||
zone.resources = Виявлені ресурси:
|
zone.resources = Виявлені ресурси:
|
||||||
zone.objective = [lightgray]Мета: [accent]{0}
|
zone.objective = [lightgray]Мета: [accent]{0}
|
||||||
zone.objective.survival = Вижити
|
zone.objective.survival = Вижити
|
||||||
@@ -462,7 +474,7 @@ error.mapnotfound = Файл мапи не знайдено
|
|||||||
error.io = Мережева помилка введення-виведення
|
error.io = Мережева помилка введення-виведення
|
||||||
error.any = Невідома мережева помилка
|
error.any = Невідома мережева помилка
|
||||||
error.bloom = Не вдалося ініціалізувати цвітіння.\nВаш пристрій, мабуть, не підтримує це.
|
error.bloom = Не вдалося ініціалізувати цвітіння.\nВаш пристрій, мабуть, не підтримує це.
|
||||||
zone.groundZero.name = Нульова земля
|
zone.groundZero.name = Відправний пункт
|
||||||
zone.desertWastes.name = Пустельні відходи
|
zone.desertWastes.name = Пустельні відходи
|
||||||
zone.craters.name = Кратери
|
zone.craters.name = Кратери
|
||||||
zone.frozenForest.name = Крижаний ліс
|
zone.frozenForest.name = Крижаний ліс
|
||||||
@@ -493,7 +505,7 @@ zone.crags.description = <вставити опис тут>
|
|||||||
settings.language = Мова
|
settings.language = Мова
|
||||||
settings.data = Ігрові дані
|
settings.data = Ігрові дані
|
||||||
settings.reset = Скинути за замовчуванням
|
settings.reset = Скинути за замовчуванням
|
||||||
settings.rebind = Зміна
|
settings.rebind = Змінити
|
||||||
settings.resetKey = Скинути
|
settings.resetKey = Скинути
|
||||||
settings.controls = Керування
|
settings.controls = Керування
|
||||||
settings.game = Гра
|
settings.game = Гра
|
||||||
@@ -515,7 +527,7 @@ blocks.output = Вихід
|
|||||||
blocks.booster = Прискорювач
|
blocks.booster = Прискорювач
|
||||||
block.unknown = [lightgray]???
|
block.unknown = [lightgray]???
|
||||||
blocks.powercapacity = Місткість енергії
|
blocks.powercapacity = Місткість енергії
|
||||||
blocks.powershot = Енергія/постріл
|
blocks.powershot = Енергія за постріл
|
||||||
blocks.damage = Шкода
|
blocks.damage = Шкода
|
||||||
blocks.targetsair = Повітряні мішені
|
blocks.targetsair = Повітряні мішені
|
||||||
blocks.targetsground = Наземні мішені
|
blocks.targetsground = Наземні мішені
|
||||||
@@ -527,7 +539,7 @@ blocks.liquidcapacity = Місткість рідини
|
|||||||
blocks.powerrange = Діапазон передачі енергії
|
blocks.powerrange = Діапазон передачі енергії
|
||||||
blocks.powerconnections = Максимальна кількість з’єднань
|
blocks.powerconnections = Максимальна кількість з’єднань
|
||||||
blocks.poweruse = Енергії використовує
|
blocks.poweruse = Енергії використовує
|
||||||
blocks.powerdamage = Енергія/урон
|
blocks.powerdamage = Енергія/шкода
|
||||||
blocks.itemcapacity = Місткість предметів
|
blocks.itemcapacity = Місткість предметів
|
||||||
blocks.basepowergeneration = Базова генерація енергії
|
blocks.basepowergeneration = Базова генерація енергії
|
||||||
blocks.productiontime = Час виробництва
|
blocks.productiontime = Час виробництва
|
||||||
@@ -622,6 +634,7 @@ setting.screenshake.name = Тряска екрану
|
|||||||
setting.effects.name = Ефекти
|
setting.effects.name = Ефекти
|
||||||
setting.destroyedblocks.name = Показувати зруйновані блоки
|
setting.destroyedblocks.name = Показувати зруйновані блоки
|
||||||
setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерів
|
setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерів
|
||||||
|
setting.coreselect.name = Дозволити схематичні ядра
|
||||||
setting.sensitivity.name = Чутливість контролера
|
setting.sensitivity.name = Чутливість контролера
|
||||||
setting.saveinterval.name = Інтервал збереження
|
setting.saveinterval.name = Інтервал збереження
|
||||||
setting.seconds = {0} с
|
setting.seconds = {0} с
|
||||||
@@ -732,6 +745,7 @@ rules.enemyCheat = Нескінченні ресурси для ШІ
|
|||||||
rules.unitdrops = Ресурс бойових одиниць
|
rules.unitdrops = Ресурс бойових одиниць
|
||||||
rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць
|
rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць
|
||||||
rules.unithealthmultiplier = Множник здоров’я бойових одиниць
|
rules.unithealthmultiplier = Множник здоров’я бойових одиниць
|
||||||
|
rules.blockhealthmultiplier = Множник здоров’я блоків
|
||||||
rules.playerhealthmultiplier = Множник здоров’я гравця
|
rules.playerhealthmultiplier = Множник здоров’я гравця
|
||||||
rules.playerdamagemultiplier = Множник шкоди гравця
|
rules.playerdamagemultiplier = Множник шкоди гравця
|
||||||
rules.unitdamagemultiplier = Множник шкоди бойових одиниць
|
rules.unitdamagemultiplier = Множник шкоди бойових одиниць
|
||||||
@@ -849,7 +863,7 @@ block.core-nucleus.name = Ядро «Атом»
|
|||||||
block.deepwater.name = Глибоководдя
|
block.deepwater.name = Глибоководдя
|
||||||
block.water.name = Вода
|
block.water.name = Вода
|
||||||
block.tainted-water.name = Забруднена вода
|
block.tainted-water.name = Забруднена вода
|
||||||
block.darksand-tainted-water.name = Темний пісок з забрудненою водою
|
block.darksand-tainted-water.name = Темний пісок із забрудненою водою
|
||||||
block.tar.name = Дьоготь
|
block.tar.name = Дьоготь
|
||||||
block.stone.name = Камінь
|
block.stone.name = Камінь
|
||||||
block.sand.name = Пісок
|
block.sand.name = Пісок
|
||||||
@@ -1033,30 +1047,29 @@ unit.eradicator.name = Випалювач
|
|||||||
unit.lich.name = Лич
|
unit.lich.name = Лич
|
||||||
unit.reaper.name = Жнець
|
unit.reaper.name = Жнець
|
||||||
tutorial.next = [lightgray]<Натисніть для продовження>
|
tutorial.next = [lightgray]<Натисніть для продовження>
|
||||||
tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді
|
tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з [accent]видобутку міді[]. Використовуйте [[WASD] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді
|
||||||
tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть екраном, щоб рухатися.\n[accent] Зведіть або розведіть 2 пальця [] для приближення і віддалення відповідно.\nз[accent] видобування міді.[] Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді
|
tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть екраном, щоб рухатися.\n[accent] Зведіть або розведіть 2 пальця [] для приближення і віддалення відповідно.\nз[accent] видобування міді.[] Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді
|
||||||
tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім натиснути [accent][[1][] швидко, незалежно від того, яка вкладка відкрита.\n[accent]Натисніть ПКМ[], щоб зупинити будування.tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення .\nНатисніть[accent] клавішу X[], щоб скасувати розміщення.
|
tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку із зображенням свердла знизу праворуч.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснути [accent][[1][], незалежно від того, яка вкладка відкрита.\n[accent]Натисніть ПКМ[], щоб зупинити будування.
|
||||||
tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку із зображенням сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent]галочку[] нижче, щоб підтвердити розміщення .\nНатисніть [accent]кнопку X[], щоб скасувати розміщення.
|
||||||
tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[]
|
tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[]
|
||||||
tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш, щоб розмістити у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\n\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено
|
tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш, щоб розмістити у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро.tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено
|
||||||
tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено
|
tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази.
|
||||||
tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башточку «Подвійна»[] біля вашої бази.
|
tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1
|
||||||
tutorial.drillturret = «Подвійна» потребує [accent] мідні боєприпаси []для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1
|
tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи.
|
||||||
tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch
|
tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для павзи.
|
||||||
tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи.
|
|
||||||
tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу.
|
tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу.
|
||||||
tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу.
|
tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу.
|
||||||
tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] Ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні.
|
tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні.
|
||||||
tutorial.breaking.mobile = Блоки часто повинні бути знищені.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищіть область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні.
|
tutorial.breaking.mobile = Блоки часто повинні бути знищені.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищіть область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні.
|
||||||
tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисність на блок[] з предметами на ньому, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n[accent]Вилучіть трохи міді з ядра.[]
|
tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисність на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n[accent]Вилучіть трохи міді з ядра.[]
|
||||||
tutorial.deposit = Покладіть предмети в блоки, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[]
|
tutorial.deposit = Покладіть предмети в блоки, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[]
|
||||||
tutorial.waves = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль.[accent] Натисніть[], щоб стріляти.\nСтворіть більше башточок і бурів. Добудьте більше міді.
|
tutorial.waves = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nСтворіть більше башт і бурів. Добудьте більше міді.
|
||||||
tutorial.waves.mobile = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль. Ваш корабель буде автоматично атакувати ворогів.\nСтворіть більше башточок і бурів. Добудьте більше міді.
|
tutorial.waves.mobile = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль. Ваш корабель буде автоматично атакувати ворогів.\nСтворіть більше башт і бурів. Добудьте більше міді.
|
||||||
tutorial.launch = Як тільки ви досягнете певної хвилі, Ви зможете[accent] запустити ядро[], залишивши захисні сили позаду та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску.
|
tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши захисні сили позаду та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску.
|
||||||
item.copper.description = Найбільш базовий будівельний матеріал. Широко використовується у всіх типах блоків.
|
item.copper.description = Найбільш базовий будівельний матеріал. Широко використовується у всіх типах блоків.
|
||||||
item.lead.description = Основний стартовий матеріал. Широко застосовується в електроніці та транспортуванні рідин.
|
item.lead.description = Основний стартовий матеріал. Широко застосовується в електроніці та транспортуванні рідин.
|
||||||
item.metaglass.description = Супер жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини.
|
item.metaglass.description = Супер жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини.
|
||||||
item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та електроізоляції.
|
item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як компонент.
|
||||||
item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів.
|
item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів.
|
||||||
item.coal.description = Окам’янілі рослинні речовини, що утворюються задовго до посіву. Широко використовується для виробництва пального та ресурсів.
|
item.coal.description = Окам’янілі рослинні речовини, що утворюються задовго до посіву. Широко використовується для виробництва пального та ресурсів.
|
||||||
item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків.
|
item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків.
|
||||||
@@ -1074,11 +1087,11 @@ liquid.slag.description = Різні види розплавленого мет
|
|||||||
liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля.
|
liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля.
|
||||||
liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини.
|
liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини.
|
||||||
mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будування. Наносить більше шкоди, ніж «Дротик».
|
mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будування. Наносить більше шкоди, ніж «Дротик».
|
||||||
mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і біжи». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою.
|
mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і втікай». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою.
|
||||||
mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності.
|
mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності.
|
||||||
mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять.
|
mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять.
|
||||||
mech.dart-ship.description = Стандартний корабель управління. Швидко видобуває ресурси. Достатньо швидкий і легкий, але має мало наступальних можливостей.
|
mech.dart-ship.description = Стандартний корабель управління. Швидко видобуває ресурси. Достатньо швидкий і легкий, але має мало наступальних можливостей.
|
||||||
mech.javelin-ship.description = Корабель для стратегії атакуй та біжи». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами.
|
mech.javelin-ship.description = Корабель, який використовується для стратегії «атакуй та втікай». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами.
|
||||||
mech.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований.
|
mech.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований.
|
||||||
mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений.
|
mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений.
|
||||||
unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра.
|
unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра.
|
||||||
@@ -1089,7 +1102,7 @@ unit.crawler.description = Наземна одиниця, що складаєт
|
|||||||
unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач.
|
unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач.
|
||||||
unit.fortress.description = Артилерійний мех. Оснащений двома модифікованими гарматами типу «Град» для дальнього нападу на ворожі структури та підрозділи.
|
unit.fortress.description = Артилерійний мех. Оснащений двома модифікованими гарматами типу «Град» для дальнього нападу на ворожі структури та підрозділи.
|
||||||
unit.eruptor.description = Важкий мех, призначеней для знесення конструкцій. Вистрілює потік шлаків у ворожі укріплення, розплавляючи їх і підпалюючи летючі речовини.
|
unit.eruptor.description = Важкий мех, призначеней для знесення конструкцій. Вистрілює потік шлаків у ворожі укріплення, розплавляючи їх і підпалюючи летючі речовини.
|
||||||
unit.wraith.description = Швидкий перехоплювач, який використовується для тактики «атакуй і біжи». Пріоритет — енергетичні генератори.
|
unit.wraith.description = Швидкий перехоплювач, який використовується для тактики «атакуй і втікай». Пріоритет — генератори енергії.
|
||||||
unit.ghoul.description = Важкий килимовий бомбардувальник. Пробиває ворожі структури, орієнтуючись на віжливу інфраструктуру.
|
unit.ghoul.description = Важкий килимовий бомбардувальник. Пробиває ворожі структури, орієнтуючись на віжливу інфраструктуру.
|
||||||
unit.revenant.description = Важкий ракетний масив.
|
unit.revenant.description = Важкий ракетний масив.
|
||||||
block.message.description = Зберігає повідомлення. Використовується для комунікаціх між союзниками.
|
block.message.description = Зберігає повідомлення. Використовується для комунікаціх між союзниками.
|
||||||
@@ -1103,19 +1116,19 @@ block.alloy-smelter.description = Поєднує титан, свинець, к
|
|||||||
block.cryofluidmixer.description = Змішує воду і дрібний порошок титану титану в кріогенну рідину. Основне використання у торієвому реактору.
|
block.cryofluidmixer.description = Змішує воду і дрібний порошок титану титану в кріогенну рідину. Основне використання у торієвому реактору.
|
||||||
block.blast-mixer.description = Подрібнює і змішує скупчення спор з піратитом для отримання вибухової суміші.
|
block.blast-mixer.description = Подрібнює і змішує скупчення спор з піратитом для отримання вибухової суміші.
|
||||||
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піратит.
|
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піратит.
|
||||||
block.melter.description = Розплавляє брухт у шлак для подальшої переробки або використання у башточках «Хвиля».
|
block.melter.description = Розплавляє брухт у шлак для подальшої переробки або використання у баштах «Хвиля».
|
||||||
block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджений результат.
|
block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджений результат.
|
||||||
block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти
|
block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти.
|
||||||
block.pulverizer.description = Подрібнює брухт дрібного піску.
|
block.pulverizer.description = Подрібнює брухт дрібного піску.
|
||||||
block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля.
|
block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля.
|
||||||
block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує.
|
block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує.
|
||||||
block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця
|
block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця
|
||||||
block.power-source.description = Нескінченно виводить енергію. Тільки пісочниця
|
block.power-source.description = Нескінченно виводить енергію.
|
||||||
block.item-source.description = Нескінченно виводить предмети. Тільки пісочниця
|
block.item-source.description = Нескінченно виводить предмети.
|
||||||
block.item-void.description = Знищує будь-які предмети. Тільки пісочниця
|
block.item-void.description = Знищує будь-які предмети.
|
||||||
block.liquid-source.description = Нескінченно виводить рідини. Тільки пісочниця
|
block.liquid-source.description = Нескінченно виводить рідини.
|
||||||
block.copper-wall.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.
|
block.copper-wall.description = Дешевий захисний блок.\nКорисна для захисту ядра та башто у перші кілька хвиль.
|
||||||
block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.\nОхоплює кілька плиток.
|
block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башт у перші кілька хвиль.\nОхоплює кілька плиток.
|
||||||
block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.
|
block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.
|
||||||
block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток.
|
block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток.
|
||||||
block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання енергетичних вузлів.
|
block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання енергетичних вузлів.
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ uploadingpreviewfile = 上傳預覽文件
|
|||||||
committingchanges = 提交變更
|
committingchanges = 提交變更
|
||||||
done = 完成
|
done = 完成
|
||||||
feature.unsupported = 您的設備不支持此功能。
|
feature.unsupported = 您的設備不支持此功能。
|
||||||
|
|
||||||
mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry GitHub或Discord報告發現的任何問題。
|
mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry GitHub或Discord報告發現的任何問題。
|
||||||
mods.alpha = [accent](Alpha)
|
mods.alpha = [accent](Alpha)
|
||||||
mods = 模組
|
mods = 模組
|
||||||
@@ -98,7 +99,6 @@ mods.report = 回報錯誤
|
|||||||
mods.openfolder = 開啟模組資料夾
|
mods.openfolder = 開啟模組資料夾
|
||||||
mod.enabled = [lightgray]已啟用
|
mod.enabled = [lightgray]已啟用
|
||||||
mod.disabled = [scarlet]已禁用
|
mod.disabled = [scarlet]已禁用
|
||||||
mod.enable = 啟用
|
|
||||||
mod.disable = 禁用
|
mod.disable = 禁用
|
||||||
mod.delete.error = 無法刪除模組,檔案可能在使用中。
|
mod.delete.error = 無法刪除模組,檔案可能在使用中。
|
||||||
mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0}
|
mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0}
|
||||||
@@ -107,6 +107,7 @@ mod.erroredcontent = [scarlet]內容錯誤
|
|||||||
mod.errors = 載入內容時發生錯誤
|
mod.errors = 載入內容時發生錯誤
|
||||||
mod.noerrorplay = [scarlet]你使用了有錯誤的模組。[] 遊戲前請先禁用相關模組或修正錯誤。
|
mod.noerrorplay = [scarlet]你使用了有錯誤的模組。[] 遊戲前請先禁用相關模組或修正錯誤。
|
||||||
mod.nowdisabled = [scarlet]「{0}」模組缺少必須項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。
|
mod.nowdisabled = [scarlet]「{0}」模組缺少必須項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。
|
||||||
|
mod.enable = 啟用
|
||||||
mod.requiresrestart = 遊戲將立即關閉以套用模組變更。
|
mod.requiresrestart = 遊戲將立即關閉以套用模組變更。
|
||||||
mod.reloadrequired = [scarlet]需要重新載入
|
mod.reloadrequired = [scarlet]需要重新載入
|
||||||
mod.import = 匯入模組
|
mod.import = 匯入模組
|
||||||
@@ -286,6 +287,7 @@ publishing = [accent]發佈中...
|
|||||||
publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示!
|
publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示!
|
||||||
publish.error = 發佈項目時出錯: {0}
|
publish.error = 發佈項目時出錯: {0}
|
||||||
steam.error = Steam 服務初始化失敗.\n錯誤: {0}
|
steam.error = Steam 服務初始化失敗.\n錯誤: {0}
|
||||||
|
|
||||||
editor.brush = 粉刷
|
editor.brush = 粉刷
|
||||||
editor.openin = 在編輯器中開啟
|
editor.openin = 在編輯器中開啟
|
||||||
editor.oregen = 礦石生成
|
editor.oregen = 礦石生成
|
||||||
@@ -605,7 +607,6 @@ category.items = 物品
|
|||||||
category.crafting = 需求
|
category.crafting = 需求
|
||||||
category.shooting = 射擊
|
category.shooting = 射擊
|
||||||
category.optional = 可選的強化
|
category.optional = 可選的強化
|
||||||
|
|
||||||
setting.landscape.name = 鎖定水平畫面
|
setting.landscape.name = 鎖定水平畫面
|
||||||
setting.shadows.name = 陰影
|
setting.shadows.name = 陰影
|
||||||
setting.blockreplace.name = 方塊建造建議
|
setting.blockreplace.name = 方塊建造建議
|
||||||
@@ -671,6 +672,7 @@ category.multiplayer.name = 多人
|
|||||||
command.attack = 攻擊
|
command.attack = 攻擊
|
||||||
command.rally = 集結
|
command.rally = 集結
|
||||||
command.retreat = 撤退
|
command.retreat = 撤退
|
||||||
|
placement.blockselectkeys = \n[lightgray]按鍵:[{0},
|
||||||
keybind.clear_building.name = 清除建築指令
|
keybind.clear_building.name = 清除建築指令
|
||||||
keybind.press = 按一下按鍵...
|
keybind.press = 按一下按鍵...
|
||||||
keybind.press.axis = 按一下軸向或按鍵...
|
keybind.press.axis = 按一下軸向或按鍵...
|
||||||
@@ -678,6 +680,8 @@ keybind.screenshot.name = 地圖截圖
|
|||||||
keybind.toggle_power_lines.name = 顯示能量激光
|
keybind.toggle_power_lines.name = 顯示能量激光
|
||||||
keybind.move_x.name = 水平移動
|
keybind.move_x.name = 水平移動
|
||||||
keybind.move_y.name = 垂直移動
|
keybind.move_y.name = 垂直移動
|
||||||
|
keybind.mouse_move.name = 跟隨滑鼠
|
||||||
|
keybind.dash.name = 衝刺
|
||||||
keybind.schematic_select.name = 選擇區域
|
keybind.schematic_select.name = 選擇區域
|
||||||
keybind.schematic_menu.name = 藍圖目錄
|
keybind.schematic_menu.name = 藍圖目錄
|
||||||
keybind.schematic_flip_x.name = X軸翻轉
|
keybind.schematic_flip_x.name = X軸翻轉
|
||||||
@@ -710,7 +714,6 @@ keybind.menu.name = 主選單
|
|||||||
keybind.pause.name = 暫停遊戲
|
keybind.pause.name = 暫停遊戲
|
||||||
keybind.pause_building.name = 暫停/恢復建造
|
keybind.pause_building.name = 暫停/恢復建造
|
||||||
keybind.minimap.name = 小地圖
|
keybind.minimap.name = 小地圖
|
||||||
keybind.dash.name = 衝刺
|
|
||||||
keybind.chat.name = 聊天
|
keybind.chat.name = 聊天
|
||||||
keybind.player_list.name = 玩家列表
|
keybind.player_list.name = 玩家列表
|
||||||
keybind.console.name = 終端機
|
keybind.console.name = 終端機
|
||||||
@@ -724,7 +727,7 @@ keybind.drop_unit.name = 放下單位
|
|||||||
keybind.zoom_minimap.name = 縮放小地圖
|
keybind.zoom_minimap.name = 縮放小地圖
|
||||||
mode.help.title = 模式說明
|
mode.help.title = 模式說明
|
||||||
mode.survival.name = 生存
|
mode.survival.name = 生存
|
||||||
mode.survival.description = 一般模式。有限的資源與自動來襲的波次。
|
mode.survival.description = 一般模式。有限的資源與自動來襲的波次。\n[gray]地圖中需要敵人生成點。
|
||||||
mode.sandbox.name = 沙盒
|
mode.sandbox.name = 沙盒
|
||||||
mode.sandbox.description = 無限的資源與不倒數計時的波次。
|
mode.sandbox.description = 無限的資源與不倒數計時的波次。
|
||||||
mode.editor.name = 編輯
|
mode.editor.name = 編輯
|
||||||
@@ -742,11 +745,11 @@ rules.attack = 攻擊模式
|
|||||||
rules.enemyCheat = 電腦無限資源
|
rules.enemyCheat = 電腦無限資源
|
||||||
rules.unitdrops = 單位掉落物
|
rules.unitdrops = 單位掉落物
|
||||||
rules.unitbuildspeedmultiplier = 單位建設速度倍數
|
rules.unitbuildspeedmultiplier = 單位建設速度倍數
|
||||||
rules.unithealthmultiplier = 單位耐久度倍數
|
rules.unithealthmultiplier = 單位生命值倍數
|
||||||
rules.playerhealthmultiplier = 玩家耐久度倍數
|
rules.playerhealthmultiplier = 玩家生命值倍數
|
||||||
rules.playerdamagemultiplier = 玩家傷害倍數
|
rules.playerdamagemultiplier = 玩家傷害倍數
|
||||||
rules.unitdamagemultiplier = 單位傷害倍數
|
rules.unitdamagemultiplier = 單位傷害倍數
|
||||||
rules.enemycorebuildradius = 敵人核心無建設半徑︰[lightgray](格)
|
rules.enemycorebuildradius = 敵人核心禁止建設半徑︰[lightgray](格)
|
||||||
rules.respawntime = 重生時間︰[lightgray](秒)
|
rules.respawntime = 重生時間︰[lightgray](秒)
|
||||||
rules.wavespacing = 波次間距︰[lightgray](秒)
|
rules.wavespacing = 波次間距︰[lightgray](秒)
|
||||||
rules.buildcostmultiplier = 建設成本倍數
|
rules.buildcostmultiplier = 建設成本倍數
|
||||||
@@ -790,7 +793,6 @@ liquid.water.name = 水
|
|||||||
liquid.slag.name = 熔渣
|
liquid.slag.name = 熔渣
|
||||||
liquid.oil.name = 原油
|
liquid.oil.name = 原油
|
||||||
liquid.cryofluid.name = 冷凍液
|
liquid.cryofluid.name = 冷凍液
|
||||||
|
|
||||||
mech.alpha-mech.name = 阿爾法
|
mech.alpha-mech.name = 阿爾法
|
||||||
mech.alpha-mech.weapon = 重型機關槍
|
mech.alpha-mech.weapon = 重型機關槍
|
||||||
mech.alpha-mech.ability = 自修復
|
mech.alpha-mech.ability = 自修復
|
||||||
@@ -813,21 +815,22 @@ mech.trident-ship.weapon = 轟炸艙
|
|||||||
mech.glaive-ship.name = 偃月刀
|
mech.glaive-ship.name = 偃月刀
|
||||||
mech.glaive-ship.weapon = 火焰機關槍
|
mech.glaive-ship.weapon = 火焰機關槍
|
||||||
item.corestorable = [lightgray]核心可儲存: {0}
|
item.corestorable = [lightgray]核心可儲存: {0}
|
||||||
item.explosiveness = [lightgray]爆炸性:{0}
|
item.explosiveness = [lightgray]爆炸性:{0}%
|
||||||
item.flammability = [lightgray]易燃性:{0}
|
item.flammability = [lightgray]易燃性:{0}%
|
||||||
item.radioactivity = [lightgray]放射性:{0}
|
item.radioactivity = [lightgray]放射性:{0}%
|
||||||
unit.health = [lightgray]耐久度:{0}
|
unit.health = [lightgray]生命值:{0}
|
||||||
unit.speed = [lightgray]速度:{0}
|
unit.speed = [lightgray]速度:{0}
|
||||||
mech.weapon = [lightgray]武器:{0}
|
mech.weapon = [lightgray]武器:{0}
|
||||||
mech.health = [lightgray]血量:{0}
|
mech.health = [lightgray]血量:{0}
|
||||||
mech.itemcapacity = [lightgray]物品容量:{0}
|
mech.itemcapacity = [lightgray]物品容量:{0}
|
||||||
mech.minespeed = [lightgray]採礦速度:{0}
|
mech.minespeed = [lightgray]採礦速度:{0}%
|
||||||
mech.minepower = [lightgray]採礦能力:{0}
|
mech.minepower = [lightgray]採礦能力:{0}
|
||||||
mech.ability = [lightgray]能力:{0}
|
mech.ability = [lightgray]能力:{0}
|
||||||
mech.buildspeed = [lightgray]建造速度: {0}%
|
mech.buildspeed = [lightgray]建造速度: {0}%
|
||||||
liquid.heatcapacity = [lightgray]熱容量:{0}
|
liquid.heatcapacity = [lightgray]熱容量:{0}
|
||||||
liquid.viscosity = [lightgray]粘性:{0}
|
liquid.viscosity = [lightgray]粘性:{0}
|
||||||
liquid.temperature = [lightgray]溫度:{0}
|
liquid.temperature = [lightgray]溫度:{0}
|
||||||
|
|
||||||
block.sand-boulder.name = 沙礫
|
block.sand-boulder.name = 沙礫
|
||||||
block.grass.name = 草
|
block.grass.name = 草
|
||||||
block.salt.name = 鹽
|
block.salt.name = 鹽
|
||||||
@@ -1048,7 +1051,7 @@ unit.reaper.name = 收掠者
|
|||||||
tutorial.next = [lightgray]<按下以繼續>
|
tutorial.next = [lightgray]<按下以繼續>
|
||||||
tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[WASD鍵]來移動.\n滾動滾輪來放大縮小畫面.\n從[accent]開採銅礦[]開始吧靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦
|
tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[WASD鍵]來移動.\n滾動滾輪來放大縮小畫面.\n從[accent]開採銅礦[]開始吧靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦
|
||||||
tutorial.intro.mobile = 您已進入[scarlet] Mindustry 教學。[]\n滑動螢幕即可移動。\n[accent]用兩指捏[]來縮放畫面。\n從[accent]開採銅礦[]開始吧。靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦
|
tutorial.intro.mobile = 您已進入[scarlet] Mindustry 教學。[]\n滑動螢幕即可移動。\n[accent]用兩指捏[]來縮放畫面。\n從[accent]開採銅礦[]開始吧。靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦
|
||||||
tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。
|
tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。\n不論在哪個選單,您也可以用快速按下按鍵[accent][[2][]然後[accent][[1][]來選擇鑽頭。\n[accent]滑鼠右擊[]停止建造。
|
||||||
tutorial.drill.mobile = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n點選右下角的鑽頭選項\n選擇[accent]機械鑽頭[].\n通過點擊將其放置在銅礦上,然後按下下方的[accent]確認標誌[]確認您的選擇\n按下[accent] X 按鈕[] 取消放置.
|
tutorial.drill.mobile = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n點選右下角的鑽頭選項\n選擇[accent]機械鑽頭[].\n通過點擊將其放置在銅礦上,然後按下下方的[accent]確認標誌[]確認您的選擇\n按下[accent] X 按鈕[] 取消放置.
|
||||||
tutorial.blockinfo = 每個方塊都有不同的屬性。每個鑽頭只能開採特定的礦石。\n查看方塊的資訊和屬性,[accent]在建造目錄時按下"?"鈕。[]\n\n[accent]立即訪問機械鑽頭的屬性資料。[]
|
tutorial.blockinfo = 每個方塊都有不同的屬性。每個鑽頭只能開採特定的礦石。\n查看方塊的資訊和屬性,[accent]在建造目錄時按下"?"鈕。[]\n\n[accent]立即訪問機械鑽頭的屬性資料。[]
|
||||||
tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶。
|
tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶。
|
||||||
@@ -1068,7 +1071,7 @@ tutorial.launch = 一旦您達到特定的波數, 您就可以[accent] 發射
|
|||||||
item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。
|
item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。
|
||||||
item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和液體運輸方塊。
|
item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和液體運輸方塊。
|
||||||
item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分配和存儲。
|
item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分配和存儲。
|
||||||
item.graphite.description = 礦化的碳,用於彈藥和電氣絕緣。
|
item.graphite.description = 礦化的碳,用於彈藥和電氣元件。
|
||||||
item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和作為助熔劑。
|
item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和作為助熔劑。
|
||||||
item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。
|
item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。
|
||||||
item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛行載具。
|
item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛行載具。
|
||||||
|
|||||||
@@ -84,3 +84,4 @@ amrsoll
|
|||||||
Draco
|
Draco
|
||||||
Quezler
|
Quezler
|
||||||
Alicila
|
Alicila
|
||||||
|
Daniel Dusek
|
||||||
|
|||||||
Binary file not shown.
@@ -16,4 +16,5 @@ const boolp = method => new Boolp(){get: method}
|
|||||||
const cons = method => new Cons(){get: method}
|
const cons = method => new Cons(){get: method}
|
||||||
const prov = method => new Prov(){get: method}
|
const prov = method => new Prov(){get: method}
|
||||||
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
|
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
|
||||||
const Calls = Packages.io.anuke.mindustry.gen.Call
|
Call = Packages.mindustry.gen.Call
|
||||||
|
const Calls = Call //backwards compat
|
||||||
@@ -18,12 +18,14 @@ const boolp = method => new Boolp(){get: method}
|
|||||||
const cons = method => new Cons(){get: method}
|
const cons = method => new Cons(){get: method}
|
||||||
const prov = method => new Prov(){get: method}
|
const prov = method => new Prov(){get: method}
|
||||||
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
|
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
|
||||||
const Calls = Packages.io.anuke.mindustry.gen.Call
|
Call = Packages.mindustry.gen.Call
|
||||||
|
const Calls = Call //backwards compat
|
||||||
importPackage(Packages.arc)
|
importPackage(Packages.arc)
|
||||||
importPackage(Packages.arc.func)
|
importPackage(Packages.arc.func)
|
||||||
importPackage(Packages.arc.graphics)
|
importPackage(Packages.arc.graphics)
|
||||||
importPackage(Packages.arc.graphics.g2d)
|
importPackage(Packages.arc.graphics.g2d)
|
||||||
importPackage(Packages.arc.math)
|
importPackage(Packages.arc.math)
|
||||||
|
importPackage(Packages.arc.math.geom)
|
||||||
importPackage(Packages.arc.scene)
|
importPackage(Packages.arc.scene)
|
||||||
importPackage(Packages.arc.scene.actions)
|
importPackage(Packages.arc.scene.actions)
|
||||||
importPackage(Packages.arc.scene.event)
|
importPackage(Packages.arc.scene.event)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import mindustry.gen.*;
|
|||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.mod.*;
|
import mindustry.mod.*;
|
||||||
|
import mindustry.net.*;
|
||||||
import mindustry.net.Net;
|
import mindustry.net.Net;
|
||||||
import mindustry.type.Weather.*;
|
import mindustry.type.Weather.*;
|
||||||
import mindustry.world.blocks.defense.ForceProjector.*;
|
import mindustry.world.blocks.defense.ForceProjector.*;
|
||||||
@@ -54,18 +55,16 @@ public class Vars implements Loadable{
|
|||||||
public static final String crashReportURL = "http://192.99.169.18/report";
|
public static final String crashReportURL = "http://192.99.169.18/report";
|
||||||
/** URL the links to the wiki's modding guide.*/
|
/** URL the links to the wiki's modding guide.*/
|
||||||
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/";
|
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/";
|
||||||
/** URL to the JSON file containing all the global, public servers. */
|
/** URL to the JSON file containing all the global, public servers. Not queried in BE. */
|
||||||
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
|
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
|
||||||
|
/** URL to the JSON file containing all the BE servers. Only queried in BE. */
|
||||||
|
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
|
||||||
/** URL the links to the wiki's modding guide.*/
|
/** URL the links to the wiki's modding guide.*/
|
||||||
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md";
|
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md";
|
||||||
/** list of built-in servers.*/
|
/** list of built-in servers.*/
|
||||||
public static final Array<String> defaultServers = Array.with();
|
public static final Array<String> defaultServers = Array.with();
|
||||||
/** maximum distance between mine and core that supports automatic transferring */
|
/** maximum distance between mine and core that supports automatic transferring */
|
||||||
public static final float mineTransferRange = 220f;
|
public static final float mineTransferRange = 220f;
|
||||||
/** team of the player by default */
|
|
||||||
public static final Team defaultTeam = Team.sharded;
|
|
||||||
/** team of the enemy in waves/sectors */
|
|
||||||
public static final Team waveTeam = Team.crux;
|
|
||||||
/** whether to enable editing of units in the editor */
|
/** whether to enable editing of units in the editor */
|
||||||
public static final boolean enableUnitEditing = false;
|
public static final boolean enableUnitEditing = false;
|
||||||
/** max chat message length */
|
/** max chat message length */
|
||||||
@@ -129,9 +128,9 @@ public class Vars implements Loadable{
|
|||||||
public static Fi dataDirectory;
|
public static Fi dataDirectory;
|
||||||
/** data subdirectory used for screenshots */
|
/** data subdirectory used for screenshots */
|
||||||
public static Fi screenshotDirectory;
|
public static Fi screenshotDirectory;
|
||||||
/** data subdirectory used for custom mmaps */
|
/** data subdirectory used for custom maps */
|
||||||
public static Fi customMapDirectory;
|
public static Fi customMapDirectory;
|
||||||
/** data subdirectory used for custom mmaps */
|
/** data subdirectory used for custom map previews */
|
||||||
public static Fi mapPreviewDirectory;
|
public static Fi mapPreviewDirectory;
|
||||||
/** tmp subdirectory for map conversion */
|
/** tmp subdirectory for map conversion */
|
||||||
public static Fi tmpDirectory;
|
public static Fi tmpDirectory;
|
||||||
@@ -141,6 +140,8 @@ public class Vars implements Loadable{
|
|||||||
public static Fi modDirectory;
|
public static Fi modDirectory;
|
||||||
/** data subdirectory used for schematics */
|
/** data subdirectory used for schematics */
|
||||||
public static Fi schematicDirectory;
|
public static Fi schematicDirectory;
|
||||||
|
/** data subdirectory used for bleeding edge build versions */
|
||||||
|
public static Fi bebuildDirectory;
|
||||||
/** map file extension */
|
/** map file extension */
|
||||||
public static final String mapExtension = "msav";
|
public static final String mapExtension = "msav";
|
||||||
/** save file extension */
|
/** save file extension */
|
||||||
@@ -162,6 +163,7 @@ public class Vars implements Loadable{
|
|||||||
public static Platform platform = new Platform(){};
|
public static Platform platform = new Platform(){};
|
||||||
public static Mods mods;
|
public static Mods mods;
|
||||||
public static Schematics schematics = new Schematics();
|
public static Schematics schematics = new Schematics();
|
||||||
|
public static BeControl becontrol;
|
||||||
|
|
||||||
public static World world;
|
public static World world;
|
||||||
public static Maps maps;
|
public static Maps maps;
|
||||||
@@ -186,7 +188,7 @@ public class Vars implements Loadable{
|
|||||||
public static EntityGroup<Puddle> puddleGroup;
|
public static EntityGroup<Puddle> puddleGroup;
|
||||||
public static EntityGroup<Fire> fireGroup;
|
public static EntityGroup<Fire> fireGroup;
|
||||||
public static EntityGroup<WeatherEntity> weatherGroup;
|
public static EntityGroup<WeatherEntity> weatherGroup;
|
||||||
public static EntityGroup<BaseUnit>[] unitGroups;
|
public static EntityGroup<BaseUnit> unitGroup;
|
||||||
|
|
||||||
public static Player player;
|
public static Player player;
|
||||||
|
|
||||||
@@ -226,6 +228,7 @@ public class Vars implements Loadable{
|
|||||||
defaultWaves = new DefaultWaves();
|
defaultWaves = new DefaultWaves();
|
||||||
collisions = new EntityCollisions();
|
collisions = new EntityCollisions();
|
||||||
world = new World();
|
world = new World();
|
||||||
|
becontrol = new BeControl();
|
||||||
|
|
||||||
maps = new Maps();
|
maps = new Maps();
|
||||||
spawner = new WaveSpawner();
|
spawner = new WaveSpawner();
|
||||||
@@ -241,12 +244,8 @@ public class Vars implements Loadable{
|
|||||||
puddleGroup = entities.add(Puddle.class).enableMapping();
|
puddleGroup = entities.add(Puddle.class).enableMapping();
|
||||||
shieldGroup = entities.add(ShieldEntity.class, false);
|
shieldGroup = entities.add(ShieldEntity.class, false);
|
||||||
fireGroup = entities.add(Fire.class).enableMapping();
|
fireGroup = entities.add(Fire.class).enableMapping();
|
||||||
|
unitGroup = entities.add(BaseUnit.class).enableMapping();
|
||||||
weatherGroup = entities.add(WeatherEntity.class);
|
weatherGroup = entities.add(WeatherEntity.class);
|
||||||
unitGroups = new EntityGroup[Team.all.length];
|
|
||||||
|
|
||||||
for(Team team : Team.all){
|
|
||||||
unitGroups[team.ordinal()] = entities.add(BaseUnit.class).enableMapping();
|
|
||||||
}
|
|
||||||
|
|
||||||
for(EntityGroup<?> group : entities.all()){
|
for(EntityGroup<?> group : entities.all()){
|
||||||
group.setRemoveListener(entity -> {
|
group.setRemoveListener(entity -> {
|
||||||
@@ -271,6 +270,7 @@ public class Vars implements Loadable{
|
|||||||
tmpDirectory = dataDirectory.child("tmp/");
|
tmpDirectory = dataDirectory.child("tmp/");
|
||||||
modDirectory = dataDirectory.child("mods/");
|
modDirectory = dataDirectory.child("mods/");
|
||||||
schematicDirectory = dataDirectory.child("schematics/");
|
schematicDirectory = dataDirectory.child("schematics/");
|
||||||
|
bebuildDirectory = dataDirectory.child("be_builds/");
|
||||||
|
|
||||||
modDirectory.mkdirs();
|
modDirectory.mkdirs();
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package mindustry.ai;
|
package mindustry.ai;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import arc.struct.*;
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.game.Teams.*;
|
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.*;
|
import mindustry.world.blocks.*;
|
||||||
@@ -28,15 +28,17 @@ public class BlockIndexer{
|
|||||||
private final ObjectSet<Item> itemSet = new ObjectSet<>();
|
private final ObjectSet<Item> itemSet = new ObjectSet<>();
|
||||||
/** Stores all ore quadtrants on the map. */
|
/** Stores all ore quadtrants on the map. */
|
||||||
private ObjectMap<Item, ObjectSet<Tile>> ores = new ObjectMap<>();
|
private ObjectMap<Item, ObjectSet<Tile>> ores = new ObjectMap<>();
|
||||||
/** Tags all quadrants. */
|
/** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */
|
||||||
private GridBits[] structQuadrants;
|
private GridBits[] structQuadrants;
|
||||||
/** Stores all damaged tile entities by team. */
|
/** Stores all damaged tile entities by team. */
|
||||||
private ObjectSet<Tile>[] damagedTiles = new ObjectSet[Team.all.length];
|
private ObjectSet<Tile>[] damagedTiles = new ObjectSet[Team.all().length];
|
||||||
/**All ores available on this map.*/
|
/**All ores available on this map.*/
|
||||||
private ObjectSet<Item> allOres = new ObjectSet<>();
|
private ObjectSet<Item> allOres = new ObjectSet<>();
|
||||||
|
/**Stores teams that are present here as tiles.*/
|
||||||
|
private ObjectSet<Team> activeTeams = new ObjectSet<>();
|
||||||
|
|
||||||
/** Maps teams to a map of flagged tiles by type. */
|
/** Maps teams to a map of flagged tiles by type. */
|
||||||
private ObjectSet<Tile>[][] flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length];
|
private ObjectSet<Tile>[][] flagMap = new ObjectSet[Team.all().length][BlockFlag.all.length];
|
||||||
/** Maps tile positions to their last known tile index data. */
|
/** Maps tile positions to their last known tile index data. */
|
||||||
private IntMap<TileIndex> typeMap = new IntMap<>();
|
private IntMap<TileIndex> typeMap = new IntMap<>();
|
||||||
/** Empty set used for returning. */
|
/** Empty set used for returning. */
|
||||||
@@ -59,8 +61,8 @@ public class BlockIndexer{
|
|||||||
Events.on(WorldLoadEvent.class, event -> {
|
Events.on(WorldLoadEvent.class, event -> {
|
||||||
scanOres.clear();
|
scanOres.clear();
|
||||||
scanOres.addAll(Item.getAllOres());
|
scanOres.addAll(Item.getAllOres());
|
||||||
damagedTiles = new ObjectSet[Team.all.length];
|
damagedTiles = new ObjectSet[Team.all().length];
|
||||||
flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length];
|
flagMap = new ObjectSet[Team.all().length][BlockFlag.all.length];
|
||||||
|
|
||||||
for(int i = 0; i < flagMap.length; i++){
|
for(int i = 0; i < flagMap.length; i++){
|
||||||
for(int j = 0; j < BlockFlag.all.length; j++){
|
for(int j = 0; j < BlockFlag.all.length; j++){
|
||||||
@@ -73,10 +75,7 @@ public class BlockIndexer{
|
|||||||
ores = null;
|
ores = null;
|
||||||
|
|
||||||
//create bitset for each team type that contains each quadrant
|
//create bitset for each team type that contains each quadrant
|
||||||
structQuadrants = new GridBits[Team.all.length];
|
structQuadrants = new GridBits[Team.all().length];
|
||||||
for(int i = 0; i < Team.all.length; i++){
|
|
||||||
structQuadrants[i] = new GridBits(Mathf.ceil(world.width() / (float)quadrantSize), Mathf.ceil(world.height() / (float)quadrantSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int x = 0; x < world.width(); x++){
|
for(int x = 0; x < world.width(); x++){
|
||||||
for(int y = 0; y < world.height(); y++){
|
for(int y = 0; y < world.height(); y++){
|
||||||
@@ -103,7 +102,32 @@ public class BlockIndexer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ObjectSet<Tile>[] getFlagged(Team team){
|
private ObjectSet<Tile>[] getFlagged(Team team){
|
||||||
return flagMap[team.ordinal()];
|
return flagMap[team.id];
|
||||||
|
}
|
||||||
|
|
||||||
|
private GridBits structQuadrant(Team t){
|
||||||
|
int id = Pack.u(t.id);
|
||||||
|
if(structQuadrants[id] == null){
|
||||||
|
structQuadrants[id] = new GridBits(Mathf.ceil(world.width() / (float)quadrantSize), Mathf.ceil(world.height() / (float)quadrantSize));
|
||||||
|
}
|
||||||
|
return structQuadrants[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Updates all the structure quadrants for a newly activated team. */
|
||||||
|
public void updateTeamIndex(Team team){
|
||||||
|
if(structQuadrants == null) return;
|
||||||
|
|
||||||
|
//go through every tile... ouch
|
||||||
|
for(int x = 0; x < world.width(); x++){
|
||||||
|
for(int y = 0; y < world.height(); y++){
|
||||||
|
Tile tile = world.tile(x, y);
|
||||||
|
if(tile.getTeam() == team){
|
||||||
|
int quadrantX = tile.x / quadrantSize;
|
||||||
|
int quadrantY = tile.y / quadrantSize;
|
||||||
|
structQuadrant(team).set(quadrantX, quadrantY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return whether this item is present on this map.*/
|
/** @return whether this item is present on this map.*/
|
||||||
@@ -115,11 +139,11 @@ public class BlockIndexer{
|
|||||||
public ObjectSet<Tile> getDamaged(Team team){
|
public ObjectSet<Tile> getDamaged(Team team){
|
||||||
returnArray.clear();
|
returnArray.clear();
|
||||||
|
|
||||||
if(damagedTiles[team.ordinal()] == null){
|
if(damagedTiles[team.id] == null){
|
||||||
damagedTiles[team.ordinal()] = new ObjectSet<>();
|
damagedTiles[team.id] = new ObjectSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectSet<Tile> set = damagedTiles[team.ordinal()];
|
ObjectSet<Tile> set = damagedTiles[team.id];
|
||||||
for(Tile tile : set){
|
for(Tile tile : set){
|
||||||
if((tile.entity == null || tile.entity.getTeam() != team || !tile.entity.damaged()) || tile.block() instanceof BuildBlock){
|
if((tile.entity == null || tile.entity.getTeam() != team || !tile.entity.damaged()) || tile.block() instanceof BuildBlock){
|
||||||
returnArray.add(tile);
|
returnArray.add(tile);
|
||||||
@@ -135,13 +159,13 @@ public class BlockIndexer{
|
|||||||
|
|
||||||
/** Get all allied blocks with a flag. */
|
/** Get all allied blocks with a flag. */
|
||||||
public ObjectSet<Tile> getAllied(Team team, BlockFlag type){
|
public ObjectSet<Tile> getAllied(Team team, BlockFlag type){
|
||||||
return flagMap[team.ordinal()][type.ordinal()];
|
return flagMap[team.id][type.ordinal()];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get all enemy blocks with a flag. */
|
/** Get all enemy blocks with a flag. */
|
||||||
public Array<Tile> getEnemy(Team team, BlockFlag type){
|
public Array<Tile> getEnemy(Team team, BlockFlag type){
|
||||||
returnArray.clear();
|
returnArray.clear();
|
||||||
for(Team enemy : state.teams.enemiesOf(team)){
|
for(Team enemy : team.enemies()){
|
||||||
if(state.teams.isActive(enemy)){
|
if(state.teams.isActive(enemy)){
|
||||||
ObjectSet<Tile> set = getFlagged(enemy)[type.ordinal()];
|
ObjectSet<Tile> set = getFlagged(enemy)[type.ordinal()];
|
||||||
if(set != null){
|
if(set != null){
|
||||||
@@ -155,14 +179,27 @@ public class BlockIndexer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void notifyTileDamaged(TileEntity entity){
|
public void notifyTileDamaged(TileEntity entity){
|
||||||
if(damagedTiles[entity.getTeam().ordinal()] == null){
|
if(damagedTiles[(int)entity.getTeam().id] == null){
|
||||||
damagedTiles[entity.getTeam().ordinal()] = new ObjectSet<>();
|
damagedTiles[(int)entity.getTeam().id] = new ObjectSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectSet<Tile> set = damagedTiles[entity.getTeam().ordinal()];
|
ObjectSet<Tile> set = damagedTiles[(int)entity.getTeam().id];
|
||||||
set.add(entity.tile);
|
set.add(entity.tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TileEntity findEnemyTile(Team team, float x, float y, float range, Boolf<Tile> pred){
|
||||||
|
for(Team enemy : activeTeams){
|
||||||
|
if(!team.isEnemy(enemy)) continue;
|
||||||
|
|
||||||
|
TileEntity entity = indexer.findTile(enemy, x, y, range, pred, true);
|
||||||
|
if(entity != null){
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public TileEntity findTile(Team team, float x, float y, float range, Boolf<Tile> pred){
|
public TileEntity findTile(Team team, float x, float y, float range, Boolf<Tile> pred){
|
||||||
return findTile(team, x, y, range, pred, false);
|
return findTile(team, x, y, range, pred, false);
|
||||||
}
|
}
|
||||||
@@ -188,7 +225,7 @@ public class BlockIndexer{
|
|||||||
TileEntity e = other.entity;
|
TileEntity e = other.entity;
|
||||||
|
|
||||||
float ndst = Mathf.dst(x, y, e.x, e.y);
|
float ndst = Mathf.dst(x, y, e.x, e.y);
|
||||||
if(ndst < range && (closest == null || ndst < dst || (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
|
if(ndst < range && (closest == null || ndst < dst || (usePriority && closest.block.priority.ordinal() <= e.block.priority.ordinal()))){
|
||||||
dst = ndst;
|
dst = ndst;
|
||||||
closest = e;
|
closest = e;
|
||||||
}
|
}
|
||||||
@@ -242,6 +279,7 @@ public class BlockIndexer{
|
|||||||
}
|
}
|
||||||
typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.getTeam()));
|
typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.getTeam()));
|
||||||
}
|
}
|
||||||
|
activeTeams.add(tile.getTeam());
|
||||||
|
|
||||||
if(ores == null) return;
|
if(ores == null) return;
|
||||||
|
|
||||||
@@ -280,26 +318,25 @@ public class BlockIndexer{
|
|||||||
//this quadrant is now 'dirty', re-scan the whole thing
|
//this quadrant is now 'dirty', re-scan the whole thing
|
||||||
int quadrantX = tile.x / quadrantSize;
|
int quadrantX = tile.x / quadrantSize;
|
||||||
int quadrantY = tile.y / quadrantSize;
|
int quadrantY = tile.y / quadrantSize;
|
||||||
int index = quadrantX + quadrantY * quadWidth();
|
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : activeTeams){
|
||||||
TeamData data = state.teams.get(team);
|
GridBits bits = structQuadrant(team);
|
||||||
|
|
||||||
//fast-set this quadrant to 'occupied' if the tile just placed is already of this team
|
//fast-set this quadrant to 'occupied' if the tile just placed is already of this team
|
||||||
if(tile.getTeam() == data.team && tile.entity != null && tile.block().targetable){
|
if(tile.getTeam() == team && tile.entity != null && tile.block().targetable){
|
||||||
structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY);
|
bits.set(quadrantX, quadrantY);
|
||||||
continue; //no need to process futher
|
continue; //no need to process futher
|
||||||
}
|
}
|
||||||
|
|
||||||
structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY, false);
|
bits.set(quadrantX, quadrantY, false);
|
||||||
|
|
||||||
outer:
|
outer:
|
||||||
for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){
|
for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){
|
||||||
for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){
|
for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){
|
||||||
Tile result = world.ltile(x, y);
|
Tile result = world.ltile(x, y);
|
||||||
//when a targetable block is found, mark this quadrant as occupied and stop searching
|
//when a targetable block is found, mark this quadrant as occupied and stop searching
|
||||||
if(result.entity != null && result.getTeam() == data.team){
|
if(result.entity != null && result.getTeam() == team){
|
||||||
structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY);
|
bits.set(quadrantX, quadrantY);
|
||||||
break outer;
|
break outer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,7 +345,7 @@ public class BlockIndexer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean getQuad(Team team, int quadrantX, int quadrantY){
|
private boolean getQuad(Team team, int quadrantX, int quadrantY){
|
||||||
return structQuadrants[team.ordinal()].get(quadrantX, quadrantY);
|
return structQuadrant(team).get(quadrantX, quadrantY);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int quadWidth(){
|
private int quadWidth(){
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ public class Pathfinder implements Runnable{
|
|||||||
/** unordered array of path data for iteration only. DO NOT iterate ot access this in the main thread.*/
|
/** unordered array of path data for iteration only. DO NOT iterate ot access this in the main thread.*/
|
||||||
private Array<PathData> list = new Array<>();
|
private Array<PathData> list = new Array<>();
|
||||||
/** Maps teams + flags to a valid path to get to that flag for that team. */
|
/** Maps teams + flags to a valid path to get to that flag for that team. */
|
||||||
private PathData[][] pathMap = new PathData[Team.all.length][PathTarget.all.length];
|
private PathData[][] pathMap = new PathData[Team.all().length][PathTarget.all.length];
|
||||||
/** Grid map of created path data that should not be queued again. */
|
/** Grid map of created path data that should not be queued again. */
|
||||||
private GridBits created = new GridBits(Team.all.length, PathTarget.all.length);
|
private GridBits created = new GridBits(Team.all().length, PathTarget.all.length);
|
||||||
/** handles task scheduling on the update thread. */
|
/** handles task scheduling on the update thread. */
|
||||||
private TaskQueue queue = new TaskQueue();
|
private TaskQueue queue = new TaskQueue();
|
||||||
/** current pathfinding thread */
|
/** current pathfinding thread */
|
||||||
@@ -42,8 +42,8 @@ public class Pathfinder implements Runnable{
|
|||||||
|
|
||||||
//reset and update internal tile array
|
//reset and update internal tile array
|
||||||
tiles = new int[world.width()][world.height()];
|
tiles = new int[world.width()][world.height()];
|
||||||
pathMap = new PathData[Team.all.length][PathTarget.all.length];
|
pathMap = new PathData[Team.all().length][PathTarget.all.length];
|
||||||
created = new GridBits(Team.all.length, PathTarget.all.length);
|
created = new GridBits(Team.all().length, PathTarget.all.length);
|
||||||
list = new Array<>();
|
list = new Array<>();
|
||||||
|
|
||||||
for(int x = 0; x < world.width(); x++){
|
for(int x = 0; x < world.width(); x++){
|
||||||
@@ -53,7 +53,7 @@ public class Pathfinder implements Runnable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//special preset which may help speed things up; this is optional
|
//special preset which may help speed things up; this is optional
|
||||||
preloadPath(waveTeam, PathTarget.enemyCores);
|
preloadPath(state.rules.waveTeam, PathTarget.enemyCores);
|
||||||
|
|
||||||
start();
|
start();
|
||||||
});
|
});
|
||||||
@@ -84,8 +84,8 @@ public class Pathfinder implements Runnable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int debugValue(Team team, int x, int y){
|
public int debugValue(Team team, int x, int y){
|
||||||
if(pathMap[team.ordinal()][PathTarget.enemyCores.ordinal()] == null) return 0;
|
if(pathMap[team.id][PathTarget.enemyCores.ordinal()] == null) return 0;
|
||||||
return pathMap[team.ordinal()][PathTarget.enemyCores.ordinal()].weights[x][y];
|
return pathMap[team.id][PathTarget.enemyCores.ordinal()].weights[x][y];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Update a tile in the internal pathfinding grid. Causes a complete pathfinding reclaculation. */
|
/** Update a tile in the internal pathfinding grid. Causes a complete pathfinding reclaculation. */
|
||||||
@@ -139,7 +139,7 @@ public class Pathfinder implements Runnable{
|
|||||||
//stop looping when interrupted externally
|
//stop looping when interrupted externally
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}catch(Exception e){
|
}catch(Throwable e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -149,12 +149,12 @@ public class Pathfinder implements Runnable{
|
|||||||
public Tile getTargetTile(Tile tile, Team team, PathTarget target){
|
public Tile getTargetTile(Tile tile, Team team, PathTarget target){
|
||||||
if(tile == null) return null;
|
if(tile == null) return null;
|
||||||
|
|
||||||
PathData data = pathMap[team.ordinal()][target.ordinal()];
|
PathData data = pathMap[team.id][target.ordinal()];
|
||||||
|
|
||||||
if(data == null){
|
if(data == null){
|
||||||
//if this combination is not found, create it on request
|
//if this combination is not found, create it on request
|
||||||
if(!created.get(team.ordinal(), target.ordinal())){
|
if(!created.get(team.id, target.ordinal())){
|
||||||
created.set(team.ordinal(), target.ordinal());
|
created.set(team.id, target.ordinal());
|
||||||
//grab targets since this is run on main thread
|
//grab targets since this is run on main thread
|
||||||
IntArray targets = target.getTargets(team, new IntArray());
|
IntArray targets = target.getTargets(team, new IntArray());
|
||||||
queue.post(() -> createPath(team, target, targets));
|
queue.post(() -> createPath(team, target, targets));
|
||||||
@@ -188,7 +188,7 @@ public class Pathfinder implements Runnable{
|
|||||||
/** @return whether a tile can be passed through by this team. Pathfinding thread only.*/
|
/** @return whether a tile can be passed through by this team. Pathfinding thread only.*/
|
||||||
private boolean passable(int x, int y, Team team){
|
private boolean passable(int x, int y, Team team){
|
||||||
int tile = tiles[x][y];
|
int tile = tiles[x][y];
|
||||||
return PathTile.passable(tile) || (PathTile.team(tile) != team.ordinal() && PathTile.team(tile) != Team.derelict.ordinal());
|
return PathTile.passable(tile) || (PathTile.team(tile) != team.id && PathTile.team(tile) != (int)Team.derelict.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -238,7 +238,7 @@ public class Pathfinder implements Runnable{
|
|||||||
PathData path = new PathData(team, target, world.width(), world.height());
|
PathData path = new PathData(team, target, world.width(), world.height());
|
||||||
|
|
||||||
list.add(path);
|
list.add(path);
|
||||||
pathMap[team.ordinal()][target.ordinal()] = path;
|
pathMap[team.id][target.ordinal()] = path;
|
||||||
|
|
||||||
//grab targets from passed array
|
//grab targets from passed array
|
||||||
synchronized(path.targets){
|
synchronized(path.targets){
|
||||||
@@ -303,7 +303,7 @@ public class Pathfinder implements Runnable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//spawn points are also enemies.
|
//spawn points are also enemies.
|
||||||
if(state.rules.waves && team == defaultTeam){
|
if(state.rules.waves && team == state.rules.defaultTeam){
|
||||||
for(Tile other : spawner.getGroundSpawns()){
|
for(Tile other : spawner.getGroundSpawns()){
|
||||||
out.add(other.pos());
|
out.add(other.pos());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import mindustry.content.Blocks;
|
|||||||
import mindustry.content.Fx;
|
import mindustry.content.Fx;
|
||||||
import mindustry.entities.Damage;
|
import mindustry.entities.Damage;
|
||||||
import mindustry.entities.Effects;
|
import mindustry.entities.Effects;
|
||||||
import mindustry.entities.type.BaseUnit;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.EventType.WorldLoadEvent;
|
import mindustry.game.EventType.WorldLoadEvent;
|
||||||
import mindustry.game.SpawnGroup;
|
import mindustry.game.SpawnGroup;
|
||||||
import mindustry.world.Tile;
|
import mindustry.world.Tile;
|
||||||
@@ -53,7 +53,7 @@ public class WaveSpawner{
|
|||||||
|
|
||||||
eachFlyerSpawn((spawnX, spawnY) -> {
|
eachFlyerSpawn((spawnX, spawnY) -> {
|
||||||
for(int i = 0; i < spawned; i++){
|
for(int i = 0; i < spawned; i++){
|
||||||
BaseUnit unit = group.createUnit(waveTeam);
|
BaseUnit unit = group.createUnit(state.rules.waveTeam);
|
||||||
unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread));
|
unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread));
|
||||||
unit.add();
|
unit.add();
|
||||||
}
|
}
|
||||||
@@ -66,7 +66,7 @@ public class WaveSpawner{
|
|||||||
for(int i = 0; i < spawned; i++){
|
for(int i = 0; i < spawned; i++){
|
||||||
Tmp.v1.rnd(spread);
|
Tmp.v1.rnd(spread);
|
||||||
|
|
||||||
BaseUnit unit = group.createUnit(waveTeam);
|
BaseUnit unit = group.createUnit(state.rules.waveTeam);
|
||||||
unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y);
|
unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y);
|
||||||
|
|
||||||
Time.run(Math.min(i * 5, 60 * 2), () -> spawnEffect(unit));
|
Time.run(Math.min(i * 5, 60 * 2), () -> spawnEffect(unit));
|
||||||
@@ -78,7 +78,7 @@ public class WaveSpawner{
|
|||||||
eachGroundSpawn((spawnX, spawnY, doShockwave) -> {
|
eachGroundSpawn((spawnX, spawnY, doShockwave) -> {
|
||||||
if(doShockwave){
|
if(doShockwave){
|
||||||
Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawnX, spawnY, state.rules.dropZoneRadius));
|
Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawnX, spawnY, state.rules.dropZoneRadius));
|
||||||
Time.run(40f, () -> Damage.damage(waveTeam, spawnX, spawnY, state.rules.dropZoneRadius, 99999999f, true));
|
Time.run(40f, () -> Damage.damage(state.rules.waveTeam, spawnX, spawnY, state.rules.dropZoneRadius, 99999999f, true));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -90,11 +90,11 @@ public class WaveSpawner{
|
|||||||
cons.accept(spawn.worldx(), spawn.worldy(), true);
|
cons.accept(spawn.worldx(), spawn.worldy(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.rules.attackMode && state.teams.isActive(waveTeam) && !state.teams.get(defaultTeam).cores.isEmpty()){
|
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){
|
||||||
Tile firstCore = state.teams.get(defaultTeam).cores.first();
|
TileEntity firstCore = state.teams.playerCores().first();
|
||||||
for(Tile core : state.teams.get(waveTeam).cores){
|
for(TileEntity core : state.rules.waveTeam.cores()){
|
||||||
Tmp.v1.set(firstCore).sub(core.worldx(), core.worldy()).limit(coreMargin + core.block().size*tilesize);
|
Tmp.v1.set(firstCore).sub(core.x, core.y).limit(coreMargin + core.block.size*tilesize);
|
||||||
cons.accept(core.worldx() + Tmp.v1.x, core.worldy() + Tmp.v1.y, false);
|
cons.accept(core.x + Tmp.v1.x, core.y + Tmp.v1.y, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -107,9 +107,9 @@ public class WaveSpawner{
|
|||||||
cons.get(spawnX, spawnY);
|
cons.get(spawnX, spawnY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.rules.attackMode && state.teams.isActive(waveTeam)){
|
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){
|
||||||
for(Tile core : state.teams.get(waveTeam).cores){
|
for(TileEntity core : state.teams.get(state.rules.waveTeam).cores){
|
||||||
cons.get(core.worldx(), core.worldy());
|
cons.get(core.x, core.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -909,10 +909,11 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
junction = new Junction("junction"){{
|
junction = new Junction("junction"){{
|
||||||
requirements(Category.distribution, ItemStack.with(Items.copper, 1), true);
|
requirements(Category.distribution, ItemStack.with(Items.copper, 2), true);
|
||||||
speed = 26;
|
speed = 26;
|
||||||
capacity = 12;
|
capacity = 12;
|
||||||
health = 30;
|
health = 30;
|
||||||
|
buildCostMultiplier = 6f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
itemBridge = new BufferedItemBridge("bridge-conveyor"){{
|
itemBridge = new BufferedItemBridge("bridge-conveyor"){{
|
||||||
@@ -932,16 +933,18 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
sorter = new Sorter("sorter"){{
|
sorter = new Sorter("sorter"){{
|
||||||
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
||||||
|
buildCostMultiplier = 3f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
invertedSorter = new Sorter("inverted-sorter"){{
|
invertedSorter = new Sorter("inverted-sorter"){{
|
||||||
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
||||||
|
buildCostMultiplier = 3f;
|
||||||
invert = true;
|
invert = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
router = new Router("router"){{
|
router = new Router("router"){{
|
||||||
requirements(Category.distribution, ItemStack.with(Items.copper, 3));
|
requirements(Category.distribution, ItemStack.with(Items.copper, 3));
|
||||||
|
buildCostMultiplier = 2f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
distributor = new Router("distributor"){{
|
distributor = new Router("distributor"){{
|
||||||
@@ -951,6 +954,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
overflowGate = new OverflowGate("overflow-gate"){{
|
overflowGate = new OverflowGate("overflow-gate"){{
|
||||||
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 4));
|
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 4));
|
||||||
|
buildCostMultiplier = 3f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
massDriver = new MassDriver("mass-driver"){{
|
massDriver = new MassDriver("mass-driver"){{
|
||||||
@@ -1245,7 +1249,7 @@ public class Blocks implements ContentList{
|
|||||||
//region storage
|
//region storage
|
||||||
|
|
||||||
coreShard = new CoreBlock("core-shard"){{
|
coreShard = new CoreBlock("core-shard"){{
|
||||||
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000));
|
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with());
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
|
|
||||||
health = 1100;
|
health = 1100;
|
||||||
@@ -1254,7 +1258,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
coreFoundation = new CoreBlock("core-foundation"){{
|
coreFoundation = new CoreBlock("core-foundation"){{
|
||||||
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 400, Items.silicon, 3000));
|
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with());
|
||||||
|
|
||||||
health = 2000;
|
health = 2000;
|
||||||
itemCapacity = 9000;
|
itemCapacity = 9000;
|
||||||
@@ -1262,7 +1266,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
coreNucleus = new CoreBlock("core-nucleus"){{
|
coreNucleus = new CoreBlock("core-nucleus"){{
|
||||||
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 3000));
|
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with());
|
||||||
|
|
||||||
health = 4000;
|
health = 4000;
|
||||||
itemCapacity = 13000;
|
itemCapacity = 13000;
|
||||||
@@ -1399,15 +1403,6 @@ public class Blocks implements ContentList{
|
|||||||
range = 110f;
|
range = 110f;
|
||||||
health = 250 * size * size;
|
health = 250 * size * size;
|
||||||
shootSound = Sounds.splash;
|
shootSound = Sounds.splash;
|
||||||
|
|
||||||
drawer = (tile, entity) -> {
|
|
||||||
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
|
||||||
|
|
||||||
Draw.color(entity.liquids.current().color);
|
|
||||||
Draw.alpha(entity.liquids.total() / liquidCapacity);
|
|
||||||
Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
|
||||||
Draw.color();
|
|
||||||
};
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
lancer = new ChargeTurret("lancer"){{
|
lancer = new ChargeTurret("lancer"){{
|
||||||
|
|||||||
@@ -1079,6 +1079,7 @@ public class Fx implements ContentList{
|
|||||||
healBlockFull = new Effect(20, e -> {
|
healBlockFull = new Effect(20, e -> {
|
||||||
Draw.color(e.color);
|
Draw.color(e.color);
|
||||||
Draw.alpha(e.fout());
|
Draw.alpha(e.fout());
|
||||||
|
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
|
||||||
});
|
});
|
||||||
|
|
||||||
overdriveBlockFull = new Effect(60, e -> {
|
overdriveBlockFull = new Effect(60, e -> {
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package mindustry.content;
|
|||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
|
|
||||||
public class Loadouts implements ContentList{
|
public class Loadouts implements ContentList{
|
||||||
public static Schematic
|
public static Schematic
|
||||||
basicShard,
|
basicShard,
|
||||||
@@ -14,13 +12,9 @@ public class Loadouts implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
try{
|
|
||||||
basicShard = Schematics.readBase64("bXNjaAB4nD2K2wqAIBiD5ymibnoRn6YnEP1BwUMoBL19FuJ2sbFvUFgYZDaJsLeQrkinN9UJHImsNzlYE7WrIUastuSbnlKx2VJJt+8IQGGKdfO/8J5yrGJSMegLg+YUIA==");
|
basicShard = Schematics.readBase64("bXNjaAB4nD2K2wqAIBiD5ymibnoRn6YnEP1BwUMoBL19FuJ2sbFvUFgYZDaJsLeQrkinN9UJHImsNzlYE7WrIUastuSbnlKx2VJJt+8IQGGKdfO/8J5yrGJSMegLg+YUIA==");
|
||||||
advancedShard = Schematics.readBase64("bXNjaAB4nD2LjQqAIAyET7OMIOhFfJqeYMxBgSkYCL199gu33fFtB4tOwUTaBCP5QpHFzwtl32DahBeKK1NwPq8hoOcUixwpY+CUxe3XIwBbB/pa6tadVCUP02hgHvp5vZq/0b7pBHPYFOQ=");
|
advancedShard = Schematics.readBase64("bXNjaAB4nD2LjQqAIAyET7OMIOhFfJqeYMxBgSkYCL199gu33fFtB4tOwUTaBCP5QpHFzwtl32DahBeKK1NwPq8hoOcUixwpY+CUxe3XIwBbB/pa6tadVCUP02hgHvp5vZq/0b7pBHPYFOQ=");
|
||||||
basicFoundation = Schematics.readBase64("bXNjaAB4nD1OSQ6DMBBzFhVu8BG+0X8MQyoiJTNSukj8nlCi2Adbtg/GA4OBF8oB00rvyE/9ykafqOIw58A7SWRKy1ZiShhZ5RcOLZhYS1hefQ1gRIeptH9jq/qW2lvc1d2tgWsOfVX/tOwE86AYBA==");
|
basicFoundation = Schematics.readBase64("bXNjaAB4nD1OSQ6DMBBzFhVu8BG+0X8MQyoiJTNSukj8nlCi2Adbtg/GA4OBF8oB00rvyE/9ykafqOIw58A7SWRKy1ZiShhZ5RcOLZhYS1hefQ1gRIeptH9jq/qW2lvc1d2tgWsOfVX/tOwE86AYBA==");
|
||||||
basicNucleus = Schematics.readBase64("bXNjaAB4nD2MUQqAIBBEJy0s6qOLdJXuYNtCgikYBd2+LNmdj308hkGHtkId7M4YFns4mk/yfB4a48602eDI+mlNznu0FMPFd0wYKCaewl8F0EOueqM+yKSLVfJrNKWnSw/FZGzEGXFG9sy/px4gEBW1");
|
basicNucleus = Schematics.readBase64("bXNjaAB4nD2MUQqAIBBEJy0s6qOLdJXuYNtCgikYBd2+LNmdj308hkGHtkId7M4YFns4mk/yfB4a48602eDI+mlNznu0FMPFd0wYKCaewl8F0EOueqM+yKSLVfJrNKWnSw/FZGzEGXFG9sy/px4gEBW1");
|
||||||
}catch(IOException e){
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ import mindustry.entities.Effects;
|
|||||||
import mindustry.ctype.ContentList;
|
import mindustry.ctype.ContentList;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.type.StatusEffect;
|
import mindustry.type.StatusEffect;
|
||||||
|
import static mindustry.Vars.*;
|
||||||
import static mindustry.Vars.waveTeam;
|
|
||||||
|
|
||||||
public class StatusEffects implements ContentList{
|
public class StatusEffects implements ContentList{
|
||||||
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss;
|
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss;
|
||||||
@@ -48,7 +47,7 @@ public class StatusEffects implements ContentList{
|
|||||||
init(() -> {
|
init(() -> {
|
||||||
trans(shocked, ((unit, time, newTime, result) -> {
|
trans(shocked, ((unit, time, newTime, result) -> {
|
||||||
unit.damage(20f);
|
unit.damage(20f);
|
||||||
if(unit.getTeam() == waveTeam){
|
if(unit.getTeam() == state.rules.waveTeam){
|
||||||
Events.fire(Trigger.shock);
|
Events.fire(Trigger.shock);
|
||||||
}
|
}
|
||||||
result.set(this, time);
|
result.set(this, time);
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Events.on(PlayEvent.class, event -> {
|
Events.on(PlayEvent.class, event -> {
|
||||||
player.setTeam(state.rules.pvp ? netServer.assignTeam(player, playerGroup.all()) : defaultTeam);
|
player.setTeam(netServer.assignTeam(player, playerGroup.all()));
|
||||||
player.setDead(true);
|
player.setDead(true);
|
||||||
player.add();
|
player.add();
|
||||||
|
|
||||||
@@ -256,9 +256,9 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
world.loadGenerator(zone.generator);
|
world.loadGenerator(zone.generator);
|
||||||
zone.rules.get(state.rules);
|
zone.rules.get(state.rules);
|
||||||
state.rules.zone = zone;
|
state.rules.zone = zone;
|
||||||
for(Tile core : state.teams.get(defaultTeam).cores){
|
for(TileEntity core : state.teams.playerCores()){
|
||||||
for(ItemStack stack : zone.getStartingItems()){
|
for(ItemStack stack : zone.getStartingItems()){
|
||||||
core.entity.items.add(stack.item, stack.amount);
|
core.items.add(stack.item, stack.amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state.set(State.playing);
|
state.set(State.playing);
|
||||||
@@ -294,8 +294,8 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
Geometry.circle(coreb.x, coreb.y, 10, (cx, cy) -> {
|
Geometry.circle(coreb.x, coreb.y, 10, (cx, cy) -> {
|
||||||
Tile tile = world.ltile(cx, cy);
|
Tile tile = world.ltile(cx, cy);
|
||||||
if(tile != null && tile.getTeam() == defaultTeam && !(tile.block() instanceof CoreBlock)){
|
if(tile != null && tile.getTeam() == state.rules.defaultTeam && !(tile.block() instanceof CoreBlock)){
|
||||||
world.removeBlock(tile);
|
tile.remove();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -305,13 +305,13 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
zone.rules.get(state.rules);
|
zone.rules.get(state.rules);
|
||||||
state.rules.zone = zone;
|
state.rules.zone = zone;
|
||||||
for(Tile core : state.teams.get(defaultTeam).cores){
|
for(TileEntity core : state.teams.playerCores()){
|
||||||
for(ItemStack stack : zone.getStartingItems()){
|
for(ItemStack stack : zone.getStartingItems()){
|
||||||
core.entity.items.add(stack.item, stack.amount);
|
core.items.add(stack.item, stack.amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Tile core = state.teams.get(defaultTeam).cores.first();
|
TileEntity core = state.teams.playerCores().first();
|
||||||
core.entity.items.clear();
|
core.items.clear();
|
||||||
|
|
||||||
logic.play();
|
logic.play();
|
||||||
state.rules.waveTimer = false;
|
state.rules.waveTimer = false;
|
||||||
@@ -434,9 +434,9 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
input.update();
|
input.update();
|
||||||
|
|
||||||
if(world.isZone()){
|
if(world.isZone()){
|
||||||
for(Tile tile : state.teams.get(player.getTeam()).cores){
|
for(TileEntity tile : state.teams.cores(player.getTeam())){
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
if(tile.entity != null && tile.entity.items.has(item)){
|
if(tile.items.has(item)){
|
||||||
data.unlockContent(item);
|
data.unlockContent(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -456,7 +456,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
state.set(state.is(State.playing) ? State.paused : State.playing);
|
state.set(state.is(State.playing) ? State.paused : State.playing);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown()){
|
if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown() && !ui.minimapfrag.shown()){
|
||||||
if(ui.chatfrag.shown()){
|
if(ui.chatfrag.shown()){
|
||||||
ui.chatfrag.hide();
|
ui.chatfrag.hide();
|
||||||
}else if(!ui.paused.isShown() && !scene.hasDialog()){
|
}else if(!ui.paused.isShown() && !scene.hasDialog()){
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package mindustry.core;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.entities.type.base.*;
|
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
|
||||||
@@ -26,12 +25,8 @@ public class GameState{
|
|||||||
/** Current game state. */
|
/** Current game state. */
|
||||||
private State state = State.menu;
|
private State state = State.menu;
|
||||||
|
|
||||||
public int enemies(){
|
|
||||||
return net.client() ? enemies : unitGroups[waveTeam.ordinal()].count(b -> !(b instanceof BaseDrone));
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseUnit boss(){
|
public BaseUnit boss(){
|
||||||
return unitGroups[waveTeam.ordinal()].find(BaseUnit::isBoss);
|
return unitGroup.find(u -> u.isBoss() && u.getTeam() == rules.waveTeam);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set(State astate){
|
public void set(State astate){
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package mindustry.core;
|
package mindustry.core;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.core.GameState.*;
|
import mindustry.core.GameState.*;
|
||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
@@ -47,8 +47,8 @@ public class Logic implements ApplicationListener{
|
|||||||
//blocks that get broken are appended to the team's broken block queue
|
//blocks that get broken are appended to the team's broken block queue
|
||||||
Tile tile = event.tile;
|
Tile tile = event.tile;
|
||||||
Block block = tile.block();
|
Block block = tile.block();
|
||||||
//skip null entities or nukes, for obvious reasons
|
//skip null entities or nukes, for obvious reasons; also skip client since they can't modify these requests
|
||||||
if(tile.entity == null || tile.block() instanceof NuclearReactor) return;
|
if(tile.entity == null || tile.block() instanceof NuclearReactor || net.client()) return;
|
||||||
|
|
||||||
if(block instanceof BuildBlock){
|
if(block instanceof BuildBlock){
|
||||||
|
|
||||||
@@ -107,9 +107,9 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
//add starting items
|
//add starting items
|
||||||
if(!world.isZone()){
|
if(!world.isZone()){
|
||||||
for(Team team : Team.all){
|
for(TeamData team : state.teams.getActive()){
|
||||||
if(!state.teams.get(team).cores.isEmpty()){
|
if(team.hasCore()){
|
||||||
TileEntity entity = state.teams.get(team).cores.first().entity;
|
TileEntity entity = team.core();
|
||||||
entity.items.clear();
|
entity.items.clear();
|
||||||
for(ItemStack stack : state.rules.loadout){
|
for(ItemStack stack : state.rules.loadout){
|
||||||
entity.items.add(stack.item, stack.amount);
|
entity.items.add(stack.item, stack.amount);
|
||||||
@@ -143,23 +143,23 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkGameOver(){
|
private void checkGameOver(){
|
||||||
if(!state.rules.attackMode && state.teams.get(defaultTeam).cores.size == 0 && !state.gameOver){
|
if(!state.rules.attackMode && state.teams.playerCores().size == 0 && !state.gameOver){
|
||||||
state.gameOver = true;
|
state.gameOver = true;
|
||||||
Events.fire(new GameOverEvent(waveTeam));
|
Events.fire(new GameOverEvent(state.rules.waveTeam));
|
||||||
}else if(state.rules.attackMode){
|
}else if(state.rules.attackMode){
|
||||||
Team alive = null;
|
Team alive = null;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(TeamData team : state.teams.getActive()){
|
||||||
if(state.teams.get(team).cores.size > 0){
|
if(team.hasCore()){
|
||||||
if(alive != null){
|
if(alive != null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
alive = team;
|
alive = team.team;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(alive != null && !state.gameOver){
|
if(alive != null && !state.gameOver){
|
||||||
if(world.isZone() && alive == defaultTeam){
|
if(world.isZone() && alive == state.rules.defaultTeam){
|
||||||
//in attack maps, a victorious game over is equivalent to a launch
|
//in attack maps, a victorious game over is equivalent to a launch
|
||||||
Call.launchZone();
|
Call.launchZone();
|
||||||
}else{
|
}else{
|
||||||
@@ -176,7 +176,7 @@ public class Logic implements ApplicationListener{
|
|||||||
ui.hudfrag.showLaunch();
|
ui.hudfrag.showLaunch();
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Tile tile : state.teams.get(defaultTeam).cores){
|
for(TileEntity tile : state.teams.playerCores()){
|
||||||
Effects.effect(Fx.launch, tile);
|
Effects.effect(Fx.launch, tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,19 +185,18 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Time.runTask(30f, () -> {
|
Time.runTask(30f, () -> {
|
||||||
for(Tile tile : state.teams.get(defaultTeam).cores){
|
for(TileEntity entity : state.teams.playerCores()){
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
if(tile == null || tile.entity == null || tile.entity.items == null) continue;
|
data.addItem(item, entity.items.get(item));
|
||||||
data.addItem(item, tile.entity.items.get(item));
|
Events.fire(new LaunchItemEvent(item, entity.items.get(item)));
|
||||||
Events.fire(new LaunchItemEvent(item, tile.entity.items.get(item)));
|
|
||||||
}
|
}
|
||||||
world.removeBlock(tile);
|
entity.tile.remove();
|
||||||
}
|
}
|
||||||
state.launched = true;
|
state.launched = true;
|
||||||
state.gameOver = true;
|
state.gameOver = true;
|
||||||
Events.fire(new LaunchEvent());
|
Events.fire(new LaunchEvent());
|
||||||
//manually fire game over event now
|
//manually fire game over event now
|
||||||
Events.fire(new GameOverEvent(defaultTeam));
|
Events.fire(new GameOverEvent(state.rules.defaultTeam));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,14 +209,18 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
|
Events.fire(Trigger.update);
|
||||||
|
|
||||||
if(!state.is(State.menu)){
|
if(!state.is(State.menu)){
|
||||||
|
if(!net.client()){
|
||||||
|
state.enemies = unitGroup.count(b -> b.getTeam() == state.rules.waveTeam && b.countsAsEnemy());
|
||||||
|
}
|
||||||
|
|
||||||
if(!state.isPaused()){
|
if(!state.isPaused()){
|
||||||
Time.update();
|
Time.update();
|
||||||
|
|
||||||
if(state.rules.waves && state.rules.waveTimer && !state.gameOver){
|
if(state.rules.waves && state.rules.waveTimer && !state.gameOver){
|
||||||
if(!state.rules.waitForWaveToEnd || unitGroups[waveTeam.ordinal()].size() == 0){
|
if(!state.rules.waitForWaveToEnd || state.enemies == 0){
|
||||||
state.wavetime = Math.max(state.wavetime - Time.delta(), 0);
|
state.wavetime = Math.max(state.wavetime - Time.delta(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -232,10 +235,7 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!state.isEditor()){
|
if(!state.isEditor()){
|
||||||
for(EntityGroup group : unitGroups){
|
unitGroup.update();
|
||||||
group.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
puddleGroup.update();
|
puddleGroup.update();
|
||||||
shieldGroup.update();
|
shieldGroup.update();
|
||||||
bulletGroup.update();
|
bulletGroup.update();
|
||||||
@@ -243,10 +243,8 @@ public class Logic implements ApplicationListener{
|
|||||||
fireGroup.update();
|
fireGroup.update();
|
||||||
weatherGroup.update();
|
weatherGroup.update();
|
||||||
}else{
|
}else{
|
||||||
for(EntityGroup<?> group : unitGroups){
|
unitGroup.updateEvents();
|
||||||
group.updateEvents();
|
collisions.updatePhysics(unitGroup);
|
||||||
collisions.updatePhysics(group);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -258,17 +256,13 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!state.isEditor()){
|
if(!state.isEditor()){
|
||||||
|
//bulletGroup
|
||||||
for(EntityGroup group : unitGroups){
|
collisions.collideGroups(bulletGroup, unitGroup);
|
||||||
if(group.isEmpty()) continue;
|
|
||||||
collisions.collideGroups(bulletGroup, group);
|
|
||||||
}
|
|
||||||
|
|
||||||
collisions.collideGroups(bulletGroup, playerGroup);
|
collisions.collideGroups(bulletGroup, playerGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!net.client() && !world.isInvalidMap() && !state.isEditor()){
|
if(!net.client() && !world.isInvalidMap() && !state.isEditor() && state.rules.canGameOver){
|
||||||
checkGameOver();
|
checkGameOver();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,9 +160,17 @@ public class NetClient implements ApplicationListener{
|
|||||||
throw new ValidateException(player, "Player has sent a message above the text limit.");
|
throw new ValidateException(player, "Player has sent a message above the text limit.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String original = message;
|
||||||
|
|
||||||
//check if it's a command
|
//check if it's a command
|
||||||
CommandResponse response = netServer.clientCommands.handleMessage(message, player);
|
CommandResponse response = netServer.clientCommands.handleMessage(message, player);
|
||||||
if(response.type == ResponseType.noCommand){ //no command to handle
|
if(response.type == ResponseType.noCommand){ //no command to handle
|
||||||
|
message = netServer.admins.filterMessage(player, message);
|
||||||
|
//supress chat message if it's filtered out
|
||||||
|
if(message == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//server console logging
|
//server console logging
|
||||||
Log.info("&y{0}: &lb{1}", player.name, message);
|
Log.info("&y{0}: &lb{1}", player.name, message);
|
||||||
|
|
||||||
@@ -190,7 +198,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Events.fire(new PlayerChatEvent(player, message));
|
Events.fire(new PlayerChatEvent(player, message, original));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String colorizeName(int id, String name){
|
public static String colorizeName(int id, String name){
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package mindustry.core;
|
package mindustry.core;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
|
||||||
import arc.struct.*;
|
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.CommandHandler.*;
|
import arc.util.CommandHandler.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.core.GameState.*;
|
import mindustry.core.GameState.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
@@ -17,28 +17,49 @@ import mindustry.entities.traits.*;
|
|||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
import mindustry.game.Teams.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.net.*;
|
import mindustry.net.*;
|
||||||
import mindustry.net.Administration.*;
|
import mindustry.net.Administration.*;
|
||||||
import mindustry.net.Packets.*;
|
import mindustry.net.Packets.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.net.*;
|
||||||
import java.nio.*;
|
import java.nio.*;
|
||||||
import java.util.zip.*;
|
import java.util.zip.*;
|
||||||
|
|
||||||
|
import static arc.util.Log.*;
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class NetServer implements ApplicationListener{
|
public class NetServer implements ApplicationListener{
|
||||||
private final static int maxSnapshotSize = 430, timerBlockSync = 0;
|
private final static int maxSnapshotSize = 430, timerBlockSync = 0;
|
||||||
private final static float serverSyncTime = 12, kickDuration = 30 * 1000, blockSyncTime = 60 * 10;
|
private final static float serverSyncTime = 12, kickDuration = 30 * 1000, blockSyncTime = 60 * 8;
|
||||||
private final static Vec2 vector = new Vec2();
|
private final static Vec2 vector = new Vec2();
|
||||||
private final static Rectangle viewport = new Rectangle();
|
private final static Rect viewport = new Rect();
|
||||||
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
|
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
|
||||||
private final static float correctDist = 16f;
|
private final static float correctDist = 16f;
|
||||||
|
|
||||||
public final Administration admins = new Administration();
|
public final Administration admins = new Administration();
|
||||||
public final CommandHandler clientCommands = new CommandHandler("/");
|
public final CommandHandler clientCommands = new CommandHandler("/");
|
||||||
|
public TeamAssigner assigner = (player, players) -> {
|
||||||
|
if(state.rules.pvp){
|
||||||
|
//find team with minimum amount of players and auto-assign player to that.
|
||||||
|
TeamData re = state.teams.getActive().min(data -> {
|
||||||
|
int count = 0;
|
||||||
|
for(Player other : players){
|
||||||
|
if(other.getTeam() == data.team && other != player){
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
});
|
||||||
|
return re == null ? null : re.team;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state.rules.defaultTeam;
|
||||||
|
};
|
||||||
|
|
||||||
private boolean closing = false;
|
private boolean closing = false;
|
||||||
private Interval timer = new Interval();
|
private Interval timer = new Interval();
|
||||||
@@ -197,10 +218,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
con.player = player;
|
con.player = player;
|
||||||
|
|
||||||
//playing in pvp mode automatically assigns players to teams
|
//playing in pvp mode automatically assigns players to teams
|
||||||
if(state.rules.pvp){
|
|
||||||
player.setTeam(assignTeam(player, playerGroup.all()));
|
player.setTeam(assignTeam(player, playerGroup.all()));
|
||||||
Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam());
|
|
||||||
}
|
|
||||||
|
|
||||||
sendWorldData(player);
|
sendWorldData(player);
|
||||||
|
|
||||||
@@ -303,6 +321,11 @@ public class NetServer implements ApplicationListener{
|
|||||||
VoteSession[] currentlyKicking = {null};
|
VoteSession[] currentlyKicking = {null};
|
||||||
|
|
||||||
clientCommands.<Player>register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> {
|
clientCommands.<Player>register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> {
|
||||||
|
if(!Config.enableVotekick.bool()){
|
||||||
|
player.sendMessage("[scarlet]Vote-kick is disabled on this server.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(playerGroup.size() < 3){
|
if(playerGroup.size() < 3){
|
||||||
player.sendMessage("[scarlet]At least 3 players are needed to start a votekick.");
|
player.sendMessage("[scarlet]At least 3 players are needed to start a votekick.");
|
||||||
return;
|
return;
|
||||||
@@ -401,19 +424,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Team assignTeam(Player current, Iterable<Player> players){
|
public Team assignTeam(Player current, Iterable<Player> players){
|
||||||
//find team with minimum amount of players and auto-assign player to that.
|
return assigner.assign(current, players);
|
||||||
return Structs.findMin(Team.all, team -> {
|
|
||||||
if(state.teams.isActive(team) && !state.teams.get(team).cores.isEmpty()){
|
|
||||||
int count = 0;
|
|
||||||
for(Player other : players){
|
|
||||||
if(other.getTeam() == team && other != current){
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
return Integer.MAX_VALUE;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendWorldData(Player player){
|
public void sendWorldData(Player player){
|
||||||
@@ -437,7 +448,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
if(!player.con.hasDisconnected){
|
if(!player.con.hasDisconnected){
|
||||||
if(player.con.hasConnected){
|
if(player.con.hasConnected){
|
||||||
Events.fire(new PlayerLeave(player));
|
Events.fire(new PlayerLeave(player));
|
||||||
Call.sendMessage("[accent]" + player.name + "[accent] has disconnected.");
|
if(Config.showConnectMessages.bool()) Call.sendMessage("[accent]" + player.name + "[accent] has disconnected.");
|
||||||
Call.onPlayerDisconnect(player.id);
|
Call.onPlayerDisconnect(player.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,17 +586,21 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
player.add();
|
player.add();
|
||||||
player.con.hasConnected = true;
|
player.con.hasConnected = true;
|
||||||
Call.sendMessage("[accent]" + player.name + "[accent] has connected.");
|
if(Config.showConnectMessages.bool()) Call.sendMessage("[accent]" + player.name + "[accent] has connected.");
|
||||||
Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid);
|
Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid);
|
||||||
|
|
||||||
|
if(!Config.motd.string().equalsIgnoreCase("off")){
|
||||||
|
player.sendMessage(Config.motd.string());
|
||||||
|
}
|
||||||
|
|
||||||
Events.fire(new PlayerJoin(player));
|
Events.fire(new PlayerJoin(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWaitingForPlayers(){
|
public boolean isWaitingForPlayers(){
|
||||||
if(state.rules.pvp){
|
if(state.rules.pvp){
|
||||||
int used = 0;
|
int used = 0;
|
||||||
for(Team t : Team.all){
|
for(TeamData t : state.teams.getActive()){
|
||||||
if(playerGroup.count(p -> p.getTeam() == t) > 0){
|
if(playerGroup.count(p -> p.getTeam() == t.team) > 0){
|
||||||
used++;
|
used++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -594,6 +609,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
|
|
||||||
if(!headless && !closing && net.server() && state.is(State.menu)){
|
if(!headless && !closing && net.server() && state.is(State.menu)){
|
||||||
@@ -611,6 +627,20 @@ public class NetServer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Should only be used on the headless backend. */
|
||||||
|
public void openServer(){
|
||||||
|
try{
|
||||||
|
net.host(Config.port.num());
|
||||||
|
info("&lcOpened a server on port {0}.", Config.port.num());
|
||||||
|
}catch(BindException e){
|
||||||
|
Log.err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network.");
|
||||||
|
state.set(State.menu);
|
||||||
|
}catch(IOException e){
|
||||||
|
err(e);
|
||||||
|
state.set(State.menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void kickAll(KickReason reason){
|
public void kickAll(KickReason reason){
|
||||||
for(NetConnection con : net.getConnections()){
|
for(NetConnection con : net.getConnections()){
|
||||||
con.kick(reason);
|
con.kick(reason);
|
||||||
@@ -647,20 +677,20 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
public void writeEntitySnapshot(Player player) throws IOException{
|
public void writeEntitySnapshot(Player player) throws IOException{
|
||||||
syncStream.reset();
|
syncStream.reset();
|
||||||
ObjectSet<Tile> cores = state.teams.get(player.getTeam()).cores;
|
Array<CoreEntity> cores = state.teams.cores(player.getTeam());
|
||||||
|
|
||||||
dataStream.writeByte(cores.size);
|
dataStream.writeByte(cores.size);
|
||||||
|
|
||||||
for(Tile tile : cores){
|
for(CoreEntity entity : cores){
|
||||||
dataStream.writeInt(tile.pos());
|
dataStream.writeInt(entity.tile.pos());
|
||||||
tile.entity.items.write(dataStream);
|
entity.items.write(dataStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
dataStream.close();
|
dataStream.close();
|
||||||
byte[] stateBytes = syncStream.toByteArray();
|
byte[] stateBytes = syncStream.toByteArray();
|
||||||
|
|
||||||
//write basic state data.
|
//write basic state data.
|
||||||
Call.onStateSnapshot(player.con, state.wavetime, state.wave, state.enemies(), (short)stateBytes.length, net.compressSnapshot(stateBytes));
|
Call.onStateSnapshot(player.con, state.wavetime, state.wave, state.enemies, (short)stateBytes.length, net.compressSnapshot(stateBytes));
|
||||||
|
|
||||||
viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
|
viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
|
||||||
|
|
||||||
@@ -784,4 +814,8 @@ public class NetServer implements ApplicationListener{
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface TeamAssigner{
|
||||||
|
Team assign(Player player, Iterable<Player> players);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,11 +18,10 @@ import mindustry.entities.effect.*;
|
|||||||
import mindustry.entities.effect.GroundEffectEntity.*;
|
import mindustry.entities.effect.GroundEffectEntity.*;
|
||||||
import mindustry.entities.traits.*;
|
import mindustry.entities.traits.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.*;
|
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.ui.Cicon;
|
import mindustry.ui.*;
|
||||||
import mindustry.world.blocks.defense.ForceProjector.*;
|
import mindustry.world.blocks.defense.ForceProjector.*;
|
||||||
|
|
||||||
import static arc.Core.*;
|
import static arc.Core.*;
|
||||||
@@ -42,7 +41,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
private float camerascale = targetscale;
|
private float camerascale = targetscale;
|
||||||
private float landscale = 0f, landTime;
|
private float landscale = 0f, landTime;
|
||||||
private float minZoomScl = Scl.scl(0.01f);
|
private float minZoomScl = Scl.scl(0.01f);
|
||||||
private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
|
private Rect rect = new Rect(), rect2 = new Rect();
|
||||||
private float shakeIntensity, shaketime;
|
private float shakeIntensity, shaketime;
|
||||||
|
|
||||||
public Renderer(){
|
public Renderer(){
|
||||||
@@ -57,8 +56,8 @@ public class Renderer implements ApplicationListener{
|
|||||||
Effects.setEffectProvider((effect, color, x, y, rotation, data) -> {
|
Effects.setEffectProvider((effect, color, x, y, rotation, data) -> {
|
||||||
if(effect == Fx.none) return;
|
if(effect == Fx.none) return;
|
||||||
if(Core.settings.getBool("effects")){
|
if(Core.settings.getBool("effects")){
|
||||||
Rectangle view = camera.bounds(rect);
|
Rect view = camera.bounds(rect);
|
||||||
Rectangle pos = rect2.setSize(effect.size).setCenter(x, y);
|
Rect pos = rect2.setSize(effect.size).setCenter(x, y);
|
||||||
|
|
||||||
if(view.overlaps(pos)){
|
if(view.overlaps(pos)){
|
||||||
|
|
||||||
@@ -124,12 +123,14 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
if(player.isDead()){
|
if(player.isDead()){
|
||||||
TileEntity core = player.getClosestCore();
|
TileEntity core = player.getClosestCore();
|
||||||
if(core != null && player.spawner == null){
|
if(core != null){
|
||||||
|
if(player.spawner == null){
|
||||||
camera.position.lerpDelta(core.x, core.y, 0.08f);
|
camera.position.lerpDelta(core.x, core.y, 0.08f);
|
||||||
}else{
|
}else{
|
||||||
camera.position.lerpDelta(position, 0.08f);
|
camera.position.lerpDelta(position, 0.08f);
|
||||||
}
|
}
|
||||||
}else if(control.input instanceof DesktopInput){
|
}
|
||||||
|
}else if(control.input instanceof DesktopInput && !state.isPaused()){
|
||||||
camera.position.lerpDelta(position, 0.08f);
|
camera.position.lerpDelta(position, 0.08f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,11 +345,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
Draw.rect("circle-shadow", u.x, u.y, size * rad, size * rad);
|
Draw.rect("circle-shadow", u.x, u.y, size * rad, size * rad);
|
||||||
};
|
};
|
||||||
|
|
||||||
for(EntityGroup<? extends BaseUnit> group : unitGroups){
|
unitGroup.draw(unit -> !unit.isDead(), draw::get);
|
||||||
if(!group.isEmpty()){
|
|
||||||
group.draw(unit -> !unit.isDead(), draw::get);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!playerGroup.isEmpty()){
|
if(!playerGroup.isEmpty()){
|
||||||
playerGroup.draw(unit -> !unit.isDead(), draw::get);
|
playerGroup.draw(unit -> !unit.isDead(), draw::get);
|
||||||
@@ -361,34 +358,21 @@ public class Renderer implements ApplicationListener{
|
|||||||
float trnsX = -12, trnsY = -13;
|
float trnsX = -12, trnsY = -13;
|
||||||
Draw.color(0, 0, 0, 0.22f);
|
Draw.color(0, 0, 0, 0.22f);
|
||||||
|
|
||||||
for(EntityGroup<? extends BaseUnit> group : unitGroups){
|
unitGroup.draw(unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY));
|
||||||
if(!group.isEmpty()){
|
|
||||||
group.draw(unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!playerGroup.isEmpty()){
|
|
||||||
playerGroup.draw(unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY));
|
playerGroup.draw(unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY));
|
||||||
}
|
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawAllTeams(boolean flying){
|
private void drawAllTeams(boolean flying){
|
||||||
for(Team team : Team.all){
|
unitGroup.draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder);
|
||||||
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
|
playerGroup.draw(p -> p.isFlying() == flying && !p.isDead(), Unit::drawUnder);
|
||||||
|
|
||||||
if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue;
|
unitGroup.draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
|
||||||
|
playerGroup.draw(p -> p.isFlying() == flying, Unit::drawAll);
|
||||||
|
|
||||||
unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder);
|
unitGroup.draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver);
|
||||||
playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder);
|
playerGroup.draw(p -> p.isFlying() == flying, Unit::drawOver);
|
||||||
|
|
||||||
unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
|
|
||||||
playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
|
|
||||||
|
|
||||||
unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver);
|
|
||||||
playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scaleCamera(float amount){
|
public void scaleCamera(float amount){
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
public HudFragment hudfrag;
|
public HudFragment hudfrag;
|
||||||
public ChatFragment chatfrag;
|
public ChatFragment chatfrag;
|
||||||
public ScriptConsoleFragment scriptfrag;
|
public ScriptConsoleFragment scriptfrag;
|
||||||
|
public MinimapFragment minimapfrag;
|
||||||
public PlayerListFragment listfrag;
|
public PlayerListFragment listfrag;
|
||||||
public LoadingFragment loadfrag;
|
public LoadingFragment loadfrag;
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
public ContentInfoDialog content;
|
public ContentInfoDialog content;
|
||||||
public DeployDialog deploy;
|
public DeployDialog deploy;
|
||||||
public TechTreeDialog tech;
|
public TechTreeDialog tech;
|
||||||
public MinimapDialog minimap;
|
//public MinimapDialog minimap;
|
||||||
public SchematicsDialog schematics;
|
public SchematicsDialog schematics;
|
||||||
public ModsDialog mods;
|
public ModsDialog mods;
|
||||||
public ColorPicker picker;
|
public ColorPicker picker;
|
||||||
@@ -210,6 +211,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
menufrag = new MenuFragment();
|
menufrag = new MenuFragment();
|
||||||
hudfrag = new HudFragment();
|
hudfrag = new HudFragment();
|
||||||
chatfrag = new ChatFragment();
|
chatfrag = new ChatFragment();
|
||||||
|
minimapfrag = new MinimapFragment();
|
||||||
listfrag = new PlayerListFragment();
|
listfrag = new PlayerListFragment();
|
||||||
loadfrag = new LoadingFragment();
|
loadfrag = new LoadingFragment();
|
||||||
scriptfrag = new ScriptConsoleFragment();
|
scriptfrag = new ScriptConsoleFragment();
|
||||||
@@ -235,7 +237,6 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
content = new ContentInfoDialog();
|
content = new ContentInfoDialog();
|
||||||
deploy = new DeployDialog();
|
deploy = new DeployDialog();
|
||||||
tech = new TechTreeDialog();
|
tech = new TechTreeDialog();
|
||||||
minimap = new MinimapDialog();
|
|
||||||
mods = new ModsDialog();
|
mods = new ModsDialog();
|
||||||
schematics = new SchematicsDialog();
|
schematics = new SchematicsDialog();
|
||||||
|
|
||||||
@@ -254,6 +255,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
hudfrag.build(hudGroup);
|
hudfrag.build(hudGroup);
|
||||||
menufrag.build(menuGroup);
|
menufrag.build(menuGroup);
|
||||||
chatfrag.container().build(hudGroup);
|
chatfrag.container().build(hudGroup);
|
||||||
|
minimapfrag.build(hudGroup);
|
||||||
listfrag.build(hudGroup);
|
listfrag.build(hudGroup);
|
||||||
scriptfrag.container().build(hudGroup);
|
scriptfrag.container().build(hudGroup);
|
||||||
loadfrag.build(group);
|
loadfrag.build(group);
|
||||||
@@ -305,7 +307,19 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
hide();
|
hide();
|
||||||
}).disabled(b -> field.getText().isEmpty());
|
}).disabled(b -> field.getText().isEmpty());
|
||||||
buttons.addButton("$cancel", this::hide);
|
buttons.addButton("$cancel", this::hide);
|
||||||
}}.show();
|
keyDown(KeyCode.ENTER, () -> {
|
||||||
|
String text = field.getText();
|
||||||
|
if(!text.isEmpty()){
|
||||||
|
confirmed.get(text);
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
keyDown(KeyCode.ESCAPE, this::hide);
|
||||||
|
keyDown(KeyCode.BACK, this::hide);
|
||||||
|
show();
|
||||||
|
Core.scene.setKeyboardFocus(field);
|
||||||
|
field.setCursorPosition(def.length());
|
||||||
|
}};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import arc.util.io.*;
|
|||||||
|
|
||||||
public class Version{
|
public class Version{
|
||||||
/** Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used. */
|
/** Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used. */
|
||||||
public static String type;
|
public static String type = "unknown";
|
||||||
/** Build modifier, e.g. 'alpha' or 'release' */
|
/** Build modifier, e.g. 'alpha' or 'release' */
|
||||||
public static String modifier;
|
public static String modifier = "unknown";
|
||||||
/** Number specifying the major version, e.g. '4' */
|
/** Number specifying the major version, e.g. '4' */
|
||||||
public static int number;
|
public static int number;
|
||||||
/** Build number, e.g. '43'. set to '-1' for custom builds. */
|
/** Build number, e.g. '43'. set to '-1' for custom builds. */
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package mindustry.core;
|
package mindustry.core;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.util.*;
|
import arc.struct.*;
|
||||||
import arc.util.ArcAnnotate.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
import mindustry.content.*;
|
import arc.util.*;
|
||||||
import mindustry.core.GameState.*;
|
import mindustry.core.GameState.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
import mindustry.game.Teams.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.maps.filters.*;
|
import mindustry.maps.filters.*;
|
||||||
@@ -200,7 +200,7 @@ public class World{
|
|||||||
public void loadMap(Map map, Rules checkRules){
|
public void loadMap(Map map, Rules checkRules){
|
||||||
try{
|
try{
|
||||||
SaveIO.load(map.file, new FilterContext(map));
|
SaveIO.load(map.file, new FilterContext(map));
|
||||||
}catch(Exception e){
|
}catch(Throwable e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
if(!headless){
|
if(!headless){
|
||||||
ui.showErrorMessage("$map.invalid");
|
ui.showErrorMessage("$map.invalid");
|
||||||
@@ -216,33 +216,22 @@ public class World{
|
|||||||
invalidMap = false;
|
invalidMap = false;
|
||||||
|
|
||||||
if(!headless){
|
if(!headless){
|
||||||
if(state.teams.get(defaultTeam).cores.size == 0 && !checkRules.pvp){
|
if(state.teams.playerCores().size == 0 && !checkRules.pvp){
|
||||||
ui.showErrorMessage("$map.nospawn");
|
ui.showErrorMessage("$map.nospawn");
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
}else if(checkRules.pvp){ //pvp maps need two cores to be valid
|
}else if(checkRules.pvp){ //pvp maps need two cores to be valid
|
||||||
int teams = 0;
|
if(state.teams.getActive().count(TeamData::hasCore) < 2){
|
||||||
for(Team team : Team.all){
|
|
||||||
if(state.teams.get(team).cores.size != 0){
|
|
||||||
teams ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(teams < 2){
|
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
ui.showErrorMessage("$map.nospawn.pvp");
|
ui.showErrorMessage("$map.nospawn.pvp");
|
||||||
}
|
}
|
||||||
}else if(checkRules.attackMode){ //attack maps need two cores to be valid
|
}else if(checkRules.attackMode){ //attack maps need two cores to be valid
|
||||||
invalidMap = state.teams.get(waveTeam).cores.isEmpty();
|
invalidMap = state.teams.get(state.rules.waveTeam).noCores();
|
||||||
if(invalidMap){
|
if(invalidMap){
|
||||||
ui.showErrorMessage("$map.nospawn.attack");
|
ui.showErrorMessage("$map.nospawn.attack");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
invalidMap = true;
|
invalidMap = !state.teams.getActive().contains(TeamData::hasCore);
|
||||||
for(Team team : Team.all){
|
|
||||||
if(state.teams.get(team).cores.size != 0){
|
|
||||||
invalidMap = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(invalidMap){
|
if(invalidMap){
|
||||||
throw new MapException(map, "Map has no cores!");
|
throw new MapException(map, "Map has no cores!");
|
||||||
@@ -258,36 +247,6 @@ public class World{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBlock(Tile tile){
|
|
||||||
if(tile == null) return;
|
|
||||||
tile.link().getLinkedTiles(other -> other.setBlock(Blocks.air));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBlock(Tile tile, Block block, Team team){
|
|
||||||
setBlock(tile, block, team, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBlock(Tile tile, Block block, Team team, int rotation){
|
|
||||||
tile.setBlock(block, team, rotation);
|
|
||||||
if(block.isMultiblock()){
|
|
||||||
int offsetx = -(block.size - 1) / 2;
|
|
||||||
int offsety = -(block.size - 1) / 2;
|
|
||||||
|
|
||||||
for(int dx = 0; dx < block.size; dx++){
|
|
||||||
for(int dy = 0; dy < block.size; dy++){
|
|
||||||
int worldx = dx + offsetx + tile.x;
|
|
||||||
int worldy = dy + offsety + tile.y;
|
|
||||||
if(!(worldx == tile.x && worldy == tile.y)){
|
|
||||||
Tile toplace = world.tile(worldx, worldy);
|
|
||||||
if(toplace != null){
|
|
||||||
toplace.setBlock(BlockPart.get(dx + offsetx, dy + offsety), team);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void raycastEachWorld(float x0, float y0, float x1, float y1, Raycaster cons){
|
public void raycastEachWorld(float x0, float y0, float x1, float y1, Raycaster cons){
|
||||||
raycastEach(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons);
|
raycastEach(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class DrawOperation{
|
|||||||
}else if(type == OpType.rotation.ordinal()){
|
}else if(type == OpType.rotation.ordinal()){
|
||||||
tile.rotation(to);
|
tile.rotation(to);
|
||||||
}else if(type == OpType.team.ordinal()){
|
}else if(type == OpType.team.ordinal()){
|
||||||
tile.setTeam(Team.all[to]);
|
tile.setTeam(Team.get(to));
|
||||||
}else if(type == OpType.overlay.ordinal()){
|
}else if(type == OpType.overlay.ordinal()){
|
||||||
tile.setOverlayID(to);
|
tile.setOverlayID(to);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class EditorTile extends Tile{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getTeamID() == team.ordinal()) return;
|
if(getTeamID() == team.id) return;
|
||||||
op(OpType.team, getTeamID());
|
op(OpType.team, getTeamID());
|
||||||
super.setTeam(team);
|
super.setTeam(team);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
package mindustry.editor;
|
package mindustry.editor;
|
||||||
|
|
||||||
import arc.struct.IntArray;
|
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import arc.math.Mathf;
|
import arc.math.*;
|
||||||
import arc.math.geom.Bresenham2;
|
import arc.math.geom.*;
|
||||||
import arc.util.Structs;
|
import arc.struct.*;
|
||||||
import mindustry.Vars;
|
import arc.util.*;
|
||||||
import mindustry.content.Blocks;
|
import mindustry.content.*;
|
||||||
import mindustry.game.Team;
|
import mindustry.game.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.BlockPart;
|
import mindustry.world.blocks.*;
|
||||||
|
|
||||||
public enum EditorTool{
|
public enum EditorTool{
|
||||||
zoom,
|
zoom,
|
||||||
@@ -80,7 +79,7 @@ public enum EditorTool{
|
|||||||
editor.drawCircle(x, y, tile -> {
|
editor.drawCircle(x, y, tile -> {
|
||||||
if(mode == -1){
|
if(mode == -1){
|
||||||
//erase block
|
//erase block
|
||||||
Vars.world.removeBlock(tile);
|
tile.remove();
|
||||||
}else if(mode == 0){
|
}else if(mode == 0){
|
||||||
//erase ore
|
//erase ore
|
||||||
tile.clearOverlay();
|
tile.clearOverlay();
|
||||||
@@ -141,7 +140,7 @@ public enum EditorTool{
|
|||||||
if(tile.link().synthetic()){
|
if(tile.link().synthetic()){
|
||||||
Team dest = tile.getTeam();
|
Team dest = tile.getTeam();
|
||||||
if(dest == editor.drawTeam) return;
|
if(dest == editor.drawTeam) return;
|
||||||
fill(editor, x, y, false, t -> t.getTeamID() == dest.ordinal() && t.link().synthetic(), t -> t.setTeam(editor.drawTeam));
|
fill(editor, x, y, false, t -> t.getTeamID() == (int)dest.id && t.link().synthetic(), t -> t.setTeam(editor.drawTeam));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import arc.util.Structs;
|
|||||||
import mindustry.content.Blocks;
|
import mindustry.content.Blocks;
|
||||||
import mindustry.game.Team;
|
import mindustry.game.Team;
|
||||||
import mindustry.gen.TileOp;
|
import mindustry.gen.TileOp;
|
||||||
import mindustry.io.LegacyMapIO;
|
|
||||||
import mindustry.io.MapIO;
|
import mindustry.io.MapIO;
|
||||||
import mindustry.maps.Map;
|
import mindustry.maps.Map;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
@@ -65,7 +64,7 @@ public class MapEditor{
|
|||||||
reset();
|
reset();
|
||||||
|
|
||||||
createTiles(pixmap.getWidth(), pixmap.getHeight());
|
createTiles(pixmap.getWidth(), pixmap.getHeight());
|
||||||
load(() -> LegacyMapIO.readPixmap(pixmap, tiles()));
|
load(() -> MapIO.readPixmap(pixmap, tiles()));
|
||||||
renderer.resize(width(), height());
|
renderer.resize(width(), height());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +83,7 @@ public class MapEditor{
|
|||||||
//re-add them
|
//re-add them
|
||||||
for(Tile tile : tiles){
|
for(Tile tile : tiles){
|
||||||
if(tile.block().isMultiblock()){
|
if(tile.block().isMultiblock()){
|
||||||
world.setBlock(tile, tile.block(), tile.getTeam());
|
tile.set(tile.block(), tile.getTeam());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -174,7 +173,7 @@ public class MapEditor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
world.setBlock(tile(x, y), drawBlock, drawTeam);
|
tile(x, y).set(drawBlock, drawTeam);
|
||||||
}else{
|
}else{
|
||||||
boolean isFloor = drawBlock.isFloor() && drawBlock != Blocks.air;
|
boolean isFloor = drawBlock.isFloor() && drawBlock != Blocks.air;
|
||||||
|
|
||||||
@@ -183,7 +182,7 @@ public class MapEditor{
|
|||||||
|
|
||||||
//remove linked tiles blocking the way
|
//remove linked tiles blocking the way
|
||||||
if(!isFloor && (tile.isLinked() || tile.block().isMultiblock())){
|
if(!isFloor && (tile.isLinked() || tile.block().isMultiblock())){
|
||||||
world.removeBlock(tile.link());
|
tile.link().remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isFloor){
|
if(isFloor){
|
||||||
|
|||||||
@@ -551,7 +551,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.base()){
|
||||||
ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglePartiali);
|
ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglePartiali);
|
||||||
button.margin(4f);
|
button.margin(4f);
|
||||||
button.getImageCell().grow();
|
button.getImageCell().grow();
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
tile.rotation(write.rotation);
|
tile.rotation(write.rotation);
|
||||||
tile.setFloor((Floor)content.block(write.floor));
|
tile.setFloor((Floor)content.block(write.floor));
|
||||||
tile.setBlock(content.block(write.block));
|
tile.setBlock(content.block(write.block));
|
||||||
tile.setTeam(Team.all[write.team]);
|
tile.setTeam(Team.get(write.team));
|
||||||
tile.setOverlay(content.block(write.ore));
|
tile.setOverlay(content.block(write.ore));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -367,7 +367,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
GenTile tile = buffer1[px][py];
|
GenTile tile = buffer1[px][py];
|
||||||
input.apply(x, y, content.block(tile.floor), content.block(tile.block), content.block(tile.ore));
|
input.apply(x, y, content.block(tile.floor), content.block(tile.block), content.block(tile.ore));
|
||||||
filter.apply(input);
|
filter.apply(input);
|
||||||
buffer2[px][py].set(input.floor, input.block, input.ore, Team.all[tile.team], tile.rotation);
|
buffer2[px][py].set(input.floor, input.block, input.ore, Team.get(tile.team), tile.rotation);
|
||||||
});
|
});
|
||||||
|
|
||||||
pixmap.each((px, py) -> buffer1[px][py].set(buffer2[px][py]));
|
pixmap.each((px, py) -> buffer1[px][py].set(buffer2[px][py]));
|
||||||
@@ -411,7 +411,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
this.floor = floor.id;
|
this.floor = floor.id;
|
||||||
this.block = wall.id;
|
this.block = wall.id;
|
||||||
this.ore = ore.id;
|
this.ore = ore.id;
|
||||||
this.team = (byte)team.ordinal();
|
this.team = (byte) team.id;
|
||||||
this.rotation = (byte)rotation;
|
this.rotation = (byte)rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,7 +433,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
ctile.setBlock(content.block(block));
|
ctile.setBlock(content.block(block));
|
||||||
ctile.setOverlay(content.block(ore));
|
ctile.setOverlay(content.block(ore));
|
||||||
ctile.rotation(rotation);
|
ctile.rotation(rotation);
|
||||||
ctile.setTeam(Team.all[team]);
|
ctile.setTeam(Team.get(team));
|
||||||
return ctile;
|
return ctile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class MapView extends Element implements GestureListener{
|
|||||||
private boolean grid = false;
|
private boolean grid = false;
|
||||||
private GridImage image = new GridImage(0, 0);
|
private GridImage image = new GridImage(0, 0);
|
||||||
private Vec2 vec = new Vec2();
|
private Vec2 vec = new Vec2();
|
||||||
private Rectangle rect = new Rectangle();
|
private Rect rect = new Rect();
|
||||||
private Vec2[][] brushPolygons = new Vec2[MapEditor.brushSizes.length][0];
|
private Vec2[][] brushPolygons = new Vec2[MapEditor.brushSizes.length][0];
|
||||||
|
|
||||||
private boolean drawing;
|
private boolean drawing;
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
/** Utility class for damaging in an area. */
|
/** Utility class for damaging in an area. */
|
||||||
public class Damage{
|
public class Damage{
|
||||||
private static Rectangle rect = new Rectangle();
|
private static Rect rect = new Rect();
|
||||||
private static Rectangle hitrect = new Rectangle();
|
private static Rect hitrect = new Rect();
|
||||||
private static Vec2 tr = new Vec2();
|
private static Vec2 tr = new Vec2();
|
||||||
private static GridBits bits = new GridBits(30, 30);
|
private static GridBits bits = new GridBits(30, 30);
|
||||||
private static IntQueue propagation = new IntQueue();
|
private static IntQueue propagation = new IntQueue();
|
||||||
@@ -88,7 +88,7 @@ public class Damage{
|
|||||||
tr.trns(angle, length);
|
tr.trns(angle, length);
|
||||||
Intc2 collider = (cx, cy) -> {
|
Intc2 collider = (cx, cy) -> {
|
||||||
Tile tile = world.ltile(cx, cy);
|
Tile tile = world.ltile(cx, cy);
|
||||||
if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.entity != null && tile.getTeamID() != team.ordinal() && tile.entity.collide(hitter)){
|
if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.entity != null && tile.getTeamID() != team.id && tile.entity.collide(hitter)){
|
||||||
tile.entity.collision(hitter);
|
tile.entity.collision(hitter);
|
||||||
collidedBlocks.add(tile.pos());
|
collidedBlocks.add(tile.pos());
|
||||||
hitter.getBulletType().hit(hitter, tile.worldx(), tile.worldy());
|
hitter.getBulletType().hit(hitter, tile.worldx(), tile.worldy());
|
||||||
@@ -127,7 +127,7 @@ public class Damage{
|
|||||||
|
|
||||||
Cons<Unit> cons = e -> {
|
Cons<Unit> cons = e -> {
|
||||||
e.hitbox(hitrect);
|
e.hitbox(hitrect);
|
||||||
Rectangle other = hitrect;
|
Rect other = hitrect;
|
||||||
other.y -= expand;
|
other.y -= expand;
|
||||||
other.x -= expand;
|
other.x -= expand;
|
||||||
other.width += expand * 2;
|
other.width += expand * 2;
|
||||||
@@ -259,7 +259,7 @@ public class Damage{
|
|||||||
for(int dx = -trad; dx <= trad; dx++){
|
for(int dx = -trad; dx <= trad; dx++){
|
||||||
for(int dy = -trad; dy <= trad; dy++){
|
for(int dy = -trad; dy <= trad; dy++){
|
||||||
Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy);
|
Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy);
|
||||||
if(tile != null && tile.entity != null && (team == null || state.teams.areEnemies(team, tile.getTeam())) && Mathf.dst(dx, dy) <= trad){
|
if(tile != null && tile.entity != null && (team == null ||team.isEnemy(tile.getTeam())) && Mathf.dst(dx, dy) <= trad){
|
||||||
tile.entity.damage(damage);
|
tile.entity.damage(damage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ public class EntityCollisions{
|
|||||||
private static final float seg = 1f;
|
private static final float seg = 1f;
|
||||||
|
|
||||||
//tile collisions
|
//tile collisions
|
||||||
private Rectangle tmp = new Rectangle();
|
private Rect tmp = new Rect();
|
||||||
private Vec2 vector = new Vec2();
|
private Vec2 vector = new Vec2();
|
||||||
private Vec2 l1 = new Vec2();
|
private Vec2 l1 = new Vec2();
|
||||||
private Rectangle r1 = new Rectangle();
|
private Rect r1 = new Rect();
|
||||||
private Rectangle r2 = new Rectangle();
|
private Rect r2 = new Rect();
|
||||||
|
|
||||||
//entity collisions
|
//entity collisions
|
||||||
private Array<SolidTrait> arrOut = new Array<>();
|
private Array<SolidTrait> arrOut = new Array<>();
|
||||||
@@ -57,7 +57,7 @@ public class EntityCollisions{
|
|||||||
|
|
||||||
public void moveDelta(SolidTrait entity, float deltax, float deltay, boolean x){
|
public void moveDelta(SolidTrait entity, float deltax, float deltay, boolean x){
|
||||||
|
|
||||||
Rectangle rect = r1;
|
Rect rect = r1;
|
||||||
entity.hitboxTile(rect);
|
entity.hitboxTile(rect);
|
||||||
entity.hitboxTile(r2);
|
entity.hitboxTile(r2);
|
||||||
rect.x += deltax;
|
rect.x += deltax;
|
||||||
@@ -84,7 +84,7 @@ public class EntityCollisions{
|
|||||||
entity.setY(entity.getY() + rect.y - r2.y);
|
entity.setY(entity.getY() + rect.y - r2.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean overlapsTile(Rectangle rect){
|
public boolean overlapsTile(Rect rect){
|
||||||
rect.getCenter(vector);
|
rect.getCenter(vector);
|
||||||
int r = 1;
|
int r = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,13 @@ import arc.graphics.*;
|
|||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import mindustry.entities.traits.*;
|
import mindustry.entities.traits.*;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static mindustry.Vars.collisions;
|
import static mindustry.Vars.collisions;
|
||||||
|
|
||||||
/** Represents a group of a certain type of entity.*/
|
/** Represents a group of a certain type of entity.*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class EntityGroup<T extends Entity>{
|
public class EntityGroup<T extends Entity> implements Iterable<T>{
|
||||||
private final boolean useTree;
|
private final boolean useTree;
|
||||||
private final int id;
|
private final int id;
|
||||||
private final Class<T> type;
|
private final Class<T> type;
|
||||||
@@ -19,13 +21,13 @@ public class EntityGroup<T extends Entity>{
|
|||||||
private final Array<T> entitiesToRemove = new Array<>(false, 32);
|
private final Array<T> entitiesToRemove = new Array<>(false, 32);
|
||||||
private final Array<T> entitiesToAdd = new Array<>(false, 32);
|
private final Array<T> entitiesToAdd = new Array<>(false, 32);
|
||||||
private final Array<T> intersectArray = new Array<>();
|
private final Array<T> intersectArray = new Array<>();
|
||||||
private final Rectangle intersectRect = new Rectangle();
|
private final Rect intersectRect = new Rect();
|
||||||
private IntMap<T> map;
|
private IntMap<T> map;
|
||||||
private QuadTree tree;
|
private QuadTree tree;
|
||||||
private Cons<T> removeListener;
|
private Cons<T> removeListener;
|
||||||
private Cons<T> addListener;
|
private Cons<T> addListener;
|
||||||
|
|
||||||
private final Rectangle viewport = new Rectangle();
|
private final Rect viewport = new Rect();
|
||||||
private int count = 0;
|
private int count = 0;
|
||||||
|
|
||||||
public EntityGroup(int id, Class<T> type, boolean useTree){
|
public EntityGroup(int id, Class<T> type, boolean useTree){
|
||||||
@@ -34,7 +36,7 @@ public class EntityGroup<T extends Entity>{
|
|||||||
this.type = type;
|
this.type = type;
|
||||||
|
|
||||||
if(useTree){
|
if(useTree){
|
||||||
tree = new QuadTree<>(new Rectangle(0, 0, 0, 0));
|
tree = new QuadTree<>(new Rect(0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +182,7 @@ public class EntityGroup<T extends Entity>{
|
|||||||
/** Resizes the internal quadtree, if it is enabled.*/
|
/** Resizes the internal quadtree, if it is enabled.*/
|
||||||
public void resize(float x, float y, float w, float h){
|
public void resize(float x, float y, float w, float h){
|
||||||
if(useTree){
|
if(useTree){
|
||||||
tree = new QuadTree<>(new Rectangle(x, y, w, h));
|
tree = new QuadTree<>(new Rect(x, y, w, h));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,8 +255,13 @@ public class EntityGroup<T extends Entity>{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the logic-only array for iteration. */
|
/** Returns the array for iteration. */
|
||||||
public Array<T> all(){
|
public Array<T> all(){
|
||||||
return entityArray;
|
return entityArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<T> iterator(){
|
||||||
|
return entityArray.iterator();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
package mindustry.entities;
|
package mindustry.entities;
|
||||||
|
|
||||||
import arc.struct.EnumSet;
|
import arc.func.*;
|
||||||
import arc.func.Cons;
|
import arc.math.*;
|
||||||
import arc.func.Boolf;
|
import arc.math.geom.*;
|
||||||
import arc.math.Mathf;
|
import mindustry.entities.traits.*;
|
||||||
import arc.math.geom.Geometry;
|
|
||||||
import arc.math.geom.Rectangle;
|
|
||||||
import mindustry.entities.traits.TargetTrait;
|
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.Team;
|
import mindustry.game.*;
|
||||||
import mindustry.world.Tile;
|
import mindustry.world.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
/** Utility class for unit and team interactions.*/
|
/** Utility class for unit and team interactions.*/
|
||||||
public class Units{
|
public class Units{
|
||||||
private static Rectangle hitrect = new Rectangle();
|
private static Rect hitrect = new Rect();
|
||||||
private static Unit result;
|
private static Unit result;
|
||||||
private static float cdist;
|
private static float cdist;
|
||||||
private static boolean boolResult;
|
private static boolean boolResult;
|
||||||
@@ -86,13 +83,7 @@ public class Units{
|
|||||||
public static TileEntity findEnemyTile(Team team, float x, float y, float range, Boolf<Tile> pred){
|
public static TileEntity findEnemyTile(Team team, float x, float y, float range, Boolf<Tile> pred){
|
||||||
if(team == Team.derelict) return null;
|
if(team == Team.derelict) return null;
|
||||||
|
|
||||||
for(Team enemy : state.teams.enemiesOf(team)){
|
return indexer.findEnemyTile(team, x, y, range, pred);
|
||||||
TileEntity entity = indexer.findTile(enemy, x, y, range, pred, true);
|
|
||||||
if(entity != null){
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the closest target enemy. First, units are checked, then tile entities. */
|
/** Returns the closest target enemy. First, units are checked, then tile entities. */
|
||||||
@@ -157,7 +148,11 @@ public class Units{
|
|||||||
|
|
||||||
/** Iterates over all units in a rectangle. */
|
/** Iterates over all units in a rectangle. */
|
||||||
public static void nearby(Team team, float x, float y, float width, float height, Cons<Unit> cons){
|
public static void nearby(Team team, float x, float y, float width, float height, Cons<Unit> cons){
|
||||||
unitGroups[team.ordinal()].intersect(x, y, width, height, cons);
|
unitGroup.intersect(x, y, width, height, u -> {
|
||||||
|
if(u.getTeam() == team){
|
||||||
|
cons.get(u);
|
||||||
|
}
|
||||||
|
});
|
||||||
playerGroup.intersect(x, y, width, height, player -> {
|
playerGroup.intersect(x, y, width, height, player -> {
|
||||||
if(player.getTeam() == team){
|
if(player.getTeam() == team){
|
||||||
cons.get(player);
|
cons.get(player);
|
||||||
@@ -167,8 +162,8 @@ public class Units{
|
|||||||
|
|
||||||
/** Iterates over all units in a circle around this position. */
|
/** Iterates over all units in a circle around this position. */
|
||||||
public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){
|
public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){
|
||||||
unitGroups[team.ordinal()].intersect(x - radius, y - radius, radius*2f, radius*2f, unit -> {
|
unitGroup.intersect(x - radius, y - radius, radius*2f, radius*2f, unit -> {
|
||||||
if(unit.withinDst(x, y, radius)){
|
if(unit.getTeam() == team && unit.withinDst(x, y, radius)){
|
||||||
cons.get(unit);
|
cons.get(unit);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -182,45 +177,43 @@ public class Units{
|
|||||||
|
|
||||||
/** Iterates over all units in a rectangle. */
|
/** Iterates over all units in a rectangle. */
|
||||||
public static void nearby(float x, float y, float width, float height, Cons<Unit> cons){
|
public static void nearby(float x, float y, float width, float height, Cons<Unit> cons){
|
||||||
for(Team team : Team.all){
|
unitGroup.intersect(x, y, width, height, cons);
|
||||||
unitGroups[team.ordinal()].intersect(x, y, width, height, cons);
|
|
||||||
}
|
|
||||||
|
|
||||||
playerGroup.intersect(x, y, width, height, cons);
|
playerGroup.intersect(x, y, width, height, cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Iterates over all units in a rectangle. */
|
/** Iterates over all units in a rectangle. */
|
||||||
public static void nearby(Rectangle rect, Cons<Unit> cons){
|
public static void nearby(Rect rect, Cons<Unit> cons){
|
||||||
nearby(rect.x, rect.y, rect.width, rect.height, cons);
|
nearby(rect.x, rect.y, rect.width, rect.height, cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Iterates over all units that are enemies of this team. */
|
/** Iterates over all units that are enemies of this team. */
|
||||||
public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons<Unit> cons){
|
public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons<Unit> cons){
|
||||||
EnumSet<Team> targets = state.teams.enemiesOf(team);
|
unitGroup.intersect(x, y, width, height, u -> {
|
||||||
|
if(team.isEnemy(u.getTeam())){
|
||||||
for(Team other : targets){
|
cons.get(u);
|
||||||
unitGroups[other.ordinal()].intersect(x, y, width, height, cons);
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
playerGroup.intersect(x, y, width, height, player -> {
|
playerGroup.intersect(x, y, width, height, player -> {
|
||||||
if(targets.contains(player.getTeam())){
|
if(team.isEnemy(player.getTeam())){
|
||||||
cons.get(player);
|
cons.get(player);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Iterates over all units that are enemies of this team. */
|
/** Iterates over all units that are enemies of this team. */
|
||||||
public static void nearbyEnemies(Team team, Rectangle rect, Cons<Unit> cons){
|
public static void nearbyEnemies(Team team, Rect rect, Cons<Unit> cons){
|
||||||
nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons);
|
nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Iterates over all units. */
|
/** Iterates over all units. */
|
||||||
public static void all(Cons<Unit> cons){
|
public static void all(Cons<Unit> cons){
|
||||||
for(Team team : Team.all){
|
unitGroup.all().each(cons);
|
||||||
unitGroups[team.ordinal()].all().each(cons);
|
|
||||||
}
|
|
||||||
|
|
||||||
playerGroup.all().each(cons);
|
playerGroup.all().each(cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void each(Team team, Cons<BaseUnit> cons){
|
||||||
|
unitGroup.all().each(t -> t.getTeam() == team, cons);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class ArtilleryBulletType extends BasicBulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(mindustry.entities.type.Bullet b){
|
public void update(Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|
||||||
if(b.timer.get(0, 3 + b.fslope() * 2f)){
|
if(b.timer.get(0, 3 + b.fslope() * 2f)){
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package mindustry.entities.bullet;
|
package mindustry.entities.bullet;
|
||||||
|
|
||||||
import arc.math.geom.Rectangle;
|
import arc.math.geom.Rect;
|
||||||
import arc.util.Time;
|
import arc.util.Time;
|
||||||
import mindustry.content.Fx;
|
import mindustry.content.Fx;
|
||||||
import mindustry.entities.Units;
|
import mindustry.entities.Units;
|
||||||
import mindustry.entities.type.Bullet;
|
import mindustry.entities.type.Bullet;
|
||||||
|
|
||||||
public class FlakBulletType extends BasicBulletType{
|
public class FlakBulletType extends BasicBulletType{
|
||||||
protected static Rectangle rect = new Rectangle();
|
protected static Rect rect = new Rect();
|
||||||
protected float explodeRange = 30f;
|
protected float explodeRange = 30f;
|
||||||
|
|
||||||
public FlakBulletType(float speed, float damage){
|
public FlakBulletType(float speed, float damage){
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
|
|||||||
create(item, x, y, to, () -> to.addItem(item));
|
create(item, x, y, to, () -> to.addItem(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Remote(called = Loc.server)
|
@Remote(called = Loc.server, unreliable = true)
|
||||||
public static void transferItemTo(Item item, int amount, float x, float y, Tile tile){
|
public static void transferItemTo(Item item, int amount, float x, float y, Tile tile){
|
||||||
if(tile == null || tile.entity == null || tile.entity.items == null) return;
|
if(tile == null || tile.entity == null || tile.entity.items == null) return;
|
||||||
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){
|
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{
|
|||||||
public static final float lifetime = 10f;
|
public static final float lifetime = 10f;
|
||||||
|
|
||||||
private static final RandomXS128 random = new RandomXS128();
|
private static final RandomXS128 random = new RandomXS128();
|
||||||
private static final Rectangle rect = new Rectangle();
|
private static final Rect rect = new Rect();
|
||||||
private static final Array<Unit> entities = new Array<>();
|
private static final Array<Unit> entities = new Array<>();
|
||||||
private static final IntSet hit = new IntSet();
|
private static final IntSet hit = new IntSet();
|
||||||
private static final int maxChain = 8;
|
private static final int maxChain = 8;
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
|
|||||||
private static final float maxLiquid = 70f;
|
private static final float maxLiquid = 70f;
|
||||||
private static final int maxGeneration = 2;
|
private static final int maxGeneration = 2;
|
||||||
private static final Color tmp = new Color();
|
private static final Color tmp = new Color();
|
||||||
private static final Rectangle rect = new Rectangle();
|
private static final Rect rect = new Rect();
|
||||||
private static final Rectangle rect2 = new Rectangle();
|
private static final Rect rect2 = new Rect();
|
||||||
private static int seeds;
|
private static int seeds;
|
||||||
|
|
||||||
private int loadedPosition = -1;
|
private int loadedPosition = -1;
|
||||||
@@ -151,13 +151,13 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitbox(Rectangle rectangle){
|
public void hitbox(Rect rect){
|
||||||
rectangle.setCenter(x, y).setSize(tilesize);
|
rect.setCenter(x, y).setSize(tilesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitboxTile(Rectangle rectangle){
|
public void hitboxTile(Rect rect){
|
||||||
rectangle.setCenter(x, y).setSize(0f);
|
rect.setCenter(x, y).setSize(0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Rectangle bounds(Rectangle rect){
|
public Rect bounds(Rect rect){
|
||||||
if(breaking){
|
if(breaking){
|
||||||
return rect.set(-100f, -100f, 0f, 0f);
|
return rect.set(-100f, -100f, 0f, 0f);
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import arc.math.*;
|
|||||||
import arc.util.Time;
|
import arc.util.Time;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.entities.Effects;
|
import mindustry.entities.Effects;
|
||||||
|
import mindustry.entities.effect.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.gen.Call;
|
import mindustry.gen.Call;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
@@ -38,11 +39,26 @@ public interface MinerTrait extends Entity{
|
|||||||
/** Returns whether or not this builder can mine a specific item type. */
|
/** Returns whether or not this builder can mine a specific item type. */
|
||||||
boolean canMine(Item item);
|
boolean canMine(Item item);
|
||||||
|
|
||||||
|
/** @return whether to offload mined items immediately at the core. if false, items are collected and dropped in a burst. */
|
||||||
|
default boolean offloadImmediately(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
default void updateMining(){
|
default void updateMining(){
|
||||||
Unit unit = (Unit)this;
|
Unit unit = (Unit)this;
|
||||||
Tile tile = getMineTile();
|
Tile tile = getMineTile();
|
||||||
TileEntity core = unit.getClosestCore();
|
TileEntity core = unit.getClosestCore();
|
||||||
|
|
||||||
|
if(core != null && tile != null && tile.drop() != null && !unit.acceptsItem(tile.drop()) && unit.dst(core) < mineTransferRange){
|
||||||
|
int accepted = core.tile.block().acceptStack(unit.item().item, unit.item().amount, core.tile, unit);
|
||||||
|
if(accepted > 0){
|
||||||
|
Call.transferItemTo(unit.item().item, accepted,
|
||||||
|
tile.worldx() + Mathf.range(tilesize / 2f),
|
||||||
|
tile.worldy() + Mathf.range(tilesize / 2f), core.tile);
|
||||||
|
unit.clearItem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(tile == null || core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > getMiningRange()
|
if(tile == null || core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > getMiningRange()
|
||||||
|| tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){
|
|| tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){
|
||||||
setMineTile(null);
|
setMineTile(null);
|
||||||
@@ -52,12 +68,13 @@ public interface MinerTrait extends Entity{
|
|||||||
|
|
||||||
if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){
|
if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){
|
||||||
|
|
||||||
if(unit.dst(core) < mineTransferRange && core.tile.block().acceptStack(item, 1, core.tile, unit) == 1){
|
if(unit.dst(core) < mineTransferRange && core.tile.block().acceptStack(item, 1, core.tile, unit) == 1 && offloadImmediately()){
|
||||||
Call.transferItemTo(item, 1,
|
Call.transferItemTo(item, 1,
|
||||||
tile.worldx() + Mathf.range(tilesize / 2f),
|
tile.worldx() + Mathf.range(tilesize / 2f),
|
||||||
tile.worldy() + Mathf.range(tilesize / 2f), core.tile);
|
tile.worldy() + Mathf.range(tilesize / 2f), core.tile);
|
||||||
}else if(unit.acceptsItem(item)){
|
}else if(unit.acceptsItem(item)){
|
||||||
Call.transferItemToUnit(item,
|
//this is clientside, since items are synced anyway
|
||||||
|
ItemTransfer.transferItemToUnit(item,
|
||||||
tile.worldx() + Mathf.range(tilesize / 2f),
|
tile.worldx() + Mathf.range(tilesize / 2f),
|
||||||
tile.worldy() + Mathf.range(tilesize / 2f),
|
tile.worldy() + Mathf.range(tilesize / 2f),
|
||||||
unit);
|
unit);
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import mindustry.Vars;
|
|||||||
|
|
||||||
public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, Entity, Position{
|
public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, Entity, Position{
|
||||||
|
|
||||||
void hitbox(Rectangle rectangle);
|
void hitbox(Rect rect);
|
||||||
|
|
||||||
void hitboxTile(Rectangle rectangle);
|
void hitboxTile(Rect rect);
|
||||||
|
|
||||||
Vec2 lastPosition();
|
Vec2 lastPosition();
|
||||||
|
|
||||||
|
|||||||
@@ -126,6 +126,11 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
|
|||||||
this.team = team;
|
this.team = team;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return whether this unit counts toward the enemy amount in the wave UI. */
|
||||||
|
public boolean countsAsEnemy(){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public UnitType getType(){
|
public UnitType getType(){
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
@@ -180,23 +185,16 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Tile getClosest(BlockFlag flag){
|
public @Nullable Tile getClosest(BlockFlag flag){
|
||||||
return Geometry.findClosest(x, y, indexer.getAllied(team, flag));
|
return Geometry.findClosest(x, y, indexer.getAllied(team, flag));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Tile getClosestSpawner(){
|
public @Nullable Tile getClosestSpawner(){
|
||||||
return Geometry.findClosest(x, y, Vars.spawner.getGroundSpawns());
|
return Geometry.findClosest(x, y, Vars.spawner.getGroundSpawns());
|
||||||
}
|
}
|
||||||
|
|
||||||
public TileEntity getClosestEnemyCore(){
|
public @Nullable TileEntity getClosestEnemyCore(){
|
||||||
for(Team enemy : Vars.state.teams.enemiesOf(team)){
|
return Vars.state.teams.closestEnemyCore(x, y, team);
|
||||||
Tile tile = Geometry.findClosest(x, y, Vars.state.teams.get(enemy).cores);
|
|
||||||
if(tile != null){
|
|
||||||
return tile.entity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public UnitState getStartState(){
|
public UnitState getStartState(){
|
||||||
@@ -354,18 +352,18 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitbox(Rectangle rectangle){
|
public void hitbox(Rect rect){
|
||||||
rectangle.setSize(type.hitsize).setCenter(x, y);
|
rect.setSize(type.hitsize).setCenter(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitboxTile(Rectangle rectangle){
|
public void hitboxTile(Rect rect){
|
||||||
rectangle.setSize(type.hitsizeTile).setCenter(x, y);
|
rect.setSize(type.hitsizeTile).setCenter(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityGroup targetGroup(){
|
public EntityGroup targetGroup(){
|
||||||
return unitGroups[team.ordinal()];
|
return unitGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -246,13 +246,13 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitbox(Rectangle rectangle){
|
public void hitbox(Rect rect){
|
||||||
rectangle.setSize(type.hitSize).setCenter(x, y);
|
rect.setSize(type.hitSize).setCenter(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitboxTile(Rectangle rectangle){
|
public void hitboxTile(Rect rect){
|
||||||
rectangle.setSize(type.hitSize).setCenter(x, y);
|
rect.setSize(type.hitSize).setCenter(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
private static final int timerShootRight = 1;
|
private static final int timerShootRight = 1;
|
||||||
private static final float liftoffBoost = 0.2f;
|
private static final float liftoffBoost = 0.2f;
|
||||||
|
|
||||||
private static final Rectangle rect = new Rectangle();
|
private static final Rect rect = new Rect();
|
||||||
|
|
||||||
//region instance variables
|
//region instance variables
|
||||||
|
|
||||||
@@ -93,13 +93,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitbox(Rectangle rectangle){
|
public void hitbox(Rect rect){
|
||||||
rectangle.setSize(mech.hitsize).setCenter(x, y);
|
rect.setSize(mech.hitsize).setCenter(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hitboxTile(Rectangle rectangle){
|
public void hitboxTile(Rect rect){
|
||||||
rectangle.setSize(mech.hitsize * 2f / 3f).setCenter(x, y);
|
rect.setSize(mech.hitsize * 2f / 3f).setCenter(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -119,6 +119,11 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
heal();
|
heal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean offloadImmediately(){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeID getTypeID(){
|
public TypeID getTypeID(){
|
||||||
return TypeIDs.player;
|
return TypeIDs.player;
|
||||||
@@ -568,6 +573,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
|
|
||||||
protected void updateKeyboard(){
|
protected void updateKeyboard(){
|
||||||
Tile tile = world.tileWorld(x, y);
|
Tile tile = world.tileWorld(x, y);
|
||||||
|
boolean canMove = !Core.scene.hasKeyboard() || ui.minimapfrag.shown();
|
||||||
|
|
||||||
isBoosting = Core.input.keyDown(Binding.dash) && !mech.flying;
|
isBoosting = Core.input.keyDown(Binding.dash) && !mech.flying;
|
||||||
|
|
||||||
@@ -594,8 +600,8 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(Core.input.keyDown(Binding.mouse_move)){
|
if(Core.input.keyDown(Binding.mouse_move)){
|
||||||
movement.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2) * 0.005f, -1, 1) * speed;
|
movement.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2f) * 0.005f, -1, 1) * speed;
|
||||||
movement.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2) * 0.005f, -1, 1) * speed;
|
movement.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2f) * 0.005f, -1, 1) * speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY());
|
Vec2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY());
|
||||||
@@ -605,7 +611,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
|
|
||||||
movement.limit(speed).scl(Time.delta());
|
movement.limit(speed).scl(Time.delta());
|
||||||
|
|
||||||
if(!Core.scene.hasKeyboard()){
|
if(canMove){
|
||||||
velocity.add(movement.x, movement.y);
|
velocity.add(movement.x, movement.y);
|
||||||
}else{
|
}else{
|
||||||
isShooting = false;
|
isShooting = false;
|
||||||
@@ -614,7 +620,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
updateVelocityStatus();
|
updateVelocityStatus();
|
||||||
moved = dst(prex, prey) > 0.001f;
|
moved = dst(prex, prey) > 0.001f;
|
||||||
|
|
||||||
if(!Core.scene.hasKeyboard()){
|
if(canMove){
|
||||||
float baseLerp = mech.getRotationAlpha(this);
|
float baseLerp = mech.getRotationAlpha(this);
|
||||||
if(!isShooting() || !mech.turnCursor){
|
if(!isShooting() || !mech.turnCursor){
|
||||||
if(!movement.isZero()){
|
if(!movement.isZero()){
|
||||||
@@ -631,7 +637,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
if(!state.isEditor() && isShooting() && mech.canShoot(this)){
|
if(!state.isEditor() && isShooting() && mech.canShoot(this)){
|
||||||
if(!mech.turnCursor){
|
if(!mech.turnCursor){
|
||||||
//shoot forward ignoring cursor
|
//shoot forward ignoring cursor
|
||||||
mech.weapon.update(this, x + Angles.trnsx(rotation, 1f), y + Angles.trnsy(rotation, 1f));
|
mech.weapon.update(this, x + Angles.trnsx(rotation, mech.weapon.targetDistance), y + Angles.trnsy(rotation, mech.weapon.targetDistance));
|
||||||
}else{
|
}else{
|
||||||
mech.weapon.update(this, pointerX, pointerY);
|
mech.weapon.update(this, pointerX, pointerY);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package mindustry.entities.type;
|
package mindustry.entities.type;
|
||||||
|
|
||||||
|
import arc.math.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import arc.Events;
|
import arc.Events;
|
||||||
import arc.struct.Array;
|
import arc.struct.Array;
|
||||||
@@ -124,7 +125,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
|
|||||||
@CallSuper
|
@CallSuper
|
||||||
public void write(DataOutput stream) throws IOException{
|
public void write(DataOutput stream) throws IOException{
|
||||||
stream.writeShort((short)health);
|
stream.writeShort((short)health);
|
||||||
stream.writeByte(Pack.byteByte(tile.getTeamID(), tile.rotation())); //team + rotation
|
stream.writeByte(Pack.byteByte((byte)8, tile.rotation())); //rotation + marker to indicate that team is moved (8 isn't valid)
|
||||||
|
stream.writeByte(tile.getTeamID());
|
||||||
if(items != null) items.write(stream);
|
if(items != null) items.write(stream);
|
||||||
if(power != null) power.write(stream);
|
if(power != null) power.write(stream);
|
||||||
if(liquids != null) liquids.write(stream);
|
if(liquids != null) liquids.write(stream);
|
||||||
@@ -134,11 +136,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
|
|||||||
@CallSuper
|
@CallSuper
|
||||||
public void read(DataInput stream, byte revision) throws IOException{
|
public void read(DataInput stream, byte revision) throws IOException{
|
||||||
health = stream.readUnsignedShort();
|
health = stream.readUnsignedShort();
|
||||||
byte tr = stream.readByte();
|
byte packedrot = stream.readByte();
|
||||||
byte team = Pack.leftByte(tr);
|
byte team = Pack.leftByte(packedrot) == 8 ? stream.readByte() : Pack.leftByte(packedrot);
|
||||||
byte rotation = Pack.rightByte(tr);
|
byte rotation = Pack.rightByte(packedrot);
|
||||||
|
|
||||||
tile.setTeam(Team.all[team]);
|
tile.setTeam(Team.get(team));
|
||||||
tile.rotation(rotation);
|
tile.rotation(rotation);
|
||||||
|
|
||||||
if(items != null) items.read(stream);
|
if(items != null) items.read(stream);
|
||||||
@@ -164,9 +166,16 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
|
|||||||
Call.onTileDestroyed(tile);
|
Call.onTileDestroyed(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void damage(float damage){
|
public void damage(float damage){
|
||||||
if(dead) return;
|
if(dead) return;
|
||||||
|
|
||||||
|
if(Mathf.zero(state.rules.blockHealthMultiplier)){
|
||||||
|
damage = health + 1;
|
||||||
|
}else{
|
||||||
|
damage /= state.rules.blockHealthMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
float preHealth = health;
|
float preHealth = health;
|
||||||
|
|
||||||
Call.onTileDamage(tile, health - block.handleDamage(tile, damage));
|
Call.onTileDamage(tile, health - block.handleDamage(tile, damage));
|
||||||
@@ -277,7 +286,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
|
|||||||
Events.fire(new BlockDestroyEvent(tile));
|
Events.fire(new BlockDestroyEvent(tile));
|
||||||
block.breakSound.at(tile);
|
block.breakSound.at(tile);
|
||||||
block.onDestroyed(tile);
|
block.onDestroyed(tile);
|
||||||
world.removeBlock(tile);
|
tile.remove();
|
||||||
remove();
|
remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package mindustry.entities.type;
|
package mindustry.entities.type;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.ArcAnnotate.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
@@ -16,13 +16,11 @@ import mindustry.entities.traits.*;
|
|||||||
import mindustry.entities.units.*;
|
import mindustry.entities.units.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.game.Teams.*;
|
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.net.*;
|
import mindustry.net.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
import mindustry.ui.Cicon;
|
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.*;
|
import mindustry.world.blocks.*;
|
||||||
|
|
||||||
@@ -90,7 +88,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
if(isDead()) return false;
|
if(isDead()) return false;
|
||||||
|
|
||||||
if(other instanceof DamageTrait){
|
if(other instanceof DamageTrait){
|
||||||
return other instanceof TeamTrait && state.teams.areEnemies((((TeamTrait)other).getTeam()), team);
|
return other instanceof TeamTrait && (((TeamTrait)other).getTeam()).isEnemy(team);
|
||||||
}else{
|
}else{
|
||||||
return other instanceof Unit && ((Unit)other).isFlying() == isFlying();
|
return other instanceof Unit && ((Unit)other).isFlying() == isFlying();
|
||||||
}
|
}
|
||||||
@@ -158,7 +156,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
this.item.amount = itemAmount;
|
this.item.amount = itemAmount;
|
||||||
this.item.item = content.item(itemID);
|
this.item.item = content.item(itemID);
|
||||||
this.dead = dead;
|
this.dead = dead;
|
||||||
this.team = Team.all[team];
|
this.team = Team.get(team);
|
||||||
this.health = health;
|
this.health = health;
|
||||||
this.x = x;
|
this.x = x;
|
||||||
this.y = y;
|
this.y = y;
|
||||||
@@ -169,7 +167,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
public void writeSave(DataOutput stream, boolean net) throws IOException{
|
public void writeSave(DataOutput stream, boolean net) throws IOException{
|
||||||
if(item.item == null) item.item = Items.copper;
|
if(item.item == null) item.item = Items.copper;
|
||||||
|
|
||||||
stream.writeByte(team.ordinal());
|
stream.writeByte(team.id);
|
||||||
stream.writeBoolean(isDead());
|
stream.writeBoolean(isDead());
|
||||||
stream.writeFloat(net ? interpolator.target.x : x);
|
stream.writeFloat(net ? interpolator.target.x : x);
|
||||||
stream.writeFloat(net ? interpolator.target.y : y);
|
stream.writeFloat(net ? interpolator.target.y : y);
|
||||||
@@ -217,13 +215,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
float fsize = getSize() / radScl;
|
float fsize = getSize() / radScl;
|
||||||
moveVector.setZero();
|
moveVector.setZero();
|
||||||
float cx = x - fsize/2f, cy = y - fsize/2f;
|
float cx = x - fsize/2f, cy = y - fsize/2f;
|
||||||
|
avoid(unitGroup.intersect(cx, cy, fsize, fsize));
|
||||||
for(Team team : Team.all){
|
|
||||||
if(team != getTeam() || !(this instanceof Player)){
|
|
||||||
avoid(unitGroups[team.ordinal()].intersect(cx, cy, fsize, fsize));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!(this instanceof Player)){
|
if(!(this instanceof Player)){
|
||||||
avoid(playerGroup.intersect(cx, cy, fsize, fsize));
|
avoid(playerGroup.intersect(cx, cy, fsize, fsize));
|
||||||
}
|
}
|
||||||
@@ -234,7 +226,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
float radScl = 1.5f;
|
float radScl = 1.5f;
|
||||||
|
|
||||||
for(Unit en : arr){
|
for(Unit en : arr){
|
||||||
if(en.isFlying() != isFlying() || (en instanceof Player && en.getTeam() != getTeam())) continue;
|
if(en.isFlying() != isFlying() || (en instanceof Player && en.getTeam() != getTeam()) || (this instanceof Player && en.isFlying())) continue;
|
||||||
float dst = dst(en);
|
float dst = dst(en);
|
||||||
float scl = Mathf.clamp(1f - dst / (getSize()/(radScl*2f) + en.getSize()/(radScl*2f)));
|
float scl = Mathf.clamp(1f - dst / (getSize()/(radScl*2f) + en.getSize()/(radScl*2f)));
|
||||||
moveVector.add(Tmp.v1.set((x - en.x) * scl, (y - en.y) * scl).limit(0.4f));
|
moveVector.add(Tmp.v1.set((x - en.x) * scl, (y - en.y) * scl).limit(0.4f));
|
||||||
@@ -242,14 +234,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable TileEntity getClosestCore(){
|
public @Nullable TileEntity getClosestCore(){
|
||||||
TeamData data = state.teams.get(team);
|
return state.teams.closestCore(x, y, team);
|
||||||
|
|
||||||
Tile tile = Geometry.findClosest(x, y, data.cores);
|
|
||||||
if(tile == null){
|
|
||||||
return null;
|
|
||||||
}else{
|
|
||||||
return tile.entity;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Floor getFloorOn(){
|
public Floor getFloorOn(){
|
||||||
@@ -275,7 +260,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
}
|
}
|
||||||
|
|
||||||
//apply knockback based on spawns
|
//apply knockback based on spawns
|
||||||
if(getTeam() != waveTeam){
|
if(getTeam() != state.rules.waveTeam){
|
||||||
float relativeSize = state.rules.dropZoneRadius + getSize()/2f + 1f;
|
float relativeSize = state.rules.dropZoneRadius + getSize()/2f + 1f;
|
||||||
for(Tile spawn : spawner.getGroundSpawns()){
|
for(Tile spawn : spawner.getGroundSpawns()){
|
||||||
if(withinDst(spawn.worldx(), spawn.worldy(), relativeSize)){
|
if(withinDst(spawn.worldx(), spawn.worldy(), relativeSize)){
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ public abstract class BaseDrone extends FlyingUnit{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public boolean countsAsEnemy(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(UnitCommand command){
|
public void onCommand(UnitCommand command){
|
||||||
//do nothing, normal commands are not applicable here
|
//do nothing, normal commands are not applicable here
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
package mindustry.entities.type.base;
|
package mindustry.entities.type.base;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.*;
|
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.entities.traits.*;
|
import mindustry.entities.traits.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
@@ -114,12 +113,10 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{
|
|||||||
public BuilderDrone(){
|
public BuilderDrone(){
|
||||||
if(reset.check()){
|
if(reset.check()){
|
||||||
Events.on(BuildSelectEvent.class, event -> {
|
Events.on(BuildSelectEvent.class, event -> {
|
||||||
EntityGroup<BaseUnit> group = unitGroups[event.team.ordinal()];
|
|
||||||
|
|
||||||
if(!(event.tile.entity instanceof BuildEntity)) return;
|
if(!(event.tile.entity instanceof BuildEntity)) return;
|
||||||
|
|
||||||
for(BaseUnit unit : group.all()){
|
for(BaseUnit unit : unitGroup.all()){
|
||||||
if(unit instanceof BuilderDrone){
|
if(unit instanceof BuilderDrone && unit.getTeam() == getTeam()){
|
||||||
BuilderDrone drone = (BuilderDrone)unit;
|
BuilderDrone drone = (BuilderDrone)unit;
|
||||||
if(drone.isBuilding()){
|
if(drone.isBuilding()){
|
||||||
//stop building if opposite building begins.
|
//stop building if opposite building begins.
|
||||||
@@ -189,7 +186,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(timer.get(timerTarget, 80) && Units.closestEnemy(getTeam(), x, y, 100f, u -> !(u instanceof BaseDrone)) == null && !isBuilding()){
|
if(timer.get(timerTarget, 80) && Units.closestEnemy(getTeam(), x, y, 100f, u -> !(u instanceof BaseDrone)) == null && !isBuilding()){
|
||||||
TeamData data = Vars.state.teams.get(team);
|
TeamData data = team.data();
|
||||||
if(!data.brokenBlocks.isEmpty()){
|
if(!data.brokenBlocks.isEmpty()){
|
||||||
BrokenBlock block = data.brokenBlocks.removeLast();
|
BrokenBlock block = data.brokenBlocks.removeLast();
|
||||||
if(Build.validPlace(getTeam(), block.x, block.y, content.block(block.block), block.rotation)){
|
if(Build.validPlace(getTeam(), block.x, block.y, content.block(block.block), block.rotation)){
|
||||||
|
|||||||
@@ -237,15 +237,15 @@ public class GroundUnit extends BaseUnit{
|
|||||||
|
|
||||||
protected void moveAwayFromCore(){
|
protected void moveAwayFromCore(){
|
||||||
Team enemy = null;
|
Team enemy = null;
|
||||||
for(Team team : Vars.state.teams.enemiesOf(team)){
|
for(Team team : team.enemies()){
|
||||||
if(Vars.state.teams.isActive(team)){
|
if(team.active()){
|
||||||
enemy = team;
|
enemy = team;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(enemy == null){
|
if(enemy == null){
|
||||||
for(Team team : Vars.state.teams.enemiesOf(team)){
|
for(Team team : team.enemies()){
|
||||||
enemy = team;
|
enemy = team;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,14 @@ import mindustry.entities.type.BaseUnit;
|
|||||||
import mindustry.entities.type.TileEntity;
|
import mindustry.entities.type.TileEntity;
|
||||||
import mindustry.gen.Call;
|
import mindustry.gen.Call;
|
||||||
import mindustry.type.Item;
|
import mindustry.type.Item;
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class UnitDrops{
|
public class UnitDrops{
|
||||||
private static Item[] dropTable;
|
private static Item[] dropTable;
|
||||||
|
|
||||||
public static void dropItems(BaseUnit unit){
|
public static void dropItems(BaseUnit unit){
|
||||||
//items only dropped in waves for enemy team
|
//items only dropped in waves for enemy team
|
||||||
if(unit.getTeam() != Vars.waveTeam || !Vars.state.rules.unitDrops){
|
if(unit.getTeam() != state.rules.waveTeam || !Vars.state.rules.unitDrops){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ public class EventType{
|
|||||||
exclusionDeath,
|
exclusionDeath,
|
||||||
suicideBomb,
|
suicideBomb,
|
||||||
openWiki,
|
openWiki,
|
||||||
teamCoreDamage
|
teamCoreDamage,
|
||||||
|
socketConfigChanged,
|
||||||
|
update
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class WinEvent{}
|
public static class WinEvent{}
|
||||||
@@ -62,10 +64,13 @@ public class EventType{
|
|||||||
public static class PlayerChatEvent{
|
public static class PlayerChatEvent{
|
||||||
public final Player player;
|
public final Player player;
|
||||||
public final String message;
|
public final String message;
|
||||||
|
/** The original, unfiltered message. */
|
||||||
|
public final String originalMessage;
|
||||||
|
|
||||||
public PlayerChatEvent(Player player, String message){
|
public PlayerChatEvent(Player player, String message, String originalMessage){
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.message = message;
|
this.message = message;
|
||||||
|
this.originalMessage = originalMessage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import arc.*;
|
|||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
|
|
||||||
import static mindustry.Vars.waveTeam;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
/** Defines preset rule sets. */
|
/** Defines preset rule sets. */
|
||||||
public enum Gamemode{
|
public enum Gamemode{
|
||||||
@@ -22,7 +22,7 @@ public enum Gamemode{
|
|||||||
attack(rules -> {
|
attack(rules -> {
|
||||||
rules.unitDrops = true;
|
rules.unitDrops = true;
|
||||||
rules.attackMode = true;
|
rules.attackMode = true;
|
||||||
}, map -> map.teams.contains(waveTeam.ordinal())),
|
}, map -> map.teams.contains((int)state.rules.waveTeam.id)),
|
||||||
pvp(rules -> {
|
pvp(rules -> {
|
||||||
rules.pvp = true;
|
rules.pvp = true;
|
||||||
rules.enemyCoreBuildRadius = 600f;
|
rules.enemyCoreBuildRadius = 600f;
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public class MusicControl{
|
|||||||
|
|
||||||
/** Whether to play dark music.*/
|
/** Whether to play dark music.*/
|
||||||
private boolean isDark(){
|
private boolean isDark(){
|
||||||
if(!state.teams.get(player.getTeam()).cores.isEmpty() && state.teams.get(player.getTeam()).cores.first().entity.healthf() < 0.85f){
|
if(state.teams.get(player.getTeam()).hasCore() && state.teams.get(player.getTeam()).core().healthf() < 0.85f){
|
||||||
//core damaged -> dark
|
//core damaged -> dark
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ public class MusicControl{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//dark based on enemies
|
//dark based on enemies
|
||||||
return Mathf.chance(state.enemies() / 70f + 0.1f);
|
return Mathf.chance(state.enemies / 70f + 0.1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Plays and fades in a music track. This must be called every frame.
|
/** Plays and fades in a music track. This must be called every frame.
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ public class Rules{
|
|||||||
public float unitHealthMultiplier = 1f;
|
public float unitHealthMultiplier = 1f;
|
||||||
/** How much health players start with. */
|
/** How much health players start with. */
|
||||||
public float playerHealthMultiplier = 1f;
|
public float playerHealthMultiplier = 1f;
|
||||||
|
/** How much health blocks start with. */
|
||||||
|
public float blockHealthMultiplier = 1f;
|
||||||
/** How much damage player mechs deal. */
|
/** How much damage player mechs deal. */
|
||||||
public float playerDamageMultiplier = 1f;
|
public float playerDamageMultiplier = 1f;
|
||||||
/** How much damage any other units deal. */
|
/** How much damage any other units deal. */
|
||||||
@@ -70,6 +72,8 @@ public class Rules{
|
|||||||
public boolean editor = false;
|
public boolean editor = false;
|
||||||
/** Whether the tutorial is enabled. False by default. */
|
/** Whether the tutorial is enabled. False by default. */
|
||||||
public boolean tutorial = false;
|
public boolean tutorial = false;
|
||||||
|
/** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */
|
||||||
|
public boolean canGameOver = true;
|
||||||
/** Starting items put in cores */
|
/** Starting items put in cores */
|
||||||
public Array<ItemStack> loadout = Array.with(ItemStack.with(Items.copper, 100));
|
public Array<ItemStack> loadout = Array.with(ItemStack.with(Items.copper, 100));
|
||||||
/** Blocks that cannot be placed. */
|
/** Blocks that cannot be placed. */
|
||||||
@@ -78,6 +82,12 @@ public class Rules{
|
|||||||
public boolean lighting = false;
|
public boolean lighting = false;
|
||||||
/** Ambient light color, used when lighting is enabled. */
|
/** Ambient light color, used when lighting is enabled. */
|
||||||
public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f);
|
public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f);
|
||||||
|
/** team of the player by default */
|
||||||
|
public Team defaultTeam = Team.sharded;
|
||||||
|
/** team of the enemy in waves/sectors */
|
||||||
|
public Team waveTeam = Team.crux;
|
||||||
|
/** special tags for additional info */
|
||||||
|
public StringMap tags = new StringMap();
|
||||||
|
|
||||||
/** Copies this ruleset exactly. Not very efficient at all, do not use often. */
|
/** Copies this ruleset exactly. Not very efficient at all, do not use often. */
|
||||||
public Rules copy(){
|
public Rules copy(){
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ public class Schematics implements Loadable{
|
|||||||
ui.showException(e);
|
ui.showException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
all.sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void savePreview(Schematic schematic, Fi file){
|
public void savePreview(Schematic schematic, Fi file){
|
||||||
@@ -249,12 +250,13 @@ public class Schematics implements Loadable{
|
|||||||
|
|
||||||
public void placeLoadout(Schematic schem, int x, int y){
|
public void placeLoadout(Schematic schem, int x, int y){
|
||||||
Stile coreTile = schem.tiles.find(s -> s.block instanceof CoreBlock);
|
Stile coreTile = schem.tiles.find(s -> s.block instanceof CoreBlock);
|
||||||
|
if(coreTile == null) throw new IllegalArgumentException("Schematic has no core tile. Exiting.");
|
||||||
int ox = x - coreTile.x, oy = y - coreTile.y;
|
int ox = x - coreTile.x, oy = y - coreTile.y;
|
||||||
schem.tiles.each(st -> {
|
schem.tiles.each(st -> {
|
||||||
Tile tile = world.tile(st.x + ox, st.y + oy);
|
Tile tile = world.tile(st.x + ox, st.y + oy);
|
||||||
if(tile == null) return;
|
if(tile == null) return;
|
||||||
|
|
||||||
world.setBlock(tile, st.block, defaultTeam);
|
tile.set(st.block, state.rules.defaultTeam);
|
||||||
tile.rotation(st.rotation);
|
tile.rotation(st.rotation);
|
||||||
if(st.block.posConfig){
|
if(st.block.posConfig){
|
||||||
tile.configureAny(Pos.get(tile.x - st.x + Pos.x(st.config), tile.y - st.y + Pos.y(st.config)));
|
tile.configureAny(Pos.get(tile.x - st.x + Pos.x(st.config), tile.y - st.y + Pos.y(st.config)));
|
||||||
@@ -279,6 +281,7 @@ public class Schematics implements Loadable{
|
|||||||
ui.showException(e);
|
ui.showException(e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
|
all.sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(Schematic s){
|
public void remove(Schematic s){
|
||||||
@@ -291,6 +294,7 @@ public class Schematics implements Loadable{
|
|||||||
previews.get(s).dispose();
|
previews.get(s).dispose();
|
||||||
previews.remove(s);
|
previews.remove(s);
|
||||||
}
|
}
|
||||||
|
all.sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates a schematic from a world selection. */
|
/** Creates a schematic from a world selection. */
|
||||||
@@ -339,7 +343,8 @@ public class Schematics implements Loadable{
|
|||||||
for(int cy = oy; cy <= oy2; cy++){
|
for(int cy = oy; cy <= oy2; cy++){
|
||||||
Tile tile = world.ltile(cx, cy);
|
Tile tile = world.ltile(cx, cy);
|
||||||
|
|
||||||
if(tile != null && tile.entity != null && !counted.contains(tile.pos()) && !(tile.block() instanceof BuildBlock) && tile.entity.block.isVisible()){
|
if(tile != null && tile.entity != null && !counted.contains(tile.pos()) && !(tile.block() instanceof BuildBlock)
|
||||||
|
&& (tile.entity.block.isVisible() || (tile.entity.block instanceof CoreBlock && Core.settings.getBool("coreselect")))){
|
||||||
int config = tile.entity.config();
|
int config = tile.entity.config();
|
||||||
if(tile.block().posConfig){
|
if(tile.block().posConfig){
|
||||||
config = Pos.get(Pos.x(config) + offsetX, Pos.y(config) + offsetY);
|
config = Pos.get(Pos.x(config) + offsetX, Pos.y(config) + offsetY);
|
||||||
@@ -368,8 +373,12 @@ public class Schematics implements Loadable{
|
|||||||
//region IO methods
|
//region IO methods
|
||||||
|
|
||||||
/** Loads a schematic from base64. May throw an exception. */
|
/** Loads a schematic from base64. May throw an exception. */
|
||||||
public static Schematic readBase64(String schematic) throws IOException{
|
public static Schematic readBase64(String schematic){
|
||||||
|
try{
|
||||||
return read(new ByteArrayInputStream(Base64Coder.decode(schematic)));
|
return read(new ByteArrayInputStream(Base64Coder.decode(schematic)));
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Schematic read(Fi file) throws IOException{
|
public static Schematic read(Fi file) throws IOException{
|
||||||
|
|||||||
@@ -1,27 +1,102 @@
|
|||||||
package mindustry.game;
|
package mindustry.game;
|
||||||
|
|
||||||
import arc.Core;
|
import arc.*;
|
||||||
import arc.graphics.Color;
|
import arc.graphics.*;
|
||||||
|
import arc.math.*;
|
||||||
|
import arc.struct.*;
|
||||||
|
import arc.util.*;
|
||||||
|
import mindustry.game.Teams.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||||
|
|
||||||
public enum Team{
|
import static mindustry.Vars.*;
|
||||||
derelict(Color.valueOf("4d4e58")),
|
|
||||||
sharded(Pal.accent),
|
|
||||||
crux(Color.valueOf("e82d2d")),
|
|
||||||
green(Color.valueOf("4dd98b")),
|
|
||||||
purple(Color.valueOf("9a4bdf")),
|
|
||||||
blue(Color.royal.cpy());
|
|
||||||
|
|
||||||
public final static Team[] all = values();
|
public class Team implements Comparable<Team>{
|
||||||
|
public final byte id;
|
||||||
public final Color color;
|
public final Color color;
|
||||||
public final int intColor;
|
public String name;
|
||||||
|
|
||||||
Team(Color color){
|
/** All 256 registered teams. */
|
||||||
|
private static final Team[] all = new Team[256];
|
||||||
|
/** The 6 base teams used in the editor. */
|
||||||
|
private static final Team[] baseTeams = new Team[6];
|
||||||
|
|
||||||
|
public final static Team
|
||||||
|
derelict = new Team(0, "derelict", Color.valueOf("4d4e58")),
|
||||||
|
sharded = new Team(1, "sharded", Pal.accent.cpy()),
|
||||||
|
crux = new Team(2, "crux", Color.valueOf("e82d2d")),
|
||||||
|
green = new Team(3, "green", Color.valueOf("4dd98b")),
|
||||||
|
purple = new Team(4, "purple", Color.valueOf("9a4bdf")),
|
||||||
|
blue = new Team(5, "blue", Color.royal.cpy());
|
||||||
|
|
||||||
|
static{
|
||||||
|
Mathf.random.setSeed(8);
|
||||||
|
//create the whole 256 placeholder teams
|
||||||
|
for(int i = 6; i < all.length; i++){
|
||||||
|
new Team(i, "team#" + i, Color.HSVtoRGB(360f * Mathf.random(), 100f * Mathf.random(0.6f, 1f), 100f * Mathf.random(0.8f, 1f), 1f));
|
||||||
|
}
|
||||||
|
Mathf.random.setSeed(new RandomXS128().nextLong());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Team get(int id){
|
||||||
|
return all[Pack.u((byte)id)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return the 6 base team colors. */
|
||||||
|
public static Team[] base(){
|
||||||
|
return baseTeams;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return all the teams - do not use this for lookup! */
|
||||||
|
public static Team[] all(){
|
||||||
|
return all;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Team(int id, String name, Color color){
|
||||||
|
this.name = name;
|
||||||
this.color = color;
|
this.color = color;
|
||||||
intColor = Color.rgba8888(color);
|
this.id = (byte)id;
|
||||||
|
|
||||||
|
int us = Pack.u(this.id);
|
||||||
|
if(us < 6) baseTeams[us] = this;
|
||||||
|
all[us] = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Array<Team> enemies(){
|
||||||
|
return state.teams.enemiesOf(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TeamData data(){
|
||||||
|
return state.teams.get(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoreEntity core(){
|
||||||
|
return data().core();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean active(){
|
||||||
|
return state.teams.isActive(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnemy(Team other){
|
||||||
|
return state.teams.areEnemies(this, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Array<CoreEntity> cores(){
|
||||||
|
return state.teams.cores(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String localized(){
|
public String localized(){
|
||||||
return Core.bundle.get("team." + name() + ".name");
|
return Core.bundle.get("team." + name + ".name", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Team team){
|
||||||
|
return Integer.compare(id, team.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,61 +1,168 @@
|
|||||||
package mindustry.game;
|
package mindustry.game;
|
||||||
|
|
||||||
|
import arc.func.*;
|
||||||
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import mindustry.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
import mindustry.world.*;
|
import arc.util.*;
|
||||||
|
import mindustry.entities.type.*;
|
||||||
|
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
/** Class for various team-based utilities. */
|
/** Class for various team-based utilities. */
|
||||||
public class Teams{
|
public class Teams{
|
||||||
private TeamData[] map = new TeamData[Team.all.length];
|
/** Maps team IDs to team data. */
|
||||||
|
private TeamData[] map = new TeamData[256];
|
||||||
|
/** Active teams. */
|
||||||
|
private Array<TeamData> active = new Array<>();
|
||||||
|
|
||||||
/**
|
public @Nullable CoreEntity closestEnemyCore(float x, float y, Team team){
|
||||||
* Register a team.
|
for(TeamData data : active){
|
||||||
* @param team The team type enum.
|
if(areEnemies(team, data.team)){
|
||||||
* @param enemies The array of enemies of this team. Any team not in this array is considered neutral.
|
CoreEntity tile = Geometry.findClosest(x, y, data.cores);
|
||||||
*/
|
if(tile != null){
|
||||||
public void add(Team team, Team... enemies){
|
return tile;
|
||||||
map[team.ordinal()] = new TeamData(team, EnumSet.of(enemies));
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @Nullable CoreEntity closestCore(float x, float y, Team team){
|
||||||
|
return Geometry.findClosest(x, y, get(team).cores);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Array<Team> enemiesOf(Team team){
|
||||||
|
return get(team).enemies;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean eachEnemyCore(Team team, Boolf<CoreEntity> ret){
|
||||||
|
for(TeamData data : active){
|
||||||
|
if(areEnemies(team, data.team)){
|
||||||
|
for(CoreEntity tile : data.cores){
|
||||||
|
if(ret.get(tile)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void eachEnemyCore(Team team, Cons<TileEntity> ret){
|
||||||
|
for(TeamData data : active){
|
||||||
|
if(areEnemies(team, data.team)){
|
||||||
|
for(TileEntity tile : data.cores){
|
||||||
|
ret.get(tile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns team data by type. */
|
/** Returns team data by type. */
|
||||||
public TeamData get(Team team){
|
public TeamData get(Team team){
|
||||||
if(map[team.ordinal()] == null){
|
if(map[Pack.u(team.id)] == null){
|
||||||
add(team, Array.with(Team.all).select(t -> t != team).toArray(Team.class));
|
map[Pack.u(team.id)] = new TeamData(team);
|
||||||
}
|
}
|
||||||
return map[team.ordinal()];
|
return map[Pack.u(team.id)];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Array<CoreEntity> playerCores(){
|
||||||
|
return get(state.rules.defaultTeam).cores;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Do not modify! */
|
||||||
|
public Array<CoreEntity> cores(Team team){
|
||||||
|
return get(team).cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns whether a team is active, e.g. whether it has any cores remaining. */
|
/** Returns whether a team is active, e.g. whether it has any cores remaining. */
|
||||||
public boolean isActive(Team team){
|
public boolean isActive(Team team){
|
||||||
//the enemy wave team is always active
|
//the enemy wave team is always active
|
||||||
return team == Vars.waveTeam || get(team).cores.size > 0;
|
return get(team).active();
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns a set of all teams that are enemies of this team. */
|
|
||||||
public EnumSet<Team> enemiesOf(Team team){
|
|
||||||
return get(team).enemies;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns whether {@param other} is an enemy of {@param #team}. */
|
/** Returns whether {@param other} is an enemy of {@param #team}. */
|
||||||
public boolean areEnemies(Team team, Team other){
|
public boolean areEnemies(Team team, Team other){
|
||||||
return enemiesOf(team).contains(other);
|
//todo what about derelict?
|
||||||
|
return team != other;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocates a new array with the active teams.
|
public boolean canInteract(Team team, Team other){
|
||||||
* Never call in the main game loop.*/
|
return team == other || other == Team.derelict;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Do not modify. */
|
||||||
public Array<TeamData> getActive(){
|
public Array<TeamData> getActive(){
|
||||||
return Array.select(map, t -> t != null);
|
return active;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TeamData{
|
public void registerCore(CoreEntity core){
|
||||||
public final ObjectSet<Tile> cores = new ObjectSet<>();
|
TeamData data = get(core.getTeam());
|
||||||
public final EnumSet<Team> enemies;
|
//add core if not present
|
||||||
|
if(!data.cores.contains(core)){
|
||||||
|
data.cores.add(core);
|
||||||
|
}
|
||||||
|
|
||||||
|
//register in active list if needed
|
||||||
|
if(data.active() && !active.contains(data)){
|
||||||
|
active.add(data);
|
||||||
|
updateEnemies();
|
||||||
|
indexer.updateTeamIndex(data.team);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregisterCore(CoreEntity entity){
|
||||||
|
TeamData data = get(entity.getTeam());
|
||||||
|
//remove core
|
||||||
|
data.cores.remove(entity);
|
||||||
|
//unregister in active list
|
||||||
|
if(!data.active()){
|
||||||
|
active.remove(data);
|
||||||
|
updateEnemies();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateEnemies(){
|
||||||
|
if(!active.contains(get(state.rules.waveTeam))){
|
||||||
|
active.add(get(state.rules.waveTeam));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(TeamData data : active){
|
||||||
|
data.enemies.clear();
|
||||||
|
for(TeamData other : active){
|
||||||
|
if(areEnemies(data.team, other.team)){
|
||||||
|
data.enemies.add(other.team);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TeamData{
|
||||||
|
public final Array<CoreEntity> cores = new Array<>();
|
||||||
|
public final Array<Team> enemies = new Array<>();
|
||||||
public final Team team;
|
public final Team team;
|
||||||
public Queue<BrokenBlock> brokenBlocks = new Queue<>();
|
public Queue<BrokenBlock> brokenBlocks = new Queue<>();
|
||||||
|
|
||||||
public TeamData(Team team, EnumSet<Team> enemies){
|
public TeamData(Team team){
|
||||||
this.team = team;
|
this.team = team;
|
||||||
this.enemies = enemies;
|
}
|
||||||
|
|
||||||
|
public boolean active(){
|
||||||
|
return (team == state.rules.waveTeam && state.rules.waves) || cores.size > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasCore(){
|
||||||
|
return cores.size > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean noCores(){
|
||||||
|
return cores.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoreEntity core(){
|
||||||
|
return cores.first();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import arc.scene.ui.*;
|
|||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
@@ -161,11 +162,11 @@ public class Tutorial{
|
|||||||
},
|
},
|
||||||
withdraw(() -> event("withdraw")){
|
withdraw(() -> event("withdraw")){
|
||||||
void begin(){
|
void begin(){
|
||||||
state.teams.get(defaultTeam).cores.first().entity.items.add(Items.copper, 10);
|
state.teams.playerCores().first().items.add(Items.copper, 10);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
deposit(() -> event("deposit")),
|
deposit(() -> event("deposit")),
|
||||||
waves(() -> state.wave > 2 && state.enemies() <= 0 && !spawner.isSpawning()){
|
waves(() -> state.wave > 2 && state.enemies <= 0 && !spawner.isSpawning()){
|
||||||
void begin(){
|
void begin(){
|
||||||
state.rules.waveTimer = true;
|
state.rules.waveTimer = true;
|
||||||
logic.runWave();
|
logic.runWave();
|
||||||
@@ -239,18 +240,18 @@ public class Tutorial{
|
|||||||
//utility
|
//utility
|
||||||
|
|
||||||
static void placeBlocks(){
|
static void placeBlocks(){
|
||||||
Tile core = state.teams.get(defaultTeam).cores.first();
|
TileEntity core = state.teams.playerCores().first();
|
||||||
for(int i = 0; i < blocksToBreak; i++){
|
for(int i = 0; i < blocksToBreak; i++){
|
||||||
world.removeBlock(world.ltile(core.x + blockOffset, core.y + i));
|
world.ltile(core.tile.x + blockOffset, core.tile.y + i).remove();
|
||||||
world.tile(core.x + blockOffset, core.y + i).setBlock(Blocks.scrapWall, defaultTeam);
|
world.tile(core.tile.x + blockOffset, core.tile.y + i).setBlock(Blocks.scrapWall, state.rules.defaultTeam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean blocksBroken(){
|
static boolean blocksBroken(){
|
||||||
Tile core = state.teams.get(defaultTeam).cores.first();
|
TileEntity core = state.teams.playerCores().first();
|
||||||
|
|
||||||
for(int i = 0; i < blocksToBreak; i++){
|
for(int i = 0; i < blocksToBreak; i++){
|
||||||
if(world.tile(core.x + blockOffset, core.y + i).block() == Blocks.scrapWall){
|
if(world.tile(core.tile.x + blockOffset, core.tile.y + i).block() == Blocks.scrapWall){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,7 +271,7 @@ public class Tutorial{
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int item(Item item){
|
static int item(Item item){
|
||||||
return state.teams.get(defaultTeam).cores.isEmpty() ? 0 : state.teams.get(defaultTeam).cores.first().entity.items.get(item);
|
return state.rules.defaultTeam.data().noCores() ? 0 : state.rules.defaultTeam.core().items.get(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean toggled(String name){
|
static boolean toggled(String name){
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import arc.math.*;
|
|||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import arc.util.ArcAnnotate.*;
|
||||||
import arc.util.pooling.*;
|
import arc.util.pooling.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
@@ -25,7 +26,7 @@ public class MinimapRenderer implements Disposable{
|
|||||||
private Pixmap pixmap;
|
private Pixmap pixmap;
|
||||||
private Texture texture;
|
private Texture texture;
|
||||||
private TextureRegion region;
|
private TextureRegion region;
|
||||||
private Rectangle rect = new Rectangle();
|
private Rect rect = new Rect();
|
||||||
private float zoom = 4;
|
private float zoom = 4;
|
||||||
|
|
||||||
public MinimapRenderer(){
|
public MinimapRenderer(){
|
||||||
@@ -42,7 +43,7 @@ public class MinimapRenderer implements Disposable{
|
|||||||
return pixmap;
|
return pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Texture getTexture(){
|
public @Nullable Texture getTexture(){
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +71,13 @@ public class MinimapRenderer implements Disposable{
|
|||||||
region = new TextureRegion(texture);
|
region = new TextureRegion(texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawEntities(float x, float y, float w, float h, boolean withLabels){
|
public void drawEntities(float x, float y, float w, float h, float scaling, boolean withLabels){
|
||||||
|
if(!withLabels){
|
||||||
updateUnitArray();
|
updateUnitArray();
|
||||||
|
}else{
|
||||||
|
units.clear();
|
||||||
|
Units.all(units::add);
|
||||||
|
}
|
||||||
|
|
||||||
float sz = baseSize * zoom;
|
float sz = baseSize * zoom;
|
||||||
float dx = (Core.camera.position.x / tilesize);
|
float dx = (Core.camera.position.x / tilesize);
|
||||||
@@ -82,8 +88,14 @@ public class MinimapRenderer implements Disposable{
|
|||||||
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
|
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
|
||||||
|
|
||||||
for(Unit unit : units){
|
for(Unit unit : units){
|
||||||
float rx = (unit.x - rect.x) / rect.width * w;
|
if(unit.isDead()) continue;
|
||||||
float ry = (unit.y - rect.y) / rect.width * h;
|
float rx = !withLabels ? (unit.x - rect.x) / rect.width * w : unit.x / (world.width() * tilesize) * w;
|
||||||
|
float ry = !withLabels ? (unit.y - rect.y) / rect.width * h : unit.y / (world.height() * tilesize) * h;
|
||||||
|
|
||||||
|
Draw.mixcol(unit.getTeam().color, 1f);
|
||||||
|
float scale = Scl.scl(1f) / 2f * scaling * 32f;
|
||||||
|
Draw.rect(unit.getIconRegion(), x + rx, y + ry, scale, scale, unit.rotation - 90);
|
||||||
|
Draw.reset();
|
||||||
|
|
||||||
if(withLabels && unit instanceof Player){
|
if(withLabels && unit instanceof Player){
|
||||||
Player pl = (Player) unit;
|
Player pl = (Player) unit;
|
||||||
@@ -92,19 +104,16 @@ public class MinimapRenderer implements Disposable{
|
|||||||
drawLabel(x + rx, y + ry, pl.name, unit.getTeam().color);
|
drawLabel(x + rx, y + ry, pl.name, unit.getTeam().color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color(unit.getTeam().color);
|
|
||||||
Fill.rect(x + rx, y + ry, Scl.scl(baseSize / 2f), Scl.scl(baseSize / 2f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawEntities(float x, float y, float w, float h){
|
public void drawEntities(float x, float y, float w, float h){
|
||||||
drawEntities(x, y, w, h, true);
|
drawEntities(x, y, w, h, 1f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextureRegion getRegion(){
|
public @Nullable TextureRegion getRegion(){
|
||||||
if(texture == null) return null;
|
if(texture == null) return null;
|
||||||
|
|
||||||
float sz = Mathf.clamp(baseSize * zoom, baseSize, Math.min(world.width(), world.height()));
|
float sz = Mathf.clamp(baseSize * zoom, baseSize, Math.min(world.width(), world.height()));
|
||||||
|
|||||||
@@ -10,20 +10,19 @@ import mindustry.*;
|
|||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.*;
|
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.type.Category;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.Cicon;
|
import mindustry.ui.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.units.MechPad;
|
import mindustry.world.blocks.units.*;
|
||||||
import mindustry.world.meta.BlockFlag;
|
import mindustry.world.meta.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class OverlayRenderer{
|
public class OverlayRenderer{
|
||||||
private static final float indicatorLength = 14f;
|
private static final float indicatorLength = 14f;
|
||||||
private static final float spawnerMargin = tilesize*11f;
|
private static final float spawnerMargin = tilesize*11f;
|
||||||
private static final Rectangle rect = new Rectangle();
|
private static final Rect rect = new Rect();
|
||||||
private float buildFadeTime;
|
private float buildFadeTime;
|
||||||
|
|
||||||
public void drawBottom(){
|
public void drawBottom(){
|
||||||
@@ -95,17 +94,15 @@ public class OverlayRenderer{
|
|||||||
Lines.stroke(buildFadeTime * 2f);
|
Lines.stroke(buildFadeTime * 2f);
|
||||||
|
|
||||||
if(buildFadeTime > 0.005f){
|
if(buildFadeTime > 0.005f){
|
||||||
for(Team enemy : state.teams.enemiesOf(player.getTeam())){
|
state.teams.eachEnemyCore(player.getTeam(), core -> {
|
||||||
for(Tile core : state.teams.get(enemy).cores){
|
float dst = core.dst(player);
|
||||||
float dst = Mathf.dst(player.x, player.y, core.drawx(), core.drawy());
|
if(dst < state.rules.enemyCoreBuildRadius * 2.2f){
|
||||||
if(dst < state.rules.enemyCoreBuildRadius * 1.5f){
|
|
||||||
Draw.color(Color.darkGray);
|
Draw.color(Color.darkGray);
|
||||||
Lines.circle(core.drawx(), core.drawy() - 2, state.rules.enemyCoreBuildRadius);
|
Lines.circle(core.x, core.y - 2, state.rules.enemyCoreBuildRadius);
|
||||||
Draw.color(Pal.accent, enemy.color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f));
|
Draw.color(Pal.accent, core.getTeam().color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f));
|
||||||
Lines.circle(core.drawx(), core.drawy(), state.rules.enemyCoreBuildRadius);
|
Lines.circle(core.x, core.y, state.rules.enemyCoreBuildRadius);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import arc.scene.event.*;
|
|||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.util.ArcAnnotate.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.core.GameState.*;
|
import mindustry.core.GameState.*;
|
||||||
import mindustry.entities.traits.BuilderTrait.*;
|
import mindustry.entities.traits.BuilderTrait.*;
|
||||||
@@ -135,22 +136,29 @@ public class DesktopInput extends InputHandler{
|
|||||||
ui.listfrag.toggle();
|
ui.listfrag.toggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(((player.getClosestCore() == null && player.isDead()) || state.isPaused()) && !ui.chatfrag.shown()){
|
||||||
|
//move camera around
|
||||||
|
float camSpeed = !Core.input.keyDown(Binding.dash) ? 3f : 8f;
|
||||||
|
Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta() * camSpeed));
|
||||||
|
|
||||||
|
if(Core.input.keyDown(Binding.mouse_move)){
|
||||||
|
Core.camera.position.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2f) * 0.005f, -1, 1) * camSpeed;
|
||||||
|
Core.camera.position.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2f) * 0.005f, -1, 1) * camSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(Core.input.keyRelease(Binding.select)){
|
if(Core.input.keyRelease(Binding.select)){
|
||||||
player.isShooting = false;
|
player.isShooting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !Core.scene.hasKeyboard() && !(scene.getKeyboardFocus() instanceof TextField)){
|
if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){
|
||||||
if(!ui.minimap.isShown()){
|
ui.minimapfrag.toggle();
|
||||||
ui.minimap.show();
|
|
||||||
}else{
|
|
||||||
ui.minimap.hide();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.is(State.menu) || Core.scene.hasDialog()) return;
|
if(state.is(State.menu) || Core.scene.hasDialog()) return;
|
||||||
|
|
||||||
//zoom camera
|
//zoom camera
|
||||||
if(!Core.scene.hasScroll() && !ui.chatfrag.shown() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){
|
if((!Core.scene.hasScroll() || Core.input.keyDown(Binding.diagonal_placement)) && !ui.chatfrag.shown() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){
|
||||||
renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
|
renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,7 +308,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Core.input.keyTap(Binding.clear_building)){
|
if(Core.input.keyTap(Binding.clear_building) || isPlacing()){
|
||||||
lastSchematic = null;
|
lastSchematic = null;
|
||||||
selectRequests.clear();
|
selectRequests.clear();
|
||||||
}
|
}
|
||||||
@@ -397,7 +405,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mode == placing && block != null){
|
if(mode == placing && block != null){
|
||||||
if(!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int) Core.input.axisTap(Binding.rotate) != 0)){
|
if(!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int)Core.input.axisTap(Binding.rotate) != 0)){
|
||||||
rotation = ((int)((Angles.angle(selectX, selectY, cursorX, cursorY) + 45) / 90f)) % 4;
|
rotation = ((int)((Angles.angle(selectX, selectY, cursorX, cursorY) + 45) / 90f)) % 4;
|
||||||
overrideLineRotation = true;
|
overrideLineRotation = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
/** Maximum line length. */
|
/** Maximum line length. */
|
||||||
final static int maxLength = 100;
|
final static int maxLength = 100;
|
||||||
final static Vec2 stackTrns = new Vec2();
|
final static Vec2 stackTrns = new Vec2();
|
||||||
final static Rectangle r1 = new Rectangle(), r2 = new Rectangle();
|
final static Rect r1 = new Rect(), r2 = new Rect();
|
||||||
/** Distance on the back from where items originate. */
|
/** Distance on the back from where items originate. */
|
||||||
final static float backTrns = 3f;
|
final static float backTrns = 3f;
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
|
|
||||||
@Remote(targets = Loc.both, forward = true, called = Loc.server)
|
@Remote(targets = Loc.both, forward = true, called = Loc.server)
|
||||||
public static void transferInventory(Player player, Tile tile){
|
public static void transferInventory(Player player, Tile tile){
|
||||||
if(player == null || player.timer == null || !player.timer.get(Player.timerTransfer, 40)) return;
|
if(player == null || player.timer == null) return;
|
||||||
if(net.server() && (player.item().amount <= 0 || player.isTransferring|| !Units.canInteract(player, tile))){
|
if(net.server() && (player.item().amount <= 0 || player.isTransferring|| !Units.canInteract(player, tile))){
|
||||||
throw new ValidateException(player, "Player cannot transfer an item.");
|
throw new ValidateException(player, "Player cannot transfer an item.");
|
||||||
}
|
}
|
||||||
@@ -402,7 +402,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(BrokenBlock req : state.teams.get(player.getTeam()).brokenBlocks){
|
for(BrokenBlock req : player.getTeam().data().brokenBlocks){
|
||||||
Block block = content.block(req.block);
|
Block block = content.block(req.block);
|
||||||
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
|
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
|
||||||
drawSelected(req.x, req.y, content.block(req.block), Pal.remove);
|
drawSelected(req.x, req.y, content.block(req.block), Pal.remove);
|
||||||
@@ -725,7 +725,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void tryDropItems(Tile tile, float x, float y){
|
public void tryDropItems(Tile tile, float x, float y){
|
||||||
if(!droppingItem || player.item().amount <= 0 || canTapPlayer(x, y) || state.isPaused() || !player.timer.check(Player.timerTransfer, 40)){
|
if(!droppingItem || player.item().amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){
|
||||||
droppingItem = false;
|
droppingItem = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
}else{
|
}else{
|
||||||
Tile tile = world.ltileWorld(x, y);
|
Tile tile = world.ltileWorld(x, y);
|
||||||
|
|
||||||
if(tile != null && tile.synthetic() && state.teams.areEnemies(player.getTeam(), tile.getTeam())){
|
if(tile != null && tile.synthetic() && player.getTeam().isEnemy(tile.getTeam())){
|
||||||
TileEntity entity = tile.entity;
|
TileEntity entity = tile.entity;
|
||||||
player.setMineTile(null);
|
player.setMineTile(null);
|
||||||
player.target = entity;
|
player.target = entity;
|
||||||
@@ -439,10 +439,12 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){
|
public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){
|
||||||
if(state.is(State.menu) || player.isDead()) return false;
|
if(state.is(State.menu)) return false;
|
||||||
|
|
||||||
down = true;
|
down = true;
|
||||||
|
|
||||||
|
if(player.isDead()) return false;
|
||||||
|
|
||||||
//get tile on cursor
|
//get tile on cursor
|
||||||
Tile cursor = tileAt(screenX, screenY);
|
Tile cursor = tileAt(screenX, screenY);
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public class JsonIO{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeValue(Object value, Class knownType, Class elementType){
|
public void writeValue(Object value, Class knownType, Class elementType){
|
||||||
if(value instanceof mindustry.ctype.MappableContent){
|
if(value instanceof MappableContent){
|
||||||
try{
|
try{
|
||||||
getWriter().value(((MappableContent)value).name);
|
getWriter().value(((MappableContent)value).name);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
@@ -95,6 +95,18 @@ public class JsonIO{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
json.setSerializer(Team.class, new Serializer<Team>(){
|
||||||
|
@Override
|
||||||
|
public void write(Json json, Team object, Class knownType){
|
||||||
|
json.writeValue(object.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Team read(Json json, JsonValue jsonData, Class type){
|
||||||
|
return Team.get(jsonData.asInt());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
json.setSerializer(Block.class, new Serializer<Block>(){
|
json.setSerializer(Block.class, new Serializer<Block>(){
|
||||||
@Override
|
@Override
|
||||||
public void write(Json json, Block object, Class knownType){
|
public void write(Json json, Block object, Class knownType){
|
||||||
|
|||||||
@@ -1,194 +0,0 @@
|
|||||||
package mindustry.io;
|
|
||||||
|
|
||||||
import arc.struct.*;
|
|
||||||
import arc.files.*;
|
|
||||||
import arc.graphics.*;
|
|
||||||
import arc.util.*;
|
|
||||||
import arc.util.serialization.*;
|
|
||||||
import mindustry.content.*;
|
|
||||||
import mindustry.ctype.ContentType;
|
|
||||||
import mindustry.game.*;
|
|
||||||
import mindustry.io.MapIO.*;
|
|
||||||
import mindustry.maps.*;
|
|
||||||
import mindustry.world.*;
|
|
||||||
import mindustry.world.LegacyColorMapper.*;
|
|
||||||
import mindustry.world.blocks.*;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.zip.*;
|
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
|
||||||
|
|
||||||
/** Map IO for the "old" .mmap format.
|
|
||||||
* Differentiate between legacy maps and new maps by checking the extension (or the header).*/
|
|
||||||
public class LegacyMapIO{
|
|
||||||
private static final ObjectMap<String, String> fallback = ObjectMap.of("alpha-dart-mech-pad", "dart-mech-pad");
|
|
||||||
private static final Json json = new Json();
|
|
||||||
|
|
||||||
public static Map readMap(Fi file, boolean custom) throws IOException{
|
|
||||||
try(DataInputStream stream = new DataInputStream(file.read(1024))){
|
|
||||||
StringMap tags = new StringMap();
|
|
||||||
|
|
||||||
//meta is uncompressed
|
|
||||||
int version = stream.readInt();
|
|
||||||
if(version != 1){
|
|
||||||
throw new IOException("Outdated legacy map format");
|
|
||||||
}
|
|
||||||
int build = stream.readInt();
|
|
||||||
short width = stream.readShort(), height = stream.readShort();
|
|
||||||
byte tagAmount = stream.readByte();
|
|
||||||
|
|
||||||
for(int i = 0; i < tagAmount; i++){
|
|
||||||
String name = stream.readUTF();
|
|
||||||
String value = stream.readUTF();
|
|
||||||
tags.put(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Map(file, width, height, tags, custom, version, build);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void readTiles(Map map, Tile[][] tiles) throws IOException{
|
|
||||||
readTiles(map, (x, y) -> tiles[x][y]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void readTiles(Map map, TileProvider tiles) throws IOException{
|
|
||||||
readTiles(map.file, map.width, map.height, tiles);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void readTiles(Fi file, int width, int height, Tile[][] tiles) throws IOException{
|
|
||||||
readTiles(file, width, height, (x, y) -> tiles[x][y]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void readTiles(Fi file, int width, int height, TileProvider tiles) throws IOException{
|
|
||||||
try(BufferedInputStream input = file.read(bufferSize)){
|
|
||||||
|
|
||||||
//read map
|
|
||||||
{
|
|
||||||
DataInputStream stream = new DataInputStream(input);
|
|
||||||
|
|
||||||
stream.readInt(); //version
|
|
||||||
stream.readInt(); //build
|
|
||||||
stream.readInt(); //width + height
|
|
||||||
byte tagAmount = stream.readByte();
|
|
||||||
|
|
||||||
for(int i = 0; i < tagAmount; i++){
|
|
||||||
stream.readUTF(); //key
|
|
||||||
stream.readUTF(); //val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try(DataInputStream stream = new DataInputStream(new InflaterInputStream(input))){
|
|
||||||
|
|
||||||
try{
|
|
||||||
byte mapped = stream.readByte();
|
|
||||||
IntMap<Block> idmap = new IntMap<>();
|
|
||||||
IntMap<String> namemap = new IntMap<>();
|
|
||||||
|
|
||||||
for(int i = 0; i < mapped; i++){
|
|
||||||
byte type = stream.readByte();
|
|
||||||
short total = stream.readShort();
|
|
||||||
|
|
||||||
for(int j = 0; j < total; j++){
|
|
||||||
String name = stream.readUTF();
|
|
||||||
if(type == 1){
|
|
||||||
Block res = content.getByName(ContentType.block, fallback.get(name, name));
|
|
||||||
idmap.put(j, res == null ? Blocks.air : res);
|
|
||||||
namemap.put(j, fallback.get(name, name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//read floor and create tiles first
|
|
||||||
for(int i = 0; i < width * height; i++){
|
|
||||||
int x = i % width, y = i / width;
|
|
||||||
int floorid = stream.readUnsignedByte();
|
|
||||||
int oreid = stream.readUnsignedByte();
|
|
||||||
int consecutives = stream.readUnsignedByte();
|
|
||||||
|
|
||||||
Tile tile = tiles.get(x, y);
|
|
||||||
tile.setFloor((Floor)idmap.get(floorid));
|
|
||||||
tile.setOverlay(idmap.get(oreid));
|
|
||||||
|
|
||||||
for(int j = i + 1; j < i + 1 + consecutives; j++){
|
|
||||||
int newx = j % width, newy = j / width;
|
|
||||||
Tile newTile = tiles.get(newx, newy);
|
|
||||||
newTile.setFloor((Floor)idmap.get(floorid));
|
|
||||||
newTile.setOverlay(idmap.get(oreid));
|
|
||||||
}
|
|
||||||
|
|
||||||
i += consecutives;
|
|
||||||
}
|
|
||||||
|
|
||||||
//read blocks
|
|
||||||
for(int i = 0; i < width * height; i++){
|
|
||||||
int x = i % width, y = i / width;
|
|
||||||
int id = stream.readUnsignedByte();
|
|
||||||
Block block = idmap.get(id);
|
|
||||||
if(block == null) block = Blocks.air;
|
|
||||||
|
|
||||||
Tile tile = tiles.get(x, y);
|
|
||||||
//the spawn block is saved in the block tile layer in older maps, shift it to the overlay
|
|
||||||
if(block != Blocks.spawn){
|
|
||||||
tile.setBlock(block);
|
|
||||||
}else{
|
|
||||||
tile.setOverlay(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(namemap.get(id, "").equals("part")){
|
|
||||||
stream.readByte(); //link
|
|
||||||
}else if(tile.entity != null){
|
|
||||||
byte tr = stream.readByte();
|
|
||||||
stream.readShort(); //read health (which is actually irrelevant)
|
|
||||||
|
|
||||||
byte team = Pack.leftByte(tr);
|
|
||||||
byte rotation = Pack.rightByte(tr);
|
|
||||||
|
|
||||||
tile.setTeam(Team.all[team]);
|
|
||||||
tile.entity.health = tile.block().health;
|
|
||||||
tile.rotation(rotation);
|
|
||||||
|
|
||||||
if(tile.block() == Blocks.liquidSource || tile.block() == Blocks.unloader || tile.block() == Blocks.sorter){
|
|
||||||
stream.readByte(); //these blocks have an extra config byte, read it
|
|
||||||
}
|
|
||||||
}else{ //no entity/part, read consecutives
|
|
||||||
int consecutives = stream.readUnsignedByte();
|
|
||||||
|
|
||||||
for(int j = i + 1; j < i + 1 + consecutives; j++){
|
|
||||||
int newx = j % width, newy = j / width;
|
|
||||||
tiles.get(newx, newy).setBlock(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
i += consecutives;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}finally{
|
|
||||||
content.setTemporaryMapper(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Reads a pixmap in the 3.5 pixmap format. */
|
|
||||||
public static void readPixmap(Pixmap pixmap, Tiles tiles){
|
|
||||||
for(int x = 0; x < pixmap.getWidth(); x++){
|
|
||||||
for(int y = 0; y < pixmap.getHeight(); y++){
|
|
||||||
int color = pixmap.getPixel(x, pixmap.getHeight() - 1 - y);
|
|
||||||
LegacyBlock block = LegacyColorMapper.get(color);
|
|
||||||
Tile tile = tiles.getn(x, y);
|
|
||||||
|
|
||||||
tile.setFloor(block.floor);
|
|
||||||
tile.setBlock(block.wall);
|
|
||||||
if(block.ore != null) tile.setOverlay(block.ore);
|
|
||||||
|
|
||||||
//place core
|
|
||||||
if(color == Color.rgba8888(Color.green)){
|
|
||||||
//actual core parts
|
|
||||||
tile.setBlock(Blocks.coreShard);
|
|
||||||
tile.setTeam(Team.sharded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,6 +10,7 @@ import mindustry.core.*;
|
|||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
import mindustry.world.LegacyColorMapper.*;
|
||||||
import mindustry.world.blocks.storage.*;
|
import mindustry.world.blocks.storage.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@@ -91,7 +92,7 @@ public class MapIO{
|
|||||||
public void setTeam(Team team){
|
public void setTeam(Team team){
|
||||||
super.setTeam(team);
|
super.setTeam(team);
|
||||||
if(block instanceof CoreBlock){
|
if(block instanceof CoreBlock){
|
||||||
map.teams.add(team.ordinal());
|
map.teams.add(team.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -145,11 +146,33 @@ public class MapIO{
|
|||||||
|
|
||||||
public static int colorFor(Block floor, Block wall, Block ore, Team team){
|
public static int colorFor(Block floor, Block wall, Block ore, Team team){
|
||||||
if(wall.synthetic()){
|
if(wall.synthetic()){
|
||||||
return team.intColor;
|
return team.color.rgba();
|
||||||
}
|
}
|
||||||
return Color.rgba8888(wall.solid ? wall.color : ore == Blocks.air ? floor.color : ore.color);
|
return Color.rgba8888(wall.solid ? wall.color : ore == Blocks.air ? floor.color : ore.color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Reads a pixmap in the 3.5 pixmap format. */
|
||||||
|
public static void readPixmap(Pixmap pixmap, Tiles tiles){
|
||||||
|
for(int x = 0; x < pixmap.getWidth(); x++){
|
||||||
|
for(int y = 0; y < pixmap.getHeight(); y++){
|
||||||
|
int color = pixmap.getPixel(x, pixmap.getHeight() - 1 - y);
|
||||||
|
LegacyBlock block = LegacyColorMapper.get(color);
|
||||||
|
Tile tile = tiles.getn(x, y);
|
||||||
|
|
||||||
|
tile.setFloor(block.floor);
|
||||||
|
tile.setBlock(block.wall);
|
||||||
|
if(block.ore != null) tile.setOverlay(block.ore);
|
||||||
|
|
||||||
|
//place core
|
||||||
|
if(color == Color.rgba8888(Color.green)){
|
||||||
|
//actual core parts
|
||||||
|
tile.setBlock(Blocks.coreShard);
|
||||||
|
tile.setTeam(Team.sharded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface TileProvider{
|
interface TileProvider{
|
||||||
Tile get(int x, int y);
|
Tile get(int x, int y);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ public abstract class SaveVersion extends SaveFileReader{
|
|||||||
Array<TeamData> data = state.teams.getActive();
|
Array<TeamData> data = state.teams.getActive();
|
||||||
stream.writeInt(data.size);
|
stream.writeInt(data.size);
|
||||||
for(TeamData team : data){
|
for(TeamData team : data){
|
||||||
stream.writeInt(team.team.ordinal());
|
stream.writeInt((int)team.team.id);
|
||||||
stream.writeInt(team.brokenBlocks.size);
|
stream.writeInt(team.brokenBlocks.size);
|
||||||
for(BrokenBlock block : team.brokenBlocks){
|
for(BrokenBlock block : team.brokenBlocks){
|
||||||
stream.writeShort(block.x);
|
stream.writeShort(block.x);
|
||||||
@@ -258,8 +258,8 @@ public abstract class SaveVersion extends SaveFileReader{
|
|||||||
public void readEntities(DataInput stream) throws IOException{
|
public void readEntities(DataInput stream) throws IOException{
|
||||||
int teamc = stream.readInt();
|
int teamc = stream.readInt();
|
||||||
for(int i = 0; i < teamc; i++){
|
for(int i = 0; i < teamc; i++){
|
||||||
Team team = Team.all[stream.readInt()];
|
Team team = Team.get(stream.readInt());
|
||||||
TeamData data = state.teams.get(team);
|
TeamData data = team.data();
|
||||||
int blocks = stream.readInt();
|
int blocks = stream.readInt();
|
||||||
for(int j = 0; j < blocks; j++){
|
for(int j = 0; j < blocks; j++){
|
||||||
data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, stream.readInt()));
|
data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, stream.readInt()));
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ public class TypeIO{
|
|||||||
|
|
||||||
@WriteClass(BaseUnit.class)
|
@WriteClass(BaseUnit.class)
|
||||||
public static void writeBaseUnit(ByteBuffer buffer, BaseUnit unit){
|
public static void writeBaseUnit(ByteBuffer buffer, BaseUnit unit){
|
||||||
buffer.put((byte)unit.getTeam().ordinal());
|
buffer.put((byte) (int)unit.getTeam().id);
|
||||||
buffer.putInt(unit.getID());
|
buffer.putInt(unit.getID());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ public class TypeIO{
|
|||||||
public static BaseUnit readBaseUnit(ByteBuffer buffer){
|
public static BaseUnit readBaseUnit(ByteBuffer buffer){
|
||||||
byte tid = buffer.get();
|
byte tid = buffer.get();
|
||||||
int id = buffer.getInt();
|
int id = buffer.getInt();
|
||||||
return unitGroups[tid].getByID(id);
|
return unitGroup.getByID(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@WriteClass(Tile.class)
|
@WriteClass(Tile.class)
|
||||||
@@ -194,12 +194,12 @@ public class TypeIO{
|
|||||||
|
|
||||||
@WriteClass(Team.class)
|
@WriteClass(Team.class)
|
||||||
public static void writeTeam(ByteBuffer buffer, Team reason){
|
public static void writeTeam(ByteBuffer buffer, Team reason){
|
||||||
buffer.put((byte)reason.ordinal());
|
buffer.put((byte) (int)reason.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ReadClass(Team.class)
|
@ReadClass(Team.class)
|
||||||
public static Team readTeam(ByteBuffer buffer){
|
public static Team readTeam(ByteBuffer buffer){
|
||||||
return Team.all[buffer.get()];
|
return Team.get(buffer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@WriteClass(UnitCommand.class)
|
@WriteClass(UnitCommand.class)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class CoreSpawnFilter extends GenerateFilter{
|
|||||||
public void apply(Tiles tiles, GenerateInput in){
|
public void apply(Tiles tiles, GenerateInput in){
|
||||||
IntArray spawns = new IntArray();
|
IntArray spawns = new IntArray();
|
||||||
for(Tile tile : tiles){
|
for(Tile tile : tiles){
|
||||||
if(tile.getTeam() == defaultTeam && tile.block() instanceof CoreBlock){
|
if(tile.getTeam() == state.rules.defaultTeam && tile.block() instanceof CoreBlock){
|
||||||
spawns.add(tile.pos());
|
spawns.add(tile.pos());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,8 +32,7 @@ public class CoreSpawnFilter extends GenerateFilter{
|
|||||||
|
|
||||||
int used = Math.min(spawns.size, amount);
|
int used = Math.min(spawns.size, amount);
|
||||||
for(int i = used; i < spawns.size; i++){
|
for(int i = used; i < spawns.size; i++){
|
||||||
Tile tile = tiles.getp(spawns.get(i));
|
tiles.getp(spawns.get(i)).remove();
|
||||||
world.removeBlock(tile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class MapGenerator extends Generator{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tile.block() instanceof CoreBlock && tile.getTeam() == defaultTeam){
|
if(tile.block() instanceof CoreBlock && tile.getTeam() == state.rules.defaultTeam){
|
||||||
schematics.placeLoadout(loadout, tile.x, tile.y);
|
schematics.placeLoadout(loadout, tile.x, tile.y);
|
||||||
anyCores = true;
|
anyCores = true;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -333,8 +333,8 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void readBundle(ContentType type, String name, JsonValue value){
|
private void readBundle(ContentType type, String name, JsonValue value){
|
||||||
UnlockableContent cont = Vars.content.getByName(type, name) instanceof UnlockableContent ?
|
UnlockableContent cont = locate(type, name) instanceof UnlockableContent ?
|
||||||
Vars.content.getByName(type, name) : null;
|
locate(type, name) : null;
|
||||||
|
|
||||||
String entryName = cont == null ? type + "." + currentMod.name + "-" + name + "." : type + "." + cont.name + ".";
|
String entryName = cont == null ? type + "." + currentMod.name + "-" + name + "." : type + "." + cont.name + ".";
|
||||||
I18NBundle bundle = Core.bundle;
|
I18NBundle bundle = Core.bundle;
|
||||||
|
|||||||
19
core/src/mindustry/mod/ModListing.java
Normal file
19
core/src/mindustry/mod/ModListing.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package mindustry.mod;
|
||||||
|
|
||||||
|
/** Mod listing as a data class. */
|
||||||
|
public class ModListing{
|
||||||
|
public String repo, name, author, lastUpdated, description;
|
||||||
|
public int stars;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return "ModListing{" +
|
||||||
|
"repo='" + repo + '\'' +
|
||||||
|
", name='" + name + '\'' +
|
||||||
|
", author='" + author + '\'' +
|
||||||
|
", lastUpdated='" + lastUpdated + '\'' +
|
||||||
|
", description='" + description + '\'' +
|
||||||
|
", stars=" + stars +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@ package mindustry.mod;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.assets.*;
|
import arc.assets.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.files.*;
|
import arc.files.*;
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
@@ -10,6 +9,7 @@ import arc.graphics.Texture.*;
|
|||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.graphics.g2d.TextureAtlas.*;
|
import arc.graphics.g2d.TextureAtlas.*;
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.ArcAnnotate.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
@@ -85,6 +85,7 @@ public class Mods implements Loadable{
|
|||||||
try{
|
try{
|
||||||
mods.add(loadMod(dest));
|
mods.add(loadMod(dest));
|
||||||
requiresReload = true;
|
requiresReload = true;
|
||||||
|
sortMods();
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
dest.delete();
|
dest.delete();
|
||||||
throw e;
|
throw e;
|
||||||
@@ -142,6 +143,17 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadSync(){
|
public void loadSync(){
|
||||||
|
for(LoadedMod mod : mods){
|
||||||
|
//try to load icon for each mod that can have one
|
||||||
|
if(mod.root.child("icon.png").exists()){
|
||||||
|
try{
|
||||||
|
mod.iconTexture = new Texture(mod.root.child("icon.png"));
|
||||||
|
}catch(Throwable t){
|
||||||
|
Log.err("Failed to load icon for mod '" + mod.name + "'.", t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(packer == null) return;
|
if(packer == null) return;
|
||||||
Time.mark();
|
Time.mark();
|
||||||
|
|
||||||
@@ -408,6 +420,7 @@ public class Mods implements Loadable{
|
|||||||
//TODO make it less epic
|
//TODO make it less epic
|
||||||
Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas"));
|
Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas"));
|
||||||
|
|
||||||
|
mods.each(LoadedMod::dispose);
|
||||||
mods.clear();
|
mods.clear();
|
||||||
Core.bundle = I18NBundle.createBundle(Core.files.internal("bundles/bundle"), Core.bundle.getLocale());
|
Core.bundle = I18NBundle.createBundle(Core.files.internal("bundles/bundle"), Core.bundle.getLocale());
|
||||||
load();
|
load();
|
||||||
@@ -499,15 +512,13 @@ public class Mods implements Loadable{
|
|||||||
for(ContentType type : ContentType.all){
|
for(ContentType type : ContentType.all){
|
||||||
Fi folder = contentRoot.child(type.name().toLowerCase() + "s");
|
Fi folder = contentRoot.child(type.name().toLowerCase() + "s");
|
||||||
if(folder.exists()){
|
if(folder.exists()){
|
||||||
for(Fi file : folder.list()){
|
for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){
|
||||||
if(file.extension().equals("json") || file.extension().equals("hjson")){
|
|
||||||
runs.add(new LoadRun(type, file, mod));
|
runs.add(new LoadRun(type, file, mod));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//make sure mod content is in proper order
|
//make sure mod content is in proper order
|
||||||
runs.sort();
|
runs.sort();
|
||||||
@@ -643,7 +654,7 @@ public class Mods implements Loadable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a plugin that has been loaded from a jar file.*/
|
/** Represents a plugin that has been loaded from a jar file.*/
|
||||||
public static class LoadedMod implements Publishable{
|
public static class LoadedMod implements Publishable, Disposable{
|
||||||
/** The location of this mod's zip file/folder on the disk. */
|
/** The location of this mod's zip file/folder on the disk. */
|
||||||
public final Fi file;
|
public final Fi file;
|
||||||
/** The root zip file; points to the contents of this mod. In the case of folders, this is the same as the mod's file. */
|
/** The root zip file; points to the contents of this mod. In the case of folders, this is the same as the mod's file. */
|
||||||
@@ -664,6 +675,8 @@ public class Mods implements Loadable{
|
|||||||
public ObjectSet<Content> erroredContent = new ObjectSet<>();
|
public ObjectSet<Content> erroredContent = new ObjectSet<>();
|
||||||
/** Current state of this mod. */
|
/** Current state of this mod. */
|
||||||
public ModState state = ModState.enabled;
|
public ModState state = ModState.enabled;
|
||||||
|
/** Icon texture. Should be disposed. */
|
||||||
|
public @Nullable Texture iconTexture;
|
||||||
|
|
||||||
public LoadedMod(Fi file, Fi root, Mod main, ModMeta meta){
|
public LoadedMod(Fi file, Fi root, Mod main, ModMeta meta){
|
||||||
this.root = root;
|
this.root = root;
|
||||||
@@ -701,6 +714,13 @@ public class Mods implements Loadable{
|
|||||||
return Version.build >= Strings.parseInt(meta.minGameVersion, 0);
|
return Version.build >= Strings.parseInt(meta.minGameVersion, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose(){
|
||||||
|
if(iconTexture != null){
|
||||||
|
iconTexture.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSteamID(){
|
public String getSteamID(){
|
||||||
return Core.settings.getString(name + "-steamid", null);
|
return Core.settings.getString(name + "-steamid", null);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ public class Scripts implements Disposable{
|
|||||||
context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("$Proxy") ||
|
context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("$Proxy") ||
|
||||||
type.startsWith("adapter") || type.contains("PrintStream") ||
|
type.startsWith("adapter") || type.contains("PrintStream") ||
|
||||||
type.startsWith("mindustry")) && !type.equals("mindustry.mod.ClassAccess"));
|
type.startsWith("mindustry")) && !type.equals("mindustry.mod.ClassAccess"));
|
||||||
|
context.getWrapFactory().setJavaPrimitiveWrap(false);
|
||||||
|
|
||||||
scope = new ImporterTopLevel(context);
|
scope = new ImporterTopLevel(context);
|
||||||
wrapper = Core.files.internal("scripts/wrapper.js").readString();
|
wrapper = Core.files.internal("scripts/wrapper.js").readString();
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package mindustry.net;
|
package mindustry.net;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import mindustry.Vars;
|
import arc.util.ArcAnnotate.*;
|
||||||
|
import mindustry.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
|
import mindustry.entities.type.*;
|
||||||
|
|
||||||
import static mindustry.Vars.headless;
|
import static mindustry.Vars.headless;
|
||||||
import static mindustry.game.EventType.*;
|
import static mindustry.game.EventType.*;
|
||||||
@@ -14,16 +15,29 @@ public class Administration{
|
|||||||
private ObjectMap<String, PlayerInfo> playerInfo = new ObjectMap<>();
|
private ObjectMap<String, PlayerInfo> playerInfo = new ObjectMap<>();
|
||||||
private Array<String> bannedIPs = new Array<>();
|
private Array<String> bannedIPs = new Array<>();
|
||||||
private Array<String> whitelist = new Array<>();
|
private Array<String> whitelist = new Array<>();
|
||||||
|
private Array<ChatFilter> chatFilters = new Array<>();
|
||||||
|
|
||||||
public Administration(){
|
public Administration(){
|
||||||
Core.settings.defaults(
|
|
||||||
"strict", true,
|
|
||||||
"servername", "Server"
|
|
||||||
);
|
|
||||||
|
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Adds a chat filter. This will transform the chat messages of every player.
|
||||||
|
* This functionality can be used to implement things like swear filters and special commands.
|
||||||
|
* Note that commands (starting with /) are not filtered.*/
|
||||||
|
public void addChatFilter(ChatFilter filter){
|
||||||
|
chatFilters.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Filters out a chat message. */
|
||||||
|
public @Nullable String filterMessage(Player player, String message){
|
||||||
|
String current = message;
|
||||||
|
for(ChatFilter f : chatFilters){
|
||||||
|
current = f.filter(player, message);
|
||||||
|
if(current == null) return null;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
public int getPlayerLimit(){
|
public int getPlayerLimit(){
|
||||||
return Core.settings.getInt("playerlimit", 0);
|
return Core.settings.getInt("playerlimit", 0);
|
||||||
}
|
}
|
||||||
@@ -32,21 +46,12 @@ public class Administration{
|
|||||||
Core.settings.putSave("playerlimit", limit);
|
Core.settings.putSave("playerlimit", limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStrict(boolean on){
|
|
||||||
Core.settings.putSave("strict", on);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getStrict(){
|
public boolean getStrict(){
|
||||||
return Core.settings.getBool("strict");
|
return Config.strict.bool();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean allowsCustomClients(){
|
public boolean allowsCustomClients(){
|
||||||
return Core.settings.getBool("allow-custom", !headless);
|
return Config.allowCustomClients.bool();
|
||||||
}
|
|
||||||
|
|
||||||
public void setCustomClients(boolean allowed){
|
|
||||||
Core.settings.put("allow-custom", allowed);
|
|
||||||
Core.settings.save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Call when a player joins to update their information here. */
|
/** Call when a player joins to update their information here. */
|
||||||
@@ -200,11 +205,7 @@ public class Administration{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWhitelistEnabled(){
|
public boolean isWhitelistEnabled(){
|
||||||
return Core.settings.getBool("whitelist", false);
|
return Config.whitelist.bool();
|
||||||
}
|
|
||||||
|
|
||||||
public void setWhitelist(boolean enabled){
|
|
||||||
Core.settings.putSave("whitelist", enabled);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWhitelisted(String id, String usid){
|
public boolean isWhitelisted(String id, String usid){
|
||||||
@@ -314,6 +315,83 @@ public class Administration{
|
|||||||
whitelist = Core.settings.getObject("whitelisted", Array.class, Array::new);
|
whitelist = Core.settings.getObject("whitelisted", Array.class, Array::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Server configuration definition. Each config value can be a string, boolean or number. */
|
||||||
|
public enum Config{
|
||||||
|
name("The server name as displayed on clients.", "Server", "servername"),
|
||||||
|
port("The port to host on.", Vars.port),
|
||||||
|
autoUpdate("Whether to auto-update and exit when a new bleeding-edge update arrives.", false),
|
||||||
|
showConnectMessages("Whether to display connect/disconnect messages.", true),
|
||||||
|
enableVotekick("Whether votekick is enabled.", true),
|
||||||
|
startCommands("Commands run at startup. This should be a comma-separated list.", ""),
|
||||||
|
crashReport("Whether to send crash reports.", false, "crashreport"),
|
||||||
|
logging("Whether to log everything to files.", true),
|
||||||
|
strict("Whether strict mode is on - corrects positions and prevents duplicate UUIDs.", true),
|
||||||
|
socketInput("Allows a local application to control this server through a local TCP socket.", false, "socket", () -> Events.fire(Trigger.socketConfigChanged)),
|
||||||
|
socketInputPort("The port for socket input.", 6859, () -> Events.fire(Trigger.socketConfigChanged)),
|
||||||
|
socketInputAddress("The bind address for socket input.", "localhost", () -> Events.fire(Trigger.socketConfigChanged)),
|
||||||
|
allowCustomClients("Whether custom clients are allowed to connect.", !headless, "allow-custom"),
|
||||||
|
whitelist("Whether the whitelist is used.", false),
|
||||||
|
motd("The message displayed to people on connection.", "off");
|
||||||
|
|
||||||
|
public static final Config[] all = values();
|
||||||
|
|
||||||
|
public final Object defaultValue;
|
||||||
|
public final String key, description;
|
||||||
|
final Runnable changed;
|
||||||
|
|
||||||
|
Config(String description, Object def){
|
||||||
|
this(description, def, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Config(String description, Object def, String key){
|
||||||
|
this(description, def, key, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Config(String description, Object def, Runnable changed){
|
||||||
|
this(description, def, null, changed);
|
||||||
|
}
|
||||||
|
|
||||||
|
Config(String description, Object def, String key, Runnable changed){
|
||||||
|
this.description = description;
|
||||||
|
this.key = key == null ? name() : key;
|
||||||
|
this.defaultValue = def;
|
||||||
|
this.changed = changed == null ? () -> {} : changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNum(){
|
||||||
|
return defaultValue instanceof Integer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBool(){
|
||||||
|
return defaultValue instanceof Boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isString(){
|
||||||
|
return defaultValue instanceof String;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object get(){
|
||||||
|
return Core.settings.get(key, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean bool(){
|
||||||
|
return Core.settings.getBool(key, (Boolean)defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int num(){
|
||||||
|
return Core.settings.getInt(key, (Integer)defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String string(){
|
||||||
|
return Core.settings.getString(key, (String)defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(Object value){
|
||||||
|
Core.settings.putSave(key, value);
|
||||||
|
changed.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Serialize
|
@Serialize
|
||||||
public static class PlayerInfo{
|
public static class PlayerInfo{
|
||||||
public String id;
|
public String id;
|
||||||
@@ -334,6 +412,11 @@ public class Administration{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface ChatFilter{
|
||||||
|
/** @return the filtered message; a null string signals that the message should not be sent. */
|
||||||
|
@Nullable String filter(Player player, String message);
|
||||||
|
}
|
||||||
|
|
||||||
public static class TraceInfo{
|
public static class TraceInfo{
|
||||||
public String ip, uuid;
|
public String ip, uuid;
|
||||||
public boolean modded, mobile;
|
public boolean modded, mobile;
|
||||||
|
|||||||
173
core/src/mindustry/net/BeControl.java
Normal file
173
core/src/mindustry/net/BeControl.java
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
package mindustry.net;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
|
import arc.Net.*;
|
||||||
|
import arc.files.*;
|
||||||
|
import arc.func.*;
|
||||||
|
import arc.util.*;
|
||||||
|
import arc.util.async.*;
|
||||||
|
import arc.util.serialization.*;
|
||||||
|
import mindustry.core.*;
|
||||||
|
import mindustry.gen.*;
|
||||||
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.net.Administration.*;
|
||||||
|
import mindustry.net.Packets.*;
|
||||||
|
import mindustry.ui.*;
|
||||||
|
import mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
|
/** Handles control of bleeding edge builds. */
|
||||||
|
public class BeControl{
|
||||||
|
private static final int updateInterval = 60 * 2;
|
||||||
|
|
||||||
|
private AsyncExecutor executor = new AsyncExecutor(1);
|
||||||
|
private boolean checkUpdates = true;
|
||||||
|
private boolean updateAvailable;
|
||||||
|
private String updateUrl;
|
||||||
|
private int updateBuild;
|
||||||
|
|
||||||
|
/** @return whether this is a bleeding edge build. */
|
||||||
|
public boolean active(){
|
||||||
|
return Version.type.equals("bleeding-edge");
|
||||||
|
}
|
||||||
|
|
||||||
|
public BeControl(){
|
||||||
|
if(active()){
|
||||||
|
Timer.schedule(() -> {
|
||||||
|
if(checkUpdates && !mobile){
|
||||||
|
checkUpdate(t -> {});
|
||||||
|
}
|
||||||
|
}, 1, updateInterval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** asynchronously checks for updates. */
|
||||||
|
public void checkUpdate(Boolc done){
|
||||||
|
Core.net.httpGet("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest", res -> {
|
||||||
|
if(res.getStatus() == HttpStatus.OK){
|
||||||
|
Jval val = Jval.read(res.getResultAsString());
|
||||||
|
int newBuild = Strings.parseInt(val.getString("tag_name", "0"));
|
||||||
|
if(newBuild > Version.build){
|
||||||
|
Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop"));
|
||||||
|
String url = asset.getString("browser_download_url", "");
|
||||||
|
updateAvailable = true;
|
||||||
|
updateBuild = newBuild;
|
||||||
|
updateUrl = url;
|
||||||
|
showUpdateDialog();
|
||||||
|
Core.app.post(() -> done.get(true));
|
||||||
|
}else{
|
||||||
|
Core.app.post(() -> done.get(false));
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Core.app.post(() -> done.get(false));
|
||||||
|
}
|
||||||
|
}, error -> {
|
||||||
|
if(!headless){
|
||||||
|
ui.showException(error);
|
||||||
|
}else{
|
||||||
|
error.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return whether a new update is available */
|
||||||
|
public boolean isUpdateAvailable(){
|
||||||
|
return updateAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** shows the dialog for updating the game on desktop, or a prompt for doing so on the server */
|
||||||
|
public void showUpdateDialog(){
|
||||||
|
if(!updateAvailable) return;
|
||||||
|
|
||||||
|
if(!headless){
|
||||||
|
checkUpdates = false;
|
||||||
|
ui.showCustomConfirm(Core.bundle.format("be.update", "") + " " + updateBuild, "$be.update.confirm", "$ok", "$be.ignore", () -> {
|
||||||
|
boolean[] cancel = {false};
|
||||||
|
float[] progress = {0};
|
||||||
|
int[] length = {0};
|
||||||
|
Fi file = bebuildDirectory.child("client-be-" + updateBuild + ".jar");
|
||||||
|
|
||||||
|
FloatingDialog dialog = new FloatingDialog("$be.updating");
|
||||||
|
download(updateUrl, file, i -> length[0] = i, v -> progress[0] = v, () -> cancel[0], () -> {
|
||||||
|
try{
|
||||||
|
Runtime.getRuntime().exec(new String[]{"java", "-DlastBuild=" + Version.build, "-Dberestart", "-jar", file.absolutePath()});
|
||||||
|
System.exit(0);
|
||||||
|
}catch(IOException e){
|
||||||
|
ui.showException(e);
|
||||||
|
}
|
||||||
|
}, e -> {
|
||||||
|
dialog.hide();
|
||||||
|
ui.showException(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.cont.add(new Bar(() -> length[0] == 0 ? Core.bundle.get("be.updating") : (int)(progress[0] * length[0]) / 1024/ 1024 + "/" + length[0]/1024/1024 + " MB", () -> Pal.accent, () -> progress[0])).width(400f).height(70f);
|
||||||
|
dialog.buttons.addImageTextButton("$cancel", Icon.cancelSmall, () -> {
|
||||||
|
cancel[0] = true;
|
||||||
|
dialog.hide();
|
||||||
|
}).size(210f, 64f);
|
||||||
|
dialog.setFillParent(false);
|
||||||
|
dialog.show();
|
||||||
|
}, () -> checkUpdates = false);
|
||||||
|
}else{
|
||||||
|
Log.info("&lcA new update is available: &lyBleeding Edge build {0}", updateBuild);
|
||||||
|
if(Config.autoUpdate.bool()){
|
||||||
|
Log.info("&lcAuto-downloading next version...");
|
||||||
|
|
||||||
|
try{
|
||||||
|
//download new file from github
|
||||||
|
Fi source = Fi.get(BeControl.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
|
||||||
|
Fi dest = source.sibling("server-be-" + updateBuild + ".jar");
|
||||||
|
|
||||||
|
download(updateUrl, dest,
|
||||||
|
len -> Core.app.post(() -> Log.info("&ly| Size: {0} MB.", Strings.fixed((float)len / 1024 / 1024, 2))),
|
||||||
|
progress -> {},
|
||||||
|
() -> false,
|
||||||
|
() -> Core.app.post(() -> {
|
||||||
|
netServer.kickAll(KickReason.serverRestarting);
|
||||||
|
Threads.sleep(32);
|
||||||
|
|
||||||
|
Log.info("&lcVersion downloaded, exiting. Note that if you are not using a auto-restart script, the server will not restart automatically.");
|
||||||
|
//replace old file with new
|
||||||
|
dest.copyTo(source);
|
||||||
|
dest.delete();
|
||||||
|
System.exit(2); //this will cause a restart if using the script
|
||||||
|
}),
|
||||||
|
Throwable::printStackTrace);
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkUpdates = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void download(String furl, Fi dest, Intc length, Floatc progressor, Boolp canceled, Runnable done, Cons<Throwable> error){
|
||||||
|
executor.submit(() -> {
|
||||||
|
try{
|
||||||
|
HttpURLConnection con = (HttpURLConnection)new URL(furl).openConnection();
|
||||||
|
BufferedInputStream in = new BufferedInputStream(con.getInputStream());
|
||||||
|
OutputStream out = dest.write(false, 4096);
|
||||||
|
|
||||||
|
byte[] data = new byte[4096];
|
||||||
|
long size = con.getContentLength();
|
||||||
|
long counter = 0;
|
||||||
|
length.get((int)size);
|
||||||
|
int x;
|
||||||
|
while((x = in.read(data, 0, data.length)) >= 0 && !canceled.get()){
|
||||||
|
counter += x;
|
||||||
|
progressor.get((float)counter / (float)size);
|
||||||
|
out.write(data, 0, x);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
in.close();
|
||||||
|
if(!canceled.get()) done.run();
|
||||||
|
}catch(Throwable e){
|
||||||
|
error.get(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,7 +27,9 @@ public class CrashSender{
|
|||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
|
|
||||||
//don't create crash logs for custom builds, as it's expected
|
//don't create crash logs for custom builds, as it's expected
|
||||||
if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))) return;
|
if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))){
|
||||||
|
ret();
|
||||||
|
}
|
||||||
|
|
||||||
//attempt to load version regardless
|
//attempt to load version regardless
|
||||||
if(Version.number == 0){
|
if(Version.number == 0){
|
||||||
@@ -63,7 +65,7 @@ public class CrashSender{
|
|||||||
try{
|
try{
|
||||||
//check crash report setting
|
//check crash report setting
|
||||||
if(!Core.settings.getBool("crashreport", true)){
|
if(!Core.settings.getBool("crashreport", true)){
|
||||||
return;
|
ret();
|
||||||
}
|
}
|
||||||
}catch(Throwable ignored){
|
}catch(Throwable ignored){
|
||||||
//if there's no settings init we don't know what the user wants but chances are it's an important crash, so send it anyway
|
//if there's no settings init we don't know what the user wants but chances are it's an important crash, so send it anyway
|
||||||
@@ -72,14 +74,14 @@ public class CrashSender{
|
|||||||
try{
|
try{
|
||||||
//check any mods - if there are any, don't send reports
|
//check any mods - if there are any, don't send reports
|
||||||
if(Vars.mods != null && !Vars.mods.list().isEmpty()){
|
if(Vars.mods != null && !Vars.mods.list().isEmpty()){
|
||||||
return;
|
ret();
|
||||||
}
|
}
|
||||||
}catch(Throwable ignored){
|
}catch(Throwable ignored){
|
||||||
}
|
}
|
||||||
|
|
||||||
//do not send exceptions that occur for versions that can't be parsed
|
//do not send exceptions that occur for versions that can't be parsed
|
||||||
if(Version.number == 0){
|
if(Version.number == 0){
|
||||||
return;
|
ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean netActive = false, netServer = false;
|
boolean netActive = false, netServer = false;
|
||||||
@@ -130,12 +132,16 @@ public class CrashSender{
|
|||||||
while(!sent[0]){
|
while(!sent[0]){
|
||||||
Thread.sleep(30);
|
Thread.sleep(30);
|
||||||
}
|
}
|
||||||
}catch(InterruptedException ignored){
|
}catch(InterruptedException ignored){}
|
||||||
}
|
|
||||||
}catch(Throwable death){
|
}catch(Throwable death){
|
||||||
death.printStackTrace();
|
death.printStackTrace();
|
||||||
System.exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ret(){
|
||||||
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void httpPost(String url, String content, Cons<HttpResponse> success, Cons<Throwable> failure){
|
private static void httpPost(String url, String content, Cons<HttpResponse> success, Cons<Throwable> failure){
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package mindustry.net;
|
package mindustry.net;
|
||||||
|
|
||||||
|
import mindustry.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
|
||||||
public class Host{
|
public class Host{
|
||||||
@@ -11,7 +12,7 @@ public class Host{
|
|||||||
public final int version;
|
public final int version;
|
||||||
public final String versionType;
|
public final String versionType;
|
||||||
public final Gamemode mode;
|
public final Gamemode mode;
|
||||||
public int ping;
|
public int ping, port = Vars.port;
|
||||||
|
|
||||||
public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit){
|
public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit){
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package mindustry.net;
|
package mindustry.net;
|
||||||
|
|
||||||
import arc.*;
|
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.core.*;
|
import mindustry.core.*;
|
||||||
import mindustry.entities.type.*;
|
import mindustry.entities.type.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
import mindustry.maps.Map;
|
import mindustry.maps.Map;
|
||||||
|
import mindustry.net.Administration.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.*;
|
import java.nio.*;
|
||||||
@@ -62,7 +62,7 @@ public class NetworkIO{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static ByteBuffer writeServerData(){
|
public static ByteBuffer writeServerData(){
|
||||||
String name = (headless ? Core.settings.getString("servername") : player.name);
|
String name = (headless ? Config.name.string() : player.name);
|
||||||
String map = world.getMap() == null ? "None" : world.getMap().name();
|
String map = world.getMap() == null ? "None" : world.getMap().name();
|
||||||
|
|
||||||
ByteBuffer buffer = ByteBuffer.allocate(256);
|
ByteBuffer buffer = ByteBuffer.allocate(256);
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ public class Packets{
|
|||||||
|
|
||||||
public enum KickReason{
|
public enum KickReason{
|
||||||
kick, clientOutdated, serverOutdated, banned, gameover(true), recentKick,
|
kick, clientOutdated, serverOutdated, banned, gameover(true), recentKick,
|
||||||
nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch, whitelist, playerLimit;
|
nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch,
|
||||||
|
whitelist, playerLimit, serverRestarting;
|
||||||
|
|
||||||
public final boolean quiet;
|
public final boolean quiet;
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ public class Weapon{
|
|||||||
public float shotDelay = 0;
|
public float shotDelay = 0;
|
||||||
/** whether shooter rotation is ignored when shooting. */
|
/** whether shooter rotation is ignored when shooting. */
|
||||||
public boolean ignoreRotation = false;
|
public boolean ignoreRotation = false;
|
||||||
|
/** if turnCursor is false for a mech, how far away will the weapon target. */
|
||||||
|
public float targetDistance = 1f;
|
||||||
|
|
||||||
public Sound shootSound = Sounds.pew;
|
public Sound shootSound = Sounds.pew;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import arc.util.pooling.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
|
|
||||||
public class Bar extends Element{
|
public class Bar extends Element{
|
||||||
private static Rectangle scissor = new Rectangle();
|
private static Rect scissor = new Rect();
|
||||||
|
|
||||||
private Floatp fraction;
|
private Floatp fraction;
|
||||||
private String name = "";
|
private String name = "";
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ public class ItemsDisplay extends Table{
|
|||||||
private String format(Item item){
|
private String format(Item item){
|
||||||
builder.setLength(0);
|
builder.setLength(0);
|
||||||
builder.append(ui.formatAmount(data.items().get(item, 0)));
|
builder.append(ui.formatAmount(data.items().get(item, 0)));
|
||||||
if(!state.is(State.menu) && !state.teams.get(player.getTeam()).cores.isEmpty() && state.teams.get(player.getTeam()).cores.first().entity != null && state.teams.get(player.getTeam()).cores.first().entity.items.get(item) > 0){
|
if(!state.is(State.menu) && player.getTeam().data().hasCore() && player.getTeam().core().items.get(item) > 0){
|
||||||
builder.append(" [unlaunched]+ ");
|
builder.append(" [unlaunched]+ ");
|
||||||
builder.append(ui.formatAmount(state.teams.get(player.getTeam()).cores.first().entity.items.get(item)));
|
builder.append(ui.formatAmount(state.teams.get(player.getTeam()).core().items.get(item)));
|
||||||
}
|
}
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class Minimap extends Table{
|
|||||||
Draw.rect(renderer.minimap.getRegion(), x + width / 2f, y + height / 2f, width, height);
|
Draw.rect(renderer.minimap.getRegion(), x + width / 2f, y + height / 2f, width, height);
|
||||||
|
|
||||||
if(renderer.minimap.getTexture() != null){
|
if(renderer.minimap.getTexture() != null){
|
||||||
renderer.minimap.drawEntities(x, y, width, height, false);
|
renderer.minimap.drawEntities(x, y, width, height, 0.75f, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).size(140f);
|
}).size(140f);
|
||||||
@@ -83,7 +83,7 @@ public class Minimap extends Table{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clicked(InputEvent event, float x, float y){
|
public void clicked(InputEvent event, float x, float y){
|
||||||
ui.minimap.show();
|
ui.minimapfrag.toggle();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ public class CustomRulesDialog extends FloatingDialog{
|
|||||||
check("$rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions);
|
check("$rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions);
|
||||||
number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources);
|
number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources);
|
||||||
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier);
|
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier);
|
||||||
|
number("$rules.blockhealthmultiplier", f -> rules.blockHealthMultiplier = f, () -> rules.blockHealthMultiplier);
|
||||||
|
|
||||||
main.addButton("$configure",
|
main.addButton("$configure",
|
||||||
() -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout,
|
() -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout,
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
private final float nodeSize = Scl.scl(230f);
|
private final float nodeSize = Scl.scl(230f);
|
||||||
private ObjectSet<ZoneNode> nodes = new ObjectSet<>();
|
private ObjectSet<ZoneNode> nodes = new ObjectSet<>();
|
||||||
private ZoneInfoDialog info = new ZoneInfoDialog();
|
private ZoneInfoDialog info = new ZoneInfoDialog();
|
||||||
private Rectangle bounds = new Rectangle();
|
private Rect bounds = new Rect();
|
||||||
private View view = new View();
|
private View view = new View();
|
||||||
|
|
||||||
public DeployDialog(){
|
public DeployDialog(){
|
||||||
|
|||||||
@@ -288,7 +288,12 @@ public class JoinDialog extends FloatingDialog{
|
|||||||
local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time(), 4, 10f, ".")).pad(10f)).growX();
|
local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time(), 4, 10f, ".")).pad(10f)).growX();
|
||||||
net.discoverServers(this::addLocalHost, this::finishLocalHosts);
|
net.discoverServers(this::addLocalHost, this::finishLocalHosts);
|
||||||
for(String host : defaultServers){
|
for(String host : defaultServers){
|
||||||
net.pingHost(host, port, this::addLocalHost, e -> {});
|
String resaddress = host.contains(":") ? host.split(":")[0] : host;
|
||||||
|
int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port;
|
||||||
|
net.pingHost(resaddress, resport, res -> {
|
||||||
|
res.port = resport;
|
||||||
|
addLocalHost(res);
|
||||||
|
}, e -> {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,7 +319,7 @@ public class JoinDialog extends FloatingDialog{
|
|||||||
|
|
||||||
local.row();
|
local.row();
|
||||||
|
|
||||||
TextButton button = local.addButton("", Styles.cleart, () -> safeConnect(host.address, port, host.version))
|
TextButton button = local.addButton("", Styles.cleart, () -> safeConnect(host.address, host.port, host.version))
|
||||||
.width(w).pad(5f).get();
|
.width(w).pad(5f).get();
|
||||||
button.clearChildren();
|
button.clearChildren();
|
||||||
buildServer(host, button);
|
buildServer(host, button);
|
||||||
@@ -362,7 +367,7 @@ public class JoinDialog extends FloatingDialog{
|
|||||||
servers = Core.settings.getObject("server-list", Array.class, Array::new);
|
servers = Core.settings.getObject("server-list", Array.class, Array::new);
|
||||||
|
|
||||||
//get servers
|
//get servers
|
||||||
Core.net.httpGet(serverJsonURL, result -> {
|
Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> {
|
||||||
try{
|
try{
|
||||||
Jval val = Jval.read(result.getResultAsString());
|
Jval val = Jval.read(result.getResultAsString());
|
||||||
Core.app.post(() -> {
|
Core.app.post(() -> {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class ModsDialog extends FloatingDialog{
|
|||||||
|
|
||||||
buttons.row();
|
buttons.row();
|
||||||
|
|
||||||
buttons.addImageTextButton("$mods.guide", Icon.wiki,
|
buttons.addImageTextButton("$mods.guide", Icon.link,
|
||||||
() -> Core.net.openURI(modGuideURL))
|
() -> Core.net.openURI(modGuideURL))
|
||||||
.size(210, 64f);
|
.size(210, 64f);
|
||||||
|
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ public class SchematicsDialog extends FloatingDialog{
|
|||||||
setup();
|
setup();
|
||||||
ui.showInfoFade("$schematic.saved");
|
ui.showInfoFade("$schematic.saved");
|
||||||
showInfo(s);
|
showInfo(s);
|
||||||
}catch(Exception e){
|
}catch(Throwable e){
|
||||||
ui.showException(e);
|
ui.showException(e);
|
||||||
}
|
}
|
||||||
}).marginLeft(12f).disabled(b -> Core.app.getClipboardText() == null || !Core.app.getClipboardText().startsWith(schematicBaseStart));
|
}).marginLeft(12f).disabled(b -> Core.app.getClipboardText() == null || !Core.app.getClipboardText().startsWith(schematicBaseStart));
|
||||||
|
|||||||
@@ -229,6 +229,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
game.checkPref("savecreate", true);
|
game.checkPref("savecreate", true);
|
||||||
game.checkPref("blockreplace", true);
|
game.checkPref("blockreplace", true);
|
||||||
game.checkPref("conveyorpathfinding", true);
|
game.checkPref("conveyorpathfinding", true);
|
||||||
|
game.checkPref("coreselect", false);
|
||||||
game.checkPref("hints", true);
|
game.checkPref("hints", true);
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
game.checkPref("buildautopause", false);
|
game.checkPref("buildautopause", false);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user