Compare commits

...

26 Commits
v54 ... v56

Author SHA1 Message Date
Anuken
3d0b02ee23 Cleaned up enemy base walls 2018-09-03 22:12:46 -04:00
Anuken
d7cfbfe6c8 Merge remote-tracking branch 'origin/master' 2018-09-03 21:51:18 -04:00
Anuken
dc00e22f13 Fixed unit pads hiding in PvP / Fixed recipes not deselecting in menu 2018-09-03 21:51:13 -04:00
CrazyBearTR
bcde481304 Update of the Turkish Translation Bundle (#212)
* Update of the Turkish Translation Bundle

Some words were wrong. Fixed in this version.

* Update bundle_tr.properties
2018-09-03 19:38:01 -04:00
Prosta4okua
5b1341e488 [Complete]Update bundle_uk_UA.properties (#211)
* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties
2018-09-03 19:37:55 -04:00
Anuken
6ad70ceee3 Typo fix 2018-09-03 17:17:32 -04:00
Anuken
9c4d2f5490 Merge remote-tracking branch 'origin/master' 2018-09-03 17:04:16 -04:00
Anuken
6c5eff1143 Crash fix / Cleanup 2018-09-03 17:04:11 -04:00
Anuken
a893767d0f Merge remote-tracking branch 'origin/master' 2018-09-03 16:22:29 -04:00
Anuken
a4f240edc8 Fixed some high-FPS bugs 2018-09-03 16:22:24 -04:00
Anuken
e0a94f694b Shader fix / Hail buff / Tau nerf / Turkish lower case fix 2018-09-03 15:57:06 -04:00
Anuken
8654f25a4f Bugfixes for GWT 2018-09-03 13:48:16 -04:00
Anuken
e877310d85 Mech balancing / Less glitchy menu shader 2018-09-03 13:33:40 -04:00
Anuken
bb59f45ba6 Crash fix 2018-09-03 10:29:44 -04:00
Anuken
3d4c2a2c20 Merge remote-tracking branch 'origin/master' 2018-09-03 09:56:18 -04:00
Anuken
e36667cd08 Bugfixes 2018-09-03 09:56:14 -04:00
CrazyBearTR
cebaa6949e Turkish language request (#210) 2018-09-03 09:55:04 -04:00
Anuken
019e22aff2 Fixed missile shield pierce 2018-09-03 09:07:59 -04:00
Anuken
5129e2ea73 Crash fixes 2018-09-03 09:02:16 -04:00
Anuken
3b63f60462 Fixed some junction issues / Improved server crash reporting 2018-09-02 22:40:23 -04:00
Anuken
5e29115c2e Fixed ship flight targeting / Fixed unit weapon sprite offset 2018-09-02 16:23:39 -04:00
Anuken
0b4b30286d Fixed bridge infinite capacity / Fixed crash 2018-09-02 15:19:54 -04:00
Anuken
a01f64080d Fixed unit pads / Added chat log 2018-09-02 14:16:14 -04:00
Anuken
d031351bc8 Merge remote-tracking branch 'origin/master' 2018-09-02 13:49:42 -04:00
Anuken
1d21d36253 Fixed font line height / Bundles updated / Changelog date 2018-09-02 13:49:38 -04:00
iczero
8d4cd72b41 Remove duplicate roundrobin properties in weapons (#207) 2018-09-02 13:34:24 -04:00
71 changed files with 1029 additions and 324 deletions

View File

@@ -26,7 +26,7 @@ allprojects {
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.8' gdxVersion = '1.9.8'
roboVMVersion = '2.3.0' roboVMVersion = '2.3.0'
uCoreVersion = '06b465e3385ded22d84f42cb09554352a1d3ad6c' uCoreVersion = '64ec4a15148b27749ca7b505dea9743add9902f2'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 B

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 B

After

Width:  |  Height:  |  Size: 239 B

View File

@@ -361,6 +361,8 @@ category.general.name=General
category.view.name=View category.view.name=View
category.multiplayer.name=Multiplayer category.multiplayer.name=Multiplayer
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.move_x.name=Move x keybind.move_x.name=Move x
keybind.move_y.name=Move y keybind.move_y.name=Move y
keybind.select.name=Select/Shoot keybind.select.name=Select/Shoot
@@ -607,7 +609,7 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator block.thermal-generator.name=Thermal Generator
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smelter
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
block.surge-wall.name=Surge Wall block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall block.surge-wall-large.name=Large Surge Wall

View File

@@ -204,7 +204,6 @@ text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked! text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked! text.unlocked.plural=New Blocks Unlocked!
text.server.closing=[accent]Closing server... text.server.closing=[accent]Closing server...
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.clientOutdated=Outdated client! Update your game! text.server.kicked.clientOutdated=Outdated client! Update your game!
text.server.kicked.serverOutdated=Outdated server! Ask the host to update! text.server.kicked.serverOutdated=Outdated server! Ask the host to update!
text.server.kicked.banned=You are banned on this server. text.server.kicked.banned=You are banned on this server.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -62,7 +62,6 @@ text.players.single={0} jugador online
text.server.mismatch=Error de paquete: posiblemente versión incompatible de cliente/servidor.\n¡Asegurate de que tu y el anfitrión tengan\nla última versión de Mindustry! text.server.mismatch=Error de paquete: posiblemente versión incompatible de cliente/servidor.\n¡Asegurate de que tu y el anfitrión tengan\nla última versión de Mindustry!
text.server.closing=[accent]Cerrando servidor... text.server.closing=[accent]Cerrando servidor...
text.server.kicked.kick=¡Has sido kickeado del servidor! text.server.kicked.kick=¡Has sido kickeado del servidor!
text.server.kicked.fastShoot=Estás disparando demasiado rápido.
text.server.kicked.serverClose=El servidor ha cerrado. text.server.kicked.serverClose=El servidor ha cerrado.
text.server.kicked.sectorComplete=Sector completado. text.server.kicked.sectorComplete=Sector completado.
text.server.kicked.sectorComplete.text=Tu misión ha sido completada.\nEl servidor ahora continuara con el próximo sector. text.server.kicked.sectorComplete.text=Tu misión ha sido completada.\nEl servidor ahora continuara con el próximo sector.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -244,7 +244,6 @@ text.maps=Cartes
text.maps.none=[LIGHT_GRAY]Aucune carte trouvée! text.maps.none=[LIGHT_GRAY]Aucune carte trouvée!
text.unlocked=Nouveau bloc debloqué! text.unlocked=Nouveau bloc debloqué!
text.unlocked.plural=Nouveaux blocs débloqués! text.unlocked.plural=Nouveaux blocs débloqués!
text.server.kicked.fastShoot=Vous tirez trop vite.
text.server.kicked.recentKick=Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau. text.server.kicked.recentKick=Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
text.server.kicked.nameInUse=Il y a déjà quelqu'un avec ce nom\nsur ce serveur. text.server.kicked.nameInUse=Il y a déjà quelqu'un avec ce nom\nsur ce serveur.
text.server.kicked.nameEmpty=Votre nom doit contenir au moins une lettre ou un chiffere. text.server.kicked.nameEmpty=Votre nom doit contenir au moins une lettre ou un chiffere.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -211,7 +211,6 @@ text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found! text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked! text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked! text.unlocked.plural=New Blocks Unlocked!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.banned=You are banned on this server. text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again. text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server. text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -265,7 +265,6 @@ text.maps=Mappe
text.maps.none=[LIGHT_GRAY]Nessuna mappa trovata! text.maps.none=[LIGHT_GRAY]Nessuna mappa trovata!
text.unlocked=Nuovo blocco scoperto! text.unlocked=Nuovo blocco scoperto!
text.unlocked.plural=Nuovi blocchi scoperti! text.unlocked.plural=Nuovi blocchi scoperti!
text.server.kicked.fastShoot=Stai sparando troppo velocemente.
text.server.kicked.nameInUse=C'è già qualcuno con il tuo nome\nsu questo server. text.server.kicked.nameInUse=C'è già qualcuno con il tuo nome\nsu questo server.
text.server.kicked.nameEmpty=Il tuo nome deve contenere almeno un carattere. text.server.kicked.nameEmpty=Il tuo nome deve contenere almeno un carattere.
text.server.kicked.idInUse=Sei già su questo server! Non è permesso connettersi con due account. text.server.kicked.idInUse=Sei già su questo server! Non è permesso connettersi con due account.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Reattore al torio
block.alloy-smelter.name=Altoforno block.alloy-smelter.name=Altoforno
block.mend-projector.name=Riparatore block.mend-projector.name=Riparatore
unit.alpha-drone.name=Drone Alpha unit.alpha-drone.name=Drone Alpha
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -39,7 +39,6 @@ text.players.single=현재 {0}명만 있음.
text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니다. 자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요! text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니다. 자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요!
text.server.closing=[accent]서버 닫는중... text.server.closing=[accent]서버 닫는중...
text.server.kicked.kick=당신은 서버에서 추방되었습니다! text.server.kicked.kick=당신은 서버에서 추방되었습니다!
text.server.kicked.fastShoot=당신은 총을 너무 빨리 발사했습니다.
text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요!
text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다. text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -210,7 +210,6 @@ text.maps=Mapy
text.maps.none=[LIGHT_GRAY]Nie znalesiono żadnych map! text.maps.none=[LIGHT_GRAY]Nie znalesiono żadnych map!
text.unlocked=Odblokowano nowy blok! text.unlocked=Odblokowano nowy blok!
text.unlocked.plural=Odblokowano nowe bloki! text.unlocked.plural=Odblokowano nowe bloki!
text.server.kicked.fastShoot=Strzelasz zbyt szybko.
text.server.kicked.banned=Zostałeś zbanowany na tym serwerze. text.server.kicked.banned=Zostałeś zbanowany na tym serwerze.
text.server.kicked.recentKick=Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem. text.server.kicked.recentKick=Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
text.server.kicked.nameInUse=Ta nazwa jest już zajęta na tym serwerze. text.server.kicked.nameInUse=Ta nazwa jest już zajęta na tym serwerze.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -161,7 +161,6 @@ text.players.single={0} Jogador Ativo
text.server.mismatch=Packet error: Versão do Cliente/Servidor Incompativel.\nTenha certeza Que Host tem\nA ultima versão de Mindustry! text.server.mismatch=Packet error: Versão do Cliente/Servidor Incompativel.\nTenha certeza Que Host tem\nA ultima versão de Mindustry!
text.server.closing=[accent]Fechando servidor... text.server.closing=[accent]Fechando servidor...
text.server.kicked.kick=Voce foi expulso do servidor! text.server.kicked.kick=Voce foi expulso do servidor!
text.server.kicked.fastShoot=Voce esta atirando rapido demais.
text.server.kicked.clientOutdated=Cliente desatualizado! Atualize seu jogo! text.server.kicked.clientOutdated=Cliente desatualizado! Atualize seu jogo!
text.server.kicked.serverOutdated=Servidor desatualiado! Peca ao dono para atualizar! text.server.kicked.serverOutdated=Servidor desatualiado! Peca ao dono para atualizar!
text.server.kicked.banned=Voce foi banido do servidor. text.server.kicked.banned=Voce foi banido do servidor.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -341,6 +341,8 @@ text.keybind.title=Переназначение клавиш
category.general.name=Основное category.general.name=Основное
category.view.name=Просмотр category.view.name=Просмотр
category.multiplayer.name=Мультиплеер category.multiplayer.name=Мультиплеер
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.move_x.name=Движение по x keybind.move_x.name=Движение по x
keybind.move_y.name=Движение по y keybind.move_y.name=Движение по y
keybind.select.name=Выбор/Выстрел keybind.select.name=Выбор/Выстрел

View File

@@ -256,7 +256,6 @@ text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found! text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked! text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked! text.unlocked.plural=New Blocks Unlocked!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server. text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number. text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted. text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -0,0 +1,629 @@
text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.credits=Emegi gecenler
text.discord=Mindustry'in Discord'una katilin!
text.link.discord.description=Orjinal Mindustry'in Discord Konusma Odasi
text.link.github.description=Oyunun Kodu
text.link.dev-builds.description=Bitirilmemis Yapim Surumu
text.link.trello.description=Planlanmis Hersey icin Tablo
text.link.itch.io.description=Bilgisayar ve Site versiyonunun bulundugu Site
text.link.google-play.description=Google Play magaza sayfasi
text.link.wiki.description=Orjinal Mindustry Bilgilendirme Sayfasi
text.linkfail=Link Acilamadi!\nLink sizin icin kopyalandi.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=Site versiyonu bunu desteklemiyor! Bilgisayar versiyonunu indirmeniz gerek.
text.gameover=Cekirdegin yok edildi.
text.sector.gameover=Sektor kaybedildi. Geri gitmek ister misin?
text.sector.retry=Gene dene
text.highscore=[accent]Yeni Yuksek skor!
text.wave.lasted=Su dalgaya kadar dayandin: [accent]{0}[].
text.level.highscore=Yuksek Skor: [accent]{0}
text.level.delete.title=Silmeyi onayla
text.map.delete=Su haritayi silmek istediginden emin misin? "[orange]{0}[]"?
text.level.select=Seviye secimi
text.level.mode=Oyun Modu:
text.construction.desktop=Bilgisayar kontrolleri degisti.\nEsyayi secmeyi birakmak istiyorsan [accent]bosluga bas[].
text.construction.title=Esya Insaat Egitimi
text.construction=\
Sen su anda [accent]insaat moduna[]girdin.\n\n\
Yerlestirbeye baslamadan once, kendine bos ve gecerli bir arazi sec ve tikla\n\
Biraz Yapi yerlestirdikten sonra, onaylamak icin tikla,, ve geminle beraber yapmaya baslayacaksin.\n\
\n\
- [accent]Yapi secimini kaldirmak[] icin yandan uzerlerine tikla.\n\
- [accent]Yapi yonunu degistimek[] icin farenin tekerlegini kullan \n\
- [accent]Cizgi biciminde Yapi yerlestirmek[] icin bos bir yete tikla ve surukle\n\
- [accent]Yapi yapmayi iptal etmek icin[] kosedeki X tusuna bas
text.deconstruction.title=Yapi yikma egitimi
text.deconstruction=\
Daha demin sen[accent]Yapi yikmak icin yikma moduna girdin..[].\n\n\
kirmak icin, unitinin cevresindeki bir yapiya/yapilara tikla.\n\
isin bitince, tamamlama tusuna tikla ve gemin onlari lirbaya basliyacak\n\
\n\
- [accent]Yapi yikmak [] icin uzerlerine tikla.\n\
- [accent]bir arazideki yapilari yikmak[] icin bir arazi sec ve tamamlama tusuna bas\n\
- [accent]yikma modundan cikmak[] icin kosedeki X tusuna bas
text.showagain=Don't show again next session
text.coreattack=< Cekirdek Saldiri altinda! >
text.unlocks=Oduller
text.savegame=Oyunu kaydet
text.loadgame=Devam et
text.joingame=Oyuna katil
text.addplayers=Oyuncu ekle/cikar
text.customgame=Ozel oyun
text.sectors=Sektorler
text.sector=Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
text.sector.deploy=Yukle
text.sector.resume=Devam et
text.sector.locked=[scarlet][[Incomplete]
text.sector.unexplored=[accent][[Unexplored]
text.mission=Mission:[LIGHT_GRAY] {0}
text.mission.complete=Gorev tamamlandi!
text.mission.complete.body=Sektor {0},{1} ele gecirildi
text.mission.wave= [accent]{0}[] Dalga hayatta kal
text.mission.battle=Dusmanin cekirdegini yok et
text.mission.resource= {0} x{1} Kazan
text.none=<none>
text.close=Kapat
text.quit=Cik
text.maps=Haritalar
text.continue=Devam et
text.nextmission=Yeni gorev
text.maps.none=[LIGHT_GRAY]Harita bulunamadi!
text.about.button=Hakkinda
text.name=isim:
text.unlocked=Yeni yapi acildi!!
text.unlocked.plural=Yeni yapilar acildi!
text.players={0} oyuncu cevrimici
text.players.single={0} oyuncu cevrimici
text.server.mismatch=Bir Sorun olustu: Oyunun versiyonundan dolayi hata olustu.\nOyunun en son surumune sahip\nolduguna emin ol!
text.server.closing=[accent]Oyun kapaniyor.
text.server.kicked.kick=Oyundan cikarildin
text.server.kicked.serverClose=Oyun kapandi
text.server.kicked.sectorComplete=Sektor tamamlandi
text.server.kicked.sectorComplete.text=Gorev Tamamlandi.\nOyun siradaki sektorden devam edecek
text.server.kicked.clientOutdated=Yeni bir versiyon mevcut! Hemen indir!
text.server.kicked.serverOutdated=Eski oyun! Yapimciya guncellemesini soyle!
text.server.kicked.banned=Oyundan kalici olarak cikarildin.
text.server.kicked.recentKick=Oyundan cikarilmistin.\nBaglanmadn once biraz bekle.
text.server.kicked.nameInUse=Oyunda bu isimde bir\nkisi zaten var.
text.server.kicked.nameEmpty=ismin gecerli degil.
text.server.kicked.idInUse=Zaten oyundasin! iki ayri hesapla oyuna katilamazsin!
text.server.kicked.customClient=Bu oyun ayarlanmis vesiyonlara izin vermiyor. Orijinal bir versiyon dene!
text.host.info=[accent]host[] su linkte bir oyun acti! [scarlet]6567[]. \nSeninle [LIGHT_GRAY]ayni internete[] sahip olan kisiler oyunu gorebilir.\n\neger baska yerlerden kisilerind de gelmesini istiyorsan, [accent]oyun acmak[]zorunludur.\n\n[LIGHT_GRAY]Not: eger baglanmakta gucluk cekiliyorsa, antivirusunun internetine baglanmasini izin vermesini sagla.
text.join.info=Buradan,[accent]Oyunun linkini[] kullanarak katilabilir, yada, [accent]internetinle[] baglanacak oyun bulabilirsin\ninternetli ve Linkli oyunlar desteklenir.\n\n[LIGHT_GRAY]Not: Otomatik bir oyun listesi goruntulenemez. Yapimcidan linkini iste.
text.hostserver=Oyun ac
text.host=Oyun ac
text.hosting=[accent]Oyun aciliyor
text.hosts.refresh=Yenile
text.hosts.discovering=internet oyunu araniyor
text.server.refreshing=liste yenileniyor
text.hosts.none=[lightgray]internet oyunu bulunamadi!
text.host.invalid=[scarlet]Oyuna baglanilamadi.
text.trace=Oyuncu isaretle
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unik ID: [accent]{0}
text.trace.android=Android Kullanicisi: [accent]{0}
text.trace.modclient=Ozel islemci Kullanicisi: [accent]{0}
text.trace.totalblocksbroken=kirilan yapilar: [accent]{0}
text.trace.structureblocksbroken=kirilan esyalar: [accent]{0}
text.trace.lastblockbroken=Son kirilan yapilar: [accent]{0}
text.trace.totalblocksplaced=yerlestirilen yapilar: [accent]{0}
text.trace.lastblockplaced=son yerlestirilen yapilar: [accent]{0}
text.invalidid=Yanlis islemci Linki! Sorunu bildir
text.server.bans=Yasaklamalar
text.server.bans.none=Yasaklananlar bulunamadi!
text.server.admins=Yetkililer
text.server.admins.none=Yetkili bulunamadi!
text.server.add=Oyun ekle
text.server.delete=Oyunu silmek istedigine emin misin?
text.server.hostname=Oyun yarat: {0}
text.server.edit=Oyunu ayarla
text.server.outdated=[crimson]Eski Oyun![]
text.server.outdated.client=[crimson]eski islemci![]
text.server.version=[lightgray]Versiyon: {0}
text.server.custombuild=[yellow]ozel yapi
text.confirmban=Bu oyuncuyu kalici olarak atmak istedigine emin misin?
text.confirmunban=Bu oyuncunun yasagini geri almak ister misin?
text.confirmadmin=Bu oyuncuyu yetkili yapmak istedigine emin misin?
text.confirmunadmin=Bu oyuncunun yetkisini almak istedigine emin misin?
text.joingame.title=Oyuna katil
text.joingame.ip=Link:
text.disconnect=Cikildi
text.disconnect.data=Oyunun geri yuklenemedi!
text.connecting=[accent]Baglaniliyor
text.connecting.data=[accent]Loading world data...
text.connectfail=[crimson]Su Oyuna baglanilamadi: [orange]{0}
text.server.port=Link:
text.server.addressinuse=Addres zaten kullaniliyor!
text.server.invalidport=Geçersiz Oyun numarasi!
text.server.error=[crimson]Oyun acarkes sorun olustu: [orange]{0}
text.save.old=Bu oyun su anda kullanilamaz.\n\n[LIGHT_GRAY]geri alma oyunun 4.0 surumunde eklenecektir.
text.save.new=Yeni Kayit Dosyasi
text.save.overwrite=Bu oyunun uzerinden\ngecmek istedigine emin\nmisin?
text.overwrite=uzerinden gec
text.save.none=Kayitli oyun bulunamadi
text.saveload=[accent]Kaydediliyor...
text.savefail=Kaydedilemedi!
text.save.delete.confirm=Bu Kayiti silmek istedigine emin misin?
text.save.delete=Sil
text.save.export=Kayiti tasi
text.save.import.invalid=[orange]Kayit gecersiz!
text.save.import.fail=[crimson]Failed to import save: [orange]{0}
text.save.export.fail=[crimson]Failed to export save: [orange]{0}
text.save.import=Kayit al
text.save.newslot=Kayit ismi:
text.save.rename=Yeniden adlandir
text.save.rename.text=Yeni isim:
text.selectslot=Kayitli bir dosya sec.
text.slot=[accent]Slot {0}
text.save.corrupted=[orange]Kayit gecersiz!\nOyunu guncellediysen, bu buyuk ihtimalle degistirilecek vebu bir [scarlet]sorun degildir.[]
text.sector.corrupted=[orange]Yeni dosyalar bulundu, ama yuklenemedi.\nYeni bir tane yapildi.
text.on=Acik
text.off=Kapali
text.save.autosave=Otomatik kayit: {0}
text.save.map=Harita: {0}
text.save.wave=Dalga {0}
text.save.difficulty=Zorluk: {0}
text.save.date=En sonki kayit: {0}
text.save.playtime=Oyun Zamani!: {0}
text.confirm=Onayla
text.delete=Sil
text.ok=Tamam
text.open=Ac
text.cancel=iptal
text.openlink=Linki ac
text.copylink=Linki kopyala
text.back=Geri don
text.quit.confirm=Cikmak istedigine emin misin?
text.changelog.title=Degisimler
text.changelog.loading=Degisimler yukleniyor...
text.changelog.error.android=[orange]Not: Degisimler bazen androidde calismaz.\nBu bir degistirilemez sorundan kaynakli.
text.changelog.error.ios=[orange]Degisimler IOS'da su anda desteklenmiyor.
text.changelog.error=[scarlet]Degisimler alinamadi.\nInternet baglantini kontrol et
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.loading=[accent]Yukleniyor...
text.saving=[accent]Kaydediliyor...
text.wave=[orange]Dalga {0}
text.wave.waiting=Dalganin baslamasina: {0}
text.waiting=Bekleniyor...
text.enemies={0} Dusman Kaldi
text.enemies.single={0} Dusman Kaldi
text.loadimage=Resimden Yukle
text.saveimage=Resimi kaydet
text.unknown=Bilinmeyen
text.custom=Ozel
text.builtin=Yapilandirilmis
text.map.delete.confirm=Haritayi silmek istedigine emin misin? Bu geri alinamaz!
text.map.random=[accent]Rasgele harita
text.map.nospawn=Haritada Oyncularin cikmasi icin cekirdek yok! Haritaya[ROYAL]Mavi[] cekirdek ekle.
text.map.invalid=Harita yuklenemedi. Gecersiz yada bozuk dosya.
text.editor.brush=Firca
text.editor.slope=\\
text.editor.openin=Editorde ac
text.editor.oregen=Maden Yaratilma hizi
text.editor.oregen.info=Maden Yaratilmasi:
text.editor.mapinfo=Harita bilgisi:
text.editor.author=Yapimci:
text.editor.description=Yorum:
text.editor.name=isim:
text.editor.teams=Takimlar
text.editor.elevation=Yukseklik
text.editor.badsize=[orange]Yanlis harita Yukeskligi[]\nDogru harita Yuksekligi sayisi: {0}
text.editor.errorimageload=Dosya yuklenemedi:\n[orange]{0}
text.editor.errorimagesave=Dosya kaydedilemedi.:\n[orange]{0}
text.editor.generate=Yarat
text.editor.resize=Boyutunu degistir
text.editor.loadmap=Harita yukle
text.editor.savemap=Haritayi kaydet
text.editor.saved=Kaydedildi!
text.editor.save.noname=Haritanin ismi yok! 'Harita bilgisinden' bi tane ekle
text.editor.save.overwrite=Haritanin ismi varolan bir haritanin ismi ile ayni! 'Harita bilgisinden' degisik bir isim sec
text.editor.import.exists=[scarlet]Tasinamadi.:[] ayni isimi tasiyan bir harita '{0}' zaten var!!
text.editor.import=Bilgisayara kaydet
text.editor.importmap=Bilgisayardan harita al
text.editor.importmap.description=Varolan bir harita al
text.editor.importfile=Dosyayi bilgisayara kaydet
text.editor.importfile.description=Bilgisayara ozel harita yukle
text.editor.importimage=Yuzey resmi al
text.editor.importimage.description=Degisik Yuzey resmi al
text.editor.export=Disari al
text.editor.exportfile=Disari cikart
text.editor.exportfile.description=Haritayi disari cikart
text.editor.exportimage=Haritanin resmini disari cikart
text.editor.exportimage.description=Haritanin resmini disari aktar
text.editor.loadimage=Araziyi yukle
text.editor.saveimage=Araziyi disari aktar
text.editor.unsaved=[scarlet]Kaydedilmemis verileriniz var![]\ncikmak istedigine emin misin?
text.editor.resizemap=Haritanin boyutunu degistir
text.editor.mapname=Harita ismi:
text.editor.overwrite=[accent]Dikkat et!\nBu bir haritanin uzerinden cececek.
text.editor.overwrite.confirm=[scarlet]uyari![] bu isimde bir harita zaten var. Uzerinden gececek misin?
text.editor.selectmap=Yukleyecek bir harita sec:
text.width=Genislik:
text.height=Yukseklik:
text.menu=Menu
text.play=Oyna
text.load=Yukle
text.save=Kaydet
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.language.restart=Lutfen dil degisiminin etkin olmasi icin oyunu yeniden baslatin
text.settings.language=Dil
text.settings=ayarlar
text.tutorial=Tutorial
text.editor=Editor
text.mapeditor=Harita yaraticisi
text.donate=Bagis yap
text.settings.reset=ilk ayarlara geri al
text.settings.rebind=Geri al
text.settings.controls=Kontroller
text.settings.game=Oyun
text.settings.sound=Ses
text.settings.graphics=Grafikler
text.paused=Duraklatildi
text.yes=Evet
text.no=Hayir
text.info.title=[accent]Bilgi
text.error.title=[crimson]Bir hata olustu
text.error.crashtitle=Bir hata olustu
text.blocks.blockinfo=Yapi bilgisi
text.blocks.powercapacity=Guc kapasitesi
text.blocks.powershot=Guc/Saldiri hizi
text.blocks.targetsair=Havayi hedef alir mi?
text.blocks.itemspeed=Ilerleme hizi
text.blocks.shootrange=Menzil
text.blocks.size=Buyukluk
text.blocks.liquidcapacity=Sivi kapasitesi
text.blocks.maxitemssecond=Esya limiti
text.blocks.powerrange=Menzil
text.blocks.poweruse=Guc kullanimi
text.blocks.inputitemcapacity=Giris esya kapasitesi
text.blocks.outputitemcapacity=Cikis esya kapasitesi
text.blocks.itemcapacity=Esya kapasitesi
text.blocks.maxpowergeneration=Guc limiti
text.blocks.powertransferspeed=Guc transfer hizi
text.blocks.craftspeed=Yapilma hizi
text.blocks.inputliquid=Giris sivi
text.blocks.inputliquidaux=Yardimci sivi
text.blocks.inputitem=Giris esyasi
text.blocks.inputitems=Giris esyalari
text.blocks.outputitem=Sonuc
text.blocks.drilltier=Kazilabilirler
text.blocks.drillspeed=Ana kazma hizi
text.blocks.liquidoutput=Sivi cikisi
text.blocks.liquiduse=Sivi kullanimi
text.blocks.coolant=Sogutma sivisi
text.blocks.coolantuse=Sogutma sivi kullanimi
text.blocks.inputliquidfuel=Yakit sivisi
text.blocks.liquidfueluse=Sivi yakit kullanimi
text.blocks.explosive=Patlayici!
text.blocks.health=Can
text.blocks.inaccuracy=sekme
text.blocks.shots=vuruslar
text.blocks.reload=Yeniden doldurma
text.blocks.inputfuel=Yakit
text.blocks.fuelburntime=Yakit yakilma suresi
text.blocks.inputcapacity=Giris kapasitesi
text.blocks.outputcapacity=Cikis kapasitesi
text.unit.blocks=Yapilar
text.unit.powersecond=saniyede bir
text.unit.liquidsecond=Saniyede bir
text.unit.itemssecond=Saniyede bir
text.unit.pixelssecond=Saniyede bir
text.unit.liquidunits=Litre
text.unit.powerunits=Volt
text.unit.degrees=derece
text.unit.seconds=saniye
text.unit.none=
text.unit.items=esya
text.category.general=General
text.category.power=Guc
text.category.liquids=sivilar
text.category.items=esyalar
text.category.crafting=uretim
text.category.shooting=sikma
setting.fpscap.name=Max FPS
setting.fpscap.none=Yok
setting.fpscap.text={0} FPS
setting.difficulty.easy=kolay
setting.difficulty.normal=orta
setting.difficulty.hard=zor
setting.difficulty.insane=cok zor
setting.difficulty.purge=imkansiz
setting.difficulty.name=Zorluk derecesi:
setting.screenshake.name=Ekran sallanmasi
setting.indicators.name=Dusman gostergeleri
setting.effects.name=Efekleri goster
setting.sensitivity.name=Kumanda hassasligi
setting.saveinterval.name=Otomatik kaydetme suresi
setting.seconds={0} Saniye
setting.fullscreen.name=Tam ekran
setting.multithread.name=Parcaciklar
setting.fps.name=FPS'i goster
setting.vsync.name=VSync
setting.lasers.name=Guc lazerlerini goster
setting.healthbars.name=Yapi canlarini goster
setting.minimap.name=Haritayi goster
setting.musicvol.name=Ses yuksekligi
setting.mutemusic.name=Sesi kapat
setting.sfxvol.name=Ses seviyesi
setting.mutesound.name=Sesi kapat
text.keybind.title=Tuslari ayarla
category.general.name=General
category.view.name=Goster
category.multiplayer.name=Cok oyunculu
keybind.press=Bir tusa bas...
keybind.press.axis=Bir yone cevir yada tusa bas...
keybind.move_x.name=Sol/Sag hareket
keybind.move_y.name=Yukari/asagi hareket
keybind.select.name=Sec/silahi sik
keybind.break.name=Kirma
keybind.deselect.name=Eldeki yapiyi birak
keybind.shoot.name=Sik
keybind.zoom_hold.name=Yaklasma basili tutmasi
keybind.zoom.name=Yaklas
keybind.menu.name=Menu
keybind.pause.name=Durdur
keybind.dash.name=Kos
keybind.chat.name=konus
keybind.player_list.name=Oyuncu listesi
keybind.console.name=Konsol
keybind.rotate.name=cevir
keybind.toggle_menus.name=Menuleri ac'kapat
keybind.chat_history_prev.name=Konusma gecmisi geri
keybind.chat_history_next.name=Konusma gecmisi ileri
keybind.chat_scroll.name=Konusma kaydir
keybind.drop_unit.name=Unit birak
keybind.zoom_minimap.name=Haritayi yaklastir
mode.text.help.title=Modlarin aciklamalari
mode.waves.name=Dalgali
mode.waves.description=Klasik mod. Dalgalara karsi cekirdegi koru.
mode.sandbox.name=Serbest
mode.sandbox.description=Sonsuz esyalar ve Dalga suresi yok
mode.sandbox.warning=Not: Serbest modda sadece acik olan yapilar kullanilabilir\n\n[LIGHT_GRAY]Eger acmadiysan, belirmez.
mode.freebuild.name=Yapi Yapma
mode.freebuild.description=Sinirli esyalar ama dalga suresi yok.
content.item.name=Esyalar
content.liquid.name=Sivilar
content.unit-type.name=Uniteler
content.recipe.name=Yapilar
content.mech.name=Robotlar
item.stone.name=Tas
item.stone.description=Yaygin bir materyal. Magma'yi eriterek yada Kazma makineleriyle alinabilir.
item.copper.name=Bakir
item.copper.description=ise yayar bir materyal. Kazma makineleriyle yada tasimayla alinabilir.
item.lead.name=Kursun
item.lead.description=Basit bir baslangic materyali. sivi tasimada kullanilabilir.
item.coal.name=Komur
item.coal.description=Yaygin bir yakit.
item.dense-alloy.name=Sert karisim
item.dense-alloy.description=Bakir ve kursunun karistirilmasiyle elde edildi. Gelismis yapilar ve kazma makileneri icin kullanilabilir.
item.titanium.name=Titanyum
item.titanium.description=Nadir ve hafif bir materyal. Hava araclarinda, Kazma makinelerinde ve sivi tasima tuplerinde kullanilir.
item.thorium.name=Toryum
item.thorium.description=Nukleer yakit olarak kullanilan sert ve nukleer bir materyal.
item.silicon.name=Silikon
item.silcion.description=Gunes panellerinde ve gelismis materallerde kullanilan bir materyal
item.plastanium.name=Plastanyum
item.plastanium.description=hafif bir madde, hava makinelerinde ve silahlara kursun olarak kullanilir.
item.phase-matter.name=Faz maddesi
item.surge-alloy.name=Kabarma karisimi
item.biomatter.name=Biomatter
item.biomatter.description=basit bir yakit olarak kullanilan organik bir madde
item.sand.name=Kum
item.sand.description=karistirma maddesi olark kullanilan yaygin bir madde.
item.blast-compound.name=patlama birlesimi
item.blast-compound.description=Bombalar ve patlayicilarda kullanilabilir. Yakit olarak kullanilmasi tavsiye edilmez.
item.pyratite.name=Pyratite
item.pyratite.description=Yakici silahlar icin yakici bir madde.
liquid.water.name=Su
liquid.lava.name=Magma
liquid.oil.name=Benzin
liquid.cryofluid.name=kriyo sivisi
mech.alpha-mech.name=Alpha
mech.alpha-mech.weapon=Agir plazma silahi
mech.alpha-mech.ability=Pervaneli savunma
mech.alpha-mech.description=Standart Robot. Kendisine yardim etmesi icin 3 adet dron cikartabilir
mech.delta-mech.name=Delta
mech.delta-mech.weapon=Arc jenaratoru
mech.delta-mech.ability=Sarz cekici
mech.delta-mech.description=vur kac icin yapilmis olan hizli bir makine. duvarlara az hasar verir ama gruplari temizlemesiyle bilinir.
mech.tau-mech.name=Tau
mech.tau-mech.weapon=Yok edici Lazer
mech.tau-mech.ability=Tamircinin patlamasi
mech.tau-mech.description=Destek bir robot. alaninin icindeki herseyi tamir edebilir
mech.omega-mech.name=Omega
mech.omega-mech.weapon=Solucan roketler
mech.omega-mech.ability=Zirhli Yok edici
mech.omega-mech.description=Tank ve hasar vurucu bir robot. Zirhi ona %90 hasari engellemesini saglayan bir kalkan verir.
mech.dart-ship.name=Dart
mech.dart-ship.weapon=Tarayici
mech.dart-ship.description=Var olan en hizli robot. guclu bir vurkacci
mech.javelin-ship.name=Javelin
mech.javelin-ship.description=vur kac tipindeki bir unit. bir anda buyuk bir hasara sebep olabilir
mech.javelin-ship.weapon=Patlayici roketler
mech.javelin-ship.ability=sarz calici
mech.trident-ship.name=Trident
mech.trident-ship.description=Bir bombaci. Guzel bir zirha sahip
mech.trident-ship.weapon=mini atomlar
mech.glaive-ship.name=Glaive
mech.glaive-ship.description=Guzel, buyuk bir unit. Hiz limiti ve kapesitesi iyidir
mech.glaive-ship.weapon=Orman yakici
text.item.explosiveness=[LIGHT_GRAY]Patlayicilik: {0}
text.item.flammability=[LIGHT_GRAY]Yanbilirlik: {0}
text.item.radioactivity=[LIGHT_GRAY]Radyoaktivite: {0}
text.item.fluxiness=[LIGHT_GRAY]akis gucu: {0}
text.item.hardness=[LIGHT_GRAY]Zirh: {0}
text.unit.health=[LIGHT_GRAY]Can: {0}
text.unit.speed=[LIGHT_GRAY]hiz: {0}
text.mech.weapon=[LIGHT_GRAY]silah: {0}
text.mech.armor=[LIGHT_GRAY]zirh: {0}
text.mech.itemcapacity=[LIGHT_GRAY]esya kapasitesi: {0}
text.mech.minespeed=[LIGHT_GRAY]kazma hizi: {0}
text.mech.minepower=[LIGHT_GRAY]kazma gucu: {0}
text.mech.ability=[LIGHT_GRAY]yetenek gucu: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]isinma kapasitesi: {0}
text.liquid.viscosity=[LIGHT_GRAY]Yari sivilik: {0}
text.liquid.temperature=[LIGHT_GRAY]isi: {0}
block.core.name=cekirdek
block.metalfloor.name=metal zemin
block.deepwater.name=su alti
block.water.name=su
block.lava.name=magma
block.oil.name=benzin
block.blackstone.name=kara tas
block.stone.name=tas
block.dirt.name=cimen
block.sand.name=kum
block.ice.name=buz
block.snow.name=kar
block.grass.name=cimen
block.shrub.name=cali
block.rock.name=tas
block.blackrock.name=bkara tas
block.icerock.name=buz tasi
block.copper-wall.name=bakir duvar
block.copper-wall-large.name=buyuk bakir duvar
block.composite-wall.name=bilesik duvari
block.composite-wall-large.name=buyuk bilesik duvar
block.phase-wall.name=faz duvar
block.phase-wall-large.name=genis faz duvar
block.thorium-wall.name=Toryum duvari
block.thorium-wall-large.name=genis toryum duvari
block.door.name=kapi
block.door-large.name=genis kapi
block.duo.name=ikili
block.scorch.name=Atesleyici
block.hail.name=yagdirici
block.lancer.name=Lazer topu
block.conveyor.name=konvenyor
block.titanium-conveyor.name=Titanyum konvenyor
block.junction.name=ayirici
block.router.name=dagitici
block.router.description=esyalari 4 farkli yere dagatir
block.distributor.name=yayici
block.distributor.description=esyalari 8 farkli yere gonderen bir dagitici
block.sorter.name=secici
block.sorter.description=esyalari secer. rengi ayni olan esya ileriden, digerleri sagdan ve soldan devam eder
block.overflow-gate.name=Kapali dagatici
block.overflow-gate.description=sadece saga ve sola dagatir. onu kapalidir
block.bridgeconveyor.name=Yer alti konvenyoru
block.bridgeconveyor.description=2 kutuya kadar gecebilen bit yer alti konvenyoru
block.smelter.name=eritici
block.arc-smelter.name=elektrik eritici
block.silicon-smelter.name=Silikon eritici
block.phase-weaver.name=Dokumaci
block.pulverizer.name=pulvarizor
block.cryofluidmixer.name=Cryosivisi karistiricisi
block.melter.name=eritici
block.incinerator.name=isi firini
block.biomattercompressor.name=Biomatter kompresoru
block.separator.name=separator
block.centrifuge.name=Santrifuj
block.power-node.name=Guc Dugumu
block.power-node-large.name=buyuk Guc Dugumu
block.battery.name=batarya
block.battery-large.name=buyuk batarya
block.combustion-generator.name=sicaklik jenaratoru
block.turbine-generator.name=termal jenaratoru
block.mechanical-drill.name=Mekanikal Kazici
block.pneumatic-drill.name=Pneumatik Kazici
block.laser-drill.name=Lazer kazici
block.water-extractor.name=su ayiricisi
block.cultivator.name=ekici
block.dart-ship-factory.name=Dart Ship Fabrikasi
block.delta-mech-factory.name=Delta Mech Fabrikasi
block.javelin-ship-factory.name=Javelin Ship Fabrikasi
block.trident-ship-factory.name=Trident Ship Fabrikasi
block.glaive-ship-factory.name=Glaive Ship Fabrikasi
block.omega-mech-factory.name=Omega Mech Fabrikasi
block.tau-mech-factory.name=Tau Mech Fabrikasi
block.repairpoint.name=Tamirci
block.resupplypoint.name=Yukleyici
block.conduit.name=boru
block.pulseconduit.name=Pulse borusu
block.liquidrouter.name=sivi ayirici
block.liquidtank.name=sivi tanki
block.liquidjunction.name=sivi koprusu
block.bridgeconduit.name=Kopru borusu
block.mechanical-pump.name=Mekanikal pompa
block.itemsource.name=esya kaynagi
block.itemvoid.name=esya deligi
block.liquidsource.name=sivi kaynagi
block.powervoid.name=guc deligi
block.powerinfinite.name=sonsuz guc
block.unloader.name=bekletici
block.sortedunloader.name=kisaltilmis bekletici
block.vault.name=kasa
block.wave.name=Dalga
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase konvenyoru
block.bridge-conveyor.name=kopru konvenyoru
block.plastanium-compressor.name=Plastanium Kompresoru
block.pyratite-mixer.name=Pyratite karistirici
block.blast-mixer.name=Patlayici karistiricisi
block.solidifer.name=Sertlestirici
block.solar-panel.name=gunes paneli
block.solar-panel-large.name=genis gunes paneli
block.oil-extractor.name=benzin ayirici
block.drone-pad.name=drone pisti
block.fabricator-pad.name=Fabricator Pisti
block.interceptor-pad.name=Interceptor Pisti
block.monsoon-pad.name=Monsoon Pisti
block.repair-point.name=tamirci
block.resupply-point.name=doldurucu
block.pulse-conduit.name=Pulse borusu
block.phase-conduit.name=Phase borusu
block.liquid-router.name=sivi ayirici
block.liquid-tank.name=sivi tanki
block.liquid-junction.name=sivi yonlendirici
block.bridge-conduit.name=kopru borusu
block.rotary-pump.name=donen boru
block.thorium-reactor.name=Thorium Reaktoru
block.command-center.name=komut merkezi
block.mass-driver.name=kütle surucusu
block.blast-drill.name=Patlatici kazici
block.thermal-pump.name=Termal pompa
block.dagger-pad.name=Dagger Pisti
block.titan-pad.name=Titan Pisti
block.thermal-generator.name=Magma jeneratoru
block.alloy-smelter.name=Alloy eritici
block.mend-projector.name=Mend koruyucu
block.surge-wall.name=kabarma duvari
block.surge-wall-large.name=genis kabarma duvari
block.cyclone.name=Siklon
block.fuse.name=fitil
unit.alpha-drone.name=Alpha Dronu
unit.drone.name=Drone
unit.drone.description=baslangic dronu. yapi tamir eder.
unit.fabricator.name=Fabricator
unit.fabricator.description=esya kazar, ve cekirdege birakir.Alpha dronundan daha iyidir
unit.dagger.name=Dagger
unit.dagger.description=basit bir zemin uniti
unit.titan.name=Titan
unit.titan.description=havaya sikabilen, gelismis bir unit
unit.monsoon.name=Monsoon
unit.monsoon.description=agir bir bombaci.
unit.interceptor.name=Interceptor
unit.interceptor.description=hizli bir vurkacci

View File

@@ -1,13 +1,13 @@
text.credits.text=Створив [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GREEN]Перекладач — Prosta4ok_ua\n\n[] Є питання по грі або проблеми с перекладом? Іди в офіційний сервер discord Mindustry в канал #український. text.credits.text=Створив [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GREEN]Перекладач — Prosta4ok_ua\n\n[] Є питання по грі або проблеми с перекладом? Іди в офіційний сервер discord Mindustry в канал #український.
text.credits=Автори text.credits=Автори
text.discord=Приєднуйтесь до нашого Discord! text.discord=Приєднуйтесь до нашого Discord!
text.link.discord.description=офіційний сервер discord Mindustry text.link.discord.description=Офіційний сервер discord Mindustry
text.link.github.description=Ігровий код гри text.link.github.description=Ігровий код гри
text.link.dev-builds.description=Нестабільні розробки text.link.dev-builds.description=Нестабільні розробки
text.link.trello.description=Офіційна дошка trello для запланованих функцій text.link.trello.description=Офіційна дошка trello для запланованих функцій
text.link.itch.io.description=Itch.io сторінка з веб-версією та завантаженням для ПК text.link.itch.io.description=Itch.io сторінка з веб-версією та завантаженням для ПК
text.link.google-play.description=Google Play список магазинів text.link.google-play.description=Скачати з Google Play для Android
text.link.wiki.description=офіційна Mindustry вікі(англ.) text.link.wiki.description=Офіційна Mindustry вікі (англ.)
text.linkfail=Не вдалося відкрити посилання!\nURL-адреса скопійовано у ваш буфер обміну. text.linkfail=Не вдалося відкрити посилання!\nURL-адреса скопійовано у ваш буфер обміну.
text.editor.web=Веб-версія не підтримує редактора! \nЗавантажте гру, щоб використовувати його. text.editor.web=Веб-версія не підтримує редактора! \nЗавантажте гру, щоб використовувати його.
text.web.unsupported=Веб-версія не підтримує цю функцію! Завантажте гру, щоб використовувати її. text.web.unsupported=Веб-версія не підтримує цю функцію! Завантажте гру, щоб використовувати її.
@@ -21,6 +21,7 @@ text.level.delete.title=Підтвердьте видалення
text.map.delete=Ви впевнені, що хочете видалити карту "[orange]{0}[]"? text.map.delete=Ви впевнені, що хочете видалити карту "[orange]{0}[]"?
text.level.select=Вибір рівня text.level.select=Вибір рівня
text.level.mode=Ігровий режим: text.level.mode=Ігровий режим:
text.construction.desktop=Керування робочим столом було змінено.\nЩоб скасувати вибір блоку або припинити будівництво, [accent] скористайтеся пробілом[].
text.construction.title=Інструкція з будівництва блоків text.construction.title=Інструкція з будівництва блоків
text.construction=Ви тільки що вибрали [accent]режим будівництва блоків[].\n\nЩоб розпочати розміщення, просто торкніться відповідного розташування поруч із вашим кораблем.\nПісля вибору деяких блоків натисніть прапорець, щоб підтвердити, і ваш корабель почне будувати їх.\n\\n- [accent]Вилучіть блоки[] з вашого вибору, торкнувшись їх.\n- [accent]Перемістіть виділення[] утримуючи та перетягнувши будь-який блок у виділенні.\n- [accent]Розташуйте блоки у лінію[], торкнувшись і утримуючи порожнє місце, а потім перетягуючи в потрібному напрямку.\n- [accent]Скасуйте конструкцію або виділення[] натиснувши X внизу ліворуч. text.construction=Ви тільки що вибрали [accent]режим будівництва блоків[].\n\nЩоб розпочати розміщення, просто торкніться відповідного розташування поруч із вашим кораблем.\nПісля вибору деяких блоків натисніть прапорець, щоб підтвердити, і ваш корабель почне будувати їх.\n\\n- [accent]Вилучіть блоки[] з вашого вибору, торкнувшись їх.\n- [accent]Перемістіть виділення[] утримуючи та перетягнувши будь-який блок у виділенні.\n- [accent]Розташуйте блоки у лінію[], торкнувшись і утримуючи порожнє місце, а потім перетягуючи в потрібному напрямку.\n- [accent]Скасуйте конструкцію або виділення[] натиснувши X внизу ліворуч.
text.deconstruction.title=Інструкція з деконструкції блоків text.deconstruction.title=Інструкція з деконструкції блоків
@@ -58,11 +59,10 @@ text.name=Нік:
text.unlocked=Новий блок розблоковано! text.unlocked=Новий блок розблоковано!
text.unlocked.plural=Нові блоки розблоковано! text.unlocked.plural=Нові блоки розблоковано!
text.players={0} гравців онлайн text.players={0} гравців онлайн
text.players.single={0} гравець онлай text.players.single={0} гравець онлайн
text.server.mismatch=Пакетна помилка: невідповідність версії клієнта / сервера. \nПереконайтеся, що ви та хост мають останню версію Mindustry! text.server.mismatch=Пакетна помилка: невідповідність версії клієнта / сервера. \nПереконайтеся, що ви та хост мають останню версію Mindustry!
text.server.closing=[accent]Закриття сервера... text.server.closing=[accent]Закриття сервера...
text.server.kicked.kick=Ви були вигнані(кікнуті) з сервера! text.server.kicked.kick=Ви були вигнані(кікнуті) з сервера!
text.server.kicked.fastShoot=Ви стріляєте занадто швидко.
text.server.kicked.serverClose=Сервер закритий. text.server.kicked.serverClose=Сервер закритий.
text.server.kicked.sectorComplete=Сектор завершено. text.server.kicked.sectorComplete=Сектор завершено.
text.server.kicked.sectorComplete.text=Ваша місія завершена. \nСервер продовжить роботу в наступному секторі. text.server.kicked.sectorComplete.text=Ваша місія завершена. \nСервер продовжить роботу в наступному секторі.
@@ -345,6 +345,7 @@ keybind.move_x.name=Переміщення по осі x
keybind.move_y.name=Переміщення по осі y keybind.move_y.name=Переміщення по осі y
keybind.select.name=Виберіть keybind.select.name=Виберіть
keybind.break.name=Зламати keybind.break.name=Зламати
keybind.deselect.name=Скасувати вибір
keybind.shoot.name=Постріл keybind.shoot.name=Постріл
keybind.zoom_hold.name=Утримувати масштаб keybind.zoom_hold.name=Утримувати масштаб
keybind.zoom.name=Збільшити keybind.zoom.name=Збільшити
@@ -402,9 +403,42 @@ item.blast-compound.description=Нестійкий склад, що викори
item.pyratite.name=Піратит item.pyratite.name=Піратит
item.pyratite.description=Вкрай легкозаймиста речовина, що використовується у запальному озброєнні. item.pyratite.description=Вкрай легкозаймиста речовина, що використовується у запальному озброєнні.
liquid.water.name=Вода liquid.water.name=Вода
liquid.water.description=Монооксид дігідрогена
liquid.lava.name=Лава liquid.lava.name=Лава
liquid.lava.description=[ORANGE]Гаряче ...
liquid.oil.name=Нафта liquid.oil.name=Нафта
liquid.oil.description=Хтось писав про додавання золота в гру. Його додали, правда воно якесь чорне ...
liquid.cryofluid.name=Кріогенна рідина liquid.cryofluid.name=Кріогенна рідина
liquid.cryofluid.description=[BLUE] Холодноватенько ...
mech.alpha-mech.name=Альфа
mech.alpha-mech.weapon=Тяжкий ретранслятор
mech.alpha-mech.ability=Юрба дронів
mech.alpha-mech.description=Стандартний мех. Має пристойну швидкість і шкоди; може створити до 3-х дронів для збільшення можливостей атаки.
mech.delta-mech.name=Дельта
mech.delta-mech.weapon=Генератор дуг
mech.delta-mech.ability=Розряд
mech.delta-mech.description=Швидкий, легкоброньований мех, зроблений для ударів з відскоком. Невелика шкода будівлям, але дуже швидко вбиває великі групи ворожих підрозділів своєю дуговою блискавичною зброєю.
mech.tau-mech.name=Тау
mech.tau-mech.weapon=Відновлювальний лазер
mech.tau-mech.ability=Відновлювальний спалах
mech.tau-mech.description=Мех підтримки. Зцілює союзницькі блоки, стріляючи в них. Можна гасити пожежі і зцілити союзників у радіусі зі своэю можливостю для ремонту.
mech.omega-mech.name=Омега
mech.omega-mech.weapon=Купа ракет
mech.omega-mech.ability=Захисна конфігурація
mech.omega-mech.description=Громіздкий і добре броньований хутро, зроблений для фронтових нападів. Його здатність може блокувати до 90% вхідного шкоди.
mech.dart-ship.name=Дротик
mech.dart-ship.weapon=Ретранслятор
mech.dart-ship.description=Стандартний корабель. Досить швидкий і легкий, але має невеликі наступальні можливості і низьку швидкість видобутку.
mech.javelin-ship.name=Джавелін
mech.javelin-ship.description=Ударный корабль, который использует набег с отскоком. Первоначально медленный, но позже он может ускориться до больших скоростей и летать над вражескими заставами, нанося большой урон своей молниеносной способностью и ракетами.
mech.javelin-ship.weapon=Вибухові ракети
mech.javelin-ship.ability=Розряджаючий підсилювач
mech.trident-ship.name=Тризубець
mech.trident-ship.description=Важкий бомбардувальник. Досить добре броньований.
mech.trident-ship.weapon=Вантажний відсік з бомбами
mech.glaive-ship.name=Спис
mech.glaive-ship.description=Ударний корабель, який використовує набіг з відскоком. Спочатку повільний, але пізніше він може прискоритися до великих швидкостей і літати над ворожими заставами, завдаючи великої шкоди своєю. блискавичною здатністю і ракетами.
mech.glaive-ship.weapon=Вогняний ретранслятор
text.item.explosiveness=[LIGHT_GRAY]Вибухонебезпечність: {0} text.item.explosiveness=[LIGHT_GRAY]Вибухонебезпечність: {0}
text.item.flammability=[LIGHT_GRAY]Вогненебезпечність: {0} text.item.flammability=[LIGHT_GRAY]Вогненебезпечність: {0}
text.item.radioactivity=[LIGHT_GRAY]Радіоактивність: {0} text.item.radioactivity=[LIGHT_GRAY]Радіоактивність: {0}
@@ -412,24 +446,32 @@ text.item.fluxiness=[LIGHT_GRAY]Осадковість: {0}
text.item.hardness=[LIGHT_GRAY]Міцність: {0} text.item.hardness=[LIGHT_GRAY]Міцність: {0}
text.unit.health=[LIGHT_GRAY]Здоров'я: {0} text.unit.health=[LIGHT_GRAY]Здоров'я: {0}
text.unit.speed=[LIGHT_GRAY]Швидкість: {0} text.unit.speed=[LIGHT_GRAY]Швидкість: {0}
text.mech.weapon=[LIGHT_GRAY]Зброя: {0}
text.mech.armor=[LIGHT_GRAY]Броня: {0}
text.mech.itemcapacity=[LIGHT_GRAY] Ємність елементів: {0}
text.mech.minespeed=[LIGHT_GRAY]Швидкість видобутку: {0}
text.mech.minepower=[LIGHT_GRAY]Потужність видобутку: {0}
text.mech.ability=[LIGHT_GRAY]Здібність: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Теплоємність: {0} text.liquid.heatcapacity=[LIGHT_GRAY]Теплоємність: {0}
text.liquid.viscosity=[LIGHT_GRAY]В'язкість: {0} text.liquid.viscosity=[LIGHT_GRAY]В'язкість: {0}
text.liquid.temperature=[LIGHT_GRAY]Температура: {0} text.liquid.temperature=[LIGHT_GRAY]Температура: {0}
block.deepwater.name=глибоководдя block.core.name=Ядро
block.water.name=вода block.metalfloor.name=Металічна підлога
block.lava.name=лава block.deepwater.name=Глибоководдя
block.oil.name=нафта block.water.name=Вода
block.blackstone.name=чорний-камінь block.lava.name=Лава
block.stone.name=камінь block.oil.name=Нафта
block.dirt.name=земля block.blackstone.name=Чорний камінь
block.sand.name=пісок block.stone.name=Камінь
block.ice.name=лід block.dirt.name=Земля
block.snow.name=сніг block.sand.name=Пісок
block.grass.name=трава block.ice.name=Лід
block.shrub.name=кущ block.snow.name=Сніг
block.rock.name=кругляк block.grass.name=Трава
block.blackrock.name=чорний-кругляк block.shrub.name=Кущ
block.icerock.name=льодяний-кругляк block.rock.name=Кругляк
block.blackrock.name=Чорнийкругляк
block.icerock.name=Льодяний кругляк
block.copper-wall.name=Мідна стіна block.copper-wall.name=Мідна стіна
block.copper-wall-large.name=Велика мідна стіна block.copper-wall-large.name=Велика мідна стіна
block.composite-wall.name=Композитна стіна block.composite-wall.name=Композитна стіна
@@ -439,14 +481,19 @@ block.phase-wall-large.name=Велика фазова стіна
block.thorium-wall.name=Торієва стіна block.thorium-wall.name=Торієва стіна
block.thorium-wall-large.name=Велика Торієва стіна block.thorium-wall-large.name=Велика Торієва стіна
block.door.name=Двері block.door.name=Двері
block.door.description=Через ці двері не пройдуть вороги, якщо вона закрита. Щоб відкрити / закрити просто натисніть на неї.
block.door-large.name=Великі двері block.door-large.name=Великі двері
block.door-large.description=Для великих стін потрібні великі двері.
block.duo.name=Подвійна block.duo.name=Подвійна
block.scorch.name=Випалювач block.scorch.name=Випалювач
block.hail.name=Град block.hail.name=Град
block.lancer.name=Списоносець block.lancer.name=Списоносець
block.conveyor.name=Конвеєр block.conveyor.name=Конвеєр
block.conveyor.description=Дорога, яка постійно знаходиться в русі. За допомогою нього можна переміщати ресурси.
block.titanium-conveyor.name=Титановий конвеєр block.titanium-conveyor.name=Титановий конвеєр
block.titanium-conveyor.description=Конвеєр другого покоління. Збільшена швидкість переміщення предметів і їх кількість на одному конвеєрі.
block.junction.name=Перехрестя block.junction.name=Перехрестя
block.junction.description=Назва говорить сама за себе. Не дає з'єднатися двом конвеєрів.
block.router.name=Маршрутизатор block.router.name=Маршрутизатор
block.router.description=Розбиває елементи на всі 4 напрямки. Можна зберігати елементи як буфер. block.router.description=Розбиває елементи на всі 4 напрямки. Можна зберігати елементи як буфер.
block.distributor.name=Розподілювач block.distributor.name=Розподілювач
@@ -460,31 +507,40 @@ block.bridgeconveyor.description=Конвеєр, який може пройти
block.smelter.name=Плавильний завод block.smelter.name=Плавильний завод
block.arc-smelter.name=Дуговий плавильний завод block.arc-smelter.name=Дуговий плавильний завод
block.silicon-smelter.name=Кремнієвий завод block.silicon-smelter.name=Кремнієвий завод
block.silicon-smelter.description=За допомогою піску, вугілля і енергії виробляє кремній.\n[RED]НЕ СИЛІКОН[]
block.phase-weaver.name=Фазовий ткач block.phase-weaver.name=Фазовий ткач
block.pulverizer.name=Розпилювач block.pulverizer.name=Розпилювач
block.cryofluidmixer.name=Змішувач кріогненної рідини block.cryofluidmixer.name=Змішувач кріогненної рідини
block.melter.name=Плавильня block.melter.name=Плавильня
block.incinerator.name=Сміттєспалювальний завод block.incinerator.name=Сміттєспалювальний завод
block.incinerator.description=Спалює сміття за допомогою енергії.
block.biomattercompressor.name=Біоматерний компресор block.biomattercompressor.name=Біоматерний компресор
block.biomattercompressor.description=Робить біоматерію з біосміття і енергії.
block.separator.name=Сепаратор block.separator.name=Сепаратор
block.centrifuge.name=Центрифуга block.centrifuge.name=Центрифуга
block.power-node.name=Енергійний вузол block.power-node.name=Енергійний вузол
block.power-node.description=Максимум допустимо 4 підключення. Щоб з'єднати з якимось блоком потрібно наступне:\n1. Щоб він знаходився в радіусі дії\n2.Нажать на потрібний блок.
block.power-node-large.name=Великий енергетичний вузол block.power-node-large.name=Великий енергетичний вузол
block.power-node-large.description=Силовий вузол другого покоління. Збільшено розмір вузла, кількість максимально допустимих підключень і інше.
block.battery.name=Акумулятор block.battery.name=Акумулятор
block.battery.description=Зберігає енергію, але батарейки DURACELL зберігають в 10 разів більше.
block.battery-large.name=Великий акумулятор block.battery-large.name=Великий акумулятор
block.battery-large.description=Зберігає енергію, але батарейки DURACELL все одно зберігають більше!
block.combustion-generator.name=Генератор горіння block.combustion-generator.name=Генератор горіння
block.turbine-generator.name=Турбогенератор block.turbine-generator.name=Турбогенератор
block.mechanical-drill.name=Механічний дриль block.mechanical-drill.name=Механічний дриль
block.mechanical-drill.description=Найперший доступний бур. Можна підвести до нього воду для збільшення швидкості свердління.
block.pneumatic-drill.name=Пневматичний дриль block.pneumatic-drill.name=Пневматичний дриль
block.laser-drill.name=Лазерний дриль block.laser-drill.name=Лазерний дриль
block.water-extractor.name=Екстрактор води block.water-extractor.name=Екстрактор води
block.water-extractor.description=Робить воду з енергії.\n[PINK] Магія!
block.cultivator.name=Культиватор block.cultivator.name=Культиватор
block.dart-ship-factory.name=Завод дротикових кораблів block.dart-ship-factory.name=Завод дротикових кораблів
block.delta-mech-factory.name=Завод механічного дельта броньовика block.delta-mech-factory.name=Завод механічного дельта броньовика
block.javelin-ship-factory.name=Завод кораблів Javelin
block.repairpoint.name=Ремонтний пункт block.repairpoint.name=Ремонтний пункт
block.resupplypoint.name=Постачальна точка block.resupplypoint.name=Постачальна точка
block.conduit.name=Трубопровід block.conduit.name=Трубопровід
block.conduit.description=Конвеєр для рідин першого покоління.
block.pulseconduit.name=Імпульсний трубопровід block.pulseconduit.name=Імпульсний трубопровід
block.liquidrouter.name=Рідкий маршрутизатор block.liquidrouter.name=Рідкий маршрутизатор
block.liquidtank.name=Рідкий резервуар block.liquidtank.name=Рідкий резервуар
@@ -496,29 +552,42 @@ block.itemvoid.name=Предметний вакуум
block.liquidsource.name=Рідке джерело block.liquidsource.name=Рідке джерело
block.powervoid.name=Енергетичний вакуум block.powervoid.name=Енергетичний вакуум
block.powerinfinite.name=Нескінченна енергія block.powerinfinite.name=Нескінченна енергія
block.powerinfinite.description=Ти не повинен це бачити!\n[RED]WARNING[]
block.unloader.name=Розвантажувач block.unloader.name=Розвантажувач
block.sortedunloader.name=Сортований розвантажувач block.sortedunloader.name=Сортований розвантажувач
block.vault.name=Сховище block.vault.name=Сховище
block.vault.description=Зберігає предмети як ядро до 2000.
block.wave.name=Хвиля block.wave.name=Хвиля
block.swarmer.name=Ройевик block.swarmer.name=Ройевик
block.swarmer.description=Навіть Керріган в захваті від такого
block.salvo.name=Залп block.salvo.name=Залп
block.ripple.name=Хвилястість block.ripple.name=Хвилястість
block.phase-conveyor.name=Фазовий конвеєр block.phase-conveyor.name=Фазовий конвеєр
block.bridge-conveyor.name=Bridge Conveyor block.phase-conveyor.description=Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі. Вимагає енергії.
block.bridge-conveyor.name=Мостовий конвеєр
block.bridge-conveyor.description=Він може зробити "тунель", що допомагає обходити перешкоди.
block.plastanium-compressor.name=Пластиновий компресор block.plastanium-compressor.name=Пластиновий компресор
block.pyratite-mixer.name=Змішувач піратиту block.pyratite-mixer.name=Змішувач піратиту
block.blast-mixer.name=Доменний змішувач block.blast-mixer.name=Доменний змішувач
block.solidifer.name=Затверджувач block.solidifer.name=Затверджувач
block.solar-panel.name=Сонячна панель block.solar-panel.name=Сонячна панель
block.solar-panel.description=Зелена енергія
block.solar-panel-large.name=Велика сонячна панель block.solar-panel-large.name=Велика сонячна панель
block.oil-extractor.name=Екстрактор нафти block.oil-extractor.name=Екстрактор нафти
block.drone-pad.name=Стартовий майданчик дронів block.drone-pad.name=Завод дронів
block.fabricator-pad.name=Стартовий майданчик складальників block.fabricator-pad.name=Завод складальників
block.interceptor-pad.name=Стартовий майданчик винищувачів-перехоплювачів block.interceptor-pad.name=Завод винищувачів-перехоплювачів
block.monsoon-pad.name=Стартовий майданчик мусонів block.monsoon-pad.name=Завод мусонів
block.javelin-ship-factory.name=Реконструктор кораблів "Джавелін"
block.trident-ship-factory.name=Реконструктор кораблів "Тризубець"
block.glaive-ship-factory.name=Реконструктор кораблів "Спис"
block.omega-mech-factory.name=Реконстуктор мехів "Омега"
block.tau-mech-factory.name=Реконстуктор мехів "Тау"
block.repair-point.name=Ремонтний пункт block.repair-point.name=Ремонтний пункт
block.repair-point.description=За допомогою енергії лікує тебе.
block.resupply-point.name=постачальна точка block.resupply-point.name=постачальна точка
block.pulse-conduit.name=Імпульсний водовід block.pulse-conduit.name=Імпульсний водовід
block.pulse-conduit.description="Конвеєр" для рідин другого покоління.
block.phase-conduit.name=Фазовий водопровід block.phase-conduit.name=Фазовий водопровід
block.liquid-router.name=Рідкий маршрутизатор block.liquid-router.name=Рідкий маршрутизатор
block.liquid-tank.name=Рідкий резервуар block.liquid-tank.name=Рідкий резервуар
@@ -527,14 +596,23 @@ block.bridge-conduit.name=Мостовий водопровід
block.rotary-pump.name=Роторний насос block.rotary-pump.name=Роторний насос
block.thorium-reactor.name=Торієвий реактор block.thorium-reactor.name=Торієвий реактор
block.command-center.name=Командний центр block.command-center.name=Командний центр
block.command-center.description=Дозволяє управляти бойовими одиницями. Або атакувати, або стояти на місці, або застрявати в блоках ...
block.mass-driver.name=Електромагнітна катапульта block.mass-driver.name=Електромагнітна катапульта
block.mass-driver.description=При наявності енергії передають ресурси на відстань 100 блоків, стріляючи в один-одного.
block.blast-drill.name=Бурова установка block.blast-drill.name=Бурова установка
block.thermal-pump.name=Тепловий насос block.thermal-pump.name=Тепловий насос
block.dagger-pad.name=Стартовий майданчик дронів block.dagger-pad.name=Завод дронів
block.titan-pad.name=Стартовий майданчик титанів block.titan-pad.name=Завод титанів
block.thermal-generator.name=Тепловий генератор block.thermal-generator.name=Тепловий генератор
block.thermal-generator.description=Гаряче сприймає на ура.
block.alloy-smelter.name=Сплавовий завод
block.mend-projector.name=Ремонту гранатомет
block.surge-wall.name=Хвиляста стіна
block.surge-wall-large.name=Велика хвиляста стіна
block.cyclone.name=Циклон
block.fuse.name=Підривник
unit.drone.name=Дрон unit.drone.name=Дрон
unit.drone.description=Стартова бойова одиниця. З'являеться в основному за замовчуванням. Автоматично видобуває руди, збирає предмети і відновлює блоки. unit.drone.description=Стартова бойова одиниця. З'являється в основному за замовчуванням. Автоматично видобуває руди, збирає предмети і відновлює блоки.
unit.fabricator.name=Складальник unit.fabricator.name=Складальник
unit.fabricator.description=Покращений дрон. Автоматично видобуває руди, збирає предмети і відновлює блоки. Значно ефективніший, ніж дрон. unit.fabricator.description=Покращений дрон. Автоматично видобуває руди, збирає предмети і відновлює блоки. Значно ефективніший, ніж дрон.
unit.dagger.name=Кинджал unit.dagger.name=Кинджал
@@ -545,48 +623,3 @@ unit.monsoon.name=Мусон
unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси. unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси.
unit.interceptor.name=Винищувач-перехполювач unit.interceptor.name=Винищувач-перехполювач
unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком
content.mech.name=Mechs
mech.alpha-mech.name=Alpha
mech.alpha-mech.weapon=Heavy Repeater
mech.alpha-mech.ability=Drone Swarm
mech.alpha-mech.description=The standard mech. Has decent speed and damage output; can create up to 3 drones for increased offensive capability.
mech.delta-mech.name=Delta
mech.delta-mech.weapon=Arc Generator
mech.delta-mech.ability=Discharge
mech.delta-mech.description=A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons.
mech.tau-mech.name=Tau
mech.tau-mech.weapon=Restruct Laser
mech.tau-mech.ability=Repair Burst
mech.tau-mech.description=The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability.
mech.omega-mech.name=Omega
mech.omega-mech.weapon=Swarm Missiles
mech.omega-mech.ability=Armored Configuration
mech.omega-mech.description=A bulky and well-armored mech, made for front-line assaults. Its armor ability can block up to 90% of incoming damage.
mech.dart-ship.name=Dart
mech.dart-ship.weapon=Repeater
mech.dart-ship.description=The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed.
mech.javelin-ship.name=Javelin
mech.javelin-ship.description=A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning ability and missiles.
mech.javelin-ship.weapon=Burst Missiles
mech.javelin-ship.ability=Discharge Booster
mech.trident-ship.name=Trident
mech.trident-ship.description=A heavy bomber. Reasonably well armored.
mech.trident-ship.weapon=Bomb Bay
mech.glaive-ship.name=Glaive
mech.glaive-ship.description=A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed.
mech.glaive-ship.weapon=Flame Repeater
text.mech.weapon=[LIGHT_GRAY]Weapon: {0}
text.mech.armor=[LIGHT_GRAY]Armor: {0}
text.mech.itemcapacity=[LIGHT_GRAY]Item Capacity: {0}
text.mech.minespeed=[LIGHT_GRAY]Mining Speed: {0}
text.mech.minepower=[LIGHT_GRAY]Mining Power: {0}
text.mech.ability=[LIGHT_GRAY]Ability: {0}
block.core.name=Core
block.metalfloor.name=Metal Floor
block.trident-ship-factory.name=Trident Ship Reconstructor
block.glaive-ship-factory.name=Glaive Ship Reconstructor
block.omega-mech-factory.name=Omega Mech Reconstructor
block.tau-mech-factory.name=Tau Mech Reconstructor
block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone

View File

@@ -57,7 +57,6 @@ text.players.single={0} 玩家在线
text.server.mismatch=Packet error: 可能是客户端/服务器版本不匹配\n请确保你和房主\n都安装了最新版 Mindustry text.server.mismatch=Packet error: 可能是客户端/服务器版本不匹配\n请确保你和房主\n都安装了最新版 Mindustry
text.server.closing=[accent]正在关闭服务器... text.server.closing=[accent]正在关闭服务器...
text.server.kicked.kick=你被踢出服务器了! text.server.kicked.kick=你被踢出服务器了!
text.server.kicked.fastShoot=你发射得太快了!
text.server.kicked.clientOutdated=客户端版本过旧!请升级! text.server.kicked.clientOutdated=客户端版本过旧!请升级!
text.server.kicked.serverOutdated=服务器版本过旧!请联系房主升级! text.server.kicked.serverOutdated=服务器版本过旧!请联系房主升级!
text.server.kicked.banned=你被这个服务器拉黑了。 text.server.kicked.banned=你被这个服务器拉黑了。
@@ -590,3 +589,11 @@ block.thorium-reactor.name=钍反应堆
block.alloy-smelter.name=合金冶炼厂 block.alloy-smelter.name=合金冶炼厂
block.mend-projector.name=修理投影机 block.mend-projector.name=修理投影机
unit.alpha-drone.name=Alpha 无人机 unit.alpha-drone.name=Alpha 无人机
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -26,7 +26,6 @@ text.players.single={0} 個線上玩家
text.server.mismatch=封包錯誤:客戶端與伺服器版本可能不相符。確保您和伺服主都有最新版本的 Mindustry text.server.mismatch=封包錯誤:客戶端與伺服器版本可能不相符。確保您和伺服主都有最新版本的 Mindustry
text.server.closing=[accent] 正在關閉伺服器... text.server.closing=[accent] 正在關閉伺服器...
text.server.kicked.kick=您已被踢出伺服器! text.server.kicked.kick=您已被踢出伺服器!
text.server.kicked.fastShoot=您射擊的太快了!
text.server.kicked.clientOutdated=客戶端版本過舊!請更新遊戲! text.server.kicked.clientOutdated=客戶端版本過舊!請更新遊戲!
text.server.kicked.serverOutdated=伺服器版本過舊!請聯絡伺服主更新伺服器! text.server.kicked.serverOutdated=伺服器版本過舊!請聯絡伺服主更新伺服器!
text.server.kicked.banned=您已經從這個伺服器被封禁。 text.server.kicked.banned=您已經從這個伺服器被封禁。
@@ -590,3 +589,11 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[].
keybind.press=Press a key...
keybind.press.axis=Press an axis or key...
keybind.deselect.name=Deselect
block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone
block.fuse.name=Fuse

View File

@@ -1,11 +1,11 @@
#ifdef GL_ES #ifdef GL_ES
precision highp float; precision mediump float;
precision highp int; precision mediump int;
#endif #endif
uniform sampler2D u_texture; uniform sampler2D u_texture;
uniform vec2 u_resolution; uniform vec2 u_resolution;
uniform float u_time; uniform int u_time;
uniform vec2 u_uv; uniform vec2 u_uv;
uniform vec2 u_uv2; uniform vec2 u_uv2;
uniform float u_scl; uniform float u_scl;
@@ -14,20 +14,20 @@ varying vec4 v_color;
varying vec2 v_texCoord; varying vec2 v_texCoord;
void main() { void main() {
vec2 coords = ((v_texCoord.xy - u_uv) / (u_uv2 - u_uv) - vec2(0.5, 0.5)) * u_resolution/u_scl; ivec2 coords = ivec2((gl_FragCoord.xy - u_resolution/2.0)/u_scl);
float roundx = 8.0; int roundx = 8;
float roundy = roundx; int roundy = roundx;
float roundm = 0.2; float roundm = 0.2;
coords.x = float(int(coords.x / roundx)) * roundx; coords.x = (coords.x / roundx) * roundx;
coords.y = float(int(coords.y / roundy)) * roundy; coords.y = (coords.y / roundy) * roundy;
float d = abs(coords.x) - abs(coords.y); float d = (abs(float(coords.x)) - abs(float(coords.y)));
float m = abs(sin(-u_time/50.0 + d/120.0)); float m = abs(sin(-float(u_time)/50.0 + d/120.0));
m = float(int(m / roundm)) * roundm + roundm; m = float(int(m / roundm)) * roundm + roundm;
gl_FragColor.rgb = mix(v_color.rgb, vec3(0.0), m); gl_FragColor.rgb = mix(v_color.rgb, vec3(0.0), m);
gl_FragColor.a = mod(abs(coords.x) + abs(coords.y), 110.0) < 35.0 ? 1.0 : 0.0; gl_FragColor.a = mod(abs(float(coords.x)) + abs(float(coords.y)), 110.0) < 35.0 ? 1.0 : 0.0;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

@@ -25,6 +25,7 @@ import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.OS; import io.anuke.ucore.util.OS;
import io.anuke.ucore.util.Translator; import io.anuke.ucore.util.Translator;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
public class Vars{ public class Vars{
@@ -37,7 +38,6 @@ public class Vars{
//team of the enemy in waves //team of the enemy in waves
public static final Team waveTeam = Team.red; public static final Team waveTeam = Team.red;
//discord group URL
public static final String discordURL = "https://discord.gg/mindustry"; public static final String discordURL = "https://discord.gg/mindustry";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
public static final String crashReportURL = "http://mindustry.us.to/report"; public static final String crashReportURL = "http://mindustry.us.to/report";
@@ -147,6 +147,8 @@ public class Vars{
} }
} }
Arrays.sort(locales, (l1, l2) -> Platform.instance.getLocaleName(l1).compareTo(Platform.instance.getLocaleName(l2)));
Version.init(); Version.init();
playerGroup = Entities.addGroup(Player.class).enableMapping(); playerGroup = Entities.addGroup(Player.class).enableMapping();

View File

@@ -137,7 +137,7 @@ public class Mechs implements ContentList{
boostSpeed = 0.8f; boostSpeed = 0.8f;
weapon = Weapons.healBlaster; weapon = Weapons.healBlaster;
maxSpeed = 5f; maxSpeed = 5f;
armor = 35f; armor = 15f;
altChargeAlpha = 0.05f; altChargeAlpha = 0.05f;
trailColorTo = Palette.heal; trailColorTo = Palette.heal;
} }
@@ -150,8 +150,6 @@ public class Mechs implements ContentList{
@Override @Override
public void updateAlt(Player player){ public void updateAlt(Player player){
//idle regen
player.healBy(0.01f * Timers.delta());
if(player.altHeat >= 0.91f){ if(player.altHeat >= 0.91f){
Effects.effect(UnitFx.healWave, player); Effects.effect(UnitFx.healWave, player);
@@ -197,7 +195,7 @@ public class Mechs implements ContentList{
weapon = Weapons.swarmer; weapon = Weapons.swarmer;
trailColorTo = Color.valueOf("feb380"); trailColorTo = Color.valueOf("feb380");
maxSpeed = 3.5f; maxSpeed = 3.5f;
armor = 50f; armor = 45f;
} }
@Override @Override

View File

@@ -3,9 +3,9 @@ package io.anuke.mindustry.content;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.*; import io.anuke.mindustry.content.blocks.*;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.type.Recipe;
import static io.anuke.mindustry.type.Category.*; import static io.anuke.mindustry.type.Category.*;
@@ -145,14 +145,14 @@ public class Recipes implements ContentList{
new Recipe(units, UnitBlocks.dronePad, new ItemStack(Items.copper, 70), new ItemStack(Items.lead, 110), new ItemStack(Items.silicon, 130)); new Recipe(units, UnitBlocks.dronePad, new ItemStack(Items.copper, 70), new ItemStack(Items.lead, 110), new ItemStack(Items.silicon, 130));
new Recipe(units, UnitBlocks.fabricatorPad, new ItemStack(Items.densealloy, 90), new ItemStack(Items.thorium, 80), new ItemStack(Items.lead, 110), new ItemStack(Items.silicon, 210)); new Recipe(units, UnitBlocks.fabricatorPad, new ItemStack(Items.densealloy, 90), new ItemStack(Items.thorium, 80), new ItemStack(Items.lead, 110), new ItemStack(Items.silicon, 210));
new Recipe(units, UnitBlocks.daggerPad, new ItemStack(Items.lead, 90), new ItemStack(Items.silicon, 70)).setMode(GameMode.noWaves); new Recipe(units, UnitBlocks.daggerPad, new ItemStack(Items.lead, 90), new ItemStack(Items.silicon, 70)).setPad();
new Recipe(units, UnitBlocks.titanPad, new ItemStack(Items.thorium, 90), new ItemStack(Items.lead, 140), new ItemStack(Items.silicon, 90)).setMode(GameMode.noWaves); new Recipe(units, UnitBlocks.titanPad, new ItemStack(Items.thorium, 90), new ItemStack(Items.lead, 140), new ItemStack(Items.silicon, 90)).setPad();
new Recipe(units, UnitBlocks.interceptorPad, new ItemStack(Items.titanium, 60), new ItemStack(Items.lead, 80), new ItemStack(Items.silicon, 90)).setMode(GameMode.noWaves); new Recipe(units, UnitBlocks.interceptorPad, new ItemStack(Items.titanium, 60), new ItemStack(Items.lead, 80), new ItemStack(Items.silicon, 90)).setPad();
new Recipe(units, UnitBlocks.monsoonPad, new ItemStack(Items.plastanium, 80), new ItemStack(Items.titanium, 100), new ItemStack(Items.lead, 130), new ItemStack(Items.silicon, 220)).setMode(GameMode.noWaves); new Recipe(units, UnitBlocks.monsoonPad, new ItemStack(Items.plastanium, 80), new ItemStack(Items.titanium, 100), new ItemStack(Items.lead, 130), new ItemStack(Items.silicon, 220)).setPad();
new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.copper, 30), new ItemStack(Items.silicon, 30)); new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.copper, 30), new ItemStack(Items.silicon, 30));
new Recipe(units, UnitBlocks.commandCenter, new ItemStack(Items.lead, 100), new ItemStack(Items.densealloy, 100), new ItemStack(Items.silicon, 200)).setMode(GameMode.noWaves); new Recipe(units, UnitBlocks.commandCenter, new ItemStack(Items.lead, 100), new ItemStack(Items.densealloy, 100), new ItemStack(Items.silicon, 200)).setPad();
//LIQUIDS //LIQUIDS
new Recipe(liquid, LiquidBlocks.conduit, new ItemStack(Items.lead, 1)).setDependencies(CraftingBlocks.smelter); new Recipe(liquid, LiquidBlocks.conduit, new ItemStack(Items.lead, 1)).setDependencies(CraftingBlocks.smelter);
@@ -176,43 +176,6 @@ public class Recipes implements ContentList{
new Recipe(units, DebugBlocks.powerInfinite).setDebug(); new Recipe(units, DebugBlocks.powerInfinite).setDebug();
} }
static void init(Object... objects){
Category cat = null;
Block block = null;
ItemStack stack = null;
Array<ItemStack> arr = new Array<>();
for(Object object : objects){
if(object instanceof Category){
if(stack != null) throw new RuntimeException("Finish defining stack before beginning category");
if(block != null){
new Recipe(cat, block, arr.toArray(ItemStack.class));
block = null;
stack = null;
arr.clear();
}
cat = (Category) object;
}else if(object instanceof Block){
if(cat == null) throw new RuntimeException("Finish defining category before beginning blocks");
if(block != null){
new Recipe(cat, block, arr.toArray(ItemStack.class));
stack = null;
arr.clear();
}
block = (Block) object;
arr.clear();
}else if(object instanceof Item){
if(block == null) throw new RuntimeException("Finish defining block before defining item");
if(stack != null) throw new RuntimeException("Finish defining stack before defining another stack");
stack = new ItemStack((Item) object, 1);
}else if(object instanceof Integer){
if(stack == null) throw new RuntimeException("Finish defining item before defining item amount");
stack.amount = (Integer) object;
arr.add(stack);
stack = null;
}
}
}
@Override @Override
public Array<? extends Content> getAll(){ public Array<? extends Content> getAll(){
return Recipe.all(); return Recipe.all();

View File

@@ -60,7 +60,6 @@ public class Weapons implements ContentList{
reload = 60f; reload = 60f;
shots = 4; shots = 4;
inaccuracy = 2f; inaccuracy = 2f;
roundrobin = false;
roundrobin = true; roundrobin = true;
ejectEffect = Fx.none; ejectEffect = Fx.none;
velocityRnd = 0.2f; velocityRnd = 0.2f;
@@ -75,7 +74,6 @@ public class Weapons implements ContentList{
shots = 4; shots = 4;
spacing = 8f; spacing = 8f;
inaccuracy = 8f; inaccuracy = 8f;
roundrobin = false;
roundrobin = true; roundrobin = true;
ejectEffect = Fx.none; ejectEffect = Fx.none;
shake = 3f; shake = 3f;

View File

@@ -73,12 +73,13 @@ public class PowerBlocks extends BlockList implements ContentList{
powerNode = new PowerNode("power-node"){{ powerNode = new PowerNode("power-node"){{
shadow = "shadow-round-1"; shadow = "shadow-round-1";
powerSpeed = 0.5f;
maxNodes = 4; maxNodes = 4;
}}; }};
powerNodeLarge = new PowerNode("power-node-large"){{ powerNodeLarge = new PowerNode("power-node-large"){{
size = 2; size = 2;
powerSpeed = 1f; powerSpeed = 1.5f;
maxNodes = 6; maxNodes = 6;
laserRange = 7.5f; laserRange = 7.5f;
shadow = "shadow-round-2"; shadow = "shadow-round-2";

View File

@@ -44,10 +44,10 @@ public class TurretBlocks extends BlockList implements ContentList{
hail = new ArtilleryTurret("hail"){{ hail = new ArtilleryTurret("hail"){{
ammoTypes = new AmmoType[]{AmmoTypes.artilleryDense, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary}; ammoTypes = new AmmoType[]{AmmoTypes.artilleryDense, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary};
reload = 100f; reload = 80f;
recoil = 2f; recoil = 2f;
range = 200f; range = 230f;
inaccuracy = 5f; inaccuracy = 1f;
health = 120; health = 120;
}}; }};
@@ -195,7 +195,7 @@ public class TurretBlocks extends BlockList implements ContentList{
restitution = 0.02f; restitution = 0.02f;
recoil = 6f; recoil = 6f;
shootShake = 2f; shootShake = 2f;
range = 300f; range = 320f;
health = 550; health = 550;
}}; }};

View File

@@ -96,7 +96,7 @@ public class MissileBullets extends BulletList implements ContentList{
} }
}; };
swarm = new MissileBulletType(2.7f, 14, "missile"){ swarm = new MissileBulletType(2.7f, 12, "missile"){
{ {
bulletWidth = 8f; bulletWidth = 8f;
bulletHeight = 8f; bulletHeight = 8f;
@@ -105,7 +105,7 @@ public class MissileBullets extends BulletList implements ContentList{
homingRange = 60f; homingRange = 60f;
keepVelocity = false; keepVelocity = false;
splashDamageRadius = 25f; splashDamageRadius = 25f;
splashDamage = 11f; splashDamage = 10f;
lifetime = 120f; lifetime = 120f;
trailColor = Color.GRAY; trailColor = Color.GRAY;
backColor = Palette.bulletYellowBack; backColor = Palette.bulletYellowBack;

View File

@@ -36,7 +36,7 @@ public class TurretBullets extends BulletList implements ContentList{
@Override @Override
public void load(){ public void load(){
healBullet = new BulletType(5.2f, 19){ healBullet = new BulletType(5.2f, 13){
float healAmount = 21f; float healAmount = 21f;
{ {

View File

@@ -272,7 +272,7 @@ public class Control extends Module{
for(int i = 0; i < Recipe.all().size; i++){ for(int i = 0; i < Recipe.all().size; i++){
Recipe recipe = Recipe.all().get(i); Recipe recipe = Recipe.all().get(i);
if(!recipe.debugOnly && entity.items.has(recipe.requirements, 1.4f)){ if(!recipe.debugOnly && recipe.requirements != null && entity.items.has(recipe.requirements, 1.4f)){
if(control.database().unlockContent(recipe)){ if(control.database().unlockContent(recipe)){
ui.hudfrag.showUnlock(recipe); ui.hudfrag.showUnlock(recipe);
} }

View File

@@ -199,8 +199,10 @@ public class NetClient extends Module{
@Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
public static void onSnapshot(byte[] chunk, int snapshotID, short chunkID, int totalLength, int base){ public static void onSnapshot(byte[] chunk, int snapshotID, short chunkID, int totalLength, int base){
int totalChunks = Mathf.ceil((float) totalLength / NetServer.maxSnapshotSize);
if(NetServer.debugSnapshots) if(NetServer.debugSnapshots)
Log.info("Recieved snapshot: len {0} ID {1} chunkID {2} totalLength {3} base {4} client-base {5}", chunk.length, snapshotID, chunkID, totalLength, base, netClient.lastSnapshotBaseID); Log.info("Recieved snapshot: len {0} ID {1} chunkID {2} / "+totalChunks+" totalLength {3} base {4} client-base {5}", chunk.length, snapshotID, chunkID, totalLength, base, netClient.lastSnapshotBaseID);
//skip snapshot IDs that have already been recieved OR snapshots that are too far in front //skip snapshot IDs that have already been recieved OR snapshots that are too far in front
if(base != -1 && (snapshotID < netClient.lastSnapshotBaseID || !netClient.recievedSnapshots.containsKey(base))){ if(base != -1 && (snapshotID < netClient.lastSnapshotBaseID || !netClient.recievedSnapshots.containsKey(base))){
@@ -214,10 +216,9 @@ public class NetClient extends Module{
//total length exceeds that needed to hold one snapshot, therefore, it is split into chunks //total length exceeds that needed to hold one snapshot, therefore, it is split into chunks
if(totalLength > NetServer.maxSnapshotSize){ if(totalLength > NetServer.maxSnapshotSize){
//total amount of chunks to recieve //total amount of chunks to recieve
int totalChunks = Mathf.ceil((float) totalLength / NetServer.maxSnapshotSize);
//reset status when a new snapshot sending begins //reset status when a new snapshot sending begins
if(netClient.currentSnapshotID != snapshotID){ if(netClient.currentSnapshotID != snapshotID || netClient.recievedChunks == null || netClient.recievedChunks.length != totalChunks){
netClient.currentSnapshotID = snapshotID; netClient.currentSnapshotID = snapshotID;
netClient.currentSnapshot = new byte[totalLength]; netClient.currentSnapshot = new byte[totalLength];
netClient.recievedChunkCounter = 0; netClient.recievedChunkCounter = 0;

View File

@@ -155,12 +155,10 @@ public class Renderer extends RendererModule{
}else{ }else{
Vector2 position = averagePosition(); Vector2 position = averagePosition();
if(!mobile){ if(players[0].isDead()){
if(players[0].isDead()){ smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f);
smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f); }else if(!mobile){
}else{ setCamera(position.x + 0.0001f, position.y + 0.0001f);
setCamera(position.x + 0.0001f, position.y + 0.0001f);
}
} }
if(world.getSector() == null){ if(world.getSector() == null){
@@ -417,9 +415,7 @@ public class Renderer extends RendererModule{
public Vector2 averagePosition(){ public Vector2 averagePosition(){
avgPosition.setZero(); avgPosition.setZero();
drawAndInterpolate(playerGroup, p -> p.isLocal, p -> { drawAndInterpolate(playerGroup, p -> p.isLocal, p -> avgPosition.add(p.x, p.y));
avgPosition.add(p.x, p.y);
});
avgPosition.scl(1f / players.length); avgPosition.scl(1f / players.length);
return avgPosition; return avgPosition;

View File

@@ -117,7 +117,7 @@ public class UI extends SceneModule{
font.setUseIntegerPositions(false); font.setUseIntegerPositions(false);
font.getData().setScale(Vars.fontScale); font.getData().setScale(Vars.fontScale);
font.getData().down += Unit.dp.scl(4f); font.getData().down += Unit.dp.scl(4f);
font.getData().lineHeight -= Unit.dp.scl(2f); font.getData().lineHeight -= Unit.dp.scl(4.3f);
}, skin.font(), skin.getFont("default-font-chat"), skin.getFont("korean"), skin.getFont("trad-chinese"), skin.getFont("simp-chinese")); }, skin.font(), skin.getFont("default-font-chat"), skin.getFont("korean"), skin.getFont("trad-chinese"), skin.getFont("simp-chinese"));
} }

View File

@@ -27,7 +27,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity; import io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity;
import io.anuke.mindustry.world.blocks.units.MechFactory;
import io.anuke.ucore.core.*; import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.ucore.entities.trait.SolidTrait;
@@ -74,7 +73,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
private Tile mining; private Tile mining;
private CarriableTrait carrying; private CarriableTrait carrying;
private Trail trail = new Trail(12); private Trail trail = new Trail(12);
private Vector2 movement = new Vector2(); private Vector2 movement = new Translator();
private boolean moved; private boolean moved;
public Player(){ public Player(){
@@ -227,10 +226,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void set(float x, float y){ public void set(float x, float y){
this.x = x; this.x = x;
this.y = y; this.y = y;
if(isFlying() && isLocal){
Core.camera.position.set(x, y, 0f);
}
} }
@Override @Override
@@ -612,12 +607,17 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
if(moveTarget != null && !moveTarget.isDead()){ if(moveTarget != null && !moveTarget.isDead()){
targetX = moveTarget.getX(); targetX = moveTarget.getX();
targetY = moveTarget.getY(); targetY = moveTarget.getY();
boolean tapping = moveTarget instanceof TileEntity && moveTarget.getTeam() == team;
attractDst = 0f; attractDst = 0f;
if(tapping){
velocity.setAngle(Mathf.slerpDelta(velocity.angle(), angleTo(moveTarget), 0.1f));
}
if(distanceTo(moveTarget) < 2f){ if(distanceTo(moveTarget) < 2f){
if(moveTarget instanceof CarriableTrait){ if(moveTarget instanceof CarriableTrait){
carry((CarriableTrait) moveTarget); carry((CarriableTrait) moveTarget);
}else if(moveTarget instanceof TileEntity && ((TileEntity) moveTarget).tile.block() instanceof MechFactory){ }else if(tapping){
Tile tile = ((TileEntity) moveTarget).tile; Tile tile = ((TileEntity) moveTarget).tile;
tile.block().tapped(tile, this); tile.block().tapped(tile, this);
} }

View File

@@ -110,7 +110,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
} }
public boolean isDead(){ public boolean isDead(){
return dead; return dead || tile.entity != this;
} }
public void write(DataOutputStream stream) throws IOException{ public void write(DataOutputStream stream) throws IOException{
@@ -127,6 +127,10 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
tile.block().handleBulletHit(this, other); tile.block().handleBulletHit(this, other);
} }
public void kill(){
Call.onTileDestroyed(tile);
}
public void damage(float damage){ public void damage(float damage){
if(dead) return; if(dead) return;
@@ -251,9 +255,9 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
if(health <= 0){ if(health <= 0){
onDeath(); onDeath();
} }
Block previous = tile.block();
tile.block().update(tile); tile.block().update(tile);
if(cons != null){ if(tile.block() == previous && cons != null){
cons.update(this); cons.update(this);
} }
} }

View File

@@ -163,7 +163,7 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
@Override @Override
public boolean collides(SolidTrait other){ public boolean collides(SolidTrait other){
return type.collides && super.collides(other); return type.collides && super.collides(other) && !supressCollision;
} }
@Override @Override
@@ -208,6 +208,14 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
supressCollision = false; supressCollision = false;
} }
@Override
protected void updateLife(){
if(time >= type.lifetime){
if(!supressCollision) type.despawned(this);
remove();
}
}
@Override @Override
public void reset(){ public void reset(){
super.reset(); super.reset();

View File

@@ -217,7 +217,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
vec.set(target.getX() - x, target.getY() - y); vec.set(target.getX() - x, target.getY() - y);
float length = Mathf.clamp((distanceTo(target) - circleLength) / 100f, -1f, 1f); float length = circleLength <= 0.001f ? 1f : Mathf.clamp((distanceTo(target) - circleLength) / 100f, -1f, 1f);
vec.setLength(type.speed * Timers.delta() * length); vec.setLength(type.speed * Timers.delta() * length);
if(length < 0) vec.rotate(180f); if(length < 0) vec.rotate(180f);

View File

@@ -18,6 +18,7 @@ import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.ItemType;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
@@ -190,7 +191,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
public void update(){ public void update(){
ItemDrop item = (ItemDrop) target; ItemDrop item = (ItemDrop) target;
if(item == null || inventory.isFull() || !inventory.canAcceptItem(item.getItem(), 1)){ if(item == null || inventory.isFull() || item.getItem().type != ItemType.material || !inventory.canAcceptItem(item.getItem(), 1)){
setState(drop); setState(drop);
return; return;
} }
@@ -220,6 +221,12 @@ public class Drone extends FlyingUnit implements BuilderTrait{
return; return;
} }
if(inventory.getItem().item.type != ItemType.material){
inventory.clearItem();
setState(mine);
return;
}
target = getClosestCore(); target = getClosestCore();
if(target == null) return; if(target == null) return;

View File

@@ -15,8 +15,10 @@ public enum GameMode{
disableWaves = true; disableWaves = true;
hidden = true; hidden = true;
autoSpawn = true; autoSpawn = true;
showPads = true;
}}, }},
pvp{{ pvp{{
showPads = true;
disableWaves = true; disableWaves = true;
isPvp = true; isPvp = true;
hidden = true; hidden = true;
@@ -24,7 +26,7 @@ public enum GameMode{
respawnTime = 60 * 10; respawnTime = 60 * 10;
}}; }};
public boolean infiniteResources, disableWaveTimer, disableWaves, hidden, autoSpawn, isPvp; public boolean infiniteResources, disableWaveTimer, disableWaves, hidden, autoSpawn, isPvp, showPads;
public float enemyCoreBuildRadius = 400f; public float enemyCoreBuildRadius = 400f;
public float enemyCoreShieldRadius = 140f; public float enemyCoreShieldRadius = 140f;
public float respawnTime = 60 * 4; public float respawnTime = 60 * 4;

View File

@@ -53,8 +53,10 @@ public class Shaders{
@Override @Override
public void apply(){ public void apply(){
time = time % 158;
shader.setUniformf("u_resolution", Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); shader.setUniformf("u_resolution", Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
shader.setUniformf("u_time", time += Gdx.graphics.getDeltaTime() * 60f); shader.setUniformi("u_time", (int)(time += Gdx.graphics.getDeltaTime() * 60f));
shader.setUniformf("u_uv", Draw.getBlankRegion().getU(), Draw.getBlankRegion().getV()); shader.setUniformf("u_uv", Draw.getBlankRegion().getU(), Draw.getBlankRegion().getV());
shader.setUniformf("u_scl", Unit.dp.scl(1f)); shader.setUniformf("u_scl", Unit.dp.scl(1f));
shader.setUniformf("u_uv2", Draw.getBlankRegion().getU2(), Draw.getBlankRegion().getV2()); shader.setUniformf("u_uv2", Draw.getBlankRegion().getU2(), Draw.getBlankRegion().getV2());

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.graphics;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.FloatArray; import com.badlogic.gdx.utils.FloatArray;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
@@ -28,7 +29,7 @@ public class Trail{
points.add(curx, cury); points.add(curx, cury);
if(points.size > length * 2){ if(points.size > (int)(length * 2 / Math.min(Timers.delta(), 1f))){
float[] items = points.items; float[] items = points.items;
System.arraycopy(items, 2, items, 0, points.size - 2); System.arraycopy(items, 2, items, 0, points.size - 2);
points.size -= 2; points.size -= 2;

View File

@@ -20,21 +20,22 @@ public class Changelogs{
String description = value.getString("body").replace("\r", ""); String description = value.getString("body").replace("\r", "");
int id = value.getInt("id"); int id = value.getInt("id");
int build = Integer.parseInt(value.getString("tag_name").substring(1)); int build = Integer.parseInt(value.getString("tag_name").substring(1));
out.add(new VersionInfo(name, description, id, build)); out.add(new VersionInfo(name, description, id, build, value.getString("published_at")));
} }
success.accept(out); success.accept(out);
}, fail); }, fail);
} }
public static class VersionInfo{ public static class VersionInfo{
public final String name, description; public final String name, description, date;
public final int id, build; public final int id, build;
public VersionInfo(String name, String description, int id, int build){ public VersionInfo(String name, String description, int id, int build, String date){
this.name = name; this.name = name;
this.description = description; this.description = description;
this.id = id; this.id = id;
this.build = build; this.build = build;
this.date = date;
} }
@Override @Override

View File

@@ -32,6 +32,7 @@ import io.anuke.mindustry.world.consumers.ConsumePower;
import io.anuke.ucore.function.BiFunction; import io.anuke.ucore.function.BiFunction;
import io.anuke.ucore.function.IntPositionConsumer; import io.anuke.ucore.function.IntPositionConsumer;
import io.anuke.ucore.function.TriFunction; import io.anuke.ucore.function.TriFunction;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class FortressGenerator{ public class FortressGenerator{
@@ -196,11 +197,21 @@ public class FortressGenerator{
//big turrets //big turrets
seeder.get(bigTurret, tile -> tile.block() instanceof StorageBlock && gen.random.chance(0.65)), seeder.get(bigTurret, tile -> tile.block() instanceof StorageBlock && gen.random.chance(0.65)),
//walls (large)
seeder.get(wallLarge, tile -> !(tile.block() instanceof Wall) && !(tile.block() instanceof UnitPad)),
//walls //walls
seeder.get(wall, tile -> !(tile.block() instanceof Wall) && !(tile.block() instanceof UnitPad)), (x, y) -> {
if(!gen.canPlace(x, y, wall)) return;
for(GridPoint2 point : Geometry.d8){
Tile tile = gen.tile(x + point.x, y + point.y);
if(tile != null){
tile = tile.target();
if(tile.getTeamID() == team.ordinal() && !(tile.block() instanceof Wall) && !(tile.block() instanceof UnitPad)){
gen.setBlock(x, y, wall, team);
break;
}
}
}
},
//fill up turrets w/ ammo //fill up turrets w/ ammo
(x, y) -> { (x, y) -> {

View File

@@ -45,7 +45,7 @@ public class Generation{
return null; return null;
} }
if(!block.isValid(tiles[worldx][worldy])) continue; if(!block.isValid(tiles[worldx][worldy]) || tiles[worldx][worldy].floor().drops == null) continue;
Item drop = tiles[worldx][worldy].floor().drops.item; Item drop = tiles[worldx][worldy].floor().drops.item;

View File

@@ -3,7 +3,6 @@ package io.anuke.mindustry.net;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.IntMap;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
import static io.anuke.mindustry.Vars.headless; import static io.anuke.mindustry.Vars.headless;
@@ -31,15 +30,6 @@ public class Administration{
load(); load();
} }
public boolean isAntiGrief(){
return Settings.getBool("antigrief");
}
public void setAntiGrief(boolean antiGrief){
Settings.putBool("antigrief", antiGrief);
Settings.save();
}
public boolean allowsCustomClients(){ public boolean allowsCustomClients(){
return Settings.getBool("allow-custom", !headless); return Settings.getBool("allow-custom", !headless);
} }
@@ -49,10 +39,6 @@ public class Administration{
Settings.save(); Settings.save();
} }
public boolean isValidateReplace(){
return false;
}
public void setAntiGriefParams(int maxBreak, int cooldown){ public void setAntiGriefParams(int maxBreak, int cooldown){
Settings.putInt("antigrief-max", maxBreak); Settings.putInt("antigrief-max", maxBreak);
Settings.putInt("antigrief-cooldown", cooldown); Settings.putInt("antigrief-cooldown", cooldown);
@@ -63,42 +49,6 @@ public class Administration{
return editLogs; return editLogs;
} }
public boolean validateBreak(String id, String ip){
if(!isAntiGrief() || isAdmin(id, ip)) return true;
PlayerInfo info = getCreateInfo(id);
if(info.lastBroken == null || info.lastBroken.length != Settings.getInt("antigrief-max")){
info.lastBroken = new long[Settings.getInt("antigrief-max")];
}
long[] breaks = info.lastBroken;
int shiftBy = 0;
for(int i = 0; i < breaks.length && breaks[i] != 0; i++){
if(TimeUtils.timeSinceMillis(breaks[i]) >= Settings.getInt("antigrief-cooldown")){
shiftBy = i;
}
}
for(int i = 0; i < breaks.length; i++){
breaks[i] = (i + shiftBy >= breaks.length) ? 0 : breaks[i + shiftBy];
}
int remaining = 0;
for(int i = 0; i < breaks.length; i++){
if(breaks[i] == 0){
remaining = breaks.length - i;
break;
}
}
if(remaining == 0) return false;
breaks[breaks.length - remaining] = TimeUtils.millis();
return true;
}
/** /**
* Call when a player joins to update their information here. * Call when a player joins to update their information here.
*/ */
@@ -349,8 +299,6 @@ public class Administration{
public boolean banned, admin; public boolean banned, admin;
public long lastKicked; //last kicked timestamp public long lastKicked; //last kicked timestamp
public long[] lastBroken;
PlayerInfo(String id){ PlayerInfo(String id){
this.id = id; this.id = id;
} }

View File

@@ -5,6 +5,7 @@ import io.anuke.annotations.Annotations.Remote;
import io.anuke.annotations.Annotations.Variant; import io.anuke.annotations.Annotations.Variant;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.ucore.util.Log;
import static io.anuke.mindustry.Vars.maxTextLength; import static io.anuke.mindustry.Vars.maxTextLength;
import static io.anuke.mindustry.Vars.playerGroup; import static io.anuke.mindustry.Vars.playerGroup;
@@ -17,6 +18,8 @@ public class NetEvents{
throw new ValidateException(player, "Player has sent a message above the text limit."); throw new ValidateException(player, "Player has sent a message above the text limit.");
} }
Log.info("&y{0}: &lb{1}", (player.name == null ? "" : player.name), message);
if(Vars.ui != null){ if(Vars.ui != null){
Vars.ui.chatfrag.addMessage(message, player == null ? null : colorizeName(player.id, player.name)); Vars.ui.chatfrag.addMessage(message, player == null ? null : colorizeName(player.id, player.name));
} }

View File

@@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.OrderedMap; import com.badlogic.gdx.utils.OrderedMap;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.ui.ContentDisplay; import io.anuke.mindustry.ui.ContentDisplay;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
@@ -35,7 +34,7 @@ public class Recipe implements UnlockableContent{
public boolean desktopOnly = false, debugOnly = false; public boolean desktopOnly = false, debugOnly = false;
//the only gamemode in which the recipe shows up //the only gamemode in which the recipe shows up
public GameMode targetMode; public boolean isPad;
private Block[] dependencies; private Block[] dependencies;
private Recipe[] recipeDependencies; private Recipe[] recipeDependencies;
@@ -104,8 +103,8 @@ public class Recipe implements UnlockableContent{
} }
} }
public Recipe setMode(GameMode mode){ public Recipe setPad(){
this.targetMode = mode; this.isPad = true;
return this; return this;
} }

View File

@@ -63,7 +63,7 @@ public class ChangelogDialog extends FloatingDialog{
Table in = new Table("clear"); Table in = new Table("clear");
in.top().left().margin(10); in.top().left().margin(10);
in.add("[accent]" + info.name); in.add("[accent]" + info.name + "[LIGHT_GRAY] | " + info.date);
if(info.build == Version.build){ if(info.build == Version.build){
in.row(); in.row();
in.add("$text.changelog.current"); in.add("$text.changelog.current");

View File

@@ -67,6 +67,10 @@ public class BlocksFragment extends Fragment{
descTable = new Table("button"); descTable = new Table("button");
descTable.visible(() -> (hoverRecipe != null || input.recipe != null) && shown); //make sure it's visible when necessary descTable.visible(() -> (hoverRecipe != null || input.recipe != null) && shown); //make sure it's visible when necessary
descTable.update(() -> { descTable.update(() -> {
if(state.is(State.menu)){
descTable.clear();
control.input(0).recipe = null;
}
// note: This is required because there is no direct connection between input.recipe and the description ui. // note: This is required because there is no direct connection between input.recipe and the description ui.
// If input.recipe gets set to null, a proper cleanup of the ui elements is required. // If input.recipe gets set to null, a proper cleanup of the ui elements is required.
boolean anyRecipeShown = input.recipe != null || hoverRecipe != null; boolean anyRecipeShown = input.recipe != null || hoverRecipe != null;
@@ -167,7 +171,7 @@ public class BlocksFragment extends Fragment{
//add actual recipes //add actual recipes
for(Recipe r : recipes){ for(Recipe r : recipes){
if((r.debugOnly && !debug) || (r.desktopOnly && mobile) || (r.targetMode != null && r.targetMode != state.mode)) continue; if((r.debugOnly && !debug) || (r.desktopOnly && mobile) || (r.isPad && !state.mode.showPads)) continue;
ImageButton image = new ImageButton(new TextureRegion(), "select"); ImageButton image = new ImageButton(new TextureRegion(), "select");

View File

@@ -146,7 +146,8 @@ public class HudFragment extends Fragment{
}); });
t.top().visible(() -> { t.top().visible(() -> {
if(state.is(State.menu) || state.teams.get(players[0].getTeam()).cores.size == 0){ if(state.is(State.menu) || state.teams.get(players[0].getTeam()).cores.size == 0 ||
state.teams.get(players[0].getTeam()).cores.first().entity == null){
coreAttackTime = 0f; coreAttackTime = 0f;
return false; return false;
} }

View File

@@ -101,9 +101,7 @@ public abstract class BaseBlock{
return true; return true;
} }
/** /**Returns how much power is accepted.*/
* Returns how much power is accepted.
*/
public float addPower(Tile tile, float amount){ public float addPower(Tile tile, float amount){
float canAccept = Math.min(powerCapacity - tile.entity.power.amount, amount); float canAccept = Math.min(powerCapacity - tile.entity.power.amount, amount);

View File

@@ -53,6 +53,7 @@ public class BuildBlock extends Block{
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team){ public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team){
if(tile == null) return;
tile.setRotation(rotation); tile.setRotation(rotation);
world.setBlock(tile, block, team); world.setBlock(tile, block, team);
Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size); Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size);

View File

@@ -61,6 +61,7 @@ public class ItemTurret extends CooledTurret{
@Override @Override
public void handleItem(Item item, Tile tile, Tile source){ public void handleItem(Item item, Tile tile, Tile source){
TurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
if(entity == null) return;
AmmoType type = ammoMap.get(item); AmmoType type = ammoMap.get(item);
entity.totalAmmo += type.quantityMultiplier; entity.totalAmmo += type.quantityMultiplier;

View File

@@ -253,7 +253,7 @@ public class ItemBridge extends Block{
if(rel == rel2) return false; if(rel == rel2) return false;
}else{ }else{
return source.block() instanceof ItemBridge && source.<ItemBridgeEntity>entity().link == tile.packedPosition(); return source.block() instanceof ItemBridge && source.<ItemBridgeEntity>entity().link == tile.packedPosition() && tile.entity.items.total() < itemCapacity;
} }
return tile.entity.items.total() < itemCapacity; return tile.entity.items.total() < itemCapacity;

View File

@@ -2,11 +2,12 @@ package io.anuke.mindustry.world.blocks.distribution;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.mindustry.world.blocks.LiquidBlock;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
//TODO fix
public class LiquidJunction extends LiquidBlock{ public class LiquidJunction extends LiquidBlock{
public LiquidJunction(String name){ public LiquidJunction(String name){
@@ -14,6 +15,18 @@ public class LiquidJunction extends LiquidBlock{
hasLiquids = true; hasLiquids = true;
} }
@Override
public void setBars(){
super.setBars();
bars.remove(BarType.liquid);
}
@Override
public void setStats(){
super.setStats();
stats.remove(BlockStat.liquidCapacity);
}
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
Draw.rect(name(), tile.worldx(), tile.worldy()); Draw.rect(name(), tile.worldx(), tile.worldy());
@@ -30,8 +43,9 @@ public class LiquidJunction extends LiquidBlock{
dir = (dir + 4) % 4; dir = (dir + 4) % 4;
Tile to = tile.getNearby(dir); Tile to = tile.getNearby(dir);
if(to.block().hasLiquids && to.block().acceptLiquid(to, tile, liquid, amount)) if(to.block().hasLiquids && to.block().acceptLiquid(to, tile, liquid, Math.min(to.block().liquidCapacity - to.entity.liquids.get(liquid) - 0.00001f, amount))){
to.block().handleLiquid(to, tile, liquid, amount); to.block().handleLiquid(to, tile, liquid, Math.min(to.block().liquidCapacity - to.entity.liquids.get(liquid) - 0.00001f, amount));
}
} }
@Override @Override
@@ -39,7 +53,6 @@ public class LiquidJunction extends LiquidBlock{
int dir = source.relativeTo(dest.x, dest.y); int dir = source.relativeTo(dest.x, dest.y);
dir = (dir + 4) % 4; dir = (dir + 4) % 4;
Tile to = dest.getNearby(dir); Tile to = dest.getNearby(dir);
return to != null && to.block().hasLiquids && return to != null && to.block().hasLiquids && to.block().acceptLiquid(to, dest, liquid, Math.min(to.block().liquidCapacity - to.entity.liquids.get(liquid) - 0.00001f, amount));
to.block().acceptLiquid(to, dest, liquid, amount);
} }
} }

View File

@@ -264,7 +264,7 @@ public class MassDriver extends Block{
//whether this mass driver is waiting for a bullet to hit it and deliver items //whether this mass driver is waiting for a bullet to hit it and deliver items
public boolean isRecieving; public boolean isRecieving;
//whether this driver just recieved some items and is now unloading //whether this driver just recieved some items and is now unloading
public boolean isUnloading; public boolean isUnloading = true;
public float reload = 0f; public float reload = 0f;

View File

@@ -121,8 +121,8 @@ public class NuclearReactor extends PowerGenerator{
entity.heat = Mathf.clamp(entity.heat); entity.heat = Mathf.clamp(entity.heat);
if(entity.heat >= 1f){ if(entity.heat >= 0.999f){
entity.damage((int) entity.health); entity.kill();
}else{ }else{
distributePower(tile); distributePower(tile);
} }
@@ -141,9 +141,7 @@ public class NuclearReactor extends PowerGenerator{
Effects.shake(6f, 16f, tile.worldx(), tile.worldy()); Effects.shake(6f, 16f, tile.worldx(), tile.worldy());
Effects.effect(ExplosionFx.nuclearShockwave, tile.worldx(), tile.worldy()); Effects.effect(ExplosionFx.nuclearShockwave, tile.worldx(), tile.worldy());
for(int i = 0; i < 6; i++){ for(int i = 0; i < 6; i++){
Timers.run(Mathf.random(40), () -> { Timers.run(Mathf.random(40), () -> Effects.effect(BlockFx.nuclearcloud, tile.worldx(), tile.worldy()));
Effects.effect(BlockFx.nuclearcloud, tile.worldx(), tile.worldy());
});
} }
Damage.damage(tile.worldx(), tile.worldy(), explosionRadius * tilesize, explosionDamage * 4); Damage.damage(tile.worldx(), tile.worldy(), explosionRadius * tilesize, explosionDamage * 4);

View File

@@ -79,7 +79,7 @@ public class CoreBlock extends StorageBlock{
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void setCoreSolid(Tile tile, boolean solid){ public static void setCoreSolid(Tile tile, boolean solid){
CoreEntity entity = tile.entity(); CoreEntity entity = tile.entity();
entity.solid = solid; if(entity != null) entity.solid = solid;
} }
@Override @Override

View File

@@ -17,6 +17,7 @@ import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.type.Mech; import io.anuke.mindustry.type.Mech;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumePowerExact;
import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Graphics;
@@ -48,7 +49,7 @@ public class MechFactory extends Block{
@Override @Override
public void init(){ public void init(){
consumes.power(powerCapacity * 0.8f); consumes.add(new ConsumePowerExact(powerCapacity * 0.8f));
super.init(); super.init();
} }

View File

@@ -48,7 +48,7 @@ public class ConsumeItemFilter extends Consume{
public boolean valid(Block block, TileEntity entity){ public boolean valid(Block block, TileEntity entity){
for(int i = 0; i < Item.all().size; i++){ for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i); Item item = Item.getByID(i);
if(entity.items.has(item) && this.filter.test(item)){ if(entity.items != null && entity.items.has(item) && this.filter.test(item)){
return true; return true;
} }
} }

View File

@@ -39,7 +39,7 @@ public class ConsumeItems extends Consume{
@Override @Override
public boolean valid(Block block, TileEntity entity){ public boolean valid(Block block, TileEntity entity){
return entity.items.has(items); return entity.items != null && entity.items.has(items);
} }
@Override @Override

View File

@@ -56,7 +56,7 @@ public class ConsumeLiquidFilter extends Consume{
@Override @Override
public boolean valid(Block block, TileEntity entity){ public boolean valid(Block block, TileEntity entity){
return filter.test(entity.liquids.current()) && entity.liquids.currentAmount() >= use(block); return entity.liquids != null && filter.test(entity.liquids.current()) && entity.liquids.currentAmount() >= use(block);
} }
@Override @Override

View File

@@ -9,7 +9,7 @@ import io.anuke.ucore.core.Timers;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
public class ConsumePower extends Consume{ public class ConsumePower extends Consume{
private final float use; protected final float use;
public ConsumePower(float use){ public ConsumePower(float use){
this.use = use; this.use = use;
@@ -27,11 +27,13 @@ public class ConsumePower extends Consume{
@Override @Override
public void update(Block block, TileEntity entity){ public void update(Block block, TileEntity entity){
if(entity.power == null) return;
entity.power.amount -= Math.min(use(block), entity.power.amount); entity.power.amount -= Math.min(use(block), entity.power.amount);
} }
@Override @Override
public boolean valid(Block block, TileEntity entity){ public boolean valid(Block block, TileEntity entity){
if(entity.power == null) return false;
return entity.power.amount >= use(block); return entity.power.amount >= use(block);
} }
@@ -40,7 +42,7 @@ public class ConsumePower extends Consume{
stats.add(BlockStat.powerUse, use * 60f, StatUnit.powerSecond); stats.add(BlockStat.powerUse, use * 60f, StatUnit.powerSecond);
} }
float use(Block block){ protected float use(Block block){
return Math.min(use * Timers.delta(), block.powerCapacity); return Math.min(use * Timers.delta(), block.powerCapacity);
} }
} }

View File

@@ -0,0 +1,14 @@
package io.anuke.mindustry.world.consumers;
import io.anuke.mindustry.world.Block;
public class ConsumePowerExact extends ConsumePower{
public ConsumePowerExact(float use){
super(use);
}
protected float use(Block block){
return this.use;
}
}

View File

@@ -2,6 +2,8 @@ package io.anuke.mindustry.world.meta;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import java.util.Locale;
/** /**
* Describes one type of stat for a block. * Describes one type of stat for a block.
*/ */
@@ -53,6 +55,6 @@ public enum BlockStat{
} }
public String localized(){ public String localized(){
return Bundles.get("text.blocks." + name().toLowerCase()); return Bundles.get("text.blocks." + name().toLowerCase(Locale.ROOT));
} }
} }

View File

@@ -10,6 +10,8 @@ import io.anuke.mindustry.world.meta.values.*;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Log;
import java.util.Locale;
/** /**
* Hold and organizes a list of block stats. * Hold and organizes a list of block stats.
*/ */
@@ -71,7 +73,7 @@ public class BlockStats{
* Adds a stat value. * Adds a stat value.
*/ */
public void add(BlockStat stat, StatValue value){ public void add(BlockStat stat, StatValue value){
if(!Bundles.has("text.blocks." + stat.name().toLowerCase())){ if(!Bundles.has("text.blocks." + stat.name().toLowerCase(Locale.ROOT))){
if(!errorWhenMissing){ if(!errorWhenMissing){
Log.err("Warning: No bundle entry for stat type \"" + stat + "\"!"); Log.err("Warning: No bundle entry for stat type \"" + stat + "\"!");
}else{ }else{
@@ -79,9 +81,9 @@ public class BlockStats{
} }
} }
if(!Bundles.has("text.category." + stat.category.name().toLowerCase())){ if(!Bundles.has("text.category." + stat.category.name().toLowerCase(Locale.ROOT))){
if(!errorWhenMissing){ if(!errorWhenMissing){
Log.err("Warning: No bundle entry for stat cateogry \"" + stat.category + "\"!"); Log.err("Warning: No bundle entry for stat category \"" + stat.category + "\"!");
}else{ }else{
throw new RuntimeException("No bundle entry for stat category \"" + stat.category + "\"!"); throw new RuntimeException("No bundle entry for stat category \"" + stat.category + "\"!");
} }

View File

@@ -2,6 +2,8 @@ package io.anuke.mindustry.world.meta;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import java.util.Locale;
/** /**
* Defines a unit of measurement for block stats. * Defines a unit of measurement for block stats.
*/ */
@@ -19,6 +21,6 @@ public enum StatUnit{
items; items;
public String localized(){ public String localized(){
return Bundles.get("text.unit." + name().toLowerCase()); return Bundles.get("text.unit." + name().toLowerCase(Locale.ROOT));
} }
} }

View File

@@ -11,20 +11,25 @@ public class LiquidModule extends BlockModule{
private float total; private float total;
private Liquid current = Liquid.getByID(0); private Liquid current = Liquid.getByID(0);
/** /**Returns total amount of liquids.*/
* Returns total amount of liquids.
*/
public float total(){ public float total(){
return total; return total;
} }
/** /**Last recieved or loaded liquid. Only valid for liquid modules with 1 type of liquid.*/
* Last recieved or loaded liquid. Only valid for liquid modules with 1 type of liquid.
*/
public Liquid current(){ public Liquid current(){
return current; return current;
} }
public void reset(Liquid liquid, float amount){
for(int i = 0; i < liquids.length; i++){
liquids[i] = 0f;
}
liquids[liquid.id] = amount;
total = amount;
current = liquid;
}
public float currentAmount(){ public float currentAmount(){
return liquids[current.id]; return liquids[current.id];
} }

View File

@@ -132,8 +132,10 @@ public class KryoServer implements ServerProvider {
//this only opens the default port due to security concerns (?) //this only opens the default port due to security concerns (?)
if(port == Vars.port){ if(port == Vars.port){
async(() -> { async(() -> {
if(!UPnP.isMappedTCP(port)) UPnP.openPortTCP(port); try{
if(!UPnP.isMappedUDP(port)) UPnP.openPortUDP(port); if(!UPnP.isMappedTCP(port)) UPnP.openPortTCP(port);
if(!UPnP.isMappedUDP(port)) UPnP.openPortUDP(port);
}catch(Throwable ignored){}
}); });
} }

View File

@@ -111,11 +111,11 @@ public class Generators {
image.draw(type.weapon.equipRegion, image.draw(type.weapon.equipRegion,
-(int)type.weaponOffsetX + (image.width() - type.weapon.equipRegion.getRegionWidth())/2, -(int)type.weaponOffsetX + (image.width() - type.weapon.equipRegion.getRegionWidth())/2,
(int)type.weaponOffsetY - (image.height() - type.weapon.equipRegion.getRegionHeight())/2, (int)type.weaponOffsetY - (image.height() - type.weapon.equipRegion.getRegionHeight())/2 + 1,
false, false); false, false);
image.draw(type.weapon.equipRegion, image.draw(type.weapon.equipRegion,
(int)type.weaponOffsetX + (image.width() - type.weapon.equipRegion.getRegionWidth())/2, (int)type.weaponOffsetX + (image.width() - type.weapon.equipRegion.getRegionWidth())/2,
(int)type.weaponOffsetY - (image.height() - type.weapon.equipRegion.getRegionHeight())/2, (int)type.weaponOffsetY - (image.height() - type.weapon.equipRegion.getRegionHeight())/2 + 1,
true, false); true, false);
} }

View File

@@ -39,8 +39,9 @@ public class CrashHandler{
//add all relevant info, ignoring exceptions //add all relevant info, ignoring exceptions
ex(() -> value.addChild("build", new JsonValue(Version.build))); ex(() -> value.addChild("build", new JsonValue(Version.build)));
ex(() -> value.addChild("mode", new JsonValue(Vars.state.mode.toString()))); ex(() -> value.addChild("mode", new JsonValue(Vars.state.mode.name())));
ex(() -> value.addChild("difficulty", new JsonValue(Vars.state.difficulty.toString()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name())));
ex(() -> value.addChild("difficulty", new JsonValue(Vars.state.difficulty.name())));
ex(() -> value.addChild("players", new JsonValue(Vars.playerGroup.size()))); ex(() -> value.addChild("players", new JsonValue(Vars.playerGroup.size())));
ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name")))); ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name"))));
ex(() -> value.addChild("trace", new JsonValue(parseException(e)))); ex(() -> value.addChild("trace", new JsonValue(parseException(e))));

View File

@@ -13,7 +13,6 @@ import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.net.Administration;
import io.anuke.mindustry.net.Administration.PlayerInfo; import io.anuke.mindustry.net.Administration.PlayerInfo;
import io.anuke.mindustry.net.EditLog; import io.anuke.mindustry.net.EditLog;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
@@ -339,35 +338,6 @@ public class ServerControl extends Module{
info("Debug mode is now {0}.", value ? "on" : "off"); info("Debug mode is now {0}.", value ? "on" : "off");
}); });
handler.register("antigrief", "[on/off] [max-break] [cooldown-in-ms]", "Enable or disable anti-grief.", arg -> {
if(arg.length == 0){
info("Anti-grief is currently &lc{0}.", netServer.admins.isAntiGrief() ? "on" : "off");
return;
}
String s = arg[0];
if(s.equalsIgnoreCase("on")){
netServer.admins.setAntiGrief(true);
info("Anti-grief enabled.");
}else if(s.equalsIgnoreCase("off")){
netServer.admins.setAntiGrief(false);
info("Anti-grief disabled.");
}else{
err("Incorrect command usage.");
}
if(arg.length >= 2){
try{
int maxbreak = Integer.parseInt(arg[1]);
int cooldown = (arg.length >= 3 ? Integer.parseInt(arg[2]) : Administration.defaultBreakCooldown);
netServer.admins.setAntiGriefParams(maxbreak, cooldown);
info("Anti-grief parameters set.");
}catch(NumberFormatException e){
err("Invalid number format.");
}
}
});
handler.register("allow-custom-clients", "[on/off]", "Allow or disallow custom clients.", arg -> { handler.register("allow-custom-clients", "[on/off]", "Allow or disallow custom clients.", arg -> {
if(arg.length == 0){ if(arg.length == 0){
info("Custom clients are currently &lc{0}.", netServer.admins.allowsCustomClients() ? "allowed" : "disallowed"); info("Custom clients are currently &lc{0}.", netServer.admins.allowsCustomClients() ? "allowed" : "disallowed");