Merge branch 'master' of https://github.com/Anuken/Mindustry into resource-rework

This commit is contained in:
Anuken
2018-08-18 13:10:22 -04:00
63 changed files with 1674 additions and 1830 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 = '2f18f69ffb' uCoreVersion = 'e492954e86'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()
@@ -194,7 +194,9 @@ project(":server") {
apply plugin: "java" apply plugin: "java"
configurations { configurations {
compile.exclude module: android if(findProject(":android") != null){
compile.exclude module: android
}
} }
dependencies { dependencies {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 B

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 B

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

After

Width:  |  Height:  |  Size: 327 B

View File

@@ -87,7 +87,7 @@ 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.
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.
text.server.kicked.nameEmpty=Your name must contain at least one character or number. text.server.kicked.nameEmpty=Your chosen name is invalid.
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.
text.server.kicked.customClient=This server does not support custom builds. Download an official version. text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. text.host.info=The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
@@ -356,6 +356,11 @@ setting.mutemusic.name=Mute Music
setting.sfxvol.name=SFX Volume setting.sfxvol.name=SFX Volume
setting.mutesound.name=Mute Sound setting.mutesound.name=Mute Sound
text.keybind.title=Rebind Keys text.keybind.title=Rebind Keys
category.general.name=General
category.view.name=View
category.multiplayer.name=Multiplayer
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 keybind.select.name=Select
@@ -368,8 +373,15 @@ keybind.pause.name=Pause
keybind.dash.name=Dash keybind.dash.name=Dash
keybind.chat.name=Chat keybind.chat.name=Chat
keybind.player_list.name=Player list keybind.player_list.name=Player list
keybind.console.name=console keybind.console.name=Console
keybind.rotate.name=Rotate keybind.rotate.name=Rotate
keybind.toggle_menus.name=Toggle menus
keybind.chat_history_prev.name=Chat history prev
keybind.chat_history_next.name=Chat history next
keybind.chat_scroll.name=Chat scroll
keybind.drop_unit.name=drop unit
keybind.zoom_minimap.name=Zoom minimap
mode.text.help.title=Description of modes mode.text.help.title=Description of modes
mode.waves.name=waves mode.waves.name=waves
mode.waves.description=the normal mode. limited resources and automatic incoming waves. mode.waves.description=the normal mode. limited resources and automatic incoming waves.

View File

@@ -15,7 +15,6 @@ text.players={0} Spieler online
text.players.single={0} Spieler online text.players.single={0} Spieler online
text.server.mismatch=Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben! text.server.mismatch=Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben!
text.server.kicked.kick=Du wurdest vom Server gekickt! text.server.kicked.kick=Du wurdest vom Server gekickt!
text.server.kicked.invalidPassword=Falsches Passwort.
text.hostserver=Server hosten text.hostserver=Server hosten
text.host=Host text.host=Host
text.hosting=[accent] Server wird geöffnet... text.hosting=[accent] Server wird geöffnet...
@@ -464,7 +463,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=Time: [LIGHT_GRAY]{0}
@@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,6 @@ text.players.single=joueur en ligne
text.server.mismatch=Erreur de paquet: possible incompatibilité de version client/serveur. Assurez-vous que vous et l'hôte avez la dernière version de Mindustry! text.server.mismatch=Erreur de paquet: possible incompatibilité de version client/serveur. Assurez-vous que vous et l'hôte avez la dernière version de Mindustry!
text.server.closing=[accent]Fermeture du serveur ... text.server.closing=[accent]Fermeture du serveur ...
text.server.kicked.kick=Vous avez été expulsé du serveur! text.server.kicked.kick=Vous avez été expulsé du serveur!
text.server.kicked.invalidPassword=Mot de passe non valide !
text.server.kicked.clientOutdated=Client dépassé! Mettez à jour votre jeu! text.server.kicked.clientOutdated=Client dépassé! Mettez à jour votre jeu!
text.server.kicked.serverOutdated=Serveur dépassé! Demandez à l'hôte de le mettre à jour! text.server.kicked.serverOutdated=Serveur dépassé! Demandez à l'hôte de le mettre à jour!
text.server.kicked.banned=Vous êtes banni sur ce serveur. text.server.kicked.banned=Vous êtes banni sur ce serveur.
@@ -224,19 +223,20 @@ block.liquidjunction.name=jonction à liquide
block.sorter.name=trieur block.sorter.name=trieur
block.smelter.name=fonderie block.smelter.name=fonderie
text.credits=Credits text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom text.link.discord.description=Le discord officiel de Mindustry
text.link.github.description=Game source code text.link.github.description=code source du jeu
text.link.dev-builds.description=Unstable development builds text.link.dev-builds.description=version de développement instable
text.link.trello.description=Official trello board for planned features text.link.trello.description=le tableau trelli officiel pour les futures ajouts
text.link.itch.io.description=itch.io page with PC downloads and web version text.link.itch.io.description=la page itch.io avec la version Web et PC à télécharger
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki text.link.google-play.description=la page Google play Store
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard. text.link.wiki.description=wiki officiel de Mindustry
text.editor.web=The web version does not support the editor!\nDownload the game to use it. text.linkfail=Erreur lors de l'ouverture du lien !\nL'URL as bien été copier dans le presse-papiers.
text.web.unsupported=The web version does not support this feature! Download the game to use it. text.editor.web=Votre navigateur ne supporte pas l'éditeur !\nTéléchargez le jeu pour l'utiliser.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"? text.web.unsupported=votre navigateur ne supporte pas cette fonctionnalité ! Téléchargez le jeu pour l'utiliser.
text.construction.title=Block Construction Guide text.map.delete=êtes vous sûre de supprimer la carte "[orange]{0}[]"?
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left. text.construction.title=Guide des blocs de construction
text.construction=Voou avez sélectionné le [accent]mode de construction de blocs[].\n\n pour commencer à en placer, taper sur un emplacement validé près de votre vaisseau '.\nUne fois que vous avez sélectionné des blocs, appuyez sur la flèche pour valider, et votre vaisseau va les construire.\n\n- [accent]Enlever des blocs[] de votre sélection en les touchant.\n- [accent]étendez la sélection[] en maintenant et en étirant les blocs de la selection.\n- [accent]Placer des blocs en ligne[] en touchant et en laissant appuyer sur une case vide, puis étirez dans une direction.\n- [accent]Annulez une construction ou une selection[]en appuyant sur X en bas à gauche .
text.deconstruction.title=Block Deconstruction Guide text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left. text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session text.showagain=Don't show again next session
@@ -464,7 +464,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=Time: [LIGHT_GRAY]{0}
@@ -503,8 +502,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +513,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -16,7 +16,6 @@ text.players.single={0} pemain online
text.server.mismatch=Kesalahan paket: kemungkinan versi client / server tidak sesuai.\nPastikan Anda dan host memiliki versi terbaru Mindustry! text.server.mismatch=Kesalahan paket: kemungkinan versi client / server tidak sesuai.\nPastikan Anda dan host memiliki versi terbaru Mindustry!
text.server.closing=[accent]Menutup server... text.server.closing=[accent]Menutup server...
text.server.kicked.kick=Anda telah dikeluarkan dari server! text.server.kicked.kick=Anda telah dikeluarkan dari server!
text.server.kicked.invalidPassword=Kata sandi salah!
text.server.kicked.clientOutdated=Client versi lama! Update game Anda! text.server.kicked.clientOutdated=Client versi lama! Update game Anda!
text.server.kicked.serverOutdated=Server versi lama! Tanyakan host untuk mengupdate! text.server.kicked.serverOutdated=Server versi lama! Tanyakan host untuk mengupdate!
text.hostserver=Host Server text.hostserver=Host Server
@@ -464,7 +463,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=Time: [LIGHT_GRAY]{0}
@@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -26,7 +26,6 @@ text.players.single={0} giocatori online
text.server.mismatch=Errore nel pacchetto: possibile discrepanza nella versione client / server. Assicurati che tu e l'host abbiate l'ultima versione di Mindustry! text.server.mismatch=Errore nel pacchetto: possibile discrepanza nella versione client / server. Assicurati che tu e l'host abbiate l'ultima versione di Mindustry!
text.server.closing=[accent]Chiusura server ... text.server.closing=[accent]Chiusura server ...
text.server.kicked.kick=Sei stato cacciato dal server! text.server.kicked.kick=Sei stato cacciato dal server!
text.server.kicked.invalidPassword=Password non valida.
text.server.kicked.clientOutdated=Versione del client obsoleta! Aggiorna il tuo gioco! text.server.kicked.clientOutdated=Versione del client obsoleta! Aggiorna il tuo gioco!
text.server.kicked.serverOutdated=Server obsoleto! Chiedi all'host di aggiornare! text.server.kicked.serverOutdated=Server obsoleto! Chiedi all'host di aggiornare!
text.server.kicked.banned=Sei bannato da questo server. text.server.kicked.banned=Sei bannato da questo server.
@@ -254,7 +253,6 @@ text.showagain=non mostrare più
text.unlocks=Sblocchi text.unlocks=Sblocchi
text.addplayers=Aggiungi/rimuovi giocatori text.addplayers=Aggiungi/rimuovi giocatori
text.customgame=Gioco personalizzato text.customgame=Gioco personalizzato
text.campaign=Campagna
text.sectors=Settori text.sectors=Settori
text.sector=Settori Selezionati: [LIGHT_GRAY]{0} text.sector=Settori Selezionati: [LIGHT_GRAY]{0}
text.sector.time=Tempo: [LIGHT_GRAY]{0} text.sector.time=Tempo: [LIGHT_GRAY]{0}
@@ -308,28 +306,28 @@ text.editor.export=Esportazione...
text.editor.exportfile=Esporta file text.editor.exportfile=Esporta file
text.editor.exportfile.description=Esporta file mappa text.editor.exportfile.description=Esporta file mappa
text.editor.exportimage=Esporta immagine terreno text.editor.exportimage=Esporta immagine terreno
text.editor.exportimage.description=Export a map image file text.editor.exportimage.description=Esporta file immagine mappa
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? text.editor.overwrite.confirm=[scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
text.fps=FPS: {0} text.fps=FPS: {0}
text.tps=TPS: {0} text.tps=TPS: {0}
text.ping=Ping: {0}ms text.ping=Ping: {0}ms
text.settings.rebind=Rebind text.settings.rebind=Reinposta
text.yes=Yes text.yes=Si
text.no=No text.no=No
text.blocks.targetsair=Targets Air text.blocks.targetsair=Attacca nemici aerei
text.blocks.itemspeed=Units Moved text.blocks.itemspeed=Unità spostate
text.blocks.shootrange=Range text.blocks.shootrange=Raggio
text.blocks.poweruse=Power Use text.blocks.poweruse=Utilizzo energia
text.blocks.inputitemcapacity=Input Item Capacity text.blocks.inputitemcapacity=Capacità oggetti in entrata
text.blocks.outputitemcapacity=Input Item Capacity text.blocks.outputitemcapacity=Capacità oggetti in uscità
text.blocks.maxpowergeneration=Max Power Generation text.blocks.maxpowergeneration=Produzione massima energia
text.blocks.powertransferspeed=Power Transfer text.blocks.powertransferspeed=Velocità trasferimento energia
text.blocks.craftspeed=Production Speed text.blocks.craftspeed=Velocità produzione
text.blocks.inputliquidaux=Aux Liquid text.blocks.inputliquidaux=Liquidi extra
text.blocks.inputitems=Input Items text.blocks.inputitems=Oggetti in entrata
text.blocks.outputitem=Output Item text.blocks.outputitem=Oggetti in uscita
text.blocks.drilltier=Drillables text.blocks.drilltier=Scavabili
text.blocks.drillspeed=Base Drill Speed text.blocks.drillspeed=Velocità scavo stbile
text.blocks.liquidoutput=Uscita liquidi text.blocks.liquidoutput=Uscita liquidi
text.blocks.liquiduse=Uso liquidi text.blocks.liquiduse=Uso liquidi
text.blocks.coolant=Refrigerante text.blocks.coolant=Refrigerante
@@ -508,11 +506,36 @@ unit.drone.name=Drone
unit.drone.description=Un'unità base, che mina e costruisce. unit.drone.description=Un'unità base, che mina e costruisce.
unit.fabricator.name=Costruttore unit.fabricator.name=Costruttore
unit.fabricator.description=Un drone molto avanzato che raccoglie minerali e costruisce molto meglio e più velocemente di un drone base. unit.fabricator.description=Un drone molto avanzato che raccoglie minerali e costruisce molto meglio e più velocemente di un drone base.
unit.scout.name=Esploratore
unit.scout.description=Un unità di base a terra. Usa piombo come munizioni.
unit.titan.name=Titano unit.titan.name=Titano
unit.titan.description=Un'unità di terra corazzata avanzata. Utilizza carburo come munizione. Attacca sia bersagli terrestri che aerei. unit.titan.description=Un'unità di terra corazzata avanzata. Utilizza carburo come munizione. Attacca sia bersagli terrestri che aerei.
unit.monsoon.name=Monsone unit.monsoon.name=Monsone
unit.monsoon.description=Un bombardiere molto potente, che raderà al suolo chiunque gli passi davanti. unit.monsoon.description=Un bombardiere molto potente, che raderà al suolo chiunque gli passi davanti.
unit.interceptor.name=Intercettatore unit.interceptor.name=Intercettatore
unit.interceptor.description=Un veloce ed efficiente torretta che funziona con il piombo. unit.interceptor.description=Un veloce ed efficiente torretta che funziona con il piombo.
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -40,7 +40,6 @@ 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.fastShoot=당신은 총을 너무 빨리 발사했습니다.
text.server.kicked.invalidPassword=알 수 없는 비밀번호 입니다!
text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요!
text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다. text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다.
@@ -281,7 +280,6 @@ text.category.liquids=액체
text.category.items=아이템 text.category.items=아이템
text.category.crafting=제작 text.category.crafting=제작
text.category.shooting=사격 text.category.shooting=사격
setting.difficulty.easy=쉬움 setting.difficulty.easy=쉬움
setting.difficulty.normal=보통 setting.difficulty.normal=보통
setting.difficulty.hard=어려움 setting.difficulty.hard=어려움
@@ -304,9 +302,7 @@ setting.musicvol.name=음악 크기
setting.mutemusic.name=음소거 setting.mutemusic.name=음소거
setting.sfxvol.name=효과음 크기 setting.sfxvol.name=효과음 크기
setting.mutesound.name=소리 끄기 setting.mutesound.name=소리 끄기
text.keybind.title=키 바인딩 text.keybind.title=키 바인딩
keybind.move_x.name=오른쪽/왼쪽 이동 keybind.move_x.name=오른쪽/왼쪽 이동
keybind.move_y.name=위쪽/아래쪽 이동 keybind.move_y.name=위쪽/아래쪽 이동
keybind.select.name=선택 keybind.select.name=선택
@@ -321,7 +317,6 @@ keybind.chat.name=채팅
keybind.player_list.name=플레이어 목록 keybind.player_list.name=플레이어 목록
keybind.console.name=콘솔 keybind.console.name=콘솔
keybind.rotate.name=회전 keybind.rotate.name=회전
mode.text.help.title=도움말 mode.text.help.title=도움말
mode.waves.name=단계 mode.waves.name=단계
mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다. mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다.
@@ -329,12 +324,10 @@ mode.sandbox.name=샌드박스
mode.sandbox.description=무한한 자원과 다음단계 시작을 위한 타이머가 없습니다. mode.sandbox.description=무한한 자원과 다음단계 시작을 위한 타이머가 없습니다.
mode.freebuild.name=자유 건축 mode.freebuild.name=자유 건축
mode.freebuild.description=제한된 자원과 다음단계 시작을 위한 타이머가 없습니다. mode.freebuild.description=제한된 자원과 다음단계 시작을 위한 타이머가 없습니다.
content.item.name=아이템 content.item.name=아이템
content.liquid.name=액체 content.liquid.name=액체
content.unit-type.name=종류 content.unit-type.name=종류
content.recipe.name=블록 content.recipe.name=블록
item.stone.name= item.stone.name=
item.stone.description=흔히 찾을 수 있는 자원. 바닥에서 돌을 캐거나 용암을 사용하여 얻을 수 있습니다. item.stone.description=흔히 찾을 수 있는 자원. 바닥에서 돌을 캐거나 용암을 사용하여 얻을 수 있습니다.
item.tungsten.name=텅스텐 item.tungsten.name=텅스텐
@@ -363,12 +356,10 @@ item.blast-compound.name=폭발 화합물
item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물. 이 연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다. item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물. 이 연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다.
item.pyratite.name=피러레이트 item.pyratite.name=피러레이트
item.pyratite.description=화염 무기에 사용되는 엄청난 가연성 물질. item.pyratite.description=화염 무기에 사용되는 엄청난 가연성 물질.
liquid.water.name= liquid.water.name=
liquid.lava.name=용암 liquid.lava.name=용암
liquid.oil.name=석유 liquid.oil.name=석유
liquid.cryofluid.name=냉각수 liquid.cryofluid.name=냉각수
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}
@@ -377,7 +368,6 @@ text.item.hardness=[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.deepwater.name=깊은물
block.water.name= block.water.name=
block.lava.name=용암 block.lava.name=용암
@@ -485,10 +475,8 @@ block.liquid-junction.name=액체 교차기
block.bridge-conduit.name=다리 파이프 block.bridge-conduit.name=다리 파이프
block.rotary-pump.name=동력 펌프 block.rotary-pump.name=동력 펌프
block.nuclear-reactor.name=원자로 block.nuclear-reactor.name=원자로
text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
text.customgame=커스텀 게임 text.customgame=커스텀 게임
text.campaign=캠페인
text.sectors=구역 text.sectors=구역
text.sector=선택된 구역:[LIGHT_GRAY]{0} text.sector=선택된 구역:[LIGHT_GRAY]{0}
text.sector.time=시간:[LIGHT_GRAY]{0} text.sector.time=시간:[LIGHT_GRAY]{0}
@@ -503,13 +491,10 @@ text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GR
text.sector.gameover=이 구역을 잃었습니다. 다시 배치하시겠습니까? text.sector.gameover=이 구역을 잃었습니다. 다시 배치하시겠습니까?
text.sector.retry=다시할꺼임 text.sector.retry=다시할꺼임
text.wave.lasted=[accent]{0}[] 까지 버티셨습니다. text.wave.lasted=[accent]{0}[] 까지 버티셨습니다.
setting.fpscap.name=최대 FPS setting.fpscap.name=최대 FPS
setting.fpscap.none=없음 setting.fpscap.none=없음
setting.fpscap.text={0} FPS setting.fpscap.text={0} FPS
block.command-center.name=명령 본부 block.command-center.name=명령 본부
text.mission=목표:[LIGHT_GRAY] {0} text.mission=목표:[LIGHT_GRAY] {0}
text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요. text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요.
text.mission.battle=적 본부를 파괴하세요. text.mission.battle=적 본부를 파괴하세요.
@@ -520,20 +505,16 @@ text.mission.complete.body=구역 {0},{1} 탐색 성공.
text.mission.resource=Obtain {0} x{1} text.mission.resource=Obtain {0} x{1}
text.unit.health=[LIGHT_GRAY]체력:{0} text.unit.health=[LIGHT_GRAY]체력:{0}
text.unit.speed=[LIGHT_GRAY]속도:{0} text.unit.speed=[LIGHT_GRAY]속도:{0}
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.mass-driver.name=물질 이동기 block.mass-driver.name=물질 이동기
block.blast-drill.name=고속 발열 드릴 block.blast-drill.name=고속 발열 드릴
unit.drone.name=드론 unit.drone.name=드론
unit.drone.description=초기형 드론 유닛입니다. 기본적으로 코어에서 1대를 스폰합니다. 자동으로 아이템을 수집/채광하며 블럭들을 수리합니다. unit.drone.description=초기형 드론 유닛입니다. 기본적으로 코어에서 1대를 스폰합니다. 자동으로 아이템을 수집/채광하며 블럭들을 수리합니다.
unit.fabricator.name=페버 unit.fabricator.name=페버
unit.fabricator.description=고급 드론 유닛입니다. 자동으로 아이템과 수집/채광/블록들을 수리하며, 일반 드론보다 더 빠르게 작업할 수 있습니다. unit.fabricator.description=고급 드론 유닛입니다. 자동으로 아이템과 수집/채광/블록들을 수리하며, 일반 드론보다 더 빠르게 작업할 수 있습니다.
unit.scout.name=스카웃
unit.scout.description=기본 지상 유닛입니다. 납을 탄약으로 사용합니다.
unit.titan.name=타이탄 unit.titan.name=타이탄
unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다. unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다.
unit.monsoon.name=문순 unit.monsoon.name=문순
@@ -542,9 +523,19 @@ unit.interceptor.name=인터셉터
unit.interceptor.description=빠르고, 공격하고 튀는 방식을 사용합니다. 납을 탄약으로 사용합니다. unit.interceptor.description=빠르고, 공격하고 튀는 방식을 사용합니다. 납을 탄약으로 사용합니다.
unit.dagger.name=디거 unit.dagger.name=디거
unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다. unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다.
mode.sandbox.warning=Note that blocks cannot be used in sandbox mode until they are unlocked in other modes.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. mode.sandbox.warning=Note that blocks cannot be used in sandbox mode until they are unlocked in other modes.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
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=지열 발전기
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
setting.difficulty.purge=purge
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer

View File

@@ -16,7 +16,6 @@ text.players.single={0} gracz online
text.server.mismatch=Błąd pakietu: możliwa niezgodność wersji klienta/serwera.\nUpewnij się, że Ty i host macie najnowszą wersję Mindustry! text.server.mismatch=Błąd pakietu: możliwa niezgodność wersji klienta/serwera.\nUpewnij się, że Ty i host macie najnowszą wersję Mindustry!
text.server.closing=[accent] Zamykanie serwera ... text.server.closing=[accent] Zamykanie serwera ...
text.server.kicked.kick=Zostałeś wyrzucony z serwera! text.server.kicked.kick=Zostałeś wyrzucony z serwera!
text.server.kicked.invalidPassword=Nieprawidłowe hasło!
text.server.kicked.clientOutdated=Nieaktualna gra! Zaktualizują ją! text.server.kicked.clientOutdated=Nieaktualna gra! Zaktualizują ją!
text.server.kicked.serverOutdated=Nieaktualna gra! Zaktualizują ją! text.server.kicked.serverOutdated=Nieaktualna gra! Zaktualizują ją!
text.hostserver=Stwórz Serwer text.hostserver=Stwórz Serwer
@@ -462,7 +461,6 @@ block.rotary-pump.name=Wirowa Pompa
block.nuclear-reactor.name=Reaktor Nuklearny block.nuclear-reactor.name=Reaktor Nuklearny
text.save.old=Ten zapis jest ze starej wersji i gra nie może go teraz wczytać.\n\n[LIGHT_GRAY]Wsparcie starych zapisów będzie w pełnej wersji 4.0. text.save.old=Ten zapis jest ze starej wersji i gra nie może go teraz wczytać.\n\n[LIGHT_GRAY]Wsparcie starych zapisów będzie w pełnej wersji 4.0.
text.customgame=Własna Gra text.customgame=Własna Gra
text.campaign=Kampania
text.sectors=Sektory text.sectors=Sektory
text.sector=Wybrany Sektor: [LIGHT_GRAY]{0} text.sector=Wybrany Sektor: [LIGHT_GRAY]{0}
text.sector.time=Czas: [LIGHT_GRAY]{0} text.sector.time=Czas: [LIGHT_GRAY]{0}
@@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -162,7 +162,6 @@ text.server.mismatch=Packet error: Versão do Cliente/Servidor Incompativel.\nTe
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.fastShoot=Voce esta atirando rapido demais.
text.server.kicked.invalidPassword=Senha Incorreta!
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.
@@ -463,7 +462,6 @@ block.rotary-pump.name=Bomba Rotatoria
block.nuclear-reactor.name=Reator Nuclear block.nuclear-reactor.name=Reator Nuclear
text.save.old=Este save é para uma versão antiga do jogo, E não pode ser usado.\n\n[LIGHT_GRAY]Salvar Versões antigas vai ser Implementado Na versão 4.0 completa text.save.old=Este save é para uma versão antiga do jogo, E não pode ser usado.\n\n[LIGHT_GRAY]Salvar Versões antigas vai ser Implementado Na versão 4.0 completa
text.customgame=Jogo Customizado text.customgame=Jogo Customizado
text.campaign=Campanha
text.sectors=Setores text.sectors=Setores
text.sector=Setor Selecionado: [LIGHT_GRAY]{0} text.sector=Setor Selecionado: [LIGHT_GRAY]{0}
text.sector.time=Tempo: [LIGHT_GRAY]{0} text.sector.time=Tempo: [LIGHT_GRAY]{0}
@@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -33,7 +33,6 @@ text.loadgame=Загрузить игру
text.joingame=Присоединиться text.joingame=Присоединиться
text.addplayers=Доб/удалить игроков text.addplayers=Доб/удалить игроков
text.customgame=Пользовательская игра text.customgame=Пользовательская игра
text.campaign=Кампания
text.sectors=Секторы text.sectors=Секторы
text.sector=Выбранный сектор: [LIGHT_GRAY]{0} text.sector=Выбранный сектор: [LIGHT_GRAY]{0}
text.sector.time=Время: [LIGHT_GRAY]{0} text.sector.time=Время: [LIGHT_GRAY]{0}
@@ -64,7 +63,9 @@ 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.fastShoot=Вы стреляете слишком быстро.
text.server.kicked.invalidPassword=Неверный пароль. text.server.kicked.serverClose=Сервер закрыт.
text.server.kicked.sectorComplete=Сектор завершён.
text.server.kicked.sectorComplete.text=Ваша миссия завершена.\nТеперь сервер продолжит работу в следующем секторе.
text.server.kicked.clientOutdated=Устаревший клиент! Обновите игру! text.server.kicked.clientOutdated=Устаревший клиент! Обновите игру!
text.server.kicked.serverOutdated=Устаревший сервер! Попросите хост обновить! text.server.kicked.serverOutdated=Устаревший сервер! Попросите хост обновить!
text.server.kicked.banned=Вы заблокированы на этом сервере. text.server.kicked.banned=Вы заблокированы на этом сервере.
@@ -337,6 +338,9 @@ setting.mutemusic.name=Заглушить музыку
setting.sfxvol.name=Громкость звуковых эффектов setting.sfxvol.name=Громкость звуковых эффектов
setting.mutesound.name=Заглушить звук setting.mutesound.name=Заглушить звук
text.keybind.title=Переназначить клавиши text.keybind.title=Переназначить клавиши
section.general.name=Oснoвнoe
section.view.name=Прoсмoтр
section.multiplayer.name=Мультиплеер
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=выбрать
@@ -535,3 +539,9 @@ unit.monsoon.name=Муссон
unit.monsoon.description=Тяжелый ковровый бомбардировщик. Использует взрывоопасное соединение или пиратит в качестве боеприпасов. unit.monsoon.description=Тяжелый ковровый бомбардировщик. Использует взрывоопасное соединение или пиратит в качестве боеприпасов.
unit.interceptor.name=Истребитель-перехватчик unit.interceptor.name=Истребитель-перехватчик
unit.interceptor.description=Быстрая и ударная боевая единица, которая использует набег с отскоком. unit.interceptor.description=Быстрая и ударная боевая единица, которая использует набег с отскоком.
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer

View File

@@ -26,7 +26,6 @@ text.players.single={0} Oyuncu Çevrimiçi
text.server.mismatch=Paket hatası: olası istemci / sunucu sürümü uyuşmazlığı. Siz ve ev sahibi Mindustry'nin en son sürümüne sahip olduğunuzdan emin olun! text.server.mismatch=Paket hatası: olası istemci / sunucu sürümü uyuşmazlığı. Siz ve ev sahibi Mindustry'nin en son sürümüne sahip olduğunuzdan emin olun!
text.server.closing=[accent] Sunucu kapatılıyor ... text.server.closing=[accent] Sunucu kapatılıyor ...
text.server.kicked.kick=Sunucudan kovuldun! text.server.kicked.kick=Sunucudan kovuldun!
text.server.kicked.invalidPassword=Geçersiz şifre!
text.server.kicked.clientOutdated=Oyun sürümünüz geçerli değil. Oyununu güncelleyin! text.server.kicked.clientOutdated=Oyun sürümünüz geçerli değil. Oyununu güncelleyin!
text.server.kicked.serverOutdated=Eski sunucu! Ev sahibinden güncellemesini isteyin! text.server.kicked.serverOutdated=Eski sunucu! Ev sahibinden güncellemesini isteyin!
text.server.kicked.banned=Bu sunucudan yasaklandınız. text.server.kicked.banned=Bu sunucudan yasaklandınız.
@@ -464,7 +463,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=Time: [LIGHT_GRAY]{0}
@@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -22,9 +22,9 @@ text.map.delete=Ви впевнені, що хочете видалити кар
text.level.select=Вибір рівня text.level.select=Вибір рівня
text.level.mode=Ігровий режим: text.level.mode=Ігровий режим:
text.construction.title=Block Construction Guide text.construction.title=Block Construction Guide
text.construction=\You've just selected [accent]block construction mode[].\n\n\To begin placing, simply tap a valid location near your ship.\n\Once you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\\n\- [accent]Remove blocks[] from your selection by tapping them.\n\- [accent]Shift the selection[] by holding and dragging any block in the selection.\n\- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n\- [accent]Cancel construction or selection[] by pressing the X at the bottom left. text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=\You've just selected [accent]block deconstruction mode[].\n\n\To begin breaking, simply tap a block near your ship.\n\Once you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\\n\- [accent]Remove blocks[] from your selection by tapping them.\n\- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n\- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left. text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Не показувати знову до наступного сеансу text.showagain=Не показувати знову до наступного сеансу
text.coreattack=< Ядро під атакою! > text.coreattack=< Ядро під атакою! >
text.unlocks=Разблоковане text.unlocks=Разблоковане
@@ -535,3 +535,7 @@ unit.monsoon.name=Мусон
unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси. unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси.
unit.interceptor.name=Винищувач-перехполювач unit.interceptor.name=Винищувач-перехполювач
unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком
text.settings.language=Language
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer

View File

@@ -32,7 +32,6 @@ text.loadgame=载入游戏
text.joingame=加入游戏 text.joingame=加入游戏
text.addplayers=增加/删除玩家 text.addplayers=增加/删除玩家
text.customgame=自定义游戏 text.customgame=自定义游戏
text.campaign=战役
text.sectors=区域 text.sectors=区域
text.sector=区域: [LIGHT_GRAY]{0} text.sector=区域: [LIGHT_GRAY]{0}
text.sector.time=时间: [LIGHT_GRAY]{0} text.sector.time=时间: [LIGHT_GRAY]{0}
@@ -59,7 +58,6 @@ text.server.mismatch=Packet error: 可能是客户端/服务器版本不匹配\n
text.server.closing=[accent]正在关闭服务器... text.server.closing=[accent]正在关闭服务器...
text.server.kicked.kick=你被踢出服务器了! text.server.kicked.kick=你被踢出服务器了!
text.server.kicked.fastShoot=你发射得太快了! text.server.kicked.fastShoot=你发射得太快了!
text.server.kicked.invalidPassword=无效的密码!
text.server.kicked.clientOutdated=客户端版本过旧!请升级! text.server.kicked.clientOutdated=客户端版本过旧!请升级!
text.server.kicked.serverOutdated=服务器版本过旧!请联系房主升级! text.server.kicked.serverOutdated=服务器版本过旧!请联系房主升级!
text.server.kicked.banned=你被这个服务器拉黑了。 text.server.kicked.banned=你被这个服务器拉黑了。
@@ -497,8 +495,6 @@ unit.drone.name=无人机
unit.drone.description=初始的无人机单位.自动在核心生成,自动采矿,收集物品,修复方块 unit.drone.description=初始的无人机单位.自动在核心生成,自动采矿,收集物品,修复方块
unit.fabricator.name=装配工 unit.fabricator.name=装配工
unit.fabricator.description=高级无人机单位,自动采矿,收集物品和修复方块.比普通无人机快很多. unit.fabricator.description=高级无人机单位,自动采矿,收集物品和修复方块.比普通无人机快很多.
unit.scout.name=侦察机
unit.scout.description=基础地面单位,使用钨作为弹药.
unit.titan.name=泰坦 unit.titan.name=泰坦
unit.titan.description=高级的有武装地面单位,使用电石作为弹药.攻击地面单位和空中单位. unit.titan.description=高级的有武装地面单位,使用电石作为弹药.攻击地面单位和空中单位.
unit.monsoon.name=狂风 unit.monsoon.name=狂风
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View File

@@ -27,7 +27,6 @@ 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.fastShoot=您射擊的太快了!
text.server.kicked.invalidPassword=密碼無效!
text.server.kicked.clientOutdated=客戶端版本過舊!請更新遊戲! text.server.kicked.clientOutdated=客戶端版本過舊!請更新遊戲!
text.server.kicked.serverOutdated=伺服器版本過舊!請聯絡伺服主更新伺服器! text.server.kicked.serverOutdated=伺服器版本過舊!請聯絡伺服主更新伺服器!
text.server.kicked.banned=您已經從這個伺服器被封禁。 text.server.kicked.banned=您已經從這個伺服器被封禁。
@@ -464,7 +463,6 @@ block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor block.nuclear-reactor.name=Nuclear Reactor
text.customgame=Custom Game text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=Time: [LIGHT_GRAY]{0}
@@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsoon
@@ -516,3 +512,30 @@ 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
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 140 KiB

View File

@@ -142,7 +142,6 @@ public class Recipes implements ContentList{
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)).setMode(GameMode.noWaves);
new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30)); new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));
new Recipe(units, UnitBlocks.resupplyPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));
new Recipe(units, UnitBlocks.commandCenter, new ItemStack(Items.lead, 100), new ItemStack(Items.carbide, 100), new ItemStack(Items.silicon, 200)).setMode(GameMode.noWaves); new Recipe(units, UnitBlocks.commandCenter, new ItemStack(Items.lead, 100), new ItemStack(Items.carbide, 100), new ItemStack(Items.silicon, 200)).setMode(GameMode.noWaves);
//LIQUIDS //LIQUIDS

View File

@@ -19,7 +19,7 @@ public class Weapons implements ContentList{
reload = 15f; reload = 15f;
roundrobin = true; roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall; ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletLead); ammo = AmmoTypes.bulletLead;
}}; }};
missiles = new Weapon("missiles"){{ missiles = new Weapon("missiles"){{
@@ -30,7 +30,7 @@ public class Weapons implements ContentList{
roundrobin = false; roundrobin = false;
roundrobin = true; roundrobin = true;
ejectEffect = Fx.none; ejectEffect = Fx.none;
setAmmo(AmmoTypes.weaponMissile); ammo = AmmoTypes.weaponMissile;
}}; }};
chainBlaster = new Weapon("chain-blaster"){{ chainBlaster = new Weapon("chain-blaster"){{
@@ -38,7 +38,7 @@ public class Weapons implements ContentList{
reload = 28f; reload = 28f;
roundrobin = true; roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall; ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletTungsten, AmmoTypes.bulletSilicon, AmmoTypes.bulletThorium); ammo = AmmoTypes.bulletLead;
}}; }};
shockgun = new Weapon("shockgun"){{ shockgun = new Weapon("shockgun"){{
@@ -50,7 +50,7 @@ public class Weapons implements ContentList{
recoil = 2f; recoil = 2f;
velocityRnd = 0.7f; velocityRnd = 0.7f;
ejectEffect = ShootFx.shellEjectSmall; ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.shotgunTungsten); ammo = AmmoTypes.shotgunTungsten;
}}; }};
flakgun = new Weapon("flakgun"){{ flakgun = new Weapon("flakgun"){{
@@ -62,7 +62,7 @@ public class Weapons implements ContentList{
recoil = 3f; recoil = 3f;
velocityRnd = 0.1f; velocityRnd = 0.1f;
ejectEffect = ShootFx.shellEjectMedium; ejectEffect = ShootFx.shellEjectMedium;
setAmmo(AmmoTypes.shellCarbide); ammo = AmmoTypes.shellCarbide;
}}; }};
flamethrower = new Weapon("flamethrower"){{ flamethrower = new Weapon("flamethrower"){{
@@ -71,7 +71,7 @@ public class Weapons implements ContentList{
roundrobin = true; roundrobin = true;
recoil = 1f; recoil = 1f;
ejectEffect = Fx.none; ejectEffect = Fx.none;
setAmmo(AmmoTypes.flamerThermite); ammo = AmmoTypes.flamerThermite;
}}; }};
sapper = new Weapon("sapper"){{ sapper = new Weapon("sapper"){{
@@ -79,7 +79,7 @@ public class Weapons implements ContentList{
reload = 12f; reload = 12f;
roundrobin = true; roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall; ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletCarbide); ammo = AmmoTypes.bulletCarbide;
}}; }};
swarmer = new Weapon("swarmer"){{ swarmer = new Weapon("swarmer"){{
@@ -87,7 +87,7 @@ public class Weapons implements ContentList{
reload = 10f; reload = 10f;
roundrobin = true; roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall; ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletPyratite); ammo = AmmoTypes.bulletPyratite;
}}; }};
bomber = new Weapon("bomber"){{ bomber = new Weapon("bomber"){{
@@ -98,7 +98,7 @@ public class Weapons implements ContentList{
ejectEffect = Fx.none; ejectEffect = Fx.none;
velocityRnd = 1f; velocityRnd = 1f;
inaccuracy = 40f; inaccuracy = 40f;
setAmmo(AmmoTypes.bombExplosive, AmmoTypes.bombIncendiary, AmmoTypes.bombOil); ammo = AmmoTypes.bombExplosive;
}}; }};
} }

View File

@@ -106,7 +106,7 @@ public class Blocks extends BlockList implements ContentList{
stone = new Floor("stone"){{ stone = new Floor("stone"){{
hasOres = true; hasOres = true;
drops = new ItemStack(Items.stone, 1); drops = new ItemStack(Items.stone, 1);
blends = block -> block != this && !(block instanceof Ore); blends = block -> block != this && !(block instanceof OreBlock);
minimapColor = Color.valueOf("323232"); minimapColor = Color.valueOf("323232");
playerUnmineable = true; playerUnmineable = true;
}}; }};

View File

@@ -8,7 +8,7 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.units.*; import io.anuke.mindustry.world.blocks.units.*;
public class UnitBlocks extends BlockList implements ContentList{ public class UnitBlocks extends BlockList implements ContentList{
public static Block resupplyPoint, repairPoint, dronePad, public static Block repairPoint, dronePad,
fabricatorPad, interceptorPad, monsoonPad, daggerPad, titanPad, fabricatorPad, interceptorPad, monsoonPad, daggerPad, titanPad,
dropPoint, reconstructor, overdriveProjector, shieldProjector, commandCenter; dropPoint, reconstructor, overdriveProjector, shieldProjector, commandCenter;
@@ -64,11 +64,6 @@ public class UnitBlocks extends BlockList implements ContentList{
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.thorium, 30)}); consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.thorium, 30)});
}}; }};
resupplyPoint = new ResupplyPoint("resupply-point"){{
shadow = "shadow-round-1";
itemCapacity = 30;
}};
dropPoint = new DropPoint("drop-point"){{ dropPoint = new DropPoint("drop-point"){{
shadow = "shadow-round-1"; shadow = "shadow-round-1";
itemCapacity = 40; itemCapacity = 40;

View File

@@ -473,6 +473,9 @@ public class NetServer extends Module{
} }
String fixName(String name){ String fixName(String name){
if(name.equals("[") || name.equals("]")){
return "";
}
for(int i = 0; i < name.length(); i++){ for(int i = 0; i < name.length(); i++){
if(name.charAt(i) == '[' && i != name.length() - 1 && name.charAt(i + 1) != '[' && (i == 0 || name.charAt(i - 1) != '[')){ if(name.charAt(i) == '[' && i != name.length() - 1 && name.charAt(i + 1) != '[' && (i == 0 || name.charAt(i - 1) != '[')){

View File

@@ -331,8 +331,8 @@ public class Renderer extends RendererModule{
Graphics.beginShaders(Shaders.outline); Graphics.beginShaders(Shaders.outline);
Graphics.shader(Shaders.mix, true); Graphics.shader(Shaders.mix, true);
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead()); drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
Graphics.shader(); Graphics.shader();
blocks.drawTeamBlocks(Layer.turret, team); blocks.drawTeamBlocks(Layer.turret, team);
Graphics.endShaders(); Graphics.endShaders();

View File

@@ -363,6 +363,10 @@ public class World extends Module{
return null; return null;
} }
public void raycastEachWorld(float x0, float y0, float x1, float y1, Raycaster cons){
raycastEach(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons);
}
public void raycastEach(int x0f, int y0f, int x1, int y1, Raycaster cons){ public void raycastEach(int x0f, int y0f, int x1, int y1, Raycaster cons){
int x0 = x0f; int x0 = x0f;
int y0 = y0f; int y0 = y0f;

View File

@@ -6,6 +6,7 @@ import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.bullets.TurretBullets; import io.anuke.mindustry.content.bullets.TurretBullets;
import io.anuke.mindustry.content.fx.ExplosionFx; import io.anuke.mindustry.content.fx.ExplosionFx;
import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
@@ -15,7 +16,6 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.impl.SolidEntity;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.function.Predicate; import io.anuke.ucore.function.Predicate;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
@@ -84,8 +84,17 @@ public class Damage{
* Damages entities in a line. * Damages entities in a line.
* Only enemies of the specified team are damaged. * Only enemies of the specified team are damaged.
*/ */
public static void collideLine(SolidEntity hitter, Team team, Effect effect, float x, float y, float angle, float length){ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length){
tr.trns(angle, length); tr.trns(angle, length);
world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> {
Tile tile = world.tile(cx, cy);
if(tile != null && tile.entity != null && tile.entity.collide(hitter)){
tile.entity.collision(hitter);
Effects.effect(effect, tile.worldx(), tile.worldy());
}
return false;
});
rect.setPosition(x, y).setSize(tr.x, tr.y); rect.setPosition(x, y).setSize(tr.x, tr.y);
float x2 = tr.x + x, y2 = tr.y + y; float x2 = tr.x + x, y2 = tr.y + y;

View File

@@ -129,11 +129,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
return mech.itemCapacity; return mech.itemCapacity;
} }
@Override
public int getAmmoCapacity(){
return mech.ammoCapacity;
}
@Override @Override
public void interpolate(){ public void interpolate(){
super.interpolate(); super.interpolate();
@@ -187,21 +182,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
return mech.armor; return mech.armor;
} }
@Override
public boolean acceptsAmmo(Item item){
return mech.weapon.getAmmoType(item) != null && inventory.canAcceptAmmo(mech.weapon.getAmmoType(item));
}
@Override @Override
public void added(){ public void added(){
baseRotation = 90f; baseRotation = 90f;
} }
@Override
public void addAmmo(Item item){
inventory.addAmmo(mech.weapon.getAmmoType(item));
}
@Override @Override
public float getMass(){ public float getMass(){
return mech.mass; return mech.mass;
@@ -273,6 +258,23 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
Draw.rect(mech.iconRegion, x , y, rotation - 90); Draw.rect(mech.iconRegion, x , y, rotation - 90);
} }
@Override
public void drawAll(){
boolean snap = snapCamera && isLocal;
float px = x, py = y;
if(snap){
x = (int) (x + 0.0001f);
y = (int) (y + 0.0001f);
}
super.drawAll();
x = px;
y = py;
}
@Override @Override
public void draw(){ public void draw(){
if((debug && (!showPlayer || !showUI)) || dead) return; if((debug && (!showPlayer || !showUI)) || dead) return;
@@ -284,15 +286,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
boostHeat = Mathf.lerpDelta(boostHeat, isBoosting && ((!movement.isZero() && moved) || !isLocal) ? 1f : 0f, 0.08f); boostHeat = Mathf.lerpDelta(boostHeat, isBoosting && ((!movement.isZero() && moved) || !isLocal) ? 1f : 0f, 0.08f);
boolean snap = snapCamera && isLocal;
float px = x, py = y;
if(snap){
x = (int) (x + 0.0001f);
y = (int) (y + 0.0001f);
}
float ft = Mathf.sin(walktime, 6f, 2f) * (1f - boostHeat); float ft = Mathf.sin(walktime, 6f, 2f) * (1f - boostHeat);
Floor floor = getFloorOn(); Floor floor = getFloorOn();
@@ -351,9 +344,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
Draw.alpha(1f); Draw.alpha(1f);
x = px;
y = py;
} }
@Override @Override
@@ -620,20 +610,20 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
y += Mathf.cos(Timers.time() + id * 999, 25f, 0.08f); y += Mathf.cos(Timers.time() + id * 999, 25f, 0.08f);
//update shooting if not building, not mining and there's ammo left //update shooting if not building, not mining and there's ammo left
if(!isBuilding() && inventory.hasAmmo() && getMineTile() == null){ if(!isBuilding() && getMineTile() == null){
//autofire: mobile only! //autofire: mobile only!
if(mobile){ if(mobile){
if(target == null){ if(target == null){
isShooting = false; isShooting = false;
target = Units.getClosestTarget(team, x, y, inventory.getAmmoRange()); target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
}else if(target.isValid()){ }else if(target.isValid()){
//rotate toward and shoot the target //rotate toward and shoot the target
rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f);
Vector2 intercept = Vector2 intercept =
Predict.intercept(x, y, target.getX(), target.getY(), target.getVelocity().x - velocity.x, target.getVelocity().y - velocity.y, inventory.getAmmo().bullet.speed); Predict.intercept(x, y, target.getX(), target.getY(), target.getVelocity().x - velocity.x, target.getVelocity().y - velocity.y, getWeapon().getAmmo().bullet.speed);
pointerX = intercept.x; pointerX = intercept.x;
pointerY = intercept.y; pointerY = intercept.y;
@@ -677,7 +667,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
public boolean isShooting(){ public boolean isShooting(){
return isShooting && inventory.hasAmmo() && (!isBoosting || mech.flying); return isShooting && (!isBoosting || mech.flying);
} }
public void updateRespawning(){ public void updateRespawning(){

View File

@@ -1,5 +1,6 @@
package io.anuke.mindustry.entities; package io.anuke.mindustry.entities;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
@@ -8,8 +9,8 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.net.Interpolator;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.type.Weapon;
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.ucore.core.Effects; import io.anuke.ucore.core.Effects;
@@ -33,17 +34,11 @@ import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
public abstract class Unit extends DestructibleEntity implements SaveTrait, TargetTrait, SyncTrait, DrawTrait, TeamTrait, CarriableTrait, InventoryTrait{ public abstract class Unit extends DestructibleEntity implements SaveTrait, TargetTrait, SyncTrait, DrawTrait, TeamTrait, CarriableTrait, InventoryTrait{
/** /**Total duration of hit flash effect*/
* total duration of hit flash effect
*/
public static final float hitDuration = 9f; public static final float hitDuration = 9f;
/** /**Percision divisor of velocity, used when writing. For example a value of '2' would mean the percision is 1/2 = 0.5-size chunks.*/
* Percision divisor of velocity, used when writing. For example a value of '2' would mean the percision is 1/2 = 0.5-size chunks.
*/
public static final float velocityPercision = 8f; public static final float velocityPercision = 8f;
/** /**Maximum absolute value of a velocity vector component.*/
* Maximum absolute value of a velocity vector component.
*/
public static final float maxAbsVelocity = 127f / velocityPercision; public static final float maxAbsVelocity = 127f / velocityPercision;
private static final Vector2 moveVector = new Vector2(); private static final Vector2 moveVector = new Vector2();
@@ -300,16 +295,30 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
} }
} }
public float getAmmoFraction(){
return inventory.totalAmmo() / (float) inventory.ammoCapacity();
}
public void drawUnder(){ public void drawUnder(){
} }
public void drawOver(){ public void drawOver(){
} }
public void drawStats(){
Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf()*5f, 1f - healthf()));
Draw.alpha(hitTime);
Draw.rect(getPowerCellRegion(), x, y, rotation - 90);
Draw.color();
}
public TextureRegion getPowerCellRegion(){
return Draw.region("power-cell");
}
public void drawAll(){
if(!isDead()){
draw();
drawStats();
}
}
public void drawShadow(){ public void drawShadow(){
Draw.rect(getIconRegion(), x , y, rotation - 90); Draw.rect(getIconRegion(), x , y, rotation - 90);
} }
@@ -318,26 +327,18 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
Fill.circle(x, y, getViewDistance()); Fill.circle(x, y, getViewDistance());
} }
public boolean isInfiniteAmmo(){
return false;
}
public float getViewDistance(){ public float getViewDistance(){
return 135f; return 135f;
} }
public abstract TextureRegion getIconRegion(); public abstract TextureRegion getIconRegion();
public abstract Weapon getWeapon();
public abstract int getItemCapacity(); public abstract int getItemCapacity();
public abstract int getAmmoCapacity();
public abstract float getArmor(); public abstract float getArmor();
public abstract boolean acceptsAmmo(Item item);
public abstract void addAmmo(Item item);
public abstract float getMass(); public abstract float getMass();
public abstract boolean isFlying(); public abstract boolean isFlying();

View File

@@ -1,10 +1,7 @@
package io.anuke.mindustry.entities; package io.anuke.mindustry.entities;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.traits.Saveable; import io.anuke.mindustry.entities.traits.Saveable;
import io.anuke.mindustry.type.AmmoEntry;
import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
@@ -14,8 +11,6 @@ import java.io.IOException;
public class UnitInventory implements Saveable{ public class UnitInventory implements Saveable{
private final Unit unit; private final Unit unit;
private Array<AmmoEntry> ammos = new Array<>();
private int totalAmmo;
private ItemStack item = new ItemStack(Items.stone, 0); private ItemStack item = new ItemStack(Items.stone, 0);
public UnitInventory(Unit unit){ public UnitInventory(Unit unit){
@@ -30,90 +25,19 @@ public class UnitInventory implements Saveable{
public void writeSave(DataOutput stream) throws IOException{ public void writeSave(DataOutput stream) throws IOException{
stream.writeShort(item.amount); stream.writeShort(item.amount);
stream.writeByte(item.item.id); stream.writeByte(item.item.id);
stream.writeShort(totalAmmo);
stream.writeByte(ammos.size);
for(int i = 0; i < ammos.size; i++){
stream.writeByte(ammos.get(i).type.id);
stream.writeShort(ammos.get(i).amount);
}
} }
@Override @Override
public void readSave(DataInput stream) throws IOException{ public void readSave(DataInput stream) throws IOException{
short iamount = stream.readShort(); short iamount = stream.readShort();
byte iid = stream.readByte(); byte iid = stream.readByte();
this.totalAmmo = stream.readShort();
byte ammoa = stream.readByte();
for(int i = 0; i < ammoa; i++){
byte aid = stream.readByte();
int am = stream.readShort();
ammos.add(new AmmoEntry(AmmoType.getByID(aid), am));
}
item.item = Item.getByID(iid); item.item = Item.getByID(iid);
item.amount = iamount; item.amount = iamount;
} }
/** public void clear(){
* Returns ammo range, or MAX_VALUE if this inventory has no ammo. item.amount = 0;
*/
public float getAmmoRange(){
return hasAmmo() ? getAmmo().getRange() : Float.MAX_VALUE;
}
public AmmoType getAmmo(){
return ammos.size == 0 ? null : ammos.peek().type;
}
public boolean hasAmmo(){
return totalAmmo > 0;
}
public void useAmmo(){
if(unit.isInfiniteAmmo()) return;
AmmoEntry entry = ammos.peek();
entry.amount--;
if(entry.amount == 0) ammos.pop();
totalAmmo--;
}
public int totalAmmo(){
return totalAmmo;
}
public int ammoCapacity(){
return unit.getAmmoCapacity();
}
public boolean canAcceptAmmo(AmmoType type){
return totalAmmo + type.quantityMultiplier <= unit.getAmmoCapacity();
}
public void addAmmo(AmmoType type){
if(type == null) return;
totalAmmo += type.quantityMultiplier;
//find ammo entry by type
for(int i = ammos.size - 1; i >= 0; i--){
AmmoEntry entry = ammos.get(i);
//if found, put it to the right
if(entry.type == type){
entry.amount += type.quantityMultiplier;
ammos.swap(i, ammos.size - 1);
return;
}
}
//must not be found
AmmoEntry entry = new AmmoEntry(type, (int) type.quantityMultiplier);
ammos.add(entry);
}
public void fillAmmo(AmmoType type){
totalAmmo = ammoCapacity();
ammos.clear();
ammos.add(new AmmoEntry(type, ammoCapacity()));
} }
public int capacity(){ public int capacity(){
@@ -140,12 +64,6 @@ public class UnitInventory implements Saveable{
return (!hasItem() && amount <= unit.getItemCapacity()) || (item.item == type && item.amount + amount <= unit.getItemCapacity()); return (!hasItem() && amount <= unit.getItemCapacity()) || (item.item == type && item.amount + amount <= unit.getItemCapacity());
} }
public void clear(){
item.amount = 0;
ammos.clear();
totalAmmo = 0;
}
public void clearItem(){ public void clearItem(){
item.amount = 0; item.amount = 0;
} }

View File

@@ -51,7 +51,7 @@ public class Units{
* See {@link #invalidateTarget(TargetTrait, Team, float, float, float)} * See {@link #invalidateTarget(TargetTrait, Team, float, float, float)}
*/ */
public static boolean invalidateTarget(TargetTrait target, Unit targeter){ public static boolean invalidateTarget(TargetTrait target, Unit targeter){
return invalidateTarget(target, targeter.team, targeter.x, targeter.y, targeter.inventory.getAmmoRange()); return invalidateTarget(target, targeter.team, targeter.x, targeter.y, targeter.getWeapon().getAmmo().getRange());
} }
/** /**

View File

@@ -13,41 +13,23 @@ public abstract class BulletType extends BaseBulletType<Bullet> implements Conte
private static Array<BulletType> types = new Array<>(); private static Array<BulletType> types = new Array<>();
public final int id; public final int id;
/** /**Knockback in velocity.*/
* Knockback in velocity.
*/
public float knockback; public float knockback;
/** /**Whether this bullet hits tiles.*/
* Whether this bullet hits tiles.
*/
public boolean hitTiles = true; public boolean hitTiles = true;
/** /**Status effect applied on hit.*/
* Status effect applied on hit.
*/
public StatusEffect status = StatusEffects.none; public StatusEffect status = StatusEffects.none;
/** /**Intensity of applied status effect in terms of duration.*/
* Intensity of applied status effect in terms of duration.
*/
public float statusIntensity = 0.5f; public float statusIntensity = 0.5f;
/** /**What fraction of armor is pierced, 0-1*/
* What fraction of armor is pierced, 0-1
*/
public float armorPierce = 0f; public float armorPierce = 0f;
/** /**Whether to sync this bullet to clients.*/
* Whether to sync this bullet to clients.
*/
public boolean syncable; public boolean syncable;
/** /**Whether this bullet type collides with tiles.*/
* Whether this bullet type collides with tiles.
*/
public boolean collidesTiles = true; public boolean collidesTiles = true;
/** /**Whether this bullet types collides with anything at all.*/
* Whether this bullet types collides with anything at all.
*/
public boolean collides = true; public boolean collides = true;
/** /**Whether velocity is inherited from the shooter.*/
* Whether velocity is inherited from the shooter.
*/
public boolean keepVelocity = true; public boolean keepVelocity = true;
public BulletType(float speed, float damage){ public BulletType(float speed, float damage){

View File

@@ -34,14 +34,6 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
public ItemTransfer(){ public ItemTransfer(){
} }
@Remote(called = Loc.server, unreliable = true)
public static void transferAmmo(Item item, float x, float y, Unit to){
if(to == null) return;
to.addAmmo(item);
create(item, x, y, to, () -> {
});
}
@Remote(called = Loc.server, unreliable = true) @Remote(called = Loc.server, unreliable = true)
public static void transferItemEffect(Item item, float x, float y, Unit to){ public static void transferItemEffect(Item item, float x, float y, Unit to){
if(to == null) return; if(to == null) return;

View File

@@ -19,7 +19,6 @@ import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; 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.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -185,7 +184,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
} }
public void targetClosest(){ public void targetClosest(){
target = Units.getClosestTarget(team, x, y, inventory.getAmmoRange()); target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
} }
public TileEntity getClosestEnemyCore(){ public TileEntity getClosestEnemyCore(){
@@ -253,16 +252,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
return type.itemCapacity; return type.itemCapacity;
} }
@Override
public int getAmmoCapacity(){
return type.ammoCapacity;
}
@Override
public boolean isInfiniteAmmo(){
return isWave;
}
@Override @Override
public void interpolate(){ public void interpolate(){
super.interpolate(); super.interpolate();
@@ -282,16 +271,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
return type.armor; return type.armor;
} }
@Override
public boolean acceptsAmmo(Item item){
return getWeapon().getAmmoType(item) != null && inventory.canAcceptAmmo(getWeapon().getAmmoType(item));
}
@Override
public void addAmmo(Item item){
inventory.addAmmo(getWeapon().getAmmoType(item));
}
@Override @Override
public float getSize(){ public float getSize(){
return 8; return 8;

View File

@@ -28,22 +28,6 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
protected CarriableTrait carrying; protected CarriableTrait carrying;
protected final UnitState protected final UnitState
resupply = new UnitState(){
public void entered(){
target = null;
}
public void update(){
if(inventory.totalAmmo() + 10 >= inventory.ammoCapacity()){
state.set(attack);
}else if(!targetHasFlag(BlockFlag.resupplyPoint)){
retarget(() -> targetClosestAllyFlag(BlockFlag.resupplyPoint));
}else{
circle(20f);
}
}
},
idle = new UnitState(){ idle = new UnitState(){
public void update(){ public void update(){
if(!isCommanded()){ if(!isCommanded()){
@@ -75,9 +59,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
target = null; target = null;
} }
if(!inventory.hasAmmo()){ if(target == null){
state.set(resupply);
}else if(target == null){
retarget(() -> { retarget(() -> {
targetClosest(); targetClosest();
if(target == null) targetClosestEnemyFlag(BlockFlag.target); if(target == null) targetClosestEnemyFlag(BlockFlag.target);
@@ -91,10 +73,9 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
}else{ }else{
attack(150f); attack(150f);
if((Mathf.angNear(angleTo(target), rotation, 15f) || !inventory.getAmmo().bullet.keepVelocity) //bombers don't care about rotation if((Mathf.angNear(angleTo(target), rotation, 15f) || !getWeapon().getAmmo().bullet.keepVelocity) //bombers don't care about rotation
&& distanceTo(target) < inventory.getAmmo().getRange()){ && distanceTo(target) < getWeapon().getAmmo().getRange()){
AmmoType ammo = inventory.getAmmo(); AmmoType ammo = getWeapon().getAmmo();
inventory.useAmmo();
Vector2 to = Predict.intercept(FlyingUnit.this, target, ammo.bullet.speed); Vector2 to = Predict.intercept(FlyingUnit.this, target, ammo.bullet.speed);

View File

@@ -12,11 +12,9 @@ import io.anuke.mindustry.type.Upgrade;
import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.type.Weapon;
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.meta.BlockFlag;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Translator; import io.anuke.ucore.util.Translator;
@@ -35,24 +33,6 @@ public abstract class GroundUnit extends BaseUnit{
public final UnitState public final UnitState
resupply = new UnitState(){
public void entered(){
target = null;
}
public void update(){
Tile tile = Geometry.findClosest(x, y, world.indexer().getAllied(team, BlockFlag.resupplyPoint));
if(tile != null && distanceTo(tile) > 40){
moveAwayFromCore();
}
//TODO move toward resupply point
if(isWave || inventory.totalAmmo() + 10 >= inventory.ammoCapacity()){
state.set(attack);
}
}
},
attack = new UnitState(){ attack = new UnitState(){
public void entered(){ public void entered(){
target = null; target = null;
@@ -62,17 +42,15 @@ public abstract class GroundUnit extends BaseUnit{
TileEntity core = getClosestEnemyCore(); TileEntity core = getClosestEnemyCore();
float dst = core == null ? 0 : distanceTo(core); float dst = core == null ? 0 : distanceTo(core);
if(core != null && inventory.hasAmmo() && dst < inventory.getAmmo().getRange() / 1.1f){ if(core != null && dst < getWeapon().getAmmo().getRange() / 1.1f){
target = core; target = core;
}else{ }else{
retarget(() -> targetClosest()); retarget(() -> targetClosest());
} }
if(!inventory.hasAmmo()){ if(target != null){
state.set(resupply);
}else if(target != null){
if(core != null){ if(core != null){
if(dst > inventory.getAmmo().getRange() * 0.5f){ if(dst > getWeapon().getAmmo().getRange() * 0.5f){
moveToCore(); moveToCore();
} }
@@ -80,11 +58,11 @@ public abstract class GroundUnit extends BaseUnit{
moveToCore(); moveToCore();
} }
if(distanceTo(target) < inventory.getAmmo().getRange()){ if(distanceTo(target) < getWeapon().getAmmo().getRange()){
rotate(angleTo(target)); rotate(angleTo(target));
if(Mathf.angNear(angleTo(target), rotation, 13f)){ if(Mathf.angNear(angleTo(target), rotation, 13f)){
AmmoType ammo = inventory.getAmmo(); AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed); Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed);
@@ -143,14 +121,14 @@ public abstract class GroundUnit extends BaseUnit{
@Override @Override
public UnitState getStartState(){ public UnitState getStartState(){
return resupply; return attack;
} }
@Override @Override
public void update(){ public void update(){
super.update(); super.update();
if(!velocity.isZero(0.0001f) && (target == null || !inventory.hasAmmo() || (inventory.hasAmmo() && distanceTo(target) > inventory.getAmmoRange()))){ if(!velocity.isZero(0.0001f) && (target == null || (distanceTo(target) > getWeapon().getAmmo().getRange()))){
rotation = Mathf.slerpDelta(rotation, velocity.angle(), 0.2f); rotation = Mathf.slerpDelta(rotation, velocity.angle(), 0.2f);
} }
} }

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.entities.units;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.effect.ItemDrop; import io.anuke.mindustry.entities.effect.ItemDrop;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
@@ -11,7 +12,7 @@ public class UnitDrops{
private static Item[] dropTable; private static Item[] dropTable;
public static void dropItems(BaseUnit unit){ public static void dropItems(BaseUnit unit){
if(Vars.itemGroup.size() > maxItems){ if(Vars.itemGroup.size() > maxItems || unit.getTeam() != Team.red){
return; return;
} }

View File

@@ -395,11 +395,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{
return isBuilding() ? placeDistance * 2f : 30f; return isBuilding() ? placeDistance * 2f : 30f;
} }
@Override
public float getAmmoFraction(){
return inventory.getItem().amount / (float) type.itemCapacity;
}
protected void findItem(){ protected void findItem(){
TileEntity entity = getClosestCore(); TileEntity entity = getClosestCore();
if(entity == null){ if(entity == null){

View File

@@ -3,7 +3,6 @@ package io.anuke.mindustry.game;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.GroundUnit; import io.anuke.mindustry.entities.units.GroundUnit;
import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.type.Weapon;
@@ -62,10 +61,6 @@ public class SpawnGroup{
* Items this unit spawns with. Null to disable. * Items this unit spawns with. Null to disable.
*/ */
protected ItemStack items; protected ItemStack items;
/**
* Ammo type this unit spawns with. Null to use the first available ammo.
*/
protected Item ammoItem;
public SpawnGroup(UnitType type){ public SpawnGroup(UnitType type){
this.type = type; this.type = type;
@@ -114,12 +109,6 @@ public class SpawnGroup{
unit.inventory.addItem(items.item, items.amount); unit.inventory.addItem(items.item, items.amount);
} }
if(ammoItem != null){
unit.inventory.addAmmo(unit.getWeapon().getAmmoType(ammoItem));
}else{
unit.inventory.addAmmo(unit.getWeapon().getAmmoType(unit.getWeapon().getAcceptedItems().iterator().next()));
}
return unit; return unit;
} }
} }

View File

@@ -41,7 +41,6 @@ public class Waves{
unitScaling = 2; unitScaling = 2;
unitAmount = 1; unitAmount = 1;
spacing = 2; spacing = 2;
ammoItem = Items.tungsten;
end = 30; end = 30;
}}, }},
@@ -86,7 +85,6 @@ public class Waves{
groupAmount = 2; groupAmount = 2;
unitScaling = 3; unitScaling = 3;
effect = StatusEffects.overdrive; effect = StatusEffects.overdrive;
ammoItem = Items.silicon;
}}, }},
new SpawnGroup(UnitTypes.dagger){{ new SpawnGroup(UnitTypes.dagger){{
@@ -95,7 +93,6 @@ public class Waves{
unitAmount = 1; unitAmount = 1;
unitScaling = 3; unitScaling = 3;
effect = StatusEffects.shielded; effect = StatusEffects.shielded;
ammoItem = Items.thorium;
max = 10; max = 10;
}}, }},
@@ -121,7 +118,6 @@ public class Waves{
new SpawnGroup(UnitTypes.monsoon){{ new SpawnGroup(UnitTypes.monsoon){{
begin = 40; begin = 40;
ammoItem = Items.blastCompound;
unitAmount = 2; unitAmount = 2;
spacing = 2; spacing = 2;
unitScaling = 3; unitScaling = 3;
@@ -140,7 +136,6 @@ public class Waves{
new SpawnGroup(UnitTypes.monsoon){{ new SpawnGroup(UnitTypes.monsoon){{
begin = 53; begin = 53;
ammoItem = Items.pyratite;
unitAmount = 2; unitAmount = 2;
unitScaling = 3; unitScaling = 3;
spacing = 4; spacing = 4;
@@ -150,7 +145,6 @@ public class Waves{
new SpawnGroup(UnitTypes.monsoon){{ new SpawnGroup(UnitTypes.monsoon){{
begin = 53; begin = 53;
ammoItem = Items.coal;
unitAmount = 2; unitAmount = 2;
unitScaling = 3; unitScaling = 3;
spacing = 4; spacing = 4;
@@ -176,10 +170,6 @@ public class Waves{
System.out.print(":" + spawn.weapon.name); System.out.print(":" + spawn.weapon.name);
} }
if(spawn.ammoItem != null){
System.out.print(":" + spawn.ammoItem.name);
}
System.out.print(" "); System.out.print(" ");
} }
} }

View File

@@ -7,14 +7,12 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.input.InputHandler;
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.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers; 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;
@@ -176,32 +174,7 @@ public class OverlayRenderer{
Draw.color(); Draw.color();
} }
} }
} }
if((!debug || showUI) && Settings.getBool("healthbars")){
for(TeamData ally : (debug ? state.teams.getTeams() : state.teams.getTeams(true))){
renderer.drawAndInterpolate(unitGroups[ally.team.ordinal()], u -> !u.isDead(), this::drawStats);
}
renderer.drawAndInterpolate(playerGroup, u -> !u.isDead(), this::drawStats);
}
}
void drawStats(Unit unit){
if(unit.isDead()) return;
float x = unit.x;
float y = unit.y;
if(unit == players[0] && players.length == 1 && snapCamera){
x = (int) (x + 0.0001f);
y = (int) (y + 0.0001f);
}
drawEncloser(x, y - 9f, 2f);
drawBar(Palette.healthstats, x, y - 8f, unit.healthf());
drawBar(Palette.ammo, x, y - 9f, unit.getAmmoFraction());
} }
void drawBar(Color color, float x, float y, float finion){ void drawBar(Color color, float x, float y, float finion){

View File

@@ -3,70 +3,72 @@ package io.anuke.mindustry.graphics;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
public class Palette{ public class Palette{
public static final Color command = Color.valueOf("eab678"); public static final Color
public static final Color bulletYellow = Color.valueOf("ffeec9"); command = Color.valueOf("eab678"),
public static final Color bulletYellowBack = Color.valueOf("f9c87a");
public static final Color missileYellow = Color.valueOf("ffd2ae"); bulletYellow = Color.valueOf("ffeec9"),
public static final Color missileYellowBack = Color.valueOf("e58956"); bulletYellowBack = Color.valueOf("f9c87a"),
public static final Color plastaniumBack = Color.valueOf("d8d97f"); missileYellow = Color.valueOf("ffd2ae"),
public static final Color plastaniumFront = Color.valueOf("fffac6"); missileYellowBack = Color.valueOf("e58956"),
public static final Color lightFlame = Color.valueOf("ffdd55"); plastaniumBack = Color.valueOf("d8d97f"),
public static final Color darkFlame = Color.valueOf("db401c"); plastaniumFront = Color.valueOf("fffac6"),
public static final Color turretHeat = Color.valueOf("ab3400"); lightFlame = Color.valueOf("ffdd55"),
darkFlame = Color.valueOf("db401c"),
public static final Color lightOrange = Color.valueOf("f68021"); turretHeat = Color.valueOf("ab3400"),
public static final Color lightishOrange = Color.valueOf("f8ad42");
public static final Color lighterOrange = Color.valueOf("f6e096");
public static final Color lightishGray = Color.valueOf("a2a2a2"); lightOrange = Color.valueOf("f68021"),
public static final Color darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f); lightishOrange = Color.valueOf("f8ad42"),
lighterOrange = Color.valueOf("f6e096"),
public static final Color lancerLaser = Color.valueOf("a9d8ff"); lightishGray = Color.valueOf("a2a2a2"),
darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f),
public static final Color stoneGray = Color.valueOf("8f8f8f"); lancerLaser = Color.valueOf("a9d8ff"),
public static final Color portalLight = Color.valueOf("9054ea"); stoneGray = Color.valueOf("8f8f8f"),
public static final Color portal = Color.valueOf("6344d7");
public static final Color portalDark = Color.valueOf("3f3dac");
public static final Color powerLaserFrom = Color.valueOf("e3e3e3"); portalLight = Color.valueOf("9054ea"),
public static final Color powerLaserTo = Color.valueOf("ffe7a8"); portal = Color.valueOf("6344d7"),
portalDark = Color.valueOf("3f3dac"),
public static final Color description = Color.WHITE; powerLaserFrom = Color.valueOf("e3e3e3"),
public static final Color turretinfo = Color.ORANGE; powerLaserTo = Color.valueOf("ffe7a8"),
public static final Color iteminfo = Color.LIGHT_GRAY;
public static final Color powerinfo = Color.YELLOW;
public static final Color liquidinfo = Color.ROYAL;
public static final Color craftinfo = Color.LIGHT_GRAY;
public static final Color missingitems = Color.SCARLET; description = Color.WHITE,
public static final Color health = Color.YELLOW; turretinfo = Color.ORANGE,
public static final Color ammo = Color.valueOf("32cf6d"); iteminfo = Color.LIGHT_GRAY,
public static final Color healthstats = Color.SCARLET; powerinfo = Color.YELLOW,
public static final Color bar = Color.SLATE; liquidinfo = Color.ROYAL,
public static final Color interact = Color.ORANGE; craftinfo = Color.LIGHT_GRAY,
public static final Color accent = Color.valueOf("f4ba6e");
public static final Color place = Color.valueOf("6335f8");
public static final Color remove = Color.valueOf("e55454");
public static final Color placeRotate = accent;
public static final Color breakInvalid = Color.valueOf("d44b3d");
public static final Color range = Color.valueOf("f4ba6e");
public static final Color power = Color.valueOf("fbd367");
public static final Color placing = Color.valueOf("616161");
public static final Color lightTrail = Color.valueOf("ffe2a9"); missingitems = Color.SCARLET,
health = Color.YELLOW,
ammo = Color.valueOf("32cf6d"),
healthstats = Color.SCARLET,
bar = Color.SLATE,
interact = Color.ORANGE,
accent = Color.valueOf("f4ba6e"),
place = Color.valueOf("6335f8"),
remove = Color.valueOf("e55454"),
placeRotate = accent,
breakInvalid = Color.valueOf("d44b3d"),
range = Color.valueOf("f4ba6e"),
power = Color.valueOf("fbd367"),
placing = Color.valueOf("616161"),
public static final Color redSpark = Color.valueOf("fbb97f"); lightTrail = Color.valueOf("ffe2a9"),
public static final Color orangeSpark = Color.valueOf("d2b29c");
public static final Color redDust = Color.valueOf("ffa480"); redSpark = Color.valueOf("fbb97f"),
public static final Color redderDust = Color.valueOf("ff7b69"); orangeSpark = Color.valueOf("d2b29c"),
public static final Color plasticSmoke = Color.valueOf("f1e479"); redDust = Color.valueOf("ffa480"),
public static final Color plasticBurn = Color.valueOf("e9ead3"); redderDust = Color.valueOf("ff7b69"),
plasticSmoke = Color.valueOf("f1e479"),
plasticBurn = Color.valueOf("e9ead3");
} }

View File

@@ -16,7 +16,7 @@ public class DefaultKeybinds{
for(String section : sections){ for(String section : sections){
KeyBinds.defaultSection(section, DeviceType.keyboard, KeyBinds.defaultSection(section, DeviceType.keyboard,
new Category("General"), new Category("general"),
"move_x", new Axis(Input.A, Input.D), "move_x", new Axis(Input.A, Input.D),
"move_y", new Axis(Input.S, Input.W), "move_y", new Axis(Input.S, Input.W),
//"select", Input.MOUSE_LEFT, //"select", Input.MOUSE_LEFT,
@@ -25,14 +25,14 @@ public class DefaultKeybinds{
"rotate", new Axis(Input.SCROLL), "rotate", new Axis(Input.SCROLL),
"dash", Input.SHIFT_LEFT, "dash", Input.SHIFT_LEFT,
"drop_unit", Input.SHIFT_LEFT, "drop_unit", Input.SHIFT_LEFT,
new Category("View"), new Category("view"),
"zoom_hold", Input.CONTROL_LEFT, "zoom_hold", Input.CONTROL_LEFT,
"zoom", new Axis(Input.SCROLL), "zoom", new Axis(Input.SCROLL),
"zoom_minimap", new Axis(Input.MINUS, Input.PLUS), "zoom_minimap", new Axis(Input.MINUS, Input.PLUS),
"menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE, "menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE,
"pause", Input.SPACE, "pause", Input.SPACE,
"toggle_menus", Input.C, "toggle_menus", Input.C,
new Category("Multiplayer"), new Category("multiplayer"),
"player_list", Input.TAB, "player_list", Input.TAB,
"chat", Input.ENTER, "chat", Input.ENTER,
"chat_history_prev", Input.UP, "chat_history_prev", Input.UP,
@@ -42,7 +42,7 @@ public class DefaultKeybinds{
); );
KeyBinds.defaultSection(section, DeviceType.controller, KeyBinds.defaultSection(section, DeviceType.controller,
new Category("General"), new Category("general"),
"move_x", new Axis(Input.CONTROLLER_L_STICK_HORIZONTAL_AXIS), "move_x", new Axis(Input.CONTROLLER_L_STICK_HORIZONTAL_AXIS),
"move_y", new Axis(Input.CONTROLLER_L_STICK_VERTICAL_AXIS), "move_y", new Axis(Input.CONTROLLER_L_STICK_VERTICAL_AXIS),
"cursor_x", new Axis(Input.CONTROLLER_R_STICK_HORIZONTAL_AXIS), "cursor_x", new Axis(Input.CONTROLLER_R_STICK_HORIZONTAL_AXIS),
@@ -53,12 +53,12 @@ public class DefaultKeybinds{
"dash", Input.CONTROLLER_Y, "dash", Input.CONTROLLER_Y,
"rotate_alt", new Axis(Input.CONTROLLER_DPAD_RIGHT, Input.CONTROLLER_DPAD_LEFT), "rotate_alt", new Axis(Input.CONTROLLER_DPAD_RIGHT, Input.CONTROLLER_DPAD_LEFT),
"rotate", new Axis(Input.CONTROLLER_A, Input.CONTROLLER_B), "rotate", new Axis(Input.CONTROLLER_A, Input.CONTROLLER_B),
new Category("View"), new Category("view"),
"zoom_hold", Input.ANY_KEY, "zoom_hold", Input.ANY_KEY,
"zoom", new Axis(Input.CONTROLLER_DPAD_DOWN, Input.CONTROLLER_DPAD_UP), "zoom", new Axis(Input.CONTROLLER_DPAD_DOWN, Input.CONTROLLER_DPAD_UP),
"menu", Input.CONTROLLER_X, "menu", Input.CONTROLLER_X,
"pause", Input.CONTROLLER_L_TRIGGER, "pause", Input.CONTROLLER_L_TRIGGER,
new Category("Multiplayer"), new Category("multiplayer"),
"player_list", Input.CONTROLLER_START "player_list", Input.CONTROLLER_START
); );

View File

@@ -76,7 +76,9 @@ public class Save16 extends SaveFileVersion{
short width = stream.readShort(); short width = stream.readShort();
short height = stream.readShort(); short height = stream.readShort();
if(map == null){ if(world.getSector() != null){
world.setMap(new Map("Sector " + world.getSector().x + ", " + world.getSector().y, width, height));
}else if(map == null){
world.setMap(new Map("unknown", width, height)); world.setMap(new Map("unknown", width, height));
} }

View File

@@ -15,7 +15,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.defense.turrets.ItemTurret; import io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret;
import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret; import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret;
import io.anuke.mindustry.world.blocks.units.ResupplyPoint;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -186,7 +185,6 @@ public class FortressGenerator{
} }
Block fixBlock(Block result){ Block fixBlock(Block result){
if(result == UnitBlocks.resupplyPoint) result = DefenseBlocks.tungstenWall;
if(result == UnitBlocks.dronePad) result = DefenseBlocks.tungstenWallLarge; if(result == UnitBlocks.dronePad) result = DefenseBlocks.tungstenWallLarge;
if(result == UnitBlocks.fabricatorPad) result = DefenseBlocks.tungstenWallLarge; if(result == UnitBlocks.fabricatorPad) result = DefenseBlocks.tungstenWallLarge;
return result; return result;
@@ -201,8 +199,6 @@ public class FortressGenerator{
ItemTurret turret = (ItemTurret)block; ItemTurret turret = (ItemTurret)block;
AmmoType[] type = turret.getAmmoTypes(); AmmoType[] type = turret.getAmmoTypes();
block.handleStack(type[0].item, block.acceptStack(type[0].item, 1000, tile, null), tile, null); block.handleStack(type[0].item, block.acceptStack(type[0].item, 1000, tile, null), tile, null);
}else if(block instanceof ResupplyPoint){
tile.entity.items.add(Items.lead, tile.block().itemCapacity);
} }
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.type; package io.anuke.mindustry.type;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.OrderedMap;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
@@ -19,64 +18,37 @@ import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Translator; import io.anuke.ucore.util.Translator;
public class Weapon extends Upgrade{ public class Weapon extends Upgrade{
/** /**minimum cursor distance from player, fixes 'cross-eyed' shooting.*/
* minimum cursor distance from player, fixes 'cross-eyed' shooting.
*/
protected static float minPlayerDist = 20f; protected static float minPlayerDist = 20f;
public TextureRegion equipRegion, region; /**ammo type map. set with setAmmo()*/
/** protected AmmoType ammo;
* ammo type map. set with setAmmo() /**shell ejection effect*/
*/
protected OrderedMap<Item, AmmoType> ammoMap = new OrderedMap<>();
/**
* shell ejection effect
*/
protected Effect ejectEffect = Fx.none; protected Effect ejectEffect = Fx.none;
/** /**weapon reload in frames*/
* weapon reload in frames
*/
protected float reload; protected float reload;
/** /**amount of shots per fire*/
* amount of shots per fire
*/
protected int shots = 1; protected int shots = 1;
/** /**spacing in degrees between multiple shots, if applicable*/
* spacing in degrees between multiple shots, if applicable
*/
protected float spacing = 12f; protected float spacing = 12f;
/** /**inaccuracy of degrees of each shot*/
* inaccuracy of degrees of each shot
*/
protected float inaccuracy = 0f; protected float inaccuracy = 0f;
/** /**intensity and duration of each shot's screen shake*/
* intensity and duration of each shot's screen shake
*/
protected float shake = 0f; protected float shake = 0f;
/** /**visual weapon knockback.*/
* visual weapon knockback.
*/
protected float recoil = 1.5f; protected float recoil = 1.5f;
/** /**shoot barrel y offset*/
* shoot barrel y offset
*/
protected float length = 3f; protected float length = 3f;
/** /**shoot barrel x offset.*/
* shoot barrel x offset.
*/
protected float width = 4f; protected float width = 4f;
/** /**fraction of velocity that is random*/
* fraction of velocity that is random
*/
protected float velocityRnd = 0f; protected float velocityRnd = 0f;
/** /**whether to shoot the weapons in different arms one after another, rather than all at once*/
* whether to shoot the weapons in different arms one after another, rather than all at once
*/
protected boolean roundrobin = false; protected boolean roundrobin = false;
/** /**translator for vector calulations*/
* translator for vector calulations
*/
protected Translator tr = new Translator(); protected Translator tr = new Translator();
public TextureRegion equipRegion, region;
protected Weapon(String name){ protected Weapon(String name){
super(name); super(name);
} }
@@ -103,12 +75,9 @@ public class Weapon extends Upgrade{
Weapon weapon = shooter.getWeapon(); Weapon weapon = shooter.getWeapon();
Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> weapon.bullet(shooter, x, y, f + Mathf.range(weapon.inaccuracy))); Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> weapon.bullet(shooter, x, y, f + Mathf.range(weapon.inaccuracy)));
AmmoType ammo = weapon.ammo;
AmmoType type = shooter.getInventory().getAmmo(); weapon.tr.trns(rotation + 180f, ammo.recoil);
if(type == null) return;
weapon.tr.trns(rotation + 180f, type.recoil);
shooter.getVelocity().add(weapon.tr); shooter.getVelocity().add(weapon.tr);
@@ -116,8 +85,8 @@ public class Weapon extends Upgrade{
Effects.shake(weapon.shake, weapon.shake, x, y); Effects.shake(weapon.shake, weapon.shake, x, y);
Effects.effect(weapon.ejectEffect, x, y, rotation * -Mathf.sign(left)); Effects.effect(weapon.ejectEffect, x, y, rotation * -Mathf.sign(left));
Effects.effect(type.shootEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter); Effects.effect(ammo.shootEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter);
Effects.effect(type.smokeEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter); Effects.effect(ammo.smokeEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter);
//reset timer for remote players //reset timer for remote players
shooter.getTimer().get(shooter.getShootTimer(left), weapon.reload); shooter.getTimer().get(shooter.getShootTimer(left), weapon.reload);
@@ -134,13 +103,17 @@ public class Weapon extends Upgrade{
return "weapon"; return "weapon";
} }
public AmmoType getAmmo(){
return ammo;
}
public void update(ShooterTrait shooter, float pointerX, float pointerY){ public void update(ShooterTrait shooter, float pointerX, float pointerY){
update(shooter, true, pointerX, pointerY); update(shooter, true, pointerX, pointerY);
update(shooter, false, pointerX, pointerY); update(shooter, false, pointerX, pointerY);
} }
private void update(ShooterTrait shooter, boolean left, float pointerX, float pointerY){ private void update(ShooterTrait shooter, boolean left, float pointerX, float pointerY){
if(shooter.getInventory().hasAmmo() && shooter.getTimer().get(shooter.getShootTimer(left), reload)){ if(shooter.getTimer().get(shooter.getShootTimer(left), reload)){
if(roundrobin){ if(roundrobin){
shooter.getTimer().reset(shooter.getShootTimer(!left), reload / 2f); shooter.getTimer().reset(shooter.getShootTimer(!left), reload / 2f);
} }
@@ -180,29 +153,13 @@ public class Weapon extends Upgrade{
Call.onGenericShootWeapon(p, x, y, angle, left); Call.onGenericShootWeapon(p, x, y, angle, left);
} }
} }
p.getInventory().useAmmo();
}
public Iterable<Item> getAcceptedItems(){
return ammoMap.orderedKeys();
}
public AmmoType getAmmoType(Item item){
return ammoMap.get(item);
}
protected void setAmmo(AmmoType... types){
for(AmmoType type : types){
ammoMap.put(type.item, type);
}
} }
void bullet(ShooterTrait owner, float x, float y, float angle){ void bullet(ShooterTrait owner, float x, float y, float angle){
if(owner == null || !owner.getInventory().hasAmmo()) return; if(owner == null) return;
tr.trns(angle, 3f); tr.trns(angle, 3f);
Bullet.create(owner.getInventory().getAmmo().bullet, Bullet.create(ammo.bullet,
owner, owner.getTeam(), x + tr.x, y + tr.y, angle, (1f - velocityRnd) + Mathf.random(velocityRnd)); owner, owner.getTeam(), x + tr.x, y + tr.y, angle, (1f - velocityRnd) + Mathf.random(velocityRnd));
} }
} }

View File

@@ -145,7 +145,6 @@ public class DebugFragment extends Fragment{
for(UnitType type : UnitType.all()){ for(UnitType type : UnitType.all()){
dialog.content().addImageButton("white", 40, () -> { dialog.content().addImageButton("white", 40, () -> {
BaseUnit unit = type.create(player.getTeam()); BaseUnit unit = type.create(player.getTeam());
unit.inventory.addAmmo(type.weapon.getAmmoType(type.weapon.getAcceptedItems().iterator().next()));
unit.setWave(); unit.setWave();
unit.set(player.x, player.y); unit.set(player.x, player.y);
unit.add(); unit.add();

View File

@@ -217,6 +217,9 @@ public class BuildBlock extends Block{
if(recipe != null){ if(recipe != null){
ItemStack[] requirements = recipe.requirements; ItemStack[] requirements = recipe.requirements;
if(requirements.length != accumulator.length || totalAccumulator.length != requirements.length){
setDeconstruct(previous);
}
for(int i = 0; i < requirements.length; i++){ for(int i = 0; i < requirements.length; i++){
accumulator[i] += Math.min(requirements[i].amount * amount / 2f, requirements[i].amount/2f - totalAccumulator[i]); //add scaled amount progressed to the accumulator accumulator[i] += Math.min(requirements[i].amount * amount / 2f, requirements[i].amount/2f - totalAccumulator[i]); //add scaled amount progressed to the accumulator

View File

@@ -1,12 +0,0 @@
package io.anuke.mindustry.world.blocks;
import io.anuke.mindustry.content.blocks.Blocks;
public class Ore extends Floor{
public Ore(String name){
super(name);
blends = block -> block != this && block != Blocks.stone;
}
}

View File

@@ -14,7 +14,7 @@ public class OreBlock extends Floor{
public OreBlock(Item ore, Floor base){ public OreBlock(Item ore, Floor base){
super("ore-" + ore.name + "-" + base.name); super("ore-" + ore.name + "-" + base.name);
this.formalName = ore.name + " " + base.formalName; this.formalName = ore.localizedName() + " " + base.formalName;
this.drops = new ItemStack(ore, 1); this.drops = new ItemStack(ore, 1);
this.base = base; this.base = base;
this.variants = 3; this.variants = 3;

View File

@@ -227,7 +227,7 @@ public class PowerNode extends PowerBlock{
} }
protected boolean shouldDistribute(Tile tile, Tile other){ protected boolean shouldDistribute(Tile tile, Tile other){
return other != null && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity && return other != null && other.entity != null && other.block().hasPower && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
!(other.block() instanceof PowerGenerator); //do not distribute to power generators !(other.block() instanceof PowerGenerator); //do not distribute to power generators
} }

View File

@@ -235,25 +235,6 @@ public class CoreBlock extends StorageBlock{
entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f); entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f);
} }
if(entity.solid && tile.entity.timer.get(timerSupply, supplyInterval)){
rect.setSize(supplyRadius * 2).setCenter(tile.drawx(), tile.drawy());
Units.getNearby(tile.getTeam(), rect, unit -> {
if(unit.isDead() || unit.distanceTo(tile.drawx(), tile.drawy()) > supplyRadius || unit.getGroup() == null)
return;
for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i);
if(tile.entity.items.get(item) > 0 && unit.acceptsAmmo(item)){
tile.entity.items.remove(item, 1);
unit.addAmmo(item);
Call.transferAmmo(item, tile.drawx(), tile.drawy(), unit);
return;
}
}
});
}
} }
@Override @Override
@@ -261,19 +242,6 @@ public class CoreBlock extends StorageBlock{
return new CoreEntity(); return new CoreEntity();
} }
/*
@Remote(called = Loc.server)
public static void onCoreUnitSet(Tile tile, Unit player){
CoreEntity entity = tile.entity();
entity.currentUnit = player;
entity.progress = 0f;
player.set(tile.drawx(), tile.drawy());
if(player instanceof Player){
((Player) player).setRespawning(true);
}
}
*/
public class CoreEntity extends TileEntity implements SpawnerTrait{ public class CoreEntity extends TileEntity implements SpawnerTrait{
public Unit currentUnit; public Unit currentUnit;
int droneID = -1; int droneID = -1;

View File

@@ -1,144 +0,0 @@
package io.anuke.mindustry.world.blocks.units;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.EnumSet;
import io.anuke.ucore.util.Mathf;
public class ResupplyPoint extends Block{
private static Rectangle rect = new Rectangle();
protected int timerSupply = timers++;
protected int timerTarget = timers++;
protected float supplyRadius = 50f;
protected float supplyInterval = 10f;
public ResupplyPoint(String name){
super(name);
update = true;
solid = true;
flags = EnumSet.of(BlockFlag.resupplyPoint);
layer = Layer.laser;
hasItems = true;
hasPower = true;
powerCapacity = 20f;
consumes.power(0.02f);
}
@Override
public void drawSelect(Tile tile){
Draw.color(Palette.accent);
Lines.dashCircle(tile.drawx(), tile.drawy(), supplyRadius);
Draw.color();
}
@Override
public void drawLayer(Tile tile){
ResupplyPointEntity entity = tile.entity();
if(entity.strength > 0f){
float ang = entity.angleTo(entity.lastx, entity.lasty);
float len = 5f;
float x1 = tile.drawx() + Angles.trnsx(ang, len), y1 = tile.drawy() + Angles.trnsy(ang, len);
float dstTo = Vector2.dst(x1, y1, entity.lastx, entity.lasty);
float space = 4f;
float xf = entity.lastx - x1, yf = entity.lasty - y1;
Shapes.laser("transfer", "transfer-end",
x1, y1, entity.lastx, entity.lasty, entity.strength);
Draw.color(Palette.accent);
for(int i = 0; i < dstTo / space - 1; i++){
float fract = (i * space) / dstTo + ((Timers.time() / 90f) % (space / dstTo));
Draw.alpha(Mathf.clamp(fract * 1.5f));
Draw.rect("transfer-arrow", x1 + fract * xf, y1 + fract * yf,
8, 8 * entity.strength, ang);
}
Draw.color();
}
}
@Override
public void update(Tile tile){
ResupplyPointEntity entity = tile.entity();
if(!validTarget(entity, entity.target) || entity.target.distanceTo(tile) > supplyRadius){
entity.target = null;
}else if(entity.target != null && entity.strength > 0.5f){
if(entity.timer.get(timerSupply, supplyInterval)){
for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i);
if(tile.entity.items.has(item) && entity.target.acceptsAmmo(item)){
tile.entity.items.remove(item, 1);
entity.target.addAmmo(item);
break;
}
}
}
entity.rotation = Mathf.slerpDelta(entity.rotation, entity.angleTo(entity.target), 0.5f);
}
if(entity.target != null && entity.cons.valid()){
entity.lastx = entity.target.x;
entity.lasty = entity.target.y;
entity.strength = Mathf.lerpDelta(entity.strength, 1f, 0.08f * Timers.delta());
}else{
entity.strength = Mathf.lerpDelta(entity.strength, 0f, 0.08f * Timers.delta());
}
if(entity.timer.get(timerTarget, 20)){
rect.setSize(supplyRadius * 2).setCenter(tile.drawx(), tile.drawy());
entity.target = Units.getClosest(tile.getTeam(), tile.drawx(), tile.drawy(), supplyRadius, unit -> validTarget(entity, unit));
}
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
return tile.entity.items.total() < itemCapacity;
}
@Override
public TileEntity getEntity(){
return new ResupplyPointEntity();
}
boolean validTarget(ResupplyPointEntity entity, Unit unit){
if(unit == null || unit.inventory.totalAmmo() >= unit.inventory.ammoCapacity()
|| unit.isDead()) return false;
for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i);
if(entity.items.has(item) && unit.acceptsAmmo(item)){
return true;
}
}
return false;
}
public class ResupplyPointEntity extends TileEntity{
public Unit target;
public float strength, rotation = 90, lastx, lasty;
}
}

View File

@@ -13,7 +13,6 @@ import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.AmmoType;
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.world.BarType; import io.anuke.mindustry.world.BarType;
@@ -74,10 +73,6 @@ public class UnitPad extends Block{
unit.set(tile.drawx(), tile.drawy()); unit.set(tile.drawx(), tile.drawy());
unit.add(); unit.add();
unit.getVelocity().y = factory.launchVelocity; unit.getVelocity().y = factory.launchVelocity;
//fill inventory with 1st ammo
AmmoType type = unit.getWeapon().getAmmoType(unit.getWeapon().getAcceptedItems().iterator().next());
unit.inventory.fillAmmo(type);
} }
} }

View File

@@ -11,6 +11,7 @@ import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.core.ThreadHandler.ThreadProvider; import io.anuke.mindustry.core.ThreadHandler.ThreadProvider;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.mindustry.ui.dialogs.FileChooser;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
@@ -78,14 +79,24 @@ public class DesktopPlatform extends Platform{
DiscordRichPresence presence = new DiscordRichPresence(); DiscordRichPresence presence = new DiscordRichPresence();
if(!state.is(State.menu)){ if(!state.is(State.menu)){
presence.state = Strings.capitalize(state.mode.name()) + ", Solo"; presence.state = Strings.capitalize(state.mode.name());
presence.details = Strings.capitalize(world.getMap().name) + " | Wave " + state.wave; if(state.mode == GameMode.noWaves){
presence.largeImageText = "Wave " + state.wave; presence.details = Strings.capitalize(world.getMap().name);
}else{
presence.details = Strings.capitalize(world.getMap().name) + " | Wave " + state.wave;
presence.largeImageText = "Wave " + state.wave;
}
if(state.mode != GameMode.noWaves){
presence.state = Strings.capitalize(state.mode.name());
}else{
presence.state = unitGroups[players[0].getTeam().ordinal()].size() == 1 ? "1 Unit Active" :
(unitGroups[players[0].getTeam().ordinal()].size() + " Units Active");
}
if(Net.active()){ if(Net.active()){
presence.partyMax = 16; presence.partyMax = 16;
presence.partySize = playerGroup.size(); presence.partySize = playerGroup.size();
presence.state = Strings.capitalize(state.mode.name());
} }
}else{ }else{
if(ui.editor != null && ui.editor.isShown()){ if(ui.editor != null && ui.editor.isShown()){

View File

@@ -1,118 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>${app.name}</string> <string>${app.name}</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>${app.executable}</string> <string>${app.executable}</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>${app.id}</string> <string>${app.id}</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>MinimumOSVersion</key> <key>MinimumOSVersion</key>
<string>9.0.0</string> <string>9.0.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>${app.name}</string> <string>${app.name}</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>${app.version}</string> <string>${app.version}</string>
<key>CFBundleIconName</key> <key>CFBundleIconName</key>
<string>AppIcon</string> <string>AppIcon</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>${app.build}</string> <string>${app.build}</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>UIStatusBarHidden</key> <key>UIStatusBarHidden</key>
<true/> <true/>
<key>UIRequiresFullScreen</key> <key>UIRequiresFullScreen</key>
<true/> <true/>
<key>NSPhotoLibraryAddUsageDescription</key> <key>NSPhotoLibraryAddUsageDescription</key>
<string>Mindustry</string> <string>Mindustry</string>
<key>UIDeviceFamily</key> <key>UIDeviceFamily</key>
<array> <array>
<integer>1</integer> <integer>1</integer>
<integer>2</integer> <integer>2</integer>
</array> </array>
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
<array> <array>
<string>armv7</string> <string>armv7</string>
<string>opengles-2</string> <string>opengles-2</string>
</array> </array>
<key>UISupportedInterfaceOrientations</key> <key>UISupportedInterfaceOrientations</key>
<array> <array>
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> <string>UIInterfaceOrientationPortrait</string>
</array>
<key>CFBundleDocumentTypes</key> <key>CFBundleDocumentTypes</key>
<array> <array>
<dict> <dict>
<key>CFBundleTypeIconFiles</key> <key>CFBundleTypeIconFiles</key>
<array> <array>
<string>icon-72.png</string> <string>icon-72.png</string>
</array> </array>
<key>CFBundleTypeName</key> <key>CFBundleTypeName</key>
<string>Mindustry Map File</string> <string>Mindustry Map File</string>
<key>CFBundleTypeRole</key> <key>CFBundleTypeRole</key>
<string>Editor</string> <string>Editor</string>
<key>LSHandlerRank</key> <key>LSHandlerRank</key>
<string>Owner</string> <string>Owner</string>
<key>LSItemContentTypes</key> <key>LSItemContentTypes</key>
<array> <array>
<string>io.anuke.mindustry.mapfile</string> <string>io.anuke.mindustry.mapfile</string>
<string>io.anuke.mindustry.savefile</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Save File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.savefile</string> <string>io.anuke.mindustry.savefile</string>
</array> <key>UTTypeTagSpecification</key>
</dict> <dict>
</array> <key>public.filename-extension</key>
<string>msav</string>
<key>UTExportedTypeDeclarations</key> <key>public.mime-type</key>
<array> <string>mindustry/msav</string>
<dict> </dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Save File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.savefile</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>msav</string>
<key>public.mime-type</key>
<string>mindustry/msav</string>
</dict> </dict>
</dict> </array>
</array>
<key>UTExportedTypeDeclarations</key> <key>UTExportedTypeDeclarations</key>
<array> <array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Map File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.mapfile</string>
<key>UTTypeTagSpecification</key>
<dict> <dict>
<key>public.filename-extension</key> <key>UTTypeConformsTo</key>
<string>mmap</string> <array>
<key>public.mime-type</key> <string>public.data</string>
<string>mindustry/mmap</string> </array>
<key>UTTypeDescription</key>
<string>Mindustry Map File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.mapfile</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>mmap</string>
<key>public.mime-type</key>
<string>mindustry/mmap</string>
</dict>
</dict> </dict>
</dict> </array>
</array> </dict>
</dict>
</plist> </plist>

View File

@@ -32,6 +32,8 @@ import static io.anuke.mindustry.Vars.*;
import static org.robovm.apple.foundation.NSPathUtilities.getDocumentsDirectory; import static org.robovm.apple.foundation.NSPathUtilities.getDocumentsDirectory;
public class IOSLauncher extends IOSApplication.Delegate { public class IOSLauncher extends IOSApplication.Delegate {
private boolean forced;
@Override @Override
protected IOSApplication createApplication() { protected IOSApplication createApplication() {
Net.setClientProvider(new KryoClient()); Net.setClientProvider(new KryoClient());
@@ -86,7 +88,17 @@ public class IOSLauncher extends IOSApplication.Delegate {
p.getPopoverPresentationController().setSourceView(UIApplication.getSharedApplication().getKeyWindow().getRootViewController().getView()); p.getPopoverPresentationController().setSourceView(UIApplication.getSharedApplication().getKeyWindow().getRootViewController().getView());
UIApplication.getSharedApplication().getKeyWindow().getRootViewController() UIApplication.getSharedApplication().getKeyWindow().getRootViewController()
.presentViewController(p, true, () -> io.anuke.ucore.util.Log.info("Success! Presented {0}", to)); .presentViewController(p, true, () -> io.anuke.ucore.util.Log.info("Success! Presented {0}", to));
}
@Override
public void beginForceLandscape(){
forced = true;
}
@Override
public void endForceLandscape(){
forced = false;
} }
}; };
@@ -94,6 +106,11 @@ public class IOSLauncher extends IOSApplication.Delegate {
return new IOSApplication(new Mindustry(), config); return new IOSApplication(new Mindustry(), config);
} }
@Override
public UIInterfaceOrientationMask getSupportedInterfaceOrientations(UIApplication application, UIWindow window){
return forced ? UIInterfaceOrientationMask.Landscape : UIInterfaceOrientationMask.All;
}
@Override @Override
public boolean openURL(UIApplication app, NSURL url, UIApplicationOpenURLOptions options) { public boolean openURL(UIApplication app, NSURL url, UIApplicationOpenURLOptions options) {
System.out.println("Opened URL: " + url.getPath()); System.out.println("Opened URL: " + url.getPath());

View File

@@ -405,7 +405,6 @@ public class ServerControl extends Module{
for(Player player : playerGroup.all()){ for(Player player : playerGroup.all()){
if(player.name.equalsIgnoreCase(arg[0])){ if(player.name.equalsIgnoreCase(arg[0])){
target = player; target = player;
break;
} }
} }
@@ -457,7 +456,6 @@ public class ServerControl extends Module{
if(player.con.address != null && if(player.con.address != null &&
player.con.address.equals(arg[0])){ player.con.address.equals(arg[0])){
netServer.kick(player.con.id, KickReason.banned); netServer.kick(player.con.id, KickReason.banned);
break;
} }
} }
}else{ }else{
@@ -472,7 +470,6 @@ public class ServerControl extends Module{
for(Player player : playerGroup.all()){ for(Player player : playerGroup.all()){
if(player.uuid.equals(arg[0])){ if(player.uuid.equals(arg[0])){
netServer.kick(player.con.id, KickReason.banned); netServer.kick(player.con.id, KickReason.banned);
break;
} }
} }
}else{ }else{