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

 Conflicts:
	core/src/mindustry/content/Blocks.java
This commit is contained in:
Anuken
2021-06-09 17:10:49 -04:00
93 changed files with 1617 additions and 574 deletions

View File

@@ -18,7 +18,7 @@ See [CONTRIBUTING](CONTRIBUTING.md).
Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases).
If you'd rather compile on your own, follow these instructions. If you'd rather compile on your own, follow these instructions.
First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. **Other JDK versions will not work.** Open a terminal in the Mindustry directory and run the following commands: First, make sure you have [JDK 14](https://adoptopenjdk.net/archive.html?variant=openjdk14&jvmVariant=hotspot) installed. **Other JDK versions will not work.** Open a terminal in the Mindustry directory and run the following commands:
### Windows ### Windows

View File

@@ -18,7 +18,6 @@ import dalvik.system.*;
import mindustry.*; import mindustry.*;
import mindustry.game.Saves.*; import mindustry.game.Saves.*;
import mindustry.io.*; import mindustry.io.*;
import mindustry.mod.*;
import mindustry.net.*; import mindustry.net.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
@@ -67,9 +66,7 @@ public class AndroidLauncher extends AndroidApplication{
@Override @Override
public rhino.Context getScriptContext(){ public rhino.Context getScriptContext(){
rhino.Context result = AndroidRhinoContext.enter(((Context)AndroidLauncher.this).getCacheDir()); return AndroidRhinoContext.enter(getCacheDir());
result.setClassShutter(Scripts::allowClass);
return result;
} }
@Override @Override
@@ -78,7 +75,27 @@ public class AndroidLauncher extends AndroidApplication{
@Override @Override
public ClassLoader loadJar(Fi jar, ClassLoader parent) throws Exception{ public ClassLoader loadJar(Fi jar, ClassLoader parent) throws Exception{
return new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, parent); return new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, parent){
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
//check for loaded state
Class<?> loadedClass = findLoadedClass(name);
if(loadedClass == null){
try{
//try to load own class first
loadedClass = findClass(name);
}catch(ClassNotFoundException e){
//use parent if not found
loadedClass = super.loadClass(name, resolve);
}
}
if(resolve){
resolveClass(loadedClass);
}
return loadedClass;
}
};
} }
@Override @Override

View File

@@ -13,6 +13,8 @@ import com.android.dx.dex.cf.*;
import com.android.dx.dex.file.DexFile; import com.android.dx.dex.file.DexFile;
import com.android.dx.merge.*; import com.android.dx.merge.*;
import dalvik.system.*; import dalvik.system.*;
import mindustry.*;
import mindustry.mod.*;
import rhino.*; import rhino.*;
import java.io.*; import java.io.*;
@@ -30,23 +32,6 @@ public class AndroidRhinoContext{
* @return a context prepared for android * @return a context prepared for android
*/ */
public static Context enter(File cacheDirectory){ public static Context enter(File cacheDirectory){
if(!SecurityController.hasGlobal())
SecurityController.initGlobal(new SecurityController(){
@Override
public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){
return Context.getCurrentContext().createClassLoader(classLoader);
}
@Override
public Object getDynamicSecurityDomain(Object o){
return null;
}
@Override
public Object callWithDomain(Object o, Context context, Callable callable, Scriptable scriptable, Scriptable scriptable1, Object[] objects){
return null;
}
});
AndroidContextFactory factory; AndroidContextFactory factory;
if(!ContextFactory.hasExplicitGlobal()){ if(!ContextFactory.hasExplicitGlobal()){
@@ -78,6 +63,16 @@ public class AndroidRhinoContext{
initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader())); initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader()));
} }
@Override
protected Context makeContext(){
Context ctx = super.makeContext();
ctx.setClassShutter(Scripts::allowClass);
if(Vars.mods != null){
ctx.setApplicationClassLoader(Vars.mods.mainLoader());
}
return ctx;
}
/** /**
* Create a ClassLoader which is able to deal with bytecode * Create a ClassLoader which is able to deal with bytecode
* @param parent the parent of the create classloader * @param parent the parent of the create classloader

View File

@@ -143,7 +143,8 @@ public class EntityIO{
if(sl) cont("if(!islocal)"); if(sl) cont("if(!islocal)");
if(sf){ if(sf){
st(field.name + lastSuf + " = this." + field.name); //TODO + targetSuf may not give the right result, test it
st(field.name + lastSuf + " = this." + field.name + targetSuf);
} }
io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = "); io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = ");

View File

@@ -39,7 +39,7 @@ allprojects{
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94' steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94'
rhinoVersion = '099aed6c82f8094b3ba39a273b8d2ba7bdcc6443' rhinoVersion = '55bf0dac1cfa7770672fd26112512c733ca9d5dc'
loadVersionProps = { loadVersionProps = {
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

View File

@@ -460,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]No filters! Add one with the button below. filters.empty = [lightgray]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.enemyspawn = Enemy Spawn Select filter.enemyspawn = Enemy Spawn Select
@@ -476,6 +477,7 @@ filter.clear = Clear
filter.option.ignore = Ignore filter.option.ignore = Ignore
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
@@ -675,6 +677,7 @@ unit.nobuild = [scarlet]Unit can't build
lastaccessed = [lightgray]Last Accessed: {0} lastaccessed = [lightgray]Last Accessed: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <load map to show>
stat.description = Purpose stat.description = Purpose
stat.input = Input stat.input = Input
stat.output = Output stat.output = Output
@@ -1164,8 +1167,9 @@ block.spore-cluster.name = Spore Cluster
block.metal-floor.name = Metal Floor 1 block.metal-floor.name = Metal Floor 1
block.metal-floor-2.name = Metal Floor 2 block.metal-floor-2.name = Metal Floor 2
block.metal-floor-3.name = Metal Floor 3 block.metal-floor-3.name = Metal Floor 3
block.metal-floor-5.name = Metal Floor 4 block.metal-floor-4.name = Metal Floor 4
block.metal-floor-damaged.name = Metal Floor Damaged block.metal-floor-5.name = Metal Floor 5
block.metal-floor-damaged.name = Damaged Metal Floor
block.dark-panel-1.name = Dark Panel 1 block.dark-panel-1.name = Dark Panel 1
block.dark-panel-2.name = Dark Panel 2 block.dark-panel-2.name = Dark Panel 2
block.dark-panel-3.name = Dark Panel 3 block.dark-panel-3.name = Dark Panel 3

View File

@@ -67,6 +67,14 @@ schematic.delete.confirm = Dieser Entwurf wird vollständig vernichtet.
schematic.rename = Entwurf umbenennen schematic.rename = Entwurf umbenennen
schematic.info = {0}x{1}, {2} Blöcke schematic.info = {0}x{1}, {2} Blöcke
schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[] oder [accent]Server[] dürfen keine Entwürfe verwendet werden. schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[] oder [accent]Server[] dürfen keine Entwürfe verwendet werden.
schematic.tags = Tags:
schematic.edittags = Tags bearbeiten
schematic.addtag = Tag hinzufügen
schematic.texttag = Text-Tag
schematic.icontag = Bild-Tag
schematic.renametag = Tag umbenennen
schematic.tagdelconfirm = Dieses Tag wirklich löschen?
schematic.tagexists = Dieses Tag gibt es schon.
stats = Statistiken stats = Statistiken
stat.wave = Wellen besiegt:[accent] {0} stat.wave = Wellen besiegt:[accent] {0}
@@ -306,7 +314,6 @@ data.exported = Daten exportiert.
data.invalid = Dies sind keine gültigen Spieldaten. data.invalid = Dies sind keine gültigen Spieldaten.
data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Das kann nicht rückgängig gemacht werden![]\n\nSobald der Import abgeschlossen ist, wird dein Spiel sofort beendet. data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Das kann nicht rückgängig gemacht werden![]\n\nSobald der Import abgeschlossen ist, wird dein Spiel sofort beendet.
quit.confirm = Willst du wirklich aufhören? quit.confirm = Willst du wirklich aufhören?
quit.confirm.tutorial = Weißt du, was du tust?\nDu kannst das Tutorial unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen.
loading = [accent]Wird geladen... loading = [accent]Wird geladen...
reloading = [accent]Lade Mods neu... reloading = [accent]Lade Mods neu...
saving = [accent]Speichere... saving = [accent]Speichere...
@@ -477,6 +484,7 @@ filter.option.circle-scale = Kreisskalierung
filter.option.octaves = Oktaven filter.option.octaves = Oktaven
filter.option.falloff = Rückgang filter.option.falloff = Rückgang
filter.option.angle = Winkel filter.option.angle = Winkel
filter.option.rotate = Drehung
filter.option.amount = Menge filter.option.amount = Menge
filter.option.block = Block filter.option.block = Block
filter.option.floor = Boden filter.option.floor = Boden
@@ -498,6 +506,7 @@ load = Laden
save = Speichern save = Speichern
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Arbeitsspeicher: {0}mb memory = Arbeitsspeicher: {0}mb
memory2 = Arbeitsspeicher:\n {0}mb +\n {1}mb memory2 = Arbeitsspeicher:\n {0}mb +\n {1}mb
language.restart = Starte dein Spiel neu, um die Spracheinstellungen zu übernehmen. language.restart = Starte dein Spiel neu, um die Spracheinstellungen zu übernehmen.
@@ -530,7 +539,7 @@ launch.from = Items werden von [accent]{0} []gestartet
launch.destination = Ziel: {0} launch.destination = Ziel: {0}
configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein. configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein.
add = Hinzufügen... add = Hinzufügen...
boss.health = Boss-Lebenspunkte guardian = Boss
connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0} connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0}
error.unreachable = Server nicht erreichbar. error.unreachable = Server nicht erreichbar.
@@ -574,6 +583,7 @@ sector.attacked = Sektor [accent]{0}[white] wird angegriffen!
sector.lost = Sektor [accent]{0}[white] verloren! sector.lost = Sektor [accent]{0}[white] verloren!
#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]erobert! sector.captured = Sektor [accent]{0}[white]erobert!
sector.changeicon = Bild ändern
threat.low = Niedrig threat.low = Niedrig
threat.medium = Mittel threat.medium = Mittel
@@ -626,6 +636,7 @@ status.wet.name = Nass
status.muddy.name = Schlammig status.muddy.name = Schlammig
status.melting.name = Schmelzend status.melting.name = Schmelzend
status.sapped.name = Schwächend status.sapped.name = Schwächend
status.electrified.name = Elektrisch
status.spore-slowed.name = Sporen-verlangsamt status.spore-slowed.name = Sporen-verlangsamt
status.tarred.name = Teerend status.tarred.name = Teerend
status.overclock.name = Übertaktend status.overclock.name = Übertaktend
@@ -654,6 +665,7 @@ settings.clearcampaignsaves.confirm = Möchtest du wirklich alle Kampagne-Speich
paused = [accent]< Pausiert > paused = [accent]< Pausiert >
clear = Leeren clear = Leeren
banned = [scarlet]Verbannt banned = [scarlet]Verbannt
unsupported.environment = [scarlet]Umgebung nicht unterstützt
yes = Ja yes = Ja
no = Nein no = Nein
info.title = Info info.title = Info
@@ -682,8 +694,6 @@ stat.size = Größe
stat.displaysize = Bildschirmgröße stat.displaysize = Bildschirmgröße
stat.liquidcapacity = Flüssigkeitskapazität stat.liquidcapacity = Flüssigkeitskapazität
stat.powerrange = Stromreichweite stat.powerrange = Stromreichweite
stat.weapons = Waffen
stat.bullet = Geschoss
stat.linkrange = Verbindungsradius stat.linkrange = Verbindungsradius
stat.instructions = Befehle stat.instructions = Befehle
stat.powerconnections = Maximale Stromverbindungen stat.powerconnections = Maximale Stromverbindungen
@@ -694,6 +704,9 @@ stat.memorycapacity = Speicherkapazität
stat.basepowergeneration = Basis-Stromerzeugung stat.basepowergeneration = Basis-Stromerzeugung
stat.productiontime = Produktionszeit stat.productiontime = Produktionszeit
stat.repairtime = Zeit zur vollständigen Reparatur stat.repairtime = Zeit zur vollständigen Reparatur
stat.repairspeed = Heilungsgeschwindigkeit
stat.weapons = Waffen
stat.bullet = Geschoss
stat.speedincrease = Geschwindigkeitserhöhung stat.speedincrease = Geschwindigkeitserhöhung
stat.range = Reichweite stat.range = Reichweite
stat.drilltier = Abbaubare Erze stat.drilltier = Abbaubare Erze
@@ -737,13 +750,15 @@ stat.speedmultiplier = Geschwindigkeit-Multiplikator
stat.reloadmultiplier = Nachlade-Multiplikator stat.reloadmultiplier = Nachlade-Multiplikator
stat.buildspeedmultiplier = Baugeschwindigkeit-Multiplikator stat.buildspeedmultiplier = Baugeschwindigkeit-Multiplikator
stat.reactive = Reagiert mit stat.reactive = Reagiert mit
stat.healing = Heilung
ability.forcefield = Kraftfeld ability.forcefield = Kraftfeld
ability.repairfield = Heilungsfeld ability.repairfield = Heilungsfeld
ability.statusfield = Statusfeld ability.statusfield = {0} Statusfeld
ability.unitspawn = {0} Fabrik ability.unitspawn = {0} Fabrik
ability.shieldregenfield = Schild-regenerations-Feld ability.shieldregenfield = Schild-regenerations-Feld
ability.movelightning = Bewegungsblitze ability.movelightning = Bewegungsblitze
ability.energyfield = Energiefeld: [accent]{0}[] Schaden ~ [accent]{1}[] Blöcke / [accent]{2}[] Ziele
bar.drilltierreq = Besserer Bohrer benötigt bar.drilltierreq = Besserer Bohrer benötigt
bar.noresources = Fehlende Ressourcen bar.noresources = Fehlende Ressourcen
@@ -766,6 +781,7 @@ bar.power = Strom
bar.progress = Baufortschritt bar.progress = Baufortschritt
bar.input = Input bar.input = Input
bar.output = Output bar.output = Output
bar.strength = [stat]{0}[lightgray]x Stärke
units.processorcontrol = [lightgray]Prozessorgesteuert units.processorcontrol = [lightgray]Prozessorgesteuert
@@ -974,6 +990,7 @@ rules.wavetimer = Wellen-Timer
rules.waves = Wellen 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.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
@@ -1029,6 +1046,7 @@ item.blast-compound.name = Explosive Mischung
item.pyratite.name = Pyratit item.pyratite.name = Pyratit
item.metaglass.name = Metaglas item.metaglass.name = Metaglas
item.scrap.name = Schrott item.scrap.name = Schrott
liquid.water.name = Wasser liquid.water.name = Wasser
liquid.slag.name = Schlacke liquid.slag.name = Schlacke
liquid.oil.name = Öl liquid.oil.name = Öl
@@ -1060,6 +1078,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
@@ -1120,6 +1143,7 @@ block.sand-water.name = Sandiges Wasser
block.darksand-water.name = Dunkles sandiges Wasser block.darksand-water.name = Dunkles sandiges Wasser
block.char.name = Holzkohle block.char.name = Holzkohle
block.dacite.name = Dazit block.dacite.name = Dazit
block.rhyolite.name = Rhyolith
block.dacite-wall.name = Dazitwand block.dacite-wall.name = Dazitwand
block.dacite-boulder.name = Dazitgeröll block.dacite-boulder.name = Dazitgeröll
block.ice-snow.name = Eisschnee block.ice-snow.name = Eisschnee
@@ -1203,7 +1227,7 @@ block.pneumatic-drill.name = Pneumatischer Bohrer
block.laser-drill.name = Laser-Bohrer block.laser-drill.name = Laser-Bohrer
block.water-extractor.name = Wasser-Extraktor block.water-extractor.name = Wasser-Extraktor
block.cultivator.name = Kultivierer block.cultivator.name = Kultivierer
block.conduit.name = Leitungsrohr block.conduit.name = Kanal
block.mechanical-pump.name = Mechanische Pumpe block.mechanical-pump.name = Mechanische Pumpe
block.item-source.name = Materialquelle block.item-source.name = Materialquelle
block.item-void.name = Materialschlucker block.item-void.name = Materialschlucker
@@ -1227,6 +1251,7 @@ block.solar-panel.name = Solarpanel
block.solar-panel-large.name = Großes Solarpanel block.solar-panel-large.name = Großes Solarpanel
block.oil-extractor.name = Öl-Extraktor block.oil-extractor.name = Öl-Extraktor
block.repair-point.name = Reparaturpunkt block.repair-point.name = Reparaturpunkt
block.repair-turret.name = Reparaturstation
block.pulse-conduit.name = Impulskanal block.pulse-conduit.name = Impulskanal
block.plated-conduit.name = Gepanzerter Kanal block.plated-conduit.name = Gepanzerter Kanal
block.phase-conduit.name = Phasenkanal block.phase-conduit.name = Phasenkanal
@@ -1269,6 +1294,12 @@ block.exponential-reconstructor.name = Exponentieller Rekonstrukteur
block.tetrative-reconstructor.name = Tetrativer Rekonstrukteur block.tetrative-reconstructor.name = Tetrativer Rekonstrukteur
block.payload-conveyor.name = Einheitenförderband block.payload-conveyor.name = Einheitenförderband
block.payload-router.name = Einheitenverteiler block.payload-router.name = Einheitenverteiler
block.duct.name = Rohrleitung
block.duct-router.name = Rohrleitungsverteiler
block.duct-bridge.name = Rohrleitungsbrücke
block.payload-propulsion-tower.name = Frachtantriebsturm
block.payload-void.name = Frachtschlucker
block.payload-source.name = Frachtquelle
block.disassembler.name = Großer Trenner block.disassembler.name = Großer Trenner
block.silicon-crucible.name = Silizium Schmelztiegel block.silicon-crucible.name = Silizium Schmelztiegel
block.overdrive-dome.name = Beschleunigungs-Maschine block.overdrive-dome.name = Beschleunigungs-Maschine
@@ -1287,13 +1318,12 @@ block.large-logic-display.name = Großer Logik-Bildschirm
block.memory-cell.name = Speicherzelle block.memory-cell.name = Speicherzelle
block.memory-bank.name = Große Speicherzelle block.memory-bank.name = Große Speicherzelle
team.blue.name = Blau team.blue.name = blau
team.crux.name = Rot team.crux.name = rot
team.sharded.name = Orange team.sharded.name = gelb
team.orange.name = Orange team.derelict.name = derelikt
team.derelict.name = Derelikt team.green.name = grün
team.green.name = Grün team.purple.name = lila
team.purple.name = Lila
hint.skip = Überspringen hint.skip = Überspringen
hint.desktopMove = Drücke [accent][[WASD][], um dich zu bewegen. hint.desktopMove = Drücke [accent][[WASD][], um dich zu bewegen.
@@ -1311,6 +1341,7 @@ hint.placeConveyor.mobile = Förderbänder bewegen Materialien zwischen verschie
hint.placeTurret = Platziere \uf861 [accent]Geschütze[], um deine Basis vor Gegnern zu beschützen.\n\nGeschütze benötigen Munition - in diesem Fall \uf838Kupfer.\nBenutze Bohrer und Förderbänder, um dies zu besorgen. hint.placeTurret = Platziere \uf861 [accent]Geschütze[], um deine Basis vor Gegnern zu beschützen.\n\nGeschütze benötigen Munition - in diesem Fall \uf838Kupfer.\nBenutze Bohrer und Förderbänder, um dies zu besorgen.
hint.breaking = Benutze [accent]Rechtsklick[] und bewege deine Maus, um zu zerstören. hint.breaking = Benutze [accent]Rechtsklick[] und bewege deine Maus, um zu zerstören.
hint.breaking.mobile = Aktiviere den \ue817 [accent]Hammer[] unten rechts und tippe, um Blöcke zu zerstören.\n\nHalte deinen Finger auf dem Bildschirm, um eine Fläche auszuwählen. hint.breaking.mobile = Aktiviere den \ue817 [accent]Hammer[] unten rechts und tippe, um Blöcke zu zerstören.\n\nHalte deinen Finger auf dem Bildschirm, um eine Fläche auszuwählen.
hint.blockInfo = Genauere Blockinformationen können im [accent]Baumenü[] rechts beim [accent][[?][]-Symbol gefunden werden.
hint.research = Nehme den \ue875 [accent]Forschen[]-Knopf um neue Technologien zu erforschen. hint.research = Nehme den \ue875 [accent]Forschen[]-Knopf um neue Technologien zu erforschen.
hint.research.mobile = Nehme den \ue875 [accent]Forschen[]-Knopf im \ue88c [accent]Menü[], um neue Technologien zu erforschen. hint.research.mobile = Nehme den \ue875 [accent]Forschen[]-Knopf im \ue88c [accent]Menü[], um neue Technologien zu erforschen.
hint.unitControl = Halte [accent][[L-STRG][] und [accent]klicke[], um alliierte Einheiten oder Geschütze zu steuern. hint.unitControl = Halte [accent][[L-STRG][] und [accent]klicke[], um alliierte Einheiten oder Geschütze zu steuern.
@@ -1344,7 +1375,7 @@ item.graphite.description = Wird als Munition oder elektrischer Leiter eingesetz
item.sand.description = Nützlich für die Herstellung vieler anderer Materialien. item.sand.description = Nützlich für die Herstellung vieler anderer Materialien.
item.coal.description = Kann als Brennstoff oder zur Herstellung anderer Materialien verwendet werden. item.coal.description = Kann als Brennstoff oder zur Herstellung anderer Materialien verwendet werden.
item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon lange vor dem Seeding gebildet hat. item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon lange vor dem Seeding gebildet hat.
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt. item.titanium.description = Wird für Flüssigkeiten, Bohrer und Fabriken vielfältig eingesetzt.
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet. item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet. item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet.
item.scrap.details = Übriggebliebene Reste alter Blöcke oder Einheiten. item.scrap.details = Übriggebliebene Reste alter Blöcke oder Einheiten.
@@ -1565,7 +1596,7 @@ logic.nounitbuild = [red]Logik, die Blöcke baut, ist hier nicht erlaubt.
lenum.type = Englischer Name eines Blocks / einer Einheit. Ein Verteiler gibt [accent]@router[] wieder.\nKein string. lenum.type = Englischer Name eines Blocks / einer Einheit. Ein Verteiler gibt [accent]@router[] wieder.\nKein string.
lenum.shoot = Schießt auf eine Position. lenum.shoot = Schießt auf eine Position.
lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus. lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus.
lenum.configure = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer. lenum.config = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer.
lenum.enabled = Ob der Block an oder aus ist. lenum.enabled = Ob der Block an oder aus ist.
laccess.color = Illuminiererfarbe. laccess.color = Illuminiererfarbe.
@@ -1573,6 +1604,7 @@ laccess.controller = Einheitensteurer. Gibt "processor" zurück, wenn die Einhei
laccess.dead = Ob ein Block / eine Einheit tot oder nicht mehr gültig ist. laccess.dead = Ob ein Block / eine Einheit tot oder nicht mehr gültig ist.
laccess.controlled = Gibt zurück:\n[accent]@ctrlProcessor[] wenn die Einheit prozessorgesteuert ist\n[accent]@ctrlPlayer[] wenn die Einheit / der Block von einem Spieler gesteuert wird\n[accent]@ctrlFormation[] wenn die Einheit Teil einer Formation ist\nSonst 0. laccess.controlled = Gibt zurück:\n[accent]@ctrlProcessor[] wenn die Einheit prozessorgesteuert ist\n[accent]@ctrlPlayer[] wenn die Einheit / der Block von einem Spieler gesteuert wird\n[accent]@ctrlFormation[] wenn die Einheit Teil einer Formation ist\nSonst 0.
laccess.commanded = [red]Veraltet. Wird bald entfernt![]\nBenutze stattdessen [accent]controlled[]. laccess.commanded = [red]Veraltet. Wird bald entfernt![]\nBenutze stattdessen [accent]controlled[].
laccess.progress = Fortschritt, von 0 bis 1.\nGibt Produktion, Nachladestatus or Baufortschritt zurück.
graphicstype.stroke = Setzt die Linienbreite fest. graphicstype.stroke = Setzt die Linienbreite fest.
graphicstype.line = Zeichnet eine Linie. graphicstype.line = Zeichnet eine Linie.
@@ -1602,11 +1634,17 @@ lenum.xor = Bitwise XOR.
lenum.min = Die Größte von zwei Zahlen. lenum.min = Die Größte von zwei Zahlen.
lenum.max = Die Kleinste von zwei Zahlen. lenum.max = Die Kleinste von zwei Zahlen.
lenum.angle = Angle of vector in degrees. lenum.angle = Vektorwinkel in Grad.
lenum.len = Length of vector. lenum.len = Vektorlänge.
lenum.sin = Sinus in Grad. lenum.sin = Sinus in Grad.
lenum.cos = Cosinus in Grad. lenum.cos = Cosinus in Grad.
lenum.tan = Tangens in Grad. lenum.tan = Tangens in Grad.
lenum.asin = Arkussinus in Grad.
lenum.acos = Arkuskosinus in Grad.
lenum.atan = Arkustangens in Grad.
#not a typo, look up 'range notation' #not a typo, look up 'range notation'
lenum.rand = Zufällige Zahl zwischen [0, <wert>). lenum.rand = Zufällige Zahl zwischen [0, <wert>).
lenum.log = Logarithmus (ln). lenum.log = Logarithmus (ln).

View File

@@ -41,7 +41,7 @@ be.ignore = Abaikan
be.noupdates = Tidak ada pembaruan yang ditemukan. be.noupdates = Tidak ada pembaruan yang ditemukan.
be.check = Cek versi baru be.check = Cek versi baru
mod.featured.dialog.title = Browser Mod mods.browser = Browser Mod
mods.browser.selected = Mod yang Dipilih mods.browser.selected = Mod yang Dipilih
mods.browser.add = Pasang mod mods.browser.add = Pasang mod
mods.browser.reinstall = Pasang kembali mods.browser.reinstall = Pasang kembali
@@ -67,6 +67,14 @@ schematic.delete.confirm = Bagan ini akan benar-benar dihapus.
schematic.rename = Ganti Nama Bagan schematic.rename = Ganti Nama Bagan
schematic.info = {0}x{1}, {2} blok schematic.info = {0}x{1}, {2} blok
schematic.disabled = [scarlet]Bagan dilarang[]\nAnda tidak diperbolehkan untuk menggunakan bagan di [accent]peta[] atau [accent]server ini. schematic.disabled = [scarlet]Bagan dilarang[]\nAnda tidak diperbolehkan untuk menggunakan bagan di [accent]peta[] atau [accent]server ini.
schematic.tags = Tanda:
schematic.edittags = Ubah Tanda
schematic.addtag = Tambah Tanda
schematic.texttag = Tanda Tulisan
schematic.icontag = Tanda Ikon
schematic.renametag = Ubah Nama Tanda
schematic.tagdelconfirm = Hapus tanda ini sepenuhnya?
schematic.tagexists = Tanda ini sudah ada.
stats = Statistik stats = Statistik
stat.wave = Gelombang Terkalahkan:[accent] {0} stat.wave = Gelombang Terkalahkan:[accent] {0}
@@ -530,7 +538,7 @@ launch.from = Meluncurkan Dari: [accent]{0}
launch.destination = Destinasi: {0} launch.destination = Destinasi: {0}
configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}. configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}.
add = Menambahkan... add = Menambahkan...
boss.health = Darah Penjaga guardian = Penjaga
connectfail = [scarlet]Gagal menyambung ke server:\n\n[accent]{0} connectfail = [scarlet]Gagal menyambung ke server:\n\n[accent]{0}
error.unreachable = Server tak terjangkau.\nApakah alamatnya benar? error.unreachable = Server tak terjangkau.\nApakah alamatnya benar?
@@ -975,6 +983,7 @@ rules.wavetimer = Pengaturan Waktu Gelombang
rules.waves = Gelombang 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.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
@@ -1304,7 +1313,6 @@ block.memory-bank.name = Bank Memori
team.blue.name = biru team.blue.name = biru
team.crux.name = merah team.crux.name = merah
team.sharded.name = kuning team.sharded.name = kuning
team.orange.name = jingga
team.derelict.name = abu-abu team.derelict.name = abu-abu
team.green.name = hijau team.green.name = hijau
team.purple.name = ungu team.purple.name = ungu

View File

@@ -13,6 +13,7 @@ link.google-play.description = Página da Google Play store
link.f-droid.description = Listamento de catalogo do F-Droid link.f-droid.description = Listamento de catalogo do F-Droid
link.wiki.description = Wiki oficial do Mindustry link.wiki.description = Wiki oficial do Mindustry
link.suggestions.description = Sugira novos conteúdos link.suggestions.description = Sugira novos conteúdos
link.bug.description = Achou algum? Reporte-o aqui
linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência. linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência.
screenshot = Screenshot salvo para {0} screenshot = Screenshot salvo para {0}
screenshot.invalid = Este mapa é grande demais, você pode estar potencialmente sem memória suficiente para captura de tela. screenshot.invalid = Este mapa é grande demais, você pode estar potencialmente sem memória suficiente para captura de tela.
@@ -36,7 +37,7 @@ be.update.confirm = Baixar e reiniciar o jogo agora?
be.updating = Atualizando... be.updating = Atualizando...
be.ignore = Ignorar be.ignore = Ignorar
be.noupdates = Nenhuma atualização encontrada. be.noupdates = Nenhuma atualização encontrada.
be.check = Cheque por atualizações be.check = Checar por atualizações
schematic = Esquema schematic = Esquema
schematic.add = Salvar esquema schematic.add = Salvar esquema
@@ -56,6 +57,14 @@ schematic.delete.confirm = Esse esquema será apagado. Tem certeza?
schematic.rename = Renomear esquema schematic.rename = Renomear esquema
schematic.info = {0}x{1}, {2} blocos schematic.info = {0}x{1}, {2} blocos
schematic.disabled = [scarlet]Esquemas desativados[]\nVocê precisa de permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor. schematic.disabled = [scarlet]Esquemas desativados[]\nVocê precisa de permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor.
schematic.tags = Tags:
schematic.edittags = Editar Tags
schematic.addtag = Adicionar Tag
schematic.texttag = Tag de Texto
schematic.icontag = Tag de Ícone
schematic.renametag = Renomear Tag
schematic.tagdelconfirm = Deletar essa tag completamente?
schematic.tagexists = Essa tag já existe.
stat.wave = Hordas derrotadas:[accent] {0} stat.wave = Hordas derrotadas:[accent] {0}
stat.enemiesDestroyed = Inimigos destruídos:[accent] {0} stat.enemiesDestroyed = Inimigos destruídos:[accent] {0}
@@ -267,6 +276,9 @@ cancel = Cancelar
openlink = Abrir Link openlink = Abrir Link
copylink = Copiar link copylink = Copiar link
back = Voltar back = Voltar
crash.export = Exportar Históricos de Crashes.
crash.none = Nenhum Histórico de Crashes Encontrado.
crash.exported = Históricos de Crashes Exportado.
data.export = Exportar dados data.export = Exportar dados
data.import = Importar dados data.import = Importar dados
data.openfolder = Abrir pasta de dados data.openfolder = Abrir pasta de dados
@@ -331,7 +343,7 @@ editor.generation = Geração:
editor.ingame = Editar em jogo editor.ingame = Editar em jogo
editor.publish.workshop = Publicar na oficina editor.publish.workshop = Publicar na oficina
editor.newmap = Novo mapa editor.newmap = Novo mapa
editor.center = Center editor.center = Centro
workshop = Oficina workshop = Oficina
waves.title = Hordas waves.title = Hordas
waves.remove = Remover waves.remove = Remover
@@ -472,7 +484,7 @@ mapeditor = Editor de mapa
abandon = Abandonar abandon = Abandonar
abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo.
locked = Trancado locked = Trancado
complete = [lightgray]Completo: complete = [lightgray]Complete:
requirement.wave = Alcançar a Horda {0} em {1} requirement.wave = Alcançar a Horda {0} em {1}
requirement.core = Destruir o núcleo inimigo em {0} requirement.core = Destruir o núcleo inimigo em {0}
requirement.research = Pesquise {0} requirement.research = Pesquise {0}
@@ -531,26 +543,50 @@ planet.sun.name = Sol
sector.groundZero.name = Marco Zero sector.groundZero.name = Marco Zero
sector.craters.name = As Crateras sector.craters.name = As Crateras
sector.frozenForest.name = Floresta Congelada sector.frozenForest.name = Floresta Congelada
sector.biomassFacility.name = Instalação de Síntese de Biomassa
sector.ruinousShores.name = Costas Ruinosas sector.ruinousShores.name = Costas Ruinosas
sector.windsweptIslands.name = Ilhas Ventadas
sector.stainedMountains.name = Montanhas Manchadas sector.stainedMountains.name = Montanhas Manchadas
sector.desolateRift.name = Fenda Desolada sector.desolateRift.name = Fenda Desolada
sector.nuclearComplex.name = Complexo de Prodção Nuclear sector.nuclearComplex.name = Complexo de Produção Nuclear
sector.overgrowth.name = Supercrescimento sector.overgrowth.name = Supercrescimento
sector.tarFields.name = Campos de Piche sector.tarFields.name = Campos de Petróleo
sector.saltFlats.name = Planícies de Sal sector.saltFlats.name = Planícies de Sal
sector.fungalPass.name = Passagem Fúngica sector.fungalPass.name = Passagem Fúngica
sector.impact0078.name = Impacto 0078
sector.extractionOutpost.name = Posto Avançado de Extração
sector.planetaryTerminal.name = Terminal de Lançamento Planetário.
sector.groundZero.description = Um lugar bom para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsiga o máximo possível de chumbo e cobre.\nContinue. sector.groundZero.description = Um lugar bom para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsiga o máximo possível de chumbo e cobre.\nContinue.
sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos se espalharam. As temperaturas baixas não conseguirão contê-los para sempre.\n\nComeçe a aventura com energia. Construa geradores a combustão. Aprenda a usar reparadores. sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos se espalharam. As temperaturas baixas não conseguirão contê-los para sempre.\n\nComeçe a aventura com energia. Construa geradores a combustão. Aprenda a usar reparadores.
sector.biomassFacility.description = A origem dos esporos. Essa é a instalação onde eles foram pesquisados e produzidos inicialmente. Pesquise a tecnologia contido na instalação. Cultive esporos para a produção de combustíveis e plásticos. \n\nNo falecimento da instalação, os esporos foram liberados. Nada no ecossistema local conseguia competir com um organismo tão invasivo.
sector.saltFlats.description = Nos arredores do deserto ficam as planícies de sal. Muitos recursos podem ser encontrados nesse local.\n\nO inimigo construiu um complexo de armazenamento de recursos aqui. Destrua o núcleo deles. Não deixe nada sobrando. sector.saltFlats.description = Nos arredores do deserto ficam as planícies de sal. Muitos recursos podem ser encontrados nesse local.\n\nO inimigo construiu um complexo de armazenamento de recursos aqui. Destrua o núcleo deles. Não deixe nada sobrando.
sector.craters.description = A água se acumulou nessa cratera, relíquias de guerras antigas. Re-conquiste a área. Colete areia. Faça metavidro. Use a água para melhorar suas brocas e torretas. sector.craters.description = A água se acumulou nessa cratera, relíquias de guerras antigas. Re-conquiste a área. Colete areia. Faça metavidro. Use a água para melhorar suas brocas e torretas.
sector.ruinousShores.description = Passando o terreno desolado, está localizada a costa. Antigamente, este local abrigava uma rede de defesa costeira. Não restou muita coisa. Apenas as estruturas de defesas básicas permaneceram ilesas, o resto foi reduzido a sucata.\nContinue expandindo seus territórios, re-descubra a tecnologia. sector.ruinousShores.description = Passando o terreno desolado, está localizada a costa. Antigamente, este local abrigava uma rede de defesa costeira. Não restou muita coisa. Apenas as estruturas de defesas básicas permaneceram ilesas, o resto foi reduzido a sucata.\nContinue expandindo seus territórios, re-descubra a tecnologia.
sector.windsweptIslands.description = Um pouco depois do literal tem essa remota série de ilhas. Registros mostram eles haviam estruturas produtoras de [accent]Plastânio[].\n\nAfase as unidades navais inimigas. Estabeleça uma base nas ilhas. Pesquise essas fábricas.
sector.stainedMountains.description = Mais para o interior estão as montanhas, ainda não contaminadas pelos esporos.\nExtraia o titânio que é abundante nessa área. Aprenda a usá-lo.\n\nA presença inimiga é maior aqui. Não dê tempo a eles de trazerem fortes unidades. sector.stainedMountains.description = Mais para o interior estão as montanhas, ainda não contaminadas pelos esporos.\nExtraia o titânio que é abundante nessa área. Aprenda a usá-lo.\n\nA presença inimiga é maior aqui. Não dê tempo a eles de trazerem fortes unidades.
sector.overgrowth.description = Essa área coberta por vegetação, próxima ao local de origem dos esporos.\nO inimigo estabeleceu um posto de controle aqui. Faça unidades Titan. Destrua eles. Recupere o que foi perdido. sector.overgrowth.description = Essa área coberta por vegetação, próxima ao local de origem dos esporos.\nO inimigo estabeleceu um posto de controle aqui. Faça unidades Titan. Destrua eles. Recupere o que foi perdido.
sector.tarFields.description = Nos arredores de uma zone de produção de petróleo, entre as montanhas e o deserto. Uma das poucas áreas com reservas de piche utilizáveis.\nMesmo abandonada, essa área tem forças inimigas por perto. Não subestime-os.\n\n[lightgray]Pesquise a tecnologia de processamento de petróleo se possível. sector.tarFields.description = Nos arredores de uma zone de produção de petróleo, entre as montanhas e o deserto. Uma das poucas áreas com reservas de piche utilizáveis.\nMesmo abandonada, essa área tem forças inimigas por perto. Não subestime-os.\n\n[lightgray]Pesquise a tecnologia de processamento de petróleo se possível.
sector.desolateRift.description = Uma zona extremamente perigosa. Uma zona com recursos abundantes, mas pouco espaço. Grande risco de destruição. Saia o quanto antes. Não se deixe levar pelo tempo entre os ataques inimigos. sector.desolateRift.description = Uma zona extremamente perigosa. Uma zona com recursos abundantes, mas pouco espaço. Grande risco de destruição. Saia o quanto antes. Não se deixe levar pelo tempo entre os ataques inimigos.
sector.nuclearComplex.description = Uma antiga instalação de produção e processamento de tório, reduzida a ruínas.\n[lightgray]Pesquise sobre o tório e seu vários usos.\n\nO inimigo está presente aqui em grande número, constantemente procurando por atacantes. sector.nuclearComplex.description = Uma antiga instalação de produção e processamento de tório, reduzida a ruínas.\n[lightgray]Pesquise sobre o tório e seu vários usos.\n\nO inimigo está presente aqui em grande número, constantemente procurando por atacantes.
sector.fungalPass.description = Uma área de transição entre altas montanhas e terras baixas, repletas de esporos. Uma pequena base de reconhecimento inimiga está aqui.\nDestrua o núcleo. sector.fungalPass.description = Uma área de transição entre altas montanhas e terras baixas, repletas de esporos. Uma pequena base de reconhecimento inimiga está aqui.\nDestrua o núcleo.
sector.impact0078.description = Aqui repousas restos de um reservatório de transporte interestelar que entrou nesse sistema primeiro.\n\Salve o quanto puder dos destroços. Pesquise qualquer tecnologia intacta.
sector.extractionOutpost.description = Um posto avançado remoto, construído pelo inimigo com o objetivo de lançar recursos para outros setores.\n\nTecnologia de transporte entre setores é essencial para mais conquista de território. Destrua a base. Pesquise suas Plataformas de Lançamento.
sector.planetaryTerminal.description = O último alvo.\n\nEssa base costeira contém a estrutura capaz de lançar Núcleos para planetas locais. É extremamente bem guardado.\n\nProduza unidades navais. Elimine o inimigo o mais rápido o possível. pesquise a estrutura de lançamento.
status.burning.name = Queimando
status.freezing.name = Congelado
status.wet.name = Molhado
status.muddy.name = Barrento
status.melting.name = Derretendo
status.sapped.name = Enfraquecido
status.electrified.name = Eletrificado
status.spore-slowed.name = Esporo-Desaceleração
status.tarred.name = Alcatroado
status.overclock.name = Overclock
status.shocked.name = Chocado
status.blasted.name = Impactado
status.unmoving.name = Imóvel
settings.language = Idioma settings.language = Idioma
settings.data = Dados do jogo settings.data = Dados do jogo
@@ -588,13 +624,15 @@ stat.output = Saída
stat.booster = Apoio stat.booster = Apoio
stat.tiles = Required Tiles stat.tiles = Required Tiles
stat.affinities = Afinidades stat.affinities = Afinidades
stat.opposites = Opostos
stat.powercapacity = Capacidade de Energia stat.powercapacity = Capacidade de Energia
stat.powershot = Energia/tiro stat.powershot = Energia/tiro
stat.weapons = Armas
stat.damage = Dano stat.damage = Dano
stat.targetsair = Mira no ar stat.targetsair = Mira no ar
stat.targetsground = Mira no chão stat.targetsground = Mira no chão
stat.itemsmoved = Velocidade de movimento stat.itemsmoved = Velocidade de movimento
stat.launchtime = Tempo entre Disparos. stat.launchtime = Tempo entre Disparos
stat.shootrange = Alcance stat.shootrange = Alcance
stat.size = Tamanho stat.size = Tamanho
stat.displaysize = Tamanho do Display stat.displaysize = Tamanho do Display
@@ -617,6 +655,7 @@ stat.drillspeed = Velocidade base da Broca
stat.boosteffect = Efeito do Impulso stat.boosteffect = Efeito do Impulso
stat.maxunits = Máximo de unidades ativas stat.maxunits = Máximo de unidades ativas
stat.health = Saúde stat.health = Saúde
stat.armor = Armadura
stat.buildtime = Tempo de construção stat.buildtime = Tempo de construção
stat.maxconsecutive = Max Consecutive stat.maxconsecutive = Max Consecutive
stat.buildcost = Custo de construção stat.buildcost = Custo de construção
@@ -624,31 +663,45 @@ stat.inaccuracy = Imprecisão
stat.shots = Tiros stat.shots = Tiros
stat.reload = Tempo de recarga stat.reload = Tempo de recarga
stat.ammo = Munição stat.ammo = Munição
stat.ammouse = Consumo de Munição
stat.damagemultiplier = Multiplicador de Dano
stat.healthmultiplier = Multiplicador de Vida
stat.speedmultiplier = Multiplicador de Velocidade
stat.reloadmultiplier = Multiplicador de Recarregamento
stat.buildspeedmultiplier = Multiplicador de Velocidade de Construção
stat.reactive = Reage
stat.healing = Reparo
stat.shieldhealth = Vida do Escudo stat.shieldhealth = Vida do Escudo
stat.cooldowntime = Tempo de espera stat.cooldowntime = Tempo de espera
stat.explosiveness = Explosividade stat.explosiveness = Explosividade
stat.basedeflectchance = Chance Base de Esquiva stat.basedeflectchance = Chance Base de Esquiva
stat.lightningchance = Lightning Chance stat.lightningchance = Chance de Raio
stat.lightningdamage = Dano por Raio stat.lightningdamage = Dano por Raio
stat.flammability = Inflamabilidade stat.flammability = Inflamabilidade
stat.charge = Carga de Eletricidade
stat.radioactivity = Radioatividade stat.radioactivity = Radioatividade
stat.heatcapacity = Capacidade de Aquecimento stat.heatcapacity = Capacidade de Aquecimento
stat.viscosity = Viscosidade stat.viscosity = Viscosidade
stat.temperature = Temperatura stat.temperature = Temperatura
stat.speed = Velocidade stat.speed = Velocidade
stat.repairspeed = Taxa de Reparo
stat.buildspeed = Velocidade de Construção stat.buildspeed = Velocidade de Construção
stat.minespeed = Velocidade de Mineração stat.minespeed = Velocidade de Mineração
stat.minetier = Nível de Mineração stat.minetier = Nível de Mineração
stat.payloadcapacity = Capacidade de Carga stat.payloadcapacity = Capacidade de Carga
stat.commandlimit = Limite de Comando stat.commandlimit = Limite de Comando
stat.abilities = Habilidades stat.abilities = Habilidades
stat.canboost = Pode impulsionar
stat.flying = Voador
ability.forcefield = Campo de Força ability.forcefield = Campo de Força
ability.repairfield = Campo de Reparação ability.repairfield = Campo de Reparação
ability.statusfield = Status Field ability.statusfield = Campo de Status {0}
ability.unitspawn = {0} Fábrica ability.unitspawn = Fábrica de {0}
ability.shieldregenfield = Raio de Regeneração do Escudo ability.shieldregenfield = Raio de Regeneração do Escudo
ability.movelightning = Raio de Movimento
ability.energyfield = Campo de Energia: dano [accent]{0}[] ~ blocos [accent]{1}[] / alvos [accent]{2}[]
bar.drilltierreq = Broca melhor necessária. bar.drilltierreq = Broca melhor necessária.
bar.noresources = Recursos Insuficientes bar.noresources = Recursos Insuficientes
@@ -665,12 +718,13 @@ bar.items = Itens: {0}
bar.capacity = Capacidade: {0} bar.capacity = Capacidade: {0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled]
bar.liquid = Liquido bar.liquid = Líquido
bar.heat = Aquecer bar.heat = Aquecer
bar.power = Poder bar.power = Poder
bar.progress = Progresso da construção bar.progress = Progresso da construção
bar.input = Entrada bar.input = Entrada
bar.output = Saída bar.output = Saída
bar.strength = [stat]{0}[lightgray]x força
units.processorcontrol = [lightgray]Processor Controlled units.processorcontrol = [lightgray]Processor Controlled
@@ -678,13 +732,13 @@ bullet.damage = [stat]{0}[lightgray] de dano
bullet.splashdamage = [stat]{0}[lightgray] de dano em área ~[stat] {1}[lightgray] bloco(s) bullet.splashdamage = [stat]{0}[lightgray] de dano em área ~[stat] {1}[lightgray] bloco(s)
bullet.incendiary = [stat]Incendiário bullet.incendiary = [stat]Incendiário
bullet.homing = [stat]Guiado bullet.homing = [stat]Guiado
bullet.shock = [stat]Choque
bullet.frag = [stat]Fragmentação bullet.frag = [stat]Fragmentação
bullet.knockback = [stat]{0}[lightgray]Impulso bullet.lightning = [stat]{0}[lightgray]x raio ~ [stat]{1}[lightgray] dano
bullet.buildingdamage = [stat]{0}%[lightgray] dano em construção
bullet.knockback = [stat]{0}[lightgray] Impulso
bullet.pierce = [stat]{0}[lightgray]x perfuração bullet.pierce = [stat]{0}[lightgray]x perfuração
bullet.infinitepierce = [stat]perfuração bullet.infinitepierce = [stat]perfuração
bullet.freezing = [stat]Congelamento bullet.healpercent = [stat]{0}[lightgray]% reparo
bullet.tarred = [stat]Grudento
bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição
bullet.reload = [stat]{0}[lightgray]x cadência de tiro bullet.reload = [stat]{0}[lightgray]x cadência de tiro
@@ -693,12 +747,12 @@ unit.blockssquared = Blocos²
unit.powersecond = unidades de energia por segundo unit.powersecond = unidades de energia por segundo
unit.liquidsecond = líquido segundo unit.liquidsecond = líquido segundo
unit.itemssecond = itens por segundo unit.itemssecond = itens por segundo
unit.liquidunits = unidades de liquido unit.liquidunits = unidades de líquido
unit.powerunits = unidades de energia unit.powerunits = unidades de energia
unit.degrees = Graus unit.degrees = Graus
unit.seconds = segundos unit.seconds = segundos
unit.minutes = mins unit.minutes = mins
unit.persecond = por segundo unit.persecond = /segundo
unit.perminute = /min unit.perminute = /min
unit.timesspeed = x Velocidade unit.timesspeed = x Velocidade
unit.percent = % unit.percent = %
@@ -707,6 +761,7 @@ unit.items = itens
unit.thousands = k unit.thousands = k
unit.millions = m unit.millions = m
unit.billions = b unit.billions = b
unit.pershot = /disparo
category.general = Geral category.general = Geral
category.power = Energia category.power = Energia
category.liquids = Líquidos category.liquids = Líquidos
@@ -719,8 +774,11 @@ setting.shadows.name = Sombras
setting.blockreplace.name = Sugestões automáticas de blocos setting.blockreplace.name = Sugestões automáticas de blocos
setting.linear.name = Filtragem linear setting.linear.name = Filtragem linear
setting.hints.name = Dicas setting.hints.name = Dicas
setting.logichints.name = Dicas de Lógica
setting.flow.name = Mostrar Fluxo de Recursos[scarlet] (experimental) setting.flow.name = Mostrar Fluxo de Recursos[scarlet] (experimental)
setting.buildautopause.name = Pausar construções automaticamente setting.buildautopause.name = Pausar Automaticamente Quando for Construir
setting.doubletapmine.name = Clique Duplo Para Minerar
setting.modcrashdisable.name = Desativar Mods em Crash de Começo
setting.animatedwater.name = Água animada setting.animatedwater.name = Água animada
setting.animatedshields.name = Escudos animados setting.animatedshields.name = Escudos animados
setting.antialias.name = Filtro suavizante[lightgray] (reinicialização requerida)[] setting.antialias.name = Filtro suavizante[lightgray] (reinicialização requerida)[]
@@ -740,7 +798,7 @@ setting.difficulty.normal = Normal
setting.difficulty.hard = Difícil setting.difficulty.hard = Difícil
setting.difficulty.insane = Insano setting.difficulty.insane = Insano
setting.difficulty.name = Dificuldade setting.difficulty.name = Dificuldade
setting.screenshake.name = Balanço da Tela setting.screenshake.name = Vibração da Tela
setting.effects.name = Efeitos setting.effects.name = Efeitos
setting.destroyedblocks.name = Mostrar Blocos Destruídos setting.destroyedblocks.name = Mostrar Blocos Destruídos
setting.blockstatus.name = Mostrar a Propriedade dos Blocos setting.blockstatus.name = Mostrar a Propriedade dos Blocos
@@ -773,6 +831,7 @@ setting.chatopacity.name = Opacidade do chat
setting.lasersopacity.name = Opacidade do laser setting.lasersopacity.name = Opacidade do laser
setting.bridgeopacity.name = Opacidade da ponte setting.bridgeopacity.name = Opacidade da ponte
setting.playerchat.name = Mostrar chat em jogo setting.playerchat.name = Mostrar chat em jogo
setting.showweather.name = Mostrar Gráficos do Clima
public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública. public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública.
public.beta = Note que as versões beta do jogo não podem fazer salas públicas. public.beta = Note que as versões beta do jogo não podem fazer salas públicas.
uiscale.reset = A escala da interface foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] segundos... uiscale.reset = A escala da interface foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] segundos...
@@ -837,6 +896,7 @@ keybind.menu.name = Menu
keybind.pause.name = Pausar keybind.pause.name = Pausar
keybind.pause_building.name = Parar/Resumir a construção keybind.pause_building.name = Parar/Resumir a construção
keybind.minimap.name = Minimapa keybind.minimap.name = Minimapa
keybind.research.name = Pesquisa
keybind.chat.name = Conversa keybind.chat.name = Conversa
keybind.player_list.name = Lista de jogadores keybind.player_list.name = Lista de jogadores
keybind.console.name = Console keybind.console.name = Console
@@ -851,8 +911,8 @@ keybind.zoom_minimap.name = Ampliar minimapa
mode.help.title = Descrição dos modos mode.help.title = Descrição dos modos
mode.survival.name = Sobrevivência mode.survival.name = Sobrevivência
mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. mode.survival.description = O modo normal. Recursos limitados e hordas automáticas.
mode.sandbox.name = Criativo mode.sandbox.name = Sandbox
mode.sandbox.description = Recursos infinitos e sem tempo para ataques. mode.sandbox.description = Recursos infinitos não há tempo entre ondas.
mode.editor.name = Editor mode.editor.name = Editor
mode.pvp.name = JxJ mode.pvp.name = JxJ
mode.pvp.description = Luta contra outros jogadores locais. mode.pvp.description = Luta contra outros jogadores locais.
@@ -910,8 +970,8 @@ item.thorium.name = Tório
item.silicon.name = Silício item.silicon.name = Silício
item.plastanium.name = Plastânio item.plastanium.name = Plastânio
item.phase-fabric.name = Tecido de fase item.phase-fabric.name = Tecido de fase
item.surge-alloy.name = Liga de súrgio item.surge-alloy.name = Liga de surto
item.spore-pod.name = Pedaço de esporo item.spore-pod.name = Casulo de esporo
item.sand.name = Areia item.sand.name = Areia
item.blast-compound.name = Composto Explosivo item.blast-compound.name = Composto Explosivo
item.pyratite.name = Piratita item.pyratite.name = Piratita
@@ -920,22 +980,25 @@ item.scrap.name = Sucata
liquid.water.name = Água liquid.water.name = Água
liquid.slag.name = Escória liquid.slag.name = Escória
liquid.oil.name = Petróleo liquid.oil.name = Petróleo
liquid.cryofluid.name = Fluído Criogênico liquid.cryofluid.name = Crio-fluido
unit.dagger.name = Adaga unit.dagger.name = Dagger
unit.mace.name = Mace unit.mace.name = Mace
unit.fortress.name = Fortaleza unit.fortress.name = Fortress
unit.scepter.name = Scepter
unit.reign.name = Reign
unit.nova.name = Nova unit.nova.name = Nova
unit.pulsar.name = Pulsar unit.pulsar.name = Pulsar
unit.quasar.name = Quasar unit.quasar.name = Quasar
unit.crawler.name = Rastejante unit.vela.name = Vela
unit.atrax.name = Atrax unit.corvus.name = Corvus
unit.crawler.name = Rastejador
unit.spiroct.name = Spiroct unit.spiroct.name = Spiroct
unit.arkyid.name = Arkyid unit.arkyid.name = Arkyid
unit.toxopid.name = Toxopid unit.toxopid.name = Toxopid
unit.flare.name = Flare unit.flare.name = Flare
unit.horizon.name = Horizon unit.horizon.name = Horizon
unit.zenith.name = Zênite unit.zenith.name = Zenith
unit.antumbra.name = Antumbra unit.antumbra.name = Antumbra
unit.eclipse.name = Eclipse unit.eclipse.name = Eclipse
unit.mono.name = Mono unit.mono.name = Mono
@@ -951,10 +1014,59 @@ unit.omura.name = Omura
unit.alpha.name = Alpha unit.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
unit.scepter.name = Sceptro
unit.reign.name = Reign unit.dagger.description = Dispara projéteis padrões em todos os inimigos em volta.
unit.vela.name = Vela unit.mace.description = Dispara corrents de chamas em todos os inimigos em volta.
unit.corvus.name = Corvus unit.fortress.description = Dispara artilharia de longo alcance em alvos terrestres.
unit.scepter.description = Dispara uma barragem de projéteis carregados em todos os inimigos em volta.
unit.reign.description = Dispara uma barragem de projéteis perfuradoes massivos em todos os inimigos em volta.
unit.nova.description = Dispara raios-lasers que danificam inimigos e repara estruturas aliadas. Capaz de voar.
unit.pulsar.description = Dispara arcos de eletricidade que danificam inimigos e repara estruturas aliadas. Capaz de voar.
unit.quasar.description = Dispara feixes penetradores de lasers que danificam inimigos e repara estruturas aliadas. Capaz de voar. Possui um escudo.
unit.vela.description = Dispara um massivo feixe de laser massivo que danificam inimigos, causa fogo e repara estruturas aliadas. Capaz de voar.
unit.corvus.description = Dispara um massivo laser que danificam inimigos e repara estruturas aliadas. Pode pisar em cima da maioria do terreno.
unit.crawler.description = Corre atrás de inimigos e se destrói, causando uma grande explosão.
unit.atrax.description = Dispara orbes debilitantes de escória em alvos terrestres. Pode pisar em cima da maioria do terreno.
unit.spiroct.description = Dispara lasers enfraquecedores em inimigos, se reparando no processo. Pode pisar em cima da maioria do terreno.
unit.arkyid.description = Dispara grandes lasers enfraquecedores em inimigos, se reparando no processo. Pode pisar em cima da maioria do terreno.
unit.toxopid.description = Dispara grande granadas agrupadas elétricas e lasers penetradoes em inimigos. Pode pisar em cima da maioria do terreno.
unit.flare.description = Dispara projéteis padrões em alvos terrestres.
unit.horizon.description = Larga aglomerados de bombas em alvos terrestres.
unit.zenith.description = Dispara salvos de mísseis em todos os inimigos em volta.
unit.antumbra.description = Dispara uma barragem de projéteis em todos os inimigos em volta.
unit.eclipse.description = Dispara dois lasers penetradores e uma barragem de fogo antiaéreo em todos os inimigos em volta.
unit.mono.description = Automaticamente minera cobre e chumbo, depositando-os no núcleo.
unit.poly.description = Automaticamente reconstrói estruturas destruídas e ajuda outras unidades em construção.
unit.mega.description = Automaticamente repara estruturas danificadas. Capaz de carregar blocos e unidades de chão pequenas.
unit.quad.description = Larga grandes bombas em alvos terrestres, reparando estruturas aliadas e danificando inimigos. Capaz de carregar unidades terrestres de tamanho médio.
unit.oct.description = Protege aliados em volta com o seu escudo regenerador. Capaz de carregar a maioria das unidades terrestres.
unit.risso.description = Dispara uma barragem de mísseis e projéteis em todos os inimigos em volta.
unit.minke.description = Dispara granadas e projéteis padrões em alvos terrestres.
unit.bryde.description = Dispara granadas de artilharia de longo alcance e mísseis em todos os inimigos em volta.
unit.sei.description = Dispara uma barragem de mísseis e projéteis penetradoras de armadura em inimigos.
unit.omura.description = Dispara um raio de longo alcance atravessador em inimigos. Constrói unidades flare.
unit.alpha.description = Defende o Fragmento do Núcleo de inimigos. Constrói estruturas.
unit.beta.description = Defende a Fundação do Núcleo de inimigos. Constrói estruturas.
unit.gamma.description = Defende o Centro do Núcleo de inimigos. Constrói estruturas.
lst.read = Lê um número de uma célula de memória conectada.
lst.write = Escreve um número a uma célula de memória conectada.
lst.print = Adiciona texto ao gravador principal.\nNão vai mostrar nada até que [accent]Print Flush[] seja usado.
lst.draw = Adiciona uma operação ao monitor principal.\nNão vai mostrar nada até que [accent]Draw Flush[] seja usado.
lst.drawflush = Coloca as operações [accent]Draw[] na fila para um monitor.
lst.printflush = Coloca as operações [accent]Write[] na fila para um bloco de mensagem.
lst.getlink = Pega um vínculo de processador por índice. Começa no 0.
lst.control = Controla uma construção.
lst.radar = Localiza unidades em volta de uma construção com alcance.
lst.sensor = Pega dados de uma unidade ou construção.
lst.set = Define uma variável.
lst.operation = Performa uma operação com 1-2 variáveis.
lst.end = Pula para o topo da pilha de instruções.
lst.jump = Condicionalmente pula para um outro comando.
lst.unitbind = Vincula a próxima unidade de um tipo, e armazena-a em [accent]@unit[].
lst.unitcontrol = Controla a unidade atualmente vinculada.
lst.unitradar = Localiza unidades em volta da unidade vinculada.
lst.unitlocate = Localiza um tipo específico de posição/construção em qualquer lugar do mapa.\nRequer uma unidade vinculada.
block.resupply-point.name = Ponto de Reabastecimento block.resupply-point.name = Ponto de Reabastecimento
block.parallax.name = Paralaxe block.parallax.name = Paralaxe
@@ -1048,7 +1160,7 @@ block.thorium-wall.name = Muro de Tório
block.thorium-wall-large.name = Muralha de Tório block.thorium-wall-large.name = Muralha de Tório
block.door.name = Porta block.door.name = Porta
block.door-large.name = Porta grande block.door-large.name = Porta grande
block.duo.name = Torreta dupla block.duo.name = Duo
block.scorch.name = Lança-chamas block.scorch.name = Lança-chamas
block.scatter.name = Dispersão block.scatter.name = Dispersão
block.hail.name = Artilharia block.hail.name = Artilharia
@@ -1066,12 +1178,12 @@ block.inverted-sorter.name = Ordenador invertido
block.message.name = Mensagem block.message.name = Mensagem
block.illuminator.name = Iluminador block.illuminator.name = Iluminador
block.illuminator.description = Uma fonte de luz pequena, configurável e compacta. Precisa de energia para funcionar. block.illuminator.description = Uma fonte de luz pequena, configurável e compacta. Precisa de energia para funcionar.
block.overflow-gate.name = Portão de Fluxo block.overflow-gate.name = Portão de Sobrecarga
block.underflow-gate.name = Portão de Fluxo invertido block.underflow-gate.name = Portão de Sobrecarga Invertido
block.silicon-smelter.name = Fundidora de silício block.silicon-smelter.name = Fundidora de silício
block.phase-weaver.name = Palheta de fase block.phase-weaver.name = Palheta de fase
block.pulverizer.name = Pulverizador block.pulverizer.name = Pulverizador
block.cryofluid-mixer.name = Misturador de Crio Fluido block.cryofluid-mixer.name = Misturador de Crio-Fluido
block.melter.name = Aparelho de fusão block.melter.name = Aparelho de fusão
block.incinerator.name = Incinerador block.incinerator.name = Incinerador
block.spore-press.name = Prensa de Esporo block.spore-press.name = Prensa de Esporo
@@ -1079,7 +1191,7 @@ block.separator.name = Separador
block.coal-centrifuge.name = Centrífugador de Carvão block.coal-centrifuge.name = Centrífugador de Carvão
block.power-node.name = Célula de energia block.power-node.name = Célula de energia
block.power-node-large.name = Célula de energia grande block.power-node-large.name = Célula de energia grande
block.surge-tower.name = Torre de súrgio block.surge-tower.name = Torre de surto
block.diode.name = Diodo block.diode.name = Diodo
block.battery.name = Bateria block.battery.name = Bateria
block.battery-large.name = Bateria grande block.battery-large.name = Bateria grande
@@ -1107,15 +1219,16 @@ block.tsunami.name = Tsunami
block.swarmer.name = Enxame block.swarmer.name = Enxame
block.salvo.name = Salvo block.salvo.name = Salvo
block.ripple.name = Ondulação block.ripple.name = Ondulação
block.phase-conveyor.name = Transportador de Fase block.phase-conveyor.name = Esteira de Fase
block.bridge-conveyor.name = Esteira-Ponte block.bridge-conveyor.name = Esteira-Ponte
block.plastanium-compressor.name = Compressor de Plastânio block.plastanium-compressor.name = Compressor de Plastânio
block.pyratite-mixer.name = Misturador de Piratita block.pyratite-mixer.name = Misturador de Piratita
block.blast-mixer.name = Misturador de Explosão block.blast-mixer.name = Misturador de Explosão
block.solar-panel.name = Painel Solar block.solar-panel.name = Painel Solar
block.solar-panel-large.name = Painel Solar Grande block.solar-panel-large.name = Painel Solar Grande
block.oil-extractor.name = Bomba de Petróleo block.oil-extractor.name = Extrator de Petróleo
block.repair-point.name = Ponto de Reparo block.repair-point.name = Ponto de Reparo
block.repair-turret.name = Torre de Reparo
block.pulse-conduit.name = Cano de Pulso block.pulse-conduit.name = Cano de Pulso
block.plated-conduit.name = Cano Blindado block.plated-conduit.name = Cano Blindado
block.phase-conduit.name = Cano de Fase block.phase-conduit.name = Cano de Fase
@@ -1158,9 +1271,15 @@ block.exponential-reconstructor.name = Reconstrutor Exponencial
block.tetrative-reconstructor.name = Reconstrutor Tetrativo block.tetrative-reconstructor.name = Reconstrutor Tetrativo
block.payload-conveyor.name = Esteira de Carga block.payload-conveyor.name = Esteira de Carga
block.payload-router.name = Roteador de Carga block.payload-router.name = Roteador de Carga
block.payload-propulsion-tower.name = Torre de Propulsão De Cargas
block.payload-void.name = Destruidor de Cargas
block.payload-source.name = Criador de Cargas
block.disassembler.name = Desmontador block.disassembler.name = Desmontador
block.silicon-crucible.name = Fornalha De Silício block.silicon-crucible.name = Fornalha De Silício
block.overdrive-dome.name = Domo de Sobrecarga block.overdrive-dome.name = Domo de Sobrecarga
block.duct.name = Duto
block.duct-router.name = Duto Roteador
block.duct-bridge.name = Duto-Ponte
block.switch.name = Alavanca block.switch.name = Alavanca
block.micro-processor.name = Micro Processador block.micro-processor.name = Micro Processador
@@ -1201,93 +1320,102 @@ tutorial.waves = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por
tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre. tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre.
tutorial.launch = Quando você atinge uma horda específica, você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. tutorial.launch = Quando você atinge uma horda específica, você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar.
item.copper.description = O material mais básico. Usado em todos os tipos de blocos. item.copper.description = Usado em todos os tipos de construção e munição.
item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. item.copper.details = Cobre. Metal anormalmente abundante em Serpulo. Estruturalmente fraco a não ser que seja reforçado.
item.metaglass.description = Composto de vidro super resistente. Extensivamente usado para distribuição e armazenagem de líquidos. item.lead.description = Usado em transportação de líquido e estruturas elétricas.
item.graphite.description = Carbono mineralizado, usado como munição e para isolação elétrica. item.lead.details = Denso. Inerte. Extensivamente usado em baterias.\nObservação: Provavelmente tóxico para formas de vida biológica. Não que tenha muito restando aqui.
item.sand.description = Um material comum que é usado extensivamente em derretimento, tanto em ligas como em fluxo. item.metaglass.description = Usado para estruturas de distribuição e armazenagem de líquidos.
item.coal.description = Matéria vegetal fossilizada, formada muito depois de semeada. Usado extensivamente para produção de combustível e recursos. item.graphite.description = Usado em componentes elétricos e como munição de torretas.
item.titanium.description = Um material raro super leve usado extensivamente no transporte de líquidos, em brocas e drones aéreos. item.sand.description = Usado na produção de outros materiais refinados.
item.thorium.description = Um metal denso e radioativo, Usado como suporte material e combustivel nuclear. item.coal.description = Usado como combustível e produção de materiais refinados.
item.scrap.description = Pedaços remanescentes de estruturas e unidades destruidas. Contem traços de diferentes metais. item.coal.details = Matéria vegetal fossilizada, formada muito depois de semeada. Usado extensivamente para produção de combustível e recursos.
item.silicon.description = Condutor extremamente importante, com aplicação em paineis solares e dispositivos complexos. item.titanium.description = Usado em estruturas de transportação de líquido, brocas e fábricas.
item.plastanium.description = Material leve e maleável usado em drones aéreos avançados e como munição de fragmentação. item.thorium.description = Usado em estruturas duráveis e como combustível nuclear.
item.phase-fabric.description = Uma substância quase sem peso usada em eletrônica avançada e tecnologia de auto-reparo. item.scrap.description = Usado em Aparelhos de Fusão e Pulverizadores para refinar em outros materiais.
item.surge-alloy.description = Uma liga avançada com propriedades elétricas únicas. item.scrap.details = Pedaços restantes de estruturas e unidades destruidas. Contém traços de diferentes metais.
item.spore-pod.description = Uma cápsula de esporos sintéticos, sintetizada de concentrações atmosféricas para propósitos industriais. Usada para conversão em petróleo, explosivos e combustíveis. item.silicon.description = Usado em paineis solares, eletrônicos complexos e como munição perseguidora em torretas.
item.blast-compound.description = Um composto instável usado em bombas e em explosivos. Sintetizado de cápsulas de esporos e outras substâncias voláteis. Uso como combustível não é recomendado. item.plastanium.description = Usado em unidades avançadas, isolamento e munição de fragmentação.
item.pyratite.description = Substância extremamente inflamável usada em armas incendiárias. item.phase-fabric.description = Usado em eletrônicos avançados e estruturas reparadoras.
liquid.water.description = O líquido mais útil, comumente usado em resfriamento de máquinas e no processamento de lixo. Dá pra beber, também. item.surge-alloy.description = Usada em armamento avançado e estruturas defensia reativas.
item.spore-pod.description = Usado para a conversão em óleo, explosivos e combustível.
item.spore-pod.details = Esporos. Provavelmente uma forma de vida sintética. Emite gases tóxicos para outra vida biológica. Extremamente invasivo. Altamente inflamável em certas condições.
item.blast-compound.description = Usado em bombas e como munição explosiva.
item.pyratite.description = Usado em armamento incendiário e geradores abastecidos com combustão.
liquid.water.description = Usado para refrigerar máquinas e no processamento de lixo.
liquid.slag.description = Vários metais derretidos misturados juntos. Pode ser separado em seus minerais constituentes, ou jogado nas unidades inimigas como uma arma. liquid.slag.description = Vários metais derretidos misturados juntos. Pode ser separado em seus minerais constituentes, ou jogado nas unidades inimigas como uma arma.
liquid.oil.description = Um líquido usado na produção de materias avançados. Pode ser convertido em carvão como combustível, ou pulverizado e incendiado como arma. liquid.oil.description = Usado na produção de materiais avançados e como munição incendiária
liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa, até seu corpo quando está calor, mas não faça isto. liquid.cryofluid.description = Usado como refrigerador em reatores, torretas e fábricas.
block.message.description = Mostra uma mensagem. Usado para comunicação entre aliados. block.message.description = Mostra uma mensagem. Usado para comunicação entre aliados.
block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro. block.graphite-press.description = Comprime carvão em grafite.
block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente. block.multi-press.description = Comprime carvão em grafite. Usada água como refrigerador.
block.silicon-smelter.description = Reduz areia a silício usando carvão puro. Produz silício. block.silicon-smelter.description = Refina silício com carvão e areia.
block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia. block.silicon-crucible.description = Refina silício com carvão e areia, usando piratita como uma fonte de calor adicional. Mais eficiente em locais quentes.
block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. block.kiln.description = Derrete areia e chumbo em metavidro.
block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. block.plastanium-compressor.description = Produz plastânio do petróleo e titânio.
block.alloy-smelter.description = Combina titânio, chumbo, silício e cobre para produzir liga de surto. block.phase-weaver.description = Sintetiza tecido de fase usando tório e areia.
block.cryofluid-mixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. block.alloy-smelter.description = Funde titânio, chumbo, silício e cobre para produzir liga de surto.
block.blast-mixer.description = Quebra e mistura aglomerados de esporos com piratita para produzir composto de explosão. block.cryofluid-mixer.description = Mistura água e pó fino de titânio para produzir crio-fluido.
block.pyratite-mixer.description = Mistura carvão, chumbo e areia em piratita altamente inflamável. block.blast-mixer.description = Produz composto explosivo da piratita e capsulas de esporo.
block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. block.pyratite-mixer.description = Mistura carvão, chumbo e areia em piratita.
block.separator.description = Separa escória em seus minerais componentes, oferece o resultado refriado. block.melter.description = Derrete sucata em escória.
block.separator.description = Separa escória em seus minerais componentes.
block.disassembler.description = Separa escória em traços de minerais componentes exóticos. Pode produzir tório.
block.spore-press.description = Comprime cápsulas de esporos em petróleo. block.spore-press.description = Comprime cápsulas de esporos em petróleo.
block.pulverizer.description = Esmaga sucata em areia. Util quando esta em falta de areia natural. block.pulverizer.description = Esmaga sucata em areia.
block.coal-centrifuge.description = Solidifica petróleo em carvão. block.coal-centrifuge.description = Solidifica petróleo em carvão.
block.incinerator.description = Se livra de itens em excesso ou liquidos. block.incinerator.description = Vaporiza qualquer item ou líquido que recebe.
block.power-void.description = Destroi qualquer energia que entra dentro. Apenas no modo sandbox. block.power-void.description = Destroi qualquer energia que é recebida. Apenas no modo sandbox.
block.power-source.description = Infinitivamente da energia. Apenas no modo sandbox. block.power-source.description = Infinitivamente dá energia. Apenas no modo sandbox.
block.item-source.description = Infinitamente dá itens. Apenas caixa de areia. block.item-source.description = Infinitamente dá itens. Apenas no modo sandbox.
block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas no modo sandbox. block.item-void.description = Destroi qualquer item que entrar. Apenas no modo sandbox.
block.liquid-source.description = Infinitivamente dá Liquidos. Apenas no modo sanbox. block.liquid-source.description = Infinitivamente dá quidos. Apenas no modo sandbox.
block.liquid-void.description = Destroi qualquer líquidos que entrar dentro. Apenas no modo sandbox. block.liquid-void.description = Destroi qualquer líquido que entrar. Apenas no modo sandbox.
block.copper-wall.description = Um bloco defensivo barato.\nUtil para proteger o núcleo e torretas no começo. block.copper-wall.description = Um bloco defensivo barato. Útil para proteger o núcleo e torretas no começo.
block.copper-wall-large.description = Um bloco defensivo barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. block.copper-wall-large.description = Um bloco defensivo barato. Útil para proteger o núcleo e torretas no começo. Ocupa múltiplos blocos.
block.titanium-wall.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos. block.titanium-wall.description = Um bloco defensivo moderadamente forte. Providencia defesa moderada contra inimigos.
block.titanium-wall-large.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos.\nOcupa múltiplos blocos. block.titanium-wall-large.description = Um bloco defensivo moderadamente forte. Providencia defesa moderada contra inimigos. Ocupa múltiplos blocos.
block.plastanium-wall.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia. block.plastanium-wall.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia.
block.plastanium-wall-large.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia.\nOcupa múltiplos blocos. block.plastanium-wall-large.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia.\nOcupa múltiplos blocos.
block.thorium-wall.description = Um bloco defensivo forte.\nBoa proteção contra inimigos. block.thorium-wall.description = Um bloco defensivo forte. Boa proteção contra inimigos.
block.thorium-wall-large.description = Um bloco defensivo forte.\nBoa proteção contra inimigos.\nOcupa múltiplos blocos. block.thorium-wall-large.description = Um bloco defensivo forte. Boa proteção contra inimigos. Ocupa múltiplos blocos.
block.phase-wall.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto. block.phase-wall.description = Um muro revestido com tecido de fase. Reflete a maioria das balas no impacto.
block.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas ao impacto.\nOcupa múltiplos blocos. block.phase-wall-large.description = Um muro revestido com tecido de fase. Reflete a maioria das balas ao impacto. Ocupa múltiplos blocos.
block.surge-wall.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. block.surge-wall.description = Um bloco defensivo extremamente durável. Se carrega com eletricidade no contato com as balas, soltando-as aleatoriamente.
block.surge-wall-large.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-as aleatoriamente.\nOcupa multiplos blocos. block.surge-wall-large.description = Um bloco defensivo extremamente durável. Se carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. Ocupa multiplos blocos.
block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar.
block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar.\nOcupa múltiplos blocos. block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar. Ocupa múltiplos blocos.
block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficácia. block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas. Pode usar silício para aumentar o alcance e a eficácia.
block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficácia. block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos. Pode usar tecido de fase para aumentar o alcance e a eficácia.
block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficácia. block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas. Pode usar tecido de fase para aumentar o alcance e a eficácia.
block.force-projector.description = Cria um campo de força hexagonal ao redor de si, protegendo construções e unidades.\nAquece demais se o escudo tomar dano. Pode usar líquidos para evitar superaquecimento. Pode-se usar tecido de fase para aumentar o tamanho do escudo. block.overdrive-dome.description = Aumenta a velocidade de construções vizinhas. Requer tecido de fase e silício para operar.
block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. block.force-projector.description = Cria um campo de força hexagonal ao redor de si, protegendo construções e unidades. Superaquece se muito dano for recebido. Opcionalmente usa refrigeradores para evitar superaquecimento. Tecido de fase aumenta o tamanho do escudo.
block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionável. block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisível ao inimigo.
block.conveyor.description = Bloco de transporte de item básico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionável.
block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões. block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões.
block.plastanium-conveyor.description = Move os itens por grupos.\nRecebe os itens por trás, e despeja eles nas três outras direções. block.plastanium-conveyor.description = Move os itens por grupos.Recebe os itens por trás, e despeja eles nas três outras direções.
block.junction.description = Funciona como uma ponte para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras separadas carregando materiais diferentes para lugares diferentes. block.junction.description = Funciona como uma ponte para duas esteiras que estejam se cruzando. Útil em situações que tenha duas esteiras separadas carregando materiais diferentes para lugares diferentes.
block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. block.bridge-conveyor.description = Bloco de transporte de itens avançado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes.
block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. block.phase-conveyor.description = Instantaneamente transporta itens em cima de terreno ou contruções. Alcance mais longo do que uma esteira-ponte, mas requer energia.
block.sorter.description = Filtra itens passando o selecionado para frente e os outros para os lados. block.sorter.description = Filtra itens passando o selecionado para frente e os outros para os lados.
block.inverted-sorter.description = Filtra os itens como um ordenador normal, porém, os itens escolhidos sairão pelas laterais. block.inverted-sorter.description = Filtra os itens como um ordenador normal, porém, os itens escolhidos sairão pelas laterais.
block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais de uma fonte para multiplos alvos. block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Útil para espalhar materiais de uma fonte para multiplos alvos.
block.router.details = Um mal necessário. Usar próximo de entradas de produção não é recomendado, pois ele vai ser entupido pela saída de itens.
block.distributor.description = Um roteador avançado que espalhas os itens em 7 direções igualmente. block.distributor.description = Um roteador avançado que espalhas os itens em 7 direções igualmente.
block.overflow-gate.description = Uma combinação de roteador e divisor que apenas manda para a esquerda e direita se a frente estiver bloqueada. block.overflow-gate.description = Apenas manda itens para a esquerda e direita se a frente estiver bloqueada.
block.underflow-gate.description = O oposto de um portão de sobrecarga. Manda pra frente se a esquerda e a direita estiverem bloqueadas. block.underflow-gate.description = O oposto de um portão de sobrecarga. Apenas manda itens para frente se a esquerda e a direita estiverem bloqueadas.
block.mass-driver.description = Bloco de transporte de itens supremo. Coleta itens severos e atira eles em outro mass driver de uma longa distancia. block.mass-driver.description = Estrutura de transporte de itens de longo alcance. Coleta grupos de itens e os atira em outras catapultas electromagnéticas.
block.mechanical-pump.description = Uma bomba barata com baixa saída de líquidos, sem consumo de energia. block.mechanical-pump.description = Uma bomba barata com baixa saída de líquidos que não consome energia.
block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas requer energia. block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas requer energia.
block.thermal-pump.description = A bomba final. block.thermal-pump.description = A bomba final. Bombeia líquidos com o máximo de eficiência, mas requer uma quantidade maior de energia.
block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos. block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos.
block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rápido e armazena mais que os canos padrões. block.pulse-conduit.description = Bloco avancado de transporte de líquido. Transporta líquidos mais rápido e armazena mais que os canos padrões.
block.plated-conduit.description = Move líquidos na mesma velocidade que canos de pulso, mas possui mais blindagem. Não aceita fluidos dos lados de nada além de outros canos.\nVaza menos. block.plated-conduit.description = Move líquidos na mesma velocidade que canos de pulso, mas possui mais blindagem. Não aceita fluidos dos lados de nada além de outros canos.\nVaza menos.
block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Útil para espalhar líquidos de uma fonte para múltiplos alvos. block.liquid-router.description = Aceita líquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de líquido. Útil para espalhar líquidos de uma fonte para múltiplos alvos.
block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. block.liquid-tank.description = Armazena grandes quantidades de líquido. Manda para todos os lados, similarmente a um roteador de líquido.
block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Útil em situações em que há dois cano carregando liquidos diferentes até localizações diferentes. block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Útil em situações em que há dois cano carregando líquidos diferentes até localizações diferentes.
block.bridge-conduit.description = Bloco de transporte de liquidos avancados. Possibilita o transporte de liquido sobre 3 blocos acima de construções ou paredes block.bridge-conduit.description = Bloco de transporte de líquidos avancados. Possibilita o transporte de líquido sobre 3 blocos acima de construções ou paredes
block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa energia para teleportar liquidos para outro cano de fase em uma grande distância. block.phase-conduit.description = Bloco avancado de transporte de líquido. Usa energia para teleportar líquidos para outro cano de fase em uma grande distância.
block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente. block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente.
block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões. block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões.
block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis. block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis.
@@ -1309,6 +1437,7 @@ block.laser-drill.description = Possibilita mineração ainda mais rapida usando
block.blast-drill.description = A melhor mineradora. Requer muita energia. block.blast-drill.description = A melhor mineradora. Requer muita energia.
block.water-extractor.description = Extrai água subterrânea. Usado em locais sem água disponível na superficie. block.water-extractor.description = Extrai água subterrânea. Usado em locais sem água disponível na superficie.
block.cultivator.description = Cultiva pequenas concentrações de esporos na atmosfera em cápsulas prontas. block.cultivator.description = Cultiva pequenas concentrações de esporos na atmosfera em cápsulas prontas.
block.cultivator.details = Tecnologia recuperada. Costumava produzir quantidades massivas de biomassa o mais eficiente o possível. Provavelmente o primeiro incubador de esporos cobrindo Serpulo agora.
block.oil-extractor.description = Usa altas quantidades de energia para extrair petróleo da areia. Use quando não tiver fontes de petróleo por perto. block.oil-extractor.description = Usa altas quantidades de energia para extrair petróleo da areia. Use quando não tiver fontes de petróleo por perto.
block.core-shard.description = A primeira iteração do núcleo. Uma vez destruído, todo o contato com a região é perdido. Não deixe isso acontecer. block.core-shard.description = A primeira iteração do núcleo. Uma vez destruído, todo o contato com a região é perdido. Não deixe isso acontecer.
block.core-foundation.description = A segunda versão do núcleo. Armadurado melhor. Armazena mais recursos. block.core-foundation.description = A segunda versão do núcleo. Armadurado melhor. Armazena mais recursos.
@@ -1318,19 +1447,41 @@ block.container.description = Guarda uma pequena quantidade de itens. Usado para
block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador.
block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo.
block.launch-pad-large.description = Uma versão melhorada da plataforma de lançamento. Guarda mais itens. Lança mais frequentemente. block.launch-pad-large.description = Uma versão melhorada da plataforma de lançamento. Guarda mais itens. Lança mais frequentemente.
block.duo.description = Uma pequena torre de baixo custo. Útil contra unidades terrestres. block.duo.description = Dispara balas alternadas em inimigos.
block.scatter.description = Uma torre antiaérea essencial para a defesa. Dispara vários tiros aglomerados de chumbo, sucata ou metavidro. block.scatter.description = Dispara tiros aglomerados de chumbo, sucata ou metavidro em unidades aéreas.
block.scorch.description = Uma torre que queima qualquer unidade que estiver próxima. Altamente efetivo se for de perto. block.scorch.description = Queima qualquer unidade que estiver próxima. Altamente efetivo se for de perto.
block.hail.description = Uma pequena torre de artilharia com grande alcance. block.hail.description = Dispara pequenas granadas em inimigos terrestres a longas distâncias.
block.wave.description = Uma torre de tamanho médio. Lança jatos de líquidos nos seus inimigos. Automaticamente apaga incêndios se for abastecido com água ou fluido criogênico. block.wave.description = Lança jatos de líquido nos seus inimigos. Automaticamente apaga incêndios se for abastecido com água ou crio-fluido.
block.lancer.description = Uma torre laser anti-terrestre média. Carrega e dispara poderosos feixes de energia. block.tsunami.description = Lança poderosos jatos de líquido em inimigos. Automaticamente apaga incêndios se for abastecido com água ou crio-fluido.
block.arc.description = Uma pequena torre elétrica com curto alcance. Dispara arcos de eletricidade nos seus inimigos. block.lancer.description = Carrega e dispara poderosos feixes de energia.
block.swarmer.description = Uma torre de mísseis de tamanho médio. Ataca ambos terrestre e aéreo disparando misseis teleguiados. block.arc.description = Dispara arcos de eletricidade em alvos terrestres.
block.salvo.description = Uma grande, versão avançada da dupla. Dispara rápidas rajadas de tiros nos seus inimigos. block.parallax.description = Dispara um feixe de energia que puxa unidades aéreas, danificando-as no processo.
block.fuse.description = Uma torre grande com curto alcance. Dispara três feixes perfurantes nos seus inimigos.
block.ripple.description = Uma torre de artilharia extremamente poderosa. Dispara varios tiros aglomerados a uma grande distância nos seus inimigos.
block.cyclone.description = Uma grande torre que dispara balas explosivas que se fragmentam em unidades aéreas e terrestres próximas.
block.spectre.description = Um grande canhão massivo. Dispara grandes tiros perfuradores de blindagem em inimigos aéreos e terrestres.
block.meltdown.description = Um grande canhão laser massivo. Carrega e dispara um poderoso e persistente feixe nos seus inimigos. Requer um resfriamento para ser operada.
block.repair-point.description = Continuamente repara a unidade danificada mais proxima.
block.segment.description = Destrói projéteis inimigos que se aproximam. Feixes não serão detectados. block.segment.description = Destrói projéteis inimigos que se aproximam. Feixes não serão detectados.
block.swarmer.description = Dispara misseis teleguiados em inimigos.
block.salvo.description = Dispara rápidas rajadas de tiros em inimigos.
block.fuse.description = Dispara três feixes perfurantes em inimigos.
block.ripple.description = Dispara grupos de granadas em alvos terrestres a longas distâncias.
block.cyclone.description = Dispara aglomerados de fogo antiaéreo explosivos em inimigos próximos.
block.spectre.description = Dispara grandes tiros perfuradores de armaduras tanto em inimigos aéreos quanto terrestres.
block.meltdown.description = Carrega e dispara um poderoso e persistente feixe de laser em inimigos. Requer refrigeradores para operar.
block.foreshadow.description = Dispara um feixe gigante de único alvo a grandes distâncias. Prioriza inimigos com maior vida máxima.
block.repair-point.description = Continuamente repara a unidade danificada mais proxima.
block.payload-conveyor.description = Move cargas grandes, como unidades de fábricas.
block.payload-router.description = Separa cargas recebidas em 3 direções de saída.
block.command-center.description = Controla o comportamento de unidades com vários comandos diferentes.
block.ground-factory.description = Produz unidades terrestres. Unidades produzidas podem ser usadas diretamente, ou movido em reconstrutores para melhorar.
block.air-factory.description = Produz unidades aéreas. Unidades produzidas podem ser usadas diretamente, ou movido em reconstrutores para melhorar.
block.naval-factory.description = Produz unidades navais. Unidades produzidas podem ser usadas diretamente, ou movido em reconstrutores para melhorar.
block.additive-reconstructor.description = Melhora unidades recebidas para o seu segundo nível.
block.multiplicative-reconstructor.description = Melhora unidades recebidas para o seu terceiro nível.
block.exponential-reconstructor.description = Melhora unidades recebidas para o seu quarto nível.
block.tetrative-reconstructor.description = Melhora unidades recebidas para o seu quinto e último nível.
block.micro-processor.description = Executa uma sequência de instruções lógicas em um loop. Pode ser usado para controlar unidades e construções.
block.logic-processor.description = Executa uma sequência de instruções lógicas em um loop. Pode ser usado para controlar unidades e construções. Mais rápido que um micro processador.
block.hyper-processor.description = Executa uma sequência de instruções lógicas em um loop. Pode ser usado para controlar unidades e construções. Mais rápido que um processador lógico.
block.memory-cell.description = Guarda informações para um processador lógico.
block.memory-bank.description = Guarda informações para um processador lógico. Capacidade alta.
block.logic-display.description = Exibe gráficos arbitrários de um processador lógico.
block.large-logic-display.description = Exibe gráficos arbitrários de um processador lógico.
block.switch.description = Uma alavanca alternável. O seu estado pode ser lido e controlado com processadores lógicos.
block.interplanetary-accelerator.description = Uma torre-canhão eletromagnético gigante. Acelera núcleos escapando a velocidade para instalação interplanetária.

View File

@@ -67,6 +67,14 @@ schematic.delete.confirm = Schema această va fi ștearsă permanent.
schematic.rename = Redenumește Schema schematic.rename = Redenumește Schema
schematic.info = {0}x{1}, {2} blocuri schematic.info = {0}x{1}, {2} blocuri
schematic.disabled = [scarlet]Schemele sunt dezactivate[]\nNu ai voie să folosești scheme pe această [accent]hartă[] sau [accent]server. schematic.disabled = [scarlet]Schemele sunt dezactivate[]\nNu ai voie să folosești scheme pe această [accent]hartă[] sau [accent]server.
schematic.tags = Etichete:
schematic.edittags = Editează Etichetele
schematic.addtag = Adaugă Etichetă
schematic.texttag = Etichetă Text
schematic.icontag = Etichetă Iconiță
schematic.renametag = Redenumește Eticheta
schematic.tagdelconfirm = Vrei să ștergi permanent eticheta?
schematic.tagexists = Acea etichetă există deja.
stats = Informații stats = Informații
stat.wave = Valuri Învinse:[accent] {0} stat.wave = Valuri Învinse:[accent] {0}
@@ -306,9 +314,8 @@ data.exported = Date exportate.
data.invalid = Aceste date de joc nu sunt valide. data.invalid = Aceste date de joc nu sunt valide.
data.import.confirm = Importul de date externe va suprascrie[scarlet] toate[] datele tale de joc curente.\n[accent]Acest proces este ireversibil![]\n\nOdată ce datele sunt importate, jocul tău se va opri imediat. data.import.confirm = Importul de date externe va suprascrie[scarlet] toate[] datele tale de joc curente.\n[accent]Acest proces este ireversibil![]\n\nOdată ce datele sunt importate, jocul tău se va opri imediat.
quit.confirm = Sigur vrei să abandonezi? quit.confirm = Sigur vrei să abandonezi?
quit.confirm.tutorial = Sigur știi ce faci?\nTutorialul poate fi reluat în[accent] Setări->Joc->Reia Tutorialul.[]
loading = [accent]Se încarcă... loading = [accent]Se încarcă...
reloading = [accent]Se Reincarcă Modurile... reloading = [accent]Se Reîncarcă Modurile...
saving = [accent]Se salvează... saving = [accent]Se salvează...
respawn = [accent][[{0}][] ca să te refaci în nucleu respawn = [accent][[{0}][] ca să te refaci în nucleu
cancelbuilding = [accent][[{0}][] pt a curăța planul cancelbuilding = [accent][[{0}][] pt a curăța planul
@@ -479,6 +486,7 @@ filter.option.circle-scale = Scară circulară
filter.option.octaves = Octave filter.option.octaves = Octave
filter.option.falloff = Cădere filter.option.falloff = Cădere
filter.option.angle = Unghi filter.option.angle = Unghi
filter.option.rotate = Rotește
filter.option.amount = Cantitate filter.option.amount = Cantitate
filter.option.block = Bloc filter.option.block = Bloc
filter.option.floor = Podea filter.option.floor = Podea
@@ -499,6 +507,7 @@ campaign = Campanie
load = Încarcă load = Încarcă
save = Salvează save = Salvează
fps = FPS: {0} fps = FPS: {0}
tps = TPS: {0}
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
@@ -530,7 +539,7 @@ launch.from = Lansează Din: [accent]{0}
launch.destination = Destinație: {0} launch.destination = Destinație: {0}
configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}.
add = Adaugă... add = Adaugă...
boss.health = Viața Gardianului guardian = Gardian
connectfail = [scarlet]Eroare de conexiune:\n\n[accent]{0} connectfail = [scarlet]Eroare de conexiune:\n\n[accent]{0}
error.unreachable = Nu s-a putut ajunge la server.\nesigur adresa e scrisă corect? error.unreachable = Nu s-a putut ajunge la server.\nesigur adresa e scrisă corect?
@@ -574,6 +583,7 @@ sector.attacked = Sectorul [accent]{0}[white] este atacat!
sector.lost = Ai pierdut sectorul [accent]{0}[white]! sector.lost = Ai pierdut sectorul [accent]{0}[white]!
#spațiul lipsă de mai jos e intenționat #spațiul lipsă de mai jos e intenționat
sector.captured = Ai capturat sectorul [accent]{0}[white]! sector.captured = Ai capturat sectorul [accent]{0}[white]!
sector.changeicon = Schimbă Iconița
threat.low = Scăzută threat.low = Scăzută
threat.medium = Medie threat.medium = Medie
@@ -626,7 +636,8 @@ status.wet.name = Umed
status.muddy.name = Noroios status.muddy.name = Noroios
status.melting.name = Topește status.melting.name = Topește
status.sapped.name = Slăbește status.sapped.name = Slăbește
status.spore-slowed.name = Împiedicat de Spori status.electrified.name = Electrificat
status.spore-slowed.name = Încetinit de Spori
status.tarred.name = Păcurit status.tarred.name = Păcurit
status.overclock.name = Suprasolicitat status.overclock.name = Suprasolicitat
status.shocked.name = Șoc status.shocked.name = Șoc
@@ -654,6 +665,7 @@ settings.clearcampaignsaves.confirm = Sigur vrei să ștergi toate salvările di
paused = [accent]< Pauză > paused = [accent]< Pauză >
clear = Curăță clear = Curăță
banned = [scarlet]Interzis banned = [scarlet]Interzis
unsupported.environment = [scarlet]Mediu Neacceptat
yes = Da yes = Da
no = Nu no = Nu
info.title = Info info.title = Info
@@ -692,6 +704,7 @@ stat.memorycapacity = Capacitate Memorie
stat.basepowergeneration = Generare Electricitate (Bază) stat.basepowergeneration = Generare Electricitate (Bază)
stat.productiontime = Timp Producție stat.productiontime = Timp Producție
stat.repairtime = Durată Reparare Bloc stat.repairtime = Durată Reparare Bloc
stat.repairspeed = Viteză Reparare
stat.weapons = Arme stat.weapons = Arme
stat.bullet = Glonț stat.bullet = Glonț
stat.speedincrease = Creștere Viteză stat.speedincrease = Creștere Viteză
@@ -737,13 +750,15 @@ stat.speedmultiplier = Multiplicator Viteză
stat.reloadmultiplier = Multiplicator Lovituri/sec stat.reloadmultiplier = Multiplicator Lovituri/sec
stat.buildspeedmultiplier = Multiplicator Viteză Construcție stat.buildspeedmultiplier = Multiplicator Viteză Construcție
stat.reactive = Reacționează la stat.reactive = Reacționează la
stat.healing = Reparare
ability.forcefield = Câmp de Forță ability.forcefield = Câmp de Forță
ability.repairfield = Câmp de Reparare ability.repairfield = Câmp de Reparare
ability.statusfield = Câmp Suprasolicitare Unități ability.statusfield = {0} Câmp Suprasolicitare Unități
ability.unitspawn = Fabrică de {0} ability.unitspawn = Fabrică de {0}
ability.shieldregenfield = Scut Regenerabil ability.shieldregenfield = Scut Regenerabil
ability.movelightning = Mișcare Fulger ability.movelightning = Mișcare Fulger
ability.energyfield = Câmp de Energie: [accent]{0}[] forță pe ~ [accent]{1}[] blocuri / [accent]{2}[] ținte
bar.drilltierreq = Burghiu Mai Bun Necesar bar.drilltierreq = Burghiu Mai Bun Necesar
bar.noresources = Resurse lipsă bar.noresources = Resurse lipsă
@@ -766,6 +781,7 @@ bar.power = Electricitate
bar.progress = Progres bar.progress = Progres
bar.input = Necesită bar.input = Necesită
bar.output = Produce bar.output = Produce
bar.strength = [stat]{0}[lightgray]x putere
units.processorcontrol = [lightgray]Controlat de Procesor units.processorcontrol = [lightgray]Controlat de Procesor
@@ -974,6 +990,7 @@ rules.wavetimer = Valuri pe Timp
rules.waves = Valuri rules.waves = Valuri
rules.attack = Modul Atac rules.attack = Modul Atac
rules.buildai = AI-ul Construiește rules.buildai = AI-ul Construiește
rules.corecapture = Capturează Nucleele Distruse
rules.enemyCheat = Resurse infinite pt AI (echipa roșie) rules.enemyCheat = Resurse infinite pt AI (echipa roșie)
rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor
rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor
@@ -1029,6 +1046,7 @@ item.blast-compound.name = Compus Explozibil
item.pyratite.name = Piratită item.pyratite.name = Piratită
item.metaglass.name = Metasticlă item.metaglass.name = Metasticlă
item.scrap.name = Fier Vechi item.scrap.name = Fier Vechi
liquid.water.name = Apă liquid.water.name = Apă
liquid.slag.name = Zgură liquid.slag.name = Zgură
liquid.oil.name = Petrol liquid.oil.name = Petrol
@@ -1060,6 +1078,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
@@ -1119,6 +1142,7 @@ block.craters.name = Cratere
block.sand-water.name = Apă cu Nisip block.sand-water.name = Apă cu Nisip
block.darksand-water.name = Apă cu Nisip Negru block.darksand-water.name = Apă cu Nisip Negru
block.char.name = Turbă block.char.name = Turbă
block.rhyolite.name = Riolit
block.dacite.name = Dacit block.dacite.name = Dacit
block.dacite-boulder.name = Bolovan de Dacit block.dacite-boulder.name = Bolovan de Dacit
block.dacite-wall.name = Perete de Dacit block.dacite-wall.name = Perete de Dacit
@@ -1206,9 +1230,9 @@ block.cultivator.name = Cultivator
block.conduit.name = Conductă block.conduit.name = Conductă
block.mechanical-pump.name = Pompă Mecanică block.mechanical-pump.name = Pompă Mecanică
block.item-source.name = Sursă de Material block.item-source.name = Sursă de Material
block.item-void.name = Portal de Material block.item-void.name = Vid de Material
block.liquid-source.name = Sursă de Lichid block.liquid-source.name = Sursă de Lichid
block.liquid-void.name = Portal de Lichid block.liquid-void.name = Vid de Lichid
block.power-void.name = Consumator de Electricitate block.power-void.name = Consumator de Electricitate
block.power-source.name = Sursă de Electricitate block.power-source.name = Sursă de Electricitate
block.unloader.name = Descărcător block.unloader.name = Descărcător
@@ -1227,6 +1251,7 @@ block.solar-panel.name = Panou Solar
block.solar-panel-large.name = Panou Solar Mare block.solar-panel-large.name = Panou Solar Mare
block.oil-extractor.name = Extractor de Petrol block.oil-extractor.name = Extractor de Petrol
block.repair-point.name = Punct de Reparare block.repair-point.name = Punct de Reparare
block.repair-turret.name = Pistol de Reparare
block.pulse-conduit.name = Conductă cu Puls block.pulse-conduit.name = Conductă cu Puls
block.plated-conduit.name = Conductă Armată block.plated-conduit.name = Conductă Armată
block.phase-conduit.name = Conductă de Fază block.phase-conduit.name = Conductă de Fază
@@ -1269,6 +1294,12 @@ block.exponential-reconstructor.name = Reconstructor Exponențial
block.tetrative-reconstructor.name = Reconstructor Tetrativ block.tetrative-reconstructor.name = Reconstructor Tetrativ
block.payload-conveyor.name = Bandă în Masă block.payload-conveyor.name = Bandă în Masă
block.payload-router.name = Router în Masă block.payload-router.name = Router în Masă
block.duct.name = Canal
block.duct-router.name = Router de Canal
block.duct-bridge.name = Pod de Canal
block.payload-propulsion-tower.name = Turn Propulsor de Încărcătură
block.payload-void.name = Vid de Încărcătură
block.payload-source.name = Sursă de Încărcătură
block.disassembler.name = Dezasamblator block.disassembler.name = Dezasamblator
block.silicon-crucible.name = Creuzet de Silicon block.silicon-crucible.name = Creuzet de Silicon
block.overdrive-dome.name = Dom de Suprasolicitare block.overdrive-dome.name = Dom de Suprasolicitare
@@ -1290,7 +1321,6 @@ block.memory-bank.name = Bancă de Memorie
team.blue.name = albastră team.blue.name = albastră
team.crux.name = roșie team.crux.name = roșie
team.sharded.name = portocalie team.sharded.name = portocalie
team.orange.name = portocalie
team.derelict.name = abandonată team.derelict.name = abandonată
team.green.name = verde team.green.name = verde
team.purple.name = mov team.purple.name = mov
@@ -1311,6 +1341,7 @@ hint.placeConveyor.mobile = Benzile transportă materiale din burghie către alt
hint.placeTurret = Construiește \uf861 [accent]Arme[] pt a-ți apăra baza de inamici.\n\nArmele necesită muniție. Putem folosi \uf838cupru.\nAlimentează arma folosind benzi și burghie. hint.placeTurret = Construiește \uf861 [accent]Arme[] pt a-ți apăra baza de inamici.\n\nArmele necesită muniție. Putem folosi \uf838cupru.\nAlimentează arma folosind benzi și burghie.
hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri. hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri.
hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată. hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată.
hint.blockInfo = Poți vedea informații despre un bloc selectându-l în [accent]meniul de construcție[] și dând click pe butonul [accent][[?][] din dreapta.
hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii. hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii.
hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii. hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii.
hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme. hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme.
@@ -1344,7 +1375,7 @@ item.graphite.description = Folosit pt componente electrice și alimentarea arme
item.sand.description = Folosit pt producție sau alte materiale rafinate. item.sand.description = Folosit pt producție sau alte materiale rafinate.
item.coal.description = Folosit extensiv ca combustibil și pt producerea de materiale rafinate. item.coal.description = Folosit extensiv ca combustibil și pt producerea de materiale rafinate.
item.coal.details = Pare să fie materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. item.coal.details = Pare să fie materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării.
item.titanium.description = Folosit pt structuri transportatoare de lichid, burghie și aeronautică. item.titanium.description = Folosit pt structuri transportatoare de lichid, burghie și în fabrici.
item.thorium.description = Folosit în structuri durabile și combustibil nuclear. item.thorium.description = Folosit în structuri durabile și combustibil nuclear.
item.scrap.description = Folosit in topitoare și pulverizatoare pt a fi rafinat în alte materiale. item.scrap.description = Folosit in topitoare și pulverizatoare pt a fi rafinat în alte materiale.
item.scrap.details = Rămășițe ale structurilor și unităților vechi. item.scrap.details = Rămășițe ale structurilor și unităților vechi.
@@ -1565,7 +1596,7 @@ logic.nounitbuild = [red]Nu ai voie să construiești cu unitățile folosind pr
lenum.type = Tipul clădirii/unității.\nde ex.: pt orice Router, va returna [accent]@router[].\nNu e un șir de caractere. lenum.type = Tipul clădirii/unității.\nde ex.: pt orice Router, va returna [accent]@router[].\nNu e un șir de caractere.
lenum.shoot = Lovește către o locație. lenum.shoot = Lovește către o locație.
lenum.shootp = Lovește către o unitate/clădire. Anticipează viteza țintei și a proiectilului. lenum.shootp = Lovește către o unitate/clădire. Anticipează viteza țintei și a proiectilului.
lenum.configure = Configurația clădirii, de ex. materialul selectat pt Sortator. lenum.config = Configurația clădirii, de ex. materialul selectat pt Sortator.
lenum.enabled = Specifică dacă clădirea este pornită. lenum.enabled = Specifică dacă clădirea este pornită.
laccess.color = Culoarea iluminatorului. laccess.color = Culoarea iluminatorului.
@@ -1573,6 +1604,7 @@ laccess.controller = Controlorul unității. Dacă e controlată de procesor, re
laccess.dead = Specifică dacă o unitate sau clădire a murit/nu mai e validă. laccess.dead = Specifică dacă o unitate sau clădire a murit/nu mai e validă.
laccess.controlled = Returnează:\n[accent]@ctrlProcessor[] dacă controlorul unității e procesor\n[accent]@ctrlPlayer[] dacă controlorul unității/clădirii e jucător\n[accent]@ctrlFormation[] dacă unitatea e într-o formație\nAltfel dă 0. laccess.controlled = Returnează:\n[accent]@ctrlProcessor[] dacă controlorul unității e procesor\n[accent]@ctrlPlayer[] dacă controlorul unității/clădirii e jucător\n[accent]@ctrlFormation[] dacă unitatea e într-o formație\nAltfel dă 0.
laccess.commanded = [red]Învechit. Se va șterge![]\nFolosește [accent]controlled[]. laccess.commanded = [red]Învechit. Se va șterge![]\nFolosește [accent]controlled[].
laccess.progress = Progresul acțiunii, de la 0 la 1.\nReturnează progresul producției, al construcției sau reîncărcarea armelor.
graphicstype.clear = Umple monitorul cu o culoare. graphicstype.clear = Umple monitorul cu o culoare.
graphicstype.color = Setează culoarea pt următoarele instrucțiuni Draw. graphicstype.color = Setează culoarea pt următoarele instrucțiuni Draw.
@@ -1604,9 +1636,15 @@ lenum.min = Minimul a două numere.
lenum.max = Maximul a două numere. lenum.max = Maximul a două numere.
lenum.angle = Unghiul unui vector în grade. lenum.angle = Unghiul unui vector în grade.
lenum.len = Lungimea unui vector. lenum.len = Lungimea unui vector.
lenum.sin = Sinus în grade. lenum.sin = Sinus în grade.
lenum.cos = Cosinus în grade. lenum.cos = Cosinus în grade.
lenum.tan = Tangentă în grade. lenum.tan = Tangentă în grade.
lenum.asin = Arcsinus în grade.
lenum.acos = Arccosinus în grade.
lenum.atan = Arctangentă în grade.
#cea de mai jos nu-i o greșeală, caută pe net notarea intervalelor în matematică #cea de mai jos nu-i o greșeală, caută pe net notarea intervalelor în matematică
lenum.rand = Număr natural aleatoriu în intervalul [0, val). lenum.rand = Număr natural aleatoriu în intervalul [0, val).
lenum.log = Logaritm natural (ln). lenum.log = Logaritm natural (ln).

View File

@@ -1506,7 +1506,7 @@ block.memory-cell.description = Хранит информацию для лог
block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость. block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость.
block.logic-display.description = Отображает произвольную графику из логического процессора. 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 = Стреляет потоками огня по всем врагам поблизости.

View File

@@ -13,11 +13,14 @@ link.google-play.description = Google Play mağaza sayfası
link.f-droid.description = F-Droid kataloğu link.f-droid.description = F-Droid kataloğu
link.wiki.description = Resmi Mindustry wikisi link.wiki.description = Resmi Mindustry wikisi
link.suggestions.description = Yeni özellikler öner link.suggestions.description = Yeni özellikler öner
link.bug.description = Hata mı buldun? Hemen şikayet et!
linkfail = Link açılamadı!\nURL kopyalandı. linkfail = Link açılamadı!\nURL kopyalandı.
screenshot = Ekran görüntüsü {0} konumuna kaydedildi screenshot = Ekran görüntüsü {0} konumuna kaydedildi
screenshot.invalid = Harita çok büyük, muhtemelen ekran görüntüsü için yeterli bellek yok. screenshot.invalid = Harita çok büyük, muhtemelen ekran görüntüsü için yeterli bellek yok.
gameover = Kaybettin gameover = Kaybettin
gameover.waiting = [accent]Harita Bekleniyor...
gameover.pvp = [accent] {0}[] Takımı kazandı! gameover.pvp = [accent] {0}[] Takımı kazandı!
gameover.disconnect = Bağlantı Koptu!
highscore = [accent]Yeni rekor! highscore = [accent]Yeni rekor!
copied = Panoya Kopyalandı. copied = Panoya Kopyalandı.
indev.popup = [accent]v6[] şu anda [accent]beta aşamasındadır[].\n[lightgray]Bu demektir ki:[]\n[scarlet]- Mücadele modu tamamlanmamıştır[]\n- Müzik ve ses efektleri tamamlanmamıştır veya eksiktir\n- Gördüğün her şey değişime ya da kaldırılmaya açıktır.\n\nHataları ve çökmeleri [accent]Github[]'da bildir. indev.popup = [accent]v6[] şu anda [accent]beta aşamasındadır[].\n[lightgray]Bu demektir ki:[]\n[scarlet]- Mücadele modu tamamlanmamıştır[]\n- Müzik ve ses efektleri tamamlanmamıştır veya eksiktir\n- Gördüğün her şey değişime ya da kaldırılmaya açıktır.\n\nHataları ve çökmeleri [accent]Github[]'da bildir.
@@ -38,11 +41,13 @@ be.ignore = Hayır
be.noupdates = Yeni güncelleme bulunamadı. be.noupdates = Yeni güncelleme bulunamadı.
be.check = Güncellemeleri kontrol et be.check = Güncellemeleri kontrol et
mod.featured.title = Mod Tarayıcısı mods.browser = Mod Tarayıcı
mod.featured.dialog.title = Mod Tarayıcısı mods.browser.selected = Seçilmiş Mod
mods.browser.selected = Seçilen Mod mods.browser.add = Yükle
mods.browser.add = Modu İndir mods.browser.reinstall = Yeniden Yükle
mods.github.open = Modun GitHub Sayfasını mods.github.open = Repo
mods.browser.sortdate = En Yeniye göre Sırala
mods.browser.sortstars = Yıldıza göre Sırala
schematic = Şema schematic = Şema
schematic.add = Şemayı Kaydet... schematic.add = Şemayı Kaydet...
@@ -62,7 +67,16 @@ schematic.delete.confirm = Bu şema tamamen yok edilecek.
schematic.rename = Şemayı yeniden adlandır schematic.rename = Şemayı yeniden adlandır
schematic.info = {0}x{1}, {2} blok schematic.info = {0}x{1}, {2} blok
schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server.
schematic.tags = Etiketler:
schematic.edittags = Etiketleri Düzenle
schematic.addtag = Etiket Ekle
schematic.texttag = Yazı Etiketi
schematic.icontag = İcon Etiketi
schematic.renametag = Etiketi Yeniden Adlandır
schematic.tagdelconfirm = Bu Etiketi Silmek istediğine emin misin?
schematic.tagexists = Böyle bir Etiket zaten var.
stats = İstatistikler
stat.wave = Yenilen Dalgalar:[accent] {0} stat.wave = Yenilen Dalgalar:[accent] {0}
stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0} stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0}
stat.built = İnşa Edilen Yapılar:[accent] {0} stat.built = İnşa Edilen Yapılar:[accent] {0}
@@ -86,6 +100,7 @@ joingame = Oyuna Katıl
customgame = Özel Oyun customgame = Özel Oyun
newgame = Yeni Oyun newgame = Yeni Oyun
none = <yok> none = <yok>
none.found = [lightgray]<Bulunamadı>
minimap = Harita minimap = Harita
position = Pozisyon position = Pozisyon
close = Kapat close = Kapat
@@ -106,17 +121,20 @@ committingchanges = Değişiklikler Uygulanıyor
done = Bitti done = Bitti
feature.unsupported = Cihazınızda bu özellik desteklenmemektedir. feature.unsupported = Cihazınızda bu özellik desteklenmemektedir.
mods.alphainfo = Modların alfa aşamasında olduğunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduğunuz sorunları Mindustry GitHub'ı veya Discord'una bildirin. mods.initfailed = [red]⚠[] OH NO! Mindustry Çöktü. Bu Büyük ihtimalle bir moddan kaynaklandı.\n\nSonsuz Çökmeyi önlemek için, [red]tüm modlar kapatıldı.[]\n\nBu özelliği kapamak için, [accent]Ayarlar->Oyun->Modları Çökmede Kapa[].
mods = Modlar mods = Modlar
mods.none = [lightgray]Hiç mod bulunamadı! mods.none = [lightgray]Hiç mod bulunamadı!
mods.guide = Mod Rehberi mods.guide = Mod Rehberi
mods.report = Hata bildir mods.report = Hata bildir
mods.openfolder = Mod klasörünü aç mods.openfolder = Mod klasörünü aç
mods.viewcontent = İçeriği Görüntüle
mods.reload = Yeniden Yükle mods.reload = Yeniden Yükle
mods.reloadexit = Modları yeniden yüklemek için oyun kapanacak. mods.reloadexit = Modları yeniden yüklemek için oyun kapanacak.
mod.installed = [[Yüklendi]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Etkin mod.enabled = [lightgray]Etkin
mod.disabled = [scarlet]Devre Dışı mod.disabled = [scarlet]Devre Dışı
mod.multiplayer.compatible = [gray]Çok Oyunculuya Uygun
mod.disable = Devre Dışı Bırak mod.disable = Devre Dışı Bırak
mod.content = İçerik: mod.content = İçerik:
mod.delete.error = Mod silinemiyor. Dosya kullanımda olabilir. mod.delete.error = Mod silinemiyor. Dosya kullanımda olabilir.
@@ -150,7 +168,11 @@ launchcore = Kalkış
filename = Dosya Adı: filename = Dosya Adı:
unlocked = Yeni içerik açıldı! unlocked = Yeni içerik açıldı!
completed = [accent]Tamamlandı completed = [accent]Tamamlandı
available = Yeni Araştırma Mümkün!
techtree = Teknoloji Ağacı techtree = Teknoloji Ağacı
research.legacy = [accent]5.0[] Araştırma Datası Bulnudu.\n[accent]Bu datayı Yüklemek ister misin?[], yoksa [accent]silip[] baştan mı başlamak istersin? (önerilir)?
research.load = Yükle
research.discard = Sil
research.list = [lightgray]Araştırmalar: research.list = [lightgray]Araştırmalar:
research = Araştır research = Araştır
researched = [lightgray]{0} Araştırıldı. researched = [lightgray]{0} Araştırıldı.
@@ -181,8 +203,8 @@ host.info = [accent]host[], [scarlet]6567[] portunda bir sunucuya ev sahipliği
join.info = Burada, bağlanmak istediğin sunucunun [accent]IP[] adresini girebilir veya [accent]yerel ağ[] sunucularını görebilirsin..\nHem yerel ağ hem de geniş alan ağı çoklu oyuncu için destekleniyor.\n\n[lightgray]Not: Otomatik bir global sunucu listesi yok; eğer birisine IP adresi kullanarak bağlanmak istiyorsan IP adresini istemelisin. join.info = Burada, bağlanmak istediğin sunucunun [accent]IP[] adresini girebilir veya [accent]yerel ağ[] sunucularını görebilirsin..\nHem yerel ağ hem de geniş alan ağı çoklu oyuncu için destekleniyor.\n\n[lightgray]Not: Otomatik bir global sunucu listesi yok; eğer birisine IP adresi kullanarak bağlanmak istiyorsan IP adresini istemelisin.
hostserver = Çok Oyunculu Oyun Aç hostserver = Çok Oyunculu Oyun Aç
invitefriends = Arkadaşlarını Davet Et invitefriends = Arkadaşlarını Davet Et
hostserver.mobile = Oyun Kur hostserver.mobile = Sunucu Kur
host = Kur host = Sunucu Kur
hosting = [accent]Sunucu açılıyor... hosting = [accent]Sunucu açılıyor...
hosts.refresh = Yenile hosts.refresh = Yenile
hosts.discovering = Yerel ağ oyunu aranıyor hosts.discovering = Yerel ağ oyunu aranıyor
@@ -195,10 +217,17 @@ servers.local = Yerel Sunucular
servers.remote = Uzak Sunucular servers.remote = Uzak Sunucular
servers.global = Topluluk Sunucuları servers.global = Topluluk Sunucuları
servers.disclaimer = Topluluk Sunucuları, [accent]Yapımcı tarafından yönetilmiyor!\n\nSunucularda, her yaşa uygun olmayan yapı ve içerikler içerebilir!
servers.showhidden = Gizli Sunucuları Göster
server.shown = Görünür
server.hidden = Gizli
trace = Oyuncuyu Takip Et trace = Oyuncuyu Takip Et
trace.playername = Oyuncu İsmi: [accent]{0} trace.playername = Oyuncu İsmi: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = Özel ID: [accent]{0} trace.id = Özel ID: [accent]{0}
trace.times.joined = Girme Sayısı: [accent]{0}
trace.times.kicked = Atılma Sayısı: [accent]{0}
trace.mobile = Mobil Sürüm: [accent]{0} trace.mobile = Mobil Sürüm: [accent]{0}
trace.modclient = Özel Sürüm: [accent]{0} trace.modclient = Özel Sürüm: [accent]{0}
invalidid = Geçersiz Sürüm ID'si! Bir hata raporu gönder. invalidid = Geçersiz Sürüm ID'si! Bir hata raporu gönder.
@@ -228,6 +257,7 @@ disconnect.timeout = Zaman aşımı.
disconnect.data = Dünya verisi yüklenemedi! disconnect.data = Dünya verisi yüklenemedi!
cantconnect = Oyuna girilemiyor ([accent]{0}[]). cantconnect = Oyuna girilemiyor ([accent]{0}[]).
connecting = [accent]Bağlanılıyor... connecting = [accent]Bağlanılıyor...
reconnecting = [accent]Yeniden Bağlanılıyor...
connecting.data = [accent]Dünya verisi yükleniyor... connecting.data = [accent]Dünya verisi yükleniyor...
server.port = Port: server.port = Port:
server.addressinuse = Adres zaten kullanılıyor! server.addressinuse = Adres zaten kullanılıyor!
@@ -273,6 +303,10 @@ cancel = İptal
openlink = Bağlantıyı openlink = Bağlantıyı
copylink = Bağlantıyı Kopyala copylink = Bağlantıyı Kopyala
back = Geri back = Geri
max = Maks
crash.export = Çökme Hatasını Günlüğünü Dışarı Aktar
crash.none = Çökme Hatası Günlüğü Bulunamadı.
crash.exported = Çökme Hatası Günlüğü Dışarı Aktarıldı.
data.export = Veriyi Dışa Aktar data.export = Veriyi Dışa Aktar
data.import = Veriyi İçe Aktar data.import = Veriyi İçe Aktar
data.openfolder = Veri Klasörü Aç data.openfolder = Veri Klasörü Aç
@@ -280,7 +314,6 @@ data.exported = Veri dışa aktarıldı.
data.invalid = Bu oyun verisi geçerli değil. data.invalid = Bu oyun verisi geçerli değil.
data.import.confirm = Dışarıdan içeri veri aktarmak şu anki verilerinizin [scarlet]tamamını[] silecektir.[accent]Bu işlem geri alınamaz![]\n\nVeri içeri aktarıldığında oyundan çıkacaksınız. data.import.confirm = Dışarıdan içeri veri aktarmak şu anki verilerinizin [scarlet]tamamını[] silecektir.[accent]Bu işlem geri alınamaz![]\n\nVeri içeri aktarıldığında oyundan çıkacaksınız.
quit.confirm = Çıkmak istediğinize emin misiniz? quit.confirm = Çıkmak istediğinize emin misiniz?
quit.confirm.tutorial = Ne yaptığınıza emin misiniz?\nÖğreticiyi [accent] Ayarlar -> Oyun -> Öğreticiyi Yeniden Al[]'dan tekrar yapabilirsiniz.
loading = [accent]Yükleniyor... loading = [accent]Yükleniyor...
reloading = [accent]Modlar Yeniden Yükleniyor... reloading = [accent]Modlar Yeniden Yükleniyor...
saving = [accent]Kayıt ediliyor... saving = [accent]Kayıt ediliyor...
@@ -289,6 +322,8 @@ cancelbuilding = [accent][[{0}][] Planı temizle
selectschematic = [accent][[{0}][] Seç ve kopyala selectschematic = [accent][[{0}][] Seç ve kopyala
pausebuilding = [accent][[{0}][] İnşaatı durdur pausebuilding = [accent][[{0}][] İnşaatı durdur
resumebuilding = [scarlet][[{0}][] İnşaata devam et resumebuilding = [scarlet][[{0}][] İnşaata devam et
enablebuilding = [scarlet][[{0}][] İnşa Etmeyi Başlat
showui = UI Kapalı.\nAçmak için [accent][[{0}][] bas.
wave = [accent]Dalga {0} wave = [accent]Dalga {0}
wave.cap = [accent]Dalga {0}/{1} wave.cap = [accent]Dalga {0}/{1}
wave.waiting = [lightgray]{0} saniye içinde dalga başlayacak wave.waiting = [lightgray]{0} saniye içinde dalga başlayacak
@@ -296,6 +331,8 @@ wave.waveInProgress = [lightgray]Dalga gerçekleşiyor
waiting = [lightgray]Bekleniliyor... waiting = [lightgray]Bekleniliyor...
waiting.players = Oyuncular bekleniliyor... waiting.players = Oyuncular bekleniliyor...
wave.enemies = [lightgray]{0} Tane Düşman Kaldı wave.enemies = [lightgray]{0} Tane Düşman Kaldı
wave.enemycores = [accent]{0}[lightgray] Düşman Çekirdekler
wave.enemycore = [accent]{0}[lightgray] Düşman Çekirdek
wave.enemy = [lightgray]{0} Tane Düşman Kaldı wave.enemy = [lightgray]{0} Tane Düşman Kaldı
wave.guardianwarn = [accent]{0}[] dalga sonra gardiyan yaklaşıyor. wave.guardianwarn = [accent]{0}[] dalga sonra gardiyan yaklaşıyor.
wave.guardianwarn.one = [accent]{0}[] dalga sonra gardiyan yaklaşıyor. wave.guardianwarn.one = [accent]{0}[] dalga sonra gardiyan yaklaşıyor.
@@ -341,7 +378,6 @@ editor.center = Ortala
workshop = Atölye workshop = Atölye
waves.title = Dalgalar waves.title = Dalgalar
waves.remove = Kaldır waves.remove = Kaldır
waves.never = <asla>
waves.every = her waves.every = her
waves.waves = dalga(lar) waves.waves = dalga(lar)
waves.perspawn = doğma noktası başına waves.perspawn = doğma noktası başına
@@ -356,6 +392,7 @@ waves.invalid = Panoda geçersiz dalga sayısı var.
waves.copied = Dalgalar kopyalandı. waves.copied = Dalgalar kopyalandı.
waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın
#bunlar özellikle küçük başlıyor.
wavemode.counts = miktarlar wavemode.counts = miktarlar
wavemode.totals = toplamlar wavemode.totals = toplamlar
wavemode.health = can wavemode.health = can
@@ -447,6 +484,7 @@ filter.option.circle-scale = Daire Ölçek
filter.option.octaves = Oktavlar filter.option.octaves = Oktavlar
filter.option.falloff = Düşüş filter.option.falloff = Düşüş
filter.option.angle = ı filter.option.angle = ı
filter.option.rotate = Döndür
filter.option.amount = Miktar filter.option.amount = Miktar
filter.option.block = Blok filter.option.block = Blok
filter.option.floor = Zemin filter.option.floor = Zemin
@@ -468,6 +506,9 @@ load = Yükle
save = Kaydet save = Kaydet
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Dil ayarlarının çalışması için lütfen oyunu yeniden başlatın. language.restart = Dil ayarlarının çalışması için lütfen oyunu yeniden başlatın.
settings = Ayarlar settings = Ayarlar
tutorial = Öğretici tutorial = Öğretici
@@ -482,26 +523,23 @@ complete = [lightgray]Ulaş:
requirement.wave = Bölge {1}'de Dalga {0} requirement.wave = Bölge {1}'de Dalga {0}
requirement.core = {0}`da Düşman Çekirdeği Yok Et requirement.core = {0}`da Düşman Çekirdeği Yok Et
requirement.research = {0} araştır requirement.research = {0} araştır
requirement.produce = {0} üret
requirement.capture = {0} sektörünü ele geçir requirement.capture = {0} sektörünü ele geçir
bestwave = [lightgray]En İyi Dalga: {0} bestwave = [lightgray]En İyi Dalga: {0}
launch.text = Kalkış launch.text = Kalkış
research.multiplayer = Sadece kurucu araştırma yapabilir. research.multiplayer = Sadece kurucu araştırma yapabilir.
uncover = uncover =
configure = Ekipmanı Yapılandır configure = Ekipmanı Yapılandır
loadout = Yükleme loadout = Yükleme
resources = Kaynaklar resources = Kaynaklar
bannedblocks = Yasaklı Bloklar bannedblocks = Yasaklı Bloklar
addall = Hepsini Ekle addall = Hepsini Ekle
launch.from = [accent]{0} dan fırlatılıyor.
launch.destination = Varış Yeri: {0} launch.destination = Varış Yeri: {0}
configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı.
zone.unlocked = [lightgray]{0} kilidi açıldı.
zone.requirement.complete = {0}. dalgaya ulaşıldı:\n{1} bölge şartları karşılandı.
zone.resources = [lightgray]Tespit Edilen Kaynaklar:
zone.objective = [lightgray]Hedef: [accent]{0}
zone.objective.survival = Hayatta Kal
zone.objective.attack = Düşman Merkezini Yok Et
add = Ekle... add = Ekle...
boss.health = Boss Canı guardian = Gardian
connectfail = [crimson]Bağlantı hatası:\n\n[accent]{0} connectfail = [crimson]Bağlantı hatası:\n\n[accent]{0}
error.unreachable = Sunucuya ulaşılamıyor.\nAdresin doğru yazıldığına emin misiniz? error.unreachable = Sunucuya ulaşılamıyor.\nAdresin doğru yazıldığına emin misiniz?
@@ -523,28 +561,57 @@ weather.fog.name = Sis
sectors.unexplored = [lightgray]Keşfedilmemiş sectors.unexplored = [lightgray]Keşfedilmemiş
sectors.resources = Kaynaklar: sectors.resources = Kaynaklar:
sectors.production = Üretim: sectors.production = Üretim:
sectors.export = İhracat:
sectors.time = Zaman:
sectors.threat = Tehlike:
sectors.wave = Dalga:
sectors.stored = Depolanan: sectors.stored = Depolanan:
sectors.resume = Devam Et sectors.resume = Devam Et
sectors.launch = Kalkış sectors.launch = Fırlat
sectors.select = Seç sectors.select = Seç
sectors.nonelaunch = [lightgray]yok (güneş) sectors.nonelaunch = [lightgray]yok (güneş)
sectors.rename = Sektörü Yeniden Adlandır sectors.rename = Sektörü Yeniden Adlandır
sectors.enemybase = [scarlet]Düşman Base
sectors.vulnerable = [scarlet]Dayanıksız
sectors.underattack = [scarlet]Saldırı Altında! [accent]{0}% hasarlı
sectors.survives = [accent]{0} Dalgaya dayanabilir!
sectors.go = Git
sector.curcapture = Sektör Yakalandı
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.lost = Sektör [accent]{0}[white] kaybedildi!
#note: the missing space in the line below is intentional
sector.captured = Sektör [accent]{0}[white]yakalandı!
sector.changeicon = İkon Değiştir
threat.low = Düşük
threat.medium = Orta
threat.high = Yüksek
threat.extreme = ırı
threat.eradication = İmkansız
planets = Gezegenler
planet.serpulo.name = Serpulo planet.serpulo.name = Serpulo
planet.sun.name = Güneş planet.sun.name = Güneş
sector.impact0078.name = 0078 Darbesi
sector.groundZero.name = Sıfır Noktası sector.groundZero.name = Sıfır Noktası
sector.craters.name = Kraterler sector.craters.name = Kraterler
sector.frozenForest.name = Donmuş Orman sector.frozenForest.name = Donmuş Orman
sector.ruinousShores.name = Harap Kıyılar sector.ruinousShores.name = Harap Kıyılar
sector.stainedMountains.name = Lekeli Dağlar sector.stainedMountains.name = Lekeli Dağlar
sector.desolateRift.name = Issız Aralık sector.desolateRift.name = Issız Kanyon
sector.nuclearComplex.name = Kompleks kleer Üretimi sector.nuclearComplex.name = Nüleer Santral Kompleksi
sector.overgrowth.name = Fazla Büyüme sector.overgrowth.name = ırı Büyüme
sector.tarFields.name = Katran Alanları sector.tarFields.name = Katran Çölü
sector.saltFlats.name = Tuz Düzlükleri sector.saltFlats.name = Tuz Düzlükleri
sector.fungalPass.name = Mantar Geçidi sector.fungalPass.name = Mantar Geçidi
sector.biomassFacility.name = Sentetik BioMadde Santrali
sector.windsweptIslands.name = Rüzgarlı Adalar
sector.extractionOutpost.name = Kazı Üssü
sector.planetaryTerminal.name = Gezegenler Arası Terminal
sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle. sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle.
sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren.
@@ -557,6 +624,25 @@ sector.tarFields.description = Bir petrol üretim bölgesinin eteklerinde, dağl
sector.desolateRift.description = ırı tehlikeli bir bölge. Bol kaynaklar, ama az yer mevcut. Yüksek yıkım riski. Mümkün olduğunca çabuk ayrılmaya çalış. Düşman saldırıları arasındaki uzun mesafeye aldanma. sector.desolateRift.description = ırı tehlikeli bir bölge. Bol kaynaklar, ama az yer mevcut. Yüksek yıkım riski. Mümkün olduğunca çabuk ayrılmaya çalış. Düşman saldırıları arasındaki uzun mesafeye aldanma.
sector.nuclearComplex.description = Toryum üretimi ve işlenmesi için eski bir tesistir, harabeye dönüşmüştür.\n[lightgray]Toryumu ve onun birçok kullanımını araştır. \n\nDüşman burada çok sayıda mevcut ve sürekli saldırganları arıyorlar. sector.nuclearComplex.description = Toryum üretimi ve işlenmesi için eski bir tesistir, harabeye dönüşmüştür.\n[lightgray]Toryumu ve onun birçok kullanımını araştır. \n\nDüşman burada çok sayıda mevcut ve sürekli saldırganları arıyorlar.
sector.fungalPass.description = Yüksek dağlar ve daha alçak, sporla dolu topraklar arasında bir geçiş alanıdır. Burada küçük bir düşman keşif üssü bulunuyor.\nOnu yok et.\nDagger ve Crawler birlikleri kullan. İki çekirdeği çıkar. sector.fungalPass.description = Yüksek dağlar ve daha alçak, sporla dolu topraklar arasında bir geçiş alanıdır. Burada küçük bir düşman keşif üssü bulunuyor.\nOnu yok et.\nDagger ve Crawler birlikleri kullan. İki çekirdeği çıkar.
sector.biomassFacility.description = Sporların ana kaynağı. Burası, onların üretim yeri.\nOnların içindeki gücü araştır. Sporları parçala, enerji ve plastik üret..\n\n[lightgray]Bu Fabrika yıkıldığında, sporlar etrafa yayldı. Hiçbir yaşam formu, bu forma üstün gelemedi.
sector.windsweptIslands.description = Kıyının hemen yanında, bir adalar topluluğu. Kayıtlar bir zamanlar, [accent]Plastik[]-üreten binalar olduğunu gösteriyor.\n\nDüşman gemilerini batır, bir üs inşa et ve plastik üretmeye başla.
sector.extractionOutpost.description = Uzak bir üs, düşman tarafından inşa edildiği düşünülüyor.\n\nSektörler arası aktarım, gelecek için çok önemli bir kademe. Üssü yok et, Fırlatış rampasını aç!
sector.impact0078.description = Burası, eskiden buraya düşmüş bir yıldızlar arası uzay gemisinin kalıntıları.\n\nOlabildiğince çok şeyi araştır. Teknolojiden yaralan.
sector.planetaryTerminal.description = Son aşama.\n\nBu üs, başka gezegenlere gitmeyi sağlayan teknolojiyi barıdırıyor. Aşırı iyi bir şekilde korunuyor.\n\nOlabildiğince hızlı bir şekilde gemi üret ve düşman üssü elegeçir. Gezegenler Arası Hızladırıcıyı aç!
status.burning.name = Yanıyor
status.freezing.name = Donuyor
status.wet.name = Islak
status.muddy.name = Çamurlu
status.melting.name = Eriyor
status.sapped.name = Emilmiş
status.electrified.name = Elektirklenmiş
status.spore-slowed.name = Sporlanmış
status.tarred.name = Ziftlenmiş
status.overclock.name = Hızlandırlımış
status.shocked.name = Çarpılmış
status.blasted.name = Patlatılmış
status.unmoving.name =Sabit
settings.language = Dil settings.language = Dil
settings.data = Oyun Verisi settings.data = Oyun Verisi
@@ -589,11 +675,13 @@ unit.nobuild = [scarlet]Birlik inşa edemiyor
lastaccessed = [lightgray]Son Erişme: {0} lastaccessed = [lightgray]Son Erişme: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.description = Amaç
stat.input = Giriş stat.input = Giriş
stat.output = Çıkış stat.output = Çıkış
stat.booster = Güçlendirici stat.booster = Güçlendirici
stat.tiles = Gereken Kare stat.tiles = Gereken Kare
stat.affinities = Yakınlıklar stat.affinities = Yakınlıklar
stat.opposites = Zıtlıklar
stat.powercapacity = Enerji Kapasitesi stat.powercapacity = Enerji Kapasitesi
stat.powershot = Enerji/Atış stat.powershot = Enerji/Atış
stat.damage = Hasar stat.damage = Hasar
@@ -615,7 +703,10 @@ stat.itemcapacity = Eşya Kapasitesi
stat.memorycapacity = Bellek Kapasitesi stat.memorycapacity = Bellek Kapasitesi
stat.basepowergeneration = Temel Enerji Üretimi stat.basepowergeneration = Temel Enerji Üretimi
stat.productiontime = Üretim Süresi stat.productiontime = Üretim Süresi
stat.repairtime = Tamir Tamir Edilme Süresi stat.repairtime = Tamir Edilme Süresi
stat.repairspeed = Tamir Hızı
stat.weapons = Silahlar
stat.bullet = Mermi
stat.speedincrease = Hız Artışı stat.speedincrease = Hız Artışı
stat.range = Menzil stat.range = Menzil
stat.drilltier = Kazılabilenler stat.drilltier = Kazılabilenler
@@ -623,6 +714,7 @@ stat.drillspeed = Temel Matkap Hızı
stat.boosteffect = Hızlandırma Efekti stat.boosteffect = Hızlandırma Efekti
stat.maxunits = Maksimum Aktif Birim stat.maxunits = Maksimum Aktif Birim
stat.health = Can stat.health = Can
stat.armor = Zırh
stat.buildtime = İnşaat Süresi stat.buildtime = İnşaat Süresi
stat.maxconsecutive = Art Arda En Fazla stat.maxconsecutive = Art Arda En Fazla
stat.buildcost = İnşaat Fiyatı stat.buildcost = İnşaat Fiyatı
@@ -638,6 +730,7 @@ stat.lightningchance = Yıldırım Çarpma Şansı
stat.lightningdamage = Yıldırım Hasarı stat.lightningdamage = Yıldırım Hasarı
stat.flammability = Yanıcılık stat.flammability = Yanıcılık
stat.radioactivity = Radyoaktivite stat.radioactivity = Radyoaktivite
stat.charge = Elektirk Yükü
stat.heatcapacity = Isı Kapasitesi stat.heatcapacity = Isı Kapasitesi
stat.viscosity = Viskosite stat.viscosity = Viskosite
stat.temperature = Sıcaklık stat.temperature = Sıcaklık
@@ -648,12 +741,24 @@ stat.minetier = Kazı Seviyesi
stat.payloadcapacity = Yük Kapasitesi stat.payloadcapacity = Yük Kapasitesi
stat.commandlimit = Komut Limiti stat.commandlimit = Komut Limiti
stat.abilities = Kabiliyetler stat.abilities = Kabiliyetler
stat.canboost = Can Boost
stat.flying = Uçuyor
stat.ammouse = Mermi Kullanıyor
stat.damagemultiplier = Hasar Çarpanı
stat.healthmultiplier = Can Çarpanı
stat.speedmultiplier = Hız Çarpanı
stat.reloadmultiplier = Yeniden Yükleme Çarpanı
stat.buildspeedmultiplier = İnşa Hızı Çarpanı
stat.reactive = Tepki Verir
stat.healing = İyileştirir
ability.forcefield = Güç Kalkanı ability.forcefield = Güç Kalkanı
ability.repairfield = Onarma Alanı ability.repairfield = Onarma Alanı
ability.statusfield = Hızlandırma Alanı ability.statusfield = Hızlandırma Alanı
ability.unitspawn = {0} Birliği Fabrikası ability.unitspawn = {0} Birliği Fabrikası
ability.shieldregenfield = Kalkan Yenileme Alanı ability.shieldregenfield = Kalkan Yenileme Alanı
ability.movelightning = Hareket Enerjisi
ability.energyfield = Güç Kalkanı: [accent]{0}[] hasar ~ [accent]{1}[] blok / [accent]{2}[] hedef
bar.drilltierreq = Daha İyi Matkap Gerekli bar.drilltierreq = Daha İyi Matkap Gerekli
bar.noresources = Eksik Kaynaklar bar.noresources = Eksik Kaynaklar
@@ -676,6 +781,7 @@ bar.power = Enerji
bar.progress = İnşa İlerlemesi bar.progress = İnşa İlerlemesi
bar.input = Girdi bar.input = Girdi
bar.output = Çıktı bar.output = Çıktı
bar.strength = [stat]{0}[lightgray]x Güç
units.processorcontrol = [lightgray]İşlemci Kontrolünde units.processorcontrol = [lightgray]İşlemci Kontrolünde
@@ -710,8 +816,10 @@ unit.percent = %
unit.shieldhealth = kalkan canı unit.shieldhealth = kalkan canı
unit.items = eşya unit.items = eşya
unit.thousands = k unit.thousands = k
unit.millions = mil unit.millions = m
unit.billions = b unit.billions = b
unit.pershot = /vuruş
category.purpose = Amaç
category.general = Genel category.general = Genel
category.power = Enerji category.power = Enerji
category.liquids = Sıvılar category.liquids = Sıvılar
@@ -724,8 +832,12 @@ setting.shadows.name = Gölgeler
setting.blockreplace.name = Otomatik Blok önerileri setting.blockreplace.name = Otomatik Blok önerileri
setting.linear.name = Lineer Filtreleme setting.linear.name = Lineer Filtreleme
setting.hints.name = İpuçları setting.hints.name = İpuçları
setting.flow.name = Kaynak Geçiş Hızını Göster[scarlet] (deneysel) setting.logichints.name = İşemci İpuçları
setting.flow.name = Kaynak Geçiş Hızını Göster[scarlet]
setting.backgroundpause.name = Arka Planda Durdur
setting.buildautopause.name = İnşa etmeyi otomatik olarak durdur setting.buildautopause.name = İnşa etmeyi otomatik olarak durdur
setting.doubletapmine.name = İki Tıklamayla Kaz
setting.modcrashdisable.name = Modları Çökmede Kapa
setting.animatedwater.name = Animasyonlu Su setting.animatedwater.name = Animasyonlu Su
setting.animatedshields.name = Animasyonlu Kalkanlar setting.animatedshields.name = Animasyonlu Kalkanlar
setting.antialias.name = Düzgünleştirme [lightgray](yeniden başlatma gerekebilir)[] setting.antialias.name = Düzgünleştirme [lightgray](yeniden başlatma gerekebilir)[]
@@ -743,7 +855,7 @@ setting.difficulty.training = Eğitim
setting.difficulty.easy = Kolay setting.difficulty.easy = Kolay
setting.difficulty.normal = Normal setting.difficulty.normal = Normal
setting.difficulty.hard = Zor setting.difficulty.hard = Zor
setting.difficulty.insane = Çılgın setting.difficulty.insane = İmkansız
setting.difficulty.name = Zorluk: setting.difficulty.name = Zorluk:
setting.screenshake.name = Ekranı Salla setting.screenshake.name = Ekranı Salla
setting.effects.name = Efektleri Görüntüle setting.effects.name = Efektleri Görüntüle
@@ -753,7 +865,6 @@ setting.conveyorpathfinding.name = Konveyör Yol Bulma
setting.sensitivity.name = Kontrolcü Hassasiyeti setting.sensitivity.name = Kontrolcü Hassasiyeti
setting.saveinterval.name = Kayıt Aralığı setting.saveinterval.name = Kayıt Aralığı
setting.seconds = {0} Saniye setting.seconds = {0} Saniye
setting.blockselecttimeout.name = Blok Seçme Zaman Aşımı
setting.milliseconds = {0} milisaniye setting.milliseconds = {0} milisaniye
setting.fullscreen.name = Tam Ekran setting.fullscreen.name = Tam Ekran
setting.borderlesswindow.name = Kenarsız Pencere [lightgray](yeniden açmak gerekebilir) setting.borderlesswindow.name = Kenarsız Pencere [lightgray](yeniden açmak gerekebilir)
@@ -764,7 +875,7 @@ setting.pixelate.name = Pixelleştir [lightgray](animasyonları kapatır)
setting.minimap.name = Haritayı Göster setting.minimap.name = Haritayı Göster
setting.coreitems.name = Çekirdekteki Eşyaları Göster [lightgray](üzerinde çalışılıyor) setting.coreitems.name = Çekirdekteki Eşyaları Göster [lightgray](üzerinde çalışılıyor)
setting.position.name = Oyuncu Noktasını Göster setting.position.name = Oyuncu Noktasını Göster
setting.musicvol.name = Müzik setting.musicvol.name = Müzik Sesi
setting.atmosphere.name = Gezegen Atmosferini Göster setting.atmosphere.name = Gezegen Atmosferini Göster
setting.ambientvol.name = Çevresel Ses setting.ambientvol.name = Çevresel Ses
setting.mutemusic.name = Müziği Kapat setting.mutemusic.name = Müziği Kapat
@@ -778,7 +889,9 @@ setting.chatopacity.name = Mesajlaşma Opaklığı
setting.lasersopacity.name = Enerji Lazeri Opaklığı setting.lasersopacity.name = Enerji Lazeri Opaklığı
setting.bridgeopacity.name = Köprü Opaklığı setting.bridgeopacity.name = Köprü Opaklığı
setting.playerchat.name = Oyun-içi Konuşmayı Göster setting.playerchat.name = Oyun-içi Konuşmayı Göster
setting.showweather.name = Hava Durmu Grafiklerini Göster
public.confirm = Oyununuzu halka açık yapmak ister misiniz?\n[accent]Oyunlarınıza herkes katılabilecektir.\n[lightgray]Bu seçenek daha sonra Ayarlar->Oyun->Halka Açık Oyunlar'dan değiştirilebilir. public.confirm = Oyununuzu halka açık yapmak ister misiniz?\n[accent]Oyunlarınıza herkes katılabilecektir.\n[lightgray]Bu seçenek daha sonra Ayarlar->Oyun->Halka Açık Oyunlar'dan değiştirilebilir.
public.confirm.really = Eğer Arkadaşlarınla oynamak istiyorsan [green]Arkadaş Davet Et[] e bas. [scarlet]Halka Açık Sunucuya Değil[]!\nOyununu Gerçekten Halka açık yapmak istediğine [scarlet]Emin Misin[]?
public.beta = Oyunun beta sürümlerinin halka açık lobiler yapamayacağını unutmayın. public.beta = Oyunun beta sürümlerinin halka açık lobiler yapamayacağını unutmayın.
uiscale.reset = Arayüz ölçeği değiştirildi.\nBu ölçeği onaylamak için "Tamam" butonuna basın.\n[accent] {0}[] [scarlet]saniye içinde eski ayarlara geri dönülüp oyundan çıkılıyor…[] uiscale.reset = Arayüz ölçeği değiştirildi.\nBu ölçeği onaylamak için "Tamam" butonuna basın.\n[accent] {0}[] [scarlet]saniye içinde eski ayarlara geri dönülüp oyundan çıkılıyor…[]
uiscale.cancel = İptal Et ve Çık uiscale.cancel = İptal Et ve Çık
@@ -842,6 +955,9 @@ keybind.menu.name = Menü
keybind.pause.name = Durdur keybind.pause.name = Durdur
keybind.pause_building.name = İnşaatı Duraklat/İnşaata Devam Et keybind.pause_building.name = İnşaatı Duraklat/İnşaata Devam Et
keybind.minimap.name = Harita keybind.minimap.name = Harita
keybind.planet_map.name = Gezegen Haritası
keybind.research.name = Araştırma
keybind.block_info.name = Blok Bilgisi
keybind.chat.name = Konuş keybind.chat.name = Konuş
keybind.player_list.name = Oyuncu Listesi keybind.player_list.name = Oyuncu Listesi
keybind.console.name = Konsol keybind.console.name = Konsol
@@ -851,6 +967,7 @@ keybind.toggle_menus.name = Menüleri Aç/Kapa
keybind.chat_history_prev.name = Sohbet geçmişi önceki keybind.chat_history_prev.name = Sohbet geçmişi önceki
keybind.chat_history_next.name = Sohbet geçmişi sonraki keybind.chat_history_next.name = Sohbet geçmişi sonraki
keybind.chat_scroll.name = Sohbet Kaydırma keybind.chat_scroll.name = Sohbet Kaydırma
keybind.chat_mode.name = Konuşma Modunu Değiştir
keybind.drop_unit.name = Birlik Düşürme keybind.drop_unit.name = Birlik Düşürme
keybind.zoom_minimap.name = Haritada Yakınlaştırma/Uzaklaştırma keybind.zoom_minimap.name = Haritada Yakınlaştırma/Uzaklaştırma
mode.help.title = Modların açıklamaları mode.help.title = Modların açıklamaları
@@ -867,17 +984,21 @@ mode.custom = Özel Kurallar
rules.infiniteresources = Sınırsız Kaynaklar rules.infiniteresources = Sınırsız Kaynaklar
rules.reactorexplosions = Reaktör Patlamaları rules.reactorexplosions = Reaktör Patlamaları
rules.coreincinerates = Çekirdek Taşanları Eritir
rules.schematic = Schematics Allowed rules.schematic = Schematics Allowed
rules.wavetimer = Dalga Zamanlayıcısı rules.wavetimer = Dalga Zamanlayıcısı
rules.waves = Dalgalar rules.waves = Dalgalar
rules.attack = Saldırı Modu rules.attack = Saldırı Modu
rules.buildai = Yapay Zeka İnşası rules.buildai = Yapay Zeka İnşası
rules.corecapture = Yıkımca Çekirdeği Elegeçir
rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları
rules.blockhealthmultiplier = Blok Canı Çarpanı rules.blockhealthmultiplier = Blok Canı Çarpanı
rules.blockdamagemultiplier = Blok Hasarı Çarpanı rules.blockdamagemultiplier = Blok Hasarı Çarpanı
rules.unitbuildspeedmultiplier = Birim Üretim Hızı Çarpanı rules.unitbuildspeedmultiplier = Birim Üretim Hızı Çarpanı
rules.unithealthmultiplier = Birim Canı Çarpanı rules.unithealthmultiplier = Birim Canı Çarpanı
rules.unitdamagemultiplier = Birim Hasarı Çapanı rules.unitdamagemultiplier = Birim Hasarı Çapanı
rules.unitcapvariable = Çekirdekler Eleman Sınırını Etkiler
rules.unitcap = Sabit eleman Sınırı
rules.enemycorebuildradius = Düşman Çekirdeği İnşa Yasağı Yarıçapı: [lightgray](kare) rules.enemycorebuildradius = Düşman Çekirdeği İnşa Yasağı Yarıçapı: [lightgray](kare)
rules.wavespacing = Dalga Aralığı: [lightgray](sn) rules.wavespacing = Dalga Aralığı: [lightgray](sn)
rules.buildcostmultiplier = İnşa Ücreti Çarpanı rules.buildcostmultiplier = İnşa Ücreti Çarpanı
@@ -899,12 +1020,15 @@ rules.explosions = Blok/Birlik Patlama Hasarı
rules.ambientlight = Ortam Işığı rules.ambientlight = Ortam Işığı
rules.weather = Hava rules.weather = Hava
rules.weather.frequency = Sıklık: rules.weather.frequency = Sıklık:
rules.weather.always = Herzaman
rules.weather.duration = Süreklilik: rules.weather.duration = Süreklilik:
content.item.name = Eşyalar content.item.name = Malzemeler
content.liquid.name = Sıvılar content.liquid.name = Sıvılar
content.unit.name = Birimler content.unit.name = Birimler
content.block.name = Bloklar content.block.name = Bloklar
content.status.name = Durum Etkileri
content.sector.name = Sektörler
item.copper.name = Bakır item.copper.name = Bakır
item.lead.name = Kurşun item.lead.name = Kurşun
@@ -922,6 +1046,7 @@ item.blast-compound.name = Patlayıcı Bileşik
item.pyratite.name = Pirratit item.pyratite.name = Pirratit
item.metaglass.name = Metacam item.metaglass.name = Metacam
item.scrap.name = Hurda item.scrap.name = Hurda
liquid.water.name = Su liquid.water.name = Su
liquid.slag.name = Cüruf liquid.slag.name = Cüruf
liquid.oil.name = Petrol liquid.oil.name = Petrol
@@ -953,6 +1078,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
@@ -961,10 +1091,11 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
block.resupply-point.name = Resupply Point block.resupply-point.name = İkmal Noktası
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Uçurum block.cliff.name = Uçurum
block.sand-boulder.name = Kumlu Kaya Parçaları block.sand-boulder.name = Kumlu Kaya Parçaları
block.basalt-boulder.name = Bazalt Kaya
block.grass.name = Çimen block.grass.name = Çimen
block.slag.name = Cüruf block.slag.name = Cüruf
block.space.name = Uzay block.space.name = Uzay
@@ -1012,6 +1143,7 @@ block.sand-water.name = Kumlu Su
block.darksand-water.name = Kara Kumlu Su block.darksand-water.name = Kara Kumlu Su
block.char.name = Kömür block.char.name = Kömür
block.dacite.name = Dakit block.dacite.name = Dakit
block.rhyolite.name = Riyolit
block.dacite-wall.name = Dakit Duvar block.dacite-wall.name = Dakit Duvar
block.dacite-boulder.name = Dakit Kaya Parçaları block.dacite-boulder.name = Dakit Kaya Parçaları
block.ice-snow.name = Buzlu Kar block.ice-snow.name = Buzlu Kar
@@ -1062,7 +1194,6 @@ block.conveyor.name = Konveyör
block.titanium-conveyor.name = Titanyum Konveyör block.titanium-conveyor.name = Titanyum Konveyör
block.plastanium-conveyor.name = Plastanyum Konveyör block.plastanium-conveyor.name = Plastanyum Konveyör
block.armored-conveyor.name = Zırhlı Konveyör block.armored-conveyor.name = Zırhlı Konveyör
block.armored-conveyor.description = Materyalleri titanyum konveyörlerle aynı hızda taşır ama daha fazla zırha sahiptir. Diğer konveyörler dışında yan taraflardan materyal kabul etmez.
block.junction.name = Kavşak block.junction.name = Kavşak
block.router.name = Yönlendirici block.router.name = Yönlendirici
block.distributor.name = Dağıtıcı block.distributor.name = Dağıtıcı
@@ -1070,7 +1201,6 @@ block.sorter.name = Ayıklayıcı
block.inverted-sorter.name = Ters Ayıklayıcı block.inverted-sorter.name = Ters Ayıklayıcı
block.message.name = Mesaj block.message.name = Mesaj
block.illuminator.name = Aydınlatıcı block.illuminator.name = Aydınlatıcı
block.illuminator.description = Küçük, kompakt, yapılandırılabilir bir ışık kaynağı. Çalışması için enerji gerekir.
block.overflow-gate.name = Taşma Geçidi block.overflow-gate.name = Taşma Geçidi
block.underflow-gate.name = Yana Taşma Geçidi block.underflow-gate.name = Yana Taşma Geçidi
block.silicon-smelter.name = Silikon Fırını block.silicon-smelter.name = Silikon Fırını
@@ -1121,6 +1251,7 @@ block.solar-panel.name = Güneş Paneli
block.solar-panel-large.name = Büyük Güneş Paneli block.solar-panel-large.name = Büyük Güneş Paneli
block.oil-extractor.name = Petrol Çıkarıcı block.oil-extractor.name = Petrol Çıkarıcı
block.repair-point.name = Tamir Noktası block.repair-point.name = Tamir Noktası
block.repair-turret.name = Tamir Turreti
block.pulse-conduit.name = Dalga Borusu block.pulse-conduit.name = Dalga Borusu
block.plated-conduit.name = Kaplı Boru block.plated-conduit.name = Kaplı Boru
block.phase-conduit.name = Faz Borusu block.phase-conduit.name = Faz Borusu
@@ -1163,9 +1294,20 @@ 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 = Yük Konveyörü
block.payload-router.name = Yük Yönlendirici block.payload-router.name = Yük Yönlendirici
block.duct.name = Tüp
block.duct-router.name = Tüp Yönlendirici
block.duct-bridge.name = Tüp Köprü
block.payload-propulsion-tower.name = Yük Aktarma Kulesi
block.payload-void.name = Yük Yokedici
block.payload-source.name = Yük 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
#Düzgün tutun bu TR translatei uğraştırıyonuz beni. -RTOmega
block.block-forge.name = Blok Fabrikası
block.block-loader.name = Blok Yükleyici
block.block-unloader.name = Blok Boşaltıcı
block.interplanetary-accelerator.name = Gezegenler Arası Hızlandırıcı
block.switch.name = Düğme block.switch.name = Düğme
block.micro-processor.name = Mikro İşlemci block.micro-processor.name = Mikro İşlemci
@@ -1179,54 +1321,83 @@ block.memory-bank.name = Bellek Bankası
team.blue.name = mavi team.blue.name = mavi
team.crux.name = öz team.crux.name = öz
team.sharded.name = parçalanmış team.sharded.name = parçalanmış
team.orange.name = turuncu
team.derelict.name = sahipsiz team.derelict.name = sahipsiz
team.green.name = yeşil team.green.name = yeşil
team.purple.name = mor team.purple.name = mor
tutorial.next = [lightgray]<Devam etmek için dokunun.> hint.skip = Geç
tutorial.intro = [scarlet]Mindustry öğreticisine hoş geldiniz.[]\n[accent]Bakır kazarak[] başlayın. Bunu yapmak için merkezinize yakın bir bakır madenine dokunun.\n\n[accent]{0}/{1} bakır hint.desktopMove = [accent][[WASD][] ile hareket et.
tutorial.intro.mobile = [scarlet]Mindustry öğreticisine hoş geldiniz.[]\nHareket etmek için ekranı kaydırın.\nYakınlaştırmak ve uzaklaştırmak için [accent]iki parmakla kıstırın[].\n[accent]Bakır kazarak[] başlayın. Bunu yapmak için merkezinize yakın bir bakır madenine dokunun.\n\n[accent]{0}/{1} bakır hint.zoom = [accent]Scroll[] ile Zoom yap.
tutorial.drill = Manuel olarak kazmak verimsizdir.\n[accent]Matkaplar []otomatikman kazabilir.\nSağ alttaki matkap sekmesine tıklayınız.\n[accent]Mekanik matkabı[] seçiniz. Tıklayarak bir bakır madenine yerleştirin.\n Yapımı durdurmak için [accent]sağ tıklayın[] ve yakınlaştırmak ve uzaklaştırmak için [accent]CTRL basılı tutarak tekerleği kaydırın[]. hint.mine = Yakındaki bir \uf8c4 Bakır madenine yaklaş ve [accent]tıklayarak[] kaz.
tutorial.drill.mobile = Manuel olarak kazmak verimsizdir.\n[accent]Matkaplar []otomatik olarak kazabilir.\nSağ alttaki matkap sekmesine dokunun.\n[accent]Mekanik matkabı[] seçin. \nDokunarak bir bakır madenine yerleştirin, sonra seçiminizi onaylamak için alttaki [accent] tik düğmesine[] basın.\nYerleştirmenizi iptal etmek için [accent] X butonuna[] basın. hint.desktopShoot = [accent][[Sol Tılayarak][] ateş et.
tutorial.blockinfo = Her bloğun farklı istatistikleri vardır. Her matkap sadece belirli madenleri kazabilir.\nBir bloğun bilgi ve istatistiklerine bakmak için,[accent] yapım menüsünde seçerken "?" tuşuna dokunun.[]\n\n[accent]Şimdi mekanik matkabın istatistiklerine erişin.[] hint.depositItems = Malzeme transferi için, kendi biriminden çekirdeğe sürkle ve bıraz.
tutorial.conveyor = [accent]Konveyörler[] merkeze eşyaları ulaştırmak için kullanılır.\nMatkaptan merkeze konveyörlerden oluşan bir sıra yapın.\n[accent]Bir sıra halinde yerleştirmek için farenizi basılı tutun.[]\nÇaprazlama bir yol konveyör yerleştirmek için [accent]CTRL[] tuşunu basılı tutun.\n\n[accent]Sıra aracı ile 2 konveyör yerleştirin, sonra bir eşyayı merkeze götürün. hint.respawn = Tekrar doğmak için, [accent][[V][] ye bas.
tutorial.conveyor.mobile = [accent]Konveyörler[] merkeze eşyaları ulaştırmak için kullanılır.\nMatkaptan merkeze konveyörlerden oluşan bir sıra yapın.\n[accent] Bir sıra halinde yerleştirmek için parmağınızı birkaç saniye basılı tutup[] bir yöne çekin.\n\n[accent]Sıra aracı ile 2 konveyör yerleştirin, sonra bir eşyayı merkeze götürün. hint.respawn.mobile = Bir Bina veya Birimi kontrol ediyorsun. Tekrar doğmak için, [accent]sol üstteki avatara tıkla.[]
tutorial.turret = Bir eşya merkezinize girdiğinde, inşa için kullanılabilir.\nHer eşyaların sadece inşa için kullanılmadığını aklınızda tutun.\nİnşa için kullanılmayan eşyalar,[accent] kömür[] ya da[accent] hurda[] gibi materyaller merkeze konulamaz.\n[lightgray]Düşmanı[] püskürtmek için savunma yapıları inşa edilmelidir.\nÜssünüze yakın bir yerde [accent] duo tareti[] inşa edin. hint.desktopPause = [accent][[Boşluk][] tuşuna basarak oyunu durdurup yeniden başlata bilrisin.
tutorial.drillturret = Duo taretleri ateş etmek için [accent]bakır mühimmata[] ihtiyaç duyar.\nTaretin yakınına bir matkap yerleştirin.\nKonveyörleri tarete yönelterek tarete bakır ikmal edin.\n\n[accent]İkmal edilen mühimmat: 0/1 hint.placeDrill =İnşa menüsünden, \ue85e [accent]Kazıcı[] bölmesine tıkla \uf870 [accent]Kazıcıyı[] al ve bir madenin üstüne tıklayarak koy.
tutorial.pause = Mücadele sırasında [accent]oyunu durdurabilirsiniz.[]\nOyun durmaktayken inşaat emirlerini kuyruğa alabilirsiniz.\n\n[accent]Oyunu durdurmak için boşluk tuşuna basın. hint.placeDrill.mobile = İnşa menüsünden, \ue85e [accent]Kazıcı[] bölmesini seç, ardından \uf870 [accent]Kazıcı[] ya tıkla ve bir madenin üstüne tıkla.\n\n \ue800 [accent]Check tuşuna bas[] ve inşayı tamala.
tutorial.pause.mobile = Mücadele sırasında [accent]oyunu durdurabilirsiniz.[]\nOyun durmaktayken inşaat emirlerini kuyruğa alabilirsiniz.\n\n[accent]Oyunu durdurmak için sol üstteki bu butona basın. hint.placeConveyor = Konveyörler, bir kazıcıdan başka bir bloğa malzeme aktarmada kullanılır. Menüden bir \uf896 [accent]Konveyör[] seç, konveyörler \ue814 [accent]Taşıma[] menüsündedir.\n\nTıklayıp basılı tutraka biren fazla inşa edebilrsin.\n[accent]Scroll[] la döndürebilirsin.
tutorial.unpause = Şimdi devam etmek için boşluk tuşuna tekrar basın. hint.placeConveyor.mobile = Konveyörler, bir kazıcıdan başka bir bloğa malzeme aktarmada kullanılır. Menüden bir \uf896 [accent]Konveyör[] seç, konveyörler \ue814 [accent]Taşıma[] menüsündedir.\n\nParmağını basılı tutup sürüklersen birden fazla konveyör doşeyebilirsin.
tutorial.unpause.mobile = Şimdi devam etmek için butona tekrar basın. hint.placeTurret = \uf861 [accent]Silahlar[] seni düşman birimlerinden korumak içindir.\n\nSilahlar, mermi gerektirir, \uf838(bakır).\nOnlara Konveyör ve Kazıcı kullanarak mermi sağla.
tutorial.breaking = Blokların sık sık yok edilmesi gerekir.\n[accent]Sağ fare butonuna basılı tutarak[] bir alan içindeki blokları seçip yok edebilirsiniz.[]\n\n[accent]Çekirdeğinizin solundaki bütün hurda bloklarını bu şekilde yok edin. hint.breaking = Blokları silmek için silmek istediğiniz objelerin üstüne [accent]Sağ Tıklayın[]. Birden fazla obje silmek için sağ tuşu basılı tutun ve farenizi sürükleyin.
tutorial.breaking.mobile = Blokların sık sık yok edilmesi gerekir.\n[accent]Yıkım modunu seçin[], sonra bir bloğa dokunarak onu yok edin. Ekrana birkaç saniye basılı tutarak bir alan içindeki blokları seçip yok edebilirsiniz.\nTik butonuna basarak yıkım işlemini onaylayın.\n\n[accent]Çekirdeğinizin solundaki bütün hurda bloklarını bu şekilde yok edin. hint.breaking.mobile = Ekranın sağ altındaki \ue817 [accent]çekiç[] tuşuna basın ve silmek istediğiniz objelere tıklayın. \n\nBirden fazla obje silmek için parmağınızı ekranda 1 saniye basılı tutun ve parmağınızı sürükleyin.
tutorial.withdraw = Bazı durumlarda bloklardan materyalleri direkt olarak almak gerekir.\nBunun için önce içinde materyaller olan [accent]bir bloğa dokunun[], sonra envanterdeki [accent]malzemeye dokunun[].\n[accent]dokunup basılı tutarak[] birden fazla materyali alabilirsiniz.\n\nÇekirdekten biraz bakır alın. hint.blockInfo = Bir blok hakkında bilgiyi görüntülemek için [accent]inşa menüsüne[] tıklayın. Sonra sağdaki [accent][[?][] sembolüne tıklayın.
tutorial.deposit = Malzemeleri geminizden hedef bloğa sürükleyerek malzemeleri bırakabilirsiniz.\n\n[accent]Bakırı çekirdeğe geri bırakın.[] hint.research = \ue875 [accent]Araştırma[] sekmesini kullanarak yeni teknolojiler araştırabilirsiniz.
tutorial.waves = [lightgray]Düşman[] yaklaşıyor.\n\nÇekirdeği 2 dalga boyunca koruyun. Ateş etmek için [accent]tıklayın[].\nDaha fazla taret ve matkap inşa edin ve daha fazla bakır toplayın. hint.research.mobile = \ue88c [accent]Menüdeki[] \ue875 [accent]Araştırma[] sekmesini kullanarak yeni teknolojiler araştırabilirsiniz.
tutorial.waves.mobile = [lightgray]Düşman[] yaklaşıyor.\n\nÇekirdeği 2 dalga boyunca koruyun. Geminiz düşmanlara otomatik olarak ateş edecektir.\nDaha fazla taret ve matkap inşa edin ve daha fazla bakır toplayın. hint.unitControl = Kendi takımınızdaki taret ve birimleri kontrol etmek için [accent][[Sol CTRL][] tuşunu basılı tutarak istediğiniz taretin yada birimin üstüne sol tıklayın.
tutorial.launch = Belirli bir dalgaya ulaşınca, çekirdeği bulunduğu bölgeden [accent]kaldırabilir[], bütün binalarınızı arkada bırakıp [accent]çekirdeğinizdeki bütün materyallere sahip olabilirsiniz.[]Bu materyaller daha sonra yeni teknolojiler geliştirmek için kullanılabilir.\n\n[accent]Kalkış butonuna basın. hint.unitControl.mobile = Kendi takımınızdaki taret ve birimleri kontrol etmek için istediğiniz taretin yada birimin üstüne [accent][[2 kere tıklayın.][]
hint.launch = Yeterince kaynak topladıktan sonra, üssünüzü başka bir sektöre [accent]fırlatmak[] için sağ alttaki \ue827 [accent]harita[] tuşuna basın.
hint.launch.mobile = Yeterince kaynak topladıktan sonra, üssünüzü başka bir sektöre [accent]fırlatmak[] için sağ alttaki \ue88c [accent]menüden[] \ue827 [accent]harita[] tuşuna basın.
hint.schematicSelect = İstediğiniz blokları kopyalayıp yapıştırmak için [accent][[F][] tuşunu basılı tutun ve farenizi sürükleyin.\n\n[accent][[Orta Tuş'a (Fare Tekerleği'ne)][] basarak tek bir blok seçebilirsiniz.
hint.conveyorPathfind = Konveyörler ile yol yaparken bir noktadan diğer noktaya otomatik yol oluşturmak için [accent][[Sol CTRL][] tuşunu basılı tutun.
hint.conveyorPathfind.mobile = Konveyörler ile yol yaparken bir noktadan diğer noktaya otomatik yol oluşturmak için \ue844 [accent]Çapraz Mod'u[] etkinleştirin.
hint.boost = Bazı yer birimleri duvarların, taretlerin, diğer birimlerin üstünden uçma özelliği vardır. [accent][[Sol Shift][] tuşunu basılı tutarak bazı yer üniteleri ile uçabilirsiniz.
hint.command = [accent]Benzer Türdeki[] birimleri kontrol etmek için [accent][[G][] tuşuna basın. \n\nYer birimlerini kontrol etmek için ilk önce bir yer birimini kontrol etmeniz gerekir.
hint.command.mobile = Ekrana [accent][[2 kere yıklayarak][] benzer türdeki birimleri kontrol edebilirsiniz. \n\nYer birimlerini kontrol etmek için ilk önce bir yer birimini kontrol etmeniz gerekir.
hint.payloadPickup = Bazı birimlerin binaları ve birimleri alma özelliği vardır. Bir binanın yada birimin üstündeyken [accent][[[] tuşuna basarak kendinizden küçük binaları ve birimleri alabilirsiniz.
hint.payloadPickup.mobile = Bazı birimlerin binaları ve birimleri alma özelliği vardır. Bir binaya yada birime [accent]Tıklayıp Basılı Tutarak[] kendinizden küçük binaları ve birimleri alabilirsiniz.
hint.payloadDrop = [accent]][] tuşuna basarak taşıınız yükü bırakabilirsiniz.
hint.payloadDrop.mobile = Boş bir yere [accent]tıklayıp basılı tutarak[] taşıdığınız yükü bırakabilirsiniz.
hint.waveFire = [accent]Wave[] tareti su ile dolu olduğu zaman etrafta çıkan yangınları otomatik olarak söndürür.
hint.generator = \uf879 [accent]Termik Jeneratör[] kömür yakarak enerji üretir.\n\nEnerjiyi bir yerden başka bir yere götürmek için \uf87f [accent]Enerji Noktalarını[] kullanırız.
hint.guardian = [accent]Gardiyan[] birimleri güçlü bir zırha sahiptir. [accent]bakır[] ve [accent]kurşun[] gibi mermilere karşı [scarlet]Dayanıklıdır[].\n\nGardiyanları öldürmek için [accent]salvo[] gibi daha güçlü taretleri ve \uf835 [accent]grafit[] gibi daha çok hasar veren mermileri kullanın.
hint.coreUpgrade = Merkezinizi, [accent]merkezinizin üstüne daha gelişmiş bir merkez[] koyarak geliştirebilirsiniz. \n\n[accent]Parçacık[] olarak adlandırılan fakirhanenizin üstüne [accent]Temel[] olarak adlandırılan merkezinizi koyun. Merkezinizin etrafında hiçbir yapı olmamalıdır.
hint.presetLaunch = [accent]Donmuş Ormanlar[] gibi [accent]ana sektörlere iniş[] herhangi bir yerden yapılabilir. Yakındaki bir sektörden fırlatma gerektirmez.\n\nBunun gibi [accent]sayı ile isimlendirilmiş[] sektörleri ele geçirmek [accent]isteğe bağlıdır.[].
hint.coreUpgrade = Bir çekirdeğin Üstüne başka bir çekirdek koayarak onu geliştirebilirsin!\n\n Daha gelişmiş çekirdekler daha fazla kapasite demektir.
hint.presetLaunch = Hikaye Sektörlerine her yerden fırltış yapabilirsin! Ancak Numaralı Sektörlere temas olmadan Fırlatış yapılamaz.
hint.coreIncinerate = Bir çekirdek ağzına kadar dolduktan sonra, ekstra itemler [accent]eritilir[].
hint.coopCampaign = Arkadaşlarınla Multiplayer Campaign oynarken, her yaptığınız Araştırma ve item aktarımı, senin oyun içi Campaign ine de aktarılır.
#Yukarıdaki bağzı cümleler Anti Dragon tarafından çevirildi.
item.copper.description = En basit materyal. Her türlü blokda kullanılır. item.copper.description = En basit materyal. Her türlü blokda kullanılır.
item.copper.details = Bakır. En basit materyal. Tüm alt düzey binalarda gerekir. Zayıf ve dayanıksızdır.
item.lead.description = Basit bir materyal. Elektronikte ve sıvı taşımada kullanılır. item.lead.description = Basit bir materyal. Elektronikte ve sıvı taşımada kullanılır.
item.lead.details = Yoğun. Durağan. Pillerde yaygın olarak kullanılır.\nNot: Yaşam formlarına toksik. Tabi burda onlardan pek yok...
item.metaglass.description = Süper sert camdan bir bileşim. Sıvı dağıtımı ve depolamak için yaygın olarak kullanılır. item.metaglass.description = Süper sert camdan bir bileşim. Sıvı dağıtımı ve depolamak için yaygın olarak kullanılır.
item.graphite.description = Mineralize karbon. Mermi ve elektrik yalıtımında kullanılır. item.graphite.description = Mineralize karbon. Mermi ve elektrik yalıtımında kullanılır.
item.sand.description = Hem alaşım yapmada hem de arıtkan olarak metalurji işlemlerinde kullanılan bir malzeme. item.sand.description = Hem alaşım yapmada hem de arıtkan olarak metalurji işlemlerinde kullanılan bir malzeme.
item.coal.description = Tohumlama olayından çok önce oluşmuş, fosilleşmiş bitki maddesi. Yaygın olarak yakıt ve kaynak üretimi için kullanılır. item.coal.description = Tohumlama olayından çok önce oluşmuş, fosilleşmiş bitki maddesi. Yaygın olarak yakıt ve kaynak üretimi için kullanılır.
item.coal.details = Fosilleşmiş bitki kalıntısına benziyor. Herhalde tohumlanmadan çok uzun zaman önce ölmüşler.
item.titanium.description = Yaygın olarak sıvı taşımada, matkaplarda ve uçaklarda kullanılan nadir bir süper-hafif metal. item.titanium.description = Yaygın olarak sıvı taşımada, matkaplarda ve uçaklarda kullanılan nadir bir süper-hafif metal.
item.thorium.description = Yapısal destek ve nükleer yakıt olarak kullanılan yoğun, radyoaktif bir metal. item.thorium.description = Yapısal destek ve nükleer yakıt olarak kullanılan yoğun, radyoaktif bir metal.
item.scrap.description = Eski yapılar ve birimlerin kalıntıları. Birçok farklı metalden eser miktarları içerir. item.scrap.description = Eski yapılar ve birimlerin kalıntıları. Birçok farklı metalden eser miktarları içerir.
item.scrap.details = Eski bina ve birimlerin kalıntıları.
item.silicon.description = Kullanışlı bir yarı iletken. Güneş panellerinde, elektronikler ve güdümlü cephanesi için kullanılır. item.silicon.description = Kullanışlı bir yarı iletken. Güneş panellerinde, elektronikler ve güdümlü cephanesi için kullanılır.
item.plastanium.description = Gelişmiş uçak ve parçalama için kullanılan hafif, sünek bir malzeme. item.plastanium.description = Gelişmiş uçak ve parçalama için kullanılan hafif, sünek bir malzeme.
item.phase-fabric.description = Gelişmiş elektronik ve kendi kendini tamir etme teknolojisınde kullanılan neredeyse ağırlıksız bir madde. item.phase-fabric.description = Gelişmiş elektronik ve kendi kendini tamir etme teknolojisınde kullanılan neredeyse ağırlıksız bir madde.
item.surge-alloy.description = Kendine özgü elektriksel özelliklere sahip gelişmiş bir alaşım. item.surge-alloy.description = Kendine özgü elektriksel özelliklere sahip gelişmiş bir alaşım.
item.spore-pod.description = Endüstriyel kullanım için atmosferik partiküllerden üretilen sentetik sporlarla dolu bir kapsül. Yağ, patlayıcı ve yakıt yapımı için kullanılır. item.spore-pod.description = Endüstriyel kullanım için atmosferik partiküllerden üretilen sentetik sporlarla dolu bir kapsül. Yağ, patlayıcı ve yakıt yapımı için kullanılır.
item.spore-pod.details = Spor.Büyük ihtimalle sentetik bir yaşam formu. Tokisk bir gaz yayıyor. Aşırı istilacı. Aşırı yanıcı.
item.blast-compound.description = Bomba ve patlayıcılarda kullanılan dengesiz bir bileşim. Spor kapsülleri ve diğer uçucu maddelerden sentezlenir. Yakıt olarak tavsiye edilmez. item.blast-compound.description = Bomba ve patlayıcılarda kullanılan dengesiz bir bileşim. Spor kapsülleri ve diğer uçucu maddelerden sentezlenir. Yakıt olarak tavsiye edilmez.
item.pyratite.description = Yakıcı silahlarda kullanılan son derece yanıcı bir madde. item.pyratite.description = Yakıcı silahlarda kullanılan son derece yanıcı bir madde.
liquid.water.description = En kullanışlı sıvı. Makineleri soğutmak ve atık işlenmesi için kullanılır. liquid.water.description = En kullanışlı sıvı. Makineleri soğutmak ve atık işlenmesi için kullanılır.
liquid.slag.description = Çeşitli tipte erimiş metallerin birbirine karışımı. Bileşenlerine ayrılabilir veya düşmanlara silah olarak püskürtülebilir. liquid.slag.description = Çeşitli tipte erimiş metallerin birbirine karışımı. Bileşenlerine ayrılabilir veya düşmanlara silah olarak püskürtülebilir.
liquid.oil.description = İleri seviye malzeme üretiminde kullanılan bir sıvıdır. Yakıt olarak kömür haline getirilebilir veya püskürtülüp ateşe verilerek bir silah olarak kullanılabilir. liquid.oil.description = İleri seviye malzeme üretiminde kullanılan bir sıvıdır. Yakıt olarak kömür haline getirilebilir veya püskürtülüp ateşe verilerek bir silah olarak kullanılabilir.
liquid.cryofluid.description = Su ve titanyumdan oluşturulan inaktif bir sıvı. Son derece yüksek ısı kapasitesine sahiptir. Soğutucu olarak yaygın olarak kullanılır. liquid.cryofluid.description = Su ve titanyumdan oluşturulan inaktif bir sıvı. Son derece yüksek ısı kapasitesine sahiptir. Soğutucu olarak yaygın olarak kullanılır.
block.resupply-point.description = Yakındaki birimlere mermi verir. Elektikle çalışmaz.
block.armored-conveyor.description = Materyalleri titanyum konveyörlerle aynı hızda taşır ama daha fazla zırha sahiptir. Diğer konveyörler dışında yan taraflardan materyal kabul etmez.
block.illuminator.description = Küçük, kompakt, yapılandırılabilir bir ışık kaynağı. Çalışması için enerji gerekir.
block.message.description = Bir mesajı saklar. Müttefikler arasındaki haberleşmede kullanılır. block.message.description = Bir mesajı saklar. Müttefikler arasındaki haberleşmede kullanılır.
block.graphite-press.description = Kömür parçalarını sıkıştırıp saf grafit tabakaları üretir. block.graphite-press.description = Kömür parçalarını sıkıştırıp saf grafit tabakaları üretir.
block.multi-press.description = Grafit presinin yükseltilmiş versiyonu. Kömürün hızlı ve verimli bir şekilde işlenmesi için su ve enerji kullanır. block.multi-press.description = Grafit presinin yükseltilmiş versiyonu. Kömürün hızlı ve verimli bir şekilde işlenmesi için su ve enerji kullanır.
@@ -1278,6 +1449,7 @@ block.phase-conveyor.description = Gelişmiş materyal taşıma bloğu. Materyal
block.sorter.description = Materyalleri ayıklar. Eğer materyal seçilen ile eşleşiyorsa geçmesine izin verilir. Yoksa materyal sağa ya da sola atılır. block.sorter.description = Materyalleri ayıklar. Eğer materyal seçilen ile eşleşiyorsa geçmesine izin verilir. Yoksa materyal sağa ya da sola atılır.
block.inverted-sorter.description = Materyalleri sıradan bir ayıklayıcı gibi işler, ancak seçili öğeleri önden değil yanlardan geçirir. block.inverted-sorter.description = Materyalleri sıradan bir ayıklayıcı gibi işler, ancak seçili öğeleri önden değil yanlardan geçirir.
block.router.description = Materyalleri bir yönden alıp diğer üç yöne eşit olarak dağıtır. Materyalleri bir kaynaktan birden fazla hedefe iletmek için kullanılır.\n\n[scarlet]Asla üretim yapan binaların dibine yerleştirmeyin, yoksa istenmeyen materyaller tarafından tıkanabilir.[] block.router.description = Materyalleri bir yönden alıp diğer üç yöne eşit olarak dağıtır. Materyalleri bir kaynaktan birden fazla hedefe iletmek için kullanılır.\n\n[scarlet]Asla üretim yapan binaların dibine yerleştirmeyin, yoksa istenmeyen materyaller tarafından tıkanabilir.[]
block.router.details = [#ff]Sakın, asla, kattiyen iki tanesini yan yana koyma! Yoksa Tüm evren parçalanabilir!
block.distributor.description = Gelişmiş bir yönlendirici. Materyalleri yedi farklı yöne dağıtabilir. block.distributor.description = Gelişmiş bir yönlendirici. Materyalleri yedi farklı yöne dağıtabilir.
block.overflow-gate.description = Ayırıcı ve yönlendiricinin bir karışımı. Materyalleri sadece ön kısım kapalı olduğunda sağa ve sola atar. block.overflow-gate.description = Ayırıcı ve yönlendiricinin bir karışımı. Materyalleri sadece ön kısım kapalı olduğunda sağa ve sola atar.
block.underflow-gate.description = Taşma geçidinin zıttıdır. Sol ve sağ taraf kapalıysa materyalleri ön tarafa atar. block.underflow-gate.description = Taşma geçidinin zıttıdır. Sol ve sağ taraf kapalıysa materyalleri ön tarafa atar.
@@ -1314,14 +1486,18 @@ block.laser-drill.description = Lazer teknolojisi sayesinde daha da hızlı kazm
block.blast-drill.description = En iyi matkap. Çalışması için çok miktarda enerji gerekir. block.blast-drill.description = En iyi matkap. Çalışması için çok miktarda enerji gerekir.
block.water-extractor.description = Yeraltındaki suyu çıkarır. Hiç su bulunmayan yerlerde kullanılır. block.water-extractor.description = Yeraltındaki suyu çıkarır. Hiç su bulunmayan yerlerde kullanılır.
block.cultivator.description = Atmosferdeki küçük spor partiküllerini büyütüp endüstriyel kullanıma hazır kapsüllere çevirir. block.cultivator.description = Atmosferdeki küçük spor partiküllerini büyütüp endüstriyel kullanıma hazır kapsüllere çevirir.
block.cultivator.details = Geri Dönüştürülmüş Teknoloji. Yüksek miktarda bio kütle üretmede kullanılır. Serpulo yu kaplayan sporların kaynağı.
block.oil-extractor.description = Çokça enerji, su kullanarak yerden petrol çıkarır. block.oil-extractor.description = Çokça enerji, su kullanarak yerden petrol çıkarır.
block.core-shard.description = Çekirdek kapsülünün ilk versiyonu. Yok edilirse, bölge ile bütün iletişim kesilir. Bunun olmasına izin verme. block.core-shard.description = Çekirdek kapsülünün ilk versiyonu. Yok edilirse, bölge ile bütün iletişim kesilir. Bunun olmasına izin verme.
block.core-shard.details = İlk aşama. Bu üstün makine, kendini kopyalama ve tek inişlik roket özelliklerine sahip. Gezegenler arası ulaşımda kullanılamaz!
block.core-foundation.description = Çekirdek kapsülünün ikinci versiyonu. Daha iyi zırhlı ve daha çok materyal depolayabilir. block.core-foundation.description = Çekirdek kapsülünün ikinci versiyonu. Daha iyi zırhlı ve daha çok materyal depolayabilir.
block.core-foundation.details = İkinci Aşama.
block.core-nucleus.description = Çekirdek kapsülünün üçüncü ve son versiyonu. Aşırı derecede zırhlı ve dev miktarda materyal depolayabilir. block.core-nucleus.description = Çekirdek kapsülünün üçüncü ve son versiyonu. Aşırı derecede zırhlı ve dev miktarda materyal depolayabilir.
block.core-nucleus.details = Üçüncü ve Son Aşama.
block.vault.description = Her materyalden az miktarda saklar. Materyalleri kasadan almak için bir boşaltıcı bloğu kullanılabilir. block.vault.description = Her materyalden az miktarda saklar. Materyalleri kasadan almak için bir boşaltıcı bloğu kullanılabilir.
block.container.description = Her materyalden az miktarda saklar. Materyalleri konteynerden almak için bir boşaltıcı bloğu kullanılabilir. block.container.description = Her materyalden az miktarda saklar. Materyalleri konteynerden almak için bir boşaltıcı bloğu kullanılabilir.
block.unloader.description = Materyalleri bir konteyner, kasa, veya çekirdekten çıkarıp; bir konveyöre veya dibindeki bir bloğa koyar. Çıkardığı materyal türü dokunularak değiştirilebilir. block.unloader.description = Materyalleri bir konteyner, kasa, veya çekirdekten çıkarıp; bir konveyöre veya dibindeki bir bloğa koyar. Çıkardığı materyal türü dokunularak değiştirilebilir.
block.launch-pad.description = Çekirdek kalkışına gerek duymadan materyalleri üsse gönderir. block.launch-pad.description = Başka Bir Sektöre item gönderir.
block.launch-pad-large.description = Kalkış pistinin daha gelişmiş bir versiyonu. Daha fazla materyali daha sık gönderebilir. block.launch-pad-large.description = Kalkış pistinin daha gelişmiş bir versiyonu. Daha fazla materyali daha sık gönderebilir.
block.duo.description = Küçük, ucuz bir taret. Yer birimlerine karşı etkilidir. block.duo.description = Küçük, ucuz bir taret. Yer birimlerine karşı etkilidir.
block.scatter.description = Önemli bir uçaksavar tareti. Düşman birimlerine hurda ya da kurşun uçaksavar mermileri atar. block.scatter.description = Önemli bir uçaksavar tareti. Düşman birimlerine hurda ya da kurşun uçaksavar mermileri atar.
@@ -1339,3 +1515,211 @@ block.spectre.description = Dev bir çift namlulu top. Hava ve kara birimlerine
block.meltdown.description = Dev bir lazer topu. Yüklenip yakındaki düşmanlara uzun süreli lazer ışınları yollar. Çalışması için soğutucu gerekir. block.meltdown.description = Dev bir lazer topu. Yüklenip yakındaki düşmanlara uzun süreli lazer ışınları yollar. Çalışması için soğutucu gerekir.
block.repair-point.description = Kendisine en yakın hasarlı birimi tamir eder. block.repair-point.description = Kendisine en yakın hasarlı birimi tamir eder.
block.segment.description = Gelen mermilere zarar verir ve onları yok eder. Lazer mermilere etki etmez. block.segment.description = Gelen mermilere zarar verir ve onları yok eder. Lazer mermilere etki etmez.
block.parallax.description = Çekici bir ışın fırlatarak hava düşmanlarını kendine çeker. Onlara az da olsa zarar verir.
block.tsunami.description = Düşmanlara yüksek miktarda sıvı püskürtür. Ateşleri otomatik söndürür.
block.silicon-crucible.description = Kum ve Kömürü, Pirratitle eriterek Silikon üretir. Sıcak ortamda daha iyi çalışır.
block.disassembler.description = Cürüfü aşırı sıcak ortamda seritir. Toryum elde edebilir.
block.overdrive-dome.description = Yakındaki binaları hızlandırır. Çalışmak için silikon ve faz gerektirir.
block.payload-conveyor.description = Büyük yükleri hareket ettirir. Birimler gibi.
block.payload-router.description = Büyük Yükleri 3 Ayrı yöne aktarır.
block.command-center.description = Birimleri birkaç farklı şekilde yönlendirir.
block.ground-factory.description = Yer Birimi üretir. Bu birimler direk kullanılabilir veya geliştirilebilir.
block.air-factory.description = Hava Birimi üretir. Bu birimler direk kullanılabilir veya geliştirilebilir.
block.naval-factory.description = Su Birimi üretir. Bu birimler direk kullanılabilir veya geliştirilebilir.
block.additive-reconstructor.description = Birimleri 2. seviyeye yükseltir.
block.multiplicative-reconstructor.description = Birimleri 3. seviyeye yükseltir.
block.exponential-reconstructor.description = Birimleri 4. seviyeye yükseltir.
block.tetrative-reconstructor.description = Birimleri 5. ve son seviyeye yükseltir.
block.switch.description = Aktif edilebilen bir düğme.
block.micro-processor.description = Birtakım işlemleri döngü halinde yapar. Birimleri ve binaları kontrol edebilir.
block.logic-processor.description = Birtakım işlemleri döngü halinde yapar. Birimleri ve binaları kontrol edebilir. Daha hızlı çalışır.
block.hyper-processor.description = Birtakım işlemleri döngü halinde yapar. Birimleri ve binaları kontrol edebilir. Daha-da hızlı çalışır.
block.memory-cell.description = Bilgi saklar.
block.memory-bank.description = Bilgi saklar. Yüksek kapasiteye sahiptir.
block.logic-display.description = Bir işlemciden bilgi alarak grafik gösteririr.
block.large-logic-display.description = Bir işlemciden bilgi alarak grafik gösteririr.
block.interplanetary-accelerator.description = Gezegenler Arası ulaşım şimdi parmaklarının ucunda...
#burdan sonraki her şeyi benim translate etmem gerekti!!! -RTOmega
unit.dagger.description = Düşmanlara basit mermilerle ateş eder.
unit.mace.description = Düşmanlara alev atar.
unit.fortress.description = Yer Düşmanlarına uzun menzil gülleler fırlatır.
unit.scepter.description = Düşmanlara süper yüklü mermiler fırlatır.
unit.reign.description = Düşmanlara devasa delici mermilerle ateş eder.
unit.nova.description = Minik lazerler atar ve binaları tamir eder. Uçabilir.
unit.pulsar.description = Minik elektroşoklar atar ve binaları tamir eder. Uçabilir.
unit.quasar.description = Delici lazerlerle ateş eder ve binaları tamir eder. Uçabilir.
unit.vela.description = Uzun süreli büyük bir lazer ateş eder ve binaları tamir eder. Uçabilir.
unit.corvus.description = Çok Yüksek Menzilli devasa bir lazer atar. Her şeyi deler. Binaların üstünden yürüyebilir.
unit.crawler.description = Düşmana doğru koşar ve kendini imha eder.
unit.atrax.description = Cürüf topları fırlator. Binaların üstünden yürüyebilir.
unit.spiroct.description = Emici lazerler ateş eder, kendini onarır. Binaların üstünden yürüyebilir.
unit.arkyid.description = Emci ilazerler ateş eder ve devasa bir gülle fırlatır. Binaların üstünden yürüyebilir.
unit.toxopid.description = Devasa bir enerji topu fırlatır. Binaların üstünden yürüyebilir.
unit.flare.description = Yakındakilere basit mermi atar.
unit.horizon.description = Yakındaki yer düşmanlarına bombarduman yapar.
unit.zenith.description = Swarmer-gibi füzeler fırlatır.
unit.antumbra.description = Büyük boyutta mermiler fırlatır.
unit.eclipse.description = Büyük mermiler fırlatır ve lazer atar.
unit.mono.description = Otomatik bir şekilde Bakır ve Kurşun kazar ve çekirdeğe getirir.
unit.poly.description = Otomatik bir şekilde kırılmış binaları geri inşa eder ve oyuncuya inşaatta yardımcı olur.
unit.mega.description = Otomayik bir şekilde hasarlı bolkları onarır. Blokları ve Birimleri taşıyabilir.
unit.quad.description = Büyük bombalar atar, hasarlı bolkları onarır ve düşmanlara zarar verir. Bolkları ve Birimleri taşıyabilir.
unit.oct.description = Yakındaki birimleri korur ve tamir eder. Blokları ve Birimleri taşıyabilir.
unit.risso.description = Yakındaki düşmanlara Füze atar.
unit.minke.description = Yakındaki düşmanlara basit mermi ve toplarla 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.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.beta.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.write = Bağlı hafıza kutuaundaki numaraya yazar.
lst.print = Text yazar.
lst.draw = Ekrana Çizer.
lst.drawflush = Ekrana Çizimi Aktarır.
lst.printflush = Mesaj bloğuna texti aktarır,
lst.getlink = Bağlı blokları alır.
lst.control = Bir binayı yönet.
lst.radar = Bir silahın yakınındaki birimleri alıgılar,
lst.sensor = Bloklardan bilgi alır.
lst.set = Bir değişken ata.
lst.operation = Değişkenlerle işlem yap.
lst.end = Döngünün sonuna atla.
lst.jump = Bir yerden başka bir yere atla.
lst.unitbind = Bir birimi bağla: [accent]@unit[].
lst.unitcontrol = Bağlı birimi kontrol et.
lst.unitradar = Bağlı birimin etrafındaki birimleri tara.
lst.unitlocate = Etraftaki blokları algılar.\nBağlı birim gerektirir.
logic.nounitbuild = [red]Birim İnşası Yasak!
lenum.type = Bir bina/birim türü.\nörnek: [accent]@router[].
lenum.shoot = Bir konuma ateş et.
lenum.shootp = Belli bir birim veya binaya ateş et.
lenum.config = Bina configurasyonu, örnek: Ayıklayıcı Türü
lenum.enabled = Blok aktif mi?
laccess.color = Aydınlatıcı Rengi.
laccess.controller = Nirim Kontrol edici. Eğer işlemci kontrol ediyorsa işlemci döner.
laccess.dead = Bir bina veya birim hala var mı?
laccess.controlled = Bir birim ne tarafından kontrol ediliyor?
laccess.commanded = [red]Bu komut sonradan silicek! Controlled kullan!
laccess.progress = Bir şeyin oluş aşaması, örnek: bir turetin yeniden doldurma süresindeki aşama.
graphicstype.clear = Ekranı bir renkle kapla.
graphicstype.color = Bir sonraki çizim için Renk.
graphicstype.stroke = Çizgi Kalınlığını belirle.
graphicstype.line = Çizgiyi Belirle.
graphicstype.rect = Bir Dikdörtgeni doldur.
graphicstype.linerect = İçi boş Dikdörtgen çiz.
graphicstype.poly = İçi Dolu Çokgen Çiz.
graphicstype.linepoly = İçi Boş Çokgen Çiz.
graphicstype.triangle = İçi Dolu Üçgen Çiz.
graphicstype.image = Bir ikon çiz. \nörnek: [accent]@router[] veya [accent]@dagger[].
lenum.always = Her Zaman Doğru
lenum.idiv = Tamsayı Bölme
lenum.div = Bölme
lenum.mod = Mod
lenum.equal = Eşit
lenum.notequal = Eşit Değil
lenum.strictequal = Aynı
lenum.shl = Shift Sol
lenum.shr = Shift Sağ
lenum.or = Veya
lenum.land = Çapraz Ve
lenum.and = Ve
lenum.not = Değil
lenum.xor = Çapraz Veya
lenum.min = İki sayıdan en küçüğü.
lenum.max = İki sayıdan en büyüğü.
lenum.angle = İki Işının yaptığıı.
lenum.len = Bir Işının Uzunluğu.
lenum.sin = Sinüs
lenum.cos = Cosinüs
lenum.tan = Tanjant
lenum.asin = Arc Sinüs
lenum.acos = Arc Cosinüs
lenum.atan = Arc Tanjant
#not a typo, look up 'range notation'
lenum.rand = [0 ile Sayı) arasında rastgele bir sayı.
lenum.log = Logaritma
lenum.log10 = Logaritma 10
lenum.noise = 2D Noise
lenum.abs = Absulute
lenum.sqrt = KareKök
lenum.any = Herhangi bir Birim.
lenum.ally = Aynı Takımdan Birim.
lenum.attacker = Silahlı Birim.
lenum.enemy = Düşman Birim.
lenum.boss = Gardiyan Biri.
lenum.flying = Uçan Birim.
lenum.ground = Yürüyen Birim.
lenum.player = Oyuncu olan bir Birim.
lenum.ore = Maden.
lenum.damaged = Hasarlı Aynı Takımdan bir Blok.
lenum.spawn = Düşman Oluşum Noktası
lenum.building = Bir guruptan bir blok.
lenum.core = Herhangi bir Çekirdek.
lenum.storage = Depolama Bloğu,
lenum.generator = Enerji Üreten bir Blok.
lenum.factory = Fabrika Bloğu,
lenum.repair = Tamir Bloğu.
lenum.rally = Komut Bloğu.
lenum.battery = Pil.
lenum.resupply = Mermi Aktarım Bloğu.
lenum.reactor = Patlama/Thorium Reaktör.
lenum.turret = Herhangi bir taret.
sensor.in = Algılanan Blok/Birim.
radar.from = Algı Oluşturulan Blok.
radar.target = Algılanan Birimler için Filtre.
radar.and = Extra Filtre.
radar.order = Sıralama Filtresi.
radar.sort = Sıralama Sırası.
radar.output = Dışarı Aktarılan Değişken.
unitradar.target = Algılanan Birim için Filtre.
unitradar.and = Extra Filtre.
unitradar.order = Sıralama Filtresi.
unitradar.sort = Sıralama Sırası.
unitradar.output = Dışarı Aktarılan Değişken.
control.of = Kontrol Edilen.
control.unit = Ateş ediceğimiz Obje.
control.shoot = Ateş edilsin mi?
unitlocate.enemy = Düşman mı?
unitlocate.found = Obje bulundu mu?
unitlocate.building = Bulunan binanın Türü.
unitlocate.outx = X kordinatı.
unitlocate.outy = Y kordinatı.
unitlocate.group = Aranan binanın türü.
lenum.idle = Hareket etmez ancak kazmaya ve inşa etmeye devam eder.
lenum.stop = Dur!
lenum.move = Tam konuma git.
lenum.approach = Bir Konuma yaklaş.
lenum.pathfind = Düşman Doğuş noktasına git.
lenum.target = Bir alana ateş et,
lenum.targetp = Bir cisme ateş et.
lenum.itemdrop = Bir itemi bırak.
lenum.itemtake = Bir binadan item al.
lenum.paydrop = Kargoyu bırak.
lenum.paytake = Kargo al.
lenum.flag = Numara ile işaretle,
lenum.mine = Kaz.
lenum.build = Bina inşa et.
lenum.getblock = Bir bloğun verilerini al.
lenum.within = Bir birim menzil alanında mı?
lenum.boost = Boostlamaya başla/dur

View File

@@ -29,6 +29,7 @@ BeefEX
Lorex Lorex
老滑稽 老滑稽
Spico The Spirit Guy Spico The Spirit Guy
RTOmega
TunacanGamer TunacanGamer
kemalinanc13 kemalinanc13
Zachary Zachary

View File

@@ -378,3 +378,4 @@
63355=silicon-arc-smelter|block-silicon-arc-smelter-ui 63355=silicon-arc-smelter|block-silicon-arc-smelter-ui
63354=payload-launch-pad|block-payload-launch-pad-ui 63354=payload-launch-pad|block-payload-launch-pad-ui
63353=silicon-arc-furnace|block-silicon-arc-furnace-ui 63353=silicon-arc-furnace|block-silicon-arc-furnace-ui
63352=metal-floor-4|block-metal-floor-4-ui

View File

@@ -27,8 +27,6 @@ public class BlockIndexer{
private static final Rect rect = new Rect(); private static final Rect rect = new Rect();
private static boolean returnBool = false; private static boolean returnBool = false;
private final IntSet intSet = new IntSet();
private int quadWidth, quadHeight; private int quadWidth, quadHeight;
/** Stores all ore quadrants on the map. Maps ID to qX to qY to a list of tiles with that ore. */ /** Stores all ore quadrants on the map. Maps ID to qX to qY to a list of tiles with that ore. */
@@ -41,9 +39,9 @@ public class BlockIndexer{
private Seq<Team> activeTeams = new Seq<>(Team.class); private Seq<Team> activeTeams = new Seq<>(Team.class);
/** Maps teams to a map of flagged tiles by flag. */ /** Maps teams to a map of flagged tiles by flag. */
private TileArray[][] flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; private TileArray[][] flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
/** Counts whether a certain floor is present in the world upon load. */
private boolean[] blocksPresent;
/** Empty set used for returning. */
private TileArray emptySet = new TileArray();
/** Array used for returning and reusing. */ /** Array used for returning and reusing. */
private Seq<Tile> returnArray = new Seq<>(); private Seq<Tile> returnArray = new Seq<>();
/** Array used for returning and reusing. */ /** Array used for returning and reusing. */
@@ -74,6 +72,7 @@ public class BlockIndexer{
ores = new IntSeq[content.items().size][][]; ores = new IntSeq[content.items().size][][];
quadWidth = Mathf.ceil(world.width() / (float)quadrantSize); quadWidth = Mathf.ceil(world.width() / (float)quadrantSize);
quadHeight = Mathf.ceil(world.height() / (float)quadrantSize); quadHeight = Mathf.ceil(world.height() / (float)quadrantSize);
blocksPresent = new boolean[content.blocks().size];
for(Tile tile : world.tiles){ for(Tile tile : world.tiles){
process(tile); process(tile);
@@ -153,6 +152,12 @@ public class BlockIndexer{
seq.removeValue(pos); seq.removeValue(pos);
} }
} }
}
/** @return whether a certain block is anywhere on this map. */
public boolean isBlockPresent(Block block){
return blocksPresent != null && blocksPresent[block.id];
} }
private TileArray[] getFlagged(Team team){ private TileArray[] getFlagged(Team team){
@@ -383,6 +388,13 @@ public class BlockIndexer{
} }
data.buildings.insert(tile.build); data.buildings.insert(tile.build);
} }
if(!tile.block().isStatic()){
blocksPresent[tile.floorID()] = true;
blocksPresent[tile.overlayID()] = true;
}
//bounds checks only needed in very specific scenarios
if(tile.blockID() < blocksPresent.length) blocksPresent[tile.blockID()] = true;
} }
public static class TileArray implements Iterable<Tile>{ public static class TileArray implements Iterable<Tile>{

View File

@@ -156,7 +156,7 @@ public class WaveSpawner{
} }
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){
for(Building core : state.teams.get(state.rules.waveTeam).cores){ for(Building core : state.rules.waveTeam.data().cores){
cons.get(core.x, core.y); cons.get(core.x, core.y);
} }
} }

View File

@@ -75,8 +75,4 @@ public class MinerAI extends AIController{
circle(core, unit.type.range / 1.8f); circle(core, unit.type.range / 1.8f);
} }
} }
@Override
protected void updateTargeting(){
}
} }

View File

@@ -209,7 +209,7 @@ public class SoundControl{
/** Whether to play dark music.*/ /** Whether to play dark music.*/
protected boolean isDark(){ protected boolean isDark(){
if(state.teams.get(player.team()).hasCore() && state.teams.get(player.team()).core().healthf() < 0.85f){ if(player.team().data().hasCore() && player.team().data().core().healthf() < 0.85f){
//core damaged -> dark //core damaged -> dark
return true; return true;
} }

View File

@@ -43,7 +43,7 @@ public class Blocks implements ContentList{
regolithWall, yellowStoneWall, rhyoliteWall, carbonWall, regolithWall, yellowStoneWall, rhyoliteWall, carbonWall,
graphiticStone, graphiticStone,
iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt, iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt,
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall, metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall,
darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal,
pebbles, tendrils, pebbles, tendrils,
@@ -493,32 +493,24 @@ public class Blocks implements ContentList{
wall = sporeWall; wall = sporeWall;
}}; }};
metalFloor = new Floor("metal-floor"){{ metalFloor = new MetalFloor("metal-floor"){{
variants = 0; variants = 0;
attributes.set(Attribute.water, -1f);
}}; }};
metalFloorDamaged = new Floor("metal-floor-damaged"){{ metalFloorDamaged = new MetalFloor("metal-floor-damaged", 3);
variants = 3;
}};
metalFloor2 = new Floor("metal-floor-2"){{ metalFloor2 = new MetalFloor("metal-floor-2");
variants = 0; metalFloor3 = new MetalFloor("metal-floor-3");
}}; metalFloor4 = new MetalFloor("metal-floor-4");
metalFloor5 = new MetalFloor("metal-floor-5");
metalFloor3 = new Floor("metal-floor-3"){{ darkPanel1 = new MetalFloor("dark-panel-1");
variants = 0; darkPanel2 = new MetalFloor("dark-panel-2");
}}; darkPanel3 = new MetalFloor("dark-panel-3");
darkPanel4 = new MetalFloor("dark-panel-4");
metalFloor5 = new Floor("metal-floor-5"){{ darkPanel5 = new MetalFloor("dark-panel-5");
variants = 0; darkPanel6 = new MetalFloor("dark-panel-6");
}};
darkPanel1 = new Floor("dark-panel-1"){{ variants = 0; }};
darkPanel2 = new Floor("dark-panel-2"){{ variants = 0; }};
darkPanel3 = new Floor("dark-panel-3"){{ variants = 0; }};
darkPanel4 = new Floor("dark-panel-4"){{ variants = 0; }};
darkPanel5 = new Floor("dark-panel-5"){{ variants = 0; }};
darkPanel6 = new Floor("dark-panel-6"){{ variants = 0; }};
darkMetal = new StaticWall("dark-metal"); darkMetal = new StaticWall("dark-metal");
@@ -1773,8 +1765,8 @@ public class Blocks implements ContentList{
); );
size = 2; size = 2;
range = 180f; range = 190f;
reloadTime = 38f; reloadTime = 34f;
restitution = 0.03f; restitution = 0.03f;
ammoEjectBack = 3f; ammoEjectBack = 3f;
cooldown = 0.03f; cooldown = 0.03f;
@@ -2013,7 +2005,7 @@ public class Blocks implements ContentList{
}}; }};
health = 200 * size * size; health = 200 * size * size;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.5f)).update(false); consumes.add(new ConsumeCoolant(0.5f)).update(false);
}}; }};
//endregion //endregion
@@ -2191,10 +2183,11 @@ public class Blocks implements ContentList{
payloadPropulsionTower = new PayloadMassDriver("payload-propulsion-tower"){{ payloadPropulsionTower = new PayloadMassDriver("payload-propulsion-tower"){{
requirements(Category.units, with(Items.thorium, 300, Items.silicon, 200, Items.plastanium, 200, Items.phaseFabric, 50)); requirements(Category.units, with(Items.thorium, 300, Items.silicon, 200, Items.plastanium, 200, Items.phaseFabric, 50));
size = 5; size = 5;
reloadTime = 150f; reloadTime = 140f;
chargeTime = 100f; chargeTime = 100f;
range = 300f; range = 500f;
consumes.power(10f); maxPayloadSize = 3.5f;
consumes.power(6f);
}}; }};
//endregion //endregion

View File

@@ -1231,10 +1231,10 @@ public class Fx{
}); });
}), }),
shootLiquid = new Effect(40f, 80f, e -> { shootLiquid = new Effect(15f, 80f, e -> {
color(e.color, Color.white, e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f)); color(e.color);
randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> { randLenVectors(e.id, 2, e.finpow() * 15f, e.rotation, 11f, (x, y) -> {
Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f); Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f);
}); });
}), }),

View File

@@ -709,7 +709,7 @@ public class TechTree implements ContentList{
/** Item requirements for this content. */ /** Item requirements for this content. */
public ItemStack[] requirements; public ItemStack[] requirements;
/** Requirements that have been fulfilled. Always the same length as the requirement array. */ /** Requirements that have been fulfilled. Always the same length as the requirement array. */
public final ItemStack[] finishedRequirements; public ItemStack[] finishedRequirements;
/** Extra objectives needed to research this. */ /** Extra objectives needed to research this. */
public Seq<Objective> objectives = new Seq<>(); public Seq<Objective> objectives = new Seq<>();
/** Nodes that depend on this node. */ /** Nodes that depend on this node. */
@@ -720,14 +720,8 @@ public class TechTree implements ContentList{
this.parent = parent; this.parent = parent;
this.content = content; this.content = content;
this.requirements = requirements;
this.depth = parent == null ? 0 : parent.depth + 1; this.depth = parent == null ? 0 : parent.depth + 1;
this.finishedRequirements = new ItemStack[requirements.length]; setupRequirements(requirements);
//load up the requirements that have been finished if settings are available
for(int i = 0; i < requirements.length; i++){
finishedRequirements[i] = new ItemStack(requirements[i].item, Core.settings == null ? 0 : Core.settings.getInt("req-" + content.name + "-" + requirements[i].item.name));
}
var used = new ObjectSet<Content>(); var used = new ObjectSet<Content>();
@@ -742,6 +736,16 @@ public class TechTree implements ContentList{
all.add(this); all.add(this);
} }
public void setupRequirements(ItemStack[] requirements){
this.requirements = requirements;
this.finishedRequirements = new ItemStack[requirements.length];
//load up the requirements that have been finished if settings are available
for(int i = 0; i < requirements.length; i++){
finishedRequirements[i] = new ItemStack(requirements[i].item, Core.settings == null ? 0 : Core.settings.getInt("req-" + content.name + "-" + requirements[i].item.name));
}
}
/** Resets finished requirements and saves. */ /** Resets finished requirements and saves. */
public void reset(){ public void reset(){
for(ItemStack stack : finishedRequirements){ for(ItemStack stack : finishedRequirements){

View File

@@ -611,7 +611,7 @@ public class UnitTypes implements ContentList{
bullet = new LiquidBulletType(Liquids.slag){{ bullet = new LiquidBulletType(Liquids.slag){{
damage = 11; damage = 11;
speed = 2.3f; speed = 2.4f;
drag = 0.01f; drag = 0.01f;
shootEffect = Fx.shootSmall; shootEffect = Fx.shootSmall;
lifetime = 56f; lifetime = 56f;

View File

@@ -117,5 +117,4 @@ public class Weathers implements ContentList{
baseSpeed = 0.03f; baseSpeed = 0.03f;
}}; }};
} }
} }

View File

@@ -247,12 +247,12 @@ public class Control implements ApplicationListener, Loadable{
saves.load(); saves.load();
} }
/** Automatically unlocks things with no requirements. */ /** Automatically unlocks things with no requirements and no locked parents. */
void checkAutoUnlocks(){ void checkAutoUnlocks(){
if(net.client()) return; if(net.client()) return;
for(TechNode node : TechTree.all){ for(TechNode node : TechTree.all){
if(!node.content.unlocked() && node.requirements.length == 0 && !node.objectives.contains(o -> !o.complete())){ if(!node.content.unlocked() && (node.parent == null || node.parent.content.unlocked()) && node.requirements.length == 0 && !node.objectives.contains(o -> !o.complete())){
node.content.unlock(); node.content.unlock();
} }
} }

View File

@@ -43,7 +43,7 @@ public class Logic implements ApplicationListener{
Events.on(BlockBuildEndEvent.class, event -> { Events.on(BlockBuildEndEvent.class, event -> {
if(!event.breaking){ if(!event.breaking){
TeamData data = state.teams.get(event.team); TeamData data = event.team.data();
Iterator<BlockPlan> it = data.blocks.iterator(); Iterator<BlockPlan> it = data.blocks.iterator();
while(it.hasNext()){ while(it.hasNext()){
BlockPlan b = it.next(); BlockPlan b = it.next();

View File

@@ -21,7 +21,6 @@ import mindustry.gen.*;
import mindustry.net.Administration.*; import mindustry.net.Administration.*;
import mindustry.net.*; import mindustry.net.*;
import mindustry.net.Packets.*; import mindustry.net.Packets.*;
import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.modules.*; import mindustry.world.modules.*;
@@ -160,6 +159,18 @@ public class NetClient implements ApplicationListener{
clientPacketReliable(type, contents); clientPacketReliable(type, contents);
} }
@Remote(variants = Variant.both, unreliable = true)
public static void effect(Effect effect, float x, float y, float rotation, Color color){
if(effect == null) return;
effect.at(x, y, rotation, color);
}
@Remote(variants = Variant.both)
public static void effectReliable(Effect effect, float x, float y, float rotation, Color color){
effect(effect, x, y, rotation, color);
}
//called on all clients //called on all clients
@Remote(targets = Loc.server, variants = Variant.both) @Remote(targets = Loc.server, variants = Variant.both)
public static void sendMessage(String message, String sender, Player playersender){ public static void sendMessage(String message, String sender, Player playersender){
@@ -314,78 +325,6 @@ public class NetClient implements ApplicationListener{
ui.loadfrag.hide(); ui.loadfrag.hide();
} }
@Remote(variants = Variant.both, unreliable = true)
public static void setHudText(String message){
if(message == null) return;
ui.hudfrag.setHudText(message);
}
@Remote(variants = Variant.both)
public static void hideHudText(){
ui.hudfrag.toggleHudText(false);
}
/** TCP version */
@Remote(variants = Variant.both)
public static void setHudTextReliable(String message){
setHudText(message);
}
@Remote(variants = Variant.both)
public static void announce(String message){
if(message == null) return;
ui.announce(message);
}
@Remote(variants = Variant.both)
public static void infoMessage(String message){
if(message == null) return;
ui.showText("", message);
}
@Remote(variants = Variant.both)
public static void infoPopup(String message, float duration, int align, int top, int left, int bottom, int right){
if(message == null) return;
ui.showInfoPopup(message, duration, align, top, left, bottom, right);
}
@Remote(variants = Variant.both)
public static void label(String message, float duration, float worldx, float worldy){
if(message == null) return;
ui.showLabel(message, duration, worldx, worldy);
}
@Remote(variants = Variant.both, unreliable = true)
public static void effect(Effect effect, float x, float y, float rotation, Color color){
if(effect == null) return;
effect.at(x, y, rotation, color);
}
@Remote(variants = Variant.both)
public static void effectReliable(Effect effect, float x, float y, float rotation, Color color){
effect(effect, x, y, rotation, color);
}
@Remote(variants = Variant.both)
public static void infoToast(String message, float duration){
if(message == null) return;
ui.showInfoToast(message, duration);
}
@Remote(variants = Variant.both)
public static void warningToast(int unicode, String text){
if(text == null || Fonts.icon.getData().getGlyph((char)unicode) == null) return;
ui.hudfrag.showToast(Fonts.getGlyph(Fonts.icon, (char)unicode), text);
}
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void setRules(Rules rules){ public static void setRules(Rules rules){
state.rules = rules; state.rules = rules;
@@ -518,7 +457,7 @@ public class NetClient implements ApplicationListener{
int teams = input.readUnsignedByte(); int teams = input.readUnsignedByte();
for(int i = 0; i < teams; i++){ for(int i = 0; i < teams; i++){
int team = input.readUnsignedByte(); int team = input.readUnsignedByte();
TeamData data = state.teams.get(Team.all[team]); TeamData data = Team.all[team].data();
if(data.cores.any()){ if(data.cores.any()){
data.cores.first().items.read(dataReads); data.cores.first().items.read(dataReads);
}else{ }else{

View File

@@ -335,7 +335,7 @@ public class NetServer implements ApplicationListener{
votes += d; votes += d;
voted.addAll(player.uuid(), admins.getInfo(player.uuid()).lastIP); voted.addAll(player.uuid(), admins.getInfo(player.uuid()).lastIP);
Call.sendMessage(Strings.format("[lightgray]@[lightgray] has voted on kicking[orange] @[].[accent] (@/@)\n[lightgray]Type[orange] /vote <y/n>[] to agree.", Call.sendMessage(Strings.format("[lightgray]@[lightgray] has voted on kicking[orange] @[lightgray].[accent] (@/@)\n[lightgray]Type[orange] /vote <y/n>[] to agree.",
player.name, target.name, votes, votesRequired())); player.name, target.name, votes, votesRequired()));
checkPass(); checkPass();

View File

@@ -7,6 +7,7 @@ import arc.math.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.serialization.*; import arc.util.serialization.*;
import mindustry.*;
import mindustry.mod.*; import mindustry.mod.*;
import mindustry.net.*; import mindustry.net.*;
import mindustry.net.Net.*; import mindustry.net.Net.*;
@@ -20,9 +21,29 @@ import static mindustry.Vars.*;
public interface Platform{ public interface Platform{
/** Dynamically creates a class loader for a jar file. */ /** Dynamically creates a class loader for a jar file. This loader must be child-first. */
default ClassLoader loadJar(Fi jar, ClassLoader parent) throws Exception{ default ClassLoader loadJar(Fi jar, ClassLoader parent) throws Exception{
return new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, parent); return new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, parent){
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
//check for loaded state
Class<?> loadedClass = findLoadedClass(name);
if(loadedClass == null){
try{
//try to load own class first
loadedClass = findClass(name);
}catch(ClassNotFoundException e){
//use parent if not found
loadedClass = super.loadClass(name, resolve);
}
}
if(resolve){
resolveClass(loadedClass);
}
return loadedClass;
}
};
} }
/** Steam: Update lobby visibility.*/ /** Steam: Update lobby visibility.*/
@@ -64,6 +85,9 @@ public interface Platform{
protected Context makeContext(){ protected Context makeContext(){
Context ctx = super.makeContext(); Context ctx = super.makeContext();
ctx.setClassShutter(Scripts::allowClass); ctx.setClassShutter(Scripts::allowClass);
if(Vars.mods != null){
ctx.setApplicationClassLoader(Vars.mods.mainLoader());
}
return ctx; return ctx;
} }
}); });

View File

@@ -201,6 +201,7 @@ public class Renderer implements ApplicationListener{
Draw.proj(camera); Draw.proj(camera);
blocks.checkChanges();
blocks.floor.checkChanges(); blocks.floor.checkChanges();
blocks.processBlocks(); blocks.processBlocks();

View File

@@ -539,6 +539,38 @@ public class UI implements ApplicationListener, Loadable{
dialog.show(); dialog.show();
} }
/** Shows a menu that fires a callback when an option is selected. If nothing is selected, -1 is returned. */
public void showMenu(String title, String message, String[][] options, Intc callback){
new Dialog(title){{
cont.row();
cont.image().width(400f).pad(2).colspan(2).height(4f).color(Pal.accent);
cont.row();
cont.add(message).width(400f).wrap().get().setAlignment(Align.center);
cont.row();
int option = 0;
for(var optionsRow : options){
Table buttonRow = buttons.row().table().get().row();
int fullWidth = 400 - (optionsRow.length - 1) * 8; // adjust to count padding as well
int width = fullWidth / optionsRow.length;
int lastWidth = fullWidth - width * (optionsRow.length - 1); // take the rest of space for uneven table
for(int i = 0; i < optionsRow.length; i++){
if(optionsRow[i] == null) continue;
String optionName = optionsRow[i];
int finalOption = option;
buttonRow.button(optionName, () -> {
callback.get(finalOption);
hide();
}).size(i == optionsRow.length - 1 ? lastWidth : width, 50).pad(4);
option++;
}
}
closeOnBack(() -> callback.get(-1));
}}.show();
}
public static String formatTime(float ticks){ public static String formatTime(float ticks){
int time = (int)(ticks / 60); int time = (int)(ticks / 60);
if(time < 60) return "0:" + (time < 10 ? "0" : "") + time; if(time < 60) return "0:" + (time < 10 ? "0" : "") + time;

View File

@@ -6,7 +6,6 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.math.geom.Geometry.*; import arc.math.geom.Geometry.*;
import arc.struct.*; import arc.struct.*;
import arc.struct.ObjectIntMap.*;
import arc.util.*; import arc.util.*;
import arc.util.noise.*; import arc.util.noise.*;
import mindustry.content.*; import mindustry.content.*;
@@ -21,7 +20,6 @@ import mindustry.maps.*;
import mindustry.maps.filters.*; import mindustry.maps.filters.*;
import mindustry.maps.filters.GenerateFilter.*; import mindustry.maps.filters.GenerateFilter.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.Weather.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.legacy.*;
@@ -336,7 +334,7 @@ public class World{
ui.showErrorMessage("@map.nospawn.pvp"); ui.showErrorMessage("@map.nospawn.pvp");
} }
}else if(checkRules.attackMode){ //attack maps need two cores to be valid }else if(checkRules.attackMode){ //attack maps need two cores to be valid
invalidMap = state.teams.get(state.rules.waveTeam).noCores(); invalidMap = state.rules.waveTeam.data().noCores();
if(invalidMap){ if(invalidMap){
ui.showErrorMessage("@map.nospawn.attack"); ui.showErrorMessage("@map.nospawn.attack");
} }

View File

@@ -241,14 +241,14 @@ public class MapView extends Element implements GestureListener{
image.setImageSize(editor.width(), editor.height()); image.setImageSize(editor.width(), editor.height());
if(!ScissorStack.push(rect.set(x, y + Core.scene.marginBottom, width, height))){ if(!ScissorStack.push(rect.set(x + Core.scene.marginLeft, y + Core.scene.marginBottom, width, height))){
return; return;
} }
Draw.color(Pal.remove); Draw.color(Pal.remove);
Lines.stroke(2f); Lines.stroke(2f);
Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2);
editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2 + Core.scene.marginBottom, sclwidth, sclheight); editor.renderer.draw(centerx - sclwidth / 2 + Core.scene.marginLeft, centery - sclheight / 2 + Core.scene.marginBottom, sclwidth, sclheight);
Draw.reset(); Draw.reset();
if(grid){ if(grid){

View File

@@ -31,11 +31,16 @@ public class Damage{
/** Creates a dynamic explosion based on specified parameters. */ /** Creates a dynamic explosion based on specified parameters. */
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){
dynamicExplosion(x, y, flammability, explosiveness, power, radius, damage, true, null); dynamicExplosion(x, y, flammability, explosiveness, power, radius, damage, true, null, Fx.dynamicExplosion);
} }
/** Creates a dynamic explosion based on specified parameters. */ /** Creates a dynamic explosion based on specified parameters. */
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam){ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam){
dynamicExplosion(x, y, flammability, explosiveness, power, radius, damage, fire, ignoreTeam, Fx.dynamicExplosion);
}
/** Creates a dynamic explosion based on specified parameters. */
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam, Effect explosion){
if(damage){ if(damage){
for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){ for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){
int length = 5 + Mathf.clamp((int)(power / 500), 1, 20); int length = 5 + Mathf.clamp((int)(power / 500), 1, 20);
@@ -69,7 +74,7 @@ public class Damage{
float shake = Math.min(explosiveness / 4f + 3f, 9f); float shake = Math.min(explosiveness / 4f + 3f, 9f);
Effect.shake(shake, shake, x, y); Effect.shake(shake, shake, x, y);
Fx.dynamicExplosion.at(x, y, radius / 8f); explosion.at(x, y, radius / 8f);
} }
public static void createIncend(float x, float y, float range, int amount){ public static void createIncend(float x, float y, float range, int amount){

View File

@@ -163,6 +163,8 @@ public class BulletType extends Content implements Cloneable{
public float puddleAmount = 5f; public float puddleAmount = 5f;
public Liquid puddleLiquid = Liquids.water; public Liquid puddleLiquid = Liquids.water;
public boolean displayAmmoMultiplier = true;
public float lightRadius = -1f; public float lightRadius = -1f;
public float lightOpacity = 0.3f; public float lightOpacity = 0.3f;
public Color lightColor = Pal.powerLight; public Color lightColor = Pal.powerLight;
@@ -405,10 +407,10 @@ public class BulletType extends Content implements Cloneable{
if(status == StatusEffects.none){ if(status == StatusEffects.none){
status = StatusEffects.shocked; status = StatusEffects.shocked;
} }
}
if(lightningType == null){ if(lightningType == null){
lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning;
}
} }
} }

View File

@@ -36,6 +36,7 @@ public class LiquidBulletType extends BulletType{
shootEffect = Fx.none; shootEffect = Fx.none;
drag = 0.001f; drag = 0.001f;
knockback = 0.55f; knockback = 0.55f;
displayAmmoMultiplier = false;
} }
public LiquidBulletType(){ public LiquidBulletType(){

View File

@@ -1,7 +1,6 @@
package mindustry.entities.comp; package mindustry.entities.comp;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -12,7 +11,6 @@ abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
static final float warpDst = 40f; static final float warpDst = 40f;
@Import float x, y; @Import float x, y;
@Import Vec2 vel;
@Override @Override
public void update(){ public void update(){

View File

@@ -222,7 +222,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
} }
TeamData data = state.teams.get(team); TeamData data = team.data();
if(checkPrevious){ if(checkPrevious){
//remove existing blocks that have been placed here. //remove existing blocks that have been placed here.
@@ -1399,7 +1399,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return switch(sensor){ return switch(sensor){
case type -> block; case type -> block;
case firstItem -> items == null ? null : items.first(); case firstItem -> items == null ? null : items.first();
case config -> block.configurations.containsKey(Item.class) || block.configurations.containsKey(Liquid.class) ? config() : null; case config -> block.configSenseable() ? config() : null;
case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null; case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null;
default -> noSensed; default -> noSensed;
}; };

View File

@@ -56,7 +56,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
return; return;
} }
if(time >= lifetime || tile == null){ if(time >= lifetime || tile == null || Float.isNaN(lifetime)){
remove(); remove();
return; return;
} }

View File

@@ -49,7 +49,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
transient float healTime; transient float healTime;
private transient float resupplyTime = Mathf.random(10f); private transient float resupplyTime = Mathf.random(10f);
private transient boolean wasPlayer; private transient boolean wasPlayer;
private transient float lastHealth; private transient boolean wasHealed;
public void moveAt(Vec2 vector){ public void moveAt(Vec2 vector){
moveAt(vector, type.accel); moveAt(vector, type.accel);
@@ -320,16 +320,23 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
type.landed(self()); type.landed(self());
} }
@Override
public void heal(float amount){
if(health < maxHealth && amount > 0){
wasHealed = true;
}
}
@Override @Override
public void update(){ public void update(){
type.update(self()); type.update(self());
if(health > lastHealth && lastHealth > 0 && healTime <= -1f){ if(wasHealed && healTime <= -1f){
healTime = 1f; healTime = 1f;
} }
healTime -= Time.delta / 20f; healTime -= Time.delta / 20f;
lastHealth = health; wasHealed = false;
//check if environment is unsupported //check if environment is unsupported
if(!type.supportsEnv(state.rules.environment) && !dead){ if(!type.supportsEnv(state.rules.environment) && !dead){
@@ -450,7 +457,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
float power = item().charge * stack().amount * 150f; float power = item().charge * stack().amount * 150f;
if(!spawnedByCore){ if(!spawnedByCore){
Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team); Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team, type.deathExplosionEffect);
} }
float shake = hitSize / 3f; float shake = hitSize / 3f;

View File

@@ -134,6 +134,18 @@ public class EventType{
} }
} }
/** Consider using Menus.registerMenu instead. */
public static class MenuOptionChooseEvent{
public final Player player;
public final int menuId, option;
public MenuOptionChooseEvent(Player player, int menuId, int option){
this.player = player;
this.option = option;
this.menuId = menuId;
}
}
public static class PlayerChatEvent{ public static class PlayerChatEvent{
public final Player player; public final Player player;
public final String message; public final String message;

View File

@@ -13,7 +13,6 @@ import mindustry.content.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.power.*; import mindustry.world.blocks.power.*;
@@ -142,11 +141,21 @@ public class BlockRenderer{
Tile other = world.tile(cx, cy); Tile other = world.tile(cx, cy);
if(other != null){ if(other != null){
darkEvents.add(other.pos()); darkEvents.add(other.pos());
floor.recacheTile(other);
} }
} }
} }
} }
public void checkChanges(){
darkEvents.each(pos -> {
var tile = world.tile(pos);
if(tile != null){
tile.data = world.getWallDarkness(tile);
}
});
}
public void drawDarkness(){ public void drawDarkness(){
if(!darkEvents.isEmpty()){ if(!darkEvents.isEmpty()){
Draw.flush(); Draw.flush();
@@ -156,10 +165,9 @@ public class BlockRenderer{
darkEvents.each(pos -> { darkEvents.each(pos -> {
var tile = world.tile(pos); var tile = world.tile(pos);
tile.data = world.getWallDarkness(tile);
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(!tile.isDarkened() || darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f)); Draw.colorl(darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f));
Fill.rect(tile.x + 0.5f, tile.y + 0.5f, 1, 1); Fill.rect(tile.x + 0.5f, tile.y + 0.5f, 1, 1);
}); });
@@ -186,7 +194,7 @@ public class BlockRenderer{
} }
if(brokenFade > 0.001f){ if(brokenFade > 0.001f){
for(BlockPlan block : state.teams.get(player.team()).blocks){ for(BlockPlan block : player.team().data().blocks){
Block b = content.block(block.block); Block b = content.block(block.block);
if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset, block.y * tilesize + b.offset))) continue; if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset, block.y * tilesize + b.offset))) continue;

View File

@@ -97,7 +97,6 @@ public class FloorRenderer{
/** Queues up a cache change for a tile. Only runs in render loop. */ /** Queues up a cache change for a tile. Only runs in render loop. */
public void recacheTile(Tile tile){ public void recacheTile(Tile tile){
//TODO will be faster it the position also specified the layer to be recached
//recaching all layers may not be necessary //recaching all layers may not be necessary
recacheSet.add(Point2.pack(tile.x / chunksize, tile.y / chunksize)); recacheSet.add(Point2.pack(tile.x / chunksize, tile.y / chunksize));
} }
@@ -168,7 +167,6 @@ public class FloorRenderer{
shader.setUniformi("u_texture", 0); shader.setUniformi("u_texture", 0);
//only ever use the base environment texture //only ever use the base environment texture
//TODO show error texture for anything else
texture.bind(0); texture.bind(0);
//enable all mesh attributes //enable all mesh attributes

View File

@@ -47,7 +47,6 @@ public class MenuRenderer implements Disposable{
Simplex s1 = new Simplex(offset); Simplex s1 = new Simplex(offset);
Simplex s2 = new Simplex(offset + 1); Simplex s2 = new Simplex(offset + 1);
Simplex s3 = new Simplex(offset + 2); Simplex s3 = new Simplex(offset + 2);
RidgedPerlin rid = new RidgedPerlin(1 + offset, 1);
Block[] selected = Structs.select( Block[] selected = Structs.select(
new Block[]{Blocks.sand, Blocks.sandWall}, new Block[]{Blocks.sand, Blocks.sandWall},
new Block[]{Blocks.shale, Blocks.shaleWall}, new Block[]{Blocks.shale, Blocks.shaleWall},
@@ -141,7 +140,7 @@ public class MenuRenderer implements Disposable{
} }
if(tendrils){ if(tendrils){
if(rid.getValue(x, y, 1f / 17f) > 0f){ if(RidgedPerlin.noise2d(1 + offset, x, y, 1f / 17f) > 0f){
floor = Mathf.chance(0.2) ? Blocks.sporeMoss : Blocks.moss; floor = Mathf.chance(0.2) ? Blocks.sporeMoss : Blocks.moss;
if(wall != Blocks.air){ if(wall != Blocks.air){

View File

@@ -131,22 +131,24 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
@Remote(called = Loc.both, targets = Loc.both, forward = true, unreliable = true) @Remote(called = Loc.both, targets = Loc.both, forward = true, unreliable = true)
public static void deletePlans(Player player, int[] positions){ public static void deletePlans(Player player, int[] positions){
if(netServer.admins.allowAction(player, ActionType.removePlanned, a -> a.plans = positions)){ if(net.server() && !netServer.admins.allowAction(player, ActionType.removePlanned, a -> a.plans = positions)){
throw new ValidateException(player, "Player cannot remove plans.");
}
var it = state.teams.get(player.team()).blocks.iterator(); if(player == null) return;
//O(n^2) search here; no way around it
outer:
while(it.hasNext()){
BlockPlan req = it.next();
for(int pos : positions){ var it = player.team().data().blocks.iterator();
if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){ //O(n^2) search here; no way around it
it.remove(); outer:
continue outer; while(it.hasNext()){
} BlockPlan req = it.next();
for(int pos : positions){
if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){
it.remove();
continue outer;
} }
} }
} }
} }
@@ -885,7 +887,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
removed.clear(); removed.clear();
//remove blocks to rebuild //remove blocks to rebuild
Iterator<BlockPlan> broken = state.teams.get(player.team()).blocks.iterator(); Iterator<BlockPlan> broken = player.team().data().blocks.iterator();
while(broken.hasNext()){ while(broken.hasNext()){
BlockPlan req = broken.next(); BlockPlan req = broken.next();
Block block = content.block(req.block); Block block = content.block(req.block);
@@ -938,9 +940,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
//check if tapped block is configurable //check if tapped block is configurable
if(build.block.configurable && build.interactable(player.team())){ if(build.block.configurable && build.interactable(player.team())){
consumed = true; consumed = true;
if(((!frag.config.isShown() && build.shouldShowConfigure(player)) //if the config fragment is hidden, show if((!frag.config.isShown() && build.shouldShowConfigure(player)) //if the config fragment is hidden, show
//alternatively, the current selected block can 'agree' to switch config tiles //alternatively, the current selected block can 'agree' to switch config tiles
|| (frag.config.isShown() && frag.config.getSelectedTile().onConfigureTileTapped(build)))){ || (frag.config.isShown() && frag.config.getSelectedTile().onConfigureTileTapped(build))){
Sounds.click.at(build); Sounds.click.at(build);
frag.config.showConfig(build); frag.config.showConfig(build);
} }

View File

@@ -588,6 +588,30 @@ public class TypeIO{
return new TraceInfo(readString(read), readString(read), read.b() == 1, read.b() == 1, read.i(), read.i()); return new TraceInfo(readString(read), readString(read), read.b() == 1, read.b() == 1, read.i(), read.i());
} }
public static void writeStrings(Writes write, String[][] strings){
write.b(strings.length);
for(String[] string : strings){
write.b(string.length);
for(String s : string){
writeString(write, s);
}
}
}
public static String[][] readStrings(Reads read){
int rows = read.ub();
String[][] strings = new String[rows][];
for(int i = 0; i < rows; i++){
int columns = read.ub();
strings[i] = new String[columns];
for(int j = 0; j < columns; j++){
strings[i][j] = readString(read);
}
}
return strings;
}
public static void writeStringData(DataOutput buffer, String string) throws IOException{ public static void writeStringData(DataOutput buffer, String string) throws IOException{
if(string != null){ if(string != null){
byte[] bytes = string.getBytes(charset); byte[] bytes = string.getBytes(charset);

View File

@@ -1,8 +1,10 @@
package mindustry.logic; package mindustry.logic;
import arc.struct.*; import arc.struct.*;
import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.units.*;
import mindustry.logic.LExecutor.*; import mindustry.logic.LExecutor.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
@@ -55,6 +57,10 @@ public class GlobalConstants{
for(LAccess sensor : LAccess.all){ for(LAccess sensor : LAccess.all){
put("@" + sensor.name(), sensor); put("@" + sensor.name(), sensor);
} }
for(UnitCommand cmd : UnitCommand.all){
put("@command" + Strings.capitalize(cmd.name()), cmd);
}
} }
/** @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

@@ -922,6 +922,7 @@ public class LExecutor{
v.objval instanceof Content ? "[content]" : v.objval instanceof Content ? "[content]" :
v.objval instanceof Building build ? build.block.name : v.objval instanceof Building build ? build.block.name :
v.objval instanceof Unit unit ? unit.type.name : v.objval instanceof Unit unit ? unit.type.name :
v.objval instanceof Enum<?> e ? e.name() :
"[object]"; "[object]";
exec.textBuffer.append(strValue); exec.textBuffer.append(strValue);

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters; package mindustry.maps.filters;
import arc.math.*;
import arc.util.*; import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -17,7 +16,7 @@ public class BlendFilter extends GenerateFilter{
return Structs.arr( return Structs.arr(
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f), new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new BlockOption("block", () -> block, b -> block = b, anyOptional), new BlockOption("block", () -> block, b -> block = b, anyOptional),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, anyOptional),
new BlockOption("ignore", () -> ignore, b -> ignore = b, floorsOptional) new BlockOption("ignore", () -> ignore, b -> ignore = b, floorsOptional)
); );
} }
@@ -34,7 +33,7 @@ public class BlendFilter extends GenerateFilter{
@Override @Override
public void apply(){ public void apply(){
if(in.floor == block || block == Blocks.air || in.floor == ignore) return; if(in.floor == block || block == Blocks.air || in.floor == ignore || (!floor.isFloor() && (in.block == block || in.block == ignore))) return;
int rad = (int)radius; int rad = (int)radius;
boolean found = false; boolean found = false;
@@ -42,7 +41,7 @@ public class BlendFilter extends GenerateFilter{
outer: outer:
for(int x = -rad; x <= rad; x++){ for(int x = -rad; x <= rad; x++){
for(int y = -rad; y <= rad; y++){ for(int y = -rad; y <= rad; y++){
if(Mathf.within(x, y, rad)) continue; if(x*x + y*y > rad*rad) continue;
Tile tile = in.tile(in.x + x, in.y + y); Tile tile = in.tile(in.x + x, in.y + y);
if(tile.floor() == block || tile.block() == block || tile.overlay() == block){ if(tile.floor() == block || tile.block() == block || tile.overlay() == block){
@@ -53,7 +52,11 @@ public class BlendFilter extends GenerateFilter{
} }
if(found){ if(found){
in.floor = floor; if(!floor.isFloor()){
in.block = floor;
}else{
in.floor = floor;
}
} }
} }
} }

View File

@@ -9,7 +9,6 @@ import arc.scene.ui.layout.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
@@ -105,6 +104,7 @@ public abstract class FilterOption{
if(++i % 10 == 0) dialog.cont.row(); if(++i % 10 == 0) dialog.cont.row();
} }
dialog.closeOnBack();
dialog.show(); dialog.show();
}).pad(4).margin(12f); }).pad(4).margin(12f);

View File

@@ -13,7 +13,7 @@ import mindustry.world.*;
public abstract class GenerateFilter{ public abstract class GenerateFilter{
protected transient float o = (float)(Math.random() * 10000000.0); protected transient float o = (float)(Math.random() * 10000000.0);
protected transient long seed; protected transient int seed;
protected transient GenerateInput in; protected transient GenerateInput in;
public void apply(Tiles tiles, GenerateInput in){ public void apply(Tiles tiles, GenerateInput in){
@@ -75,11 +75,16 @@ public abstract class GenerateFilter{
/** draw any additional guides */ /** draw any additional guides */
public void draw(Image image){} public void draw(Image image){}
/** localized display name */ public String simpleName(){
public String name(){
Class c = getClass(); Class c = getClass();
if(c.isAnonymousClass()) c = c.getSuperclass(); if(c.isAnonymousClass()) c = c.getSuperclass();
return Core.bundle.get("filter." + c.getSimpleName().toLowerCase().replace("filter", ""), c.getSimpleName().replace("Filter", "")); return c.getSimpleName().toLowerCase().replace("filter", "");
}
/** localized display name */
public String name(){
var s = simpleName();
return Core.bundle.get("filter." + s);
} }
public char icon(){ public char icon(){
@@ -112,11 +117,15 @@ public abstract class GenerateFilter{
} }
protected float rnoise(float x, float y, float scl, float mag){ protected float rnoise(float x, float y, float scl, float mag){
return in.pnoise.getValue((int)(x + o), (int)(y + o), 1f / scl) * mag; return RidgedPerlin.noise2d(seed + 1, (int)(x + o), (int)(y + o), 1f / scl) * mag;
}
protected float rnoise(float x, float y, int octaves, float scl, float falloff, float mag){
return RidgedPerlin.noise2d(seed + 1, (int)(x + o), (int)(y + o), octaves, falloff, 1f / scl) * mag;
} }
protected float chance(){ protected float chance(){
return Mathf.randomSeed(Pack.longInt(in.x, in.y + (int)seed)); return Mathf.randomSeed(Pack.longInt(in.x, in.y + seed));
} }
/** an input for generating at a certain coordinate. should only be instantiated once. */ /** an input for generating at a certain coordinate. should only be instantiated once. */
@@ -129,7 +138,6 @@ public abstract class GenerateFilter{
public Block floor, block, overlay; public Block floor, block, overlay;
Simplex noise = new Simplex(); Simplex noise = new Simplex();
RidgedPerlin pnoise = new RidgedPerlin(0, 1);
TileProvider buffer; TileProvider buffer;
public void apply(int x, int y, Block block, Block floor, Block overlay){ public void apply(int x, int y, Block block, Block floor, Block overlay){
@@ -145,7 +153,6 @@ public abstract class GenerateFilter{
this.width = width; this.width = width;
this.height = height; this.height = height;
noise.setSeed(filter.seed); noise.setSeed(filter.seed);
pnoise.setSeed((int)(filter.seed + 1));
} }
Tile tile(float x, float y){ Tile tile(float x, float y){

View File

@@ -10,14 +10,15 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class MedianFilter extends GenerateFilter{ public class MedianFilter extends GenerateFilter{
private static final IntSeq blocks = new IntSeq(), floors = new IntSeq();
float radius = 2; float radius = 2;
float percentile = 0.5f; float percentile = 0.5f;
IntSeq blocks = new IntSeq(), floors = new IntSeq();
@Override @Override
public FilterOption[] options(){ public FilterOption[] options(){
return Structs.arr( return Structs.arr(
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 12f), new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f) new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f)
); );
} }

View File

@@ -8,15 +8,17 @@ import mindustry.world.*;
import static mindustry.maps.filters.FilterOption.*; import static mindustry.maps.filters.FilterOption.*;
public class RiverNoiseFilter extends GenerateFilter{ public class RiverNoiseFilter extends GenerateFilter{
float scl = 40, threshold = 0f, threshold2 = 0.1f; float scl = 40, threshold = 0f, threshold2 = 0.1f, octaves = 1, falloff = 0.5f;
Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandWall; Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandWall;
@Override @Override
public FilterOption[] options(){ public FilterOption[] options(){
return Structs.arr( return Structs.arr(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f), new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, -1f, 0.3f), new SliderOption("threshold", () -> threshold, f -> threshold = f, -1f, 1f),
new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 0.3f), new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("block", () -> block, b -> block = b, wallsOnly), new BlockOption("block", () -> block, b -> block = b, wallsOnly),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly) new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly)
@@ -30,7 +32,7 @@ public class RiverNoiseFilter extends GenerateFilter{
@Override @Override
public void apply(){ public void apply(){
float noise = rnoise(in.x, in.y, scl, 1f); float noise = rnoise(in.x, in.y, (int)octaves, scl, falloff, 1f);
if(noise >= threshold){ if(noise >= threshold){
in.floor = floor; in.floor = floor;

View File

@@ -18,7 +18,6 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class SerpuloPlanetGenerator extends PlanetGenerator{ public class SerpuloPlanetGenerator extends PlanetGenerator{
RidgedPerlin rid = new RidgedPerlin(1, 2);
BaseGenerator basegen = new BaseGenerator(); BaseGenerator basegen = new BaseGenerator();
float scl = 5f; float scl = 5f;
float waterOffset = 0.07f; float waterOffset = 0.07f;
@@ -115,7 +114,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
tile.floor = getBlock(position); tile.floor = getBlock(position);
tile.block = tile.floor.asFloor().wall; tile.block = tile.floor.asFloor().wall;
if(rid.getValue(position.x, position.y, position.z, 22) > 0.31){ if(RidgedPerlin.noise3d(1, position.x, position.y, position.z, 2, 22) > 0.31){
tile.block = Blocks.air; tile.block = Blocks.air;
} }
} }

View File

@@ -121,6 +121,11 @@ public class ContentParser{
return sound; return sound;
}); });
put(Objectives.Objective.class, (type, data) -> { put(Objectives.Objective.class, (type, data) -> {
if(data.isString()){
var cont = locateAny(data.asString());
if(cont == null) throw new IllegalArgumentException("Unknown objective content: " + data.asString());
return new Research((UnlockableContent)cont);
}
var oc = resolve(data.getString("type", ""), SectorComplete.class); var oc = resolve(data.getString("type", ""), SectorComplete.class);
data.remove("type"); data.remove("type");
Objectives.Objective obj = make(oc); Objectives.Objective obj = make(oc);
@@ -228,6 +233,7 @@ public class ContentParser{
case "item" -> block.consumes.item(find(ContentType.item, child.asString())); case "item" -> block.consumes.item(find(ContentType.item, child.asString()));
case "items" -> block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child)); case "items" -> block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child));
case "liquid" -> block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child)); case "liquid" -> block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
case "coolant" -> block.consumes.add((Consume)parser.readValue(ConsumeCoolant.class, child));
case "power" -> { case "power" -> {
if(child.isNumber()){ if(child.isNumber()){
block.consumes.power(child.asFloat()); block.consumes.power(child.asFloat());
@@ -543,6 +549,16 @@ public class ContentParser{
return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name); return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name);
} }
private <T extends MappableContent> T locateAny(String name){
for(ContentType t : ContentType.all){
var out = locate(t, name);
if(out != null){
return (T)out;
}
}
return null;
}
<T> T make(Class<T> type){ <T> T make(Class<T> type){
try{ try{
Constructor<T> cons = type.getDeclaredConstructor(); Constructor<T> cons = type.getDeclaredConstructor();
@@ -679,18 +695,26 @@ public class ContentParser{
lastNode.remove(); lastNode.remove();
} }
TechNode node = new TechNode(null, unlock, customRequirements == null ? unlock.researchRequirements() : customRequirements); TechNode node = new TechNode(null, unlock, customRequirements == null ? ItemStack.empty : customRequirements);
LoadedMod cur = currentMod; LoadedMod cur = currentMod;
postreads.add(() -> { postreads.add(() -> {
currentContent = unlock; currentContent = unlock;
currentMod = cur; currentMod = cur;
//add custom objectives
if(research.has("objectives")){
node.objectives.addAll(parser.readValue(Objective[].class, research.get("objectives")));
}
//remove old node from parent //remove old node from parent
if(node.parent != null){ if(node.parent != null){
node.parent.children.remove(node); node.parent.children.remove(node);
} }
if(customRequirements == null){
node.setupRequirements(unlock.researchRequirements());
}
//find parent node. //find parent node.
TechNode parent = TechTree.all.find(t -> t.content.name.equals(researchName) || t.content.name.equals(currentMod.name + "-" + researchName)); TechNode parent = TechTree.all.find(t -> t.content.name.equals(researchName) || t.content.name.equals(currentMod.name + "-" + researchName));

View File

@@ -11,25 +11,23 @@ public class ModClassLoader extends ClassLoader{
} }
@Override @Override
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{ protected Class<?> findClass(String name) throws ClassNotFoundException{
//always try the superclass first //a child may try to delegate class loading to its parent, which is *this class loader* - do not let that happen
try{ if(inChild) throw new ClassNotFoundException(name);
return super.loadClass(name, resolve);
}catch(ClassNotFoundException error){ ClassNotFoundException last = null;
//a child may try to delegate class loading to its parent, which is *this class loader* - do not let that happen int size = children.size;
if(inChild) throw error; //if it doesn't exist in the main class loader, try all the children
int size = children.size; for(int i = 0; i < size; i++){
//if it doesn't exist in the main class loader, try all the children try{
for(int i = 0; i < size; i++){ inChild = true;
try{ var out = children.get(i).loadClass(name);
inChild = true; inChild = false;
var out = children.get(i).loadClass(name); return out;
inChild = false; }catch(ClassNotFoundException e){
return out; last = e;
}catch(ClassNotFoundException ignored){
}
} }
throw error;
} }
throw (last == null ? new ClassNotFoundException(name) : last);
} }
} }

View File

@@ -60,7 +60,7 @@ public class Scripts implements Disposable{
public String runConsole(String text){ public String runConsole(String text){
try{ try{
Object o = context.evaluateString(scope, text, "console.js", 1, null); Object o = context.evaluateString(scope, text, "console.js", 1);
if(o instanceof NativeJavaObject n) o = n.unwrap(); if(o instanceof NativeJavaObject n) o = n.unwrap();
if(o instanceof Undefined) o = "undefined"; if(o instanceof Undefined) o = "undefined";
return String.valueOf(o); return String.valueOf(o);
@@ -172,11 +172,11 @@ public class Scripts implements Disposable{
try{ try{
if(currentMod != null){ if(currentMod != null){
//inject script info into file //inject script info into file
context.evaluateString(scope, "modName = \"" + currentMod.name + "\"\nscriptName = \"" + file + "\"", "initscript.js", 1, null); context.evaluateString(scope, "modName = \"" + currentMod.name + "\"\nscriptName = \"" + file + "\"", "initscript.js", 1);
} }
context.evaluateString(scope, context.evaluateString(scope,
wrap ? "(function(){'use strict';\n" + script + "\n})();" : script, wrap ? "(function(){'use strict';\n" + script + "\n})();" : script,
file, 0, null); file, 0);
return true; return true;
}catch(Throwable t){ }catch(Throwable t){
if(currentMod != null){ if(currentMod != null){
@@ -224,7 +224,7 @@ public class Scripts implements Disposable{
if(!module.exists() || module.isDirectory()) return null; if(!module.exists() || module.isDirectory()) return null;
return new ModuleSource( return new ModuleSource(
new InputStreamReader(new ByteArrayInputStream((module.readString()).getBytes())), new InputStreamReader(new ByteArrayInputStream((module.readString()).getBytes())),
null, new URI(moduleId), root.file().toURI(), validator); new URI(moduleId), root.file().toURI(), validator);
} }
} }
} }

View File

@@ -188,24 +188,22 @@ public class ArcNetProvider implements NetProvider{
@Override @Override
public void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> invalid){ public void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> invalid){
executor.submit(() -> { try{
try{ DatagramSocket socket = new DatagramSocket();
DatagramSocket socket = new DatagramSocket(); long time = Time.millis();
long time = Time.millis(); socket.send(new DatagramPacket(new byte[]{-2, 1}, 2, InetAddress.getByName(address), port));
socket.send(new DatagramPacket(new byte[]{-2, 1}, 2, InetAddress.getByName(address), port)); socket.setSoTimeout(2000);
socket.setSoTimeout(2000);
DatagramPacket packet = packetSupplier.get(); DatagramPacket packet = packetSupplier.get();
socket.receive(packet); socket.receive(packet);
ByteBuffer buffer = ByteBuffer.wrap(packet.getData()); ByteBuffer buffer = ByteBuffer.wrap(packet.getData());
Host host = NetworkIO.readServerData((int)Time.timeSinceMillis(time), packet.getAddress().getHostAddress(), buffer); Host host = NetworkIO.readServerData((int)Time.timeSinceMillis(time), packet.getAddress().getHostAddress(), buffer);
Core.app.post(() -> valid.get(host)); Core.app.post(() -> valid.get(host));
}catch(Exception e){ }catch(Exception e){
Core.app.post(() -> invalid.get(e)); Core.app.post(() -> invalid.get(e));
} }
});
} }
@Override @Override

View File

@@ -5,6 +5,7 @@ import arc.func.*;
import arc.net.*; import arc.net.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.async.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.net.Packets.*; import mindustry.net.Packets.*;
import mindustry.net.Streamable.*; import mindustry.net.Streamable.*;
@@ -12,6 +13,7 @@ import mindustry.net.Streamable.*;
import java.io.*; import java.io.*;
import java.nio.*; import java.nio.*;
import java.nio.channels.*; import java.nio.channels.*;
import java.util.concurrent.*;
import static arc.util.Log.*; import static arc.util.Log.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -31,6 +33,7 @@ public class Net{
private final ObjectMap<Class<?>, Cons> clientListeners = new ObjectMap<>(); private final ObjectMap<Class<?>, Cons> clientListeners = new ObjectMap<>();
private final ObjectMap<Class<?>, Cons2<NetConnection, Object>> serverListeners = new ObjectMap<>(); private final ObjectMap<Class<?>, Cons2<NetConnection, Object>> serverListeners = new ObjectMap<>();
private final IntMap<StreamBuilder> streams = new IntMap<>(); private final IntMap<StreamBuilder> streams = new IntMap<>();
private final ExecutorService pingExecutor = Threads.executor(Math.max(Runtime.getRuntime().availableProcessors(), 6));
private final NetProvider provider; private final NetProvider provider;
@@ -316,10 +319,17 @@ public class Net{
} }
/** /**
* Pings a host in an new thread. If an error occured, failed() should be called with the exception. * Pings a host in a pooled thread. If an error occurred, failed() should be called with the exception.
*/ */
public void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> failed){ public void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> failed){
provider.pingHost(address, port, valid, failed); pingExecutor.submit(() -> provider.pingHost(address, port, valid, failed));
}
/**
* Pings a host in an new thread. If an error occurred, failed() should be called with the exception.
*/
public void pingHostThread(String address, int port, Cons<Host> valid, Cons<Exception> failed){
Threads.daemon(() -> provider.pingHost(address, port, valid, failed));
} }
/** /**
@@ -367,7 +377,7 @@ public class Net{
*/ */
void discoverServers(Cons<Host> callback, Runnable done); void discoverServers(Cons<Host> callback, Runnable done);
/** Ping a host. If an error occurred, failed() should be called with the exception. */ /** Ping a host. If an error occurred, failed() should be called with the exception. This method should block. */
void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> failed); void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> failed);
/** Host a server at specified port. */ /** Host a server at specified port. */

View File

@@ -71,6 +71,7 @@ public class UnitType extends UnlockableContent{
public boolean omniMovement = true; public boolean omniMovement = true;
public Effect fallEffect = Fx.fallSmoke; public Effect fallEffect = Fx.fallSmoke;
public Effect fallThrusterEffect = Fx.fallSmoke; public Effect fallThrusterEffect = Fx.fallSmoke;
public Effect deathExplosionEffect = Fx.dynamicExplosion;
public Seq<Ability> abilities = new Seq<>(); public Seq<Ability> abilities = new Seq<>();
public BlockFlag targetFlag = BlockFlag.generator; public BlockFlag targetFlag = BlockFlag.generator;

View File

@@ -0,0 +1,102 @@
package mindustry.ui;
import arc.*;
import arc.struct.*;
import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
import static mindustry.Vars.*;
/** Class for handling menus and notifications across the network. Unstable API! */
public class Menus{
private static IntMap<MenuListener> menuListeners = new IntMap<>();
/** Register a *global* menu listener. If no option is chosen, the option is returned as -1. */
public static void registerMenu(int id, MenuListener listener){
menuListeners.put(id, listener);
}
//do not invoke any of the methods below directly, use Call
@Remote(variants = Variant.both)
public static void menu(int menuId, String title, String message, String[][] options){
if(title == null) title = "";
if(options == null) options = new String[0][0];
ui.showMenu(title, message, options, (option) -> Call.menuChoose(player, menuId, option));
}
@Remote(targets = Loc.both, called = Loc.both)
public static void menuChoose(@Nullable Player player, int menuId, int option){
if(player != null && menuListeners.containsKey(menuId)){
Events.fire(new MenuOptionChooseEvent(player, menuId, option));
menuListeners.get(menuId).get(player, option);
}
}
@Remote(variants = Variant.both, unreliable = true)
public static void setHudText(String message){
if(message == null) return;
ui.hudfrag.setHudText(message);
}
@Remote(variants = Variant.both)
public static void hideHudText(){
ui.hudfrag.toggleHudText(false);
}
/** TCP version */
@Remote(variants = Variant.both)
public static void setHudTextReliable(String message){
setHudText(message);
}
@Remote(variants = Variant.both)
public static void announce(String message){
if(message == null) return;
ui.announce(message);
}
@Remote(variants = Variant.both)
public static void infoMessage(String message){
if(message == null) return;
ui.showText("", message);
}
@Remote(variants = Variant.both)
public static void infoPopup(String message, float duration, int align, int top, int left, int bottom, int right){
if(message == null) return;
ui.showInfoPopup(message, duration, align, top, left, bottom, right);
}
@Remote(variants = Variant.both)
public static void label(String message, float duration, float worldx, float worldy){
if(message == null) return;
ui.showLabel(message, duration, worldx, worldy);
}
@Remote(variants = Variant.both)
public static void infoToast(String message, float duration){
if(message == null) return;
ui.showInfoToast(message, duration);
}
@Remote(variants = Variant.both)
public static void warningToast(int unicode, String text){
if(text == null || Fonts.icon.getData().getGlyph((char)unicode) == null) return;
ui.hudfrag.showToast(Fonts.getGlyph(Fonts.icon, (char)unicode), text);
}
public interface MenuListener{
void get(Player player, int option);
}
}

View File

@@ -67,7 +67,7 @@ public class ContentInfoDialog extends BaseDialog{
for(Stat stat : map.keys()){ for(Stat stat : map.keys()){
table.table(inset -> { table.table(inset -> {
inset.left(); inset.left();
inset.add("[lightgray]" + stat.localized() + ":[] ").left(); inset.add("[lightgray]" + stat.localized() + ":[] ").left().top();
Seq<StatValue> arr = map.get(stat); Seq<StatValue> arr = map.get(stat);
for(StatValue value : arr){ for(StatValue value : arr){
value.display(inset); value.display(inset);

View File

@@ -364,7 +364,7 @@ public class JoinDialog extends BaseDialog{
for(String address : group.addresses){ for(String address : group.addresses){
String resaddress = address.contains(":") ? address.split(":")[0] : address; String resaddress = address.contains(":") ? address.split(":")[0] : address;
int resport = address.contains(":") ? Strings.parseInt(address.split(":")[1]) : port; int resport = address.contains(":") ? Strings.parseInt(address.split(":")[1]) : port;
net.pingHost(resaddress, resport, res -> { net.pingHostThread(resaddress, resport, res -> {
if(refreshes != cur) return; if(refreshes != cur) return;
res.port = resport; res.port = resport;

View File

@@ -151,7 +151,7 @@ public class ModsDialog extends BaseDialog{
float w = Math.min(Core.graphics.getWidth() / 1.1f, 520f); float w = Math.min(Core.graphics.getWidth() / 1.1f, 520f);
cont.clear(); cont.clear();
cont.defaults().width(Math.min(Core.graphics.getWidth() / 1.2f, 520f)).pad(4); cont.defaults().width(Math.min(Core.graphics.getWidth() / 1.2f, 556f)).pad(4);
cont.add("@mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center); cont.add("@mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center);
cont.row(); cont.row();

View File

@@ -286,7 +286,7 @@ public class HudFragment extends Fragment{
.update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time, 2f, 1f))), true, .update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time, 2f, 1f))), true,
() -> { () -> {
if(!shown || state.isPaused()) return false; if(!shown || state.isPaused()) return false;
if(state.isMenu() || !state.teams.get(player.team()).hasCore()){ if(state.isMenu() || !player.team().data().hasCore()){
coreAttackTime[0] = 0f; coreAttackTime[0] = 0f;
return false; return false;
} }
@@ -322,7 +322,17 @@ public class HudFragment extends Fragment{
} }
return max == 0f ? 0f : val / max; return max == 0f ? 0f : val / max;
}).blink(Color.white).outline(new Color(0, 0, 0, 0.6f), 7f)).grow()) }).blink(Color.white).outline(new Color(0, 0, 0, 0.6f), 7f)).grow())
.fillX().width(320f).height(60f).name("boss").visible(() -> state.rules.waves && state.boss() != null).padTop(7); .fillX().width(320f).height(60f).name("boss").visible(() -> state.rules.waves && state.boss() != null).padTop(7).row();
t.table(Styles.black3, p -> p.margin(4).label(() -> hudText).style(Styles.outlineLabel)).touchable(Touchable.disabled).with(p -> p.visible(() -> {
p.color.a = Mathf.lerpDelta(p.color.a, Mathf.num(showHudText), 0.2f);
if(state.isMenu()){
p.color.a = 0f;
showHudText = false;
}
return p.color.a >= 0.001f;
}));
}); });
//spawner warning //spawner warning
@@ -342,20 +352,6 @@ public class HudFragment extends Fragment{
t.add("@saving").style(Styles.outlineLabel); t.add("@saving").style(Styles.outlineLabel);
}); });
parent.fill(p -> {
p.name = "hudtext";
p.top().table(Styles.black3, t -> t.margin(4).label(() -> hudText)
.style(Styles.outlineLabel)).padTop(10).visible(p.color.a >= 0.001f);
p.update(() -> {
p.color.a = Mathf.lerpDelta(p.color.a, Mathf.num(showHudText), 0.2f);
if(state.isMenu()){
p.color.a = 0f;
showHudText = false;
}
});
p.touchable = Touchable.disabled;
});
//TODO DEBUG: rate table //TODO DEBUG: rate table
if(false) if(false)
parent.fill(t -> { parent.fill(t -> {

View File

@@ -451,6 +451,10 @@ public class Block extends UnlockableContent{
} }
public boolean configSenseable(){
return configurations.containsKey(Item.class) || configurations.containsKey(Liquid.class);
}
public Object nextConfig(){ public Object nextConfig(){
if(saveConfig && lastConfig != null){ if(saveConfig && lastConfig != null){
return lastConfig; return lastConfig;

View File

@@ -119,11 +119,11 @@ public class Tile implements Position, QuadTreeObject, Displayable{
float result = 0f; float result = 0f;
if(block.hasItems){ if(block.hasItems){
result += build.items.sum((item, amount) -> item.flammability * amount) / block.itemCapacity * Mathf.clamp(block.itemCapacity / 2.4f, 1f, 3f); result += build.items.sum((item, amount) -> item.flammability * amount) / Math.max(block.itemCapacity, 1) * Mathf.clamp(block.itemCapacity / 2.4f, 1f, 3f);
} }
if(block.hasLiquids){ if(block.hasLiquids){
result += build.liquids.sum((liquid, amount) -> liquid.flammability * amount / 1.6f) / block.liquidCapacity * Mathf.clamp(block.liquidCapacity / 30f, 1f, 2f); result += build.liquids.sum((liquid, amount) -> liquid.flammability * amount / 1.6f) / Math.max(block.liquidCapacity, 1) * Mathf.clamp(block.liquidCapacity / 30f, 1f, 2f);
} }
return result; return result;

View File

@@ -53,7 +53,7 @@ public class ForceProjector extends Block{
hasItems = true; hasItems = true;
ambientSound = Sounds.shield; ambientSound = Sounds.shield;
ambientSoundVolume = 0.08f; ambientSoundVolume = 0.08f;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).boost().update(false); consumes.add(new ConsumeCoolant(0.1f)).boost().update(false);
} }
@Override @Override

View File

@@ -37,7 +37,7 @@ public class BaseTurret extends Block{
public void init(){ public void init(){
if(acceptCoolant && !consumes.has(ConsumeType.liquid)){ if(acceptCoolant && !consumes.has(ConsumeType.liquid)){
hasLiquids = true; hasLiquids = true;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.2f)).update(false).boost(); consumes.add(new ConsumeCoolant(0.2f)).update(false).boost();
} }
super.init(); super.init();

View File

@@ -19,7 +19,7 @@ public class LaserTurret extends PowerTurret{
super(name); super(name);
canOverdrive = false; canOverdrive = false;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.01f)).update(false); consumes.add(new ConsumeCoolant(0.01f)).update(false);
coolantMultiplier = 1f; coolantMultiplier = 1f;
} }

View File

@@ -27,6 +27,8 @@ public class LiquidTurret extends Turret{
hasLiquids = true; hasLiquids = true;
loopSound = Sounds.spray; loopSound = Sounds.spray;
shootSound = Sounds.none; shootSound = Sounds.none;
smokeEffect = Fx.none;
shootEffect = Fx.none;
outlinedIcon = 1; outlinedIcon = 1;
} }

View File

@@ -116,7 +116,7 @@ public class Turret extends ReloadTurret{
public void init(){ public void init(){
if(acceptCoolant && !consumes.has(ConsumeType.liquid)){ if(acceptCoolant && !consumes.has(ConsumeType.liquid)){
hasLiquids = true; hasLiquids = true;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, coolantUsage)).update(false).boost(); consumes.add(new ConsumeCoolant(coolantUsage)).update(false).boost();
} }
if(shootLength < 0) shootLength = size * tilesize / 2f; if(shootLength < 0) shootLength = size * tilesize / 2f;

View File

@@ -147,7 +147,7 @@ public class Duct extends Block implements Autotiler{
@Override @Override
public boolean acceptItem(Building source, Item item){ public boolean acceptItem(Building source, Item item){
return current == null && items.total() == 0 && return current == null && items.total() == 0 &&
(source.block instanceof Duct || Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation); ((source.block.rotate && source.front() == this && source.block.hasItems) || Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation);
} }
@Override @Override

View File

@@ -1,6 +1,7 @@
package mindustry.world.blocks.distribution; package mindustry.world.blocks.distribution;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
@@ -16,8 +17,10 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
//TODO display range
public class DuctBridge extends Block{ public class DuctBridge extends Block{
private static BuildPlan otherReq;
private int otherDst = 0;
public @Load("@-bridge") TextureRegion bridgeRegion; public @Load("@-bridge") TextureRegion bridgeRegion;
public @Load("@-bridge-bottom") TextureRegion bridgeBotRegion; public @Load("@-bridge-bottom") TextureRegion bridgeBotRegion;
//public @Load("@-bridge-top") TextureRegion bridgeTopRegion; //public @Load("@-bridge-top") TextureRegion bridgeTopRegion;
@@ -46,6 +49,26 @@ public class DuctBridge extends Block{
Draw.rect(dirRegion, req.drawx(), req.drawy(), req.rotation * 90); Draw.rect(dirRegion, req.drawx(), req.drawy(), req.rotation * 90);
} }
@Override
public void drawRequestConfigTop(BuildPlan req, Eachable<BuildPlan> list){
otherReq = null;
otherDst = range;
Point2 d = Geometry.d4(req.rotation);
list.each(other -> {
if(other.block == this && req != other && Mathf.clamp(other.x - req.x, -1, 1) == d.x && Mathf.clamp(other.y - req.y, -1, 1) == d.y){
int dst = Math.max(Math.abs(other.x - req.x), Math.abs(other.y - req.y));
if(dst <= otherDst){
otherReq = other;
otherDst = dst;
}
}
});
if(otherReq != null){
drawBridge(req.rotation, req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy());
}
}
@Override @Override
public TextureRegion[] icons(){ public TextureRegion[] icons(){
return new TextureRegion[]{region, dirRegion}; return new TextureRegion[]{region, dirRegion};
@@ -56,16 +79,14 @@ public class DuctBridge extends Block{
Placement.calculateNodes(points, this, rotation, (point, other) -> Math.max(Math.abs(point.x - other.x), Math.abs(point.y - other.y)) <= range); Placement.calculateNodes(points, this, rotation, (point, other) -> Math.max(Math.abs(point.x - other.x), Math.abs(point.y - other.y)) <= range);
} }
@Override public void drawPlace(int x, int y, int rotation, boolean valid, boolean line){
public void drawPlace(int x, int y, int rotation, boolean valid){
super.drawPlace(x, y, rotation, valid);
int length = range; int length = range;
Building found = null; Building found = null;
int dx = Geometry.d4x(rotation), dy = Geometry.d4y(rotation);
//find the link //find the link
for(int i = 1; i <= range; i++){ for(int i = 1; i <= range; i++){
Tile other = world.tile(x + Geometry.d4x(rotation) * i, y + Geometry.d4y(rotation) * i); Tile other = world.tile(x + dx * i, y + dy * i);
if(other != null && other.build instanceof DuctBridgeBuild build && build.team == player.team()){ if(other != null && other.build instanceof DuctBridgeBuild build && build.team == player.team()){
length = i; length = i;
@@ -74,17 +95,50 @@ public class DuctBridge extends Block{
} }
} }
Drawf.dashLine(Pal.placing, if(line || found != null){
x * tilesize + Geometry.d4[rotation].x * (tilesize / 2f + 2), Drawf.dashLine(Pal.placing,
y * tilesize + Geometry.d4[rotation].y * (tilesize / 2f + 2), x * tilesize + dx * (tilesize / 2f + 2),
x * tilesize + Geometry.d4[rotation].x * (length) * tilesize, y * tilesize + dy * (tilesize / 2f + 2),
y * tilesize + Geometry.d4[rotation].y * (length) * tilesize x * tilesize + dx * (length) * tilesize,
); y * tilesize + dy * (length) * tilesize
);
if(found != null){
Drawf.square(found.x, found.y, found.block.size * tilesize/2f + 2.5f, 0f);
} }
if(found != null){
if(line){
Drawf.square(found.x, found.y, found.block.size * tilesize/2f + 2.5f, 0f);
}else{
Drawf.square(found.x, found.y, 2f);
}
}
}
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
super.drawPlace(x, y, rotation, valid);
drawPlace(x, y, rotation, valid, true);
}
public void drawBridge(int rotation, float x1, float y1, float x2, float y2){
Draw.alpha(Renderer.bridgeOpacity);
float
angle = Angles.angle(x1, y1, x2, y2),
cx = (x1 + x2)/2f,
cy = (y1 + y2)/2f,
len = Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)) - size * tilesize;
Draw.rect(bridgeRegion, cx, cy, len, tilesize, angle);
Draw.color(0.4f, 0.4f, 0.4f, 0.4f * Renderer.bridgeOpacity);
Draw.rect(bridgeBotRegion, cx, cy, len, tilesize, angle);
Draw.reset();
Draw.alpha(Renderer.bridgeOpacity);
for(float i = 6f; i <= len + size * tilesize - 5f; i += 5f){
Draw.rect(arrowRegion, x1 + Geometry.d4x(rotation) * i, y1 + Geometry.d4y(rotation) * i, angle);
}
Draw.reset();
} }
public boolean positionsValid(int x1, int y1, int x2, int y2){ public boolean positionsValid(int x1, int y1, int x2, int y2){
@@ -108,24 +162,42 @@ public class DuctBridge extends Block{
var link = findLink(); var link = findLink();
if(link != null){ if(link != null){
Draw.z(Layer.power); Draw.z(Layer.power);
Draw.alpha(Renderer.bridgeOpacity); drawBridge(rotation, x, y, link.x, link.y);
float }
angle = angleTo(link), }
cx = (x + link.x)/2f,
cy = (y + link.y)/2f,
len = Math.max(Math.abs(x - link.x), Math.abs(y - link.y)) - size * tilesize;
Draw.rect(bridgeRegion, cx, cy, len, tilesize, angle); @Override
Draw.color(0.4f, 0.4f, 0.4f, 0.4f * Renderer.bridgeOpacity); public void drawSelect(){
Draw.rect(bridgeBotRegion, cx, cy, len, tilesize, angle); drawPlace(tile.x, tile.y, rotation, true, false);
Draw.reset(); //draw incoming bridges
Draw.alpha(Renderer.bridgeOpacity); for(int dir = 0; dir < 4; dir++){
if(dir != rotation){
int dx = Geometry.d4x(dir), dy = Geometry.d4y(dir);
int length = range;
Building found = null;
for(float i = 6f; i <= len + size * tilesize - 5f; i += 5f){ //find the link
Draw.rect(arrowRegion, x + Geometry.d4x(rotation) * i, y + Geometry.d4y(rotation) * i, angle); for(int i = 1; i <= range; i++){
Tile other = world.tile(tile.x + dx * i, tile.y + dy * i);
if(other != null && other.build instanceof DuctBridgeBuild build && build.team == player.team() && (build.rotation + 2) % 4 == dir){
length = i;
found = other.build;
break;
}
}
if(found != null){
Drawf.dashLine(Pal.place,
found.x - dx * (tilesize / 2f + 2),
found.y - dy * (tilesize / 2f + 2),
found.x - dx * (length) * tilesize,
found.y - dy * (length) * tilesize
);
Drawf.square(found.x, found.y, 2f, 45f, Pal.place);
}
} }
Draw.reset();
} }
} }
@@ -173,7 +245,7 @@ public class DuctBridge extends Block{
@Override @Override
public boolean acceptItem(Building source, Item item){ public boolean acceptItem(Building source, Item item){
int rel = this.relativeTo(source); int rel = this.relativeToEdge(source.tile);
return items.total() < itemCapacity && rel != rotation && occupied[(rel + 2) % 4] == null; return items.total() < itemCapacity && rel != rotation && occupied[(rel + 2) % 4] == null;
} }
} }

View File

@@ -0,0 +1,19 @@
package mindustry.world.blocks.environment;
import mindustry.world.meta.*;
/** Class for quickly defining a floor with no water and no variants. Offers no new functionality. */
public class MetalFloor extends Floor{
public MetalFloor(String name){
super(name);
variants = 0;
attributes.set(Attribute.water, -1);
}
public MetalFloor(String name, int variants){
super(name);
this.variants = variants;
attributes.set(Attribute.water, -1);
}
}

View File

@@ -16,6 +16,11 @@ public class BlockUnloader extends BlockLoader{
return true; return true;
} }
@Override
public boolean rotatedOutput(int x, int y){
return false;
}
public class BlockUnloaderBuild extends BlockLoaderBuild{ public class BlockUnloaderBuild extends BlockLoaderBuild{
@Override @Override

View File

@@ -66,6 +66,12 @@ public class PayloadMassDriver extends PayloadBlock{
config(Integer.class, (PayloadDriverBuild tile, Integer point) -> tile.link = point); config(Integer.class, (PayloadDriverBuild tile, Integer point) -> tile.link = point);
} }
@Override
public void init(){
super.init();
clipSize = Math.max(clipSize, range*2f + tilesize*size);
}
@Override @Override
public void setStats(){ public void setStats(){
super.setStats(); super.setStats();

View File

@@ -0,0 +1,20 @@
package mindustry.world.blocks.power;
import arc.func.*;
import mindustry.gen.*;
import mindustry.world.consumers.*;
/** A power consumer that uses a dynamic amount of power. */
public class DynamicConsumePower extends ConsumePower{
private final Floatf<Building> usage;
public DynamicConsumePower(Floatf<Building> usage){
super(0, 0, false);
this.usage = usage;
}
@Override
public float requestedPower(Building entity){
return usage.get(entity);
}
}

View File

@@ -20,6 +20,8 @@ import mindustry.world.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
public class CommandCenter extends Block{ public class CommandCenter extends Block{
public final int timerEffect = timers ++;
public TextureRegionDrawable[] commandRegions = new TextureRegionDrawable[UnitCommand.all.length]; public TextureRegionDrawable[] commandRegions = new TextureRegionDrawable[UnitCommand.all.length];
public Color topColor = null, bottomColor = Color.valueOf("5e5e5e"); public Color topColor = null, bottomColor = Color.valueOf("5e5e5e");
public Effect effect = Fx.commandSend; public Effect effect = Fx.commandSend;
@@ -33,11 +35,17 @@ public class CommandCenter extends Block{
solid = true; solid = true;
configurable = true; configurable = true;
drawDisabled = false; drawDisabled = false;
logicConfigurable = true;
config(UnitCommand.class, (CommandBuild build, UnitCommand command) -> { config(UnitCommand.class, (CommandBuild build, UnitCommand command) -> {
build.team.data().command = command; if(build.team.data().command != command){
effect.at(build, effectSize); build.team.data().command = command;
Events.fire(new CommandIssueEvent(build, command)); //do not spam effect
if(build.timer(timerEffect, 60f)){
effect.at(build, effectSize);
}
Events.fire(new CommandIssueEvent(build, command));
}
}); });
} }
@@ -52,6 +60,11 @@ public class CommandCenter extends Block{
} }
} }
@Override
public boolean configSenseable(){
return true;
}
public class CommandBuild extends Building{ public class CommandBuild extends Building{
@Override @Override

View File

@@ -76,7 +76,7 @@ public class RepairPoint extends Block{
public void init(){ public void init(){
if(acceptCoolant){ if(acceptCoolant){
hasLiquids = true; hasLiquids = true;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, coolantUse)).optional(true, true); consumes.add(new ConsumeCoolant(coolantUse)).optional(true, true);
} }
consumes.powerCond(powerUse, (RepairPointBuild entity) -> entity.target != null); consumes.powerCond(powerUse, (RepairPointBuild entity) -> entity.target != null);

View File

@@ -0,0 +1,16 @@
package mindustry.world.consumers;
/** A ConsumeLiquidFilter that consumes specific coolant, selected based on stats. */
public class ConsumeCoolant extends ConsumeLiquidFilter{
public float maxTemp = 0.5f, maxFlammability = 0.1f;
public ConsumeCoolant(float amount){
this.filter = liquid -> liquid.temperature <= maxTemp && liquid.flammability < maxFlammability;
this.amount = amount;
}
//mods
public ConsumeCoolant(){
this(0.1f);
}
}

View File

@@ -4,12 +4,14 @@ import mindustry.gen.*;
public abstract class ConsumeLiquidBase extends Consume{ public abstract class ConsumeLiquidBase extends Consume{
/** amount used per frame */ /** amount used per frame */
public final float amount; public float amount;
public ConsumeLiquidBase(float amount){ public ConsumeLiquidBase(float amount){
this.amount = amount; this.amount = amount;
} }
public ConsumeLiquidBase(){}
@Override @Override
public ConsumeType type(){ public ConsumeType type(){
return ConsumeType.liquid; return ConsumeType.liquid;

View File

@@ -11,13 +11,17 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class ConsumeLiquidFilter extends ConsumeLiquidBase{ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
public final Boolf<Liquid> filter; public Boolf<Liquid> filter;
public ConsumeLiquidFilter(Boolf<Liquid> liquid, float amount){ public ConsumeLiquidFilter(Boolf<Liquid> liquid, float amount){
super(amount); super(amount);
this.filter = liquid; this.filter = liquid;
} }
public ConsumeLiquidFilter(){
this.filter = l -> false;
}
@Override @Override
public void applyLiquidFilter(Bits arr){ public void applyLiquidFilter(Bits arr){
content.liquids().each(filter, item -> arr.set(item.id)); content.liquids().each(filter, item -> arr.set(item.id));

View File

@@ -68,6 +68,11 @@ public class Consumers{
return add(new ConditionalConsumePower(usage, (Boolf<Building>)cons)); return add(new ConditionalConsumePower(usage, (Boolf<Building>)cons));
} }
/** Creates a consumer that consumes a dynamic amount of power. */
public <T extends Building> ConsumePower powerDynamic(Floatf<T> usage){
return add(new DynamicConsumePower((Floatf<Building>)usage));
}
/** /**
* Creates a consumer which stores power. * Creates a consumer which stores power.
* @param powerCapacity The maximum capacity in power units. * @param powerCapacity The maximum capacity in power units.

View File

@@ -8,10 +8,12 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.maps.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
@@ -117,6 +119,51 @@ public class StatValues{
); );
} }
public static StatValue floors(Attribute attr, boolean floating, float scale, boolean startZero){
return table -> table.table(c -> {
Runnable[] rebuild = {null};
Map[] lastMap = {null};
rebuild[0] = () -> {
c.clearChildren();
c.left();
if(state.isGame()){
var blocks = Vars.content.blocks()
.select(block -> block instanceof Floor f && indexer.isBlockPresent(block) && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating))
.<Floor>as().with(s -> s.sort(f -> f.attributes.get(attr)));
if(blocks.any()){
int i = 0;
for(var block : blocks){
floorEfficiency(block, block.attributes.get(attr) * scale, startZero).display(c);
if(++i % 5 == 0){
c.row();
}
}
}else{
c.add("@none.found");
}
}else{
c.add("@stat.showinmap");
}
};
rebuild[0].run();
//rebuild when map changes.
c.update(() -> {
Map current = state.isGame() ? state.map : null;
if(current != lastMap[0]){
rebuild[0].run();
lastMap[0] = current;
}
});
});
}
public static StatValue blocks(Boolf<Block> pred){ public static StatValue blocks(Boolf<Block> pred){
return blocks(content.blocks().select(pred)); return blocks(content.blocks().select(pred));
} }
@@ -246,7 +293,7 @@ public class StatValues{
sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1))); sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1)));
} }
if(!unit && !Mathf.equal(type.ammoMultiplier, 1f)){ if(!unit && !Mathf.equal(type.ammoMultiplier, 1f) && type.displayAmmoMultiplier){
sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier)); sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier));
} }

View File

@@ -3,9 +3,7 @@ package mindustry.world.meta;
import arc.struct.ObjectMap.*; import arc.struct.ObjectMap.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.blocks.environment.*;
/** Hold and organizes a list of block stats. */ /** Hold and organizes a list of block stats. */
public class Stats{ public class Stats{
@@ -68,11 +66,7 @@ public class Stats{
} }
public void add(Stat stat, Attribute attr, boolean floating, float scale, boolean startZero){ public void add(Stat stat, Attribute attr, boolean floating, float scale, boolean startZero){
for(var block : Vars.content.blocks() add(stat, StatValues.floors(attr, floating, scale, startZero));
.select(block -> block instanceof Floor f && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating))
.<Floor>as().with(s -> s.sort(f -> f.attributes.get(attr)))){
add(stat, StatValues.floorEfficiency(block, block.attributes.get(attr) * scale, startZero));
}
} }
/** Adds a single string value with this stat. */ /** Adds a single string value with this stat. */

View File

@@ -9,4 +9,4 @@ kapt.use.worker.api=true
kapt.include.compile.classpath=false kapt.include.compile.classpath=false
# I don't need to use the kotlin stdlib yet, so remove it to prevent extra bloat & method count issues # I don't need to use the kotlin stdlib yet, so remove it to prevent extra bloat & method count issues
kotlin.stdlib.default.dependency=false kotlin.stdlib.default.dependency=false
archash=759b136340ea98d4cb9881e340fb219c6d602a66 archash=dabe9d3e89a9ed1b1c4cb8496a4525dedf29f613

View File

@@ -12,7 +12,7 @@
"address": "mindustry.pl:7777" "address": "mindustry.pl:7777"
}, },
{ {
"address": "46.17.104.254:9999" "address": "mindurka.tk:9999"
}, },
{ {
"address": "mindustrypvp.ml:6000" "address": "mindustrypvp.ml:6000"

View File

@@ -1,7 +1,7 @@
[ [
{ {
"name": "RCR", "name": "RCM",
"address": ["185.104.248.61"] "address": ["185.104.248.61", "easyplay.su"]
}, },
{ {
"name": "SMokeOfAnarchy.duckdns.org", "name": "SMokeOfAnarchy.duckdns.org",
@@ -21,7 +21,7 @@
}, },
{ {
"name": "C.A.M.S.", "name": "C.A.M.S.",
"address": ["routerchain.ddns.net", "nikochio.ddns.net", "easyplay.su", "play.thedimas.pp.ua"] "address": ["routerchain.ddns.net", "nikochio.ddns.net", "play.thedimas.pp.ua"]
}, },
{ {
"name": "BE6.RUN", "name": "BE6.RUN",
@@ -89,7 +89,7 @@
}, },
{ {
"name": "MD Community", "name": "MD Community",
"address": ["46.17.104.254", "46.17.104.254:4000"] "address": ["mindurka.tk", "mindurka.tk:4000"]
}, },
{ {
"name": "Mindustry.Party", "name": "Mindustry.Party",
@@ -102,5 +102,9 @@
{ {
"name": "Sakura", "name": "Sakura",
"address": ["160.16.207.141"] "address": ["160.16.207.141"]
},
{
"name": "MeowLand",
"address": ["34.134.111.15"]
} }
] ]

View File

@@ -739,7 +739,7 @@ public class ApplicationTests{
core.build.items.set(item, 3000); core.build.items.set(item, 3000);
} }
assertEquals(core.build, state.teams.get(Team.sharded).core()); assertEquals(core.build, Team.sharded.data().core());
} }
void depositTest(Block block, Item item){ void depositTest(Block block, Item item){

View File

@@ -96,7 +96,7 @@ public class SectorTests{
assertTrue(Team.sharded.core().items.total() < 1000, "Sector must not have starting resources: " + zone); assertTrue(Team.sharded.core().items.total() < 1000, "Sector must not have starting resources: " + zone);
assertTrue(hasSpawnPoint, "Sector \"" + zone.name + "\" has no spawn points."); assertTrue(hasSpawnPoint, "Sector \"" + zone.name + "\" has no spawn points.");
assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && state.teams.get(state.rules.waveTeam).hasCore()), "Sector \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns()); assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && state.rules.waveTeam.data().hasCore()), "Sector \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns());
})); }));
} }

View File

@@ -1,15 +1,16 @@
sourceSets.main.java.srcDirs = ["src/"] sourceSets.main.java.srcDirs = ["src/"]
import arc.files.Fi import arc.files.Fi
import arc.graphics.Color import arc.graphics.Color
import arc.graphics.Pixmap import arc.graphics.Pixmap
import arc.packer.TexturePacker import arc.packer.TexturePacker
import arc.struct.IntIntMap import arc.struct.IntIntMap
import arc.struct.IntMap import arc.struct.IntMap
import arc.util.async.Threads
import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
def genFolder = "../core/assets-raw/sprites_out/generated/" def genFolder = "../core/assets-raw/sprites_out/generated/"
def doAntialias = !project.hasProperty("disableAntialias") def doAntialias = !project.hasProperty("disableAntialias")
@@ -222,12 +223,7 @@ task pack(dependsOn: [classes, configurations.runtimeClasspath]){
} }
} }
executor.shutdown() Threads.await(executor)
try{
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS)
}catch(InterruptedException e){
e.printStackTrace()
}
println "Time taken for AA: ${(System.currentTimeMillis() - ms) / 1000f}" println "Time taken for AA: ${(System.currentTimeMillis() - ms) / 1000f}"

View File

@@ -9,6 +9,7 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.async.*;
import arc.util.noise.*; import arc.util.noise.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.game.*; import mindustry.game.*;
@@ -161,16 +162,10 @@ public class Generators{
}); });
} }
try{ Threads.await(exec);
exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
}catch(Exception e){
throw new RuntimeException("go away", e);
}
}); });
generate("cracks", () -> { generate("cracks", () -> {
RidgedPerlin r = new RidgedPerlin(1, 3);
for(int size = 1; size <= BlockRenderer.maxCrackSize; size++){ for(int size = 1; size <= BlockRenderer.maxCrackSize; size++){
int dim = size * 32; int dim = size * 32;
int steps = BlockRenderer.crackRegions; int steps = BlockRenderer.crackRegions;
@@ -181,7 +176,7 @@ public class Generators{
for(int x = 0; x < dim; x++){ for(int x = 0; x < dim; x++){
for(int y = 0; y < dim; y++){ for(int y = 0; y < dim; y++){
float dst = Mathf.dst((float)x/dim, (float)y/dim, 0.5f, 0.5f) * 2f; float dst = Mathf.dst((float)x/dim, (float)y/dim, 0.5f, 0.5f) * 2f;
if(dst < 1.2f && r.getValue(x, y, 1f / 40f) - dst*(1f-fract) > 0.16f){ if(dst < 1.2f && RidgedPerlin.noise2d(1, x, y, 3, 1f / 40f) - dst*(1f-fract) > 0.16f){
image.setRaw(x, y, Color.whiteRgba); image.setRaw(x, y, Color.whiteRgba);
} }
} }
@@ -335,7 +330,7 @@ public class Generators{
average.mul(1f / asum); average.mul(1f / asum);
if(block instanceof Floor){ if(block instanceof Floor){
average.mul(0.8f); average.mul(0.77f);
}else{ }else{
average.mul(1.1f); average.mul(1.1f);
} }
@@ -489,12 +484,11 @@ public class Generators{
wrecks[i] = new Pixmap(image.width, image.height); wrecks[i] = new Pixmap(image.width, image.height);
} }
RidgedPerlin r = new RidgedPerlin(1, 3);
VoronoiNoise vn = new VoronoiNoise(type.id, true); VoronoiNoise vn = new VoronoiNoise(type.id, true);
image.each((x, y) -> { image.each((x, y) -> {
//add darker cracks on top //add darker cracks on top
boolean rValue = Math.max(r.getValue(x, y, 1f / (20f + image.width/8f)), 0) > 0.16f; boolean rValue = Math.max(RidgedPerlin.noise2d(1, x, y, 3, 1f / (20f + image.width/8f)), 0) > 0.16f;
//cut out random chunks with voronoi //cut out random chunks with voronoi
boolean vval = vn.noise(x, y, 1f / (14f + image.width/40f)) > 0.47; boolean vval = vn.noise(x, y, 1f / (14f + image.width/40f)) > 0.47;