Merge branch 'master' into patch-1
This commit is contained in:
@@ -26,6 +26,7 @@ script:
|
||||
- cp -a Mindustry/core/build/docs/javadoc/. docs/
|
||||
- cd docs
|
||||
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi
|
||||
- cd ../Mindustry
|
||||
deploy:
|
||||
- provider: releases
|
||||
skip_cleanup: true
|
||||
|
||||
@@ -34,7 +34,8 @@ dependencies{
|
||||
natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}"
|
||||
natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
|
||||
|
||||
if(localArc()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar'])
|
||||
//android dependencies magically disappear during compilation, thanks gradle!
|
||||
if(new File(projectDir.parent, '../Arc').exists()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar'])
|
||||
}
|
||||
|
||||
task deploy(type: Copy){
|
||||
|
||||
+1
-3
@@ -32,7 +32,7 @@ allprojects{
|
||||
|
||||
ext{
|
||||
versionNumber = '6'
|
||||
if(!project.hasProperty("versionModifier")) versionModifier = 'pre-alpha'
|
||||
if(!project.hasProperty("versionModifier")) versionModifier = 'alpha'
|
||||
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||
appName = 'Mindustry'
|
||||
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
|
||||
@@ -261,7 +261,6 @@ project(":core"){
|
||||
doLast{
|
||||
def props = loadVersionProps()
|
||||
def androidVersion = props['androidBuildCode'].toInteger() - 2
|
||||
def buildVersion = props["build"]
|
||||
def loglines = file("../changelog").text.split("\n")
|
||||
def maxLength = 460
|
||||
|
||||
@@ -273,7 +272,6 @@ project(":core"){
|
||||
}
|
||||
}
|
||||
def changelogs = file("../fastlane/metadata/android/en-US/changelogs/")
|
||||
new File(changelogs, buildVersion + ".txt").text = (result)
|
||||
new File(changelogs, androidVersion + ".txt").text = (result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,5 @@
|
||||
flattenPaths: true,
|
||||
maxWidth: 4096,
|
||||
maxHeight: 4096,
|
||||
minHeight: 2048,
|
||||
fast: true
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ gameover = Game Over
|
||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
||||
highscore = [accent]New highscore!
|
||||
copied = Copied.
|
||||
indevpopup = [accent]v6[] is currently in [accent]pre-alpha[].\n[lightgray]This means:[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work\n- Many units are unfinished\n- The campaign is completely unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
|
||||
indevpopup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
|
||||
|
||||
load.sound = Sounds
|
||||
load.map = Maps
|
||||
@@ -509,6 +509,11 @@ error.io = Network I/O error.
|
||||
error.any = Unknown network error.
|
||||
error.bloom = Failed to initialize bloom.\nYour device may not support it.
|
||||
|
||||
weather.rain.name = Rain
|
||||
weather.snow.name = Snow
|
||||
weather.sandstorm.name = Sandstorm
|
||||
weather.sporestorm.name = Sporestorm
|
||||
|
||||
sectors.unexplored = [lightgray]Unexplored
|
||||
sectors.resources = Resources:
|
||||
sectors.production = Production:
|
||||
@@ -652,6 +657,7 @@ unit.liquidunits = liquid units
|
||||
unit.powerunits = power units
|
||||
unit.degrees = degrees
|
||||
unit.seconds = seconds
|
||||
unit.minutes = mins
|
||||
unit.persecond = /sec
|
||||
unit.perminute = /min
|
||||
unit.timesspeed = x speed
|
||||
@@ -842,7 +848,9 @@ rules.lighting = Lighting
|
||||
rules.fire = Fire
|
||||
rules.explosions = Block/Unit Explosion Damage
|
||||
rules.ambientlight = Ambient Light
|
||||
rules.solarpowermultiplier = Solar Power Multiplier
|
||||
rules.weather = Weather
|
||||
rules.weather.frequency = Frequency:
|
||||
rules.weather.duration = Duration:
|
||||
|
||||
content.item.name = Items
|
||||
content.liquid.name = Liquids
|
||||
|
||||
@@ -12,7 +12,7 @@ link.itch.io.description = Stránka na itch.io s odkazy na stažení hry
|
||||
link.google-play.description = Obchod Google Play
|
||||
link.f-droid.description = Katalog F-Droid
|
||||
link.wiki.description = Oficiální Wiki Mindustry
|
||||
link.suggestions.description = Navrhni něco nového do hry!
|
||||
link.feathub.description = Navrhni něco nového do hry!
|
||||
linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky.
|
||||
screenshot = Snímek obrazovky uložen {0}
|
||||
screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky.
|
||||
@@ -63,8 +63,7 @@ stat.delivered = Materiálu vysláno:
|
||||
stat.playtime = Odehraný čas: [accent]{0}[]
|
||||
stat.rank = Celková známka: [accent]{0}[]
|
||||
|
||||
launcheditems = [accent]Získané předměty[]
|
||||
launchinfo = [unlaunched]Je třeba vyslat zpět Tvé jádro, abys získal věci vyznačené modře.[]
|
||||
globalitems = [accent]Celkové položky[]
|
||||
map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"?
|
||||
level.highscore = Nejvyšší skóre: [accent]{0}[]
|
||||
level.select = Výběr úrovně
|
||||
@@ -106,7 +105,7 @@ mods.guide = Průvodce modifikacemi
|
||||
mods.report = Nahlásit závadu
|
||||
mods.openfolder = Otevřít složku s modifikacemi
|
||||
mods.reload = Znovu načíst
|
||||
mods.reloadexit = The game will now exit, to reload mods.
|
||||
mods.reloadexit = Hra bude nyní ukončena, aby si znovu načetla modifikace.
|
||||
mod.display = [gray]Modifikace:[][orange] {0}[]
|
||||
mod.enabled = [lightgray]Povoleno[]
|
||||
mod.disabled = [scarlet]Zakázáno[]
|
||||
@@ -125,7 +124,7 @@ mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry.
|
||||
mod.import = Importovat modifikaci
|
||||
mod.import.file = Importovat soubor
|
||||
mod.import.github = Import modifikace z GitHubu
|
||||
mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source!
|
||||
mod.jarwarn = [scarlet]JAR modifikace jsou z podstaty nebezpečné.[]\Ujisti se, že je importuješ z důvěryhodného zdroje!
|
||||
mod.item.remove = Tato položka je součástí [accent]'{0}'[] modifikace. Pokud ji chcete odstranit, odinstalujte tuto modifikaci.
|
||||
mod.remove.confirm = Tato modifikace bude odstraněna.
|
||||
mod.author = [lightgray]Autor:[] {0}
|
||||
@@ -144,6 +143,7 @@ techtree = Technologie
|
||||
research.list = [lightgray]Výzkum:[]
|
||||
research = Výzkum
|
||||
researched = Dokončen výzkum technologie: [lightgray]{0}[].
|
||||
research.progress = {0}% dokončeno
|
||||
players = Hráčů: {0}
|
||||
players.single = Hráč: {0}
|
||||
players.search = hledat
|
||||
@@ -198,8 +198,8 @@ server.admins.none = Žádní správci nebyli nalezeni.
|
||||
server.add = Přidat server
|
||||
server.delete = Jsi si jistý, že chceš smazat tento server?
|
||||
server.edit = Upravit server
|
||||
server.outdated = [crimson]Zastaralá verze serveru![]
|
||||
server.outdated.client = [crimson]Zastaralá verze klienta![]
|
||||
server.outdated = [scarlet]Zastaralá verze serveru![]
|
||||
server.outdated.client = [scarlet]Zastaralá verze klienta![]
|
||||
server.version = [gray]Verze: {0} {1}[]
|
||||
server.custombuild = [accent]Upravená verze hry[]
|
||||
confirmban = Jsi si jistý, že chceš zakázat hráče "{0}[white]"?[]
|
||||
@@ -221,7 +221,7 @@ connecting.data = [accent]Načítám data ze serveru...[]
|
||||
server.port = Port:
|
||||
server.addressinuse = Adresu již někdo používá!
|
||||
server.invalidport = Neplatné číslo portu!
|
||||
server.error = [crimson]Chyba při hostování serveru.[]
|
||||
server.error = [scarlet]Chyba při hostování serveru.[]
|
||||
save.new = Nové uložení hry
|
||||
save.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry?
|
||||
overwrite = Přepsat
|
||||
@@ -231,8 +231,8 @@ save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry?
|
||||
save.delete = Smazat
|
||||
save.export = Exportovat uložení hry
|
||||
save.import.invalid = [accent]Toto uložení není v pořádku![]
|
||||
save.import.fail = [crimson]Nepodařilo se importovat uložení hry: [accent]{0}[]
|
||||
save.export.fail = [crimson]Nepodařilo se exportovat uložení hry: [accent]{0}[]
|
||||
save.import.fail = [scarlet]Nepodařilo se importovat uložení hry: [accent]{0}[]
|
||||
save.export.fail = [scarlet]Nepodařilo se exportovat uložení hry: [accent]{0}[]
|
||||
save.import = Importovat uložení hry
|
||||
save.newslot = Uložit hru:
|
||||
save.rename = Přejmenovat
|
||||
@@ -340,6 +340,12 @@ waves.load = Načíst ze schránky
|
||||
waves.invalid = Neplatné vlny ve schránce.
|
||||
waves.copied = Vlny byly zkopírovány.
|
||||
waves.none = Žádní nepřátelé nebyli definováni.\nVlny s prázdným rozložením budou automaticky upraveny na výchozí rozložení.
|
||||
|
||||
#tyto jsou záměrně malými písmeny
|
||||
wavemode.counts = počty
|
||||
wavemode.totals = součty
|
||||
wavemode.health = zdraví
|
||||
|
||||
editor.default = [lightgray]<Výchozí>[]
|
||||
details = Podrobnosti...
|
||||
edit = Upravit...
|
||||
@@ -379,7 +385,7 @@ editor.exportimage = Exportovat obrázek terénu
|
||||
editor.exportimage.description = Exportovat obrázek mapy do souboru
|
||||
editor.loadimage = Importovat terén
|
||||
editor.saveimage = Exportovat terén
|
||||
editor.unsaved = [scarlet]Máš neuložené změny![]\nPřesto chceš odejít z editoru? Změny budou ztraceny.
|
||||
editor.unsaved = Opravdu chceš odejít z editoru?\n[scarlet]Neuložené změny budou ztraceny.[]
|
||||
editor.resizemap = Změnit velikost mapy
|
||||
editor.mapname = Jméno mapy:
|
||||
editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.[]
|
||||
@@ -459,11 +465,13 @@ locked = Zamčeno
|
||||
complete = [lightgray]Dokončeno:
|
||||
requirement.wave = Dosáhni vlny {0} na mapě {1}
|
||||
requirement.core = Znič nepřátelské jádro na mapě {0}
|
||||
requirement.unlock = Odemknuto {0}
|
||||
requirement.research = Vynalezeno {0}
|
||||
requirement.capture = Polapeno {0}
|
||||
resume = Zpět do mapy:\n[lightgray]{0}[]
|
||||
bestwave = [lightgray]Nejvyšší vlna: {0}
|
||||
launch = Vyslat do této mapy Tvé jádro
|
||||
launch.text = Launch
|
||||
#TODO fix/remove this
|
||||
launch = < VYSLAT >
|
||||
launch.text = Vyslat
|
||||
launch.title = Vyslání bylo úspěšné
|
||||
launch.next = [lightgray]další možnost bude až ve vlně {0}[]
|
||||
launch.unable2 = [scarlet]Není možno se vyslat.[]
|
||||
@@ -471,8 +479,9 @@ launch.confirm = Toto vyšle veškeré suroviny ve Tvém jádře zpět.\nJiž se
|
||||
launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až po několika dalších vlnách.
|
||||
uncover = Odkrýt mapu
|
||||
configure = Přizpůsobit vybavení
|
||||
loadout = Loadout
|
||||
resources = Resources
|
||||
#TODO
|
||||
loadout = Načtení
|
||||
resources = Zdroje
|
||||
bannedblocks = Zakázané bloky
|
||||
addall = Přidat vše
|
||||
configure.invalid = Hodnota musí být číslo mezi 0 a {0}.
|
||||
@@ -485,7 +494,7 @@ zone.objective.attack = Znič nepřátelské jádro
|
||||
add = Přidat...
|
||||
boss.health = Životy Strážce
|
||||
|
||||
connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0}[]
|
||||
connectfail = [scarlet]Nepovedlo se připojení k serveru:\n\n[accent]{0}[]
|
||||
error.unreachable = Server je nedostupný.\nJe IP adresa napsaná správně (XXX.XXX.XXX.XXX)?
|
||||
error.invalidaddress = Neplatná IP adresa.
|
||||
error.timedout = Čas pro spojení se serverem vypršel!\nUjisti se, že IP adresa je napsaná správně. Zkus také zjistit, zda má hostitel správně nastavené přesměrování portů.
|
||||
@@ -496,6 +505,7 @@ error.io = Vstupně/výstupní (I/O) chyba sítě.
|
||||
error.any = Ueznámá chyba sítě.
|
||||
error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje.
|
||||
|
||||
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
|
||||
sector.groundZero.name = Základní tábor
|
||||
sector.craters.name = Krátery
|
||||
sector.frozenForest.name = Zamrzlý les
|
||||
@@ -508,6 +518,10 @@ sector.tarFields.name = Dehtová pole
|
||||
sector.saltFlats.name = Solné nížiny
|
||||
sector.fungalPass.name = Plísňový průsmyk
|
||||
|
||||
#unused
|
||||
#sector.impact0078.name = Impact 0078
|
||||
#sector.crags.name = Crags
|
||||
|
||||
sector.groundZero.description = Optimální místo, kde znovu začít. Nízký výskyt nepřátel. Několik málo surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál.
|
||||
sector.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je však nemůže zadržet navěky.\n\nPusť se do práce za pomocí energie. Stav spalovací generátory. Nauč se, jak používat opravovací věže.
|
||||
sector.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází jen několik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jádro v jeho základně. Nenechej kámen na kameni.
|
||||
@@ -532,6 +546,8 @@ settings.graphics = Grafika
|
||||
settings.cleardata = Vymazat data hry...
|
||||
settings.clear.confirm = Jsi si jistý, že chceš vymazat Tvá data ve hře?\nTento krok je nevratný!
|
||||
settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna Tvá data ve hře, včetně uložení hry, map, odemknutého postupu v kampani a nastavení ovládání.\nJakmile stiskneš "OK", všechna data se vymažou a hra se automaticky ukončí.
|
||||
settings.save.clear.confirm = Opravdu chceš smazat všechna Tvá uložení hry?
|
||||
settings.save.clear = Smazat všechna Tvá uložení hry
|
||||
paused = [accent]< Pozastaveno >[]
|
||||
clear = Vyčistit
|
||||
banned = [scarlet]Zakázán[]
|
||||
@@ -539,7 +555,7 @@ unplaceable.sectorcaptured = [scarlet]Vyžaduje polapený sektor[]
|
||||
yes = Ano
|
||||
no = Ne
|
||||
info.title = Informace
|
||||
error.title = [crimson]Objevila se chyba[]
|
||||
error.title = [scarlet]Objevila se chyba[]
|
||||
error.crashtitle = Objevila se chyba
|
||||
unit.nobuild = [scarlet]Jednotka nemůže stavět
|
||||
blocks.input = Vstup
|
||||
@@ -574,6 +590,7 @@ blocks.boosteffect = Účinek posílení
|
||||
blocks.maxunits = Nejvýše aktivních jednotek
|
||||
blocks.health = Životy
|
||||
blocks.buildtime = Čas stavby
|
||||
blocks.maxconsecutive = Nejvýše po sobě
|
||||
blocks.buildcost = Cena stavby
|
||||
blocks.inaccuracy = Nepřesnost
|
||||
blocks.shots = Střely
|
||||
@@ -581,8 +598,8 @@ blocks.reload = Střel za 1s
|
||||
blocks.ammo = Střelivo
|
||||
|
||||
bar.drilltierreq = Je vyžadován lepší vrt
|
||||
bar.noresources = Missing Resources
|
||||
bar.corereq = Core Base Required
|
||||
bar.noresources = Chybějí zdroje
|
||||
bar.corereq = Je vyžadováno základní jádro
|
||||
bar.drillspeed = Rychlost vrtu: {0}/s
|
||||
bar.pumpspeed = Rychlost pumpy: {0}/s
|
||||
bar.efficiency = Účinnost: {0}%
|
||||
@@ -593,7 +610,7 @@ bar.poweroutput = Výstup energie: {0}
|
||||
bar.items = Předměty: {0}
|
||||
bar.capacity = Kapacita: {0}
|
||||
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][[jednotka je vypnuta]
|
||||
bar.liquid = Chlazení
|
||||
bar.heat = Teplo
|
||||
bar.power = Energie
|
||||
@@ -625,8 +642,9 @@ unit.persecond = /s
|
||||
unit.timesspeed = x větší rychlost
|
||||
unit.percent = %
|
||||
unit.items = předměty
|
||||
unit.thousands = t
|
||||
unit.millions = m
|
||||
unit.thousands = tis
|
||||
unit.millions = mio
|
||||
unit.billions = mld
|
||||
category.general = Všeobecné
|
||||
category.power = Energie
|
||||
category.liquids = Kapaliny
|
||||
@@ -679,7 +697,7 @@ setting.blockselectkeys.name = Ukázat klávesy při práci s blokem
|
||||
setting.vsync.name = Vertikální synchronizace
|
||||
setting.pixelate.name = Rozpixlovat
|
||||
setting.minimap.name = Ukázat mapičku
|
||||
setting.coreitems.name = Display Core Items (WIP)
|
||||
setting.coreitems.name = Ukázat položky jádra (WIP)
|
||||
setting.position.name = Ukázat pozici hráče
|
||||
setting.musicvol.name = Hlasitost hudby
|
||||
setting.atmosphere.name = Ukázat atmosféru planety
|
||||
@@ -705,7 +723,7 @@ keybinds.mobile = [scarlet]Většina kláves nefunguje v mobilní verzi hry. Je
|
||||
category.general.name = Všeobecné
|
||||
category.view.name = Pohled
|
||||
category.multiplayer.name = Hra více hráčů
|
||||
category.blocks.name = Block Select
|
||||
category.blocks.name = Výběr bloků
|
||||
command.attack = Útok
|
||||
command.rally = Shromáždění
|
||||
command.retreat = Ústup
|
||||
@@ -846,33 +864,33 @@ liquid.heatcapacity = [lightgray]Teplotní kapacita: {0}[]
|
||||
liquid.viscosity = [lightgray]Viskozita: {0}[]
|
||||
liquid.temperature = [lightgray]Teplota: {0}[]
|
||||
|
||||
unit.dagger.name = Mech Dýka
|
||||
unit.mace.name = Mace
|
||||
unit.fortress.name = Mech Pevnost
|
||||
unit.dagger.name = Dýka
|
||||
unit.mace.name = Palcát
|
||||
unit.fortress.name = Pevnost
|
||||
unit.nova.name = Nova
|
||||
unit.pulsar.name = Pulsar
|
||||
unit.quasar.name = Quasar
|
||||
unit.crawler.name = Mech Slídil
|
||||
unit.pulsar.name = Pulzar
|
||||
unit.quasar.name = Kvasar
|
||||
unit.crawler.name = Slídil
|
||||
unit.atrax.name = Atrax
|
||||
unit.spiroct.name = Spiroct
|
||||
unit.arkyid.name = Arkyid
|
||||
unit.flare.name = Flare
|
||||
unit.horizon.name = Horizon
|
||||
unit.zenith.name = Zenith
|
||||
unit.flare.name = Záře
|
||||
unit.horizon.name = Horizont
|
||||
unit.zenith.name = Zenit
|
||||
unit.antumbra.name = Antumbra
|
||||
unit.eclipse.name = Eclipse
|
||||
unit.eclipse.name = Zatmění
|
||||
unit.mono.name = Mono
|
||||
unit.poly.name = Poly
|
||||
unit.mega.name = Mega
|
||||
unit.risso.name = Risso
|
||||
unit.minke.name = Minke
|
||||
unit.bryde.name = Bryde
|
||||
unit.alpha.name = Alpha
|
||||
unit.alpha.name = Alfa
|
||||
unit.beta.name = Beta
|
||||
unit.gamma.name = Gamma
|
||||
unit.gamma.name = Gama
|
||||
|
||||
block.parallax.name = Parallax
|
||||
block.cliff.name = Cliff
|
||||
block.parallax.name = Paralaxa
|
||||
block.cliff.name = Útes
|
||||
block.sand-boulder.name = Pískovec
|
||||
block.grass.name = Tráva
|
||||
block.slag.name = Slag
|
||||
@@ -1061,12 +1079,19 @@ block.naval-factory.name = Námořní továrna
|
||||
block.additive-reconstructor.name = Přídavný přestavbovač
|
||||
block.multiplicative-reconstructor.name = Násobný přestavbovač
|
||||
block.exponential-reconstructor.name = Exponenciální přestavbovač
|
||||
block.tetrative-reconstructor.name = Umocňující přestavbovač
|
||||
block.payload-conveyor.name = Hromadný dopravník
|
||||
block.tetrative-reconstructor.name = Mocninný přestavbovač
|
||||
block.payload-conveyor.name = Dopravník nákladu
|
||||
block.payload-router.name = Směřovač nákladu
|
||||
block.disassembler.name = Rozebírač
|
||||
block.silicon-crucible.name = Křemíková nádoba
|
||||
block.large-overdrive-projector.name = Velký urychlující projektor
|
||||
block.silicon-crucible.name = Tavicí tyglík pro křemík
|
||||
block.overdrive-dome.name = Velká urychlující kupole
|
||||
|
||||
block.switch.name = Přepínač
|
||||
block.micro-processor.name = Mikroprocesor
|
||||
block.logic-processor.name = Logický procesor
|
||||
block.logic-display.name = Zobrazovač logiky
|
||||
block.memory-cell.name = Paměťová buňka
|
||||
|
||||
team.blue.name = modrý
|
||||
team.crux.name = červený
|
||||
team.sharded.name = oranžový
|
||||
@@ -1162,7 +1187,7 @@ block.force-projector.description = Vytvoří okolo sebe šestihrané silové po
|
||||
block.shock-mine.description = Působí poškození nepřátelským jednotkám při sešlápnutí. Takřka neviditelné pro nepřátele (a i v nabídce bloků :) ).
|
||||
block.conveyor.description = Základní blok pro přepravu předmětů. Unáší předměty kupředu a automaticky plní vhodná úložiště (budovy, kontejnery, jádro), které po cestě potká. Lze jej otáčet dle potřeby.
|
||||
block.titanium-conveyor.description = Pokročilý blok pro přepravu předmětů. Přenáší předměty rychleji, než základní dopravník.
|
||||
block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu.
|
||||
block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu.\nPro špičkový průchod vyžaduje několik nakládacích a vykládacích míst.
|
||||
block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. Užitečný při situaci, kdy dva rozdílné dopravníky dopravují dva rozdílné materiály přes jedno pole.
|
||||
block.bridge-conveyor.description = Pokročilý blok pro přepravu předmětů. Dovoluje transport předmětů až přes tři pole, a to přes jakýkoliv terén nebo budovu.
|
||||
block.phase-conveyor.description = Pokročilý blok pro přepravu předmětů. Využívá energii k teleportaci předmětů na vzdálenost několika dlaždic mezi jiným propojeným fázovým dopravníkem.
|
||||
@@ -1230,3 +1255,4 @@ block.spectre.description = Velká střílna s kanónem s dvěma hlavněmi. Stř
|
||||
block.meltdown.description = Masivní laserový kanón. Nabije se a pak pálí nepřetržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení.
|
||||
block.repair-point.description = Nepřetržitě léčí nejbližší poškozenou jednotku v poli své působnosti.
|
||||
block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted.
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ mod.import = 모드 가져오기
|
||||
mod.import.file = 파일 가져오기
|
||||
mod.import.github = Github 에서 모드 가져오기
|
||||
mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다!
|
||||
mod.item.remove = 이 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요.
|
||||
mod.item.remove = 이 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요.
|
||||
mod.remove.confirm = 이 모드가 삭제될 것입니다.
|
||||
mod.author = [lightgray]제작자:[] {0}
|
||||
mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0}
|
||||
@@ -541,7 +541,7 @@ no = 아니오
|
||||
info.title = 정보
|
||||
error.title = [scarlet]오류가 발생했습니다.
|
||||
error.crashtitle = 오류가 발생했습니다
|
||||
unit.nobuild = [scarlet]유닛을 만들 수 없습니다
|
||||
unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다.
|
||||
blocks.input = 입력
|
||||
blocks.output = 출력
|
||||
blocks.booster = 가속
|
||||
@@ -554,7 +554,7 @@ blocks.damage = 공격력
|
||||
blocks.targetsair = 공중 공격
|
||||
blocks.targetsground = 지상 공격
|
||||
blocks.itemsmoved = 이동 속도
|
||||
blocks.launchtime = 출격 사이의 시간
|
||||
blocks.launchtime = 출격 간격
|
||||
blocks.shootrange = 사거리
|
||||
blocks.size = 크기
|
||||
blocks.liquidcapacity = 액체 용량
|
||||
@@ -580,7 +580,7 @@ blocks.shots = 공격 속도
|
||||
blocks.reload = 발/초
|
||||
blocks.ammo = 탄약
|
||||
|
||||
bar.drilltierreq = 더 좋은 드릴이 요구됨
|
||||
bar.drilltierreq = 더 좋은 드릴이 필요
|
||||
bar.noresources = 자원 부족
|
||||
bar.corereq = 코어 기지 필요
|
||||
bar.drillspeed = 드릴 속도: {0}/s
|
||||
@@ -593,7 +593,7 @@ bar.poweroutput = 전력 출력: {0}
|
||||
bar.items = 자원량: {0}
|
||||
bar.capacity = 용량: {0}
|
||||
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][[장비를 정지합니다]
|
||||
bar.liquid = 액체
|
||||
bar.heat = 발열
|
||||
bar.power = 전력
|
||||
@@ -607,7 +607,7 @@ bullet.incendiary = [stat]방화
|
||||
bullet.homing = [stat]유도
|
||||
bullet.shock = [stat]전격
|
||||
bullet.frag = [stat]파편
|
||||
bullet.knockback = [stat]{0}[lightgray] 밀어내기
|
||||
bullet.knockback = [stat]{0}[lightgray] 밀침
|
||||
bullet.freezing = [stat]빙결
|
||||
bullet.tarred = [stat]타르
|
||||
bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수
|
||||
@@ -630,10 +630,10 @@ unit.millions = 백만
|
||||
category.general = 일반
|
||||
category.power = 전력
|
||||
category.liquids = 액체
|
||||
category.items = 아이템
|
||||
category.items = 자원
|
||||
category.crafting = 입력/출력
|
||||
category.shooting = 사격
|
||||
category.optional = 보조 아이템
|
||||
category.optional = 보조 자원
|
||||
setting.landscape.name = 가로화면 잠금
|
||||
setting.shadows.name = 그림자
|
||||
setting.blockreplace.name = 자동 블록 제안
|
||||
@@ -679,7 +679,7 @@ setting.blockselectkeys.name = 블록 선택 키 표시
|
||||
setting.vsync.name = 수직 동기화
|
||||
setting.pixelate.name = 픽셀화
|
||||
setting.minimap.name = 미니맵 표시
|
||||
setting.coreitems.name = 코어에 있는 아이템 표시
|
||||
setting.coreitems.name = 코어에 있는 자원 표시
|
||||
setting.position.name = 플레이어 위치 표시
|
||||
setting.musicvol.name = 음악 크기
|
||||
setting.atmosphere.name = 행성 배경화면 표시
|
||||
@@ -699,7 +699,7 @@ public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모
|
||||
public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다.
|
||||
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다...
|
||||
uiscale.cancel = 취소 후 나가기
|
||||
setting.bloom.name = 블룸
|
||||
setting.bloom.name = 화려한 효과
|
||||
keybind.title = 조작키 설정
|
||||
keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다.
|
||||
category.general.name = 일반
|
||||
@@ -803,10 +803,10 @@ rules.title.unit = 유닛
|
||||
rules.title.experimental = 실험적인 기능
|
||||
rules.title.environment = 환경
|
||||
rules.lighting = 조명
|
||||
rules.ambientlight = 주변 조명
|
||||
rules.ambientlight = 자연 조명
|
||||
rules.solarpowermultiplier = 태양광 발전 배수
|
||||
|
||||
content.item.name = 아이템
|
||||
content.item.name = 자원
|
||||
content.liquid.name = 액체
|
||||
content.unit.name = 유닛
|
||||
content.block.name = 블록
|
||||
@@ -820,58 +820,59 @@ item.silicon.name = 실리콘
|
||||
item.plastanium.name = 플라스터늄
|
||||
item.phase-fabric.name = 메타
|
||||
item.surge-alloy.name = 설금
|
||||
item.spore-pod.name = 포자 포드
|
||||
item.spore-pod.name = 포자 버섯
|
||||
item.sand.name = 모래
|
||||
item.blast-compound.name = 화합물
|
||||
item.blast-compound.name = 폭발물
|
||||
item.pyratite.name = 파이라타이트
|
||||
item.metaglass.name = 금속유리
|
||||
item.metaglass.name = 강화 유리
|
||||
item.scrap.name = 고철
|
||||
liquid.water.name = 물
|
||||
liquid.slag.name = 광재
|
||||
liquid.oil.name = 기름
|
||||
liquid.cryofluid.name = 냉각
|
||||
liquid.cryofluid.name = 냉각수
|
||||
item.explosiveness = [lightgray]폭발성: {0}
|
||||
item.flammability = [lightgray]인화성: {0}
|
||||
item.radioactivity = [lightgray]방사능: {0}
|
||||
unit.health = [lightgray]체력: {0}
|
||||
unit.speed = [lightgray]속도: {0}
|
||||
unit.weapon = [lightgray]무기: {0}
|
||||
unit.itemcapacity = [lightgray]아이템 수용량: {0}
|
||||
unit.itemcapacity = [lightgray]자원 수용량: {0}
|
||||
unit.minespeed = [lightgray]채광 속도: {0}%
|
||||
unit.minepower = [lightgray]채광 레벨: {0}
|
||||
unit.ability = [lightgray]능력: {0}
|
||||
unit.buildspeed = [lightgray]건설 속도: {0}%
|
||||
|
||||
liquid.heatcapacity = [lightgray]발열 용량: {0}
|
||||
liquid.heatcapacity = [lightgray]비열: {0}
|
||||
liquid.viscosity = [lightgray]점도: {0}
|
||||
liquid.temperature = [lightgray]온도: {0}
|
||||
|
||||
unit.dagger.name = Dagger
|
||||
unit.mace.name = Mace
|
||||
unit.fortress.name = Fortress
|
||||
unit.nova.name = Nova
|
||||
unit.pulsar.name = Pulsar
|
||||
unit.quasar.name = Quasar
|
||||
unit.crawler.name = Crawler
|
||||
unit.atrax.name = Atrax
|
||||
unit.spiroct.name = Spiroct
|
||||
unit.arkyid.name = Arkyid
|
||||
unit.flare.name = Flare
|
||||
unit.horizon.name = Horizon
|
||||
unit.zenith.name = Zenith
|
||||
unit.antumbra.name = Antumbra
|
||||
unit.eclipse.name = Eclipse
|
||||
unit.mono.name = Mono
|
||||
unit.poly.name = Poly
|
||||
unit.mega.name = Mega
|
||||
unit.risso.name = Risso
|
||||
unit.minke.name = Minke
|
||||
unit.bryde.name = Bryde
|
||||
unit.alpha.name = Alpha
|
||||
unit.beta.name = Beta
|
||||
unit.gamma.name = Gamma
|
||||
unit.dagger.name = 대거
|
||||
unit.mace.name = 메이스
|
||||
unit.fortress.name = 포트리스
|
||||
unit.nova.name = 노바
|
||||
unit.pulsar.name = 펄서
|
||||
unit.quasar.name = 퀘이사
|
||||
unit.crawler.name = 크롤러
|
||||
unit.atrax.name = 아트락스
|
||||
unit.spiroct.name = 스피록트
|
||||
unit.arkyid.name = 아키드
|
||||
unit.toxipod.name = 독소포드
|
||||
unit.flare.name = 플레어
|
||||
unit.horizon.name = 호라이즌
|
||||
unit.zenith.name = 제니스
|
||||
unit.antumbra.name = 안텀브라
|
||||
unit.eclipse.name = 이클립스
|
||||
unit.mono.name = 모노
|
||||
unit.poly.name = 폴리
|
||||
unit.mega.name = 메가
|
||||
unit.risso.name = 리소
|
||||
unit.minke.name = 민케
|
||||
unit.bryde.name = 브리드
|
||||
unit.alpha.name = 알파
|
||||
unit.beta.name = 베타
|
||||
unit.gamma.name = 감마
|
||||
|
||||
block.parallax.name = Parallax
|
||||
block.parallax.name = 시차
|
||||
block.cliff.name = 낭떠러지
|
||||
block.sand-boulder.name = 사암
|
||||
block.grass.name = 잔디
|
||||
@@ -956,7 +957,7 @@ block.phase-wall-large.name = 대형 메타 벽
|
||||
block.thorium-wall.name = 토륨 벽
|
||||
block.thorium-wall-large.name = 대형 토륨 벽
|
||||
block.door.name = 문
|
||||
block.door-large.name = 대형문
|
||||
block.door-large.name = 대형 문
|
||||
block.duo.name = 듀오
|
||||
block.scorch.name = 스코치
|
||||
block.scatter.name = 스캐터
|
||||
@@ -966,7 +967,7 @@ block.conveyor.name = 컨베이어
|
||||
block.titanium-conveyor.name = 티타늄 컨베이어
|
||||
block.plastanium-conveyor.name = 플라스터늄 컨베이어
|
||||
block.armored-conveyor.name = 장갑 컨베이어
|
||||
block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 아이템을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 아이템을 받을 수 없습니다.
|
||||
block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 자원을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 자원을 받을 수 없습니다.
|
||||
block.junction.name = 교차기
|
||||
block.router.name = 분배기
|
||||
block.distributor.name = 대형 분배기
|
||||
@@ -975,12 +976,12 @@ block.inverted-sorter.name = 반전 필터
|
||||
block.message.name = 메모 블록
|
||||
block.illuminator.name = 조명
|
||||
block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다.
|
||||
block.overflow-gate.name = 오버플로 게이트
|
||||
block.underflow-gate.name = 언더플로 게이트
|
||||
block.overflow-gate.name = 포화 필터
|
||||
block.underflow-gate.name = 불포화 필터
|
||||
block.silicon-smelter.name = 실리콘 제련소
|
||||
block.phase-weaver.name = 메타 합성기
|
||||
block.pulverizer.name = 분쇄기
|
||||
block.cryofluidmixer.name = 냉각 유체 제조기
|
||||
block.cryofluidmixer.name = 냉각수 제조기
|
||||
block.melter.name = 융해기
|
||||
block.incinerator.name = 소각로
|
||||
block.spore-press.name = 포자 압축기
|
||||
@@ -995,12 +996,12 @@ block.battery-large.name = 대형 배터리
|
||||
block.combustion-generator.name = 연소 발전기
|
||||
block.steam-generator.name = 증기 발전기
|
||||
block.differential-generator.name = 차동 발잔기
|
||||
block.impact-reactor.name = 임팩트 원자로
|
||||
block.impact-reactor.name = 핵융합 원자로
|
||||
block.mechanical-drill.name = 기계식 드릴
|
||||
block.pneumatic-drill.name = 공압 드릴
|
||||
block.laser-drill.name = 레이저 드릴
|
||||
block.water-extractor.name = 물 추출기
|
||||
block.cultivator.name = 제초기
|
||||
block.cultivator.name = 온실
|
||||
block.conduit.name = 파이프
|
||||
block.mechanical-pump.name = 기계식 펌프
|
||||
block.item-source.name = 자원 공급기
|
||||
@@ -1018,7 +1019,7 @@ block.ripple.name = 립플
|
||||
block.phase-conveyor.name = 메타 컨베이어
|
||||
block.bridge-conveyor.name = 다리 컨베이어
|
||||
block.plastanium-compressor.name = 플라스터늄 압축기
|
||||
block.pyratite-mixer.name = 라타이트 혼합기
|
||||
block.pyratite-mixer.name = 파이라타이트 혼합기
|
||||
block.blast-mixer.name = 화합물 혼합기
|
||||
block.solar-panel.name = 태양 전지판
|
||||
block.solar-panel-large.name = 대형 태양 전지판
|
||||
@@ -1039,7 +1040,7 @@ block.thermal-pump.name = 화력 펌프
|
||||
block.thermal-generator.name = 화력 생성기
|
||||
block.alloy-smelter.name = 설금 제련소
|
||||
block.mender.name = 멘더
|
||||
block.mend-projector.name = 대형 수리 프로젝터
|
||||
block.mend-projector.name = 수리 프로젝터
|
||||
block.surge-wall.name = 설금 벽
|
||||
block.surge-wall-large.name = 큰 설금 벽
|
||||
block.cyclone.name = 사이클론
|
||||
@@ -1057,7 +1058,7 @@ block.launch-pad-large.name = 대형 출격 패드
|
||||
block.segment.name = 세그먼트
|
||||
block.ground-factory.name = 지상 공장
|
||||
block.air-factory.name = 항공 공장
|
||||
block.naval-factory.name = 해군 공장
|
||||
block.naval-factory.name = 해양 공장
|
||||
block.additive-reconstructor.name = 첨가물 재구성기
|
||||
block.multiplicative-reconstructor.name = 다중 재구성기
|
||||
block.exponential-reconstructor.name = 지수 재구성기
|
||||
@@ -1081,18 +1082,18 @@ tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니
|
||||
tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다.
|
||||
tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다.
|
||||
tutorial.blockinfo = 각 블록마다 다른 특성을 가지고 있으며, 각 드릴은 특정 광석만 채굴할 수 있습니다.\n블록의 정보와 특성을 확인하려면, [accent]건설 메뉴에서 "?" 버튼을 선택하세요.[]\n\n[accent]지금 기계식 드릴의 정보를 보세요.
|
||||
tutorial.conveyor = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 아이템을 코어로 넣으세요.
|
||||
tutorial.conveyor.mobile = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 아이템을 코어에 넣으세요.
|
||||
tutorial.turret = 아이템이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 아이템이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 아이템(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요.
|
||||
tutorial.conveyor = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 자원을 코어로 넣으세요.
|
||||
tutorial.conveyor.mobile = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 자원을 코어에 넣으세요.
|
||||
tutorial.turret = 자원이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 자원이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 자원(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요.
|
||||
tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 0/1
|
||||
tutorial.pause = 전투 중에는 게임을 [accent]일시정지[] 할 수 있습니다.\n일시정지 되는 동안 건설을 대기시킬 수 있습니다.\n\n[accent]일시정지하려면 스페이스 키를 누르세요.
|
||||
tutorial.pause.mobile = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지하려면 왼쪽 상단에 있는 이 버튼을 누르세요.
|
||||
tutorial.unpause = 이제 스페이스를 누르면 일시정지가 해제됩니다.
|
||||
tutorial.unpause.mobile = 이제 다시 누르면 일시정지가 해제됩니다.
|
||||
tutorial.breaking = 블록은 종종 파괴 되어야 합니다.\n선택한 모든 블록을 파괴하려면 [accent]마우스 오른쪽 클릭을 길게 누르세요[].\n\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각벽을 파괴하세요.
|
||||
tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블럭을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요.
|
||||
tutorial.withdraw = 경우에 따라 블록에서 아이템을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]아이템이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]아이템[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요.
|
||||
tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 아이템을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[].
|
||||
tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블록을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요.
|
||||
tutorial.withdraw = 경우에 따라 블록에서 자원을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]자원이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]자원[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요.
|
||||
tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 자원을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[].
|
||||
tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요.
|
||||
tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요.
|
||||
tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요.
|
||||
@@ -1110,15 +1111,15 @@ item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치
|
||||
item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다.
|
||||
item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.
|
||||
item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금.
|
||||
item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 합성 포자 포드. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다.
|
||||
item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 포드 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다.
|
||||
item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다.
|
||||
item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다.
|
||||
item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질.
|
||||
liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다.
|
||||
liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다.
|
||||
liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다.
|
||||
liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다.
|
||||
|
||||
block.message.description = 메세지를 남깁니다. 같은 팀 간의 소통에 사용됩니다.
|
||||
block.message.description = 메시지를 남깁니다. 같은 팀 간의 소통에 사용됩니다.
|
||||
block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다.
|
||||
block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다.
|
||||
block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다.
|
||||
@@ -1131,14 +1132,14 @@ block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분
|
||||
block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다.
|
||||
block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다.
|
||||
block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다.
|
||||
block.spore-press.description = 포자 포드를 극압으로 압축하여 기름을 합성합니다.
|
||||
block.spore-press.description = 포자 버섯을 극압으로 압축하여 기름을 합성합니다.
|
||||
block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다.
|
||||
block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다.
|
||||
block.incinerator.description = 넘치는 아이템이나 액체를 증발시킵니다.
|
||||
block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다.
|
||||
block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용.
|
||||
block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용.
|
||||
block.item-source.description = 아이템을 무한대로 출력합니다. 샌드박스 전용.
|
||||
block.item-void.description = 모든 아이템을 파괴합니다. 샌드박스 전용.
|
||||
block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용.
|
||||
block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용.
|
||||
block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용.
|
||||
block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용.
|
||||
block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다.
|
||||
@@ -1162,17 +1163,17 @@ block.force-projector.description = 건물과 내부의 유닛을 공격으로
|
||||
block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다.
|
||||
block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식.
|
||||
block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다.
|
||||
block.plastanium-conveyor.description = 아이템을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 아이템을 받고 앞쪽에 세 방향으로 내보냅니다.
|
||||
block.plastanium-conveyor.description = 자원을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 자원을 받고 앞쪽에 세 방향으로 내보냅니다.
|
||||
block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다.
|
||||
block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다.
|
||||
block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 아이템을 순간이동 시킵니다.
|
||||
block.sorter.description = 아이템을 정렬합니다. 아이템이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다.
|
||||
block.inverted-sorter.description = 표준 분류기와 같은 아이템을 처리하지만, 대신 선택된 아이템을 측면으로 출력합니다.
|
||||
block.router.description = 아이템을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오.
|
||||
block.distributor.description = 고급 분배기. 아이템을 최대 7개의 다른 방향으로 동일하게 분할합니다.
|
||||
block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 자원을 순간이동 시킵니다.
|
||||
block.sorter.description = 자원을 정렬합니다. 자원이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다.
|
||||
block.inverted-sorter.description = 표준 분류기와 같은 자원을 처리하지만, 대신 선택된 자원을 측면으로 출력합니다.
|
||||
block.router.description = 자원을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오.
|
||||
block.distributor.description = 고급 분배기. 자원을 최대 7개의 다른 방향으로 동일하게 분할합니다.
|
||||
block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다.
|
||||
block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다.
|
||||
block.mass-driver.description = 최고의 아이템 운송 블록. 여러 아이템을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다.
|
||||
block.mass-driver.description = 최고의 자원 운송 블록. 여러 자원을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다.
|
||||
block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다.
|
||||
block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다.
|
||||
block.thermal-pump.description = 가장 강력한 펌프.
|
||||
@@ -1199,20 +1200,20 @@ block.solar-panel.description = 태양으로부터 소량의 전력을 생성합
|
||||
block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전.
|
||||
block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다.
|
||||
block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다.
|
||||
block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 아이템을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다.
|
||||
block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다.
|
||||
block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다.
|
||||
block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능.
|
||||
block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다.
|
||||
block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다.
|
||||
block.cultivator.description = 대기 중의 작은 농도의 포자를 배양 가능한 포드로 배양합니다.
|
||||
block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 버섯으로 배양합니다.
|
||||
block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다.
|
||||
block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오.
|
||||
block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다.
|
||||
block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다.
|
||||
block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 아이템을 빼낼 수 있습니다.
|
||||
block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 아이템을 빼낼 수 있습니다.
|
||||
block.unloader.description = 근처의 비 수송 블록에서 아이템을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다.
|
||||
block.launch-pad.description = 코어 출격 없이도 아이템을 묶어 출격시킬 수 있습니다.
|
||||
block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다.
|
||||
block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다.
|
||||
block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다.
|
||||
block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다.
|
||||
block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다.
|
||||
block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다.
|
||||
block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,7 @@ gameover = Игра окончена
|
||||
gameover.pvp = [accent]{0}[] команда победила!
|
||||
highscore = [accent]Новый рекорд!
|
||||
copied = Скопировано.
|
||||
indevpopup = [accent]v6[] находится на стадии [accent]pre-alpha[].\n[lightgray]Это означает следующее:[]\n- Отсутствие контента.\n- Большинство [scarlet]ИИ единиц[] не работает.\n- Множество единиц [scarlet]отсутствует[] или не готово.\n- Кампания не завершена.\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]Github[].
|
||||
indevpopup = [accent]v6[] находится на стадии [accent]alpha[].\n[lightgray]Это означает следующее:[]\n- Отсутствие контента.\n- Большинство [scarlet]ИИ единиц[] не работает.\n- Множество единиц не готово.\n- Кампания не завершена.\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]Github[].
|
||||
|
||||
load.sound = Звуки
|
||||
load.map = Карты
|
||||
@@ -114,6 +114,7 @@ mod.disable = Выкл.
|
||||
mod.content = Содержимое:
|
||||
mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется.
|
||||
mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0}
|
||||
mod.outdated = [scarlet]Не совместим с V6 (нет "min-game-version: 105")
|
||||
mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0}
|
||||
mod.erroredcontent = [scarlet]Ошибки содержимого
|
||||
mod.errors = Ошибки были вызваны загружаемым содержимым.
|
||||
@@ -126,9 +127,9 @@ mod.import = Импортировать модификацию
|
||||
mod.import.file = Импортировать файл
|
||||
mod.import.github = Импортировать мод с GitHub
|
||||
mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника!
|
||||
mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию.
|
||||
mod.item.remove = Этот предмет является частью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите саму модификацию.
|
||||
mod.remove.confirm = Эта модификация будет удалена.
|
||||
mod.author = [lightgray]Автор:[] {0}
|
||||
mod.author = [lightgray]Автор(ы):[] {0}
|
||||
mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0}
|
||||
mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова.
|
||||
mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации.
|
||||
@@ -137,6 +138,8 @@ mod.scripts.disable = Ваше устройство не поддерживае
|
||||
about.button = Об игре
|
||||
name = Имя:
|
||||
noname = Для начала, придумайте[accent] себе имя[].
|
||||
planetmap = Карта планеты
|
||||
launchcore = Запуск ядра
|
||||
filename = Имя файла:
|
||||
unlocked = Новый контент разблокирован!
|
||||
completed = [accent]Завершено
|
||||
@@ -171,7 +174,7 @@ host.info = Кнопка [accent]Открыть сервер[] запускае
|
||||
join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[].
|
||||
hostserver = Запустить многопользовательский сервер
|
||||
invitefriends = Пригласить друзей
|
||||
hostserver.mobile = Запустить\nсервер
|
||||
hostserver.mobile = Запустить сервер
|
||||
host = Открыть сервер
|
||||
hosting = [accent]Открытие сервера…
|
||||
hosts.refresh = Обновить
|
||||
@@ -506,7 +509,14 @@ error.io = Сетевая ошибка ввода-вывода.
|
||||
error.any = Неизвестная сетевая ошибка.
|
||||
error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его.
|
||||
|
||||
sectors.unexplored = [lightgray]Не исследовано
|
||||
sectors.resources = Ресурсы:
|
||||
sectors.production = Производит:
|
||||
sectors.stored = Накоплено:
|
||||
sectors.resume = Продолжить
|
||||
sectors.launch = Высадка
|
||||
|
||||
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
|
||||
sector.groundZero.name = Отправная точка
|
||||
sector.craters.name = Кратеры
|
||||
sector.frozenForest.name = Ледяной лес
|
||||
@@ -574,8 +584,11 @@ blocks.itemsmoved = Скорость перемещения
|
||||
blocks.launchtime = Интервал запусков
|
||||
blocks.shootrange = Радиус действия
|
||||
blocks.size = Размер
|
||||
blocks.displaysize = Размер дисплея
|
||||
blocks.liquidcapacity = Вместимость жидкости
|
||||
blocks.powerrange = Дальность передачи энергии
|
||||
blocks.linkrange = Дальность связи
|
||||
blocks.instructions = Инструкции
|
||||
blocks.powerconnections = Количество соединений
|
||||
blocks.poweruse = Потребляет энергии
|
||||
blocks.powerdamage = Энергия/урон
|
||||
@@ -591,6 +604,7 @@ blocks.boosteffect = Ускоряющий эффект
|
||||
blocks.maxunits = Максимальное количество активных единиц
|
||||
blocks.health = Прочность
|
||||
blocks.buildtime = Время строительства
|
||||
blocks.maxconsecutive = Макс. последовательность
|
||||
blocks.buildcost = Стоимость строительства
|
||||
blocks.inaccuracy = Разброс
|
||||
blocks.shots = Выстрелы
|
||||
@@ -638,7 +652,9 @@ unit.liquidunits = жидкостных единиц
|
||||
unit.powerunits = энерг. единиц
|
||||
unit.degrees = град.
|
||||
unit.seconds = сек.
|
||||
unit.minutes = мин.
|
||||
unit.persecond = /сек
|
||||
unit.perminute = /мин
|
||||
unit.timesspeed = x скорость
|
||||
unit.percent = %
|
||||
unit.items = предметов
|
||||
@@ -727,6 +743,7 @@ category.blocks.name = Выбор блока
|
||||
command.attack = Атаковать
|
||||
command.rally = Точка сбора
|
||||
command.retreat = Отступить
|
||||
command.idle = Ждать
|
||||
placement.blockselectkeys = \n[lightgray]Клавиша: [{0},
|
||||
keybind.respawn.name = Возрождение в ядре
|
||||
keybind.control.name = Перехватить контроль над единицей
|
||||
@@ -739,6 +756,7 @@ keybind.toggle_block_status.name = Отображение статусов бл
|
||||
keybind.move_x.name = Движение по оси X
|
||||
keybind.move_y.name = Движение по оси Y
|
||||
keybind.mouse_move.name = Следовать за курсором
|
||||
keybind.pan.name = Панорамирование камеры
|
||||
keybind.boost.name = Полёт/Ускорение
|
||||
keybind.schematic_select.name = Выбрать область
|
||||
keybind.schematic_menu.name = Меню схем
|
||||
@@ -800,6 +818,7 @@ rules.reactorexplosions = Взрывы реакторов
|
||||
rules.wavetimer = Интервал волн
|
||||
rules.waves = Волны
|
||||
rules.attack = Режим атаки
|
||||
rules.buildai = Строительство ИИ
|
||||
rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда)
|
||||
rules.blockhealthmultiplier = Множитель здоровья блоков
|
||||
rules.blockdamagemultiplier = Множитель урона блоков
|
||||
@@ -821,8 +840,11 @@ rules.title.unit = Боевые единицы
|
||||
rules.title.experimental = Экспериментально
|
||||
rules.title.environment = Окружение
|
||||
rules.lighting = Освещение
|
||||
rules.fire = Огонь
|
||||
rules.explosions = Урон от взрывов блоков/единиц
|
||||
rules.ambientlight = Окружающий свет
|
||||
rules.solarpowermultiplier = Множитель солнечной энергии
|
||||
rules.weather = Погода
|
||||
|
||||
content.item.name = Предметы
|
||||
content.liquid.name = Жидкости
|
||||
@@ -867,13 +889,16 @@ liquid.temperature = [lightgray]Температура: {0}
|
||||
unit.dagger.name = Кинжал
|
||||
unit.mace.name = Булава
|
||||
unit.fortress.name = Крепость
|
||||
unit.scepter.name = Скипетр
|
||||
unit.reign.name = Власть
|
||||
unit.nova.name = Нова
|
||||
unit.pulsar.name = Пульсар
|
||||
unit.quasar.name = Квазар
|
||||
unit.crawler.name = Обходчик
|
||||
unit.crawler.name = Ползун
|
||||
unit.atrax.name = Атракс
|
||||
unit.spiroct.name = Спайрокт
|
||||
unit.arkyid.name = Аркид
|
||||
unit.toxopid.name = Токсопид
|
||||
unit.flare.name = Вспышка
|
||||
unit.horizon.name = Горизонт
|
||||
unit.zenith.name = Зенит
|
||||
@@ -889,27 +914,28 @@ unit.alpha.name = Альфа
|
||||
unit.beta.name = Бета
|
||||
unit.gamma.name = Гамма
|
||||
|
||||
block.resupply-point.name = Пункт снабжения
|
||||
block.parallax.name = Параллакс
|
||||
block.cliff.name = Скала
|
||||
block.sand-boulder.name = Песчаный валун
|
||||
block.grass.name = Трава
|
||||
block.slag.name = Шлак
|
||||
block.salt.name = Соль
|
||||
block.saltrocks.name = Соляные камни
|
||||
block.salt-wall.name = Соляная стена
|
||||
block.pebbles.name = Галька
|
||||
block.tendrils.name = Споровые усики
|
||||
block.sandrocks.name = Песчаные камни
|
||||
block.sand-wall.name = Песчаная стена
|
||||
block.spore-pine.name = Споровая сосна
|
||||
block.sporerocks.name = Споровые камни
|
||||
block.rock.name = Каменный валун
|
||||
block.snowrock.name = Заснеженный валун
|
||||
block.spore-wall.name = Споровая стена
|
||||
block.boulder.name = Каменный валун
|
||||
block.snow-boulder.name = Заснеженный валун
|
||||
block.snow-pine.name = Заснеженная сосна
|
||||
block.shale.name = Сланец
|
||||
block.shale-boulder.name = Сланцевый валун
|
||||
block.moss.name = Мох
|
||||
block.shrubs.name = Кусты
|
||||
block.spore-moss.name = Споровый мох
|
||||
block.shalerocks.name = Сланцевые камни
|
||||
block.shale-wall.name = Сланцевая стена
|
||||
block.scrap-wall.name = Стена из металлолома
|
||||
block.scrap-wall-large.name = Большая стена из металлолома
|
||||
block.scrap-wall-huge.name = Огромная стена из металлолома
|
||||
@@ -937,13 +963,16 @@ block.craters.name = Кратеры
|
||||
block.sand-water.name = Песок с водой
|
||||
block.darksand-water.name = Тёмный песок с водой
|
||||
block.char.name = Выжженная земля
|
||||
block.holostone.name = Голографический камень
|
||||
block.dacite.name = Дацит
|
||||
block.dacite-wall.name = Дацитовая стена
|
||||
block.ice-snow.name = Заснеженный лёд
|
||||
block.rocks.name = Камни
|
||||
block.icerocks.name = Ледяные камни
|
||||
block.snowrocks.name = Снежные камни
|
||||
block.dunerocks.name = Тёмные песчаные камни
|
||||
block.stone-wall.name = Каменная стена
|
||||
block.ice-wall.name = Ледяная стена
|
||||
block.snow-wall.name = Снежная стена
|
||||
block.dune-wall.name = Тёмная песчаная стена
|
||||
block.pine.name = Сосна
|
||||
block.dirt.name = Земля
|
||||
block.dirt-wall.name = Земляная стена
|
||||
block.white-tree-dead.name = Мёртвое белое дерево
|
||||
block.white-tree.name = Белое дерево
|
||||
block.spore-cluster.name = Скопление спор
|
||||
@@ -959,7 +988,7 @@ block.dark-panel-4.name = Тёмная панель 4
|
||||
block.dark-panel-5.name = Тёмная панель 5
|
||||
block.dark-panel-6.name = Тёмная панель 6
|
||||
block.dark-metal.name = Тёмный металл
|
||||
block.ignarock.name = Обожжённый камень
|
||||
block.basalt.name = Базальт
|
||||
block.hotrock.name = Горячий камень
|
||||
block.magmarock.name = Магмовый камень
|
||||
block.cliffs.name = Скалы
|
||||
@@ -1073,6 +1102,7 @@ block.container.name = Контейнер
|
||||
block.launch-pad.name = Пусковая площадка
|
||||
block.launch-pad-large.name = Большая пусковая площадка
|
||||
block.segment.name = Сегмент
|
||||
block.command-center.name = Командный центр
|
||||
block.ground-factory.name = Наземная фабрика
|
||||
block.air-factory.name = Воздушная фабрика
|
||||
block.naval-factory.name = Морская фабрика
|
||||
@@ -1089,7 +1119,9 @@ block.overdrive-dome.name = Сверхприводный купол
|
||||
block.switch.name = Переключатель
|
||||
block.micro-processor.name = Микропроцессор
|
||||
block.logic-processor.name = Логический процессор
|
||||
block.hyper-processor.name = Гипер процессор
|
||||
block.logic-display.name = Логический дисплей
|
||||
block.large-logic-display.name = Большой логический дисплей
|
||||
block.memory-cell.name = Запоминающее устройство
|
||||
|
||||
team.blue.name = Синяя
|
||||
@@ -1226,10 +1258,10 @@ block.thorium-reactor.description = Генерирует значительно
|
||||
block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса.
|
||||
block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы.
|
||||
block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур.
|
||||
block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий.
|
||||
block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий.
|
||||
block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии.
|
||||
block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод.
|
||||
block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры.
|
||||
block.cultivator.description = Выращивает крошечные концентрации спор из атмосферы в готовые к использованию споры.
|
||||
block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть.
|
||||
block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться.
|
||||
block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов.
|
||||
|
||||
@@ -13,14 +13,14 @@ link.google-play.description = Завантажити для Android з Google P
|
||||
link.f-droid.description = Завантажити для Android з F-Droid
|
||||
link.wiki.description = Офіційна ігрова Wiki
|
||||
link.suggestions.description = Запропонувати нові функції
|
||||
linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну.
|
||||
linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну.
|
||||
screenshot = Зняток мапи збережено до {0}
|
||||
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
|
||||
gameover = Гра завершена
|
||||
gameover.pvp = [accent]{0}[] команда перемогла!
|
||||
highscore = [accent]Новий рекорд!
|
||||
copied = Скопійовано.
|
||||
indevpopup = Наразі [accent]6.0[] знаходиться у стадії [accent]pre-alpha[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord.
|
||||
indevpopup = Наразі [accent]6.0[] знаходиться у стадії [accent]альфа[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює належним чином;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord.
|
||||
|
||||
load.sound = Звуки
|
||||
load.map = Мапи
|
||||
@@ -40,8 +40,8 @@ be.check = Перевірити на наявність оновлень
|
||||
schematic = Схема
|
||||
schematic.add = Зберегти схему…
|
||||
schematics = Схеми
|
||||
schematic.replace = Схема з такою назвою вже існує. Замінити її?
|
||||
schematic.exists = Схема з такою назвою вже існує.
|
||||
schematic.replace = Схема з такою назвою вже є. Замінити її?
|
||||
schematic.exists = Схема з такою назвою вже є.
|
||||
schematic.import = Імпортувати схему…
|
||||
schematic.exportfile = Експортувати файл
|
||||
schematic.importfile = Імпортувати файл
|
||||
@@ -51,7 +51,7 @@ schematic.copy.import = Імпортувати з клавіатури
|
||||
schematic.shareworkshop = Поширити в Майстерню
|
||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему
|
||||
schematic.saved = Схема збережена.
|
||||
schematic.delete.confirm = Ця схема буде повністю випалена Викорінювачем.
|
||||
schematic.delete.confirm = Ви справді хочете видалити цю схему?
|
||||
schematic.rename = Перейменувати схему
|
||||
schematic.info = {0}x{1}, {2} блоків
|
||||
|
||||
@@ -69,7 +69,7 @@ map.delete = Ви впевнені, що хочете видалити мапу
|
||||
level.highscore = Рекорд: [accent]{0}
|
||||
level.select = Вибір мапи
|
||||
level.mode = Режим гри:
|
||||
coreattack = < Ядро знаходиться під атакою! >
|
||||
coreattack = < Ядро перебуває під атакою! >
|
||||
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча
|
||||
database = База даних ядра
|
||||
savegame = Зберегти гру
|
||||
@@ -78,7 +78,7 @@ joingame = Мережева гра
|
||||
customgame = Користувацька гра
|
||||
newgame = Нова гра
|
||||
none = <нічого>
|
||||
minimap = Міні-мапа
|
||||
minimap = Мінімапа
|
||||
position = Місцезнаходження
|
||||
close = Закрити
|
||||
website = Вебсайт
|
||||
@@ -98,15 +98,15 @@ committingchanges = Здійснення змін
|
||||
done = Зроблено
|
||||
feature.unsupported = Ваш пристрій не підтримує цю функцію
|
||||
|
||||
mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord.
|
||||
mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord.
|
||||
mods.alpha = [accent](Альфа)
|
||||
mods = Модифікації
|
||||
mods.none = [lightgray]Модифікацій не знайдено!
|
||||
mods.guide = Посібник з модифікацій
|
||||
mods.guide = Посібник із модифікацій
|
||||
mods.report = Повідомити про ваду
|
||||
mods.openfolder = Відкрити теку
|
||||
mods.reload = Перезавантажити
|
||||
mods.reloadexit = Гра зараз закриється, щоб перезавантажити модифікації
|
||||
mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації
|
||||
mod.display = [gray]Модифікація:[orange] {0}
|
||||
mod.enabled = [lightgray]Увімкнено
|
||||
mod.disabled = [scarlet]Вимкнено
|
||||
@@ -114,29 +114,32 @@ mod.disable = Вимкнути
|
||||
mod.content = Зміст:
|
||||
mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
|
||||
mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0}
|
||||
mod.outdated = [scarlet]Не сумісна з V6 (немає мінімальної версі гри (англ. min-game-version): 105)
|
||||
mod.missingdependencies = [scarlet]Відсутні залежності: {0}
|
||||
mod.erroredcontent = [scarlet]Помилки при завантаженні
|
||||
mod.erroredcontent = [scarlet]Помилки під час завантаження
|
||||
mod.errors = Виникли помилки під час завантаження змісту.
|
||||
mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх.
|
||||
mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена.
|
||||
mod.enable = Увімкнути
|
||||
mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій.
|
||||
mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій.
|
||||
mod.reloadrequired = [scarlet]Потрібно перезавантаження
|
||||
mod.import = Імпортувати модифікацію
|
||||
mod.import.file = Імпортувати файл
|
||||
mod.import.github = Імпортувати з GitHub
|
||||
mod.jarwarn = [scarlet]JAR-модифікації по своїй суті небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела!
|
||||
mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію.
|
||||
mod.jarwarn = [scarlet]JAR-модифікації за своєю суттю небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела!
|
||||
mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоби видалити його, видаліть цю модифікацію.
|
||||
mod.remove.confirm = Цю модифікацію буде видалено.
|
||||
mod.author = [lightgray]Автор:[] {0}
|
||||
mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0}
|
||||
mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову.
|
||||
mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію у теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації.
|
||||
mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову.
|
||||
mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації.
|
||||
mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри.
|
||||
|
||||
about.button = Про гру
|
||||
name = Ім’я:
|
||||
noname = Спочатку придумайте[accent] собі ім’я[].
|
||||
planetmap = Планетна мапа
|
||||
launchcore = Запустити ядро
|
||||
filename = Назва файлу:
|
||||
unlocked = Доступний новий вміст!
|
||||
completed = [accent]Завершено
|
||||
@@ -150,28 +153,28 @@ players.single = {0} гравець на сервері
|
||||
players.search = пошук
|
||||
players.notfound = [gray]гравців не знайдено
|
||||
server.closing = [accent]Закриття сервера…
|
||||
server.kicked.kick = Ви були вигнані з сервера!
|
||||
server.kicked.kick = Ви були вигнані із сервера!
|
||||
server.kicked.whitelist = Ви не в білому списку сервера.
|
||||
server.kicked.serverClose = Сервер закрито.
|
||||
server.kicked.serverClose = Сервер зачинено.
|
||||
server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте.
|
||||
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
||||
server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру!
|
||||
server.kicked.banned = Ви заблоковані на цьому сервері.
|
||||
server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки.
|
||||
server.kicked.typeMismatch = Цей сервер не сумісний із вашим типом збірки.
|
||||
server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця.
|
||||
server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням.
|
||||
server.kicked.nameInUse = На цьому сервері вже є хтось з таким ім’ям.
|
||||
server.kicked.nameInUse = На цьому сервері вже є хтось із таким ім’ям.
|
||||
server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру.
|
||||
server.kicked.idInUse = Ви вже на цьому сервері! Під’єднанням двох облікових записів не дозволяється.
|
||||
server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію.
|
||||
server.kicked.gameover = Гру завершено!
|
||||
server.kicked.serverRestarting = Сервер перезавантажується
|
||||
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережах[], повинні побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер.
|
||||
join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip.
|
||||
hostserver = Запустити багатокористувацький сервер
|
||||
invitefriends = Запросити друзів
|
||||
hostserver.mobile = Запустити\nсервер
|
||||
hostserver.mobile = Запустити сервер
|
||||
host = Запустити
|
||||
hosting = [accent]Відкриття сервера…
|
||||
hosts.refresh = Оновити
|
||||
@@ -260,25 +263,25 @@ ok = Гаразд
|
||||
open = Відкрити
|
||||
customize = Налаштувати правила
|
||||
cancel = Скасувати
|
||||
openlink = Відкрити посилання
|
||||
openlink = Перейти за посиланням
|
||||
copylink = Скопіювати посилання
|
||||
back = Назад
|
||||
data.export = Вивантажити дані
|
||||
data.import = Завантажити дані
|
||||
data.openfolder = Відкрити теку з даними
|
||||
data.openfolder = Відчинити теку з даними
|
||||
data.exported = Дані вивантажено.
|
||||
data.invalid = Це не дійсні ігрові дані.
|
||||
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється.
|
||||
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється.
|
||||
quit.confirm = Ви дійсно хочете вийти?
|
||||
quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[]
|
||||
loading = [accent]Завантаження…
|
||||
reloading = [accent]Перезавантаження модифікацій…
|
||||
saving = [accent]Збереження…
|
||||
respawn = [accent][[{0}][], щоб відродитися в ядрі
|
||||
respawn = [accent][[{0}][], щоби відродитися в ядрі
|
||||
cancelbuilding = [accent][[{0}][], щоб очистити план
|
||||
selectschematic = [accent][[{0}][], щоб вибрати та скопіювати
|
||||
pausebuilding = [accent][[{0}][], щоб призупинити будування
|
||||
resumebuilding = [scarlet][[{0}][], щоб продовжити будування
|
||||
selectschematic = [accent][[{0}][], щоби вибрати та скопіювати
|
||||
pausebuilding = [accent][[{0}][], щоби призупинити будування
|
||||
resumebuilding = [scarlet][[{0}][], щоби продовжити будування
|
||||
wave = [accent]Хвиля {0}
|
||||
wave.waiting = [lightgray]Наступна хвиля\nчерез {0}
|
||||
wave.waveInProgress = [lightgray]Хвиля триває
|
||||
@@ -294,11 +297,11 @@ builtin = Вбудована
|
||||
map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати!
|
||||
map.random = [accent]Випадкова мапа
|
||||
map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі.
|
||||
map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі.
|
||||
map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі.
|
||||
map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі.
|
||||
map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі.
|
||||
map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи.
|
||||
workshop.update = Оновити предмет
|
||||
workshop.error = Помилка при отриманні інформації з Майстерні: {0}
|
||||
workshop.error = Помилка під час отримання інформації з Майстерні: {0}
|
||||
map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться!
|
||||
workshop.menu = Виберіть, що ви хочете зробити з цим предметом.
|
||||
workshop.info = Інформація про предмет
|
||||
@@ -307,7 +310,7 @@ eula = Ліцензійна угода Steam
|
||||
missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано.
|
||||
publishing = [accent]Публікація…
|
||||
publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
|
||||
publish.error = Виникла помилка при публікації предмета: {0}
|
||||
publish.error = Виникла помилка під час публікації предмета: {0}
|
||||
steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
|
||||
|
||||
editor.brush = Пензлик
|
||||
@@ -317,11 +320,11 @@ editor.oregen.info = Генерація руд:
|
||||
editor.mapinfo = Інформація про мапу
|
||||
editor.author = Автор:
|
||||
editor.description = Опис:
|
||||
editor.nodescription = Мапа повинна мати щонайменше 4 символи для публікації.
|
||||
editor.nodescription = Мапа мусить мати щонайменше 4 символи для публікації.
|
||||
editor.waves = Хвилі:
|
||||
editor.rules = Правила:
|
||||
editor.generation = Генерація:
|
||||
editor.ingame = Редагувати у грі
|
||||
editor.ingame = Редагувати в грі
|
||||
editor.publish.workshop = Опублікувати в Майстерні Steam
|
||||
editor.newmap = Нова мапа
|
||||
workshop = Майстерня
|
||||
@@ -338,9 +341,12 @@ waves.preview = Попередній перегляд
|
||||
waves.edit = Редагувати…
|
||||
waves.copy = Копіювати в буфер обміну
|
||||
waves.load = Завантажити з буфера обміну
|
||||
waves.invalid = Недійсні хвилі у буфері обміну.
|
||||
waves.invalid = Недійсні хвилі в буфері обміну.
|
||||
waves.copied = Хвилі скопійовані.
|
||||
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
||||
wavemode.counts = кількість
|
||||
wavemode.totals = усього
|
||||
wavemode.health = здоров’я
|
||||
editor.default = [lightgray]<За замовчуванням>
|
||||
details = Подробиці…
|
||||
edit = Редагувати…
|
||||
@@ -350,11 +356,11 @@ editor.removeunit = Видалити бойову одиницю
|
||||
editor.teams = Команди
|
||||
editor.errorload = Помилка завантаження зображення.
|
||||
editor.errorsave = Помилка збереження зображення.
|
||||
editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» у редакторі.
|
||||
editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі.
|
||||
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
|
||||
editor.errornot = Це не мапа.
|
||||
editor.errorheader = Цей файл мапи недійсний або пошкоджений.
|
||||
editor.errorname = Мапа не має назви. Може Ви намагаєтеся завантажити збереження?
|
||||
editor.errorname = Мапа не має назви. Може, ви намагаєтеся завантажити збереження?
|
||||
editor.update = Оновити
|
||||
editor.randomize = Випадково
|
||||
editor.apply = Застосувати
|
||||
@@ -365,7 +371,7 @@ editor.savemap = Зберегти мапу
|
||||
editor.saved = Збережено!
|
||||
editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу».
|
||||
editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу».
|
||||
editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує!
|
||||
editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже є!
|
||||
editor.import = Імпорт…
|
||||
editor.importmap = Імпортувати мапу
|
||||
editor.importmap.description = Імпортувати вже наявну мапу
|
||||
@@ -380,12 +386,12 @@ editor.exportimage = Експорт зображення місцевості
|
||||
editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості
|
||||
editor.loadimage = Завантажити\nзображення
|
||||
editor.saveimage = Зберегти\nзображення
|
||||
editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти?
|
||||
editor.unsaved = Ви впевнені, що хочете вийти?\n[scarlet]Незбережені зміни буде втрачено назавжди![]
|
||||
editor.resizemap = Змінити розмір мапи
|
||||
editor.mapname = Назва мапи:
|
||||
editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу.
|
||||
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]»
|
||||
editor.exists = Мапа з такою назвою вже існує.
|
||||
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]»
|
||||
editor.exists = Мапа з такою назвою вже є.
|
||||
editor.selectmap = Виберіть мапу для завантаження:
|
||||
|
||||
toolmode.replace = Замінити
|
||||
@@ -398,7 +404,7 @@ toolmode.square = Прямокутник
|
||||
toolmode.square.description = Прямокутна кисть.
|
||||
toolmode.eraseores = Видалення руд
|
||||
toolmode.eraseores.description = Видалити тільки руди.
|
||||
toolmode.fillteams = Змінити блок в команді
|
||||
toolmode.fillteams = Змінити блок у команді
|
||||
toolmode.fillteams.description = Змінює належність\nблоків до команди.
|
||||
toolmode.drawteams = Змінити команду блока
|
||||
toolmode.drawteams.description = Змінює належність\nблока до команди.
|
||||
@@ -447,7 +453,7 @@ load = Завантажити
|
||||
save = Зберегти
|
||||
fps = FPS: {0}
|
||||
ping = Затримка: {0} мс
|
||||
language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.
|
||||
language.restart = Будь ласка, перезапустіть свою гру, щоби налаштування мови набули чинності.
|
||||
settings = Налаштування
|
||||
tutorial = Навчання
|
||||
tutorial.retake = Пройти навчання ще раз
|
||||
@@ -459,7 +465,7 @@ abandon.text = Ця зона і всі її ресурси будуть утра
|
||||
locked = Заблоковано
|
||||
complete = [lightgray]Необхідно:
|
||||
requirement.wave = Досягніть хвилі {0} у зоні «{1}»
|
||||
requirement.core = Знищте вороже ядро у зоні «{0}»
|
||||
requirement.core = Знищте вороже ядро в зоні «{0}»
|
||||
requirement.unlock = Розблокуйте {0}
|
||||
resume = Відновити зону:\n[lightgray]{0}
|
||||
bestwave = [lightgray]Найкраща хвиля: {0}
|
||||
@@ -468,7 +474,7 @@ launch.text = Запуск
|
||||
launch.title = Запуск вдалий
|
||||
launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі
|
||||
launch.unable2 = [scarlet]ЗАПУСК неможливий.[]
|
||||
launch.confirm = Це видалить всі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази.
|
||||
launch.confirm = Це видалить усі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази.
|
||||
launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль.
|
||||
uncover = Розкрити
|
||||
configure = Налаштувати вивантаження
|
||||
@@ -476,7 +482,7 @@ loadout = Вивантаження
|
||||
resources = Ресурси
|
||||
bannedblocks = Заборонені блоки
|
||||
addall = Додати все
|
||||
configure.invalid = Кількість повинна бути числом між 0 та {0}.
|
||||
configure.invalid = Кількість має бути числом між 0 та {0}.
|
||||
zone.unlocked = Зона «[lightgray]{0}» тепер розблокована.
|
||||
zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1}
|
||||
zone.resources = [lightgray]Виявлені ресурси:
|
||||
@@ -489,7 +495,7 @@ boss.health = Здоров’я босу
|
||||
connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0}
|
||||
error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса?
|
||||
error.invalidaddress = Некоректна адреса.
|
||||
error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту!
|
||||
error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна й що власник сервера налаштував переадресацію порту!
|
||||
error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry!
|
||||
error.alreadyconnected = Ви вже під’єдналися.
|
||||
error.mapnotfound = Файл мапи не знайдено!
|
||||
@@ -497,6 +503,18 @@ error.io = Мережева помилка введення-виведення.
|
||||
error.any = Невідома мережева помилка
|
||||
error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це.
|
||||
|
||||
weather.rain.name = Дощ
|
||||
weather.snow.name = Сніг
|
||||
weather.sandstorm.name = Піщана буря
|
||||
weather.sporestorm.name = Спорова буря
|
||||
|
||||
sectors.unexplored = [lightgray]Не досліджено
|
||||
sectors.resources = Ресурси:
|
||||
sectors.production = Виробництво:
|
||||
sectors.stored = Зберігає:
|
||||
sectors.resume = Продовжити
|
||||
sectors.launch = Запуск
|
||||
|
||||
sector.groundZero.name = Відправний пункт
|
||||
sector.craters.name = Кратери
|
||||
sector.frozenForest.name = Крижаний ліс
|
||||
@@ -516,7 +534,7 @@ sector.craters.description = У цьому кратері накопичилас
|
||||
sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології.
|
||||
sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці.
|
||||
sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам.
|
||||
sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один з небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти.
|
||||
sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти.
|
||||
sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника.
|
||||
sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією.
|
||||
|
||||
@@ -532,7 +550,9 @@ settings.sound = Звук
|
||||
settings.graphics = Графіка
|
||||
settings.cleardata = Очистити дані…
|
||||
settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати!
|
||||
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється.
|
||||
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється.
|
||||
settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження?
|
||||
settings.clearsaves = Очистити збереження
|
||||
paused = [accent]< Пауза>
|
||||
clear = Очистити
|
||||
banned = [scarlet]Заблоковано
|
||||
@@ -558,8 +578,11 @@ blocks.itemsmoved = Швидкість переміщення
|
||||
blocks.launchtime = Час між запусками
|
||||
blocks.shootrange = Радіус дії
|
||||
blocks.size = Розмір
|
||||
blocks.displaysize = Розмір дисплею
|
||||
blocks.liquidcapacity = Рідинна місткість
|
||||
blocks.powerrange = Діапазон передачі енергії
|
||||
blocks.powerrange = Радіус передачі енергії
|
||||
blocks.linkrange = Радіус з’єднання
|
||||
blocks.instructions = Інструкції
|
||||
blocks.powerconnections = Максимальна кількість з’єднань
|
||||
blocks.poweruse = Енергії використовує
|
||||
blocks.powerdamage = Енергії за од. шкоди
|
||||
@@ -575,6 +598,7 @@ blocks.boosteffect = Прискорювальний ефект
|
||||
blocks.maxunits = Максимальна кількість активних одиниць
|
||||
blocks.health = Здоров’я
|
||||
blocks.buildtime = Час будування
|
||||
blocks.maxconsecutive = Максимальна послідовність
|
||||
blocks.buildcost = Вартість будування
|
||||
blocks.inaccuracy = Розкид
|
||||
blocks.shots = Постріли
|
||||
@@ -582,7 +606,7 @@ blocks.reload = Постріли/секунду
|
||||
blocks.ammo = Боєприпаси
|
||||
|
||||
bar.drilltierreq = Потребується кращий бур
|
||||
bar.noresources = Відсутні ресурси
|
||||
bar.noresources = Бракує ресурсів
|
||||
bar.corereq = Необхідне основне ядро
|
||||
bar.drillspeed = Швидкість буріння: {0} за с.
|
||||
bar.pumpspeed = Швидкість викачування: {0} за с.
|
||||
@@ -622,7 +646,9 @@ unit.liquidunits = одиниць рідини
|
||||
unit.powerunits = одиниць енергії
|
||||
unit.degrees = град.
|
||||
unit.seconds = с
|
||||
unit.minutes = хв
|
||||
unit.persecond = за секунду
|
||||
unit.perminute = за хвилину
|
||||
unit.timesspeed = x швидкість
|
||||
unit.percent = %
|
||||
unit.items = предм.
|
||||
@@ -638,7 +664,7 @@ category.shooting = Стрільба
|
||||
category.optional = Додаткові поліпшення
|
||||
setting.landscape.name = Тільки альбомний (горизонтальний) режим
|
||||
setting.shadows.name = Тіні
|
||||
setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків
|
||||
setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків
|
||||
setting.linear.name = Лінійна фільтрація
|
||||
setting.hints.name = Підказки
|
||||
setting.flow.name = Показувати темп швидкості ресурсів
|
||||
@@ -649,7 +675,7 @@ setting.animatedshields.name = Анімаційні щити
|
||||
setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[]
|
||||
setting.playerindicators.name = Позначки гравців
|
||||
setting.indicators.name = Позначки противників
|
||||
setting.autotarget.name = Авто-стрільба
|
||||
setting.autotarget.name = Автострільба
|
||||
setting.keyboard.name = Миш+Керування з клавіатури
|
||||
setting.touchscreen.name = Керування сенсорним екраном
|
||||
setting.fpscap.name = Максимальний FPS
|
||||
@@ -681,11 +707,11 @@ setting.blockselectkeys.name = Показувати клавіші вибору
|
||||
setting.vsync.name = Вертикальна синхронізація
|
||||
setting.pixelate.name = Пікселізація
|
||||
setting.minimap.name = Показувати мінімапу
|
||||
setting.coreitems.name = Показувати предмети в ядрі (в роботі)
|
||||
setting.coreitems.name = Показувати предмети в ядрі (дороблюється)
|
||||
setting.position.name = Показувати координати гравця
|
||||
setting.musicvol.name = Гучність музики
|
||||
setting.atmosphere.name = Показувати планетарну атмосферу
|
||||
setting.ambientvol.name = Звуки навколишнього середовища
|
||||
setting.ambientvol.name = Звуки довкілля
|
||||
setting.mutemusic.name = Заглушити музику
|
||||
setting.sfxvol.name = Гучність звукових ефектів
|
||||
setting.mutesound.name = Заглушити звук
|
||||
@@ -697,7 +723,7 @@ setting.chatopacity.name = Непрозорість чату
|
||||
setting.lasersopacity.name = Непрозорість лазерів енергопостачання
|
||||
setting.bridgeopacity.name = Непрозорість мостів
|
||||
setting.playerchat.name = Показувати хмару чата над гравцями
|
||||
public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити у Налаштування->Гра->Загальнодоступність гри.
|
||||
public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри.
|
||||
public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри.
|
||||
uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд…
|
||||
uiscale.cancel = Скасувати & Вийти
|
||||
@@ -711,6 +737,7 @@ category.blocks.name = Вибір блока
|
||||
command.attack = Атака
|
||||
command.rally = Точка збору
|
||||
command.retreat = Відступити
|
||||
command.idle = Бездіяти
|
||||
placement.blockselectkeys = \n[lightgray]Ключ: [{0},
|
||||
keybind.respawn.name = Відродження
|
||||
keybind.control.name = Контролювання одиниці
|
||||
@@ -722,7 +749,8 @@ keybind.toggle_power_lines.name = Показувати лазери енерго
|
||||
keybind.toggle_block_status.name = Показувати стан блоків
|
||||
keybind.move_x.name = Рух по осі X
|
||||
keybind.move_y.name = Рух по осі Y
|
||||
keybind.mouse_move.name = Слідкувати за мишею
|
||||
keybind.mouse_move.name = Рухатися за мишею
|
||||
keybind.pan.name = Політ камери за мишею
|
||||
keybind.boost.name = Прискорення
|
||||
keybind.schematic_select.name = Вибрати ділянку
|
||||
keybind.schematic_menu.name = Меню схем
|
||||
@@ -755,7 +783,7 @@ keybind.zoom.name = Наблизити
|
||||
keybind.menu.name = Меню
|
||||
keybind.pause.name = Пауза
|
||||
keybind.pause_building.name = Призупинити/Продовжити будування
|
||||
keybind.minimap.name = Міні-мапа
|
||||
keybind.minimap.name = Мінімапа
|
||||
keybind.chat.name = Чат
|
||||
keybind.player_list.name = Список гравців
|
||||
keybind.console.name = Консоль
|
||||
@@ -766,10 +794,10 @@ keybind.chat_history_prev.name = Попередня історія чату
|
||||
keybind.chat_history_next.name = Наступна історія чату
|
||||
keybind.chat_scroll.name = Прокрутка чату
|
||||
keybind.drop_unit.name = Скинути бойову одиницю
|
||||
keybind.zoom_minimap.name = Збільшити міні-мапу
|
||||
keybind.zoom_minimap.name = Збільшити мінімапу
|
||||
mode.help.title = Опис режимів гри
|
||||
mode.survival.name = Виживання
|
||||
mode.survival.description = Звичайний режим. В цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри.
|
||||
mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри.
|
||||
mode.sandbox.name = Пісочниця
|
||||
mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням.
|
||||
mode.editor.name = Редактор
|
||||
@@ -784,28 +812,34 @@ rules.reactorexplosions = Вибухи реактора
|
||||
rules.wavetimer = Таймер для хвиль
|
||||
rules.waves = Хвилі
|
||||
rules.attack = Режим атаки
|
||||
rules.buildai = Будування ШІ
|
||||
rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ
|
||||
rules.blockhealthmultiplier = Множник здоров’я блоків
|
||||
rules.blockdamagemultiplier = Множник шкоди блоків
|
||||
rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць
|
||||
rules.unithealthmultiplier = Множник здоров’я бойових одиниць
|
||||
rules.unitdamagemultiplier = Множник шкоди бойових одиниць
|
||||
rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (плитки)
|
||||
rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки)
|
||||
rules.wavespacing = Інтервал хвиль:[lightgray] (секунди)
|
||||
rules.buildcostmultiplier = Множник затрат на будування
|
||||
rules.buildspeedmultiplier = Множник швидкості будування
|
||||
rules.deconstructrefundmultiplier = Множник відшкодування при демонтажі
|
||||
rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу
|
||||
rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої
|
||||
rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках)
|
||||
rules.unitammo = Бойові одиниці потребують боєприпасів
|
||||
rules.title.waves = Хвилі
|
||||
rules.title.resourcesbuilding = Ресурси & будування
|
||||
rules.title.resourcesbuilding = Ресурси й будування
|
||||
rules.title.enemy = Противники
|
||||
rules.title.unit = Бойові одиниці
|
||||
rules.title.experimental = Експериментальне
|
||||
rules.title.environment = Середовище
|
||||
rules.lighting = Світлотінь
|
||||
rules.fire = Вогонь
|
||||
rules.explosions = Шкода від вибухів блоків і одиниць
|
||||
rules.ambientlight = Навколишнє світло
|
||||
rules.weather = Погода
|
||||
rules.weather.frequency = Повторюваність:
|
||||
rules.weather.duration = Тривалість:
|
||||
rules.solarpowermultiplier = Множник сонячної енергії
|
||||
|
||||
content.item.name = Предмети
|
||||
@@ -853,11 +887,12 @@ unit.fortress.name = Фортеця
|
||||
unit.nova.name = Нова
|
||||
unit.pulsar.name = Пульсар
|
||||
unit.quasar.name = Квазар
|
||||
unit.crawler.name = Камікадзе
|
||||
unit.crawler.name = Плазун
|
||||
unit.atrax.name = Атракс
|
||||
unit.spiroct.name = Павучник
|
||||
unit.arkyid.name = Аркиїд
|
||||
unit.flare.name = Фальшфейєр
|
||||
unit.toxopid.name = Отруйник
|
||||
unit.flare.name = Фальшфеєр
|
||||
unit.horizon.name = Горизонт
|
||||
unit.zenith.name = Зеніт
|
||||
unit.antumbra.name = Тіньовик
|
||||
@@ -871,28 +906,31 @@ unit.bryde.name = Смугач Брайда
|
||||
unit.alpha.name = Альфа
|
||||
unit.beta.name = Бета
|
||||
unit.gamma.name = Гамма
|
||||
unit.scepter.name = Верховна влада
|
||||
unit.reign.name = Верховний Порядок
|
||||
|
||||
block.resupply-point.name = Пункт постачання
|
||||
block.parallax.name = Паралакс
|
||||
block.cliff.name = Скеля
|
||||
block.sand-boulder.name = Пісочний валун
|
||||
block.grass.name = Трава
|
||||
block.slag.name = Шлак
|
||||
block.salt.name = Сіль
|
||||
block.saltrocks.name = Соляні камені
|
||||
block.salt-wall.name = Соляна стіна
|
||||
block.pebbles.name = Галька
|
||||
block.tendrils.name = Щупальця
|
||||
block.sandrocks.name = Піщані скелі
|
||||
block.sand-wall.name = Піскова стіна
|
||||
block.spore-pine.name = Спорова сосна
|
||||
block.sporerocks.name = Спорові камені
|
||||
block.rock.name = Камінь
|
||||
block.snowrock.name = Сніжний камінь
|
||||
block.spore-wall.name = Спорова стіна
|
||||
block.boulder.name = Брила
|
||||
block.snow-boulder.name = Снігова брила
|
||||
block.snow-pine.name = Сніжні сосни
|
||||
block.shale.name = Сланець
|
||||
block.shale-boulder.name = Сланцевий валун
|
||||
block.moss.name = Мох
|
||||
block.shrubs.name = Кущі
|
||||
block.spore-moss.name = Споровий мох
|
||||
block.shalerocks.name = Сланцеві породи
|
||||
block.shale-wall.name = Сланцева стіна
|
||||
block.scrap-wall.name = Стіна з брухту
|
||||
block.scrap-wall-large.name = Велика стіна з брухту
|
||||
block.scrap-wall-huge.name = Величезна стіна з брухту
|
||||
@@ -917,16 +955,19 @@ block.darksand.name = Темний пісок
|
||||
block.ice.name = Лід
|
||||
block.snow.name = Сніг
|
||||
block.craters.name = Кратери
|
||||
block.sand-water.name = Пісок з водою
|
||||
block.darksand-water.name = Темний пісок з водою
|
||||
block.sand-water.name = Пісок із водою
|
||||
block.darksand-water.name = Темний пісок із водою
|
||||
block.char.name = Випалена земля
|
||||
block.holostone.name = Голографічний камінь
|
||||
block.dacite.name = Дацит
|
||||
block.dacite-wall.name = Дацитова стіна
|
||||
block.ice-snow.name = Крижаний сніг
|
||||
block.rocks.name = Камені
|
||||
block.icerocks.name = Крижані камені
|
||||
block.snowrocks.name = Снігові камені
|
||||
block.dunerocks.name = Піщані камені
|
||||
block.stone-wall.name = Кам’яна стіна
|
||||
block.ice-wall.name = Крижана стіна
|
||||
block.snow-wall.name = Снігова стіна
|
||||
block.dune-wall.name = Дюнова стіна
|
||||
block.pine.name = Сосна
|
||||
block.dirt.name = Ґрунт
|
||||
block.dirt-wall.name = Ґрунтова стіна
|
||||
block.white-tree-dead.name = Мертве біле дерево
|
||||
block.white-tree.name = Біле дерево
|
||||
block.spore-cluster.name = Скупчення спор
|
||||
@@ -942,7 +983,7 @@ block.dark-panel-4.name = Темна панель 4
|
||||
block.dark-panel-5.name = Темна панель 5
|
||||
block.dark-panel-6.name = Темна панель 6
|
||||
block.dark-metal.name = Темний метал
|
||||
block.ignarock.name = Магматичні гірські породи
|
||||
block.basalt.name = Базальт
|
||||
block.hotrock.name = Гарячий камінь
|
||||
block.magmarock.name = Магмовий камінь
|
||||
block.cliffs.name = Скелі
|
||||
@@ -967,7 +1008,7 @@ block.conveyor.name = Конвеєр
|
||||
block.titanium-conveyor.name = Титановий конвеєр
|
||||
block.plastanium-conveyor.name = Пластанієвий конвеєр
|
||||
block.armored-conveyor.name = Броньований конвеєр
|
||||
block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок.
|
||||
block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок.
|
||||
block.junction.name = Перехрестя
|
||||
block.router.name = Маршрутизатор
|
||||
block.distributor.name = Розподілювач
|
||||
@@ -1056,18 +1097,26 @@ block.container.name = Сховище
|
||||
block.launch-pad.name = Стартовий майданчик
|
||||
block.launch-pad-large.name = Великий стартовий майданчик
|
||||
block.segment.name = Сегмент
|
||||
block.command-center.name = Командний центр
|
||||
block.ground-factory.name = Наземний завод
|
||||
block.air-factory.name = Повітряний завод
|
||||
block.naval-factory.name = Морський завод
|
||||
block.additive-reconstructor.name = Додавальний реконструктор
|
||||
block.multiplicative-reconstructor.name = Примножувальний реконструктор
|
||||
block.exponential-reconstructor.name = Експоненційний реконструктор
|
||||
block.tetrative-reconstructor.name = Тетративний реконструктор
|
||||
block.tetrative-reconstructor.name = Тетративний реконструктор
|
||||
block.payload-conveyor.name = Вантажний конвеєр
|
||||
block.payload-router.name = Розвантажувальний маршрутизатор
|
||||
block.disassembler.name = Розбирач
|
||||
block.silicon-crucible.name = Кремнієвий тигель
|
||||
block.large-overdrive-projector.name = Великий прискорювач
|
||||
block.switch.name = Перемикач
|
||||
block.micro-processor.name = Мікропроцесор
|
||||
block.logic-processor.name = Логічний процесор
|
||||
block.hyper-processor.name = Гіперпроцесор
|
||||
block.logic-display.name = Логічний дисплей
|
||||
block.large-logic-display.name = Великий логічний дисплей
|
||||
block.memory-cell.name = Комірка пам’яті
|
||||
team.blue.name = Синя
|
||||
team.crux.name = Червона
|
||||
team.sharded.name = Помаранчева
|
||||
@@ -1077,39 +1126,39 @@ team.green.name = Зелена
|
||||
team.purple.name = Фіолетова
|
||||
|
||||
tutorial.next = [lightgray]<Натисніть для продовження>
|
||||
tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді
|
||||
tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді
|
||||
tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від відкритої вкладки.\n[accent]Натисніть ПКМ[], щоб зупинити будування.
|
||||
tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоб підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоб скасувати розміщення.
|
||||
tutorial.intro = Ви розпочали[scarlet] навчання з Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді
|
||||
tutorial.intro.mobile = Ви розпочали[scarlet] навчання з Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді
|
||||
tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від розгорнутої вкладки.\n[accent]Натисніть ПКМ[], щоби зупинити будування.
|
||||
tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоби підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоби скасувати розміщення.
|
||||
tutorial.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[]
|
||||
tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро.
|
||||
tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро.
|
||||
tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються у будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди повинні бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази.
|
||||
tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоб заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1
|
||||
tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення в лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро.
|
||||
tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро.
|
||||
tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази.
|
||||
tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоби заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1
|
||||
tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи.
|
||||
tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи.
|
||||
tutorial.unpause = Призупиніть гру, натиснувши на пробіл.
|
||||
tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоб зняти паузу.
|
||||
tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні.
|
||||
tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищте область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні.
|
||||
tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу.
|
||||
tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні.
|
||||
tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоби зламати його.\nВидаліть ділянку, утримуючи палець упродовж декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоби підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні.
|
||||
tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з ядра.[]
|
||||
tutorial.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[]
|
||||
tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді.
|
||||
tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоби стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді.
|
||||
tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді.
|
||||
tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску.
|
||||
|
||||
item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків.
|
||||
item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та у транспортуванні рідин.
|
||||
item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин.
|
||||
item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини.
|
||||
item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент.
|
||||
item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів.
|
||||
item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів.
|
||||
item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів.
|
||||
item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків.
|
||||
item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива.
|
||||
item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів.
|
||||
item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт.
|
||||
item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах.
|
||||
item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та у технології самовідновлення.
|
||||
item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення.
|
||||
item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями.
|
||||
item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо.
|
||||
item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується.
|
||||
@@ -1117,24 +1166,24 @@ item.pyratite.description = Надзвичайно легкозаймиста р
|
||||
liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів.
|
||||
liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя.
|
||||
liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля.
|
||||
liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує.
|
||||
liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує.
|
||||
|
||||
block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками.
|
||||
block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту.
|
||||
block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля.
|
||||
block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній.
|
||||
block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній.
|
||||
block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії.
|
||||
block.plastanium-compressor.description = Виробляє пластаній з нафти та титану.
|
||||
block.plastanium-compressor.description = Виробляє пластаній із нафти та титану.
|
||||
block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії.
|
||||
block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву.
|
||||
block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання у торієвому реактору.
|
||||
block.blast-mixer.description = Подрібнює і змішує скупчення спор з піротитом для отримання вибухової суміші.
|
||||
block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання в торієвому реактору.
|
||||
block.blast-mixer.description = Подрібнює і змішує скупчення спор із піротитом для отримання вибухової суміші.
|
||||
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит.
|
||||
block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання у баштах «Хвиля».
|
||||
block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля».
|
||||
block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали.
|
||||
block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти.
|
||||
block.pulverizer.description = Подрібнює брухт у дрібний пісок.
|
||||
block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля.
|
||||
block.coal-centrifuge.description = Нафта перетворюється в шматки вугілля.
|
||||
block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує.
|
||||
block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця.
|
||||
block.power-source.description = Постійно створює енергію. Тільки пісочниця.
|
||||
@@ -1142,30 +1191,30 @@ block.item-source.description = Постійно створює предмети
|
||||
block.item-void.description = Знищує будь-які предмети. Тільки пісочниця.
|
||||
block.liquid-source.description = Постійно створює рідини. Тільки пісочниця.
|
||||
block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця.
|
||||
block.copper-wall.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль.
|
||||
block.copper-wall-large.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток.
|
||||
block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників.
|
||||
block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників.\nЗаймає декілька плиток.
|
||||
block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.
|
||||
block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток.
|
||||
block.thorium-wall.description = Сильний захисний блок.\nГідний захист від противників.
|
||||
block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від противників.\nЗаймає декілька плиток.
|
||||
block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.
|
||||
block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.\nЗаймає декілька плиток.
|
||||
block.surge-wall.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.
|
||||
block.surge-wall-large.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток.
|
||||
block.door.description = Невеликі двері. Можна відкрити або закрити, натиснувши.
|
||||
block.door-large.description = Великі двері. Можна відкрити та закрити, натиснувши.\nЗаймає декілька плиток.
|
||||
block.mender.description = Періодично ремонтує блоки у його радіусі дії. Захищає башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності.
|
||||
block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки у його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
|
||||
block.copper-wall.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.
|
||||
block.copper-wall-large.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток.
|
||||
block.titanium-wall.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.
|
||||
block.titanium-wall-large.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.\nЗаймає декілька плиток.
|
||||
block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.
|
||||
block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток.
|
||||
block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників.
|
||||
block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток.
|
||||
block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.
|
||||
block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток.
|
||||
block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.
|
||||
block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток.
|
||||
block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них.
|
||||
block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток.
|
||||
block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності.
|
||||
block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
|
||||
block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
|
||||
block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
|
||||
block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
|
||||
block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника.
|
||||
block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати.
|
||||
block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри.
|
||||
block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.
|
||||
block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності.
|
||||
block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця.
|
||||
block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі.
|
||||
block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі.
|
||||
block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток.
|
||||
block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа.
|
||||
block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони.
|
||||
@@ -1174,35 +1223,35 @@ block.distributor.description = Поліпшений маршрутизатор.
|
||||
block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований.
|
||||
block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано.
|
||||
block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія.
|
||||
block.mechanical-pump.description = Дешевий насос з повільним виходом, але не потребує енергоспоживання.
|
||||
block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання.
|
||||
block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію.
|
||||
block.thermal-pump.description = Найкращий насос.
|
||||
block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами.
|
||||
block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує і більше зберігає рідини, ніж стандартні трубопроводи.
|
||||
block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше.
|
||||
block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи.
|
||||
block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nПротікає менше.
|
||||
block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней.
|
||||
block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків.
|
||||
block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків.
|
||||
block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця.
|
||||
block.bridge-conduit.description = Удосконалений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі.
|
||||
block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі.
|
||||
block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток.
|
||||
block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них.
|
||||
block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії.
|
||||
block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії.
|
||||
block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії.
|
||||
block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту.
|
||||
block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту.
|
||||
block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор.
|
||||
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля.
|
||||
block.thermal-generator.description = Генерує енергію при розміщенні в спекотних місцях.
|
||||
block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях.
|
||||
block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари.
|
||||
block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною і піротитом, що горить.
|
||||
block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить.
|
||||
block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
|
||||
block.solar-panel.description = Забезпечує невелику кількість енергії від сонця.
|
||||
block.solar-panel-large.description = Значно ефективніша версія стандартної сонячної панелі.
|
||||
block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель.
|
||||
block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості.
|
||||
block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії при максимальній ефективності. Для запуску процесу потрібно значні обсяги енергії.
|
||||
block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії.
|
||||
block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів.
|
||||
block.pneumatic-drill.description = Поліпшений бур, здатний добувати титан. Видобуває швидше, ніж механічний бур.
|
||||
block.laser-drill.description = Дозволяє виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію.
|
||||
block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур.
|
||||
block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію.
|
||||
block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії.
|
||||
block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води.
|
||||
block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки.
|
||||
@@ -1213,15 +1262,15 @@ block.core-nucleus.description = Третя й остання версія ка
|
||||
block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
|
||||
block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
|
||||
block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок.
|
||||
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик дозволяє вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте у нього ресурси та забезпечте енергією.
|
||||
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією.
|
||||
block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше.
|
||||
block.duo.description = Мала і дешева башта. Корисна проти наземних одиниць.
|
||||
block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла у противників.
|
||||
block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць.
|
||||
block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників.
|
||||
block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані.
|
||||
block.hail.description = Невелика артилерійська башта з далеким радіусом дії.
|
||||
block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води.
|
||||
block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії.
|
||||
block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики у противників.
|
||||
block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників.
|
||||
block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно.
|
||||
block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника.
|
||||
block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 811 B After Width: | Height: | Size: 805 B |
Binary file not shown.
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 185 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 186 KiB |
@@ -60,6 +60,8 @@ public class Vars implements Loadable{
|
||||
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
|
||||
/** URL to the JSON file containing all the BE servers. Only queried in BE. */
|
||||
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
|
||||
/** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */
|
||||
public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
|
||||
/** URL of the github issue report template.*/
|
||||
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md";
|
||||
/** list of built-in servers.*/
|
||||
|
||||
@@ -33,7 +33,7 @@ public class BlockIndexer{
|
||||
/** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */
|
||||
private GridBits[] structQuadrants;
|
||||
/** Stores all damaged tile entities by team. */
|
||||
private BuildingArray[] damagedTiles = new BuildingArray[Team.all.length];
|
||||
private ObjectSet<Building>[] damagedTiles = new ObjectSet[Team.all.length];
|
||||
/** All ores available on this map. */
|
||||
private ObjectSet<Item> allOres = new ObjectSet<>();
|
||||
/** Stores teams that are present here as tiles. */
|
||||
@@ -70,7 +70,7 @@ public class BlockIndexer{
|
||||
Events.on(WorldLoadEvent.class, event -> {
|
||||
scanOres.clear();
|
||||
scanOres.addAll(Item.getAllOres());
|
||||
damagedTiles = new BuildingArray[Team.all.length];
|
||||
damagedTiles = new ObjectSet[Team.all.length];
|
||||
flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
|
||||
unitCaps = new int[Team.all.length];
|
||||
activeTeams = new Seq<>(Team.class);
|
||||
@@ -139,14 +139,14 @@ public class BlockIndexer{
|
||||
}
|
||||
|
||||
/** Returns all damaged tiles by team. */
|
||||
public BuildingArray getDamaged(Team team){
|
||||
returnArray.clear();
|
||||
public ObjectSet<Building> getDamaged(Team team){
|
||||
breturnArray.clear();
|
||||
|
||||
if(damagedTiles[team.id] == null){
|
||||
damagedTiles[team.id] = new BuildingArray();
|
||||
damagedTiles[team.id] = new ObjectSet<>();
|
||||
}
|
||||
|
||||
BuildingArray set = damagedTiles[team.id];
|
||||
ObjectSet<Building> set = damagedTiles[team.id];
|
||||
for(Building build : set){
|
||||
if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){
|
||||
breturnArray.add(build);
|
||||
@@ -214,7 +214,7 @@ public class BlockIndexer{
|
||||
|
||||
public void notifyTileDamaged(Building entity){
|
||||
if(damagedTiles[entity.team.id] == null){
|
||||
damagedTiles[entity.team.id] = new BuildingArray();
|
||||
damagedTiles[entity.team.id] = new ObjectSet<Building>();
|
||||
}
|
||||
|
||||
damagedTiles[entity.team.id].add(entity);
|
||||
@@ -476,35 +476,4 @@ public class BlockIndexer{
|
||||
return tiles.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
//TODO copy-pasted code, generics would be nice here
|
||||
public static class BuildingArray implements Iterable<Building>{
|
||||
private Seq<Building> tiles = new Seq<>(false, 16);
|
||||
private IntSet contained = new IntSet();
|
||||
|
||||
public void add(Building tile){
|
||||
if(contained.add(tile.pos())){
|
||||
tiles.add(tile);
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(Building tile){
|
||||
if(contained.remove(tile.pos())){
|
||||
tiles.remove(tile);
|
||||
}
|
||||
}
|
||||
|
||||
public int size(){
|
||||
return tiles.size;
|
||||
}
|
||||
|
||||
public Building first(){
|
||||
return tiles.first();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Building> iterator(){
|
||||
return tiles.iterator();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ public class BuilderAI extends AIController{
|
||||
}
|
||||
|
||||
//find new request
|
||||
if(!unit.team().data().blocks.isEmpty() && following == null){
|
||||
if(!unit.team().data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){
|
||||
Queue<BlockPlan> blocks = unit.team().data().blocks;
|
||||
BlockPlan block = blocks.first();
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package mindustry.ai.types;
|
||||
|
||||
import arc.math.*;
|
||||
import arc.util.*;
|
||||
import mindustry.entities.units.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.meta.*;
|
||||
@@ -59,7 +58,7 @@ public class FlyingAI extends AIController{
|
||||
vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f));
|
||||
}
|
||||
|
||||
vec.setLength(unit.type().speed * Time.delta);
|
||||
vec.setLength(unit.type().speed);
|
||||
|
||||
unit.moveAt(vec);
|
||||
}
|
||||
|
||||
@@ -12,8 +12,8 @@ public class RepairAI extends AIController{
|
||||
boolean shoot = false;
|
||||
|
||||
if(target != null){
|
||||
if(!target.within(unit, unit.type().range)){
|
||||
moveTo(target, unit.type().range * 0.9f);
|
||||
if(!target.within(unit, unit.type().range * 0.8f)){
|
||||
moveTo(target, unit.type().range * 0.8f);
|
||||
}else{
|
||||
unit.aim(target);
|
||||
shoot = true;
|
||||
|
||||
@@ -327,7 +327,7 @@ public class Blocks implements ContentList{
|
||||
|
||||
duneWall = new StaticWall("dune-wall"){{
|
||||
variants = 2;
|
||||
basalt.asFloor().wall = this;
|
||||
basalt.asFloor().wall = darksandWater.asFloor().wall = darksandTaintedWater.asFloor().wall = this;
|
||||
}};
|
||||
|
||||
sandWall = new StaticWall("sand-wall"){{
|
||||
@@ -1011,7 +1011,7 @@ public class Blocks implements ContentList{
|
||||
|
||||
mechanicalPump = new Pump("mechanical-pump"){{
|
||||
requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10));
|
||||
pumpAmount = 0.1f;
|
||||
pumpAmount = 0.11f;
|
||||
}};
|
||||
|
||||
rotaryPump = new Pump("rotary-pump"){{
|
||||
@@ -1136,7 +1136,7 @@ public class Blocks implements ContentList{
|
||||
requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30));
|
||||
powerProduction = 5.5f;
|
||||
itemDuration = 90f;
|
||||
consumes.liquid(Liquids.water, 0.06f);
|
||||
consumes.liquid(Liquids.water, 0.07f);
|
||||
hasLiquids = true;
|
||||
size = 2;
|
||||
}};
|
||||
@@ -1269,7 +1269,7 @@ public class Blocks implements ContentList{
|
||||
hasItems = true;
|
||||
|
||||
consumes.power(0.80f);
|
||||
consumes.liquid(Liquids.water, 0.18f);
|
||||
consumes.liquid(Liquids.water, 0.2f);
|
||||
}};
|
||||
|
||||
oilExtractor = new Fracker("oil-extractor"){{
|
||||
@@ -1645,7 +1645,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
spectre = new ItemTurret("spectre"){{
|
||||
requirements(Category.turret, with(Items.copper, 350, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250));
|
||||
requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250));
|
||||
ammo(
|
||||
Items.graphite, Bullets.standardDenseBig,
|
||||
Items.pyratite, Bullets.standardIncendiaryBig,
|
||||
@@ -1671,7 +1671,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
meltdown = new LaserTurret("meltdown"){{
|
||||
requirements(Category.turret, with(Items.copper, 250, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325));
|
||||
requirements(Category.turret, with(Items.copper, 1200, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325));
|
||||
shootEffect = Fx.shootBigSmoke2;
|
||||
shootCone = 40f;
|
||||
recoilAmount = 4f;
|
||||
|
||||
@@ -41,7 +41,7 @@ public class UnitTypes implements ContentList{
|
||||
//air + building + mining
|
||||
public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType alpha, beta, gamma;
|
||||
|
||||
//water
|
||||
//water + commander
|
||||
public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde;
|
||||
|
||||
//special block unit type
|
||||
|
||||
@@ -5,7 +5,6 @@ import arc.graphics.*;
|
||||
import arc.graphics.Texture.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.util.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.gen.*;
|
||||
@@ -170,8 +169,8 @@ public class Weathers implements ContentList{
|
||||
|
||||
sandstorm = new Weather("sandstorm"){
|
||||
TextureRegion region;
|
||||
float yspeed = 0.3f, xspeed = 6f, size = 140f, padding = size, invDensity = 1500f;
|
||||
Vec2 force = new Vec2(0.45f, 0.01f);
|
||||
float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f;
|
||||
float force = 0.45f;
|
||||
Color color = Color.valueOf("f7cba4");
|
||||
Texture noise;
|
||||
|
||||
@@ -194,22 +193,26 @@ public class Weathers implements ContentList{
|
||||
|
||||
@Override
|
||||
public void update(WeatherState state){
|
||||
float speed = force * state.intensity;
|
||||
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
|
||||
|
||||
for(Unit unit : Groups.unit){
|
||||
unit.impulse(force.x * state.intensity(), force.y * state.intensity());
|
||||
unit.impulse(windx, windy);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawOver(WeatherState state){
|
||||
Draw.tint(color);
|
||||
float speed = baseSpeed * state.intensity;
|
||||
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
|
||||
|
||||
float scale = 1f / 2000f;
|
||||
float scroll = Time.time() * scale;
|
||||
Tmp.tr1.texture = noise;
|
||||
Core.camera.bounds(Tmp.r1);
|
||||
Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale);
|
||||
Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll);
|
||||
Tmp.tr1.scroll(-windx * scroll, windy * scroll);
|
||||
Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height);
|
||||
|
||||
rand.setSeed(0);
|
||||
@@ -224,8 +227,8 @@ public class Weathers implements ContentList{
|
||||
float scl = rand.random(0.5f, 1f);
|
||||
float scl2 = rand.random(0.5f, 1f);
|
||||
float sscl = rand.random(0.5f, 1f);
|
||||
float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2);
|
||||
float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl);
|
||||
float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2);
|
||||
float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl);
|
||||
float alpha = rand.random(0.2f);
|
||||
|
||||
x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f));
|
||||
@@ -247,14 +250,13 @@ public class Weathers implements ContentList{
|
||||
|
||||
sporestorm = new Weather("sporestorm"){
|
||||
TextureRegion region;
|
||||
float yspeed = 1f, xspeed = 4f, size = 5f, padding = size, invDensity = 2000f;
|
||||
float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f;
|
||||
Color color = Color.valueOf("7457ce");
|
||||
Vec2 force = new Vec2(0.25f, 0.01f);
|
||||
Texture noise;
|
||||
|
||||
{
|
||||
attrs.set(Attribute.spores, 0.5f);
|
||||
attrs.set(Attribute.light, -0.1f);
|
||||
attrs.set(Attribute.spores, 1f);
|
||||
attrs.set(Attribute.light, -0.15f);
|
||||
status = StatusEffects.sporeSlowed;
|
||||
statusGround = false;
|
||||
}
|
||||
@@ -269,9 +271,11 @@ public class Weathers implements ContentList{
|
||||
|
||||
@Override
|
||||
public void update(WeatherState state){
|
||||
float speed = force * state.intensity;
|
||||
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
|
||||
|
||||
for(Unit unit : Groups.unit){
|
||||
unit.impulse(force.x * state.intensity(), force.y * state.intensity());
|
||||
unit.impulse(windx, windy);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,12 +289,15 @@ public class Weathers implements ContentList{
|
||||
Draw.alpha(state.opacity * 0.8f);
|
||||
Draw.tint(color);
|
||||
|
||||
float speed = baseSpeed * state.intensity;
|
||||
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
|
||||
|
||||
float scale = 1f / 2000f;
|
||||
float scroll = Time.time() * scale;
|
||||
Tmp.tr1.texture = noise;
|
||||
Core.camera.bounds(Tmp.r1);
|
||||
Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale);
|
||||
Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll);
|
||||
Tmp.tr1.scroll(-windx * scroll, windy * scroll);
|
||||
Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height);
|
||||
|
||||
rand.setSeed(0);
|
||||
@@ -306,8 +313,8 @@ public class Weathers implements ContentList{
|
||||
float scl = rand.random(0.5f, 1f);
|
||||
float scl2 = rand.random(0.5f, 1f);
|
||||
float sscl = rand.random(0.5f, 1f);
|
||||
float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2);
|
||||
float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl);
|
||||
float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2);
|
||||
float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl);
|
||||
float alpha = rand.random(0.1f, 0.8f);
|
||||
|
||||
x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f));
|
||||
|
||||
@@ -329,6 +329,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
}
|
||||
|
||||
public void playTutorial(){
|
||||
ui.showInfo("There is no tutorial yet.");
|
||||
//TODO implement
|
||||
//ui.showInfo("death");
|
||||
/*
|
||||
|
||||
@@ -245,7 +245,8 @@ public class Logic implements ApplicationListener{
|
||||
if(entry.cooldown < 0 && !entry.weather.isActive()){
|
||||
float duration = Mathf.random(entry.minDuration, entry.maxDuration);
|
||||
entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency);
|
||||
Call.createWeather(entry.weather, entry.intensity, duration);
|
||||
Tmp.v1.setToRandomDirection();
|
||||
Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,6 +338,8 @@ public class NetClient implements ApplicationListener{
|
||||
@Remote(variants = Variant.both)
|
||||
public static void setRules(Rules rules){
|
||||
state.rules = rules;
|
||||
//campaign is not valid in multiplayer
|
||||
state.rules.sector = null;
|
||||
}
|
||||
|
||||
@Remote(variants = Variant.both)
|
||||
@@ -547,6 +549,10 @@ public class NetClient implements ApplicationListener{
|
||||
quiet = true;
|
||||
}
|
||||
|
||||
public void clearRemovedEntity(int id){
|
||||
removed.remove(id);
|
||||
}
|
||||
|
||||
public void addRemovedEntity(int id){
|
||||
removed.add(id);
|
||||
}
|
||||
|
||||
@@ -593,38 +593,38 @@ public class NetServer implements ApplicationListener{
|
||||
if(player.isBuilder()){
|
||||
player.builder().clearBuilding();
|
||||
player.builder().updateBuilding(building);
|
||||
|
||||
if(requests != null){
|
||||
for(BuildPlan req : requests){
|
||||
if(req == null) continue;
|
||||
Tile tile = world.tile(req.x, req.y);
|
||||
if(tile == null || (!req.breaking && req.block == null)) continue;
|
||||
//auto-skip done requests
|
||||
if(req.breaking && tile.block() == Blocks.air){
|
||||
continue;
|
||||
}else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){
|
||||
continue;
|
||||
}else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so
|
||||
continue;
|
||||
}else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server
|
||||
action.block = req.block;
|
||||
action.rotation = req.rotation;
|
||||
action.config = req.config;
|
||||
})){
|
||||
//force the player to remove this request if that's not the case
|
||||
Call.removeQueueBlock(player.con, req.x, req.y, req.breaking);
|
||||
con.rejectedRequests.add(req);
|
||||
continue;
|
||||
}
|
||||
player.builder().plans().addLast(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(player.isMiner()){
|
||||
player.miner().mineTile(mining);
|
||||
}
|
||||
|
||||
if(requests != null){
|
||||
for(BuildPlan req : requests){
|
||||
if(req == null) continue;
|
||||
Tile tile = world.tile(req.x, req.y);
|
||||
if(tile == null || (!req.breaking && req.block == null)) continue;
|
||||
//auto-skip done requests
|
||||
if(req.breaking && tile.block() == Blocks.air){
|
||||
continue;
|
||||
}else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){
|
||||
continue;
|
||||
}else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so
|
||||
continue;
|
||||
}else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server
|
||||
action.block = req.block;
|
||||
action.rotation = req.rotation;
|
||||
action.config = req.config;
|
||||
})){
|
||||
//force the player to remove this request if that's not the case
|
||||
Call.removeQueueBlock(player.con, req.x, req.y, req.breaking);
|
||||
con.rejectedRequests.add(req);
|
||||
continue;
|
||||
}
|
||||
player.builder().plans().addLast(req);
|
||||
}
|
||||
}
|
||||
|
||||
con.rejectedRequests.clear();
|
||||
|
||||
if(!player.dead()){
|
||||
|
||||
@@ -5,11 +5,13 @@ import arc.func.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.struct.*;
|
||||
import arc.struct.ObjectIntMap.*;
|
||||
import arc.util.ArcAnnotate.*;
|
||||
import arc.util.*;
|
||||
import arc.util.noise.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.GameState.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.game.Teams.*;
|
||||
@@ -19,7 +21,6 @@ import mindustry.maps.*;
|
||||
import mindustry.maps.filters.*;
|
||||
import mindustry.maps.filters.GenerateFilter.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.type.Sector.*;
|
||||
import mindustry.type.Weather.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.environment.*;
|
||||
@@ -33,11 +34,17 @@ public class World{
|
||||
public @NonNull Tiles tiles = new Tiles(0, 0);
|
||||
|
||||
private boolean generating, invalidMap;
|
||||
private ObjectMap<Map, Runnable> customMapLoaders = new ObjectMap<>();
|
||||
|
||||
public World(){
|
||||
|
||||
}
|
||||
|
||||
/** Adds a custom handler function for loading a custom map - usually a generated one. */
|
||||
public void addMapLoader(Map map, Runnable loader){
|
||||
customMapLoaders.put(map, loader);
|
||||
}
|
||||
|
||||
public boolean isInvalidMap(){
|
||||
return invalidMap;
|
||||
}
|
||||
@@ -255,9 +262,71 @@ public class World{
|
||||
|
||||
state.rules.weather.clear();
|
||||
|
||||
if(sector.is(SectorAttribute.rainy)) state.rules.weather.add(new WeatherEntry(Weathers.rain));
|
||||
if(sector.is(SectorAttribute.snowy)) state.rules.weather.add(new WeatherEntry(Weathers.snow));
|
||||
if(sector.is(SectorAttribute.desert)) state.rules.weather.add(new WeatherEntry(Weathers.sandstorm));
|
||||
//apply weather based on terrain
|
||||
ObjectIntMap<Block> floorc = new ObjectIntMap<>();
|
||||
ObjectSet<UnlockableContent> content = new ObjectSet<>();
|
||||
|
||||
float waterFloors = 0, totalFloors = 0;
|
||||
|
||||
for(Tile tile : world.tiles){
|
||||
if(world.getDarkness(tile.x, tile.y) >= 3){
|
||||
continue;
|
||||
}
|
||||
|
||||
Liquid liquid = tile.floor().liquidDrop;
|
||||
if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop);
|
||||
if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop);
|
||||
if(liquid != null) content.add(liquid);
|
||||
|
||||
if(!tile.block().isStatic()){
|
||||
totalFloors ++;
|
||||
if(liquid == Liquids.water){
|
||||
waterFloors += tile.floor().isDeep() ? 1f : 0.7f;
|
||||
}
|
||||
floorc.increment(tile.floor());
|
||||
if(tile.overlay() != Blocks.air){
|
||||
floorc.increment(tile.overlay());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//sort counts in descending order
|
||||
Seq<Entry<Block>> entries = floorc.entries().toArray();
|
||||
entries.sort(e -> -e.value);
|
||||
//remove all blocks occuring < 30 times - unimportant
|
||||
entries.removeAll(e -> e.value < 30);
|
||||
|
||||
Block[] floors = new Block[entries.size];
|
||||
int[] floorCounts = new int[entries.size];
|
||||
for(int i = 0; i < entries.size; i++){
|
||||
floorCounts[i] = entries.get(i).value;
|
||||
floors[i] = entries.get(i).key;
|
||||
}
|
||||
|
||||
//TODO bad code
|
||||
boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow");
|
||||
boolean hasRain = !hasSnow && floors[0].name.contains("water");
|
||||
boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand");
|
||||
boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted");
|
||||
|
||||
if(hasSnow){
|
||||
state.rules.weather.add(new WeatherEntry(Weathers.snow));
|
||||
}
|
||||
|
||||
if(hasRain){
|
||||
state.rules.weather.add(new WeatherEntry(Weathers.rain));
|
||||
}
|
||||
|
||||
if(hasDesert){
|
||||
state.rules.weather.add(new WeatherEntry(Weathers.sandstorm));
|
||||
}
|
||||
|
||||
if(hasSpores){
|
||||
state.rules.weather.add(new WeatherEntry(Weathers.sporestorm));
|
||||
}
|
||||
|
||||
state.secinfo.resources = content.asArray();
|
||||
state.secinfo.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id)));
|
||||
|
||||
}
|
||||
|
||||
@@ -270,6 +339,12 @@ public class World{
|
||||
}
|
||||
|
||||
public void loadMap(Map map, Rules checkRules){
|
||||
//load using custom loader if possible
|
||||
if(customMapLoaders.containsKey(map)){
|
||||
customMapLoaders.get(map).run();
|
||||
return;
|
||||
}
|
||||
|
||||
try{
|
||||
SaveIO.load(map.file, new FilterContext(map));
|
||||
}catch(Throwable e){
|
||||
|
||||
@@ -20,7 +20,7 @@ public class EditorTile extends Tile{
|
||||
|
||||
@Override
|
||||
public void setFloor(@NonNull Floor type){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.setFloor(type);
|
||||
return;
|
||||
}
|
||||
@@ -41,20 +41,25 @@ public class EditorTile extends Tile{
|
||||
|
||||
@Override
|
||||
public void setBlock(Block type, Team team, int rotation){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.setBlock(type, team, rotation);
|
||||
return;
|
||||
}
|
||||
|
||||
op(OpType.block, block.id);
|
||||
//if(this.block == type && (build == null || build.rotation == rotation)){
|
||||
// ui.editor.editor.renderer().updatePoint(x, y);
|
||||
// return;
|
||||
//}
|
||||
|
||||
if(rotation != 0) op(OpType.rotation, (byte)rotation);
|
||||
if(team() != Team.derelict) op(OpType.team, (byte)team().id);
|
||||
op(OpType.block, block.id);
|
||||
super.setBlock(type, team, rotation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTeam(Team team){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.setTeam(team);
|
||||
return;
|
||||
}
|
||||
@@ -66,7 +71,7 @@ public class EditorTile extends Tile{
|
||||
|
||||
@Override
|
||||
public void setOverlay(Block overlay){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.setOverlay(overlay);
|
||||
return;
|
||||
}
|
||||
@@ -79,7 +84,7 @@ public class EditorTile extends Tile{
|
||||
|
||||
@Override
|
||||
protected void fireChanged(){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.fireChanged();
|
||||
}else{
|
||||
ui.editor.editor.renderer().updatePoint(x, y);
|
||||
@@ -88,14 +93,14 @@ public class EditorTile extends Tile{
|
||||
|
||||
@Override
|
||||
public void recache(){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.recache();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void changeEntity(Team team, Prov<Building> entityprov, int rotation){
|
||||
if(state.isGame()){
|
||||
if(skip()){
|
||||
super.changeEntity(team, entityprov, rotation);
|
||||
return;
|
||||
}
|
||||
@@ -116,6 +121,10 @@ public class EditorTile extends Tile{
|
||||
}
|
||||
}
|
||||
|
||||
private boolean skip(){
|
||||
return state.isGame() || ui.editor.editor.isLoading();
|
||||
}
|
||||
|
||||
private void op(OpType type, short value){
|
||||
ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value));
|
||||
}
|
||||
|
||||
@@ -31,6 +31,10 @@ public class MapEditor{
|
||||
public Block drawBlock = Blocks.stone;
|
||||
public Team drawTeam = Team.sharded;
|
||||
|
||||
public boolean isLoading(){
|
||||
return loading;
|
||||
}
|
||||
|
||||
public StringMap getTags(){
|
||||
return tags;
|
||||
}
|
||||
@@ -52,7 +56,7 @@ public class MapEditor{
|
||||
if(map.file.parent().parent().name().equals("1127400") && steam){
|
||||
tags.put("steamid", map.file.parent().name());
|
||||
}
|
||||
MapIO.loadMap(map, context);
|
||||
load(() -> MapIO.loadMap(map, context));
|
||||
renderer.resize(width(), height());
|
||||
loading = false;
|
||||
}
|
||||
|
||||
@@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{
|
||||
}
|
||||
}).grow().left().pad(6).top();
|
||||
}).width(280f).pad(3).top().left().fillY();
|
||||
|
||||
|
||||
if(++i % cols == 0){
|
||||
filterTable.row();
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ public class MapRenderer implements Disposable{
|
||||
wx * tilesize + wall.offset + (tilesize - width) / 2f,
|
||||
wy * tilesize + wall.offset + (tilesize - height) / 2f,
|
||||
width, height,
|
||||
tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg() - 90);
|
||||
tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg());
|
||||
}else{
|
||||
region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)];
|
||||
|
||||
|
||||
@@ -255,7 +255,13 @@ public class MapView extends Element implements GestureListener{
|
||||
Draw.color(Color.gray);
|
||||
image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
|
||||
image.draw();
|
||||
Draw.color();
|
||||
|
||||
Lines.stroke(3f);
|
||||
Draw.color(Pal.accent);
|
||||
Lines.line(centerx - sclwidth/2f, centery, centerx + sclwidth/2f, centery);
|
||||
Lines.line(centerx, centery - sclheight/2f, centerx, centery + sclheight/2f);
|
||||
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
int index = 0;
|
||||
|
||||
@@ -10,7 +10,7 @@ import static mindustry.Vars.*;
|
||||
|
||||
public class EntityCollisions{
|
||||
//range for tile collision scanning
|
||||
private static final int r = 2;
|
||||
private static final int r = 1;
|
||||
//move in 1-unit chunks
|
||||
private static final float seg = 1f;
|
||||
|
||||
|
||||
@@ -39,10 +39,15 @@ public class SapBulletType extends BulletType{
|
||||
|
||||
Draw.reset();
|
||||
|
||||
Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f);
|
||||
Drawf.light(b.team, b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(Bullet b){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public float range(){
|
||||
return length;
|
||||
|
||||
@@ -61,7 +61,8 @@ abstract class HitboxComp implements Posc, QuadTreeObject{
|
||||
}
|
||||
|
||||
public void hitboxTile(Rect rect){
|
||||
float size = hitSize * 0.66f;
|
||||
//tile hitboxes are never bigger than a tile, otherwise units get stuck
|
||||
float size = Math.min(hitSize * 0.66f, 7.9f);
|
||||
rect.setCentered(x, y, size, size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,6 +71,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
|
||||
boolean tryDropPayload(Payload payload){
|
||||
Tile on = tileOn();
|
||||
|
||||
//clear removed state of unit so it can be synced
|
||||
if(Vars.net.client() && payload instanceof UnitPayload){
|
||||
Vars.netClient.clearRemovedEntity(((UnitPayload)payload).unit.id);
|
||||
}
|
||||
|
||||
//drop off payload on an acceptor if possible
|
||||
if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){
|
||||
Fx.unitDrop.at(on.build);
|
||||
|
||||
@@ -17,6 +17,7 @@ public class AIController implements UnitController{
|
||||
protected static final Vec2 vec = new Vec2();
|
||||
protected static final int timerTarget = 0;
|
||||
protected static final int timerTarget2 = 1;
|
||||
protected static final int timerTarget3 = 2;
|
||||
|
||||
protected Unit unit;
|
||||
protected Interval timer = new Interval(4);
|
||||
@@ -151,7 +152,7 @@ public class AIController implements UnitController{
|
||||
vec.rotate((circleLength - vec.len()) / circleLength * 180f);
|
||||
}
|
||||
|
||||
vec.setLength(speed * Time.delta);
|
||||
vec.setLength(speed);
|
||||
|
||||
unit.moveAt(vec);
|
||||
}
|
||||
@@ -163,7 +164,7 @@ public class AIController implements UnitController{
|
||||
|
||||
float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / 100f, -1f, 1f);
|
||||
|
||||
vec.setLength(unit.type().speed * Time.delta * length);
|
||||
vec.setLength(unit.type().speed * length);
|
||||
if(length < -0.5f){
|
||||
vec.rotate(180f);
|
||||
}else if(length < 0){
|
||||
|
||||
@@ -2,9 +2,10 @@ package mindustry.game;
|
||||
|
||||
import arc.math.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import arc.util.ArcAnnotate.*;
|
||||
import arc.util.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||
@@ -32,6 +33,8 @@ public class SectorInfo{
|
||||
public boolean hasCore = true;
|
||||
/** Sector that was launched from. */
|
||||
public @Nullable Sector origin;
|
||||
/** Resources known to occur at this sector. */
|
||||
public Seq<UnlockableContent> resources = new Seq<>();
|
||||
/** Time spent at this sector. Do not use unless you know what you're doing. */
|
||||
public transient float internalTimeSpent;
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ public class Stats{
|
||||
|
||||
//weigh used fractions
|
||||
float frac = 0f;
|
||||
Seq<Item> obtainable = Seq.select(zone.data.resources, i -> i instanceof Item).as();
|
||||
Seq<Item> obtainable = zone.save == null ? new Seq<>() : zone.save.meta.secinfo.resources.select(i -> i instanceof Item).as();
|
||||
for(Item item : obtainable){
|
||||
frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public enum CacheLayer{
|
||||
}
|
||||
},
|
||||
normal(5),
|
||||
walls;
|
||||
walls(3);
|
||||
|
||||
public static final CacheLayer[] all = values();
|
||||
/** Capacity multiplier. */
|
||||
|
||||
@@ -228,7 +228,7 @@ public class FloorRenderer implements Disposable{
|
||||
int chunksx = Mathf.ceil((float)(world.width()) / chunksize),
|
||||
chunksy = Mathf.ceil((float)(world.height()) / chunksize);
|
||||
cache = new Chunk[chunksx][chunksy];
|
||||
cbatch = new MultiCacheBatch(chunksize * chunksize * 6);
|
||||
cbatch = new MultiCacheBatch(chunksize * chunksize * 7);
|
||||
|
||||
Time.mark();
|
||||
|
||||
|
||||
@@ -96,24 +96,24 @@ public class IndexedRenderer implements Disposable{
|
||||
vertices[idx++] = v2;
|
||||
|
||||
//tri2
|
||||
vertices[idx++] = x;
|
||||
vertices[idx++] = y;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u;
|
||||
vertices[idx++] = v;
|
||||
|
||||
vertices[idx++] = fx2;
|
||||
vertices[idx++] = y;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v;
|
||||
|
||||
vertices[idx++] = fx2;
|
||||
vertices[idx++] = fy2;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v2;
|
||||
|
||||
vertices[idx++] = fx2;
|
||||
vertices[idx++] = y;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v;
|
||||
|
||||
vertices[idx++] = x;
|
||||
vertices[idx++] = y;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u;
|
||||
vertices[idx++] = v;
|
||||
|
||||
mesh.updateVertices(index * vsize * 6, vertices);
|
||||
}
|
||||
|
||||
@@ -155,6 +155,19 @@ public class IndexedRenderer implements Disposable{
|
||||
vertices[idx++] = u;
|
||||
vertices[idx++] = v;
|
||||
|
||||
vertices[idx++] = x2;
|
||||
vertices[idx++] = y2;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u;
|
||||
vertices[idx++] = v2;
|
||||
|
||||
vertices[idx++] = x3;
|
||||
vertices[idx++] = y3;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v2;
|
||||
|
||||
//tri2
|
||||
vertices[idx++] = x3;
|
||||
vertices[idx++] = y3;
|
||||
vertices[idx++] = color;
|
||||
@@ -164,28 +177,15 @@ public class IndexedRenderer implements Disposable{
|
||||
vertices[idx++] = x4;
|
||||
vertices[idx++] = y4;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u;
|
||||
vertices[idx++] = v2;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v;
|
||||
|
||||
//tri2
|
||||
vertices[idx++] = x1;
|
||||
vertices[idx++] = y1;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u;
|
||||
vertices[idx++] = v;
|
||||
|
||||
vertices[idx++] = x2;
|
||||
vertices[idx++] = y2;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v;
|
||||
|
||||
vertices[idx++] = x3;
|
||||
vertices[idx++] = y3;
|
||||
vertices[idx++] = color;
|
||||
vertices[idx++] = u2;
|
||||
vertices[idx++] = v2;
|
||||
|
||||
mesh.updateVertices(index * vsize * 6, vertices);
|
||||
}
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
|
||||
@Remote(targets = Loc.both, forward = true, called = Loc.server)
|
||||
public static void transferInventory(Player player, Building tile){
|
||||
if(player == null || tile == null || !player.within(tile, buildingRange)) return;
|
||||
if(player == null || tile == null || !player.within(tile, buildingRange) || tile.items == null) return;
|
||||
|
||||
if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, tile) ||
|
||||
!netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> {
|
||||
|
||||
@@ -100,6 +100,20 @@ public class JsonIO{
|
||||
}
|
||||
});
|
||||
|
||||
json.setSerializer(Liquid.class, new Serializer<Liquid>(){
|
||||
@Override
|
||||
public void write(Json json, Liquid object, Class knownType){
|
||||
json.writeValue(object.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Liquid read(Json json, JsonValue jsonData, Class type){
|
||||
if(jsonData.asString() == null) return Liquids.water;
|
||||
Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString());
|
||||
return i == null ? Liquids.water : i;
|
||||
}
|
||||
});
|
||||
|
||||
json.setSerializer(Item.class, new Serializer<Item>(){
|
||||
@Override
|
||||
public void write(Json json, Item object, Class knownType){
|
||||
@@ -165,6 +179,21 @@ public class JsonIO{
|
||||
return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount"));
|
||||
}
|
||||
});
|
||||
|
||||
json.setSerializer(UnlockableContent.class, new Serializer<UnlockableContent>(){
|
||||
@Override
|
||||
public void write(Json json, UnlockableContent object, Class knownType){
|
||||
json.writeValue(object.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnlockableContent read(Json json, JsonValue jsonData, Class type){
|
||||
String str = jsonData.asString();
|
||||
Item item = Vars.content.getByName(ContentType.item, str);
|
||||
Liquid liquid = Vars.content.getByName(ContentType.liquid, str);
|
||||
return item != null ? item : liquid;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static class CustomJson extends Json{
|
||||
|
||||
@@ -77,6 +77,7 @@ public class SaveIO{
|
||||
try{
|
||||
return getMeta(getStream(file));
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
return getMeta(getBackupStream(file));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ public enum LogicOp{
|
||||
greaterThan(">", (a, b) -> a > b ? 1 : 0),
|
||||
greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0),
|
||||
pow("^", Math::pow),
|
||||
shl(">>", (a, b) -> (long)a >> (long)b),
|
||||
shr("<<", (a, b) -> (long)a << (long)b),
|
||||
shl("<<", (a, b) -> (long)a << (long)b),
|
||||
shr(">>", (a, b) -> (long)a >> (long)b),
|
||||
or("or", (a, b) -> (long)a | (long)b),
|
||||
and("and", (a, b) -> (long)a & (long)b),
|
||||
xor("xor", (a, b) -> (long)a ^ (long)b),
|
||||
|
||||
@@ -130,7 +130,7 @@ public class Map implements Comparable<Map>, Publishable{
|
||||
}
|
||||
|
||||
public String tag(String name){
|
||||
return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown");
|
||||
return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown", "unknown");
|
||||
}
|
||||
|
||||
public boolean hasTag(String name){
|
||||
|
||||
@@ -59,6 +59,7 @@ public class Maps{
|
||||
|
||||
/** @return the next map to shuffle to. May be null, in which case the server should be stopped. */
|
||||
public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){
|
||||
if(shuffler != null) return shuffler.next(mode, previous);
|
||||
return shuffleMode.next(mode, previous);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@ import mindustry.world.blocks.environment.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public abstract class FilterOption{
|
||||
public static final Boolf<Block> floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full));
|
||||
public static final Boolf<Block> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full));
|
||||
public static final Boolf<Block> floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)));
|
||||
public static final Boolf<Block> wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)));
|
||||
public static final Boolf<Block> wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)));
|
||||
public static final Boolf<Block> floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full));
|
||||
public static final Boolf<Block> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)) && b.inEditor;
|
||||
public static final Boolf<Block> floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)));
|
||||
public static final Boolf<Block> wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)));
|
||||
public static final Boolf<Block> wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))) && b.inEditor;
|
||||
public static final Boolf<Block> oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full));
|
||||
public static final Boolf<Block> anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air;
|
||||
public static final Boolf<Block> anyOptional = b -> (floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air) && b.inEditor;
|
||||
|
||||
public abstract void build(Table table);
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ package mindustry.maps.generators;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.io.*;
|
||||
import mindustry.maps.*;
|
||||
@@ -29,12 +28,13 @@ public class FileMapGenerator implements WorldGenerator{
|
||||
world.setGenerating(true);
|
||||
|
||||
tiles = world.tiles;
|
||||
Item[] items = {Items.blastCompound, Items.pyratite, Items.copper, Items.thorium, Items.copper, Items.lead};
|
||||
|
||||
for(Tile tile : tiles){
|
||||
if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && state.hasSector()){
|
||||
for(Content content : state.getSector().data.resources){
|
||||
if(content instanceof Item && Mathf.chance(0.3)){
|
||||
tile.build.items.add((Item)content, Math.min(Mathf.random(500), tile.block().itemCapacity));
|
||||
for(Item content : items){
|
||||
if(Mathf.chance(0.2)){
|
||||
tile.build.items.add(content, Math.min(Mathf.random(500), tile.block().itemCapacity));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import arc.util.noise.*;
|
||||
import mindustry.graphics.g3d.*;
|
||||
import mindustry.graphics.g3d.PlanetGrid.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.type.Sector.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{
|
||||
@@ -24,7 +23,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
|
||||
|
||||
if(noise < 0.15){
|
||||
for(Ptile other : tile.tiles){
|
||||
if(sector.planet.getSector(other).is(SectorAttribute.base)){
|
||||
if(sector.planet.getSector(other).generateEnemyBase){
|
||||
any = false;
|
||||
break;
|
||||
}
|
||||
@@ -32,7 +31,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
|
||||
}
|
||||
|
||||
if(any){
|
||||
sector.data.attributes |= (1 << SectorAttribute.base.ordinal());
|
||||
sector.generateEnemyBase = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -600,9 +600,14 @@ public class Mods implements Loadable{
|
||||
zip = zip.list()[0];
|
||||
}
|
||||
|
||||
Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json");
|
||||
Fi metaf =
|
||||
zip.child("mod.json").exists() ? zip.child("mod.json") :
|
||||
zip.child("mod.hjson").exists() ? zip.child("mod.hjson") :
|
||||
zip.child("plugin.json").exists() ? zip.child("plugin.json") :
|
||||
zip.child("plugin.hjson");
|
||||
|
||||
if(!metaf.exists()){
|
||||
Log.warn("Mod @ doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile);
|
||||
Log.warn("Mod @ doesn't have a '[mod/plugin].[h]json' file, skipping.", sourceFile);
|
||||
throw new IllegalArgumentException("Invalid file: No mod.json found.");
|
||||
}
|
||||
|
||||
@@ -646,7 +651,9 @@ public class Mods implements Loadable{
|
||||
meta.hidden = true;
|
||||
}
|
||||
|
||||
Log.info("Loaded mod '@' in @", meta.name, Time.elapsed());
|
||||
if(!headless){
|
||||
Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed());
|
||||
}
|
||||
return new LoadedMod(sourceFile, zip, mainMod, meta);
|
||||
|
||||
}catch(Exception e){
|
||||
|
||||
@@ -42,6 +42,8 @@ public class NetworkIO{
|
||||
try(DataInputStream stream = new DataInputStream(is)){
|
||||
Time.clear();
|
||||
state.rules = JsonIO.read(Rules.class, stream.readUTF());
|
||||
//campaign is not valid in multiplayer
|
||||
state.rules.sector = null;
|
||||
state.map = new Map(SaveIO.getSaveWriter().readStringMap(stream));
|
||||
|
||||
state.wave = stream.readInt();
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package mindustry.type;
|
||||
|
||||
import arc.*;
|
||||
import arc.files.*;
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.math.*;
|
||||
@@ -10,15 +9,12 @@ import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.ArcAnnotate.*;
|
||||
import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import arc.util.noise.*;
|
||||
import mindustry.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.graphics.g3d.*;
|
||||
import mindustry.graphics.g3d.PlanetGrid.*;
|
||||
import mindustry.maps.generators.*;
|
||||
import mindustry.type.Sector.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
@@ -83,25 +79,10 @@ public class Planet extends UnlockableContent{
|
||||
|
||||
sectors = new Seq<>(grid.tiles.length);
|
||||
for(int i = 0; i < grid.tiles.length; i++){
|
||||
sectors.add(new Sector(this, grid.tiles[i], new SectorData()));
|
||||
sectors.add(new Sector(this, grid.tiles[i]));
|
||||
}
|
||||
|
||||
sectorApproxRadius = sectors.first().tile.v.dst(sectors.first().tile.corners[0].v);
|
||||
|
||||
//read data for sectors
|
||||
Fi data = Vars.tree.get("planets/" + name + ".dat");
|
||||
if(data.exists()){
|
||||
try{
|
||||
try(Reads read = data.reads()){
|
||||
short dsize = read.s();
|
||||
for(int i = 0; i < dsize; i++){
|
||||
sectors.get(i).data.read(read);
|
||||
}
|
||||
}
|
||||
}catch(Throwable t){
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
}else{
|
||||
sectors = new Seq<>();
|
||||
}
|
||||
@@ -196,7 +177,7 @@ public class Planet extends UnlockableContent{
|
||||
for(Sector sector : sectors){
|
||||
float sum = 1f;
|
||||
for(Sector other : sector.inRange(2)){
|
||||
if(other.is(SectorAttribute.base)){
|
||||
if(other.generateEnemyBase){
|
||||
sum += 1f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,12 +7,9 @@ import arc.struct.ObjectIntMap.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.ArcAnnotate.*;
|
||||
import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.game.Saves.*;
|
||||
import mindustry.graphics.g3d.PlanetGrid.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
@@ -27,24 +24,22 @@ public class Sector{
|
||||
public final Ptile tile;
|
||||
public final int id;
|
||||
|
||||
public final SectorData data;
|
||||
|
||||
public @Nullable SaveSlot save;
|
||||
public @Nullable SectorPreset preset;
|
||||
|
||||
/** Number 0-1 indicating the difficulty based on nearby bases. */
|
||||
public float baseCoverage;
|
||||
public boolean generateEnemyBase;
|
||||
|
||||
//TODO implement a dynamic launch period
|
||||
public int launchPeriod = 10;
|
||||
|
||||
public Sector(Planet planet, Ptile tile, SectorData data){
|
||||
public Sector(Planet planet, Ptile tile){
|
||||
this.planet = planet;
|
||||
this.tile = tile;
|
||||
this.plane = new Plane();
|
||||
this.rect = makeRect();
|
||||
this.id = tile.id;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Seq<Sector> inRange(int range){
|
||||
@@ -100,7 +95,7 @@ public class Sector{
|
||||
|
||||
/** @return whether the enemy has a generated base here. */
|
||||
public boolean hasEnemyBase(){
|
||||
return is(SectorAttribute.base) && (save == null || save.meta.rules.waves);
|
||||
return generateEnemyBase && (save == null || save.meta.rules.waves);
|
||||
}
|
||||
|
||||
public boolean isBeingPlayed(){
|
||||
@@ -311,10 +306,6 @@ public class Sector{
|
||||
return new SectorRect(radius, center, planeTop, planeRight, angle);
|
||||
}
|
||||
|
||||
public boolean is(SectorAttribute attribute){
|
||||
return (data.attributes & (1 << attribute.ordinal())) != 0;
|
||||
}
|
||||
|
||||
public static class SectorRect{
|
||||
public final Vec3 center, top, right;
|
||||
public final Vec3 result = new Vec3();
|
||||
@@ -335,64 +326,4 @@ public class Sector{
|
||||
return result.set(center).add(right, nx).add(top, ny);
|
||||
}
|
||||
}
|
||||
|
||||
/** Cached data about a sector. */
|
||||
public static class SectorData{
|
||||
public UnlockableContent[] resources = {};
|
||||
public int spawnX, spawnY;
|
||||
|
||||
public Block[] floors = {};
|
||||
public int[] floorCounts = {};
|
||||
public int attributes;
|
||||
|
||||
public void write(Writes write){
|
||||
write.s(resources.length);
|
||||
for(Content resource : resources){
|
||||
write.b(resource.getContentType().ordinal());
|
||||
write.s(resource.id);
|
||||
}
|
||||
write.s(spawnX);
|
||||
write.s(spawnY);
|
||||
write.s(floors.length);
|
||||
for(int i = 0; i < floors.length; i++){
|
||||
write.s(floors[i].id);
|
||||
write.i(floorCounts[i]);
|
||||
}
|
||||
|
||||
write.i(attributes);
|
||||
}
|
||||
|
||||
public void read(Reads read){
|
||||
resources = new UnlockableContent[read.s()];
|
||||
for(int i = 0; i < resources.length; i++){
|
||||
resources[i] = Vars.content.getByID(ContentType.all[read.b()], read.s());
|
||||
}
|
||||
spawnX = read.s();
|
||||
spawnY = read.s();
|
||||
floors = new Block[read.s()];
|
||||
floorCounts = new int[floors.length];
|
||||
for(int i = 0; i < floors.length; i++){
|
||||
floors[i] = Vars.content.block(read.s());
|
||||
floorCounts[i] = read.i();
|
||||
}
|
||||
attributes = read.i();
|
||||
}
|
||||
}
|
||||
|
||||
public enum SectorAttribute{
|
||||
/** Requires naval technology to land on, e.g. mostly water */
|
||||
naval,
|
||||
/** Has rain. */
|
||||
rainy,
|
||||
/** Has snow. */
|
||||
snowy,
|
||||
/** Has sandstorms. */
|
||||
desert,
|
||||
/** Has an enemy base. */
|
||||
base,
|
||||
/** Has spore weather. */
|
||||
spores,
|
||||
/** Path from core to spawns requires traversing water. */
|
||||
navalPath
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import arc.func.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.util.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
@@ -14,7 +15,7 @@ import mindustry.world.blocks.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public abstract class Weather extends MappableContent{
|
||||
public abstract class Weather extends UnlockableContent{
|
||||
/** Default duration of this weather event in ticks. */
|
||||
public float duration = 9f * Time.toMinutes;
|
||||
public Attributes attrs = new Attributes();
|
||||
@@ -89,14 +90,24 @@ public abstract class Weather extends MappableContent{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayInfo(Table table){
|
||||
//do not
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHidden(){
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContentType getContentType(){
|
||||
return ContentType.weather;
|
||||
}
|
||||
|
||||
@Remote(called = Loc.server)
|
||||
public static void createWeather(Weather weather, float intensity, float duration){
|
||||
weather.create(intensity, duration);
|
||||
public static void createWeather(Weather weather, float intensity, float duration, float windX, float windY){
|
||||
weather.create(intensity, duration).windVector.set(windX, windY);
|
||||
}
|
||||
|
||||
public static class WeatherEntry{
|
||||
@@ -104,7 +115,7 @@ public abstract class Weather extends MappableContent{
|
||||
public Weather weather;
|
||||
/** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */
|
||||
public float minFrequency, maxFrequency, minDuration, maxDuration;
|
||||
/** Cooldown time before the next weather event takes place. */
|
||||
/** Cooldown time before the next weather event takes place This is *state*, not configuration. */
|
||||
public float cooldown;
|
||||
/** Intensity of the weather produced. */
|
||||
public float intensity = 1f;
|
||||
@@ -132,12 +143,12 @@ public abstract class Weather extends MappableContent{
|
||||
|
||||
@EntityDef(value = {WeatherStatec.class}, pooled = true, isFinal = false)
|
||||
@Component(base = true)
|
||||
abstract static class WeatherStateComp implements Drawc{
|
||||
abstract static class WeatherStateComp implements Drawc, Syncc{
|
||||
private static final float fadeTime = 60 * 4;
|
||||
|
||||
Weather weather;
|
||||
float intensity = 1f, opacity = 0f, life, effectTimer;
|
||||
Vec2 windVector = new Vec2();
|
||||
Vec2 windVector = new Vec2().setToRandomDirection();
|
||||
|
||||
void init(Weather weather){
|
||||
this.weather = weather;
|
||||
@@ -146,7 +157,7 @@ public abstract class Weather extends MappableContent{
|
||||
@Override
|
||||
public void update(){
|
||||
if(life < fadeTime){
|
||||
opacity = life / fadeTime;
|
||||
opacity = Math.min(life / fadeTime, opacity);
|
||||
}else{
|
||||
opacity = Mathf.lerpDelta(opacity, 1f, 0.004f);
|
||||
}
|
||||
|
||||
@@ -115,7 +115,9 @@ public class Fonts{
|
||||
|
||||
/** Called from a static context for use in the loading screen.*/
|
||||
public static void loadDefaultFont(){
|
||||
UI.packer = new PixmapPacker(2048, 2048, Format.rgba8888, 2, true);
|
||||
int max = Gl.getInt(Gl.maxTextureSize);
|
||||
|
||||
UI.packer = new PixmapPacker(max >= 4096 ? 4096 : 2048, 2048, Format.rgba8888, 2, true);
|
||||
FileHandleResolver resolver = new InternalFileHandleResolver();
|
||||
Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
|
||||
Core.assets.setLoader(Font.class, null, new FreetypeFontLoader(resolver){
|
||||
|
||||
@@ -3,19 +3,24 @@ package mindustry.ui.dialogs;
|
||||
import arc.*;
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.math.*;
|
||||
import arc.scene.style.*;
|
||||
import arc.scene.ui.*;
|
||||
import arc.scene.ui.ImageButton.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.type.Weather.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
import static arc.util.Time.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class CustomRulesDialog extends BaseDialog{
|
||||
@@ -176,8 +181,9 @@ public class CustomRulesDialog extends BaseDialog{
|
||||
}}).grow();
|
||||
}).margin(4).size(50f).padRight(10);
|
||||
b.add("@rules.ambientlight");
|
||||
}, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f);
|
||||
main.row();
|
||||
}, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row();
|
||||
|
||||
main.button("@rules.weather", this::weatherDialog).width(250f).left().row();
|
||||
|
||||
//TODO add weather patterns
|
||||
}
|
||||
@@ -214,4 +220,120 @@ public class CustomRulesDialog extends BaseDialog{
|
||||
main.image().color(Pal.accent).height(3f).padRight(100f).padBottom(20);
|
||||
main.row();
|
||||
}
|
||||
|
||||
Cell<TextField> field(Table table, float value, Floatc setter){
|
||||
return table.field(Strings.autoFixed(value, 2), v -> setter.get(Strings.parseFloat(v)))
|
||||
.valid(Strings::canParsePositiveFloat)
|
||||
.size(90f, 40f).pad(2f).addInputDialog();
|
||||
}
|
||||
|
||||
void weatherDialog(){
|
||||
BaseDialog dialog = new BaseDialog("@rules.weather");
|
||||
Runnable[] rebuild = {null};
|
||||
|
||||
dialog.cont.pane(base -> {
|
||||
|
||||
rebuild[0] = () -> {
|
||||
base.clearChildren();
|
||||
int cols = Math.max(1, Core.graphics.getWidth() / 460);
|
||||
int idx = 0;
|
||||
|
||||
for(WeatherEntry entry : rules.weather){
|
||||
base.top();
|
||||
//main container
|
||||
base.table(Tex.pane, c -> {
|
||||
c.margin(0);
|
||||
|
||||
//icons to perform actions
|
||||
c.table(Tex.whiteui, t -> {
|
||||
t.setColor(Pal.gray);
|
||||
|
||||
t.top().left();
|
||||
t.add(entry.weather.localizedName).left().padLeft(6);
|
||||
|
||||
t.add().growX();
|
||||
|
||||
ImageButtonStyle style = Styles.geni;
|
||||
t.defaults().size(42f);
|
||||
|
||||
t.button(Icon.cancel, style, () -> {
|
||||
rules.weather.remove(entry);
|
||||
rebuild[0].run();
|
||||
});
|
||||
}).growX();
|
||||
|
||||
c.row();
|
||||
|
||||
//all the options
|
||||
c.table(f -> {
|
||||
f.marginLeft(4);
|
||||
f.left().top();
|
||||
|
||||
f.defaults().padRight(4).left();
|
||||
|
||||
f.add("@rules.weather.duration");
|
||||
field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes);
|
||||
f.add("@waves.to");
|
||||
field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes);
|
||||
f.add("@unit.minutes");
|
||||
|
||||
f.row();
|
||||
|
||||
f.add("@rules.weather.frequency");
|
||||
field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes);
|
||||
f.add("@waves.to");
|
||||
field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes);
|
||||
f.add("@unit.minutes");
|
||||
|
||||
//intensity can't currently be customized
|
||||
|
||||
}).grow().left().pad(6).top();
|
||||
}).width(410f).pad(3).top().left().fillY();
|
||||
|
||||
if(++idx % cols == 0){
|
||||
base.row();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
rebuild[0].run();
|
||||
}).grow();
|
||||
|
||||
dialog.addCloseButton();
|
||||
|
||||
dialog.buttons.button("@add", Icon.add, () -> {
|
||||
BaseDialog addd = new BaseDialog("@add");
|
||||
addd.cont.pane(t -> {
|
||||
t.background(Tex.button);
|
||||
int i = 0;
|
||||
for(Weather weather : content.<Weather>getBy(ContentType.weather)){
|
||||
|
||||
t.button(weather.localizedName, Styles.cleart, () -> {
|
||||
rules.weather.add(new WeatherEntry(weather));
|
||||
rebuild[0].run();
|
||||
|
||||
addd.hide();
|
||||
}).size(140f, 50f);
|
||||
if(++i % 2 == 0) t.row();
|
||||
}
|
||||
});
|
||||
addd.addCloseButton();
|
||||
addd.show();
|
||||
}).width(170f);
|
||||
|
||||
//reset cooldown to random number
|
||||
dialog.hidden(() -> {
|
||||
float sum = 0;
|
||||
Seq<WeatherEntry> sh = rules.weather.copy();
|
||||
sh.shuffle();
|
||||
|
||||
for(WeatherEntry w : sh){
|
||||
//add the previous cooldowns to the sum so weather events are staggered and don't happen all at once.
|
||||
w.cooldown = sum + Mathf.random(w.minFrequency, w.maxFrequency);
|
||||
sum += w.cooldown;
|
||||
}
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -427,7 +427,7 @@ public class JoinDialog extends BaseDialog{
|
||||
}
|
||||
|
||||
//get servers
|
||||
Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> {
|
||||
Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> {
|
||||
try{
|
||||
Jval val = Jval.read(result.getResultAsString());
|
||||
Core.app.post(() -> {
|
||||
|
||||
@@ -321,16 +321,25 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
||||
stable.row();
|
||||
}
|
||||
|
||||
stable.add("@sectors.resources").row();
|
||||
stable.table(t -> {
|
||||
t.left();
|
||||
int idx = 0;
|
||||
int max = 5;
|
||||
for(UnlockableContent c : sector.data.resources){
|
||||
t.image(c.icon(Cicon.small)).padRight(3);
|
||||
if(++idx % max == 0) t.row();
|
||||
}
|
||||
}).fillX().row();
|
||||
if(sector.save != null){
|
||||
stable.add("@sectors.resources").row();
|
||||
stable.table(t -> {
|
||||
|
||||
if(sector.save != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.resources.any()){
|
||||
t.left();
|
||||
int idx = 0;
|
||||
int max = 5;
|
||||
for(UnlockableContent c : sector.save.meta.secinfo.resources){
|
||||
t.image(c.icon(Cicon.small)).padRight(3);
|
||||
if(++idx % max == 0) t.row();
|
||||
}
|
||||
}else{
|
||||
t.add("@unknown").color(Color.lightGray);
|
||||
}
|
||||
|
||||
|
||||
}).fillX().row();
|
||||
}
|
||||
|
||||
//production
|
||||
if(sector.hasBase() && sector.save.meta.hasProduction){
|
||||
|
||||
@@ -57,7 +57,7 @@ public class ChatFragment extends Table{
|
||||
}
|
||||
}
|
||||
|
||||
return net.active();
|
||||
return net.active() && ui.hudfrag.shown();
|
||||
});
|
||||
|
||||
update(() -> {
|
||||
|
||||
@@ -76,6 +76,19 @@ public class HudFragment extends Fragment{
|
||||
t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX();
|
||||
});
|
||||
|
||||
//minimap + position
|
||||
parent.fill(t -> {
|
||||
t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown);
|
||||
//minimap
|
||||
t.add(new Minimap());
|
||||
t.row();
|
||||
//position
|
||||
t.label(() -> player.tileX() + "," + player.tileY())
|
||||
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial)
|
||||
.touchable(Touchable.disabled);
|
||||
t.top().right();
|
||||
});
|
||||
|
||||
//TODO tear this all down
|
||||
//menu at top left
|
||||
parent.fill(cont -> {
|
||||
@@ -212,18 +225,6 @@ public class HudFragment extends Fragment{
|
||||
}).top().left();
|
||||
});
|
||||
|
||||
parent.fill(t -> {
|
||||
t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown);
|
||||
//minimap
|
||||
t.add(new Minimap());
|
||||
t.row();
|
||||
//position
|
||||
t.label(() -> player.tileX() + "," + player.tileY())
|
||||
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial)
|
||||
.touchable(Touchable.disabled);
|
||||
t.top().right();
|
||||
});
|
||||
|
||||
//core items
|
||||
parent.fill(t -> {
|
||||
t.top().add(coreItems);
|
||||
|
||||
@@ -70,10 +70,10 @@ public class ForceProjector extends Block{
|
||||
|
||||
Draw.color(Pal.gray);
|
||||
Lines.stroke(3f);
|
||||
Lines.poly(x * tilesize, y * tilesize, 6, radius);
|
||||
Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius);
|
||||
Draw.color(player.team().color);
|
||||
Lines.stroke(1f);
|
||||
Lines.poly(x * tilesize, y * tilesize, 6, radius);
|
||||
Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius);
|
||||
Draw.color();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ public class ExtendingItemBridge extends ItemBridge{
|
||||
|
||||
int i = tile.absoluteRelativeTo(other.x, other.y);
|
||||
|
||||
float ex = other.worldx() - x - Geometry.d4[i].x * tilesize / 2f,
|
||||
ey = other.worldy() - y - Geometry.d4[i].y * tilesize / 2f;
|
||||
float ex = other.worldx() - x - Geometry.d4(i).x * tilesize / 2f,
|
||||
ey = other.worldy() - y - Geometry.d4(i).y * tilesize / 2f;
|
||||
|
||||
float uptime = state.isEditor() ? 1f : this.uptime;
|
||||
|
||||
@@ -42,15 +42,15 @@ public class ExtendingItemBridge extends ItemBridge{
|
||||
|
||||
Lines.stroke(8f);
|
||||
Lines.line(bridgeRegion,
|
||||
x + Geometry.d4[i].x * tilesize / 2f,
|
||||
y + Geometry.d4[i].y * tilesize / 2f,
|
||||
x + Geometry.d4(i).x * tilesize / 2f,
|
||||
y + Geometry.d4(i).y * tilesize / 2f,
|
||||
x + ex,
|
||||
y + ey, false);
|
||||
|
||||
Draw.rect(endRegion, x, y, i * 90 + 90);
|
||||
Draw.rect(endRegion,
|
||||
x + ex + Geometry.d4[i].x * tilesize / 2f,
|
||||
y + ey + Geometry.d4[i].y * tilesize / 2f, i * 90 + 270);
|
||||
x + ex + Geometry.d4(i).x * tilesize / 2f,
|
||||
y + ey + Geometry.d4(i).y * tilesize / 2f, i * 90 + 270);
|
||||
|
||||
int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y));
|
||||
|
||||
@@ -61,8 +61,8 @@ public class ExtendingItemBridge extends ItemBridge{
|
||||
for(int a = 0; a < arrows; a++){
|
||||
Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity);
|
||||
Draw.rect(arrowRegion,
|
||||
x + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * uptime,
|
||||
y + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * uptime,
|
||||
x + Geometry.d4(i).x * (tilesize / 2f + a * 6f + 2) * uptime,
|
||||
y + Geometry.d4(i).y * (tilesize / 2f + a * 6f + 2) * uptime,
|
||||
i * 90f);
|
||||
}
|
||||
Draw.reset();
|
||||
|
||||
@@ -62,7 +62,7 @@ public class ItemBridge extends Block{
|
||||
|
||||
Lines.stroke(8f);
|
||||
|
||||
Tmp.v1.set(otherReq.drawx(), otherReq.drawx()).sub(req.drawx(), req.drawy()).setLength(-tilesize/2f);
|
||||
Tmp.v1.set(otherReq.drawx(), otherReq.drawy()).sub(req.drawx(), req.drawy()).setLength(tilesize/2f);
|
||||
|
||||
Lines.line(
|
||||
bridgeRegion,
|
||||
@@ -99,7 +99,7 @@ public class ItemBridge extends Block{
|
||||
float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize);
|
||||
Lines.rect((x + link.x) / 2f * tilesize - w / 2f, (y + link.y) / 2f * tilesize - h / 2f, w, h);
|
||||
|
||||
Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4[rot].x * tilesize, link.y * tilesize + Geometry.d4[rot].y * tilesize, link.absoluteRelativeTo(x, y) * 90);
|
||||
Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4(rot).x * tilesize, link.y * tilesize + Geometry.d4(rot).y * tilesize, link.absoluteRelativeTo(x, y) * 90);
|
||||
}
|
||||
Draw.reset();
|
||||
}
|
||||
@@ -303,7 +303,7 @@ public class ItemBridge extends Block{
|
||||
|
||||
Lines.stroke(8f);
|
||||
|
||||
Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(-tilesize/2f);
|
||||
Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(tilesize/2f).scl(-1f);
|
||||
|
||||
Lines.line(bridgeRegion,
|
||||
x + Tmp.v1.x,
|
||||
@@ -321,8 +321,8 @@ public class ItemBridge extends Block{
|
||||
for(int a = 0; a < arrows; a++){
|
||||
Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity);
|
||||
Draw.rect(arrowRegion,
|
||||
x + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f),
|
||||
y + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f);
|
||||
x + Geometry.d4(i).x * (tilesize / 2f + a * 4f + time % 4f),
|
||||
y + Geometry.d4(i).y * (tilesize / 2f + a * 4f + time % 4f), i * 90f);
|
||||
}
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public class StackConveyor extends Block implements Autotiler{
|
||||
|
||||
Tile from = world.tile(link);
|
||||
|
||||
if(link == -1 || from == null) return;
|
||||
if(link == -1 || from == null || lastItem == null) return;
|
||||
|
||||
int fromRot = from.build == null ? rotation : from.build.rotation;
|
||||
|
||||
@@ -138,7 +138,7 @@ public class StackConveyor extends Block implements Autotiler{
|
||||
//item
|
||||
float size = itemSize * Mathf.lerp(Math.min((float)items.total() / itemCapacity, 1), 1f, 0.4f);
|
||||
Drawf.shadow(Tmp.v1.x, Tmp.v1.y, size * 1.2f);
|
||||
Draw.rect(items.first().icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0);
|
||||
Draw.rect(lastItem.icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -6,6 +6,7 @@ import mindustry.graphics.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
public class Cliff extends Block{
|
||||
public float size = 11f;
|
||||
|
||||
public Cliff(String name){
|
||||
super(name);
|
||||
@@ -18,11 +19,12 @@ public class Cliff extends Block{
|
||||
|
||||
@Override
|
||||
public void drawBase(Tile tile){
|
||||
|
||||
int r = tile.data;
|
||||
for(int i = 0; i < 8; i++){
|
||||
if((r & (1 << i)) != 0){
|
||||
Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.3f + (i >= 4 ? -0.4f : 0.3f)));
|
||||
Draw.rect(region, tile.worldx(), tile.worldy(), 11f, 11f, i * 45f);
|
||||
Draw.rect(region, tile.worldx(), tile.worldy(), size, size, i * 45f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ public class Reconstructor extends UnitBlock{
|
||||
if(moveInPayload()){
|
||||
if(consValid()){
|
||||
valid = true;
|
||||
progress += edelta();
|
||||
progress += edelta() * state.rules.unitBuildSpeedMultiplier;
|
||||
}
|
||||
|
||||
//upgrade the unit
|
||||
|
||||
@@ -16,6 +16,7 @@ public enum StatUnit{
|
||||
powerUnits,
|
||||
degrees,
|
||||
seconds,
|
||||
minutes,
|
||||
perSecond,
|
||||
perMinute,
|
||||
timesSpeed(false),
|
||||
|
||||
@@ -11,7 +11,7 @@ project.ext.assetsDir = new File("../core/assets")
|
||||
|
||||
def enableTemplates = true
|
||||
def JDK_DIR = "$System.env.JDK_DIR"
|
||||
def ICON_DIR = new File("core/assets/icons/icon.icns")
|
||||
def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns")
|
||||
def spriteHashFile = new File(project.rootDir, "build/spritehash")
|
||||
|
||||
def hashDirectory = {
|
||||
@@ -127,13 +127,13 @@ PackrConfig.Platform.values().each{ platform ->
|
||||
verbose = true
|
||||
bundleIdentifier = getPackage() + ".mac"
|
||||
iconResource = ICON_DIR
|
||||
outDir = file("build/packr/output")
|
||||
outDir = file("$rootDir/desktop/build/packr/output")
|
||||
mainClass = project.ext.mainClassName
|
||||
classpath = ["desktop/build/packr/desktop.jar"]
|
||||
removePlatformLibs = ["desktop/build/packr/desktop.jar"]
|
||||
classpath = ["$rootDir/desktop/build/packr/desktop.jar".toString()]
|
||||
removePlatformLibs = ["$rootDir/desktop/build/packr/desktop.jar".toString()]
|
||||
|
||||
vmArgs = []
|
||||
minimizeJre = "desktop/packr_minimize.json"
|
||||
minimizeJre = "$rootDir/desktop/packr_minimize.json".toString()
|
||||
jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip"
|
||||
|
||||
if(platform == PackrConfig.Platform.MacOS){
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
This is the first alpha release of 6.0, a massive campaign and content update.
|
||||
While this build has been tested in multiplayer, it still may have numerous issues. As usual, report problems on Github.
|
||||
|
||||
There are too many changes to list here, but the important bits include:
|
||||
|
||||
- A new unit production system, with incremental upgrades
|
||||
- Direct unit and turret control
|
||||
- Renamed and re-sprited units
|
||||
- New blocks and units
|
||||
- Naval and insect-like units
|
||||
@@ -14,11 +14,11 @@
|
||||
"NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부"
|
||||
"NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요."
|
||||
"NEW_ACHIEVEMENT_20_6_NAME" "정복자"
|
||||
"NEW_ACHIEVEMENT_20_6_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 10번 승리하세요."
|
||||
"NEW_ACHIEVEMENT_20_6_DESC" "적 코어 파괴인 지역에서 10번 승리하세요."
|
||||
"NEW_ACHIEVEMENT_20_7_NAME" "챔피언"
|
||||
"NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요."
|
||||
"NEW_ACHIEVEMENT_20_8_NAME" "진격!"
|
||||
"NEW_ACHIEVEMENT_20_8_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 5단계 이상일 때 적의 코어를 파괴하세요."
|
||||
"NEW_ACHIEVEMENT_20_8_DESC" "적 코어 파괴인 지역에서 5단계 이하일 때 적의 코어를 파괴하세요."
|
||||
"NEW_ACHIEVEMENT_20_9_NAME" "하늘에서 코어의 비가 쏟아진다!"
|
||||
"NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요."
|
||||
"NEW_ACHIEVEMENT_20_10_NAME" "끈질긴"
|
||||
@@ -36,9 +36,9 @@
|
||||
"NEW_ACHIEVEMENT_20_17_NAME" "한 중대한 실수"
|
||||
"NEW_ACHIEVEMENT_20_17_DESC" "분배기를 연구하세요."
|
||||
"NEW_ACHIEVEMENT_20_18_NAME" "창조"
|
||||
"NEW_ACHIEVEMENT_20_18_DESC" "블럭 10,000를 설치하세요."
|
||||
"NEW_ACHIEVEMENT_20_18_DESC" "블록 10,000를 설치하세요."
|
||||
"NEW_ACHIEVEMENT_20_19_NAME" "잿더미"
|
||||
"NEW_ACHIEVEMENT_20_19_DESC" "적 블럭을 1,000개 파괴하세요."
|
||||
"NEW_ACHIEVEMENT_20_19_DESC" "적 블록을 1,000개 파괴하세요."
|
||||
"NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!"
|
||||
"NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요."
|
||||
"NEW_ACHIEVEMENT_20_21_NAME" "맵퍼"
|
||||
@@ -88,11 +88,11 @@
|
||||
"NEW_ACHIEVEMENT_21_14_NAME" "출격!"
|
||||
"NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요."
|
||||
"NEW_ACHIEVEMENT_21_15_NAME" "성급한"
|
||||
"NEW_ACHIEVEMENT_21_15_DESC" "2단계 이상을 스킵하고, 당신의 코어를 적에게 파괴당하세요."
|
||||
"NEW_ACHIEVEMENT_21_15_DESC" "2번 이상의 출격 기회를 스킵하고, 당신의 코어를 적에게 파괴당하세요."
|
||||
"NEW_ACHIEVEMENT_21_16_NAME" "2단"
|
||||
"NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요."
|
||||
"NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자"
|
||||
"NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블럭도 설치하지 않고 생존하세요."
|
||||
"NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블록도 설치하지 않고 생존하세요."
|
||||
"NEW_ACHIEVEMENT_21_18_NAME" "인화성"
|
||||
"NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요."
|
||||
"NEW_ACHIEVEMENT_21_19_NAME" "효율성"
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
"NEW_ACHIEVEMENT_21_4_NAME" "Стая"
|
||||
"NEW_ACHIEVEMENT_21_4_DESC" "Имейте одновременно 10 активных дронов «Фантом»."
|
||||
"NEW_ACHIEVEMENT_21_5_NAME" "Взрывная армия"
|
||||
"NEW_ACHIEVEMENT_21_5_DESC" "Имейте одновременно 50 активных гусеничных ботов «Камикадзе»."
|
||||
"NEW_ACHIEVEMENT_21_5_DESC" "Имейте одновременно 50 активных ботов «Ползун»."
|
||||
"NEW_ACHIEVEMENT_21_6_NAME" "Легионы"
|
||||
"NEW_ACHIEVEMENT_21_6_DESC" "Постройте в целом 1000 единиц."
|
||||
"NEW_ACHIEVEMENT_21_7_NAME" "Super"
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
org.gradle.daemon=true
|
||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||
archash=557aa4c1d08c9260992a6ce108ac609272ee0eee
|
||||
archash=51747eb9d90decdb53b6f4fd5d7043b9f9a219a7
|
||||
|
||||
@@ -5,15 +5,6 @@
|
||||
{
|
||||
"address": "nydustry.nydus.app:6060"
|
||||
},
|
||||
{
|
||||
"address": "mindustry.pl:6000"
|
||||
},
|
||||
{
|
||||
"address": "routerchain.ddns.net"
|
||||
},
|
||||
{
|
||||
"address": "mindustry.pl:6666"
|
||||
},
|
||||
{
|
||||
"address": "md.surrealment.com"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
[
|
||||
{
|
||||
"address": "mindustry.pl:6000"
|
||||
},
|
||||
{
|
||||
"address": "mindustry.pl:6666"
|
||||
},
|
||||
{
|
||||
"address": "routerchain.ddns.net"
|
||||
},
|
||||
{
|
||||
"address": "pandorum.su:8000"
|
||||
}
|
||||
]
|
||||
@@ -409,16 +409,6 @@ task genSprites(dependsOn: classes, type: JavaExec){
|
||||
workingDir = genFolder
|
||||
}
|
||||
|
||||
task genSectorData(dependsOn: classes, type: JavaExec){
|
||||
main = "mindustry.tools.SectorDataGenerator"
|
||||
classpath = sourceSets.main.runtimeClasspath
|
||||
standardInput = System.in
|
||||
workingDir = "../core/assets/"
|
||||
}
|
||||
|
||||
task updateCache(dependsOn: [genSectorData]){
|
||||
}
|
||||
|
||||
task updateBundles(dependsOn: classes, type: JavaExec){
|
||||
file(genFolder).mkdirs()
|
||||
|
||||
|
||||
@@ -232,18 +232,22 @@ public class Generators{
|
||||
|
||||
boolean hasEmpty = false;
|
||||
Color average = new Color();
|
||||
float asum = 0f;
|
||||
for(int x = 0; x < image.width; x++){
|
||||
for(int y = 0; y < image.height; y++){
|
||||
Color color = image.getColor(x, y);
|
||||
average.r += color.r;
|
||||
average.g += color.g;
|
||||
average.b += color.b;
|
||||
average.r += color.r*color.a;
|
||||
average.g += color.g*color.a;
|
||||
average.b += color.b*color.a;
|
||||
asum += color.a;
|
||||
if(color.a < 0.9f){
|
||||
hasEmpty = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
average.mul(1f / (image.width * image.height));
|
||||
|
||||
average.mul(1f / asum);
|
||||
|
||||
if(block instanceof Floor){
|
||||
average.mul(0.8f);
|
||||
}else{
|
||||
|
||||
@@ -1,228 +0,0 @@
|
||||
package mindustry.tools;
|
||||
|
||||
import arc.*;
|
||||
import arc.backend.headless.mock.*;
|
||||
import arc.files.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.mock.*;
|
||||
import arc.struct.*;
|
||||
import arc.struct.ObjectIntMap.*;
|
||||
import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.net.Net;
|
||||
import mindustry.type.*;
|
||||
import mindustry.type.Sector.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.storage.*;
|
||||
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class SectorDataGenerator{
|
||||
|
||||
public static void main(String[] args){
|
||||
ArcNativesLoader.load();
|
||||
Core.files = new MockFiles();
|
||||
Core.app = new MockApplication();
|
||||
Core.settings = new MockSettings();
|
||||
Core.graphics = new MockGraphics();
|
||||
|
||||
headless = true;
|
||||
net = new Net(null);
|
||||
tree = new FileTree();
|
||||
Vars.init();
|
||||
content.createBaseContent();
|
||||
|
||||
logic = new Logic();
|
||||
netServer = new NetServer();
|
||||
world = new World();
|
||||
|
||||
content.init();
|
||||
|
||||
for(Planet planet : content.<Planet>getBy(ContentType.planet)){
|
||||
int[] count = {0};
|
||||
if(planet.grid == null) continue;
|
||||
|
||||
Fi fi = Fi.get("planets").child(planet.name + ".dat");
|
||||
|
||||
Seq<SectorData> list = planet.sectors.map(sector -> {
|
||||
SectorData data = new SectorData();
|
||||
|
||||
ObjectIntMap<Block> floors = new ObjectIntMap<>();
|
||||
ObjectSet<Content> content = new ObjectSet<>();
|
||||
|
||||
logic.reset();
|
||||
world.loadSector(sector);
|
||||
float waterFloors = 0, totalFloors = 0;
|
||||
state.rules.sector = sector;
|
||||
|
||||
for(Tile tile : world.tiles){
|
||||
if(world.getDarkness(tile.x, tile.y) >= 3){
|
||||
continue;
|
||||
}
|
||||
|
||||
Liquid liquid = tile.floor().liquidDrop;
|
||||
if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop);
|
||||
if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop);
|
||||
if(liquid != null) content.add(liquid);
|
||||
|
||||
if(!tile.block().isStatic()){
|
||||
totalFloors ++;
|
||||
if(liquid == Liquids.water){
|
||||
waterFloors += tile.floor().isDeep() ? 1f : 0.7f;
|
||||
}
|
||||
floors.increment(tile.floor());
|
||||
if(tile.overlay() != Blocks.air){
|
||||
floors.increment(tile.overlay());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CoreBuild entity = Team.sharded.core();
|
||||
int cx = entity.tileX(), cy = entity.tileY();
|
||||
|
||||
boolean path = pathfind(true);
|
||||
boolean groundPath = pathfind(false);
|
||||
|
||||
if(!path){
|
||||
Log.err("Sector &ly@&lr has no core path!", sector.id);
|
||||
}
|
||||
|
||||
if(!groundPath){
|
||||
Log.debug("&lbSector &ly@&lb is naval-only", sector.id);
|
||||
|
||||
data.attributes |= (1 << SectorAttribute.navalPath.ordinal());
|
||||
}
|
||||
|
||||
int nearTiles = 0;
|
||||
int waterCheckRad = 5;
|
||||
|
||||
//check for water presence
|
||||
for(int rx = -waterCheckRad; rx <= waterCheckRad; rx++){
|
||||
for(int ry = -waterCheckRad; ry <= waterCheckRad; ry++){
|
||||
Tile tile = world.tile(cx + rx, cy + ry);
|
||||
if(tile == null || tile.floor().liquidDrop != null){
|
||||
nearTiles ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(waterFloors / totalFloors >= 0.6f){
|
||||
Log.debug("Sector @ has @/@ water -> naval", sector.id, waterFloors, totalFloors);
|
||||
}
|
||||
|
||||
//naval sector guaranteed
|
||||
if(nearTiles > 4){
|
||||
Log.debug("Sector @ has @ water tiles at @ @ -> naval", sector.id, nearTiles, cx, cy);
|
||||
waterFloors = totalFloors;
|
||||
}
|
||||
|
||||
//sort counts in descending order
|
||||
Seq<Entry<Block>> entries = floors.entries().toArray();
|
||||
entries.sort(e -> -e.value);
|
||||
//remove all blocks occuring < 30 times - unimportant
|
||||
entries.removeAll(e -> e.value < 30);
|
||||
|
||||
data.floors = new Block[entries.size];
|
||||
data.floorCounts = new int[entries.size];
|
||||
for(int i = 0; i < entries.size; i++){
|
||||
data.floorCounts[i] = entries.get(i).value;
|
||||
data.floors[i] = entries.get(i).key;
|
||||
}
|
||||
|
||||
//TODO bad code
|
||||
boolean hasSnow = data.floors[0].name.contains("ice") || data.floors[0].name.contains("snow");
|
||||
boolean hasRain = !hasSnow && data.floors[0].name.contains("water");
|
||||
boolean hasDesert = !hasSnow && !hasRain && data.floors[0].name.contains("sand");
|
||||
boolean hasSpores = data.floors[0].name.contains("spore") || data.floors[0].name.contains("moss") || data.floors[0].name.contains("tainted");
|
||||
|
||||
if(hasSnow){
|
||||
data.attributes |= (1 << SectorAttribute.snowy.ordinal());
|
||||
}
|
||||
|
||||
if(hasRain){
|
||||
data.attributes |= (1 << SectorAttribute.rainy.ordinal());
|
||||
}
|
||||
|
||||
if(hasDesert){
|
||||
data.attributes |= (1 << SectorAttribute.desert.ordinal());
|
||||
}
|
||||
|
||||
if(hasSpores){
|
||||
data.attributes |= (1 << SectorAttribute.spores.ordinal());
|
||||
}
|
||||
|
||||
data.resources = content.asArray().sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))).toArray(UnlockableContent.class);
|
||||
|
||||
//50% water -> naval attribute
|
||||
if(waterFloors / totalFloors >= 0.6f){
|
||||
data.attributes |= (1 << SectorAttribute.naval.ordinal());
|
||||
}
|
||||
|
||||
if(count[0]++ % 10 == 0){
|
||||
Log.info("&ly[ &lg@% &ly] Done with sector &lm@/@ ", (int)((float)count[0] / planet.sectors.size * 100), count[0], planet.sectors.size);
|
||||
}
|
||||
|
||||
return data;
|
||||
});
|
||||
|
||||
//write data
|
||||
try(Writes write = fi.writes()){
|
||||
write.s(list.size);
|
||||
list.each(s -> s.write(write));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean pathfind(boolean allowWater){
|
||||
CoreBuild entity = Team.sharded.core();
|
||||
|
||||
IntSet enemies = new IntSet();
|
||||
world.tiles.eachTile(t -> {
|
||||
if((t.team() == Team.crux && t.block() instanceof CoreBlock) || t.overlay() == Blocks.spawn){
|
||||
enemies.add(t.pos());
|
||||
}
|
||||
});
|
||||
|
||||
GridBits used = new GridBits(world.width(), world.height());
|
||||
|
||||
IntQueue queue = new IntQueue();
|
||||
queue.addFirst(entity.pos());
|
||||
boolean any = false;
|
||||
|
||||
outer:
|
||||
while(!queue.isEmpty()){
|
||||
int pos = queue.removeFirst();
|
||||
int x = Point2.x(pos), y = Point2.y(pos);
|
||||
used.set(x, y);
|
||||
|
||||
for(Point2 p : Geometry.d4){
|
||||
int nx = p.x + x, ny = p.y + y;
|
||||
|
||||
if(world.tiles.in(nx, ny) && !used.get(nx, ny)){
|
||||
Tile tile = world.tile(nx, ny);
|
||||
|
||||
//skip full solids
|
||||
if((tile.block().isStatic() && tile.solid()) || (!allowWater && tile.floor().isLiquid)) continue;
|
||||
|
||||
int newpos = Point2.pack(nx, ny);
|
||||
|
||||
used.set(nx, ny);
|
||||
queue.addLast(newpos);
|
||||
|
||||
if(enemies.contains(newpos)){
|
||||
any = true;
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return any;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user