Merge branch 'master' of https://github.com/Anuken/Mindustry into 7.0-features

 Conflicts:
	gradle.properties
This commit is contained in:
Anuken
2021-06-28 18:57:27 -04:00
86 changed files with 1926 additions and 1025 deletions

View File

@@ -47,7 +47,7 @@ jobs:
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
cd ../MindustryBuilds cd ../MindustryBuilds
echo "Updating version to ${RELEASE_VERSION:1}" echo "Updating version to ${RELEASE_VERSION:1}"
echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${GITHUB_RUN_NUMBER} > version_fdroid.txt echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${GITHUB_RUN_NUMBER} > version_fdroid.txt
git add . git add .
git commit -m "Updating to build ${RELEASE_VERSION:1}" git commit -m "Updating to build ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds

View File

@@ -17,7 +17,6 @@
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
android:appCategory="game" android:appCategory="game"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/ArcTheme"
android:fullBackupContent="@xml/backup_rules"> android:fullBackupContent="@xml/backup_rules">
<meta-data android:name="android.max_aspect" android:value="2.1"/> <meta-data android:name="android.max_aspect" android:value="2.1"/>
<activity <activity

View File

@@ -24,9 +24,9 @@ repositories{
task deploy(type: Copy){ task deploy(type: Copy){
dependsOn "assembleRelease" dependsOn "assembleRelease"
from "build/outputs/apk/release/android-release.apk" from "build/outputs/apk/standard/release/android-standard-release.apk"
into "../deploy/" into "../deploy/"
rename("android-release.apk", "${generateDeployName('android')}.apk") rename("android-standard-release.apk", "${generateDeployName('android')}.apk")
} }
android{ android{

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="ArcTheme" parent="android:Theme.Material.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>

View File

@@ -1,10 +0,0 @@
<resources>
<style name="ArcTheme" parent="android:Theme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>

View File

@@ -84,9 +84,9 @@ public class AndroidLauncher extends AndroidApplication{
try{ try{
//try to load own class first //try to load own class first
loadedClass = findClass(name); loadedClass = findClass(name);
}catch(ClassNotFoundException e){ }catch(ClassNotFoundException | NoClassDefFoundError e){
//use parent if not found //use parent if not found
loadedClass = super.loadClass(name, resolve); return parent.loadClass(name);
} }
} }

View File

@@ -143,8 +143,8 @@ public class EntityIO{
if(sl) cont("if(!islocal)"); if(sl) cont("if(!islocal)");
if(sf){ if(sf){
//TODO + targetSuf may not give the right result, test it //TODO adding + targetSuf to the assignment fixes units being interpolated incorrectly during physics, but makes interpolation snap instead.
st(field.name + lastSuf + " = this." + field.name + targetSuf); st(field.name + lastSuf + " = this." + field.name);
} }
io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = "); io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = ");

View File

@@ -13,10 +13,28 @@ buildscript{
google() google()
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven{ url 'https://jitpack.io' } maven{ url 'https://jitpack.io' }
//fake repository to download my patched robovm jar from
ivy{
url 'https://github.com/'
patternLayout {
artifact '/[organisation]/[module]/raw/a-single-jar-file/[revision].jar'
}
// This is required in Gradle 6.0+ as metadata file (ivy.xml)
// is mandatory. Docs linked below this code section
metadataSources { artifact() }
}
} }
dependencies{ dependencies{
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.11' //use local, patched robovm gradle plugin until my PR for gradle 7.0 support is merged
//https://github.com/Anuken/robovm/raw/a-single-jar-file/robovm-gradle-plugin-2.3.14-SNAPSHOT.jar
classpath "Anuken:robovm:robovm-gradle-plugin-2.3.14-SNAPSHOT"
//needed for plugin above
classpath "com.mobidevelop.robovm:robovm-dist-compiler:2.3.13"
classpath "com.github.Anuken.Arc:packer:$arcHash" classpath "com.github.Anuken.Arc:packer:$arcHash"
classpath "com.github.Anuken.Arc:arc-core:$arcHash" classpath "com.github.Anuken.Arc:arc-core:$arcHash"
} }
@@ -35,7 +53,7 @@ allprojects{
ext{ ext{
versionNumber = '7' versionNumber = '7'
if(!project.hasProperty("versionModifier")) versionModifier = 'dev' if(!project.hasProperty("versionModifier")) versionModifier = 'pre-alpha'
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94' steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94'

View File

@@ -1594,6 +1594,8 @@ lst.sensor = Get data from a building or unit.
lst.set = Set a variable. lst.set = Set a variable.
lst.operation = Perform an operation on 1-2 variables. lst.operation = Perform an operation on 1-2 variables.
lst.end = Jump to the top of the instruction stack. lst.end = Jump to the top of the instruction stack.
lst.wait = Wait a certain number of seconds.
lst.lookup = Look up a item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Conditionally jump to another statement. lst.jump = Conditionally jump to another statement.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit. lst.unitcontrol = Control the currently bound unit.

View File

@@ -460,6 +460,7 @@ toolmode.drawteams = Teams zeichnen
toolmode.drawteams.description = Zeichnet Teams statt Blöcke. toolmode.drawteams.description = Zeichnet Teams statt Blöcke.
filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu. filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu.
filter.distort = Verzerren filter.distort = Verzerren
filter.noise = Rauschen filter.noise = Rauschen
filter.enemyspawn = Gegnerischer Spawn Auswahl filter.enemyspawn = Gegnerischer Spawn Auswahl
@@ -476,6 +477,7 @@ filter.clear = Löschen
filter.option.ignore = Ignorieren filter.option.ignore = Ignorieren
filter.scatter = Streuen filter.scatter = Streuen
filter.terrain = Landschaft filter.terrain = Landschaft
filter.option.scale = Skalierung filter.option.scale = Skalierung
filter.option.chance = Wahrscheinlichkeit filter.option.chance = Wahrscheinlichkeit
filter.option.mag = Größe filter.option.mag = Größe
@@ -490,6 +492,7 @@ filter.option.block = Block
filter.option.floor = Boden filter.option.floor = Boden
filter.option.flooronto = Zielboden filter.option.flooronto = Zielboden
filter.option.target = Ziel filter.option.target = Ziel
filter.option.replacement = Ersatz
filter.option.wall = Wand filter.option.wall = Wand
filter.option.ore = Erz filter.option.ore = Erz
filter.option.floor2 = Sekundärer Boden filter.option.floor2 = Sekundärer Boden
@@ -675,6 +678,7 @@ unit.nobuild = [scarlet]Einheit kann nicht bauen!
lastaccessed = [lightgray]Zuletzt konfiguriert: {0} lastaccessed = [lightgray]Zuletzt konfiguriert: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <öffne Spiel um zu zeigen>
stat.description = Beschreibung stat.description = Beschreibung
stat.input = Eingang stat.input = Eingang
stat.output = Ausgang stat.output = Ausgang
@@ -991,6 +995,7 @@ rules.waves = Wellen
rules.attack = Angriff-Modus rules.attack = Angriff-Modus
rules.buildai = KI kann bauen rules.buildai = KI kann bauen
rules.corecapture = Kern nach Zerstörung einnehmen rules.corecapture = Kern nach Zerstörung einnehmen
rules.polygoncoreprotection = Polygonaler Kernschutz
rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team) rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team)
rules.blockhealthmultiplier = Block-Lebenspunkte-Multiplikator rules.blockhealthmultiplier = Block-Lebenspunkte-Multiplikator
rules.blockdamagemultiplier = Block-Schaden-Multiplikator rules.blockdamagemultiplier = Block-Schaden-Multiplikator
@@ -1161,6 +1166,7 @@ block.spore-cluster.name = Sporen-Cluster
block.metal-floor.name = Metallboden 1 block.metal-floor.name = Metallboden 1
block.metal-floor-2.name = Metallboden 2 block.metal-floor-2.name = Metallboden 2
block.metal-floor-3.name = Metallboden 3 block.metal-floor-3.name = Metallboden 3
block.metal-floor-4.name = Metallboden 4
block.metal-floor-5.name = Metallboden 5 block.metal-floor-5.name = Metallboden 5
block.metal-floor-damaged.name = beschädigter Metallboden block.metal-floor-damaged.name = beschädigter Metallboden
block.dark-panel-1.name = Dunkles Panel 1 block.dark-panel-1.name = Dunkles Panel 1
@@ -1585,6 +1591,8 @@ lst.sensor = Gibt Daten über einen Block oder eine Einheit wieder.
lst.set = Setzt eine Variable fest. lst.set = Setzt eine Variable fest.
lst.operation = Verändert eine Variable. lst.operation = Verändert eine Variable.
lst.end = Springt wieder nach oben. lst.end = Springt wieder nach oben.
lst.wait = Wartet eine bestimmte Zeit.
lst.lookup = Sucht ein Item, eine Flüssigkeit, eine Einheit oder einen Block.\nGesamtmengen von jeder Sache können mit \n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]\nabgerufen werden.
lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht. lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht.
lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[]. lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[].
lst.unitcontrol = Steuert [accent]@unit[]. lst.unitcontrol = Steuert [accent]@unit[].

View File

@@ -64,9 +64,17 @@ schematic.shareworkshop = Partager sur le Steam Workshop
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner le schéma schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner le schéma
schematic.saved = Schéma enregistré. schematic.saved = Schéma enregistré.
schematic.delete.confirm = Ce schéma sera supprimé définitivement ! schematic.delete.confirm = Ce schéma sera supprimé définitivement !
schematic.rename = Renommer le Schéma schematic.rename = Renommer le schéma
schematic.info = {0}x{1}, {2} blocs schematic.info = {0}x{1}, {2} blocs
schematic.disabled = [scarlet]Schémas désactivés ![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]carte[] ou dans ce [accent]serveur. schematic.disabled = [scarlet]Schémas désactivés ![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]carte[] ou dans ce [accent]serveur.
schematic.tags = Mots clés:
schematic.edittags = Editer les mots-clés
schematic.addtag = Ajouter un mot-clé
schematic.texttag = Texte mot-clé
schematic.icontag = Icone mot-clé
schematic.renametag = Renommer le mot-clé
schematic.tagdelconfirm = Voulez-vous supprimer ce mot-clé définitivement ?
schematic.tagexists = Ce mot-clé existe déjà.
stats = Statistiques stats = Statistiques
stat.wave = Vagues vaincues : [accent] {0} stat.wave = Vagues vaincues : [accent] {0}
@@ -306,7 +314,6 @@ data.exported = Données exportées.
data.invalid = Ce ne sont pas des données de jeu valides. data.invalid = Ce ne sont pas des données de jeu valides.
data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé ![]\n\nUne fois les données importées, le jeu se fermera immédiatement. data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé ![]\n\nUne fois les données importées, le jeu se fermera immédiatement.
quit.confirm = Êtes-vous sûr de vouloir quitter ? quit.confirm = Êtes-vous sûr de vouloir quitter ?
quit.confirm.tutorial = Êtes-vous sur de ce que vous faites ?\nLe tutoriel peut être repris dans [accent]Paramètres->Jeu->Refaire le Tutoriel.[]
loading = [accent]Chargement... loading = [accent]Chargement...
reloading = [accent]Rechargement des Mods... reloading = [accent]Rechargement des Mods...
saving = [accent]Sauvegarde... saving = [accent]Sauvegarde...
@@ -453,6 +460,7 @@ toolmode.drawteams = Dessiner les équipes
toolmode.drawteams.description = Change les équipes\nau lieu de blocs. toolmode.drawteams.description = Change les équipes\nau lieu de blocs.
filters.empty = [lightgray]Aucun filtre !\nAjoutez-en un avec les boutons ci-dessous. filters.empty = [lightgray]Aucun filtre !\nAjoutez-en un avec les boutons ci-dessous.
filter.distort = Déformation filter.distort = Déformation
filter.noise = Bruit filter.noise = Bruit
filter.enemyspawn = Zone d'apparition ennemie filter.enemyspawn = Zone d'apparition ennemie
@@ -469,6 +477,7 @@ filter.clear = Effacer
filter.option.ignore = Ignorer filter.option.ignore = Ignorer
filter.scatter = Disperser filter.scatter = Disperser
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Échelle filter.option.scale = Échelle
filter.option.chance = Chance filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
@@ -477,11 +486,13 @@ filter.option.circle-scale = Échelle circulaire
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Détachement filter.option.falloff = Détachement
filter.option.angle = Angle filter.option.angle = Angle
filter.option.rotate = Rotation
filter.option.amount = Quantité filter.option.amount = Quantité
filter.option.block = Bloc filter.option.block = Bloc
filter.option.floor = Sol filter.option.floor = Sol
filter.option.flooronto = Sol ciblé filter.option.flooronto = Sol ciblé
filter.option.target = Cible filter.option.target = Cible
filter.option.replacement = Replacement
filter.option.wall = Mur filter.option.wall = Mur
filter.option.ore = Minerai filter.option.ore = Minerai
filter.option.floor2 = Sol secondaire filter.option.floor2 = Sol secondaire
@@ -498,6 +509,7 @@ load = Charger
save = Sauvegarder save = Sauvegarder
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Veuillez redémarrer votre jeu pour que le changement de langue prenne effet. language.restart = Veuillez redémarrer votre jeu pour que le changement de langue prenne effet.
@@ -530,7 +542,7 @@ launch.from = Décollage depuis : [accent]{0}
launch.destination = Destination: {0} launch.destination = Destination: {0}
configure.invalid = La quantité doit être un nombre compris entre 0 et {0}. configure.invalid = La quantité doit être un nombre compris entre 0 et {0}.
add = Ajouter add = Ajouter
boss.health = Santé du Gardien guardian = Gardien
connectfail = [scarlet]Échec de la connexion au serveur : \n\n[accent]{0} connectfail = [scarlet]Échec de la connexion au serveur : \n\n[accent]{0}
error.unreachable = Serveur inaccessible.\nEst-ce que l'adresse est écrite correctement? error.unreachable = Serveur inaccessible.\nEst-ce que l'adresse est écrite correctement?
@@ -574,6 +586,7 @@ sector.attacked = Secteur [accent]{0}[white] attaqué !
sector.lost = Secteur [accent]{0}[white] perdu ! sector.lost = Secteur [accent]{0}[white] perdu !
#note: the missing space in the line below is intentional #note: the missing space in the line below is intentional
sector.captured = Sector [accent]{0}[white]capturé ! sector.captured = Sector [accent]{0}[white]capturé !
sector.changeicon = Changer l'icone
threat.low = Faible threat.low = Faible
threat.medium = Normale threat.medium = Normale
@@ -621,20 +634,21 @@ sector.extractionOutpost.description = Un avant-poste éloigné, construit par l
sector.impact0078.description = Ici reposent les vestiges d'un vaisseau de transport interstellaire, premier à être entré dans ce système.\n\nRécuperez et recherchez autant de technologies que possible dans cette épave. sector.impact0078.description = Ici reposent les vestiges d'un vaisseau de transport interstellaire, premier à être entré dans ce système.\n\nRécuperez et recherchez autant de technologies que possible dans cette épave.
sector.planetaryTerminal.description = La cible finale.\n\nCette base côtière contient une structure capable de lancer des Noyaux sur les planètes voisines. Elle est extrêmement bien gardée.\n\nProduisez des unités navales, éliminez lennemi le plus rapidement possible et recherchez la structure de lancement. sector.planetaryTerminal.description = La cible finale.\n\nCette base côtière contient une structure capable de lancer des Noyaux sur les planètes voisines. Elle est extrêmement bien gardée.\n\nProduisez des unités navales, éliminez lennemi le plus rapidement possible et recherchez la structure de lancement.
status.burning.name = Brûle status.burning.name = Brûlé
status.freezing.name = Gelé status.freezing.name = Gelé
status.wet.name = Humide status.wet.name = Humidifié
status.muddy.name = Boueux status.muddy.name = Boueux
status.melting.name = Fusion status.melting.name = Fusion
status.sapped.name = Sapé status.sapped.name = Sapé
status.electrified.name = Electrifié
status.spore-slowed.name = Spore ralentie status.spore-slowed.name = Spore ralentie
status.tarred.name = Goudronné status.tarred.name = Goudronné
status.overclock.name = Overclocker status.overclock.name = Surcadençage
status.shocked.name = Étourdie status.shocked.name = Étourdie
status.blasted.name = Foudroyé status.blasted.name = Foudroyé
status.unmoving.name = Immobile status.unmoving.name = Immobilisé
settings.language = Language settings.language = Langage
settings.data = Données du Jeu settings.data = Données du Jeu
settings.reset = Valeurs par Défaut settings.reset = Valeurs par Défaut
settings.rebind = Réattribuer settings.rebind = Réattribuer
@@ -655,6 +669,7 @@ settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toute
paused = [accent]< Pause > paused = [accent]< Pause >
clear = Effacer clear = Effacer
banned = [scarlet]Banni banned = [scarlet]Banni
unsupported.environment = [scarlet]Environnement non supporté
yes = Oui yes = Oui
no = Non no = Non
info.title = Info info.title = Info
@@ -664,6 +679,7 @@ unit.nobuild = [scarlet]Cette unité ne peut pas construire
lastaccessed = [lightgray]Dernier accès : {0} lastaccessed = [lightgray]Dernier accès : {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <charger la carte à afficher>
stat.description = Description stat.description = Description
stat.input = Ressource(s) requise(s) stat.input = Ressource(s) requise(s)
stat.output = Ressource(s) produite(s) stat.output = Ressource(s) produite(s)
@@ -693,6 +709,7 @@ stat.memorycapacity = Mémoire
stat.basepowergeneration = Production d'énergie de Base stat.basepowergeneration = Production d'énergie de Base
stat.productiontime = Durée de production stat.productiontime = Durée de production
stat.repairtime = Durée de la réparation complète d'un Bloc stat.repairtime = Durée de la réparation complète d'un Bloc
stat.repairspeed = Vitesse de réparation
stat.weapons = Armes stat.weapons = Armes
stat.bullet = Balles stat.bullet = Balles
stat.speedincrease = Accélération stat.speedincrease = Accélération
@@ -737,14 +754,16 @@ stat.healthmultiplier = Multiplicateur de santé
stat.speedmultiplier = Multiplicateur de vitesse stat.speedmultiplier = Multiplicateur de vitesse
stat.reloadmultiplier = Multiplicateur de rechargement stat.reloadmultiplier = Multiplicateur de rechargement
stat.buildspeedmultiplier = Multiplicateur de vitesse de construction stat.buildspeedmultiplier = Multiplicateur de vitesse de construction
stat.reactive = Reacts stat.reactive = Réactions
stat.healing = Guérison
ability.forcefield = Champ de Force ability.forcefield = Champ de Force
ability.repairfield = Champ de Réparation ability.repairfield = Champ de Réparation
ability.statusfield = Champ d'Amélioration ability.statusfield = Champ d'Amélioration {0}
ability.unitspawn = Usine de {0} ability.unitspawn = Usine de {0}
ability.shieldregenfield = Champ de régénération de bouclier ability.shieldregenfield = Champ de régénération de bouclier
ability.movelightning = Déplacement éclair ability.movelightning = Déplacement éclair
ability.energyfield = Champ d'énergie: [accent]{0}[] dégâts ~ [accent]{1}[] blocs / [accent]{2}[] cibles
bar.drilltierreq = Meilleure Foreuse Requise bar.drilltierreq = Meilleure Foreuse Requise
bar.noresources = Ressources manquantes bar.noresources = Ressources manquantes
@@ -767,6 +786,7 @@ bar.power = Énergie
bar.progress = Construction en cours bar.progress = Construction en cours
bar.input = Entrée bar.input = Entrée
bar.output = Sortie bar.output = Sortie
bar.strength = [stat]{0}[lightgray]x puissance
units.processorcontrol = [lightgray]Contrôlé par un processeur. units.processorcontrol = [lightgray]Contrôlé par un processeur.
@@ -775,7 +795,7 @@ bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgra
bullet.incendiary = [stat]incendiaire bullet.incendiary = [stat]incendiaire
bullet.homing = [stat]autoguidé bullet.homing = [stat]autoguidé
bullet.frag = [stat]fragmentation bullet.frag = [stat]fragmentation
bullet.lightning = [stat]{0}[lightgray]x lightning ~ [stat]{1}[lightgray] damage bullet.lightning = [stat]{0}[lightgray]x foudre ~ [stat]{1}[lightgray] dégâts
bullet.buildingdamage = [stat]{0}%[lightgray] des dégâts aux bâtiments bullet.buildingdamage = [stat]{0}%[lightgray] des dégâts aux bâtiments
bullet.knockback = [stat]{0}[lightgray] recul bullet.knockback = [stat]{0}[lightgray] recul
bullet.pierce = [stat]{0}[lightgray]x perforant bullet.pierce = [stat]{0}[lightgray]x perforant
@@ -804,6 +824,7 @@ unit.thousands = k
unit.millions = mil unit.millions = mil
unit.billions = Md unit.billions = Md
unit.pershot = /tirs unit.pershot = /tirs
category.purpose = Description category.purpose = Description
category.general = Caractéristiques category.general = Caractéristiques
category.power = Énergie category.power = Énergie
@@ -812,6 +833,7 @@ category.items = Objets
category.crafting = Fabrication category.crafting = Fabrication
category.function = Fonction category.function = Fonction
category.optional = Améliorations facultatives category.optional = Améliorations facultatives
setting.landscape.name = Verrouiller la rotation en mode paysage setting.landscape.name = Verrouiller la rotation en mode paysage
setting.shadows.name = Ombres setting.shadows.name = Ombres
setting.blockreplace.name = Suggestion automatique des Blocs setting.blockreplace.name = Suggestion automatique des Blocs
@@ -875,23 +897,29 @@ setting.lasersopacity.name = Opacité des Connexions laser
setting.bridgeopacity.name = Opacité des ponts setting.bridgeopacity.name = Opacité des ponts
setting.playerchat.name = Montrer les bulles de discussion des joueurs setting.playerchat.name = Montrer les bulles de discussion des joueurs
setting.showweather.name = Montrer les Effets météo setting.showweather.name = Montrer les Effets météo
setting.bloom.name = Flou lumineux
public.confirm = Voulez-vous rendre votre partie publique ?\n[accent]N'importe qui pourra rejoindre vos parties.\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique public.confirm = Voulez-vous rendre votre partie publique ?\n[accent]N'importe qui pourra rejoindre vos parties.\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique
public.confirm.really = Si vous voulez jouer avec des amis, utilisez [green]Inviter un Ami[] Au lieu [scarlet]d'un Serveur Public[] !\nÊtes-vous sûrs de vouloir rendre votre partie [scarlet]publique[] ? public.confirm.really = Si vous voulez jouer avec des amis, utilisez [green]Inviter un Ami[] Au lieu [scarlet]d'un Serveur Public[] !\nÊtes-vous sûrs de vouloir rendre votre partie [scarlet]publique[] ?
public.beta = Notez que les versions bêta du jeu ne peuvent pas créer de salons publics. public.beta = Notez que les versions bêta du jeu ne peuvent pas créer de salons publics.
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement des anciens paramètres et fermeture du jeu dans [accent] {0}[] secondes... uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement des anciens paramètres et fermeture du jeu dans [accent] {0}[] secondes...
uiscale.cancel = Annuler & Quitter uiscale.cancel = Annuler & Quitter
setting.bloom.name = Flou lumineux
keybind.title = Paramètres des Touches du Clavier
keybinds.mobile = [scarlet]La plupart des touches de clavier ne sont pas fonctionnelles sur mobile. Seuls les mouvements basiques sont supportés.
category.general.name = Général category.general.name = Général
category.view.name = Voir category.view.name = Voir
category.multiplayer.name = Multijoueur category.multiplayer.name = Multijoueur
category.blocks.name = Sélection des blocs category.blocks.name = Sélection des blocs
command.attack = Attaquer command.attack = Attaquer
command.rally = Rallier command.rally = Rallier
command.retreat = Retraite command.retreat = Retraite
command.idle = Inactif command.idle = Inactif
placement.blockselectkeys = \n[lightgray]Raccourci : [{0}, placement.blockselectkeys = \n[lightgray]Raccourci : [{0},
keybind.title = Paramètres des Touches du Clavier
keybinds.mobile = [scarlet]La plupart des touches de clavier ne sont pas fonctionnelles sur mobile. Seuls les mouvements basiques sont supportés.
keybind.respawn.name = Réapparaître keybind.respawn.name = Réapparaître
keybind.control.name = Contrôler une Unité keybind.control.name = Contrôler une Unité
keybind.clear_building.name = Réinitialiser les constructions keybind.clear_building.name = Réinitialiser les constructions
@@ -954,7 +982,8 @@ keybind.chat_history_next.name = Descendre l'Historique du Tchat
keybind.chat_scroll.name = Défilement du Tchat keybind.chat_scroll.name = Défilement du Tchat
keybind.chat_mode.name = Changer le mode du Tchat keybind.chat_mode.name = Changer le mode du Tchat
keybind.drop_unit.name = Larguer une unité keybind.drop_unit.name = Larguer une unité
keybind.zoom_minimap.name = Zoomer la Mini-carte keybind.zoom_minimap.name = Zoomer la Mini-carte
mode.help.title = Description des modes de jeu mode.help.title = Description des modes de jeu
mode.survival.name = Survie mode.survival.name = Survie
mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Requiert des points d'apparition ennemis pour pouvoir jouer à ce mode. mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Requiert des points d'apparition ennemis pour pouvoir jouer à ce mode.
@@ -975,6 +1004,8 @@ rules.wavetimer = Compte à rebours des vagues
rules.waves = Vagues rules.waves = Vagues
rules.attack = Mode « Attaque » rules.attack = Mode « Attaque »
rules.buildai = Constructions de l'IA rules.buildai = Constructions de l'IA
rules.corecapture = Capture du Noyau lors de sa Destruction
rules.polygoncoreprotection = Protection du noyau polygonal
rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge) rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge)
rules.blockhealthmultiplier = Multiplicateur de Santé des Blocs rules.blockhealthmultiplier = Multiplicateur de Santé des Blocs
rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs
@@ -1030,6 +1061,7 @@ item.blast-compound.name = Mélange Explosif
item.pyratite.name = Pyratite item.pyratite.name = Pyratite
item.metaglass.name = Verre Trempé item.metaglass.name = Verre Trempé
item.scrap.name = Ferraille item.scrap.name = Ferraille
liquid.water.name = Eau liquid.water.name = Eau
liquid.slag.name = Scories liquid.slag.name = Scories
liquid.oil.name = Pétrole liquid.oil.name = Pétrole
@@ -1061,6 +1093,11 @@ unit.minke.name = Minke
unit.bryde.name = Bryde unit.bryde.name = Bryde
unit.sei.name = Sei unit.sei.name = Sei
unit.omura.name = Omura unit.omura.name = Omura
unit.retusa.name = Retusa
unit.oxynoe.name = Oxynoe
unit.cyerce.name = Cyerce
unit.aegires.name = Aegires
unit.navanax.name = Navanax
unit.alpha.name = Alpha unit.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
@@ -1121,6 +1158,7 @@ block.sand-water.name = Eau avec fond de Sable
block.darksand-water.name = Eau avec fond de Sable sombre block.darksand-water.name = Eau avec fond de Sable sombre
block.char.name = Cendres block.char.name = Cendres
block.dacite.name = Dacite block.dacite.name = Dacite
block.rhyolite.name = Rhyolite
block.dacite-wall.name = Mur de Dacite block.dacite-wall.name = Mur de Dacite
block.dacite-boulder.name = Rocher de Dacite block.dacite-boulder.name = Rocher de Dacite
block.ice-snow.name = Neige et Glace block.ice-snow.name = Neige et Glace
@@ -1138,6 +1176,7 @@ block.spore-cluster.name = Grappes de Spores
block.metal-floor.name = Sol métallique block.metal-floor.name = Sol métallique
block.metal-floor-2.name = Sol métallique 2 block.metal-floor-2.name = Sol métallique 2
block.metal-floor-3.name = Sol métallique 3 block.metal-floor-3.name = Sol métallique 3
block.metal-floor-4.name = Sol métallique 4
block.metal-floor-5.name = Sol métallique 5 block.metal-floor-5.name = Sol métallique 5
block.metal-floor-damaged.name = Sol métallique endommagé block.metal-floor-damaged.name = Sol métallique endommagé
block.dark-panel-1.name = Panneau sombre 1 block.dark-panel-1.name = Panneau sombre 1
@@ -1228,6 +1267,7 @@ block.solar-panel.name = Panneau Solaire
block.solar-panel-large.name = Grand Panneau Solaire block.solar-panel-large.name = Grand Panneau Solaire
block.oil-extractor.name = Extracteur de Pétrole block.oil-extractor.name = Extracteur de Pétrole
block.repair-point.name = Point de Réparation block.repair-point.name = Point de Réparation
block.repair-turret.name = Tourelle de réparation
block.pulse-conduit.name = Conduit à Impulsion block.pulse-conduit.name = Conduit à Impulsion
block.plated-conduit.name = Conduit Plaqué block.plated-conduit.name = Conduit Plaqué
block.phase-conduit.name = Conduit Phasé block.phase-conduit.name = Conduit Phasé
@@ -1270,6 +1310,12 @@ block.exponential-reconstructor.name = Reconstructeur Exponentiel
block.tetrative-reconstructor.name = Reconstructeur Tétratif block.tetrative-reconstructor.name = Reconstructeur Tétratif
block.payload-conveyor.name = Convoyeur de Masse block.payload-conveyor.name = Convoyeur de Masse
block.payload-router.name = Routeur de Masse block.payload-router.name = Routeur de Masse
block.duct.name = Conduit
block.duct-router.name = Routeur en Conduit
block.duct-bridge.name = Pont en Conduit
block.payload-propulsion-tower.name = Tour à propulsion de Charge utile
block.payload-void.name = Destructeur de Charge utile
block.payload-source.name = Source de Charge utile
block.disassembler.name = Désassembleur block.disassembler.name = Désassembleur
block.silicon-crucible.name = Grande Fonderie de Silicium block.silicon-crucible.name = Grande Fonderie de Silicium
block.overdrive-dome.name = Dôme Accélérant block.overdrive-dome.name = Dôme Accélérant
@@ -1289,10 +1335,9 @@ block.memory-cell.name = Cellule de mémoire
block.memory-bank.name = Banque de mémoire block.memory-bank.name = Banque de mémoire
team.blue.name = bleu team.blue.name = bleu
team.crux.name = rouge team.crux.name = crux
team.sharded.name = orange team.sharded.name = sharded
team.orange.name = orange team.derelict.name = derelict
team.derelict.name = abandonné
team.green.name = vert team.green.name = vert
team.purple.name = mauve team.purple.name = mauve
@@ -1312,6 +1357,7 @@ hint.placeConveyor.mobile = Les Convoyeurs transportent les ressources des foreu
hint.placeTurret = Placez des \uf861 [accent]Tourelles[] pour défendre votre base contre les ennemis.\n\nLes Tourelles nécessitent des munitions (dans ce cas, du \uf838Cuivre).\nUtilisez les convoyeurs et les foreuses pour les ravitailler. hint.placeTurret = Placez des \uf861 [accent]Tourelles[] pour défendre votre base contre les ennemis.\n\nLes Tourelles nécessitent des munitions (dans ce cas, du \uf838Cuivre).\nUtilisez les convoyeurs et les foreuses pour les ravitailler.
hint.breaking = Maintenez [accent]Clic-droit[] pour détruire des blocs. hint.breaking = Maintenez [accent]Clic-droit[] pour détruire des blocs.
hint.breaking.mobile = Activez le \ue817 [accent]marteau[] en bas à droite Touchez pour détruire des blocs.\n\nRetenez votre doigt pendant une seconde et déplacez-le pour détruire les blocs dans la zone de sélection. hint.breaking.mobile = Activez le \ue817 [accent]marteau[] en bas à droite Touchez pour détruire des blocs.\n\nRetenez votre doigt pendant une seconde et déplacez-le pour détruire les blocs dans la zone de sélection.
hint.blockInfo = Pour afficher les informations relatives à un bloc, il suffit de le sélectionner dans le [accent]menu de construction[], puis de cliquer sur le bouton [accent][[?][] à droite.
hint.research = Utilisez le bouton \ue875 [accent]Recherche[] pour rechercher de nouvelles technologies. hint.research = Utilisez le bouton \ue875 [accent]Recherche[] pour rechercher de nouvelles technologies.
hint.research.mobile = Utilisez le bouton \ue875 [accent]Recherche[] dans le \ue88c [accent]Menu[] pour rechercher de nouvelles technologies. hint.research.mobile = Utilisez le bouton \ue875 [accent]Recherche[] dans le \ue88c [accent]Menu[] pour rechercher de nouvelles technologies.
hint.unitControl = Retenez [accent][[Ctrl-gauche][] et [accent]cliquez[] pour contrôler une tourelle ou une unité alliée. hint.unitControl = Retenez [accent][[Ctrl-gauche][] et [accent]cliquez[] pour contrôler une tourelle ou une unité alliée.
@@ -1345,7 +1391,7 @@ item.graphite.description = Du carbone minéralisé utilisé pour les munitions
item.sand.description = Un matériau commun, largement utilisé pour la fabrication de matériaux raffinés. item.sand.description = Un matériau commun, largement utilisé pour la fabrication de matériaux raffinés.
item.coal.description = Un carburant commun et facile à obtenir. item.coal.description = Un carburant commun et facile à obtenir.
item.coal.details = De la matière végétale fossilisée, formée bien avant lensemencement de ce monde. Utilisation très répandue pour la production de carburant et de ressources. item.coal.details = De la matière végétale fossilisée, formée bien avant lensemencement de ce monde. Utilisation très répandue pour la production de carburant et de ressources.
item.titanium.description = Un métal rare et super-léger, largement utilisé dans le transport de liquides, dans les foreuses de haut niveau et dans l'aviation. item.titanium.description = Un métal rare et super-léger, largement utilisé dans le transport de liquides, dans les foreuses de haut niveau et dans les usines.
item.thorium.description = Un métal dense et radioactif, utilisé comme support structurel et comme carburant nucléaire. item.thorium.description = Un métal dense et radioactif, utilisé comme support structurel et comme carburant nucléaire.
item.scrap.description = Il est utilisé dans les fours à fusion et les pulvériseurs, pour être raffiné en d'autres matériaux. item.scrap.description = Il est utilisé dans les fours à fusion et les pulvériseurs, pour être raffiné en d'autres matériaux.
item.scrap.details = Un mix de métaux provenant des restes de vieilles structures et d'unités. Il contient des traces de nombreux métaux différents. item.scrap.details = Un mix de métaux provenant des restes de vieilles structures et d'unités. Il contient des traces de nombreux métaux différents.
@@ -1566,7 +1612,7 @@ logic.nounitbuild = [red]Les unités contrôlées par des processeurs ne peuvent
lenum.type = Type de bâtiment/unité.\nPar exemple, pour tout routeur, cela retournera [accent]@router[].\nPas en texte. lenum.type = Type de bâtiment/unité.\nPar exemple, pour tout routeur, cela retournera [accent]@router[].\nPas en texte.
lenum.shoot = Tire à une position donnée. lenum.shoot = Tire à une position donnée.
lenum.shootp = Tire à une unité/bâtiment avec la prédiction de mouvement. lenum.shootp = Tire à une unité/bâtiment avec la prédiction de mouvement.
lenum.configure = La configuration d'un bâtiment. Par exemple, l'objet sélectionné dans un trieur. lenum.config = La configuration d'un bâtiment. Par exemple, l'objet sélectionné dans un trieur.
lenum.enabled = Retourne si le bloc est activé ou pas. lenum.enabled = Retourne si le bloc est activé ou pas.
laccess.color = La couleur d'un illuminateur. laccess.color = La couleur d'un illuminateur.
@@ -1574,6 +1620,7 @@ laccess.controller = Le contrôleur de l'Unité.\nSi l'Unité est contrôlée pa
laccess.dead = Retourne si l'Unité/Bâtiment est morte/détruit ou plus valide. laccess.dead = Retourne si l'Unité/Bâtiment est morte/détruit ou plus valide.
laccess.controlled = Retourne:\n[accent]@ctrlProcessor[] si le contrôleur de l'Unité est un processeur\n[accent]@ctrlPlayer[] si l'Unité/Bâtiment est contrôlé par un joueur\n[accent]@ctrlFormation[] si l'Unité est en formation\nSinon, retourne 0. laccess.controlled = Retourne:\n[accent]@ctrlProcessor[] si le contrôleur de l'Unité est un processeur\n[accent]@ctrlPlayer[] si l'Unité/Bâtiment est contrôlé par un joueur\n[accent]@ctrlFormation[] si l'Unité est en formation\nSinon, retourne 0.
laccess.commanded = [red]Obsolète! Cette commande sera supprimée.[]\nUtilisez [accent]controlled[] à la place. laccess.commanded = [red]Obsolète! Cette commande sera supprimée.[]\nUtilisez [accent]controlled[] à la place.
laccess.progress = Progression de l'action, 0 à 1.\nRenvoie la progression de la production, du rechargement de la tourelle ou de la construction.
graphicstype.clear = Remplit lécran dune couleur. graphicstype.clear = Remplit lécran dune couleur.
graphicstype.color = Définit une couleur pour les prochaines opérations de dessin. graphicstype.color = Définit une couleur pour les prochaines opérations de dessin.
@@ -1605,9 +1652,15 @@ lenum.min = Le minimum des 2 nombres.
lenum.max = Le maximum des 2 nombres. lenum.max = Le maximum des 2 nombres.
lenum.angle = Angle d'un vecteur en degrés. lenum.angle = Angle d'un vecteur en degrés.
lenum.len = Longueur d'un vecteur. lenum.len = Longueur d'un vecteur.
lenum.sin = Calcule le Sinus, en degrés. lenum.sin = Calcule le Sinus, en degrés.
lenum.cos = Calcule le Cosinus, en degrés. lenum.cos = Calcule le Cosinus, en degrés.
lenum.tan = Calcule la Tangente, en degrés. lenum.tan = Calcule la Tangente, en degrés.
lenum.asin = Arc sinus, en degrés.
lenum.acos = Arc cosinus, en degrés.
lenum.atan = Tangente de l'arc, en degrés.
#not a typo, look up 'range notation' #not a typo, look up 'range notation'
lenum.rand = Nombre aléatoire dans la plage [0, valeur). lenum.rand = Nombre aléatoire dans la plage [0, valeur).
lenum.log = Logarithme naturel (ln). lenum.log = Logarithme naturel (ln).
@@ -1687,4 +1740,4 @@ lenum.boost = Active/Désactive le boost.
#Added French translations #Added French translations
lenum.floor = Retourne le plus grand nombre entier,\nqui est inférieur ou égal au nombre donné (12.5 -> 12). lenum.floor = Retourne le plus grand nombre entier,\nqui est inférieur ou égal au nombre donné (12.5 -> 12).
lenum.ceil = Retourne le nombre entier le plus petit,\nsupérieur ou égal au nombre donné (12.5 -> 13). lenum.ceil = Retourne le nombre entier le plus petit,\nsupérieur ou égal au nombre donné (12.5 -> 13).

View File

@@ -314,7 +314,6 @@ data.exported = Data telah di ekspor.
data.invalid = Data permainan ini tidak sah. data.invalid = Data permainan ini tidak sah.
data.import.confirm = Mengimpor data eksternal akan menghapus [scarlet] semua[] data yang tersimpan.\n[accent]Tidak dapat diundur lagi![]\n\nSetelah data diimpor, game akan segera ditutup. data.import.confirm = Mengimpor data eksternal akan menghapus [scarlet] semua[] data yang tersimpan.\n[accent]Tidak dapat diundur lagi![]\n\nSetelah data diimpor, game akan segera ditutup.
quit.confirm = Apakah Anda yakin ingin keluar? quit.confirm = Apakah Anda yakin ingin keluar?
quit.confirm.tutorial = Apakah Anda tahu apa yang dilakukan?\nTutorial dapat diulang di[accent] Pengaturan->Permainan->Ulang Tutorial.[]
loading = [accent]Memuat... loading = [accent]Memuat...
reloading = [accent]Memuat Ulang Mod... reloading = [accent]Memuat Ulang Mod...
saving = [accent]Menyimpan... saving = [accent]Menyimpan...
@@ -461,6 +460,7 @@ toolmode.drawteams = Gambar Tim
toolmode.drawteams.description = Menggambar tim bukannya blok. toolmode.drawteams.description = Menggambar tim bukannya blok.
filters.empty = [lightgray]Tidak ada filter! Tambahkan dengan tombol dibawah. filters.empty = [lightgray]Tidak ada filter! Tambahkan dengan tombol dibawah.
filter.distort = Kerusakkan filter.distort = Kerusakkan
filter.noise = Kebisingan filter.noise = Kebisingan
filter.enemyspawn = Pilih Munculnya Musuh filter.enemyspawn = Pilih Munculnya Musuh
@@ -477,6 +477,7 @@ filter.clear = Bersih
filter.option.ignore = Biarkan filter.option.ignore = Biarkan
filter.scatter = Penebaran filter.scatter = Penebaran
filter.terrain = Lahan filter.terrain = Lahan
filter.option.scale = Ukuran filter.option.scale = Ukuran
filter.option.chance = Kemungkinan filter.option.chance = Kemungkinan
filter.option.mag = Tingkat filter.option.mag = Tingkat
@@ -485,11 +486,13 @@ filter.option.circle-scale = Ukuran Lingkaran
filter.option.octaves = Oktaf filter.option.octaves = Oktaf
filter.option.falloff = Kemerosotan filter.option.falloff = Kemerosotan
filter.option.angle = Sudut filter.option.angle = Sudut
filter.option.rotate = Putar
filter.option.amount = Jumlah filter.option.amount = Jumlah
filter.option.block = Blok filter.option.block = Blok
filter.option.floor = Lantai filter.option.floor = Lantai
filter.option.flooronto = Target Lantai filter.option.flooronto = Target Lantai
filter.option.target = Target filter.option.target = Target
filter.option.replacement = Pengganti
filter.option.wall = Dinding filter.option.wall = Dinding
filter.option.ore = Sumber Daya filter.option.ore = Sumber Daya
filter.option.floor2 = Lantai Sekunder filter.option.floor2 = Lantai Sekunder
@@ -506,6 +509,7 @@ load = Memuat
save = Simpan save = Simpan
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Silahkan mengulang kembali permainan agar pengaturan bahasa berpengaruh. language.restart = Silahkan mengulang kembali permainan agar pengaturan bahasa berpengaruh.
@@ -582,6 +586,7 @@ sector.attacked = Sektor [accent]{0}[white] sedang diserang!
sector.lost = Sektor [accent]{0}[white] telah dihancurkan! sector.lost = Sektor [accent]{0}[white] telah dihancurkan!
#note: the missing space in the line below is intentional #note: the missing space in the line below is intentional
sector.captured = Sektor [accent]{0}[white]ditaklukkan! sector.captured = Sektor [accent]{0}[white]ditaklukkan!
sector.changeicon = Ubah Ikon
threat.low = Rendah threat.low = Rendah
threat.medium = Sedang threat.medium = Sedang
@@ -634,7 +639,7 @@ status.wet.name = Basah
status.muddy.name = Berlumpur status.muddy.name = Berlumpur
status.melting.name = Meleleh status.melting.name = Meleleh
status.sapped.name = Melemahkan status.sapped.name = Melemahkan
status.electrified.name = Dialiri listrik status.electrified.name = Dialiri Listrik
status.spore-slowed.name = Spora Melambat status.spore-slowed.name = Spora Melambat
status.tarred.name = Berminyak status.tarred.name = Berminyak
status.overclock.name = Melebihi Batas status.overclock.name = Melebihi Batas
@@ -663,6 +668,7 @@ settings.clearcampaignsaves.confirm = Apakah Anda yakin ingin membersihkan semua
paused = [accent]< Jeda > paused = [accent]< Jeda >
clear = Bersih clear = Bersih
banned = [scarlet]Dilarang banned = [scarlet]Dilarang
unsupported.environment = [scarlet]Ruang Lingkup Tidak Cocok
yes = Ya yes = Ya
no = Tidak no = Tidak
info.title = Info info.title = Info
@@ -672,6 +678,7 @@ unit.nobuild = [scarlet]Unit tidak dapat membangun
lastaccessed = [lightgray]Terakhir Diakses: {0} lastaccessed = [lightgray]Terakhir Diakses: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <muat peta untuk lihat>
stat.description = Kegunaan stat.description = Kegunaan
stat.input = Masukan stat.input = Masukan
stat.output = Pengeluaran stat.output = Pengeluaran
@@ -701,6 +708,7 @@ stat.memorycapacity = Kapasitas Memori
stat.basepowergeneration = Basis Generasi Tenaga stat.basepowergeneration = Basis Generasi Tenaga
stat.productiontime = Waktu Produksi stat.productiontime = Waktu Produksi
stat.repairtime = Waktu Memperbaiki Blok Penuh stat.repairtime = Waktu Memperbaiki Blok Penuh
stat.repairspeed = Kecepatan Memperbaiki
stat.weapons = Senjata stat.weapons = Senjata
stat.bullet = Peluru stat.bullet = Peluru
stat.speedincrease = Tambahan Kecepatan stat.speedincrease = Tambahan Kecepatan
@@ -745,7 +753,8 @@ stat.healthmultiplier = Penggandaan Darah
stat.speedmultiplier = Penggandaan Kecepatan stat.speedmultiplier = Penggandaan Kecepatan
stat.reloadmultiplier = Penggandaan Isi Ulang stat.reloadmultiplier = Penggandaan Isi Ulang
stat.buildspeedmultiplier = Penggandaan Kecepatan Membangun stat.buildspeedmultiplier = Penggandaan Kecepatan Membangun
stat.reactive = Reaksi stat.reactive = Reaktif
stat.healing = Menyembuhkan
ability.forcefield = Bidang Kekuatan ability.forcefield = Bidang Kekuatan
ability.repairfield = Bidang Perbaikan ability.repairfield = Bidang Perbaikan
@@ -753,6 +762,7 @@ ability.statusfield = Bidang Status
ability.unitspawn = {0} Pabrik ability.unitspawn = {0} Pabrik
ability.shieldregenfield = Bidang Regenerasi Perisai ability.shieldregenfield = Bidang Regenerasi Perisai
ability.movelightning = Pergerakan Petir ability.movelightning = Pergerakan Petir
ability.energyfield = Bidang Tenaga: [accent]{0}[] kerusakan ~ [accent]{1}[] blok / [accent]{2}[] target
bar.drilltierreq = Membutuhkan Bor yang Lebih Baik bar.drilltierreq = Membutuhkan Bor yang Lebih Baik
bar.noresources = Sumber Daya Tidak Ditemukan bar.noresources = Sumber Daya Tidak Ditemukan
@@ -775,6 +785,7 @@ bar.power = Tenaga
bar.progress = Perkembangan Pembangunan bar.progress = Perkembangan Pembangunan
bar.input = Masukan bar.input = Masukan
bar.output = Keluaran bar.output = Keluaran
bar.strength = [stat]{0}[lightgray]x penguatan
units.processorcontrol = [lightgray]Dikendalikan Prosesor units.processorcontrol = [lightgray]Dikendalikan Prosesor
@@ -984,6 +995,7 @@ rules.waves = Gelombang
rules.attack = Mode Penyerangan rules.attack = Mode Penyerangan
rules.buildai = Bangunan A.I. rules.buildai = Bangunan A.I.
rules.corecapture = Tangkap Inti Saat Kehancuran rules.corecapture = Tangkap Inti Saat Kehancuran
rules.polygoncoreprotection = Poligon Pelindung Inti
rules.enemyCheat = Sumber Daya A.I. Musuh (Tim Merah) Tak Terbatas rules.enemyCheat = Sumber Daya A.I. Musuh (Tim Merah) Tak Terbatas
rules.blockhealthmultiplier = Penggandaan Darah Blok rules.blockhealthmultiplier = Penggandaan Darah Blok
rules.blockdamagemultiplier = Penggandaan Kekuatan Blok rules.blockdamagemultiplier = Penggandaan Kekuatan Blok
@@ -1039,6 +1051,7 @@ item.blast-compound.name = Senyawa Peledak
item.pyratite.name = Pyratit item.pyratite.name = Pyratit
item.metaglass.name = Metaglass item.metaglass.name = Metaglass
item.scrap.name = Rongsokan item.scrap.name = Rongsokan
liquid.water.name = Air liquid.water.name = Air
liquid.slag.name = Lava liquid.slag.name = Lava
liquid.oil.name = Minyak liquid.oil.name = Minyak
@@ -1153,7 +1166,8 @@ block.spore-cluster.name = Kumpulan Spora
block.metal-floor.name = Lantai Besi 1 block.metal-floor.name = Lantai Besi 1
block.metal-floor-2.name = Lantai Besi 2 block.metal-floor-2.name = Lantai Besi 2
block.metal-floor-3.name = Lantai Besi 3 block.metal-floor-3.name = Lantai Besi 3
block.metal-floor-5.name = Lantai Besi 4 block.metal-floor-4.name = Lantai Besi 4
block.metal-floor-5.name = Lantai Besi 5
block.metal-floor-damaged.name = Lantai Besi Rusak block.metal-floor-damaged.name = Lantai Besi Rusak
block.dark-panel-1.name = Panel Gelap 1 block.dark-panel-1.name = Panel Gelap 1
block.dark-panel-2.name = Panel Gelap 2 block.dark-panel-2.name = Panel Gelap 2
@@ -1333,6 +1347,7 @@ hint.placeConveyor.mobile = Pengantar dapat memindahkan bahan dari bor ke blok y
hint.placeTurret = Taruh \uf861 [accent]Menara[] untuk mempertahankan basismu daru musuh.\n\nTurret membutuhkan amunisi - yang satu ini, \uf838copper.\nGunakan pengantar dan bor untuk mengisinya. hint.placeTurret = Taruh \uf861 [accent]Menara[] untuk mempertahankan basismu daru musuh.\n\nTurret membutuhkan amunisi - yang satu ini, \uf838copper.\nGunakan pengantar dan bor untuk mengisinya.
hint.breaking = [accent]Klik kanan[] dan tarik untuk menghancurkan blok. hint.breaking = [accent]Klik kanan[] dan tarik untuk menghancurkan blok.
hint.breaking.mobile = Aktifkan \ue817 [accent]palu[] di kanan bawah dan tekan untuk menghancurkan blok.\n\nTahan jari kamu sebentar dan seret untuk menghancurkannya. hint.breaking.mobile = Aktifkan \ue817 [accent]palu[] di kanan bawah dan tekan untuk menghancurkan blok.\n\nTahan jari kamu sebentar dan seret untuk menghancurkannya.
hint.blockInfo = Lihat informasi dari sebuah blok dengan memilihnya di [accent]menu bangun[], lalu pilih tombol [accent][[?][] di sebelah kanan.
hint.research = Gunakan tombol \ue875 [accent]Riset[] untuk mempelajari teknologi baru. hint.research = Gunakan tombol \ue875 [accent]Riset[] untuk mempelajari teknologi baru.
hint.research.mobile = Gunakan tombol \ue875 [accent]Riset[] di \ue88c [accent]Menu[] untuk mempelajari teknologi baru. hint.research.mobile = Gunakan tombol \ue875 [accent]Riset[] di \ue88c [accent]Menu[] untuk mempelajari teknologi baru.
hint.unitControl = Tahan [accent][[L-ctrl][] dan [accent]klik[] untuk mengendalikan unit atau turret teman. hint.unitControl = Tahan [accent][[L-ctrl][] dan [accent]klik[] untuk mengendalikan unit atau turret teman.
@@ -1595,6 +1610,7 @@ laccess.controller = Pengendali unit. Jika dikendalikan prosesor, mengembalikan
laccess.dead = Menentukan apakah unit/bangunan itu hancur atau tidak ada lagi. laccess.dead = Menentukan apakah unit/bangunan itu hancur atau tidak ada lagi.
laccess.controlled = Mengembalikan:\n[accent]@ctrlProcessor[] bila pengendali unit adalah prosesor\n[accent]@ctrlPlayer[] bila pengendali unit/bangunan adalah pemain\n[accent]@ctrlFormation[] bila unit dalam formasi\nSebaliknya, 0. laccess.controlled = Mengembalikan:\n[accent]@ctrlProcessor[] bila pengendali unit adalah prosesor\n[accent]@ctrlPlayer[] bila pengendali unit/bangunan adalah pemain\n[accent]@ctrlFormation[] bila unit dalam formasi\nSebaliknya, 0.
laccess.commanded = [red]Kadaluarsa. Akan segera dihapus![]\nLebih baik gunakan [accent]controlled[]. laccess.commanded = [red]Kadaluarsa. Akan segera dihapus![]\nLebih baik gunakan [accent]controlled[].
laccess.progress = Memeriksa hasil kemajuan, 0 sampai 1.\nMengembalikan hasil laju produksi, pengisian ulang menara atau pembangunan.
graphicstype.clear = Mengisi tampilan dangan warna. graphicstype.clear = Mengisi tampilan dangan warna.
graphicstype.color = Menentukan warna untuk operasi mengambar selanjutnya. graphicstype.color = Menentukan warna untuk operasi mengambar selanjutnya.
@@ -1626,9 +1642,15 @@ lenum.min = Minimum dari dua angka.
lenum.max = Maksimum dari dua angka. lenum.max = Maksimum dari dua angka.
lenum.angle = Sudut vektor dalam derajat. lenum.angle = Sudut vektor dalam derajat.
lenum.len = Panjang vektor. lenum.len = Panjang vektor.
lenum.sin = Sinus, dalam derajat. lenum.sin = Sinus, dalam derajat.
lenum.cos = Kosinus, dalam derajat. lenum.cos = Kosinus, dalam derajat.
lenum.tan = Tangen, dalam derajat. lenum.tan = Tangen, dalam derajat.
lenum.asin = Arc sinus, dalam derajat.
lenum.acos = Arc kosinus, dalam derajat.
lenum.atan = Arc tangen, dalam derajat.
#bukan typo, cari 'daerah hasil fungsi' #bukan typo, cari 'daerah hasil fungsi'
lenum.rand = Angka Acak dalam jarak [0, value). lenum.rand = Angka Acak dalam jarak [0, value).
lenum.log = Logaritma natural (ln). lenum.log = Logaritma natural (ln).

View File

@@ -15,8 +15,8 @@ link.wiki.description = 공식 Mindustry 위키
link.suggestions.description = 새 기능 제안하기 link.suggestions.description = 새 기능 제안하기
link.bug.description = 버그 제보하기 link.bug.description = 버그 제보하기
linkfail = 링크를 열지 못했습니다!\nURL이 클립보드에 복사되었습니다. linkfail = 링크를 열지 못했습니다!\nURL이 클립보드에 복사되었습니다.
screenshot = 스크린 캡처가 {0} 에 저장되었습니다. screenshot = 스크린샷이 {0} 에 저장되었습니다.
screenshot.invalid = 맵이 너무 커서 스크린 캡처에 사용될 메모리가 부족합니다. screenshot.invalid = 맵이 너무 커서 스크린에 사용될 메모리가 부족합니다.
gameover = 게임 오버 gameover = 게임 오버
gameover.disconnect = 연결 끊기 gameover.disconnect = 연결 끊기
gameover.pvp = [accent]{0}[] 팀이 승리했습니다! gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
@@ -92,7 +92,7 @@ level.highscore = 최고 점수: [accent]{0}
level.select = 맵 선택 level.select = 맵 선택
level.mode = 게임 모드: level.mode = 게임 모드:
coreattack = < 코어가 공격을 받고 있습니다! > coreattack = < 코어가 공격을 받고 있습니다! >
nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 멸합니다! nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 멸합니다!
database = 코어 데이터베이스 database = 코어 데이터베이스
savegame = 게임 저장 savegame = 게임 저장
loadgame = 게임 불러오기 loadgame = 게임 불러오기
@@ -100,7 +100,7 @@ joingame = 게임 참여
customgame = 사용자 지정 게임 customgame = 사용자 지정 게임
newgame = 새 게임 newgame = 새 게임
none = < 없음 > none = < 없음 >
none.found = [lightgray]< 찾을 수 없음 > none.found = [lightgray]< 없거나 찾을 수 없음 >
minimap = 미니맵 minimap = 미니맵
position = 위치 position = 위치
close = 닫기 close = 닫기
@@ -343,9 +343,9 @@ custom = 사용자 정의
builtin = 내장 builtin = 내장
map.delete.confirm = 정말로 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다! map.delete.confirm = 정말로 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다!
map.random = [accent]무작위 맵 map.random = [accent]무작위 맵
map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 편집기에서 [accent]orange[] 코어를 맵에 추가하세요. map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 편집기에서 [accent]주황색[] 코어를 맵에 추가하세요.
map.nospawn.pvp = 이 맵에는 적 플레이어가 생성될 코어가 없습니다! 편집기에서 [royal]orange 팀이 아닌[] 코어를 추가하세요. map.nospawn.pvp = 이 맵에는 적 플레이어가 생성될 코어가 없습니다! 편집기에서 [royal]주황색 팀이 아닌[] 코어를 추가하세요.
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적 코어가 없습니다! 에디터에서 [royal]빨간색[] 코어들을 맵에 추가하세요. map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적 코어가 없습니다! 편집기에서 [royal]빨간색[] 코어들을 맵에 추가하세요.
map.invalid = 맵 로드 오류: 맵 파일이 손상되었거나 잘못된 파일입니다. map.invalid = 맵 로드 오류: 맵 파일이 손상되었거나 잘못된 파일입니다.
workshop.update = 아이템 업데이트 workshop.update = 아이템 업데이트
workshop.error = 창작마당 세부 사항을 가져오는 중 오류가 발생했습니다: {0} workshop.error = 창작마당 세부 사항을 가져오는 중 오류가 발생했습니다: {0}
@@ -439,7 +439,7 @@ editor.saveimage = 지형 내보내기
editor.unsaved = [scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까? editor.unsaved = [scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까?
editor.resizemap = 맵 크기 조정 editor.resizemap = 맵 크기 조정
editor.mapname = 맵 이름: editor.mapname = 맵 이름:
editor.overwrite = [accept]경고!\n이은 기존 맵을 덮어 씁니다. editor.overwrite = [accept]경고!\n이은 기존 맵을 덮어 씁니다.
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
editor.exists = 이 이름의 맵이 이미 존재합니다. editor.exists = 이 이름의 맵이 이미 존재합니다.
editor.selectmap = 불러올 맵을 선택하세요: editor.selectmap = 불러올 맵을 선택하세요:
@@ -460,6 +460,7 @@ toolmode.drawteams = 팀 그리기
toolmode.drawteams.description = 블록 대신 선택한 팀으로 블록 팀을 그립니다. toolmode.drawteams.description = 블록 대신 선택한 팀으로 블록 팀을 그립니다.
filters.empty = [lightgray]필터가 없습니다! 아래 버튼을 눌러 하나를 추가하세요. filters.empty = [lightgray]필터가 없습니다! 아래 버튼을 눌러 하나를 추가하세요.
filter.distort = 왜곡 filter.distort = 왜곡
filter.noise = 노이즈 filter.noise = 노이즈
filter.enemyspawn = 적 소환지점 선택 filter.enemyspawn = 적 소환지점 선택
@@ -476,6 +477,7 @@ filter.clear = 초기화
filter.option.ignore = 무시 filter.option.ignore = 무시
filter.scatter = 흩뿌리기 filter.scatter = 흩뿌리기
filter.terrain = 지형 filter.terrain = 지형
filter.option.scale = 크기 filter.option.scale = 크기
filter.option.chance = 배치 빈도 filter.option.chance = 배치 빈도
filter.option.mag = 크기 filter.option.mag = 크기
@@ -490,6 +492,7 @@ filter.option.block = 블록
filter.option.floor = 타일 filter.option.floor = 타일
filter.option.flooronto = 대상 타일 filter.option.flooronto = 대상 타일
filter.option.target = 대상 filter.option.target = 대상
filter.option.replacement = 바꿔넣을 타일
filter.option.wall = filter.option.wall =
filter.option.ore = 광물 filter.option.ore = 광물
filter.option.floor2 = 2번째 타일 filter.option.floor2 = 2번째 타일
@@ -512,7 +515,7 @@ memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = 언어 설정을 적용하려면 게임을 다시 시작하세요. language.restart = 언어 설정을 적용하려면 게임을 다시 시작하세요.
settings = 설정 settings = 설정
tutorial = 튜토리얼 tutorial = 튜토리얼
tutorial.retake = 튜토리얼을 다시 시작하기 tutorial.retake = 튜토리얼 시작하기
editor = 편집기 editor = 편집기
mapeditor = 맵 편집기 mapeditor = 맵 편집기
@@ -545,7 +548,7 @@ connectfail = [scarlet]연결 오류:\n\n[accent]{0}
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
error.invalidaddress = 잘못된 주소입니다. error.invalidaddress = 잘못된 주소입니다.
error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하세요. error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하세요.
error.mismatch = 패킷 오류\n클라이언트/서버 버전이 일치하지 않습니다.\n접속하려는 서버가 최신 버전인지 확인하세요! error.mismatch = 패킷 오류\n클라이언트서버 버전이 일치하지 않습니다.\n접속하려는 서버가 최신 버전인지 확인하세요!
error.alreadyconnected = 이미 접속 중입니다. error.alreadyconnected = 이미 접속 중입니다.
error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.mapnotfound = 맵 파일을 찾을 수 없습니다!
error.io = 네트워크 I/O 오류. error.io = 네트워크 I/O 오류.
@@ -570,7 +573,7 @@ sectors.resume = 재개
sectors.launch = 출격 sectors.launch = 출격
sectors.select = 선택 sectors.select = 선택
sectors.nonelaunch = [lightgray]없음 (sun) sectors.nonelaunch = [lightgray]없음 (sun)
sectors.rename = 역 이름 변경 sectors.rename = 역 이름 변경
sectors.enemybase = [scarlet]적 기지 sectors.enemybase = [scarlet]적 기지
sectors.vulnerable = [scarlet]취약함 sectors.vulnerable = [scarlet]취약함
sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% 손상됨. sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% 손상됨.
@@ -630,16 +633,16 @@ sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내
sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요. sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[] sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[]
status.burning.name = 방화 status.burning.name = 불탐
status.freezing.name = 빙결 status.freezing.name = 빙결
status.wet.name = 젖음 status.wet.name = 젖음
status.muddy.name = 질척해짐 status.muddy.name = 질척해짐
status.melting.name = 융해 status.melting.name = 융해
status.sapped.name = 흡혈됨 status.sapped.name = 피로
status.electrified.name = 과전류 status.electrified.name = 과전류
status.spore-slowed.name = 포자감속 status.spore-slowed.name = 포자감속
status.tarred.name = 타르화 status.tarred.name = 침유됨
status.overclock.name = 과부하 status.overclock.name = 가속화
status.shocked.name = 감전 status.shocked.name = 감전
status.blasted.name = 파열 status.blasted.name = 파열
status.unmoving.name = 멈춤 status.unmoving.name = 멈춤
@@ -675,6 +678,7 @@ unit.nobuild = [scarlet]건설 불가
lastaccessed = [lightgray]마지막 접근: {0} lastaccessed = [lightgray]마지막 접근: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <맵을 먼저 불러와야 합니다>
stat.description = 특성 stat.description = 특성
stat.input = 입력 stat.input = 입력
stat.output = 출력 stat.output = 출력
@@ -722,16 +726,16 @@ stat.inaccuracy = 오차각
stat.shots = 발사 수 stat.shots = 발사 수
stat.reload = 초당 발사 수 stat.reload = 초당 발사 수
stat.ammo = 탄약 stat.ammo = 탄약
stat.shieldhealth = 보호막 체력 stat.shieldhealth = 보호막 내구도
stat.cooldowntime = 쿨타임 stat.cooldowntime = 쿨타임
stat.explosiveness = 폭발성 stat.explosiveness = 폭발성
stat.basedeflectchance = 기본 반사 확률 stat.basedeflectchance = 기본 반사 확률
stat.lightningchance = 전격 확률 stat.lightningchance = 전격 생성 확률
stat.lightningdamage = 전격 피해량 stat.lightningdamage = 전격 피해량
stat.flammability = 인화성 stat.flammability = 인화성
stat.radioactivity = 방사성 stat.radioactivity = 방사성
stat.charge=과충전률 stat.charge = 과충전률
stat.heatcapacity = 용량 stat.heatcapacity =
stat.viscosity = 점성 stat.viscosity = 점성
stat.temperature = 온도 stat.temperature = 온도
stat.speed = 속도 stat.speed = 속도
@@ -758,7 +762,7 @@ ability.statusfield = {0} 상태이상 필드
ability.unitspawn = {0} 공장 ability.unitspawn = {0} 공장
ability.shieldregenfield = 방어막 복구 필드 ability.shieldregenfield = 방어막 복구 필드
ability.movelightning = 가속 전격 ability.movelightning = 가속 전격
ability.energyfield = 에너지 필드: [accent]{1}[]타일 내 [accent]{2}[]개 목표물에게 [accent]{0}[]피해량 ability.energyfield = 에너지 필드: [accent]{1}[]타일 내 [accent]{2}[]개 목표물에게 [accent]{0}[]피해량
bar.drilltierreq = 더 좋은 드릴 필요 bar.drilltierreq = 더 좋은 드릴 필요
bar.noresources = 자원 부족 bar.noresources = 자원 부족
@@ -786,7 +790,7 @@ bar.strength = [stat]{0}[lightgray]x 치료 속도
units.processorcontrol = [lightgray]프로세서 제어됨 units.processorcontrol = [lightgray]프로세서 제어됨
bullet.damage = [stat]{0}[lightgray] 피해량 bullet.damage = [stat]{0}[lightgray] 피해량
bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat] {1}[lightgray] 타일 bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat]{1}[lightgray] 타일
bullet.incendiary = [stat]방화 bullet.incendiary = [stat]방화
bullet.homing = [stat]유도 bullet.homing = [stat]유도
bullet.frag = [stat]파편 bullet.frag = [stat]파편
@@ -858,13 +862,13 @@ setting.difficulty.hard = 혼돈
setting.difficulty.insane = 박멸 setting.difficulty.insane = 박멸
setting.difficulty.name = 난이도: setting.difficulty.name = 난이도:
setting.screenshake.name = 화면 흔들림 setting.screenshake.name = 화면 흔들림
setting.effects.name = 효과 표시 setting.effects.name = 입자 효과 표시
setting.destroyedblocks.name = 파괴된 블록 표시 setting.destroyedblocks.name = 파괴된 블록 표시
setting.blockstatus.name = 블록 상태 표시 setting.blockstatus.name = 블록 상태 표시
setting.conveyorpathfinding.name = 컨베이어 배치 길찾기 setting.conveyorpathfinding.name = 컨베이어 배치 길찾기
setting.sensitivity.name = 컨트롤러 감도 setting.sensitivity.name = 컨트롤러 감도
setting.saveinterval.name = 저장 간격 setting.saveinterval.name = 저장 간격
setting.seconds = {0}초 setting.seconds = {0}
setting.milliseconds = {0} 밀리초 setting.milliseconds = {0} 밀리초
setting.fullscreen.name = 전체 화면 setting.fullscreen.name = 전체 화면
setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다) setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다)
@@ -972,14 +976,14 @@ 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 = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적 스폰지점이 필요합니다. mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적 스폰지점이 필요합니다.
mode.sandbox.name = 샌드박스 mode.sandbox.name = 샌드박스
mode.sandbox.description = 무한한 자원이 있으며, 시간 제한이 없습니다. mode.sandbox.description = 무한한 자원이 있으며, 시간 제한이 없습니다.
mode.editor.name = 편집기 mode.editor.name = 편집기
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = 다른 플레이어와 현장에서 싸우십시오.\n[gray]플레이하려면 맵에 다른 색상의 코어가 2개 이상 있어야 합니다. mode.pvp.description = 다른 플레이어와 현장에서 싸우십시오.\n[gray]플레이하려면 맵에 다른 색상의 코어가 2개 이상 있어야 합니다.
mode.attack.name = 공격 mode.attack.name = 공격
mode.attack.description = 적의 기지를 파괴하세요.\n[gray]플레이하려면 맵에 빨간색 코어가 필요합니다. mode.attack.description = 적의 기지를 파괴하세요.\n[gray]플레이하려면 맵에 코어가 필요합니다.
mode.custom = 사용자 정의 규칙 mode.custom = 사용자 정의 규칙
rules.infiniteresources = 무한 자원 rules.infiniteresources = 무한 자원
@@ -991,15 +995,16 @@ rules.waves = 단계
rules.attack = 공격 모드 rules.attack = 공격 모드
rules.buildai = AI 건설 rules.buildai = AI 건설
rules.corecapture = 코어 파괴 시 점령 rules.corecapture = 코어 파괴 시 점령
rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.polygoncoreprotection = 다각형 코어 건설 금지구역
rules.enemyCheat = 적Ai 무한자원
rules.blockhealthmultiplier = 블록 체력 배수 rules.blockhealthmultiplier = 블록 체력 배수
rules.blockdamagemultiplier = 블록 공격력 배수 rules.blockdamagemultiplier = 블록 공격력 배수
rules.unitbuildspeedmultiplier = 유닛 생산 속도 배수 rules.unitbuildspeedmultiplier = 유닛 생산속도 배수
rules.unithealthmultiplier = 유닛 체력 배수 rules.unithealthmultiplier = 유닛 체력 배수
rules.unitdamagemultiplier = 유닛 공격력 배수 rules.unitdamagemultiplier = 유닛 공격력 배수
rules.unitcapvariable = 코어 유닛 제한 추가 rules.unitcapvariable = 코어 유닛제한 추가
rules.unitcap = 기본 유닛 제한 rules.unitcap = 기본 유닛 제한
rules.enemycorebuildradius = 적 코어 건설 금지구역 범위:[lightgray] (타일) rules.enemycorebuildradius = 적 코어 건설금지구역 범위:[lightgray] (타일)
rules.wavespacing = 단계 간격:[lightgray] (초) rules.wavespacing = 단계 간격:[lightgray] (초)
rules.buildcostmultiplier = 건설 비용 배수 rules.buildcostmultiplier = 건설 비용 배수
rules.buildspeedmultiplier = 건설 속도 배수 rules.buildspeedmultiplier = 건설 속도 배수
@@ -1161,6 +1166,7 @@ block.spore-cluster.name = 포자낭
block.metal-floor.name = 금속제 바닥 block.metal-floor.name = 금속제 바닥
block.metal-floor-2.name = 금속 타일 2 block.metal-floor-2.name = 금속 타일 2
block.metal-floor-3.name = 금속 타일 3 block.metal-floor-3.name = 금속 타일 3
block.metal-floor-4.name = 금속 타일 4
block.metal-floor-5.name = 금속 타일 5 block.metal-floor-5.name = 금속 타일 5
block.metal-floor-damaged.name = 손상된 금속 타일 block.metal-floor-damaged.name = 손상된 금속 타일
block.dark-panel-1.name = 검은 패널 1 block.dark-panel-1.name = 검은 패널 1
@@ -1303,7 +1309,7 @@ block.payload-source.name = 화물 공급기
block.disassembler.name = 광재 분해기 block.disassembler.name = 광재 분해기
block.silicon-crucible.name = 실리콘 도가니 block.silicon-crucible.name = 실리콘 도가니
block.overdrive-dome.name = 대형 과부하 프로젝터 block.overdrive-dome.name = 대형 과부하 프로젝터
#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들니다. #experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들이였습니다.
block.block-forge.name = 블록 제작대 block.block-forge.name = 블록 제작대
block.block-loader.name = 블록 로더 block.block-loader.name = 블록 로더
block.block-unloader.name = 블록 언로더 block.block-unloader.name = 블록 언로더
@@ -1585,13 +1591,15 @@ lst.sensor = 건물 또는 유닛의 정보 얻기
lst.set = 변수 선언/할당하기 lst.set = 변수 선언/할당하기
lst.operation = 1~2개의 변수로 연산하기 lst.operation = 1~2개의 변수로 연산하기
lst.end = 실행줄의 가장 위로 점프하기 lst.end = 실행줄의 가장 위로 점프하기
lst.wait = 일정 시간(초) 동안 대기
lst.lookup = id를 통해 특정 유형의 아이템/액체/유닛/블록을 찾기\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[].\n로 각 타입의 총 갯수를 알 수 있습니다.
lst.jump = 조건부로 다른 실행문으로 점프하기 lst.jump = 조건부로 다른 실행문으로 점프하기
lst.unitbind = type 옆에 있는 유닛을 지정하고, [accent]@unit[]에 저장하기 lst.unitbind = type 옆에 있는 유닛을 지정하고, [accent]@unit[]에 저장하기
lst.unitcontrol = 현재 지정된 유닛을 조종하기 lst.unitcontrol = 현재 지정된 유닛을 조종하기
lst.unitradar = 현재 지정된 유닛 주변의 유닛 검색하기 lst.unitradar = 현재 지정된 유닛 주변의 유닛 검색하기
lst.unitlocate = 특정 유형의 위치/건물을 지도상에서 찾기\n지정된 유닛이 필요합니다. lst.unitlocate = 특정 유형의 위치/건물을 지도상에서 찾기\n지정된 유닛이 필요합니다.
logic.nounitbuild = [red]유닛의 건 로직은 여기서 허용되지 않습니다. logic.nounitbuild = [red]유닛의 건 로직은 여기서 허용되지 않습니다.
lenum.type = 건물/유닛의 타입\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다. lenum.type = 건물/유닛의 타입\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다.
lenum.shoot = 특정 위치에 발사 lenum.shoot = 특정 위치에 발사
@@ -1721,7 +1729,7 @@ lenum.build = 구조물 건설
lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다. lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다.
lenum.within = 좌표 주변 유닛 발견 여부 lenum.within = 좌표 주변 유닛 발견 여부
lenum.boost = 이륙 시작/중단 lenum.boost = 이륙 시작/중단
#1724 line matching / 줄 매칭 #1730 line matching / 줄 매칭
#-------------비공식 번역------------- #-------------비공식 번역-------------
#팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요. #팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요.
@@ -1840,7 +1848,6 @@ block.pneumatic-drill.details =
block.laser-drill.details = block.laser-drill.details =
block.blast-drill.details = block.blast-drill.details =
block.water-extractor.details = block.water-extractor.details =
block.cultivator.details =
block.oil-extractor.details = block.oil-extractor.details =
block.vault.details = block.vault.details =
block.container.details = block.container.details =

View File

@@ -399,14 +399,12 @@ wavemode.health = viață
editor.default = [lightgray]<Prestabilit> editor.default = [lightgray]<Prestabilit>
details = Detalii... details = Detalii...
edit = Editare... edit = Editează...
editor.name = Nume: editor.name = Nume:
editor.spawn = Adaugă Unitate editor.spawn = Adaugă Unitate
editor.removeunit = Înlătură Unitate editor.removeunit = Înlătură Unitate
editor.teams = Echipe editor.teams = Echipe
editor.errorload = Eroare la încărcarea fișierului. editor.errorload = Eroare la încărcarea fișierului.
memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb
editor.errorsave = Eroare la salvarea fișierului. editor.errorsave = Eroare la salvarea fișierului.
editor.errorimage = Aceasta este o imagine, nu o hartă. editor.errorimage = Aceasta este o imagine, nu o hartă.
editor.errorlegacy = Hartă aceasta este prea veche, și folosește un format învechit care nu mai este suportat. editor.errorlegacy = Hartă aceasta este prea veche, și folosește un format învechit care nu mai este suportat.
@@ -462,6 +460,7 @@ toolmode.drawteams = Desenează Echipe
toolmode.drawteams.description = Desenează echipe în loc de blocuri. toolmode.drawteams.description = Desenează echipe în loc de blocuri.
filters.empty = [lightgray]Fără filtre! Adaugă unul folosind butonul de mai jos. filters.empty = [lightgray]Fără filtre! Adaugă unul folosind butonul de mai jos.
filter.distort = Distorsionare filter.distort = Distorsionare
filter.noise = Zgomot Vizual filter.noise = Zgomot Vizual
filter.enemyspawn = Selectare Punct de Lansare Inamic filter.enemyspawn = Selectare Punct de Lansare Inamic
@@ -478,6 +477,7 @@ filter.clear = Curăță
filter.option.ignore = Ignoră filter.option.ignore = Ignoră
filter.scatter = Împrăștie filter.scatter = Împrăștie
filter.terrain = Teren filter.terrain = Teren
filter.option.scale = Scară filter.option.scale = Scară
filter.option.chance = Șansă filter.option.chance = Șansă
filter.option.mag = Magnitudine filter.option.mag = Magnitudine
@@ -492,6 +492,7 @@ filter.option.block = Bloc
filter.option.floor = Podea filter.option.floor = Podea
filter.option.flooronto = Podea Țintă filter.option.flooronto = Podea Țintă
filter.option.target = Țintă filter.option.target = Țintă
filter.option.replacement = Înlocuitor
filter.option.wall = Perete filter.option.wall = Perete
filter.option.ore = Minereu filter.option.ore = Minereu
filter.option.floor2 = Podea Secundară filter.option.floor2 = Podea Secundară
@@ -508,6 +509,8 @@ load = Încarcă
save = Salvează save = Salvează
fps = FPS: {0} fps = FPS: {0}
tps = TPS: {0} tps = TPS: {0}
memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb
ping = Ping: {0}ms ping = Ping: {0}ms
language.restart = Repornește jocul pentru ca setările de limbă să aibă efect. language.restart = Repornește jocul pentru ca setările de limbă să aibă efect.
settings = Setări settings = Setări
@@ -675,6 +678,7 @@ unit.nobuild = [scarlet]Unitatea nu poate construi.
lastaccessed = [lightgray]Ultima Accesare: {0} lastaccessed = [lightgray]Ultima Accesare: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <vezi pe hartă>
stat.description = Utilizare stat.description = Utilizare
stat.input = Necesită stat.input = Necesită
stat.output = Produce stat.output = Produce
@@ -999,6 +1003,7 @@ rules.unithealthmultiplier = Multiplicatorul Vieții Unităților
rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților
rules.unitcapvariable = Nucleele Contribuie la Limita Unităților rules.unitcapvariable = Nucleele Contribuie la Limita Unităților
rules.unitcap = Limita de Bază a Unităților rules.unitcap = Limita de Bază a Unităților
rules.polygoncoreprotection = Protecție Poligonală a Nucleului
rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate)
rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec) rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec)
rules.buildcostmultiplier = Multiplicatorul Costului Construcției rules.buildcostmultiplier = Multiplicatorul Costului Construcției
@@ -1161,7 +1166,8 @@ block.spore-cluster.name = Grup de Spori
block.metal-floor.name = Podea de Metal 1 block.metal-floor.name = Podea de Metal 1
block.metal-floor-2.name = Podea de Metal 2 block.metal-floor-2.name = Podea de Metal 2
block.metal-floor-3.name = Podea de Metal 3 block.metal-floor-3.name = Podea de Metal 3
block.metal-floor-5.name = Podea de Metal 4 block.metal-floor-4.name = Podea de Metal 4
block.metal-floor-5.name = Podea de Metal 5
block.metal-floor-damaged.name = Podea de Metal Deteriorată block.metal-floor-damaged.name = Podea de Metal Deteriorată
block.dark-panel-1.name = Panou Negru 1 block.dark-panel-1.name = Panou Negru 1
block.dark-panel-2.name = Panou Negru 2 block.dark-panel-2.name = Panou Negru 2

View File

@@ -67,6 +67,14 @@ schematic.delete.confirm = Эта схема будет поджарена Ис
schematic.rename = Переименовать схему schematic.rename = Переименовать схему
schematic.info = {0}x{1}, {2} блоков schematic.info = {0}x{1}, {2} блоков
schematic.disabled = [scarlet]Схемы отключены[]\nНа этой [accent]карте[] или [accent]сервере[] запрещено использование схем. schematic.disabled = [scarlet]Схемы отключены[]\nНа этой [accent]карте[] или [accent]сервере[] запрещено использование схем.
schematic.tags = Теги:
schematic.edittags = Редактировать теги
schematic.addtag = Добавить тег
schematic.texttag = Текстовый тег
schematic.icontag = Символьный тег
schematic.renametag = Переименовать тег
schematic.tagdelconfirm = Полностью удалить этот тег?
schematic.tagexists = Такой тег уже существует.
stats = Статистика stats = Статистика
stat.wave = Волн отражено:[accent] {0} stat.wave = Волн отражено:[accent] {0}
@@ -306,7 +314,6 @@ data.exported = Данные экспортированы.
data.invalid = Эти игровые данные являются недействительными. data.invalid = Эти игровые данные являются недействительными.
data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные импортированы, ваша игра немедленно закроется. data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные импортированы, ваша игра немедленно закроется.
quit.confirm = Вы уверены, что хотите выйти? quit.confirm = Вы уверены, что хотите выйти?
quit.confirm.tutorial = Вы уверены, что знаете, что делаете?\nОбучение может быть повторно запущено через[accent] Настройки->Игра->Открыть обучение.[]
loading = [accent]Загрузка… loading = [accent]Загрузка…
reloading = [accent]Перезагрузка модификаций… reloading = [accent]Перезагрузка модификаций…
saving = [accent]Сохранение… saving = [accent]Сохранение…
@@ -453,6 +460,7 @@ toolmode.drawteams = Изменить команду блока
toolmode.drawteams.description = Изменяет принадлежность\nблока к команде. toolmode.drawteams.description = Изменяет принадлежность\nблока к команде.
filters.empty = [lightgray]Нет фильтров! Добавьте один при помощи кнопки ниже. filters.empty = [lightgray]Нет фильтров! Добавьте один при помощи кнопки ниже.
filter.distort = Искажение filter.distort = Искажение
filter.noise = Шум filter.noise = Шум
filter.enemyspawn = Случайный выбор \nточек высадки filter.enemyspawn = Случайный выбор \nточек высадки
@@ -469,6 +477,7 @@ filter.clear = Очистить
filter.option.ignore = Игнорировать filter.option.ignore = Игнорировать
filter.scatter = Сеятель filter.scatter = Сеятель
filter.terrain = Ландшафт filter.terrain = Ландшафт
filter.option.scale = Масштаб фильтра filter.option.scale = Масштаб фильтра
filter.option.chance = Шанс filter.option.chance = Шанс
filter.option.mag = Сила применения filter.option.mag = Сила применения
@@ -477,11 +486,13 @@ filter.option.circle-scale = Масштаб круга
filter.option.octaves = Цикличность применения filter.option.octaves = Цикличность применения
filter.option.falloff = Спад цикличности filter.option.falloff = Спад цикличности
filter.option.angle = Угол filter.option.angle = Угол
filter.option.rotate = Повернуть
filter.option.amount = Количество filter.option.amount = Количество
filter.option.block = Блок filter.option.block = Блок
filter.option.floor = Поверхность filter.option.floor = Поверхность
filter.option.flooronto = Целевая поверхность filter.option.flooronto = Целевая поверхность
filter.option.target = Цель filter.option.target = Цель
filter.option.replacement = Замена
filter.option.wall = Стена filter.option.wall = Стена
filter.option.ore = Руда filter.option.ore = Руда
filter.option.floor2 = Вторая поверхность filter.option.floor2 = Вторая поверхность
@@ -498,6 +509,7 @@ load = Загрузить
save = Сохранить save = Сохранить
fps = FPS: {0} fps = FPS: {0}
ping = Пинг: {0}мс ping = Пинг: {0}мс
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Перезагрузите игру, чтобы языковые настройки вступили в силу. language.restart = Перезагрузите игру, чтобы языковые настройки вступили в силу.
@@ -530,7 +542,7 @@ launch.from = Запуск из: [accent]{0}
launch.destination = Место назначения: {0} launch.destination = Место назначения: {0}
configure.invalid = Количество должно быть числом между 0 и {0}. configure.invalid = Количество должно быть числом между 0 и {0}.
add = Добавить… add = Добавить…
boss.health = Прочность стража guardian = Страж
connectfail = [scarlet]Ошибка подключения:\n\n[accent]{0} connectfail = [scarlet]Ошибка подключения:\n\n[accent]{0}
error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно? error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно?
@@ -574,6 +586,7 @@ sector.attacked = Сектор [accent]{0}[white] атакован!
sector.lost = Сектор [accent]{0}[white] потерян! sector.lost = Сектор [accent]{0}[white] потерян!
#note: the missing space in the line below is intentional (недостающий пробел управляется кодом) #note: the missing space in the line below is intentional (недостающий пробел управляется кодом)
sector.captured = Сектор [accent]{0}[white]захвачен! sector.captured = Сектор [accent]{0}[white]захвачен!
sector.changeicon = Изменить иконку
threat.low = Низкая threat.low = Низкая
threat.medium = Средняя threat.medium = Средняя
@@ -626,6 +639,7 @@ status.wet.name = Влага
status.muddy.name = В грязи status.muddy.name = В грязи
status.melting.name = Плавление status.melting.name = Плавление
status.sapped.name = Истощение status.sapped.name = Истощение
status.electrified.name = Электризация
status.spore-slowed.name = Замедление спорами status.spore-slowed.name = Замедление спорами
status.tarred.name = В нефти status.tarred.name = В нефти
status.overclock.name = Разгон status.overclock.name = Разгон
@@ -654,6 +668,7 @@ settings.clearcampaignsaves.confirm = Вы уверены, что хотите
paused = [accent]< Пауза > paused = [accent]< Пауза >
clear = Очистить clear = Очистить
banned = [scarlet]Запрещено banned = [scarlet]Запрещено
unsupported.environment = [scarlet]Неподдерживаемые условия
yes = Да yes = Да
no = Нет no = Нет
info.title = Информация info.title = Информация
@@ -663,13 +678,14 @@ unit.nobuild = [scarlet]Единица не может строить
lastaccessed = [lightgray]Последняя конфигурация от {0} lastaccessed = [lightgray]Последняя конфигурация от {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <загрузите карту для отображения>
stat.description = Назначение stat.description = Назначение
stat.input = Вход stat.input = Вход
stat.output = Выход stat.output = Выход
stat.booster = Ускоритель stat.booster = Ускоритель
stat.tiles = Необходимые плитки stat.tiles = Необходимые плитки
stat.affinities = Увеличение эффективности stat.affinities = Множитель эффективности
stat.opposites = Уменьшение эффективности stat.opposites = Противоположности
stat.powercapacity = Вместимость энергии stat.powercapacity = Вместимость энергии
stat.powershot = Энергия/выстрел stat.powershot = Энергия/выстрел
stat.damage = Урон stat.damage = Урон
@@ -691,7 +707,8 @@ stat.itemcapacity = Вместимость предметов
stat.memorycapacity = Размер памяти stat.memorycapacity = Размер памяти
stat.basepowergeneration = Базовая генерация энергии stat.basepowergeneration = Базовая генерация энергии
stat.productiontime = Время производства stat.productiontime = Время производства
stat.repairtime = Время полной регенерации stat.repairtime = Время полного ремонта
stat.repairspeed = Скорость ремонта
stat.weapons = Орудия stat.weapons = Орудия
stat.bullet = Снаряд stat.bullet = Снаряд
stat.speedincrease = Увеличение скорости stat.speedincrease = Увеличение скорости
@@ -745,6 +762,7 @@ ability.statusfield = {0} Усиливающее поле
ability.unitspawn = Завод единиц «{0}» ability.unitspawn = Завод единиц «{0}»
ability.shieldregenfield = Поле восстановления щита ability.shieldregenfield = Поле восстановления щита
ability.movelightning = Молнии при движении ability.movelightning = Молнии при движении
ability.energyfield = Энергетическое поле: [accent]{0}[] урона ~ [accent]{1}[] блоков / [accent]{2}[] целей
bar.drilltierreq = Требуется бур получше bar.drilltierreq = Требуется бур получше
bar.noresources = Недостаточно ресурсов bar.noresources = Недостаточно ресурсов
@@ -767,6 +785,7 @@ bar.power = Энергия
bar.progress = Прогресс строительства bar.progress = Прогресс строительства
bar.input = Ввод bar.input = Ввод
bar.output = Вывод bar.output = Вывод
bar.strength = [stat]{0}[lightgray]x эффективность
units.processorcontrol = [lightgray]Управляется процессором units.processorcontrol = [lightgray]Управляется процессором
@@ -778,7 +797,7 @@ bullet.frag = [stat]осколочный
bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона
bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам
bullet.knockback = [stat]{0}[lightgray] отбрасывания bullet.knockback = [stat]{0}[lightgray] отбрасывания
bullet.pierce = [stat]{0}[lightgray]x пробитие bullet.pierce = [stat]{0}[lightgray]x пробития
bullet.infinitepierce = [stat]бесконечное пробитие bullet.infinitepierce = [stat]бесконечное пробитие
bullet.healpercent = [stat]{0}[lightgray]% ремонта bullet.healpercent = [stat]{0}[lightgray]% ремонта
bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов
@@ -975,6 +994,8 @@ rules.wavetimer = Интервал волн
rules.waves = Волны rules.waves = Волны
rules.attack = Режим атаки rules.attack = Режим атаки
rules.buildai = Строительство ИИ rules.buildai = Строительство ИИ
rules.corecapture = Захват ядра после уничтожения
rules.polygoncoreprotection = Полигональная защита ядер
rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда)
rules.blockhealthmultiplier = Множитель прочности блоков rules.blockhealthmultiplier = Множитель прочности блоков
rules.blockdamagemultiplier = Множитель урона блоков rules.blockdamagemultiplier = Множитель урона блоков
@@ -1030,6 +1051,7 @@ item.blast-compound.name = Взрывчатая смесь
item.pyratite.name = Пиротит item.pyratite.name = Пиротит
item.metaglass.name = Метастекло item.metaglass.name = Метастекло
item.scrap.name = Металлолом item.scrap.name = Металлолом
liquid.water.name = Вода liquid.water.name = Вода
liquid.slag.name = Шлак liquid.slag.name = Шлак
liquid.oil.name = Нефть liquid.oil.name = Нефть
@@ -1061,6 +1083,11 @@ unit.minke.name = Минке
unit.bryde.name = Брайд unit.bryde.name = Брайд
unit.sei.name = Сейвал unit.sei.name = Сейвал
unit.omura.name = Омура unit.omura.name = Омура
unit.retusa.name = Ретуза
unit.oxynoe.name = Оксино
unit.cyerce.name = Цирс
unit.aegires.name = Эгирес
unit.navanax.name = Наванакс
unit.alpha.name = Альфа unit.alpha.name = Альфа
unit.beta.name = Бета unit.beta.name = Бета
unit.gamma.name = Гамма unit.gamma.name = Гамма
@@ -1121,6 +1148,7 @@ block.sand-water.name = Песок с водой
block.darksand-water.name = Тёмный песок с водой block.darksand-water.name = Тёмный песок с водой
block.char.name = Выжженная земля block.char.name = Выжженная земля
block.dacite.name = Дацит block.dacite.name = Дацит
block.rhyolite.name = Риолит
block.dacite-wall.name = Дацитовая стена block.dacite-wall.name = Дацитовая стена
block.dacite-boulder.name = Дацитовый валун block.dacite-boulder.name = Дацитовый валун
block.ice-snow.name = Заснеженный лёд block.ice-snow.name = Заснеженный лёд
@@ -1138,7 +1166,8 @@ block.spore-cluster.name = Скопление спор
block.metal-floor.name = Металлический пол 1 block.metal-floor.name = Металлический пол 1
block.metal-floor-2.name = Металлический пол 2 block.metal-floor-2.name = Металлический пол 2
block.metal-floor-3.name = Металлический пол 3 block.metal-floor-3.name = Металлический пол 3
block.metal-floor-5.name = Металлический пол 4 block.metal-floor-4.name = Металлический пол 4
block.metal-floor-5.name = Металлический пол 5
block.metal-floor-damaged.name = Повреждённый металлический пол block.metal-floor-damaged.name = Повреждённый металлический пол
block.dark-panel-1.name = Тёмная панель 1 block.dark-panel-1.name = Тёмная панель 1
block.dark-panel-2.name = Тёмная панель 2 block.dark-panel-2.name = Тёмная панель 2
@@ -1228,6 +1257,7 @@ block.solar-panel.name = Солнечная панель
block.solar-panel-large.name = Большая солнечная панель block.solar-panel-large.name = Большая солнечная панель
block.oil-extractor.name = Нефтяная вышка block.oil-extractor.name = Нефтяная вышка
block.repair-point.name = Ремонтный пункт block.repair-point.name = Ремонтный пункт
block.repair-turret.name = Ремонтная турель
block.pulse-conduit.name = Импульсный трубопровод block.pulse-conduit.name = Импульсный трубопровод
block.plated-conduit.name = Укреплённый трубопровод block.plated-conduit.name = Укреплённый трубопровод
block.phase-conduit.name = Фазовый трубопровод block.phase-conduit.name = Фазовый трубопровод
@@ -1244,8 +1274,8 @@ block.thermal-generator.name = Термальный генератор
block.alloy-smelter.name = Плавильня кинетического сплава block.alloy-smelter.name = Плавильня кинетического сплава
block.mender.name = Регенератор block.mender.name = Регенератор
block.mend-projector.name = Ремонтирующий проектор block.mend-projector.name = Ремонтирующий проектор
block.surge-wall.name = Стена из кинетического сплава 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 = Шоковая мина
@@ -1270,6 +1300,12 @@ block.exponential-reconstructor.name = Экспоненциальный реко
block.tetrative-reconstructor.name = Тетративный реконструктор block.tetrative-reconstructor.name = Тетративный реконструктор
block.payload-conveyor.name = Грузовой конвейер block.payload-conveyor.name = Грузовой конвейер
block.payload-router.name = Разгрузочный маршрутизатор block.payload-router.name = Разгрузочный маршрутизатор
block.duct.name = Предметный канал
block.duct-router.name = Канальный маршрутизатор
block.duct-bridge.name = Канальный мост
block.payload-propulsion-tower.name = Грузовая катапульта
block.payload-void.name = Грузовой вакуум
block.payload-source.name = Грузовой источник
block.disassembler.name = Разборщик block.disassembler.name = Разборщик
block.silicon-crucible.name = Кремниевый тигель block.silicon-crucible.name = Кремниевый тигель
block.overdrive-dome.name = Сверхприводный купол block.overdrive-dome.name = Сверхприводный купол
@@ -1289,9 +1325,8 @@ block.memory-cell.name = Ячейка памяти
block.memory-bank.name = Блок памяти block.memory-bank.name = Блок памяти
team.blue.name = Синяя team.blue.name = Синяя
team.crux.name = Красная team.crux.name = Агрессоры
team.sharded.name = Оранжевая team.sharded.name = Расколотые
team.orange.name = Оранжевая
team.derelict.name = Покинутая team.derelict.name = Покинутая
team.green.name = Зелёная team.green.name = Зелёная
team.purple.name = Фиолетовая team.purple.name = Фиолетовая
@@ -1302,7 +1337,7 @@ hint.zoom = [accent]Покрутите колесо мыши[] для прибл
hint.mine = Приблизьтесь к \uf8c4 медной руде и [accent]нажмите[] на неё для ручной добычи. hint.mine = Приблизьтесь к \uf8c4 медной руде и [accent]нажмите[] на неё для ручной добычи.
hint.desktopShoot = Используйте [accent][[Левую кнопку мыши][] для стрельбы. hint.desktopShoot = Используйте [accent][[Левую кнопку мыши][] для стрельбы.
hint.depositItems = Чтобы перенести предметы, перетяните их с вашего корабля в ядро. hint.depositItems = Чтобы перенести предметы, перетяните их с вашего корабля в ядро.
hint.respawn = Чтобы заново появиться в корабле нажмите [accent][[V][]. hint.respawn = Чтобы заново появиться в корабле, нажмите [accent][[V][].
hint.respawn.mobile = Вы переключили управление единицей/структурой. Чтобы заново появиться в корабле, [accent]нажмите на аватар слева сверху.[] hint.respawn.mobile = Вы переключили управление единицей/структурой. Чтобы заново появиться в корабле, [accent]нажмите на аватар слева сверху.[]
hint.desktopPause = Нажмите [accent][[Пробел][] для приостановки и возобновления игры. hint.desktopPause = Нажмите [accent][[Пробел][] для приостановки и возобновления игры.
hint.placeDrill = Выберите в меню справа внизу вкладку \ue85e [accent]Добычи[], затем выберите \uf870 [accent]Бур[] и нажмите на медные вкрапления, чтобы разместить его. hint.placeDrill = Выберите в меню справа внизу вкладку \ue85e [accent]Добычи[], затем выберите \uf870 [accent]Бур[] и нажмите на медные вкрапления, чтобы разместить его.
@@ -1312,6 +1347,7 @@ hint.placeConveyor.mobile = Конвейеры перемещают предме
hint.placeTurret = Установите \uf861 [accent]Турели[] для защиты своей базы от врагов.\n\nТурелям требуются боеприпасы — в данном случае \uf838медные.\nИспользуйте конвейеры и буры для их подачи. hint.placeTurret = Установите \uf861 [accent]Турели[] для защиты своей базы от врагов.\n\nТурелям требуются боеприпасы — в данном случае \uf838медные.\nИспользуйте конвейеры и буры для их подачи.
hint.breaking = Выделите блоки в рамку [accent]правой кнопкой мыши[], чтобы разобрать их. hint.breaking = Выделите блоки в рамку [accent]правой кнопкой мыши[], чтобы разобрать их.
hint.breaking.mobile = Активируйте \ue817 [accent]молоток[] в правом нижнем углу и нажимайте на блоки, чтобы разобрать их. Удерживайте палец в течение секунды и переместите, чтобы разобрать выделением. hint.breaking.mobile = Активируйте \ue817 [accent]молоток[] в правом нижнем углу и нажимайте на блоки, чтобы разобрать их. Удерживайте палец в течение секунды и переместите, чтобы разобрать выделением.
hint.blockInfo = Для просмотра информации о блоке, выберите его в [accent]меню строительства[], затем нажмите на кнопку [accent][[?][] справа.
hint.research = Используйте кнопку \ue875 [accent]Исследований[], чтобы исследовать новые технологии. hint.research = Используйте кнопку \ue875 [accent]Исследований[], чтобы исследовать новые технологии.
hint.research.mobile = Используйте кнопку \ue875 [accent]Исследований[] в \ue88c [accent]Меню[], чтобы исследовать новые технологии. hint.research.mobile = Используйте кнопку \ue875 [accent]Исследований[] в \ue88c [accent]Меню[], чтобы исследовать новые технологии.
hint.unitControl = Зажмите [accent][[Л-Ctrl][] и [accent]нажмите левую кнопку мыши[], чтобы контролировать дружественные единицы и турели. hint.unitControl = Зажмите [accent][[Л-Ctrl][] и [accent]нажмите левую кнопку мыши[], чтобы контролировать дружественные единицы и турели.
@@ -1345,7 +1381,7 @@ item.graphite.description = Используется в электрически
item.sand.description = Используется в производстве других обработанных материалов. item.sand.description = Используется в производстве других обработанных материалов.
item.coal.description = Используется как топливо и в производстве обработанных материалов. item.coal.description = Используется как топливо и в производстве обработанных материалов.
item.coal.details = Похоже, что это окаменевшее растительное вещество, образовавшееся задолго до Посева. item.coal.details = Похоже, что это окаменевшее растительное вещество, образовавшееся задолго до Посева.
item.titanium.description = Широко используется в транспортировке жидкостей, бурах и авиации. item.titanium.description = Широко используется в транспортировке жидкостей, бурах и фабриках.
item.thorium.description = Используется в прочных постройках и как ядерное топливо. item.thorium.description = Используется в прочных постройках и как ядерное топливо.
item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов. item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов.
item.scrap.details = Остатки старых построек и единиц. item.scrap.details = Остатки старых построек и единиц.
@@ -1566,7 +1602,7 @@ logic.nounitbuild = [red]Строительство с помощью проце
lenum.type = Тип постройки/единицы. \nНапример, для маршрутизатора это будет [accent]@router[].\nНе строка. lenum.type = Тип постройки/единицы. \nНапример, для маршрутизатора это будет [accent]@router[].\nНе строка.
lenum.shoot = Стрельба в определённую позицию. lenum.shoot = Стрельба в определённую позицию.
lenum.shootp = Стрельба в единицу/постройку с расчётом скорости. lenum.shootp = Стрельба в единицу/постройку с расчётом скорости.
lenum.configure = Конфигурация постройки, например, предмет сортировки. lenum.config = Конфигурация постройки, например, предмет сортировки.
lenum.enabled = Включён ли блок. lenum.enabled = Включён ли блок.
laccess.color = Цвет осветителя. laccess.color = Цвет осветителя.
@@ -1574,6 +1610,7 @@ laccess.controller = Командующий единицей. Если един
laccess.dead = Является ли единица/постройка неработающей или несуществующей. laccess.dead = Является ли единица/постройка неработающей или несуществующей.
laccess.controlled = Возвращает:\n[accent]@ctrlProcessor[] если единица управляется процессором\n[accent]@ctrlPlayer[] если единица/постройка управляется игроком\n[accent]@ctrlFormation[] если единица в строю\nВ противном случае — 0. laccess.controlled = Возвращает:\n[accent]@ctrlProcessor[] если единица управляется процессором\n[accent]@ctrlPlayer[] если единица/постройка управляется игроком\n[accent]@ctrlFormation[] если единица в строю\nВ противном случае — 0.
laccess.commanded = [red]Устарело. Будет удалено![]\nВместо этого, используйте [accent]controlled[]. laccess.commanded = [red]Устарело. Будет удалено![]\nВместо этого, используйте [accent]controlled[].
laccess.progress = Прогресс действия от 0 до 1. Возвращает прогресс производства, перезарядку турели или прогресс постройки.
graphicstype.clear = Заливка дисплея цветом. graphicstype.clear = Заливка дисплея цветом.
graphicstype.color = Установка цвета для следующих операций отрисовки. graphicstype.color = Установка цвета для следующих операций отрисовки.
@@ -1605,9 +1642,15 @@ lenum.min = Минимальное из двух чисел.
lenum.max = Максимальное из двух чисел. lenum.max = Максимальное из двух чисел.
lenum.angle = Угол вектора в градусах. lenum.angle = Угол вектора в градусах.
lenum.len = Длина вектора. lenum.len = Длина вектора.
lenum.sin = Синус, в градусах. lenum.sin = Синус, в градусах.
lenum.cos = Косинус, в градусах. lenum.cos = Косинус, в градусах.
lenum.tan = Тангенс, в градусах. lenum.tan = Тангенс, в градусах.
lenum.asin = Арксинус, в градусах.
lenum.acos = Арккосинус, в градусах.
lenum.atan = Арктангенс, в градусах.
#это не ошибка, поищите 'обозначение диапазонов' #это не ошибка, поищите 'обозначение диапазонов'
lenum.rand = Случайное число в диапазоне [0, значение). lenum.rand = Случайное число в диапазоне [0, значение).
lenum.log = Натуральный логарифм (ln). lenum.log = Натуральный логарифм (ln).

File diff suppressed because it is too large Load Diff

View File

@@ -576,13 +576,13 @@ sectors.vulnerable = [scarlet]Dayanıksız
sectors.underattack = [scarlet]Saldırı Altında! [accent]{0}% hasarlı sectors.underattack = [scarlet]Saldırı Altında! [accent]{0}% hasarlı
sectors.survives = [accent]{0} Dalgaya dayanabilir! sectors.survives = [accent]{0} Dalgaya dayanabilir!
sectors.go = Git sectors.go = Git
sector.curcapture = Sektör Yakalandı sector.curcapture = Sektör Elegeçirildi
sector.curlost = Sektör Kaybedildi sector.curlost = Sektör Kaybedildi
sector.missingresources = [scarlet]Yetersiz Çekirdek Kaynakları sector.missingresources = [scarlet]Yetersiz Çekirdek Kaynakları
sector.attacked = Sektör [accent]{0}[white] saldırı altında! sector.attacked = Sektör [accent]{0}[white] saldırı altında!
sector.lost = Sektör [accent]{0}[white] kaybedildi! sector.lost = Sektör [accent]{0}[white] kaybedildi!
#note: the missing space in the line below is intentional #note: the missing space in the line below is intentional
sector.captured = Sektör [accent]{0}[white]yakalandı! sector.captured = Sektör [accent]{0}[white]elegeçirildi!
sector.changeicon = İkon Değiştir sector.changeicon = İkon Değiştir
threat.low = Düşük threat.low = Düşük
@@ -1292,14 +1292,14 @@ block.additive-reconstructor.name = Eklemeli Yeniden Yapılandırıcı
block.multiplicative-reconstructor.name = Çarpmalı Yeniden Yapılandırıcı block.multiplicative-reconstructor.name = Çarpmalı Yeniden Yapılandırıcı
block.exponential-reconstructor.name = Üstel Yeniden Yapılandırıcı block.exponential-reconstructor.name = Üstel Yeniden Yapılandırıcı
block.tetrative-reconstructor.name = Dörtlü Yeniden Yapılandırıcı block.tetrative-reconstructor.name = Dörtlü Yeniden Yapılandırıcı
block.payload-conveyor.name = Yük Konveyörü block.payload-conveyor.name = Kargo Konveyörü
block.payload-router.name = Yük Yönlendirici block.payload-router.name = Kargo Yönlendirici
block.duct.name = Tüp block.duct.name = Tüp
block.duct-router.name = Tüp Yönlendirici block.duct-router.name = Tüp Yönlendirici
block.duct-bridge.name = Tüp Köprü block.duct-bridge.name = Tüp Köprü
block.payload-propulsion-tower.name = Yük Aktarma Kulesi block.payload-propulsion-tower.name = Yük Aktarma Kulesi
block.payload-void.name = Yük Yokedici block.payload-void.name = Kargo Yokedici
block.payload-source.name = Yük Kaynağı block.payload-source.name = Kargo Kaynağı
block.disassembler.name = Sökücü block.disassembler.name = Sökücü
block.silicon-crucible.name = Büyük Silikon Fırını block.silicon-crucible.name = Büyük Silikon Fırını
block.overdrive-dome.name = Hızlandırma Kubbesi block.overdrive-dome.name = Hızlandırma Kubbesi
@@ -1308,7 +1308,7 @@ block.block-forge.name = Blok Fabrikası
block.block-loader.name = Blok Yükleyici block.block-loader.name = Blok Yükleyici
block.block-unloader.name = Blok Boşaltıcı block.block-unloader.name = Blok Boşaltıcı
block.interplanetary-accelerator.name = Gezegenler Arası Hızlandırıcı block.interplanetary-accelerator.name = Gezegenler Arası Hızlandırıcı
#ama tüp ne aga -Anti Dragon
block.switch.name = Düğme block.switch.name = Düğme
block.micro-processor.name = Mikro İşlemci block.micro-processor.name = Mikro İşlemci
block.logic-processor.name = İşlemci block.logic-processor.name = İşlemci
@@ -1456,7 +1456,7 @@ block.underflow-gate.description = Taşma geçidinin zıttıdır. Sol ve sağ ta
block.mass-driver.description = En gelişmiş materyal taşıma bloğu. bir miktar materyalı alır ve onları uzak mesafedeki bir başka kütle sürücüsüne ateşler. Çalışması için enerji gerekir. block.mass-driver.description = En gelişmiş materyal taşıma bloğu. bir miktar materyalı alır ve onları uzak mesafedeki bir başka kütle sürücüsüne ateşler. Çalışması için enerji gerekir.
block.mechanical-pump.description = Hiç enerji harcamayan, düşük çıktılı, ucuz bir pompa. block.mechanical-pump.description = Hiç enerji harcamayan, düşük çıktılı, ucuz bir pompa.
block.rotary-pump.description = Daha gelişmiş bir pompa. Daha fazla sıvı depolar ama çalışması için enerji gerekir. block.rotary-pump.description = Daha gelişmiş bir pompa. Daha fazla sıvı depolar ama çalışması için enerji gerekir.
block.thermal-pump.description = En iyi pompa. block.thermal-pump.description = En iyi pompa. Çalışması için enerji gerekir.
block.conduit.description = Temel sıvı taşıma bloğu. Sıvıları ileri taşır. Pompalar ve diğer borularla birlikte kullanılır. block.conduit.description = Temel sıvı taşıma bloğu. Sıvıları ileri taşır. Pompalar ve diğer borularla birlikte kullanılır.
block.pulse-conduit.description = Gelişmiş bir sıvı taşıma bloğu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır. block.pulse-conduit.description = Gelişmiş bir sıvı taşıma bloğu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır.
block.plated-conduit.description = Sıvıları dalga borusuyla aynı güçte taşır ancak daha fazla zırha sahiptir. Borular dışında başka bir şekilde yandan sıvı kabul etmez.\nDaha az sızıntı yapar. block.plated-conduit.description = Sıvıları dalga borusuyla aynı güçte taşır ancak daha fazla zırha sahiptir. Borular dışında başka bir şekilde yandan sıvı kabul etmez.\nDaha az sızıntı yapar.
@@ -1465,9 +1465,9 @@ block.liquid-tank.description = Çok miktarda sıvıyı depolar. İhtiyaçları
block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır. block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır.
block.bridge-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları her türlü arazi veya binanın üzerinden üç bloğa kadar uzağa taşıyabilir. block.bridge-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları her türlü arazi veya binanın üzerinden üç bloğa kadar uzağa taşıyabilir.
block.phase-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları kendisine bağlı başka bir faz borusuna ışınlamak için enerji kullanır. block.phase-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları kendisine bağlı başka bir faz borusuna ışınlamak için enerji kullanır.
block.power-node.description = Bağlı düğümlere enerji sağlar. Ayrıca dibindeki bloklardan da enerji alıp onlara enerji verebilir. block.power-node.description = Bağlı noktalara enerji aktarır. Ayrıca dibindeki bloklardan da enerji alıp onlara enerji verebilir.
block.power-node-large.description = Daha fazla menzil ve bağlantıya sahip daha gelişmiş bir güç düğümü block.power-node-large.description = Daha fazla menzil ve bağlantıya sahip daha gelişmiş bir enerji noktası.
block.surge-tower.description = Daha az bağlantı sayısına sahip oldukça uzun menzilli bir güç düğümü. block.surge-tower.description = Daha az bağlantı sayısına sahip oldukça uzun menzilli bir enerji noktası.
block.diode.description = Pil gücü, bu bloktan yalnızca diğer tarafta daha az güç depolandığında sadece tek bir yöne akabilir. block.diode.description = Pil gücü, bu bloktan yalnızca diğer tarafta daha az güç depolandığında sadece tek bir yöne akabilir.
block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açığında sakladığı enerjiyi salar. block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açığında sakladığı enerjiyi salar.
block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar. block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar.
@@ -1570,9 +1570,9 @@ unit.minke.description = Yakındaki düşmanlara basit mermi ve toplarla saldır
unit.bryde.description = Düşmanlara uzun menzil havanıyla saldırır. unit.bryde.description = Düşmanlara uzun menzil havanıyla saldırır.
unit.sei.description = Düşmanlara füze atar ve devasa zırh delici mermilerle saldırır. unit.sei.description = Düşmanlara füze atar ve devasa zırh delici mermilerle saldırır.
unit.omura.description = Uzun menzil bir ışın atıcıya sahiptir. Mermisi nerdeyse her bolğu delebilir. Flare üretir. unit.omura.description = Uzun menzil bir ışın atıcıya sahiptir. Mermisi nerdeyse her bolğu delebilir. Flare üretir.
unit.alpha.description = Çekirdeği korur. Bina inşa eder unit.alpha.description = Çekirdeği korur. Bina inşa eder.
unit.beta.description = Çekirdeği korur. Bina inşa eder unit.beta.description = Çekirdeği korur. Bina inşa eder.
unit.gamma.description = Çekirdeği korur. Bina inşa eder unit.gamma.description = Çekirdeği korur. Bina inşa eder.
lst.read = Bağlı hafıza kutusundaki numarayı okur. lst.read = Bağlı hafıza kutusundaki numarayı okur.
lst.write = Bağlı hafıza kutuaundaki numaraya yazar. lst.write = Bağlı hafıza kutuaundaki numaraya yazar.

View File

@@ -67,6 +67,14 @@ schematic.delete.confirm = Bản thiết kế này sẽ bị xóa hoàn toàn.
schematic.rename = Đổi tên bản thiết kế schematic.rename = Đổi tên bản thiết kế
schematic.info = {0}x{1}, {2} khối schematic.info = {0}x{1}, {2} khối
schematic.disabled = [scarlet]Tính năng bản thiết kế đã bị tắt[]\nBạn không được sử dụng bản thiết kế trong [accent]bản đồ[] hoặc [accent]máy chủ. schematic.disabled = [scarlet]Tính năng bản thiết kế đã bị tắt[]\nBạn không được sử dụng bản thiết kế trong [accent]bản đồ[] hoặc [accent]máy chủ.
schematic.tags = Thẻ:
schematic.edittags = Chỉnh sửa thẻ
schematic.addtag = Thêm thẻ
schematic.texttag = Thẻ văn bản
schematic.icontag = Thẻ icon
schematic.renametag = Đổi tên thẻ
schematic.tagdelconfirm = Xóa thẻ này?
schematic.tagexists = Thẻ đã tồn tại.
stats = Thống kê stats = Thống kê
stat.wave = Đợt đã vượt qua:[accent] {0} stat.wave = Đợt đã vượt qua:[accent] {0}
@@ -220,6 +228,8 @@ trace.ip = IP: [accent]{0}
trace.id = ID: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = Mobile Client: [accent]{0} trace.mobile = Mobile Client: [accent]{0}
trace.modclient = Custom Client: [accent]{0} trace.modclient = Custom Client: [accent]{0}
trace.times.joined = Số lần tham gia: [accent]{0}
trace.times.kicked = Số lần bị kick: [accent]{0}
invalidid = Client ID không hợp lệ! Vui lòng gửi báo cáo lỗi. invalidid = Client ID không hợp lệ! Vui lòng gửi báo cáo lỗi.
server.bans = Cấm server.bans = Cấm
server.bans.none = Không có người chơi nào bị cấm! server.bans.none = Không có người chơi nào bị cấm!
@@ -304,7 +314,6 @@ data.exported = Dữ liệu đã được xuất.
data.invalid = Đây không phải dữ liệu trò chơi hợp lệ. data.invalid = Đây không phải dữ liệu trò chơi hợp lệ.
data.import.confirm = Nhập dữ liệu bên ngoài sẽ ghi đè[scarlet] tất cả[] dữ liệu trò chơi hiện tại.\n[accent]Điều này không thể hoàn tác![]\n\nSau khi dữ liệu được nhập, trò chơi của bạn sẽ thoát ngay lập tức. data.import.confirm = Nhập dữ liệu bên ngoài sẽ ghi đè[scarlet] tất cả[] dữ liệu trò chơi hiện tại.\n[accent]Điều này không thể hoàn tác![]\n\nSau khi dữ liệu được nhập, trò chơi của bạn sẽ thoát ngay lập tức.
quit.confirm = Bạn có chắc muốn thoát? quit.confirm = Bạn có chắc muốn thoát?
quit.confirm.tutorial = Bạn có chắc chắn biết mình đang làm gì không?\nHướng dẫn có thể được thực hiện lại trong[accent] Cài đặt->Trò chơi>Thực hiện lại hướng dẫn.[]
loading = [accent]Đang tải... loading = [accent]Đang tải...
reloading = [accent]Đang tải lại Mods... reloading = [accent]Đang tải lại Mods...
saving = [accent]Đang lưu... saving = [accent]Đang lưu...
@@ -451,6 +460,7 @@ toolmode.drawteams = Draw Teams
toolmode.drawteams.description = Draw teams instead of blocks. toolmode.drawteams.description = Draw teams instead of blocks.
filters.empty = [lightgray]Không có bộ lọc! Thêm một cái bằng nút bên dưới. filters.empty = [lightgray]Không có bộ lọc! Thêm một cái bằng nút bên dưới.
filter.distort = Cong vẹo filter.distort = Cong vẹo
filter.noise = Nhiễu filter.noise = Nhiễu
filter.enemyspawn = Khu vực xuất hiện của kẻ thù filter.enemyspawn = Khu vực xuất hiện của kẻ thù
@@ -467,6 +477,7 @@ filter.clear = Xóa
filter.option.ignore = Bỏ qua filter.option.ignore = Bỏ qua
filter.scatter = Phân tán filter.scatter = Phân tán
filter.terrain = Địa hình filter.terrain = Địa hình
filter.option.scale = Kích thước filter.option.scale = Kích thước
filter.option.chance = Tỷ lệ filter.option.chance = Tỷ lệ
filter.option.mag = Độ lớn filter.option.mag = Độ lớn
@@ -475,11 +486,13 @@ filter.option.circle-scale = Độ lớn vòng tròn
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.angle = Góc filter.option.angle = Góc
filter.option.rotate = Quay
filter.option.amount = Số lượng filter.option.amount = Số lượng
filter.option.block = Khối filter.option.block = Khối
filter.option.floor = Nền filter.option.floor = Nền
filter.option.flooronto = Nền thay thế filter.option.flooronto = Nền thay thế
filter.option.target = Mục tiêu filter.option.target = Mục tiêu
filter.option.replacement = Thay thế
filter.option.wall = Tường filter.option.wall = Tường
filter.option.ore = Quặng filter.option.ore = Quặng
filter.option.floor2 = Nền phụ filter.option.floor2 = Nền phụ
@@ -496,6 +509,7 @@ load = Tải
save = Lưu save = Lưu
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Khởi động lại trò chơi của bạn để cài đặt ngôn ngữ có hiệu lực. language.restart = Khởi động lại trò chơi của bạn để cài đặt ngôn ngữ có hiệu lực.
@@ -528,7 +542,7 @@ launch.from = Đang phóng từ: [accent]{0}
launch.destination = Đích đến: {0} launch.destination = Đích đến: {0}
configure.invalid = Số lượng phải là số trong khoảng 0 đến {0}. configure.invalid = Số lượng phải là số trong khoảng 0 đến {0}.
add = Thêm... add = Thêm...
boss.health = Máu Boss guardian = Guardian
connectfail = [scarlet]Lỗi kết nối:\n\n[accent]{0} connectfail = [scarlet]Lỗi kết nối:\n\n[accent]{0}
error.unreachable = Không thể truy cập máy chủ.\nKiểm tra lại xem địa chỉ có đúng không? error.unreachable = Không thể truy cập máy chủ.\nKiểm tra lại xem địa chỉ có đúng không?
@@ -572,6 +586,7 @@ sector.attacked = Khu vực [accent]{0}[white] đang bị tấn công!
sector.lost = Khu vực [accent]{0}[white] đã mất! sector.lost = Khu vực [accent]{0}[white] đã mất!
#note: the missing space in the line below is intentional #note: the missing space in the line below is intentional
sector.captured = Khu vực [accent]{0}[white]đã chiếm! sector.captured = Khu vực [accent]{0}[white]đã chiếm!
sector.changeicon = Thay đổi icon
threat.low = Thấp threat.low = Thấp
threat.medium = Trung bình threat.medium = Trung bình
@@ -584,7 +599,6 @@ planets = Hành tinh
planet.serpulo.name = Serpulo planet.serpulo.name = Serpulo
planet.sun.name = Mặt trời planet.sun.name = Mặt trời
#Why we should translate this ??
sector.impact0078.name = Impact 0078 sector.impact0078.name = Impact 0078
sector.groundZero.name = Ground Zero sector.groundZero.name = Ground Zero
sector.craters.name = The Craters sector.craters.name = The Craters
@@ -621,16 +635,17 @@ sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ve
status.burning.name = Cháy status.burning.name = Cháy
status.freezing.name = Đóng băng status.freezing.name = Đóng băng
status.wet.name = Wet status.wet.name = Ẩm
status.muddy.name = Muddy status.muddy.name = Muddy
status.melting.name = Tan chảy status.melting.name = Tan chảy
status.sapped.name = Sapped status.sapped.name = Ăn mòn
status.electrified.name = Electrified
status.spore-slowed.name = Spore Slowed status.spore-slowed.name = Spore Slowed
status.tarred.name = Tarred status.tarred.name = Tarred
status.overclock.name = Overclock status.overclock.name = Overclock
status.shocked.name = Shock status.shocked.name = Shock
status.blasted.name = Nổ status.blasted.name = Nổ
status.unmoving.name = Unmoving status.unmoving.name = Bất động
settings.language = Ngôn ngữ settings.language = Ngôn ngữ
settings.data = Dữ liệu trò chơi settings.data = Dữ liệu trò chơi
@@ -653,6 +668,7 @@ settings.clearcampaignsaves.confirm = Bạn có chắc muốn xóa toàn bộ d
paused = [accent]< Tạm dừng > paused = [accent]< Tạm dừng >
clear = Xóa clear = Xóa
banned = [scarlet]Cấm banned = [scarlet]Cấm
unsupported.environment = [scarlet]Môi trường không phù hợp
yes = yes =
no = Không no = Không
info.title = Thông tin info.title = Thông tin
@@ -662,12 +678,14 @@ unit.nobuild = [scarlet]Quân lính/Công trình không thể xây dựng
lastaccessed = [lightgray]Truy cập lần cuối: {0} lastaccessed = [lightgray]Truy cập lần cuối: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <Mở bản đồ để hiện thị>
stat.description = Mô tả stat.description = Mô tả
stat.input = Đầu vào stat.input = Đầu vào
stat.output = Sản phẩm stat.output = Sản phẩm
stat.booster = Tăng cường stat.booster = Tăng cường
stat.tiles = Yêu cầu khu vực stat.tiles = Yêu cầu khu vực
stat.affinities = Phù hợp stat.affinities = Phù hợp
stat.opposites = Đối diện
stat.powercapacity = Dung lượng pin stat.powercapacity = Dung lượng pin
stat.powershot = Năng lượng/Phát bắn stat.powershot = Năng lượng/Phát bắn
stat.damage = Sát thương stat.damage = Sát thương
@@ -690,6 +708,7 @@ stat.memorycapacity = Dung lượng bộ nhớ
stat.basepowergeneration = Năng lượng tạo ra (cơ bản) stat.basepowergeneration = Năng lượng tạo ra (cơ bản)
stat.productiontime = Thời gian sản xuất stat.productiontime = Thời gian sản xuất
stat.repairtime = Thời gian sửa stat.repairtime = Thời gian sửa
stat.repairspeed = Tốc độ sửa
stat.weapons = Vũ khí stat.weapons = Vũ khí
stat.bullet = Đạn stat.bullet = Đạn
stat.speedincrease = Tăng tốc stat.speedincrease = Tăng tốc
@@ -735,13 +754,15 @@ stat.speedmultiplier = Hệ số tốc độ
stat.reloadmultiplier = Reload Multiplier stat.reloadmultiplier = Reload Multiplier
stat.buildspeedmultiplier = Hệ số tốc độ xây dựng stat.buildspeedmultiplier = Hệ số tốc độ xây dựng
stat.reactive = Phản ứng. stat.reactive = Phản ứng.
stat.healing = Sửa chữa
ability.forcefield = Tạo khiên ability.forcefield = Tạo khiên
ability.repairfield = Sửa chữa/Xây dựng ability.repairfield = Sửa chữa/Xây dựng
ability.statusfield = Status Field ability.statusfield = {0} Status Field
ability.unitspawn = Sản xuất {0} ability.unitspawn = Sản xuất {0}
ability.shieldregenfield = Tạo khiên nhỏ ability.shieldregenfield = Tạo khiên nhỏ
ability.movelightning = Movement Lightning ability.movelightning = Movement Lightning
ability.energyfield = Energy Field: [accent]{0}[] damage ~ [accent]{1}[] blocks / [accent]{2}[] targets
bar.drilltierreq = Cần máy khoan tốt hơn bar.drilltierreq = Cần máy khoan tốt hơn
bar.noresources = Thiếu tài nguyên bar.noresources = Thiếu tài nguyên
@@ -764,6 +785,7 @@ bar.power = Năng lượng
bar.progress = Đang xây dựng bar.progress = Đang xây dựng
bar.input = Đầu vào bar.input = Đầu vào
bar.output = Sản phẩm bar.output = Sản phẩm
bar.strength = [stat]{0}[lightgray]x strength
units.processorcontrol = [lightgray]Điều khiển bởi bộ xử lý units.processorcontrol = [lightgray]Điều khiển bởi bộ xử lý
@@ -773,12 +795,11 @@ bullet.incendiary = [stat]cháy
bullet.homing = [stat]truy đuổi bullet.homing = [stat]truy đuổi
bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối
bullet.frag = [stat]phá mảnh bullet.frag = [stat]phá mảnh
# I am not sure about this...
bullet.lightning = [stat]{0}[lightgray]x tia chớp ~ [stat]{1}[lightgray] sát thương bullet.lightning = [stat]{0}[lightgray]x tia chớp ~ [stat]{1}[lightgray] sát thương
bullet.knockback = [stat]{0}[lightgray] bật lùi bullet.knockback = [stat]{0}[lightgray] bật lùi
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
bullet.infinitepierce = [stat]xuyên thấu bullet.infinitepierce = [stat]xuyên thấu
bullet.healpercent = [stat]{0}[lightgray]% sửa cha bullet.healpercent = [stat]{0}[lightgray]% sửa cha
bullet.multiplier = [stat]{0}[lightgray]x lượng đạn bullet.multiplier = [stat]{0}[lightgray]x lượng đạn
bullet.reload = [stat]{0}[lightgray]x tốc độ bắn bullet.reload = [stat]{0}[lightgray]x tốc độ bắn
@@ -815,6 +836,7 @@ setting.shadows.name = Bóng đổ
setting.blockreplace.name = Tự động đề xuất khối setting.blockreplace.name = Tự động đề xuất khối
setting.linear.name = Lọc tuyến tính setting.linear.name = Lọc tuyến tính
setting.hints.name = Gợi ý setting.hints.name = Gợi ý
setting.logichints.name = Gợi ý Logic
setting.flow.name = Hiện thị tốc độ chuyền tài nguyên setting.flow.name = Hiện thị tốc độ chuyền tài nguyên
setting.backgroundpause.name = Tạm dừng trong nền setting.backgroundpause.name = Tạm dừng trong nền
setting.buildautopause.name = Tự động dừng xây dựng setting.buildautopause.name = Tự động dừng xây dựng
@@ -972,6 +994,8 @@ rules.wavetimer = Đếm ngược đợt
rules.waves = Đợt rules.waves = Đợt
rules.attack = Chế độ tấn công rules.attack = Chế độ tấn công
rules.buildai = AI Xây dựng rules.buildai = AI Xây dựng
rules.corecapture = Chiếm căn cứ khi phá hủy
rules.polygoncoreprotection = Bảo vệ lõi kiểu đa giác.
rules.enemyCheat = Tài nguyên vô hạn (kẻ địch) rules.enemyCheat = Tài nguyên vô hạn (kẻ địch)
rules.blockhealthmultiplier = Hệ số độ bền khối rules.blockhealthmultiplier = Hệ số độ bền khối
rules.blockdamagemultiplier = Hệ số sát thương của khối rules.blockdamagemultiplier = Hệ số sát thương của khối
@@ -1008,6 +1032,7 @@ content.item.name = Vật phẩm
content.liquid.name = Chất lỏng content.liquid.name = Chất lỏng
content.unit.name = Quân lính content.unit.name = Quân lính
content.block.name = Khối content.block.name = Khối
content.status.name = Trạng thái hiệu ứng
content.sector.name = Khu vực content.sector.name = Khu vực
item.copper.name = Đồng item.copper.name = Đồng
@@ -1026,12 +1051,12 @@ item.blast-compound.name = Chất nổ
item.pyratite.name = Nhiệt thạch item.pyratite.name = Nhiệt thạch
item.metaglass.name = Thuỷ tinh item.metaglass.name = Thuỷ tinh
item.scrap.name = Phế liệu item.scrap.name = Phế liệu
liquid.water.name = Nước liquid.water.name = Nước
liquid.slag.name = Xỉ nóng chảy liquid.slag.name = Xỉ nóng chảy
liquid.oil.name = Dầu liquid.oil.name = Dầu
liquid.cryofluid.name = Chất làm lạnh liquid.cryofluid.name = Chất làm lạnh
#Why we should translate this ???
unit.dagger.name = Dagger unit.dagger.name = Dagger
unit.mace.name = Mace unit.mace.name = Mace
unit.fortress.name = Fortress unit.fortress.name = Fortress
@@ -1058,6 +1083,11 @@ unit.minke.name = Minke
unit.bryde.name = Bryde unit.bryde.name = Bryde
unit.sei.name = Sei unit.sei.name = Sei
unit.omura.name = Omura unit.omura.name = Omura
unit.retusa.name = Retusa
unit.oxynoe.name = Oxynoe
unit.cyerce.name = Cyerce
unit.aegires.name = Aegires
unit.navanax.name = Navanax
unit.alpha.name = Alpha unit.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
@@ -1118,6 +1148,7 @@ block.sand-water.name = Nước cát
block.darksand-water.name = Nước cát đen block.darksand-water.name = Nước cát đen
block.char.name = Char block.char.name = Char
block.dacite.name = Đá Dacit block.dacite.name = Đá Dacit
block.rhyolite.name = Đá Ryolit
block.dacite-wall.name = Tường Dacit block.dacite-wall.name = Tường Dacit
block.dacite-boulder.name = Tảng đá Dacit block.dacite-boulder.name = Tảng đá Dacit
block.ice-snow.name = Băng tuyết block.ice-snow.name = Băng tuyết
@@ -1135,8 +1166,9 @@ block.spore-cluster.name = Cụm bào tử
block.metal-floor.name = Nền kim loại 1 block.metal-floor.name = Nền kim loại 1
block.metal-floor-2.name = Nền kim loại 2 block.metal-floor-2.name = Nền kim loại 2
block.metal-floor-3.name = Nền kim loại 3 block.metal-floor-3.name = Nền kim loại 3
block.metal-floor-5.name = Nền kim loại 4 block.metal-floor-4.name = Nền kim loại 4
block.metal-floor-damaged.name = Nền kim loại bị hư hỏng block.metal-floor-5.name = Nền kim loại 5
block.metal-floor-damaged.name = Nền kim loại hư hỏng
block.dark-panel-1.name = Nền tối 1 block.dark-panel-1.name = Nền tối 1
block.dark-panel-2.name = Nền tối 2 block.dark-panel-2.name = Nền tối 2
block.dark-panel-3.name = Nền tối 3 block.dark-panel-3.name = Nền tối 3
@@ -1225,6 +1257,7 @@ block.solar-panel.name = Pin mặt trời
block.solar-panel-large.name = Pin mặt trời lớn block.solar-panel-large.name = Pin mặt trời lớn
block.oil-extractor.name = Máy khoan dầu block.oil-extractor.name = Máy khoan dầu
block.repair-point.name = Điểm sửa chữa block.repair-point.name = Điểm sửa chữa
block.repair-turret.name = Súng sữa chữa
block.pulse-conduit.name = Ống dẫn titan block.pulse-conduit.name = Ống dẫn titan
block.plated-conduit.name = Ống dẫn bọc giáp block.plated-conduit.name = Ống dẫn bọc giáp
block.phase-conduit.name = Ống dẫn Phase block.phase-conduit.name = Ống dẫn Phase
@@ -1267,6 +1300,12 @@ block.exponential-reconstructor.name = Máy nâng cấp quân đội cấp 4
block.tetrative-reconstructor.name = Máy nâng cấp quân đội cấp 5 block.tetrative-reconstructor.name = Máy nâng cấp quân đội cấp 5
block.payload-conveyor.name = Băng chuyền khối hàng block.payload-conveyor.name = Băng chuyền khối hàng
block.payload-router.name = Bộ định tuyến khối hàng block.payload-router.name = Bộ định tuyến khối hàng
block.duct.name = Duct
block.duct-router.name = Duct Router
block.duct-bridge.name = Duct Bridge
block.payload-propulsion-tower.name = Payload Propulsion Tower
block.payload-void.name = Payload Void
block.payload-source.name = Payload Source
block.disassembler.name = Máy phân tách lớn block.disassembler.name = Máy phân tách lớn
block.silicon-crucible.name = Máy nấu Silicon lớn block.silicon-crucible.name = Máy nấu Silicon lớn
block.overdrive-dome.name = Máy tăng tốc lớn block.overdrive-dome.name = Máy tăng tốc lớn
@@ -1286,10 +1325,9 @@ block.memory-cell.name = Bộ nhớ
block.memory-bank.name = Bộ nhớ lớn block.memory-bank.name = Bộ nhớ lớn
team.blue.name = Xanh dương team.blue.name = Xanh dương
team.crux.name = Đỏ team.crux.name = Crux
team.sharded.name = Cam team.sharded.name = Sharded
team.orange.name = Cam team.derelict.name = Không xác định
team.derelict.name = không xác định
team.green.name = Xanh lá cây team.green.name = Xanh lá cây
team.purple.name = Tím team.purple.name = Tím
@@ -1309,6 +1347,7 @@ hint.placeConveyor.mobile = Băng chuyền di chuyển các vật phẩm từ kh
hint.placeTurret = Đặt \uf861 [accent]Súng[] để bảo vệ căn cứ của bạn khỏi kẻ thù.\n\nSúng cần đạn - trong trường hợp này sử dụng \uf838Đồng.\nSử dụng băng chuyền và máy khoan để cung cấp cho chúng. hint.placeTurret = Đặt \uf861 [accent]Súng[] để bảo vệ căn cứ của bạn khỏi kẻ thù.\n\nSúng cần đạn - trong trường hợp này sử dụng \uf838Đồng.\nSử dụng băng chuyền và máy khoan để cung cấp cho chúng.
hint.breaking = [accent]Chuột phải[] và kéo để phá vỡ các khối. hint.breaking = [accent]Chuột phải[] và kéo để phá vỡ các khối.
hint.breaking.mobile = Kích hoạt \ue817 [accent]Cây búa[] ở phía dưới cùng bên phải và nhấn để phá vỡ các khối.\n\nGiữ ngón tay của bạn trong một giây và kéo để phá khối trong vùng được chọn. hint.breaking.mobile = Kích hoạt \ue817 [accent]Cây búa[] ở phía dưới cùng bên phải và nhấn để phá vỡ các khối.\n\nGiữ ngón tay của bạn trong một giây và kéo để phá khối trong vùng được chọn.
hint.blockInfo = Xem thông tin của một khối bằng cách chọn nó trong [accent]menu xây dựng[], Sau đó chọn nút [accent][[?][] ở bên phải.
hint.research = Sử dụng nút \ue875 [accent]Nghiên cứu[] để nghiên cứu công nghệ mới. hint.research = Sử dụng nút \ue875 [accent]Nghiên cứu[] để nghiên cứu công nghệ mới.
hint.research.mobile = Sử dụng nút \ue875 [accent]Nghiên cứu[] trong \ue88c [accent]Menu[] để nghiên cứu công nghệ mới. hint.research.mobile = Sử dụng nút \ue875 [accent]Nghiên cứu[] trong \ue88c [accent]Menu[] để nghiên cứu công nghệ mới.
hint.unitControl = Giữ [accent][[L-ctrl][] và [accent]click[] để điều khiển quân lính của bạn hoặc súng. hint.unitControl = Giữ [accent][[L-ctrl][] và [accent]click[] để điều khiển quân lính của bạn hoặc súng.
@@ -1330,6 +1369,7 @@ hint.generator = \uf879 [accent]Máy phát điện đốt cháy[] đốt than v
hint.guardian = [accent]Boss[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng súng tiên tiến hơn hoặc sử dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss. hint.guardian = [accent]Boss[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng súng tiên tiến hơn hoặc sử dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss.
hint.coreUpgrade = Các căn cứ có thể được nâng cấp bằng cách [accent]đặt căn cứ cấp cao hơn trên chúng[].\n\nĐặt một căn cứ  [accent]Trụ sở[] trên căn cứ  [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó. hint.coreUpgrade = Các căn cứ có thể được nâng cấp bằng cách [accent]đặt căn cứ cấp cao hơn trên chúng[].\n\nĐặt một căn cứ  [accent]Trụ sở[] trên căn cứ  [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó.
hint.presetLaunch = Khác khu vực đáp [accent] xám[], như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các khu vực lân cận.\n\n[accent]Các khu vực được đánh số[], chẳng hạn như cái này, là [accent]không bắt buộc[]. hint.presetLaunch = Khác khu vực đáp [accent] xám[], như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các khu vực lân cận.\n\n[accent]Các khu vực được đánh số[], chẳng hạn như cái này, là [accent]không bắt buộc[].
hint.coreIncinerate = Sau khi căn cứ đầy vật phẩm, bất kì vật phẩm vào thuộc loại đó nhận được sẽ bị [accent]tiêu hủy[].
hint.coopCampaign = Khi chơi chiến dịch[accent]co-op[], các vật phẩm được sản xuất trong bản đồ hiện tại cũng sẽ được gửi [accent]đến các khu vực của bạn[].\n\nBất kỳ nghiên cứu mới nào được thực hiện đều được lưu lại. hint.coopCampaign = Khi chơi chiến dịch[accent]co-op[], các vật phẩm được sản xuất trong bản đồ hiện tại cũng sẽ được gửi [accent]đến các khu vực của bạn[].\n\nBất kỳ nghiên cứu mới nào được thực hiện đều được lưu lại.
item.copper.description = Dùng trong tất cả các khu xây dựng và các loại đạn dược. item.copper.description = Dùng trong tất cả các khu xây dựng và các loại đạn dược.
@@ -1341,7 +1381,7 @@ item.graphite.description = Dùng trong các bộ phận điện và đạn dư
item.sand.description = Dùng để sản xuất các vật liệu tinh chế khác. item.sand.description = Dùng để sản xuất các vật liệu tinh chế khác.
item.coal.description = Dùng để sản xuất nhiên liệu và nguyên liệu sản xuất vật liệu tinh chế. item.coal.description = Dùng để sản xuất nhiên liệu và nguyên liệu sản xuất vật liệu tinh chế.
item.coal.details = Có vẻ là vật chất hóa thạch của thực vật, hình thành từ rất lâu trước khi được khai thác. item.coal.details = Có vẻ là vật chất hóa thạch của thực vật, hình thành từ rất lâu trước khi được khai thác.
item.titanium.description = Dùng trong cấu trúc vận chuyển chất lỏng, máy khoan và máy bay. item.titanium.description = Dùng trong cấu trúc vận chuyển chất lỏng, máy khoan và các công trình.
item.thorium.description = Dùng trong các công trình bền vững và có thể dùng làm nhiên liệu hạt nhân. item.thorium.description = Dùng trong các công trình bền vững và có thể dùng làm nhiên liệu hạt nhân.
item.scrap.description = Dùng làm nguyên liệu cho Máy nung phế liệu và Máy nghiền để tinh luyện thành các vật liệu khác. item.scrap.description = Dùng làm nguyên liệu cho Máy nung phế liệu và Máy nghiền để tinh luyện thành các vật liệu khác.
item.scrap.details = Tàn tích còn lại của các công trình và robot cũ. item.scrap.details = Tàn tích còn lại của các công trình và robot cũ.
@@ -1360,7 +1400,7 @@ liquid.oil.description = Dùng trong sản xuất vật liệu tiên tiến và
liquid.cryofluid.description = Dùng làm chất làm mát trong lò phản ứng, súng và nhà máy. liquid.cryofluid.description = Dùng làm chất làm mát trong lò phản ứng, súng và nhà máy.
block.resupply-point.description = Cung cấp đạn đồng cho các quân lính ở gần. Không tương thích với quân lính sử dụng điện. block.resupply-point.description = Cung cấp đạn đồng cho các quân lính ở gần. Không tương thích với quân lính sử dụng điện.
block.armored-conveyor.description = Vận chuyển vật phẩm về phía. Không nhận đầu vào từ phía bên. block.armored-conveyor.description = Vận chuyển vật phẩm về phía trước. Không nhận đầu vào từ phía bên cạnh.
block.illuminator.description = Phát sáng. block.illuminator.description = Phát sáng.
block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội. block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội.
block.graphite-press.description = Nén than thành than chì. block.graphite-press.description = Nén than thành than chì.
@@ -1370,7 +1410,7 @@ block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh.
block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan. block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan.
block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát. block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát.
block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim. block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim.
block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát. block.cryofluid-mixer.description = Trộn nước và titan để sản xuất chất làm mát.
block.blast-mixer.description = Tạo ra hợp chất nổ từ nhiệt thạch và vỏ bào tử. block.blast-mixer.description = Tạo ra hợp chất nổ từ nhiệt thạch và vỏ bào tử.
block.pyratite-mixer.description = Trộn than, chì và cát thành nhiệt thạch. block.pyratite-mixer.description = Trộn than, chì và cát thành nhiệt thạch.
block.melter.description = Nung phế liệu thành xỉ. block.melter.description = Nung phế liệu thành xỉ.
@@ -1410,8 +1450,8 @@ block.plastanium-conveyor.description = Vận chuyển vật phẩm về phía
block.junction.description = Hoạt động như một cầu nối cho hai băng chuyền băng qua. block.junction.description = Hoạt động như một cầu nối cho hai băng chuyền băng qua.
block.bridge-conveyor.description = Vận chuyển vật phẩm qua nhiều loại địa hình hoặc công trình. block.bridge-conveyor.description = Vận chuyển vật phẩm qua nhiều loại địa hình hoặc công trình.
block.phase-conveyor.description = Vận chuyển tức thời vật phẩm qua địa hình hoặc công trình. Phạm vi dài hơn cầu nối, nhưng cần năng lượng. block.phase-conveyor.description = Vận chuyển tức thời vật phẩm qua địa hình hoặc công trình. Phạm vi dài hơn cầu nối, nhưng cần năng lượng.
block.sorter.description = Nếu vật phẩm giống vật được chọn sẽ được chuyển đến trước, nếu không sẽ được chuyển qua trái hoặc phải. block.sorter.description = Nếu vật phẩm giống vật phẩm được chọn sẽ được chuyển đến trước, nếu không sẽ được chuyển qua trái hoặc phải.
block.inverted-sorter.description = Giống như máy phân loại, nhưng vật được chọn sẽ được chuyển qua trái hoặc phải. block.inverted-sorter.description = Giống như bộ lọc, nhưng vật phẩm được chọn sẽ được chuyển qua trái hoặc phải.
block.router.description = Phân phối các vật phẩm đầu vào thành 3 hướng đầu ra như nhau. block.router.description = Phân phối các vật phẩm đầu vào thành 3 hướng đầu ra như nhau.
block.router.details = Không khuyên dùng cạnh đầu vào dây chuyền vì sẽ bị kẹt bởi đầu ra. block.router.details = Không khuyên dùng cạnh đầu vào dây chuyền vì sẽ bị kẹt bởi đầu ra.
block.distributor.description = Phân phối các vật phẩm đầu vào thành 7 hướng đầu ra như nhau. block.distributor.description = Phân phối các vật phẩm đầu vào thành 7 hướng đầu ra như nhau.
@@ -1453,7 +1493,7 @@ block.cultivator.description = Lọc bào tử có trong không khí và nuôi c
block.cultivator.details = Công nghệ được phục hồi. Được sử dụng để sản xuất một lượng lớn bào tử. Có thể là nơi ủ ban đầu của các bào tử hiện đang bao phủ Serpulo. block.cultivator.details = Công nghệ được phục hồi. Được sử dụng để sản xuất một lượng lớn bào tử. Có thể là nơi ủ ban đầu của các bào tử hiện đang bao phủ Serpulo.
block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu. block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu.
block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất. block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất.
block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh. block.core-shard.details = Căn cứ cấp 1. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh.
block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Chứa được nhiều tài nguyên hơn Căn cứ: Cơ sỏ. block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Chứa được nhiều tài nguyên hơn Căn cứ: Cơ sỏ.
block.core-foundation.details = Căn cứ cấp 2. block.core-foundation.details = Căn cứ cấp 2.
block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên. block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên.
@@ -1481,7 +1521,7 @@ block.repair-point.description = Liên tục sửa chữa robot ở trong phạm
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser. block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo. block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước hoặc chất làm mát. block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước hoặc chất làm mát.
block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng. block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng nhiệt thạch làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng.
block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium. block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium.
block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động. block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động.
block.payload-conveyor.description = Di chuyển những khối hàng lớn, chẳng hạn như các quân lính từ nhà máy. block.payload-conveyor.description = Di chuyển những khối hàng lớn, chẳng hạn như các quân lính từ nhà máy.
@@ -1542,7 +1582,7 @@ lst.read = Đọc một số từ bộ nhớ được liên kết.
lst.write = Ghi một số vào bộ nhớ được liên kết. lst.write = Ghi một số vào bộ nhớ được liên kết.
lst.print = Thêm văn bản vào bộ nhớ in.\nKhông hiển thị gì cho đến khi sử dụng [accent]Print Flush[]. lst.print = Thêm văn bản vào bộ nhớ in.\nKhông hiển thị gì cho đến khi sử dụng [accent]Print Flush[].
lst.draw = Thêm một thao tác vào bộ nhớ vẽ.\nKhông hiển thị gì cho đến khi sử dụng [accent]Draw Flush[]. lst.draw = Thêm một thao tác vào bộ nhớ vẽ.\nKhông hiển thị gì cho đến khi sử dụng [accent]Draw Flush[].
lst.drawflush = Chuyển các thao tác [accent]Draw[] đến màng hình. lst.drawflush = Chuyển các thao tác [accent]Draw[] đến màn hình.
lst.printflush = Chuyển các thao tác [accent]Print[] đến khối tin nhắn. lst.printflush = Chuyển các thao tác [accent]Print[] đến khối tin nhắn.
lst.getlink = Nhận liên kết bộ xử lý theo thứ tự. Bắt đầu từ 0. lst.getlink = Nhận liên kết bộ xử lý theo thứ tự. Bắt đầu từ 0.
lst.control = Điều khiển một khối. lst.control = Điều khiển một khối.
@@ -1562,7 +1602,7 @@ logic.nounitbuild = [red]Unit building logic is not allowed here.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
lenum.shoot = Bắn vào vị trí xác định. lenum.shoot = Bắn vào vị trí xác định.
lenum.shootp = Shoot at a unit/building with velocity prediction. lenum.shootp = Shoot at a unit/building with velocity prediction.
lenum.configure = Building configuration, e.g. sorter item. lenum.config = Building configuration, e.g. sorter item.
lenum.enabled = Bất cứ khi nào khối hoạt động. lenum.enabled = Bất cứ khi nào khối hoạt động.
laccess.color = Màu đèn chiếu sáng. laccess.color = Màu đèn chiếu sáng.
@@ -1570,6 +1610,7 @@ laccess.controller = Unit controller. If processor controlled, returns processor
laccess.dead = Whether a unit/building is dead or no longer valid. laccess.dead = Whether a unit/building is dead or no longer valid.
laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0. laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0.
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead.
laccess.progress = Action progress, 0 to 1.\nReturns production, turret reload or construction progress.
graphicstype.clear = Tô màu cho màn hình. graphicstype.clear = Tô màu cho màn hình.
graphicstype.color = Đặt màu cho thao tác vẽ tiếp theo. graphicstype.color = Đặt màu cho thao tác vẽ tiếp theo.
@@ -1601,9 +1642,15 @@ lenum.min = Số nhỏ nhất giữa hai số.
lenum.max = Số lớn nhất giữa hai số. lenum.max = Số lớn nhất giữa hai số.
lenum.angle = Góc của vectơ tính bằng độ. lenum.angle = Góc của vectơ tính bằng độ.
lenum.len = Chiều dài của vectơ. lenum.len = Chiều dài của vectơ.
lenum.sin = Sin, tính bằng độ. lenum.sin = Sin, tính bằng độ.
lenum.cos = Cos, tính bằng độ. lenum.cos = Cos, tính bằng độ.
lenum.tan = Tan, tính bằng độ. lenum.tan = Tan, tính bằng độ.
lenum.asin = Arc sin, tính bằng độ.
lenum.acos = Arc cos, tính bằng độ.
lenum.atan = Arc tan, tính bằng độ.
#not a typo, look up 'range notation' #not a typo, look up 'range notation'
lenum.rand = Tạo ra số nguyên ngẫu nhiên trong phạm vi [0, giá trị). lenum.rand = Tạo ra số nguyên ngẫu nhiên trong phạm vi [0, giá trị).
lenum.log = Lôgarit tự nhiên (ln). lenum.log = Lôgarit tự nhiên (ln).
@@ -1679,4 +1726,4 @@ lenum.mine = Đào tại vị trí.
lenum.build = Xây công trình. lenum.build = Xây công trình.
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[]. lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[].
lenum.within = Kiểm tra xem quân lính có gần vị trí không. lenum.within = Kiểm tra xem quân lính có gần vị trí không.
lenum.boost = Start/stop boosting. lenum.boost = Bắt đầu/Dừng tăng tốc.

View File

@@ -67,6 +67,14 @@ schematic.delete.confirm = 該藍圖將被完全清除。
schematic.rename = 重新命名藍圖 schematic.rename = 重新命名藍圖
schematic.info = {0}x{1}, {2}方塊 schematic.info = {0}x{1}, {2}方塊
schematic.disabled = [scarlet]藍圖被進用[]\n你不能在這個[accent]地圖[] 或 [accent]伺服器中使用藍圖. schematic.disabled = [scarlet]藍圖被進用[]\n你不能在這個[accent]地圖[] 或 [accent]伺服器中使用藍圖.
schematic.tags = 標籤:
schematic.edittags = 編輯標籤
schematic.addtag = 新增標籤
schematic.texttag = 文字標籤
schematic.icontag = 圖像標籤
schematic.renametag = 重新命名
schematic.tagdelconfirm = 確認刪除此標籤?
schematic.tagexists = 該標籤已存在。
stats = 統計 stats = 統計
stat.wave = 打敗的波次:[accent]{0} stat.wave = 打敗的波次:[accent]{0}
@@ -306,7 +314,6 @@ data.exported = 資料已匯出。
data.invalid = 這不是有效的遊戲資料。 data.invalid = 這不是有效的遊戲資料。
data.import.confirm = 導入外部資料將會覆寫您目前[scarlet]所有的[]遊戲資料,\n[accent]此動作無法復原![]\n\n匯入資料後您的遊戲將立刻結束。 data.import.confirm = 導入外部資料將會覆寫您目前[scarlet]所有的[]遊戲資料,\n[accent]此動作無法復原![]\n\n匯入資料後您的遊戲將立刻結束。
quit.confirm = 您確定要結束嗎? quit.confirm = 您確定要結束嗎?
quit.confirm.tutorial = 您確定您知道自己在做什麼嗎?\n可以在[accent] 設定-遊戲[] 選項中重設教學。
loading = [accent]載入中…… loading = [accent]載入中……
reloading = [accent]模組重新載入中…… reloading = [accent]模組重新載入中……
saving = [accent]儲存中…… saving = [accent]儲存中……
@@ -477,6 +484,7 @@ filter.option.circle-scale = 圓形規模
filter.option.octaves = 倍頻 filter.option.octaves = 倍頻
filter.option.falloff = 衰減 filter.option.falloff = 衰減
filter.option.angle = 角度 filter.option.angle = 角度
filter.option.rotate = 旋轉
filter.option.amount = 數量 filter.option.amount = 數量
filter.option.block = 方塊 filter.option.block = 方塊
filter.option.floor = 地板 filter.option.floor = 地板
@@ -498,6 +506,7 @@ load = 載入
save = 儲存 save = 儲存
fps = FPS{0} fps = FPS{0}
ping = 延遲:{0}毫秒 ping = 延遲:{0}毫秒
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = 請重新啟動遊戲以使選取的語言生效。 language.restart = 請重新啟動遊戲以使選取的語言生效。
@@ -530,7 +539,7 @@ launch.from = 發射來源:[accent]{0}
launch.destination = 目的地:{0} launch.destination = 目的地:{0}
configure.invalid = 數值必須介於 0 到 {0}。 configure.invalid = 數值必須介於 0 到 {0}。
add = 新增…… add = 新增……
boss.health = 頭目血量 guardian = 頭目
connectfail = [scarlet]伺服器連線錯誤:\n\n[accent]{0} connectfail = [scarlet]伺服器連線錯誤:\n\n[accent]{0}
error.unreachable = 無法連線到伺服器。請確認拼字是否正確? error.unreachable = 無法連線到伺服器。請確認拼字是否正確?
@@ -574,6 +583,7 @@ sector.attacked = 地區 [accent]{0}[white] 遭受攻擊!
sector.lost = 地區 [accent]{0}[white] 戰敗! sector.lost = 地區 [accent]{0}[white] 戰敗!
#note: 校正用空行 #note: 校正用空行
sector.captured = 成功佔領地區[accent]{0}[white] sector.captured = 成功佔領地區[accent]{0}[white]
sector.changeicon = 更改圖標
threat.low = threat.low =
threat.medium = threat.medium =
@@ -626,6 +636,7 @@ status.wet.name = 浸濕
status.muddy.name = 泥濘 status.muddy.name = 泥濘
status.melting.name = 融化 status.melting.name = 融化
status.sapped.name = 被吸血 status.sapped.name = 被吸血
status.electrified.name = 觸電
status.spore-slowed.name = 孢子緩速 status.spore-slowed.name = 孢子緩速
status.tarred.name = 焦油 status.tarred.name = 焦油
status.overclock.name = 快轉 status.overclock.name = 快轉
@@ -654,6 +665,7 @@ settings.clearcampaignsaves.confirm = 你確定要清除所有戰役紀錄?
paused = [accent](已暫停) paused = [accent](已暫停)
clear = 清除 clear = 清除
banned = [scarlet]已被封鎖 banned = [scarlet]已被封鎖
unsupported.environment = [scarlet]不支援的環境
yes = yes =
no = no =
info.title = 資訊 info.title = 資訊
@@ -692,6 +704,7 @@ stat.memorycapacity = 記憶體容量
stat.basepowergeneration = 基礎能量生產 stat.basepowergeneration = 基礎能量生產
stat.productiontime = 生產時間 stat.productiontime = 生產時間
stat.repairtime = 方塊完全修復時間 stat.repairtime = 方塊完全修復時間
stat.repairspeed = 修復速度
stat.weapons = 武器 stat.weapons = 武器
stat.bullet = 子彈 stat.bullet = 子彈
stat.speedincrease = 速度提升 stat.speedincrease = 速度提升
@@ -737,13 +750,15 @@ stat.speedmultiplier = 速度加成
stat.reloadmultiplier = 射速加成 stat.reloadmultiplier = 射速加成
stat.buildspeedmultiplier = 建造速度加成 stat.buildspeedmultiplier = 建造速度加成
stat.reactive = 具反應性 stat.reactive = 具反應性
stat.healing = 治癒
ability.forcefield = 防護罩 ability.forcefield = 防護罩
ability.repairfield = 維修力場 ability.repairfield = 維修力場
ability.statusfield = 狀態力場 ability.statusfield = {0}狀態力場
ability.unitspawn = {0}工廠 ability.unitspawn = {0}工廠
ability.shieldregenfield = 護盾充能力場 ability.shieldregenfield = 護盾充能力場
ability.movelightning = 移動閃電 ability.movelightning = 移動閃電
ability.energyfield = 能量場: [accent]{0}[] 傷害 ~ [accent]{1}[] 方格 / [accent]{2}[] 目標數
bar.drilltierreq = 需要更好的鑽頭 bar.drilltierreq = 需要更好的鑽頭
bar.noresources = 缺少資源 bar.noresources = 缺少資源
@@ -766,6 +781,7 @@ bar.power = 能量
bar.progress = 建造進度 bar.progress = 建造進度
bar.input = 輸入 bar.input = 輸入
bar.output = 輸出 bar.output = 輸出
bar.strength = [stat]{0}[lightgray]x 強度
units.processorcontrol = [lightgray]由微處理器控制 units.processorcontrol = [lightgray]由微處理器控制
@@ -941,6 +957,7 @@ keybind.pause_building.name = 暫停/繼續建造
keybind.minimap.name = 小地圖 keybind.minimap.name = 小地圖
keybind.planet_map.name = 行星地圖 keybind.planet_map.name = 行星地圖
keybind.research.name = 研究 keybind.research.name = 研究
keybind.block_info.name = 方塊資訊
keybind.chat.name = 聊天 keybind.chat.name = 聊天
keybind.player_list.name = 玩家列表 keybind.player_list.name = 玩家列表
keybind.console.name = 終端機 keybind.console.name = 終端機
@@ -973,6 +990,7 @@ rules.wavetimer = 波次時間
rules.waves = 波次 rules.waves = 波次
rules.attack = 攻擊模式 rules.attack = 攻擊模式
rules.buildai = 電腦自動建築 rules.buildai = 電腦自動建築
rules.corecapture = 佔領摧毀的核心
rules.enemyCheat = 電腦無限資源 rules.enemyCheat = 電腦無限資源
rules.blockhealthmultiplier = 建築物耐久度倍數 rules.blockhealthmultiplier = 建築物耐久度倍數
rules.blockdamagemultiplier = 建築物傷害倍數 rules.blockdamagemultiplier = 建築物傷害倍數
@@ -1028,6 +1046,7 @@ item.blast-compound.name = 爆炸化合物
item.pyratite.name = 火焰彈 item.pyratite.name = 火焰彈
item.metaglass.name = 鋼化玻璃 item.metaglass.name = 鋼化玻璃
item.scrap.name = 廢料 item.scrap.name = 廢料
liquid.water.name = liquid.water.name =
liquid.slag.name = 熔渣 liquid.slag.name = 熔渣
liquid.oil.name = 原油 liquid.oil.name = 原油
@@ -1059,6 +1078,11 @@ unit.minke.name = 鬚鯨號
unit.bryde.name = 鯷鯨號 unit.bryde.name = 鯷鯨號
unit.sei.name = 塞鯨號 unit.sei.name = 塞鯨號
unit.omura.name = 角島鯨號 unit.omura.name = 角島鯨號
unit.retusa.name = Retusa
unit.oxynoe.name = Oxynoe
unit.cyerce.name = Cyerce
unit.aegires.name = Aegires
unit.navanax.name = Navanax
unit.alpha.name = 阿爾法 unit.alpha.name = 阿爾法
unit.beta.name = 貝塔 unit.beta.name = 貝塔
unit.gamma.name = 伽瑪 unit.gamma.name = 伽瑪
@@ -1119,6 +1143,7 @@ block.sand-water.name = 沙水
block.darksand-water.name = 黑沙水 block.darksand-water.name = 黑沙水
block.char.name = 燒焦 block.char.name = 燒焦
block.dacite.name = 英安岩 block.dacite.name = 英安岩
block.rhyolite.name = 流紋岩
block.dacite-wall.name = 英安岩牆 block.dacite-wall.name = 英安岩牆
block.dacite-boulder.name = 英安岩石塊 block.dacite-boulder.name = 英安岩石塊
block.ice-snow.name = 冰雪 block.ice-snow.name = 冰雪
@@ -1226,6 +1251,7 @@ block.solar-panel.name = 太陽能板
block.solar-panel-large.name = 大型太陽能板 block.solar-panel-large.name = 大型太陽能板
block.oil-extractor.name = 原油鑽井 block.oil-extractor.name = 原油鑽井
block.repair-point.name = 維修點 block.repair-point.name = 維修點
block.repair-turret.name = 維修機台
block.pulse-conduit.name = 脈衝管線 block.pulse-conduit.name = 脈衝管線
block.plated-conduit.name = 裝甲管線 block.plated-conduit.name = 裝甲管線
block.phase-conduit.name = 相織管線 block.phase-conduit.name = 相織管線
@@ -1289,7 +1315,6 @@ block.memory-bank.name = 記憶體
team.blue.name = team.blue.name =
team.crux.name = team.crux.name =
team.sharded.name = team.sharded.name =
team.orange.name =
team.derelict.name = team.derelict.name =
team.green.name = team.green.name =
team.purple.name = team.purple.name =
@@ -1506,7 +1531,7 @@ block.logic-display.description = 顯示由處理器輸出的任意圖像。
block.large-logic-display.description = 顯示由處理器輸出的任意圖像。 block.large-logic-display.description = 顯示由處理器輸出的任意圖像。
block.interplanetary-accelerator.description = 巨大的電磁砲塔。將核心加速至脫離速度以在其他星球部署。 block.interplanetary-accelerator.description = 巨大的電磁砲塔。將核心加速至脫離速度以在其他星球部署。
unit.dagger.description = 發射普通子彈攻擊所有附近敵人。 unit.dagger.description = 發射普通子彈攻擊附近敵人。
unit.mace.description = 噴發烈焰攻擊所有附近敵人。 unit.mace.description = 噴發烈焰攻擊所有附近敵人。
unit.fortress.description = 發射遠程迫砲攻擊地面目標。 unit.fortress.description = 發射遠程迫砲攻擊地面目標。
unit.scepter.description = 發射大量續能子彈打擊所有附近敵人。 unit.scepter.description = 發射大量續能子彈打擊所有附近敵人。

View File

@@ -38,6 +38,7 @@ Jaiun Lee
Gab_351 Gab_351
Carter Gale Carter Gale
Jan Polák Jan Polák
JrTRinny
JustYanns JustYanns
BasedUser BasedUser
BLucky-gh BLucky-gh

BIN
core/assets/logicids.dat Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -149,7 +149,16 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
} }
mods.eachClass(Mod::init); mods.eachClass(Mod::init);
finished = true; finished = true;
Events.fire(new ClientLoadEvent()); var event = new ClientLoadEvent();
//a temporary measure for compatibility with certain mods
Events.fireWrap(event.getClass(), event, listener -> {
try{
listener.get(event);
}catch(NoSuchFieldError | NoSuchMethodError | NoClassDefFoundError error){
Log.err(error);
}
});
clientLoaded = true; clientLoaded = true;
super.resize(graphics.getWidth(), graphics.getHeight()); super.resize(graphics.getWidth(), graphics.getHeight());
app.post(() -> app.post(() -> app.post(() -> app.post(() -> { app.post(() -> app.post(() -> app.post(() -> app.post(() -> {

View File

@@ -73,8 +73,8 @@ public class Vars implements Loadable{
/** URL to the JSON file containing all the BE servers. Only queried in BE. */ /** 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"; public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL to the JSON file containing all the stable servers. */ /** URL to the JSON file containing all the stable servers. */
//TODO this uses BE servers until full v7 release, there's no point in displaying v6 at all //TODO merge with v6 list upon release
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v7.json";
/** URL of the github issue report template.*/ /** URL of the github issue report template.*/
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
/** list of built-in servers.*/ /** list of built-in servers.*/
@@ -148,6 +148,8 @@ public class Vars implements Loadable{
public static int maxTextureSize = 2048; public static int maxTextureSize = 2048;
/** Whether to show the core landing animation. */ /** Whether to show the core landing animation. */
public static boolean showLandAnimation = true; public static boolean showLandAnimation = true;
/** Whether to check for memory use before taking screenshots. */
public static boolean checkScreenshotMemory = true;
/** Whether to prompt the user to confirm exiting. */ /** Whether to prompt the user to confirm exiting. */
public static boolean confirmExit = true; public static boolean confirmExit = true;
/** if true, UI is not drawn */ /** if true, UI is not drawn */

View File

@@ -31,7 +31,7 @@ public class MinerAI extends AIController{
//core full of the target item, do nothing //core full of the target item, do nothing
if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){ if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){
unit.clearItem(); unit.clearItem();
unit.mineTile =null; unit.mineTile = null;
return; return;
} }
@@ -39,7 +39,7 @@ public class MinerAI extends AIController{
if(unit.stack.amount >= unit.type.itemCapacity || (targetItem != null && !unit.acceptsItem(targetItem))){ if(unit.stack.amount >= unit.type.itemCapacity || (targetItem != null && !unit.acceptsItem(targetItem))){
mining = false; mining = false;
}else{ }else{
if(timer.get(timerTarget, 60) && targetItem != null){ if(timer.get(timerTarget3, 60) && targetItem != null){
ore = indexer.findClosestOre(unit, targetItem); ore = indexer.findClosestOre(unit, targetItem);
} }

View File

@@ -24,6 +24,7 @@ public class PhysicsProcess implements AsyncProcess{
@Override @Override
public void begin(){ public void begin(){
if(physics == null) return; if(physics == null) return;
boolean local = !Vars.net.client();
//remove stale entities //remove stale entities
refs.removeAll(ref -> { refs.removeAll(ref -> {
@@ -60,8 +61,9 @@ public class PhysicsProcess implements AsyncProcess{
ref.body.layer = ref.body.layer =
entity.type.allowLegStep ? layerLegs : entity.type.allowLegStep ? layerLegs :
entity.isGrounded() ? layerGround : layerFlying; entity.isGrounded() ? layerGround : layerFlying;
ref.x = entity.x(); ref.x = entity.x;
ref.y = entity.y(); ref.y = entity.y;
ref.body.local = local || entity.isLocal();
} }
} }
@@ -156,6 +158,10 @@ public class PhysicsProcess implements AsyncProcess{
for(int i = 0; i < bodies.size; i++){ for(int i = 0; i < bodies.size; i++){
PhysicsBody body = bodies.items[i]; PhysicsBody body = bodies.items[i];
//for clients, the only body that collides is the local one; all other physics simulations are handled by the server.
if(!body.local) continue;
body.hitbox(rect); body.hitbox(rect);
seq.size = 0; seq.size = 0;
@@ -174,10 +180,14 @@ public class PhysicsProcess implements AsyncProcess{
float ms = body.mass + other.mass; float ms = body.mass + other.mass;
float m1 = other.mass / ms, m2 = body.mass / ms; float m1 = other.mass / ms, m2 = body.mass / ms;
//first body is always local due to guard check above
body.x += vec.x * m1 / scl; body.x += vec.x * m1 / scl;
body.y += vec.y * m1 / scl; body.y += vec.y * m1 / scl;
other.x -= vec.x * m2 / scl;
other.y -= vec.y * m2 / scl; if(other.local){
other.x -= vec.x * m2 / scl;
other.y -= vec.y * m2 / scl;
}
} }
} }
body.collided = true; body.collided = true;
@@ -187,7 +197,7 @@ public class PhysicsProcess implements AsyncProcess{
public static class PhysicsBody implements QuadTreeObject{ public static class PhysicsBody implements QuadTreeObject{
public float x, y, radius, mass; public float x, y, radius, mass;
public int layer = 0; public int layer = 0;
public boolean collided = false; public boolean collided = false, local = true;
@Override @Override
public void hitbox(Rect out){ public void hitbox(Rect out){

View File

@@ -60,7 +60,7 @@ public class Blocks implements ContentList{
cellSynthesisChamber, cellSynthesisChamber,
//sandbox //sandbox
powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadVoid, payloadSource, illuminator, powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadSource, payloadVoid, illuminator,
//defense //defense
copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge,
@@ -1178,17 +1178,17 @@ public class Blocks implements ContentList{
//special transport blocks //special transport blocks
duct = new Duct("duct"){{ duct = new Duct("duct"){{
requirements(Category.distribution, with(Items.graphite, 5, Items.metaglass, 2)); requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.graphite, 5, Items.metaglass, 2));
speed = 4f; speed = 4f;
}}; }};
ductRouter = new DuctRouter("duct-router"){{ ductRouter = new DuctRouter("duct-router"){{
requirements(Category.distribution, with(Items.graphite, 10, Items.metaglass, 4)); requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.graphite, 10, Items.metaglass, 4));
speed = 4f; speed = 4f;
}}; }};
ductBridge = new DuctBridge("duct-bridge"){{ ductBridge = new DuctBridge("duct-bridge"){{
requirements(Category.distribution, with(Items.graphite, 20, Items.metaglass, 8)); requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.graphite, 20, Items.metaglass, 8));
speed = 4f; speed = 4f;
}}; }};
@@ -1757,13 +1757,13 @@ public class Blocks implements ContentList{
shots = 4; shots = 4;
burstSpacing = 5; burstSpacing = 5;
inaccuracy = 10f; inaccuracy = 10f;
range = 210f; range = 215f;
xRand = 6f; xRand = 6f;
size = 2; size = 2;
health = 300 * size * size; health = 300 * size * size;
shootSound = Sounds.missile; shootSound = Sounds.missile;
limitRange(2f); limitRange(5f);
}}; }};
salvo = new ItemTurret("salvo"){{ salvo = new ItemTurret("salvo"){{
@@ -1778,7 +1778,7 @@ public class Blocks implements ContentList{
size = 2; size = 2;
range = 190f; range = 190f;
reloadTime = 34f; reloadTime = 31f;
restitution = 0.03f; restitution = 0.03f;
ammoEjectBack = 3f; ammoEjectBack = 3f;
cooldown = 0.03f; cooldown = 0.03f;
@@ -2147,7 +2147,7 @@ public class Blocks implements ContentList{
}}; }};
repairPoint = new RepairPoint("repair-point"){{ repairPoint = new RepairPoint("repair-point"){{
requirements(Category.units, with(Items.lead, 20, Items.copper, 20, Items.silicon, 15)); requirements(Category.units, with(Items.lead, 25, Items.copper, 25, Items.silicon, 20));
repairSpeed = 0.5f; repairSpeed = 0.5f;
repairRadius = 65f; repairRadius = 65f;
beamWidth = 0.73f; beamWidth = 0.73f;
@@ -2156,16 +2156,16 @@ public class Blocks implements ContentList{
}}; }};
repairTurret = new RepairPoint("repair-turret"){{ repairTurret = new RepairPoint("repair-turret"){{
requirements(Category.units, with(Items.silicon, 70, Items.thorium, 60, Items.plastanium, 60)); requirements(Category.units, with(Items.silicon, 90, Items.thorium, 80, Items.plastanium, 80));
size = 2; size = 2;
length = 6f; length = 6f;
repairSpeed = 4f; repairSpeed = 3.25f;
repairRadius = 140f; repairRadius = 140f;
powerUse = 5f; powerUse = 5f;
beamWidth = 1.1f; beamWidth = 1.1f;
pulseRadius = 6.1f; pulseRadius = 6.1f;
coolantUse = 0.15f; coolantUse = 0.16f;
coolantMultiplier = 1.7f; coolantMultiplier = 1.5f;
acceptCoolant = true; acceptCoolant = true;
}}; }};
@@ -2266,12 +2266,12 @@ public class Blocks implements ContentList{
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
payloadVoid = new PayloadVoid("payload-void"){{ payloadSource = new PayloadSource("payload-source"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
}}; }};
payloadSource = new PayloadSource("payload-source"){{ payloadVoid = new PayloadVoid("payload-void"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
}}; }};

View File

@@ -257,7 +257,6 @@ public class Bullets implements ContentList{
width = 8f; width = 8f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f;
splashDamageRadius = 30f; splashDamageRadius = 30f;
splashDamage = 30f * 1.5f; splashDamage = 30f * 1.5f;
ammoMultiplier = 5f; ammoMultiplier = 5f;
@@ -274,7 +273,6 @@ public class Bullets implements ContentList{
width = 7f; width = 7f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f;
homingPower = 0.08f; homingPower = 0.08f;
splashDamageRadius = 20f; splashDamageRadius = 20f;
splashDamage = 20f * 1.5f; splashDamage = 20f * 1.5f;
@@ -288,7 +286,6 @@ public class Bullets implements ContentList{
width = 8f; width = 8f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f;
splashDamageRadius = 25f; splashDamageRadius = 25f;
splashDamage = 25f * 1.4f; splashDamage = 25f * 1.4f;
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;

View File

@@ -854,7 +854,7 @@ public class Fx{
fireRemove = new Effect(70f, e -> { fireRemove = new Effect(70f, e -> {
if(Fire.regions[0] == null) return; if(Fire.regions[0] == null) return;
alpha(e.fout()); alpha(e.fout());
rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y); rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x + Mathf.randomSeedRange((int)e.y, 2), e.y + Mathf.randomSeedRange((int)e.x, 2));
Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout()); Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout());
}), }),

View File

@@ -572,7 +572,7 @@ public class UnitTypes implements ContentList{
speed = 1f; speed = 1f;
splashDamageRadius = 60f; splashDamageRadius = 60f;
instantDisappear = true; instantDisappear = true;
splashDamage = 88f; splashDamage = 90f;
killShooter = true; killShooter = true;
hittable = false; hittable = false;
collidesAir = true; collidesAir = true;
@@ -581,7 +581,7 @@ public class UnitTypes implements ContentList{
}}; }};
atrax = new UnitType("atrax"){{ atrax = new UnitType("atrax"){{
speed = 0.5f; speed = 0.54f;
drag = 0.4f; drag = 0.4f;
hitSize = 13f; hitSize = 13f;
rotateSpeed = 3f; rotateSpeed = 3f;
@@ -621,7 +621,7 @@ public class UnitTypes implements ContentList{
}}; }};
spiroct = new UnitType("spiroct"){{ spiroct = new UnitType("spiroct"){{
speed = 0.45f; speed = 0.48f;
drag = 0.4f; drag = 0.4f;
hitSize = 15f; hitSize = 15f;
rotateSpeed = 3f; rotateSpeed = 3f;
@@ -2113,7 +2113,7 @@ public class UnitTypes implements ContentList{
bullet = new ContinuousLaserBulletType(){{ bullet = new ContinuousLaserBulletType(){{
maxRange = 90f; maxRange = 90f;
damage = 26f; damage = 27f;
length = 95f; length = 95f;
hitEffect = Fx.hitMeltHeal; hitEffect = Fx.hitMeltHeal;
drawSize = 200f; drawSize = 200f;
@@ -2144,7 +2144,7 @@ public class UnitTypes implements ContentList{
x = 70f/4f; x = 70f/4f;
y = -26f/4f; y = -26f/4f;
reload = 70f; reload = 65f;
shake = 3f; shake = 3f;
rotateSpeed = 2f; rotateSpeed = 2f;
shadow = 30f; shadow = 30f;
@@ -2161,7 +2161,7 @@ public class UnitTypes implements ContentList{
timeIncrease = 3f; timeIncrease = 3f;
timeDuration = 60f * 20f; timeDuration = 60f * 20f;
powerDamageScl = 3f; powerDamageScl = 3f;
damage = 50; damage = 60;
hitColor = lightColor = Pal.heal; hitColor = lightColor = Pal.heal;
lightRadius = 70f; lightRadius = 70f;
clipSize = 250f; clipSize = 250f;
@@ -2177,7 +2177,7 @@ public class UnitTypes implements ContentList{
trailWidth = 6f; trailWidth = 6f;
trailColor = Pal.heal; trailColor = Pal.heal;
trailInterval = 3f; trailInterval = 3f;
splashDamage = 60f; splashDamage = 70f;
splashDamageRadius = rad; splashDamageRadius = rad;
hitShake = 4f; hitShake = 4f;
trailRotation = true; trailRotation = true;

View File

@@ -48,7 +48,7 @@ public class NetServer implements ApplicationListener{
if(state.rules.pvp){ if(state.rules.pvp){
//find team with minimum amount of players and auto-assign player to that. //find team with minimum amount of players and auto-assign player to that.
TeamData re = state.teams.getActive().min(data -> { TeamData re = state.teams.getActive().min(data -> {
if((state.rules.waveTeam == data.team && state.rules.waves) || !data.team.active()) return Integer.MAX_VALUE; if((state.rules.waveTeam == data.team && state.rules.waves) || !data.team.active() || data.team == Team.derelict) return Integer.MAX_VALUE;
int count = 0; int count = 0;
for(Player other : players){ for(Player other : players){
@@ -472,6 +472,10 @@ public class NetServer implements ApplicationListener{
return; return;
} }
if(!player.dead() && player.unit().isCommanding()){
player.unit().clearCommand();
}
player.getInfo().lastSyncTime = Time.millis(); player.getInfo().lastSyncTime = Time.millis();
Call.worldDataBegin(player.con); Call.worldDataBegin(player.con);
netServer.sendWorldData(player); netServer.sendWorldData(player);

View File

@@ -11,6 +11,7 @@ import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.async.*; import arc.util.async.*;
import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -355,7 +356,7 @@ public class Renderer implements ApplicationListener{
int w = world.width() * tilesize, h = world.height() * tilesize; int w = world.width() * tilesize, h = world.height() * tilesize;
int memory = w * h * 4 / 1024 / 1024; int memory = w * h * 4 / 1024 / 1024;
if(memory >= (mobile ? 65 : 120)){ if(Vars.checkScreenshotMemory && memory >= (mobile ? 65 : 120)){
ui.showInfo("@screenshot.invalid"); ui.showInfo("@screenshot.invalid");
return; return;
} }

View File

@@ -126,6 +126,10 @@ public abstract class UnlockableContent extends MappableContent{
return true; return true;
} }
public boolean logicVisible(){
return !isHidden();
}
/** Makes this piece of content unlocked; if it already unlocked, nothing happens. */ /** Makes this piece of content unlocked; if it already unlocked, nothing happens. */
public void unlock(){ public void unlock(){
if(!unlocked && !alwaysUnlocked){ if(!unlocked && !alwaysUnlocked){

View File

@@ -52,22 +52,22 @@ public class Puddles{
Puddle p = map.get(tile.pos()); Puddle p = map.get(tile.pos());
if(p == null){ if(p == null){
Puddle puddle = Puddle.create(); Puddle puddle = Puddle.create();
puddle.tile(tile); puddle.tile = tile;
puddle.liquid(liquid); puddle.liquid = liquid;
puddle.amount(amount); puddle.amount = amount;
puddle.generation(generation); puddle.generation = generation;
puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
puddle.add(); puddle.add();
map.put(tile.pos(), puddle); map.put(tile.pos(), puddle);
}else if(p.liquid() == liquid){ }else if(p.liquid == liquid){
p.accepting(Math.max(amount, p.accepting())); p.accepting = Math.max(amount, p.accepting);
if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount() >= maxLiquid / 2f){ if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount >= maxLiquid / 2f){
Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid().color); Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid.color);
p.lastRipple = Time.time; p.lastRipple = Time.time;
} }
}else{ }else{
p.amount(p.amount() + reactPuddle(p.liquid(), liquid, amount, p.tile(), (p.x() + source.worldx())/2f, (p.y() + source.worldy())/2f)); p.amount += reactPuddle(p.liquid, liquid, amount, p.tile, (p.x + source.worldx())/2f, (p.y + source.worldy())/2f);
} }
} }

View File

@@ -297,7 +297,7 @@ public class BulletType extends Content implements Cloneable{
} }
} }
/** Called when the bullet reaches the end of its lifetime of is destroyed by something external. */ /** Called when the bullet reaches the end of its lifetime or is destroyed by something external. */
public void despawned(Bullet b){ public void despawned(Bullet b){
if(despawnHit){ if(despawnHit){
hit(b); hit(b);

View File

@@ -1,6 +1,7 @@
package mindustry.entities.comp; package mindustry.entities.comp;
import arc.math.*; import arc.math.*;
import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -24,7 +25,7 @@ abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst; if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst;
if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst; if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst;
velAddNet(dx, dy); velAddNet(dx * Time.delta, dy * Time.delta);
} }
//clamp position if not flying //clamp position if not flying

View File

@@ -28,6 +28,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
public static final TextureRegion[] regions = new TextureRegion[frames]; public static final TextureRegion[] regions = new TextureRegion[frames];
@Import float time, lifetime, x, y; @Import float time, lifetime, x, y;
@Import int id;
Tile tile; Tile tile;
private transient Block block; private transient Block block;
@@ -116,7 +117,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
Draw.alpha(Mathf.clamp(warmup / warmupDuration)); Draw.alpha(Mathf.clamp(warmup / warmupDuration));
Draw.z(Layer.effect); Draw.z(Layer.effect);
Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x, y); Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x + Mathf.randomSeedRange((int)y, 2), y + Mathf.randomSeedRange((int)x, 2));
Draw.reset(); Draw.reset();
Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration)); Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration));

View File

@@ -1,6 +1,5 @@
package mindustry.entities.comp; package mindustry.entities.comp;
import arc.math.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -34,7 +33,7 @@ abstract class HealthComp implements Entityc, Posc{
void kill(){ void kill(){
if(dead) return; if(dead) return;
health = 0; health = Math.min(health, 0);
dead = true; dead = true;
killed(); killed();
remove(); remove();
@@ -86,7 +85,7 @@ abstract class HealthComp implements Entityc, Posc{
} }
void clampHealth(){ void clampHealth(){
health = Mathf.clamp(health, 0, maxHealth); health = Math.min(health, maxHealth);
} }
/** Heals by a flat amount. */ /** Heals by a flat amount. */

View File

@@ -397,7 +397,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
//move down //move down
elevation -= type.fallSpeed * Time.delta; elevation -= type.fallSpeed * Time.delta;
if(isGrounded()){ if(isGrounded() || health <= -maxHealth){
Call.unitDestroy(id); Call.unitDestroy(id);
} }
} }
@@ -528,7 +528,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Override @Override
public void killed(){ public void killed(){
wasPlayer = isLocal(); wasPlayer = isLocal();
health = 0; health = Math.min(health, 0);
dead = true; dead = true;
//don't waste time when the unit is already on the ground, just destroy it //don't waste time when the unit is already on the ground, just destroy it

View File

@@ -38,7 +38,6 @@ public enum Gamemode{
rules.infiniteResources = true; rules.infiniteResources = true;
rules.editor = true; rules.editor = true;
rules.waves = false; rules.waves = false;
rules.enemyCoreBuildRadius = 0f;
rules.waveTimer = false; rules.waveTimer = false;
}); });

View File

@@ -165,6 +165,7 @@ public class BlockRenderer{
darkEvents.each(pos -> { darkEvents.each(pos -> {
var tile = world.tile(pos); var tile = world.tile(pos);
if(tile == null) return;
float darkness = world.getDarkness(tile.x, tile.y); float darkness = world.getDarkness(tile.x, tile.y);
//then draw the shadow //then draw the shadow
Draw.colorl(darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f)); Draw.colorl(darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f));

View File

@@ -270,6 +270,7 @@ public class MobileInput extends InputHandler implements GestureListener{
b.button(Icon.save, style, this::showSchematicSave).disabled(f -> lastSchematic == null || lastSchematic.file != null); b.button(Icon.save, style, this::showSchematicSave).disabled(f -> lastSchematic == null || lastSchematic.file != null);
b.button(Icon.cancel, style, () -> { b.button(Icon.cancel, style, () -> {
selectRequests.clear(); selectRequests.clear();
lastSchematic = null;
}); });
b.row(); b.row();
b.button(Icon.flipX, style, () -> flipRequests(selectRequests, true)); b.button(Icon.flipX, style, () -> flipRequests(selectRequests, true));

View File

@@ -70,8 +70,6 @@ public class JsonIO{
json.setElementType(Rules.class, "spawns", SpawnGroup.class); json.setElementType(Rules.class, "spawns", SpawnGroup.class);
json.setElementType(Rules.class, "loadout", ItemStack.class); json.setElementType(Rules.class, "loadout", ItemStack.class);
//TODO this is terrible
json.setSerializer(Sector.class, new Serializer<>(){ json.setSerializer(Sector.class, new Serializer<>(){
@Override @Override
public void write(Json json, Sector object, Class knownType){ public void write(Json json, Sector object, Class knownType){

View File

@@ -1,20 +1,28 @@
package mindustry.logic; package mindustry.logic;
import arc.*;
import arc.files.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.logic.LExecutor.*; import mindustry.logic.LExecutor.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import java.io.*;
/** Stores global constants for logic processors. */ /** Stores global constants for logic processors. */
public class GlobalConstants{ public class GlobalConstants{
public static final int ctrlProcessor = 1, ctrlPlayer = 2, ctrlFormation = 3; public static final int ctrlProcessor = 1, ctrlPlayer = 2, ctrlFormation = 3;
public static final ContentType[] lookableContent = {ContentType.block, ContentType.unit, ContentType.item, ContentType.liquid};
private ObjectIntMap<String> namesToIds = new ObjectIntMap<>(); private ObjectIntMap<String> namesToIds = new ObjectIntMap<>();
private Seq<Var> vars = new Seq<>(Var.class); private Seq<Var> vars = new Seq<>(Var.class);
private UnlockableContent[][] logicIdToContent;
private int[][] contentIdToLogicId;
public void init(){ public void init(){
put("the end", null); put("the end", null);
@@ -61,6 +69,49 @@ public class GlobalConstants{
for(UnitCommand cmd : UnitCommand.all){ for(UnitCommand cmd : UnitCommand.all){
put("@command" + Strings.capitalize(cmd.name()), cmd); put("@command" + Strings.capitalize(cmd.name()), cmd);
} }
logicIdToContent = new UnlockableContent[ContentType.all.length][];
contentIdToLogicId = new int[ContentType.all.length][];
Fi ids = Core.files.internal("logicids.dat");
if(ids.exists()){
//read logic ID mapping data (generated in ImagePacker)
try(DataInputStream in = new DataInputStream(ids.readByteStream())){
for(ContentType ctype : lookableContent){
short amount = in.readShort();
logicIdToContent[ctype.ordinal()] = new UnlockableContent[amount];
contentIdToLogicId[ctype.ordinal()] = new int[Vars.content.getBy(ctype).size];
//store count constants
put("@" + ctype.name() + "Count", amount);
for(int i = 0; i < amount; i++){
String name = in.readUTF();
UnlockableContent fetched = Vars.content.getByName(ctype, name);
if(fetched != null){
logicIdToContent[ctype.ordinal()][i] = fetched;
contentIdToLogicId[ctype.ordinal()][fetched.id] = i;
}
}
}
}catch(IOException e){
//don't crash?
Log.err("Error reading logic ID mapping", e);
}
}
}
/** @return a piece of content based on its logic ID. This is not equivalent to content ID. */
public @Nullable Content lookupContent(ContentType type, int id){
var arr = logicIdToContent[type.ordinal()];
return arr != null && id >= 0 && id < arr.length ? arr[id] : null;
}
/** @return the integer logic ID of content, or -1 if invalid. */
public int lookupLogicId(UnlockableContent content){
var arr = contentIdToLogicId[content.getContentType().ordinal()];
return arr != null && content.id >= 0 && content.id < arr.length ? arr[content.id] : -1;
} }
/** @return a constant ID > 0 if there is a constant with this name, otherwise -1. */ /** @return a constant ID > 0 if there is a constant with this name, otherwise -1. */

View File

@@ -537,7 +537,7 @@ public class LExecutor{
public void run(LExecutor exec){ public void run(LExecutor exec){
Object obj = exec.obj(target); Object obj = exec.obj(target);
if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id)){ if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id)){
if(type.isObj && exec.var(p1).isobj){ //TODO may break logic? if(type.isObj && exec.var(p1).isobj){
b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4));
}else{ }else{
b.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); b.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4));
@@ -764,7 +764,6 @@ public class LExecutor{
Var v = exec.var(to); Var v = exec.var(to);
Var f = exec.var(from); Var f = exec.var(from);
//TODO error out when the from-value is a constant
if(!v.constant){ if(!v.constant){
if(f.isobj){ if(f.isobj){
v.objval = f.objval; v.objval = f.objval;
@@ -1024,6 +1023,26 @@ public class LExecutor{
} }
} }
public static class LookupI implements LInstruction{
public int dest;
public int from;
public ContentType type;
public LookupI(int dest, int from, ContentType type){
this.dest = dest;
this.from = from;
this.type = type;
}
public LookupI(){
}
@Override
public void run(LExecutor exec){
exec.setobj(dest, constants.lookupContent(type, exec.numi(from)));
}
}
//endregion //endregion
} }

View File

@@ -7,6 +7,7 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import mindustry.*; import mindustry.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.ctype.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.logic.LCanvas.*; import mindustry.logic.LCanvas.*;
@@ -662,8 +663,7 @@ public class LStatements{
} }
} }
//TODO untested @RegisterStatement("wait")
//@RegisterStatement("wait")
public static class WaitStatement extends LStatement{ public static class WaitStatement extends LStatement{
public String value = "0.5"; public String value = "0.5";
@@ -684,6 +684,42 @@ public class LStatements{
} }
} }
@RegisterStatement("lookup")
public static class LookupStatement extends LStatement{
public ContentType type = ContentType.item;
public String result = "result", id = "0";
@Override
public void build(Table table){
fields(table, result, str -> result = str);
table.add(" = lookup ");
row(table);
table.button(b -> {
b.label(() -> type.name());
b.clicked(() -> showSelect(b, GlobalConstants.lookableContent, type, o -> {
type = o;
}));
}, Styles.logict, () -> {}).size(64f, 40f).pad(4f).color(table.color);
table.add(" # ");
fields(table, id, str -> id = str);
}
@Override
public Color color(){
return Pal.logicOperations;
}
@Override
public LInstruction build(LAssembler builder){
return new LookupI(builder.var(result), builder.var(id), type);
}
}
@RegisterStatement("end") @RegisterStatement("end")
public static class EndStatement extends LStatement{ public static class EndStatement extends LStatement{
@Override @Override

View File

@@ -11,6 +11,10 @@ public class ModClassLoader extends ClassLoader{
} }
}; };
public ModClassLoader(ClassLoader parent){
super(parent);
}
public void addChild(ClassLoader child){ public void addChild(ClassLoader child){
children.add(child); children.add(child);
} }

View File

@@ -39,7 +39,7 @@ public class Mods implements Loadable{
private int totalSprites; private int totalSprites;
private MultiPacker packer; private MultiPacker packer;
private ModClassLoader mainLoader = new ModClassLoader(); private ModClassLoader mainLoader = new ModClassLoader(getClass().getClassLoader());
Seq<LoadedMod> mods = new Seq<>(); Seq<LoadedMod> mods = new Seq<>();
private ObjectMap<Class<?>, ModMeta> metas = new ObjectMap<>(); private ObjectMap<Class<?>, ModMeta> metas = new ObjectMap<>();

View File

@@ -61,7 +61,6 @@ public class Administration{
}); });
//block interaction rate limit //block interaction rate limit
//TODO when someone disconnects, a different player is mistakenly kicked for spamming actions
addActionFilter(action -> { addActionFilter(action -> {
if(action.type != ActionType.breakBlock && if(action.type != ActionType.breakBlock &&
action.type != ActionType.placeBlock && action.type != ActionType.placeBlock &&

View File

@@ -391,7 +391,15 @@ public class ArcNetProvider implements NetProvider{
//no compression, copy over buffer //no compression, copy over buffer
if(compression == 0){ if(compression == 0){
buffer.position(0).limit(length); buffer.position(0).limit(length);
buffer.put(byteBuffer.array(), byteBuffer.position(), length); if(byteBuffer.hasArray()){
buffer.put(byteBuffer.array(), byteBuffer.position(), length);
}else{
byte[] readcopy = new byte[length];
int pos = byteBuffer.position();
byteBuffer.get(readcopy);
byteBuffer.position(pos);
buffer.put(readcopy);
}
buffer.position(0); buffer.position(0);
packet.read(reads.get(), length); packet.read(reads.get(), length);
//move read packets forward //move read packets forward

View File

@@ -97,7 +97,7 @@ public class Net{
if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException){ if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException){
error = Core.bundle.get("error.io"); error = Core.bundle.get("error.io");
}else if(error.equals("mismatch")){ }else if(error.equals("mismatch") || (e instanceof IndexOutOfBoundsException && e.getStackTrace()[0].getClassName().contains("java.nio"))){
error = Core.bundle.get("error.mismatch"); error = Core.bundle.get("error.mismatch");
}else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.neatError(e).contains("address associated")){ }else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.neatError(e).contains("address associated")){
error = Core.bundle.get("error.invalidaddress"); error = Core.bundle.get("error.invalidaddress");

View File

@@ -664,7 +664,7 @@ public class UnitType extends UnlockableContent{
if(unit.item() != null && unit.itemTime > 0.01f){ if(unit.item() != null && unit.itemTime > 0.01f){
float size = (itemSize + Mathf.absin(Time.time, 5f, 1f)) * unit.itemTime; float size = (itemSize + Mathf.absin(Time.time, 5f, 1f)) * unit.itemTime;
Draw.mixcol(Pal.accent, Mathf.absin(Time.time, 5f, 0.5f)); Draw.mixcol(Pal.accent, Mathf.absin(Time.time, 5f, 0.1f));
Draw.rect(unit.item().fullIcon, Draw.rect(unit.item().fullIcon,
unit.x + Angles.trnsx(unit.rotation + 180f, itemOffsetY), unit.x + Angles.trnsx(unit.rotation + 180f, itemOffsetY),
unit.y + Angles.trnsy(unit.rotation + 180f, itemOffsetY), unit.y + Angles.trnsy(unit.rotation + 180f, itemOffsetY),

View File

@@ -33,7 +33,6 @@ public class ParticleWeather extends Weather{
region = Core.atlas.find(particleRegion); region = Core.atlas.find(particleRegion);
//load noise texture //load noise texture
//TODO mod support
if(drawNoise && Core.assets != null){ if(drawNoise && Core.assets != null){
Core.assets.load("sprites/" + noisePath + ".png", Texture.class); Core.assets.load("sprites/" + noisePath + ".png", Texture.class);
} }

View File

@@ -6,6 +6,7 @@ import arc.graphics.*;
import arc.input.*; import arc.input.*;
import arc.math.*; import arc.math.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.TextButton.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
@@ -34,6 +35,7 @@ public class JoinDialog extends BaseDialog{
int totalHosts; int totalHosts;
int refreshes; int refreshes;
boolean showHidden; boolean showHidden;
TextButtonStyle style;
String lastIp; String lastIp;
int lastPort; int lastPort;
@@ -42,6 +44,15 @@ public class JoinDialog extends BaseDialog{
public JoinDialog(){ public JoinDialog(){
super("@joingame"); super("@joingame");
style = new TextButtonStyle(){{
over = Styles.flatOver;
font = Fonts.def;
fontColor = Color.white;
disabledFontColor = Color.gray;
down = Styles.flatOver;
up = Styles.black5;
}};
loadServers(); loadServers();
if(!steam) buttons.add().width(60f); if(!steam) buttons.add().width(60f);
@@ -119,7 +130,7 @@ public class JoinDialog extends BaseDialog{
//why are java lambdas this bad //why are java lambdas this bad
TextButton[] buttons = {null}; TextButton[] buttons = {null};
TextButton button = buttons[0] = remote.button("[accent]" + server.displayIP(), Styles.cleart, () -> { TextButton button = buttons[0] = remote.button("[accent]" + server.displayIP(), style, () -> {
if(!buttons[0].childrenPressed()){ if(!buttons[0].childrenPressed()){
if(server.lastHost != null){ if(server.lastHost != null){
Events.fire(new ClientPreConnectEvent(server.lastHost)); Events.fire(new ClientPreConnectEvent(server.lastHost));
@@ -405,7 +416,7 @@ public class JoinDialog extends BaseDialog{
float w = targetWidth(); float w = targetWidth();
//TODO looks bad //TODO looks bad
container.button(b -> buildServer(host, b), Styles.cleart, () -> { container.button(b -> buildServer(host, b), style, () -> {
Events.fire(new ClientPreConnectEvent(host)); Events.fire(new ClientPreConnectEvent(host));
if(!Core.settings.getBool("server-disclaimer", false)){ if(!Core.settings.getBool("server-disclaimer", false)){
ui.showCustomConfirm("@warning", "@servers.disclaimer", "@ok", "@back", () -> { ui.showCustomConfirm("@warning", "@servers.disclaimer", "@ok", "@back", () -> {
@@ -442,7 +453,7 @@ public class JoinDialog extends BaseDialog{
local.row(); local.row();
local.button(b -> buildServer(host, b), Styles.cleart, () -> { local.button(b -> buildServer(host, b), style, () -> {
Events.fire(new ClientPreConnectEvent(host)); Events.fire(new ClientPreConnectEvent(host));
safeConnect(host.address, host.port, host.version); safeConnect(host.address, host.port, host.version);
}).width(w); }).width(w);

View File

@@ -72,7 +72,6 @@ public class KeybindDialog extends Dialog{
} }
if(sections.length != 1){ if(sections.length != 1){
//TODO toggle style
TextButton button = new TextButton(bundle.get("section." + section.name + ".name", Strings.capitalize(section.name))/*, "toggle"*/); TextButton button = new TextButton(bundle.get("section." + section.name + ".name", Strings.capitalize(section.name))/*, "toggle"*/);
if(section.equals(this.section)) if(section.equals(this.section))
button.toggle(); button.toggle();

View File

@@ -324,7 +324,6 @@ public class ModsDialog extends BaseDialog{
if(showImport) dialog.buttons.button("@mods.browser.reinstall", Icon.download, () -> githubImportMod(mod.getRepo(), mod.isJava())); if(showImport) dialog.buttons.button("@mods.browser.reinstall", Icon.download, () -> githubImportMod(mod.getRepo(), mod.isJava()));
} }
//TODO improve this menu later
dialog.cont.pane(desc -> { dialog.cont.pane(desc -> {
desc.center(); desc.center();
desc.defaults().padTop(10).left(); desc.defaults().padTop(10).left();

View File

@@ -241,7 +241,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
dialog.add("@sectors.captured"); dialog.add("@sectors.captured");
} }
//TODO //TODO unimplemented, cutscene needed
public void showPlanetLaunch(Sector sector, Cons<Sector> listener){ public void showPlanetLaunch(Sector sector, Cons<Sector> listener){
selected = null; selected = null;
hovered = null; hovered = null;

View File

@@ -423,12 +423,17 @@ public class SettingsMenuDialog extends Dialog{
} }
}); });
graphics.checkPref("linear", !mobile, b -> { //iOS (and possibly Android) devices do not support linear filtering well, so disable it
for(Texture tex : Core.atlas.getTextures()){ if(!ios){
TextureFilter filter = b ? TextureFilter.linear : TextureFilter.nearest; graphics.checkPref("linear", !mobile, b -> {
tex.setFilter(filter, filter); for(Texture tex : Core.atlas.getTextures()){
} TextureFilter filter = b ? TextureFilter.linear : TextureFilter.nearest;
}); tex.setFilter(filter, filter);
}
});
}else{
settings.put("linear", false);
}
if(Core.settings.getBool("linear")){ if(Core.settings.getBool("linear")){
for(Texture tex : Core.atlas.getTextures()){ for(Texture tex : Core.atlas.getTextures()){

View File

@@ -267,6 +267,7 @@ public class HudFragment extends Fragment{
//core info //core info
parent.fill(t -> { parent.fill(t -> {
t.top(); t.top();
t.visible(() -> shown);
t.name = "coreinfo"; t.name = "coreinfo";

View File

@@ -774,6 +774,11 @@ public class Block extends UnlockableContent{
return ContentType.block; return ContentType.block;
} }
@Override
public boolean logicVisible(){
return buildVisibility != BuildVisibility.hidden;
}
/** Called after all blocks are created. */ /** Called after all blocks are created. */
@Override @Override
@CallSuper @CallSuper
@@ -838,7 +843,7 @@ public class Block extends UnlockableContent{
//load specific team regions //load specific team regions
teamRegions = new TextureRegion[Team.all.length]; teamRegions = new TextureRegion[Team.all.length];
for(Team team : Team.all){ for(Team team : Team.all){
teamRegions[team.id] = teamRegion.found() ? Core.atlas.find(name + "-team-" + team.name, teamRegion) : teamRegion; teamRegions[team.id] = teamRegion.found() && team.hasPalette ? Core.atlas.find(name + "-team-" + team.name, teamRegion) : teamRegion;
} }
if(variants != 0){ if(variants != 0){

View File

@@ -134,24 +134,26 @@ public class Build{
return false; return false;
} }
//find closest core, if it doesn't match the team, placing is not legal if(!state.rules.editor){
if(state.rules.polygonCoreProtection){ //find closest core, if it doesn't match the team, placing is not legal
float mindst = Float.MAX_VALUE; if(state.rules.polygonCoreProtection){
CoreBuild closest = null; float mindst = Float.MAX_VALUE;
for(TeamData data : state.teams.active){ CoreBuild closest = null;
for(CoreBuild tile : data.cores){ for(TeamData data : state.teams.active){
float dst = tile.dst2(x * tilesize + type.offset, y * tilesize + type.offset); for(CoreBuild tile : data.cores){
if(dst < mindst){ float dst = tile.dst2(x * tilesize + type.offset, y * tilesize + type.offset);
closest = tile; if(dst < mindst){
mindst = dst; closest = tile;
mindst = dst;
}
} }
} }
} if(closest != null && closest.team != team){
if(closest != null && closest.team != team){ return false;
}
}else if(state.teams.eachEnemyCore(team, core -> Mathf.dst(x * tilesize + type.offset, y * tilesize + type.offset, core.x, core.y) < state.rules.enemyCoreBuildRadius + type.size * tilesize / 2f)){
return false; return false;
} }
}else if(state.teams.eachEnemyCore(team, core -> Mathf.dst(x * tilesize + type.offset, y * tilesize + type.offset, core.x, core.y) < state.rules.enemyCoreBuildRadius + type.size * tilesize / 2f)){
return false;
} }
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);

View File

@@ -109,10 +109,15 @@ public class Accelerator extends Block{
if(!state.isCampaign() || !consValid()) return; if(!state.isCampaign() || !consValid()) return;
ui.planet.showPlanetLaunch(state.rules.sector, sector -> { //TODO implement
//TODO cutscene, etc... if(true){
consume(); ui.showInfo("@indev.campaign");
}); }else{
ui.planet.showPlanetLaunch(state.rules.sector, sector -> {
//TODO cutscene, etc...
consume();
});
}
Events.fire(Trigger.acceleratorUse); Events.fire(Trigger.acceleratorUse);
} }

View File

@@ -149,7 +149,7 @@ public class LaunchPad extends Block{
public void display(Table table){ public void display(Table table){
super.display(table); super.display(table);
if(!state.isCampaign()) return; if(!state.isCampaign() || net.client()) return;
table.row(); table.row();
table.label(() -> { table.label(() -> {

View File

@@ -3,8 +3,10 @@ package mindustry.world.blocks.defense;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.bullet.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;
@@ -18,6 +20,9 @@ public class ShockMine extends Block{
public int length = 10; public int length = 10;
public int tendrils = 6; public int tendrils = 6;
public Color lightningColor = Pal.lancerLaser; public Color lightningColor = Pal.lancerLaser;
public int shots = 6;
public float inaccuracy = 0f;
public @Nullable BulletType bullet;
public float teamAlpha = 0.3f; public float teamAlpha = 0.3f;
public @Load("@-team-top") TextureRegion teamRegion; public @Load("@-team-top") TextureRegion teamRegion;
@@ -46,17 +51,26 @@ public class ShockMine extends Block{
@Override @Override
public void drawCracks(){ public void drawCracks(){
//no
} }
@Override @Override
public void unitOn(Unit unit){ public void unitOn(Unit unit){
if(enabled && unit.team != team && timer(timerDamage, cooldown)){ if(enabled && unit.team != team && timer(timerDamage, cooldown)){
for(int i = 0; i < tendrils; i++){ triggered();
Lightning.create(team, lightningColor, damage, x, y, Mathf.random(360f), length);
}
damage(tileDamage); damage(tileDamage);
} }
} }
public void triggered(){
for(int i = 0; i < tendrils; i++){
Lightning.create(team, lightningColor, damage, x, y, Mathf.random(360f), length);
}
if(bullet != null){
for(int i = 0; i < shots; i++){
bullet.create(this, x, y, (360f / shots) * i + Mathf.random(inaccuracy));
}
}
}
} }
} }

View File

@@ -136,6 +136,7 @@ public class ItemTurret extends Turret{
} }
BulletType type = ammoTypes.get(item); BulletType type = ammoTypes.get(item);
if(type == null) return;
totalAmmo += type.ammoMultiplier; totalAmmo += type.ammoMultiplier;
//find ammo entry by type //find ammo entry by type

View File

@@ -100,17 +100,27 @@ public class LiquidTurret extends Turret{
@Override @Override
protected void findTarget(){ protected void findTarget(){
if(extinguish && liquids.current().canExtinguish()){ if(extinguish && liquids.current().canExtinguish()){
Fire result = null;
float mindst = 0f;
int tr = (int)(range / tilesize); int tr = (int)(range / tilesize);
for(int x = -tr; x <= tr; x++){ for(int x = -tr; x <= tr; x++){
for(int y = -tr; y <= tr; y++){ for(int y = -tr; y <= tr; y++){
Tile other = world.tileWorld(x + tile.x, y + tile.y); Tile other = world.tile(x + tile.x, y + tile.y);
var fire = Fires.get(x + tile.x, y + tile.y);
float dst = fire == null ? 0 : dst2(fire);
//do not extinguish fires on other team blocks //do not extinguish fires on other team blocks
if(other != null && Fires.has(x + tile.x, y + tile.y) && (other.build == null || other.team() == team)){ if(other != null && fire != null && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){
target = Fires.get(x + tile.x, y + tile.y); result = fire;
return; mindst = dst;
} }
} }
} }
if(result != null){
target = result;
//don't run standard targeting
return;
}
} }
super.findTarget(); super.findTarget();

View File

@@ -43,6 +43,10 @@ public class PayloadRouter extends PayloadConveyor{
do{ do{
rotation = (rotation + 1) % 4; rotation = (rotation + 1) % 4;
onProximityUpdate(); onProximityUpdate();
//force update to transfer if necessary
if(next instanceof PayloadConveyorBuild && !(next instanceof PayloadRouterBuild)){
next.updateTile();
}
//this condition intentionally uses "accept from itself" conditions, because payload conveyors only accept during the start //this condition intentionally uses "accept from itself" conditions, because payload conveyors only accept during the start
//"accept from self" conditions are for dropped payloads and are less restrictive //"accept from self" conditions are for dropped payloads and are less restrictive
}while((blocked || next == null || !next.acceptPayload(next, item)) && ++rotations < 4); }while((blocked || next == null || !next.acceptPayload(next, item)) && ++rotations < 4);

View File

@@ -12,6 +12,7 @@ import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.blocks.storage.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -69,7 +70,7 @@ public class PayloadSource extends PayloadBlock{
} }
public boolean canProduce(Block b){ public boolean canProduce(Block b){
return b.isVisible() && b.size < size; return b.isVisible() && b.size < size && !(b instanceof CoreBlock);
} }
public boolean canProduce(UnitType t){ public boolean canProduce(UnitType t){

View File

@@ -1,6 +1,7 @@
package mindustry.world.blocks.production; package mindustry.world.blocks.production;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
@@ -67,6 +68,8 @@ public class Fracker extends SolidPump{
super.updateTile(); super.updateTile();
accumulator += delta() * efficiency(); accumulator += delta() * efficiency();
}else{ }else{
warmup = Mathf.lerpDelta(warmup, 0f, 0.02f);
lastPump = 0f;
dumpLiquid(result); dumpLiquid(result);
} }
} }

View File

@@ -8,7 +8,6 @@ import arc.util.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.production.GenericCrafter.*; import mindustry.world.blocks.production.GenericCrafter.*;
//TODO
public class DrawArcSmelter extends DrawBlock{ public class DrawArcSmelter extends DrawBlock{
public TextureRegion top, bottom; public TextureRegion top, bottom;
public Color flameColor = Color.valueOf("f58349"), midColor = Color.valueOf("f2d585"); public Color flameColor = Color.valueOf("f58349"), midColor = Color.valueOf("f2d585");

View File

@@ -38,6 +38,6 @@ public class DrawWeave extends DrawBlock{
@Override @Override
public TextureRegion[] icons(Block block){ public TextureRegion[] icons(Block block){
return new TextureRegion[]{bottom, block.region, weave}; return new TextureRegion[]{bottom, weave, block.region};
} }
} }

View File

@@ -322,7 +322,9 @@ public class DesktopLauncher extends ClientLauncher{
presence.largeImageKey = "logo"; presence.largeImageKey = "logo";
DiscordRPC.send(presence); try{
DiscordRPC.send(presence);
}catch(Exception ignored){}
} }
if(steam){ if(steam){

View File

@@ -88,8 +88,12 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback,
net.handleException(t); net.handleException(t);
} }
} }
}catch(SteamException e){ }catch(Exception e){
Log.err(e); if(net.server()){
Log.err(e);
}else{
net.showError(e);
}
} }
} }
} }
@@ -303,7 +307,8 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback,
try{ try{
SteamID lobby = smat.getLobbyByIndex(i); SteamID lobby = smat.getLobbyByIndex(i);
String mode = smat.getLobbyData(lobby, "gamemode"); String mode = smat.getLobbyData(lobby, "gamemode");
if(mode == null || mode.isEmpty() || Strings.parseInt(smat.getLobbyData(lobby, "version"), -1) == -1) continue; //make sure versions are equal, don't list incompatible lobbies
if(mode == null || mode.isEmpty() || (Version.build != -1 && Strings.parseInt(smat.getLobbyData(lobby, "version"), -1) != Version.build)) continue;
Host out = new Host( Host out = new Host(
-1, //invalid ping -1, //invalid ping
smat.getLobbyData(lobby, "name"), smat.getLobbyData(lobby, "name"),

View File

@@ -1,14 +1,51 @@
Crée des chaînes de ravitaillement pour tes défenses, produis les matériaux de construction pour aggrandir et protéger tes bâtiments contre des vagues d'ennemis. Joue avec tes amis grâce à des jeux multijoueurs co-op cross-plateformes, ou défie-les dans des parties en JcJ par équipe. Créer des chaînes de ravitaillement pour tes défenses, produisez des matériaux à utiliser pour vos constructions et protégez vos structures des vagues d'ennemis. Jouez avec vos amis dans des parties multijoueurs cross-plateformes en co-op ou défiez-les lors de matchs PvP en équipe.
Caractéristiques: <h2>Caractéristiques du jeu</h2>
- 24 cartes integrées
- Une campagne, complète avec un arbre de recherche et des zones à débloquer - Utilisez les usines de production avancés pour créer des ressources plus complexes.
- 4 puissants boss de fin de vague à vaincre - Défendez vos structures contre les vagues d'ennemis.
- Systèmes de transport d'énergie, liquides et objets - Jouez avec vos amis dans des jeux coopératifs multijoueurs multi plateformes, ou défiez-les dans des matchs JcJ par équipe.
- 19 différents types de drones, méchas et vaisseaux - Gérez l'acheminent des liquides et combattez les incendies des raids d'avions ennemis.
- 120+ blocs technologiques à maîtriser - Boostez la production en approvisionnant vos blocs de défense et de production avec des liquides de refroidissement et des lubrifiants optionnels.
- 75+ différents blocs environnementaux - Produisez une grande variété d'unités pour la gestion automatique de votre base ou l'assaut des bases ennemies.
- Multijoueur cross-plateforme via réseau local or serveurs dédiés
- Règles de jeu personnalisables: Change le coût des structures, les stats des ennemis, les ressources de départ, fréquence des vagues et plus
- Un éditeur puissant dotés d'outils pour générer aléatoirement des minéraux, le terrain, des décorations et appliquer une symétrie au terrain. <h2>Campagne</h2>
- Vagues d'ennemis personnalisables
- Partez à la conquête de la planète Serpulo en progressant dans plus de 250 secteurs générés de manière procédurale et sur 16 cartes créées à la main.
- Capturez des territoires et installez des usines pour produire des ressources pendant que vous jouez dans d'autres secteurs.
- Défendez vos secteurs contre les invasions périodiques.
- Coordonner la distribution des ressources entre les secteurs via des rampes de lancement.
- Recherchez de nouveaux blocs pour alimenter votre progression.
- Invitez vos amis à accomplir des missions ensemble.
- Plus de 130 blocs technologiques à maîtriser.
- 33 types différents de drones, de mechs et de vaisseaux.
<h2>Modes de jeu</h2>
- <b>Survie</b> : Construisez des tourelles pour défendre votre base des ennemis dans un style de jeu inspiré des tower-defense. Survivez aussi longtemps que possible, avant de faire décoller votre noyau. Utilisez les ressources récoltées pour débloquer de nouvelles technologies. Préparez votre base pour les attaques de puissants boss aériens.
- <b>Attaque</b> : Construisez des usines et produisez des unités pour détruire les noyaux ennemis, tout en défendant votre base contre les vagues d'attaque. Créez une grande variété d'unités offensives et de support pour vous aider dans vos objectifs.
- <b>PvP</b> : Affrontez d'autres joueurs dans jusqu'à 4 équipes différentes pour détruire les noyaux des autres. Créez des unités, ou attaquez directement les autres bases avec vos mechs.
- <b>Bac à sable</b> : Jouez avec des ressources infinies et sans menace ennemie. Utilisez des objets et des blocs spécifiques à ce mode de jeu tels que les sources de liquides. Testez vos designs et faites apparaître les ennemis à la demande.
<h2>Jeux &amp; Cartes Personnalisés; Multijoueurs Cross-Plateformes</h2>
- 16 cartes supplémentaires pour vos parties personnalisées en plus des cartes de la campagne.
- Jouez en Co-op, en PvP ou en mode Bac à sable.
- Rejoignez un serveur public dédié ou invitez vos amis à votre propre session privée.
- Règles de jeu personnalisables: Modifiez le coût des blocs, les statistiques des ennemis, les objets de départ, le timing des vagues, etc...
- Mixez les modes de jeux: combinez PvP et PvE dans la même partie.
<h2>Éditeur de cartes personnalisées</h2>
- Peignez le terrain grâce à une interface d'édition.
- Éditez and prévisualisez les structures en jeu.
- Outils d'édition configurables: choisissez comment chaque outil fonctionne.
- Générateur de carte puissant, disposant d'un grand nombre de filtres permettant la manipulation procédurale du terrain.
- Appliquez les effets bruit, distortion, lissage, erosion, symétrie, génération de minerais et terrain aléatoire.
- Randomisez et configurez la génération des minerais ainsi que le placement des rivières et des tuiles de ressources.
- Configurez la disposition des vagues ennemies.
- Personnalisez les règles de base de vos cartes
- Utilisez plus de 80 blocs environnementaux différents.

View File

@@ -10,4 +10,4 @@ kapt.include.compile.classpath=false
kotlin.stdlib.default.dependency=false kotlin.stdlib.default.dependency=false
#needed for android compilation #needed for android compilation
android.useAndroidX=true android.useAndroidX=true
archash=52f21644b8f70c3a926d3d8d8130f0d71e0e4e79 archash=1142cfc35b6671c6a2c5566632ff044a46527b82

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -1,14 +0,0 @@
[
{
"address": "mindustry.atannergaming.com"
},
{
"address": "mindustry.atannergaming.com:7000"
},
{
"address": "mindustry.atannergaming.com:8000"
},
{
"address": "mindustry.atannergaming.com:6800"
}
]

View File

@@ -1,17 +1,14 @@
[ [
{
"address": "mindustry.us.to"
},
{ {
"address": "be.mindustry.nydus.app:6567" "address": "be.mindustry.nydus.app:6567"
}, },
{
"address": "157.90.180.53:25777"
},
{ {
"address": "mindustry.pl:7777" "address": "mindustry.pl:7777"
}, },
{ {
"address": "mindurka.tk:9999" "address": "v7.mindurka.tk:9999"
},
{
"address": "c-n.ddns.net:6567"
} }
] ]

View File

@@ -21,7 +21,7 @@
}, },
{ {
"name": "C.A.M.S.", "name": "C.A.M.S.",
"address": ["routerchain.ddns.net", "nikochio.ddns.net", "play.thedimas.pp.ua"] "address": ["baseduser.eu.org:6568", "nikochio.ddns.net", "play.thedimas.pp.ua"]
}, },
{ {
"name": "BE6.RUN", "name": "BE6.RUN",
@@ -65,7 +65,7 @@
}, },
{ {
"name": "Korea", "name": "Korea",
"address": ["mindustry.kr"] "address": ["mindustry.kr", "mindustry.initd.kr"]
}, },
{ {
"name": "hexpvp.ml", "name": "hexpvp.ml",

45
servers_v7.json Normal file
View File

@@ -0,0 +1,45 @@
[
{
"address": "mindustry.us.to"
},
{
"name": "mindustry.pl",
"address": ["mindustry.pl:6000", "mindustry.pl:6666", "mindustry.pl:6966"]
},
{
"name": "C.A.M.S.",
"address": ["baseduser.eu.org:6569", "v7.thedimas.pp.ua"]
}
{
"name": "hexpvp.ml",
"address": "hexpvp.ml"
},
{
"name": "[accent]Mindustry [red]Reborn",
"address": "mindustry.me:7000"
},
{
"name": "Omega",
"address": "157.90.180.53:25777"
},
{
"name": "MeowLand",
"address": "34.134.111.15"
},
{
"name": "Mindurka",
"address": ["mindurka.tk", "mindurka.tk:4000"]
},
{
"name": "Chaotic Neutral",
"address": ["c-n.ddns.net:5555", "c-n.ddns.net:6666"]
},
{
"name": "XCore",
"address": "178.170.47.34:28110"
},
{
"name": "Obvilion Network",
"address": "obvilionnetwork.ru:7004"
}
]

View File

@@ -1,8 +1,6 @@
import arc.*; import arc.*;
import arc.backend.headless.*; import arc.backend.headless.*;
import arc.files.*; import arc.files.*;
import arc.func.*;
import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
@@ -118,7 +116,6 @@ public class ApplicationTests{
Thread.sleep(10); Thread.sleep(10);
} }
Block block = content.getByName(ContentType.block, "build2"); Block block = content.getByName(ContentType.block, "build2");
assertEquals("build2", block == null ? null : block.name, "2x2 construct block doesn't exist?"); assertEquals("build2", block == null ? null : block.name, "2x2 construct block doesn't exist?");
}catch(Throwable r){ }catch(Throwable r){
@@ -184,7 +181,7 @@ public class ApplicationTests{
@Test @Test
void serverListJson(){ void serverListJson(){
String[] files = {"servers.json", "servers_be.json", "servers_v6.json"}; String[] files = {"servers_v6.json", "servers_v7.json", "servers_be.json"};
for(String file : files){ for(String file : files){
try{ try{
@@ -508,72 +505,6 @@ public class ApplicationTests{
world.tile(0, 0).build.acceptStack(Items.copper, 1000, null); world.tile(0, 0).build.acceptStack(Items.copper, 1000, null);
} }
@Test
void indexingBasic(){
resetWorld();
SaveIO.load(Core.files.internal("77.msav"));
//test basic method.
Rand r = new Rand(0);
Building[] res = {null};
Cons<Building> assigner = t -> res[0] = t;
int iterations = 100;
r.setSeed(0);
//warmup.
for(int i = 0; i < iterations; i++){
int x = r.random(0, world.width()), y = r.random(0, world.height());
float range = r.random(tilesize * 30);
indexer.eachBlock(Team.sharded, x * tilesize, y * tilesize, range, t -> true, assigner);
}
//TODO impl
/*
r.setSeed(0);
for(int i = 0; i < iterations; i++){
int x = r.random(0, world.width()), y = r.random(0, world.height());
float range = r.random(tilesize * 30);
indexer.eachBlock2(Team.sharded, x * tilesize, y * tilesize, range, t -> true, assigner);
}*/
//benchmark.
r.setSeed(0);
Time.mark();
for(int i = 0; i < iterations; i++){
int x = r.random(0, world.width()), y = r.random(0, world.height());
float range = r.random(tilesize * 30);
indexer.eachBlock(Team.sharded, x * tilesize, y * tilesize, range, t -> true, assigner);
}
Log.info("Time for basic indexing: @", Time.elapsed());
r.setSeed(0);
/*
Time.mark();
for(int i = 0; i < iterations; i++){
int x = r.random(0, world.width()), y = r.random(0, world.height());
float range = r.random(tilesize * 30);
indexer.eachBlock2(Team.sharded, x * tilesize, y * tilesize, range, t -> true, assigner);
}
Log.info("Time for quad: {0}", Time.elapsed());
*/
}
@Test @Test
void conveyorBench(){ void conveyorBench(){
int[] itemsa = {0}; int[] itemsa = {0};

View File

@@ -24,7 +24,7 @@ public class ModTestBM extends GenericModTest{
assertNotNull(type, "A mod block must be loaded."); assertNotNull(type, "A mod block must be loaded.");
assertSame(type.buildVisibility, BuildVisibility.shown, "A mod block must be buildable."); assertSame(type.buildVisibility, BuildVisibility.shown, "A mod block must be buildable.");
world.loadMap(ApplicationTests.testMap); world.loadMap(maps.loadInternalMap("groundZero"));
Tile t = world.tile(3, 3); Tile t = world.tile(3, 3);
t.setBlock(type); t.setBlock(type);

View File

@@ -4,6 +4,7 @@ import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import static mindustry.Vars.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
//grabs a version-locked exotic-mod commit and makes sure its content is parsed correctly //grabs a version-locked exotic-mod commit and makes sure its content is parsed correctly
@@ -23,7 +24,7 @@ public class ModTestExotic extends GenericModTest{
assertNotNull(type, "A mod unit must be loaded."); assertNotNull(type, "A mod unit must be loaded.");
assertTrue(type.weapons.size > 0, "A mod unit must have a weapon."); assertTrue(type.weapons.size > 0, "A mod unit must have a weapon.");
Vars.world.loadMap(ApplicationTests.testMap); Vars.world.loadMap(maps.loadInternalMap("groundZero"));
Unit unit = type.spawn(0, 0); Unit unit = type.spawn(0, 0);

View File

@@ -4,6 +4,7 @@ import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import static mindustry.Vars.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
//grabs a version-locked Heavy Armaments Industries commit and makes sure it initializes correctly //grabs a version-locked Heavy Armaments Industries commit and makes sure it initializes correctly
@@ -22,7 +23,7 @@ public class ModTestHAI extends GenericModTest{
assertNotNull(type, "A mod unit must be loaded."); assertNotNull(type, "A mod unit must be loaded.");
assertTrue(type.weapons.size > 0, "A mod unit must have a weapon."); assertTrue(type.weapons.size > 0, "A mod unit must have a weapon.");
Vars.world.loadMap(ApplicationTests.testMap); Vars.world.loadMap(maps.loadInternalMap("groundZero"));
Unit unit = type.spawn(0, 0); Unit unit = type.spawn(0, 0);

View File

@@ -390,7 +390,6 @@ public class Generators{
} }
}); });
//TODO broken, freezes
generate("unit-icons", () -> content.units().each(type -> { generate("unit-icons", () -> content.units().each(type -> {
if(type.isHidden()) return; //hidden units don't generate if(type.isHidden()) return; //hidden units don't generate

View File

@@ -14,6 +14,7 @@ import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.logic.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import java.io.*; import java.io.*;
@@ -86,7 +87,8 @@ public class ImagePacker{
Time.mark(); Time.mark();
Generators.run(); Generators.run();
Log.info("&ly[Generator]&lc Total time to generate: &lg@&lcms", Time.elapsed()); Log.info("&ly[Generator]&lc Total time to generate: &lg@&lcms", Time.elapsed());
//Log.info("&ly[Generator]&lc Total images created: &lg@", Image.total());
//write icons to icons.properties
//format: //format:
//character-ID=contentname:texture-name //character-ID=contentname:texture-name
@@ -118,6 +120,74 @@ public class ImagePacker{
} }
writer.close(); writer.close();
//now, write the IDs to logicids.dat
//don't write to the file unless I'm packing, because logic IDs rarely change and I don't want merge conflicts from PRs
if(!OS.username.equals("anuke")) return;
//format: ([content type (byte)] [content count (short)] (repeat [name (string)])) until EOF
Fi logicidfile = Fi.get("../../../assets/logicids.dat");
Seq<UnlockableContent> lookupCont = new Seq<>();
for(ContentType t : GlobalConstants.lookableContent){
lookupCont.addAll(Vars.content.<UnlockableContent>getBy(t).select(UnlockableContent::logicVisible));
}
ObjectIntMap<UnlockableContent>[] registered = new ObjectIntMap[ContentType.all.length];
IntMap<UnlockableContent>[] idToContent = new IntMap[ContentType.all.length];
for(int i = 0; i < ContentType.all.length; i++){
registered[i] = new ObjectIntMap<>();
idToContent[i] = new IntMap<>();
}
if(logicidfile.exists()){
try(DataInputStream in = new DataInputStream(logicidfile.readByteStream())){
for(ContentType ctype : GlobalConstants.lookableContent){
short amount = in.readShort();
for(int i = 0; i < amount; i++){
String name = in.readUTF();
UnlockableContent fetched = Vars.content.getByName(ctype, name);
if(fetched != null){
registered[ctype.ordinal()].put(fetched, i);
idToContent[ctype.ordinal()].put(i, fetched);
}
}
}
}
}
//map stuff that hasn't been mapped yet
for(UnlockableContent c : lookupCont){
int ctype = c.getContentType().ordinal();
if(!registered[ctype].containsKey(c)){
int nextId = 0;
//find next ID - this is O(N) but content counts are so low that I don't really care
//checking the last ID doesn't work because there might be "holes"
for(UnlockableContent other : lookupCont){
if(!idToContent[ctype].containsKey(other.id + 1)){
nextId = other.id + 1;
break;
}
}
idToContent[ctype].put(nextId, c);
registered[ctype].put(c, nextId);
}
}
//write the resulting IDs
try(DataOutputStream out = new DataOutputStream(logicidfile.write(false, 2048))){
for(ContentType t : GlobalConstants.lookableContent){
Seq<UnlockableContent> all = idToContent[t.ordinal()].values().toArray().sort(u -> registered[t.ordinal()].get(u));
out.writeShort(all.size);
for(UnlockableContent u : all){
out.writeUTF(u.name);
}
}
}
} }
static String texname(UnlockableContent c){ static String texname(UnlockableContent c){