Merge branch 'master' of https://github.com/Anuken/Mindustry into rendering-optimizations

# Conflicts:
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/src/io/anuke/mindustry/core/Renderer.java
#	core/src/io/anuke/mindustry/entities/units/types/Drone.java
#	core/src/io/anuke/mindustry/graphics/CacheLayer.java
#	core/src/io/anuke/mindustry/world/blocks/Floor.java
This commit is contained in:
Anuken
2018-11-26 13:23:38 -05:00
109 changed files with 1495 additions and 1370 deletions

1
.gitignore vendored
View File

@@ -28,6 +28,7 @@ logs/
/core/assets/locales /core/assets/locales
/ios/src/io/anuke/mindustry/gen/ /ios/src/io/anuke/mindustry/gen/
/core/src/io/anuke/mindustry/gen/ /core/src/io/anuke/mindustry/gen/
ios/robovm.properties
*.gif *.gif
version.properties version.properties

View File

@@ -3,8 +3,8 @@ jdk:
- openjdk8 - openjdk8
script: script:
- "./gradlew test" - "./gradlew test"
- "./gradlew desktop:dist" - "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
- "./gradlew server:dist" - "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
deploy: deploy:
provider: releases provider: releases

View File

@@ -20,7 +20,7 @@
<activity <activity
android:name="io.anuke.mindustry.AndroidLauncher" android:name="io.anuke.mindustry.AndroidLauncher"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="user" android:screenOrientation="sensor"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout"> android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
<intent-filter> <intent-filter>

View File

@@ -93,7 +93,7 @@ android {
applicationId "io.anuke.mindustry" applicationId "io.anuke.mindustry"
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 27 targetSdkVersion 28
versionCode code versionCode code
versionName versionNameResult versionName versionNameResult
} }

View File

@@ -68,7 +68,6 @@ public class DonationsActivity extends FragmentActivity{
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment"); Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
if(fragment != null){ if(fragment != null){
fragment.onActivityResult(requestCode, resultCode, data); fragment.onActivityResult(requestCode, resultCode, data);
//TODO donation event, set settings?
} }
} }
} }

View File

@@ -19,13 +19,13 @@ allprojects {
version = 'release' version = 'release'
ext { ext {
versionNumber = '4.0' versionNumber = '4'
versionModifier = 'alpha' versionModifier = 'alpha'
versionType = 'official' versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.9' gdxVersion = '1.9.9'
roboVMVersion = '2.3.0' roboVMVersion = '2.3.0'
uCoreVersion = 'c9aadd4d0b5848dbc4dbbd0fcd701b11c30c02bb' uCoreVersion = 'f73e538757ac66ff62d7f25d93011142b6abb8df'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()
@@ -110,17 +110,35 @@ project(":ios") {
include "**/*.java" include "**/*.java"
} }
into "ios/src/io/anuke/mindustry/gen" into "core/src/io/anuke/mindustry/gen"
} }
doFirst{ doFirst{
delete{ delete{
delete "ios/src/io/anuke/mindustry/gen/" delete "core/src/io/anuke/mindustry/gen/"
} }
} }
} }
//build.dependsOn(copyGen) task incrementConfig{
def vfile = file('robovm.properties')
def props = new Properties()
if(vfile.exists()){
props.load(new FileInputStream(vfile))
}
props['app.id'] = 'io.anuke.mindustry'
props['app.version'] = '4.0'
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
props['app.executable'] = 'IOSLauncher'
props['app.name'] = 'Mindustry'
props['app.build'] = (!props.hasProperty("app.build") ? 40 : props['app.build'].toInteger() + 1)+""
props.store(vfile.newWriter(), null)
}
build.dependsOn(incrementConfig)
build.dependsOn(copyGen)
dependencies { dependencies {
compile project(":core") compile project(":core")

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

View File

@@ -1,6 +1,7 @@
text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet\!) text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
text.credits = Credits text.credits = Credits
text.discord = Join the mindustry discord\! text.contributors = Translators and Contributors
text.discord = Join the mindustry discord!
text.link.discord.description = The official Mindustry discord chatroom text.link.discord.description = The official Mindustry discord chatroom
text.link.github.description = Game source code text.link.github.description = Game source code
text.link.dev-builds.description = Unstable development builds text.link.dev-builds.description = Unstable development builds
@@ -8,25 +9,26 @@ text.link.trello.description = Official trello board for planned features
text.link.itch.io.description = itch.io page with PC downloads and web version text.link.itch.io.description = itch.io page with PC downloads and web version
text.link.google-play.description = Google Play store listing text.link.google-play.description = Google Play store listing
text.link.wiki.description = Official Mindustry wiki text.link.wiki.description = Official Mindustry wiki
text.linkfail = Failed to open link\!\nThe URL has been copied to your clipboard. text.linkfail = Failed to open link!\nThe URL has been copied to your clipboard.
text.screenshot = Screenshot saved to {0}
text.gameover = Game Over text.gameover = Game Over
text.gameover.pvp = The[accent] {0}[] team is victorious\! text.gameover.pvp = The[accent] {0}[] team is victorious!
text.sector.gameover = This sector has been lost. Re-deploy? text.sector.gameover = This sector has been lost. Re-deploy?
text.sector.retry = Retry text.sector.retry = Retry
text.highscore = [accent]New highscore\! text.highscore = [accent]New highscore!
text.wave.lasted = You lasted until wave [accent]{0}[]. text.wave.lasted = You lasted until wave [accent]{0}[].
text.level.highscore = High Score\: [accent]{0} text.level.highscore = High Score: [accent]{0}
text.level.delete.title = Confirm Delete text.level.delete.title = Confirm Delete
text.map.delete = Are you sure you want to delete the map "[accent]{0}[]"? text.map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
text.level.select = Level Select text.level.select = Level Select
text.level.mode = Gamemode\: text.level.mode = Gamemode:
text.construction.desktop = To deselect a block or stop building, [accent]use space[]. text.construction.desktop = To deselect a block or stop building, [accent]use space[].
text.construction.title = Block Construction Guide text.construction.title = Block Construction Guide
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 = 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\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
text.coreattack = < Core is under attack\! > text.coreattack = < Core is under attack! >
text.unlocks = Unlocks text.unlocks = Unlocks
text.savegame = Save Game text.savegame = Save Game
text.loadgame = Load Game text.loadgame = Load Game
@@ -34,19 +36,19 @@ text.joingame = Join Game
text.addplayers = Add/Remove Players text.addplayers = Add/Remove Players
text.customgame = Custom Game text.customgame = Custom Game
text.sectors = Sectors text.sectors = Sectors
text.sector = Sector\: [LIGHT_GRAY]{0} text.sector = Sector: [LIGHT_GRAY]{0}
text.sector.time = Time\: [LIGHT_GRAY]{0} text.sector.time = Time: [LIGHT_GRAY]{0}
text.sector.deploy = Deploy text.sector.deploy = Deploy
text.sector.abandon = Abandon text.sector.abandon = Abandon
text.sector.abandon.confirm = Are you sure you want to abandon all progress at this sector?\nThis cannot be undone\! text.sector.abandon.confirm = Are you sure you want to abandon all progress at this sector?\nThis cannot be undone!
text.sector.resume = Resume text.sector.resume = Resume
text.sector.locked = [scarlet][[Incomplete] text.sector.locked = [scarlet][[Incomplete]
text.sector.unexplored = [accent][[Unexplored] text.sector.unexplored = [accent][[Unexplored]
text.missions = Missions\:[LIGHT_GRAY] {0} text.missions = Missions:[LIGHT_GRAY] {0}
text.mission = Mission\:[LIGHT_GRAY] {0} text.mission = Mission:[LIGHT_GRAY] {0}
text.mission.main = Main Mission\:[LIGHT_GRAY] {0} text.mission.main = Main Mission:[LIGHT_GRAY] {0}
text.mission.info = Mission Info text.mission.info = Mission Info
text.mission.complete = Mission complete\! text.mission.complete = Mission complete!
text.mission.complete.body = Sector {0},{1} has been conquered. text.mission.complete.body = Sector {0},{1} has been conquered.
text.mission.wave = Survive[accent] {0}/{1} []waves\nWave in {2} text.mission.wave = Survive[accent] {0}/{1} []waves\nWave in {2}
text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies
@@ -54,12 +56,12 @@ text.mission.wave.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy
text.mission.wave.menu = Survive[accent] {0}[] waves text.mission.wave.menu = Survive[accent] {0}[] waves
text.mission.battle = Destroy enemy core text.mission.battle = Destroy enemy core
text.mission.resource.menu = Obtain {0} x{1} text.mission.resource.menu = Obtain {0} x{1}
text.mission.resource = Obtain {0}\:\n[accent]{1}/{2}[] text.mission.resource = Obtain {0}:\n[accent]{1}/{2}[]
text.mission.block = Create {0} text.mission.block = Create {0}
text.mission.unit = Create {0} Unit text.mission.unit = Create {0} Unit
text.mission.command = Send Command {0} To Units text.mission.command = Send Command {0} To Units
text.mission.linknode = Link Power Node text.mission.linknode = Link Power Node
text.mission.display = [accent]Mission\:\n[LIGHT_GRAY]{0} text.mission.display = [accent]Mission:\n[LIGHT_GRAY]{0}
text.mission.mech = Switch to mech[accent] {0}[] text.mission.mech = Switch to mech[accent] {0}[]
text.mission.create = Create[accent] {0}[] text.mission.create = Create[accent] {0}[]
text.none = <none> text.none = <none>
@@ -68,29 +70,30 @@ text.quit = Quit
text.maps = Maps text.maps = Maps
text.continue = Continue text.continue = Continue
text.nextmission = Next Mission text.nextmission = Next Mission
text.maps.none = [LIGHT_GRAY]No maps found\! text.maps.none = [LIGHT_GRAY]No maps found!
text.about.button = About text.about.button = About
text.name = Name\: text.name = Name:
text.filename = File Name\: text.noname = Pick a[accent] player name[] first.
text.unlocked = New Block Unlocked\! text.filename = File Name:
text.unlocked.plural = New Blocks Unlocked\! text.unlocked = New Block Unlocked!
text.unlocked.plural = New Blocks Unlocked!
text.players = {0} players online text.players = {0} players online
text.players.single = {0} player online text.players.single = {0} player online
text.server.closing = [accent]Closing server... text.server.closing = [accent]Closing server...
text.server.kicked.kick = You have been kicked from the server\! text.server.kicked.kick = You have been kicked from the server!
text.server.kicked.serverClose = Server closed. text.server.kicked.serverClose = Server closed.
text.server.kicked.sectorComplete = Sector completed. 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.server.kicked.sectorComplete.text = Your mission is complete.\nThe server will now continue at the next sector.
text.server.kicked.clientOutdated = Outdated client\! Update your game\! text.server.kicked.clientOutdated = Outdated client! Update your game!
text.server.kicked.serverOutdated = Outdated server\! Ask the host to update\! text.server.kicked.serverOutdated = Outdated server! Ask the host to update!
text.server.kicked.banned = You are banned on this server. text.server.kicked.banned = You are banned on this server.
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 chosen name is invalid. 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.
text.join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note\: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. text.join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.hostserver = Host Game text.hostserver = Host Game
text.hostserver.mobile = Host\nGame text.hostserver.mobile = Host\nGame
text.host = Host text.host = Host
@@ -98,31 +101,31 @@ text.hosting = [accent]Opening server...
text.hosts.refresh = Refresh text.hosts.refresh = Refresh
text.hosts.discovering = Discovering LAN games text.hosts.discovering = Discovering LAN games
text.server.refreshing = Refreshing server text.server.refreshing = Refreshing server
text.hosts.none = [lightgray]No local games found\! text.hosts.none = [lightgray]No local games found!
text.host.invalid = [scarlet]Can't connect to host. text.host.invalid = [scarlet]Can't connect to host.
text.trace = Trace Player text.trace = Trace Player
text.trace.playername = Player name\: [accent]{0} text.trace.playername = Player name: [accent]{0}
text.trace.ip = IP\: [accent]{0} text.trace.ip = IP: [accent]{0}
text.trace.id = Unique ID\: [accent]{0} text.trace.id = Unique ID: [accent]{0}
text.trace.android = Android Client\: [accent]{0} text.trace.android = Android Client: [accent]{0}
text.trace.modclient = Custom Client\: [accent]{0} text.trace.modclient = Custom Client: [accent]{0}
text.trace.totalblocksbroken = Total blocks broken\: [accent]{0} text.trace.totalblocksbroken = Total blocks broken: [accent]{0}
text.trace.structureblocksbroken = Structure blocks broken\: [accent]{0} text.trace.structureblocksbroken = Structure blocks broken: [accent]{0}
text.trace.lastblockbroken = Last block broken\: [accent]{0} text.trace.lastblockbroken = Last block broken: [accent]{0}
text.trace.totalblocksplaced = Total blocks placed\: [accent]{0} text.trace.totalblocksplaced = Total blocks placed: [accent]{0}
text.trace.lastblockplaced = Last block placed\: [accent]{0} text.trace.lastblockplaced = Last block placed: [accent]{0}
text.invalidid = Invalid client ID\! Submit a bug report. text.invalidid = Invalid client ID! Submit a bug report.
text.server.bans = Bans text.server.bans = Bans
text.server.bans.none = No banned players found\! text.server.bans.none = No banned players found!
text.server.admins = Admins text.server.admins = Admins
text.server.admins.none = No admins found\! text.server.admins.none = No admins found!
text.server.add = Add Server text.server.add = Add Server
text.server.delete = Are you sure you want to delete this server? text.server.delete = Are you sure you want to delete this server?
text.server.hostname = Host\: {0} text.server.hostname = Host: {0}
text.server.edit = Edit Server text.server.edit = Edit Server
text.server.outdated = [crimson]Outdated Server\![] text.server.outdated = [crimson]Outdated Server![]
text.server.outdated.client = [crimson]Outdated Client\![] text.server.outdated.client = [crimson]Outdated Client![]
text.server.version = [lightgray]Version\: {0} {1} text.server.version = [lightgray]Version: {0} {1}
text.server.custombuild = [yellow]Custom Build text.server.custombuild = [yellow]Custom Build
text.confirmban = Are you sure you want to ban this player? text.confirmban = Are you sure you want to ban this player?
text.confirmkick = Are you sure you want to kick this player? text.confirmkick = Are you sure you want to kick this player?
@@ -130,45 +133,45 @@ text.confirmunban = Are you sure you want to unban this player?
text.confirmadmin = Are you sure you want to make this player an admin? text.confirmadmin = Are you sure you want to make this player an admin?
text.confirmunadmin = Are you sure you want to remove admin status from this player? text.confirmunadmin = Are you sure you want to remove admin status from this player?
text.joingame.title = Join Game text.joingame.title = Join Game
text.joingame.ip = IP\: text.joingame.ip = IP:
text.disconnect = Disconnected. text.disconnect = Disconnected.
text.disconnect.data = Failed to load world data\! text.disconnect.data = Failed to load world data!
text.connecting = [accent]Connecting... text.connecting = [accent]Connecting...
text.connecting.data = [accent]Loading world data... text.connecting.data = [accent]Loading world data...
text.server.port = Port\: text.server.port = Port:
text.server.addressinuse = Address already in use\! text.server.addressinuse = Address already in use!
text.server.invalidport = Invalid port number\! text.server.invalidport = Invalid port number!
text.server.error = [crimson]Error hosting server\: [accent]{0} text.server.error = [crimson]Error hosting server: [accent]{0}
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.save.new = New Save text.save.new = New Save
text.save.overwrite = Are you sure you want to overwrite\nthis save slot? text.save.overwrite = Are you sure you want to overwrite\nthis save slot?
text.overwrite = Overwrite text.overwrite = Overwrite
text.save.none = No saves found\! text.save.none = No saves found!
text.saveload = [accent]Saving... text.saveload = [accent]Saving...
text.savefail = Failed to save game\! text.savefail = Failed to save game!
text.save.delete.confirm = Are you sure you want to delete this save? text.save.delete.confirm = Are you sure you want to delete this save?
text.save.delete = Delete text.save.delete = Delete
text.save.export = Export Save text.save.export = Export Save
text.save.import.invalid = [accent]This save is invalid\! text.save.import.invalid = [accent]This save is invalid!
text.save.import.fail = [crimson]Failed to import save\: [accent]{0} text.save.import.fail = [crimson]Failed to import save: [accent]{0}
text.save.export.fail = [crimson]Failed to export save\: [accent]{0} text.save.export.fail = [crimson]Failed to export save: [accent]{0}
text.save.import = Import Save text.save.import = Import Save
text.save.newslot = Save name\: text.save.newslot = Save name:
text.save.rename = Rename text.save.rename = Rename
text.save.rename.text = New name\: text.save.rename.text = New name:
text.selectslot = Select a save. text.selectslot = Select a save.
text.slot = [accent]Slot {0} text.slot = [accent]Slot {0}
text.save.corrupted = [accent]Save file corrupted or invalid\!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. text.save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug.
text.sector.corrupted = [accent]A save file for this sector was found, but loading failed.\nA new one has been created. text.sector.corrupted = [accent]A save file for this sector was found, but loading failed.\nA new one has been created.
text.empty = <empty> text.empty = <empty>
text.on = On text.on = On
text.off = Off text.off = Off
text.save.autosave = Autosave\: {0} text.save.autosave = Autosave: {0}
text.save.map = Map\: {0} text.save.map = Map: {0}
text.save.wave = Wave {0} text.save.wave = Wave {0}
text.save.difficulty = Difficulty\: {0} text.save.difficulty = Difficulty: {0}
text.save.date = Last Saved\: {0} text.save.date = Last Saved: {0}
text.save.playtime = Playtime\: {0} text.save.playtime = Playtime: {0}
text.confirm = Confirm text.confirm = Confirm
text.delete = Delete text.delete = Delete
text.ok = OK text.ok = OK
@@ -180,9 +183,9 @@ text.back = Back
text.quit.confirm = Are you sure you want to quit? text.quit.confirm = Are you sure you want to quit?
text.changelog.title = Changelog text.changelog.title = Changelog
text.changelog.loading = Getting changelog... text.changelog.loading = Getting changelog...
text.changelog.error.android = [accent]Note that the changelog sometimes does not work on Android 4.4 and below\!\nThis is due to an internal Android bug. text.changelog.error.android = [accent]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios = [accent]The changelog is currently not supported in iOS. text.changelog.error.ios = [accent]The changelog is currently not supported in iOS.
text.changelog.error = [scarlet]Error getting changelog\!\nCheck your internet connection. text.changelog.error = [scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current = [yellow][[Current version] text.changelog.current = [yellow][[Current version]
text.changelog.latest = [accent][[Latest version] text.changelog.latest = [accent][[Latest version]
text.loading = [accent]Loading... text.loading = [accent]Loading...
@@ -198,32 +201,32 @@ text.saveimage = Save Image
text.unknown = Unknown text.unknown = Unknown
text.custom = Custom text.custom = Custom
text.builtin = Built-In text.builtin = Built-In
text.map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone\! text.map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone!
text.map.random = [accent]Random Map text.map.random = [accent]Random Map
text.map.nospawn = This map does not have any cores for the player to spawn in\! Add a[ROYAL] blue[] core to this map in the editor. text.map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor.
text.map.nospawn.pvp = This map does not have any enemy cores for player to spawn into\! Add[SCARLET] red[] cores to this map in the editor. text.map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor.
text.map.invalid = Error loading map\: corrupted or invalid map file. text.map.invalid = Error loading map: corrupted or invalid map file.
text.editor.brush = Brush text.editor.brush = Brush
text.editor.slope = \\ text.editor.slope = \\
text.editor.openin = Open In Editor text.editor.openin = Open In Editor
text.editor.oregen = Ore Generation text.editor.oregen = Ore Generation
text.editor.oregen.info = Ore Generation\: text.editor.oregen.info = Ore Generation:
text.editor.mapinfo = Map Info text.editor.mapinfo = Map Info
text.editor.author = Author\: text.editor.author = Author:
text.editor.description = Description\: text.editor.description = Description:
text.editor.name = Name\: text.editor.name = Name:
text.editor.teams = Teams text.editor.teams = Teams
text.editor.elevation = Elevation text.editor.elevation = Elevation
text.editor.errorimageload = Error loading file\:\n[accent]{0} text.editor.errorimageload = Error loading file:\n[accent]{0}
text.editor.errorimagesave = Error saving file\:\n[accent]{0} text.editor.errorimagesave = Error saving file:\n[accent]{0}
text.editor.generate = Generate text.editor.generate = Generate
text.editor.resize = Resize text.editor.resize = Resize
text.editor.loadmap = Load Map text.editor.loadmap = Load Map
text.editor.savemap = Save Map text.editor.savemap = Save Map
text.editor.saved = Saved\! text.editor.saved = Saved!
text.editor.save.noname = Your map does not have a name\! Set one in the 'map info' menu. text.editor.save.noname = Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite = Your map overwrites a built-in map\! Pick a different name in the 'map info' menu. text.editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists = [scarlet]Unable to import\:[] a built-in map named '{0}' already exists\! text.editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import = Import... text.editor.import = Import...
text.editor.importmap = Import Map text.editor.importmap = Import Map
text.editor.importmap.description = Import an already existing map text.editor.importmap.description = Import an already existing map
@@ -238,21 +241,21 @@ text.editor.exportimage = Export Terrain Image
text.editor.exportimage.description = Export a map image file text.editor.exportimage.description = Export a map image file
text.editor.loadimage = Import Terrain text.editor.loadimage = Import Terrain
text.editor.saveimage = Export Terrain text.editor.saveimage = Export Terrain
text.editor.unsaved = [scarlet]You have unsaved changes\![]\nAre you sure you want to exit? text.editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit?
text.editor.resizemap = Resize Map text.editor.resizemap = Resize Map
text.editor.mapname = Map Name\: text.editor.mapname = Map Name:
text.editor.overwrite = [accent]Warning\!\nThis overwrites an existing map. text.editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
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]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.editor.selectmap = Select a map to load\: text.editor.selectmap = Select a map to load:
text.width = Width\: text.width = Width:
text.height = Height\: text.height = Height:
text.menu = Menu text.menu = Menu
text.play = Play text.play = Play
text.load = Load text.load = Load
text.save = Save text.save = Save
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.language.restart = Please restart your game for the language settings to take effect. text.language.restart = Please restart your game for the language settings to take effect.
text.settings = Settings text.settings = Settings
text.tutorial = Tutorial text.tutorial = Tutorial
@@ -260,7 +263,7 @@ text.editor = Editor
text.mapeditor = Map Editor text.mapeditor = Map Editor
text.donate = Donate text.donate = Donate
text.connectfail = [crimson]Failed to connect to server\:\n\n[accent]{0} text.connectfail = [crimson]Failed to connect to server:\n\n[accent]{0}
text.error.unreachable = Server unreachable.\nIs the address spelled correctly? text.error.unreachable = Server unreachable.\nIs the address spelled correctly?
text.error.invalidaddress = Invalid address. text.error.invalidaddress = Invalid address.
text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct!
@@ -277,8 +280,8 @@ text.settings.game = Game
text.settings.sound = Sound text.settings.sound = Sound
text.settings.graphics = Graphics text.settings.graphics = Graphics
text.settings.cleardata = Clear Game Data... text.settings.cleardata = Clear Game Data...
text.settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone\! text.settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
text.settings.clearall.confirm = [scarlet]WARNING\![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. text.settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit.
text.settings.clearsectors = Clear Sectors text.settings.clearsectors = Clear Sectors
text.settings.clearunlocks = Clear Unlocks text.settings.clearunlocks = Clear Unlocks
text.settings.clearall = Clear All text.settings.clearall = Clear All
@@ -321,7 +324,8 @@ text.blocks.coolant = Coolant
text.blocks.coolantuse = Coolant Use text.blocks.coolantuse = Coolant Use
text.blocks.inputliquidfuel = Fuel Liquid text.blocks.inputliquidfuel = Fuel Liquid
text.blocks.liquidfueluse = Liquid Fuel Use text.blocks.liquidfueluse = Liquid Fuel Use
text.blocks.explosive = Highly explosive\! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Health text.blocks.health = Health
text.blocks.inaccuracy = Inaccuracy text.blocks.inaccuracy = Inaccuracy
text.blocks.shots = Shots text.blocks.shots = Shots
@@ -346,6 +350,7 @@ text.category.liquids = Liquids
text.category.items = Items text.category.items = Items
text.category.crafting = Crafting text.category.crafting = Crafting
text.category.shooting = Shooting text.category.shooting = Shooting
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
@@ -355,14 +360,13 @@ setting.difficulty.easy = easy
setting.difficulty.normal = normal setting.difficulty.normal = normal
setting.difficulty.hard = hard setting.difficulty.hard = hard
setting.difficulty.insane = insane setting.difficulty.insane = insane
setting.difficulty.name = Difficulty\: setting.difficulty.name = Difficulty:
setting.screenshake.name = Screen Shake setting.screenshake.name = Screen Shake
setting.effects.name = Display Effects setting.effects.name = Display Effects
setting.sensitivity.name = Controller Sensitivity setting.sensitivity.name = Controller Sensitivity
setting.saveinterval.name = Autosave Interval setting.saveinterval.name = Autosave Interval
setting.seconds = {0} Seconds setting.seconds = {0} Seconds
setting.fullscreen.name = Fullscreen setting.fullscreen.name = Fullscreen
setting.multithread.name = Multithreading
setting.fps.name = Show FPS setting.fps.name = Show FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Show Power Lasers setting.lasers.name = Show Power Lasers
@@ -381,6 +385,7 @@ command.retreat = Retreat
command.patrol = Patrol command.patrol = Patrol
keybind.press = Press a key... keybind.press = Press a key...
keybind.press.axis = Press an axis or key... keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
@@ -461,7 +466,7 @@ mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run
mech.tau-mech.name = Tau mech.tau-mech.name = Tau
mech.tau-mech.weapon = Restruct Laser mech.tau-mech.weapon = Restruct Laser
mech.tau-mech.ability = Repair Burst mech.tau-mech.ability = Repair Burst
mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability. mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability.
mech.omega-mech.name = Omega mech.omega-mech.name = Omega
mech.omega-mech.weapon = Swarm Missiles mech.omega-mech.weapon = Swarm Missiles
mech.omega-mech.ability = Armored Configuration mech.omega-mech.ability = Armored Configuration
@@ -479,21 +484,21 @@ mech.trident-ship.weapon = Bomb Bay
mech.glaive-ship.name = Glaive mech.glaive-ship.name = Glaive
mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed.
mech.glaive-ship.weapon = Flame Repeater mech.glaive-ship.weapon = Flame Repeater
text.item.explosiveness = [LIGHT_GRAY]Explosiveness\: {0}% text.item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}%
text.item.flammability = [LIGHT_GRAY]Flammability\: {0}% text.item.flammability = [LIGHT_GRAY]Flammability: {0}%
text.item.radioactivity = [LIGHT_GRAY]Radioactivity\: {0}% text.item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}%
text.item.fluxiness = [LIGHT_GRAY]Flux Power\: {0}% text.item.fluxiness = [LIGHT_GRAY]Flux Power: {0}%
text.unit.health = [LIGHT_GRAY]Health\: {0} text.unit.health = [LIGHT_GRAY]Health: {0}
text.unit.speed = [LIGHT_GRAY]Speed\: {0} text.unit.speed = [LIGHT_GRAY]Speed: {0}
text.mech.weapon = [LIGHT_GRAY]Weapon\: {0} text.mech.weapon = [LIGHT_GRAY]Weapon: {0}
text.mech.armor = [LIGHT_GRAY]Armor\: {0} text.mech.armor = [LIGHT_GRAY]Armor: {0}
text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity\: {0} text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0}
text.mech.minespeed = [LIGHT_GRAY]Mining Speed\: {0} text.mech.minespeed = [LIGHT_GRAY]Mining Speed: {0}
text.mech.minepower = [LIGHT_GRAY]Mining Power\: {0} text.mech.minepower = [LIGHT_GRAY]Mining Power: {0}
text.mech.ability = [LIGHT_GRAY]Ability\: {0} text.mech.ability = [LIGHT_GRAY]Ability: {0}
text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity\: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity = [LIGHT_GRAY]Viscosity\: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature = [LIGHT_GRAY]Temperature\: {0} text.liquid.temperature = [LIGHT_GRAY]Temperature: {0}
block.constructing = {0} [LIGHT_GRAY](Constructing) block.constructing = {0} [LIGHT_GRAY](Constructing)
block.spawn.name = Enemy Spawn block.spawn.name = Enemy Spawn
block.core.name = Core block.core.name = Core

View File

@@ -286,6 +286,7 @@ text.no = Nein
text.info.title = [accent]Info text.info.title = [accent]Info
text.error.title = [crimson] Ein Fehler ist aufgetreten text.error.title = [crimson] Ein Fehler ist aufgetreten
text.error.crashtitle = Ein Fehler ist aufgetreten! text.error.crashtitle = Ein Fehler ist aufgetreten!
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Blockinfo: text.blocks.blockinfo = Blockinfo:
text.blocks.powercapacity = Kapazität text.blocks.powercapacity = Kapazität
text.blocks.powershot = Stromverbrauch/Schuss text.blocks.powershot = Stromverbrauch/Schuss
@@ -318,7 +319,8 @@ text.blocks.coolant = Kühlmittel
text.blocks.coolantuse = Kühlmittelverbrauch text.blocks.coolantuse = Kühlmittelverbrauch
text.blocks.inputliquidfuel = Kraftstoff text.blocks.inputliquidfuel = Kraftstoff
text.blocks.liquidfueluse = Kraftstoffverbrauch text.blocks.liquidfueluse = Kraftstoffverbrauch
text.blocks.explosive = Hochexplosiv! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Lebenspunkte text.blocks.health = Lebenspunkte
text.blocks.inaccuracy = Ungenauigkeit text.blocks.inaccuracy = Ungenauigkeit
text.blocks.shots = Schüsse text.blocks.shots = Schüsse
@@ -343,6 +345,7 @@ text.category.liquids = Flüssigkeiten
text.category.items = Materialien text.category.items = Materialien
text.category.crafting = Erzeugung text.category.crafting = Erzeugung
text.category.shooting = Schießen text.category.shooting = Schießen
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Zielauswahl setting.autotarget.name = Auto-Zielauswahl
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = kein setting.fpscap.none = kein
@@ -359,7 +362,6 @@ setting.sensitivity.name = Controller-Empfindlichkeit
setting.saveinterval.name = Autosave Häufigkeit setting.saveinterval.name = Autosave Häufigkeit
setting.seconds = {0} Sekunden setting.seconds = {0} Sekunden
setting.fullscreen.name = Vollbild setting.fullscreen.name = Vollbild
setting.multithread.name = Multithreading
setting.fps.name = Zeige FPS setting.fps.name = Zeige FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Zeige Stromlaser setting.lasers.name = Zeige Stromlaser
@@ -404,8 +406,6 @@ mode.waves.name = Wellen
mode.waves.description = Der normale Modus. Begrenzte Ressourcen und automatische Wellen. mode.waves.description = Der normale Modus. Begrenzte Ressourcen und automatische Wellen.
mode.sandbox.name = Sandkasten mode.sandbox.name = Sandkasten
mode.sandbox.description = Unendliche Ressourcen und kein Timer für Wellen. mode.sandbox.description = Unendliche Ressourcen und kein Timer für Wellen.
mode.custom.warning = [scarlet]FREISCHALTUNGEN IN BENUTZERDEFINIERTEN SPIELEN ODER SERVERN WERDEN NICHT GESPEICHERT.[]\n\nSpiele in Sektoren, um Dinge freizuschalten.
mode.custom.warning.read = Nur um sicherzugehen, dass du es gelesen hast:\n[scarlet]FREISCHALTUNGEN IN BENUTZERDEFINIERTEN SPIELEN ODER SERVERN WERDEN NICHT GESPEICHERT.[]\n\nSpiele in Sektoren, um Dinge freizuschalten.(Ich wünschte, der Hinweis wäre nicht notwendig, aber anscheinend ist er das)[]
mode.freebuild.name = Freier Bau mode.freebuild.name = Freier Bau
mode.freebuild.description = Begrenzte Ressourcen und kein Timer für Wellen. mode.freebuild.description = Begrenzte Ressourcen und kein Timer für Wellen.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = No
text.info.title = [accent]Información text.info.title = [accent]Información
text.error.title = [crimson]Un error ha ocurrido. text.error.title = [crimson]Un error ha ocurrido.
text.error.crashtitle = Un error ha ocurrido. text.error.crashtitle = Un error ha ocurrido.
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Información del Bloque text.blocks.blockinfo = Información del Bloque
text.blocks.powercapacity = Capacidad de Energía text.blocks.powercapacity = Capacidad de Energía
text.blocks.powershot = Energía/Disparo text.blocks.powershot = Energía/Disparo
@@ -318,7 +319,8 @@ text.blocks.coolant = Refrigerante
text.blocks.coolantuse = Uso del Refrigerante text.blocks.coolantuse = Uso del Refrigerante
text.blocks.inputliquidfuel = Combustible Líquido text.blocks.inputliquidfuel = Combustible Líquido
text.blocks.liquidfueluse = Uso del Combustible Líquido text.blocks.liquidfueluse = Uso del Combustible Líquido
text.blocks.explosive = ¡Altamente Explosivo! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Vida text.blocks.health = Vida
text.blocks.inaccuracy = Imprecisión text.blocks.inaccuracy = Imprecisión
text.blocks.shots = Disparos text.blocks.shots = Disparos
@@ -343,6 +345,7 @@ text.category.liquids = Líquidos
text.category.items = Objetos text.category.items = Objetos
text.category.crafting = Fabricación text.category.crafting = Fabricación
text.category.shooting = Disparo text.category.shooting = Disparo
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto apuntado setting.autotarget.name = Auto apuntado
setting.fpscap.name = Máx FPS setting.fpscap.name = Máx FPS
setting.fpscap.none = Nada setting.fpscap.none = Nada
@@ -359,7 +362,6 @@ setting.sensitivity.name = Sensibilidad del Control
setting.saveinterval.name = Intervalo del Auto-guardado setting.saveinterval.name = Intervalo del Auto-guardado
setting.seconds = {0} Segundos setting.seconds = {0} Segundos
setting.fullscreen.name = Pantalla Completa setting.fullscreen.name = Pantalla Completa
setting.multithread.name = Multiproceso
setting.fps.name = Mostrar FPS setting.fps.name = Mostrar FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Mostrar Energía de los Láseres setting.lasers.name = Mostrar Energía de los Láseres
@@ -404,8 +406,6 @@ mode.waves.name = hordas
mode.waves.description = El modo normal. con recursos limitados y entrada de hordas automática. mode.waves.description = El modo normal. con recursos limitados y entrada de hordas automática.
mode.sandbox.name = sandbox mode.sandbox.name = sandbox
mode.sandbox.description = Recursos ilimitados y sin temporizador para las hordas. mode.sandbox.description = Recursos ilimitados y sin temporizador para las hordas.
mode.custom.warning = Ten en cuenta que los bloques no pueden usarse en partidas personalizadas hasta que se desbloqueen en sectores.\n\n[LIGHT_GRAY]Si no desbloqueaste ningún bloque, ningno aparecerá.
mode.custom.warning.read = Solo para asegurar que lo has leído:\n[scarlet]¡LOS DESBLOQUEOS EN PARTIDAS PERSONALIZADAS NO ESTÁN DISPONIBLES EN LOS SECTORES U OTROS MODOS DE JUEGO!\n\n[LIGHT_GRAY](Ojalá esto no fuera necesario, pero parece que lo es)
mode.freebuild.name = construcción libre mode.freebuild.name = construcción libre
mode.freebuild.description = recursos limitados y no hay temporizador para las hordas. mode.freebuild.description = recursos limitados y no hay temporizador para las hordas.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = Non
text.info.title = Info text.info.title = Info
text.error.title = [crimson]Une erreur s'est produite text.error.title = [crimson]Une erreur s'est produite
text.error.crashtitle = Une erreur s'est produite text.error.crashtitle = Une erreur s'est produite
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Info sur le bloc text.blocks.blockinfo = Info sur le bloc
text.blocks.powercapacity = capacité d'énergie text.blocks.powercapacity = capacité d'énergie
text.blocks.powershot = Énergie/Tir text.blocks.powershot = Énergie/Tir
@@ -318,7 +319,8 @@ text.blocks.coolant = Liquide de refroidissement
text.blocks.coolantuse = Quantité de liquide de refroidissement utilisée text.blocks.coolantuse = Quantité de liquide de refroidissement utilisée
text.blocks.inputliquidfuel = Carburant liquide text.blocks.inputliquidfuel = Carburant liquide
text.blocks.liquidfueluse = Quantité de carburant liquide utilisé text.blocks.liquidfueluse = Quantité de carburant liquide utilisé
text.blocks.explosive = Hautement explosif! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Santé text.blocks.health = Santé
text.blocks.inaccuracy = Précision text.blocks.inaccuracy = Précision
text.blocks.shots = Tir text.blocks.shots = Tir
@@ -343,6 +345,7 @@ text.category.liquids = Liquides
text.category.items = Objets text.category.items = Objets
text.category.crafting = Fabrication text.category.crafting = Fabrication
text.category.shooting = Défense text.category.shooting = Défense
text.category.optional = Optional Enhancements
setting.autotarget.name = Visée automatique setting.autotarget.name = Visée automatique
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
@@ -359,7 +362,6 @@ setting.sensitivity.name = Sensibilité de la manette
setting.saveinterval.name = Intervalle des sauvegardes auto setting.saveinterval.name = Intervalle des sauvegardes auto
setting.seconds = {0} secondes setting.seconds = {0} secondes
setting.fullscreen.name = Plein écran setting.fullscreen.name = Plein écran
setting.multithread.name = Multithreading [scarlet] (instable!)
setting.fps.name = Afficher FPS setting.fps.name = Afficher FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Afficher les rayons des lasers setting.lasers.name = Afficher les rayons des lasers
@@ -404,8 +406,6 @@ mode.waves.name = Vagues
mode.waves.description = le mode de jeu normal. Ressource limitée et vagues d'ennemis. mode.waves.description = le mode de jeu normal. Ressource limitée et vagues d'ennemis.
mode.sandbox.name = bac à sable mode.sandbox.name = bac à sable
mode.sandbox.description = Ressources infinies et pas de timer pour les vagues. mode.sandbox.description = Ressources infinies et pas de timer pour les vagues.
mode.custom.warning = Notez que les blocs débloqués en partie personnalisées ne sont pas conservés pour les secteurs.\n\n[LIGHT_GRAY]En mode bac à sable, seul les blocs débloqués en mode secteur peuvent être utilisés.
mode.custom.warning.read = Simplement pour vérifier que vous l'avez lu :\n[scarlet]CE QUI EST DEBLOQUE LORS DES PARITES PERSONNALISEES NE L'EST POUR LES SECTEURS OU LES AUTRES MODES DE JEU!\n\n[LIGHT_GRAY](J'aurais souhaité que ce ne soit pas nécessaire, mais ça a l'air de l'être )
mode.freebuild.name = construction libre mode.freebuild.name = construction libre
mode.freebuild.description = Ressource limitée et pas de timer pour les vagues. mode.freebuild.description = Ressource limitée et pas de timer pour les vagues.
mode.pvp.name = JcJ mode.pvp.name = JcJ

View File

@@ -1,5 +1,6 @@
text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits.text = Créé par [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
text.credits = Crédits text.credits = Crédits
text.contributors = Traducteurs et contributeurs
text.discord = Rejoignez le discord de Mindustry ! text.discord = Rejoignez le discord de Mindustry !
text.link.discord.description = Le discord officiel de Mindustry text.link.discord.description = Le discord officiel de Mindustry
text.link.github.description = Code source du jeu text.link.github.description = Code source du jeu
@@ -9,6 +10,7 @@ text.link.itch.io.description = Page web itch.io avec les versions ordinateurs t
text.link.google-play.description = Page Google Play Store du jeu text.link.google-play.description = Page Google Play Store du jeu
text.link.wiki.description = Wiki officiel de Mindustry text.link.wiki.description = Wiki officiel de Mindustry
text.linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier. text.linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier.
text.screenshot = Capture d'écran enregistrée sur {0}
text.gameover = Le base a été détruit. text.gameover = Le base a été détruit.
text.gameover.pvp = L'équipe[accent] {0}[] a gagnée ! text.gameover.pvp = L'équipe[accent] {0}[] a gagnée !
text.sector.gameover = Ce secteur a été perdu. Réessayer ? text.sector.gameover = Ce secteur a été perdu. Réessayer ?
@@ -54,7 +56,7 @@ text.mission.wave.enemy = Survivez[accent] {0}/{1} []vagues\n{2} Ennemi
text.mission.wave.menu = Survivez[accent] {0} []vagues text.mission.wave.menu = Survivez[accent] {0} []vagues
text.mission.battle = Détruire la base ennemie. text.mission.battle = Détruire la base ennemie.
text.mission.resource.menu = Obtenez {0} x{1} text.mission.resource.menu = Obtenez {0} x{1}
text.mission.resource = Obtain {0}:\n[accent]{1}/{2}[] text.mission.resource = Obtenez {0}:\n[accent]{1}/{2}[]
text.mission.block = Créez {0} text.mission.block = Créez {0}
text.mission.unit = Créez {0} unité text.mission.unit = Créez {0} unité
text.mission.command = Envoyer une commande à {0} unités text.mission.command = Envoyer une commande à {0} unités
@@ -71,6 +73,7 @@ text.nextmission = Prochaine Mission
text.maps.none = [LIGHT_GRAY]Aucune carte trouvée! text.maps.none = [LIGHT_GRAY]Aucune carte trouvée!
text.about.button = À propos text.about.button = À propos
text.name = Nom: text.name = Nom:
text.noname = Choisissez d'abord [accent]un pseudo[].
text.filename = Nom du fichier: text.filename = Nom du fichier:
text.unlocked = Nouveau bloc debloqué! text.unlocked = Nouveau bloc debloqué!
text.unlocked.plural = Nouveaux blocs débloqués! text.unlocked.plural = Nouveaux blocs débloqués!
@@ -150,8 +153,8 @@ text.save.delete.confirm = Êtes-vous sûr de supprimer cette sauvegarde ?
text.save.delete = Supprimer text.save.delete = Supprimer
text.save.export = Exporter une\nSauvegarde text.save.export = Exporter une\nSauvegarde
text.save.import.invalid = [accent]Cette sauvegarde est invalide! text.save.import.invalid = [accent]Cette sauvegarde est invalide!
text.save.import.fail = [crimson]L'importation de la sauvegarde\na échoué: [accent]{0} text.save.import.fail = [crimson]L'importation de la sauvegarde\na échouée: [accent]{0}
text.save.export.fail = [crimson]L'exportation de la sauvegarde\na échoué: [accent]{0} text.save.export.fail = [crimson]L'exportation de la sauvegarde\na échouée: [accent]{0}
text.save.import = Importer une sauvegarde text.save.import = Importer une sauvegarde
text.save.newslot = Nom de la sauvegarde: text.save.newslot = Nom de la sauvegarde:
text.save.rename = Renommer text.save.rename = Renommer
@@ -286,6 +289,7 @@ text.no = Non
text.info.title = Info text.info.title = Info
text.error.title = [crimson]Une erreur s'est produite text.error.title = [crimson]Une erreur s'est produite
text.error.crashtitle = Une erreur s'est produite text.error.crashtitle = Une erreur s'est produite
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Info sur le bloc text.blocks.blockinfo = Info sur le bloc
text.blocks.powercapacity = Capacité d'énergie text.blocks.powercapacity = Capacité d'énergie
text.blocks.powershot = Énergie/Tir text.blocks.powershot = Énergie/Tir
@@ -318,7 +322,8 @@ text.blocks.coolant = Liquide de refroidissement
text.blocks.coolantuse = Quantité de liquide de refroidissement utilisé text.blocks.coolantuse = Quantité de liquide de refroidissement utilisé
text.blocks.inputliquidfuel = Carburant liquide text.blocks.inputliquidfuel = Carburant liquide
text.blocks.liquidfueluse = Quantité de carburant liquide utilisé text.blocks.liquidfueluse = Quantité de carburant liquide utilisé
text.blocks.explosive = Hautement explosif ! text.blocks.boostitem = Objet boostant la production
text.blocks.boostliquid = Liquide boostant la production
text.blocks.health = Santé text.blocks.health = Santé
text.blocks.inaccuracy = Précision text.blocks.inaccuracy = Précision
text.blocks.shots = Tirs text.blocks.shots = Tirs
@@ -343,6 +348,7 @@ text.category.liquids = Liquides
text.category.items = Objets text.category.items = Objets
text.category.crafting = Fabrication text.category.crafting = Fabrication
text.category.shooting = Défense text.category.shooting = Défense
text.category.optional = Améliorations facultatives
setting.autotarget.name = Visée automatique setting.autotarget.name = Visée automatique
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = Vide setting.fpscap.none = Vide
@@ -359,7 +365,6 @@ setting.sensitivity.name = Contôle de la sensibilité
setting.saveinterval.name = Intervalle des sauvegardes auto setting.saveinterval.name = Intervalle des sauvegardes auto
setting.seconds = {0} Secondes setting.seconds = {0} Secondes
setting.fullscreen.name = Plein écran setting.fullscreen.name = Plein écran
setting.multithread.name = Multithreading
setting.fps.name = Afficher FPS setting.fps.name = Afficher FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Afficher les rayons des lasers setting.lasers.name = Afficher les rayons des lasers
@@ -368,7 +373,7 @@ setting.musicvol.name = Volume de la musique
setting.mutemusic.name = Couper la musique setting.mutemusic.name = Couper la musique
setting.sfxvol.name = Volume des SFX setting.sfxvol.name = Volume des SFX
setting.mutesound.name = Couper les SFX setting.mutesound.name = Couper les SFX
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Envoyer des rapports d'incident anonymement.
text.keybind.title = Paramétrer les touches text.keybind.title = Paramétrer les touches
category.general.name = Général category.general.name = Général
category.view.name = Voir category.view.name = Voir
@@ -404,8 +409,6 @@ mode.waves.name = Vagues
mode.waves.description = Le mode normal. Ressources limitées et vagues déclenchées automatiquement. mode.waves.description = Le mode normal. Ressources limitées et vagues déclenchées automatiquement.
mode.sandbox.name = Bac à sable mode.sandbox.name = Bac à sable
mode.sandbox.description = Ressources infinies et pas de compte à rebours pour les vagues. mode.sandbox.description = Ressources infinies et pas de compte à rebours pour les vagues.
mode.custom.warning = Notez que les blocs débloqués en partie personnalisées ne sont pas conservés pour les secteurs.\n\n[LIGHT_GRAY]En mode bac à sable, seul les blocs débloqués en mode secteur peuvent être utilisés.
mode.custom.warning.read = Juste pour vous assurer que vous l'avez lu:\n[scarlet]Les déverrouillages dans les jeux personnalisés ne sont pas transférés aux secteurs ou à d'autres modes!\n\n[LIGHT_GRAY](J'aimerais que ce ne soit pas nécessaire, mais apparemment c'est le cas)
mode.freebuild.name = Construction libre mode.freebuild.name = Construction libre
mode.freebuild.description = Ressources limitées et pas de compte à rebours pour les vagues. mode.freebuild.description = Ressources limitées et pas de compte à rebours pour les vagues.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = No
text.info.title = [accent]Info text.info.title = [accent]Info
text.error.title = [crimson]Telah terjadi kesalahan text.error.title = [crimson]Telah terjadi kesalahan
text.error.crashtitle = Telah terjadi kesalahan text.error.crashtitle = Telah terjadi kesalahan
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Info Blok text.blocks.blockinfo = Info Blok
text.blocks.powercapacity = Kapasitas Tenaga text.blocks.powercapacity = Kapasitas Tenaga
text.blocks.powershot = Tenaga/tembakan text.blocks.powershot = Tenaga/tembakan
@@ -318,7 +319,8 @@ text.blocks.coolant = Coolant
text.blocks.coolantuse = Coolant Use text.blocks.coolantuse = Coolant Use
text.blocks.inputliquidfuel = Fuel Liquid text.blocks.inputliquidfuel = Fuel Liquid
text.blocks.liquidfueluse = Liquid Fuel Use text.blocks.liquidfueluse = Liquid Fuel Use
text.blocks.explosive = Mudah meledak! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Darah text.blocks.health = Darah
text.blocks.inaccuracy = Ketidaktelitian text.blocks.inaccuracy = Ketidaktelitian
text.blocks.shots = Tembakan text.blocks.shots = Tembakan
@@ -343,6 +345,7 @@ text.category.liquids = Liquids
text.category.items = Items text.category.items = Items
text.category.crafting = Crafting text.category.crafting = Crafting
text.category.shooting = Shooting text.category.shooting = Shooting
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
@@ -359,7 +362,6 @@ setting.sensitivity.name = Sensitivitas Pengendali
setting.saveinterval.name = Waktu Simpan Otomatis setting.saveinterval.name = Waktu Simpan Otomatis
setting.seconds = {0} Detik setting.seconds = {0} Detik
setting.fullscreen.name = Layar Penuh setting.fullscreen.name = Layar Penuh
setting.multithread.name = Multithreading
setting.fps.name = Tunjukkan FPS setting.fps.name = Tunjukkan FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Tampilkan Laser Tenaga setting.lasers.name = Tampilkan Laser Tenaga
@@ -404,8 +406,6 @@ mode.waves.name = gelombang
mode.waves.description = the normal mode. limited resources and automatic incoming waves. mode.waves.description = the normal mode. limited resources and automatic incoming waves.
mode.sandbox.name = sandbox mode.sandbox.name = sandbox
mode.sandbox.description = infinite resources and no timer for waves. mode.sandbox.description = infinite resources and no timer for waves.
mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.freebuild.name = freebuild mode.freebuild.name = freebuild
mode.freebuild.description = limited resources and no timer for waves. mode.freebuild.description = limited resources and no timer for waves.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = No
text.info.title = [accent] Info text.info.title = [accent] Info
text.error.title = [crimson]Si è verificato un errore text.error.title = [crimson]Si è verificato un errore
text.error.crashtitle = Si è verificato un errore text.error.crashtitle = Si è verificato un errore
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = info sul blocco text.blocks.blockinfo = info sul blocco
text.blocks.powercapacity = Capacità Energetica text.blocks.powercapacity = Capacità Energetica
text.blocks.powershot = Danno/Colpo text.blocks.powershot = Danno/Colpo
@@ -318,7 +319,8 @@ text.blocks.coolant = Refrigerante
text.blocks.coolantuse = uso refrigerante text.blocks.coolantuse = uso refrigerante
text.blocks.inputliquidfuel = carburante liquido text.blocks.inputliquidfuel = carburante liquido
text.blocks.liquidfueluse = Utilizzo carburante liquido text.blocks.liquidfueluse = Utilizzo carburante liquido
text.blocks.explosive = Altamente esplosivo! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Salute text.blocks.health = Salute
text.blocks.inaccuracy = Inaccuratezza text.blocks.inaccuracy = Inaccuratezza
text.blocks.shots = Colpi text.blocks.shots = Colpi
@@ -343,6 +345,7 @@ text.category.liquids = Liquidi
text.category.items = Oggetti text.category.items = Oggetti
text.category.crafting = Produzione text.category.crafting = Produzione
text.category.shooting = Potenza di fuoco text.category.shooting = Potenza di fuoco
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Limite FPS setting.fpscap.name = Limite FPS
setting.fpscap.none = Niente setting.fpscap.none = Niente
@@ -359,7 +362,6 @@ setting.sensitivity.name = Sensibilità del controller
setting.saveinterval.name = Intervallo di salvataggio automatico setting.saveinterval.name = Intervallo di salvataggio automatico
setting.seconds = {0} Secondi setting.seconds = {0} Secondi
setting.fullscreen.name = Schermo Intero setting.fullscreen.name = Schermo Intero
setting.multithread.name = multithreading
setting.fps.name = Mostra FPS setting.fps.name = Mostra FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Mostra Laser Energetici setting.lasers.name = Mostra Laser Energetici
@@ -404,8 +406,6 @@ mode.waves.name = ondate
mode.waves.description = modalità normale. risorse limitate e ondate automatiche. mode.waves.description = modalità normale. risorse limitate e ondate automatiche.
mode.sandbox.name = Sandbox mode.sandbox.name = Sandbox
mode.sandbox.description = risorse infinite e nessun timer per le ondate. mode.sandbox.description = risorse infinite e nessun timer per le ondate.
mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.freebuild.name = freebuild mode.freebuild.name = freebuild
mode.freebuild.description = risorse limitate e nessun timer per le ondate. mode.freebuild.description = risorse limitate e nessun timer per le ondate.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -1,5 +1,6 @@
text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.credits = クレジット text.credits = クレジット
text.contributors = 翻訳や協力してくださった方々
text.discord = DiscordのMindustryに参加! text.discord = DiscordのMindustryに参加!
text.link.discord.description = Mindustryの公式Discordグループ text.link.discord.description = Mindustryの公式Discordグループ
text.link.github.description = ゲームのソースコード text.link.github.description = ゲームのソースコード
@@ -22,7 +23,7 @@ text.level.select = レベル選択
text.level.mode = ゲームモード: text.level.mode = ゲームモード:
text.construction.desktop = ブロックの選択や建設を止めるには、[accent]スペースを使用してください[]。 text.construction.desktop = ブロックの選択や建設を止めるには、[accent]スペースを使用してください[]。
text.construction.title = ブロック建設ガイド text.construction.title = ブロック建設ガイド
text.construction = [accent]ブロック建設モード[]になりました。\n設置するには、機体の近くの設置可能な場所をタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体が建設を始めます。\n\n- [accent]ブロックの削除[]は、タップ範囲を選択してください。\n- [accent]範囲の選択[]は、長押しして、範囲のブロックをドラッグしてください。\n- [accent]一列にブロックを設置[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]建設や範囲の選択をキャンセル[]するには、左下の X ボタンを押してください。 text.construction = [accent]ブロック建設モード[]になりました。\n設置するには、機体の近くの設置可能な場所をタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体が建設を始めます。\n\n- [accent]ブロックの撤去[]は、タップして範囲を選択してください。\n- [accent]範囲の選択[]は、長押しして、範囲のブロックをドラッグしてください。\n- [accent]一列にブロックを設置[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]建設や範囲の選択をキャンセル[]するには、左下の X ボタンを押してください。
text.deconstruction.title = ブロック撤去ガイド text.deconstruction.title = ブロック撤去ガイド
text.deconstruction = [accent]ブロック撤去モード[]になりました。\n\nブロックを撤去するには、機体の近くのブロックをタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体がブロックの撤去を始めます。\n\n- [accent]ブロックの破壊[]は、タップで範囲を選択してください。\n- [accent]範囲を選択してブロックを撤去[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]撤去や範囲選択をキャンセル[]するには、左下の X ボタンを押してください。 text.deconstruction = [accent]ブロック撤去モード[]になりました。\n\nブロックを撤去するには、機体の近くのブロックをタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体がブロックの撤去を始めます。\n\n- [accent]ブロックの破壊[]は、タップで範囲を選択してください。\n- [accent]範囲を選択してブロックを撤去[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]撤去や範囲選択をキャンセル[]するには、左下の X ボタンを押してください。
text.showagain = 次回以降表示しない text.showagain = 次回以降表示しない
@@ -71,6 +72,7 @@ text.nextmission = 次のミッションへ
text.maps.none = [LIGHT_GRAY]マップが存在しません! text.maps.none = [LIGHT_GRAY]マップが存在しません!
text.about.button = About text.about.button = About
text.name = 名前: text.name = 名前:
text.noname = 先に[accent]プレイヤー名[]を決めてください。
text.filename = ファイル名: text.filename = ファイル名:
text.unlocked = 新しいブロックをアンロック! text.unlocked = 新しいブロックをアンロック!
text.unlocked.plural = 新しいブロックをアンロック! text.unlocked.plural = 新しいブロックをアンロック!
@@ -286,6 +288,7 @@ text.no = いいえ
text.info.title = 情報 text.info.title = 情報
text.error.title = [crimson]エラーが発生しました text.error.title = [crimson]エラーが発生しました
text.error.crashtitle = エラーが発生しました text.error.crashtitle = エラーが発生しました
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = ブロック情報 text.blocks.blockinfo = ブロック情報
text.blocks.powercapacity = 電力容量 text.blocks.powercapacity = 電力容量
text.blocks.powershot = 電力/ショット text.blocks.powershot = 電力/ショット
@@ -301,7 +304,7 @@ text.blocks.powerdamage = 電力/ダメージ
text.blocks.inputitemcapacity = 搬入アイテム容量 text.blocks.inputitemcapacity = 搬入アイテム容量
text.blocks.outputitemcapacity = 搬出アイテム容量 text.blocks.outputitemcapacity = 搬出アイテム容量
text.blocks.itemcapacity = アイテム容量 text.blocks.itemcapacity = アイテム容量
text.blocks.basepowergeneration = 電力発電量 text.blocks.basepowergeneration = 基本発電量
text.blocks.powertransferspeed = 電力伝送量 text.blocks.powertransferspeed = 電力伝送量
text.blocks.craftspeed = 生産速度 text.blocks.craftspeed = 生産速度
text.blocks.inputliquid = 必要な液体 text.blocks.inputliquid = 必要な液体
@@ -310,7 +313,7 @@ text.blocks.inputitem = 必要なアイテム
text.blocks.inputitems = 必要なアイテム text.blocks.inputitems = 必要なアイテム
text.blocks.outputitem = 搬出アイテム text.blocks.outputitem = 搬出アイテム
text.blocks.drilltier = ドリル text.blocks.drilltier = ドリル
text.blocks.drillspeed = 採掘速度 text.blocks.drillspeed = 基本採掘速度
text.blocks.liquidoutput = 搬出液体 text.blocks.liquidoutput = 搬出液体
text.blocks.liquidoutputspeed = 液体搬出速度 text.blocks.liquidoutputspeed = 液体搬出速度
text.blocks.liquiduse = 液体使用量 text.blocks.liquiduse = 液体使用量
@@ -318,7 +321,8 @@ text.blocks.coolant = 冷却
text.blocks.coolantuse = 冷却使用量 text.blocks.coolantuse = 冷却使用量
text.blocks.inputliquidfuel = 液体燃料 text.blocks.inputliquidfuel = 液体燃料
text.blocks.liquidfueluse = 液体燃料使用量 text.blocks.liquidfueluse = 液体燃料使用量
text.blocks.explosive = 高い爆発性! text.blocks.boostitem = 加速アイテム
text.blocks.boostliquid = 加速液体
text.blocks.health = 耐久値 text.blocks.health = 耐久値
text.blocks.inaccuracy = 不正確 text.blocks.inaccuracy = 不正確
text.blocks.shots = ショット text.blocks.shots = ショット
@@ -343,6 +347,7 @@ text.category.liquids = 液体
text.category.items = アイテム text.category.items = アイテム
text.category.crafting = 製作速度 text.category.crafting = 製作速度
text.category.shooting = 攻撃速度 text.category.shooting = 攻撃速度
text.category.optional = 機能強化オプション
setting.autotarget.name = 自動ターゲット setting.autotarget.name = 自動ターゲット
setting.fpscap.name = 最大FPS setting.fpscap.name = 最大FPS
setting.fpscap.none = なし setting.fpscap.none = なし
@@ -359,7 +364,6 @@ setting.sensitivity.name = 操作感度
setting.saveinterval.name = 自動保存間隔 setting.saveinterval.name = 自動保存間隔
setting.seconds = {0} 秒 setting.seconds = {0} 秒
setting.fullscreen.name = フルスクリーン setting.fullscreen.name = フルスクリーン
setting.multithread.name = マルチスレッド
setting.fps.name = FPSを表示 setting.fps.name = FPSを表示
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = 電力レーザーを表示 setting.lasers.name = 電力レーザーを表示
@@ -399,13 +403,11 @@ keybind.chat_history_next.name = 次のチャット履歴
keybind.chat_scroll.name = チャットスクロール keybind.chat_scroll.name = チャットスクロール
keybind.drop_unit.name = ドロップユニット keybind.drop_unit.name = ドロップユニット
keybind.zoom_minimap.name = ミニマップのズーム keybind.zoom_minimap.name = ミニマップのズーム
mode.text.help.title = モード説明 mode.text.help.title = モード説明
mode.waves.name = ウェーブ mode.waves.name = ウェーブ
mode.waves.description = ノーマルモードです。限られた資源でウェーブが自動的に始まります。 mode.waves.description = ノーマルモードです。限られた資源でウェーブが自動的に始まります。
mode.sandbox.name = サンドボックス mode.sandbox.name = サンドボックス
mode.sandbox.description = 無限の資源でウェーブを自由に始められます。 mode.sandbox.description = 無限の資源でウェーブを自由に始められます。
mode.custom.warning = [scarlet]カスタムゲームまたは、サーバ内でのアンロックは保存されません。[]\n\nアンロックするには区域でプレイしてください。
mode.custom.warning.read = 必ずお読みください:\n[scarlet]カスタムゲーム内でのアンロックは区域やほかのモードには影響しません!\n\n[LIGHT_GRAY](多分必要ないと思いますが)
mode.freebuild.name = フリービルド mode.freebuild.name = フリービルド
mode.freebuild.description = 限られた資源でウェーブを自由に始められます。 mode.freebuild.description = 限られた資源でウェーブを自由に始められます。
mode.pvp.name = PvP mode.pvp.name = PvP

File diff suppressed because it is too large Load Diff

View File

@@ -286,6 +286,7 @@ text.no = Nie ma mowy!
text.info.title = [accent]Informacje text.info.title = [accent]Informacje
text.error.title = [crimson]Wystąpił błąd text.error.title = [crimson]Wystąpił błąd
text.error.crashtitle = Wystąpił błąd text.error.crashtitle = Wystąpił błąd
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Informacje o bloku text.blocks.blockinfo = Informacje o bloku
text.blocks.powercapacity = Pojemność mocy text.blocks.powercapacity = Pojemność mocy
text.blocks.powershot = moc / strzał text.blocks.powershot = moc / strzał
@@ -318,7 +319,8 @@ text.blocks.coolant = Płyn chłodzący
text.blocks.coolantuse = Zużycie płynu chłodzącego text.blocks.coolantuse = Zużycie płynu chłodzącego
text.blocks.inputliquidfuel = Paliwo text.blocks.inputliquidfuel = Paliwo
text.blocks.liquidfueluse = Zużycie paliwa text.blocks.liquidfueluse = Zużycie paliwa
text.blocks.explosive = Wysoce wybuchowy! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Zdrowie text.blocks.health = Zdrowie
text.blocks.inaccuracy = Niedokładność text.blocks.inaccuracy = Niedokładność
text.blocks.shots = Strzały text.blocks.shots = Strzały
@@ -343,6 +345,7 @@ text.category.liquids = Płyny
text.category.items = Przedmioty text.category.items = Przedmioty
text.category.crafting = Przetwórstwo text.category.crafting = Przetwórstwo
text.category.shooting = Strzelanie text.category.shooting = Strzelanie
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
@@ -359,7 +362,6 @@ setting.sensitivity.name = Czułość kontrolera
setting.saveinterval.name = Interwał automatycznego zapisywania setting.saveinterval.name = Interwał automatycznego zapisywania
setting.seconds = Sekundy setting.seconds = Sekundy
setting.fullscreen.name = Pełny ekran setting.fullscreen.name = Pełny ekran
setting.multithread.name = Wielowątkowość
setting.fps.name = Widoczny licznik FPS setting.fps.name = Widoczny licznik FPS
setting.vsync.name = Synchronizacja pionowa setting.vsync.name = Synchronizacja pionowa
setting.lasers.name = Pokaż lasery zasilające setting.lasers.name = Pokaż lasery zasilające
@@ -404,8 +406,6 @@ mode.waves.name = Fale
mode.waves.description = Normalny tryb. Normalne surowce i fale. mode.waves.description = Normalny tryb. Normalne surowce i fale.
mode.sandbox.name = sandbox mode.sandbox.name = sandbox
mode.sandbox.description = Nieskończone surowce i fale bez odliczania. Dla przedszkolaków! mode.sandbox.description = Nieskończone surowce i fale bez odliczania. Dla przedszkolaków!
mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.freebuild.name = budowanie mode.freebuild.name = budowanie
mode.freebuild.description = Normalne surowce i fale bez odliczania. mode.freebuild.description = Normalne surowce i fale bez odliczania.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = Não
text.info.title = [accent]Informação text.info.title = [accent]Informação
text.error.title = [crimson]Ocorreu um Erro. text.error.title = [crimson]Ocorreu um Erro.
text.error.crashtitle = Ocorreu um Erro text.error.crashtitle = Ocorreu um Erro
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Informação do Bloco text.blocks.blockinfo = Informação do Bloco
text.blocks.powercapacity = Capacidade de Energia text.blocks.powercapacity = Capacidade de Energia
text.blocks.powershot = Energia/tiro text.blocks.powershot = Energia/tiro
@@ -318,7 +319,8 @@ text.blocks.coolant = Esfriador
text.blocks.coolantuse = Uso do esfriador text.blocks.coolantuse = Uso do esfriador
text.blocks.inputliquidfuel = Liquido de combustivel text.blocks.inputliquidfuel = Liquido de combustivel
text.blocks.liquidfueluse = Uso do liquido de combustivel text.blocks.liquidfueluse = Uso do liquido de combustivel
text.blocks.explosive = Altamente Explosivo! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Saúde text.blocks.health = Saúde
text.blocks.inaccuracy = Imprecisão text.blocks.inaccuracy = Imprecisão
text.blocks.shots = Tiros text.blocks.shots = Tiros
@@ -343,6 +345,7 @@ text.category.liquids = Liquidos
text.category.items = Itens text.category.items = Itens
text.category.crafting = Construindo text.category.crafting = Construindo
text.category.shooting = Atirando text.category.shooting = Atirando
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = FPS Maximo setting.fpscap.name = FPS Maximo
setting.fpscap.none = Nenhum setting.fpscap.none = Nenhum
@@ -359,7 +362,6 @@ setting.sensitivity.name = Sensibilidade do Controle
setting.saveinterval.name = Intervalo de autosalvamento setting.saveinterval.name = Intervalo de autosalvamento
setting.seconds = {0} Segundos setting.seconds = {0} Segundos
setting.fullscreen.name = Tela Cheia setting.fullscreen.name = Tela Cheia
setting.multithread.name = Multithreading
setting.fps.name = Mostrar FPS setting.fps.name = Mostrar FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Mostrar lasers setting.lasers.name = Mostrar lasers
@@ -404,8 +406,6 @@ mode.waves.name = hordas
mode.waves.description = O modo normal. Recursos limitados E os ataques vem automaticamente. mode.waves.description = O modo normal. Recursos limitados E os ataques vem automaticamente.
mode.sandbox.name = sandbox mode.sandbox.name = sandbox
mode.sandbox.description = Recursos infinitos E sem tempo para Ataques. mode.sandbox.description = Recursos infinitos E sem tempo para Ataques.
mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.freebuild.name = construção \nlivre mode.freebuild.name = construção \nlivre
mode.freebuild.description = recursos limitados e Sem tempo para Ataques. mode.freebuild.description = recursos limitados e Sem tempo para Ataques.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = Нет
text.info.title = Информация text.info.title = Информация
text.error.title = [crimson]Произошла ошибка text.error.title = [crimson]Произошла ошибка
text.error.crashtitle = Произошла ошибка text.error.crashtitle = Произошла ошибка
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Информация о блоке text.blocks.blockinfo = Информация о блоке
text.blocks.powercapacity = Вместимость энергии text.blocks.powercapacity = Вместимость энергии
text.blocks.powershot = Энергия/выстрел text.blocks.powershot = Энергия/выстрел
@@ -318,7 +319,8 @@ text.blocks.coolant = Охлаждающая жидкость
text.blocks.coolantuse = Охлажд. жидкости используется text.blocks.coolantuse = Охлажд. жидкости используется
text.blocks.inputliquidfuel = Жидкое топливо text.blocks.inputliquidfuel = Жидкое топливо
text.blocks.liquidfueluse = Жидкого топлива используется text.blocks.liquidfueluse = Жидкого топлива используется
text.blocks.explosive = Взрывоопасно! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Здоровье text.blocks.health = Здоровье
text.blocks.inaccuracy = Разброс text.blocks.inaccuracy = Разброс
text.blocks.shots = Выстрелы text.blocks.shots = Выстрелы
@@ -343,6 +345,7 @@ text.category.liquids = Жидкости
text.category.items = Предметы text.category.items = Предметы
text.category.crafting = Создание text.category.crafting = Создание
text.category.shooting = рельба text.category.shooting = рельба
text.category.optional = Optional Enhancements
setting.autotarget.name = Авто-цель setting.autotarget.name = Авто-цель
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
setting.fpscap.none = Неограниченный setting.fpscap.none = Неограниченный
@@ -359,7 +362,6 @@ setting.sensitivity.name = Чувствительность контроллер
setting.saveinterval.name = Интервал автосохранения setting.saveinterval.name = Интервал автосохранения
setting.seconds = {0} Секунд setting.seconds = {0} Секунд
setting.fullscreen.name = Полноэкранный режим setting.fullscreen.name = Полноэкранный режим
setting.multithread.name = Многопоточность (TPS)
setting.fps.name = Показывать FPS setting.fps.name = Показывать FPS
setting.vsync.name = Верт. синхронизация setting.vsync.name = Верт. синхронизация
setting.lasers.name = Показывать энергетические лазеры setting.lasers.name = Показывать энергетические лазеры
@@ -404,8 +406,6 @@ mode.waves.name = Волны
mode.waves.description = В режиме "волны" ограниченные ресурсы и автоматические наступающие волны. mode.waves.description = В режиме "волны" ограниченные ресурсы и автоматические наступающие волны.
mode.sandbox.name = Песочница mode.sandbox.name = Песочница
mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну.
mode.custom.warning = [scarlet]РАЗБЛОКИРОВАННОЕ В ПОЛЬЗОВАТЕЛЬСКИХ ИГРАХ ИЛИ НА СЕРВЕРАХ НЕ СОХРАНЯЕТСЯ[]\n\nИграйте в секторах для разблокировки чего-либо
mode.custom.warning.read = Внимательно прочитайте это!:\n[scarlet]РАЗБЛОКИРОВАННОЕ В ПОЛЬЗОВАТЕЛЬСКИХ ИГРАХ ИЛИ ДРУГИХ РЕЖИМАХ ИГРЫ НЕ РАСПРОСТРАНЯЕТСЯ НА СЕКТОРА ИЛИ ДРУГИЕ РЕЖИМЫ ИГРЫ!\n\n[LIGHT_GRAY](Я бы хотел, чтобы это не было необходимо, но, по-видимому, это так)
mode.freebuild.name = Свободная\nстройка mode.freebuild.name = Свободная\nстройка
mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. mode.freebuild.description = ограниченные ресурсы и нет таймера для волн.
mode.pvp.name = Противо-\nстояние mode.pvp.name = Противо-\nстояние

View File

@@ -286,6 +286,7 @@ text.no = Hayir
text.info.title = [accent]Bilgi text.info.title = [accent]Bilgi
text.error.title = [crimson]Bir hata olustu text.error.title = [crimson]Bir hata olustu
text.error.crashtitle = Bir hata olustu text.error.crashtitle = Bir hata olustu
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Yapi bilgisi text.blocks.blockinfo = Yapi bilgisi
text.blocks.powercapacity = Guc kapasitesi text.blocks.powercapacity = Guc kapasitesi
text.blocks.powershot = Guc/Saldiri hizi text.blocks.powershot = Guc/Saldiri hizi
@@ -318,7 +319,8 @@ text.blocks.coolant = Sogutma sivisi
text.blocks.coolantuse = Sogutma sivi kullanimi text.blocks.coolantuse = Sogutma sivi kullanimi
text.blocks.inputliquidfuel = Yakit sivisi text.blocks.inputliquidfuel = Yakit sivisi
text.blocks.liquidfueluse = Sivi yakit kullanimi text.blocks.liquidfueluse = Sivi yakit kullanimi
text.blocks.explosive = Patlayici! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Can text.blocks.health = Can
text.blocks.inaccuracy = sekme text.blocks.inaccuracy = sekme
text.blocks.shots = vuruslar text.blocks.shots = vuruslar
@@ -343,6 +345,7 @@ text.category.liquids = sivilar
text.category.items = esyalar text.category.items = esyalar
text.category.crafting = uretim text.category.crafting = uretim
text.category.shooting = sikma text.category.shooting = sikma
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = Yok setting.fpscap.none = Yok
@@ -359,7 +362,6 @@ setting.sensitivity.name = Kumanda hassasligi
setting.saveinterval.name = Otomatik kaydetme suresi setting.saveinterval.name = Otomatik kaydetme suresi
setting.seconds = {0} Saniye setting.seconds = {0} Saniye
setting.fullscreen.name = Tam ekran setting.fullscreen.name = Tam ekran
setting.multithread.name = Parcaciklar
setting.fps.name = FPS'i goster setting.fps.name = FPS'i goster
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Guc lazerlerini goster setting.lasers.name = Guc lazerlerini goster
@@ -404,8 +406,6 @@ mode.waves.name = Dalgali
mode.waves.description = Klasik mod. Dalgalara karsi cekirdegi koru. mode.waves.description = Klasik mod. Dalgalara karsi cekirdegi koru.
mode.sandbox.name = Serbest mode.sandbox.name = Serbest
mode.sandbox.description = Sonsuz esyalar ve Dalga suresi yok mode.sandbox.description = Sonsuz esyalar ve Dalga suresi yok
mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.freebuild.name = Yapi Yapma mode.freebuild.name = Yapi Yapma
mode.freebuild.description = Sinirli esyalar ama dalga suresi yok. mode.freebuild.description = Sinirli esyalar ama dalga suresi yok.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = No
text.info.title = [Vurgu] Bilgi text.info.title = [Vurgu] Bilgi
text.error.title = [crimson] Bir hata oluştu text.error.title = [crimson] Bir hata oluştu
text.error.crashtitle = Bir hata oluştu text.error.crashtitle = Bir hata oluştu
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Blok Bilgisi text.blocks.blockinfo = Blok Bilgisi
text.blocks.powercapacity = Güç kapasitesi text.blocks.powercapacity = Güç kapasitesi
text.blocks.powershot = Güç / atış text.blocks.powershot = Güç / atış
@@ -318,7 +319,8 @@ text.blocks.coolant = Coolant
text.blocks.coolantuse = Coolant Use text.blocks.coolantuse = Coolant Use
text.blocks.inputliquidfuel = Fuel Liquid text.blocks.inputliquidfuel = Fuel Liquid
text.blocks.liquidfueluse = Liquid Fuel Use text.blocks.liquidfueluse = Liquid Fuel Use
text.blocks.explosive = Çok patlayıcı! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Can text.blocks.health = Can
text.blocks.inaccuracy = yanlışlık text.blocks.inaccuracy = yanlışlık
text.blocks.shots = atışlar text.blocks.shots = atışlar
@@ -343,6 +345,7 @@ text.category.liquids = Liquids
text.category.items = Items text.category.items = Items
text.category.crafting = Crafting text.category.crafting = Crafting
text.category.shooting = Shooting text.category.shooting = Shooting
text.category.optional = Optional Enhancements
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
@@ -359,7 +362,6 @@ setting.sensitivity.name = Denetleyici hassasiyeti
setting.saveinterval.name = Otomatik Kaydetme Aralığı setting.saveinterval.name = Otomatik Kaydetme Aralığı
setting.seconds = saniye setting.seconds = saniye
setting.fullscreen.name = Tam ekran setting.fullscreen.name = Tam ekran
setting.multithread.name = Çok iş parçacığı
setting.fps.name = Saniyede ... Kare göstermek setting.fps.name = Saniyede ... Kare göstermek
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Güç Lazerleri Göster setting.lasers.name = Güç Lazerleri Göster
@@ -404,8 +406,6 @@ mode.waves.name = dalgalar
mode.waves.description = normal mod. sınırlı kaynaklar ve otomatik gelen dalgalar. mode.waves.description = normal mod. sınırlı kaynaklar ve otomatik gelen dalgalar.
mode.sandbox.name = Limitsiz Oynama mode.sandbox.name = Limitsiz Oynama
mode.sandbox.description = sonsuz kaynaklar ve dalgalar için zamanlayıcı yok. mode.sandbox.description = sonsuz kaynaklar ve dalgalar için zamanlayıcı yok.
mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.freebuild.name = Özgür Oynama mode.freebuild.name = Özgür Oynama
mode.freebuild.description = sınırlı kaynaklar ve dalgalar için zamanlayıcı yok. mode.freebuild.description = sınırlı kaynaklar ve dalgalar için zamanlayıcı yok.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = Ні
text.info.title = [accent]Інформація text.info.title = [accent]Інформація
text.error.title = [crimson]Виникла помилка text.error.title = [crimson]Виникла помилка
text.error.crashtitle = Виникла помилка text.error.crashtitle = Виникла помилка
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = Інформація про блок text.blocks.blockinfo = Інформація про блок
text.blocks.powercapacity = Місткість енергії text.blocks.powercapacity = Місткість енергії
text.blocks.powershot = Енергія/постріл text.blocks.powershot = Енергія/постріл
@@ -318,7 +319,8 @@ text.blocks.coolant = Охолоджуюча рідина
text.blocks.coolantuse = Охолодж. рідини використовуеться text.blocks.coolantuse = Охолодж. рідини використовуеться
text.blocks.inputliquidfuel = Рідке паливо text.blocks.inputliquidfuel = Рідке паливо
text.blocks.liquidfueluse = Рідкого палива використовуеться text.blocks.liquidfueluse = Рідкого палива використовуеться
text.blocks.explosive = Вибухонебезпечний! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = Здоров'я text.blocks.health = Здоров'я
text.blocks.inaccuracy = Розкид text.blocks.inaccuracy = Розкид
text.blocks.shots = Постріли text.blocks.shots = Постріли
@@ -343,6 +345,7 @@ text.category.liquids = Рідинне
text.category.items = Елементи text.category.items = Елементи
text.category.crafting = Створення text.category.crafting = Створення
text.category.shooting = Стрільба text.category.shooting = Стрільба
text.category.optional = Optional Enhancements
setting.autotarget.name = Авто-ціль setting.autotarget.name = Авто-ціль
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
setting.fpscap.none = Необмежений setting.fpscap.none = Необмежений
@@ -359,7 +362,6 @@ setting.sensitivity.name = Чутливість контролера
setting.saveinterval.name = Інтервал автозбереження setting.saveinterval.name = Інтервал автозбереження
setting.seconds = {0} сек. setting.seconds = {0} сек.
setting.fullscreen.name = Повноекранний режим setting.fullscreen.name = Повноекранний режим
setting.multithread.name = Багатопотоковість (TPS)
setting.fps.name = Показати FPS setting.fps.name = Показати FPS
setting.vsync.name = Вертикальна синхронізація setting.vsync.name = Вертикальна синхронізація
setting.lasers.name = Показати енергетичні лазери setting.lasers.name = Показати енергетичні лазери
@@ -404,8 +406,6 @@ mode.waves.name = Хвилі
mode.waves.description = Нормальний режим. Обмежені ресурси та автоматичні хвилі. mode.waves.description = Нормальний режим. Обмежені ресурси та автоматичні хвилі.
mode.sandbox.name = Пісочниця mode.sandbox.name = Пісочниця
mode.sandbox.description = Нескінченні ресурси і нема таймера для хвиль. mode.sandbox.description = Нескінченні ресурси і нема таймера для хвиль.
mode.custom.warning = [scarlet]РОЗБЛОКОВАНЕ В КОРИСТУВАЛЬНИЦЬКИХ ІГРАХ АБО НА СЕРВЕРАХ НЕ ЗБЕРІГАЄТЬСЯ.\n\nГрайте у секторах для розблокування.
mode.custom.warning.read = Уважно прочитайте це!:\n[scarlet]РОЗБЛОКОВАНЕ В КОРИСТУВАЛЬНИЦЬКИХ ІГРАХ АБО В ІНШИХ РЕЖИМАХ ГРИ НЕ ПОШИРЮЄТЬСЯ НА СЕКТОРИ ТА ІНШІ РЕЖИМИ ГРИ!\n\n[LIGHT_GRAY](Я б хотів, щоб це не було необхідно, але, мабуть, це так)
mode.freebuild.name = Вільний режим mode.freebuild.name = Вільний режим
mode.freebuild.description = обмежені ресурси і немає таймера для хвиль. mode.freebuild.description = обмежені ресурси і немає таймера для хвиль.
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = 不
text.info.title = [accent]详情 text.info.title = [accent]详情
text.error.title = [crimson]发生了一个错误 text.error.title = [crimson]发生了一个错误
text.error.crashtitle = 发生了一个错误 text.error.crashtitle = 发生了一个错误
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = 方块详情 text.blocks.blockinfo = 方块详情
text.blocks.powercapacity = 能量容量 text.blocks.powercapacity = 能量容量
text.blocks.powershot = 能量/发射 text.blocks.powershot = 能量/发射
@@ -318,7 +319,8 @@ text.blocks.coolant = 冷却剂
text.blocks.coolantuse = 冷却剂使用速度 text.blocks.coolantuse = 冷却剂使用速度
text.blocks.inputliquidfuel = 液体燃料输入 text.blocks.inputliquidfuel = 液体燃料输入
text.blocks.liquidfueluse = 液体燃料使用速度 text.blocks.liquidfueluse = 液体燃料使用速度
text.blocks.explosive = 易爆炸! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = 生命值 text.blocks.health = 生命值
text.blocks.inaccuracy = 误差 text.blocks.inaccuracy = 误差
text.blocks.shots = 发射数 text.blocks.shots = 发射数
@@ -343,6 +345,7 @@ text.category.liquids = 液体
text.category.items = 物品 text.category.items = 物品
text.category.crafting = 制造 text.category.crafting = 制造
text.category.shooting = 发射 text.category.shooting = 发射
text.category.optional = Optional Enhancements
setting.autotarget.name = 自动发射 setting.autotarget.name = 自动发射
setting.fpscap.name = 最高 FPS setting.fpscap.name = 最高 FPS
setting.fpscap.none = setting.fpscap.none =
@@ -359,7 +362,6 @@ setting.sensitivity.name = 控制器灵敏度
setting.saveinterval.name = 自动保存间隔 setting.saveinterval.name = 自动保存间隔
setting.seconds = {0} 秒 setting.seconds = {0} 秒
setting.fullscreen.name = 全屏 setting.fullscreen.name = 全屏
setting.multithread.name = 多线程
setting.fps.name = 显示 FPS setting.fps.name = 显示 FPS
setting.vsync.name = 帧同步 setting.vsync.name = 帧同步
setting.lasers.name = 显示能量射线 setting.lasers.name = 显示能量射线
@@ -404,8 +406,6 @@ mode.waves.name = 普通
mode.waves.description = 普通模式,有限的资源和自动生成敌人。 mode.waves.description = 普通模式,有限的资源和自动生成敌人。
mode.sandbox.name = 沙盒 mode.sandbox.name = 沙盒
mode.sandbox.description = 无限的资源,不会自动生成敌人。 mode.sandbox.description = 无限的资源,不会自动生成敌人。
mode.custom.warning = 请注意,方块在区域内解锁之前,不能用于自定义游戏。\n\n[LIGHT_GRAY]如果您没有解锁任何方块,则不会出现任何方块。
mode.custom.warning.read = 确保你已经阅读过它:\n[scarlet]自定义游戏的解锁不带至区域或其他模式!\n\n[LIGHT_GRAY](我希望这不是必要的,但显然是必要的)
mode.freebuild.name = 自由建造 mode.freebuild.name = 自由建造
mode.freebuild.description = 有限的资源,不会自动生成敌人。 mode.freebuild.description = 有限的资源,不会自动生成敌人。
mode.pvp.name = PvP mode.pvp.name = PvP

View File

@@ -286,6 +286,7 @@ text.no = 否
text.info.title = [accent]資訊 text.info.title = [accent]資訊
text.error.title = [crimson]發生錯誤 text.error.title = [crimson]發生錯誤
text.error.crashtitle = 發生錯誤 text.error.crashtitle = 發生錯誤
text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = 方塊資訊 text.blocks.blockinfo = 方塊資訊
text.blocks.powercapacity = 蓄電量 text.blocks.powercapacity = 蓄電量
text.blocks.powershot = 能源/射擊 text.blocks.powershot = 能源/射擊
@@ -318,7 +319,8 @@ text.blocks.coolant = 冷卻劑
text.blocks.coolantuse = 使用冷卻劑 text.blocks.coolantuse = 使用冷卻劑
text.blocks.inputliquidfuel = 輸入液體燃料 text.blocks.inputliquidfuel = 輸入液體燃料
text.blocks.liquidfueluse = 使用液體燃料速度 text.blocks.liquidfueluse = 使用液體燃料速度
text.blocks.explosive = 容易爆炸! text.blocks.boostitem = Boost Item
text.blocks.boostliquid = Boost Liquid
text.blocks.health = 耐久度 text.blocks.health = 耐久度
text.blocks.inaccuracy = 誤差 text.blocks.inaccuracy = 誤差
text.blocks.shots = 射擊數 text.blocks.shots = 射擊數
@@ -343,6 +345,7 @@ text.category.liquids = 液體
text.category.items = 物品 text.category.items = 物品
text.category.crafting = 合成 text.category.crafting = 合成
text.category.shooting = 射擊 text.category.shooting = 射擊
text.category.optional = Optional Enhancements
setting.autotarget.name = 自動射擊 setting.autotarget.name = 自動射擊
setting.fpscap.name = 最大螢幕刷新率 setting.fpscap.name = 最大螢幕刷新率
setting.fpscap.none = 没有 setting.fpscap.none = 没有
@@ -359,7 +362,6 @@ setting.sensitivity.name = 控制器靈敏度
setting.saveinterval.name = 自動存檔間隔 setting.saveinterval.name = 自動存檔間隔
setting.seconds = {0}秒 setting.seconds = {0}秒
setting.fullscreen.name = 全螢幕 setting.fullscreen.name = 全螢幕
setting.multithread.name = 多執行緒
setting.fps.name = 顯示螢幕刷新率 setting.fps.name = 顯示螢幕刷新率
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
setting.lasers.name = 顯示雷射光束 setting.lasers.name = 顯示雷射光束
@@ -404,8 +406,6 @@ mode.waves.name = 一般
mode.waves.description = 一般模式,有限的資源與自動來襲的波次。 mode.waves.description = 一般模式,有限的資源與自動來襲的波次。
mode.sandbox.name = 沙盒 mode.sandbox.name = 沙盒
mode.sandbox.description = 無限的資源,與不倒數計時的波次。 mode.sandbox.description = 無限的資源,與不倒數計時的波次。
mode.custom.warning = 請注意,方塊在區域內解鎖之前,不能用於自訂遊戲。\n\n[LIGHT_GRAY]如果您沒有解鎖任何方塊,則不會出現任何方塊。
mode.custom.warning.read = 確保你已閱讀過它:\n[scarlet]自訂遊戲的解鎖不帶至區域或其他模式!\n\n[LIGHT_GRAY](我希望這不是必要的,但顯然是必要的)
mode.freebuild.name = 自由建造 mode.freebuild.name = 自由建造
mode.freebuild.description = 有限的資源,與不倒數計時的波次。 mode.freebuild.description = 有限的資源,與不倒數計時的波次。
mode.pvp.name = 對戰 mode.pvp.name = 對戰

View File

@@ -12,7 +12,6 @@ precision highp int;
uniform sampler2D u_texture; uniform sampler2D u_texture;
uniform vec2 u_texsize; uniform vec2 u_texsize;
uniform float u_time; uniform float u_time;
uniform float u_scaling;
uniform float u_dp; uniform float u_dp;
uniform vec2 u_offset; uniform vec2 u_offset;
@@ -28,7 +27,7 @@ void main() {
vec2 T = v_texCoord.xy; vec2 T = v_texCoord.xy;
vec2 coords = (T * u_texsize) + u_offset; vec2 coords = (T * u_texsize) + u_offset;
T += vec2(sin(coords.y / 3.0 + u_time / 20.0) / 240.0, sin(coords.x / 3.0 + u_time / 20.0) / 240.0) * u_scaling; T += vec2(sin(coords.y / 3.0 + u_time / 20.0), sin(coords.x / 3.0 + u_time / 20.0)) / u_texsize;
float si = sin(u_time / 20.0) / 8.0; float si = sin(u_time / 20.0) / 8.0;
vec4 color = texture2D(u_texture, T); vec4 color = texture2D(u_texture, T);

View File

@@ -33,6 +33,7 @@ public class Vars{
public static final String appName = "Mindustry"; public static final String appName = "Mindustry";
public static final String discordURL = "https://discord.gg/mindustry"; public static final String discordURL = "https://discord.gg/mindustry";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
public static final String contributorsURL = "https://api.github.com/repos/Anuken/Mindustry/contributors";
public static final String crashReportURL = "http://mindustry.us.to/report"; public static final String crashReportURL = "http://mindustry.us.to/report";
//time between waves in frames (on normal mode) //time between waves in frames (on normal mode)
public static final float wavespace = 60 * 60 * 1.5f; public static final float wavespace = 60 * 60 * 1.5f;
@@ -73,6 +74,7 @@ public class Vars{
}; };
//server port //server port
public static final int port = 6567; public static final int port = 6567;
public static boolean disableUI;
public static boolean testMobile; public static boolean testMobile;
//shorthand for whether or not this is running on android or ios //shorthand for whether or not this is running on android or ios
public static boolean mobile; public static boolean mobile;
@@ -80,6 +82,8 @@ public class Vars{
public static boolean android; public static boolean android;
//main data directory //main data directory
public static FileHandle dataDirectory; public static FileHandle dataDirectory;
//subdirectory for screenshots
public static FileHandle screenshotDirectory;
//directory for user-created map data //directory for user-created map data
public static FileHandle customMapDirectory; public static FileHandle customMapDirectory;
//save file directory //save file directory
@@ -170,6 +174,7 @@ public class Vars{
android = Gdx.app.getType() == ApplicationType.Android; android = Gdx.app.getType() == ApplicationType.Android;
dataDirectory = Settings.getDataDirectory(appName); dataDirectory = Settings.getDataDirectory(appName);
screenshotDirectory = dataDirectory.child("screenshots/");
customMapDirectory = dataDirectory.child("maps/"); customMapDirectory = dataDirectory.child("maps/");
saveDirectory = dataDirectory.child("saves/"); saveDirectory = dataDirectory.child("saves/");
baseCameraScale = Math.round(Unit.dp.scl(4)); baseCameraScale = Math.round(Unit.dp.scl(4));

View File

@@ -21,7 +21,6 @@ import io.anuke.ucore.util.ThreadArray;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
//TODO consider using quadtrees for finding specific types of blocks within an area //TODO consider using quadtrees for finding specific types of blocks within an area
//TODO maybe use Arrays instead of ObjectSets?
/**Class used for indexing special target blocks for AI.*/ /**Class used for indexing special target blocks for AI.*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -182,7 +182,7 @@ public class Pathfinder{
} }
} }
state.spawner.checkAllQuadrants(); world.spawner.checkAllQuadrants();
} }
class PathData{ class PathData{

View File

@@ -37,6 +37,7 @@ public class UnitTypes implements ContentList{
}; };
spirit = new UnitType("spirit", Spirit.class, Spirit::new){{ spirit = new UnitType("spirit", Spirit.class, Spirit::new){{
weapon = Weapons.healBlasterDrone;
isFlying = true; isFlying = true;
drag = 0.01f; drag = 0.01f;
speed = 0.2f; speed = 0.2f;

View File

@@ -7,7 +7,7 @@ import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.type.Weapon;
public class Weapons implements ContentList{ public class Weapons implements ContentList{
public static Weapon blaster, blasterSmall, glaiveBlaster, droneBlaster, healBlaster, chainBlaster, shockgun, public static Weapon blaster, blasterSmall, glaiveBlaster, droneBlaster, healBlaster, healBlasterDrone, chainBlaster, shockgun,
sapper, swarmer, bomber, bomberTrident, flakgun, flamethrower, missiles, artillery, laserBurster; sapper, swarmer, bomber, bomberTrident, flakgun, flamethrower, missiles, artillery, laserBurster;
@Override @Override
@@ -169,6 +169,16 @@ public class Weapons implements ContentList{
ejectEffect = Fx.none; ejectEffect = Fx.none;
ammo = AmmoTypes.lancerLaser; ammo = AmmoTypes.lancerLaser;
}}; }};
healBlasterDrone = new Weapon("heal-blaster"){{
length = 1.5f;
reload = 40f;
width = 0.5f;
roundrobin = true;
ejectEffect = Fx.none;
recoil = 2f;
ammo = AmmoTypes.healBlaster;
}};
} }
@Override @Override

View File

@@ -64,9 +64,9 @@ public class LiquidBlocks extends BlockList implements ContentList{
}}; }};
phaseConduit = new LiquidBridge("phase-conduit"){{ phaseConduit = new LiquidBridge("phase-conduit"){{
range = 11; range = 12;
hasPower = true; hasPower = true;
consumes.power(0.05f); consumes.power(0.03f);
}}; }};
} }
} }

View File

@@ -32,24 +32,13 @@ public class TurretBlocks extends BlockList implements ContentList{
hail = new ArtilleryTurret("hail"){{ hail = new ArtilleryTurret("hail"){{
ammoTypes = new AmmoType[]{AmmoTypes.artilleryDense, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary}; ammoTypes = new AmmoType[]{AmmoTypes.artilleryDense, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary};
reload = 70f; reload = 60f;
recoil = 2f; recoil = 2f;
range = 230f; range = 230f;
inaccuracy = 1f; inaccuracy = 1f;
shootCone = 10f; shootCone = 10f;
health = 120; health = 120;
}}; }};
/*
scatter = new BurstTurret("scatter"){{
ammoTypes = new AmmoType[]{AmmoTypes.flakCopper};
reload = 70f;
recoil = 2f;
shots = 3;
range = 220f;
inaccuracy = 2f;
shootCone = 40f;
health = 120;
}};*/
scorch = new LiquidTurret("scorch"){ scorch = new LiquidTurret("scorch"){
protected TextureRegion shootRegion; protected TextureRegion shootRegion;
@@ -117,11 +106,11 @@ public class TurretBlocks extends BlockList implements ContentList{
arc = new PowerTurret("arc"){{ arc = new PowerTurret("arc"){{
shootType = AmmoTypes.arc; shootType = AmmoTypes.arc;
reload = 55f; reload = 85f;
shootShake = 1f; shootShake = 1f;
shootCone = 40f; shootCone = 40f;
rotatespeed = 8f; rotatespeed = 8f;
powerUsed = 7f; powerUsed = 10f;
powerCapacity = 30f; powerCapacity = 30f;
range = 150f; range = 150f;
shootEffect = ShootFx.lightningShoot; shootEffect = ShootFx.lightningShoot;
@@ -132,7 +121,7 @@ public class TurretBlocks extends BlockList implements ContentList{
swarmer = new BurstTurret("swarmer"){{ swarmer = new BurstTurret("swarmer"){{
ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary, AmmoTypes.missileSurge}; ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary, AmmoTypes.missileSurge};
reload = 60f; reload = 50f;
shots = 4; shots = 4;
burstSpacing = 5; burstSpacing = 5;
inaccuracy = 10f; inaccuracy = 10f;
@@ -156,7 +145,7 @@ public class TurretBlocks extends BlockList implements ContentList{
size = 2; size = 2;
range = 120f; range = 120f;
ammoTypes = new AmmoType[]{AmmoTypes.bulletCopper, AmmoTypes.bulletDense, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon}; ammoTypes = new AmmoType[]{AmmoTypes.bulletCopper, AmmoTypes.bulletDense, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon};
reload = 40f; reload = 35f;
restitution = 0.03f; restitution = 0.03f;
ammoEjectBack = 3f; ammoEjectBack = 3f;
cooldown = 0.03f; cooldown = 0.03f;
@@ -216,7 +205,6 @@ public class TurretBlocks extends BlockList implements ContentList{
}}; }};
fuse = new ItemTurret("fuse"){{ fuse = new ItemTurret("fuse"){{
//TODO make it use power
ammoTypes = new AmmoType[]{AmmoTypes.fuseShotgun}; ammoTypes = new AmmoType[]{AmmoTypes.fuseShotgun};
reload = 50f; reload = 50f;
shootShake = 4f; shootShake = 4f;

View File

@@ -43,7 +43,7 @@ public class TurretBullets extends BulletList implements ContentList{
}; };
healBullet = new BulletType(5.2f, 13){ healBullet = new BulletType(5.2f, 13){
float healAmount = 21f; float healPercent = 3f;
{ {
hiteffect = BulletFx.hitLaser; hiteffect = BulletFx.hitLaser;
@@ -51,6 +51,11 @@ public class TurretBullets extends BulletList implements ContentList{
collidesTeam = true; collidesTeam = true;
} }
@Override
public boolean collides(Bullet b, Tile tile){
return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f;
}
@Override @Override
public void draw(Bullet b){ public void draw(Bullet b){
Draw.color(Palette.heal); Draw.color(Palette.heal);
@@ -67,8 +72,8 @@ public class TurretBullets extends BulletList implements ContentList{
tile = tile.target(); tile = tile.target();
if(tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ if(tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){
Effects.effect(BlockFx.healBlock, tile.drawx(), tile.drawy(), tile.block().size); Effects.effect(BlockFx.healBlockFull, Palette.heal, tile.drawx(), tile.drawy(), tile.block().size);
tile.entity.healBy(healAmount); tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth());
} }
} }
}; };
@@ -304,7 +309,7 @@ public class TurretBullets extends BulletList implements ContentList{
} }
}; };
arc = new BulletType(0.001f, 30){ arc = new BulletType(0.001f, 26){
{ {
lifetime = 1; lifetime = 1;
despawneffect = Fx.none; despawneffect = Fx.none;

View File

@@ -98,7 +98,7 @@ public class Control extends Module{
"color-1", Color.rgba8888(playerColors[11]), "color-1", Color.rgba8888(playerColors[11]),
"color-2", Color.rgba8888(playerColors[13]), "color-2", Color.rgba8888(playerColors[13]),
"color-3", Color.rgba8888(playerColors[9]), "color-3", Color.rgba8888(playerColors[9]),
"name", "player", "name", "",
"lastBuild", 0 "lastBuild", 0
); );
@@ -382,6 +382,10 @@ public class Control extends Module{
} }
} }
if(Inputs.keyTap("screenshot")){
renderer.takeMapScreenshot();
}
}else{ }else{
if(!state.isPaused()){ if(!state.isPaused()){
Timers.update(); Timers.update();

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.mindustry.ai.WaveSpawner;
import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.Difficulty;
import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.EventType.StateChangeEvent;
import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.GameMode;
@@ -12,14 +11,21 @@ import static io.anuke.mindustry.Vars.unitGroups;
import static io.anuke.mindustry.Vars.waveTeam; import static io.anuke.mindustry.Vars.waveTeam;
public class GameState{ public class GameState{
/**Current wave number, can be anything in non-wave modes.*/
public int wave = 1; public int wave = 1;
/**Wave countdown in ticks.*/
public float wavetime; public float wavetime;
/**Whether the game is in game over state.*/
public boolean gameOver = false; public boolean gameOver = false;
/**The current game mode.*/
public GameMode mode = GameMode.waves; public GameMode mode = GameMode.waves;
/**The current difficulty for wave modes.*/
public Difficulty difficulty = Difficulty.normal; public Difficulty difficulty = Difficulty.normal;
public WaveSpawner spawner = new WaveSpawner(); /**Team data. Gets reset every new game.*/
public Teams teams = new Teams(); public Teams teams = new Teams();
/**Number of enemies in the game; only used clientside in servers.*/
public int enemies; public int enemies;
/**Current game state.*/
private State state = State.menu; private State state = State.menu;
public int enemies(){ public int enemies(){

View File

@@ -93,7 +93,7 @@ public class Logic extends Module{
} }
public void runWave(){ public void runWave(){
state.spawner.spawnEnemies(); world.spawner.spawnEnemies();
state.wave++; state.wave++;
state.wavetime = wavespace * state.difficulty.timeScaling; state.wavetime = wavespace * state.difficulty.timeScaling;

View File

@@ -15,6 +15,7 @@ import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.entities.traits.TypeTrait; import io.anuke.mindustry.entities.traits.TypeTrait;
import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.gen.RemoteReadClient; import io.anuke.mindustry.gen.RemoteReadClient;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
@@ -95,6 +96,7 @@ public class NetClient extends Module{
ConnectPacket c = new ConnectPacket(); ConnectPacket c = new ConnectPacket();
c.name = player.name; c.name = player.name;
c.mobile = mobile; c.mobile = mobile;
c.versionType = Version.type;
c.color = Color.rgba8888(player.color); c.color = Color.rgba8888(player.color);
c.usid = getUsid(packet.addressTCP); c.usid = getUsid(packet.addressTCP);
c.uuid = Platform.instance.getUUID(); c.uuid = Platform.instance.getUUID();

View File

@@ -16,6 +16,7 @@ import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Version; import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
@@ -24,6 +25,7 @@ import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Administration.PlayerInfo; import io.anuke.mindustry.net.Administration.PlayerInfo;
import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
@@ -76,6 +78,9 @@ public class NetServer extends Module{
private DataOutputStream dataStream = new DataOutputStream(syncStream); private DataOutputStream dataStream = new DataOutputStream(syncStream);
public NetServer(){ public NetServer(){
Events.on(WorldLoadEvent.class, event -> {
connections.clear();
});
Net.handleServer(Connect.class, (id, connect) -> { Net.handleServer(Connect.class, (id, connect) -> {
if(admins.isIPBanned(connect.addressTCP)){ if(admins.isIPBanned(connect.addressTCP)){
@@ -120,7 +125,7 @@ public class NetServer extends Module{
return; return;
} }
if(packet.version == -1 && Version.build != -1 && !admins.allowsCustomClients()){ if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients())){
kick(id, KickReason.customClient); kick(id, KickReason.customClient);
return; return;
} }

View File

@@ -10,7 +10,6 @@ import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.Dialog;
import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.TextField;
import io.anuke.ucore.util.Log;
import java.util.Random; import java.util.Random;
@@ -29,7 +28,6 @@ public abstract class Platform {
if(!mobile) return; //this is mobile only, desktop doesn't need dialogs if(!mobile) return; //this is mobile only, desktop doesn't need dialogs
field.tapped(() -> { field.tapped(() -> {
Log.info("yappd");
Dialog dialog = new Dialog("", "dialog"); Dialog dialog = new Dialog("", "dialog");
dialog.setFillParent(true); dialog.setFillParent(true);
dialog.content().top(); dialog.content().top();

View File

@@ -1,9 +1,16 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.PixmapIO;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.BufferUtils;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
@@ -32,6 +39,7 @@ import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Surface; import io.anuke.ucore.graphics.Surface;
import io.anuke.ucore.modules.RendererModule; import io.anuke.ucore.modules.RendererModule;
import io.anuke.ucore.scene.utils.Cursors; import io.anuke.ucore.scene.utils.Cursors;
import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Pooling; import io.anuke.ucore.util.Pooling;
import io.anuke.ucore.util.Translator; import io.anuke.ucore.util.Translator;
@@ -353,4 +361,44 @@ public class Renderer extends RendererModule{
targetscale = Mathf.clamp(targetscale, Math.round(s * 2), Math.round(s * 5)); targetscale = Mathf.clamp(targetscale, Math.round(s * 2), Math.round(s * 5));
} }
public void takeMapScreenshot(){
float vpW = Core.camera.viewportWidth, vpH = Core.camera.viewportHeight;
int w = world.width()*tilesize, h = world.height()*tilesize;
int pw = pixelSurface.width(), ph = pixelSurface.height();
showFog = false;
disableUI = true;
pixelSurface.setSize(w, h, true);
Graphics.getEffectSurface().setSize(w, h, true);
Core.camera.viewportWidth = w;
Core.camera.viewportHeight = h;
Core.camera.position.x = w/2f;
Core.camera.position.y = h/2f;
draw();
showFog = true;
disableUI = false;
Core.camera.viewportWidth = vpW;
Core.camera.viewportHeight = vpH;
pixelSurface.getBuffer().begin();
byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true);
for(int i = 0; i < lines.length; i+= 4){
lines[i + 3] = (byte)255;
}
pixelSurface.getBuffer().end();
Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888);
BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length);
FileHandle file = screenshotDirectory.child("screenshot-" + TimeUtils.millis() + ".png");
PixmapIO.writePNG(file, fullPixmap);
fullPixmap.dispose();
pixelSurface.setSize(pw, ph, false);
Graphics.getEffectSurface().setSize(pw, ph, false);
ui.showInfoFade(Bundles.format("text.screenshot", file.toString()));
}
} }

View File

@@ -123,6 +123,8 @@ public class UI extends SceneModule{
@Override @Override
public void update(){ public void update(){
if(disableUI) return;
if(Graphics.drawing()) Graphics.end(); if(Graphics.drawing()) Graphics.end();
act(); act();

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
import io.anuke.mindustry.ai.BlockIndexer; import io.anuke.mindustry.ai.BlockIndexer;
import io.anuke.mindustry.ai.Pathfinder; import io.anuke.mindustry.ai.Pathfinder;
import io.anuke.mindustry.ai.WaveSpawner;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.game.EventType.TileChangeEvent; import io.anuke.mindustry.game.EventType.TileChangeEvent;
@@ -30,6 +31,7 @@ public class World extends Module{
public final WorldGenerator generator = new WorldGenerator(); public final WorldGenerator generator = new WorldGenerator();
public final BlockIndexer indexer = new BlockIndexer(); public final BlockIndexer indexer = new BlockIndexer();
public final Pathfinder pathfinder = new Pathfinder(); public final Pathfinder pathfinder = new Pathfinder();
public final WaveSpawner spawner = new WaveSpawner();
private Map currentMap; private Map currentMap;
private Sector currentSector; private Sector currentSector;

View File

@@ -17,6 +17,8 @@ import static io.anuke.mindustry.Vars.ui;
public enum EditorTool{ public enum EditorTool{
pick{ pick{
public void touched(MapEditor editor, int x, int y){ public void touched(MapEditor editor, int x, int y){
if(!Structs.inBounds(x, y, editor.getMap().width(), editor.getMap().height())) return;
byte bf = editor.getMap().read(x, y, DataPosition.floor); byte bf = editor.getMap().read(x, y, DataPosition.floor);
byte bw = editor.getMap().read(x, y, DataPosition.wall); byte bw = editor.getMap().read(x, y, DataPosition.wall);
byte link = editor.getMap().read(x, y, DataPosition.link); byte link = editor.getMap().read(x, y, DataPosition.link);

View File

@@ -175,7 +175,6 @@ public class MapView extends Element implements GestureListener{
public void clearStack(){ public void clearStack(){
stack.clear(); stack.clear();
//TODO clear und obuffer
} }
public OperationStack getStack(){ public OperationStack getStack(){
@@ -292,7 +291,6 @@ public class MapView extends Element implements GestureListener{
} }
} }
//todo is it really math.max?
float scaling = zoom * Math.min(width, height) / editor.getMap().width(); float scaling = zoom * Math.min(width, height) / editor.getMap().width();
Draw.color(Palette.accent); Draw.color(Palette.accent);

View File

@@ -19,10 +19,7 @@ import io.anuke.mindustry.graphics.Trail;
import io.anuke.mindustry.io.TypeIO; import io.anuke.mindustry.io.TypeIO;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection; import io.anuke.mindustry.net.NetConnection;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Mech;
import io.anuke.mindustry.type.Weapon;
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.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
@@ -192,6 +189,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
this.mining = tile; this.mining = tile;
} }
@Override
public boolean canMine(Item item){
return item.hardness <= mech.drillPower;
}
@Override @Override
public float getArmor(){ public float getArmor(){
return mech.armor + mech.getExtraArmor(this); return mech.armor + mech.getExtraArmor(this);

View File

@@ -209,7 +209,7 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
if(tile == null) return false; if(tile == null) return false;
tile = tile.target(); tile = tile.target();
if(tile.entity != null && tile.entity.collide(this) && !tile.entity.isDead() && (type.collidesTeam || tile.getTeam() != team)){ if(tile.entity != null && tile.entity.collide(this) && type.collides(this, tile) && !tile.entity.isDead() && (type.collidesTeam || tile.getTeam() != team)){
if(tile.getTeam() != team){ if(tile.getTeam() != team){
tile.entity.collision(this); tile.entity.collision(this);
} }

View File

@@ -55,6 +55,10 @@ public abstract class BulletType extends Content implements BaseBulletType<Bulle
despawneffect = BulletFx.hitBulletSmall; despawneffect = BulletFx.hitBulletSmall;
} }
public boolean collides(Bullet bullet, Tile tile){
return true;
}
public void hitTile(Bullet b, Tile tile){ public void hitTile(Bullet b, Tile tile){
hit(b); hit(b);
} }

View File

@@ -58,6 +58,9 @@ public interface BuilderTrait extends Entity{
/**Build power, can be any float. 1 = builds recipes in normal time, 0 = doesn't build at all.*/ /**Build power, can be any float. 1 = builds recipes in normal time, 0 = doesn't build at all.*/
float getBuildPower(Tile tile); float getBuildPower(Tile tile);
/**Returns whether or not this builder can mine a specific item type.*/
boolean canMine(Item item);
/**Whether this type of builder can begin creating new blocks.*/ /**Whether this type of builder can begin creating new blocks.*/
default boolean canCreateBlocks(){ default boolean canCreateBlocks(){
return true; return true;
@@ -236,7 +239,8 @@ public interface BuilderTrait extends Entity{
Tile tile = getMineTile(); Tile tile = getMineTile();
TileEntity core = unit.getClosestCore(); TileEntity core = unit.getClosestCore();
if(core == null || tile.block() != Blocks.air || unit.distanceTo(tile.worldx(), tile.worldy()) > mineDistance || tile.floor().drops == null || !unit.inventory.canAcceptItem(tile.floor().drops.item)){ if(core == null || tile.block() != Blocks.air || unit.distanceTo(tile.worldx(), tile.worldy()) > mineDistance
|| tile.floor().drops == null || !unit.inventory.canAcceptItem(tile.floor().drops.item) || !canMine(tile.floor().drops.item)){
setMineTile(null); setMineTile(null);
}else{ }else{
Item item = tile.floor().drops.item; Item item = tile.floor().drops.item;

View File

@@ -1,19 +0,0 @@
package io.anuke.mindustry.entities.traits;
import io.anuke.ucore.entities.trait.HealthTrait;
//TODO implement
public interface RepairTrait extends TeamTrait{
HealthTrait getRepairing();
void setRepairing(HealthTrait trait);
default void drawRepair(){
if(getRepairing() == null) return;
}
default void updateRepair(){
if(getRepairing() == null) return;
}
}

View File

@@ -19,7 +19,6 @@ import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
//TODO merge unit type with mech
public class UnitType extends UnlockableContent{ public class UnitType extends UnlockableContent{
protected final Supplier<? extends BaseUnit> constructor; protected final Supplier<? extends BaseUnit> constructor;

View File

@@ -1,14 +1,11 @@
package io.anuke.mindustry.entities.units.types; package io.anuke.mindustry.entities.units.types;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Queue; import com.badlogic.gdx.utils.Queue;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.fx.BlockFx;
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.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.entities.traits.BuilderTrait;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.FlyingUnit; import io.anuke.mindustry.entities.units.FlyingUnit;
import io.anuke.mindustry.entities.units.UnitCommand; import io.anuke.mindustry.entities.units.UnitCommand;
@@ -16,7 +13,6 @@ import io.anuke.mindustry.entities.units.UnitState;
import io.anuke.mindustry.game.EventType.BuildSelectEvent; import io.anuke.mindustry.game.EventType.BuildSelectEvent;
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.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.ItemType; import io.anuke.mindustry.type.ItemType;
@@ -24,13 +20,11 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.graphics.Shapes; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.*; import io.anuke.ucore.util.Structs;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -117,12 +111,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(target.distanceTo(Drone.this) > type.range){ if(target.distanceTo(Drone.this) > type.range){
circle(type.range*0.9f); circle(type.range*0.9f);
}else{ }else{
TileEntity entity = (TileEntity) target; getWeapon().update(Drone.this, target.getX(), target.getY());
entity.healBy(type.healSpeed * entity.tile.block().health / 100f * Timers.delta());
if(timer.get(timerRepairEffect, 30)){
Effects.effect(BlockFx.healBlockFull, Palette.heal, entity.x, entity.y, entity.tile.block().size);
}
} }
} }
}, },
@@ -279,6 +268,11 @@ public class Drone extends FlyingUnit implements BuilderTrait{
//no //no
} }
@Override
public boolean canMine(Item item){
return type.toMine.contains(item);
}
@Override @Override
public float getBuildPower(Tile tile){ public float getBuildPower(Tile tile){
return type.buildPower; return type.buildPower;
@@ -312,16 +306,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{
target = null; target = null;
} }
if(Net.client() && state.is(repair) && target instanceof TileEntity && target.distanceTo(this) < type.range){
TileEntity entity = (TileEntity) target;
entity.health += type.healSpeed * Timers.delta();
entity.health = Mathf.clamp(entity.health, 0, entity.tile.block().health);
if(timer.get(timerRepairEffect, 30)){
Effects.effect(BlockFx.healBlockFull, Palette.heal, entity.x, entity.y, entity.tile.block().size);
}
}
updateBuilding(this); updateBuilding(this);
} }
@@ -349,20 +333,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override @Override
public void drawOver(){ public void drawOver(){
trail.draw(Palette.lightTrail, 3f * Mathf.clamp(velocity.len(), 0, 1f) / 1f); trail.draw(Palette.lightTrail, 3f);
TargetTrait entity = target;
if(entity instanceof TileEntity && state.is(repair) && target.distanceTo(this) < type.range){
float len = 5f;
Draw.color(Color.BLACK, Color.WHITE, 0.95f + Mathf.absin(Timers.time(), 0.8f, 0.05f));
Shapes.laser("beam", "beam-end",
x + Angles.trnsx(rotation, len),
y + Angles.trnsy(rotation, len),
entity.getX(), entity.getY());
Draw.color();
}
drawBuilding(this); drawBuilding(this);
} }

View File

@@ -11,10 +11,10 @@ import java.io.IOException;
public class Version{ public class Version{
/**Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used.*/ /**Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used.*/
public static String type; public static String type;
/**Number specifying the major version, e.g. '4.0'*/
public static String number;
/**Build modifier, e.g. 'alpha' or 'release'*/ /**Build modifier, e.g. 'alpha' or 'release'*/
public static String modifier; public static String modifier;
/**Number specifying the major version, e.g. '4'*/
public static int number;
/**Build number, e.g. '43'. set to '-1' for custom builds.*/ /**Build number, e.g. '43'. set to '-1' for custom builds.*/
public static int build = 0; public static int build = 0;
@@ -26,7 +26,7 @@ public class Version{
PropertiesUtils.load(map, file.reader()); PropertiesUtils.load(map, file.reader());
type = map.get("type"); type = map.get("type");
number = map.get("number"); number = Integer.parseInt(map.get("number"));
modifier = map.get("modifier"); modifier = map.get("modifier");
build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1;
}catch(IOException e){ }catch(IOException e){

View File

@@ -23,7 +23,7 @@ import static io.anuke.ucore.core.Core.camera;
public class BlockRenderer{ public class BlockRenderer{
private final static int initialRequests = 32 * 32; private final static int initialRequests = 32 * 32;
private final static int expandr = 4; private final static int expandr = 6;
public final FloorRenderer floor = new FloorRenderer(); public final FloorRenderer floor = new FloorRenderer();

View File

@@ -157,17 +157,14 @@ public class Shaders{
@Override @Override
public void apply(){ public void apply(){
// shader.setUniformf("u_progress", progress);
shader.setUniformf("u_color", color); shader.setUniformf("u_color", color);
shader.setUniformf("u_uv", region.getU(), region.getV()); shader.setUniformf("u_uv", region.getU(), region.getV());
shader.setUniformf("u_uv2", region.getU2(), region.getV2()); shader.setUniformf("u_uv2", region.getU2(), region.getV2());
//shader.setUniformf("u_time", Timers.time());
shader.setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); shader.setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight());
} }
} }
public static class Shield extends Shader{ public static class Shield extends Shader{
//public Color color = new Color();
public Shield(){ public Shield(){
super("shield", "default"); super("shield", "default");
@@ -175,17 +172,13 @@ public class Shaders{
@Override @Override
public void apply(){ public void apply(){
float scaling = Core.cameraScale / 4f / Core.camera.zoom;
shader.setUniformf("u_dp", Unit.dp.scl(1f)); shader.setUniformf("u_dp", Unit.dp.scl(1f));
//shader.setUniformf("u_color", color);
shader.setUniformf("u_time", Timers.time() / Unit.dp.scl(1f)); shader.setUniformf("u_time", Timers.time() / Unit.dp.scl(1f));
shader.setUniformf("u_scaling", scaling);
shader.setUniformf("u_offset", shader.setUniformf("u_offset",
Core.camera.position.x - Core.camera.viewportWidth / 2 * Core.camera.zoom, Core.camera.position.x - Core.camera.viewportWidth / 2 * Core.camera.zoom,
Core.camera.position.y - Core.camera.viewportHeight / 2 * Core.camera.zoom); Core.camera.position.y - Core.camera.viewportHeight / 2 * Core.camera.zoom);
shader.setUniformf("u_texsize", Gdx.graphics.getWidth() / Core.cameraScale * Core.camera.zoom, shader.setUniformf("u_texsize", Core.camera.viewportWidth * Core.camera.zoom,
Gdx.graphics.getHeight() / Core.cameraScale * Core.camera.zoom); Core.camera.viewportHeight * Core.camera.zoom);
} }
} }
@@ -200,8 +193,8 @@ public class Shaders{
shader.setUniformf("camerapos", shader.setUniformf("camerapos",
Core.camera.position.x - Core.camera.viewportWidth / 2 * Core.camera.zoom, Core.camera.position.x - Core.camera.viewportWidth / 2 * Core.camera.zoom,
Core.camera.position.y - Core.camera.viewportHeight / 2 * Core.camera.zoom); Core.camera.position.y - Core.camera.viewportHeight / 2 * Core.camera.zoom);
shader.setUniformf("screensize", Gdx.graphics.getWidth() / Core.cameraScale * Core.camera.zoom, shader.setUniformf("screensize", Core.camera.viewportWidth* Core.camera.zoom,
Gdx.graphics.getHeight() / Core.cameraScale * Core.camera.zoom); Core.camera.viewportHeight * Core.camera.zoom);
shader.setUniformf("time", Timers.time()); shader.setUniformf("time", Timers.time());
} }
} }

View File

@@ -32,6 +32,7 @@ public class DefaultKeybinds{
"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,
"screenshot", Input.P,
new Category("multiplayer"), new Category("multiplayer"),
"player_list", Input.TAB, "player_list", Input.TAB,
"chat", Input.ENTER, "chat", Input.ENTER,

View File

@@ -193,7 +193,7 @@ public abstract class InputHandler extends InputAdapter{
} }
//call tapped event //call tapped event
if(tile.getTeam() == player.getTeam()){ if(!consumed && tile.getTeam() == player.getTeam()){
Call.onTileTapped(player, tile); Call.onTileTapped(player, tile);
} }

View File

@@ -230,7 +230,7 @@ public class MobileInput extends InputHandler implements GestureListener{
player.clearBuilding(); player.clearBuilding();
mode = none; mode = none;
recipe = null; recipe = null;
}).visible(() -> player.isBuilding() || recipe != null); }).visible(() -> player.isBuilding() || recipe != null || mode == breaking);
//confirm button //confirm button
table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> { table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> {
@@ -528,7 +528,7 @@ public class MobileInput extends InputHandler implements GestureListener{
//ignore off-screen taps //ignore off-screen taps
if(cursor == null || ui.hasMouse(x, y)) return false; if(cursor == null || ui.hasMouse(x, y)) return false;
threads.run(() -> checkTargets(worldx, worldy)); checkTargets(worldx, worldy);
//remove if request present //remove if request present
if(hasRequest(cursor)){ if(hasRequest(cursor)){
@@ -548,14 +548,13 @@ public class MobileInput extends InputHandler implements GestureListener{
consumed = true; consumed = true;
player.dropCarry(); //drop off unit player.dropCarry(); //drop off unit
}else{ }else{
threads.run(() -> { Unit unit = Units.getClosest(player.getTeam(), Graphics.world(x, y).x, Graphics.world(x, y).y, 4f, u -> !u.isFlying() && u.getMass() <= player.mech.carryWeight);
Unit unit = Units.getClosest(player.getTeam(), Graphics.world(x, y).x, Graphics.world(x, y).y, 4f, u -> !u.isFlying() && u.getMass() <= player.mech.carryWeight);
if(unit != null){ if(unit != null){
player.moveTarget = unit; consumed = true;
Effects.effect(Fx.select, unit.getX(), unit.getY()); player.moveTarget = unit;
} Effects.effect(Fx.select, unit.getX(), unit.getY());
}); }
} }
} }

View File

@@ -0,0 +1,43 @@
package io.anuke.mindustry.io;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.JsonReader;
import com.badlogic.gdx.utils.JsonValue;
import io.anuke.mindustry.net.Net;
import io.anuke.ucore.function.Consumer;
import static io.anuke.mindustry.Vars.contributorsURL;
public class Contributors{
public static void getContributors(Consumer<Array<Contributor>> success, Consumer<Throwable> fail){
Net.http(contributorsURL, "GET", result -> {
JsonReader reader = new JsonReader();
JsonValue value = reader.parse(result).child;
Array<Contributor> out = new Array<>();
while(value != null){
String login = value.getString("login");
out.add(new Contributor(login));
value = value.next;
}
success.accept(out);
}, fail);
}
public static class Contributor{
public final String login;
public Contributor(String login){
this.login = login;
}
@Override
public String toString(){
return "Contributor{" +
"login='" + login + '\'' +
'}';
}
}
}

View File

@@ -27,7 +27,6 @@ import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -332,31 +331,21 @@ public class TypeIO{
@WriteClass(String.class) @WriteClass(String.class)
public static void writeString(ByteBuffer buffer, String string){ public static void writeString(ByteBuffer buffer, String string){
if(string != null){ if(string != null){
Charset charset = Charset.defaultCharset(); byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
byte[] nameBytes = charset.name().getBytes(StandardCharsets.UTF_8);
buffer.put((byte)nameBytes.length);
buffer.put(nameBytes);
byte[] bytes = string.getBytes(charset);
buffer.putShort((short) bytes.length); buffer.putShort((short) bytes.length);
buffer.put(bytes); buffer.put(bytes);
}else{ }else{
buffer.put((byte) -1); buffer.putShort((short) -1);
} }
} }
@ReadClass(String.class) @ReadClass(String.class)
public static String readString(ByteBuffer buffer){ public static String readString(ByteBuffer buffer){
byte length = buffer.get(); short slength = buffer.getShort();
if(length != -1){ if(slength != -1){
byte[] cbytes = new byte[length];
buffer.get(cbytes);
Charset charset = Charset.forName(new String(cbytes, StandardCharsets.UTF_8));
short slength = buffer.getShort();
byte[] bytes = new byte[slength]; byte[] bytes = new byte[slength];
buffer.get(bytes); buffer.get(bytes);
return new String(bytes, charset); return new String(bytes, StandardCharsets.UTF_8);
}else{ }else{
return null; return null;
} }
@@ -378,30 +367,20 @@ public class TypeIO{
public static void writeStringData(DataOutput buffer, String string) throws IOException{ public static void writeStringData(DataOutput buffer, String string) throws IOException{
if(string != null){ if(string != null){
Charset charset = Charset.defaultCharset(); byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
byte[] nameBytes = charset.name().getBytes(StandardCharsets.UTF_8);
buffer.writeByte((byte)nameBytes.length);
buffer.write(nameBytes);
byte[] bytes = string.getBytes(charset);
buffer.writeShort((short) bytes.length); buffer.writeShort((short) bytes.length);
buffer.write(bytes); buffer.write(bytes);
}else{ }else{
buffer.writeByte((byte) -1); buffer.writeShort((short) -1);
} }
} }
public static String readStringData(DataInput buffer) throws IOException{ public static String readStringData(DataInput buffer) throws IOException{
byte length = buffer.readByte(); short slength = buffer.readShort();
if(length != -1){ if(slength != -1){
byte[] cbytes = new byte[length];
buffer.readFully(cbytes);
Charset charset = Charset.forName(new String(cbytes, StandardCharsets.UTF_8));
short slength = buffer.readShort();
byte[] bytes = new byte[slength]; byte[] bytes = new byte[slength];
buffer.readFully(bytes); buffer.readFully(bytes);
return new String(bytes, charset); return new String(bytes, StandardCharsets.UTF_8);
}else{ }else{
return null; return null;
} }

View File

@@ -45,7 +45,7 @@ public class Save16 extends SaveFileVersion{
content.setTemporaryMapper(readContentHeader(stream)); content.setTemporaryMapper(readContentHeader(stream));
state.spawner.read(stream); world.spawner.read(stream);
readEntities(stream); readEntities(stream);
@@ -71,7 +71,7 @@ public class Save16 extends SaveFileVersion{
writeContentHeader(stream); writeContentHeader(stream);
state.spawner.write(stream); //spawnes world.spawner.write(stream); //spawnes
//--ENTITIES-- //--ENTITIES--

View File

@@ -32,4 +32,13 @@ public class Map{
public String getDisplayName(){ public String getDisplayName(){
return meta.tags.get("name", name); return meta.tags.get("name", name);
} }
@Override
public String toString(){
return "Map{" +
"name='" + name + '\'' +
", custom=" + custom +
", meta=" + meta +
'}';
}
} }

View File

@@ -37,4 +37,13 @@ public class MapMeta{
public boolean hasOreGen(){ public boolean hasOreGen(){
return !tags.get("oregen", "0").equals("0"); return !tags.get("oregen", "0").equals("0");
} }
@Override
public String toString(){
return "MapMeta{" +
"tags=" + tags +
", width=" + width +
", height=" + height +
'}';
}
} }

View File

@@ -30,7 +30,7 @@ public class TutorialSector{
new ItemMission(Items.copper, 100).setMessage("$tutorial.morecopper"), new ItemMission(Items.copper, 100).setMessage("$tutorial.morecopper"),
new BlockMission(TurretBlocks.duo).setMessage("$tutorial.turret"), new BlockMission(TurretBlocks.duo).setMessage("$tutorial.turret"),
//TODO fill turret with items mission /
//new BlockMission(ProductionBlocks.mechanicalDrill).setMessage("$tutorial.drillturret"), //new BlockMission(ProductionBlocks.mechanicalDrill).setMessage("$tutorial.drillturret"),
// Create a wave mission which spawns the core at 60, 60 rather than in the center of the map // Create a wave mission which spawns the core at 60, 60 rather than in the center of the map

View File

@@ -30,7 +30,6 @@ public class Generation{
return tiles[x][y]; return tiles[x][y];
} }
//TODO implement
Item drillItem(int x, int y, Drill block){ Item drillItem(int x, int y, Drill block){
if(block.isMultiblock()){ if(block.isMultiblock()){
Item result = null; Item result = null;

View File

@@ -172,6 +172,25 @@ public class WorldGenerator{
prepareTiles(tiles); prepareTiles(tiles);
for(int x = 0; x < width; x++){
for(int y = 0; y < height; y++){
Tile tile = tiles[x][y];
byte elevation = tile.getElevation();
for(GridPoint2 point : Geometry.d4){
if(!Structs.inBounds(x + point.x, y + point.y, width, height)) continue;
if(tiles[x + point.x][y + point.y].getElevation() < elevation){
if(sim2.octaveNoise2D(1, 1, 1.0 / 8, x, y) > 0.8){
tile.setElevation(-1);
}
break;
}
}
}
}
world.setBlock(tiles[spawns.get(0).x][spawns.get(0).y], StorageBlocks.core, Team.blue); world.setBlock(tiles[spawns.get(0).x][spawns.get(0).y], StorageBlocks.core, Team.blue);
if(state.mode.isPvp){ if(state.mode.isPvp){

View File

@@ -356,12 +356,13 @@ public class Net{
Gdx.net.sendHttpRequest(req, new HttpResponseListener(){ Gdx.net.sendHttpRequest(req, new HttpResponseListener(){
@Override @Override
public void handleHttpResponse(HttpResponse httpResponse){ public void handleHttpResponse(HttpResponse httpResponse){
listener.accept(httpResponse.getResultAsString()); String result = httpResponse.getResultAsString();
Gdx.app.postRunnable(() -> listener.accept(result));
} }
@Override @Override
public void failed(Throwable t){ public void failed(Throwable t){
failure.accept(t); Gdx.app.postRunnable(() -> failure.accept(t));
} }
@Override @Override

View File

@@ -2,7 +2,7 @@ package io.anuke.mindustry.net;
import com.badlogic.gdx.utils.Base64Coder; import com.badlogic.gdx.utils.Base64Coder;
import io.anuke.mindustry.game.Version; import io.anuke.mindustry.game.Version;
import io.anuke.ucore.io.IOUtils; import io.anuke.mindustry.io.TypeIO;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -65,6 +65,7 @@ public class Packets{
public static class ConnectPacket implements Packet{ public static class ConnectPacket implements Packet{
public int version; public int version;
public String versionType;
public String name, uuid, usid; public String name, uuid, usid;
public boolean mobile; public boolean mobile;
public int color; public int color;
@@ -72,8 +73,9 @@ public class Packets{
@Override @Override
public void write(ByteBuffer buffer){ public void write(ByteBuffer buffer){
buffer.putInt(Version.build); buffer.putInt(Version.build);
IOUtils.writeString(buffer, name); TypeIO.writeString(buffer, versionType);
IOUtils.writeString(buffer, usid); TypeIO.writeString(buffer, name);
TypeIO.writeString(buffer, usid);
buffer.put(mobile ? (byte) 1 : 0); buffer.put(mobile ? (byte) 1 : 0);
buffer.putInt(color); buffer.putInt(color);
buffer.put(Base64Coder.decode(uuid)); buffer.put(Base64Coder.decode(uuid));
@@ -82,8 +84,9 @@ public class Packets{
@Override @Override
public void read(ByteBuffer buffer){ public void read(ByteBuffer buffer){
version = buffer.getInt(); version = buffer.getInt();
name = IOUtils.readString(buffer); versionType = TypeIO.readString(buffer);
usid = IOUtils.readString(buffer); name = TypeIO.readString(buffer);
usid = TypeIO.readString(buffer);
mobile = buffer.get() == 1; mobile = buffer.get() == 1;
color = buffer.getInt(); color = buffer.getInt();
byte[] idbytes = new byte[8]; byte[] idbytes = new byte[8];

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.type; package io.anuke.mindustry.type;
/** /**Used to store ammo amounts in turrets.*/
* Used to store ammo amounts in units and turrets.
*/
public class AmmoEntry{ public class AmmoEntry{
public AmmoType type; public AmmoType type;
public int amount; public int amount;

View File

@@ -11,7 +11,6 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
//TODO merge unit type with mech
public class Mech extends UnlockableContent{ public class Mech extends UnlockableContent{
public final String name; public final String name;
public final String description; public final String description;

View File

@@ -2,7 +2,11 @@ package io.anuke.mindustry.ui.dialogs;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.io.Contributors;
import io.anuke.mindustry.io.Contributors.Contributor;
import io.anuke.mindustry.ui.Links; import io.anuke.mindustry.ui.Links;
import io.anuke.mindustry.ui.Links.LinkEntry; import io.anuke.mindustry.ui.Links.LinkEntry;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
@@ -18,11 +22,14 @@ import static io.anuke.mindustry.Vars.ios;
import static io.anuke.mindustry.Vars.ui; import static io.anuke.mindustry.Vars.ui;
public class AboutDialog extends FloatingDialog{ public class AboutDialog extends FloatingDialog{
private Array<Contributor> contributors = new Array<>();
private static ObjectSet<String> bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds", "trello"); private static ObjectSet<String> bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds", "trello");
public AboutDialog(){ public AboutDialog(){
super("$text.about.button"); super("$text.about.button");
Contributors.getContributors(out -> contributors = out, Throwable::printStackTrace);
shown(this::setup); shown(this::setup);
onResize(this::setup); onResize(this::setup);
} }
@@ -94,7 +101,24 @@ public class AboutDialog extends FloatingDialog{
public void showCredits(){ public void showCredits(){
FloatingDialog dialog = new FloatingDialog("$text.credits"); FloatingDialog dialog = new FloatingDialog("$text.credits");
dialog.addCloseButton(); dialog.addCloseButton();
dialog.content().labelWrap("$text.credits.text").width(400f); dialog.content().add("$text.credits.text");
dialog.content().row();
if(!contributors.isEmpty()){
dialog.content().addImage("blank").color(Palette.accent).fillX().height(3f).pad(3f);
dialog.content().row();
dialog.content().add("$text.contributors");
dialog.content().row();
dialog.content().pane("clear", new Table(){{
int i = 0;
left();
for(Contributor c : contributors){
add("[lightgray]" + c.login).left().pad(3).padLeft(6).padRight(6);
if(++i % 3 == 0){
row();
}
}
}});
}
dialog.show(); dialog.show();
} }
} }

View File

@@ -28,7 +28,6 @@ public class HostDialog extends FloatingDialog{
content().table(t -> { content().table(t -> {
t.add("$text.name").padRight(10); t.add("$text.name").padRight(10);
t.addField(Settings.getString("name"), text -> { t.addField(Settings.getString("name"), text -> {
if(text.isEmpty()) return;
player.name = text; player.name = text;
Settings.put("name", text); Settings.put("name", text);
Settings.save(); Settings.save();
@@ -50,6 +49,11 @@ public class HostDialog extends FloatingDialog{
content().add().width(65f); content().add().width(65f);
content().addButton("$text.host", () -> { content().addButton("$text.host", () -> {
if(Settings.getString("name").trim().isEmpty()){
ui.showInfo("$text.noname");
return;
}
ui.loadfrag.show("$text.hosting"); ui.loadfrag.show("$text.hosting");
Timers.runTask(5f, () -> { Timers.runTask(5f, () -> {
try{ try{

View File

@@ -205,7 +205,6 @@ public class JoinDialog extends FloatingDialog{
content().table(t -> { content().table(t -> {
t.add("$text.name").padRight(10); t.add("$text.name").padRight(10);
t.addField(Settings.getString("name"), text -> { t.addField(Settings.getString("name"), text -> {
if(text.isEmpty()) return;
player.name = text; player.name = text;
Settings.put("name", text); Settings.put("name", text);
Settings.save(); Settings.save();
@@ -285,6 +284,11 @@ public class JoinDialog extends FloatingDialog{
} }
void connect(String ip, int port){ void connect(String ip, int port){
if(Settings.getString("name").trim().isEmpty()){
ui.showInfo("$text.noname");
return;
}
ui.loadfrag.show("$text.connecting"); ui.loadfrag.show("$text.connecting");
ui.loadfrag.setButton(() -> { ui.loadfrag.setButton(() -> {

View File

@@ -1,5 +1,7 @@
package io.anuke.mindustry.ui.fragments; package io.anuke.mindustry.ui.fragments;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.BitmapFont;
@@ -8,13 +10,13 @@ import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.Vars; 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.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.Group;
import io.anuke.ucore.scene.ui.Dialog;
import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.Label;
import io.anuke.ucore.scene.ui.Label.LabelStyle; import io.anuke.ucore.scene.ui.Label.LabelStyle;
import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.TextField;
@@ -22,8 +24,7 @@ import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.players; import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.ucore.core.Core.scene; import static io.anuke.ucore.core.Core.scene;
import static io.anuke.ucore.core.Core.skin; import static io.anuke.ucore.core.Core.skin;
@@ -113,9 +114,35 @@ public class ChatFragment extends Table{
chatfield.getStyle().font = skin.getFont("default-font-chat"); chatfield.getStyle().font = skin.getFont("default-font-chat");
chatfield.getStyle().fontColor = Color.WHITE; chatfield.getStyle().fontColor = Color.WHITE;
chatfield.setStyle(chatfield.getStyle()); chatfield.setStyle(chatfield.getStyle());
Platform.instance.addDialog(chatfield, Vars.maxTextLength);
bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(4f); if(mobile){
chatfield.tapped(() -> {
Dialog dialog = new Dialog("", "dialog");
dialog.setFillParent(true);
dialog.content().top();
dialog.content().defaults().height(65f);
TextField to = dialog.content().addField("", t-> {}).pad(15).width(250f).get();
to.setMaxLength(maxTextLength);
to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick());
dialog.content().addButton("$text.ok", () -> {
chatfield.clearText();
chatfield.appendText(to.getText());
chatfield.change();
dialog.hide();
Gdx.input.setOnscreenKeyboardVisible(false);
toggle();
}).width(90f).name("okb");
dialog.show();
Timers.runTask(1f, () -> {
to.setCursorPosition(to.getText().length());
Core.scene.setKeyboardFocus(to);
Gdx.input.setOnscreenKeyboardVisible(true);
});
});
}
bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(6f);
add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28);
@@ -123,10 +150,6 @@ public class ChatFragment extends Table{
marginBottom(105f); marginBottom(105f);
marginRight(240f); marginRight(240f);
} }
if(Vars.mobile){
addImageButton("icon-arrow-right", 14 * 2, this::toggle).size(46f, 51f).visible(() -> chatOpen).pad(2f);
}
} }
@Override @Override

View File

@@ -11,6 +11,7 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.Group;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Strings;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -42,7 +43,7 @@ public class MenuFragment extends Fragment{
} }
//version info //version info
parent.fill(c -> c.bottom().left().add("Mindustry " + Version.number + "-" + Version.modifier + " " + Version.type + " / " + (Version.build == -1 ? "custom build" : "build " + Version.build)) parent.fill(c -> c.bottom().left().add(Strings.formatArgs("Mindustry v{0} {1}-{2} {3}", Version.number, Version.modifier, Version.type, (Version.build == -1 ? "custom build" : "build " + Version.build)))
.visible(() -> state.is(State.menu))); .visible(() -> state.is(State.menu)));
} }
@@ -55,14 +56,14 @@ public class MenuFragment extends Fragment{
container.defaults().size(size).pad(5).padTop(4f); container.defaults().size(size).pad(5).padTop(4f);
MobileButton MobileButton
play = new MobileButton("icon-play-2", isize, "$text.play", this::showPlaySelect), play = new MobileButton("icon-play-2", isize, "$text.play", this::showPlaySelect),
maps = new MobileButton("icon-map", isize, "$text.maps", ui.maps::show), maps = new MobileButton("icon-map", isize, "$text.maps", ui.maps::show),
load = new MobileButton("icon-load", isize, "$text.load", ui.load::show), load = new MobileButton("icon-load", isize, "$text.load", ui.load::show),
join = new MobileButton("icon-add", isize, "$text.joingame", ui.join::show), join = new MobileButton("icon-add", isize, "$text.joingame", ui.join::show),
editor = new MobileButton("icon-editor", isize, "$text.editor", () -> ui.loadGraphics(ui.editor::show)), editor = new MobileButton("icon-editor", isize, "$text.editor", () -> ui.loadGraphics(ui.editor::show)),
tools = new MobileButton("icon-tools", isize, "$text.settings", ui.settings::show), tools = new MobileButton("icon-tools", isize, "$text.settings", ui.settings::show),
unlocks = new MobileButton("icon-unlocks", isize, "$text.unlocks", ui.unlocks::show), unlocks = new MobileButton("icon-unlocks", isize, "$text.unlocks", ui.unlocks::show),
donate = new MobileButton("icon-donate", isize, "$text.donate", Platform.instance::openDonations); donate = new MobileButton("icon-donate", isize, "$text.donate", Platform.instance::openDonations);
if(Gdx.graphics.getWidth() > Gdx.graphics.getHeight()){ if(Gdx.graphics.getWidth() > Gdx.graphics.getHeight()){
container.add(play); container.add(play);

View File

@@ -2,6 +2,7 @@ package io.anuke.mindustry.ui.fragments;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent; import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
@@ -33,7 +34,7 @@ public class PlacementFragment extends Fragment{
Category currentCategory = Category.turret; Category currentCategory = Category.turret;
Block hovered, lastDisplay; Block hovered, lastDisplay;
Tile hoverTile; Tile hoverTile;
Table blockTable, toggler; Table blockTable, toggler, topTable;
boolean shown = true; boolean shown = true;
public PlacementFragment(){ public PlacementFragment(){
@@ -106,6 +107,7 @@ public class PlacementFragment extends Fragment{
//top table with hover info //top table with hover info
frame.table("clear", top -> { frame.table("clear", top -> {
topTable = top;
top.add(new Table()).growX().update(topTable -> { top.add(new Table()).growX().update(topTable -> {
if((tileDisplayBlock() == null && lastDisplay == getSelected()) || if((tileDisplayBlock() == null && lastDisplay == getSelected()) ||
(tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return; (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return;
@@ -194,8 +196,10 @@ public class PlacementFragment extends Fragment{
Block getSelected(){ Block getSelected(){
Block toDisplay = null; Block toDisplay = null;
Vector2 v = topTable.stageToLocalCoordinates(Graphics.mouse());
//setup hovering tile //setup hovering tile
if(!ui.hasMouse()){ if(!ui.hasMouse() && topTable.hit(v.x, v.y, false) == null){
Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y); Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y);
if(tile != null){ if(tile != null){
hoverTile = tile.target(); hoverTile = tile.target();

View File

@@ -43,7 +43,7 @@ public abstract class BaseBlock extends MappableContent{
/**Returns the amount of items this block can accept.*/ /**Returns the amount of items this block can accept.*/
public int acceptStack(Item item, int amount, Tile tile, Unit source){ public int acceptStack(Item item, int amount, Tile tile, Unit source){
if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){ if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){
return Math.min(getMaximumAccepted(tile, item), amount); return Math.min(getMaximumAccepted(tile, item) - tile.entity.items.get(item), amount);
}else{ }else{
return 0; return 0;
} }

View File

@@ -150,7 +150,7 @@ public class Block extends BaseBlock {
TileEntity entity = tile.entity(); TileEntity entity = tile.entity();
for(Tile other : getPowerConnections(tile, tempTiles)){ for(Tile other : getPowerConnections(tile, tempTiles)){
if(other.entity.power != null){ if(other.entity.power != null && other.entity.power.graph != null){
other.entity.power.graph.add(entity.power.graph); other.entity.power.graph.add(entity.power.graph);
} }
} }
@@ -331,7 +331,6 @@ public class Block extends BaseBlock {
if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity, StatUnit.items); if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity, StatUnit.items);
} }
//TODO make this easier to config.
public void setBars(){ public void setBars(){
if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity));
if(hasLiquids) if(hasLiquids)

View File

@@ -241,7 +241,7 @@ public class Tile implements PosTrait, TargetTrait{
if(link == 0){ if(link == 0){
return (block.destructible || block.breakable || block.update); return (block.destructible || block.breakable || block.update);
}else{ }else{
return getLinked() != this && getLinked().breakable(); return getLinked() != this && getLinked().getLinked() == null && getLinked().breakable();
} }
} }

View File

@@ -191,7 +191,7 @@ public class Floor extends Block{
if(floor instanceof OreBlock) floor = ((OreBlock) floor).base; if(floor instanceof OreBlock) floor = ((OreBlock) floor).base;
if(cur instanceof OreBlock) cur = ((OreBlock) cur).base; if(cur instanceof OreBlock) cur = ((OreBlock) cur).base;
if((floor.id <= cur.id && !(tile.getElevation() != -1 && other.getElevation() > tile.getElevation())) || (!cur.blends.test(floor) && !cur.tileBlends.test(tile, other)) || (floor.cacheLayer.ordinal() > cur.cacheLayer.ordinal() && !sameLayer) || if(floor.edgeRegions == null || (floor.id <= cur.id && !(tile.getElevation() != -1 && other.getElevation() > tile.getElevation())) || (!cur.blends.test(floor) && !cur.tileBlends.test(tile, other)) || (floor.cacheLayer.ordinal() > cur.cacheLayer.ordinal() && !sameLayer) ||
(sameLayer && floor.cacheLayer == cur.cacheLayer)) continue; (sameLayer && floor.cacheLayer == cur.cacheLayer)) continue;
TextureRegion region = floor.edgeRegions[i]; TextureRegion region = floor.edgeRegions[i];

View File

@@ -95,8 +95,11 @@ public class MendProjector extends Block{
@Override @Override
public void drawSelect(Tile tile){ public void drawSelect(Tile tile){
MendEntity entity = tile.entity();
float realRange = range + entity.phaseHeat * phaseRangeBoost;
Draw.color(color); Draw.color(color);
Lines.dashCircle(tile.drawx(), tile.drawy() - 1f, range); Lines.dashCircle(tile.drawx(), tile.drawy(), realRange);
Draw.color(); Draw.color();
} }

View File

@@ -1,58 +0,0 @@
package io.anuke.mindustry.world.blocks.defense;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.defense.DeflectorWall.DeflectorEntity;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.tilesize;
public class MendingWall extends Wall{
protected float regenSpeed = 0.25f;
public MendingWall(String name){
super(name);
update = true;
}
@Override
public void handleBulletHit(TileEntity entity, Bullet bullet){
super.handleBulletHit(entity, bullet);
((DeflectorEntity) entity).hit = 1f;
}
@Override
public void draw(Tile tile){
super.draw(tile);
DeflectorEntity entity = tile.entity();
if(entity.hit < 0.0001f) return;
Graphics.setAdditiveBlending();
Draw.color(Color.WHITE);
Draw.alpha(entity.hit * 0.5f);
Draw.rect("blank", tile.drawx(), tile.drawy(), tilesize * size, tilesize * size);
Draw.reset();
entity.hit = Mathf.clamp(entity.hit - Timers.delta() / DeflectorWall.hitTime);
Graphics.setNormalBlending();
}
@Override
public void update(Tile tile){
tile.entity.health = Mathf.clamp(tile.entity.health + regenSpeed * Timers.delta(), 0f, health);
}
@Override
public TileEntity newEntity(){
return new DeflectorEntity();
}
}

View File

@@ -36,6 +36,7 @@ public class OverdriveProjector extends Block{
protected float speedBoost = 1.5f; protected float speedBoost = 1.5f;
protected float speedBoostPhase = 0.75f; protected float speedBoostPhase = 0.75f;
protected float useTime = 400f; protected float useTime = 400f;
protected float phaseRangeBoost = 20f;
public OverdriveProjector(String name){ public OverdriveProjector(String name){
super(name); super(name);
@@ -66,7 +67,7 @@ public class OverdriveProjector extends Block{
} }
if(entity.charge >= reload){ if(entity.charge >= reload){
float realRange = range + entity.phaseHeat * 20f; float realRange = range + entity.phaseHeat * phaseRangeBoost;
float realBoost = speedBoost + entity.phaseHeat*speedBoostPhase; float realBoost = speedBoost + entity.phaseHeat*speedBoostPhase;
Effects.effect(BlockFx.overdriveWave, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange); Effects.effect(BlockFx.overdriveWave, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange);
@@ -97,8 +98,11 @@ public class OverdriveProjector extends Block{
@Override @Override
public void drawSelect(Tile tile){ public void drawSelect(Tile tile){
OverdriveEntity entity = tile.entity();
float realRange = range + entity.phaseHeat * phaseRangeBoost;
Draw.color(color); Draw.color(color);
Lines.dashCircle(tile.drawx(), tile.drawy() - 1f, range); Lines.dashCircle(tile.drawx(), tile.drawy(), realRange);
Draw.color(); Draw.color();
} }

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.world.blocks.distribution; package io.anuke.mindustry.world.blocks.distribution;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.NumberUtils; import com.badlogic.gdx.utils.NumberUtils;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
@@ -8,10 +7,9 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.util.Bits; import io.anuke.ucore.util.Bits;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.content;
public class Junction extends Block{ public class Junction extends Block{
protected float speed = 26; //frames taken to go through this junction protected float speed = 26; //frames taken to go through this junction
@@ -34,8 +32,8 @@ public class Junction extends Block{
public void update(Tile tile){ public void update(Tile tile){
JunctionEntity entity = tile.entity(); JunctionEntity entity = tile.entity();
for(int i = 0; i < 2; i++){ for(int i = 0; i < 4; i++){
Buffer buffer = (i == 0 ? entity.bx : entity.by); Buffer buffer = entity.buffers[i];
if(buffer.index > 0){ if(buffer.index > 0){
if(buffer.index > buffer.items.length) buffer.index = buffer.items.length; if(buffer.index > buffer.items.length) buffer.index = buffer.items.length;
@@ -44,17 +42,11 @@ public class Junction extends Block{
if(Timers.time() >= time + speed || Timers.time() < time){ if(Timers.time() >= time + speed || Timers.time() < time){
int val = Bits.getRightInt(l); Item item = content.item(Bits.getRightInt(l));
Tile dest = tile.getNearby(i);
Item item = content.item(Bits.getLeftShort(val));
int direction = Bits.getRightShort(val);
Tile dest = tile.getNearby(direction);
//skip blocks that don't want the item, keep waiting until they do
if(dest == null || !dest.block().acceptItem(item, dest, tile)){ if(dest == null || !dest.block().acceptItem(item, dest, tile)){
if(buffer.index > 1 && Bits.getRightShort(Bits.getRightInt(buffer.items[1])) != direction){
System.arraycopy(buffer.items, 1, buffer.items, 0, buffer.index - 1);
buffer.index--;
}
continue; continue;
} }
@@ -69,25 +61,19 @@ public class Junction extends Block{
@Override @Override
public void handleItem(Item item, Tile tile, Tile source){ public void handleItem(Item item, Tile tile, Tile source){
JunctionEntity entity = tile.entity(); JunctionEntity entity = tile.entity();
boolean x = tile.x == source.x; long value = Bits.packLong(NumberUtils.floatToIntBits(Timers.time()), item.id);
long value = Bits.packLong(NumberUtils.floatToIntBits(Timers.time()), Bits.packInt((short) item.id, source.relativeTo(tile.x, tile.y))); int relative = source.relativeTo(tile.x, tile.y);
if(x){ entity.buffers[relative].add(value);
entity.bx.add(value);
}else{
entity.by.add(value);
}
} }
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
JunctionEntity entity = tile.entity(); JunctionEntity entity = tile.entity();
boolean x = tile.x == source.x; int relative = source.relativeTo(tile.x, tile.y);
if(entity == null || entity.bx == null || entity.by == null || (x && entity.bx.full()) || (!x && entity.by.full())) if(entity == null || relative == -1 || entity.buffers[relative].full())
return false; return false;
int dir = source.relativeTo(tile.x, tile.y); Tile to = tile.getNearby(relative);
if(dir == -1) return false;
Tile to = tile.getNearby(dir);
return to != null && to.block().acceptItem(item, to, tile); return to != null && to.block().acceptItem(item, to, tile);
} }
@@ -96,41 +82,8 @@ public class Junction extends Block{
return new JunctionEntity(); return new JunctionEntity();
} }
@Override
public Array<Object> getDebugInfo(Tile tile){
JunctionEntity entity = tile.entity();
Array<Object> arr = super.getDebugInfo(tile);
for(int i = 0; i < 4; i++){
arr.add("nearby." + i);
arr.add(tile.getNearby(i));
}
Consumer<Buffer> write = b -> {
for(int i = 0; i < b.index; i++){
long l = b.items[i];
float time = NumberUtils.intBitsToFloat(Bits.getLeftInt(l));
int val = Bits.getRightInt(l);
Item item = content.item(Bits.getLeftShort(val));
int direction = Bits.getRightShort(val);
Tile dest = tile.getNearby(direction);
arr.add(" bufferx.item");
arr.add(time + " | " + item.name + " | " + dest.block() + ":" + dest.floor());
}
};
arr.add("buffer.bx");
arr.add(entity.bx.index);
write.accept(entity.bx);
arr.add("buffer.by");
arr.add(entity.bx.index);
write.accept(entity.by);
return arr;
}
class JunctionEntity extends TileEntity{ class JunctionEntity extends TileEntity{
Buffer bx = new Buffer(); Buffer[] buffers = {new Buffer(), new Buffer(), new Buffer(), new Buffer()};
Buffer by = new Buffer();
} }
class Buffer{ class Buffer{

View File

@@ -4,7 +4,6 @@ import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
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.gen.Call;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -13,13 +12,17 @@ import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.mindustry.gen.Call;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
import java.io.IOException; import java.io.IOException;
import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.threads;
public class Sorter extends Block implements SelectionTrait{ public class Sorter extends Block implements SelectionTrait{
private static Item lastItem;
public Sorter(String name){ public Sorter(String name){
super(name); super(name);
@@ -35,6 +38,13 @@ public class Sorter extends Block implements SelectionTrait{
return true; return true;
} }
@Override
public void playerPlaced(Tile tile){
if(lastItem != null){
threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem));
}
}
@Remote(targets = Loc.both, called = Loc.both, forward = true) @Remote(targets = Loc.both, called = Loc.both, forward = true)
public static void setSorterItem(Player player, Tile tile, Item item){ public static void setSorterItem(Player player, Tile tile, Item item){
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
@@ -45,8 +55,6 @@ public class Sorter extends Block implements SelectionTrait{
public void draw(Tile tile){ public void draw(Tile tile){
super.draw(tile); super.draw(tile);
//TODO call event for change
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
Draw.color(entity.sortItem.color); Draw.color(entity.sortItem.color);
@@ -110,7 +118,10 @@ public class Sorter extends Block implements SelectionTrait{
@Override @Override
public void buildTable(Tile tile, Table table){ public void buildTable(Tile tile, Table table){
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
buildItemTable(table, () -> entity.sortItem, item -> Call.setSorterItem(null, tile, item)); buildItemTable(table, () -> entity.sortItem, item -> {
lastItem = item;
Call.setSorterItem(null, tile, item);
});
} }
@Override @Override

View File

@@ -5,7 +5,6 @@ import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
@@ -30,7 +29,6 @@ public abstract class ItemLiquidGenerator extends ItemGenerator{
@Override @Override
public void init(){ public void init(){
super.init(); super.init();
stats.remove(BlockStat.liquidFuelUse);
} }
@Override @Override

View File

@@ -4,7 +4,6 @@ import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumeLiquid; import io.anuke.mindustry.world.consumers.ConsumeLiquid;
//TODO
public class TurbineGenerator extends BurnerGenerator{ public class TurbineGenerator extends BurnerGenerator{
public TurbineGenerator(String name){ public TurbineGenerator(String name){

View File

@@ -42,7 +42,7 @@ public class Cultivator extends Drill{
stats.remove(BlockStat.drillTier); stats.remove(BlockStat.drillTier);
stats.add(BlockStat.drillTier, table -> { stats.add(BlockStat.drillTier, table -> {
table.addImage("grass1").size(8 * 3).padBottom(3).padTop(3); table.addImage("grass1").size(8 * 3).padBottom(3).padTop(3);
// TODO: find out localized name and add tool tip table.add(Blocks.grass.formalName).padLeft(3);
}); });
} }

View File

@@ -21,6 +21,7 @@ public class LiquidMixer extends LiquidBlock{
hasItems = true; hasItems = true;
rotate = false; rotate = false;
solid = true; solid = true;
singleLiquid = false;
outputsLiquid = true; outputsLiquid = true;
} }

View File

@@ -152,11 +152,6 @@ public class Smelter extends Block{
Effects.effect(craftEffect, flameColor, tile.drawx(), tile.drawy()); Effects.effect(craftEffect, flameColor, tile.drawx(), tile.drawy());
} }
@Override
public int getMaximumAccepted(Tile tile, Item item){
return itemCapacity;
}
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
boolean isInput = false; boolean isInput = false;

View File

@@ -11,8 +11,8 @@ import io.anuke.ucore.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.mobile; import static io.anuke.mindustry.Vars.mobile;
public abstract class Consume{ public abstract class Consume{
private boolean optional; protected boolean optional;
private boolean update = true; protected boolean update = true;
public Consume optional(boolean optional){ public Consume optional(boolean optional){
this.optional = optional; this.optional = optional;

View File

@@ -53,6 +53,6 @@ public class ConsumeItem extends Consume{
@Override @Override
public void display(BlockStats stats){ public void display(BlockStats stats){
stats.add(BlockStat.inputItem, item); stats.add(optional ? BlockStat.boostItem : BlockStat.inputItem, item);
} }
} }

View File

@@ -58,6 +58,6 @@ public class ConsumeItemFilter extends Consume{
@Override @Override
public void display(BlockStats stats){ public void display(BlockStats stats){
stats.add(BlockStat.inputItems, new ItemFilterValue(filter)); stats.add(optional ? BlockStat.boostItem : BlockStat.inputItem, new ItemFilterValue(filter));
} }
} }

View File

@@ -44,6 +44,6 @@ public class ConsumeItems extends Consume{
@Override @Override
public void display(BlockStats stats){ public void display(BlockStats stats){
stats.add(BlockStat.inputItems, new ItemListValue(items)); stats.add(optional ? BlockStat.boostItem : BlockStat.inputItems, new ItemListValue(items));
} }
} }

View File

@@ -32,7 +32,7 @@ public class ConsumeLiquid extends Consume{
@Override @Override
public String getIcon(){ public String getIcon(){
return "icon-liquid"; return "icon-liquid-small";
} }
@Override @Override
@@ -47,8 +47,12 @@ public class ConsumeLiquid extends Consume{
@Override @Override
public void display(BlockStats stats){ public void display(BlockStats stats){
stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond); if(!optional){
stats.add(BlockStat.inputLiquid, liquid); stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond);
stats.add(BlockStat.inputLiquid, liquid);
}else{
stats.add(BlockStat.boostLiquid, liquid);
}
} }
float use(Block block, TileEntity entity){ float use(Block block, TileEntity entity){

View File

@@ -47,7 +47,7 @@ public class ConsumeLiquidFilter extends Consume{
@Override @Override
public String getIcon(){ public String getIcon(){
return "icon-liquid"; return "icon-liquid-small";
} }
@Override @Override
@@ -62,10 +62,12 @@ public class ConsumeLiquidFilter extends Consume{
@Override @Override
public void display(BlockStats stats){ public void display(BlockStats stats){
if(isFuel){ if(optional){
stats.add(BlockStat.boostLiquid, new LiquidFilterValue(filter));
}else if(isFuel){
stats.add(BlockStat.inputLiquidFuel, new LiquidFilterValue(filter)); stats.add(BlockStat.inputLiquidFuel, new LiquidFilterValue(filter));
stats.add(BlockStat.liquidFuelUse, 60f * use, StatUnit.liquidSecond); stats.add(BlockStat.liquidFuelUse, 60f * use, StatUnit.liquidSecond);
}else{ }else {
stats.add(BlockStat.inputLiquid, new LiquidFilterValue(filter)); stats.add(BlockStat.inputLiquid, new LiquidFilterValue(filter));
stats.add(BlockStat.liquidUse, 60f * use, StatUnit.liquidSecond); stats.add(BlockStat.liquidUse, 60f * use, StatUnit.liquidSecond);
} }

View File

@@ -21,7 +21,7 @@ public class ConsumePower extends Consume{
@Override @Override
public String getIcon(){ public String getIcon(){
return "icon-power"; return "icon-power-small";
} }
@Override @Override

View File

@@ -45,8 +45,10 @@ public enum BlockStat{
shots(StatCategory.shooting), shots(StatCategory.shooting),
reload(StatCategory.shooting), reload(StatCategory.shooting),
powerShot(StatCategory.shooting), powerShot(StatCategory.shooting),
targetsAir(StatCategory.shooting),; targetsAir(StatCategory.shooting),
boostItem(StatCategory.optional),
boostLiquid(StatCategory.optional),;
public final StatCategory category; public final StatCategory category;

View File

@@ -12,9 +12,7 @@ import io.anuke.ucore.util.Log;
import java.util.Locale; import java.util.Locale;
/** /**Hold and organizes a list of block stats.*/
* Hold and organizes a list of block stats.
*/
public class BlockStats{ public class BlockStats{
private static final boolean errorWhenMissing = false; private static final boolean errorWhenMissing = false;
@@ -26,52 +24,37 @@ public class BlockStats{
this.block = block; this.block = block;
} }
/** /**Adds a single float value with this stat, formatted to 2 decimal places.*/
* Adds a single float value with this stat, formatted to 2 decimal places.
*/
public void add(BlockStat stat, float value, StatUnit unit){ public void add(BlockStat stat, float value, StatUnit unit){
add(stat, new NumberValue(value, unit)); add(stat, new NumberValue(value, unit));
} }
/** /**Adds a single y/n boolean value.*/
* Adds a single y/n boolean value.
*/
public void add(BlockStat stat, boolean value){ public void add(BlockStat stat, boolean value){
add(stat, new BooleanValue(value)); add(stat, new BooleanValue(value));
} }
/** /**Adds an item value.*/
* Adds an item value.
*/
public void add(BlockStat stat, Item item){ public void add(BlockStat stat, Item item){
add(stat, new ItemValue(new ItemStack(item, 1))); add(stat, new ItemValue(new ItemStack(item, 1)));
} }
/** /**Adds a liquid value.*/
* Adds a liquid value.
*/
public void add(BlockStat stat, Liquid liquid){ public void add(BlockStat stat, Liquid liquid){
add(stat, new LiquidValue(liquid)); add(stat, new LiquidValue(liquid));
} }
/**Adds an item value.*/
/**
* Adds an item value.
*/
public void add(BlockStat stat, ItemStack item){ public void add(BlockStat stat, ItemStack item){
add(stat, new ItemValue(item)); add(stat, new ItemValue(item));
} }
/** /**Adds a single string value with this stat.*/
* Adds a single string value with this stat.
*/
public void add(BlockStat stat, String format, Object... args){ public void add(BlockStat stat, String format, Object... args){
add(stat, new StringValue(format, args)); add(stat, new StringValue(format, args));
} }
/** /**Adds a stat value.*/
* Adds a stat value.
*/
public void add(BlockStat stat, StatValue value){ public void add(BlockStat stat, StatValue value){
if(!Bundles.has("text.blocks." + stat.name().toLowerCase(Locale.ROOT))){ if(!Bundles.has("text.blocks." + stat.name().toLowerCase(Locale.ROOT))){
if(!errorWhenMissing){ if(!errorWhenMissing){
@@ -102,6 +85,7 @@ public class BlockStats{
dirty = true; dirty = true;
} }
/**Removes a stat, if it exists.*/
public void remove(BlockStat stat){ public void remove(BlockStat stat){
if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){ if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){
throw new RuntimeException("No stat entry found: \"" + stat + "\" in block '" + block.name + "'!"); throw new RuntimeException("No stat entry found: \"" + stat + "\" in block '" + block.name + "'!");

View File

@@ -1,13 +1,12 @@
package io.anuke.mindustry.world.meta; package io.anuke.mindustry.world.meta;
/** /**A specific category for a stat.*/
* A specific category for a stat.
*/
public enum StatCategory{ public enum StatCategory{
general, general,
power, power,
liquids, liquids,
items, items,
crafting, crafting,
shooting shooting,
optional,
} }

Some files were not shown because too many files have changed in this diff Show More