Merge branch 'master' of https://github.com/Anuken/Mindustry into v103.3

This commit is contained in:
Petr Gašparík
2020-02-11 11:18:54 +01:00
18 changed files with 233 additions and 156 deletions

1
.gitignore vendored
View File

@@ -22,6 +22,7 @@ logs/
/server/build/ /server/build/
changelog changelog
saves/ saves/
/core/assets-raw/fontgen/out/
core/assets/saves/ core/assets/saves/
/core/assets/saves/ /core/assets/saves/
steam_appid.txt steam_appid.txt

View File

@@ -81,7 +81,7 @@ public class AndroidLauncher extends AndroidApplication{
if(VERSION.SDK_INT >= VERSION_CODES.Q){ if(VERSION.SDK_INT >= VERSION_CODES.Q){
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT); Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType(extension.equals("zip") ? "application/zip" : "*/*"); intent.setType(extension.equals("zip") && !open ? "application/zip" : "*/*");
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> { addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
if(code == Activity.RESULT_OK && in != null && in.getData() != null){ if(code == Activity.RESULT_OK && in != null && in.getData() != null){
Uri uri = in.getData(); Uri uri = in.getData();

View File

@@ -1,14 +1,15 @@
package mindustry.annotations.impl; package mindustry.annotations.impl;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import mindustry.annotations.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import mindustry.annotations.remote.*; import mindustry.annotations.remote.*;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.lang.model.util.*; import javax.lang.model.util.*;
import javax.tools.*;
import java.io.*; import java.io.*;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*; import java.util.*;
@@ -19,14 +20,19 @@ public class SerializeProcess extends BaseProcessor{
/** Target class name. */ /** Target class name. */
private static final String className = "Serialization"; private static final String className = "Serialization";
/** Name of the base package to put all the generated classes. */ /** Name of the base package to put all the generated classes. */
private static final String data = "eJztV0tvGzcQvvfQ3zDRIeDCKhsbQVDUsgP5UViH2IHl9BIEBsUdSYxX3C3Jlawm+XH9Z53hUg/bkuOmOfRQwfDuDme++ebBWe6PfwU3/wTwUU2VLJQdSYfDAnWQvxkschjCAUyMzWtPetJikF2nzzG8deXU5OjkW6VvMPTRGVWYP0mgC+W9HGE4Qbp1mEcg0Zo5E9C1sn2AofQYulqj92ZQoAiuxqVc2Loo2iCU03JYWy2PS+v3OndJNF7bDW1rSnk0D3hUD4foDjNRtWGQwU+HQIGZoajAWB+U1VgOYROOZx+Wgm4eMzJ7ghpoyo14Cl5FsQ2I4PsPcE2/XXpssk7kOMw6mEJe9KXxXZu70uTM4Jjz2Hl9CJ79xCc5LN25mqBoqUZPVosy9DEEY0eebnTtMKZ5iaDddgRd2oA2MGO+XqIvi2mq0xJAqQ0ARHzA8dncywWar91QaZwanMkUS7eqCqNVMKW9x+qRuO6wug3R8GGLvsEwLnMYMZBS6z3XrIgWidYhLgYfyQ50IyKrkZbGTssbjHU4Lh1KVVWbvaUNEf8fUFXYX+rt7vnJ5UXv5Lp3Et30g6NagDK55RZpHrNoyUaxwx+PyA+XLtZCaYBabSpoOzlptttX0uM8oen7aJsqnhLkkixmyPlFjlLe1kL0a/ER6YVis4UXKO2YCbYyNkCBnBQv6ToKY5Gt9kauAveZxVkjYc2fYe8DT4bSCTY2tP5iny4dxuGbnQPY4+3Cxu9N1GdODJAJcTxWTmmaOzI3IxOEl5ok3SBM1obdVxl0OvAyA9iB7Zq0uNtoM9cvy9gpvLoIiXAjW+1mnwZi7Ht5pDy+enlc8k5Fq+kqmG8EpBnQIEn8o1aFp25a/C66B60sgzB25Sx6uaxtMBM8vdVYMbBoHakc3r3rnchYvjhdiBGDM1csPD4cMr3Sc8ZSGHVtuJ+X/e8Xk2TZcKLFOtR2rVYizM8EdDqpwlxkDJZKeCcnUfYLl4+f2MFEhbG8pE0uMhqXt4Gntk/hM3Ti8k0JTSgM8zCWqg7LKPiyWcurKYr1PDaYi0x+Wi08gVaOkdYT85paa+Enbubo4NTWE3QRvtO87eg1Qy/gWeluerQd47w9BCRSsHWdfd6XebGcGptMoKw58Dhe4IwrXJYFKkspEKnYfImdRB0R7+GAasezjRIXamdhSP2M+1/rjv7cB5xI5Zya67KaN2BteNFOFvE2CtPUYObJxbN/1Sxb9hw8f/7dgbsMnKoMcAbjlIezWAcecJRxkmHcGacFTmg48xrLuYBnyuUzerl185y8UPkW6YbPn+HZWFJhtmlmMSKUY+XfUC8m8NgBG52uDeXrVFnYhv3Py3u9sb7X9wu8eMUE9x1GArUoAW0rNyVw42r3WwfwanDQHx1+9FhcMYii4y6E/6fvf3T6UiaZLA3BtXO9Zvvf0Xn2MahNEfmv1unr42peYe9Cxk+chD6gU5qcNla8/GQbSwfhJyvXvslmpC2oxOXAUIe9TgegXfgVXizXOSxN4RSlW9nEnK4eGzsGolO9pw+6xXC6d/pa0yDBzs7db6ZHGEczPgSbO+88qBpVMYjSbH/Trgn0vUM8+oE+O67otMbt8uWHvwGqGwCj"; private static final String data = "eJy1V21v2zYQ/gf7DZyAAVTjqUk6rFvVdMhbNwNt2sVpg6EOCoqibSYSKZCUHdfwH9+n3ZF07KT24g2bEUQiebx77rkXUt/82TB+w4aC1FKVrXVmmpWiaIe5rBttHGGGZ09WBwNZCftgqlUPhGrmRvdnWierNTNWGMkq+YU5qdVyfQmGayPWzUu9blYJlx0afibce6PHshRmk9R7cFu4FUeu2Zjd0+onKqaGmRGDSnD3YEl9Jew9+iIbmOYVs5Z01TXs02bWtEUlObEO/ORkrGVJpKTp7DxqtsLRgKgXCQHkXkeHJBMjnTBJh9Bjrez+y3WOdMjR1ImjdjAQ5lVKmw4pUvL9KzKTA9oQqcCy4kIPCKhQYDHsSmf3hoSTA29kRaLJC1D86YoYYdvKdUsQUWJC/OzuVQ4w0Ma7XibtoSoNuAZavfd8D2T9azbQ5ozVgiYsiGTaZketrMokzXvOSDX0I2FIEZ/Byr01muavpahKADPApwUhvpcNhfPTFtbBDvWDIEFeRMkUMfpXFL+YNoKm5OAg6g9MpzP0JdrPWNMIVS73UNVWVZrmc84cH9GLkdETVlSCAInz+TyShA+7ytBPVzm+n4PfdKHa6WCWptmI2dGxLgFNCsG8dRhES72WNF9h3M/kc1FZQRZsX0Ia6AnAxk0NGIeUYE4MpUcwoyH+wRSppBIwCxvFreA0mdSQh9w2RpctdwQcJB8+dE8gHNt4gtoyUFw/7oJrjVrA70RMr6GFEOwjoB/fM24EIL8QdYNDmkA5DG8g4ZNsXNgEw16JS18FZDCJoJZzFFUt8ojADnKQ9MAhXVxfvu1CQY0lR1O/CveuwIKk/WQiVT2snX3Rh1/W7xutXb/PZT3e7ydpXyU7xOvguuo6USMT99Rlp0Dj760wU/KZBHFCCCjuCSxo8oQMjK4JxOjZ/ucjZsWRZqYE1VH4tTbklPERakUDUKJLW0Hk0nIjG5ed8pFeiGWhPZy1dQFcBDlxKx2BxI/DM4gBvuaDSeY7BwVGUhzxSlsIU74hJXiwR54+PdNv9FCDRzs+Spj+x0xpJTmr3kNnx1CH6P+32eKNlUCgQ5ibcoeUEtvDMR4M4TBihdVVC5uSY4gndP6hYfUJc6zfRx+6CqrC191v4jaW3ltwY5AZgKfrnhAl7U0t8jv0J0cjjJvSpIXTKVPQt5JV4B2y2yE/x18KLQEK8lvABDRK66ALpTMc1Tfwf9GTpHJEAujdHB4vyR4+d3aCIB9BW6DJZe+P3jZoabQLokl2cngB2HyYA5N3AXiwJb2C1jUH8tzQAY4t7T5//hxWtqcmkgE2VsjYJkXWJAMqWXEszs5jVuAqNI0yLKJvi7RGUGDmEdB5oXUlmCJMTUF6wKCzrovUsqdmlVBDN4qBw6NipT8vxT5RCZShkVVeyHdfa7ryx0qaBwTOtCIvwKWbDUcMEguiKXE472k8b5WTtTi95aLB+xPygEfE7G9EEnR+vs4EuhSqy99ZpqE3AMbDpsFiOlks0P+7oO4gLIsIgMUDY7kYEngdmH+csb7zLFP2kZJ91P66et2+TP9lwXgf1lbMXZp6kXtl81Ue7KeLK0PbynLRZ+FAdjBnkdLoY4LreEYnnkIcwaXktG6A7GXVB+PbeBEk0zyaXd7+KB6fP/6A8YIeqzjGLQqn+X10TevucOHj4bpl43Cy3DESXmPZrMyv2iyFt7kFEVhZ8wJhQFbQj8JY/Krx9740x1tn912IUNxadAjPxkEMlzcLYeJuXm0t+uoNU/j40gWWyi/Ep0C6B7fg3biKsDh8U1XaLOQXTgNX58fP9gk3PNLvx0AXx4+1poTutSLsN7/RgACXgY2PrGqxoKLaYBvBlMA7fM+sPQhX1mN5bXLRy2HDlJ5lfxNu4gWngBn4A93CDBjc9fyNeJGCvsuGrmnJXaaDjr8ApwI0lQ==";
@Override @Override
public void process(RoundEnvironment env) throws Exception{ public void process(RoundEnvironment env) throws Exception{
Set<TypeElement> elements = ElementFilter.typesIn(env.getElementsAnnotatedWith(Serialize.class)); Set<TypeElement> elements = ElementFilter.typesIn(env.getElementsAnnotatedWith(Serialize.class));
JavaFileObject obj = filer.createSourceFile(packageName + ".Injector");
OutputStream stream = obj.openOutputStream();
stream.write(new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(data)))).readUTF().replace("debug", "gen").getBytes());
stream.close();
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(data)))).readUTF())); classBuilder.addStaticBlock(CodeBlock.of("Injector.ii();"));
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build()); classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
classBuilder.addJavadoc(RemoteProcess.autogenWarning); classBuilder.addJavadoc(RemoteProcess.autogenWarning);

View File

@@ -3,7 +3,7 @@ credits = Tekijät
contributors = Kääntäjät ja avustajat contributors = Kääntäjät ja avustajat
discord = Liity Mindustryn Discordiin! discord = Liity Mindustryn Discordiin!
link.discord.description = Mindustryn virallinen Discord-keskusteluhuone link.discord.description = Mindustryn virallinen Discord-keskusteluhuone
link.reddit.description = Mindustry subreddit link.reddit.description = Mindustryn alireddit
link.github.description = Pelin lähdekoodi link.github.description = Pelin lähdekoodi
link.changelog.description = Lista päivityksien muutoksista link.changelog.description = Lista päivityksien muutoksista
link.dev-builds.description = Epävakaat kehitysversiot link.dev-builds.description = Epävakaat kehitysversiot
@@ -21,15 +21,15 @@ gameover.pvp = [accent] {0}[] joukkue voittaa!
highscore = [accent]Uusi ennätys! highscore = [accent]Uusi ennätys!
copied = Kopioitu. copied = Kopioitu.
load.sound = Ääni load.sound = Ääniä
load.map = Kartat load.map = Karttoja
load.image = Kuvat load.image = Kuvia
load.content = Sisältö load.content = Sisältöä
load.system = Systeemi load.system = Järjestelmää
load.mod = Modit load.mod = Modeja
load.scripts = Skriptit load.scripts = Skriptejä
be.update = A new Bleeding Edge build is available: be.update = Uusi kehitysversio on saatavilla:
be.update.confirm = Lataa se ja käynnistä peli uudelleen? be.update.confirm = Lataa se ja käynnistä peli uudelleen?
be.updating = Päivitetään... be.updating = Päivitetään...
be.ignore = Sivuuta be.ignore = Sivuuta
@@ -37,20 +37,20 @@ be.noupdates = Ei päivityksiä saatavilla.
be.check = Tarkista päivityksiä be.check = Tarkista päivityksiä
schematic = Kaavio schematic = Kaavio
schematic.add = Tallenna Kaavio... schematic.add = Tallenna kaavio...
schematics = Kaaviot schematics = Kaaviot
schematic.replace = Kaavio tällä nimellä on jo olemassa. Haluatko korvata sen? schematic.replace = Kaavio tällä nimellä on jo olemassa. Haluatko korvata sen?
schematic.import = Tuo Kaavio... schematic.import = Tuo kaavio...
schematic.exportfile = Luo Tiedosto schematic.exportfile = Vie tiedosto
schematic.importfile = Tuo Tiedosto schematic.importfile = Tuo tiedosto
schematic.browseworkshop = Selaa Työpajaa schematic.browseworkshop = Selaa Workshoppia
schematic.copy = Kopioi Leikepöydälle schematic.copy = Kopioi leikepöydälle
schematic.copy.import = Tou Leikepöydälle schematic.copy.import = Tuo leikepöydäl
schematic.shareworkshop = Jaa työpajaan schematic.shareworkshop = Jaa Workshoppiin
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Käännä Kaavio schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Käännä Kaavio
schematic.saved = Kaavio tallennettu. schematic.saved = Kaavio tallennettu.
schematic.delete.confirm = Tämä kaavio poistetaan. schematic.delete.confirm = Tämä kaavio poistetaan.
schematic.rename = Uudelleennimeä Kaavio schematic.rename = Nimeä kaavio uudelleen
schematic.info = {0}x{1}, {2} palikkaa schematic.info = {0}x{1}, {2} palikkaa
stat.wave = Tasoja voitettu:[accent] {0} stat.wave = Tasoja voitettu:[accent] {0}
@@ -62,7 +62,7 @@ stat.delivered = Resursseja laukaistu:
stat.rank = Lopullinen arvosana: [accent]{0} stat.rank = Lopullinen arvosana: [accent]{0}
launcheditems = [accent]Laukaistut tavarat launcheditems = [accent]Laukaistut tavarat
launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. launchinfo = [unlaunched][[LAUKAISE] ytimesi saadaksesi sinisellä merkityt tavarat.
map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"? map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"?
level.highscore = Ennätys: [accent]{0} level.highscore = Ennätys: [accent]{0}
level.select = Tason valinta level.select = Tason valinta
@@ -82,12 +82,12 @@ position = Sijainti
close = Sulje close = Sulje
website = Verkkosivu website = Verkkosivu
quit = Poistu quit = Poistu
save.quit = Tallenna ja Poistu save.quit = Tallenna ja poistu
maps = Kartat maps = Kartat
maps.browse = Selaa Karttoja maps.browse = Selaa karttoja
continue = Jatka continue = Jatka
maps.none = [lightgray]Karttoja ei löytynyt! maps.none = [lightgray]Karttoja ei löytynyt!
invalid = Invalidi invalid = Virheellinen
pickcolor = Valitse väri pickcolor = Valitse väri
preparingconfig = Preparing Config preparingconfig = Preparing Config
preparingcontent = Preparing Content preparingcontent = Preparing Content
@@ -95,29 +95,29 @@ uploadingcontent = Uploading Content
uploadingpreviewfile = Uploading Preview File uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Valmis done = Valmis
feature.unsupported = Sinun laitteesi ei tue tätä toimintoa. feature.unsupported = Laitteesi ei tue tätä toimintoa.
mods.alphainfo = Pidä mielessä että modit ovat alpha-tilassa, ja[scarlet] ne voivat olla virheellisiä[].\nRaportoi kaikki virheet Mindustry GitHub-sivuille tai Discordiin. mods.alphainfo = Pidä mielessä että modit ovat alpha-tilassa, ja[scarlet] ne voivat olla virheellisiä[].\nRaportoi kaikki virheet Mindustry GitHub-sivuille tai Discordiin.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Modit mods = Modit
mods.none = [LIGHT_GRAY]Modeja ei löytynyt! mods.none = [LIGHT_GRAY]Modeja ei löytynyt!
mods.guide = Modaamisen opas mods.guide = Modaamisopas
mods.report = Raportoi ohjelmistovirhe mods.report = Raportoi ohjelmistovirhe
mods.openfolder = Avaa Modikansio mods.openfolder = Avaa modikansio
mod.enabled = [lightgray]Käytössä mod.enabled = [lightgray]Käytössä
mod.disabled = [scarlet]Epäkäytössä mod.disabled = [scarlet]Pois käytöstä
mod.disable = Laita pois päältä mod.disable = Poista käytössä
mod.delete.error = Modia ei pystynyt poistamaan. Tiedosto voi olla käytössä. mod.delete.error = Modia ei pystytty poistamaan. Tiedosto voi olla käytössä.
mod.requiresversion = [scarlet]Tarvitsee vähintää pelin version: [accent]{0} mod.requiresversion = [scarlet]Tarvitsee vähintään pelin version: [accent]{0}
mod.missingdependencies = [scarlet]Tarvitsee nämä modit: {0} mod.missingdependencies = [scarlet]Tarvitsee nämä modit: {0}
mod.erroredcontent = [scarlet]Sisältö Virheet mod.erroredcontent = [scarlet]Sisältövirheet
mod.errors = Virheitä on tapahtunut pelin ladatessa. mod.errors = Virheitä on tapahtunut pelin ladatessa.
mod.noerrorplay = [scarlet]Sinulla on virheellisiä modeja.[] Joko poista ne käytöstä tai korjaa virheet. mod.noerrorplay = [scarlet]Sinulla on virheellisiä modeja.[] Joko poista ne käytöstä tai korjaa virheet.
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.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.enable = Käytä mod.enable = Käytä
mod.requiresrestart = Peli suljetaan jotta muutokset voisivat toteutua. mod.requiresrestart = Peli suljetaan jotta muutokset voisivat toteutua.
mod.reloadrequired = [scarlet]Vaatii Uudelleenkäynnistystä mod.reloadrequired = [scarlet]Vaatii Uudelleenkäynnistystä
mod.import = Tuo Modi mod.import = Tuo modi
mod.import.github = Import GitHub Mod mod.import.github = Import GitHub Mod
mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod.
mod.remove.confirm = Tämä modi poistetaan. mod.remove.confirm = Tämä modi poistetaan.
@@ -170,7 +170,7 @@ hosts.discovering.any = Etsitään Pelejä
server.refreshing = Päivitetään palvelimen tietoja server.refreshing = Päivitetään palvelimen tietoja
hosts.none = [lightgray]Paikallisia pelejä ei löytynyt! hosts.none = [lightgray]Paikallisia pelejä ei löytynyt!
host.invalid = [scarlet]Isäntään ei voitu yhdistää. host.invalid = [scarlet]Isäntään ei voitu yhdistää.
trace = Seuraa Pelaajaa trace = Seuraa pelaajaa
trace.playername = Pelaajanimi: [accent]{0} trace.playername = Pelaajanimi: [accent]{0}
trace.ip = IP-osoite: [accent]{0} trace.ip = IP-osoite: [accent]{0}
trace.id = Uniikki tunniste: [accent]{0} trace.id = Uniikki tunniste: [accent]{0}
@@ -188,8 +188,8 @@ server.outdated = [crimson]Vanhentunut palvelin![]
server.outdated.client = [crimson]Vanhentunut asiakasohjelma![] server.outdated.client = [crimson]Vanhentunut asiakasohjelma![]
server.version = [gray]v{0} {1} server.version = [gray]v{0} {1}
server.custombuild = [yellow]Custom Build server.custombuild = [yellow]Custom Build
confirmban = Oletko varma että haluat potkia tämän pelaajan? confirmban = Oletko varma että haluat antaa porttikiellon tälle pelaajalle?
confirmkick = Oletko varma että haluat poistaa tämän pelaajan? confirmkick = Oletko varma että haluat potkia tämän pelaajan?
confirmvotekick = Oletko varma että haluat äänestää tämän pelaajan potkituksi? confirmvotekick = Oletko varma että haluat äänestää tämän pelaajan potkituksi?
confirmunban = Oletko varma että haluat päästää tämän pelaajan takaisin? confirmunban = Oletko varma että haluat päästää tämän pelaajan takaisin?
confirmadmin = Oletko varma että haluat antaa pelaajalle hallinto-oikeuksia? confirmadmin = Oletko varma että haluat antaa pelaajalle hallinto-oikeuksia?
@@ -208,32 +208,32 @@ server.port = Portti:
server.addressinuse = Address already in use! server.addressinuse = Address already in use!
server.invalidport = Invalid port number! server.invalidport = Invalid port number!
server.error = [crimson]Error hosting server: [accent]{0} server.error = [crimson]Error hosting server: [accent]{0}
save.new = New Save save.new = Uusi tallennus
save.overwrite = Are you sure you want to overwrite\nthis save slot? save.overwrite = Are you sure you want to overwrite\nthis save slot?
overwrite = Overwrite overwrite = Overwrite
save.none = No saves found! save.none = No saves found!
saveload = Tallennetaan... saveload = Tallennetaan...
savefail = Failed to save game! savefail = Pelin tallentaminen epäonnistui!
save.delete.confirm = Are you sure you want to delete this save? save.delete.confirm = Are you sure you want to delete this save?
save.delete = Delete save.delete = Delete
save.export = Export Save save.export = Export Save
save.import.invalid = [accent]This save is invalid! save.import.invalid = [accent]This save is invalid!
save.import.fail = [crimson]Failed to import save: [accent]{0} save.import.fail = [crimson]Failed to import save: [accent]{0}
save.export.fail = [crimson]Failed to export save: [accent]{0} save.export.fail = [crimson]Failed to export save: [accent]{0}
save.import = Tuo Tallennus save.import = Tuo tallennus
save.newslot = Tallennuksen nimi: save.newslot = Tallennuksen nimi:
save.rename = Nimeä uudelleen save.rename = Nimeä uudelleen
save.rename.text = Uusi nimi: save.rename.text = Uusi nimi:
selectslot = Valitse tallennus. selectslot = Valitse tallennus.
slot = [accent]Paikka {0} slot = [accent]Paikka {0}
editmessage = Edit Message editmessage = Muokkaa viestiä
save.corrupted = [accent]Tallennustiedosto korruptoitunut tai viallinen!\nJos olet päivittänyt juuri pelisi, tämä on todennäköisesti muutos tallennusmuodossa [scarlet]eikä[] virhe. save.corrupted = [accent]Tallennustiedosto korruptoitunut tai viallinen!\nJos olet päivittänyt juuri pelisi, tämä on todennäköisesti muutos tallennusmuodossa [scarlet]eikä[] virhe.
empty = <tyhjä> empty = <tyhjä>
on = Päällä on = Päällä
off = Pois off = Pois
save.autosave = Automaattitallennus: {0} save.autosave = Automaattitallennus: {0}
save.map = Kartta: {0} save.map = Kartta: {0}
save.wave = Aalto {0} save.wave = Taso {0}
save.mode = Gamemode: {0} save.mode = Gamemode: {0}
save.date = Viimeksi tallennettu: {0} save.date = Viimeksi tallennettu: {0}
save.playtime = Peliaika: {0} save.playtime = Peliaika: {0}
@@ -308,15 +308,15 @@ editor.waves = Tasot:
editor.rules = Säännöt: editor.rules = Säännöt:
editor.generation = Generaatio: editor.generation = Generaatio:
editor.ingame = Muokka pelin sisällä editor.ingame = Muokka pelin sisällä
editor.publish.workshop = Julkaise työpajaan editor.publish.workshop = Julkaise Workshoppiin
editor.newmap = Uusi kartta editor.newmap = Uusi kartta
workshop = Työpaja workshop = Workshop
waves.title = Tasot waves.title = Tasot
waves.remove = Poista waves.remove = Poista
waves.never = <ei koskaan> waves.never = <ei koskaan>
waves.every = every waves.every = every
waves.waves = wave(s) waves.waves = wave(s)
waves.perspawn = per spawni waves.perspawn = per syntymispiste
waves.to = to waves.to = to
waves.boss = Pomo waves.boss = Pomo
waves.preview = Esikatselu waves.preview = Esikatselu
@@ -324,13 +324,13 @@ waves.edit = Muokkaa...
waves.copy = Kopioi leikepöydälle waves.copy = Kopioi leikepöydälle
waves.load = Lataa leikepöydältä waves.load = Lataa leikepöydältä
waves.invalid = Invalid waves in clipboard. waves.invalid = Invalid waves in clipboard.
waves.copied = Aallot kopioitu. waves.copied = Tasot kopioitu.
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
editor.default = [lightgray]<Default> editor.default = [lightgray]<Default>
details = Yksityiskohdat... details = Yksityiskohdat...
edit = Muokkaa... edit = Muokkaa...
editor.name = Nimi: editor.name = Nimi:
editor.spawn = Spawni yksikkö editor.spawn = Luo yksikkö
editor.removeunit = Poista yksikkö editor.removeunit = Poista yksikkö
editor.teams = Joukkueet editor.teams = Joukkueet
editor.errorload = Virhe ladattaessa tiedostoa:\n[accent]{0} editor.errorload = Virhe ladattaessa tiedostoa:\n[accent]{0}
@@ -431,8 +431,8 @@ fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
language.restart = Please restart your game for the language settings to take effect. language.restart = Please restart your game for the language settings to take effect.
settings = Asetukset settings = Asetukset
tutorial = Tutoriaali tutorial = Perehdytys
tutorial.retake = Uusita Tutoriaali tutorial.retake = Pelaa perehdytys uudelleen
editor = Editori editor = Editori
mapeditor = Kartan Editori mapeditor = Kartan Editori
@@ -449,8 +449,8 @@ launch = < LAUNCH >
launch.title = Onnistunut laukaisu launch.title = Onnistunut laukaisu
launch.next = [lightgray]next opportunity at wave {0} launch.next = [lightgray]next opportunity at wave {0}
launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.unable2 = [scarlet]Unable to LAUNCH.[]
launch.confirm = Tämä laukaisee kaikki resourssit ytimestäsi.\nEt voi enää palata takaisin. launch.confirm = Tämä laukaisee kaikki resurssit ytimestäsi.\nEt voi enää palata takaisin.
launch.skip.confirm = Jos ohitat nyt, voit laukaista vasta myöhemmissä tasoissa. launch.skip.confirm = Jos ohitat nyt, voit laukaista vasta myöhemmillä tasoilla.
uncover = Paljasta uncover = Paljasta
configure = Configure Loadout configure = Configure Loadout
bannedblocks = Kielletyt Palikat bannedblocks = Kielletyt Palikat
@@ -530,60 +530,60 @@ error.title = [crimson]An error has occured
error.crashtitle = An error has occured error.crashtitle = An error has occured
blocks.input = Sisääntulo blocks.input = Sisääntulo
blocks.output = Ulostulo blocks.output = Ulostulo
blocks.booster = Boostaa blocks.booster = Tehostaja
block.unknown = [lightgray]??? block.unknown = [lightgray]???
blocks.powercapacity = Energiakapasiteetti blocks.powercapacity = Energiakapasiteetti
blocks.powershot = Energiaa/Ammus blocks.powershot = Energiaa/Ammus
blocks.damage = Vahinko blocks.damage = Vahinko
blocks.targetsair = Hyökkää Ilmaan blocks.targetsair = Hyökkää ilmaan
blocks.targetsground = Hyökkää Maahan blocks.targetsground = Hyökkää maahan
blocks.itemsmoved = Liikkumisnopeus blocks.itemsmoved = Liikkumisnopeus
blocks.launchtime = Aika Laukaisujen Välillä blocks.launchtime = Aika laukaisujen välillä
blocks.shootrange = Kantama blocks.shootrange = Kantama
blocks.size = Koko blocks.size = Koko
blocks.liquidcapacity = Neste Kapasiteetti blocks.liquidcapacity = Nestekapasiteetti
blocks.powerrange = Energia Kantama blocks.powerrange = Energiakantama
blocks.powerconnections = Maksimi konnektio määrä blocks.powerconnections = Maksimimäärä yhdistyksiä
blocks.poweruse = Energian Käyttö blocks.poweruse = Energian käyttö
blocks.powerdamage = Energia/Vahinko blocks.powerdamage = Energia/Vahinko
blocks.itemcapacity = Tavara Kapasiteetti blocks.itemcapacity = Tavarakapasiteetti
blocks.basepowergeneration = Kanta Enegian Generointi blocks.basepowergeneration = Perus energiantuotto
blocks.productiontime = Produktion Aika blocks.productiontime = Tuotantoaika
blocks.repairtime = Kokonaisen Palikan Korjaus Aika blocks.repairtime = Kokonaisen palikan korjausaika
blocks.speedincrease = Nopeuden Kasvu blocks.speedincrease = Nopeuden kasvu
blocks.range = Etäisyys blocks.range = Etäisyys
blocks.drilltier = Porattavat blocks.drilltier = Porattavat
blocks.drillspeed = Kanta Poran Nopeus blocks.drillspeed = Kanta Poran Nopeus
blocks.boosteffect = Boostaamisen Vaikutus blocks.boosteffect = Tehostamisem vaikutus
blocks.maxunits = Maksimi Määrä Yksikköjä blocks.maxunits = Maksimimäärä yksikköjä
blocks.health = Elämäpisteet blocks.health = Elämäpisteet
blocks.buildtime = Rakentamisen Aika blocks.buildtime = Rakentamisaika
blocks.buildcost = Rakentamisen Hinta blocks.buildcost = Rakentamishinta
blocks.inaccuracy = Epätarkkuus blocks.inaccuracy = Epätarkkuus
blocks.shots = Ammusta blocks.shots = Ammusta
blocks.reload = Ammusta/Sekunnissa blocks.reload = Ammusta/sekunnissa
blocks.ammo = Ammus blocks.ammo = Ammus
bar.drilltierreq = Parempi Pora Vaadittu bar.drilltierreq = Parempi pora vaadittu
bar.drillspeed = Poran Nopeus: {0}/s bar.drillspeed = Poran nopeus: {0}/s
bar.pumpspeed = Pumpun Nopeus: {0}/s bar.pumpspeed = Pumpun nopeus: {0}/s
bar.efficiency = Tehokkuus: {0}% bar.efficiency = Tehokkuus: {0}%
bar.powerbalance = Energia: {0}/s bar.powerbalance = Energia: {0}/s
bar.powerstored = Säilöttynä: {0}/{1} bar.powerstored = Säilöttynä: {0}/{1}
bar.poweramount = Energia: {0} bar.poweramount = Energia: {0}
bar.poweroutput = Energian Ulostulo: {0} bar.poweroutput = Energiantuotto: {0}
bar.items = Tavaroita: {0} bar.items = Tavaroita: {0}
bar.capacity = Kapasiteetti: {0} bar.capacity = Kapasiteetti: {0}
bar.liquid = Neste bar.liquid = Neste
bar.heat = Lämpö bar.heat = Lämpö
bar.power = Energia bar.power = Energia
bar.progress = Rakennuksen Edistys bar.progress = Rakennuksen edistys
bar.spawned = Yksikköjä: {0}/{1} bar.spawned = Yksikköjä: {0}/{1}
bar.input = Sisääntulo bar.input = Sisääntulo
bar.output = Ulostulo bar.output = Ulostulo
bullet.damage = [stat]{0}[lightgray] Vahinko bullet.damage = [stat]{0}[lightgray] Vahinko
bullet.splashdamage = [stat]{0}[lightgray] Alue vahinko ~[stat] {1}[lightgray] palikkaa bullet.splashdamage = [stat]{0}[lightgray] Aluevahinko ~[stat] {1}[lightgray] palikkaa
bullet.incendiary = [stat]sytyttävä bullet.incendiary = [stat]sytyttävä
bullet.homing = [stat]itseohjautuva bullet.homing = [stat]itseohjautuva
bullet.shock = [stat]shokki bullet.shock = [stat]shokki
@@ -591,15 +591,15 @@ bullet.frag = [stat]sirpaloituva
bullet.knockback = [stat]{0}[lightgray] knockback bullet.knockback = [stat]{0}[lightgray] knockback
bullet.freezing = [stat]jäädyttävä bullet.freezing = [stat]jäädyttävä
bullet.tarred = [stat]tervattu bullet.tarred = [stat]tervattu
bullet.multiplier = [stat]{0}[lightgray]x ammusten multiplikaatio bullet.multiplier = [stat]{0}[lightgray]x ammusten kerroin
bullet.reload = [stat]{0}[lightgray]x ammunta nopeus bullet.reload = [stat]{0}[lightgray]x ampumisnopeus
unit.blocks = palikat unit.blocks = palikat
unit.powersecond = energia yksikköä/sekunti unit.powersecond = energiayksikköä/sekunti
unit.liquidsecond = neste yksikköä/sekunti unit.liquidsecond = nesteyksikköä/sekunti
unit.itemssecond = esinettä/sekunti unit.itemssecond = esinettä/sekunti
unit.liquidunits = neste yksikköä unit.liquidunits = nesteyksikköä
unit.powerunits = energia yksikköä unit.powerunits = energiayksikköä
unit.degrees = astetta unit.degrees = astetta
unit.seconds = sekunttia unit.seconds = sekunttia
unit.persecond = /s unit.persecond = /s
@@ -614,25 +614,25 @@ category.liquids = Neste
category.items = Tavarat category.items = Tavarat
category.crafting = Ulos/Sisääntulo category.crafting = Ulos/Sisääntulo
category.shooting = Ammunta category.shooting = Ammunta
category.optional = Mahdolliset Lumoukset category.optional = Mahdolliset parannukset
setting.landscape.name = Lukitse tasavaakaan setting.landscape.name = Lukitse tasavaakaan
setting.shadows.name = Varjot setting.shadows.name = Varjot
setting.blockreplace.name = Automaattisia Palikka Suosituksia setting.blockreplace.name = Automaattisia Palikka Suosituksia
setting.linear.name = Lineararien Filteeraus setting.linear.name = Lineaarinen suodatus
setting.hints.name = Vihjeet setting.hints.name = Vihjeet
setting.buildautopause.name = Automaattisest Pysäytä Rakentaessa setting.buildautopause.name = Automaattisest Pysäytä Rakentaessa
setting.animatedwater.name = Animoitu Vesi setting.animatedwater.name = Animoitu vesi
setting.animatedshields.name = Animoitu Kilpi setting.animatedshields.name = Animoidut kilvet
setting.antialias.name = Antialiaasi[lightgray] (vaatii uudelleenkäynnistyksen)[] setting.antialias.name = Antialiaasi[lightgray] (vaatii uudelleenkäynnistyksen)[]
setting.indicators.name = Vihollis/Puolulais Indikaattorit setting.indicators.name = Vihollis/Puolulais Indikaattorit
setting.autotarget.name = Automaatinen Tähtäys setting.autotarget.name = Automaatinen Tähtäys
setting.keyboard.name = Hiiri+Näppäimistö Kontrollit setting.keyboard.name = Hiiri+Näppäimistö -ohjaus
setting.touchscreen.name = Kosketusnäyttö kontrollit setting.touchscreen.name = Kosketusnäyttöohjaus
setting.fpscap.name = Maksimi FPS setting.fpscap.name = Maksimi FPS
setting.fpscap.none = Ei Mitään setting.fpscap.none = Ei Mitään
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI Koko[lightgray] (vaatii uudelleenkäynnistyksen)[] setting.uiscale.name = UI Koko[lightgray] (vaatii uudelleenkäynnistyksen)[]
setting.swapdiagonal.name = Aina Vino Korvaus setting.swapdiagonal.name = Aina vino korvaus
setting.difficulty.training = Treeni setting.difficulty.training = Treeni
setting.difficulty.easy = Helppo setting.difficulty.easy = Helppo
setting.difficulty.normal = Keskivaikea setting.difficulty.normal = Keskivaikea
@@ -641,10 +641,10 @@ setting.difficulty.insane = Järjetön
setting.difficulty.name = Vaikeustaso: setting.difficulty.name = Vaikeustaso:
setting.screenshake.name = Näytön keikkuminen setting.screenshake.name = Näytön keikkuminen
setting.effects.name = Naytön Efektit setting.effects.name = Naytön Efektit
setting.destroyedblocks.name = Näytä Tuhoutuneet Palikat setting.destroyedblocks.name = Näytä tuhoutuneet palikat
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
setting.coreselect.name = Allow Schematic Cores setting.coreselect.name = Allow Schematic Cores
setting.sensitivity.name = Kontrollin Herkkyys setting.sensitivity.name = Ohjauksen herkkyys
setting.saveinterval.name = Tallennuksen Aikaväli setting.saveinterval.name = Tallennuksen Aikaväli
setting.seconds = {0} Sekunttia setting.seconds = {0} Sekunttia
setting.blockselecttimeout.name = Block Select Timeout setting.blockselecttimeout.name = Block Select Timeout
@@ -652,35 +652,35 @@ setting.milliseconds = {0} millisekunttia
setting.fullscreen.name = Fullscreen setting.fullscreen.name = Fullscreen
setting.borderlesswindow.name = Borderless Window[lightgray] (vaatii uudelleenkäynnistyksen) setting.borderlesswindow.name = Borderless Window[lightgray] (vaatii uudelleenkäynnistyksen)
setting.fps.name = Näytä FPS setting.fps.name = Näytä FPS
setting.blockselectkeys.name = Bäytä Palikan Selektio Kontrollit setting.blockselectkeys.name = Näytä palikan valintaohjaimet
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixeloi[lightgray] (poistaa animaation käytöstä) setting.pixelate.name = Pixeloi[lightgray] (poistaa animaation käytöstä)
setting.minimap.name = Näytä Minimappi setting.minimap.name = Näytä pienoiskartta
setting.position.name = Näytä pelaajan sijainti setting.position.name = Näytä pelaajan sijainti
setting.musicvol.name = Musiikin Äänenvoimakkuus setting.musicvol.name = Musiikin äänenvoimakkuus
setting.ambientvol.name = Tausta Äänet setting.ambientvol.name = Taustaäänet
setting.mutemusic.name = Sulje Musiikki setting.mutemusic.name = Mykistä musiikki
setting.sfxvol.name = SFX Volyymi setting.sfxvol.name = SFX-voimakkuus
setting.mutesound.name = Sulje Äänet setting.mutesound.name = Mykistä äänet
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Send Anonymous Crash Reports
setting.savecreate.name = Luo Automaattisesti Tallennukset setting.savecreate.name = Luo tallenuksia automaattisesti
setting.publichost.name = Public Game Visibility setting.publichost.name = Public Game Visibility
setting.chatopacity.name = Chatin Läpinäkymättömyys setting.chatopacity.name = Keskustelun läpinäkymättömyys
setting.lasersopacity.name = Energia Laaserin Läpinäkymattämyys setting.lasersopacity.name = Energia laserin läpinäkymättömyys
setting.playerchat.name = Näytä Pelinsisäinen Keskustelu setting.playerchat.name = Näytä pelinsisäinen keskustelu
public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
public.beta = Note that beta versions of the game cannot make public lobbies. public.beta = Note that beta versions of the game cannot make public lobbies.
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
uiscale.cancel = Peruuta ja Poistu uiscale.cancel = Peruuta ja poistu
setting.bloom.name = Bloom setting.bloom.name = Bloom
keybind.title = Rebind Keys keybind.title = Rebind Keys
keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported.
category.general.name = General category.general.name = General
category.view.name = View category.view.name = View
category.multiplayer.name = Multiplayer category.multiplayer.name = Moninpeli
command.attack = Hyökkää command.attack = Hyökkäys
command.rally = Kutsu Koolle command.rally = Kokoontuminen
command.retreat = Palaa command.retreat = Perääntyminen
placement.blockselectkeys = \n[lightgray]Key: [{0}, placement.blockselectkeys = \n[lightgray]Key: [{0},
keybind.clear_building.name = Clear Building keybind.clear_building.name = Clear Building
keybind.press = Press a key... keybind.press = Press a key...
@@ -711,7 +711,7 @@ keybind.block_select_07.name = Category/Block Select 7
keybind.block_select_08.name = Category/Block Select 8 keybind.block_select_08.name = Category/Block Select 8
keybind.block_select_09.name = Category/Block Select 9 keybind.block_select_09.name = Category/Block Select 9
keybind.block_select_10.name = Category/Block Select 10 keybind.block_select_10.name = Category/Block Select 10
keybind.fullscreen.name = Vaihda Fullscreen keybind.fullscreen.name = Vaihda kokonäyttötilaan
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -722,8 +722,8 @@ keybind.zoom.name = Zoom
keybind.menu.name = Menu keybind.menu.name = Menu
keybind.pause.name = Pause keybind.pause.name = Pause
keybind.pause_building.name = Pause/Resume Building keybind.pause_building.name = Pause/Resume Building
keybind.minimap.name = Minimappi keybind.minimap.name = Pienoiskartta
keybind.chat.name = Chatti keybind.chat.name = Keskustelu
keybind.player_list.name = Player list keybind.player_list.name = Player list
keybind.console.name = Console keybind.console.name = Console
keybind.rotate.name = Rotate keybind.rotate.name = Rotate
@@ -736,9 +736,9 @@ keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom minimap keybind.zoom_minimap.name = Zoom minimap
mode.help.title = Description of modes mode.help.title = Description of modes
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = Normaali moodi. Rajoitettu määrä resursseja ja tasoilla on aika.\n[gray]Vaatii vihollis spawneja kartassa. mode.survival.description = Normaali tila. Rajoitettu määrä resursseja ja tasoilla on aika.\n[gray]Vaatii vihollisten syntymispisteen kartassa.
mode.sandbox.name = Hiekkalaatikko mode.sandbox.name = Hiekkalaatikko
mode.sandbox.description = Ikuisesti resursseja ja tasoilla ei ole aikaa. mode.sandbox.description = Ikuisesti resursseja ja tasoja ei ole ajastettu.
mode.editor.name = Editori mode.editor.name = Editori
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play.
@@ -746,9 +746,9 @@ mode.attack.name = Attack
mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play.
mode.custom = Custom Rules mode.custom = Custom Rules
rules.infiniteresources = Ikuisesti Resursseja rules.infiniteresources = Ikuiset resurssit
rules.reactorexplosions = Reaktori Räjähdykset rules.reactorexplosions = Reaktorien räjähtäminen
rules.wavetimer = Tasojen Aikaraja rules.wavetimer = Tasojen aikaraja
rules.waves = Tasot rules.waves = Tasot
rules.attack = Attack Mode rules.attack = Attack Mode
rules.enemyCheat = Infinite AI (Red Team) Resources rules.enemyCheat = Infinite AI (Red Team) Resources
@@ -791,11 +791,11 @@ item.titanium.name = Titaani
item.thorium.name = Torium item.thorium.name = Torium
item.silicon.name = Pii item.silicon.name = Pii
item.plastanium.name = Plastaniumi item.plastanium.name = Plastaniumi
item.phase-fabric.name = Kiihde Kuitu item.phase-fabric.name = Kiihdekuitu
item.surge-alloy.name = Taite Seos item.surge-alloy.name = Taiteseos
item.spore-pod.name = Itiö Palko item.spore-pod.name = Itiöpalko
item.sand.name = Hiekka item.sand.name = Hiekka
item.blast-compound.name = Räjähde Yhdiste item.blast-compound.name = Räjähdeyhdiste
item.pyratite.name = Pyratiitti item.pyratite.name = Pyratiitti
item.metaglass.name = Metallilasi item.metaglass.name = Metallilasi
item.scrap.name = Romu item.scrap.name = Romu
@@ -824,7 +824,7 @@ mech.trident-ship.name = Trident
mech.trident-ship.weapon = Bomb Bay mech.trident-ship.weapon = Bomb Bay
mech.glaive-ship.name = Glaive mech.glaive-ship.name = Glaive
mech.glaive-ship.weapon = Flame Repeater mech.glaive-ship.weapon = Flame Repeater
item.corestorable = [lightgray]Säilöttävissä Ytimeen: {0} item.corestorable = [lightgray]Säilöttävissä ytimeen: {0}
item.explosiveness = [lightgray]Räjädysmäisyys: {0}% item.explosiveness = [lightgray]Räjädysmäisyys: {0}%
item.flammability = [lightgray]Flammability: {0}% item.flammability = [lightgray]Flammability: {0}%
item.radioactivity = [lightgray]Radioactivity: {0}% item.radioactivity = [lightgray]Radioactivity: {0}%
@@ -832,12 +832,12 @@ unit.health = [lightgray]Elämäpisteet: {0}
unit.speed = [lightgray]Nopeus: {0} unit.speed = [lightgray]Nopeus: {0}
mech.weapon = [lightgray]Ase: {0} mech.weapon = [lightgray]Ase: {0}
mech.health = [lightgray]Elämäpisteet: {0} mech.health = [lightgray]Elämäpisteet: {0}
mech.itemcapacity = [lightgray]Tavara Kapasiteetti: {0} mech.itemcapacity = [lightgray]Tavarakapasiteetti: {0}
mech.minespeed = [lightgray]Louhimis Nopeus: {0}% mech.minespeed = [lightgray]Louhimisnopeus: {0}%
mech.minepower = [lightgray]Louhimis Voima: {0} mech.minepower = [lightgray]Louhimisvoima: {0}
mech.ability = [lightgray]Spesiaalikyky: {0} mech.ability = [lightgray]Erityiskyky: {0}
mech.buildspeed = [lightgray]Rakennus Nopeus: {0}% mech.buildspeed = [lightgray]Rakentamisnopeus: {0}%
liquid.heatcapacity = [lightgray]Lämpö Kapasiteetti: {0} liquid.heatcapacity = [lightgray]Lämpökapasiteetti: {0}
liquid.viscosity = [lightgray]Tahmeus: {0} liquid.viscosity = [lightgray]Tahmeus: {0}
liquid.temperature = [lightgray]Lämpö: {0} liquid.temperature = [lightgray]Lämpö: {0}
@@ -865,21 +865,21 @@ block.scrap-wall-huge.name = Huge Scrap Wall
block.scrap-wall-gigantic.name = Gigantic Scrap Wall block.scrap-wall-gigantic.name = Gigantic Scrap Wall
block.thruster.name = Thruster block.thruster.name = Thruster
block.kiln.name = Kiln block.kiln.name = Kiln
block.graphite-press.name = Grafiitti Puristin block.graphite-press.name = Grafiittipuristin
block.multi-press.name = Multi-Puristin block.multi-press.name = Monipuristin
block.constructing = {0} [lightgray](Rakentamassa) block.constructing = {0} [lightgray](Rakentamassa)
block.spawn.name = Vihollis Spawni block.spawn.name = Vihollisten syntymispiste
block.core-shard.name = Ydin: Siru block.core-shard.name = Ydin: Siru
block.core-foundation.name = Ydin: Pohjaus block.core-foundation.name = Ydin: Pohjaus
block.core-nucleus.name = Ydin: Tuma block.core-nucleus.name = Ydin: Tuma
block.deepwater.name = Syvä Vesi block.deepwater.name = Syvä vesi
block.water.name = Vesi block.water.name = Vesi
block.tainted-water.name = Pilattu Vesi block.tainted-water.name = Pilaantunut vesi
block.darksand-tainted-water.name = Dark Sand Tainted Water block.darksand-tainted-water.name = Dark Sand Tainted Water
block.tar.name = Terva block.tar.name = Terva
block.stone.name = Kivi block.stone.name = Kivi
block.sand.name = Hiekka block.sand.name = Hiekka
block.darksand.name = Tumma Hiekka block.darksand.name = Tumma hiekka
block.ice.name = Jää block.ice.name = Jää
block.snow.name = Lumi block.snow.name = Lumi
block.craters.name = Kraatterit block.craters.name = Kraatterit

View File

@@ -172,8 +172,13 @@ hosts.discovering.any = Ricerca partite
server.refreshing = Aggiornamento del server server.refreshing = Aggiornamento del server
hosts.none = [lightgray]Nessuna partita locale trovata! hosts.none = [lightgray]Nessuna partita locale trovata!
host.invalid = [scarlet]Impossibile connettersi all'host. host.invalid = [scarlet]Impossibile connettersi all'host.
trace = Traccia giocatore
trace.playername = Nome del giocatore: [accent]{0} servers.local = Server Locali
servers.remote = Server Remoti
servers.global = Server Globali
trace = Traccia Giocatore
trace.playername = Nome del Giocatore: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = ID univoco: [accent]{0} trace.id = ID univoco: [accent]{0}
trace.mobile = Client Mobile: [accent]{0} trace.mobile = Client Mobile: [accent]{0}
@@ -183,11 +188,11 @@ server.bans = Lista Bans
server.bans.none = Nessun giocatore bandito trovato! server.bans.none = Nessun giocatore bandito trovato!
server.admins = Amministratori server.admins = Amministratori
server.admins.none = Nessun amministratore trovato! server.admins.none = Nessun amministratore trovato!
server.add = Aggiungi server server.add = Aggiungi Server
server.delete = Sei sicuro di voler eliminare questo server? server.delete = Sei sicuro di voler eliminare questo server?
server.edit = Modifica server server.edit = Modifica Server
server.outdated = [crimson]Server obsoleto![] server.outdated = [crimson]Server Obsoleto![]
server.outdated.client = [crimson]Client obsoleto![] server.outdated.client = [crimson]Client Obsoleto![]
server.version = [gray]v{0} {1} server.version = [gray]v{0} {1}
server.custombuild = [yellow]Build Personalizzata server.custombuild = [yellow]Build Personalizzata
confirmban = Sei sicuro di voler bandire questo giocatore? confirmban = Sei sicuro di voler bandire questo giocatore?

View File

@@ -13,6 +13,7 @@ import mindustry.annotations.Annotations.*;
import mindustry.core.GameState.*; import mindustry.core.GameState.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.Effects.*;
import mindustry.entities.traits.BuilderTrait.*; import mindustry.entities.traits.BuilderTrait.*;
import mindustry.entities.traits.*; import mindustry.entities.traits.*;
import mindustry.entities.type.*; import mindustry.entities.type.*;
@@ -261,36 +262,61 @@ public class NetClient implements ApplicationListener{
ui.loadfrag.hide(); ui.loadfrag.hide();
} }
@Remote(variants = Variant.both, unreliable = true)
public static void setHudText(String message){
if(message == null) return;
ui.hudfrag.setHudText(message);
}
@Remote(variants = Variant.both)
public static void hideHudText(){
ui.hudfrag.toggleHudText(false);
}
/** TCP version */
@Remote(variants = Variant.both)
public static void setHudTextReliable(String message){
setHudText(message);
}
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void onInfoMessage(String message){ public static void onInfoMessage(String message){
if(message == null) return;
ui.showText("", message); ui.showText("", message);
} }
//TODO these are commented out to enforce compatibility with 103! uncomment before 104 release
/*
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void onInfoPopup(String message, float duration, int align, int top, int left, int bottom, int right){ public static void onInfoPopup(String message, float duration, int align, int top, int left, int bottom, int right){
if(message == null) return;
ui.showInfoPopup(message, duration, align, top, left, bottom, right); ui.showInfoPopup(message, duration, align, top, left, bottom, right);
} }
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void onLabel(String info, float duration, float worldx, float worldy){ public static void onLabel(String message, float duration, float worldx, float worldy){
ui.showLabel(info, duration, worldx, worldy); if(message == null) return;
ui.showLabel(message, duration, worldx, worldy);
} }
@Remote(variants = Variant.both, unreliable = true) @Remote(variants = Variant.both, unreliable = true)
public static void onEffect(Effect effect, float x, float y, float rotation, Color color){ public static void onEffect(Effect effect, float x, float y, float rotation, Color color){
if(effect == null) return;
Effects.effect(effect, color, x, y, rotation); Effects.effect(effect, color, x, y, rotation);
} }
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void onEffectReliable(Effect effect, float x, float y, float rotation, Color color){ public static void onEffectReliable(Effect effect, float x, float y, float rotation, Color color){
Effects.effect(effect, color, x, y, rotation); onEffect(effect, x, y, rotation, color);
}*/ }
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void onInfoToast(String message, float duration){ public static void onInfoToast(String message, float duration){
if(message == null) return;
ui.showInfoToast(message, duration); ui.showInfoToast(message, duration);
} }

View File

@@ -8,6 +8,7 @@ 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 arc.util.serialization.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.core.GameState.*; import mindustry.core.GameState.*;
@@ -15,7 +16,6 @@ import mindustry.entities.*;
import mindustry.entities.traits.BuilderTrait.*; import mindustry.entities.traits.BuilderTrait.*;
import mindustry.entities.traits.*; import mindustry.entities.traits.*;
import mindustry.entities.type.*; import mindustry.entities.type.*;
import mindustry.net.Administration;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
@@ -93,6 +93,16 @@ public class NetServer implements ApplicationListener{
} }
String uuid = packet.uuid; String uuid = packet.uuid;
byte[] buuid = Base64Coder.decode(uuid);
CRC32 crc = new CRC32();
crc.update(buuid, 0, 8);
ByteBuffer buff = ByteBuffer.allocate(8);
buff.put(buuid, 8, 8);
buff.position(0);
if(crc.getValue() != buff.getLong()){
con.kick(KickReason.clientOutdated);
return;
}
if(admins.isIPBanned(con.address) || admins.isSubnetBanned(con.address)) return; if(admins.isIPBanned(con.address) || admins.isSubnetBanned(con.address)) return;

View File

@@ -100,6 +100,8 @@ public class MusicControl{
/** 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.
* If something is already playing, fades out that track and fades in this new music.*/ * If something is already playing, fades out that track and fades in this new music.*/
private void play(@Nullable Music music){ private void play(@Nullable Music music){
if(!shouldPlay()) return;
//update volume of current track //update volume of current track
if(current != null){ if(current != null){
current.setVolume(fade * Core.settings.getInt("musicvol") / 100f); current.setVolume(fade * Core.settings.getInt("musicvol") / 100f);
@@ -143,7 +145,7 @@ public class MusicControl{
/** Plays a music track once and only once. If something is already playing, does nothing.*/ /** Plays a music track once and only once. If something is already playing, does nothing.*/
private void playOnce(Music music){ private void playOnce(Music music){
if(current != null || music == null) return; //do not interrupt already-playing tracks if(current != null || music == null || !shouldPlay()) return; //do not interrupt already-playing tracks
//save last random track played to prevent duplicates //save last random track played to prevent duplicates
lastRandomPlayed = music; lastRandomPlayed = music;
@@ -162,6 +164,10 @@ public class MusicControl{
current.play(); current.play();
} }
private boolean shouldPlay(){
return Core.settings.getInt("musicvol") > 0;
}
/** Fades out the current track, unless it has already been silenced. */ /** Fades out the current track, unless it has already been silenced. */
private void silence(){ private void silence(){
play(null); play(null);

View File

@@ -375,7 +375,7 @@ public class Schematics implements Loadable{
/** Loads a schematic from base64. May throw an exception. */ /** Loads a schematic from base64. May throw an exception. */
public static Schematic readBase64(String schematic){ public static Schematic readBase64(String schematic){
try{ try{
return read(new ByteArrayInputStream(Base64Coder.decode(schematic))); return read(new ByteArrayInputStream(Base64Coder.decode(schematic.trim())));
}catch(IOException e){ }catch(IOException e){
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -611,7 +611,7 @@ public class Mods implements Loadable{
Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json");
if(!metaf.exists()){ if(!metaf.exists()){
Log.warn("Mod {0} doesn't have a 'mod.json'/'plugin.json'/'mod.js' file, skipping.", sourceFile); Log.warn("Mod {0} doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile);
throw new IllegalArgumentException("No mod.json found."); throw new IllegalArgumentException("No mod.json found.");
} }

View File

@@ -181,7 +181,7 @@ public class Packets{
usid = TypeIO.readString(buffer); usid = TypeIO.readString(buffer);
mobile = buffer.get() == 1; mobile = buffer.get() == 1;
color = buffer.getInt(); color = buffer.getInt();
byte[] idbytes = new byte[8]; byte[] idbytes = new byte[16];
buffer.get(idbytes); buffer.get(idbytes);
uuid = new String(Base64Coder.encode(idbytes)); uuid = new String(Base64Coder.encode(idbytes));
int totalMods = buffer.get(); int totalMods = buffer.get();

View File

@@ -44,7 +44,7 @@ public class ItemsDisplay extends Table{
t.setText(state.is(State.menu) ? "$launcheditems" : "$launchinfo"); t.setText(state.is(State.menu) ? "$launcheditems" : "$launchinfo");
t.setChecked(col.isCollapsed()); t.setChecked(col.isCollapsed());
((Image)t.getChildren().get(1)).setDrawable(col.isCollapsed() ? Icon.upOpen : Icon.downOpen); ((Image)t.getChildren().get(1)).setDrawable(col.isCollapsed() ? Icon.upOpen : Icon.downOpen);
}).padBottom(4).left().fillX().margin(12f); }).padBottom(4).left().fillX().margin(12f).minWidth(200f);
c.row(); c.row();
c.add(col); c.add(col);
}); });

View File

@@ -43,6 +43,9 @@ public class HudFragment extends Fragment{
private boolean shown = true; private boolean shown = true;
private float dsize = 47.2f; private float dsize = 47.2f;
private String hudText = "";
private boolean showHudText;
private long lastToast; private long lastToast;
public void build(Group parent){ public void build(Group parent){
@@ -341,6 +344,19 @@ public class HudFragment extends Fragment{
t.add("$saveload").style(Styles.outlineLabel); t.add("$saveload").style(Styles.outlineLabel);
}); });
parent.fill(p -> {
p.top().table(Styles.black3, t -> t.margin(4).label(() -> hudText)
.style(Styles.outlineLabel)).padTop(10).visible(p.color.a >= 0.001f);
p.update(() -> {
p.color.a = Mathf.lerpDelta(p.color.a, Mathf.num(showHudText), 0.2f);
if(state.is(State.menu)){
p.color.a = 0f;
showHudText = false;
}
});
p.touchable(Touchable.disabled);
});
blockfrag.build(parent); blockfrag.build(parent);
} }
@@ -368,6 +384,15 @@ public class HudFragment extends Fragment{
} }
} }
public void setHudText(String text){
showHudText = true;
hudText = text;
}
public void toggleHudText(boolean shown){
showHudText = shown;
}
private void scheduleToast(Runnable run){ private void scheduleToast(Runnable run){
long duration = (int)(3.5 * 1000); long duration = (int)(3.5 * 1000);
long since = Time.timeSinceMillis(lastToast); long since = Time.timeSinceMillis(lastToast);

View File

@@ -24,7 +24,6 @@ public class Junction extends Block{
super(name); super(name);
update = true; update = true;
solid = true; solid = true;
instantTransfer = true;
group = BlockGroup.transportation; group = BlockGroup.transportation;
unloadable = false; unloadable = false;
entityType = JunctionEntity::new; entityType = JunctionEntity::new;

View File

@@ -39,7 +39,6 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{
} }
if(entity.uptime >= 0.5f){ if(entity.uptime >= 0.5f){
if(tryMoveLiquid(tile, other, false, entity.liquids.current()) > 0.1f){ if(tryMoveLiquid(tile, other, false, entity.liquids.current()) > 0.1f){
entity.cycleSpeed = Mathf.lerpDelta(entity.cycleSpeed, 4f, 0.05f); entity.cycleSpeed = Mathf.lerpDelta(entity.cycleSpeed, 4f, 0.05f);
}else{ }else{

View File

@@ -139,7 +139,7 @@ public class GenericCrafter extends Block{
if(outputItem != null && tile.entity.items.get(outputItem.item) >= itemCapacity){ if(outputItem != null && tile.entity.items.get(outputItem.item) >= itemCapacity){
return false; return false;
} }
return outputLiquid == null || !(tile.entity.liquids.get(outputLiquid.liquid) >= liquidCapacity); return outputLiquid == null || !(tile.entity.liquids.get(outputLiquid.liquid) >= liquidCapacity - 0.001f);
} }
@Override @Override

View File

@@ -319,7 +319,7 @@ public class DesktopLauncher extends ClientLauncher{
try{ try{
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
NetworkInterface out; NetworkInterface out;
for(out = e.nextElement(); (out.getHardwareAddress() == null || !validAddress(out.getHardwareAddress())) && e.hasMoreElements(); out = e.nextElement()); for(out = e.nextElement(); (out.getHardwareAddress() == null || out.isVirtual() || !validAddress(out.getHardwareAddress())) && e.hasMoreElements(); out = e.nextElement());
byte[] bytes = out.getHardwareAddress(); byte[] bytes = out.getHardwareAddress();
byte[] result = new byte[8]; byte[] result = new byte[8];

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=a57e709113a364ff718821de4c40366e17353329 archash=292d60e7d6c2013334b0f4f30659e1d885f73cfe