diff --git a/.gitignore b/.gitignore index cfa73a21a5..20247e61be 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ logs/ /core/assets/locales /ios/src/io/anuke/mindustry/gen/ /core/src/io/anuke/mindustry/gen/ +ios/robovm.properties *.gif version.properties diff --git a/.travis.yml b/.travis.yml index c8349974ea..c0f4f1a5e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ jdk: - openjdk8 script: - "./gradlew test" -- "./gradlew desktop:dist" -- "./gradlew server:dist" +- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" +- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" deploy: provider: releases diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index b0e4475812..8fdb041fc7 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -20,7 +20,7 @@ diff --git a/android/build.gradle b/android/build.gradle index e7790fb299..eecd23ce01 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -93,7 +93,7 @@ android { applicationId "io.anuke.mindustry" minSdkVersion 14 - targetSdkVersion 27 + targetSdkVersion 28 versionCode code versionName versionNameResult } diff --git a/android/res/layout/gdxdialogs_inputtext.xml b/android/res/layout/gdxdialogs_inputtext.xml deleted file mode 100755 index 0341a7d385..0000000000 --- a/android/res/layout/gdxdialogs_inputtext.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index ff729c7227..c75b6af249 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -27,7 +27,6 @@ import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.ucore.function.Consumer; -import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Strings; @@ -52,11 +51,6 @@ public class AndroidLauncher extends PatchedAndroidApplication{ config.useImmersiveMode = true; Platform.instance = new Platform(){ - @Override - public void addDialog(TextField field, int length){ - TextFieldDialogListener.add(field, 0, length); - } - @Override public void openDonations(){ showDonations(); diff --git a/android/src/io/anuke/mindustry/AndroidTextFieldDialog.java b/android/src/io/anuke/mindustry/AndroidTextFieldDialog.java deleted file mode 100644 index 381bd7573f..0000000000 --- a/android/src/io/anuke/mindustry/AndroidTextFieldDialog.java +++ /dev/null @@ -1,119 +0,0 @@ -package io.anuke.mindustry; - - -import android.app.Activity; -import android.app.AlertDialog; -import android.text.InputFilter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.WindowManager.LayoutParams; -import android.widget.EditText; -import com.badlogic.gdx.Gdx; - -public class AndroidTextFieldDialog{ - private Activity activity; - private EditText userInput; - private AlertDialog.Builder builder; - private TextPromptListener listener; - private boolean isBuild; - - public AndroidTextFieldDialog(){ - this.activity = (Activity) Gdx.app; - load(); - } - - public AndroidTextFieldDialog show(){ - - activity.runOnUiThread(() -> { - AlertDialog dialog = builder.create(); - - dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); - - dialog.show(); - - }); - - return this; - } - - private AndroidTextFieldDialog load(){ - - activity.runOnUiThread(() -> { - - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); - LayoutInflater li = LayoutInflater.from(activity); - - View promptsView = li.inflate(getResourceId("gdxdialogs_inputtext", "layout"), null); - - alertDialogBuilder.setView(promptsView); - - userInput = promptsView.findViewById(getResourceId("gdxDialogsEditTextInput", "id")); - - alertDialogBuilder.setCancelable(false); - builder = alertDialogBuilder; - - isBuild = true; - }); - - // Wait till TextPrompt is built. - while(!isBuild){ - try{ - Thread.sleep(10); - }catch(InterruptedException ignored){ - } - } - - return this; - } - - public int getResourceId(String pVariableName, String pVariableType){ - try{ - return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName()); - }catch(Exception e){ - Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName - + " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?"); - e.printStackTrace(); - return -1; - } - } - - public AndroidTextFieldDialog setText(CharSequence value){ - userInput.append(value); - return this; - } - - public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label){ - builder.setNegativeButton(label, (dialog, id) -> dialog.cancel()); - return this; - } - - public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label){ - builder.setPositiveButton(label, (dialog, id) -> { - if(listener != null && !userInput.getText().toString().isEmpty()){ - listener.confirm(userInput.getText().toString()); - } - - }); - return this; - } - - public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener){ - this.listener = listener; - return this; - } - - public AndroidTextFieldDialog setInputType(int type){ - userInput.setInputType(type); - return this; - } - - public AndroidTextFieldDialog setMaxLength(int length){ - userInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)}); - return this; - } - - public interface TextPromptListener{ - void confirm(String text); - } - -} diff --git a/android/src/io/anuke/mindustry/DonationsActivity.java b/android/src/io/anuke/mindustry/DonationsActivity.java index 0a868f8ed3..09b6a6b12f 100644 --- a/android/src/io/anuke/mindustry/DonationsActivity.java +++ b/android/src/io/anuke/mindustry/DonationsActivity.java @@ -68,7 +68,6 @@ public class DonationsActivity extends FragmentActivity{ Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment"); if(fragment != null){ fragment.onActivityResult(requestCode, resultCode, data); - //TODO donation event, set settings? } } } diff --git a/android/src/io/anuke/mindustry/TextFieldDialogListener.java b/android/src/io/anuke/mindustry/TextFieldDialogListener.java deleted file mode 100644 index c603fbff05..0000000000 --- a/android/src/io/anuke/mindustry/TextFieldDialogListener.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.anuke.mindustry; - - -import android.text.InputType; -import com.badlogic.gdx.Application.ApplicationType; -import com.badlogic.gdx.Gdx; -import io.anuke.ucore.scene.event.ChangeListener; -import io.anuke.ucore.scene.event.ClickListener; -import io.anuke.ucore.scene.event.InputEvent; -import io.anuke.ucore.scene.event.InputListener; -import io.anuke.ucore.scene.ui.TextField; - -public class TextFieldDialogListener extends ClickListener{ - private TextField field; - private int type; - private int max; - - //type - 0 is text, 1 is numbers, 2 is decimals - public TextFieldDialogListener(TextField field, int type, int max){ - this.field = field; - this.type = type; - this.max = max; - } - - public static void add(TextField field, int type, int max){ - field.addListener(new TextFieldDialogListener(field, type, max)); - field.addListener(new InputListener(){ - public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){ - Gdx.input.setOnscreenKeyboardVisible(false); - return false; - } - }); - } - - public static void add(TextField field){ - add(field, 0, 16); - } - - public void clicked(final InputEvent event, float x, float y){ - - if(Gdx.app.getType() == ApplicationType.Desktop) return; - - AndroidTextFieldDialog dialog = new AndroidTextFieldDialog(); - - dialog.setTextPromptListener(text -> - Gdx.app.postRunnable(() -> { - field.clearText(); - field.appendText(text); - field.fire(new ChangeListener.ChangeEvent()); - Gdx.graphics.requestRendering(); - })); - - if(type == 0){ - dialog.setInputType(InputType.TYPE_CLASS_TEXT); - }else if(type == 1){ - dialog.setInputType(InputType.TYPE_CLASS_NUMBER); - }else if(type == 2){ - dialog.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); - } - - dialog.setConfirmButtonLabel("OK").setText(field.getText()); - dialog.setCancelButtonLabel("Cancel"); - dialog.setMaxLength(max); - dialog.show(); - event.cancel(); - - } -} diff --git a/build.gradle b/build.gradle index f77d2ff19a..f54b84eb8c 100644 --- a/build.gradle +++ b/build.gradle @@ -19,13 +19,13 @@ allprojects { version = 'release' ext { - versionNumber = '4.0' + versionNumber = '4' versionModifier = 'alpha' versionType = 'official' appName = 'Mindustry' - gdxVersion = '1.9.8' + gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = '2385d794f2cd3db2fb25d320f2223fa2148c25a0' + uCoreVersion = '09e13f973a0769d971316d1d4f4a1eef3570926f' getVersionString = { String buildVersion = getBuildVersion() @@ -110,17 +110,35 @@ project(":ios") { include "**/*.java" } - into "ios/src/io/anuke/mindustry/gen" + into "core/src/io/anuke/mindustry/gen" } doFirst{ 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 { compile project(":core") diff --git a/core/assets-raw/sprites/blocks/production/alloy-fuser.png b/core/assets-raw/sprites/blocks/production/alloy-fuser.png deleted file mode 100644 index 19815de0ff..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/alloy-fuser.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-crafting.png b/core/assets-raw/sprites/ui/icons-category/icon-crafting.png new file mode 100644 index 0000000000..80447efca8 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-crafting.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-defense.png b/core/assets-raw/sprites/ui/icons-category/icon-defense.png new file mode 100644 index 0000000000..f0b4cabdad Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-defense.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-distribution.png b/core/assets-raw/sprites/ui/icons-category/icon-distribution.png new file mode 100644 index 0000000000..18233d41c0 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-distribution.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-effect.png b/core/assets-raw/sprites/ui/icons-category/icon-effect.png new file mode 100644 index 0000000000..5da7498a1f Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-effect.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-liquid.png b/core/assets-raw/sprites/ui/icons-category/icon-liquid.png new file mode 100644 index 0000000000..4d4142213b Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-liquid.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-power.png b/core/assets-raw/sprites/ui/icons-category/icon-power.png new file mode 100644 index 0000000000..5df68ce22b Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-power.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-production.png b/core/assets-raw/sprites/ui/icons-category/icon-production.png new file mode 100644 index 0000000000..0735582732 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-production.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-turret.png b/core/assets-raw/sprites/ui/icons-category/icon-turret.png new file mode 100644 index 0000000000..3ed23cf8b8 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-turret.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-units.png b/core/assets-raw/sprites/ui/icons-category/icon-units.png new file mode 100644 index 0000000000..b907051a23 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-units.png differ diff --git a/core/assets-raw/sprites/ui/icons-category/icon-upgrade.png b/core/assets-raw/sprites/ui/icons-category/icon-upgrade.png new file mode 100644 index 0000000000..6f054ad8d0 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons-category/icon-upgrade.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-crafting.png b/core/assets-raw/sprites/ui/icons/icon-crafting.png deleted file mode 100644 index 2a20c39b0b..0000000000 Binary files a/core/assets-raw/sprites/ui/icons/icon-crafting.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons/icon-defense.png b/core/assets-raw/sprites/ui/icons/icon-defense.png deleted file mode 100644 index 6e440a647a..0000000000 Binary files a/core/assets-raw/sprites/ui/icons/icon-defense.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons/icon-distribution.png b/core/assets-raw/sprites/ui/icons/icon-distribution.png deleted file mode 100644 index 858ba9bd3f..0000000000 Binary files a/core/assets-raw/sprites/ui/icons/icon-distribution.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons/icon-liquid.png b/core/assets-raw/sprites/ui/icons/icon-liquid-small.png similarity index 100% rename from core/assets-raw/sprites/ui/icons/icon-liquid.png rename to core/assets-raw/sprites/ui/icons/icon-liquid-small.png diff --git a/core/assets-raw/sprites/ui/icons/icon-power.png b/core/assets-raw/sprites/ui/icons/icon-power-small.png similarity index 100% rename from core/assets-raw/sprites/ui/icons/icon-power.png rename to core/assets-raw/sprites/ui/icons/icon-power-small.png diff --git a/core/assets-raw/sprites/ui/icons/icon-production.png b/core/assets-raw/sprites/ui/icons/icon-production.png deleted file mode 100644 index 8e1d914691..0000000000 Binary files a/core/assets-raw/sprites/ui/icons/icon-production.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons/icon-units.png b/core/assets-raw/sprites/ui/icons/icon-units.png deleted file mode 100644 index 5a7846974d..0000000000 Binary files a/core/assets-raw/sprites/ui/icons/icon-units.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons/icon-weapon.png b/core/assets-raw/sprites/ui/icons/icon-weapon.png deleted file mode 100644 index e59ec4582d..0000000000 Binary files a/core/assets-raw/sprites/ui/icons/icon-weapon.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/text-sides-down.png b/core/assets-raw/sprites/ui/text-sides-down.png deleted file mode 100644 index e3eb6b1708..0000000000 Binary files a/core/assets-raw/sprites/ui/text-sides-down.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/text-sides-over.png b/core/assets-raw/sprites/ui/text-sides-over.png deleted file mode 100644 index 110491b4d4..0000000000 Binary files a/core/assets-raw/sprites/ui/text-sides-over.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/text-sides.png b/core/assets-raw/sprites/ui/text-sides.png deleted file mode 100644 index 30e3c43031..0000000000 Binary files a/core/assets-raw/sprites/ui/text-sides.png and /dev/null differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index ee3722141f..29a8ff14a0 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -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.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.github.description = Game source code text.link.dev-builds.description = Unstable development builds @@ -8,27 +9,25 @@ 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.google-play.description = Google Play store listing text.link.wiki.description = Official Mindustry wiki -text.linkfail = Failed to open link\!\nThe URL has been copied to your clipboard. -text.editor.web = The web version does not support the editor\!\nDownload the game to use it. -text.web.unsupported = The web version does not support this feature\! Download the game to use it. +text.linkfail = Failed to open link!\nThe URL has been copied to your clipboard. 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.retry = Retry -text.highscore = [accent]New highscore\! +text.highscore = [accent]New highscore! 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.map.delete = Are you sure you want to delete the map "[accent]{0}[]"? 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.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.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.showagain = Don't show again next session -text.coreattack = < Core is under attack\! > +text.coreattack = < Core is under attack! > text.unlocks = Unlocks text.savegame = Save Game text.loadgame = Load Game @@ -36,19 +35,19 @@ text.joingame = Join Game text.addplayers = Add/Remove Players text.customgame = Custom Game text.sectors = Sectors -text.sector = Sector\: [LIGHT_GRAY]{0} -text.sector.time = Time\: [LIGHT_GRAY]{0} +text.sector = Sector: [LIGHT_GRAY]{0} +text.sector.time = Time: [LIGHT_GRAY]{0} text.sector.deploy = Deploy 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.locked = [scarlet][[Incomplete] text.sector.unexplored = [accent][[Unexplored] -text.missions = Missions\:[LIGHT_GRAY] {0} -text.mission = Mission\:[LIGHT_GRAY] {0} -text.mission.main = Main Mission\:[LIGHT_GRAY] {0} +text.missions = Missions:[LIGHT_GRAY] {0} +text.mission = Mission:[LIGHT_GRAY] {0} +text.mission.main = Main Mission:[LIGHT_GRAY] {0} 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.wave = Survive[accent] {0}/{1} []waves\nWave in {2} text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies @@ -56,12 +55,12 @@ text.mission.wave.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy text.mission.wave.menu = Survive[accent] {0}[] waves text.mission.battle = Destroy enemy core 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.unit = Create {0} Unit text.mission.command = Send Command {0} To Units 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.create = Create[accent] {0}[] text.none = @@ -70,29 +69,30 @@ text.quit = Quit text.maps = Maps text.continue = Continue 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.name = Name\: -text.filename = File Name\: -text.unlocked = New Block Unlocked\! -text.unlocked.plural = New Blocks Unlocked\! +text.name = Name: +text.noname = Pick a[accent] player name[] first. +text.filename = File Name: +text.unlocked = New Block Unlocked! +text.unlocked.plural = New Blocks Unlocked! text.players = {0} players online text.players.single = {0} player online 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.sectorComplete = Sector completed. 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.serverOutdated = Outdated server\! Ask the host to update\! +text.server.kicked.clientOutdated = Outdated client! Update your game! +text.server.kicked.serverOutdated = Outdated server! Ask the host to update! 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.nameInUse = There is someone with that name\nalready on this server. 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.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.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.hostserver = Host Game text.hostserver.mobile = Host\nGame text.host = Host @@ -100,31 +100,31 @@ text.hosting = [accent]Opening server... text.hosts.refresh = Refresh text.hosts.discovering = Discovering LAN games 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.trace = Trace Player -text.trace.playername = Player name\: [accent]{0} -text.trace.ip = IP\: [accent]{0} -text.trace.id = Unique ID\: [accent]{0} -text.trace.android = Android Client\: [accent]{0} -text.trace.modclient = Custom Client\: [accent]{0} -text.trace.totalblocksbroken = Total blocks broken\: [accent]{0} -text.trace.structureblocksbroken = Structure blocks broken\: [accent]{0} -text.trace.lastblockbroken = Last block broken\: [accent]{0} -text.trace.totalblocksplaced = Total blocks placed\: [accent]{0} -text.trace.lastblockplaced = Last block placed\: [accent]{0} -text.invalidid = Invalid client ID\! Submit a bug report. +text.trace.playername = Player name: [accent]{0} +text.trace.ip = IP: [accent]{0} +text.trace.id = Unique ID: [accent]{0} +text.trace.android = Android Client: [accent]{0} +text.trace.modclient = Custom Client: [accent]{0} +text.trace.totalblocksbroken = Total blocks broken: [accent]{0} +text.trace.structureblocksbroken = Structure blocks broken: [accent]{0} +text.trace.lastblockbroken = Last block broken: [accent]{0} +text.trace.totalblocksplaced = Total blocks placed: [accent]{0} +text.trace.lastblockplaced = Last block placed: [accent]{0} +text.invalidid = Invalid client ID! Submit a bug report. 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.none = No admins found\! +text.server.admins.none = No admins found! text.server.add = Add 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.outdated = [crimson]Outdated Server\![] -text.server.outdated.client = [crimson]Outdated Client\![] -text.server.version = [lightgray]Version\: {0} {1} +text.server.outdated = [crimson]Outdated Server![] +text.server.outdated.client = [crimson]Outdated Client![] +text.server.version = [lightgray]Version: {0} {1} text.server.custombuild = [yellow]Custom Build text.confirmban = Are you sure you want to ban this player? text.confirmkick = Are you sure you want to kick this player? @@ -132,45 +132,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.confirmunadmin = Are you sure you want to remove admin status from this player? text.joingame.title = Join Game -text.joingame.ip = IP\: +text.joingame.ip = IP: 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.data = [accent]Loading world data... -text.server.port = Port\: -text.server.addressinuse = Address already in use\! -text.server.invalidport = Invalid port number\! -text.server.error = [crimson]Error hosting server\: [accent]{0} +text.server.port = Port: +text.server.addressinuse = Address already in use! +text.server.invalidport = Invalid port number! +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.new = New Save text.save.overwrite = Are you sure you want to overwrite\nthis save slot? text.overwrite = Overwrite -text.save.none = No saves found\! +text.save.none = No saves found! 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 = Delete text.save.export = Export Save -text.save.import.invalid = [accent]This save is invalid\! -text.save.import.fail = [crimson]Failed to import save\: [accent]{0} -text.save.export.fail = [crimson]Failed to export save\: [accent]{0} +text.save.import.invalid = [accent]This save is invalid! +text.save.import.fail = [crimson]Failed to import save: [accent]{0} +text.save.export.fail = [crimson]Failed to export save: [accent]{0} text.save.import = Import Save -text.save.newslot = Save name\: +text.save.newslot = Save name: text.save.rename = Rename -text.save.rename.text = New name\: +text.save.rename.text = New name: text.selectslot = Select a save. 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.empty = text.on = On text.off = Off -text.save.autosave = Autosave\: {0} -text.save.map = Map\: {0} +text.save.autosave = Autosave: {0} +text.save.map = Map: {0} text.save.wave = Wave {0} -text.save.difficulty = Difficulty\: {0} -text.save.date = Last Saved\: {0} -text.save.playtime = Playtime\: {0} +text.save.difficulty = Difficulty: {0} +text.save.date = Last Saved: {0} +text.save.playtime = Playtime: {0} text.confirm = Confirm text.delete = Delete text.ok = OK @@ -182,9 +182,9 @@ text.back = Back text.quit.confirm = Are you sure you want to quit? text.changelog.title = 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 = [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.latest = [accent][[Latest version] text.loading = [accent]Loading... @@ -200,32 +200,32 @@ text.saveimage = Save Image text.unknown = Unknown text.custom = Custom 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.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.invalid = Error loading map\: corrupted or invalid map file. +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.invalid = Error loading map: corrupted or invalid map file. text.editor.brush = Brush text.editor.slope = \\ text.editor.openin = Open In Editor text.editor.oregen = Ore Generation -text.editor.oregen.info = Ore Generation\: +text.editor.oregen.info = Ore Generation: text.editor.mapinfo = Map Info -text.editor.author = Author\: -text.editor.description = Description\: -text.editor.name = Name\: +text.editor.author = Author: +text.editor.description = Description: +text.editor.name = Name: text.editor.teams = Teams text.editor.elevation = Elevation -text.editor.errorimageload = Error loading file\:\n[accent]{0} -text.editor.errorimagesave = Error saving file\:\n[accent]{0} +text.editor.errorimageload = Error loading file:\n[accent]{0} +text.editor.errorimagesave = Error saving file:\n[accent]{0} text.editor.generate = Generate text.editor.resize = Resize text.editor.loadmap = Load Map text.editor.savemap = Save Map -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.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.saved = Saved! +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.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! text.editor.import = Import... text.editor.importmap = Import Map text.editor.importmap.description = Import an already existing map @@ -240,21 +240,21 @@ text.editor.exportimage = Export Terrain Image text.editor.exportimage.description = Export a map image file text.editor.loadimage = Import 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.mapname = Map Name\: -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.selectmap = Select a map to load\: -text.width = Width\: -text.height = Height\: +text.editor.mapname = Map Name: +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.selectmap = Select a map to load: +text.width = Width: +text.height = Height: text.menu = Menu text.play = Play text.load = Load text.save = Save -text.fps = FPS\: {0} -text.tps = TPS\: {0} -text.ping = Ping\: {0}ms +text.fps = FPS: {0} +text.tps = TPS: {0} +text.ping = Ping: {0}ms text.language.restart = Please restart your game for the language settings to take effect. text.settings = Settings text.tutorial = Tutorial @@ -262,7 +262,7 @@ text.editor = Editor text.mapeditor = Map Editor 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.invalidaddress = Invalid address. text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! @@ -279,8 +279,8 @@ text.settings.game = Game text.settings.sound = Sound text.settings.graphics = Graphics 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.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.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.clearsectors = Clear Sectors text.settings.clearunlocks = Clear Unlocks text.settings.clearall = Clear All @@ -290,6 +290,7 @@ text.no = No text.info.title = Info text.error.title = [crimson]An error has occured text.error.crashtitle = An error has occured +text.blocks.unknown=[LIGHT_GRAY]??? text.blocks.blockinfo = Block Info text.blocks.powercapacity = Power Capacity text.blocks.powershot = Power/Shot @@ -322,7 +323,8 @@ text.blocks.coolant = Coolant text.blocks.coolantuse = Coolant Use text.blocks.inputliquidfuel = Fuel Liquid 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.inaccuracy = Inaccuracy text.blocks.shots = Shots @@ -347,6 +349,7 @@ text.category.liquids = Liquids text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None @@ -356,14 +359,13 @@ setting.difficulty.easy = easy setting.difficulty.normal = normal setting.difficulty.hard = hard setting.difficulty.insane = insane -setting.difficulty.name = Difficulty\: +setting.difficulty.name = Difficulty: setting.screenshake.name = Screen Shake setting.effects.name = Display Effects setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Autosave Interval setting.seconds = {0} Seconds setting.fullscreen.name = Fullscreen -setting.multithread.name = Multithreading setting.fps.name = Show FPS setting.vsync.name = VSync setting.lasers.name = Show Power Lasers @@ -408,8 +410,6 @@ mode.waves.name = waves mode.waves.description = the normal mode. limited resources and automatic incoming waves. mode.sandbox.name = sandbox mode.sandbox.description = infinite resources and no timer for waves. -mode.custom.warning = [scarlet]UNLOCKS IN CUSTOM GAMES OR SERVERS ARE NOT SAVED.[]\n\nPlay in sectors to unlock things. -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.description = limited resources and no timer for waves. mode.pvp.name = PvP @@ -482,21 +482,22 @@ mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. mech.glaive-ship.weapon = Flame Repeater -text.item.explosiveness = [LIGHT_GRAY]Explosiveness\: {0}% -text.item.flammability = [LIGHT_GRAY]Flammability\: {0}% -text.item.radioactivity = [LIGHT_GRAY]Radioactivity\: {0}% -text.item.fluxiness = [LIGHT_GRAY]Flux Power\: {0}% -text.unit.health = [LIGHT_GRAY]Health\: {0} -text.unit.speed = [LIGHT_GRAY]Speed\: {0} -text.mech.weapon = [LIGHT_GRAY]Weapon\: {0} -text.mech.armor = [LIGHT_GRAY]Armor\: {0} -text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity\: {0} -text.mech.minespeed = [LIGHT_GRAY]Mining Speed\: {0} -text.mech.minepower = [LIGHT_GRAY]Mining Power\: {0} -text.mech.ability = [LIGHT_GRAY]Ability\: {0} -text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity\: {0} -text.liquid.viscosity = [LIGHT_GRAY]Viscosity\: {0} -text.liquid.temperature = [LIGHT_GRAY]Temperature\: {0} +text.item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% +text.item.flammability = [LIGHT_GRAY]Flammability: {0}% +text.item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% +text.item.fluxiness = [LIGHT_GRAY]Flux Power: {0}% +text.unit.health = [LIGHT_GRAY]Health: {0} +text.unit.speed = [LIGHT_GRAY]Speed: {0} +text.mech.weapon = [LIGHT_GRAY]Weapon: {0} +text.mech.armor = [LIGHT_GRAY]Armor: {0} +text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} +text.mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} +text.mech.minepower = [LIGHT_GRAY]Mining Power: {0} +text.mech.ability = [LIGHT_GRAY]Ability: {0} +text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} +text.liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} +text.liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.constructing = {0} [LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Core block.metalfloor.name = Metal Floor @@ -504,16 +505,16 @@ block.deepwater.name = deepwater block.water.name = water block.lava.name = lava block.tar.name = Tar -block.blackstone.name = blackstone -block.stone.name = stone -block.dirt.name = dirt -block.sand.name = sand -block.ice.name = ice -block.snow.name = snow -block.grass.name = grass -block.shrub.name = shrub -block.rock.name = rock -block.blackrock.name = blackrock +block.blackstone.name = Black Stone +block.stone.name = Stone +block.dirt.name = Dirt +block.sand.name = Sand +block.ice.name = Ice +block.snow.name = Snow +block.grass.name = Grass +block.shrub.name = Shrub +block.rock.name = Rock +block.blackrock.name = Black Rock block.icerock.name = icerock block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 5e5df2b1e3..d7840e685c 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = itch.io Seite mit Downloads und der Web-Version text.link.google-play.description = Google Play Store Seite text.link.wiki.description = Offizelles Mindustry Wiki text.linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert. -text.editor.web = Die Web-Version unterstützt den Editor nicht!\nLade das Spiel herunter um ihn zu benutzen. -text.web.unsupported = Die Web-Version unterstützt dieses Feature nicht! Lade das Spiel herunter um es zu benutzen. text.gameover = Der Kern wurde zerstört. text.gameover.pvp = Das[accent] {0}[] Team ist siegreich! text.sector.gameover = Du hast diesen Sektor verloren. Erneuter Einsatz? @@ -267,6 +265,7 @@ text.error.invalidaddress = Ungültige Adresse. text.error.timedout = Zeitüberschreitung!\nStelle sicher, dass die Portweiterleitung auf dem Host richtig eingerichtet ist, und die Adresse stimmt! text.error.mismatch = Paketfehler:\nClient und Server passen möglicherweise nicht zusammen.\nStelle sicher, dass du und der Host jeweils die neueste Version von Mindustry haben! text.error.alreadyconnected = Bereits verbunden. +text.error.mapnotfound = Map file not found! text.error.any = Unbekannter Netzwerkfehler. text.settings.language = Sprache text.settings.reset = Auf Standard zurücksetzen @@ -287,6 +286,7 @@ text.no = Nein text.info.title = [accent]Info text.error.title = [crimson] Ein Fehler ist aufgetreten text.error.crashtitle = Ein Fehler ist aufgetreten! +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Blockinfo: text.blocks.powercapacity = Kapazität text.blocks.powershot = Stromverbrauch/Schuss @@ -319,7 +319,8 @@ text.blocks.coolant = Kühlmittel text.blocks.coolantuse = Kühlmittelverbrauch text.blocks.inputliquidfuel = Kraftstoff text.blocks.liquidfueluse = Kraftstoffverbrauch -text.blocks.explosive = Hochexplosiv! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Lebenspunkte text.blocks.inaccuracy = Ungenauigkeit text.blocks.shots = Schüsse @@ -344,6 +345,7 @@ text.category.liquids = Flüssigkeiten text.category.items = Materialien text.category.crafting = Erzeugung text.category.shooting = Schießen +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Zielauswahl setting.fpscap.name = Max FPS setting.fpscap.none = kein @@ -360,7 +362,6 @@ setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden setting.fullscreen.name = Vollbild -setting.multithread.name = Multithreading setting.fps.name = Zeige FPS setting.vsync.name = VSync setting.lasers.name = Zeige Stromlaser @@ -369,6 +370,7 @@ setting.musicvol.name = Musiklautstärke setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke setting.mutesound.name = Audioeffekte stummschalten +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Tasten zuweisen category.general.name = Allgemein category.view.name = Ansicht @@ -404,8 +406,6 @@ mode.waves.name = Wellen mode.waves.description = Der normale Modus. Begrenzte Ressourcen und automatische Wellen. mode.sandbox.name = Sandkasten 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.description = Begrenzte Ressourcen und kein Timer für Wellen. mode.pvp.name = PvP @@ -493,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Fähigkeit: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Wärmekapazität: {0} text.liquid.viscosity = [LIGHT_GRAY]Viskosität: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatur: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Gegnerischer Startpunkt block.core.name = Basis block.metalfloor.name = Metallboden @@ -622,7 +623,7 @@ block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container -block.core.description = The most important building in the game. +block.core.description = Das wichtigste Gebäude im Spiel team.blue.name = Blau team.red.name = Rot team.orange.name = Orange @@ -650,8 +651,8 @@ tutorial.begin = Deine Mission ist es den [LIGHT_GRAY]Gegner[] auszurotten.\n\n tutorial.drill = Manuelles Abbauen von Ressourcen ist ineffizient.\n[accent]Bohrer[] können automatisch abbauen.\n Platziere einen auf einem Kupfer Vorkommen. tutorial.conveyor = [accent]Transportbänder[] werden dazu benutzt Materialien zum Kern zu transportieren.\n Erstelle eine Reihe von Transportbändern zum Kern. tutorial.morecopper = Du brauchst [accent]mehr Kupfer[]!\n\nEntweder du baust es manuell ab, oder du platzierst weitere Bohrer. -tutorial.Geschützturm = Wir benötigen Verteidigung gegen den [LIGHT_GRAY] Gegner[].\n Baue einen Duo Turm nahe deiner Basis. -tutorial.drillGeschützturm = Der Duo Turm benötigt[accent] Kupfer[] als Munition. Platziere einen Bohrer neben dem Turm, um ihn mit Kupfer zu versorgen. +tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. +tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. tutorial.waves = Der [LIGHT_GRAY] Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Bau mehr Türme. tutorial.lead = Mehr Erz ist verfügbar. Finde Blei und bau es ab.\n\n Klicke auf deine Einheit und ziehe die Maus auf den Kern um Ressourcen zu übertragen. tutorial.smelter = Kupfer und Blei sind schwache Metalle.\n Super [accent]dichte Legierung [] kann in einem Schmeltzer erzeugt werden.\n\n Bau einen. @@ -667,7 +668,6 @@ tutorial.daggerfactory = Konstruiere eine Dagger Mech Fabrik.\n\n Diese wird ver tutorial.router = Fabriken benötigen Ressourcen um zu funktionieren.\n Platziere ein Router um Materialien auf Transportbändern aufzuteilen. tutorial.dagger = Verbinde die Fabrik mit einem Stromknoten. Wenn alle Voraussetzungen gegeben sind, beginnt die Fabrik Mechs zu konstruieren.\n\n Platziere mehr Bohrer und Transportbänder um die Versorgung der Fabrik zu sichern. tutorial.battle = Der[LIGHT_GRAY] Gegner[] hat seinen Kern offenbart.\nZerstöre ihn mit deiner Einheit und den Dagger Mechs. -block.core.description = Das wichtigste Gebäude im Spiel block.copper-wall.description = Ein günstiger Verteidigungsblock.\nNützlich, um die Basis und Türme in den ersten Wellen zu beschützen. block.copper-wall-large.description = Ein günstiger Verteidigungsblock.\nNützlich, um die Basis und Türme in den ersten Wellen zu beschützen.\nBenötigt mehrere Kacheln. block.dense-alloy-wall.description = Ein Standard-Verteidigungsblock.\nAngemessener Schutz vor Feinden. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 342aa94a77..5d753f7732 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = itch.io es la página donde podes descargar las text.link.google-play.description = Ficha en la Google Play Store text.link.wiki.description = Wiki oficial de Mindustry text.linkfail = ¡Error al abrir el enlace!\nLa URL ha sido copiada a su portapapeles. -text.editor.web = ¡La versión web no es compatible con el editor!\nDescarga el juego para usarlo. -text.web.unsupported = ¡La versión web no soporta esta característica! Descarga el juego para poder usarla. text.gameover = Tu núcleo ha sido destruido. text.gameover.pvp = ¡El equipo[accent] {0}[] ha ganado! text.sector.gameover = Este sector ha sido perdido. ¿Re-desplegar? @@ -184,7 +182,7 @@ text.changelog.title = Registro de Parches text.changelog.loading = Consiguiendo el registro de parches... text.changelog.error.android = [accent]¡Nota: el registro de parches a veces no funciona en Android 4.4 o inferior!\nEsto es por un error interno de Android. text.changelog.error.ios = [accent]El registro de parches no está actualmente soportado para iOS. -text.changelog.error = [scarlet]¡Error consiguiendo el registro de parches!\Comprueba tu conexión a Internet. +text.changelog.error = [scarlet]¡Error consiguiendo el registro de parches!Comprueba tu conexión a Internet. text.changelog.current = [yellow][[Versión actual] text.changelog.latest = [accent][[Última version] text.loading = [accent]Cargando... @@ -288,6 +286,7 @@ text.no = No text.info.title = [accent]Información text.error.title = [crimson]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.powercapacity = Capacidad de Energía text.blocks.powershot = Energía/Disparo @@ -320,7 +319,8 @@ text.blocks.coolant = Refrigerante text.blocks.coolantuse = Uso del Refrigerante text.blocks.inputliquidfuel = 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.inaccuracy = Imprecisión text.blocks.shots = Disparos @@ -345,6 +345,7 @@ text.category.liquids = Líquidos text.category.items = Objetos text.category.crafting = Fabricación text.category.shooting = Disparo +text.category.optional = Optional Enhancements setting.autotarget.name = Auto apuntado setting.fpscap.name = Máx FPS setting.fpscap.none = Nada @@ -361,7 +362,6 @@ setting.sensitivity.name = Sensibilidad del Control setting.saveinterval.name = Intervalo del Auto-guardado setting.seconds = {0} Segundos setting.fullscreen.name = Pantalla Completa -setting.multithread.name = Multiproceso setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.lasers.name = Mostrar Energía de los Láseres @@ -370,6 +370,7 @@ setting.musicvol.name = Volumen de la Música setting.mutemusic.name = Silenciar Musica setting.sfxvol.name = Volumen de los efectos de sonido setting.mutesound.name = Silenciar Sonido +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Reasignar Teclas category.general.name = General category.view.name = Visión @@ -405,8 +406,6 @@ mode.waves.name = hordas mode.waves.description = El modo normal. con recursos limitados y entrada de hordas automática. mode.sandbox.name = sandbox 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.description = recursos limitados y no hay temporizador para las hordas. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Hablidad: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Punto de generación block.core.name = Núcleo block.metalfloor.name = Suelo de Metal @@ -623,6 +623,7 @@ block.rtg-generator.name = Generador RTG block.spectre.name = Espectro block.meltdown.name = Meltdown block.container.name = Contenedor +block.core.description = The most important building in the game. team.blue.name = Azul team.red.name = Rojo team.orange.name = Naranja @@ -743,7 +744,6 @@ block.javelin-ship-pad.description = Deja tu nave actual y transfórmate en una block.glaive-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea grande y bien armada nave pistolera.\nUsa el pad tocándolo dos veces mientras estás en él. block.tau-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide de soporte que puede reparar construcciones y tropas aliadas.\nUsa el pad tocándolo dos veces mientras estás en él. block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. -Deja tu nave actual y transfórmate en un mecanoide rápido, con armas ligeras hecho para ataques de ataque y retirada.\nUsa el pad tocándolo dos veces mientras estás en él. block.omega-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide pesado y bien armado, hecho para asaltos en primera línea.\nUsa el pad tocándolo dos veces mientras estás en él. block.spirit-factory.description = Produce drones ligeros que obtienen minerales y reparan bloques. block.phantom-factory.description = Produce drones avanzados que son significativamente más eficientes que un dron espíritu. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index e22f8e40bd..f8351c8f7b 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = page itch.io avec le lien du téléchargement po text.link.google-play.description = listing par le store google play text.link.wiki.description = wiki officiel de mindustry . text.linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copié avec succès. -text.editor.web = La version web ne possède pas l'éditeur !\nTéléchargez le jeu pour l'avoir. -text.web.unsupported = La version web ne supporte pas cette fonction ! Téléchargez le jeu pour l'utiliser. text.gameover = Partie terminée. text.gameover.pvp = L'équipe [accent] {0}[] a gagnée ! text.sector.gameover = Ce secteur a été perdu. Réessayer? @@ -288,6 +286,7 @@ text.no = Non text.info.title = Info text.error.title = [crimson]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.powercapacity = capacité d'énergie text.blocks.powershot = Énergie/Tir @@ -320,7 +319,8 @@ text.blocks.coolant = Liquide de refroidissement text.blocks.coolantuse = Quantité de liquide de refroidissement utilisée text.blocks.inputliquidfuel = Carburant liquide 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.inaccuracy = Précision text.blocks.shots = Tir @@ -345,6 +345,7 @@ text.category.liquids = Liquides text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense +text.category.optional = Optional Enhancements setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = None @@ -361,7 +362,6 @@ setting.sensitivity.name = Sensibilité de la manette setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} secondes setting.fullscreen.name = Plein écran -setting.multithread.name = Multithreading [scarlet] (instable!) setting.fps.name = Afficher FPS setting.vsync.name = VSync setting.lasers.name = Afficher les rayons des lasers @@ -370,6 +370,7 @@ setting.musicvol.name = volume de la musique setting.mutemusic.name = Couper la musique setting.sfxvol.name = Volume des SFX setting.mutesound.name = Couper les SFX +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Paramétrer les touches category.general.name = General category.view.name = Voir @@ -405,8 +406,6 @@ mode.waves.name = Vagues mode.waves.description = le mode de jeu normal. Ressource limitée et vagues d'ennemis. mode.sandbox.name = bac à sable 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.description = Ressource limitée et pas de timer pour les vagues. mode.pvp.name = JcJ @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Compétence: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosité: {0} text.liquid.temperature = [LIGHT_GRAY]Température: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Générateur d'ennemi block.core.name = Base block.metalfloor.name = Sol en métal diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index dae5a09796..ed93ffbf39 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -9,8 +9,6 @@ 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.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.editor.web = La version web ne prend pas en charge l'éditeur !\nTéléchargez le jeu pour l'utiliser. -text.web.unsupported = La version web ne prend pas en charge cette fonctionnalité ! Téléchargez le jeu pour l'utiliser. text.gameover = Le base a été détruit. text.gameover.pvp = L'équipe[accent] {0}[] a gagnée ! text.sector.gameover = Ce secteur a été perdu. Réessayer ? @@ -64,7 +62,7 @@ text.mission.linknode = Reliez le transmetteur énergétique text.mission.display = [accent]Mission:\n[LIGHT_GRAY]{0} text.mission.mech = Changer de mécha[accent] {0}[] text.mission.create = Créez[accent] {0}[] -text.none = +text.none = text.close = Fermer text.quit = Quitter text.maps = Cartes @@ -288,6 +286,7 @@ text.no = Non text.info.title = Info text.error.title = [crimson]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.powercapacity = Capacité d'énergie text.blocks.powershot = Énergie/Tir @@ -320,7 +319,8 @@ text.blocks.coolant = Liquide de refroidissement text.blocks.coolantuse = Quantité de liquide de refroidissement utilisé text.blocks.inputliquidfuel = Carburant liquide 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.inaccuracy = Précision text.blocks.shots = Tirs @@ -345,6 +345,7 @@ text.category.liquids = Liquides text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense +text.category.optional = Optional Enhancements setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = Vide @@ -361,7 +362,6 @@ setting.sensitivity.name = Contôle de la sensibilité setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} Secondes setting.fullscreen.name = Plein écran -setting.multithread.name = Multithreading setting.fps.name = Afficher FPS setting.vsync.name = VSync setting.lasers.name = Afficher les rayons des lasers @@ -370,6 +370,7 @@ setting.musicvol.name = Volume de la musique setting.mutemusic.name = Couper la musique setting.sfxvol.name = Volume des SFX setting.mutesound.name = Couper les SFX +setting.crashreport.name = Envoyer des rapports d'incident anonymement. text.keybind.title = Paramétrer les touches category.general.name = Général category.view.name = Voir @@ -405,8 +406,6 @@ mode.waves.name = Vagues mode.waves.description = Le mode normal. Ressources limitées et vagues déclenchées automatiquement. mode.sandbox.name = Bac à sable 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.description = Ressources limitées et pas de compte à rebours pour les vagues. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Compétence: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosité: {0} text.liquid.temperature = [LIGHT_GRAY]Température: {0} +block.constructing = {0}\n[LIGHT_GRAY](En construction) block.spawn.name = Générateur d'ennemi block.core.name = Base block.metalfloor.name = Sol en métal @@ -668,7 +668,6 @@ tutorial.daggerfactory = Construire [accent]une usine de "Poignards" []est recom tutorial.router = Les usines ont besoin de ressources pour fonctionner.\nCréez un routeur pour séparer les objets. tutorial.dagger = Reliez des transmetteurs énergétiques à l'usine.\nUne fois que les conditions seront remplies , un mécha sera créé.\nConstruisez autant de foreuses, de générateurs et de tapis roulants que nécessaire. tutorial.battle = [LIGHT_GRAY]L'Ennemi[] a révélé sa base.\nDétruisez la avec votre unité et des méchas "Poignard". - block.copper-wall.description = Un bloc défensif bon marché.\nUtile pour protéger le noyau et les tourelles lors des premières vagues. block.copper-wall-large.description = Un bloc défensif bon marché.\nUtile pour protéger le noyau et les tourelles lors des premières vagues.\nS'étend sur plusieurs tuiles. block.dense-alloy-wall.description = Un bloc défensif standard.\nUne protection adéquate contre les ennemis. @@ -685,7 +684,7 @@ block.mend-projector.description = Guérit périodiquement les bâtiments situé block.overdrive-projector.description = Augmente la vitesse des bâtiments à proximité, comme les foreuses et les convoyeurs. block.force-projector.description = Crée un champ de force hexagonal autour de lui-même, protégeant les bâtiments et les unités internes des dommages causés par les balles. block.shock-mine.description = Endommage les ennemis qui marchent sur la mine. Presque invisible à l'ennemi. -block.duo.description =Une petite tourelle pas chère. +block.duo.description = Une petite tourelle pas chère. block.arc.description = Une petite tourelle qui tire de l'électricité dans un arc au hasard vers l'ennemi. block.hail.description = Une petite tourelle d'artillerie. block.lancer.description = Une tourelle de taille moyenne qui tire des faisceaux d’électricité chargés. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 838876490c..387e2f6bf3 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -9,8 +9,6 @@ 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.wiki.description = official Mindustry wiki text.linkfail = Failed to open link!\nThe URL has been copied to your cliboard. -text.editor.web = The web version does not support the editor!\nDownload the game to use it. -text.web.unsupported = The web version does not support this feature! Download the game to use it. text.gameover = Intinya hancur. text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = This sector has been lost. Re-deploy? @@ -288,6 +286,7 @@ text.no = No text.info.title = [accent]Info text.error.title = [crimson]Telah terjadi kesalahan text.error.crashtitle = Telah terjadi kesalahan +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Info Blok text.blocks.powercapacity = Kapasitas Tenaga text.blocks.powershot = Tenaga/tembakan @@ -320,7 +319,8 @@ text.blocks.coolant = Coolant text.blocks.coolantuse = Coolant Use text.blocks.inputliquidfuel = Fuel Liquid 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.inaccuracy = Ketidaktelitian text.blocks.shots = Tembakan @@ -345,6 +345,7 @@ text.category.liquids = Liquids text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None @@ -361,7 +362,6 @@ setting.sensitivity.name = Sensitivitas Pengendali setting.saveinterval.name = Waktu Simpan Otomatis setting.seconds = {0} Detik setting.fullscreen.name = Layar Penuh -setting.multithread.name = Multithreading setting.fps.name = Tunjukkan FPS setting.vsync.name = VSync setting.lasers.name = Tampilkan Laser Tenaga @@ -370,6 +370,7 @@ setting.musicvol.name = Volume Musik setting.mutemusic.name = Bisukan Musik setting.sfxvol.name = Volume Suara setting.mutesound.name = Bisukan Suara +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Rebind Keys category.general.name = General category.view.name = View @@ -405,8 +406,6 @@ mode.waves.name = gelombang mode.waves.description = the normal mode. limited resources and automatic incoming waves. mode.sandbox.name = sandbox 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.description = limited resources and no timer for waves. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Ability: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} text.liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Core block.metalfloor.name = Metal Floor diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bfcd087d53..514ff0569f 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = pagina di itch.io con download per PC e versione text.link.google-play.description = Elenco di Google Play Store text.link.wiki.description = wiki ufficiale di Mindustry text.linkfail = Impossibile aprire il link! L'URL è stato copiato nella tua bacheca. -text.editor.web = La versione web non supporta l'editor! Scarica il gioco per usarlo. -text.web.unsupported = La vcersione web non supporta questa funzione! Sacrica il gioco per utilizzarla. text.gameover = Il nucleo è stato distrutto. text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = Hai perso questo settore. Attaccare di nuovo? @@ -288,6 +286,7 @@ text.no = No text.info.title = [accent] Info text.error.title = [crimson]Si è verificato un errore text.error.crashtitle = Si è verificato un errore +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = info sul blocco text.blocks.powercapacity = Capacità Energetica text.blocks.powershot = Danno/Colpo @@ -320,7 +319,8 @@ text.blocks.coolant = Refrigerante text.blocks.coolantuse = uso refrigerante text.blocks.inputliquidfuel = 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.inaccuracy = Inaccuratezza text.blocks.shots = Colpi @@ -345,6 +345,7 @@ text.category.liquids = Liquidi text.category.items = Oggetti text.category.crafting = Produzione text.category.shooting = Potenza di fuoco +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Limite FPS setting.fpscap.none = Niente @@ -361,7 +362,6 @@ setting.sensitivity.name = Sensibilità del controller setting.saveinterval.name = Intervallo di salvataggio automatico setting.seconds = {0} Secondi setting.fullscreen.name = Schermo Intero -setting.multithread.name = multithreading setting.fps.name = Mostra FPS setting.vsync.name = VSync setting.lasers.name = Mostra Laser Energetici @@ -370,6 +370,7 @@ setting.musicvol.name = Volume Musica setting.mutemusic.name = Silenzia musica setting.sfxvol.name = Volume SFX setting.mutesound.name = Togli suoni +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Configurazione Tasti category.general.name = Generale category.view.name = Visualizzazione @@ -405,8 +406,6 @@ mode.waves.name = ondate mode.waves.description = modalità normale. risorse limitate e ondate automatiche. mode.sandbox.name = Sandbox 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.description = risorse limitate e nessun timer per le ondate. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Abilità: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacità calorifica: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosità: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Nucleo block.metalfloor.name = Pavimento di ferro diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index b8206bb578..3ab3a1ba2b 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1,6 +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.discord = DiscordのMindustryに参加\! +text.discord = DiscordのMindustryに参加! text.link.discord.description = Mindustryの公式Discordグループ text.link.github.description = ゲームのソースコード text.link.dev-builds.description = 不安定な開発ビルド @@ -8,27 +8,25 @@ text.link.trello.description = 公式 Trelloボード の実装予定の機能 text.link.itch.io.description = itch.ioでPC版のダウンロードやweb版をプレイ text.link.google-play.description = Google Playのストアページ text.link.wiki.description = 公式 Mindustry Wiki -text.linkfail = リンクを開くのに失敗しました\!\nURLをクリップボードにコピーしました。 -text.editor.web = Web版はエディターをサポートしていません\!\nゲームをダウンロードして、使用してください。 -text.web.unsupported = Web版はこの機能をサポートしてません\! ゲームをダウンロードして、使用してください。 +text.linkfail = リンクを開くのに失敗しました!\nURLをクリップボードにコピーしました。 text.gameover = ゲームオーバー -text.gameover.pvp = [accent] {0}[] チームの勝利\! +text.gameover.pvp = [accent] {0}[] チームの勝利! text.sector.gameover = この区域は敗北しました。 再配備しますか? text.sector.retry = リトライ -text.highscore = [accent]ハイスコアを記録\! +text.highscore = [accent]ハイスコアを記録! text.wave.lasted = あなたはウェーブ[accent]{0}[]まで続きました。 -text.level.highscore = ハイスコア\: [accent]{0} +text.level.highscore = ハイスコア: [accent]{0} text.level.delete.title = 削除の確認 text.map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? text.level.select = レベル選択 -text.level.mode = ゲームモード\: +text.level.mode = ゲームモード: text.construction.desktop = ブロックの選択や建設を止めるには、[accent]スペースを使用してください[]。 text.construction.title = ブロック建設ガイド text.construction = [accent]ブロック建設モード[]になりました。\n設置するには、機体の近くの設置可能な場所をタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体が建設を始めます。\n\n- [accent]ブロックの削除[]は、タップで範囲を選択してください。\n- [accent]範囲の選択[]は、長押しして、範囲のブロックをドラッグしてください。\n- [accent]一列にブロックを設置[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]建設や範囲の選択をキャンセル[]するには、左下の X ボタンを押してください。 text.deconstruction.title = ブロック撤去ガイド text.deconstruction = [accent]ブロック撤去モード[]になりました。\n\nブロックを撤去するには、機体の近くのブロックをタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体がブロックの撤去を始めます。\n\n- [accent]ブロックの破壊[]は、タップで範囲を選択してください。\n- [accent]範囲を選択してブロックを撤去[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]撤去や範囲選択をキャンセル[]するには、左下の X ボタンを押してください。 text.showagain = 次回以降表示しない -text.coreattack = < コアが攻撃を受けています\! > +text.coreattack = < コアが攻撃を受けています! > text.unlocks = アンロック text.savegame = ゲームを保存 text.loadgame = ゲームを読み込む @@ -36,19 +34,19 @@ text.joingame = ゲームに参加 text.addplayers = プレイヤーを追加/削除 text.customgame = カスタムゲーム text.sectors = 区域 -text.sector = 区域\: [LIGHT_GRAY]{0} -text.sector.time = 時間\: [LIGHT_GRAY]{0} +text.sector = 区域: [LIGHT_GRAY]{0} +text.sector.time = 時間: [LIGHT_GRAY]{0} text.sector.deploy = 配備 text.sector.abandon = 撤退 -text.sector.abandon.confirm = 区域のすべての進行を撤退します。\nこれは元に戻すことはできません\! +text.sector.abandon.confirm = 区域のすべての進行を撤退します。\nこれは元に戻すことはできません! text.sector.resume = 再開 text.sector.locked = [scarlet][[不完全] text.sector.unexplored = [accent][[未調査] -text.missions = ミッション\:[LIGHT_GRAY] {0} -text.mission = ミッション\:[LIGHT_GRAY] {0} -text.mission.main = メインミッション\:[LIGHT_GRAY] {0} +text.missions = ミッション:[LIGHT_GRAY] {0} +text.mission = ミッション:[LIGHT_GRAY] {0} +text.mission.main = メインミッション:[LIGHT_GRAY] {0} text.mission.info = ミッション情報 -text.mission.complete = ミッション完了\! +text.mission.complete = ミッション完了! text.mission.complete.body = 区域 {0},{1} を征服しました。 text.mission.wave = 残り[accent] {0}/{1} []ウェーブ\n次のウェーブまで {2} text.mission.wave.enemies = 残り[accent] {0}/{1} []ウェーブ\n敵の残り {2} 体 @@ -56,12 +54,12 @@ text.mission.wave.enemy = 残り[accent] {0}/{1} []ウェーブ\n敵の残り {2 text.mission.wave.menu = 残り[accent] {0}[] ウェーブ text.mission.battle = 敵のコアを破壊する text.mission.resource.menu = {0} を{1}個を入手する -text.mission.resource = {0} を入手する \:\n[accent]{1}/{2}[] +text.mission.resource = {0} を入手する :\n[accent]{1}/{2}[] text.mission.block = {0} を作る text.mission.unit = ユニット {0} を作る text.mission.command = ユニットに {0} を命令する text.mission.linknode = 電源ノードを接続する -text.mission.display = [accent]ミッション\:\n[LIGHT_GRAY]{0} +text.mission.display = [accent]ミッション:\n[LIGHT_GRAY]{0} text.mission.mech = 機体を[accent]{0}[]に乗り換える text.mission.create = [accent]{0}[] を作る text.none = <なし> @@ -70,29 +68,29 @@ text.quit = 終了 text.maps = マップ text.continue = 続ける text.nextmission = 次のミッションへ -text.maps.none = [LIGHT_GRAY]マップが存在しません\! +text.maps.none = [LIGHT_GRAY]マップが存在しません! text.about.button = About -text.name = 名前\: -text.filename = ファイル名\: -text.unlocked = 新しいブロックをアンロック\! -text.unlocked.plural = 新しいブロックをアンロック\! +text.name = 名前: +text.filename = ファイル名: +text.unlocked = 新しいブロックをアンロック! +text.unlocked.plural = 新しいブロックをアンロック! text.players = {0} 人がオンライン text.players.single = {0} 人がオンライン text.server.closing = [accent]サーバーを閉じています... -text.server.kicked.kick = サーバからキックされました\! +text.server.kicked.kick = サーバからキックされました! text.server.kicked.serverClose = サーバーが閉じました。 text.server.kicked.sectorComplete = 区域を制覇しました。 text.server.kicked.sectorComplete.text = ミッションが完了しました。\nサーバーは次の区域に移ります。 -text.server.kicked.clientOutdated = 古いクライアントです\! ゲームをアップデートしてください\! -text.server.kicked.serverOutdated = 古いサーバーです\! ホストに更新してもらってください\! +text.server.kicked.clientOutdated = 古いクライアントです! ゲームをアップデートしてください! +text.server.kicked.serverOutdated = 古いサーバーです! ホストに更新してもらってください! text.server.kicked.banned = サーバーからBanされています。 text.server.kicked.recentKick = 直前にキックされています。\nもう一度接続できるまでお待ちください。 text.server.kicked.nameInUse = このサーバーでは、\nその名前はすでに使用されています。 text.server.kicked.nameEmpty = 無効な名前です。 -text.server.kicked.idInUse = すでにサーバーに参加しています。\! 二つのアカウントでの接続は許可されていません。 +text.server.kicked.idInUse = すでにサーバーに参加しています。! 二つのアカウントでの接続は許可されていません。 text.server.kicked.customClient = このサーバーはカスタムビルドをサポートしていません。公式版をダウンロードしてください。 -text.host.info = [accent]ホスト[]ボタンを押すと、ポート[scarlet]6567[]でサーバーが開かれます。\同じ[LIGHT_GRAY]Wifi や ローカルネットワーク[]からはサーバーリストで見ることができます。\n\nIPアドレスからどこからでもアクセスできるようにするには、[accent]ポート開放[]する必要があります。\n\n[LIGHT_GRAY]注意:\: LAN上のゲームで接続できない場合、Mindustryがファイアウォールの設定でローカルネットワークに接続が許可されているか確認してください。 -text.join.info = ここでは、[accent]サーバーのIPアドレス[]から接続したり、[accent]ローカルネットワーク[]のサーバーを探すことができます。\nLANとWANの両方のマルチプレイに対応しています。\n\n[LIGHT_GRAY]注意\:グローバルサーバーリストはありません。誰かのサーバーにIPで接続したい場合、ホストにIPをお尋ねください。 +text.host.info = [accent]ホスト[]ボタンを押すと、ポート[scarlet]6567[]でサーバーが開かれます。同じ[LIGHT_GRAY]Wifi や ローカルネットワーク[]からはサーバーリストで見ることができます。\n\nIPアドレスからどこからでもアクセスできるようにするには、[accent]ポート開放[]する必要があります。\n\n[LIGHT_GRAY]注意:: LAN上のゲームで接続できない場合、Mindustryがファイアウォールの設定でローカルネットワークに接続が許可されているか確認してください。 +text.join.info = ここでは、[accent]サーバーのIPアドレス[]から接続したり、[accent]ローカルネットワーク[]のサーバーを探すことができます。\nLANとWANの両方のマルチプレイに対応しています。\n\n[LIGHT_GRAY]注意:グローバルサーバーリストはありません。誰かのサーバーにIPで接続したい場合、ホストにIPをお尋ねください。 text.hostserver = ゲームをホスト text.hostserver.mobile = ホスト text.host = ホスト @@ -100,31 +98,31 @@ text.hosting = [accent]サーバーを開いています... text.hosts.refresh = リフレッシュ text.hosts.discovering = LAN上のサーバーを探しています text.server.refreshing = サーバーをリフレッシュ -text.hosts.none = [lightgray]ローカルゲームが見つかりません\! +text.hosts.none = [lightgray]ローカルゲームが見つかりません! text.host.invalid = [scarlet]ホストに接続できません。 text.trace = プレイヤーの記録 -text.trace.playername = プレイヤー名\: [accent]{0} -text.trace.ip = IP\: [accent]{0} -text.trace.id = ユニークID\: [accent]{0} -text.trace.android = Androidクライアント\: [accent]{0} -text.trace.modclient = カスタムクライアント\: [accent]{0} -text.trace.totalblocksbroken = 総ブロック破壊数\: [accent]{0} -text.trace.structureblocksbroken = 総建設物破壊数\: [accent]{0} -text.trace.lastblockbroken = 最後に破壊したブロック\: [accent]{0} -text.trace.totalblocksplaced = 総ブロック設置数\: [accent]{0} -text.trace.lastblockplaced = 最後に設置したブロック\: [accent]{0} -text.invalidid = 無効なクライアントIDです\! バグ報告してください。 +text.trace.playername = プレイヤー名: [accent]{0} +text.trace.ip = IP: [accent]{0} +text.trace.id = ユニークID: [accent]{0} +text.trace.android = Androidクライアント: [accent]{0} +text.trace.modclient = カスタムクライアント: [accent]{0} +text.trace.totalblocksbroken = 総ブロック破壊数: [accent]{0} +text.trace.structureblocksbroken = 総建設物破壊数: [accent]{0} +text.trace.lastblockbroken = 最後に破壊したブロック: [accent]{0} +text.trace.totalblocksplaced = 総ブロック設置数: [accent]{0} +text.trace.lastblockplaced = 最後に設置したブロック: [accent]{0} +text.invalidid = 無効なクライアントIDです! バグ報告してください。 text.server.bans = Ban -text.server.bans.none = Banされたプレイヤーはいません\! +text.server.bans.none = Banされたプレイヤーはいません! text.server.admins = 管理者 -text.server.admins.none = 管理者はいません\! +text.server.admins.none = 管理者はいません! text.server.add = サーバーを追加 text.server.delete = サーバーを削除しますか? -text.server.hostname = ホスト\: {0} +text.server.hostname = ホスト: {0} text.server.edit = サーバーを編集 -text.server.outdated = [crimson]古いサーバー\![] -text.server.outdated.client = [crimson]古いクライアント\![] -text.server.version = [lightgray]バージョン\: {0} {1} +text.server.outdated = [crimson]古いサーバー![] +text.server.outdated.client = [crimson]古いクライアント![] +text.server.version = [lightgray]バージョン: {0} {1} text.server.custombuild = [yellow]カスタムビルド text.confirmban = このプレイヤーを Ban しますか? text.confirmkick = このプレイヤーをキックしますか? @@ -132,45 +130,45 @@ text.confirmunban = このプレイヤーの Ban を解除しますか? text.confirmadmin = このプレイヤーを管理者にしますか? text.confirmunadmin = このプレイヤーを管理者から削除しますか? text.joingame.title = サーバーに参加 -text.joingame.ip = IP\: +text.joingame.ip = IP: text.disconnect = 接続が切断されました。 -text.disconnect.data = ワールドデータの読み込みに失敗しました\! +text.disconnect.data = ワールドデータの読み込みに失敗しました! text.connecting = [accent]接続中... text.connecting.data = [accent]ワールドデータを読み込んでいます... -text.server.port = ポート\: -text.server.addressinuse = アドレスがすでに使用されています。\! -text.server.invalidport = 無効なポート番号です。\! -text.server.error = [crimson]サーバーエラー\: [accent]{0} +text.server.port = ポート: +text.server.addressinuse = アドレスがすでに使用されています。! +text.server.invalidport = 無効なポート番号です。! +text.server.error = [crimson]サーバーエラー: [accent]{0} text.save.old = これは古いバージョンのセーブデータで、使用することができません。\n\n[LIGHT_GRAY]下位互換性の実装は正式版の4.0行われます。 text.save.new = 新しく保存 text.save.overwrite = このスロットに上書きしてよろしいですか? text.overwrite = 上書き -text.save.none = セーブデータがありません\! +text.save.none = セーブデータがありません! text.saveload = [accent]セーブしています... -text.savefail = ゲームの保存に失敗しました。\! +text.savefail = ゲームの保存に失敗しました。! text.save.delete.confirm = このセーブデータを削除してよろしいですか? text.save.delete = 削除 text.save.export = エクスポート -text.save.import.invalid = [accent]無効なセーブデータです。\! -text.save.import.fail = [crimson]セーブのインポートに失敗\: [accent]{0} -text.save.export.fail = [crimson]セーブのエクスポートに失敗\: [accent]{0} +text.save.import.invalid = [accent]無効なセーブデータです。! +text.save.import.fail = [crimson]セーブのインポートに失敗: [accent]{0} +text.save.export.fail = [crimson]セーブのエクスポートに失敗: [accent]{0} text.save.import = セーブデータを読み込む -text.save.newslot = セーブデータ名\: +text.save.newslot = セーブデータ名: text.save.rename = リネーム -text.save.rename.text = 新しい名前\: +text.save.rename.text = 新しい名前: text.selectslot = セーブデータを選択 text.slot = [accent]スロット {0} -text.save.corrupted = [accent]セーブファイルが無効、または破損しました\!\nゲームのアップデート直後の場合、恐らくセーブデータのフォーマットの変更によるもので、バグではありません。 +text.save.corrupted = [accent]セーブファイルが無効、または破損しました!\nゲームのアップデート直後の場合、恐らくセーブデータのフォーマットの変更によるもので、バグではありません。 text.sector.corrupted = [accent]区域のセーブファイルが見つかりましたが、読み込みに失敗しました。\n新しく区域がが作成されます。 text.empty = <空> text.on = オン text.off = オフ -text.save.autosave = 自動保存\: {0} -text.save.map = マップ\: {0} +text.save.autosave = 自動保存: {0} +text.save.map = マップ: {0} text.save.wave = ウェーブ {0} -text.save.difficulty = 難易度\: {0} -text.save.date = 最終保存\: {0} -text.save.playtime = プレイ時間\: {0} +text.save.difficulty = 難易度: {0} +text.save.date = 最終保存: {0} +text.save.playtime = プレイ時間: {0} text.confirm = 確認 text.delete = 削除 text.ok = OK @@ -182,9 +180,9 @@ text.back = 戻る text.quit.confirm = 終了してもよろしいですか? text.changelog.title = 変更履歴 text.changelog.loading = 変更履歴を取得しています... -text.changelog.error.android = [accent]Android4.4または、それ以下では変更履歴が動作しない場合があります。\!\nこれはAndroidの内部バグによるものです。 +text.changelog.error.android = [accent]Android4.4または、それ以下では変更履歴が動作しない場合があります。!\nこれはAndroidの内部バグによるものです。 text.changelog.error.ios = [accent]iOSは変更履歴に対応していません。 -text.changelog.error = [scarlet]変更履歴の取得エラー\!\nインターネット接続を確認してください。 +text.changelog.error = [scarlet]変更履歴の取得エラー!\nインターネット接続を確認してください。 text.changelog.current = [yellow][[現在のバージョン] text.changelog.latest = [accent][[最新バージョン] text.loading = [accent]読み込み中... @@ -200,32 +198,32 @@ text.saveimage = イメージを保存 text.unknown = 不明 text.custom = カスタム text.builtin = 組み込み -text.map.delete.confirm = マップを削除してもよろしいですか? これは戻すことができません\! +text.map.delete.confirm = マップを削除してもよろしいですか? これは戻すことができません! text.map.random = [accent]ランダムマップ -text.map.nospawn = このマップにはスポーンするためのプレイヤーのコアがありません\! [ROYAL]青い[]コアをエディターでマップに追加してください。 -text.map.nospawn.pvp = このマップには敵がスポーンするためのプレイヤーのコアがありません\! [SCARLET]赤い[]コアをエディターでマップに追加してください。 -text.map.invalid = マップの読み込みエラー\: ファイルが無効、または破損しています。 +text.map.nospawn = このマップにはスポーンするためのプレイヤーのコアがありません! [ROYAL]青い[]コアをエディターでマップに追加してください。 +text.map.nospawn.pvp = このマップには敵がスポーンするためのプレイヤーのコアがありません! [SCARLET]赤い[]コアをエディターでマップに追加してください。 +text.map.invalid = マップの読み込みエラー: ファイルが無効、または破損しています。 text.editor.brush = ブラシ text.editor.slope = \\ text.editor.openin = エディターで開く text.editor.oregen = 鉱石の生成 -text.editor.oregen.info = 鉱石の生成\: +text.editor.oregen.info = 鉱石の生成: text.editor.mapinfo = マップ情報 -text.editor.author = 作者\: -text.editor.description = 説明\: -text.editor.name = 名前\: +text.editor.author = 作者: +text.editor.description = 説明: +text.editor.name = 名前: text.editor.teams = チーム text.editor.elevation = 標高 -text.editor.errorimageload = ファイルの読み込みエラー\:\n[accent]{0} -text.editor.errorimagesave = ファイルの保存エラー\:\n[accent]{0} +text.editor.errorimageload = ファイルの読み込みエラー:\n[accent]{0} +text.editor.errorimagesave = ファイルの保存エラー:\n[accent]{0} text.editor.generate = 生成 text.editor.resize = リサイズ text.editor.loadmap = マップを読み込む text.editor.savemap = マップを保存 -text.editor.saved = 保存しました\! -text.editor.save.noname = マップに名前がありません\! メニューの 'マップ情報' から設定してください。 -text.editor.save.overwrite = マップが組み込みマップを上書きしようとしています。\! メニューの 'マップ情報' から異なる名前に設定してください。 -text.editor.import.exists = [scarlet]インポートできません\:[] '{0}' はすでに組み込みマップの名前として存在します\! +text.editor.saved = 保存しました! +text.editor.save.noname = マップに名前がありません! メニューの 'マップ情報' から設定してください。 +text.editor.save.overwrite = マップが組み込みマップを上書きしようとしています。! メニューの 'マップ情報' から異なる名前に設定してください。 +text.editor.import.exists = [scarlet]インポートできません:[] '{0}' はすでに組み込みマップの名前として存在します! text.editor.import = インポート... text.editor.importmap = マップをインポート text.editor.importmap.description = すでに存在しているマップをインポート @@ -240,37 +238,35 @@ text.editor.exportimage = 地形イメージをエクスポート text.editor.exportimage.description = イメージファイルをエクスポート text.editor.loadimage = 地形をインポート text.editor.saveimage = 地形をエクスポート -text.editor.unsaved = [scarlet]保存されていない変更があります\![]\n終了してもよろしいですか? +text.editor.unsaved = [scarlet]保存されていない変更があります![]\n終了してもよろしいですか? text.editor.resizemap = マップをリサイズ -text.editor.mapname = マップ名\: -text.editor.overwrite = [accent]警告\!\n存在するマップを上書きします。 -text.editor.overwrite.confirm = [scarlet]警告\![] この名前のマップがすでに存在します。上書きしてもよろしいですか? -text.editor.selectmap = 読み込むマップを選択\: -text.width = 幅\: -text.height = 高さ\: +text.editor.mapname = マップ名: +text.editor.overwrite = [accent]警告!\n存在するマップを上書きします。 +text.editor.overwrite.confirm = [scarlet]警告![] この名前のマップがすでに存在します。上書きしてもよろしいですか? +text.editor.selectmap = 読み込むマップを選択: +text.width = 幅: +text.height = 高さ: text.menu = メニュー text.play = プレイ text.load = 読み込む text.save = 保存 -text.fps = FPS\: {0} -text.tps = TPS\: {0} -text.ping = Ping\: {0}ms +text.fps = FPS: {0} +text.tps = TPS: {0} +text.ping = Ping: {0}ms text.language.restart = 言語設定を有効にするにはゲームを再起動してください。 text.settings = 設定 text.tutorial = チュートリアル text.editor = エディター text.mapeditor = マップエディター text.donate = 寄附 - -text.connectfail = [crimson]サーバーへの接続できませんでした\:\n\n[accent]{0} +text.connectfail = [crimson]サーバーへの接続できませんでした:\n\n[accent]{0} text.error.unreachable = サーバーに到達できません。\nアドレスは正しいですか? text.error.invalidaddress = 無効なアドレスです。 text.error.timedout = タイムアウトしました!\nホストがポート開放されているか確認してください。アドレスは正しいです! -text.error.mismatch =パケットエラー:\nクライアント/サーバーのバージョンが一致しません。\nゲームとホストが最新のMindustryか確認してください! +text.error.mismatch = パケットエラー:\nクライアント/サーバーのバージョンが一致しません。\nゲームとホストが最新のMindustryか確認してください! text.error.alreadyconnected = すでに接続されています。 text.error.mapnotfound = マップファイルが見つかりません! text.error.any = 不明なネットワークエラーです。 - text.settings.language = 言語 text.settings.reset = デフォルトにリセット text.settings.rebind = 再設定 @@ -279,8 +275,8 @@ text.settings.game = ゲーム text.settings.sound = サウンド text.settings.graphics = グラフィック text.settings.cleardata = データを削除... -text.settings.clear.confirm = データを削除してもよろしいですか?\n元に戻すことはできません\! -text.settings.clearall.confirm = [scarlet]警告\![]\nこれはすべてのデータが削除されます。これにはセーブデータ、マップ、アンロック、キーバインドが含まれます。\n「ok」 を押すと、すべてのデータが削除され、自動的に終了します。 +text.settings.clear.confirm = データを削除してもよろしいですか?\n元に戻すことはできません! +text.settings.clearall.confirm = [scarlet]警告![]\nこれはすべてのデータが削除されます。これにはセーブデータ、マップ、アンロック、キーバインドが含まれます。\n「ok」 を押すと、すべてのデータが削除され、自動的に終了します。 text.settings.clearsectors = 区域を削除 text.settings.clearunlocks = アンロックを削除 text.settings.clearall = すべてを削除 @@ -290,6 +286,7 @@ text.no = いいえ text.info.title = 情報 text.error.title = [crimson]エラーが発生しました text.error.crashtitle = エラーが発生しました +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = ブロック情報 text.blocks.powercapacity = 電力容量 text.blocks.powershot = 電力/ショット @@ -322,7 +319,8 @@ text.blocks.coolant = 冷却 text.blocks.coolantuse = 冷却使用量 text.blocks.inputliquidfuel = 液体燃料 text.blocks.liquidfueluse = 液体燃料使用量 -text.blocks.explosive = 高い爆発性\! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 耐久値 text.blocks.inaccuracy = 不正確 text.blocks.shots = ショット @@ -347,6 +345,7 @@ text.category.liquids = 液体 text.category.items = アイテム text.category.crafting = 製作速度 text.category.shooting = 攻撃速度 +text.category.optional = Optional Enhancements setting.autotarget.name = 自動ターゲット setting.fpscap.name = 最大FPS setting.fpscap.none = なし @@ -356,14 +355,13 @@ setting.difficulty.easy = イージー setting.difficulty.normal = ノーマル setting.difficulty.hard = ハード setting.difficulty.insane = クレイジー -setting.difficulty.name = 難易度\: +setting.difficulty.name = 難易度: setting.screenshake.name = 画面を振る setting.effects.name = 画面効果 setting.sensitivity.name = 操作感度 setting.saveinterval.name = 自動保存間隔 setting.seconds = {0} 秒 setting.fullscreen.name = フルスクリーン -setting.multithread.name = マルチスレッド setting.fps.name = FPSを表示 setting.vsync.name = VSync setting.lasers.name = 電力レーザーを表示 @@ -408,8 +406,6 @@ mode.waves.name = ウェーブ mode.waves.description = ノーマルモードです。限られた資源でウェーブが自動的に始まります。 mode.sandbox.name = サンドボックス mode.sandbox.description = 無限の資源でウェーブを自由に始められます。 -mode.custom.warning = [scarlet]カスタムゲームまたは、サーバ内でのアンロックは保存されません。[]\n\nアンロックするには区域でプレイしてください。 -mode.custom.warning.read = 必ずお読みください\:\n[scarlet]カスタムゲーム内でのアンロックは区域やほかのモードには影響しません\!\n\n[LIGHT_GRAY](多分必要ないと思いますが) mode.freebuild.name = フリービルド mode.freebuild.description = 限られた資源でウェーブを自由に始められます。 mode.pvp.name = PvP @@ -482,21 +478,22 @@ mech.trident-ship.weapon = 爆弾 mech.glaive-ship.name = グライブ mech.glaive-ship.description = 大きく、重武装された攻撃機です。焼夷弾が装備され、優れた加速と最高速度を保有しています。 mech.glaive-ship.weapon = 焼夷弾 -text.item.explosiveness = [LIGHT_GRAY]爆発性\: {0}% -text.item.flammability = [LIGHT_GRAY]可燃性\: {0}% -text.item.radioactivity = [LIGHT_GRAY]放射能\: {0}% -text.item.fluxiness = [LIGHT_GRAY]流動性\: {0}% -text.unit.health = [LIGHT_GRAY]耐久値\: {0} -text.unit.speed = [LIGHT_GRAY]速度\: {0} -text.mech.weapon = [LIGHT_GRAY]武器\: {0} -text.mech.armor = [LIGHT_GRAY]装備\: {0} -text.mech.itemcapacity = [LIGHT_GRAY]アイテム容量\: {0} -text.mech.minespeed = [LIGHT_GRAY]採掘速度\: {0} -text.mech.minepower = [LIGHT_GRAY]採掘力\: {0} -text.mech.ability = [LIGHT_GRAY]能力\: {0} -text.liquid.heatcapacity = [LIGHT_GRAY]熱容量\: {0} -text.liquid.viscosity = [LIGHT_GRAY]粘度\: {0} -text.liquid.temperature = [LIGHT_GRAY]温度\: {0} +text.item.explosiveness = [LIGHT_GRAY]爆発性: {0}% +text.item.flammability = [LIGHT_GRAY]可燃性: {0}% +text.item.radioactivity = [LIGHT_GRAY]放射能: {0}% +text.item.fluxiness = [LIGHT_GRAY]流動性: {0}% +text.unit.health = [LIGHT_GRAY]耐久値: {0} +text.unit.speed = [LIGHT_GRAY]速度: {0} +text.mech.weapon = [LIGHT_GRAY]武器: {0} +text.mech.armor = [LIGHT_GRAY]装備: {0} +text.mech.itemcapacity = [LIGHT_GRAY]アイテム容量: {0} +text.mech.minespeed = [LIGHT_GRAY]採掘速度: {0} +text.mech.minepower = [LIGHT_GRAY]採掘力: {0} +text.mech.ability = [LIGHT_GRAY]能力: {0} +text.liquid.heatcapacity = [LIGHT_GRAY]熱容量: {0} +text.liquid.viscosity = [LIGHT_GRAY]粘度: {0} +text.liquid.temperature = [LIGHT_GRAY]温度: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = エネミースポーン block.core.name = コア block.metalfloor.name = 金属製の床 @@ -741,11 +738,11 @@ block.blast-drill.description = 高級ドリルです。大量の電力が必要 block.water-extractor.description = 地面から水を汲み上げます。近くに湖がない場合に便利です。 block.cultivator.description = 水で土壌を耕して、バイオメターを回収します。 block.oil-extractor.description = 大量の電力を使用して、砂から石油を回収します。近くに油田がない場合に便利です。 -block.dart-ship-pad.description = 今使っている機体から一般的な戦闘機に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 +block.dart-ship-pad.description =  今使っている機体から一般的な戦闘機に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 block.trident-ship-pad.description = 今使っている機体から武装した爆撃機に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 block.javelin-ship-pad.description = 今使っている機体から速くて強い電撃を放つ要撃機に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 block.glaive-ship-pad.description = 今使っている機体から大きく、重武装された攻撃機に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 -block.tau-mech-pad.description =今使っている機体から仲間の建物やユニットを修復する支援型機体に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 +block.tau-mech-pad.description = 今使っている機体から仲間の建物やユニットを修復する支援型機体に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 block.delta-mech-pad.description = 今使っている機体から速く突撃攻撃に向いた軽装備の戦闘機に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 block.omega-mech-pad.description = 今使っている機体から最前線での戦いに向けた重装備の大型機体に乗り換えます。\nパッドに乗って、パッドをダブルタップすることで使用できます。 block.spirit-factory.description = 鉱石の採掘やブロックの修復を行う軽いドローンを製造します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 2f4d1c04ec..e72a97601e 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -9,17 +9,15 @@ text.link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 text.link.google-play.description = Google Play 스토어 정보 text.link.wiki.description = 공식 Mindustry 위키 (영어) text.linkfail = 링크를 여는데 실패했습니다! URL이 기기의 클립보드에 복사되었습니다. -text.editor.web = HTML5 버전은 에디터 기능을 지원하지 않습니다! 게임을 다운로드 한 뒤에 사용 해 주세요. -text.web.unsupported = HTML5 버전은 이 기능을 지원하지 않습니다! 게임을 다운로드 한 뒤에 사용 해 주세요. text.gameover = 코어가 터졌습니다. 게임 오버! text.gameover.pvp = [accent]{0}[] 팀이 승리했습니다! -text.sector.gameover = 이 구역을 공략하는데 실패했습니다. 포기 하시겠습니까? +text.sector.gameover = 이 지역을 공략하는데 실패했습니다. 포기 하시겠습니까? text.sector.retry = 아니오 text.highscore = [YELLOW]최고점수 달성! text.wave.lasted = [accent]{0}[] 까지 버티셨습니다. text.level.highscore = 최고 점수 : [accent]{0} text.level.delete.title = 삭제 확인 -text.map.delete = 정말로 "[orange]{0}[]" 맵을 삭제하시겠습니까? +text.map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? text.level.select = 맵 선택 text.level.mode = 게임모드 : text.construction.desktop = PC 에서의 조작 방법이 변경되었습니다.\n블록 선택을 해제하거나 건설을 중지하려면 [accent]스페이스 바[]를 누르세요. @@ -35,12 +33,12 @@ text.loadgame = 게임 불러오기 text.joingame = 멀티플레이 text.addplayers = 플레이어 추가/제거 text.customgame = 커스텀 게임 -text.sectors = 싱글 플레이 -text.sector = 구역 : [LIGHT_GRAY]{0} +text.sectors = 지역 플레이 +text.sector = 지역 : [LIGHT_GRAY]{0} text.sector.time = 시간 : [LIGHT_GRAY]{0} text.sector.deploy = 시작 text.sector.abandon = 초기화 -text.sector.abandon.confirm = 정말로 이 구역의 모든 진행상활을 초기화 하겠습니까?\n이 작업은 되돌릴 수 없습니다! +text.sector.abandon.confirm = 정말로 이 지역의 모든 진행상황을 초기화 하겠습니까?\n이 작업은 되돌릴 수 없습니다! text.sector.resume = 계속하기 text.sector.locked = [scarlet][[완료안됨] text.sector.unexplored = [accent][[탐색안됨] @@ -49,21 +47,21 @@ text.mission = 목표 : [LIGHT_GRAY] {0} text.mission.main = 주요 목표 : [LIGHT_GRAY]{0} text.mission.info = 미션 정보 text.mission.complete = 미션 성공! -text.mission.complete.body = 구역 {0},{1} 클리어. -text.mission.wave = [accent]{0}/{1}[] 단계동안 생존하세요.남은 시간 {2}\n -text.mission.wave.enemies = [accent] {0}/{1} []단계를 생존하세요.\n{2}마리 남음 -text.mission.wave.enemy = [accent] {0}/{1} []단계를 생존하세요.\n{2}마리 남음 +text.mission.complete.body = 지역 {0},{1} 클리어. +text.mission.wave = [accent]{0}/{1}[] 단계 생존\n{2}초 남음 +text.mission.wave.enemies = [accent]{0}/{1} []단계 생존\n{2}마리 남음 +text.mission.wave.enemy = [accent]{0}/{1} []단계 생존\n{2}마리 남음 text.mission.wave.menu = [accent]{0}[] 단계 -text.mission.battle = 적 코어를 파괴하세요. +text.mission.battle = 적 코어를 파괴하세요 text.mission.resource.menu = {0} {1}개 수집 -text.mission.resource = {0} 자원을 수집하세요 :\n[accent]{1}/{2}[] +text.mission.resource = {0} 을(를) 수집하세요\n[accent]{1}/{2} text.mission.block = {0} 를 만드세요 text.mission.unit = {0} 유닛을 만드세요 text.mission.command = 유닛에게 {0} 명령을 보내세요 -text.mission.linknode = 전력 노드를 연결하세요. -text.mission.display = [accent]미션 :\n[LIGHT_GRAY]{0} +text.mission.linknode = 전력 노드를 연결하세요 +text.mission.display = [accent]목표 : [LIGHT_GRAY]{0} text.mission.mech = [accent]{0}[] 기체로 바꾸세요 -text.mission.create = [accent]{0}[] 자원을 만드세요 +text.mission.create = [accent]{0}[] 을(를)설치하세요. text.none = <없음> text.close = 닫기 text.quit = 나가기 @@ -81,8 +79,8 @@ text.players.single = 현재 {0}명만 있음. text.server.closing = [accent]서버 닫는중... text.server.kicked.kick = 서버에서 추방되었습니다! text.server.kicked.serverClose = 서버 종료됨. -text.server.kicked.sectorComplete = 구역 클리어. -text.server.kicked.sectorComplete.text = 임무 성공.\n서버가 다음구역 맵으로 이동되었습니다. +text.server.kicked.sectorComplete = 지역 클리어. +text.server.kicked.sectorComplete.text = 임무 성공.\n서버가 다음지역 맵으로 이동되었습니다. text.server.kicked.clientOutdated = 오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! text.server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! text.server.kicked.banned = 뭘 하셨는지는 모르겠지만, 이제 영원히 서버에 접속할 수 없습니다. @@ -140,7 +138,7 @@ text.connecting.data = [accent]맵 데이터 다운로드중... text.server.port = 포트 : text.server.addressinuse = 이 주소는 이미 사용중입니다! text.server.invalidport = 포트 번호가 잘못되었습니다. -text.server.error = [crimson]{0}[orange]서버를 여는데 오류가 발생했습니다.[] +text.server.error = [crimson]{0}[accent]서버를 여는데 오류가 발생했습니다.[] text.save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. text.save.new = 새로 저장 text.save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까? @@ -151,17 +149,17 @@ text.savefail = 게임을 저장하지 못했습니다! text.save.delete.confirm = 이 저장파일을 삭제 하시겠습니까? text.save.delete = 삭제 text.save.export = 저장파일 내보내기 -text.save.import.invalid = [orange]파일이 잘못되었습니다! -text.save.import.fail = [crimson]저장파일을 불러오지 못함 : [orange]{0} -text.save.export.fail = [crimson]저장파일을 내보내지 못함 : [orange]{0} +text.save.import.invalid = [accent]파일이 잘못되었습니다! +text.save.import.fail = [crimson]저장파일을 불러오지 못함 : [accent]{0} +text.save.export.fail = [crimson]저장파일을 내보내지 못함 : [accent]{0} text.save.import = 저장파일 불러오기 text.save.newslot = 저장 파일이름 : text.save.rename = 이름 변경 text.save.rename.text = 새 이름 : text.selectslot = 저장슬롯을 선택하십시오. text.slot = [accent]{0}번째 슬롯 -text.save.corrupted = [orange]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[]. -text.sector.corrupted = [orange]저장 파일에서 구역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다. +text.save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[]. +text.sector.corrupted = [accent]저장 파일에서 지역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다. text.empty = <비어있음> text.on = 켜기 text.off = 끄기 @@ -182,15 +180,15 @@ text.back = 뒤로가기 text.quit.confirm = 정말로 종료하시겠습니까? text.changelog.title = 변경사항 text.changelog.loading = 변경사항 가져오는중... -text.changelog.error.android = [orange]게임 변경사항은 가끔 Android 4.4 이하에서 작동하지 않습니다. 이것은 내부 Android 버그 때문입니다. -text.changelog.error.ios = [orange]현재 iOS에서는 변경 사항을 지원하지 않습니다. +text.changelog.error.android = [accent]게임 변경사항은 가끔 Android 4.4 이하에서 작동하지 않습니다. 이것은 내부 Android 버그 때문입니다. +text.changelog.error.ios = [accent]현재 iOS에서는 변경 사항을 지원하지 않습니다. text.changelog.error = [scarlet]게임 변경사항을 가져오는 중 오류가 발생했습니다![]\n인터넷 연결을 확인하십시오. -text.changelog.current = [orange][[현재 버전] -text.changelog.latest = [orange][[최신 버전] +text.changelog.current = [accent][[현재 버전] +text.changelog.latest = [accent][[최신 버전] text.loading = [accent]불러오는중... text.saving = [accent]저장중... -text.wave = [orange]{0}단계 -text.wave.waiting = 다음 단계 시작까지 {0}초 +text.wave = [accent]{0}단계 +text.wave.waiting = 남은 시간 : [green]{0}초[] text.waiting = [LIGHT_GRAY]대기중... text.waiting.players = 다른 플레이어를 기다리는 중.. text.wave.enemies = [LIGHT_GRAY]{0} 마리 남았음 @@ -216,8 +214,8 @@ text.editor.description = 설명 : text.editor.name = 이름 : text.editor.teams = 팀 text.editor.elevation = 지형 높이 -text.editor.errorimageload = [orange]{0}[] 파일을 불러오는데 오류가 발생했습니다. -text.editor.errorimagesave = [orange]{0}[] 파일 저장중 오류가 발생했습니다. +text.editor.errorimageload = [accent]{0}[] 파일을 불러오는데 오류가 발생했습니다. +text.editor.errorimagesave = [accent]{0}[] 파일 저장중 오류가 발생했습니다. text.editor.generate = 생성 text.editor.resize = 맵 크기조정 text.editor.loadmap = 맵 불러오기 @@ -261,7 +259,7 @@ text.tutorial = 게임 방법 text.editor = 편집기 text.mapeditor = 맵 편집기 text.donate = 기부 -text.connectfail = [crimson]{0}[orange] 서버에 연결하지 못했습니다.[] +text.connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] text.error.unreachable = 서버에 연결하지 못했습니다. text.error.invalidaddress = 잘못된 주소입니다. text.error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하십시오. @@ -275,11 +273,11 @@ text.settings.rebind = 키 재설정 text.settings.controls = 컨트롤 text.settings.game = 게임 text.settings.sound = 소리 -text.settings.graphics = 화면 +text.settings.graphics = 그래픽 text.settings.cleardata = 게임 데이터 초기화... text.settings.clear.confirm = 정말로 초기화 하겠습니까?\n이 작업을 되돌릴 수 없습니다! text.settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. -text.settings.clearsectors = 구역 초기화 +text.settings.clearsectors = 지역 초기화 text.settings.clearunlocks = 잠금 해제 초기화 text.settings.clearall = 모두 초기화 text.paused = 일시 정지 @@ -288,6 +286,7 @@ text.no = 아니오 text.info.title = [accent]정보 text.error.title = [crimson]오류가 발생했습니다. text.error.crashtitle = 오류가 발생했습니다. +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = 블록 정보 text.blocks.powercapacity = 최대 전력 용량 text.blocks.powershot = 1발당 전력 소모량 @@ -320,7 +319,8 @@ text.blocks.coolant = 냉각제 text.blocks.coolantuse = 냉각수 사용 text.blocks.inputliquidfuel = 연료 액 text.blocks.liquidfueluse = 액체 연료 사용 -text.blocks.explosive = 이 블록이 터지면 주변 블록과 같이 자폭을 합니다!! +text.blocks.boostitem = 가속 아이템 +text.blocks.boostliquid = 가속 액체 text.blocks.health = 체력 text.blocks.inaccuracy = 오차각 text.blocks.shots = 발포 횟수 @@ -345,6 +345,7 @@ text.category.liquids = 액체 text.category.items = 아이템 text.category.crafting = 제작 text.category.shooting = 사격 +text.category.optional = 선택적 향상 setting.autotarget.name = 자동 조준 setting.fpscap.name = 최대 FPS setting.fpscap.none = 없음 @@ -353,25 +354,24 @@ setting.difficulty.training = 훈련 setting.difficulty.easy = 쉬움 setting.difficulty.normal = 보통 setting.difficulty.hard = 어려움 -setting.difficulty.insane = 매우 어려움 +setting.difficulty.insane = [#00ff00]멀[#2efe2e]티[#58fa58]플[#81f781]레[#a9f5a9]이 [#81f781]전[#58fa58]용[] setting.difficulty.name = 난이도 : -setting.screenshake.name = 화면 흔들기 +setting.screenshake.name = 화면 흔들기 강도 setting.effects.name = 화면 효과 setting.sensitivity.name = 컨트롤러 감도 -setting.saveinterval.name = 자동저장 간격 +setting.saveinterval.name = 자동저장 간격 setting.seconds = {0}초 setting.fullscreen.name = 전체 화면 -setting.multithread.name = 멀티 스레드 setting.fps.name = FPS 표시 setting.vsync.name = VSync 활성화 -setting.lasers.name = 파워 레이져 표시 +setting.lasers.name = 전력 노드 레이저 표시 setting.minimap.name = 미니맵 보기 setting.musicvol.name = 음악 크기 setting.mutemusic.name = 음소거 setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 setting.crashreport.name = 오류 보고서 보내기 -text.keybind.title = 키 바인딩 +text.keybind.title = 조작키 설정 category.general.name = 일반 category.view.name = 보기 category.multiplayer.name = 멀티플레이 @@ -406,8 +406,6 @@ mode.waves.name = 단계 mode.waves.description = 이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다. mode.sandbox.name = 샌드박스 mode.sandbox.description = 무한한 자원과 다음단계 시작을 위한 타이머가 없습니다. -mode.custom.warning = [scarlet]서버에서 잠금해제한 블록은 저장되지 않습니다.[]\n\n구역을 플레이 하여 잠금해제하세요. -mode.custom.warning.read = 꼭 읽어보시길 바랍니다 :\n[scarlet]커스텀 게임에서 잠금해제한 블록은 구역 플레이나 다른 모드에서 적용되지 않습니다!\n\n[LIGHT_GRAY](이게 필요하지 않았으면 좋겠는데) mode.freebuild.name = 자유 건축 mode.freebuild.description = 제한된 자원과 다음단계 시작을 위한 타이머가 없습니다. mode.pvp.name = PvP @@ -425,8 +423,8 @@ item.lead.name = 납 item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. item.coal.name = 석탄 item.coal.description = 쉽게 구할 수 있으며, 주로 제련소 등에서 연료로 사용됩니다. -item.dense-alloy.name = 합금 -item.dense-alloy.description = 납과 구리로 만든 튼튼한 합금.\n고급 수송 블록이나 상위 티어 블록을 건설하는데 사용됩니다. +item.dense-alloy.name = 고밀도 합금 +item.dense-alloy.description = 납과 구리로 만든 튼튼한 고밀도 합금.\n고급 수송 블록이나 상위 티어 블록을 건설하는데 사용됩니다. item.titanium.name = 티타늄 item.titanium.description = 파이프 재료나 고급 드릴, 비행기/기체 등에서 재료로 사용되는 자원입니다. item.thorium.name = 토륨 @@ -442,9 +440,9 @@ item.surge-alloy.description = 주로 건물의 재료로 사용되는 자원입 item.biomatter.name = 바이오메터 item.biomatter.description = 이것은 유기농 덤불입니다!\n압축기에 넣어 석유로 바꿀 수 있습니다. item.sand.name = 모래 -item.sand.description = 합금이나 플럭스 등에서 제련시 광범위하게 사용되는 일반적인 재료입니다. -item.blast-compound.name = 화합물 -item.blast-compound.description = 포탑 및 건설의 재료로 사용되는 휘발성 화합물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. +item.sand.description = 고밀도 합금이나 플럭스 등에서 제련시 광범위하게 사용되는 일반적인 재료입니다. +item.blast-compound.name = 폭발물 +item.blast-compound.description = 포탑 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. item.pyratite.name = 피라테 item.pyratite.description = 폭발성을 가진 재료로, 주로 포탑의 탄약으로 사용됩니다. liquid.water.name = 물 @@ -495,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]능력 : {0} text.liquid.heatcapacity = [LIGHT_GRAY]발열량 : {0} text.liquid.viscosity = [LIGHT_GRAY]점도 : {0} text.liquid.temperature = [LIGHT_GRAY]온도 : {0} +block.constructing = {0}[LIGHT_GRAY](만드는중) block.spawn.name = 적 스폰지점 block.core.name = 코어 block.metalfloor.name = 철판 @@ -569,7 +568,7 @@ block.tau-mech-pad.name = 타우 기체 패드 block.conduit.name = 파이프 block.mechanical-pump.name = 기계식 펌프 block.itemsource.name = 아이템 소스 -block.itemvoid.name = 히오스 +block.itemvoid.name = 아이템 삭제 장치 block.liquidsource.name = 무한 액체공급 장치 block.powervoid.name = 방전장치 block.powerinfinite.name = 무한 전력공급 장치 @@ -583,7 +582,7 @@ block.phase-conveyor.name = 메타 컨베이어 block.bridge-conveyor.name = 터널 block.plastanium-compressor.name = 플라스터늄 압축기 block.pyratite-mixer.name = 피라테 제조기 -block.blast-mixer.name = 화합물 제조기 +block.blast-mixer.name = 폭발물 제조기 block.solidifer.name = 고체 block.solar-panel.name = 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판 @@ -592,7 +591,7 @@ block.spirit-factory.name = 스피릿 드론 공장 block.phantom-factory.name = 팬텀 드론 공장 block.wraith-factory.name = 유령 전투기 공장 block.ghoul-factory.name = 구울 폭격기 공장 -block.dagger-factory.name = 귀여운 디거 기체 공장 +block.dagger-factory.name = 디거 기체 공장 block.titan-factory.name = 타이탄 기체 공장 block.fortress-factory.name = 포트리스 기체 공장 block.revenant-factory.name = 레비던트 전투기 공장 @@ -608,18 +607,18 @@ block.thorium-reactor.name = 토륨 원자로 block.command-center.name = 명령 본부 block.mass-driver.name = 물질 이동기 block.blast-drill.name = 고속 발열 드릴 -block.thermal-pump.name = 지열 펌프 -block.thermal-generator.name = 지열 발전기 +block.thermal-pump.name = 화력 펌프 +block.thermal-generator.name = 열발전기 block.alloy-smelter.name = 설금 제련소 -block.mend-projector.name = 치료 프로젝터 +block.mend-projector.name = 수리 프로젝터 block.surge-wall.name = 설금벽 block.surge-wall-large.name = 큰 설금벽 block.cyclone.name = 사이클론 block.fuse.name = 퓨즈 block.shock-mine.name = 전격 지뢰 -block.overdrive-projector.name = 가속 프로젝터 -block.force-projector.name = 강제 프로젝터 -block.arc.name = 아크 +block.overdrive-projector.name = 오버드라이브 프로젝터 +block.force-projector.name = 보호막 프로젝터 +block.arc.name = Arc block.rtg-generator.name = 토륨 발전소 block.spectre.name = 스펙터 block.meltdown.name = 멜트다운 @@ -635,45 +634,44 @@ unit.spirit.name = 스피릿 드론 unit.spirit.description = 기본 드론 유닛. 기본적으로 코어에서 1개가 스폰됩니다. 자동으로 채광하며 아이템을 수집하고, 블록을 수리합니다. unit.phantom.name = 팬텀 드론 unit.phantom.description = 첨단 드론 유닛. 광석을 자동으로 채광하며, 아이템을 수집하고 블록을 수리합니다. 일반 드론보다 훨씬 효과적입니다. -unit.dagger.name = 귀여운 디거 -unit.dagger.description = 밈의 대상으로 지정되어 이름이 바뀐 기본 지상 유닛입니다. -## unit.dagger.description = 기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다. +unit.dagger.name = 디거 +unit.dagger.description = 기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다. unit.titan.name = 타이탄 -unit.titan.description = 고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다. +unit.titan.description = 고급 지상 유닛입니다. 고밀도 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다. unit.ghoul.name = 구울 폭격기 -unit.ghoul.description = 무거운 지상 폭격기 입니다. 화합물 또는 피라테를 탄약으로 사용합니다. +unit.ghoul.description = 무거운 지상 폭격기 입니다. 폭발물 또는 피라테를 탄약으로 사용합니다. unit.wraith.name = 유령 전투기 unit.wraith.description = 코어를 집중적으로 공격하는 방식을 사용하는 전투기 입니다. unit.fortress.name = 포트리스 unit.fortress.description = 중포 지상 유닛. 높은 공격력과 체력을 가지고 있습니다. unit.revenant.name = 레비던트 unit.revenant.description = 대형 레이저를 발사하는 공중 유닛입니다. -tutorial.begin = 플레이어의 임무는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n[accent]구리를 채광[]하는 것으로 시작합니다. 이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요. -tutorial.drill = 수동으로 채광하는 것은 비효율 적입니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요. +tutorial.begin = 플레이어의 주요 목표는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n이 게임은 [accent]구리를 채광[]하는 것으로 시작합니다.\n이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요. +tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요. tutorial.conveyor = [accent]컨베이어[]를 사용하여 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요. tutorial.morecopper = 더 많은 구리가 필요합니다.\n\n수동으로 채광하거나, 드릴을 더 설치하세요. tutorial.turret = 방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n기지 근처에 듀오 터렛을 설치하세요. tutorial.drillturret = 듀오 터렛이 작동하기 위해서는[accent] 구리 탄약 []을 필요로 합니다.\n터렛 옆에 드릴을 설치하여 구리를 공급하세요. tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n\n2단계 동안 코어를 보호하고 더 많은 터렛을 만드세요. tutorial.lead = 더 많은 광석을 이용할 수 있습니다. [accent]납[]을 찾아 탐색하세요.\n\n아이템을 코어로 전송할려면 플레이어 기체 또는 비행기에서 코어로 드래그 하세요. -tutorial.smelter = 구리와 납은 약한 금속입니다.\n[accent]합금[]은 제련소에서 만들 수 있습니다.\n\n하나 만드세요. -tutorial.densealloy = 이 제련소는 이제 합금을 생산할 것입니다.\n몇개 더 생산하세요.\n필요한 경우 더 만드세요. +tutorial.smelter = 구리와 납은 약한 금속입니다.\n[accent]고밀도 합금[]은 제련소에서 만들 수 있습니다.\n\n하나 만드세요. +tutorial.densealloy = 이 제련소는 이제 고밀도 합금을 생산할 것입니다.\n몇개 더 생산하세요.\n필요한 경우 더 만드세요. tutorial.siliconsmelter = 이제 이코어는 채굴과 수리하기 위한[accent] 스피릿 드론[]을 생성 할 것 입니다.\n\n[accent]실리콘[]을 사용해 다른 유닛을 생성하기 위한 공장을 만들 수 있습니다.\n실리콘 제련기를 제작하세요! tutorial.silicondrill = 실리콘을 제작하려면[accent] 석탄[] 과[accent] 모래[]가 필요합니다.\n드릴을 먼저 건설해보는건 어떤가요? -tutorial.generator = 이 기술은[LIGHT_YELLOW] 애너지[]가 필요합니다.\n[accent] 석탄 발전기[]를 건설하세요. +tutorial.generator = 이 건물은 [LIGHT_YELLOW]전력[]이 필요합니다.\n[accent] 석탄 발전기[]를 건설하세요. tutorial.generatordrill = [accent] 석탄 발전기[]는 연료가 필요합니다.\n[accent] 석탄[]을 드릴로 채굴해서 연료를 체워주세요. tutorial.node = 전력은 송신해줄 송신기가 필요합니다.\n[accent] 전력 송신기[]를 석탄 등등 발전기 옆에 설치해서 생산된 전기를 다른곳으로 송신합시다. tutorial.nodelink = 전력은 전력 블록과 발전기에 연결하거나, 연결된 전력 송신기를 통해 전송이 가능합니다. \n\n전력 송신기를 누르고 발전기와 실리콘 제련기를 선택하여 전원을 연결합시다. tutorial.silicon = 실리콘이 생산되고 있습니다.\n\n생산 시스템의 개선을 권고 드립니다. -tutorial.daggerfactory = 이[accent] 귀여운 디거 기체 공장[]은\n\n공격하는 기체를 생산하기 위해 사용됩니다. +tutorial.daggerfactory = 이[accent] 디거 기체 공장[]은\n\n공격하는 기체를 생산하기 위해 사용됩니다. tutorial.router = 공장을 작동시키기 위해 자원이 필요합니다.\n컨베이어에 운반되고 있는 자원을 분할할 분배기를 만드세요. tutorial.dagger = 전력 노드를 공장에 연결하세요.\n일단 요구 사항이 충족되면 기체 생산을 시작합니다.\n\n필요에 따라 드릴 및 발전기, 컨베이어를 더 많이 만들 수 있습니다. -tutorial.battle = [LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 귀여운 디거를 사용하여 파괴하세요. +tutorial.battle = [LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요. block.core.description = 게임에서 가장 중요한 건물.\n파괴되면 게임이 끝납니다. block.copper-wall.description = 구리로 만든 벽. block.copper-wall-large.description = 구리로 만든 큰 벽. -block.dense-alloy-wall.description = 합금으로 만든 벽. 구리벽보다 체력이 높습니다. -block.dense-alloy-wall-large.description = 합금으로 만든 큰 벽. +block.dense-alloy-wall.description = 고밀도 합금으로 만든 벽. 구리벽보다 체력이 높습니다. +block.dense-alloy-wall-large.description = 고밀도 합금으로 만든 큰 벽. block.thorium-wall.description = 토륨으로 만든 벽. block.thorium-wall-large.description = 토륨으로 만든 큰 벽. block.phase-wall.description = 날라오는 모든 총알을 튕겨내고 데미지를 입는 특수한 벽입니다. @@ -683,8 +681,8 @@ block.surge-wall-large.description = 설금을 재료로 한 큰 벽.\n데미지 block.door.description = 유닛이 지나갈 수 있도록 만든 문. 클릭하면 열고 닫습니다. block.door-large.description = 유닛이 자나갈 수 있도록 만든 큰 문. 클릭하면 열고 닫습니다. block.mend-projector.description = 주위 건물을 치료하는 건물입니다. -block.overdrive-projector.description = 범위 내 모든 행동의 속도를 높여주는 보조형 방어 건물입니다. -block.force-projector.description = 보호막을 생성하는 건물.\n기본적으로 전기만 있으면 작동하지만, 메타를 넣어 보호막의 범위를 크게 확장시킬 수 있습니다. +block.overdrive-projector.description = 범위 내 모든 행동의 속도를 높여주는 보조형 건물입니다. +block.force-projector.description = 보호막을 생성하는 건물.\n기본적으로 전력만 있으면 작동하지만, 메타를 넣어 보호막의 범위를 크게 확장시킬 수 있습니다. block.shock-mine.description = 적이 이 블록을 지나가면 전격 공격을 하는 함정형 방어 건물입니다. block.duo.description = 범용성을 가진 터렛.\n지상 및 공중공격을 하며, 초중반에 유용합니다. block.arc.description = 목표 방향으로 전격 공격을 하는 포탑입니다. @@ -703,15 +701,15 @@ block.titanium-conveyor.description = 빠른 속도로 자원을 수송할 수 block.phase-conveyor.description = 자원을 순간이동 시켜 주는 컨베이어 입니다. block.junction.description = 컨베이어를 교차시켜 자원을 수송할 때 사용할 수 있는 블록입니다. block.mass-driver.description = 자원을 받아서 다른 물질 이동기로 전달할 수 있는 블록입니다.\n엄청난 사거리를 가지고 있으며, 주로 컨베이어가 접근할 수 없는 곳에 유용하게 사용됩니다. -block.smelter.description = 합금을 제작할 수 있는 건물입니다. -block.arc-smelter.description = 합금을 제작할 수 있는 건물이지만, 이 건물은 석탄이 필요 없고 좀더 빠른 속도로 합금을 생산해낼 수 있습니다. +block.smelter.description = 고밀도 합금을 제작할 수 있는 건물입니다. +block.arc-smelter.description = 고밀도 합금을 제작할 수 있는 건물이지만, 이 건물은 석탄이 필요 없고 좀더 빠른 속도로 합금을 생산해낼 수 있습니다. block.silicon-smelter.description = 실리콘을 제작할 수 있는 건물입니다. block.plastanium-compressor.description = 플라스터늄을 제조할 수 있는 건물입니다. block.phase-weaver.description = 메타를 제작할 수 있는 건물입니다. block.alloy-smelter.description = 설금을 제작할 수 있는 건물입니다. block.pulverizer.description = 돌을 갈아서 모래로 만들 수 있는 건물입니다. block.pyratite-mixer.description = 피라테를 제조할 수 있는 건물입니다. -block.blast-mixer.description = 화합물을 제조할 수 있는 건물입니다. +block.blast-mixer.description = 폭발물을 제조할 수 있는 건물입니다. block.cryofluidmixer.description = 냉각수를 제작할 수 있는 건물입니다. block.solidifer.description = 용암을 돌로 만들 수 있는 건물입니다. block.melter.description = 돌로 용암을 만들 수 있는 건물입니다. @@ -719,14 +717,14 @@ block.incinerator.description = 불필요한 아이템을 소각시켜 줄 수 block.biomattercompressor.description = 잔디밭에서 바이오메터를 추출할 수 있는 건물입니다. block.separator.description = 돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. block.centrifuge.description = 돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물이지만, 이 건물은 좀 더 다양한 자원을 얻을 수 있게 해 줍니다. -block.power-node.description = 생성된 전기를 다른 건물로 전달하기 위한 전력 노드입니다. -block.power-node-large.description = 생성된 전기를 다른 건물로 전달하기 위한 건물이며, 일반 노드보다 더 많은 전력을 이동시킬 수 있습니다. -block.battery.description = 흔히 아는 충전식 배터리입니다.\n전력 생산건물에서 전력이 떨어질경우, 이 배터리를 전력 노드에 연결하면 이 배터리에 에 있는 전력을 사용하여 전기를 소모하는 건물에 전력을 지속적으로 공급할 수 있습니다. +block.power-node.description = 생성된 전력를 다른 건물로 전달하기 위한 전력 노드입니다. +block.power-node-large.description = 생성된 전력를 다른 건물로 전달하기 위한 건물이며, 일반 노드보다 더 많은 전력을 이동시킬 수 있습니다. +block.battery.description = 흔히 아는 충전식 배터리입니다.\n전력을 사용하는 건물에 전력이 떨어질경우, 이 배터리를 전력 노드에 연결하면 이 배터리에 저장된 전력을 소모하여 지속적으로 공급할 수 있습니다. block.battery-large.description = 일반 배터리보다 용량이 매우 커진 커진 배터리. -block.combustion-generator.description = 석탄을 연료로 전기를 생산해내는 발전소 입니다. -block.turbine-generator.description = 석탄 발전기보다 더 많은량의 전기를 생산하는 발전기입니다. +block.combustion-generator.description = 석탄을 연료로 전력를 생산해내는 발전소 입니다. +block.turbine-generator.description = 석탄 발전기보다 더 많은량의 전력를 생산하는 발전기입니다. block.thermal-generator.description = 용암을 원료로 전력을 생산할 수 있는 발전소입니다. -block.solar-panel.description = 태양열을 받아 자기 스스로 전력을 생산하는 블록입니다. +block.solar-panel.description = 태양열을 받아 자기 스스로 전력을 생산하는 건물입니다. block.solar-panel-large.description = 태양열을 받아 자기 스스로 전력을 생산하지만, 이 블록은 더 빨리 전력을 생산할 수 있습니다. block.thorium-reactor.description = 토륨을 원료로 하는 토륨 원자로 입니다.\n많은 전력을 생산하지만 엄청난 열을 발생시키기 때문에, 많은 량의 물 또는 냉각수가 있어야 터지지 않고 작동합니다. block.rtg-generator.description = 냉각은 필요 없지만 토륨 원자로보다 적은량의 전력을 생산하는 방사선 동위원소 열전자 발전기. @@ -739,7 +737,7 @@ block.laser-drill.description = 토륨을 채광할 수 있는 최고급 드릴 block.blast-drill.description = 최상위 드릴입니다. 엄청난 양의 전력과 물을 소모하는 대신, 매우 빠른 속도로 채광합니다. block.water-extractor.description = 바닥에서 물을 추출하여 건물에 공급할 수 있는 건물입니다. block.cultivator.description = 잔디에서 바이오메터를 추출할 수 있는 건물입니다. -block.oil-extractor.description = 기름(타르)을 추출 해 주는 건물입니다. +block.oil-extractor.description = 석유를 추출 해 주는 건물입니다. block.dart-ship-pad.description = 다트 비행선으로 바꿀 수 있는 패드입니다. block.trident-ship-pad.description = 삼지창 비행선으로 바꿀 수 있는 패드입니다. block.javelin-ship-pad.description = 자비린 비행선으로 바꿀 수 있는 패드입니다. @@ -751,7 +749,7 @@ block.spirit-factory.description = 스피릿 유닛을 생산하는 공장입니 block.phantom-factory.description = 유닛 팬텀을 생산하는 공장입니다. block.wraith-factory.description = 유닛 유령 전투기를 소환하는 공장입니다. block.ghoul-factory.description = 구울 유닛을 생산하는 공장입니다. -block.dagger-factory.description = 귀여운 디거를 생산하는 공장입니다. +block.dagger-factory.description = 디거를 생산하는 공장입니다. block.titan-factory.description = 타이탄 유닛을 생산할 수 있는 공장입니다. block.fortress-factory.description = 포트리스를 생산하는 공장입니다. block.revenant-factory.description = 레비던트 유닛을 생산할 수 있는 공장입니다. @@ -766,17 +764,17 @@ block.liquid-junction.description = 물펌프와 다른 물펌프를 서로 교 block.bridge-conduit.description = 다리와 다리 사이를 연결하여 액체가 지나갈 수 있게 해 줍니다.\n주로 다리 사이에 지나갈 수 없는 장애물이 있을 때 사용합니다. block.mechanical-pump.description = 구리로 제작할 수 있는 기계식 물펌프입니다. block.rotary-pump.description = 일반 물 펌프보다 더 빠른 속도로 물을 끌어올릴 수 있는 펌프입니다. -block.thermal-pump.description = 용암 위에서 사용할 수 있는 펌프입니다. +block.thermal-pump.description = 기계식 펌프보다 3배 빠른 속도로 액체를 퍼올릴 수 있는 펌프이며, 용암도 퍼올릴 수 있는 유일한 펌프입니다. block.router.description = 한 방향에서 아이템을 받은 후 최대 3개의 다른 방향으로 동일하게 출력합니다.\n재료를 한곳에서 여러 대상으로 분할하여 운반하는데 유용합니다. block.distributor.description = 아이템을 최대 7개의 다른 방향으로 똑같이 분할하는 고급 분배기. block.bridge-conveyor.description = 고급 자원 수송 블록.\n지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. block.alpha-mech-pad.description = 알파 기체로 바꿀 수 있는 패드입니다. block.itemsource.description = 자원을 선택하면 그 자원이 무한하게 생성되는 블록입니다. block.liquidsource.description = 무한한 액체를 출력해냅니다. -block.itemvoid.description = 아이템을 시공으로 빠트려 사라지게 만듭니다. +block.itemvoid.description = 아이템을 사라지게 만듭니다. block.powerinfinite.description = 무한한 전력을 공급해주는 블록입니다. block.powervoid.description = 설정된 아이템을 계속해서 출력하는 블록입니다. liquid.water.description = 지상 유닛이 이 위를 지나가면 이동속도가 느려지고, 깊은 물에 빠지면 죽습니다. liquid.lava.description = 지상 유닛이 이 위를 지나가면 이동속도가 매우 느려지고, 지속적으로 데미지를 입습니다. liquid.oil.description = 일부 조합 블록에서 사용되는 자원입니다. -liquid.cryofluid.description = 포탑 및 토륨 원자로에서 사용되는 자원입니다. 누출시 폭발 및 방화의 위험성이 있습니다. +liquid.cryofluid.description = 포탑 및 토륨 원자로에서 사용되는 자원입니다. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 850ad3327e..93a78942b5 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania text.link.google-play.description = Google Play store listing text.link.wiki.description = Oficjana Wiki Mindustry text.linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. -text.editor.web = Wersja przeglądarkowa nie wspomaga edytora map!\nPobierz grę aby użyć edytora. -text.web.unsupported = Wersja przeglądarkowa nie wspomaga tej fukcji!\nPobierz grę aby użyć tej funkcji. text.gameover = Rdzeń został zniszczony. text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = This sector has been lost. Re-deploy? @@ -288,6 +286,7 @@ text.no = Nie ma mowy! text.info.title = [accent]Informacje text.error.title = [crimson]Wystąpił błąd text.error.crashtitle = Wystąpił błąd +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Informacje o bloku text.blocks.powercapacity = Pojemność mocy text.blocks.powershot = moc / strzał @@ -320,7 +319,8 @@ text.blocks.coolant = Płyn chłodzący text.blocks.coolantuse = Zużycie płynu chłodzącego text.blocks.inputliquidfuel = Paliwo 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.inaccuracy = Niedokładność text.blocks.shots = Strzały @@ -345,6 +345,7 @@ text.category.liquids = Płyny text.category.items = Przedmioty text.category.crafting = Przetwórstwo text.category.shooting = Strzelanie +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None @@ -361,7 +362,6 @@ setting.sensitivity.name = Czułość kontrolera setting.saveinterval.name = Interwał automatycznego zapisywania setting.seconds = Sekundy setting.fullscreen.name = Pełny ekran -setting.multithread.name = Wielowątkowość setting.fps.name = Widoczny licznik FPS setting.vsync.name = Synchronizacja pionowa setting.lasers.name = Pokaż lasery zasilające @@ -370,6 +370,7 @@ setting.musicvol.name = Głośność muzyki setting.mutemusic.name = Wycisz muzykę setting.sfxvol.name = Głośność dźwięków setting.mutesound.name = Wycisz dźwięki +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Zmień ustawienia przycisków category.general.name = General category.view.name = View @@ -405,8 +406,6 @@ mode.waves.name = Fale mode.waves.description = Normalny tryb. Normalne surowce i fale. mode.sandbox.name = sandbox 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.description = Normalne surowce i fale bez odliczania. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Ability: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0} text.liquid.viscosity = [LIGHT_GRAY]Lepkość: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Core block.metalfloor.name = Metal Floor diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index e36c930dce..d663e8f5ac 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = Pagina da Itch.io com os Downloads text.link.google-play.description = Google Play store listing text.link.wiki.description = Wiki oficial do Mindustry text.linkfail = Falha ao abrir o link\nO Url foi copiado -text.editor.web = A versão web não suporta o editor!\nBaixe o jogo para usar. -text.web.unsupported = A versão web não suporta este recurso! Baixe o jogo para usar. text.gameover = O núcleo foi destruído. text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = Esse setor foi perdido! Soltar Novamente? @@ -288,6 +286,7 @@ text.no = Não text.info.title = [accent]Informação text.error.title = [crimson]Ocorreu um Erro. text.error.crashtitle = Ocorreu um Erro +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Informação do Bloco text.blocks.powercapacity = Capacidade de Energia text.blocks.powershot = Energia/tiro @@ -320,7 +319,8 @@ text.blocks.coolant = Esfriador text.blocks.coolantuse = Uso do esfriador text.blocks.inputliquidfuel = 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.inaccuracy = Imprecisão text.blocks.shots = Tiros @@ -345,6 +345,7 @@ text.category.liquids = Liquidos text.category.items = Itens text.category.crafting = Construindo text.category.shooting = Atirando +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = FPS Maximo setting.fpscap.none = Nenhum @@ -361,7 +362,6 @@ setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de autosalvamento setting.seconds = {0} Segundos setting.fullscreen.name = Tela Cheia -setting.multithread.name = Multithreading setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.lasers.name = Mostrar lasers @@ -370,6 +370,7 @@ setting.musicvol.name = Volume da Música setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Refazer teclas category.general.name = General category.view.name = View @@ -405,8 +406,6 @@ mode.waves.name = hordas mode.waves.description = O modo normal. Recursos limitados E os ataques vem automaticamente. mode.sandbox.name = sandbox 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.description = recursos limitados e Sem tempo para Ataques. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Ability: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Core block.metalfloor.name = Metal Floor diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 9c4d361ef3..7218e4051e 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = itch.io страница с загрузкой text.link.google-play.description = Скачать для Android c Google play text.link.wiki.description = Официальная вики Mindustry(англ.) text.linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. -text.editor.web = Веб-версия не поддерживает редактор!\nЗагрузите игру, чтобы использовать его. -text.web.unsupported = Веб-версия не поддерживает эту функцию! Загрузите игру, чтобы использовать её. text.gameover = Игра окончена text.gameover.pvp = [accent] {0}[] команда победила! text.sector.gameover = Этот сектор потерян. Высадится повторно? @@ -50,9 +48,9 @@ text.mission.main = Главная мисия:[LIGHT_GRAY] {0} text.mission.info = Информация о миссии text.mission.complete = Миссия выполнена! text.mission.complete.body = Сектор {0},{1} был завоёван. -text.mission.wave = Пережить следующее количество волн: [accent]{0}/{1}[]\nВолна в {2} -text.mission.wave.enemies = Осталось волн:[accent] {0}/{1}[]\n{2} враг. -text.mission.wave.enemy = Осталось волн:[accent] {0}/{1}[]\n{2} враг +text.mission.wave = Осталось[accent] {0}[] волн из[accent] {1}[]\nВолна через {2} +text.mission.wave.enemies = Осталось[accent] {0}/{1}[] волн:\n{2} враг. +text.mission.wave.enemy = Осталось[accent] {0}/{1}[] волн\n{2} враг text.mission.wave.menu = Пережить[accent] {0} []волн text.mission.battle = Уничтожьте ядро противника. text.mission.resource.menu = Добыть {0} х{1} @@ -262,13 +260,13 @@ text.editor = Редактор text.mapeditor = Редактор карт text.donate = Донат text.connectfail = [crimson]Не удалось подключиться к серверу: [accent] {0} -text.error.unreachable = Server unreachable. -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.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -text.error.alreadyconnected = Already connected. +text.error.unreachable = Сервер недоступен. +text.error.invalidaddress = Некорректный адрес. +text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! +text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у вас и у создателя сервера установлена последняя версия Mindustry\\! +text.error.alreadyconnected = Вы уже подключены. text.error.mapnotfound = Map file not found! -text.error.any = Unkown network error. +text.error.any = Неизвестная сетевая ошибка. text.settings.language = Язык text.settings.reset = Сбросить по умолчанию text.settings.rebind = Смена @@ -288,6 +286,7 @@ text.no = Нет text.info.title = Информация text.error.title = [crimson]Произошла ошибка text.error.crashtitle = Произошла ошибка +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Информация о блоке text.blocks.powercapacity = Вместимость энергии text.blocks.powershot = Энергия/выстрел @@ -320,7 +319,8 @@ text.blocks.coolant = Охлаждающая жидкость text.blocks.coolantuse = Охлажд. жидкости используется text.blocks.inputliquidfuel = Жидкое топливо text.blocks.liquidfueluse = Жидкого топлива используется -text.blocks.explosive = Взрывоопасно! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Здоровье text.blocks.inaccuracy = Разброс text.blocks.shots = Выстрелы @@ -345,6 +345,7 @@ text.category.liquids = Жидкости text.category.items = Предметы text.category.crafting = Создание text.category.shooting = Cтрельба +text.category.optional = Optional Enhancements setting.autotarget.name = Авто-цель setting.fpscap.name = Макс. FPS setting.fpscap.none = Неограниченный @@ -361,7 +362,6 @@ setting.sensitivity.name = Чувствительность контроллер setting.saveinterval.name = Интервал автосохранения setting.seconds = {0} Секунд setting.fullscreen.name = Полноэкранный режим -setting.multithread.name = Многопоточность (TPS) setting.fps.name = Показывать FPS setting.vsync.name = Верт. синхронизация setting.lasers.name = Показывать энергетические лазеры @@ -370,6 +370,7 @@ setting.musicvol.name = Громкость музыки setting.mutemusic.name = Заглушить музыку setting.sfxvol.name = Громкость звуковых эффектов setting.mutesound.name = Заглушить звук +setting.crashreport.name = Отправлять анонимные отчёты о сбоях text.keybind.title = Настройка управления category.general.name = Основное category.view.name = Просмотр @@ -405,8 +406,6 @@ mode.waves.name = Волны mode.waves.description = В режиме "волны" ограниченные ресурсы и автоматические наступающие волны. mode.sandbox.name = Песочница 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.description = ограниченные ресурсы и нет таймера для волн. mode.pvp.name = Противо-\nстояние @@ -434,10 +433,10 @@ item.silicon.name = Кремень item.silicon.description = Очень полезный полупроводник с применениями в солнечных батареях и множестве сложной электроники. item.plastanium.name = Пластиний item.plastanium.description = Легкий, пластичный материал, используемый в современных самолетах и боеприпасах для фрагментации. -item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.phase-fabric.name = Фазовая ткань +item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. item.surge-alloy.name = Высокопрочный сплав -item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.surge-alloy.description = Передовой сплав с уникальными электрическими свойствами. item.biomatter.name = Биоматерия item.biomatter.description = Скопление органической кашки; используется для переработки в нефть или в качестве топлива. item.sand.name = Песок @@ -494,13 +493,14 @@ text.mech.ability = [LIGHT_GRAY]Способность: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Теплоёмкость: {0} text.liquid.viscosity = [LIGHT_GRAY]Вязкость: {0} text.liquid.temperature = [LIGHT_GRAY]Температура: {0} +block.constructing = {0}\n[LIGHT_GRAY](В процессе) block.spawn.name = Спаун врагов block.core.name = Ядро block.metalfloor.name = Мeталичeский пoл block.deepwater.name = Глубоководье block.water.name = Вода block.lava.name = Лава -block.tar.name = Tar +block.tar.name = Дёготь block.blackstone.name = Чёрный камень block.stone.name = Камень block.dirt.name = Земля @@ -557,9 +557,9 @@ block.pneumatic-drill.name = Пневматический бур block.laser-drill.name = Лазерный бур block.water-extractor.name = Экстрактор воды block.cultivator.name = Культиватор -block.alpha-mech-pad.name = Завод мехов "Альфа" -block.dart-ship-pad.name = Реконструктор дротиковых самолётов -block.delta-mech-pad.name = Завод мехов "Дельта" +block.alpha-mech-pad.name = Реконструктор мехов "Альфа" +block.dart-ship-pad.name = Реконструктор кораблей "Дротик" +block.delta-mech-pad.name = Реконструктор мехов "Дельта" block.javelin-ship-pad.name = Реконструктор кораблей "Джавелин" block.trident-ship-pad.name = Реконструктор кораблей "Трезубeц" block.glaive-ship-pad.name = Реконструктор кораблей "Копьё" @@ -668,7 +668,7 @@ tutorial.daggerfactory = Постройте[accent] завод по произв tutorial.router = Заводы нуждаются в ресурсах для работы.\nСоздайте маршрутизатор для разделения ресурсов конвейера. tutorial.dagger = Соедините силовой узел с заводом.\nПосле выполнения требований будет создан мех. \n\nПри необходимости создайте дополнительные буры, генераторы и конвейеры. tutorial.battle = [LIGHT_GRAY] Враг[] показал своё ядро.\nУничтожьте его своим мехом и вашой новой боевой единицой. -block.copper-wall.description = Стена с самым маленьким запасом прочности.\n Хороша в начале игры для защиты. +block.copper-wall.description = Дешевый оборонительный блок.\nПолезно для защиты ядра и турелей во время первых волн. block.copper-wall-large.description = Большая стена самым маленьким запасом прочности.\n Хороша в начале игры. block.dense-alloy-wall.description = Стена с показателем прочности "ниже среднего". block.dense-alloy-wall-large.description = Большая стена с показателем прочности "ниже среднего". @@ -684,7 +684,7 @@ block.mend-projector.description = Ремонтирует строения в н block.overdrive-projector.description = Ускоряет в небольшом радиусе все ваши действия. block.force-projector.description = Создаёт в небольшом радиусе силовое поле, которое защищает от атак противника. block.shock-mine.description = Поставьте её на землю. Она бьётся ЭЛЕКТРИЧЕСТВОМ О_О -block.duo.description = Хорошая турель начальная турель. Используйте стены для её зашиты.\n\nИспользует в качестве снарядов медь, плотный сплав, кремний и пиротит.\n\nМожно подвести воду и криогенную жидкость для ускорения стрельбы. +block.duo.description = Маленькая и дешёвая турель. block.arc.description = Турель с малым радиусом атаки. В качестве патронов требует воду или криогенную жидкость. Также нужна энергия. block.hail.description = Дальнобойная начальная турель.\nИспользует в качестве снарядов плотный сплав, кремний и пиротит.\nДля ускорения стрельбы можно подвести воду и криогенную жидкость. block.lancer.description = Турель, которая стреляет лазером на среднее расстояние.\nИспользует в качестве снарядов энергию.\nДля ускорения стрельбы можно подвести воду, нефть и криогенную жидкость. @@ -727,54 +727,54 @@ block.thermal-generator.description = [accent]Горячее восприним block.solar-panel.description = Зелёная энергия. Бесконечный источник энергии. block.solar-panel-large.description = Зелёная энергия. Большой и бесконечный источник энергии. block.thorium-reactor.description = Производит энергию в большом количестве. Может взорваться. Требуется торий и жидкость для охлаждения (вода или криогенная). -block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. +block.rtg-generator.description = Радиоизотопный термоэлектрический генератор, который не требует охлаждения, но обеспечивает меньшую мощность, чем ториевый реактор. block.unloader.description = Выгружает из ядра или хранилища верхний левый предмет. -block.container.description = Может хранить 500 ед. ресурсов. С помощью разгрузчика можно достать ресурсы из него. -block.vault.description = Хранит предметы в количестве до 2 000. -block.mechanical-drill.description = Самый первый доступный бур. Добывает медь, свинец, уголь, песок. Можно подвести к нему [BLUE] воду[] для увеличения скорости сверления. +block.container.description = Хранит небольшое количество предметов(250). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.vault.description = Хранит большое количество предметов(1000). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.mechanical-drill.description = Самый первый доступный бур. \n\nДобывает медь, свинец, уголь, песок. \n\nМожно подвести к нему [BLUE] воду[] для увеличения скорости сверления. block.pneumatic-drill.description = Улучшенная версия механического бура.\n\nДобывает тоже самое, что и механический бур. Также может добывать титан и камень.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления. block.laser-drill.description = Улучшенная версия пневматического бура.\n\nДобывает тоже самое, что и пневматический бур. Также может добывать торий.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления. -block.blast-drill.description = Самый мощный бур.\n\n Добывает тоже самое, что и лазерный бур. Сверлит быстрей всех буров, но требует ещё больше энергии.\n\n Можно подвести к нему [BLUE]воду[] для увеличения скорости сверления. -block.water-extractor.description = Добывает воду из земли. Требует Энергию. -block.cultivator.description = Производит биоматерию из травы и воды. Требует энергии. -block.oil-extractor.description = Производит нефть из динозавров(зачёркнуто), воды и песка. Требует энергии. -block.dart-ship-pad.description = Превращает вас в дротиковый самолёт. Реконструктор требует энергию.\nПодробности про дротиковых самолётов в "разблокированное". -block.trident-ship-pad.description = Превращает вас в Трезубeц. Реконструктор требует энергию.\nПодробности про Трезубeц в "разблокированное". -block.javelin-ship-pad.description = Превращает вас в Джавелин. Реконструктор требует энергию.\nПодробности про Джавелин в "разблокированное". +block.blast-drill.description = Самый мощный бур.\n\nДобывает тоже самое, что и лазерный бур. Сверлит быстрей всех буров, но требует ещё больше энергии.\n\nМожно подвести к нему [BLUE]воду[] для увеличения скорости сверления. +block.water-extractor.description = Извлекает воду из земли. Используйте его, когда поблизости нет озера. +block.cultivator.description = Культирует почву водой для получения биоматерии. +block.oil-extractor.description = Использует большое количество энергии для добычи нефти из песка, динозавров(зачёркнуто). Используйте его, когда поблизости нет прямого источника нефти. +block.dart-ship-pad.description = Оставьте свое текущее судно и перейдите на основной истребитель.\nИспользуйте двойное нажатие, стоя на реконструкторе, чтобы превратиться в этот мех. +block.trident-ship-pad.description = Оставьте свой текущий корабль и перейдите в достаточно хорошо бронированный тяжёлый бомбардировщик.\nИспользуйте двойное нажатие, стоя на реконструкторе, чтобы превратиться в этот мех. +block.javelin-ship-pad.description = Оставьте свой текущий корабль и перейдите в сильный и быстрый перехватчик с молниеносным оружием.\nИспользуйте двойное нажатие, стоя на реконструкторе, чтобы превратиться в этот мех. block.glaive-ship-pad.description = Превращает вас в Копьё. Реконструктор требует энергию.\nПодробности про Копьё в "разблокированное". -block.tau-mech-pad.description = Превращает вас в Тау. Реконструктор требует энергию.\nПодробности про Тау в "разблокированное". -block.delta-mech-pad.description = Превращает вас в "Дельта". Реконструктор требует энергию.\nПодробности про "Дельта" в "разблокированное". -block.omega-mech-pad.description = Превращает вас в Омега. Реконструктор требует энергию.\nПодробности про Омега в "разблокированное". -block.spirit-factory.description = Производит дронов типа "призрак" -block.phantom-factory.description = Производит дронов типа "фантом"\nПодробности в "разблокированное" -block.wraith-factory.description = Производит призрачных истребителей\nПодробности в "разблокированное" -block.ghoul-factory.description = Производит гулевых бомбардировщиков\nПодробности в "разблокированное" -block.dagger-factory.description = Производит\nПодробности в "разблокированное" -block.titan-factory.description = Производит мехов типа "Титан".\nПодробности в "разблокированное" -block.fortress-factory.description = Огромный медленный мех обладающий такой-же огромной пушкой. -block.revenant-factory.description = Производит бомбардировщиков типа "Потусторонний убийца"\nПодробности в "разблокированное" +block.tau-mech-pad.description = Покиньте свой текущий корабль и превратитесь в мех поддержки, который может исцелять дружественные здания и юниты.\nИспользуйте двойное нажатие, стоя на реконструкторе, чтобы превратиться в этот мех. +block.delta-mech-pad.description = Оставьте свой текущий корабль и перейдите в большой, хорошо бронированный боевой корабль.\nИспользуйте двойное нажатие, стоя на реконструкторе, чтобы превратиться в этот мех. +block.omega-mech-pad.description = Оставьте свой текущий корабль и превратите его в громоздкий и хорошо бронированный мех, сделанный для фронтовых нападений. \nИспользуйте двойное нажатие, стоя на реконструкторе, чтобы превратиться в этот мех. +block.spirit-factory.description = Производит легкие дроны, которые добывают руду(медную и свинцовую) и ремонтирует блоки. +block.phantom-factory.description = Производит усовершенствованные единицы, которые значительно эффективнее, чем дрон-привидение. +block.wraith-factory.description = Производит быстрые и летающие боевые единицы. +block.ghoul-factory.description = Производит тяжёлых ковровых бомбардировщиков. +block.dagger-factory.description = Производит основных наземных боевых единиц. +block.titan-factory.description = Производит продвинутые защищённые боевые единицы. +block.fortress-factory.description = Производит тяжелые артиллерийские боевые единицы. +block.revenant-factory.description = Производит тяжелые наземные боевые единицы. block.repair-point.description = Может ремонтировать вас и ваши боевые единицы -block.command-center.description = Позволяет управлять боевыми единицами.\nСтрелочка - атаковать\nЩит - отступать. -block.conduit.description = Конвейер для жидкостей первого поколения. Медленная скорость передачи жидкости. -block.pulse-conduit.description = Конвейер для жидкостей второго поколения. -block.phase-conduit.description = Лучший трубопровод, требует энергию. Похоже, он из будущего. -block.liquid-router.description = Распределяет жидкость на 4 стороны. -block.liquid-tank.description = Хранит жидкость. -block.liquid-junction.description = Название говорит само за себя. С помощью него можно сделать две трубы, которые проходят через друг-друга и не смешиваются. -block.bridge-conduit.description = Позволяет проходить над возвышенностями(блоками). Лучше всего подключать последовательно и в линию. -block.mechanical-pump.description = Качает только воду. -block.rotary-pump.description = Качает воду и нефть. Требует энергии. -block.thermal-pump.description = Позволяет качать лаву, воду и нефть. -block.router.description = Принимает предметы из одного направления и равномерно выводит их до трех других направлений. Полезно для разделения материалов из одного источника на несколько целей. -block.distributor.description = Продвинутый маршрутизатор, который равномерно разбивает элементы до 7 направлений. -block.bridge-conveyor.description = Продвинутый транспортный блок элемента. Позволяет транспортировать предметы до 3-х плиток любого ландшафта или здания. -block.alpha-mech-pad.description = Превращает вас в "Альфа". Требует энергию.\n Подробности про "Альфа" в "разблокированное". -block.itemsource.description = Из этого блока можно получить любой предмет. -block.liquidsource.description = Из этого блока можно получить любую жидкость. -block.itemvoid.description = Предметы просто уходят в пустоту -block.powerinfinite.description = Бесконечность — не предел. -block.powervoid.description = Жидкости просто уходят в пустоту +block.command-center.description = Позволяет изменять дружественное поведение ИИ. В настоящее время поддерживаются команды атаки, отступления и патрулирования. +block.conduit.description = Основной блок транспортировки жидкости. Работает как конвейер, но с жидкостями. Лучше всего использовать экстракторы, насосы или т.п.. +block.pulse-conduit.description = Улучшенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные. +block.phase-conduit.description = Улучшенный блок транспортировки жидкости. Использует энергию для передачи жидкостей на подключенный фазовый канал на несколько плиток. +block.liquid-router.description = Принимает жидкости с одного направления и равномерно выводит их до трех других направлений. Может также хранить определенное количество жидкости. Полезно для разделения жидкостей из одного источника на несколько целей. +block.liquid-tank.description = Хранит большое количество жидкостей. Используйте его для создания буферов, когда существует непостоянная потребность в материалах или в качестве защиты для охлаждения жизненно важных блоков. +block.liquid-junction.description = Действует как мост для двух пересекающихся каналов. Полезно в ситуациях с двумя различными каналами, перевозящими различные жидкости в разные места. +block.bridge-conduit.description = Расширенный блок транспортировки жидкости. Позволяет транспортировать жидкости до 3 блоков любого ландшафта или здания. Лучше всего подключать последовательно и в линию. +block.mechanical-pump.description = Дешевый насос с медленным выкачиванием, но без потребления энергии. Качает только воду. +block.rotary-pump.description = Передовой насос, который удваивает скорость, используя энергию. +block.thermal-pump.description = Конечный насос. В три раза быстрее, чем механический насос и единственный насос, который способен извлекать лаву. +block.router.description = Принимает предметы из одного направления и равномерно выводит их до трёх других направлений. Полезно для разделения материалов из одного источника на несколько целей. +block.distributor.description = Передовой маршрутизатор, который равномерно разбивает элементы до 7 других направлений. +block.bridge-conveyor.description = Улучшенный транспортный блок элементов. Позволяет транспортировать предметы до 3-х блоков над любым ландшафтом или зданием. +block.alpha-mech-pad.description = Превращает вас в мех [accent] Альфа[]. Требует энергию. +block.itemsource.description = Бесконечно выводит предметы. Работает только в песочнице. +block.liquidsource.description = Бесконечно выводит жидкости. Работает только в песочнице. +block.itemvoid.description = Уничтожает любые предметы, которые входят в него, без использования энергии. Работает только в песочнице. +block.powerinfinite.description = Бесконечность — не предел. Бесконечно выводит энергию. Доступен только в песочнице. +block.powervoid.description = Энергия просто уходит в пустоту. Присутствует только в песочнице. liquid.water.description = Намного лучше чем [BLUE]монооксид дигидрогена[].\n\n Для получения воды используйте помпу(насос) на источнике(блоке) или экстрактор воды.\n\n Эту жидкость можно подвести к бурам для ускорения скорости добычи или к турелям для ускорения стрельбы. liquid.lava.description = [accent]Горячо...\nВещество расплавленное из горно-каменных пород.\nСлужит как топливо для термального генератора. -liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления.\nСлужит для пластиенивого компрессора и т.д.. +liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления.\nСлужит для пластиниевого компрессора и т.д.. liquid.cryofluid.description = Жидкость с температурой ниже чем -273 градусов по цельсию. Может быть использована для ускорения стрельбы турелей или для охлаждения чего-то. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index ece71c0b5d..e0476393f0 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = Bilgisayar ve Site versiyonunun bulundugu Site text.link.google-play.description = Google Play magaza sayfasi text.link.wiki.description = Orjinal Mindustry Bilgilendirme Sayfasi text.linkfail = Link Acilamadi!\nLink sizin icin kopyalandi. -text.editor.web = The web version does not support the editor!\nDownload the game to use it. -text.web.unsupported = Site versiyonu bunu desteklemiyor! Bilgisayar versiyonunu indirmeniz gerek. text.gameover = Cekirdegin yok edildi. text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = Sektor kaybedildi. Geri gitmek ister misin? @@ -288,6 +286,7 @@ text.no = Hayir text.info.title = [accent]Bilgi text.error.title = [crimson]Bir hata olustu text.error.crashtitle = Bir hata olustu +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Yapi bilgisi text.blocks.powercapacity = Guc kapasitesi text.blocks.powershot = Guc/Saldiri hizi @@ -320,7 +319,8 @@ text.blocks.coolant = Sogutma sivisi text.blocks.coolantuse = Sogutma sivi kullanimi text.blocks.inputliquidfuel = Yakit sivisi text.blocks.liquidfueluse = Sivi yakit kullanimi -text.blocks.explosive = Patlayici! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Can text.blocks.inaccuracy = sekme text.blocks.shots = vuruslar @@ -345,6 +345,7 @@ text.category.liquids = sivilar text.category.items = esyalar text.category.crafting = uretim text.category.shooting = sikma +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = Yok @@ -361,7 +362,6 @@ setting.sensitivity.name = Kumanda hassasligi setting.saveinterval.name = Otomatik kaydetme suresi setting.seconds = {0} Saniye setting.fullscreen.name = Tam ekran -setting.multithread.name = Parcaciklar setting.fps.name = FPS'i goster setting.vsync.name = VSync setting.lasers.name = Guc lazerlerini goster @@ -370,6 +370,7 @@ setting.musicvol.name = Ses yuksekligi setting.mutemusic.name = Sesi kapat setting.sfxvol.name = Ses seviyesi setting.mutesound.name = Sesi kapat +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Tuslari ayarla category.general.name = General category.view.name = Goster @@ -405,8 +406,6 @@ mode.waves.name = Dalgali mode.waves.description = Klasik mod. Dalgalara karsi cekirdegi koru. mode.sandbox.name = Serbest mode.sandbox.description = Sonsuz esyalar ve Dalga suresi yok -mode.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.description = Sinirli esyalar ama dalga suresi yok. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]yetenek gucu: {0} text.liquid.heatcapacity = [LIGHT_GRAY]isinma kapasitesi: {0} text.liquid.viscosity = [LIGHT_GRAY]Yari sivilik: {0} text.liquid.temperature = [LIGHT_GRAY]isi: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = cekirdek block.metalfloor.name = metal zemin diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 68df10afd4..d4e7a788b7 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = PC yüklemeleri ve web sürümü ile itch.io say text.link.google-play.description = Google Play mağaza sayfası text.link.wiki.description = Resmi Mindustry Wikipedi'si text.linkfail = Bağlantı açılamadı! URL, yazı tahtanıza kopyalandı. -text.editor.web = Web sürümü editörü desteklemiyor! Editörü kullanmak için oyunu indirin. -text.web.unsupported = The web version does not support this feature! Download the game to use it. text.gameover = Çekirdek yok edildi. text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = This sector has been lost. Re-deploy? @@ -288,6 +286,7 @@ text.no = No text.info.title = [Vurgu] Bilgi text.error.title = [crimson] Bir hata oluştu text.error.crashtitle = Bir hata oluştu +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Blok Bilgisi text.blocks.powercapacity = Güç kapasitesi text.blocks.powershot = Güç / atış @@ -320,7 +319,8 @@ text.blocks.coolant = Coolant text.blocks.coolantuse = Coolant Use text.blocks.inputliquidfuel = Fuel Liquid 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.inaccuracy = yanlışlık text.blocks.shots = atışlar @@ -345,6 +345,7 @@ text.category.liquids = Liquids text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None @@ -361,7 +362,6 @@ setting.sensitivity.name = Denetleyici hassasiyeti setting.saveinterval.name = Otomatik Kaydetme Aralığı setting.seconds = saniye setting.fullscreen.name = Tam ekran -setting.multithread.name = Çok iş parçacığı setting.fps.name = Saniyede ... Kare göstermek setting.vsync.name = VSync setting.lasers.name = Güç Lazerleri Göster @@ -370,6 +370,7 @@ setting.musicvol.name = Müzik sesi setting.mutemusic.name = Müziği Kapat setting.sfxvol.name = SFX Hacmi setting.mutesound.name = Sesi kapat +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Tuşları yeniden ayarla category.general.name = General category.view.name = View @@ -405,8 +406,6 @@ mode.waves.name = dalgalar mode.waves.description = normal mod. sınırlı kaynaklar ve otomatik gelen dalgalar. mode.sandbox.name = Limitsiz Oynama 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.description = sınırlı kaynaklar ve dalgalar için zamanlayıcı yok. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Ability: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} text.liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Core block.metalfloor.name = Metal Floor diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 95630c8669..f5d883551b 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -9,8 +9,6 @@ text.link.itch.io.description = Itch.io сторінка з веб-версіє text.link.google-play.description = Скачати з Google Play для Android text.link.wiki.description = Офіційна Mindustry вікі (англ.) text.linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійовано у ваш буфер обміну. -text.editor.web = Веб-версія не підтримує редактора! \nЗавантажте гру, щоб використовувати його. -text.web.unsupported = Веб-версія не підтримує цю функцію! Завантажте гру, щоб використовувати її. text.gameover = Гру закінчено text.gameover.pvp = [accent] {0}[] команда перемогла! text.sector.gameover = Цей сектор було втрачено. Повторно висадитися? @@ -288,6 +286,7 @@ text.no = Ні text.info.title = [accent]Інформація text.error.title = [crimson]Виникла помилка text.error.crashtitle = Виникла помилка +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Інформація про блок text.blocks.powercapacity = Місткість енергії text.blocks.powershot = Енергія/постріл @@ -320,7 +319,8 @@ text.blocks.coolant = Охолоджуюча рідина text.blocks.coolantuse = Охолодж. рідини використовуеться text.blocks.inputliquidfuel = Рідке паливо text.blocks.liquidfueluse = Рідкого палива використовуеться -text.blocks.explosive = Вибухонебезпечний! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Здоров'я text.blocks.inaccuracy = Розкид text.blocks.shots = Постріли @@ -345,6 +345,7 @@ text.category.liquids = Рідинне text.category.items = Елементи text.category.crafting = Створення text.category.shooting = Стрільба +text.category.optional = Optional Enhancements setting.autotarget.name = Авто-ціль setting.fpscap.name = Макс. FPS setting.fpscap.none = Необмежений @@ -361,7 +362,6 @@ setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал автозбереження setting.seconds = {0} сек. setting.fullscreen.name = Повноекранний режим -setting.multithread.name = Багатопотоковість (TPS) setting.fps.name = Показати FPS setting.vsync.name = Вертикальна синхронізація setting.lasers.name = Показати енергетичні лазери @@ -370,6 +370,7 @@ setting.musicvol.name = Гучність музики setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = Налаштування управління category.general.name = Основне category.view.name = Перегляд @@ -405,8 +406,6 @@ mode.waves.name = Хвилі mode.waves.description = Нормальний режим. Обмежені ресурси та автоматичні хвилі. mode.sandbox.name = Пісочниця mode.sandbox.description = Нескінченні ресурси і нема таймера для хвиль. -mode.custom.warning = [scarlet]РОЗБЛОКОВАНЕ В КОРИСТУВАЛЬНИЦЬКИХ ІГРАХ АБО НА СЕРВЕРАХ НЕ ЗБЕРІГАЄТЬСЯ.\n\nГрайте у секторах для розблокування. -mode.custom.warning.read = Уважно прочитайте це!:\n[scarlet]РОЗБЛОКОВАНЕ В КОРИСТУВАЛЬНИЦЬКИХ ІГРАХ АБО В ІНШИХ РЕЖИМАХ ГРИ НЕ ПОШИРЮЄТЬСЯ НА СЕКТОРИ ТА ІНШІ РЕЖИМИ ГРИ!\n\n[LIGHT_GRAY](Я б хотів, щоб це не було необхідно, але, мабуть, це так) mode.freebuild.name = Вільний режим mode.freebuild.description = обмежені ресурси і немає таймера для хвиль. mode.pvp.name = PvP @@ -494,6 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Здібність: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Теплоємність: {0} text.liquid.viscosity = [LIGHT_GRAY]В'язкість: {0} text.liquid.temperature = [LIGHT_GRAY]Температура: {0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.spawn.name = Спавн ворога block.core.name = Ядро block.metalfloor.name = Металічна підлога diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 2e6526dd68..cc6dbb00bb 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -9,10 +9,8 @@ text.link.itch.io.description = PC版下载和网页版(itch.io) text.link.google-play.description = 从谷歌商店获取安卓版 text.link.wiki.description = 官方 Mindustry 维基 text.linkfail = 打开链接失败!\nURL 已经复制到剪贴板。 -text.editor.web = 网页版不支持地图编辑器!\n下载以使用编辑器。 -text.web.unsupported = 网页版不支持此功能,请下载以使用此功能。 text.gameover = 你的核心被摧毁了! -text.gameover.pvp = The[accent] {0}[] team is victorious! +text.gameover.pvp = accent] {0}[] 队获胜! text.sector.gameover = 这个区域失守了,要重新部署吗? text.sector.retry = 重试 text.highscore = [accent]新纪录! @@ -39,32 +37,32 @@ text.sectors = 区域 text.sector = 区域: [LIGHT_GRAY]{0} text.sector.time = 时间: [LIGHT_GRAY]{0} text.sector.deploy = 部署 -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 = 放弃 +text.sector.abandon.confirm = 你确定要放弃这个区域的所有进展吗?\n此操作不可撤销! text.sector.resume = 继续 text.sector.locked = [scarlet][[Incomplete] text.sector.unexplored = [accent][[Unexplored] -text.missions = Missions:[LIGHT_GRAY] {0} +text.missions = 任务:[LIGHT_GRAY] {0} text.mission = 任务[LIGHT_GRAY] {0} -text.mission.main = Main Mission:[LIGHT_GRAY] {0} -text.mission.info = Mission Info +text.mission.main = 主要任务:[LIGHT_GRAY] {0} +text.mission.info = 任务信息 text.mission.complete = 任务完成! text.mission.complete.body = 区域 {0},攻占了 {1} 个 -text.mission.wave = 存活了 [accent]{0}/{1}[] 波。\nWave in {2} -text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies -text.mission.wave.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy -text.mission.wave.menu = Survive[accent] {0} []waves +text.mission.wave = 存活了 [accent]{0}/{1}[] 波。\n下一波 {2} +text.mission.wave.enemies = 存活[accent] {0}/{1} []波\n{2} 敌人 +text.mission.wave.enemy = 存活[accent] {0}/{1} []波\n{2} 敌人 +text.mission.wave.menu = 存活[accent] {0} []波 text.mission.battle = 摧毁敌方基地。 -text.mission.resource.menu = Obtain {0} x{1} -text.mission.resource = 获得 {0}:\n[accent]{1}/{2}[] -text.mission.block = Create {0} -text.mission.unit = Create {0} Unit -text.mission.command = Send Command {0} To Units -text.mission.linknode = Link Power Node -text.mission.display = [accent]Mission:\n[LIGHT_GRAY]{0} -text.mission.mech = Switch to mech[accent] {0}[] -text.mission.create = Create[accent] {0}[] -text.none = +text.mission.resource.menu = 获取{0}x{1} +text.mission.resource = 获取{0}︰\n[accent]{1}/{2}[] +text.mission.block = 建造{0} +text.mission.unit = 生产{0}机组 +text.mission.command = 发送{0}指令至机组 +text.mission.linknode = 连接能源节点 +text.mission.display = [accent]任务︰\n[LIGHT_GRAY]{0} +text.mission.mech = 转换至[accent]{0}[]机甲 +text.mission.create = 制造[accent] {0}[] +text.none = <无> text.close = 关闭 text.quit = 退出 text.maps = 地图 @@ -73,30 +71,30 @@ text.nextmission = 下一个任务 text.maps.none = [LIGHT_GRAY]未发现地图! text.about.button = 关于 text.name = 名字: -text.filename = File Name: -text.unlocked = 新方块解锁! -text.unlocked.plural = 新方块解锁! +text.filename = 文件名: +text.unlocked = 新方块已解锁! +text.unlocked.plural = 新方块已解锁! text.players = {0} 玩家在线 text.players.single = {0} 玩家在线 -text.server.closing = [accent]正在关闭服务器... -text.server.kicked.kick = 你被踢出服务器了! -text.server.kicked.serverClose = 服务器已关闭 -text.server.kicked.sectorComplete = 区域已完成 +text.server.closing = [accent]正在关闭服务器…… +text.server.kicked.kick = 你被踢出服务器了! +text.server.kicked.serverClose = 服务器已关闭。 +text.server.kicked.sectorComplete = 区域已完成。 text.server.kicked.sectorComplete.text = 任务已完成。\n服务器将在下一个区域继续。 text.server.kicked.clientOutdated = 客户端版本过旧!请升级! text.server.kicked.serverOutdated = 服务器版本过旧!请联系房主升级! text.server.kicked.banned = 你被这个服务器拉黑了。 -text.server.kicked.recentKick = 你刚刚被踢出服务器\n请稍后再重新连接! -text.server.kicked.nameInUse = 服务器中已经\n有相同的名字了。 +text.server.kicked.recentKick = 你刚刚被踢出服务器。\n请稍后重新连接! +text.server.kicked.nameInUse = 服务器中已经\n有人有相同的名字了。 text.server.kicked.nameEmpty = 你的名字必须至少包含一个字母或数字。 -text.server.kicked.idInUse = 你已经在服务器中了!不允许用两个账号。 -text.server.kicked.customClient = 这个服务器不支持修改版连接,请下载官方版本。 -text.host.info = [accent]创建局域网游戏[] 按钮会在 [scarlet]6567[] 端口运行一个服务器并且 [scarlet]6568.[]\n任何在同一个 [LIGHT_GRAY]wifi或本地网络[] 下的人都将在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过ip地址连接, 那么需要[accent]端口转发[]。\n\n[LIGHT_GRAY]请注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了 Mindustry 连接本地网络。 -text.join.info = 你可以在这里输入[accent]服务器的IP地址[]以连接,或寻找[accent]本地网络[]中的服务器以连接。\n支持局域网或广域网多人游戏。\n\n[LIGHT_GRAY]请注意:没有全球服务器列表;如果你想通过IP地址连接某个服务器,你需要向房主询问IP地址。 -text.hostserver = 服务器 -text.hostserver.mobile = Host\nGame -text.host = 创建服务器 -text.hosting = [accent]正在打开服务器... +text.server.kicked.idInUse = 你已经在服务器中!不允许用两个账号。 +text.server.kicked.customClient = 这个服务器不支持修改版客户端,请下载官方版本。 +text.host.info = [accent]创建局域网游戏[]按钮会在[scarlet]6567[]端口运行一个服务器。[]\n任何在同一个[LIGHT_GRAY]网络或本地网络[]下的人都将在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过IP地址连接,你需要设定[accent]端口转发[]。\n\n[LIGHT_GRAY]请注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了Mindustry连接本地网络。 +text.join.info = 你可以在这里输入[accent]服务器的IP地址[]以连接,或寻找[accent]本地网络[]中的服务器以连接。\n目前支持局域网或广域网多人游戏。\n\n[LIGHT_GRAY]请注意:没有全球服务器列表;如果你想通过IP地址连接某个服务器,你需要向房主询问IP地址。 +text.hostserver = 创建服务器 +text.hostserver.mobile = 创建\n服务器 +text.host = 创建 +text.hosting = [accent]正在打开服务器…… text.hosts.refresh = 刷新 text.hosts.discovering = 正在搜索局域网服务器 text.server.refreshing = 正在刷新服务器 @@ -105,64 +103,64 @@ text.host.invalid = [scarlet]无法连接服务器。 text.trace = 跟踪玩家 text.trace.playername = 玩家名字: [accent]{0} text.trace.ip = IP地址: [accent]{0} -text.trace.id = ID: [accent]{0} +text.trace.id = ID︰[accent]{0} text.trace.android = 安卓客户端: [accent]{0} text.trace.modclient = 修改版客户端: [accent]{0} text.trace.totalblocksbroken = 总共破坏了 [accent]{0} 个方块。 -text.trace.structureblocksbroken = 总共破坏了 [accent]{0} 个结构。 +text.trace.structureblocksbroken = 总共破坏了[accent]{0}个方块。 text.trace.lastblockbroken = 最后破坏的方块: [accent]{0} text.trace.totalblocksplaced = 总共放置了 [accent]{0} 个方块。 text.trace.lastblockplaced = 最后放置的方块: [accent]{0} -text.invalidid = 无效的客户端ID!请提交 bug 报告。 +text.invalidid = 无效的客户端ID!请提交错误报告。 text.server.bans = 黑名单 text.server.bans.none = 没有被拉黑的玩家! text.server.admins = 管理员 text.server.admins.none = 没有管理员! text.server.add = 添加服务器 text.server.delete = 确定要删除这个服务器吗? -text.server.hostname = 主机: {0} +text.server.hostname = 主机︰{0} text.server.edit = 编辑服务器 text.server.outdated = [crimson]服务器过旧![] text.server.outdated.client = [crimson]客户端过旧![] text.server.version = [lightgray]版本: {0} text.server.custombuild = [yellow]修改版 -text.confirmban = 确认拉黑这个玩家? -text.confirmkick = 您确定要删除此播放器吗? +text.confirmban = 确认拉黑这个玩家吗? +text.confirmkick = 您确定要踢出这个玩家吗? text.confirmunban = 确认要取消拉黑这个玩家吗? text.confirmadmin = 确认要添加这个玩家为管理员吗? text.confirmunadmin = 确认要取消这个玩家的管理员身份吗? text.joingame.title = 加入游戏 -text.joingame.ip = IP: +text.joingame.ip = IP: text.disconnect = 已断开 text.disconnect.data = 载入世界失败! -text.connecting = [accent]连接中... -text.connecting.data = [accent]加载世界中... -text.server.port = 端口: +text.connecting = [accent]连接中…… +text.connecting.data = [accent]加载世界中…… +text.server.port = 端口︰ text.server.addressinuse = 地址已经使用! text.server.invalidport = 无效的端口! text.server.error = [crimson]创建服务器错误:[accent]{0} text.save.old = 这个存档属于旧版本游戏,无法继续使用了。\n\n[LIGHT_GRAY]存档向下兼容将在 4.0 版本中实现。 text.save.new = 新存档 -text.save.overwrite = 确认要\n覆盖这个存档吗? +text.save.overwrite = 确认要覆盖这个存档吗? text.overwrite = 覆盖 text.save.none = 没有存档! -text.saveload = [accent]保存中... +text.saveload = [accent]保存中…… text.savefail = 保存失败! text.save.delete.confirm = 确认要删除这个存档吗? text.save.delete = 删除 text.save.export = 导出存档 text.save.import.invalid = [accent]存档无效! -text.save.import.fail = [crimson]导入存档:[accent]{0} 失败 -text.save.export.fail = [crimson]导出存档“[accent]{0} 失败 +text.save.import.fail = [crimson]导入存档失败:[accent]{0} +text.save.export.fail = [crimson]导出存档失败:[accent]{0} text.save.import = 导入存档 text.save.newslot = 保存游戏: text.save.rename = 重命名 text.save.rename.text = 新名字: -text.selectslot = 选择一个存档 +text.selectslot = 选择一个存档。 text.slot = [accent]存档 {0} text.save.corrupted = [accent]存档损坏或无效!\n如果你刚刚升级了游戏,那么这可能是因为存档格式改变了而[scarlet]不是[] bug 。 text.sector.corrupted = [accent]发现了一个此区域的保存文件,但是加载失败。\n已经创建了一个新的。 -text.empty = +text.empty = <空> text.on = 开 text.off = 关 text.save.autosave = 自动保存:{0} @@ -187,14 +185,14 @@ text.changelog.error.ios = [accent]iOS还不支持更新日志。 text.changelog.error = [scarlet]获取更新日志失败!\n请检查你的网络。 text.changelog.current = [yellow][[Current version] text.changelog.latest = [accent][[Latest version] -text.loading = [accent]加载中... -text.saving = [accent]保存中... +text.loading = [accent]加载中…… +text.saving = [accent]保存中…… text.wave = [accent]第 {0} 波 text.wave.waiting = 下一波将在 {0} 秒后到来 -text.waiting = 等待中... -text.waiting.players = Waiting for players... -text.wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining -text.wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining +text.waiting = 等待中…… +text.waiting.players = 等待玩家中…… +text.wave.enemies = 剩下 [LIGHT_GRAY]{0} 敌人 +text.wave.enemy = 剩下 [LIGHT_GRAY]{0} 敌人 text.loadimage = 加载图片 text.saveimage = 保存图片 text.unknown = 未知 @@ -203,7 +201,7 @@ text.builtin = 内建的 text.map.delete.confirm = 确认要删除地图吗?这个操作无法撤销! text.map.random = [accent]随机地图 text.map.nospawn = 这个地图没有核心!请在编辑器中添加一个[ROYAL]蓝色[]的核心。 -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 = 这个地图没有敌人的核心!请在编辑器中添加一个[ROYAL]红色[]的核心。 text.map.invalid = 地图载入错误:地图文件可能已经损坏。 text.editor.brush = 笔刷 text.editor.slope = \\ @@ -226,14 +224,14 @@ text.editor.saved = 已保存! text.editor.save.noname = 你的地图还没有名字!在“地图信息”菜单里设置一个名字。 text.editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个。 text.editor.import.exists = [scarlet]无法导入:[] 一个叫 '{0}' 的内建地图已经存在。 -text.editor.import = 导入... +text.editor.import = 导入…… text.editor.importmap = 导入地图 text.editor.importmap.description = 导入一个已经存在的地图 text.editor.importfile = 导入文件 text.editor.importfile.description = 导入一个外置的地图文件 text.editor.importimage = 导入地形图像 text.editor.importimage.description = 导入外置地图图像文件 -text.editor.export = 导出... +text.editor.export = 导出…… text.editor.exportfile = 导出文件 text.editor.exportfile.description = 导出一个地图文件 text.editor.exportimage = 导出一个地形文件 @@ -262,13 +260,13 @@ text.editor = 编辑器 text.mapeditor = 地图编辑器 text.donate = 捐赠 text.connectfail = [crimson]服务器连接失败: [accent]{0} -text.error.unreachable = Server unreachable. -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.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -text.error.alreadyconnected = Already connected. -text.error.mapnotfound = Map file not found! -text.error.any = Unkown network error. +text.error.unreachable = 服务器无法访问。 +text.error.invalidaddress = 地址无效。 +text.error.timedout = 连接超时!\n确保服务器设置了端口转发,并且地址正确! +text.error.mismatch = 包错误:\n可能是客户端/服务器版本不匹配.\n请确保客户端和服务器都是最新的版本! +text.error.alreadyconnected = 已连接。 +text.error.mapnotfound = 找不到地图文件! +text.error.any = 未知网络错误. text.settings.language = 语言 text.settings.reset = 恢复默认 text.settings.rebind = 重新绑定 @@ -276,11 +274,11 @@ text.settings.controls = 控制 text.settings.game = 游戏 text.settings.sound = 声音 text.settings.graphics = 图像 -text.settings.cleardata = 清除游戏数据... -text.settings.clear.confirm = 您确定要清除此数据吗?\n你无法撤销这个! -text.settings.clearall.confirm = [scarlet]报警![]\n这将清除所有数据,包括已保存,解锁和见帮定.\n按“OK”后,游戏将删除所有并自动推出. -text.settings.clearsectors = 清楚任务 -text.settings.clearunlocks = 清除未锁定的快 +text.settings.cleardata = 清除游戏数据…… +text.settings.clear.confirm = 您确定要清除数据吗?\n这个操作无法撤销! +text.settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和键绑定。\n按「是」后,游戏将删除所有数据并自动退出。 +text.settings.clearsectors = 清除区域 +text.settings.clearunlocks = 清除解锁 text.settings.clearall = 清除所有 text.paused = 暂停 text.yes = 是 @@ -288,6 +286,7 @@ text.no = 不 text.info.title = [accent]详情 text.error.title = [crimson]发生了一个错误 text.error.crashtitle = 发生了一个错误 +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = 方块详情 text.blocks.powercapacity = 能量容量 text.blocks.powershot = 能量/发射 @@ -303,27 +302,28 @@ text.blocks.powerdamage = 功率/损伤 text.blocks.inputitemcapacity = 最大输入 text.blocks.outputitemcapacity = 最大输出 text.blocks.itemcapacity = 物品容量 -text.blocks.basepowergeneration = Base Power Generation +text.blocks.basepowergeneration = 基础能源输出 text.blocks.powertransferspeed = 能量传输 text.blocks.craftspeed = 生产速度 -text.blocks.inputliquid = 输入液体 -text.blocks.inputliquidaux = Aux 液体 -text.blocks.inputitem = 输入物品 -text.blocks.inputitems = 输入物品 -text.blocks.outputitem = 输出物品 +text.blocks.inputliquid = 液体输入 +text.blocks.inputliquidaux = 辅助液体 +text.blocks.inputitem = 物品输入 +text.blocks.inputitems = 物品输入 +text.blocks.outputitem = 物品输出 text.blocks.drilltier = 可钻探矿物 text.blocks.drillspeed = 基础钻探速度 text.blocks.liquidoutput = 液体输出 text.blocks.liquidoutputspeed = 液体输出速度 -text.blocks.liquiduse = 使用液体 +text.blocks.liquiduse = 液体使用速度 text.blocks.coolant = 冷却剂 -text.blocks.coolantuse = 使用冷却剂 -text.blocks.inputliquidfuel = 使用燃料 -text.blocks.liquidfueluse = 使用液体燃料 -text.blocks.explosive = 高度易燃易爆! +text.blocks.coolantuse = 冷却剂使用速度 +text.blocks.inputliquidfuel = 液体燃料输入 +text.blocks.liquidfueluse = 液体燃料使用速度 +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 生命值 text.blocks.inaccuracy = 误差 -text.blocks.shots = 发射 +text.blocks.shots = 发射数 text.blocks.reload = 重新装弹 text.blocks.inputfuel = 燃料 text.blocks.fuelburntime = 燃料燃烧时间 @@ -343,25 +343,25 @@ text.category.general = 普通 text.category.power = 能量 text.category.liquids = 液体 text.category.items = 物品 -text.category.crafting = 制造速度 -text.category.shooting = 射速 -setting.autotarget.name = Auto-Target +text.category.crafting = 制造 +text.category.shooting = 发射 +text.category.optional = Optional Enhancements +setting.autotarget.name = 自动发射 setting.fpscap.name = 最高 FPS -setting.fpscap.none = None +setting.fpscap.none = 无 setting.fpscap.text = {0} FPS -setting.difficulty.training = training +setting.difficulty.training = 训练 setting.difficulty.easy = 简单 setting.difficulty.normal = 普通 setting.difficulty.hard = 困难 setting.difficulty.insane = 疯狂 -setting.difficulty.name = 难度: +setting.difficulty.name = 难度: setting.screenshake.name = 屏幕抖动 setting.effects.name = 显示效果 setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 setting.fullscreen.name = 全屏 -setting.multithread.name = 多线程 setting.fps.name = 显示 FPS setting.vsync.name = 帧同步 setting.lasers.name = 显示能量射线 @@ -370,17 +370,18 @@ setting.musicvol.name = 音乐音量 setting.mutemusic.name = 静音 setting.sfxvol.name = 音效音量 setting.mutesound.name = 静音 +setting.crashreport.name = 发送匿名崩溃报告 text.keybind.title = 重新绑定按键 category.general.name = 普通 category.view.name = 查看 category.multiplayer.name = 多人 -command.attack = Attack -command.retreat = Retreat -command.patrol = Patrol -keybind.press = 按一下键... -keybind.press.axis = 按轴或键... -keybind.move_x.name = X轴移动 -keybind.move_y.name = Y轴移动 +command.attack = 攻击 +command.retreat = 撤退 +command.patrol = 巡逻 +keybind.press = 按一下键…… +keybind.press.axis = 按一下轴或键…… +keybind.move_x.name = 水平移动 +keybind.move_y.name = 垂直移动 keybind.select.name = 选择 keybind.break.name = 破坏 keybind.deselect.name = 取消 @@ -405,47 +406,45 @@ mode.waves.name = 普通 mode.waves.description = 普通模式,有限的资源和自动生成敌人。 mode.sandbox.name = 沙盒 mode.sandbox.description = 无限的资源,不会自动生成敌人。 -mode.custom.warning = 请注意,在区域内解锁之前,区块不能用于自定义游戏.\n\n[LIGHT_GRAY]如果您没有解锁任何块,则不会出现任何块. -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 = 自由建造 mode.freebuild.description = 有限的资源,不会自动生成敌人。 mode.pvp.name = PvP -mode.pvp.description = fight against other players locally. +mode.pvp.description = 和本地玩家对战. content.item.name = 物品 content.liquid.name = 液体 -content.unit.name = 单位 +content.unit.name = 部队 content.recipe.name = 方块 content.mech.name = 机甲 item.stone.name = 石头 item.stone.description = 一种常见的原料。用于分离和提炼成其他材料,或熔化成熔岩。 item.copper.name = 铜 -item.copper.description = 有用的结构材料。在各种类型的方块中广泛使用。 +item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。 item.lead.name = 铅 -item.lead.description = 基本的起始材料。被广泛用于电气和液体运输方块。 +item.lead.description = 一种基本的起始材料。被广泛用于电子设备和液体运输方块。 item.coal.name = 煤 item.coal.description = 一种常见并容易获得的燃料。 item.dense-alloy.name = 致密合金 -item.dense-alloy.description = 由铅和铜制成的坚韧合金。 用于高级的运输方块和深层钻头。 +item.dense-alloy.description = 一种由铅和铜制成的坚韧合金。用于高级的运输方块和高级钻头。 item.titanium.name = 钛 -item.titanium.description = 一种罕见的超轻金属,被广泛运用于液体运输,钻机和飞机。 +item.titanium.description = 一种罕见的超轻金属,被广泛运用于液体运输、钻头和飞机。 item.thorium.name = 钍 -item.thorium.description = 一种致密的放射性金属,用作支撑结构和核燃料。 +item.thorium.description = 一种致密的放射性金属,用作结构支撑和核燃料。 item.silicon.name = 硅 -item.silicon.description = 非常有用的半导体,被用于太阳能电池板和很多复杂的电子设备。 -item.plastanium.name = 塑料 +item.silicon.description = 一种非常有用的半导体,被用于太阳能电池板和很多复杂的电子设备。 +item.plastanium.name = 塑钢 item.plastanium.description = 一种轻质,可延展的材料,用于高级的飞机和碎片弹药。 -item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.phase-fabric.name = 相织物 +item.phase-fabric.description = 一种接近0重量的物质,用于先进的电子技术和自我修复技术。 item.surge-alloy.name = 巨浪合金 -item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.surge-alloy.description = 一种具有独特电气性能的高级合金。 item.biomatter.name = 生物质 -item.biomatter.description = 一种有机糊;用于转化为油或作为基本燃料。 -item.sand.name = 沙子 -item.sand.description = 一种常见的材料,广泛用于冶炼,制作合金和助熔剂。 +item.biomatter.description = 一种有机物;用于转化为油或作为基本燃料。 +item.sand.name = 沙 +item.sand.description = 一种常见的材料,广泛用于冶炼,包括制作合金和助熔剂。 item.blast-compound.name = 爆炸混合物 -item.blast-compound.description = 一种用于炸弹和炸药的挥发性化合物。虽然它可以作为燃料燃烧,但不建议这样做。 +item.blast-compound.description = 一种用于炸弹和炸药的挥发性混合物。虽然它可以作为燃料燃烧,但不建议这样做。 item.pyratite.name = 硫 -item.pyratite.description = 燃烧武器中使用的极易燃物质。 +item.pyratite.description = 一种燃烧武器中使用的极易燃物质。 liquid.water.name = 水 liquid.lava.name = 岩浆 liquid.oil.name = 石油 @@ -469,32 +468,33 @@ mech.omega-mech.description = 一种装甲厚重的机甲,用于在前线攻 mech.dart-ship.name = Dart mech.dart-ship.weapon = 机枪 mech.dart-ship.description = 标准飞船。快速轻便,但攻击能力低,采矿速度快。 -mech.javelin-ship.name = Javelin +mech.javelin-ship.name = 标枪 mech.javelin-ship.description = 一艘一击即退的攻击船。虽然最初很慢,但它可以加速到很快的速度,并飞过敌人的前哨,利用其闪电能力和导弹造成大量伤害。 mech.javelin-ship.weapon = 爆裂导弹 mech.javelin-ship.ability = 放电助推器 -mech.trident-ship.name = Trident -mech.trident-ship.description = 一个重型轰炸机。有厚装甲。 +mech.trident-ship.name = 三叉戟 +mech.trident-ship.description = 一种重型轰炸机。有厚装甲。 mech.trident-ship.weapon = 炸弹 mech.glaive-ship.name = Glaive -mech.glaive-ship.description = 一个大型,装甲厚重的武装直升机。配备燃烧机枪。有优秀的加速能力和最快的速度。 +mech.glaive-ship.description = 一种大型,装甲厚重的武装直升机。配备燃烧机枪。有优秀的加速能力和最快的速度。 mech.glaive-ship.weapon = 火焰机枪 -text.item.explosiveness = [LIGHT_GRAY]爆炸威力:{0} +text.item.explosiveness = [LIGHT_GRAY]爆炸性:{0} text.item.flammability = [LIGHT_GRAY]易燃性:{0} text.item.radioactivity = [LIGHT_GRAY]放射性:{0} -text.item.fluxiness = [LIGHT_GRAY]流通力:{0} -text.unit.health = [LIGHT_GRAY]生命值: {0} -text.unit.speed = [LIGHT_GRAY]速度: {0} -text.mech.weapon = [LIGHT_GRAY]武器: {0} -text.mech.armor = [LIGHT_GRAY]装甲: {0} -text.mech.itemcapacity = [LIGHT_GRAY]物品容量: {0} -text.mech.minespeed = [LIGHT_GRAY]采矿速度: {0} -text.mech.minepower = [LIGHT_GRAY]采矿能量: {0} -text.mech.ability = [LIGHT_GRAY]能力: {0} +text.item.fluxiness = [LIGHT_GRAY]助熔性:{0} +text.unit.health = [LIGHT_GRAY]生命值:{0} +text.unit.speed = [LIGHT_GRAY]速度:{0} +text.mech.weapon = [LIGHT_GRAY]武器:{0} +text.mech.armor = [LIGHT_GRAY]装甲:{0} +text.mech.itemcapacity = [LIGHT_GRAY]物品容量:{0} +text.mech.minespeed = [LIGHT_GRAY]采矿速度:{0} +text.mech.minepower = [LIGHT_GRAY]采矿力量:{0} +text.mech.ability = [LIGHT_GRAY]能力:{0} text.liquid.heatcapacity = [LIGHT_GRAY]热容量:{0} text.liquid.viscosity = [LIGHT_GRAY]粘度:{0} text.liquid.temperature = [LIGHT_GRAY]温度:{0} -block.spawn.name = Enemy Spawn +block.constructing = {0}\n[LIGHT_GRAY](Constructing) +block.spawn.name = 敌人出生点 block.core.name = 核心 block.metalfloor.name = 金属地板 block.deepwater.name = 深水 @@ -514,18 +514,18 @@ block.blackrock.name = 黑岩 block.icerock.name = 冰岩 block.copper-wall.name = 铜墙 block.copper-wall-large.name = 大型铜墙 -block.dense-alloy-wall.name = Dense Alloy Wall -block.dense-alloy-wall-large.name = Large Dense Alloy Wall -block.phase-wall.name = 相位墙 -block.phase-wall-large.name = 大型相位墙 +block.dense-alloy-wall.name = 致密合金墙 +block.dense-alloy-wall-large.name = 大型致密合金墙 +block.phase-wall.name = 相织布墙 +block.phase-wall-large.name = 大型相织布墙 block.thorium-wall.name = 钍墙 block.thorium-wall-large.name = 大型钍墙 block.door.name = 门 block.door-large.name = 大门 -block.duo.name = 炮 +block.duo.name = 双管炮 block.scorch.name = 灼烧炮 -block.hail.name = Hail -block.lancer.name = 枪骑兵 +block.hail.name = 冰雹炮 +block.lancer.name = 蓝瑟炮 block.conveyor.name = 传送带 block.titanium-conveyor.name = 钛传送带 block.junction.name = 连接点 @@ -538,7 +538,7 @@ block.overflow-gate.description = 分离器和路由器的组合,如果前面 block.smelter.name = 冶炼厂 block.arc-smelter.name = 电弧冶炼厂 block.silicon-smelter.name = 硅冶炼厂 -block.phase-weaver.name = 相位编织器 +block.phase-weaver.name = 相织布编织器 block.pulverizer.name = 粉碎机 block.cryofluidmixer.name = 冷冻液混合器 block.melter.name = 熔炉 @@ -557,47 +557,47 @@ block.pneumatic-drill.name = 气动钻头 block.laser-drill.name = 激光钻头 block.water-extractor.name = 抽水机 block.cultivator.name = 耕种机 -block.alpha-mech-pad.name = Alpha Mech Pad -block.dart-ship-pad.name = Dart Ship Pad -block.delta-mech-pad.name = Delta Mech Pad -block.javelin-ship-pad.name = Javelin Ship Pad -block.trident-ship-pad.name = Trident Ship Pad -block.glaive-ship-pad.name = Glaive Ship Pad -block.omega-mech-pad.name = Omega Mech Pad -block.tau-mech-pad.name = Tau Mech Pad +block.alpha-mech-pad.name = Alpha 机甲平台 +block.dart-ship-pad.name = Dart 机甲平台 +block.delta-mech-pad.name = Delta 机甲平台 +block.javelin-ship-pad.name = 标枪 机甲平台 +block.trident-ship-pad.name = 三叉戟 机甲平台 +block.glaive-ship-pad.name = Glaive 机甲平台 +block.omega-mech-pad.name = Omega 机甲平台 +block.tau-mech-pad.name = Tau 机甲平台 block.conduit.name = 导管 block.mechanical-pump.name = 机械泵 block.itemsource.name = 物品源 -block.itemvoid.name = Item Void +block.itemvoid.name = 物品黑洞 block.liquidsource.name = 液体源 -block.powervoid.name = Power Void +block.powervoid.name = 能源黑洞 block.powerinfinite.name = 无限能源 block.unloader.name = 装卸器 block.vault.name = 仓库 block.wave.name = 波浪 block.swarmer.name = 蜂群 block.salvo.name = 齐射炮 -block.ripple.name = 波纹 -block.phase-conveyor.name = 相位传送带 +block.ripple.name = 浪涌 +block.phase-conveyor.name = 相织布传送带 block.bridge-conveyor.name = 传送带桥 -block.plastanium-compressor.name = 塑料压缩机 +block.plastanium-compressor.name = 塑钢压缩机 block.pyratite-mixer.name = 硫混合器 block.blast-mixer.name = 爆炸混合器 -block.solidifer.name = 凝固剂 +block.solidifer.name = 凝固器 block.solar-panel.name = 太阳能电池 block.solar-panel-large.name = 大型太阳能电池 block.oil-extractor.name = 石油钻井 -block.spirit-factory.name = Spirit Drone Factory -block.phantom-factory.name = Phantom Drone Factory -block.wraith-factory.name = Wraith Fighter Factory -block.ghoul-factory.name = Ghoul Bomber Factory -block.dagger-factory.name = Dagger Mech Factory -block.titan-factory.name = Titan Mech Factory -block.fortress-factory.name = Fortress Mech Factory -block.revenant-factory.name = Revenant Fighter Factory +block.spirit-factory.name = 轻型无人机工厂 +block.phantom-factory.name = 鬼怪无人机工厂 +block.wraith-factory.name = 幻影战机工厂 +block.ghoul-factory.name = 食尸鬼轰炸机工厂 +block.dagger-factory.name = 尖刀机甲工厂 +block.titan-factory.name = 泰坦机甲工厂 +block.fortress-factory.name = 堡垒机甲工厂 +block.revenant-factory.name = 亡魂战机工厂 block.repair-point.name = 维修点 block.pulse-conduit.name = 脉冲导管 -block.phase-conduit.name = 相位导管 +block.phase-conduit.name = 相织布导管 block.liquid-router.name = 液体路由器 block.liquid-tank.name = 储液罐 block.liquid-junction.name = 液体连接点 @@ -610,171 +610,171 @@ block.blast-drill.name = 爆破钻头 block.thermal-pump.name = 热能泵 block.thermal-generator.name = 热能发电机 block.alloy-smelter.name = 合金冶炼厂 -block.mend-projector.name = 修理投影机 -block.surge-wall.name = 浪涌墙 -block.surge-wall-large.name = 大浪涌墙 -block.cyclone.name = 气旋 -block.fuse.name = 保险丝 -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = 超速投影机 -block.force-projector.name = Force Projector -block.arc.name = Arc -block.rtg-generator.name = RTG Generator -block.spectre.name = Spectre -block.meltdown.name = Meltdown -block.container.name = Container -block.core.description = The most important building in the game. -team.blue.name = blue -team.red.name = red -team.orange.name = orange -team.none.name = gray -team.green.name = green -team.purple.name = purple +block.mend-projector.name = 修理投影器 +block.surge-wall.name = 波动墙 +block.surge-wall-large.name = 大型波动墙 +block.cyclone.name = 气旋炮 +block.fuse.name = 融合炮 +block.shock-mine.name = 休克地雷 +block.overdrive-projector.name = 超速投影器 +block.force-projector.name = 力墙投影器 +block.arc.name = 电弧 +block.rtg-generator.name = RTG 发电机 +block.spectre.name = 幽灵 +block.meltdown.name = 熔毁 +block.container.name = 容器 +block.core.description = 游戏中最重要的建筑。 +team.blue.name = 蓝 +team.red.name = 红 +team.orange.name = 橙 +team.none.name = 灰 +team.green.name = 绿 +team.purple.name = 紫 unit.alpha-drone.name = Alpha 无人机 -unit.spirit.name = Spirit Drone -unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. -unit.phantom.name = Phantom Drone -unit.phantom.description = An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. +unit.spirit.name = 轻型无人机 +unit.spirit.description = 初始无人机。默认情况下在内核中生成。自动开采矿石,收集物品和修理块。 +unit.phantom.name = 鬼怪无人机 +unit.phantom.description = 一种先进的无人机单位。自动开采矿石,收集物品和修理块。比初始无人机有效得多。 unit.dagger.name = 尖刀 unit.dagger.description = 基础的地面单位,在蜂群中很有用。 unit.titan.name = 泰坦 unit.titan.description = 高级的有武装地面单位,使用电石作为弹药.攻击地面单位和空中单位. -unit.ghoul.name = Ghoul Bomber -unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. -unit.wraith.name = Wraith Fighter -unit.wraith.description = A fast, hit-and-run interceptor unit. -unit.fortress.name = Fortress -unit.fortress.description = A heavy artillery ground unit. -unit.revenant.name = Revenant -unit.revenant.description = A heavy laser platform. -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. -tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. -tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. -block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. -block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. -block.dense-alloy-wall.description = A standard defensive block.\nAdequate protection from enemies. -block.dense-alloy-wall-large.description = A standard defensive block.\nAdequate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nGood protection from enemies. -block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. -block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. -block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. -block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. -block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. -block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. -block.mend-projector.description = Periodically heals buildings in its vicinity. -block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.duo.description = A small, cheap turret. -block.arc.description = A small turret which shoots electricity in a random arc towards the enemy. -block.hail.description = A small artillery turret. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.fuse.description = A large turret which shoots powerful short-range beams. -block.spectre.description = A large turret which shoots two powerful bullets at once. -block.meltdown.description = A large turret which shoots powerful long-range beams. -block.conveyor.description = Basic item transport block. Moved items forward and automatically deposits them into turrets or crafters. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. -block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. -block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. -block.smelter.description = Burns coal for smelting copper and lead into dense alloy. -block.arc-smelter.description = Smelts copper and lead into dense alloy by using an external power source. -block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. -block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.pulverizer.description = Crushes stone into sand. Useful when there is a lack of natural sand. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. -block.solidifer.description = Cools lava to stone at a fast pace. -block.melter.description = Heats up stone to very high temperatures to obtain lava. -block.incinerator.description = Gets rid of any excess item or liquid. -block.biomattercompressor.description = Compresses biomatter in order to retrieve oil. -block.separator.description = Exposes stone to water pressure in order to obtain various minerals contained in the stone. -block.centrifuge.description = More efficient than the separator, but also more expensive to build and requires power. -block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. -block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning oil or flammable materials. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. -block.thermal-generator.description = Generates a large amount of power from lava. -block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. -block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. -block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. -block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. -block.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. -block.vault.description = Stores a large amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. -block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. -block.cultivator.description = Cultivates the soil with water in order to obtain biomatter. -block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. -block.dart-ship-pad.description = Leave your current vessel and change into a basic fighter aircraft.\nUse the pad by double tapping while standing on it. -block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. -block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. -block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. -block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. -block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. -block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. -block.spirit-factory.description = Produces light drones which mine ore and repair blocks. -block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. -block.wraith-factory.description = Produces fast, hit-and-run interceptor units. -block.ghoul-factory.description = Produces heavy carpet bombers. -block.dagger-factory.description = Produces basic ground units. -block.titan-factory.description = Produces advanced, armored ground units. -block.fortress-factory.description = Produces heavy artillery ground units. -block.revenant-factory.description = Produces heavy laser ground units. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.command-center.description = Allows changing friendly AI behavior. Currently, attack, retreat and patrol commands are supported. -block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. -block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Stores a large amount of liquids. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump which doubles up speed by using power. -block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. -block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. -block.distributor.description = An advanced router which splits items to up to 7 other directions equally. -block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. -block.alpha-mech-pad.description = When given enough power, rebuilds your ship into the[accent] Alpha[] mech. -block.itemsource.description = Infinitely outputs items. Sandbox only. -block.liquidsource.description = Infinitely outputs liquids. Sandbox only. -block.itemvoid.description = Destroys any items which go into it without using power. Sandbox only. -block.powerinfinite.description = Infinitely outputs power. Sandbox only. -block.powervoid.description = Voids all power inputted into it. Sandbox only. -liquid.water.description = Commonly used for cooling machines and waste processing. -liquid.lava.description = Can be transformed into[LIGHT_GRAY] stone[], used for generating power or used as ammo for certain turrets. -liquid.oil.description = Can be burnt, exploded or used as a coolant. -liquid.cryofluid.description = The most efficient liquid for cooling things down. +unit.ghoul.name = 食尸鬼轰炸机 +unit.ghoul.description = 重型地毯轰炸机。用爆炸化合物或黄铁矿作为弹药。 +unit.wraith.name = 幻影战机 +unit.wraith.description = 一种快速,打了就跑的截击机。 +unit.fortress.name = 堡垒 +unit.fortress.description = 一种重炮地面部队。 +unit.revenant.name = 亡魂 +unit.revenant.description = 一种重型激光平台。 +tutorial.begin = 你的任务是消灭[LIGHT_GRAY] 敌人 [].\n\n首先开始[accent] 采集铜矿 []。点击核心附近的铜矿开始。 +tutorial.drill = 手动采矿效率低.\n[accent] 钻头 []可以自动采矿.\n放一个在铜矿上吧. +tutorial.conveyor = [accent]传送带[] 可以把物资传送到核心.\n请造一个传送线,从钻头到核心. +tutorial.morecopper = 需要更多的铜.\n\n手动采矿或者放更多的钻头吧. +tutorial.turret = 必须建造防御建筑来击退[LIGHT_GRAY] 敌人[].\n请在你核心附近造一个双人炮塔. +tutorial.drillturret = 双人炮塔需要[accent] 铜质弹药 []来射击.\n可以放一个钻头在炮塔附近供应铜. +tutorial.waves = [LIGHT_GRAY]敌人[] 来了.\n\n保护基地,防御2波攻击. 造更多的炮塔. +tutorial.lead = 有更多的矿可用. 探索和采集[accent] 铅[].\n\n按住你的采矿单位拖放到核心来传送资源. +tutorial.smelter = 铜和铅是弱金属.\n超级[accent] 致密合金[] 可以从冶炼厂生产.\n\n造一个吧. +tutorial.densealloy = 冶炼厂将生产合金.\n生产一些.\n有必要可以改进一下生产. +tutorial.siliconsmelter = 基地现在将制作一个[accent] 无人机[] 来采矿和维修方块.\n\n其他单位的工程可以用[accent] 硅 []来建造.\n造一个硅冶炼厂. +tutorial.silicondrill = 硅需要[accent] 煤[] 和[accent] 沙[].\n开始制作钻头吧. +tutorial.generator = 这项技术需要能源.\n造一个[accent] 燃烧发电机[] 来发电. +tutorial.generatordrill = 燃烧发电机需要燃料.\n用钻头采集煤来供给燃料. +tutorial.node = 能源需要传输.\n造一个[accent] 能量节点[] 靠近火力发电机来传输它的能源. +tutorial.nodelink = 使耗能方块紧靠发电机或者用能源节点连接来传输电力.\n\n点击能源节点并选择发电机和硅冶炼厂来链接能源. +tutorial.silicon = 正在生产硅. 多生产点.\n\n建议优化一下生产系统. +tutorial.daggerfactory = 建造一个[accent] 尖刀机甲工厂.[]\n\n它可以用来生产机甲 +tutorial.router = 工厂需要资源来运作.\n造一个路由器来分发传送资源. +tutorial.dagger = 链接能源节点到工厂.\n一旦需求满足, 将会制作一个机甲.\n\n根据需要制作更多的钻头,发电机,传送带. +tutorial.battle = [LIGHT_GRAY] 敌人[] 的核心已经暴露。\n用你的尖刀机甲摧毁它。 +block.copper-wall.description = 廉价的防守区块。\n用于保护前几波中的核心和炮塔。 +block.copper-wall-large.description = 廉价的防御块。\n用于保护前几个波浪中的核心和炮塔。\n跨越多个块。 +block.dense-alloy-wall.description = 标准的防守区块。\n可以较好的防御敌人。 +block.dense-alloy-wall-large.description = 标准的防守区块。\n可以较好的防御敌人。\n跨越多个块。 +block.thorium-wall.description = 强大的防守区块。\n很好的防御敌人。 +block.thorium-wall-large.description = 强大的防守区块。\n很好地防御敌人。\n跨越多个块。 +block.phase-wall.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。 +block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。\n跨越多个块。 +block.surge-wall.description = 强大的防守区块。\n有很小的机会向攻击者发射闪电。 +block.surge-wall-large.description = 强大的防御区块。\n有很小的机会向攻击者发射闪电。\n跨越多个区块。 +block.door.description = 一扇小门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。 +block.door-large.description = 一扇大门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。\n扫过多个瓷砖。 +block.mend-projector.description = 定期修复附近的建筑物。 +block.overdrive-projector.description = 提高附近建筑物的速度,如钻机和传送带。 +block.force-projector.description = 自身周围创建一个六边形力场,保护建筑物和内部单位免受子弹的伤害。 +block.shock-mine.description = 伤害踩到它的敌人。敌人几乎看不到它。 +block.duo.description = 小而便宜的炮塔。 +block.arc.description = 小型炮塔,发射电弧。 +block.hail.description = 小型炮兵炮台。 +block.lancer.description = 中型炮塔,发射带电的电子束。 +block.wave.description = 中型快速炮塔,射出液体泡泡。 +block.salvo.description = 中型炮塔,齐射射击。 +block.swarmer.description = 发射爆炸导弹的中型炮塔。 +block.ripple.description = 大型炮兵炮塔,可同时向多个目标开火。 +block.cyclone.description = 大型快速炮塔。 +block.fuse.description = 发射强大的短程光束的大型炮塔。 +block.spectre.description = 大型炮塔,一次射出两颗强大的子弹。 +block.meltdown.description = 发射强大的远程光束的大型炮塔。 +block.conveyor.description = 初级传送带。将物品向前移动并自动将它们放入炮塔或工厂中。可旋转方向。 +block.titanium-conveyor.description = 高级传送带。能比初级传送带更快地移动物品。 +block.phase-conveyor.description = 高级传送带。使用电力将物品传送到距离几个块的相位传送带上。 +block.junction.description = 为两条交叉传送带的桥梁。适用于两种不同传送带将不同材料运送到不同位置的情况。 +block.mass-driver.description = 终极传送带。收集几件物品,然后将它们射向长距离外的另一个批量传送带。 +block.smelter.description = 烧煤,用于冶炼铜和铅成致密合金。 +block.arc-smelter.description = 用外部电源熔炼铜和铅成致密合金。 +block.silicon-smelter.description = 用高纯度的焦炭来加工沙子以生产硅。 +block.plastanium-compressor.description = 用油和钛生产塑钢。 +block.phase-weaver.description = 用放射性钍和大量沙子生产相织物。 +block.alloy-smelter.description = 用钛,铅,硅和铜生产浪涌合金。 +block.pulverizer.description = 将石头压成沙子。当缺少天然沙子时很有用。 +block.pyratite-mixer.description = 用煤,铅和沙子混合成高度易燃的硫。 +block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。 +block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。 +block.solidifer.description = 快速冷却熔岩为石头。 +block.melter.description = 石头加热到很高的温度以获得熔岩。 +block.incinerator.description = 用于除掉任何多余的物品或液体。 +block.biomattercompressor.description = 压缩生物质以获取油。 +block.separator.description = 将石头暴露在水压下,以获得石头中含有的各种矿物质。 +block.centrifuge.description = 比分离器更有效,但构建起来也更昂贵并且需要动力。 +block.power-node.description = 连接节点传输电源。最多可连接四个电源,接收器或节点。节点将从任何相邻块接收电力或向其供电。 +block.power-node-large.description = 传输径大于电源节点,最多可连接六个电源,接收器或节点。 +block.battery.description = 储存电力,当储存有能量时,可在电力短缺时提供电力。 +block.battery-large.description = 比普通电池容量更大。 +block.combustion-generator.description = 通过燃烧油或易燃材料产生电力。 +block.turbine-generator.description = 比燃烧发电机更有效,但需要额外的水。 +block.thermal-generator.description = 从熔岩中产生大量的能量。 +block.solar-panel.description = 标准太阳能面板,提供少量电力。 +block.solar-panel-large.description = 比标准太阳能电池板提供更好的电源,但构建起来要贵得多。 +block.thorium-reactor.description = 高放射性钍产生大量电力。需要持续冷却。如果供应的冷却剂量不足,会剧烈爆炸。 +block.rtg-generator.description = 一种放射性同位素热电发电机,它不需要冷却,但功率低于钍反应堆。 +block.unloader.description = 物品从容器,仓库或核心卸载到传送带上或直接卸载到相邻的块中。可以通过点击卸载器来更改要卸载的项目类型。 +block.container.description = 存储少量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从容器中获取物品。 +block.vault.description = 存储大量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从仓库中获取物品。 +block.mechanical-drill.description = 便宜的钻头。放置在适当的块上时,无限期地以缓慢的速度输出物品。 +block.pneumatic-drill.description = 一种改进的钻头,它更快,能够利用气压处理更硬的材料。 +block.laser-drill.description = 通过激光技术更快地钻孔,但需要电源。此外,这种钻头可以回收放射性钍。 +block.blast-drill.description = 终极钻头,需要大量电力。 +block.water-extractor.description = 从地下提取水。当附近没有湖泊时使用它。 +block.cultivator.description = 用水培育土壤以获得生物物质。 +block.oil-extractor.description = 使用大量的电力从沙子中提取石油。当附近没有直接的石油来源时使用它。 +block.dart-ship-pad.description = 离开你当前的装置,换成基本的战斗机。\n站在上面时双击切换。 +block.trident-ship-pad.description = 离开你当前的装置,换成一个装甲合理的重型轰炸机。\n站在上面时双击切换。 +block.javelin-ship-pad.description = 离开你当前的装置,换上一个强大而快速的截击机,用闪电武器。\n站在上面时双击切换。 +block.glaive-ship-pad.description = 离开现有的装置,换成装甲良好的大型武装直升机。\n站在上面时双击切换。 +block.tau-mech-pad.description = 离开你当前的装置并换成一个可以治愈友方建筑物和单位的支撑机械。\n站在上面时双击切换。 +block.delta-mech-pad.description = 离开你当前的装置并换成一个快速,轻装甲的机械装置,用于快速攻击。\n站在上面时双击切换。 +block.omega-mech-pad.description = 离开你当前的装置并换成一个笨重且装甲良好的机甲,用于前线攻击。\n站在上面时双击切换。 +block.spirit-factory.description = 生产轻型无人机,用于开采矿石和修复块。 +block.phantom-factory.description = 生产高级无人机单元,它比轻型无人机更有效。 +block.wraith-factory.description = 生产快速截击机。 +block.ghoul-factory.description = 生产重型地毯轰炸机。 +block.dagger-factory.description = 生产基本地面单位。 +block.titan-factory.description = 生产先进的装甲地面单位。 +block.fortress-factory.description = 生产重型火炮地面部队。 +block.revenant-factory.description = 生产重型激光地面单元。 +block.repair-point.description = 连续治疗附近最近的受损单位。 +block.command-center.description = 允许更改友方AI行为。目前支持攻击,撤退和巡逻命令。 +block.conduit.description = 基本液体传输块。像输送机一样工作,但用于液体。最适用于提取器,泵或其他导管。 +block.pulse-conduit.description = 高级液体传输块。比标准导管更快地输送液体并储存更多液体。 +block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。 +block.liquid-router.description = 接受来自一个方向的液体并将它们平均输出到最多3个其他方向。也可以储存一定量的液体。用于将液体从一个源分成多个目标。 +block.liquid-tank.description = 存储大量液体。当存在对材料的非恒定需求或作为冷却重要块的安全措施时,将其用于创建缓冲区。 +block.liquid-junction.description = 作为两个交叉管道的桥梁。适用于两种不同导管将不同液体输送到不同位置的情况。 +block.bridge-conduit.description = 高级液体传输块。允许在任何地形或建筑物的最多3个块上运输液体。 +block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 +block.rotary-pump.description = 一种先进的泵,通过使用动力使速度加倍。 +block.thermal-pump.description = 终级水泵。速度是机械泵的三倍。是唯一能够回收熔岩的泵。 +block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料从一个源分割为多个目标。 +block.distributor.description = 一个高级路由器,可以将物品分成最多7个方向。 +block.bridge-conveyor.description = 高级项目传输块。允许在跨越任何地形或建筑物上运输物品,最多跨越3个块。 +block.alpha-mech-pad.description = 当给予足够的电力时,将你的装置重建为[accent] Alpha []机甲。 +block.itemsource.description = 无限输出物品。仅限沙箱。 +block.liquidsource.description = 无限输出液体。仅限沙箱。 +block.itemvoid.description = 在不使用电源的情况下销毁任何进入它的物品。仅限沙箱。 +block.powerinfinite.description = 无限输出功率。仅限沙箱。 +block.powervoid.description = 消耗输入的所有功率。仅限沙箱。 +liquid.water.description = 通常用于冷却和废物处理。 +liquid.lava.description = 可以转换成[LIGHT_GRAY] 石头 [],用于发电或用作某些炮塔的弹药。 +liquid.oil.description = 可以燃烧,爆炸或用作冷却液。 +liquid.cryofluid.description = 用于降温的最有效液体。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 3d18289129..f9ccc2ea8c 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1,118 +1,116 @@ 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.discord = 加入 Mindustry 的 Discord 聊天室 +text.discord = 加入 Mindustry 的 Discord 聊天室! text.link.discord.description = 官方 Mindustry Discord 聊天室 text.link.github.description = 遊戲原始碼 text.link.dev-builds.description = 開發中版本 text.link.trello.description = 官方 Trello 功能規劃看板 -text.link.itch.io.description = 電腦版與網頁版(itch.io 頁面) +text.link.itch.io.description = itch.io 電腦版下載與網頁版 text.link.google-play.description = Google Play 商店頁面 text.link.wiki.description = 官方 Mindustry 維基 -text.linkfail = 無法打開連結!我們已將該網址複製到您的剪貼簿。 -text.editor.web = 線上版本不支援地圖編輯器!請下載遊戲已使用這項功能。 -text.web.unsupported = The web version does not support this feature! Download the game to use it. +text.linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 text.gameover = 核心已被摧毀。 -text.gameover.pvp = The[accent] {0}[] team is victorious! -text.sector.gameover = This sector has been lost. Re-deploy? -text.sector.retry = Retry -text.highscore = [YELLOW]新的高分紀錄! -text.wave.lasted = You lasted until wave [accent]{0}[]. -text.level.highscore = 最高分:[accent] {0} +text.gameover.pvp = [accent]{0}[]隊得到勝利! +text.sector.gameover = 這個區域失守了,重新部署? +text.sector.retry = 重試 +text.highscore = [accent]新的高分紀錄! +text.wave.lasted = 你維持到第[accent]{0}[]波。 +text.level.highscore = 最高分:[accent]{0} text.level.delete.title = 確認刪除 -text.map.delete = Are you sure you want to delete the map "[accent]{0}[]"? +text.map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? text.level.select = 選擇關卡 text.level.mode = 遊戲模式: -text.construction.desktop = Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[]. -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.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.showagain = Don't show again next session -text.coreattack = < Core is under attack! > -text.unlocks = Unlocks +text.construction.desktop = 電腦控制已更改。\n要取消選擇或停止建設,[accent]按空格鍵[]。 +text.construction.title = 方塊建設指南 +text.construction = 你選擇了[accent]方塊建設模式[]。\n\n要放置方塊,點擊你的船附近的有效位置。\n選擇了方塊後,點擊複選框就會開始建設。\n\n- 點擊方塊以從選擇區[accent]移除方塊[]。\n- 按住並拖動以[accent]直線放置方塊[]。\n- 點擊左下角的「X」以[accent]取消建設或取消選擇[]。 +text.deconstruction.title = 方塊移除指南 +text.deconstruction = 你選擇了[accent]方塊移除模式[]。\n\n要移除方塊,點擊你的船附近的方塊。\n選擇了方塊後,點擊複選框就會開始移除。\n\n- 點擊方塊以從選擇區[accent]移除方塊[]。\n- 按住一個空點向任何方向拖動以[accent]移除選中區域的方塊[]。\n- 點擊左下角的「X」以[accent]取消移除或取消選擇[]。 +text.showagain = 下次不再顯示 +text.coreattack = 〈核心正在受到攻擊!〉 +text.unlocks = 已解鎖 text.savegame = 儲存遊戲 text.loadgame = 載入遊戲 text.joingame = 多人連線 -text.addplayers = Add/Remove Players -text.customgame = Custom Game -text.sectors = Sectors -text.sector = Selected Sector: [LIGHT_GRAY]{0} -text.sector.time = Time: [LIGHT_GRAY]{0} -text.sector.deploy = Deploy -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.resume = Resume +text.addplayers = 增加/移除玩家 +text.customgame = 自訂遊戲 +text.sectors = 區域 +text.sector = 區域︰[LIGHT_GRAY]{0} +text.sector.time = 時間︰[LIGHT_GRAY]{0} +text.sector.deploy = 部署 +text.sector.abandon = 放棄 +text.sector.abandon.confirm = 確認要放棄這區域所有進度嗎?\n此操作不可撤回! +text.sector.resume = 繼續 text.sector.locked = [scarlet][[Incomplete] text.sector.unexplored = [accent][[Unexplored] -text.missions = Missions:[LIGHT_GRAY] {0} -text.mission = Mission:[LIGHT_GRAY] {0} -text.mission.main = Main Mission:[LIGHT_GRAY] {0} -text.mission.info = Mission Info -text.mission.complete = Mission complete! -text.mission.complete.body = Sector {0},{1} has been conquered. -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.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy -text.mission.wave.menu = Survive[accent] {0} []waves -text.mission.battle = Destroy the enemy base. -text.mission.resource.menu = Obtain {0} x{1} -text.mission.resource = Obtain {0}:\n[accent]{1}/{2}[] -text.mission.block = Create {0} -text.mission.unit = Create {0} Unit -text.mission.command = Send Command {0} To Units -text.mission.linknode = Link Power Node -text.mission.display = [accent]Mission:\n[LIGHT_GRAY]{0} -text.mission.mech = Switch to mech[accent] {0}[] -text.mission.create = Create[accent] {0}[] -text.none = -text.close = Close +text.missions = 任務︰[LIGHT_GRAY]{0} +text.mission = 任務︰[LIGHT_GRAY]{0} +text.mission.main = 主要任務︰[LIGHT_GRAY]{0} +text.mission.info = 任務資訊 +text.mission.complete = 任務完成! +text.mission.complete.body = 區域{0},{1}已被佔領。 +text.mission.wave = 存活[accent]{0}/{1}[]波\n下一波於{2}開始 +text.mission.wave.enemies = 存活[accent]{0}/{1}[]波\n{2}個敵人 +text.mission.wave.enemy = 存活[accent]{0}/{1}[]波\n{2}個敵人 +text.mission.wave.menu = 存活[accent]{0}[]波 +text.mission.battle = 摧毀敵方基地。 +text.mission.resource.menu = 獲取{0}x{1} +text.mission.resource = 獲取{0}︰\n[accent]{1}/{2}[] +text.mission.block = 建造{0} +text.mission.unit = 生產{0}機組 +text.mission.command = 發送{0}指令至機組 +text.mission.linknode = 鏈接能量節點 +text.mission.display = [accent]任務︰\n[LIGHT_GRAY]{0} +text.mission.mech = 轉換至[accent]{0}[]機甲 +text.mission.create = 製造[accent]{0}[] +text.none = <沒有> +text.close = 關閉 text.quit = 退出 -text.maps = Maps -text.continue = Continue -text.nextmission = Next Mission -text.maps.none = [LIGHT_GRAY]No maps found! +text.maps = 地圖 +text.continue = 繼續 +text.nextmission = 下一個任務 +text.maps.none = [LIGHT_GRAY]找不到地圖! text.about.button = 關於 -text.name = 姓名: -text.filename = File Name: -text.unlocked = New Block Unlocked! -text.unlocked.plural = New Blocks Unlocked! -text.players = {0} 個線上玩家 -text.players.single = {0} 個線上玩家 -text.server.closing = [accent] 正在關閉伺服器... +text.name = 名稱: +text.filename = 檔案名稱︰ +text.unlocked = 新方塊已解鎖! +text.unlocked.plural = 新方塊已解鎖! +text.players = {0}個線上玩家 +text.players.single = {0}個線上玩家 +text.server.closing = [accent]正在關閉伺服器…… text.server.kicked.kick = 您已被踢出伺服器! -text.server.kicked.serverClose = Server closed. -text.server.kicked.sectorComplete = Sector completed. -text.server.kicked.sectorComplete.text = Your mission is complete.\nThe server will now continue at the next sector. +text.server.kicked.serverClose = 伺服器已關閉。 +text.server.kicked.sectorComplete = 區域已完成。 +text.server.kicked.sectorComplete.text = 任務已完成。\n服務器將於下一個區域繼續。 text.server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲! text.server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器! text.server.kicked.banned = 您已經從這個伺服器被封禁。 text.server.kicked.recentKick = 您已經從伺服器被踢除。\n請稍後再進行連線。 -text.server.kicked.nameInUse = There is someone with that name\nalready on this server. -text.server.kicked.nameEmpty = Your name must contain at least one character or number. -text.server.kicked.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.host.info = 目前伺服器監聽於連接埠 [scarlet]6567[] 與 [scarlet]6568[]。\n所有跟您在同一個[LIGHT_GRAY]無線網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n如果您希望網際網路上的玩家透過 IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[LIGHT_GRAY]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放 Mindustry 存取您的區域網路。 -text.join.info = 您可以在此輸入欲連線的伺服器[accent] IP 位址[],或尋找[accent]區域網路[]內的伺服器。目前支援區域網路與網際網路連線。\n\n [LIGHT_GRAY]注意:這裡沒有網際網路伺服器清單,如果您想透過 IP 位址連線到某人的伺服器,您必須向他們詢問 IP 位址。 +text.server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。 +text.server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。 +text.server.kicked.idInUse = 你已經在伺服器中!不允許用兩個賬號。 +text.server.kicked.customClient = 這個伺服器不支持自訂客戶端,請下載官方版本。 +text.host.info = 目前伺服器監聽於連接埠[scarlet]6567[]。\n所有跟您在同一個[LIGHT_GRAY]網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n\n如果您希望網際網路上的玩家透過IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[LIGHT_GRAY]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放Mindustry存取您的區域網路。 +text.join.info = 您可以在此輸入欲連線的[accent]伺服器的IP位址[],或尋找[accent]區域網路[]內的伺服器。目前支援區域網路與網際網路連線。\n\n[LIGHT_GRAY]注意:這裡沒有網際網路伺服器清單,如果您想透過IP位址連線到某人的伺服器,您必須向他們詢問IP位址。 text.hostserver = 建立伺服器 -text.hostserver.mobile = Host\nGame +text.hostserver.mobile = 建立\n伺服器 text.host = 建立 -text.hosting = [accent]伺服器啟動中... +text.hosting = [accent]伺服器啟動中…… text.hosts.refresh = 刷新 text.hosts.discovering = 搜尋區域網路遊戲 text.server.refreshing = 刷新伺服器 text.hosts.none = [lightgray]找不到區域網路伺服器! text.host.invalid = [scarlet]無法連線至伺服器。 text.trace = 跟隨玩家 -text.trace.playername = 玩家名稱:[accent] {0} -text.trace.ip = IP:[accent] {0} -text.trace.id = ID:[accent] {0} -text.trace.android = Android 客戶端:[accent] {0} -text.trace.modclient = 自訂客戶端:[accent] {0} -text.trace.totalblocksbroken = 方塊拆除總數:[accent] {0} -text.trace.structureblocksbroken = 結構方塊拆除數:[accent] {0} -text.trace.lastblockbroken = 最後拆除的方塊:[accent] {0} -text.trace.totalblocksplaced = 方塊建造數:[accent] {0} -text.trace.lastblockplaced = 最後建造的方塊:[accent] {0} +text.trace.playername = 玩家名稱:[accent]{0} +text.trace.ip = IP:[accent]{0} +text.trace.id = ID:[accent]{0} +text.trace.android = Android 客戶端:[accent]{0} +text.trace.modclient = 自訂客戶端:[accent]{0} +text.trace.totalblocksbroken = 方塊拆除總數:[accent]{0} +text.trace.structureblocksbroken = 結構方塊拆除數:[accent]{0} +text.trace.lastblockbroken = 最後拆除的方塊:[accent]{0} +text.trace.totalblocksplaced = 方塊建造數:[accent]{0} +text.trace.lastblockplaced = 最後建造的方塊:[accent]{0} text.invalidid = 無效的客戶端 ID!請提交錯誤報告。 text.server.bans = 封禁 text.server.bans.none = 沒有玩家被封禁! @@ -120,57 +118,57 @@ text.server.admins = 管理員 text.server.admins.none = 找不到管理員! text.server.add = 新增伺服器 text.server.delete = 您確定要刪除這個伺服器嗎? -text.server.hostname = 主機: {0} +text.server.hostname = 主機:{0} text.server.edit = 編輯伺服器 text.server.outdated = [crimson]伺服器版本過舊![] text.server.outdated.client = [crimson]客戶端版本過舊![] -text.server.version = [lightgray]版本: {0} +text.server.version = [lightgray]版本:{0} text.server.custombuild = [yellow]自訂組建 text.confirmban = 您確定要封禁該玩家嗎? -text.confirmkick = Are you sure you want to kick this player? +text.confirmkick = 您確定要踢出該玩家嗎? text.confirmunban = 您確定要解除封禁該玩家嗎? text.confirmadmin = 您確定要提升這個玩家為管理員嗎? text.confirmunadmin = 您確定要解除這個玩家的管理員嗎? text.joingame.title = 加入遊戲 -text.joingame.ip = IP 位址: +text.joingame.ip = IP位址: text.disconnect = 已中斷連線。 text.disconnect.data = 無法載入地圖資料! -text.connecting = [accent]連線中... -text.connecting.data = [accent]正在載入地圖資料... +text.connecting = [accent]連線中…… +text.connecting.data = [accent]正在載入地圖資料…… text.server.port = 連接埠: text.server.addressinuse = 該位址已使用中! text.server.invalidport = 無效的連接埠! -text.server.error = [crimson]建立伺服器時發生錯誤:[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.server.error = [crimson]建立伺服器時發生錯誤:[accent]{0} +text.save.old = 這個存檔屬於舊版本,無法使用了。\n\n[LIGHT_GRAY]舊存檔兼容將在正式4.0版本中實現。 text.save.new = 新存檔 text.save.overwrite = 您確定要覆蓋存檔嗎? -text.overwrite = 覆蓋存檔 +text.overwrite = 覆蓋 text.save.none = 找不到存檔! -text.saveload = [accent]存檔中... +text.saveload = [accent]存檔中…… text.savefail = 無法存檔! text.save.delete.confirm = 您確定要刪除這個存檔嗎? -text.save.delete = 刪除存檔 +text.save.delete = 刪除 text.save.export = 匯出存檔 -text.save.import.invalid = [accent]這是個無效的存檔!\n\n請注意您[scarlet]無法[accent]匯入自訂地圖存檔! -text.save.import.fail = [crimson]無法匯入存檔: [accent]{0} -text.save.export.fail = [crimson]無法匯出存檔: [accent] {0} +text.save.import.invalid = [accent]這是個無效的存檔! +text.save.import.fail = [crimson]無法匯入存檔:[accent]{0} +text.save.export.fail = [crimson]無法匯出存檔:[accent]{0} text.save.import = 匯入存檔 text.save.newslot = 存檔名稱: text.save.rename = 重新命名 text.save.rename.text = 新名稱: text.selectslot = 選取一個存檔。 -text.slot = [accent]存檔 {0} -text.save.corrupted = [accent]此存檔無效或已損毀! -text.sector.corrupted = [accent]A save file for this sector was found, but loading failed.\nA new one has been created. +text.slot = [accent]存檔{0} +text.save.corrupted = [accent]此存檔無效或已損毀!\n如果你剛剛升級了遊戲,那麼這可能是因為存檔格式改變了而[scarlet]不是[]錯誤。 +text.sector.corrupted = [accent]找到此區域的存檔,但是加載失敗。\n已經創建了一個新的存檔。 text.empty = <空白> text.on = 開啟 text.off = 關閉 text.save.autosave = 自動存檔:{0} -text.save.map = 地圖: {0} -text.save.wave = 波次: {0} -text.save.difficulty = 難度: {0} +text.save.map = 地圖:{0} +text.save.wave = 波次:{0} +text.save.difficulty = 難度:{0} text.save.date = 最後存檔時間:{0} -text.save.playtime = Playtime: {0} +text.save.playtime = 遊玩時間: {0} text.confirm = 確認 text.delete = 刪除 text.ok = 確定 @@ -181,70 +179,70 @@ text.copylink = 複製連結 text.back = 返回 text.quit.confirm = 您確定要退出嗎? text.changelog.title = 更新日誌 -text.changelog.loading = 正在取得更新日誌... -text.changelog.error.android = [accent]請注意,更新日誌有時無法在 Android 4.4 或更低版本使用!這是因為 Android 的內部 Bug 導致。 -text.changelog.error.ios = [accent]目前無法在 iOS 系統中使用更新日誌。 +text.changelog.loading = 正在取得更新日誌…… +text.changelog.error.android = [accent]請注意,更新日誌有時無法在Android 4.4或更低版本使用!這是因為 Android 的內部錯誤導致。 +text.changelog.error.ios = [accent]目前無法在iOS系統中使用更新日誌。 text.changelog.error = [scarlet]無法取得更新日誌!請檢查您的網路連線! -text.changelog.current = [yellow][[目前版本] -text.changelog.latest = [accent][[最新版本] -text.loading = [accent]載入中... -text.saving = [accent]Saving... -text.wave = [accent]第 {0} 波 -text.wave.waiting = 將於 {0} 秒後抵達 -text.waiting = 等待中... -text.waiting.players = Waiting for players... -text.wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining -text.wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining +text.changelog.current = [yellow][[Current version] +text.changelog.latest = [accent][[Latest version] +text.loading = [accent]載入中…… +text.saving = [accent]儲存中…… +text.wave = [accent]第{0}波 +text.wave.waiting = 將於{0}秒後抵達 +text.waiting = 等待中…… +text.waiting.players = 等待玩家中…… +text.wave.enemies = [LIGHT_GRAY]剩下{0}敵人 +text.wave.enemy = [LIGHT_GRAY]剩下{0}敵人 text.loadimage = 載入圖像 text.saveimage = 儲存圖像 -text.unknown = Unknown -text.custom = Custom -text.builtin = Built-In -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.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.invalid = Error loading map: corrupted or invalid map file. -text.editor.brush = Brush +text.unknown = 未知 +text.custom = 自訂 +text.builtin = 内建 +text.map.delete.confirm = 確認要刪除地圖嗎?此操作無法撤回! +text.map.random = [accent]隨機地圖 +text.map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[ROYAL]藍色[]的核心。 +text.map.nospawn.pvp = 這個地圖沒有核心讓敵人重生!請在編輯器中添加一個[SCARLET]紅色[]的核心。 +text.map.invalid = 地圖載入錯誤:地圖可能已經損壞。 +text.editor.brush = 粉刷 text.editor.slope = \\ -text.editor.openin = Open In Editor -text.editor.oregen = Ore Generation -text.editor.oregen.info = Ore Generation: -text.editor.mapinfo = Map Info -text.editor.author = Author: -text.editor.description = Description: -text.editor.name = Name: -text.editor.teams = Teams -text.editor.elevation = Elevation -text.editor.errorimageload = 載入圖像檔時發生錯誤:[accent] {0} -text.editor.errorimagesave = 儲存圖像檔時發生錯誤:[橙色] {0} +text.editor.openin = 在編輯器中開啟 +text.editor.oregen = 礦石產生 +text.editor.oregen.info = 礦石產生: +text.editor.mapinfo = 地圖資訊 +text.editor.author = 作者: +text.editor.description = 描述: +text.editor.name = 名稱: +text.editor.teams = 隊伍 +text.editor.elevation = 高度 +text.editor.errorimageload = 載入圖像檔時發生錯誤:[accent]{0} +text.editor.errorimagesave = 儲存圖像檔時發生錯誤:[橙色]{0} text.editor.generate = 產生 text.editor.resize = 調整大小 text.editor.loadmap = 載入地圖 text.editor.savemap = 儲存地圖 -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.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 = Import... -text.editor.importmap = Import Map -text.editor.importmap.description = Import an already existing map -text.editor.importfile = Import File -text.editor.importfile.description = Import an external map file -text.editor.importimage = Import Terrain Image -text.editor.importimage.description = Import an external map image file -text.editor.export = Export... -text.editor.exportfile = Export File -text.editor.exportfile.description = Export a map file -text.editor.exportimage = Export Terrain Image -text.editor.exportimage.description = Export a map image file +text.editor.saved = 已儲存! +text.editor.save.noname = 您的地圖沒有名稱!在「地圖資訊」畫面設置一個名稱。 +text.editor.save.overwrite = 您的地圖覆寫一個內建的地圖!在「地圖信息」畫面設置一個不同的名稱。 +text.editor.import.exists = [scarlet]匯入失敗:[]一個叫「{0}」的內建地圖已存在! +text.editor.import = 匯入…… +text.editor.importmap = 匯入地圖 +text.editor.importmap.description = 匯入一個已存在的地圖 +text.editor.importfile = 匯入檔案 +text.editor.importfile.description = 匯入一個外部的地圖檔案 +text.editor.importimage = 匯入地形圖像檔 +text.editor.importimage.description = 匯入一個外部的地形圖像檔 +text.editor.export = 匯出…… +text.editor.exportfile = 匯出檔案 +text.editor.exportfile.description = 匯出一個地圖檔案 +text.editor.exportimage = 匯出地形圖像檔 +text.editor.exportimage.description = 匯出一個地形圖像檔 text.editor.loadimage = 載入圖像 text.editor.saveimage = 儲存圖像 text.editor.unsaved = [scarlet]尚未儲存變更![]\n您確定要退出嗎? text.editor.resizemap = 調整地圖大小 text.editor.mapname = 地圖名稱: text.editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。 -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]警告![]同名地圖存在,確定要覆蓋現有地圖? text.editor.selectmap = 選取要載入的地圖: text.width = 寬度: text.height = 長度: @@ -252,104 +250,107 @@ text.menu = 主選單 text.play = 開始 text.load = 載入 text.save = 儲存 -text.fps = FPS: {0} -text.tps = TPS: {0} -text.ping = Ping: {0}ms +text.fps = 螢幕刷新率:{0} +text.tps = TPS:{0} +text.ping = 延遲:{0}ms text.language.restart = 請重新啟動遊戲以使選取的語言生效。 text.settings = 設定 text.tutorial = 教學 text.editor = 地圖編輯器 text.mapeditor = 地圖編輯器 text.donate = 贊助 -text.connectfail = [crimson]無法連線到伺服器: [accent]{0} -text.error.unreachable = Server unreachable. -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.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -text.error.alreadyconnected = Already connected. -text.error.mapnotfound = Map file not found! -text.error.any = Unkown network error. +text.connectfail = [crimson]無法連線到伺服器:[accent]{0} +text.error.unreachable = 無法到達伺服器。 +text.error.invalidaddress = 無效地址。 +text.error.timedout = 超時連接!\n確保伺服器設置了連接埠轉發,並且地址正確! +text.error.mismatch = 包裹錯誤:\n客戶端/伺服器版本可能不匹配。 n確保客戶端和伺服器有最新版本的Mindustry! +text.error.alreadyconnected = 已連接。 +text.error.mapnotfound = 找不到地圖! +text.error.any = 未知網絡錯誤。 text.settings.language = 語言 text.settings.reset = 重設為預設設定 -text.settings.rebind = Rebind +text.settings.rebind = 重新綁定 text.settings.controls = 操作 text.settings.game = 遊戲 text.settings.sound = 音效 text.settings.graphics = 圖形 -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.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.clearunlocks = Clear Unlocks -text.settings.clearall = Clear All +text.settings.cleardata = 清除遊戲數據…… +text.settings.clear.confirm = 您確定要清除數據嗎?\n此操作無法撤回! +text.settings.clearall.confirm = [scarlet]警告![]\n這將清除所有數據,包括存檔、地圖、解鎖和熱鍵綁定。\n按「是」後,遊戲將刪除所有數據並自動退出。 +text.settings.clearsectors = 清除區域 +text.settings.clearunlocks = 清除已解鎖 +text.settings.clearall = 清除所有 text.paused = 已暫停 -text.yes = Yes -text.no = No +text.yes = 是 +text.no = 否 text.info.title = [accent]資訊 text.error.title = [crimson]發生錯誤 text.error.crashtitle = 發生錯誤 +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = 方塊資訊 text.blocks.powercapacity = 蓄電量 -text.blocks.powershot = 每發射擊功耗 -text.blocks.targetsair = Targets Air -text.blocks.itemspeed = Units Moved -text.blocks.shootrange = Range +text.blocks.powershot = 能源/射擊 +text.blocks.targetsair = 攻擊空中目標 +text.blocks.itemspeed = 移動速度 +text.blocks.shootrange = 範圍 text.blocks.size = 尺寸 text.blocks.liquidcapacity = 液體容量 text.blocks.maxitemssecond = 最高產量 text.blocks.powerrange = 輸出範圍 -text.blocks.poweruse = Power Use -text.blocks.powerdamage = Power/Damage -text.blocks.inputitemcapacity = Input Item Capacity -text.blocks.outputitemcapacity = Input Item Capacity -text.blocks.itemcapacity = 材料容量 -text.blocks.basepowergeneration = Base Power Generation -text.blocks.powertransferspeed = Power Transfer -text.blocks.craftspeed = Production Speed +text.blocks.poweruse = 能源使用 +text.blocks.powerdamage = 能源/傷害 +text.blocks.inputitemcapacity = 最大輸入 +text.blocks.outputitemcapacity = 最大輸出 +text.blocks.itemcapacity = 物品容量 +text.blocks.basepowergeneration = 基本能量生产 +text.blocks.powertransferspeed = 能源傳輸 +text.blocks.craftspeed = 產生速度 text.blocks.inputliquid = 輸入液體 -text.blocks.inputliquidaux = Aux Liquid -text.blocks.inputitem = 輸入材料 -text.blocks.inputitems = Input Items -text.blocks.outputitem = Output Item -text.blocks.drilltier = Drillables -text.blocks.drillspeed = Base Drill Speed -text.blocks.liquidoutput = Liquid Output -text.blocks.liquidoutputspeed = Liquid Output Speed -text.blocks.liquiduse = Liquid Use -text.blocks.coolant = Coolant -text.blocks.coolantuse = Coolant Use -text.blocks.inputliquidfuel = Fuel Liquid -text.blocks.liquidfueluse = Liquid Fuel Use -text.blocks.explosive = 易爆裂物! +text.blocks.inputliquidaux = 輔助液體 +text.blocks.inputitem = 輸入物品 +text.blocks.inputitems = 輸入物品 +text.blocks.outputitem = 輸出物品 +text.blocks.drilltier = 可鑽取礦物 +text.blocks.drillspeed = 基本鑽取速度 +text.blocks.liquidoutput = 輸出液體 +text.blocks.liquidoutputspeed = 輸出液體速度 +text.blocks.liquiduse = 使用液體速度 +text.blocks.coolant = 冷卻劑 +text.blocks.coolantuse = 使用冷卻劑 +text.blocks.inputliquidfuel = 輸入液體燃料 +text.blocks.liquidfueluse = 使用液體燃料速度 +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 耐久度 -text.blocks.inaccuracy = 後座力 +text.blocks.inaccuracy = 誤差 text.blocks.shots = 射擊數 -text.blocks.reload = Reload -text.blocks.inputfuel = Fuel -text.blocks.fuelburntime = Fuel Burn Time +text.blocks.reload = 重裝彈藥 +text.blocks.inputfuel = 燃料 +text.blocks.fuelburntime = 燃燒燃料時間 text.blocks.inputcapacity = 輸入容量 text.blocks.outputcapacity = 輸出容量 -text.unit.blocks = blocks -text.unit.powersecond = power units/second -text.unit.liquidsecond = liquid units/second -text.unit.itemssecond = items/second -text.unit.pixelssecond = pixels/second -text.unit.liquidunits = liquid units -text.unit.powerunits = power units -text.unit.degrees = degrees -text.unit.seconds = seconds -text.unit.items = items -text.category.general = General -text.category.power = Power -text.category.liquids = Liquids -text.category.items = Items -text.category.crafting = Crafting -text.category.shooting = Shooting -setting.autotarget.name = Auto-Target -setting.fpscap.name = Max FPS -setting.fpscap.none = None -setting.fpscap.text = {0} FPS -setting.difficulty.training = training +text.unit.blocks = 方塊 +text.unit.powersecond = 能源單位/秒 +text.unit.liquidsecond = 液體單位/秒 +text.unit.itemssecond = 物品/秒 +text.unit.pixelssecond = 像素/秒 +text.unit.liquidunits = 液體單位 +text.unit.powerunits = 能源單位 +text.unit.degrees = 度 +text.unit.seconds = 秒 +text.unit.items = 物品 +text.category.general = 一般 +text.category.power = 能源 +text.category.liquids = 液體 +text.category.items = 物品 +text.category.crafting = 合成 +text.category.shooting = 射擊 +text.category.optional = Optional Enhancements +setting.autotarget.name = 自動射擊 +setting.fpscap.name = 最大螢幕刷新率 +setting.fpscap.none = 没有 +setting.fpscap.text = {0}螢幕刷新率 +setting.difficulty.training = 訓練 setting.difficulty.easy = 簡單 setting.difficulty.normal = 普通 setting.difficulty.hard = 困難 @@ -359,31 +360,31 @@ setting.screenshake.name = 畫面抖動 setting.effects.name = 顯示特效 setting.sensitivity.name = 控制器靈敏度 setting.saveinterval.name = 自動存檔間隔 -setting.seconds = {0} 秒 +setting.seconds = {0}秒 setting.fullscreen.name = 全螢幕 -setting.multithread.name = 多執行緒 setting.fps.name = 顯示螢幕刷新率 setting.vsync.name = 垂直同步 setting.lasers.name = 顯示雷射光束 -setting.minimap.name = Show Minimap +setting.minimap.name = 顯示小地圖 setting.musicvol.name = 音樂音量 setting.mutemusic.name = 靜音 setting.sfxvol.name = 音效音量 setting.mutesound.name = 靜音 +setting.crashreport.name = Send Anonymous Crash Reports text.keybind.title = 重新綁定按鍵 -category.general.name = General -category.view.name = View -category.multiplayer.name = Multiplayer -command.attack = Attack -command.retreat = Retreat -command.patrol = Patrol -keybind.press = Press a key... -keybind.press.axis = Press an axis or key... +category.general.name = 一般 +category.view.name = 查看 +category.multiplayer.name = 多人 +command.attack = 攻擊 +command.retreat = 撤退 +command.patrol = 巡邏 +keybind.press = 按一下鍵 +keybind.press.axis = 按一下軸心或鍵 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 keybind.select.name = 選取 keybind.break.name = 拆除 -keybind.deselect.name = Deselect +keybind.deselect.name = 取消選取 keybind.shoot.name = 射擊 keybind.zoom_hold.name = 按住縮放 keybind.zoom.name = 縮放 @@ -394,200 +395,199 @@ keybind.chat.name = 聊天 keybind.player_list.name = 玩家列表 keybind.console.name = 終端機 keybind.rotate.name = 旋轉 -keybind.toggle_menus.name = Toggle menus -keybind.chat_history_prev.name = Chat history prev -keybind.chat_history_next.name = Chat history next -keybind.chat_scroll.name = Chat scroll -keybind.drop_unit.name = drop unit -keybind.zoom_minimap.name = Zoom minimap +keybind.toggle_menus.name = 切換畫面 +keybind.chat_history_prev.name = 之前的聊天記錄 +keybind.chat_history_next.name = 之後的聊天記錄 +keybind.chat_scroll.name = 聊天記錄滾動 +keybind.drop_unit.name = 放下單位 +keybind.zoom_minimap.name = 縮放小地圖 mode.text.help.title = 模式說明 mode.waves.name = 一般 mode.waves.description = 一般模式,有限的資源與自動來襲的波次。 mode.sandbox.name = 沙盒 mode.sandbox.description = 無限的資源,與不倒數計時的波次。 -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 = 自由建造 mode.freebuild.description = 有限的資源,與不倒數計時的波次。 -mode.pvp.name = PvP -mode.pvp.description = fight against other players locally. -content.item.name = Items -content.liquid.name = Liquids -content.unit.name = Units -content.recipe.name = Blocks -content.mech.name = Mechs +mode.pvp.name = 對戰 +mode.pvp.description = 和其他玩家鬥爭。 +content.item.name = 物品 +content.liquid.name = 液體 +content.unit.name = 機組 +content.recipe.name = 方塊 +content.mech.name = 機甲 item.stone.name = 石材 -item.stone.description = A common raw material. Used for separating and refining into other materials, or melting into lava. -item.copper.name = Copper -item.copper.description = A useful structure material. Used extensively in all types of blocks. -item.lead.name = Lead -item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. -item.coal.name = 煤礦 -item.coal.description = A common and readily available fuel. -item.dense-alloy.name = Dense Alloy -item.dense-alloy.description = A tough alloy made with lead and copper. Used in advanced transportation blocks and high-tier drills. +item.stone.description = 一種常見的原料。用於分離和提煉成其他材料,或熔化成熔岩。 +item.copper.name = 銅 +item.copper.description = 一種有用的結構材料。在各種類型的方塊中廣泛使用。 +item.lead.name = 鉛 +item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和運輸液體方塊。 +item.coal.name = 煤 +item.coal.description = 一種常見並容易獲得的燃料。 +item.dense-alloy.name = 稠密合金 +item.dense-alloy.description = 一種由鉛和銅製成的堅韌合金。用於高級的運輸方塊和高級鑽頭。 item.titanium.name = 鈦 -item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. -item.thorium.name = Thorium -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. -item.silicon.name = Silicon -item.silicon.description = An extremely useful semiconductor, with applications in solar panels and many complex electronics. -item.plastanium.name = Plastanium -item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. -item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. -item.surge-alloy.name = Surge Alloy -item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.biomatter.name = Biomatter -item.biomatter.description = A clump of organic mush; used for conversion into oil or as a basic fuel. +item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛機。 +item.thorium.name = 釷 +item.thorium.description = 一種稠密的放射性金屬,用作支撐結構和核燃料。 +item.silicon.name = 矽 +item.silicon.description = 一種非常有用的半導體,被用於太陽能電池板和很多複雜的電子設備。 +item.plastanium.name = 塑料 +item.plastanium.description = 一種輕量、可延展的材料,用於高級的飛機和碎彈藥。 +item.phase-fabric.name = 相織布 +item.phase-fabric.description = 一種近乎無重量的物質,用於先進的電子設備和自修復技術。 +item.surge-alloy.name = 波動合金 +item.surge-alloy.description = 一種具有獨特電子特性的高級合金。 +item.biomatter.name = 生物物質 +item.biomatter.description = 一叢有機糊;用於轉化為油或作為基本燃料。 item.sand.name = 沙 -item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. -item.blast-compound.name = Blast Compound -item.blast-compound.description = A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. -item.pyratite.name = Pyratite -item.pyratite.description = An extremely flammable substance used in incendiary weapons. +item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和助熔劑。 +item.blast-compound.name = 爆炸混合物 +item.blast-compound.description = 一種用於炸彈和炸藥的揮發性混合物。雖然它可以作為燃料燃燒,但不建議這樣做。 +item.pyratite.name = 硫 +item.pyratite.description = 一種在燃燒武器中使用的極易燃物質。 liquid.water.name = 水 liquid.lava.name = 岩漿 liquid.oil.name = 原油 -liquid.cryofluid.name = Cryofluid -mech.alpha-mech.name = Alpha -mech.alpha-mech.weapon = Heavy Repeater -mech.alpha-mech.ability = Drone Swarm -mech.alpha-mech.description = The standard mech. Has decent speed and damage output; can create up to 3 drones for increased offensive capability. -mech.delta-mech.name = Delta -mech.delta-mech.weapon = Arc Generator -mech.delta-mech.ability = Discharge -mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. -mech.tau-mech.name = Tau -mech.tau-mech.weapon = Restruct Laser -mech.tau-mech.ability = Repair Burst -mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability. -mech.omega-mech.name = Omega -mech.omega-mech.weapon = Swarm Missiles -mech.omega-mech.ability = Armored Configuration -mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor ability can block up to 90% of incoming damage. -mech.dart-ship.name = Dart -mech.dart-ship.weapon = Repeater -mech.dart-ship.description = The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed. -mech.javelin-ship.name = Javelin -mech.javelin-ship.description = A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning ability and missiles. -mech.javelin-ship.weapon = Burst Missiles -mech.javelin-ship.ability = Discharge Booster -mech.trident-ship.name = Trident -mech.trident-ship.description = A heavy bomber. Reasonably well armored. -mech.trident-ship.weapon = Bomb Bay -mech.glaive-ship.name = Glaive -mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. -mech.glaive-ship.weapon = Flame Repeater -text.item.explosiveness = [LIGHT_GRAY]Explosiveness: {0} -text.item.flammability = [LIGHT_GRAY]Flammability: {0} -text.item.radioactivity = [LIGHT_GRAY]Radioactivity: {0} -text.item.fluxiness = [LIGHT_GRAY]Flux Power: {0} -text.unit.health = [LIGHT_GRAY]Health: {0} -text.unit.speed = [LIGHT_GRAY]Speed: {0} -text.mech.weapon = [LIGHT_GRAY]Weapon: {0} -text.mech.armor = [LIGHT_GRAY]Armor: {0} -text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} -text.mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} -text.mech.minepower = [LIGHT_GRAY]Mining Power: {0} -text.mech.ability = [LIGHT_GRAY]Ability: {0} -text.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} -text.liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} -text.liquid.temperature = [LIGHT_GRAY]Temperature: {0} -block.spawn.name = Enemy Spawn -block.core.name = Core -block.metalfloor.name = Metal Floor -block.deepwater.name = deepwater -block.water.name = water -block.lava.name = lava -block.tar.name = Tar -block.blackstone.name = blackstone -block.stone.name = stone -block.dirt.name = dirt -block.sand.name = sand -block.ice.name = ice -block.snow.name = snow -block.grass.name = grass -block.shrub.name = shrub -block.rock.name = rock -block.blackrock.name = blackrock -block.icerock.name = icerock -block.copper-wall.name = Copper Wall -block.copper-wall-large.name = Large Copper Wall -block.dense-alloy-wall.name = Dense Alloy Wall -block.dense-alloy-wall-large.name = Large Dense Alloy Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall -block.thorium-wall.name = Thorium Wall -block.thorium-wall-large.name = Large Thorium Wall +liquid.cryofluid.name = 冷凍液 +mech.alpha-mech.name = 阿爾法 +mech.alpha-mech.weapon = 重型機關槍 +mech.alpha-mech.ability = 無人機群 +mech.alpha-mech.description = 標準的機甲。具有不錯的速度和傷害輸出;可以製造多達3架無人機以提高進攻能力。 +mech.delta-mech.name = 德爾塔 +mech.delta-mech.weapon = 電弧生成機 +mech.delta-mech.ability = 放電 +mech.delta-mech.description = 一种快速、轻铠的机甲,是用於打了就跑的攻擊。对结构造成的伤害很小,但可以用弧形闪电武器很快杀死大量敌方机组。 +mech.tau-mech.name = Tau机甲 +mech.tau-mech.weapon = 重構激光 +mech.tau-mech.ability = 修复陣 +mech.tau-mech.description = 支援機甲。射擊友好方塊以治療它們。可以使用它的修復能力熄滅火焰並治療一定範圍內的友軍。 +mech.omega-mech.name = 奧米伽 +mech.omega-mech.weapon = 導彈群 +mech.omega-mech.ability = 裝甲配置 +mech.omega-mech.description = 一種笨重、裝甲重的機甲,用於在前線突擊。它的裝甲能力可以阻擋高達90%的傷害。 +mech.dart-ship.name = 鏢船 +mech.dart-ship.weapon = 機關槍 +mech.dart-ship.description = 標準飛船。快速、輕便,但有低的攻擊能力和慢的採礦速度。 +mech.javelin-ship.name = 標槍 +mech.javelin-ship.description = 一種打了就跑的侵襲船。雖然最初很慢,但它可以加速到很快的速度,並飛過敵人的前哨站,利用其閃電能力和導彈造成大量的傷害。 +mech.javelin-ship.weapon = 爆發導彈 +mech.javelin-ship.ability = 放電助推器 +mech.trident-ship.name = 三叉 +mech.trident-ship.description = 一种重型轰炸机。有比較厚的装甲。 +mech.trident-ship.weapon = 炸彈 +mech.glaive-ship.name = 長柄 +mech.glaive-ship.description = 一種大型、裝甲厚的武裝直升機。配備燃燒機關槍。有優秀的加速能力與最快的速度。 +mech.glaive-ship.weapon = 火焰機關槍 +text.item.explosiveness = [LIGHT_GRAY]爆炸性:{0} +text.item.flammability = [LIGHT_GRAY]易燃性:{0} +text.item.radioactivity = [LIGHT_GRAY]放射性:{0} +text.item.fluxiness = [LIGHT_GRAY]助熔性:{0} +text.unit.health = [LIGHT_GRAY]耐久度:{0} +text.unit.speed = [LIGHT_GRAY]速度:{0} +text.mech.weapon = [LIGHT_GRAY]武器:{0} +text.mech.armor = [LIGHT_GRAY]裝甲:{0} +text.mech.itemcapacity = [LIGHT_GRAY]物品容量:{0} +text.mech.minespeed = [LIGHT_GRAY]採礦速度:{0} +text.mech.minepower = [LIGHT_GRAY]採礦力度:{0} +text.mech.ability = [LIGHT_GRAY]能力:{0} +text.liquid.heatcapacity = [LIGHT_GRAY]熱容量:{0} +text.liquid.viscosity = [LIGHT_GRAY]粘性:{0} +text.liquid.temperature = [LIGHT_GRAY]温度:{0} +block.constructing = {0}\n[LIGHT_GRAY](Constructing) +block.spawn.name = 敵人生成 +block.core.name = 核心 +block.metalfloor.name = 金屬地板 +block.deepwater.name = 深水 +block.water.name = 水 +block.lava.name = 岩浆 +block.tar.name = 焦油 +block.blackstone.name = 黑石頭 +block.stone.name = 石頭 +block.dirt.name = 泥土 +block.sand.name = 沙 +block.ice.name = 冰 +block.snow.name = 雪 +block.grass.name = 草 +block.shrub.name = 灌木 +block.rock.name = 岩石 +block.blackrock.name = 黑岩石 +block.icerock.name = 冰岩石 +block.copper-wall.name = 銅牆 +block.copper-wall-large.name = 大型銅牆 +block.dense-alloy-wall.name = 稠密合金牆 +block.dense-alloy-wall-large.name = 大型稠密合金牆 +block.phase-wall.name = 相織布牆 +block.phase-wall-large.name = 大型相織布牆 +block.thorium-wall.name = 釷牆 +block.thorium-wall-large.name = 大型釷牆 block.door.name = 門 block.door-large.name = 大門 -block.duo.name = Duo -block.scorch.name = Scorch -block.hail.name = Hail -block.lancer.name = Lancer +block.duo.name = 雙炮 +block.scorch.name = 灼燒炮 +block.hail.name = 冰雹炮 +block.lancer.name = 藍瑟炮 block.conveyor.name = 輸送帶 -block.titanium-conveyor.name = Titanium Conveyor +block.titanium-conveyor.name = 鈦輸送帶 block.junction.name = 樞紐 block.router.name = 分配器 -block.distributor.name = Distributor +block.distributor.name = 大型分配器 block.sorter.name = 分類器 -block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right. -block.overflow-gate.name = Overflow Gate -block.overflow-gate.description = A combination splitter and router that only outputs to the left and right if the front path is blocked. +block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從左邊和右邊輸出。 +block.overflow-gate.name = 溢流器 +block.overflow-gate.description = 分離器和分配器的組合。如果前面被擋住,則向從左邊和右邊輸出物品。 block.smelter.name = 煉鋼廠 -block.arc-smelter.name = Arc Smelter -block.silicon-smelter.name = Silicon Smelter -block.phase-weaver.name = Phase Weaver -block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer -block.melter.name = Melter -block.incinerator.name = Incinerator -block.biomattercompressor.name = Biomatter Compressor -block.separator.name = Separator -block.centrifuge.name = Centrifuge -block.power-node.name = Power Node -block.power-node-large.name = Large Power Node -block.battery.name = Battery -block.battery-large.name = Large Battery -block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Turbine Generator -block.mechanical-drill.name = Mechanical Drill -block.pneumatic-drill.name = Pneumatic Drill -block.laser-drill.name = Laser Drill -block.water-extractor.name = Water Extractor -block.cultivator.name = Cultivator -block.alpha-mech-pad.name = Alpha Mech Pad -block.dart-ship-pad.name = Dart Ship Pad -block.delta-mech-pad.name = Delta Mech Pad -block.javelin-ship-pad.name = Javelin Ship Pad -block.trident-ship-pad.name = Trident Ship Pad -block.glaive-ship-pad.name = Glaive Ship Pad -block.omega-mech-pad.name = Omega Mech Pad -block.tau-mech-pad.name = Tau Mech Pad +block.arc-smelter.name = 電弧煉鋼廠 +block.silicon-smelter.name = 煉矽廠 +block.phase-weaver.name = 相織布編織器 +block.pulverizer.name = 粉碎機 +block.cryofluidmixer.name = 冷凍液混合器 +block.melter.name = 熔爐 +block.incinerator.name = 焚化爐 +block.biomattercompressor.name = 生物物質壓縮機 +block.separator.name = 分離機 +block.centrifuge.name = 離心機 +block.power-node.name = 能源節點 +block.power-node-large.name = 大型能源節點 +block.battery.name = 電池 +block.battery-large.name = 大型電池 +block.combustion-generator.name = 燃燒發電機 +block.turbine-generator.name = 渦輪發電機 +block.mechanical-drill.name = 機械鑽頭 +block.pneumatic-drill.name = 氣動鑽頭 +block.laser-drill.name = 激光鑽頭 +block.water-extractor.name = 水提取器 +block.cultivator.name = 耕種機 +block.alpha-mech-pad.name = 阿爾法機甲墊 +block.dart-ship-pad.name = 鏢船墊 +block.delta-mech-pad.name = 德爾塔機甲墊 +block.javelin-ship-pad.name = 標槍機甲墊 +block.trident-ship-pad.name = 三叉船墊 +block.glaive-ship-pad.name = 長柄船墊 +block.omega-mech-pad.name = 奧米伽機甲墊 +block.tau-mech-pad.name = Tau機甲墊 block.conduit.name = 管線 -block.mechanical-pump.name = Mechanical Pump -block.itemsource.name = Item Source -block.itemvoid.name = Item Void -block.liquidsource.name = Liquid Source -block.powervoid.name = Power Void -block.powerinfinite.name = Power Infinite -block.unloader.name = Unloader -block.vault.name = Vault -block.wave.name = Wave -block.swarmer.name = Swarmer -block.salvo.name = Salvo -block.ripple.name = Ripple -block.phase-conveyor.name = Phase Conveyor -block.bridge-conveyor.name = Bridge Conveyor -block.plastanium-compressor.name = Plastanium Compressor -block.pyratite-mixer.name = Pyratite Mixer -block.blast-mixer.name = Blast Mixer -block.solidifer.name = Solidifer -block.solar-panel.name = Solar Panel -block.solar-panel-large.name = Large Solar Panel -block.oil-extractor.name = Oil Extractor -block.spirit-factory.name = Spirit Drone Factory +block.mechanical-pump.name = 機械泵 +block.itemsource.name = 物品源 +block.itemvoid.name = 物品空虚 +block.liquidsource.name = 液體源 +block.powervoid.name = 能源空虛 +block.powerinfinite.name = 無限能量 +block.unloader.name = 裝卸器 +block.vault.name = 存儲庫 +block.wave.name = 波浪炮 +block.swarmer.name = 群炮 +block.salvo.name = 齊射炮 +block.ripple.name = 波紋炮 +block.phase-conveyor.name = 相織布傳送帶 +block.bridge-conveyor.name = 傳送帶橋 +block.plastanium-compressor.name = 塑料壓縮機 +block.pyratite-mixer.name = 硫混合器 +block.blast-mixer.name = 爆炸混合器 +block.solidifer.name = 凝固器 +block.solar-panel.name = 太陽能板 +block.solar-panel-large.name = 大型太陽能板 +block.oil-extractor.name = 石油鑽井 +block.spirit-factory.name = 精神無人機工廠 block.phantom-factory.name = Phantom Drone Factory block.wraith-factory.name = Wraith Fighter Factory block.ghoul-factory.name = Ghoul Bomber Factory @@ -595,43 +595,43 @@ block.dagger-factory.name = Dagger Mech Factory block.titan-factory.name = Titan Mech Factory block.fortress-factory.name = Fortress Mech Factory block.revenant-factory.name = Revenant Fighter Factory -block.repair-point.name = Repair Point -block.pulse-conduit.name = Pulse Conduit -block.phase-conduit.name = Phase Conduit -block.liquid-router.name = Liquid Router -block.liquid-tank.name = Liquid Tank -block.liquid-junction.name = Liquid Junction -block.bridge-conduit.name = Bridge Conduit -block.rotary-pump.name = Rotary Pump -block.thorium-reactor.name = Thorium Reactor -block.command-center.name = Command Center -block.mass-driver.name = Mass Driver -block.blast-drill.name = Blast Drill -block.thermal-pump.name = Thermal Pump -block.thermal-generator.name = Thermal Generator -block.alloy-smelter.name = Alloy Smtler -block.mend-projector.name = Mend Projector -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Large Surge Wall -block.cyclone.name = Cyclone -block.fuse.name = Fuse -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector -block.arc.name = Arc -block.rtg-generator.name = RTG Generator -block.spectre.name = Spectre -block.meltdown.name = Meltdown -block.container.name = Container -block.core.description = The most important building in the game. -team.blue.name = blue -team.red.name = red -team.orange.name = orange -team.none.name = gray -team.green.name = green -team.purple.name = purple -unit.alpha-drone.name = Alpha Drone -unit.spirit.name = Spirit Drone +block.repair-point.name = 維修點 +block.pulse-conduit.name = 脈衝管線 +block.phase-conduit.name = 相織管線 +block.liquid-router.name = 液體分配器 +block.liquid-tank.name = 液體儲罐 +block.liquid-junction.name = 液體連接點 +block.bridge-conduit.name = 導管橋 +block.rotary-pump.name = 迴旋泵 +block.thorium-reactor.name = 釷反應堆 +block.command-center.name = 指令中心 +block.mass-driver.name = 質量驅動器 +block.blast-drill.name = 爆破鑽頭 +block.thermal-pump.name = 熱能泵 +block.thermal-generator.name = 熱能發電機 +block.alloy-smelter.name = 合金冶煉廠 +block.mend-projector.name = 修理投影器 +block.surge-wall.name = 波動牆 +block.surge-wall-large.name = 大型波動牆 +block.cyclone.name = 氣旋炮 +block.fuse.name = 融合炮 +block.shock-mine.name = 休克地雷 +block.overdrive-projector.name = 超速投影器 +block.force-projector.name = 力牆投影器 +block.arc.name = 電弧 +block.rtg-generator.name = 放射性同位素熱電發電機 +block.spectre.name = 幽靈炮 +block.meltdown.name = 熔毀炮 +block.container.name = 容器 +block.core.description = 遊戲中最重要的建築。 +team.blue.name = 藍 +team.red.name = 紅 +team.orange.name = 橙 +team.none.name = 灰 +team.green.name = 綠 +team.purple.name = 紫 +unit.alpha-drone.name = 阿爾法無人機 +unit.spirit.name = 精神無人機 unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.phantom.name = Phantom Drone unit.phantom.description = An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index e1afd2f5a9..e144699c38 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -6,5271 +6,5257 @@ filter: Nearest,Nearest repeat: none force-projector-top rotate: false - xy: 217, 208 + xy: 724, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 555, 355 + xy: 261, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 573, 355 + xy: 243, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 407, 366 + xy: 473, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 407, 356 + xy: 483, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 457, 371 + xy: 603, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 427, 331 + xy: 603, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 437, 341 + xy: 613, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 447, 351 + xy: 613, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 457, 361 + xy: 623, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 467, 371 + xy: 623, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 427, 321 + xy: 633, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 437, 331 + xy: 643, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 447, 341 + xy: 653, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 457, 351 + xy: 663, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 467, 361 + xy: 673, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 427, 311 + xy: 683, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 437, 321 + xy: 693, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 447, 331 + xy: 703, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 457, 341 + xy: 713, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 467, 351 + xy: 723, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 427, 301 + xy: 733, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 437, 311 + xy: 743, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 447, 321 + xy: 753, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 737, 285 + xy: 681, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 747, 295 + xy: 691, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 757, 305 + xy: 691, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 767, 315 + xy: 701, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 787, 325 + xy: 701, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 747, 285 + xy: 711, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 757, 295 + xy: 711, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 767, 305 + xy: 721, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 777, 315 + xy: 721, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 797, 325 + xy: 731, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 757, 285 + xy: 731, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 767, 295 + xy: 741, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 777, 305 + xy: 741, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 787, 315 + xy: 751, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 767, 285 + xy: 751, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 777, 295 + xy: 761, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 787, 305 + xy: 761, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 797, 315 + xy: 771, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 777, 285 + xy: 771, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mass-driver-turret rotate: false - xy: 168, 46 + xy: 958, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 687, 325 + xy: 953, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 647, 285 + xy: 963, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 657, 295 + xy: 973, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 +warp-gate + rotate: false + xy: 584, 427 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 warp-gate-top rotate: false - xy: 289, 308 + xy: 610, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 79, 1 + xy: 204, 283 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 860, 453 + xy: 233, 346 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 886, 453 + xy: 30, 80 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 912, 453 + xy: 285, 402 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 663, 409 + xy: 205, 159 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 645, 373 + xy: 205, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 663, 391 + xy: 261, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 663, 373 + xy: 243, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 519, 355 + xy: 225, 165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 537, 355 + xy: 223, 147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 160, 20 + xy: 984, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 254, 310 + xy: 350, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 265, 268 + xy: 376, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 273, 242 + xy: 402, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 plasma-drill rotate: false - xy: 153, 232 + xy: 25, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-rim rotate: false - xy: 213, 294 + xy: 59, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-rotator rotate: false - xy: 56, 95 + xy: 27, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-top rotate: false - xy: 56, 61 + xy: 61, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 681, 391 + xy: 225, 77 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 681, 373 + xy: 259, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 681, 355 + xy: 243, 82 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 771, 395 + xy: 315, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 771, 377 + xy: 297, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 771, 359 + xy: 315, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 789, 415 + xy: 297, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 blackrock1 rotate: false - xy: 212, 95 + xy: 214, 55 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackrock rotate: false - xy: 212, 95 + xy: 214, 55 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackrockshadow1 rotate: false - xy: 212, 85 + xy: 219, 21 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone1 rotate: false - xy: 212, 75 + xy: 219, 11 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackstone rotate: false - xy: 212, 75 + xy: 219, 11 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone2 rotate: false - xy: 212, 65 + xy: 219, 1 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone3 rotate: false - xy: 212, 55 + xy: 229, 49 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstoneedge rotate: false - xy: 271, 170 + xy: 283, 98 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 coal1 rotate: false - xy: 417, 366 + xy: 483, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal2 rotate: false - xy: 407, 346 + xy: 493, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal3 rotate: false - xy: 417, 356 + xy: 493, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper1 rotate: false - xy: 457, 331 + xy: 763, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper2 rotate: false - xy: 467, 341 + xy: 773, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper3 rotate: false - xy: 437, 301 + xy: 783, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 457, 301 + xy: 853, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 467, 311 + xy: 863, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirtedge rotate: false - xy: 377, 388 + xy: 966, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 generic-cliff-edge rotate: false - xy: 457, 291 + xy: 933, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge rotate: false - xy: 457, 291 + xy: 933, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-1 rotate: false - xy: 467, 291 + xy: 943, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-1 rotate: false - xy: 467, 291 + xy: 943, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-2 rotate: false - xy: 427, 281 + xy: 953, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-2 rotate: false - xy: 427, 281 + xy: 953, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-side rotate: false - xy: 437, 281 + xy: 963, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-side rotate: false - xy: 437, 281 + xy: 963, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge rotate: false - xy: 467, 281 + xy: 993, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-1 rotate: false - xy: 477, 359 + xy: 1003, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-2 rotate: false - xy: 487, 359 + xy: 1013, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-side rotate: false - xy: 477, 349 + xy: 357, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass2 rotate: false - xy: 447, 281 + xy: 973, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass3 rotate: false - xy: 457, 281 + xy: 983, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grassedge rotate: false - xy: 699, 345 + xy: 95, 2 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 ice2 rotate: false - xy: 487, 349 + xy: 351, 376 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice3 rotate: false - xy: 477, 329 + xy: 351, 366 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 iceedge rotate: false - xy: 727, 345 + xy: 345, 118 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 icerock2 rotate: false - xy: 487, 339 + xy: 351, 356 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow1 rotate: false - xy: 477, 319 + xy: 361, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow1 rotate: false - xy: 477, 319 + xy: 361, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow2 rotate: false - xy: 477, 309 + xy: 371, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow2 rotate: false - xy: 477, 309 + xy: 371, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lavaedge rotate: false - xy: 769, 345 + xy: 345, 76 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 lead1 rotate: false - xy: 497, 280 + xy: 352, 346 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead2 rotate: false - xy: 507, 290 + xy: 352, 336 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead3 rotate: false - xy: 507, 280 + xy: 352, 326 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor2 rotate: false - xy: 537, 335 + xy: 372, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor3 rotate: false - xy: 537, 325 + xy: 362, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor4 rotate: false - xy: 517, 305 + xy: 392, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor5 rotate: false - xy: 527, 315 + xy: 382, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor6 rotate: false - xy: 547, 345 + xy: 372, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalflooredge rotate: false - xy: 797, 349 + xy: 109, 2 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 rock2 rotate: false - xy: 687, 285 + xy: 471, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand2 rotate: false - xy: 697, 325 + xy: 481, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand3 rotate: false - xy: 707, 335 + xy: 491, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sandedge rotate: false - xy: 823, 373 + xy: 117, 49 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shrubshadow rotate: false - xy: 717, 315 + xy: 541, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow2 rotate: false - xy: 737, 335 + xy: 551, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow3 rotate: false - xy: 737, 325 + xy: 551, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snowedge rotate: false - xy: 811, 355 + xy: 145, 49 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 spaceedge rotate: false - xy: 825, 359 + xy: 159, 49 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 stone-cliff-edge rotate: false - xy: 757, 325 + xy: 611, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-1 rotate: false - xy: 717, 285 + xy: 621, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-2 rotate: false - xy: 727, 295 + xy: 621, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-side rotate: false - xy: 737, 305 + xy: 631, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone2 rotate: false - xy: 737, 315 + xy: 601, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone3 rotate: false - xy: 757, 335 + xy: 611, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stoneedge rotate: false - xy: 811, 341 + xy: 113, 35 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 taredge rotate: false - xy: 839, 345 + xy: 127, 35 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 737, 295 + xy: 651, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 747, 305 + xy: 661, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 757, 315 + xy: 661, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 777, 335 + xy: 671, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 787, 335 + xy: 671, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 777, 325 + xy: 681, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge rotate: false - xy: 797, 305 + xy: 781, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-1 rotate: false - xy: 787, 285 + xy: 791, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-2 rotate: false - xy: 797, 295 + xy: 791, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-side rotate: false - xy: 797, 285 + xy: 801, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 wateredge rotate: false - xy: 853, 387 + xy: 155, 21 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 block-border rotate: false - xy: 190, 188 + xy: 239, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-elevation rotate: false - xy: 200, 188 + xy: 259, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 200, 188 + xy: 259, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-middle rotate: false - xy: 397, 308 + xy: 443, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 397, 308 + xy: 443, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-slope rotate: false - xy: 397, 298 + xy: 453, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 border rotate: false - xy: 397, 288 + xy: 453, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 427, 361 + xy: 563, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-1 rotate: false - xy: 447, 311 + xy: 793, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-2 rotate: false - xy: 501, 396 + xy: 924, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cross-3 rotate: false - xy: 165, 206 + xy: 672, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 cross-4 rotate: false - xy: 652, 479 + xy: 644, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 nuclearreactor-shadow rotate: false - xy: 776, 451 + xy: 66, 199 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 667, 305 + xy: 983, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ripples rotate: false - xy: 1011, 381 + xy: 207, 17 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 699, 395 + xy: 243, 64 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 717, 413 + xy: 261, 82 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 699, 377 + xy: 261, 64 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 717, 395 + xy: 243, 46 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 155, 178 + xy: 480, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 155, 178 + xy: 480, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shadow-1 rotate: false - xy: 866, 367 + xy: 207, 5 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-2 rotate: false - xy: 299, 248 + xy: 716, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-3 rotate: false - xy: 804, 451 + xy: 112, 135 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 shadow-4 rotate: false - xy: 290, 454 + xy: 334, 477 size: 34, 34 orig: 34, 34 offset: 0, 0 index: -1 shadow-5 rotate: false - xy: 143, 266 + xy: 290, 469 size: 42, 42 orig: 42, 42 offset: 0, 0 index: -1 shadow-6 rotate: false - xy: 1, 165 + xy: 204, 414 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 shadow-corner rotate: false - xy: 854, 363 + xy: 217, 43 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-1 rotate: false - xy: 853, 351 + xy: 217, 31 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-2 rotate: false - xy: 299, 228 + xy: 736, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-round-3 rotate: false - xy: 832, 451 + xy: 141, 165 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 shadow-round-4 rotate: false - xy: 87, 228 + xy: 370, 477 size: 34, 34 orig: 34, 34 offset: 0, 0 index: -1 shadow-rounded-2 rotate: false - xy: 299, 208 + xy: 756, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-shock-mine rotate: false - xy: 697, 295 + xy: 531, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 345, 276 + xy: 463, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 345, 276 + xy: 463, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 407, 376 + xy: 463, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 417, 376 + xy: 473, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 407, 316 + xy: 523, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 417, 326 + xy: 523, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 407, 306 + xy: 533, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 417, 316 + xy: 533, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 407, 296 + xy: 543, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 417, 306 + xy: 543, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 417, 296 + xy: 553, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 427, 371 + xy: 553, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 437, 371 + xy: 563, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 427, 351 + xy: 573, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 437, 361 + xy: 573, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 447, 371 + xy: 583, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 427, 341 + xy: 583, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 437, 351 + xy: 593, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 447, 361 + xy: 593, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 527, 325 + xy: 372, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 517, 315 + xy: 362, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 537, 345 + xy: 382, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 152, 124 + xy: 880, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 168, 98 + xy: 906, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 168, 72 + xy: 932, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 667, 315 + xy: 923, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 687, 345 + xy: 933, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 687, 335 + xy: 943, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 677, 315 + xy: 993, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 657, 285 + xy: 1003, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 667, 295 + xy: 1013, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 677, 305 + xy: 441, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 687, 315 + xy: 441, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 667, 285 + xy: 451, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 677, 295 + xy: 451, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 alpha-mech-pad rotate: false - xy: 123, 1 + xy: 814, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-alpha-mech-pad rotate: false - xy: 123, 1 + xy: 814, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 battery rotate: false - xy: 212, 105 + xy: 81, 2 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-battery rotate: false - xy: 212, 105 + xy: 81, 2 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 battery-large rotate: false - xy: 53, 1 + xy: 178, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-battery-large rotate: false - xy: 53, 1 + xy: 178, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fusion-reactor rotate: false - xy: 720, 479 + xy: 712, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-bottom rotate: false - xy: 754, 479 + xy: 746, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-light rotate: false - xy: 788, 479 + xy: 780, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-0 rotate: false - xy: 822, 479 + xy: 814, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-1 rotate: false - xy: 856, 479 + xy: 848, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-2 rotate: false - xy: 890, 479 + xy: 882, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-3 rotate: false - xy: 924, 479 + xy: 916, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-top rotate: false - xy: 958, 479 + xy: 950, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 697, 335 + xy: 481, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 158, 152 + xy: 506, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 289, 360 + xy: 532, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 753, 377 + xy: 297, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -alloy-fuser - rotate: false - xy: 213, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 alloy-smelter rotate: false - xy: 90, 28 + xy: 332, 433 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-alloy-smelter rotate: false - xy: 90, 28 + xy: 332, 433 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 105, 1 + xy: 796, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 arc-smelter rotate: false - xy: 141, 1 + xy: 832, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-arc-smelter rotate: false - xy: 141, 1 + xy: 832, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 arc-smelter-top rotate: false - xy: 159, 1 + xy: 850, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 159, 1 + xy: 850, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor rotate: false - xy: 177, 1 + xy: 868, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame0 rotate: false - xy: 319, 250 + xy: 886, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame1 rotate: false - xy: 319, 232 + xy: 904, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame2 rotate: false - xy: 319, 214 + xy: 922, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-liquid rotate: false - xy: 315, 368 + xy: 940, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-top rotate: false - xy: 315, 350 + xy: 958, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 315, 332 + xy: 976, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-blast-mixer rotate: false - xy: 315, 332 + xy: 976, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 centrifuge-liquid rotate: false - xy: 483, 387 + xy: 888, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 501, 378 + xy: 942, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 483, 369 + xy: 960, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 501, 360 + xy: 978, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator rotate: false - xy: 528, 427 + xy: 996, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 546, 427 + xy: 112, 117 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 564, 427 + xy: 117, 99 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 lavasmelter rotate: false - xy: 507, 300 + xy: 431, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 oilrefinery rotate: false - xy: 537, 315 + xy: 372, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 627, 355 + xy: 241, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 645, 355 + xy: 259, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 663, 355 + xy: 241, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 681, 409 + xy: 225, 95 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 687, 305 + xy: 461, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 677, 285 + xy: 461, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 727, 325 + xy: 531, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 core-open rotate: false - xy: 116, 46 + xy: 620, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core-top rotate: false - xy: 139, 204 + xy: 646, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sortedunloader rotate: false - xy: 747, 335 + xy: 581, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1 rotate: false - xy: 201, 198 + xy: 239, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1-top rotate: false - xy: 211, 198 + xy: 249, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-2 rotate: false - xy: 315, 314 + xy: 994, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-2-top rotate: false - xy: 319, 196 + xy: 325, 388 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-3 rotate: false - xy: 938, 453 + xy: 311, 406 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-3-top rotate: false - xy: 964, 453 + xy: 289, 356 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-4 rotate: false - xy: 326, 456 + xy: 406, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-4-top rotate: false - xy: 360, 456 + xy: 440, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc rotate: false - xy: 77, 207 + xy: 1010, 454 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 212, 115 + xy: 71, 2 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cyclone rotate: false - xy: 191, 208 + xy: 698, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 duo rotate: false - xy: 447, 291 + xy: 923, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 fuse rotate: false - xy: 142, 46 + xy: 828, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hail rotate: false - xy: 477, 339 + xy: 357, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 516, 433 + xy: 141, 153 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 lancer rotate: false - xy: 627, 373 + xy: 225, 183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 645, 391 + xy: 207, 177 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 meltdown rotate: false - xy: 428, 453 + xy: 984, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 462, 453 + xy: 56, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 247, 216 + xy: 428, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 273, 216 + xy: 454, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salvo rotate: false - xy: 735, 413 + xy: 261, 46 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 699, 359 + xy: 279, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 717, 377 + xy: 279, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 735, 395 + xy: 279, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 scatter rotate: false - xy: 697, 305 + xy: 511, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch rotate: false - xy: 707, 315 + xy: 521, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch-shoot rotate: false - xy: 727, 335 + xy: 521, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spectre rotate: false - xy: 652, 445 + xy: 77, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 735, 377 + xy: 277, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wave rotate: false - xy: 789, 397 + xy: 315, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 807, 415 + xy: 315, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 582, 427 + xy: 130, 117 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory-top-open rotate: false - xy: 600, 427 + xy: 135, 99 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 108, 20 + xy: 750, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 142, 98 + xy: 776, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 142, 98 + xy: 776, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 142, 98 + xy: 776, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-top-open rotate: false - xy: 142, 72 + xy: 802, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-top-open rotate: false - xy: 142, 72 + xy: 802, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-top-open rotate: false - xy: 142, 72 + xy: 802, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 134, 20 + xy: 854, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 591, 355 + xy: 261, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phantom-factory-top-open rotate: false - xy: 609, 355 + xy: 223, 129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 reconstructor-open rotate: false - xy: 699, 413 + xy: 225, 59 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 repair-point-turret rotate: false - xy: 687, 295 + xy: 471, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 revenant-factory rotate: false - xy: 56, 27 + xy: 66, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-top rotate: false - xy: 516, 445 + xy: 100, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-top-open rotate: false - xy: 550, 445 + xy: 134, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spirit-factory-top rotate: false - xy: 753, 413 + xy: 279, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 spirit-factory-top-open rotate: false - xy: 717, 359 + xy: 279, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 289, 334 + xy: 558, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 789, 379 + xy: 279, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wraith-factory-top-open rotate: false - xy: 807, 397 + xy: 279, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 deflector-wall rotate: false - xy: 467, 321 + xy: 843, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deflector-wall-large rotate: false - xy: 618, 427 + xy: 117, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 636, 427 + xy: 135, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-open rotate: false - xy: 437, 291 + xy: 913, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 beam rotate: false - xy: 1022, 499 + xy: 1018, 499 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 beam-end rotate: false - xy: 496, 467 + xy: 285, 382 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 blank rotate: false - xy: 53, 27 + xy: 256, 417 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 bullet rotate: false - xy: 501, 432 + xy: 82, 114 size: 13, 13 orig: 13, 13 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 307, 181 + xy: 1010, 464 size: 13, 13 orig: 13, 13 offset: 0, 0 index: -1 casing rotate: false - xy: 243, 228 + xy: 329, 146 size: 2, 4 orig: 2, 4 offset: 0, 0 index: -1 clear rotate: false - xy: 428, 487 + xy: 256, 414 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 command-attack rotate: false - xy: 407, 336 + xy: 503, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-idle rotate: false - xy: 417, 346 + xy: 503, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-patrol rotate: false - xy: 407, 326 + xy: 513, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-retreat rotate: false - xy: 417, 336 + xy: 513, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 enemyarrow rotate: false - xy: 853, 331 + xy: 289, 1 size: 8, 7 orig: 8, 7 offset: 0, 0 index: -1 error rotate: false - xy: 391, 388 + xy: 980, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 laser rotate: false - xy: 1022, 485 + xy: 111, 56 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 laser-end rotate: false - xy: 80, 130 + xy: 656, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 laserfull rotate: false - xy: 293, 288 + xy: 676, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 minelaser rotate: false - xy: 851, 373 + xy: 114, 56 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 291, 268 + xy: 696, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 missile rotate: false - xy: 853, 340 + xy: 27, 1 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 missile-back rotate: false - xy: 866, 356 + xy: 38, 1 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1016, 452 + xy: 337, 406 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 186, 19 + xy: 90, 87 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 181, 179 + xy: 162, 200 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 280, 354 + xy: 99, 88 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 280, 327 + xy: 108, 88 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 shell rotate: false - xy: 865, 345 + xy: 49, 1 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 shell-back rotate: false - xy: 864, 334 + xy: 60, 1 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 shot rotate: false - xy: 707, 305 + xy: 541, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 transfer rotate: false - xy: 204, 314 + xy: 187, 49 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 787, 295 + xy: 781, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 311, 268 + xy: 776, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 blackstone-cliff-edge rotate: false - xy: 213, 45 + xy: 229, 39 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-1 rotate: false - xy: 213, 35 + xy: 229, 29 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-2 rotate: false - xy: 213, 25 + xy: 229, 19 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-side rotate: false - xy: 191, 198 + xy: 229, 9 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-arc rotate: false - xy: 210, 188 + xy: 239, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-biomattercompressor rotate: false - xy: 315, 296 + xy: 346, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-blast-drill rotate: false - xy: 990, 453 + xy: 290, 330 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-bridge-conduit rotate: false - xy: 347, 376 + xy: 249, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 347, 376 + xy: 249, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-bridge-conveyor rotate: false - xy: 347, 366 + xy: 269, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 347, 366 + xy: 269, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-centrifuge rotate: false - xy: 184, 161 + xy: 364, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 centrifuge rotate: false - xy: 184, 161 + xy: 364, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-combustion-generator rotate: false - xy: 347, 356 + xy: 249, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 347, 356 + xy: 249, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-command-center rotate: false - xy: 184, 143 + xy: 382, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 command-center rotate: false - xy: 184, 143 + xy: 382, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-conduit rotate: false - xy: 347, 346 + xy: 259, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-container rotate: false - xy: 178, 125 + xy: 400, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 container rotate: false - xy: 178, 125 + xy: 400, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-conveyor rotate: false - xy: 347, 336 + xy: 279, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 347, 336 + xy: 279, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall rotate: false - xy: 347, 326 + xy: 259, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 347, 326 + xy: 259, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall-large rotate: false - xy: 196, 125 + xy: 418, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 196, 125 + xy: 418, 407 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-core rotate: false - xy: 239, 268 + xy: 290, 304 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core rotate: false - xy: 239, 268 + xy: 290, 304 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-cryofluidmixer rotate: false - xy: 194, 107 + xy: 436, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-cultivator rotate: false - xy: 194, 89 + xy: 454, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-cyclone rotate: false - xy: 247, 242 + xy: 290, 278 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-dagger-factory rotate: false - xy: 194, 71 + xy: 472, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dart-ship-pad rotate: false - xy: 194, 53 + xy: 490, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dart-ship-pad rotate: false - xy: 194, 53 + xy: 490, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-deepwater rotate: false - xy: 347, 316 + xy: 269, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater rotate: false - xy: 347, 316 + xy: 269, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-delta-mech-pad rotate: false - xy: 195, 35 + xy: 508, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 195, 35 + xy: 508, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dense-alloy-wall rotate: false - xy: 347, 306 + xy: 269, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dense-alloy-wall rotate: false - xy: 347, 306 + xy: 269, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-dense-alloy-wall-large rotate: false - xy: 195, 17 + xy: 526, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dense-alloy-wall-large rotate: false - xy: 195, 17 + xy: 526, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dirt rotate: false - xy: 347, 296 + xy: 279, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt1 rotate: false - xy: 347, 296 + xy: 279, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-distributor rotate: false - xy: 321, 436 + xy: 544, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 distributor rotate: false - xy: 321, 436 + xy: 544, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-door rotate: false - xy: 357, 378 + xy: 279, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 door rotate: false - xy: 357, 378 + xy: 279, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-door-large rotate: false - xy: 321, 418 + xy: 562, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-large rotate: false - xy: 321, 418 + xy: 562, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-duo rotate: false - xy: 357, 368 + xy: 239, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-force-projector rotate: false - xy: 295, 386 + xy: 315, 356 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 force-projector rotate: false - xy: 295, 386 + xy: 315, 356 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fortress-factory rotate: false - xy: 87, 202 + xy: 316, 330 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fuse rotate: false - xy: 77, 176 + xy: 316, 304 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fusion-reactor rotate: false - xy: 394, 456 + xy: 474, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-ghoul-factory rotate: false - xy: 80, 150 + xy: 316, 278 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-glaive-ship-pad rotate: false - xy: 103, 176 + xy: 334, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 glaive-ship-pad rotate: false - xy: 103, 176 + xy: 334, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-grass rotate: false - xy: 367, 378 + xy: 249, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass1 rotate: false - xy: 367, 378 + xy: 249, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-hail rotate: false - xy: 357, 358 + xy: 259, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-ice rotate: false - xy: 367, 368 + xy: 269, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice1 rotate: false - xy: 367, 368 + xy: 269, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-icerock rotate: false - xy: 377, 378 + xy: 279, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerock1 rotate: false - xy: 377, 378 + xy: 279, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-incinerator rotate: false - xy: 357, 348 + xy: 289, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 incinerator rotate: false - xy: 357, 348 + xy: 289, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemsource rotate: false - xy: 367, 358 + xy: 299, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemsource rotate: false - xy: 367, 358 + xy: 299, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemvoid rotate: false - xy: 377, 368 + xy: 289, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemvoid rotate: false - xy: 377, 368 + xy: 289, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-javelin-ship-pad rotate: false - xy: 321, 400 + xy: 580, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 javelin-ship-pad rotate: false - xy: 321, 400 + xy: 580, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-junction rotate: false - xy: 387, 378 + xy: 309, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 junction rotate: false - xy: 387, 378 + xy: 309, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-lancer rotate: false - xy: 339, 438 + xy: 598, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-laser-drill rotate: false - xy: 357, 438 + xy: 616, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-lava rotate: false - xy: 357, 338 + xy: 289, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava rotate: false - xy: 357, 338 + xy: 289, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-junction rotate: false - xy: 367, 348 + xy: 299, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 367, 348 + xy: 299, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-router rotate: false - xy: 377, 358 + xy: 299, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-tank rotate: false - xy: 113, 202 + xy: 360, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-liquidsource rotate: false - xy: 387, 368 + xy: 309, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidsource rotate: false - xy: 387, 368 + xy: 309, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-mass-driver rotate: false - xy: 106, 150 + xy: 386, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 106, 150 + xy: 386, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-mechanical-drill rotate: false - xy: 339, 420 + xy: 168, 243 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-mechanical-pump rotate: false - xy: 357, 328 + xy: 309, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 357, 328 + xy: 309, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-meltdown rotate: false - xy: 516, 479 + xy: 508, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-melter rotate: false - xy: 367, 338 + xy: 343, 396 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 melter rotate: false - xy: 367, 338 + xy: 343, 396 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-mend-projector rotate: false - xy: 375, 438 + xy: 171, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 375, 438 + xy: 171, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-metalfloor rotate: false - xy: 377, 348 + xy: 353, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor1 rotate: false - xy: 377, 348 + xy: 353, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-oil-extractor rotate: false - xy: 100, 124 + xy: 412, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-omega-mech-pad rotate: false - xy: 90, 98 + xy: 438, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 omega-mech-pad rotate: false - xy: 90, 98 + xy: 438, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-overdrive-projector rotate: false - xy: 339, 402 + xy: 180, 266 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 339, 402 + xy: 180, 266 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-overflow-gate rotate: false - xy: 387, 358 + xy: 363, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 387, 358 + xy: 363, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phantom-factory rotate: false - xy: 357, 420 + xy: 198, 265 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-phase-conduit rotate: false - xy: 357, 318 + xy: 373, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 357, 318 + xy: 373, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-conveyor rotate: false - xy: 367, 328 + xy: 383, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 367, 328 + xy: 383, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall rotate: false - xy: 377, 338 + xy: 393, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 377, 338 + xy: 393, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall-large rotate: false - xy: 393, 438 + xy: 171, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 393, 438 + xy: 171, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-phase-weaver rotate: false - xy: 357, 402 + xy: 169, 173 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-plasma-drill rotate: false - xy: 550, 479 + xy: 542, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-plastanium-compressor rotate: false - xy: 375, 420 + xy: 230, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 375, 420 + xy: 230, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-pneumatic-drill rotate: false - xy: 375, 402 + xy: 248, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-power-node rotate: false - xy: 387, 348 + xy: 403, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 power-node rotate: false - xy: 387, 348 + xy: 403, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-power-node-large rotate: false - xy: 393, 420 + xy: 266, 262 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 393, 420 + xy: 266, 262 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-powerinfinite rotate: false - xy: 357, 308 + xy: 413, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powerinfinite rotate: false - xy: 357, 308 + xy: 413, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-powervoid rotate: false - xy: 367, 318 + xy: 423, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powervoid rotate: false - xy: 367, 318 + xy: 423, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulse-conduit rotate: false - xy: 377, 328 + xy: 343, 386 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulverizer rotate: false - xy: 387, 338 + xy: 353, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pyratite-mixer rotate: false - xy: 393, 402 + xy: 284, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 393, 402 + xy: 284, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-reconstructor rotate: false - xy: 411, 422 + xy: 302, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 411, 422 + xy: 302, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 411, 422 + xy: 302, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 reconstructor rotate: false - xy: 411, 422 + xy: 302, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 411, 422 + xy: 302, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 411, 422 + xy: 302, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-repair-point rotate: false - xy: 357, 298 + xy: 363, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 repair-point rotate: false - xy: 357, 298 + xy: 363, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-revenant-factory rotate: false - xy: 584, 479 + xy: 576, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-ripple rotate: false - xy: 90, 72 + xy: 464, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-rock rotate: false - xy: 367, 308 + xy: 373, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rock1 rotate: false - xy: 367, 308 + xy: 373, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-rotary-pump rotate: false - xy: 411, 404 + xy: 320, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 411, 404 + xy: 320, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-router rotate: false - xy: 377, 318 + xy: 383, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 router rotate: false - xy: 377, 318 + xy: 383, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-rtg-generator rotate: false - xy: 429, 435 + xy: 169, 155 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 429, 435 + xy: 169, 155 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-salvo rotate: false - xy: 429, 417 + xy: 636, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-sand rotate: false - xy: 387, 328 + xy: 393, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand1 rotate: false - xy: 387, 328 + xy: 393, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-scorch rotate: false - xy: 367, 298 + xy: 403, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-separator rotate: false - xy: 377, 308 + xy: 413, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator rotate: false - xy: 377, 308 + xy: 413, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shock-mine rotate: false - xy: 387, 318 + xy: 423, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 387, 318 + xy: 423, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shrub rotate: false - xy: 377, 298 + xy: 341, 376 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shrub rotate: false - xy: 377, 298 + xy: 341, 376 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-silicon-smelter rotate: false - xy: 447, 435 + xy: 654, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 447, 435 + xy: 654, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-smelter rotate: false - xy: 387, 308 + xy: 341, 366 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 smelter rotate: false - xy: 387, 308 + xy: 341, 366 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-snow rotate: false - xy: 387, 298 + xy: 341, 356 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow1 rotate: false - xy: 387, 298 + xy: 341, 356 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel rotate: false - xy: 347, 286 + xy: 342, 346 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 347, 286 + xy: 342, 346 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel-large rotate: false - xy: 90, 46 + xy: 490, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 90, 46 + xy: 490, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-solidifer rotate: false - xy: 357, 288 + xy: 342, 336 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solidifer rotate: false - xy: 357, 288 + xy: 342, 336 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-sorter rotate: false - xy: 367, 288 + xy: 342, 326 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sorter rotate: false - xy: 367, 288 + xy: 342, 326 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-space rotate: false - xy: 377, 288 + xy: 342, 316 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space rotate: false - xy: 377, 288 + xy: 342, 316 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spawn rotate: false - xy: 387, 288 + xy: 342, 306 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spawn rotate: false - xy: 387, 288 + xy: 342, 306 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spectre rotate: false - xy: 618, 479 + xy: 610, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-spirit-factory rotate: false - xy: 447, 417 + xy: 672, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-stone rotate: false - xy: 397, 378 + xy: 342, 296 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone1 rotate: false - xy: 397, 378 + xy: 342, 296 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall rotate: false - xy: 397, 368 + xy: 342, 286 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 397, 368 + xy: 342, 286 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall-large rotate: false - xy: 465, 435 + xy: 690, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 465, 435 + xy: 690, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-swarmer rotate: false - xy: 465, 417 + xy: 708, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-tar rotate: false - xy: 397, 358 + xy: 1014, 432 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar rotate: false - xy: 397, 358 + xy: 1014, 432 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-tau-mech-pad rotate: false - xy: 429, 399 + xy: 726, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 tau-mech-pad rotate: false - xy: 429, 399 + xy: 726, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thermal-generator rotate: false - xy: 447, 399 + xy: 744, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 447, 399 + xy: 744, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thermal-pump rotate: false - xy: 465, 399 + xy: 762, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 465, 399 + xy: 762, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thorium-reactor rotate: false - xy: 129, 176 + xy: 516, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 129, 176 + xy: 516, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-thorium-wall rotate: false - xy: 397, 348 + xy: 1014, 422 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 397, 348 + xy: 1014, 422 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-thorium-wall-large rotate: false - xy: 411, 386 + xy: 780, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 411, 386 + xy: 780, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-titan-factory rotate: false - xy: 132, 150 + xy: 542, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-titanium-conveyor rotate: false - xy: 397, 338 + xy: 433, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 397, 338 + xy: 433, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-trident-ship-pad rotate: false - xy: 429, 381 + xy: 798, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 429, 381 + xy: 798, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-turbine-generator rotate: false - xy: 447, 381 + xy: 816, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 447, 381 + xy: 816, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-unloader rotate: false - xy: 397, 328 + xy: 433, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unloader rotate: false - xy: 397, 328 + xy: 433, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-vault rotate: false - xy: 126, 124 + xy: 568, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 vault rotate: false - xy: 126, 124 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icon-warp-gate - rotate: false - xy: 116, 98 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -warp-gate - rotate: false - xy: 116, 98 + xy: 568, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-water rotate: false - xy: 397, 318 + xy: 443, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water rotate: false - xy: 397, 318 + xy: 443, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-water-extractor rotate: false - xy: 465, 381 + xy: 834, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-wave rotate: false - xy: 483, 423 + xy: 852, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-wraith-factory rotate: false - xy: 483, 405 + xy: 870, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 deepwater-cliff-edge rotate: false - xy: 457, 321 + xy: 803, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-1 rotate: false - xy: 467, 331 + xy: 813, 391 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-2 rotate: false - xy: 447, 301 + xy: 823, 391 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-side rotate: false - xy: 457, 311 + xy: 833, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge rotate: false - xy: 467, 301 + xy: 873, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-1 rotate: false - xy: 407, 286 + xy: 883, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-2 rotate: false - xy: 417, 286 + xy: 893, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-side rotate: false - xy: 427, 291 + xy: 903, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge rotate: false - xy: 507, 320 + xy: 421, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-1 rotate: false - xy: 497, 300 + xy: 411, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-2 rotate: false - xy: 507, 310 + xy: 431, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-side rotate: false - xy: 497, 290 + xy: 421, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-cryofluid rotate: false - xy: 517, 335 + xy: 352, 306 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-lava rotate: false - xy: 517, 325 + xy: 352, 296 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-oil rotate: false - xy: 527, 345 + xy: 352, 286 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-water rotate: false - xy: 527, 335 + xy: 362, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mech-icon-alpha-mech rotate: false - xy: 783, 345 + xy: 345, 62 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-dart-ship rotate: false - xy: 825, 387 + xy: 345, 48 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-delta-mech rotate: false - xy: 839, 387 + xy: 343, 34 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-omega-mech rotate: false - xy: 243, 200 + xy: 311, 40 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-tau-mech rotate: false - xy: 259, 200 + xy: 329, 130 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-trident-ship rotate: false - xy: 275, 200 + xy: 329, 114 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 275, 200 + xy: 329, 114 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 metalfloor-cliff-edge rotate: false - xy: 547, 335 + xy: 362, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-1 rotate: false - xy: 547, 325 + xy: 402, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-2 rotate: false - xy: 517, 295 + xy: 392, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-side rotate: false - xy: 527, 305 + xy: 382, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone1 rotate: false - xy: 557, 345 + xy: 362, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone2 rotate: false - xy: 557, 335 + xy: 412, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone3 rotate: false - xy: 557, 325 + xy: 402, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass1 rotate: false - xy: 517, 285 + xy: 392, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass2 rotate: false - xy: 527, 295 + xy: 382, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass3 rotate: false - xy: 537, 305 + xy: 372, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice1 rotate: false - xy: 547, 315 + xy: 362, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice2 rotate: false - xy: 567, 345 + xy: 422, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice3 rotate: false - xy: 567, 335 + xy: 412, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 567, 325 + xy: 402, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 527, 285 + xy: 392, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 537, 295 + xy: 382, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow1 rotate: false - xy: 547, 305 + xy: 372, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow2 rotate: false - xy: 557, 315 + xy: 362, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow3 rotate: false - xy: 577, 345 + xy: 422, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 577, 335 + xy: 412, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 577, 325 + xy: 402, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 537, 285 + xy: 392, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone1 rotate: false - xy: 547, 295 + xy: 382, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone2 rotate: false - xy: 557, 305 + xy: 372, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone3 rotate: false - xy: 567, 315 + xy: 422, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass1 rotate: false - xy: 587, 345 + xy: 412, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass2 rotate: false - xy: 587, 335 + xy: 402, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass3 rotate: false - xy: 587, 325 + xy: 392, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice1 rotate: false - xy: 547, 285 + xy: 382, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice2 rotate: false - xy: 557, 295 + xy: 422, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice3 rotate: false - xy: 567, 305 + xy: 412, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand1 rotate: false - xy: 577, 315 + xy: 402, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand2 rotate: false - xy: 597, 345 + xy: 392, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand3 rotate: false - xy: 597, 335 + xy: 422, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow1 rotate: false - xy: 597, 325 + xy: 412, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow2 rotate: false - xy: 557, 285 + xy: 402, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow3 rotate: false - xy: 567, 295 + xy: 422, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone1 rotate: false - xy: 577, 305 + xy: 412, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone2 rotate: false - xy: 587, 315 + xy: 422, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone3 rotate: false - xy: 607, 345 + xy: 432, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone1 rotate: false - xy: 607, 335 + xy: 432, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone2 rotate: false - xy: 607, 325 + xy: 432, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone3 rotate: false - xy: 567, 285 + xy: 432, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass1 rotate: false - xy: 577, 295 + xy: 432, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass2 rotate: false - xy: 587, 305 + xy: 432, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass3 rotate: false - xy: 597, 315 + xy: 432, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice1 rotate: false - xy: 617, 345 + xy: 443, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice2 rotate: false - xy: 617, 335 + xy: 453, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice3 rotate: false - xy: 617, 325 + xy: 463, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 577, 285 + xy: 473, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 587, 295 + xy: 483, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 597, 305 + xy: 493, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow1 rotate: false - xy: 607, 315 + xy: 503, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow2 rotate: false - xy: 627, 345 + xy: 513, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow3 rotate: false - xy: 627, 335 + xy: 523, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 627, 325 + xy: 533, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 587, 285 + xy: 543, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 597, 295 + xy: 553, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone1 rotate: false - xy: 607, 305 + xy: 563, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone2 rotate: false - xy: 617, 315 + xy: 573, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone3 rotate: false - xy: 637, 345 + xy: 583, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass1 rotate: false - xy: 637, 335 + xy: 593, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass2 rotate: false - xy: 637, 325 + xy: 603, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass3 rotate: false - xy: 597, 285 + xy: 613, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice1 rotate: false - xy: 607, 295 + xy: 623, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice2 rotate: false - xy: 617, 305 + xy: 633, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice3 rotate: false - xy: 627, 315 + xy: 643, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 647, 345 + xy: 653, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 647, 335 + xy: 663, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 647, 325 + xy: 673, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow1 rotate: false - xy: 607, 285 + xy: 683, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow2 rotate: false - xy: 617, 295 + xy: 693, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow3 rotate: false - xy: 627, 305 + xy: 703, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 637, 315 + xy: 713, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 657, 345 + xy: 723, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 657, 335 + xy: 733, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone1 rotate: false - xy: 657, 325 + xy: 743, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone2 rotate: false - xy: 617, 285 + xy: 753, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone3 rotate: false - xy: 627, 295 + xy: 763, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass1 rotate: false - xy: 637, 305 + xy: 773, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass2 rotate: false - xy: 647, 315 + xy: 783, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass3 rotate: false - xy: 667, 345 + xy: 793, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice1 rotate: false - xy: 667, 335 + xy: 803, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice2 rotate: false - xy: 667, 325 + xy: 813, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice3 rotate: false - xy: 627, 285 + xy: 823, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 637, 295 + xy: 833, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 647, 305 + xy: 843, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 657, 315 + xy: 853, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow1 rotate: false - xy: 677, 345 + xy: 863, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow2 rotate: false - xy: 677, 335 + xy: 873, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow3 rotate: false - xy: 677, 325 + xy: 883, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 637, 285 + xy: 893, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 647, 295 + xy: 903, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 657, 305 + xy: 913, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge rotate: false - xy: 707, 325 + xy: 491, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-1 rotate: false - xy: 697, 315 + xy: 501, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-2 rotate: false - xy: 717, 335 + xy: 501, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-side rotate: false - xy: 717, 325 + xy: 511, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge rotate: false - xy: 697, 285 + xy: 561, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-1 rotate: false - xy: 707, 295 + xy: 561, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-2 rotate: false - xy: 717, 305 + xy: 571, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-side rotate: false - xy: 727, 315 + xy: 571, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge rotate: false - xy: 747, 325 + xy: 581, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-1 rotate: false - xy: 707, 285 + xy: 591, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-2 rotate: false - xy: 717, 295 + xy: 591, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-side rotate: false - xy: 727, 305 + xy: 601, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge rotate: false - xy: 747, 315 + xy: 631, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-1 rotate: false - xy: 767, 335 + xy: 641, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-2 rotate: false - xy: 767, 325 + xy: 641, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-side rotate: false - xy: 727, 285 + xy: 651, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unit-icon-dagger rotate: false - xy: 825, 331 + xy: 141, 21 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-fortress rotate: false - xy: 753, 359 + xy: 315, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-icon-titan rotate: false - xy: 771, 413 + xy: 297, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-icon-wraith rotate: false - xy: 839, 331 + xy: 155, 35 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 wraith rotate: false - xy: 839, 331 + xy: 155, 35 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 item-biomatter rotate: false - xy: 487, 319 + xy: 371, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 487, 309 + xy: 361, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-coal rotate: false - xy: 477, 289 + xy: 391, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-copper rotate: false - xy: 487, 299 + xy: 381, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-dense-alloy rotate: false - xy: 487, 289 + xy: 371, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-lead rotate: false - xy: 477, 279 + xy: 401, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 487, 279 + xy: 391, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 497, 350 + xy: 381, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 507, 350 + xy: 411, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-sand rotate: false - xy: 497, 340 + xy: 401, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 497, 330 + xy: 391, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-stone rotate: false - xy: 507, 340 + xy: 421, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 497, 320 + xy: 411, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 507, 330 + xy: 401, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 497, 310 + xy: 431, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon rotate: false - xy: 517, 345 + xy: 352, 316 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 321, 386 + xy: 166, 261 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 322, 182 + xy: 216, 269 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 243, 170 + xy: 216, 255 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech rotate: false - xy: 333, 302 + xy: 924, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech-base rotate: false - xy: 349, 388 + xy: 938, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech-leg rotate: false - xy: 363, 388 + xy: 952, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 omega-mech rotate: false - xy: 227, 192 + xy: 329, 98 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-armor rotate: false - xy: 243, 184 + xy: 329, 82 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-base rotate: false - xy: 259, 184 + xy: 329, 66 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-leg rotate: false - xy: 275, 184 + xy: 329, 50 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 tau-mech rotate: false - xy: 291, 176 + xy: 810, 401 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 tau-mech-base rotate: false - xy: 797, 335 + xy: 127, 21 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 811, 327 + xy: 141, 35 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dart-ship rotate: false - xy: 333, 316 + xy: 910, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 glaive-ship rotate: false - xy: 247, 294 + xy: 168, 227 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-glaive-ship rotate: false - xy: 247, 294 + xy: 168, 227 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 javelin-ship rotate: false - xy: 741, 345 + xy: 345, 104 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-javelin-ship rotate: false - xy: 741, 345 + xy: 345, 104 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 755, 345 + xy: 345, 90 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -5284,14 +5270,14 @@ circle index: -1 shape-3 rotate: false - xy: 204, 378 + xy: 1, 198 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 border rotate: false - xy: 30, 77 + xy: 204, 309 size: 24, 40 split: 5, 5, 5, 10 orig: 24, 40 @@ -5299,7 +5285,7 @@ border index: -1 button rotate: false - xy: 187, 268 + xy: 30, 106 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -5307,7 +5293,7 @@ button index: -1 textarea rotate: false - xy: 187, 268 + xy: 30, 106 size: 24, 40 split: 10, 10, 9, 11 orig: 24, 40 @@ -5315,7 +5301,7 @@ textarea index: -1 button-down rotate: false - xy: 269, 401 + xy: 233, 372 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -5323,7 +5309,7 @@ button-down index: -1 button-over rotate: false - xy: 269, 401 + xy: 233, 372 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -5331,7 +5317,7 @@ button-over index: -1 button-select rotate: false - xy: 116, 72 + xy: 594, 453 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -5339,826 +5325,854 @@ button-select index: -1 check-off rotate: false - xy: 992, 479 + xy: 230, 312 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 123, 230 + xy: 230, 278 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 187, 234 + xy: 260, 314 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 217, 234 + xy: 260, 280 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 483, 441 + xy: 166, 275 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 cursor rotate: false - xy: 495, 441 + xy: 325, 382 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 discord-banner rotate: false - xy: 204, 443 + xy: 1, 263 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 empty-sector rotate: false - xy: 686, 479 + xy: 678, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -controller-cursor - rotate: false - xy: 501, 414 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-about - rotate: false - xy: 263, 294 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-add - rotate: false - xy: 195, 1 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-admin - rotate: false - xy: 211, 1 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-admin-small - rotate: false - xy: 313, 288 - size: 6, 6 - orig: 6, 6 - offset: 0, 0 - index: -1 -icon-areaDelete - rotate: false - xy: 1012, 440 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow - rotate: false - xy: 708, 431 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-16 - rotate: false - xy: 708, 431 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-down - rotate: false - xy: 307, 196 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow-left - rotate: false - xy: 811, 369 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow-right - rotate: false - xy: 854, 375 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow-up - rotate: false - xy: 825, 319 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-back - rotate: false - xy: 726, 431 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-ban - rotate: false - xy: 411, 440 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-break - rotate: false - xy: 744, 431 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cancel - rotate: false - xy: 762, 431 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-chat - rotate: false - xy: 837, 319 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-check - rotate: false - xy: 780, 433 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 icon-crafting rotate: false - xy: 867, 391 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-cursor - rotate: false - xy: 879, 393 - size: 10, 10 - orig: 10, 10 + xy: 153, 81 + size: 16, 16 + orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 891, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-dev-builds - rotate: false - xy: 825, 417 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-discord - rotate: false - xy: 789, 363 - size: 14, 14 - orig: 14, 14 + xy: 153, 63 + size: 16, 16 + orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 903, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-donate - rotate: false - xy: 807, 381 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-dots - rotate: false - xy: 825, 401 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-editor - rotate: false - xy: 841, 417 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-egg - rotate: false - xy: 841, 401 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-elevation - rotate: false - xy: 798, 433 + xy: 171, 99 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-eraser +icon-effect rotate: false - xy: 816, 433 + xy: 171, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-exit - rotate: false - xy: 852, 435 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-file - rotate: false - xy: 834, 433 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-image - rotate: false - xy: 519, 409 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-text - rotate: false - xy: 868, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-fill - rotate: false - xy: 519, 391 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy - rotate: false - xy: 884, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 537, 409 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder - rotate: false - xy: 900, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-folder-parent - rotate: false - xy: 916, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-generated - rotate: false - xy: 204, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-github - rotate: false - xy: 932, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-google-play - rotate: false - xy: 948, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-grid - rotate: false - xy: 519, 373 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-hold - rotate: false - xy: 915, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-holdDelete - rotate: false - xy: 927, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-home - rotate: false - xy: 964, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-host - rotate: false - xy: 980, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-info - rotate: false - xy: 939, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-itch.io - rotate: false - xy: 996, 437 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-item - rotate: false - xy: 951, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-items-none - rotate: false - xy: 487, 329 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -icon-line - rotate: false - xy: 537, 391 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-link - rotate: false - xy: 857, 419 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 icon-liquid rotate: false - xy: 963, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-load - rotate: false - xy: 857, 403 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-load-image - rotate: false - xy: 555, 409 + xy: 189, 101 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-load-map - rotate: false - xy: 537, 373 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-loading - rotate: false - xy: 555, 391 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-locked - rotate: false - xy: 573, 409 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-logic - rotate: false - xy: 975, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-map - rotate: false - xy: 873, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-menu - rotate: false - xy: 987, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-menu-large - rotate: false - xy: 555, 373 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing - rotate: false - xy: 999, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-mission-background - rotate: false - xy: 269, 381 - size: 18, 18 - orig: 18, 18 - offset: 0, 0 - index: -1 -icon-mission-battle - rotate: false - xy: 1011, 393 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-mission-defense - rotate: false - xy: 849, 319 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-mission-done - rotate: false - xy: 867, 379 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-none - rotate: false - xy: 879, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-nullitem - rotate: false - xy: 477, 299 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -icon-pause - rotate: false - xy: 891, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-pencil - rotate: false - xy: 573, 391 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pencil-small - rotate: false - xy: 873, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-pick - rotate: false - xy: 591, 409 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play - rotate: false - xy: 903, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-play-2 - rotate: false - xy: 889, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-players - rotate: false - xy: 915, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 icon-power rotate: false - xy: 927, 381 - size: 10, 10 - orig: 10, 10 + xy: 207, 195 + size: 16, 16 + orig: 16, 16 offset: 0, 0 index: -1 icon-production rotate: false - xy: 939, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-quit - rotate: false - xy: 889, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-redo - rotate: false - xy: 573, 373 + xy: 218, 237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-refresh +icon-turret rotate: false - xy: 905, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rename - rotate: false - xy: 905, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-resize - rotate: false - xy: 591, 391 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate - rotate: false - xy: 921, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rotate-arrow - rotate: false - xy: 921, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rotate-left - rotate: false - xy: 937, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rotate-right - rotate: false - xy: 937, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-save - rotate: false - xy: 953, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-save-image - rotate: false - xy: 609, 409 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-map - rotate: false - xy: 591, 373 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings - rotate: false - xy: 951, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-terrain - rotate: false - xy: 609, 391 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tools - rotate: false - xy: 953, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-touch - rotate: false - xy: 963, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-touchDelete - rotate: false - xy: 975, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-trash - rotate: false - xy: 969, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-trash-16 - rotate: false - xy: 627, 409 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trello - rotate: false - xy: 969, 405 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-tutorial - rotate: false - xy: 985, 421 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-undo - rotate: false - xy: 609, 373 + xy: 225, 201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-units rotate: false - xy: 987, 381 + xy: 243, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-upgrade + rotate: false + xy: 261, 202 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +controller-cursor + rotate: false + xy: 906, 417 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-about + rotate: false + xy: 153, 149 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-add + rotate: false + xy: 153, 133 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-admin + rotate: false + xy: 148, 117 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-admin-small + rotate: false + xy: 186, 243 + size: 6, 6 + orig: 6, 6 + offset: 0, 0 + index: -1 +icon-areaDelete + rotate: false + xy: 140, 141 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 +icon-arrow + rotate: false + xy: 135, 63 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-16 + rotate: false + xy: 135, 63 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-down + rotate: false + xy: 272, 250 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow-left + rotate: false + xy: 272, 238 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow-right + rotate: false + xy: 259, 100 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow-up + rotate: false + xy: 271, 100 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-back + rotate: false + xy: 95, 34 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-ban + rotate: false + xy: 164, 117 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-break + rotate: false + xy: 95, 16 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cancel + rotate: false + xy: 169, 137 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-chat + rotate: false + xy: 1012, 442 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-check + rotate: false + xy: 153, 99 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cursor + rotate: false + xy: 169, 37 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-dev-builds + rotate: false + xy: 184, 227 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-discord + rotate: false + xy: 200, 249 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-donate + rotate: false + xy: 225, 113 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-dots + rotate: false + xy: 243, 100 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-editor + rotate: false + xy: 279, 46 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-egg + rotate: false + xy: 333, 226 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-elevation + rotate: false + xy: 171, 63 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-eraser + rotate: false + xy: 189, 209 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-exit + rotate: false + xy: 333, 210 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-file + rotate: false + xy: 189, 191 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-image + rotate: false + xy: 187, 173 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-text + rotate: false + xy: 333, 194 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-fill + rotate: false + xy: 187, 155 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy + rotate: false + xy: 333, 178 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-floppy-16 + rotate: false + xy: 187, 137 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder + rotate: false + xy: 333, 162 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-folder-parent + rotate: false + xy: 333, 146 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-generated + rotate: false + xy: 1, 148 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-github + rotate: false + xy: 634, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-google-play + rotate: false + xy: 650, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-grid + rotate: false + xy: 180, 119 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-hold + rotate: false + xy: 169, 25 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-holdDelete + rotate: false + xy: 123, 9 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-home + rotate: false + xy: 666, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-host + rotate: false + xy: 682, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-info + rotate: false + xy: 135, 9 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-itch.io + rotate: false + xy: 698, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-item + rotate: false + xy: 147, 9 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-items-none + rotate: false + xy: 361, 367 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +icon-line + rotate: false + xy: 200, 231 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-link + rotate: false + xy: 714, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-liquid-small + rotate: false + xy: 159, 9 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-load + rotate: false + xy: 730, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-load-image + rotate: false + xy: 189, 83 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load-map + rotate: false + xy: 189, 65 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-loading + rotate: false + xy: 198, 119 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-locked + rotate: false + xy: 207, 101 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-logic + rotate: false + xy: 181, 37 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-map + rotate: false + xy: 746, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-menu + rotate: false + xy: 181, 25 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-menu-large + rotate: false + xy: 207, 83 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-missing + rotate: false + xy: 171, 13 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-mission-background + rotate: false + xy: 636, 433 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +icon-mission-battle + rotate: false + xy: 171, 1 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-mission-defense + rotate: false + xy: 183, 13 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-mission-done + rotate: false + xy: 183, 1 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-none + rotate: false + xy: 190, 53 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-nullitem + rotate: false + xy: 381, 377 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +icon-pause + rotate: false + xy: 202, 53 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-pencil + rotate: false + xy: 207, 65 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pencil-small + rotate: false + xy: 762, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-pick + rotate: false + xy: 207, 213 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play + rotate: false + xy: 193, 41 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-play-2 + rotate: false + xy: 778, 399 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-players + rotate: false + xy: 193, 29 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-power-small + rotate: false + xy: 205, 41 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-quit + rotate: false + xy: 338, 262 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-redo + rotate: false + xy: 236, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-refresh + rotate: false + xy: 338, 246 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rename + rotate: false + xy: 297, 136 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-resize + rotate: false + xy: 254, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate + rotate: false + xy: 313, 136 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rotate-arrow + rotate: false + xy: 295, 120 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rotate-left + rotate: false + xy: 311, 120 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rotate-right + rotate: false + xy: 297, 104 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-save + rotate: false + xy: 297, 88 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-save-image + rotate: false + xy: 284, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save-map + rotate: false + xy: 302, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-settings + rotate: false + xy: 205, 29 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-terrain + rotate: false + xy: 320, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tools + rotate: false + xy: 297, 72 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-touch + rotate: false + xy: 195, 17 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-touchDelete + rotate: false + xy: 195, 5 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-trash + rotate: false + xy: 313, 104 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-trash-16 + rotate: false + xy: 225, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trello + rotate: false + xy: 313, 88 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-tutorial + rotate: false + xy: 313, 72 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-undo + rotate: false + xy: 243, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 icon-unlocked rotate: false - xy: 627, 391 + xy: 261, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocks rotate: false - xy: 985, 405 + xy: 297, 56 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 -icon-weapon - rotate: false - xy: 999, 381 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 icon-wiki rotate: false - xy: 1001, 421 + xy: 313, 56 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-zoom rotate: false - xy: 645, 409 + xy: 243, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-zoom-small rotate: false - xy: 1001, 405 + xy: 295, 40 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 info-banner rotate: false - xy: 1, 217 + xy: 204, 466 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 inventory rotate: false - xy: 54, 129 + xy: 259, 378 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -6166,14 +6180,14 @@ inventory index: -1 logotext rotate: false - xy: 346, 490 + xy: 87, 287 size: 89, 21 orig: 89, 21 offset: 0, 0 index: -1 pane rotate: false - xy: 27, 1 + xy: 280, 428 size: 24, 36 split: 10, 10, 5, 5 orig: 24, 36 @@ -6189,7 +6203,7 @@ pane-button index: -1 scroll rotate: false - xy: 30, 40 + xy: 306, 432 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -6197,7 +6211,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 479, 487 + xy: 129, 261 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -6205,7 +6219,7 @@ scroll-horizontal index: -1 scroll-knob-horizontal rotate: false - xy: 437, 487 + xy: 87, 261 size: 40, 24 split: 10, 6, 0, 24 pad: -1, -1, 10, 10 @@ -6214,7 +6228,7 @@ scroll-knob-horizontal index: -1 scroll-knob-vertical rotate: false - xy: 295, 412 + xy: 56, 114 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -6222,7 +6236,7 @@ scroll-knob-vertical index: -1 scroll-knob-vertical-black rotate: false - xy: 254, 336 + xy: 51, 156 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -6230,84 +6244,63 @@ scroll-knob-vertical-black index: -1 sector-edge rotate: false - xy: 584, 445 + xy: 94, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sector-select rotate: false - xy: 618, 445 + xy: 128, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 selection rotate: false - xy: 77, 173 + xy: 230, 348 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 53, 30 + xy: 1020, 454 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 53, 171 + xy: 256, 420 size: 22, 44 orig: 22, 44 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 30, 119 + xy: 1, 39 size: 22, 44 orig: 22, 44 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 30, 119 + xy: 1, 39 size: 22, 44 orig: 22, 44 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 269, 378 + xy: 290, 466 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 -text-sides - rotate: false - xy: 1, 287 - size: 140, 21 - orig: 140, 21 - offset: 0, 0 - index: -1 -text-sides-down - rotate: false - xy: 204, 490 - size: 140, 21 - orig: 140, 21 - offset: 0, 0 - index: -1 -text-sides-over - rotate: false - xy: 1, 264 - size: 140, 21 - orig: 140, 21 - offset: 0, 0 - index: -1 textfield rotate: false - xy: 746, 449 + xy: 82, 129 size: 28, 28 split: 6, 6, 6, 6 orig: 28, 28 @@ -6315,7 +6308,7 @@ textfield index: -1 textfield-over rotate: false - xy: 716, 449 + xy: 111, 163 size: 28, 28 split: 2, 2, 2, 2 orig: 28, 28 @@ -6323,14 +6316,14 @@ textfield-over index: -1 white rotate: false - xy: 290, 449 + xy: 25, 80 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window rotate: false - xy: 1, 39 + xy: 1, 85 size: 27, 61 split: 8, 8, 44, 11 orig: 27, 61 @@ -6338,7 +6331,7 @@ window index: -1 window-empty rotate: false - xy: 1, 102 + xy: 204, 351 size: 27, 61 split: 8, 8, 44, 11 orig: 27, 61 @@ -6346,210 +6339,210 @@ window-empty index: -1 alpha-drone rotate: false - xy: 279, 294 + xy: 97, 115 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-alpha-drone rotate: false - xy: 279, 294 + xy: 97, 115 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger rotate: false - xy: 333, 358 + xy: 868, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 333, 344 + xy: 882, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 333, 330 + xy: 896, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 fortress rotate: false - xy: 654, 427 + xy: 99, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 672, 427 + xy: 93, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-base rotate: false - xy: 672, 427 + xy: 93, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 690, 431 + xy: 117, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 ghoul rotate: false - xy: 496, 447 + xy: 305, 382 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 unit-icon-ghoul rotate: false - xy: 496, 447 + xy: 305, 382 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 phantom rotate: false - xy: 291, 192 + xy: 327, 34 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 unit-icon-phantom rotate: false - xy: 291, 192 + xy: 327, 34 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 power-cell rotate: false - xy: 227, 176 + xy: 794, 399 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 revenant rotate: false - xy: 686, 449 + xy: 259, 348 size: 28, 28 orig: 28, 28 offset: 0, 0 index: -1 unit-icon-revenant rotate: false - xy: 686, 449 + xy: 259, 348 size: 28, 28 orig: 28, 28 offset: 0, 0 index: -1 spirit rotate: false - xy: 839, 359 + xy: 173, 49 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-spirit rotate: false - xy: 839, 359 + xy: 173, 49 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 titan rotate: false - xy: 753, 395 + xy: 277, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 735, 359 + xy: 297, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 257, 170 + xy: 186, 251 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 307, 167 + xy: 826, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 335, 386 + xy: 840, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 335, 386 + xy: 840, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 333, 372 + xy: 854, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 333, 288 + xy: 994, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 331, 274 + xy: 1008, 403 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 713, 345 + xy: 345, 132 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 837, 373 + xy: 131, 49 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 825, 345 + xy: 113, 21 size: 12, 12 orig: 12, 12 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 53901c92d1..205363eea1 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index 32020b418f..ab630372a6 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -5,8 +5,7 @@ Color: { gray: {a: 1, b: 0.32, g: 0.32, r: 0.32 }, lightgray: {a: 1, b: 0.65, g: 0.65, r: 0.65 } orange: {hex: "FFA500"}, - accent: {hex: "f4ba6e"}, - accentDark: {hex: "f4ba6e"}, + accent: {hex: "ffd37f"} }, TintedDrawable: { dialogDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.9} }, @@ -15,12 +14,12 @@ TintedDrawable: { chatfield: {name: white, color: {r: 0, g: 0, b: 0, a: 0.2}}, clear: {name: white, color: {r: 0.1, g: 0.1, b: 0.1, a: 0.75}}, none: {name: white, color: {r: 0, g: 0, b: 0, a: 0}}, - clear-over: {name: white, color: {r: 1, g: 1, b: 1, a: 0.2} }, - clear-down: {name: white, color: {r: 1, g: 1, b: 1, a: 0.4} } + clear-over: {name: white, color: { hex: "#ffffff82" }}, + clear-alpha: {name: white, color: { hex: "#ffd37fff" }}, + clear-down: {name: white, color: { hex: "#ffd37fff" }} }, ButtonStyle: { default: {down: button-down, up: button }, - menu: {up: text-sides, over: text-sides-over, down: text-sides-down}, toggle: {checked: button-down, down: button-down, up: button } }, TextButtonStyle: { @@ -28,6 +27,7 @@ TextButtonStyle: { discord: {font: default-font, fontColor: white, up: discord-banner}, info: {font: default-font, fontColor: white, up: info-banner}, clear: {down: clear-down, up: clear, over: clear-over, font: default-font, fontColor: white, disabledFontColor: gray }, + clear-partial: {down: white, up: button-select, over: clear-down, font: default-font, fontColor: white, disabledFontColor: gray }, empty: {font: default-font}, toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: gray } }, @@ -40,6 +40,9 @@ ImageButtonStyle: { toggle: {checked: button-down, down: button-down, up: button, imageDisabledColor: gray, imageUpColor: white }, select: {checked: button-select, up: none }, clear: {down: clear-down, up: clear, over: clear-over}, + clear-partial: {down: clear-down, up: none, over: clear-over}, + clear-toggle: {down: clear-down, checked: clear-down, up: clear, over: clear-over}, + clear-toggle-partial: {down: clear-down, checked: clear-down, up: none, over: clear-over}, }, ScrollPaneStyle: { default: {background: border, vScroll: scroll, vScrollKnob: scroll-knob-vertical-black}, diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index a11a7dbdcb..aebb84ee34 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -17,12 +17,12 @@ import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Serialization; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity; +import io.anuke.ucore.core.Settings; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.impl.EffectEntity; import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.ucore.scene.ui.layout.Unit; -import io.anuke.ucore.util.OS; import io.anuke.ucore.util.Translator; import java.util.Arrays; @@ -33,6 +33,7 @@ public class Vars{ public static final String appName = "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 contributorsURL = "https://api.github.com/repos/Anuken/Mindustry/contributors"; public static final String crashReportURL = "http://mindustry.us.to/report"; //time between waves in frames (on normal mode) public static final float wavespace = 60 * 60 * 1.5f; @@ -49,8 +50,7 @@ public class Vars{ public static final int maxNameLength = 40; public static final float itemSize = 5f; public static final int tilesize = 8; - public static final int sectorSize = 250; - public static final int mapPadding = 3; + public static final int sectorSize = 256; public static final int invalidSector = Integer.MAX_VALUE; public static Locale[] locales; public static final Color[] playerColors = { @@ -170,7 +170,7 @@ public class Vars{ ios = Gdx.app.getType() == ApplicationType.iOS; android = Gdx.app.getType() == ApplicationType.Android; - dataDirectory = OS.getAppDataDirectory(appName); + dataDirectory = Settings.getDataDirectory(appName); customMapDirectory = dataDirectory.child("maps/"); saveDirectory = dataDirectory.child("saves/"); baseCameraScale = Math.round(Unit.dp.scl(4)); diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 04c5c04cb8..9b0c5f7bac 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -21,7 +21,6 @@ import io.anuke.ucore.util.ThreadArray; import static io.anuke.mindustry.Vars.*; //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.*/ @SuppressWarnings("unchecked") diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 7f9c77970c..ccb9fc6fc4 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -182,7 +182,7 @@ public class Pathfinder{ } } - state.spawner.checkAllQuadrants(); + world.spawner.checkAllQuadrants(); } class PathData{ diff --git a/core/src/io/anuke/mindustry/content/Recipes.java b/core/src/io/anuke/mindustry/content/Recipes.java index 08a7f8fac1..f236469ff9 100644 --- a/core/src/io/anuke/mindustry/content/Recipes.java +++ b/core/src/io/anuke/mindustry/content/Recipes.java @@ -43,43 +43,46 @@ public class Recipes implements ContentList{ new Recipe(defense, DefenseBlocks.surgeWallLarge, new ItemStack(Items.surgealloy, 12 * 4)); //projectors - new Recipe(defense, DefenseBlocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180)); - new Recipe(defense, DefenseBlocks.overdriveProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); - new Recipe(defense, DefenseBlocks.forceProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); + new Recipe(effect, DefenseBlocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180)); + new Recipe(effect, DefenseBlocks.overdriveProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); + new Recipe(effect, DefenseBlocks.forceProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); - //extra blocks - new Recipe(defense, DefenseBlocks.shockMine, new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 25)) + new Recipe(effect, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60)); + new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200)); + new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250)); + + new Recipe(effect, DefenseBlocks.shockMine, new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 25)) .setDependencies(Items.blastCompound); //TURRETS - new Recipe(weapon, TurretBlocks.duo, new ItemStack(Items.copper, 40)).setAlwaysUnlocked(true); - new Recipe(weapon, TurretBlocks.arc, new ItemStack(Items.copper, 50), new ItemStack(Items.lead, 30), new ItemStack(Items.silicon, 20)); - new Recipe(weapon, TurretBlocks.hail, new ItemStack(Items.copper, 60), new ItemStack(Items.densealloy, 35)); - new Recipe(weapon, TurretBlocks.lancer, new ItemStack(Items.copper, 50), new ItemStack(Items.lead, 100), new ItemStack(Items.silicon, 90)); - new Recipe(weapon, TurretBlocks.wave, new ItemStack(Items.densealloy, 60), new ItemStack(Items.titanium, 70), new ItemStack(Items.lead, 150)); - new Recipe(weapon, TurretBlocks.salvo, new ItemStack(Items.copper, 210), new ItemStack(Items.densealloy, 190), new ItemStack(Items.thorium, 130)); - new Recipe(weapon, TurretBlocks.swarmer, new ItemStack(Items.densealloy, 70), new ItemStack(Items.titanium, 70), new ItemStack(Items.plastanium, 90), new ItemStack(Items.silicon, 60)); - new Recipe(weapon, TurretBlocks.ripple, new ItemStack(Items.copper, 300), new ItemStack(Items.densealloy, 220), new ItemStack(Items.thorium, 120)); - new Recipe(weapon, TurretBlocks.cyclone, new ItemStack(Items.copper, 400), new ItemStack(Items.densealloy, 400), new ItemStack(Items.surgealloy, 200), new ItemStack(Items.plastanium, 150)); - new Recipe(weapon, TurretBlocks.fuse, new ItemStack(Items.copper, 450), new ItemStack(Items.densealloy, 450), new ItemStack(Items.surgealloy, 250)); - new Recipe(weapon, TurretBlocks.spectre, new ItemStack(Items.copper, 700), new ItemStack(Items.densealloy, 600), new ItemStack(Items.surgealloy, 500), new ItemStack(Items.plastanium, 350), new ItemStack(Items.thorium, 500)); - new Recipe(weapon, TurretBlocks.meltdown, new ItemStack(Items.copper, 500), new ItemStack(Items.lead, 700), new ItemStack(Items.densealloy, 600), new ItemStack(Items.surgealloy, 650), new ItemStack(Items.silicon, 650)); + new Recipe(turret, TurretBlocks.duo, new ItemStack(Items.copper, 40)).setAlwaysUnlocked(true); + new Recipe(turret, TurretBlocks.arc, new ItemStack(Items.copper, 50), new ItemStack(Items.lead, 30), new ItemStack(Items.silicon, 20)); + new Recipe(turret, TurretBlocks.hail, new ItemStack(Items.copper, 60), new ItemStack(Items.densealloy, 35)); + new Recipe(turret, TurretBlocks.lancer, new ItemStack(Items.copper, 50), new ItemStack(Items.lead, 100), new ItemStack(Items.silicon, 90)); + new Recipe(turret, TurretBlocks.wave, new ItemStack(Items.densealloy, 60), new ItemStack(Items.titanium, 70), new ItemStack(Items.lead, 150)); + new Recipe(turret, TurretBlocks.salvo, new ItemStack(Items.copper, 210), new ItemStack(Items.densealloy, 190), new ItemStack(Items.thorium, 130)); + new Recipe(turret, TurretBlocks.swarmer, new ItemStack(Items.densealloy, 70), new ItemStack(Items.titanium, 70), new ItemStack(Items.plastanium, 90), new ItemStack(Items.silicon, 60)); + new Recipe(turret, TurretBlocks.ripple, new ItemStack(Items.copper, 300), new ItemStack(Items.densealloy, 220), new ItemStack(Items.thorium, 120)); + new Recipe(turret, TurretBlocks.cyclone, new ItemStack(Items.copper, 400), new ItemStack(Items.densealloy, 400), new ItemStack(Items.surgealloy, 200), new ItemStack(Items.plastanium, 150)); + new Recipe(turret, TurretBlocks.fuse, new ItemStack(Items.copper, 450), new ItemStack(Items.densealloy, 450), new ItemStack(Items.surgealloy, 250)); + new Recipe(turret, TurretBlocks.spectre, new ItemStack(Items.copper, 700), new ItemStack(Items.densealloy, 600), new ItemStack(Items.surgealloy, 500), new ItemStack(Items.plastanium, 350), new ItemStack(Items.thorium, 500)); + new Recipe(turret, TurretBlocks.meltdown, new ItemStack(Items.copper, 500), new ItemStack(Items.lead, 700), new ItemStack(Items.densealloy, 600), new ItemStack(Items.surgealloy, 650), new ItemStack(Items.silicon, 650)); //DISTRIBUTION new Recipe(distribution, DistributionBlocks.conveyor, new ItemStack(Items.copper, 1)).setAlwaysUnlocked(true); new Recipe(distribution, DistributionBlocks.titaniumconveyor, new ItemStack(Items.copper, 2), new ItemStack(Items.titanium, 1)); new Recipe(distribution, DistributionBlocks.phaseConveyor, new ItemStack(Items.phasefabric, 10), new ItemStack(Items.silicon, 15), new ItemStack(Items.lead, 20), new ItemStack(Items.densealloy, 20)); - //starter lead transportation + //starter transport new Recipe(distribution, DistributionBlocks.junction, new ItemStack(Items.copper, 2)).setAlwaysUnlocked(true); new Recipe(distribution, DistributionBlocks.router, new ItemStack(Items.copper, 6)).setAlwaysUnlocked(true); - //advanced densealloy transporation + //advanced densealloy transporat new Recipe(distribution, DistributionBlocks.distributor, new ItemStack(Items.densealloy, 8), new ItemStack(Items.copper, 8)); new Recipe(distribution, DistributionBlocks.sorter, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 4)); new Recipe(distribution, DistributionBlocks.overflowGate, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 8)); new Recipe(distribution, DistributionBlocks.itemBridge, new ItemStack(Items.densealloy, 8), new ItemStack(Items.copper, 8)); - new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.densealloy, 400), new ItemStack(Items.silicon, 300), new ItemStack(Items.lead, 400), new ItemStack(Items.thorium, 250)); + new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.densealloy, 250), new ItemStack(Items.silicon, 150), new ItemStack(Items.lead, 250), new ItemStack(Items.thorium, 100)); //CRAFTING @@ -131,9 +134,6 @@ public class Recipes implements ContentList{ new Recipe(power, PowerBlocks.thoriumReactor, new ItemStack(Items.lead, 600), new ItemStack(Items.silicon, 400), new ItemStack(Items.densealloy, 300), new ItemStack(Items.thorium, 300)); new Recipe(power, PowerBlocks.rtgGenerator, new ItemStack(Items.lead, 200), new ItemStack(Items.silicon, 150), new ItemStack(Items.phasefabric, 50), new ItemStack(Items.plastanium, 150), new ItemStack(Items.thorium, 100)); - new Recipe(distribution, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60)); - new Recipe(distribution, StorageBlocks.container, new ItemStack(Items.densealloy, 200)); - new Recipe(distribution, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250)); //core disabled due to being broken /*new Recipe(distribution, StorageBlocks.core, new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500), @@ -153,16 +153,16 @@ public class Recipes implements ContentList{ //UNITS - //bodies - new Recipe(units, UpgradeBlocks.dartPad, new ItemStack(Items.lead, 150), new ItemStack(Items.copper, 150), new ItemStack(Items.silicon, 200), new ItemStack(Items.titanium, 240)).setVisible(RecipeVisibility.desktopOnly); - new Recipe(units, UpgradeBlocks.tridentPad, new ItemStack(Items.lead, 250), new ItemStack(Items.copper, 250), new ItemStack(Items.silicon, 250), new ItemStack(Items.titanium, 300), new ItemStack(Items.plastanium, 200)); - new Recipe(units, UpgradeBlocks.javelinPad, new ItemStack(Items.lead, 350), new ItemStack(Items.silicon, 450), new ItemStack(Items.titanium, 500), new ItemStack(Items.plastanium, 400), new ItemStack(Items.phasefabric, 200)); - new Recipe(units, UpgradeBlocks.glaivePad, new ItemStack(Items.lead, 450), new ItemStack(Items.silicon, 650), new ItemStack(Items.titanium, 700), new ItemStack(Items.plastanium, 600), new ItemStack(Items.surgealloy, 200)); + //upgrades + new Recipe(upgrade, UpgradeBlocks.dartPad, new ItemStack(Items.lead, 150), new ItemStack(Items.copper, 150), new ItemStack(Items.silicon, 200), new ItemStack(Items.titanium, 240)).setVisible(RecipeVisibility.desktopOnly); + new Recipe(upgrade, UpgradeBlocks.tridentPad, new ItemStack(Items.lead, 250), new ItemStack(Items.copper, 250), new ItemStack(Items.silicon, 250), new ItemStack(Items.titanium, 300), new ItemStack(Items.plastanium, 200)); + new Recipe(upgrade, UpgradeBlocks.javelinPad, new ItemStack(Items.lead, 350), new ItemStack(Items.silicon, 450), new ItemStack(Items.titanium, 500), new ItemStack(Items.plastanium, 400), new ItemStack(Items.phasefabric, 200)); + new Recipe(upgrade, UpgradeBlocks.glaivePad, new ItemStack(Items.lead, 450), new ItemStack(Items.silicon, 650), new ItemStack(Items.titanium, 700), new ItemStack(Items.plastanium, 600), new ItemStack(Items.surgealloy, 200)); - new Recipe(units, UpgradeBlocks.alphaPad, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 100), new ItemStack(Items.copper, 150)).setVisible(RecipeVisibility.mobileOnly); - new Recipe(units, UpgradeBlocks.tauPad, new ItemStack(Items.lead, 250), new ItemStack(Items.densealloy, 250), new ItemStack(Items.copper, 250), new ItemStack(Items.silicon, 250)); - new Recipe(units, UpgradeBlocks.deltaPad, new ItemStack(Items.lead, 350), new ItemStack(Items.densealloy, 350), new ItemStack(Items.copper, 400), new ItemStack(Items.silicon, 450), new ItemStack(Items.thorium, 300)); - new Recipe(units, UpgradeBlocks.omegaPad, new ItemStack(Items.lead, 450), new ItemStack(Items.densealloy, 550), new ItemStack(Items.silicon, 650), new ItemStack(Items.thorium, 600), new ItemStack(Items.surgealloy, 240)); + new Recipe(upgrade, UpgradeBlocks.alphaPad, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 100), new ItemStack(Items.copper, 150)).setVisible(RecipeVisibility.mobileOnly); + new Recipe(upgrade, UpgradeBlocks.tauPad, new ItemStack(Items.lead, 250), new ItemStack(Items.densealloy, 250), new ItemStack(Items.copper, 250), new ItemStack(Items.silicon, 250)); + new Recipe(upgrade, UpgradeBlocks.deltaPad, new ItemStack(Items.lead, 350), new ItemStack(Items.densealloy, 350), new ItemStack(Items.copper, 400), new ItemStack(Items.silicon, 450), new ItemStack(Items.thorium, 300)); + new Recipe(upgrade, UpgradeBlocks.omegaPad, new ItemStack(Items.lead, 450), new ItemStack(Items.densealloy, 550), new ItemStack(Items.silicon, 650), new ItemStack(Items.thorium, 600), new ItemStack(Items.surgealloy, 240)); //actual unit related stuff new Recipe(units, UnitBlocks.spiritFactory, new ItemStack(Items.copper, 70), new ItemStack(Items.lead, 110), new ItemStack(Items.silicon, 130)); diff --git a/core/src/io/anuke/mindustry/content/blocks/Blocks.java b/core/src/io/anuke/mindustry/content/blocks/Blocks.java index 67e031d4a6..101539b893 100644 --- a/core/src/io/anuke/mindustry/content/blocks/Blocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/Blocks.java @@ -45,6 +45,8 @@ public class Blocks extends BlockList implements ContentList{ } }; + //Registers build blocks from size 1-6 + //no reference is needed here since they can be looked up by name later for(int i = 1; i <= 6; i++){ new BuildBlock("build" + i); } diff --git a/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java index 825b7097cb..df4ab9ea20 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java @@ -33,9 +33,9 @@ public class DistributionBlocks extends BlockList implements ContentList{ }}; phaseConveyor = new ItemBridge("phase-conveyor"){{ - range = 11; + range = 12; hasPower = true; - consumes.power(0.05f); + consumes.power(0.03f); }}; sorter = new Sorter("sorter"); @@ -50,8 +50,8 @@ public class DistributionBlocks extends BlockList implements ContentList{ massDriver = new MassDriver("mass-driver"){{ size = 3; - itemCapacity = 80; - range = 340f; + itemCapacity = 60; + range = 440f; }}; } } diff --git a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java index a9e9f97155..3ca87efef1 100644 --- a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java @@ -67,9 +67,9 @@ public class LiquidBlocks extends BlockList implements ContentList{ }}; phaseConduit = new LiquidBridge("phase-conduit"){{ - range = 11; + range = 12; hasPower = true; - consumes.power(0.05f); + consumes.power(0.03f); }}; } } diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index bce9e3bb5a..9b15b070ce 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -32,24 +32,13 @@ public class TurretBlocks extends BlockList implements ContentList{ hail = new ArtilleryTurret("hail"){{ ammoTypes = new AmmoType[]{AmmoTypes.artilleryDense, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary}; - reload = 70f; + reload = 60f; recoil = 2f; range = 230f; inaccuracy = 1f; shootCone = 10f; 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"){ protected TextureRegion shootRegion; @@ -117,11 +106,11 @@ public class TurretBlocks extends BlockList implements ContentList{ arc = new PowerTurret("arc"){{ shootType = AmmoTypes.arc; - reload = 55f; + reload = 75f; shootShake = 1f; shootCone = 40f; rotatespeed = 8f; - powerUsed = 7f; + powerUsed = 9f; powerCapacity = 30f; range = 150f; shootEffect = ShootFx.lightningShoot; @@ -132,7 +121,7 @@ public class TurretBlocks extends BlockList implements ContentList{ swarmer = new BurstTurret("swarmer"){{ ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary, AmmoTypes.missileSurge}; - reload = 60f; + reload = 5f; shots = 4; burstSpacing = 5; inaccuracy = 10f; @@ -156,7 +145,7 @@ public class TurretBlocks extends BlockList implements ContentList{ size = 2; range = 120f; ammoTypes = new AmmoType[]{AmmoTypes.bulletCopper, AmmoTypes.bulletDense, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon}; - reload = 40f; + reload = 35f; restitution = 0.03f; ammoEjectBack = 3f; cooldown = 0.03f; @@ -216,7 +205,6 @@ public class TurretBlocks extends BlockList implements ContentList{ }}; fuse = new ItemTurret("fuse"){{ - //TODO make it use power ammoTypes = new AmmoType[]{AmmoTypes.fuseShotgun}; reload = 50f; shootShake = 4f; diff --git a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java index b7d9809cbb..7f4a40d602 100644 --- a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java @@ -21,7 +21,7 @@ public class UnitBlocks extends BlockList implements ContentList{ produceTime = 5700; size = 2; consumes.power(0.08f); - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30)}); + consumes.items(new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30)); }}; phantomFactory = new UnitFactory("phantom-factory"){{ @@ -29,7 +29,7 @@ public class UnitBlocks extends BlockList implements ContentList{ produceTime = 7300; size = 2; consumes.power(0.2f); - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 70), new ItemStack(Items.lead, 80), new ItemStack(Items.titanium, 80)}); + consumes.items(new ItemStack(Items.silicon, 70), new ItemStack(Items.lead, 80), new ItemStack(Items.titanium, 80)); }}; wraithFactory = new UnitFactory("wraith-factory"){{ @@ -37,7 +37,7 @@ public class UnitBlocks extends BlockList implements ContentList{ produceTime = 1800; size = 2; consumes.power(0.1f); - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 10), new ItemStack(Items.titanium, 10)}); + consumes.items(new ItemStack(Items.silicon, 10), new ItemStack(Items.titanium, 10)); }}; ghoulFactory = new UnitFactory("ghoul-factory"){{ @@ -46,7 +46,7 @@ public class UnitBlocks extends BlockList implements ContentList{ size = 3; consumes.power(0.2f); shadow = "shadow-round-3"; - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 30), new ItemStack(Items.titanium, 30), new ItemStack(Items.plastanium, 20)}); + consumes.items(new ItemStack(Items.silicon, 30), new ItemStack(Items.titanium, 30), new ItemStack(Items.plastanium, 20)); }}; revenantFactory = new UnitFactory("revenant-factory"){{ @@ -55,7 +55,7 @@ public class UnitBlocks extends BlockList implements ContentList{ size = 4; consumes.power(0.3f); shadow = "shadow-round-4"; - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 80), new ItemStack(Items.titanium, 80), new ItemStack(Items.plastanium, 50)}); + consumes.items(new ItemStack(Items.silicon, 80), new ItemStack(Items.titanium, 80), new ItemStack(Items.plastanium, 50)); }}; daggerFactory = new UnitFactory("dagger-factory"){{ @@ -63,7 +63,7 @@ public class UnitBlocks extends BlockList implements ContentList{ produceTime = 1700; size = 2; consumes.power(0.05f); - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 10)}); + consumes.items(new ItemStack(Items.silicon, 10)); }}; titanFactory = new UnitFactory("titan-factory"){{ @@ -72,7 +72,7 @@ public class UnitBlocks extends BlockList implements ContentList{ size = 3; consumes.power(0.15f); shadow = "shadow-round-3"; - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.thorium, 30)}); + consumes.items(new ItemStack(Items.silicon, 20), new ItemStack(Items.thorium, 30)); }}; fortressFactory = new UnitFactory("fortress-factory"){{ @@ -81,7 +81,7 @@ public class UnitBlocks extends BlockList implements ContentList{ size = 3; consumes.power(0.2f); shadow = "shadow-round-3"; - consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 40), new ItemStack(Items.thorium, 50)}); + consumes.items(new ItemStack(Items.silicon, 40), new ItemStack(Items.thorium, 50)); }}; repairPoint = new RepairPoint("repair-point"){{ diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index ba7cac85b8..addcb75960 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -304,7 +304,7 @@ public class TurretBullets extends BulletList implements ContentList{ } }; - arc = new BulletType(0.001f, 30){ + arc = new BulletType(0.001f, 26){ { lifetime = 1; despawneffect = Fx.none; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 450773f1d3..90b87f56e1 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -89,7 +89,7 @@ public class Control extends Module{ "color-1", Color.rgba8888(playerColors[11]), "color-2", Color.rgba8888(playerColors[13]), "color-3", Color.rgba8888(playerColors[9]), - "name", "player", + "name", "", "lastBuild", 0 ); @@ -111,15 +111,6 @@ public class Control extends Module{ } state.set(State.playing); - - if(world.getSector() == null && !Settings.getBool("custom-warning-for-real-1", false)){ - threads.runGraphics(() -> ui.showInfo("$mode.custom.warning", () -> - ui.showInfo("$mode.custom.warning.read", () -> { - Settings.putBool("custom-warning-for-real-1", true); - Settings.save(); - }))); - - } }); Events.on(WorldLoadGraphicsEvent.class, event -> { diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java index 4e20c5ba75..96a36fad8a 100644 --- a/core/src/io/anuke/mindustry/core/GameState.java +++ b/core/src/io/anuke/mindustry/core/GameState.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.core; -import io.anuke.mindustry.ai.WaveSpawner; import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.GameMode; @@ -8,16 +7,31 @@ import io.anuke.mindustry.game.Teams; import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Events; +import static io.anuke.mindustry.Vars.unitGroups; +import static io.anuke.mindustry.Vars.waveTeam; + public class GameState{ + /**Current wave number, can be anything in non-wave modes.*/ public int wave = 1; + /**Wave countdown in ticks.*/ public float wavetime; + /**Whether the game is in game over state.*/ public boolean gameOver = false; + /**The current game mode.*/ public GameMode mode = GameMode.waves; + /**The current difficulty for wave modes.*/ public Difficulty difficulty = Difficulty.normal; - public WaveSpawner spawner = new WaveSpawner(); + /**Team data. Gets reset every new game.*/ public Teams teams = new Teams(); + /**Number of enemies in the game; only used clientside in servers.*/ + public int enemies; + /**Current game state.*/ private State state = State.menu; + public int enemies(){ + return Net.client() ? enemies : unitGroups[waveTeam.ordinal()].size(); + } + public void set(State astate){ Events.fire(new StateChangeEvent(state, astate)); state = astate; diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 471eba010e..5f7035cb7e 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -34,7 +34,6 @@ import static io.anuke.mindustry.Vars.*; * This class should not call any outside methods to change state of modules, but instead fire events. */ public class Logic extends Module{ - public boolean doUpdate = true; public Logic(){ Events.on(TileChangeEvent.class, event -> { @@ -94,7 +93,7 @@ public class Logic extends Module{ } public void runWave(){ - state.spawner.spawnEnemies(); + world.spawner.spawnEnemies(); state.wave++; state.wavetime = wavespace * state.difficulty.timeScaling; @@ -125,7 +124,7 @@ public class Logic extends Module{ } private void updateSectors(){ - if(world.getSector() == null) return; + if(world.getSector() == null || state.gameOver) return; world.getSector().currentMission().update(); @@ -218,12 +217,6 @@ public class Logic extends Module{ if(group.isEmpty()) continue; EntityQuery.collideGroups(bulletGroup, group); - EntityQuery.collideGroups(group, playerGroup); - - for(EntityGroup other : unitGroups){ - if(other.isEmpty()) continue; - EntityQuery.collideGroups(group, other); - } } EntityQuery.collideGroups(bulletGroup, playerGroup); diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index a0b26e543f..bf124f9be2 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.TypeTrait; +import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.RemoteReadClient; import io.anuke.mindustry.net.Net; @@ -95,6 +96,7 @@ public class NetClient extends Module{ ConnectPacket c = new ConnectPacket(); c.name = player.name; c.mobile = mobile; + c.versionType = Version.type; c.color = Color.rgba8888(player.color); c.usid = getUsid(packet.addressTCP); c.uuid = Platform.instance.getUUID(); @@ -284,6 +286,7 @@ public class NetClient extends Module{ //read wave info state.wavetime = input.readFloat(); state.wave = input.readInt(); + state.enemies = input.readInt(); byte cores = input.readByte(); for(int i = 0; i < cores; i++){ diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 9e00ecf130..b3bd83af65 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -120,7 +120,7 @@ public class NetServer extends Module{ 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); return; } @@ -412,7 +412,16 @@ public class NetServer extends Module{ } public boolean isWaitingForPlayers(){ - return state.mode.isPvp && playerGroup.size() < 2; + if(state.mode.isPvp){ + int used = 0; + for(Team t : Team.all){ + if(playerGroup.count(p -> p.getTeam() == t) > 0){ + used ++; + } + } + return used < 2; + } + return false; } public void update(){ @@ -468,6 +477,7 @@ public class NetServer extends Module{ //write wave datas dataStream.writeFloat(state.wavetime); dataStream.writeInt(state.wave); + dataStream.writeInt(state.enemies()); ObjectSet cores = state.teams.get(player.getTeam()).cores; diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index ec7e0308ca..63695bac48 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -1,13 +1,21 @@ package io.anuke.mindustry.core; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Base64Coder; +import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Settings; +import io.anuke.ucore.core.Timers; import io.anuke.ucore.function.Consumer; +import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.TextField; +import io.anuke.ucore.util.Log; import java.util.Random; +import static io.anuke.mindustry.Vars.mobile; + public abstract class Platform { /**Each separate game platform should set this instance to their own implementation.*/ public static Platform instance = new Platform() {}; @@ -17,7 +25,34 @@ public abstract class Platform { addDialog(field, 16); } /**See addDialog().*/ - public void addDialog(TextField field, int maxLength){} + public void addDialog(TextField field, int maxLength){ + if(!mobile) return; //this is mobile only, desktop doesn't need dialogs + + field.tapped(() -> { + Log.info("yappd"); + Dialog dialog = new Dialog("", "dialog"); + dialog.setFillParent(true); + dialog.content().top(); + dialog.content().defaults().height(65f); + TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); + to.setMaxLength(maxLength); + to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); + dialog.content().addButton("$text.ok", () -> { + field.clearText(); + field.appendText(to.getText()); + field.change(); + dialog.hide(); + Gdx.input.setOnscreenKeyboardVisible(false); + }).width(90f).name("okb"); + + dialog.show(); + Timers.runTask(1f, () -> { + to.setCursorPosition(to.getText().length()); + Core.scene.setKeyboardFocus(to); + Gdx.input.setOnscreenKeyboardVisible(true); + }); + }); + } /**Update discord RPC.*/ public void updateRPC(){} /**Called when the game is exited.*/ diff --git a/core/src/io/anuke/mindustry/core/ThreadHandler.java b/core/src/io/anuke/mindustry/core/ThreadHandler.java index c89a816140..700b816a92 100644 --- a/core/src/io/anuke/mindustry/core/ThreadHandler.java +++ b/core/src/io/anuke/mindustry/core/ThreadHandler.java @@ -11,7 +11,7 @@ public class ThreadHandler{ public ThreadHandler(){ Timers.setDeltaProvider(() -> { float result = Gdx.graphics.getDeltaTime() * 60f; - return Math.min(Float.isNaN(result) || Float.isInfinite(result) ? 1f : result, 15f); + return Float.isNaN(result) || Float.isInfinite(result) ? 1f : Math.min(result, 60f / 10f); }); } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index ab1c29244c..0d7ca96820 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -28,6 +28,7 @@ import io.anuke.ucore.scene.ui.TextField.TextFieldFilter; import io.anuke.ucore.scene.ui.TooltipManager; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Unit; +import io.anuke.ucore.util.Strings; import static io.anuke.mindustry.Vars.*; import static io.anuke.ucore.scene.actions.Actions.*; @@ -293,4 +294,16 @@ public class UI extends SceneModule{ dialog.keyDown(Keys.BACK, dialog::hide); dialog.show(); } + + public String formatAmount(int number){ + if(number >= 1000000){ + return Strings.toFixed(number / 1000000f, 1) + "[gray]mil[]"; + }else if(number >= 10000){ + return number / 1000 + "[gray]k[]"; + }else if(number >= 1000){ + return Strings.toFixed(number / 1000f, 1) + "[gray]k[]"; + }else{ + return number + ""; + } + } } diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 50469edacf..cf72719411 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.ai.BlockIndexer; import io.anuke.mindustry.ai.Pathfinder; +import io.anuke.mindustry.ai.WaveSpawner; import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.game.EventType.TileChangeEvent; @@ -30,6 +31,7 @@ public class World extends Module{ public final WorldGenerator generator = new WorldGenerator(); public final BlockIndexer indexer = new BlockIndexer(); public final Pathfinder pathfinder = new Pathfinder(); + public final WaveSpawner spawner = new WaveSpawner(); private Map currentMap; private Sector currentSector; diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java index 59894bd016..fca223c3fe 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -175,7 +175,6 @@ public class MapView extends Element implements GestureListener{ public void clearStack(){ stack.clear(); - //TODO clear und obuffer } 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(); Draw.color(Palette.accent); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index df2686d7e2..a83bfcc18f 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -19,10 +19,7 @@ import io.anuke.mindustry.graphics.Trail; import io.anuke.mindustry.io.TypeIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.NetConnection; -import io.anuke.mindustry.type.ContentType; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.type.Mech; -import io.anuke.mindustry.type.Weapon; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; @@ -192,6 +189,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra this.mining = tile; } + @Override + public boolean canMine(Item item){ + return item.hardness <= mech.drillPower; + } + @Override public float getArmor(){ return mech.armor + mech.getExtraArmor(this); @@ -293,7 +295,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra float x = snappedX(), y = snappedY(); if(!movement.isZero() && moved && !state.isPaused()){ - walktime += Timers.delta() * movement.len() / 0.7f * getFloorOn().speedMultiplier; + walktime += movement.len() / 0.7f * getFloorOn().speedMultiplier; baseRotation = Mathf.slerpDelta(baseRotation, movement.angle(), 0.13f); } @@ -550,8 +552,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra updateBuilding(this); - x = Mathf.clamp(x, 0, world.width() * tilesize); - y = Mathf.clamp(y, 0, world.height() * tilesize); + x = Mathf.clamp(x, tilesize, world.width() * tilesize - tilesize); + y = Mathf.clamp(y, tilesize, world.height() * tilesize - tilesize); } protected void updateMech(){ @@ -608,11 +610,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra pointerY = vec.y; updateShooting(); - movement.limit(speed * Timers.delta()); + movement.limit(speed).scl(Timers.delta()); if(getCarrier() == null){ if(!ui.chatfrag.chatOpen()){ - velocity.add(movement); + velocity.add(movement.x, movement.y); } float prex = x, prey = y; updateVelocityStatus(); diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index e7d4644401..ef6bdfecfe 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -233,7 +233,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ status.update(this); - velocity.limit(getMaxVelocity()).scl(status.getSpeedMultiplier()); + velocity.limit(getMaxVelocity()).scl(1f + (status.getSpeedMultiplier()-1f) * Timers.delta()); if(isFlying()){ x += velocity.x * Timers.delta(); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 3129e67c64..7b25c12348 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -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.*/ 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.*/ default boolean canCreateBlocks(){ return true; @@ -236,7 +239,8 @@ public interface BuilderTrait extends Entity{ Tile tile = getMineTile(); TileEntity core = unit.getClosestCore(); - if(core == null || tile.block() != Blocks.air || unit.distanceTo(tile.worldx(), tile.worldy()) > mineDistance || !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); }else{ Item item = tile.floor().drops.item; diff --git a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java index c41fcbf264..9509e4eb68 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java @@ -33,10 +33,11 @@ public interface SyncTrait extends Entity, TypeTrait{ if(isClipped()){ //move off screen when no longer in bounds - if(!Tmp.r1.setSize( - Core.camera.viewportWidth * Core.camera.zoom * NetClient.viewScale, - Core.camera.viewportHeight * Core.camera.zoom * NetClient.viewScale) - .setCenter(Core.camera.position.x, Core.camera.position.y).contains(getX(), getY())){ + Tmp.r1.setSize(Core.camera.viewportWidth * Core.camera.zoom * NetClient.viewScale, + Core.camera.viewportHeight * Core.camera.zoom * NetClient.viewScale) + .setCenter(Core.camera.position.x, Core.camera.position.y); + + if(!Tmp.r1.contains(getX(), getY()) && !Tmp.r1.contains(getInterpolator().last.x, getInterpolator().last.y)){ set(-99999f, -99999f); return; } diff --git a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java index 8bdec0d39b..db01ba1ab1 100644 --- a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java @@ -238,7 +238,7 @@ public abstract class GroundUnit extends BaseUnit{ } protected void patrol(){ - vec.trns(baseRotation, type.speed); + vec.trns(baseRotation, type.speed * Timers.delta()); velocity.add(vec.x, vec.y); vec.trns(baseRotation, type.hitsizeTile); Tile tile = world.tileWorld(x + vec.x, y + vec.y); diff --git a/core/src/io/anuke/mindustry/entities/units/UnitType.java b/core/src/io/anuke/mindustry/entities/units/UnitType.java index 5087df0b81..6cae81a48f 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitType.java +++ b/core/src/io/anuke/mindustry/entities/units/UnitType.java @@ -19,7 +19,6 @@ import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Strings; -//TODO merge unit type with mech public class UnitType extends UnlockableContent{ protected final Supplier constructor; diff --git a/core/src/io/anuke/mindustry/entities/units/types/Drone.java b/core/src/io/anuke/mindustry/entities/units/types/Drone.java index 35c254ce2a..4b9ebe820d 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java @@ -279,6 +279,11 @@ public class Drone extends FlyingUnit implements BuilderTrait{ //no } + @Override + public boolean canMine(Item item){ + return type.toMine.contains(item); + } + @Override public float getBuildPower(Tile tile){ return type.buildPower; diff --git a/core/src/io/anuke/mindustry/game/ContentUnlockSet.java b/core/src/io/anuke/mindustry/game/ContentUnlockSet.java deleted file mode 100644 index a779c52509..0000000000 --- a/core/src/io/anuke/mindustry/game/ContentUnlockSet.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.anuke.mindustry.game; - -import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.ObjectSet; -import io.anuke.mindustry.game.EventType.UnlockEvent; -import io.anuke.mindustry.type.ContentType; -import io.anuke.ucore.core.Events; - -public class ContentUnlockSet { - private ObjectMap> unlocked = new ObjectMap<>(); - private boolean dirty; - - public boolean isUnlocked(UnlockableContent content){ - if(content.alwaysUnlocked()) return true; - - if(!unlocked.containsKey(content.getContentType())){ - unlocked.put(content.getContentType(), new ObjectSet<>()); - } - - ObjectSet set = unlocked.get(content.getContentType()); - - return set.contains(content.getContentName()); - } - - public boolean unlockContent(UnlockableContent content){ - if(!content.canBeUnlocked() || content.alwaysUnlocked()) return false; - - if(!unlocked.containsKey(content.getContentType())){ - unlocked.put(content.getContentType(), new ObjectSet<>()); - } - - boolean ret = unlocked.get(content.getContentType()).add(content.getContentName()); - - //fire unlock event so other classes can use it - if(ret){ - content.onUnlock(); - Events.fire(new UnlockEvent(content)); - dirty = true; - } - - return ret; - } - - public boolean isDirty() { - return dirty; - } - - public ObjectMap> getUnlocked() { - return unlocked; - } -} diff --git a/core/src/io/anuke/mindustry/game/Unlocks.java b/core/src/io/anuke/mindustry/game/Unlocks.java index e2bbd5984b..ff2853f59b 100644 --- a/core/src/io/anuke/mindustry/game/Unlocks.java +++ b/core/src/io/anuke/mindustry/game/Unlocks.java @@ -4,16 +4,15 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.ObjectSet; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.game.EventType.UnlockEvent; import io.anuke.mindustry.type.ContentType; +import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Settings; -import static io.anuke.mindustry.Vars.*; - /**Stores player unlocks. Clientside only.*/ public class Unlocks{ - private ObjectMap sets = new ObjectMap<>(); + private ObjectMap> unlocked = new ObjectMap<>(); + private boolean dirty; static{ Settings.setSerializer(ContentType.class, (stream, t) -> stream.writeInt(t.ordinal()), stream -> ContentType.values()[stream.readInt()]); @@ -21,7 +20,15 @@ public class Unlocks{ /** Returns whether or not this piece of content is unlocked yet.*/ public boolean isUnlocked(UnlockableContent content){ - return rootSet().isUnlocked(content) || currentSet().isUnlocked(content); + if(content.alwaysUnlocked()) return true; + + if(!unlocked.containsKey(content.getContentType())){ + unlocked.put(content.getContentType(), new ObjectSet<>()); + } + + ObjectSet set = unlocked.get(content.getContentType()); + + return set.contains(content.getContentName()); } /** @@ -32,77 +39,59 @@ public class Unlocks{ * @return whether or not this content was newly unlocked. */ public boolean unlockContent(UnlockableContent content){ - return !rootSet().isUnlocked(content) && currentSet().unlockContent(content); - } + if(!content.canBeUnlocked() || content.alwaysUnlocked()) return false; - private ContentUnlockSet currentSet(){ - //client connected to server: always return the IP-specific set - if(Net.client()){ - return getSet(Net.getLastIP()); - }else if((world.getSector() != null || state.mode.infiniteResources) || state.is(State.menu)){ //sector-sandbox have shared set - return rootSet(); - }else{ //per-mode set - return getSet(state.mode.name()); + if(!unlocked.containsKey(content.getContentType())){ + unlocked.put(content.getContentType(), new ObjectSet<>()); } - } - private ContentUnlockSet rootSet(){ - return getSet("root"); - } + boolean ret = unlocked.get(content.getContentType()).add(content.getContentName()); - private ContentUnlockSet getSet(String name){ - if(!sets.containsKey(name)){ - sets.put(name, new ContentUnlockSet()); + //fire unlock event so other classes can use it + if(ret){ + content.onUnlock(); + Events.fire(new UnlockEvent(content)); + dirty = true; } - return sets.get(name); + + return ret; } /** Returns whether unlockables have changed since the last save.*/ public boolean isDirty(){ - for(ContentUnlockSet set : sets.values()){ - if(set.isDirty()){ - return true; - } - } - return false; + return dirty; } /** Clears all unlocked content. Automatically saves.*/ public void reset(){ - sets.clear(); save(); } - public void load(){ - sets.clear(); - - ObjectMap>> result = Settings.getObject("content-sets", ObjectMap.class, ObjectMap::new); - - for(Entry>> outer : result.entries()){ - ContentUnlockSet cset = new ContentUnlockSet(); - for (Entry> entry : outer.value.entries()){ - ObjectSet set = new ObjectSet<>(); - set.addAll(entry.value); - cset.getUnlocked().put(entry.key, set); + /**Loads 'legacy' unlocks. Will be removed in final release.*/ + public void tryLoadLegacy(){ + try{ + ObjectMap>> sets = Settings.getObject("content-sets", ObjectMap.class, ObjectMap::new); + for(Entry> entry : sets.get("root").entries()){ + unlocked.put(entry.key, new ObjectSet<>()); + unlocked.get(entry.key).addAll(entry.value); } - sets.put(outer.key, cset); + }catch(Throwable t){ + t.printStackTrace(); + } + Settings.prefs().remove("content-sets"); + Settings.save(); + } + + public void load(){ + unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new); + + if(Settings.has("content-sets")){ + tryLoadLegacy(); } } public void save(){ - ObjectMap>> output = new ObjectMap<>(); - - for(Entry centry : sets.entries()){ - ObjectMap> write = new ObjectMap<>(); - - for(Entry> entry : centry.value.getUnlocked().entries()){ - write.put(entry.key, entry.value.iterator().toArray()); - } - - output.put(centry.key, write); - } - - Settings.putObject("content-sets", output); + Settings.putObject("unlockset", unlocked); Settings.save(); } diff --git a/core/src/io/anuke/mindustry/game/Version.java b/core/src/io/anuke/mindustry/game/Version.java index e0d6ff304e..acc63bcc20 100644 --- a/core/src/io/anuke/mindustry/game/Version.java +++ b/core/src/io/anuke/mindustry/game/Version.java @@ -11,10 +11,10 @@ import java.io.IOException; public class Version{ /**Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used.*/ public static String type; - /**Number specifying the major version, e.g. '4.0'*/ - public static String number; /**Build modifier, e.g. 'alpha' or 'release'*/ 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.*/ public static int build = 0; @@ -26,7 +26,7 @@ public class Version{ PropertiesUtils.load(map, file.reader()); type = map.get("type"); - number = map.get("number"); + number = Integer.parseInt(map.get("number")); modifier = map.get("modifier"); build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; }catch(IOException e){ diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 2b34127e2a..5b679ccdf4 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -21,7 +21,7 @@ import static io.anuke.ucore.core.Core.camera; public class BlockRenderer{ private final static int initialRequests = 32 * 32; - private final static int expandr = 4; + private final static int expandr = 6; private FloorRenderer floorRenderer; diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java index 917bf12365..e900b2feef 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -80,7 +80,7 @@ public class MinimapRenderer implements Disposable{ for(Unit unit : units){ float rx = (unit.x - rect.x) / rect.width * w, ry = (unit.y - rect.y) / rect.width * h; Draw.color(unit.getTeam().color); - Draw.rect("white", x + rx, y + ry, w / (sz * 2), h / (sz * 2)); + Draw.crect(Draw.getBlankRegion(), x + rx, y + ry, w / (sz * 2), h / (sz * 2)); } Draw.color(); diff --git a/core/src/io/anuke/mindustry/graphics/Palette.java b/core/src/io/anuke/mindustry/graphics/Palette.java index 645df794e6..437a36034c 100644 --- a/core/src/io/anuke/mindustry/graphics/Palette.java +++ b/core/src/io/anuke/mindustry/graphics/Palette.java @@ -29,6 +29,7 @@ public class Palette{ lightishGray = Color.valueOf("a2a2a2"), darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f), + darkerGray = new Color(0.2f, 0.2f, 0.2f, 1f), boostTo = Color.valueOf("ffad4d"), boostFrom = Color.valueOf("ff7f57"), diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 84b1563b22..111b2f9718 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -25,7 +25,7 @@ import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.scene.Group; +import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Translator; @@ -145,7 +145,7 @@ public abstract class InputHandler extends InputAdapter{ return false; } - public void buildUI(Group group){ + public void buildUI(Table table){ } @@ -193,7 +193,7 @@ public abstract class InputHandler extends InputAdapter{ } //call tapped event - if(tile.getTeam() == player.getTeam()){ + if(!consumed && tile.getTeam() == player.getTeam()){ Call.onTileTapped(player, tile); } diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 0197d323e0..20a942da00 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -30,8 +30,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.*; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; -import io.anuke.ucore.scene.Group; -import io.anuke.ucore.scene.event.Touchable; +import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.*; @@ -208,78 +207,53 @@ public class MobileInput extends InputHandler implements GestureListener{ //region UI and drawing @Override - public void buildUI(Group group){ + public void buildUI(Table table){ + table.addImage("blank").color(Palette.accent).height(3f).colspan(4).growX(); + table.row(); + table.left().margin(0f).defaults().size(48f); - //Create confirm/cancel table - group.fill(c -> { - c.bottom().left().visible(() -> !state.is(State.menu)); + table.addImageButton("icon-break", "clear-toggle-partial", 16 * 2f, () -> { + mode = mode == breaking ? recipe == null ? none : placing : breaking; + lastRecipe = recipe; + if(mode == breaking){ + showGuide("deconstruction"); + } + }).update(l -> l.setChecked(mode == breaking)); - c.table("pane", act -> { - act.margin(5); - act.defaults().size(60f); + //rotate button + table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4)) + .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)) + .visible(() -> recipe != null && recipe.result.rotate); - //Add a cancel button - act.addImageButton("icon-cancel", 16*2f, () -> { - mode = none; - recipe = null; - }); + //cancel button + table.addImageButton("icon-cancel", "clear-partial", 16 * 2f, () -> { + player.clearBuilding(); + mode = none; + recipe = null; + }).visible(() -> player.isBuilding() || recipe != null); - act.row(); + //confirm button + table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> { + for(PlaceRequest request : selection){ + Tile tile = request.tile(); - //Add an accept button, which places everything. - act.addImageButton("icon-check", 16 * 2f, () -> { - for(PlaceRequest request : selection){ - Tile tile = request.tile(); - - //actually place/break all selected blocks - if(tile != null){ - if(!request.remove){ - rotation = request.rotation; - recipe = request.recipe; - tryPlaceBlock(tile.x, tile.y); - }else{ - tryBreakBlock(tile.x, tile.y); - } - } + //actually place/break all selected blocks + if(tile != null){ + if(!request.remove){ + rotation = request.rotation; + recipe = request.recipe; + tryPlaceBlock(tile.x, tile.y); + }else{ + tryBreakBlock(tile.x, tile.y); } + } + } - //move all current requests to removal array so they fade out - removals.addAll(selection); - selection.clear(); - selecting = false; - }).disabled(i -> selection.size == 0); - - act.row(); - - //Add a rotate button - act.addImageButton("icon-arrow", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4)) - .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)) - .disabled(i -> recipe == null || !recipe.result.rotate); - }).visible(() -> mode != none).touchable(Touchable.enabled); - - c.row(); - - c.table("pane", remove -> { - remove.defaults().size(60f); - - //Add a break button. - remove.addImageButton("icon-break", "toggle", 16 * 2f, () -> { - mode = mode == breaking ? recipe == null ? none : placing : breaking; - lastRecipe = recipe; - if(mode == breaking){ - showGuide("deconstruction"); - } - }).update(l -> l.setChecked(mode == breaking)); - }).margin(5).touchable(Touchable.enabled); - - c.table("pane", cancel -> { - cancel.defaults().size(60f); - - //Add a 'cancel building' button. - cancel.addImageButton("icon-cancel", 16 * 2f, player::clearBuilding); - - }).left().colspan(2).margin(5).touchable(Touchable.enabled).visible(() -> player.getPlaceQueue().size > 0); - }); + //move all current requests to removal array so they fade out + removals.addAll(selection); + selection.clear(); + selecting = false; + }).visible(() -> !selection.isEmpty()); } @Override @@ -554,7 +528,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //ignore off-screen taps if(cursor == null || ui.hasMouse(x, y)) return false; - threads.run(() -> checkTargets(worldx, worldy)); + checkTargets(worldx, worldy); //remove if request present if(hasRequest(cursor)){ @@ -574,14 +548,13 @@ public class MobileInput extends InputHandler implements GestureListener{ consumed = true; player.dropCarry(); //drop off unit }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){ - player.moveTarget = unit; - Effects.effect(Fx.select, unit.getX(), unit.getY()); - } - }); + if(unit != null){ + consumed = true; + player.moveTarget = unit; + Effects.effect(Fx.select, unit.getX(), unit.getY()); + } } } diff --git a/core/src/io/anuke/mindustry/io/Contributors.java b/core/src/io/anuke/mindustry/io/Contributors.java new file mode 100644 index 0000000000..f7c6e0f4b1 --- /dev/null +++ b/core/src/io/anuke/mindustry/io/Contributors.java @@ -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> success, Consumer fail){ + Net.http(contributorsURL, "GET", result -> { + JsonReader reader = new JsonReader(); + JsonValue value = reader.parse(result).child; + Array 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 + '\'' + + '}'; + } + } +} diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 6061472054..94b3f0825f 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -27,7 +27,6 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import static io.anuke.mindustry.Vars.*; @@ -332,31 +331,21 @@ public class TypeIO{ @WriteClass(String.class) public static void writeString(ByteBuffer buffer, String string){ if(string != null){ - Charset charset = Charset.defaultCharset(); - byte[] nameBytes = charset.name().getBytes(StandardCharsets.UTF_8); - buffer.put((byte)nameBytes.length); - buffer.put(nameBytes); - - byte[] bytes = string.getBytes(charset); + byte[] bytes = string.getBytes(StandardCharsets.UTF_8); buffer.putShort((short) bytes.length); buffer.put(bytes); }else{ - buffer.put((byte) -1); + buffer.putShort((short) -1); } } @ReadClass(String.class) public static String readString(ByteBuffer buffer){ - byte length = buffer.get(); - if(length != -1){ - byte[] cbytes = new byte[length]; - buffer.get(cbytes); - Charset charset = Charset.forName(new String(cbytes, StandardCharsets.UTF_8)); - - short slength = buffer.getShort(); + short slength = buffer.getShort(); + if(slength != -1){ byte[] bytes = new byte[slength]; buffer.get(bytes); - return new String(bytes, charset); + return new String(bytes, StandardCharsets.UTF_8); }else{ return null; } @@ -378,30 +367,20 @@ public class TypeIO{ public static void writeStringData(DataOutput buffer, String string) throws IOException{ if(string != null){ - Charset charset = Charset.defaultCharset(); - byte[] nameBytes = charset.name().getBytes(StandardCharsets.UTF_8); - buffer.writeByte((byte)nameBytes.length); - buffer.write(nameBytes); - - byte[] bytes = string.getBytes(charset); + byte[] bytes = string.getBytes(StandardCharsets.UTF_8); buffer.writeShort((short) bytes.length); buffer.write(bytes); }else{ - buffer.writeByte((byte) -1); + buffer.writeShort((short) -1); } } public static String readStringData(DataInput buffer) throws IOException{ - byte length = buffer.readByte(); - if(length != -1){ - byte[] cbytes = new byte[length]; - buffer.readFully(cbytes); - Charset charset = Charset.forName(new String(cbytes, StandardCharsets.UTF_8)); - - short slength = buffer.readShort(); + short slength = buffer.readShort(); + if(slength != -1){ byte[] bytes = new byte[slength]; buffer.readFully(bytes); - return new String(bytes, charset); + return new String(bytes, StandardCharsets.UTF_8); }else{ return null; } diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 3431873465..3dd485c41f 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -45,7 +45,7 @@ public class Save16 extends SaveFileVersion{ content.setTemporaryMapper(readContentHeader(stream)); - state.spawner.read(stream); + world.spawner.read(stream); readEntities(stream); @@ -71,7 +71,7 @@ public class Save16 extends SaveFileVersion{ writeContentHeader(stream); - state.spawner.write(stream); //spawnes + world.spawner.write(stream); //spawnes //--ENTITIES-- diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 05e1a03e37..1ad60c0e1d 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -32,4 +32,13 @@ public class Map{ public String getDisplayName(){ return meta.tags.get("name", name); } + + @Override + public String toString(){ + return "Map{" + + "name='" + name + '\'' + + ", custom=" + custom + + ", meta=" + meta + + '}'; + } } diff --git a/core/src/io/anuke/mindustry/maps/MapMeta.java b/core/src/io/anuke/mindustry/maps/MapMeta.java index 148ad5a099..2f13ee59b9 100644 --- a/core/src/io/anuke/mindustry/maps/MapMeta.java +++ b/core/src/io/anuke/mindustry/maps/MapMeta.java @@ -37,4 +37,13 @@ public class MapMeta{ public boolean hasOreGen(){ return !tags.get("oregen", "0").equals("0"); } + + @Override + public String toString(){ + return "MapMeta{" + + "tags=" + tags + + ", width=" + width + + ", height=" + height + + '}'; + } } diff --git a/core/src/io/anuke/mindustry/maps/TutorialSector.java b/core/src/io/anuke/mindustry/maps/TutorialSector.java index f88dbbabc9..b597cc9ec0 100644 --- a/core/src/io/anuke/mindustry/maps/TutorialSector.java +++ b/core/src/io/anuke/mindustry/maps/TutorialSector.java @@ -30,7 +30,7 @@ public class TutorialSector{ new ItemMission(Items.copper, 100).setMessage("$tutorial.morecopper"), new BlockMission(TurretBlocks.duo).setMessage("$tutorial.turret"), - //TODO fill turret with items mission + / //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 diff --git a/core/src/io/anuke/mindustry/maps/generation/Generation.java b/core/src/io/anuke/mindustry/maps/generation/Generation.java index 076815e0f9..3929a160ad 100644 --- a/core/src/io/anuke/mindustry/maps/generation/Generation.java +++ b/core/src/io/anuke/mindustry/maps/generation/Generation.java @@ -30,7 +30,6 @@ public class Generation{ return tiles[x][y]; } - //TODO implement Item drillItem(int x, int y, Drill block){ if(block.isMultiblock()){ Item result = null; diff --git a/core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java b/core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java deleted file mode 100644 index aef01f0688..0000000000 --- a/core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java +++ /dev/null @@ -1,77 +0,0 @@ -package io.anuke.mindustry.maps.generation.pathfinding; - -import com.badlogic.gdx.math.GridPoint2; -import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Queue; -import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.function.Predicate; -import io.anuke.ucore.util.Geometry; - -public class FlowPathFinder extends TilePathfinder{ - protected float[][] weights; - - public FlowPathFinder(Tile[][] tiles){ - super(tiles); - this.weights = new float[tiles.length][tiles[0].length]; - } - - @Override - public void search(Tile start, Tile end, Array out){ - - } - - public void search(Tile start, Predicate result, Array out){ - Queue queue = new Queue<>(); - - for(int i = 0; i < weights.length; i++){ - for(int j = 0; j < weights[0].length; j++){ - if(result.test(tiles[i][j])){ - weights[i][j] = 100000; - queue.addLast(tiles[i][j]); - }else{ - weights[i][j] = 0f; - } - } - } - - while(queue.size > 0){ - Tile tile = queue.first(); - for(GridPoint2 point : Geometry.d4){ - int nx = tile.x + point.x, ny = tile.y + point.y; - if(inBounds(nx, ny) && weights[nx][ny] < weights[tile.x][tile.y] - 1f && tiles[nx][ny].passable()){ - weights[nx][ny] = weights[tile.x][tile.y] - 1; - queue.addLast(tiles[nx][ny]); - if(result.test(tiles[nx][ny])){ - break; - } - } - } - } - - out.add(start); - while(true){ - Tile tile = out.peek(); - - Tile max = null; - float maxf = weights[tile.x][tile.y]; - for(GridPoint2 point : Geometry.d4){ - int nx = tile.x + point.x, ny = tile.y + point.y; - if(inBounds(nx, ny) && (weights[nx][ny] > maxf)){ - max = tiles[nx][ny]; - maxf = weights[nx][ny]; - - if(MathUtils.isEqual(maxf, 100000)){ - out.add(max); - return; - } - } - } - if(max == null){ - break; - } - out.add(max); - } - } - -} diff --git a/core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java b/core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java deleted file mode 100644 index a332f5a353..0000000000 --- a/core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.anuke.mindustry.maps.generation.pathfinding; - -import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.util.Structs; - -public abstract class TilePathfinder{ - protected Tile[][] tiles; - - public TilePathfinder(Tile[][] tiles){ - this.tiles = tiles; - } - - protected boolean inBounds(int x, int y){ - return Structs.inBounds(x, y, tiles); - } - - public abstract void search(Tile start, Tile end, Array out); -} diff --git a/core/src/io/anuke/mindustry/maps/missions/WaveMission.java b/core/src/io/anuke/mindustry/maps/missions/WaveMission.java index 5a257192a4..be7d83bf46 100644 --- a/core/src/io/anuke/mindustry/maps/missions/WaveMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/WaveMission.java @@ -1,14 +1,12 @@ package io.anuke.mindustry.maps.missions; import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.SpawnGroup; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Waves; import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.maps.generation.Generation; -import io.anuke.mindustry.net.Net; import io.anuke.ucore.util.Bundles; import static io.anuke.mindustry.Vars.*; @@ -62,9 +60,9 @@ public class WaveMission extends MissionWithStartingCore{ public String displayString(){ return state.wave > target ? Bundles.format( - Vars.unitGroups[Vars.waveTeam.ordinal()].size() > 1 && !Net.client() ? + state.enemies() > 1 ? "text.mission.wave.enemies" : - "text.mission.wave.enemy", target, target, Vars.unitGroups[Vars.waveTeam.ordinal()].size()) : + "text.mission.wave.enemy", target, target, state.enemies()) : Bundles.format("text.mission.wave", state.wave, target, (int)(state.wavetime/60)); } @@ -82,6 +80,6 @@ public class WaveMission extends MissionWithStartingCore{ @Override public boolean isComplete(){ - return state.wave > target && Vars.unitGroups[Vars.waveTeam.ordinal()].size() == 0; + return state.wave > target && state.enemies() == 0; } } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 14ab812242..0e152cb18e 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -66,7 +66,7 @@ public class Net{ }else if(error.contains("connection refused") || error.contains("route to host") || type.contains("unknownhost")){ error = Bundles.get("text.error.unreachable"); }else if(type.contains("timeout")){ - error = Bundles.get("text.error.timeout"); + error = Bundles.get("text.error.timedout"); }else if(error.equals("alreadyconnected")){ error = Bundles.get("text.error.alreadyconnected"); }else if(!error.isEmpty()){ diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 037d343a62..1d3ef834e7 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.utils.Base64Coder; 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 java.nio.ByteBuffer; @@ -65,6 +65,7 @@ public class Packets{ public static class ConnectPacket implements Packet{ public int version; + public String versionType; public String name, uuid, usid; public boolean mobile; public int color; @@ -72,8 +73,9 @@ public class Packets{ @Override public void write(ByteBuffer buffer){ buffer.putInt(Version.build); - IOUtils.writeString(buffer, name); - IOUtils.writeString(buffer, usid); + TypeIO.writeString(buffer, versionType); + TypeIO.writeString(buffer, name); + TypeIO.writeString(buffer, usid); buffer.put(mobile ? (byte) 1 : 0); buffer.putInt(color); buffer.put(Base64Coder.decode(uuid)); @@ -82,8 +84,9 @@ public class Packets{ @Override public void read(ByteBuffer buffer){ version = buffer.getInt(); - name = IOUtils.readString(buffer); - usid = IOUtils.readString(buffer); + versionType = TypeIO.readString(buffer); + name = TypeIO.readString(buffer); + usid = TypeIO.readString(buffer); mobile = buffer.get() == 1; color = buffer.getInt(); byte[] idbytes = new byte[8]; diff --git a/core/src/io/anuke/mindustry/type/AmmoEntry.java b/core/src/io/anuke/mindustry/type/AmmoEntry.java index a4e0559df1..d92c7963e5 100644 --- a/core/src/io/anuke/mindustry/type/AmmoEntry.java +++ b/core/src/io/anuke/mindustry/type/AmmoEntry.java @@ -1,8 +1,6 @@ package io.anuke.mindustry.type; -/** - * Used to store ammo amounts in units and turrets. - */ +/**Used to store ammo amounts in turrets.*/ public class AmmoEntry{ public AmmoType type; public int amount; diff --git a/core/src/io/anuke/mindustry/type/Category.java b/core/src/io/anuke/mindustry/type/Category.java index 6d75054b2f..6e5f7a621a 100644 --- a/core/src/io/anuke/mindustry/type/Category.java +++ b/core/src/io/anuke/mindustry/type/Category.java @@ -1,5 +1,24 @@ package io.anuke.mindustry.type; public enum Category{ - weapon, production, distribution, liquid, power, defense, crafting, units + /**Offensive turrets.*/ + turret, + /**Blocks that produce raw resources, such as drills.*/ + production, + /**Blocks that move items around.*/ + distribution, + /**Blocks that move liquids around.*/ + liquid, + /**Blocks that generate or transport power.*/ + power, + /**Walls and other defensive structures.*/ + defense, + /**Blocks that craft things.*/ + crafting, + /**Blocks that create units.*/ + units, + /**Things that upgrade the player such as mech pads.*/ + upgrade, + /**Things for storage or passive effects.*/ + effect } diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index c357e2d041..3dbb52fbe9 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -18,7 +18,7 @@ public class Liquid extends UnlockableContent{ public float flammability; /**temperature: 0.5 is 'room' temperature, 0 is very cold, 1 is molten hot*/ public float temperature = 0.5f; - /**how much heat this liquid can store. 0.75=water (high), anything lower is probably less dense and bad at cooling.*/ + /**how much heat this liquid can store. 0.4=water (decent), anything lower is probably less dense and bad at cooling.*/ public float heatCapacity = 0.5f; /**how thick this liquid is. 0.5=water (relatively viscous), 1 would be something like tar (very slow)*/ public float viscosity = 0.5f; diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index 007435cde1..f075f1c2e1 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -11,7 +11,6 @@ import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Bundles; -//TODO merge unit type with mech public class Mech extends UnlockableContent{ public final String name; public final String description; diff --git a/core/src/io/anuke/mindustry/type/Recipe.java b/core/src/io/anuke/mindustry/type/Recipe.java index eed821961c..daa84726e7 100644 --- a/core/src/io/anuke/mindustry/type/Recipe.java +++ b/core/src/io/anuke/mindustry/type/Recipe.java @@ -23,6 +23,7 @@ import static io.anuke.mindustry.Vars.*; public class Recipe extends UnlockableContent{ private static ObjectMap recipeMap = new ObjectMap<>(); + private static Array returnArray = new Array<>(); public final Block result; public final ItemStack[] requirements; @@ -55,34 +56,15 @@ public class Recipe extends UnlockableContent{ recipeMap.put(result, this); } - /** - * Returns unlocked recipes in a category. - * Do not call on the server backend, as unlocking does not exist! - */ - public static void getUnlockedByCategory(Category category, Array arr){ - if(headless){ - throw new RuntimeException("Not implemented on the headless backend!"); - } - - arr.clear(); - for(Recipe r : content.recipes()){ - if(r.category == category && (control.unlocks.isUnlocked(r)) && - !((r.mode != null && r.mode != state.mode) || !r.visibility.shown())){ - arr.add(r); - } - } - } - - /** - * Returns all recipes in a category. - */ - public static void getByCategory(Category category, Array r){ - r.clear(); + /**Returns all non-hidden recipes in a category.*/ + public static Array getByCategory(Category category){ + returnArray.clear(); for(Recipe recipe : content.recipes()){ - if(recipe.category == category){ - r.add(recipe); + if(recipe.category == category && recipe.visibility.shown() && (recipe.mode == state.mode || recipe.mode == null)){ + returnArray.add(recipe); } } + return returnArray; } public static Recipe getByResult(Block block){ @@ -109,7 +91,6 @@ public class Recipe extends UnlockableContent{ return this; } - @Override public boolean alwaysUnlocked(){ return alwaysUnlocked; diff --git a/core/src/io/anuke/mindustry/ui/ImageStack.java b/core/src/io/anuke/mindustry/ui/ImageStack.java new file mode 100644 index 0000000000..2ca0063e48 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/ImageStack.java @@ -0,0 +1,14 @@ +package io.anuke.mindustry.ui; + +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.layout.Stack; + +public class ImageStack extends Stack{ + + public ImageStack(TextureRegion... regions){ + for(TextureRegion region : regions){ + add(new Image(region)); + } + } +} diff --git a/core/src/io/anuke/mindustry/ui/ItemDisplay.java b/core/src/io/anuke/mindustry/ui/ItemDisplay.java new file mode 100644 index 0000000000..4530d606f0 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/ItemDisplay.java @@ -0,0 +1,18 @@ +package io.anuke.mindustry.ui; + +import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemStack; +import io.anuke.ucore.scene.ui.layout.Table; + +/**An item image with text.*/ +public class ItemDisplay extends Table{ + + public ItemDisplay(Item item){ + this(item, 0); + } + + public ItemDisplay(Item item, int amount){ + add(new ItemImage(new ItemStack(item, amount))).size(8*3); + add(item.localizedName()).padLeft(4); + } +} diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index 709c2903c2..130916cb26 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -18,10 +18,12 @@ public class ItemImage extends Stack{ } public ItemImage(ItemStack stack){ - Table t = new Table().left().bottom(); - t.add(stack.amount + ""); - add(new Image(stack.item.region)); - add(t); + + if(stack.amount != 0){ + Table t = new Table().left().bottom(); + t.add(stack.amount + ""); + add(t); + } } } diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java new file mode 100644 index 0000000000..f639dfe1c5 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java @@ -0,0 +1,14 @@ +package io.anuke.mindustry.ui; + +import io.anuke.mindustry.type.Liquid; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.layout.Table; + +/**An ItemDisplay, but for liquids.*/ +public class LiquidDisplay extends Table{ + + public LiquidDisplay(Liquid liquid){ + add(new Image(liquid.getContentIcon())).size(8*3); + add(liquid.localizedName()).padLeft(3); + } +} diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java index e4d2324560..3b27bcc252 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java @@ -2,7 +2,11 @@ package io.anuke.mindustry.ui.dialogs; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.utils.Array; 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.LinkEntry; import io.anuke.ucore.core.Core; @@ -18,11 +22,14 @@ import static io.anuke.mindustry.Vars.ios; import static io.anuke.mindustry.Vars.ui; public class AboutDialog extends FloatingDialog{ + private Array contributors = new Array<>(); private static ObjectSet bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds", "trello"); public AboutDialog(){ super("$text.about.button"); + Contributors.getContributors(out -> contributors = out, Throwable::printStackTrace); + shown(this::setup); onResize(this::setup); } @@ -94,7 +101,24 @@ public class AboutDialog extends FloatingDialog{ public void showCredits(){ FloatingDialog dialog = new FloatingDialog("$text.credits"); 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(); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 077cd57de9..2c9bf76d3b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -28,7 +28,6 @@ public class HostDialog extends FloatingDialog{ content().table(t -> { t.add("$text.name").padRight(10); t.addField(Settings.getString("name"), text -> { - if(text.isEmpty()) return; player.name = text; Settings.put("name", text); Settings.save(); @@ -50,6 +49,11 @@ public class HostDialog extends FloatingDialog{ content().add().width(65f); content().addButton("$text.host", () -> { + if(Settings.getString("name").trim().isEmpty()){ + ui.showInfo("$text.noname"); + return; + } + ui.loadfrag.show("$text.hosting"); Timers.runTask(5f, () -> { try{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index d0ce1a574b..d844d18c5d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -205,7 +205,6 @@ public class JoinDialog extends FloatingDialog{ content().table(t -> { t.add("$text.name").padRight(10); t.addField(Settings.getString("name"), text -> { - if(text.isEmpty()) return; player.name = text; Settings.put("name", text); Settings.save(); @@ -285,6 +284,11 @@ public class JoinDialog extends FloatingDialog{ } void connect(String ip, int port){ + if(Settings.getString("name").trim().isEmpty()){ + ui.showInfo("$text.noname"); + return; + } + ui.loadfrag.show("$text.connecting"); ui.loadfrag.setButton(() -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java index 4d9411c4df..8b46947740 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java @@ -6,10 +6,10 @@ import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.type.ContentType; -import io.anuke.mindustry.world.meta.StatValue; import io.anuke.ucore.scene.event.HandCursorListener; import io.anuke.ucore.scene.ui.Image; import io.anuke.ucore.scene.ui.ScrollPane; +import io.anuke.ucore.scene.ui.Tooltip; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.utils.UIUtils; @@ -65,7 +65,10 @@ public class UnlocksDialog extends FloatingDialog{ if(control.unlocks.isUnlocked(unlock)){ image.clicked(() -> Vars.ui.content.show(unlock)); - StatValue.addToolTip(image, unlock); + image.addListener(new Tooltip<>(new Table("clear"){{ + add(unlock.localizedName()); + margin(4); + }})); } if((++count) % maxWidth == 0){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 6faed6e1ba..e193b04ed2 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -180,7 +180,9 @@ public class BlockInventoryFragment extends Fragment{ private String round(float f){ f = (int) f; - if(f >= 1000){ + if(f >= 1000000){ + return Strings.toFixed(f / 1000000f, 1) + "[gray]mil[]"; + }else if(f >= 1000){ return Strings.toFixed(f / 1000, 1) + "k"; }else{ return (int) f + ""; diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java deleted file mode 100644 index 2d6b439442..0000000000 --- a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java +++ /dev/null @@ -1,349 +0,0 @@ -package io.anuke.mindustry.ui.fragments; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.math.Interpolation; -import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.game.EventType.WorldLoadEvent; -import io.anuke.mindustry.input.InputHandler; -import io.anuke.mindustry.type.Category; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.type.Recipe; -import io.anuke.ucore.core.Core; -import io.anuke.ucore.core.Events; -import io.anuke.ucore.core.Graphics; -import io.anuke.ucore.scene.Element; -import io.anuke.ucore.scene.Group; -import io.anuke.ucore.scene.actions.Actions; -import io.anuke.ucore.scene.event.ClickListener; -import io.anuke.ucore.scene.event.InputEvent; -import io.anuke.ucore.scene.event.Touchable; -import io.anuke.ucore.scene.ui.*; -import io.anuke.ucore.scene.ui.layout.Stack; -import io.anuke.ucore.scene.ui.layout.Table; -import io.anuke.ucore.util.Mathf; -import io.anuke.ucore.util.Strings; - -import static io.anuke.mindustry.Vars.*; - -public class BlocksFragment extends Fragment{ - //number of block icon rows - private static final int rows = 4; - //number of category button rows - private static final int secrows = 4; - //size of each block icon - private static final float size = 48; - //maximum recipe rows - private static final int maxrow = 3; - /** Table containing description that is shown on top.*/ - private Table descTable; - /** Main table containing the whole menu.*/ - private Table mainTable; - /** Table for all section buttons and blocks.*/ - private Table selectTable; - /** Whether the whole thing is shown or hidden by the popup button.*/ - private boolean shown = true; - /** Recipe currently hovering over.*/ - private Recipe hoverRecipe; - /** Last category selected.*/ - private Category lastCategory; - /** Last block pane scroll Y position.*/ - private float lastScroll; - /** Temporary recipe array for storage*/ - private Array recipes = new Array<>(); - - public void build(Group parent){ - InputHandler input = control.input(0); - - parent.fill(container -> { - container.bottom().right().visible(() -> !state.is(State.menu)); - - mainTable = container.table(main -> { - - //add top description table - descTable = new Table("button"); - descTable.visible(() -> (hoverRecipe != null || input.recipe != null) && shown); //make sure it's visible when necessary - descTable.update(() -> { - if(state.is(State.menu)){ - descTable.clear(); - control.input(0).recipe = null; - } - // note: This is required because there is no direct connection between input.recipe and the description ui. - // If input.recipe gets set to null, a proper cleanup of the ui elements is required. - boolean anyRecipeShown = input.recipe != null || hoverRecipe != null; - boolean descriptionTableClean = descTable.getChildren().size == 0; - boolean cleanupRequired = (!anyRecipeShown && !descriptionTableClean); - if(cleanupRequired){ - descTable.clear(); - } - }); - - float w = 246f; - - main.add(descTable).width(w); - - main.row(); - - //now add the block selection menu - selectTable = main.table("pane", select -> {}) - .margin(10f).marginLeft(0f).marginRight(0f).marginTop(-5) - .touchable(Touchable.enabled).right().bottom().width(w).get(); - - }).bottom().right().get(); - }); - - Events.on(WorldLoadEvent.class, event -> rebuild()); - - rebuild(); - } - - /**Rebuilds the whole placement menu, attempting to preserve previous state.*/ - void rebuild(){ - selectTable.clear(); - - InputHandler input = control.input(0); - Stack stack = new Stack(); - ButtonGroup group = new ButtonGroup<>(); - Table catTable = selectTable; - - int cati = 0; - int checkedi = 0; - int rowsUsed = 0; - - //add categories - for(Category cat : Category.values()){ - //get recipes out by category - Recipe.getUnlockedByCategory(cat, recipes); - - //empty section, nothing to see here - if(recipes.size == 0){ - continue; - } - - //table where actual recipes go - Table recipeTable = new Table(); - recipeTable.margin(4).top().left().marginRight(15); - - //add a new row here when needed - if(cati == secrows){ - catTable = new Table(); - selectTable.row(); - selectTable.add(catTable).colspan(secrows).padTop(-5).growX(); - } - - //add category button - ImageButton catb = catTable.addImageButton("icon-" + cat.name(), "toggle", 40, () -> { - if(!recipeTable.isVisible() && input.recipe != null){ - input.recipe = null; - } - lastCategory = cat; - stack.act(Gdx.graphics.getDeltaTime()); - stack.act(Gdx.graphics.getDeltaTime()); - }).growX().height(54).group(group) - .name("sectionbutton" + cat.name()).get(); - - if(lastCategory == cat || lastCategory == null){ - checkedi = cati; - lastCategory = cat; - } - - //scrollpane for recipes - ScrollPane pane = new ScrollPane(recipeTable, "clear-black"); - pane.setOverscroll(false, false); - pane.visible(catb::isChecked); - pane.setScrollYForce(lastScroll); - pane.update(() -> { - Element e = Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true); - if(e != null && e.isDescendantOf(pane)){ - Core.scene.setScrollFocus(pane); - }else if(Core.scene.getScrollFocus() == pane){ - Core.scene.setScrollFocus(null); - } - - if(lastCategory == cat){ - lastScroll = pane.getVisualScrollY(); - } - }); - stack.add(pane); - - int i = 0; - - //add actual recipes - for(Recipe r : recipes){ - if((r.mode != null && r.mode != state.mode) || !r.visibility.shown()) continue; - - ImageButton image = new ImageButton(new TextureRegion(), "select"); - - TextureRegion[] regions = r.result.getCompactIcon(); - Stack istack = new Stack(); - for(TextureRegion region : regions){ - Image u = new Image(region); - u.update(() -> u.setColor(istack.getColor())); - istack.add(u); - } - - image.getImageCell().setActor(istack).size(size); - image.addChild(istack); - image.setTouchable(Touchable.enabled); - image.getImage().remove(); - - image.addListener(new ClickListener(){ - @Override - public void enter(InputEvent event, float x, float y, int pointer, Element fromActor){ - super.enter(event, x, y, pointer, fromActor); - if(hoverRecipe != r){ - hoverRecipe = r; - updateRecipe(r); - } - } - - @Override - public void exit(InputEvent event, float x, float y, int pointer, Element toActor){ - super.exit(event, x, y, pointer, toActor); - hoverRecipe = null; - updateRecipe(input.recipe); - } - }); - - image.clicked(() -> { - // note: input.recipe only gets set here during a click. - // during a hover only the visual description will be updated. - InputHandler handler = mobile ? input : control.input(0); - - boolean nothingSelectedYet = handler.recipe == null; - boolean selectedSomethingElse = !nothingSelectedYet && handler.recipe != r; - boolean shouldMakeSelection = nothingSelectedYet || selectedSomethingElse; - if(shouldMakeSelection){ - handler.recipe = r; - hoverRecipe = r; - updateRecipe(r); - }else{ - handler.recipe = null; - hoverRecipe = null; - updateRecipe(null); - } - }); - - recipeTable.add(image).size(size + 8); - - image.update(() -> { - image.setChecked(r == control.input(0).recipe); - TileEntity entity = players[0].getClosestCore(); - - if(entity == null) return; - - if(!state.mode.infiniteResources){ - for(ItemStack s : r.requirements){ - if(!entity.items.has(s.item, Mathf.ceil(s.amount))){ - istack.setColor(Color.GRAY); - return; - } - } - } - istack.setColor(Color.WHITE); - }); - - if(i % rows == rows - 1){ - rowsUsed = Math.max((i + 1) / rows, rowsUsed); - recipeTable.row(); - } - - i++; - } - - cati++; - } - - if(group.getButtons().size > 0){ - group.getButtons().get(checkedi).setChecked(true); - } - - selectTable.row(); - selectTable.add(stack).growX().left().top().colspan(Category.values().length).padBottom(-5).height((size + 12) * Math.min(rowsUsed, 3)); - } - - void toggle(float t, Interpolation ip){ - if(shown){ - shown = false; - mainTable.actions(Actions.translateBy(0, mainTable.getTranslation().y + (-mainTable.getHeight() - descTable.getHeight()), t, ip)); - }else{ - shown = true; - mainTable.actions(Actions.translateBy(0, -mainTable.getTranslation().y, t, ip)); - } - } - - private void updateRecipe(Recipe recipe){ - if(recipe == null){ - descTable.clear(); - return; - } - - descTable.clear(); - descTable.setTouchable(Touchable.enabled); - - descTable.defaults().left(); - descTable.left(); - descTable.margin(12); - - Table header = new Table(); - - descTable.add(header).left(); - - descTable.row(); - - TextureRegion[] regions = recipe.result.getCompactIcon(); - - Stack istack = new Stack(); - - for(TextureRegion region : regions) istack.add(new Image(region)); - - header.add(istack).size(8 * 5).padTop(4); - Label nameLabel = new Label(recipe.result.formalName); - nameLabel.setWrap(true); - header.add(nameLabel).padLeft(2).width(120f); - - header.addButton("?", () -> ui.content.show(recipe)).expandX().padLeft(3).top().right().size(40f, 44f).padTop(-2); - - descTable.add().pad(2); - - Table requirements = new Table(); - - descTable.row(); - - descTable.left(); - descTable.add(requirements); - - for(ItemStack stack : recipe.requirements){ - requirements.addImage(stack.item.region).size(8 * 3); - Label reqlabel = new Label(() -> { - TileEntity core = players[0].getClosestCore(); - if(core == null || state.mode.infiniteResources) return "*/*"; - - int amount = core.items.get(stack.item); - String color = (amount < stack.amount / 2f ? "[red]" : amount < stack.amount ? "[accent]" : "[white]"); - - return color + format(amount) + "[white]/" + stack.amount; - }); - - requirements.add(reqlabel).left(); - requirements.row(); - } - - descTable.row(); - } - - String format(int number){ - if(number >= 1000000){ - return Strings.toFixed(number / 1000000f, 1) + "[gray]mil[]"; - }else if(number >= 10000){ - return number / 1000 + "[gray]k[]"; - }else if(number >= 1000){ - return Strings.toFixed(number / 1000f, 1) + "[gray]k[]"; - }else{ - return number + ""; - } - } -} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index b2deb85ce9..0aa55b3a29 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -32,7 +32,7 @@ import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.*; public class HudFragment extends Fragment{ - public final BlocksFragment blockfrag = new BlocksFragment(); + public final PlacementFragment blockfrag = new PlacementFragment(); private ImageButton menu, flip; private Stack wavetable; @@ -224,7 +224,6 @@ public class HudFragment extends Fragment{ /**Show unlock notification for a new recipe.*/ public void showUnlock(Recipe recipe){ - blockfrag.rebuild(); //if there's currently no unlock notification... if(lastUnlockTable == null){ @@ -366,10 +365,10 @@ public class HudFragment extends Fragment{ table.labelWrap(() -> world.getSector() == null ? - (unitGroups[waveTeam.ordinal()].size() > 0 && state.mode.disableWaveTimer ? - wavef.get(state.wave) + "\n" + (unitGroups[waveTeam.ordinal()].size() == 1 ? - enemyf.get(unitGroups[waveTeam.ordinal()].size()) : - enemiesf.get(unitGroups[waveTeam.ordinal()].size())) : + (state.enemies() > 0 && state.mode.disableWaveTimer ? + wavef.get(state.wave) + "\n" + (state.enemies() == 1 ? + enemyf.get(state.enemies()) : + enemiesf.get(state.enemies())) : wavef.get(state.wave) + "\n" + (!state.mode.disableWaveTimer ? Bundles.format("text.wave.waiting", (int)(state.wavetime/60)) : diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index b26b728ae0..b50ff4d6db 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.ucore.core.Events; import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Strings; import static io.anuke.mindustry.Vars.*; @@ -42,7 +43,7 @@ public class MenuFragment extends Fragment{ } //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))); } @@ -55,14 +56,14 @@ public class MenuFragment extends Fragment{ container.defaults().size(size).pad(5).padTop(4f); MobileButton - play = new MobileButton("icon-play-2", isize, "$text.play", this::showPlaySelect), - maps = new MobileButton("icon-map", isize, "$text.maps", ui.maps::show), - load = new MobileButton("icon-load", isize, "$text.load", ui.load::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)), - tools = new MobileButton("icon-tools", isize, "$text.settings", ui.settings::show), - unlocks = new MobileButton("icon-unlocks", isize, "$text.unlocks", ui.unlocks::show), - donate = new MobileButton("icon-donate", isize, "$text.donate", Platform.instance::openDonations); + play = new MobileButton("icon-play-2", isize, "$text.play", this::showPlaySelect), + maps = new MobileButton("icon-map", isize, "$text.maps", ui.maps::show), + load = new MobileButton("icon-load", isize, "$text.load", ui.load::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)), + tools = new MobileButton("icon-tools", isize, "$text.settings", ui.settings::show), + unlocks = new MobileButton("icon-unlocks", isize, "$text.unlocks", ui.unlocks::show), + donate = new MobileButton("icon-donate", isize, "$text.donate", Platform.instance::openDonations); if(Gdx.graphics.getWidth() > Gdx.graphics.getHeight()){ container.add(play); diff --git a/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java b/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java index fd861518ad..f19ec137a4 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java @@ -31,7 +31,7 @@ public class OverlayFragment extends Fragment{ config.build(group); consume.build(group); - input.buildUI(group); + //input.buildUI(group); } public void remove(){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java new file mode 100644 index 0000000000..f3923079d8 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -0,0 +1,238 @@ +package io.anuke.mindustry.ui.fragments; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Interpolation; +import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.input.InputHandler; +import io.anuke.mindustry.type.Category; +import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.type.Recipe; +import io.anuke.mindustry.ui.ImageStack; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.OreBlock; +import io.anuke.ucore.core.Events; +import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.scene.Group; +import io.anuke.ucore.scene.actions.Actions; +import io.anuke.ucore.scene.event.Touchable; +import io.anuke.ucore.scene.ui.ButtonGroup; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.ImageButton; +import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Bundles; + +import static io.anuke.mindustry.Vars.*; + +public class PlacementFragment extends Fragment{ + final int rowWidth = 4; + + Category currentCategory = Category.turret; + Block hovered, lastDisplay; + Tile hoverTile; + Table blockTable, toggler; + boolean shown = true; + + public PlacementFragment(){ + Events.on(WorldLoadGraphicsEvent.class, event -> { + Group group = toggler.getParent(); + toggler.remove(); + build(group); + }); + } + + @Override + public void build(Group parent){ + parent.fill(full -> { + toggler = full; + full.bottom().right().visible(() -> !state.is(State.menu)); + + full.table(frame -> { + InputHandler input = control.input(0); + + //rebuilds the category table with the correct recipes + Runnable rebuildCategory = () -> { + blockTable.clear(); + blockTable.top().margin(5); + + int index = 0; + + ButtonGroup group = new ButtonGroup<>(); + group.setMinCheckCount(0); + + for(Recipe recipe : Recipe.getByCategory(currentCategory)){ + + if(index++ % rowWidth == 0){ + blockTable.row(); + } + + boolean[] unlocked = {false}; + + ImageButton button = blockTable.addImageButton("icon-locked", "select", 8*4, () -> { + if(control.unlocks.isUnlocked(recipe)){ + input.recipe = input.recipe == recipe ? null : recipe; + } + }).size(46f).group(group).get(); + + button.update(() -> { //color unplacable things gray + boolean ulock = control.unlocks.isUnlocked(recipe); + TileEntity core = players[0].getClosestCore(); + Color color = core != null && (core.items.has(recipe.requirements) || state.mode.infiniteResources) ? Color.WHITE : ulock ? Color.GRAY : Color.WHITE; + button.forEach(elem -> elem.setColor(color)); + button.setChecked(input.recipe == recipe); + + if(ulock == unlocked[0]) return; + unlocked[0] = ulock; + + if(!ulock){ + button.replaceImage(new Image("icon-locked")); + }else{ + button.replaceImage(new ImageStack(recipe.result.getCompactIcon())); + } + }); + + button.hovered(() -> hovered = recipe.result); + button.exited(() -> { + if(hovered == recipe.result){ + hovered = null; + } + }); + } + blockTable.act(0f); + }; + + //top table with hover info + frame.table("clear", top -> { + top.add(new Table()).growX().update(topTable -> { + if((tileDisplayBlock() == null && lastDisplay == getSelected()) || + (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return; + + topTable.clear(); + topTable.top().left().margin(5); + + lastDisplay = getSelected(); + + if(lastDisplay != null){ //show selected recipe + topTable.table(header -> { + header.left(); + header.add(new ImageStack(lastDisplay.getCompactIcon())).size(8*4); + header.labelWrap(() -> + !control.unlocks.isUnlocked(Recipe.getByResult(lastDisplay)) ? Bundles.get("text.blocks.unknown") : lastDisplay.formalName) + .left().width(190f).padLeft(5); + header.add().growX(); + if(control.unlocks.isUnlocked(Recipe.getByResult(lastDisplay))){ + header.addButton("?", "clear-partial", () -> ui.content.show(Recipe.getByResult(lastDisplay))) + .size(8 * 5).padTop(-5).padRight(-5).right().grow(); + } + }).growX().left(); + topTable.row(); + //add requirement table + topTable.table(req -> { + req.top().left(); + + for(ItemStack stack : Recipe.getByResult(lastDisplay).requirements){ + req.table(line -> { + line.left(); + line.addImage(stack.item.region).size(8*2); + line.add(stack.item.localizedName()).color(Color.LIGHT_GRAY).padLeft(2).left(); + line.labelWrap(() -> { + TileEntity core = players[0].getClosestCore(); + if(core == null || state.mode.infiniteResources) return "*/*"; + + int amount = core.items.get(stack.item); + String color = (amount < stack.amount / 2f ? "[red]" : amount < stack.amount ? "[accent]" : "[white]"); + + return color + ui.formatAmount(amount) + "[white]/" + stack.amount; + }).padLeft(5); + }).left(); + req.row(); + } + }).growX().left().margin(3); + + }else if(tileDisplayBlock() != null){ //show selected tile + lastDisplay = tileDisplayBlock(); + topTable.add(new ImageStack(lastDisplay.getDisplayIcon(hoverTile))).size(8*4); + topTable.labelWrap(lastDisplay.getDisplayName(hoverTile)).left().width(190f).padLeft(5); + } + }); + top.row(); + top.addImage("blank").growX().color(Palette.accent).height(3f); + }).colspan(3).fillX().visible(() -> getSelected() != null || tileDisplayBlock() != null).touchable(Touchable.enabled); + frame.row(); + frame.table("clear", blocksSelect -> { + blocksSelect.table(blocks -> blockTable = blocks).grow(); + blocksSelect.row(); + blocksSelect.table(input::buildUI).growX(); + }).fillY().bottom().touchable(Touchable.enabled); + frame.addImage("blank").width(3f).fillY().color(Palette.accent); + frame.table(categories -> { + categories.defaults().size(50f); + + ButtonGroup group = new ButtonGroup<>(); + + for(Category cat : Category.values()){ + if(Recipe.getByCategory(cat).isEmpty()) continue; + + categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16*2, () -> { + currentCategory = cat; + rebuildCategory.run(); + }).group(group); + + if(cat.ordinal() %2 == 1) categories.row(); + } + }).touchable(Touchable.enabled); + + rebuildCategory.run(); + }); + }); + } + + /**Returns the currently displayed block in the top box.*/ + Block getSelected(){ + Block toDisplay = null; + + //setup hovering tile + if(!ui.hasMouse()){ + Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y); + if(tile != null){ + hoverTile = tile.target(); + }else{ + hoverTile = null; + } + }else{ + hoverTile = null; + } + + //block currently selected + if(control.input(0).recipe != null){ + toDisplay = control.input(0).recipe.result; + } + + //block hovered on in build menu + if(hovered != null){ + toDisplay = hovered; + } + + return toDisplay; + } + + /**Returns the block currently being hovered over in the world.*/ + Block tileDisplayBlock(){ + return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.floor() instanceof OreBlock ? hoverTile.floor() : null; + } + + /**Show or hide the placement menu.*/ + void toggle(float t, Interpolation ip){ + toggler.clearActions(); + if(shown){ + shown = false; + toggler.actions(Actions.translateBy(toggler.getTranslation().x + toggler.getWidth(), 0, t, ip)); + }else{ + shown = true; + toggler.actions(Actions.translateBy(-toggler.getTranslation().x, 0, t, ip)); + } + } +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/world/BaseBlock.java b/core/src/io/anuke/mindustry/world/BaseBlock.java index 6b3ef027e7..804f12703c 100644 --- a/core/src/io/anuke/mindustry/world/BaseBlock.java +++ b/core/src/io/anuke/mindustry/world/BaseBlock.java @@ -43,7 +43,7 @@ public abstract class BaseBlock extends MappableContent{ /**Returns the amount of items this block can accept.*/ public int acceptStack(Item item, int amount, Tile tile, Unit source){ 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{ return 0; } diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index e12050bbb5..6530d5228a 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -335,7 +335,6 @@ public class Block extends BaseBlock { if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity, StatUnit.items); } - //TODO make this easier to config. public void setBars(){ if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); if(hasLiquids) @@ -452,6 +451,14 @@ public class Block extends BaseBlock { } } + public String getDisplayName(Tile tile){ + return formalName; + } + + public TextureRegion getDisplayIcon(Tile tile){ + return getEditorIcon(); + } + public TextureRegion getEditorIcon(){ if(editorIcon == null){ editorIcon = Draw.region("block-icon-" + name, Draw.region("clear")); diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index b75b89e433..b6b87da8d7 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -241,7 +241,7 @@ public class Tile implements PosTrait, TargetTrait{ if(link == 0){ return (block.destructible || block.breakable || block.update); }else{ - return getLinked() != this && getLinked().breakable(); + return getLinked() != this && getLinked().getLinked() == null && getLinked().breakable(); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index e2fe0f5865..2d23ec889b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -16,6 +16,7 @@ import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.input.CursorType; +import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.BarType; @@ -26,6 +27,7 @@ import io.anuke.mindustry.world.modules.ItemModule; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; import java.io.DataInput; @@ -40,7 +42,7 @@ public class BuildBlock extends Block{ super(name); update = true; size = Integer.parseInt(name.charAt(name.length() - 1) + ""); - health = 1; + health = 10; layer = Layer.placement; consumesTap = true; solidifes = true; @@ -68,6 +70,18 @@ public class BuildBlock extends Block{ } } + @Override + public String getDisplayName(Tile tile){ + BuildEntity entity = tile.entity(); + return Bundles.format("block.constructing", entity.recipe == null ? entity.previous.formalName : entity.recipe.result.formalName); + } + + @Override + public TextureRegion getDisplayIcon(Tile tile){ + BuildEntity entity = tile.entity(); + return (entity.recipe == null ? entity.previous : entity.recipe.result).getEditorIcon(); + } + @Override public boolean isSolidFor(Tile tile){ BuildEntity entity = tile.entity(); @@ -104,15 +118,6 @@ public class BuildBlock extends Block{ } } - @Override - public void afterDestroyed(Tile tile, TileEntity e){ - BuildEntity entity = (BuildEntity) e; - - if(entity.previous != null && entity.previous.synthetic()){ - tile.setBlock(entity.previous); - } - } - @Override public void draw(Tile tile){ BuildEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index fd4d581f2d..8c27abc074 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -181,7 +181,7 @@ public class Floor extends Block{ Floor floor = other.floor(); - if((floor.id <= this.id && !(tile.getElevation() != -1 && other.getElevation() > tile.getElevation())) || (!blends.test(floor) && !tileBlends.test(tile, other)) || (floor.cacheLayer.ordinal() > this.cacheLayer.ordinal() && !sameLayer) || + if(floor.edgeRegions == null || (floor.id <= this.id && !(tile.getElevation() != -1 && other.getElevation() > tile.getElevation())) || (!blends.test(floor) && !tileBlends.test(tile, other)) || (floor.cacheLayer.ordinal() > this.cacheLayer.ordinal() && !sameLayer) || (sameLayer && floor.cacheLayer == this.cacheLayer)) continue; TextureRegion region = floor.edgeRegions[i]; diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index 7333c7dcd2..6abb723921 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -24,6 +24,11 @@ public class OreBlock extends Floor{ this.edge = base.name; } + @Override + public String getDisplayName(Tile tile){ + return drops.item.localizedName(); + } + @Override public TextureRegion getEditorIcon(){ if(editorIcon == null){ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java index 9027fb632c..88359454cc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.NumberUtils; import io.anuke.mindustry.entities.TileEntity; 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.meta.BlockGroup; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.function.Consumer; import io.anuke.ucore.util.Bits; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; public class Junction extends Block{ 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){ JunctionEntity entity = tile.entity(); - for(int i = 0; i < 2; i++){ - Buffer buffer = (i == 0 ? entity.bx : entity.by); + for(int i = 0; i < 4; i++){ + Buffer buffer = entity.buffers[i]; if(buffer.index > 0){ 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){ - int val = Bits.getRightInt(l); - - Item item = content.item(Bits.getLeftShort(val)); - int direction = Bits.getRightShort(val); - Tile dest = tile.getNearby(direction); + Item item = content.item(Bits.getRightInt(l)); + Tile dest = tile.getNearby(i); + //skip blocks that don't want the item, keep waiting until they do 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; } @@ -69,25 +61,19 @@ public class Junction extends Block{ @Override public void handleItem(Item item, Tile tile, Tile source){ JunctionEntity entity = tile.entity(); - boolean x = tile.x == source.x; - long value = Bits.packLong(NumberUtils.floatToIntBits(Timers.time()), Bits.packInt((short) item.id, source.relativeTo(tile.x, tile.y))); - if(x){ - entity.bx.add(value); - }else{ - entity.by.add(value); - } + long value = Bits.packLong(NumberUtils.floatToIntBits(Timers.time()), item.id); + int relative = source.relativeTo(tile.x, tile.y); + entity.buffers[relative].add(value); } @Override public boolean acceptItem(Item item, Tile tile, Tile source){ 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; - int dir = source.relativeTo(tile.x, tile.y); - if(dir == -1) return false; - Tile to = tile.getNearby(dir); + Tile to = tile.getNearby(relative); return to != null && to.block().acceptItem(item, to, tile); } @@ -96,41 +82,8 @@ public class Junction extends Block{ return new JunctionEntity(); } - @Override - public Array getDebugInfo(Tile tile){ - JunctionEntity entity = tile.entity(); - Array arr = super.getDebugInfo(tile); - for(int i = 0; i < 4; i++){ - arr.add("nearby." + i); - arr.add(tile.getNearby(i)); - } - - Consumer 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{ - Buffer bx = new Buffer(); - Buffer by = new Buffer(); + Buffer[] buffers = {new Buffer(), new Buffer(), new Buffer(), new Buffer()}; } class Buffer{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index f9da9999b8..e99769ffd6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -45,8 +45,6 @@ public class Sorter extends Block implements SelectionTrait{ public void draw(Tile tile){ super.draw(tile); - //TODO call event for change - SorterEntity entity = tile.entity(); Draw.color(entity.sortItem.color); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index fa1a44c5cf..9aac369832 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -5,7 +5,6 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; -import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.ucore.core.Effects; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; @@ -30,7 +29,6 @@ public abstract class ItemLiquidGenerator extends ItemGenerator{ @Override public void init(){ super.init(); - stats.remove(BlockStat.liquidFuelUse); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index b0c90960eb..490391b3d6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -5,7 +5,6 @@ import com.badlogic.gdx.utils.IntSet; import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.Queue; import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.core.Timers; import static io.anuke.mindustry.Vars.threads; @@ -38,38 +37,63 @@ public class PowerGraph{ lastFrameUpdated = threads.getFrameID(); - float totalInput = 0f; + boolean charge = false; + float totalInput = 0f; + float bufferInput = 0f; for(Tile producer : producers){ - totalInput += producer.entity.power.amount; + if(producer.block().consumesPower){ + bufferInput += producer.entity.power.amount; + }else{ + totalInput += producer.entity.power.amount; + } } - for(Tile producer : producers){ - float accumulator = producer.entity.power.amount; - - if(accumulator <= 0.0001f) continue; - - float toEach = accumulator / consumers.size; - float outputs = 0f; - - for(Tile tile : consumers){ - outputs += Math.min(tile.block().powerCapacity - tile.entity.power.amount, toEach) / toEach; + float maxOutput = 0f; + float bufferOutput = 0f; + for(Tile consumer : consumers){ + if(consumer.block().outputsPower){ + bufferOutput += consumer.block().powerCapacity - consumer.entity.power.amount; + }else{ + maxOutput += consumer.block().powerCapacity - consumer.entity.power.amount; } + } - float finalEach = toEach / outputs * Timers.delta(); - float buffer = 0f; + if(maxOutput < totalInput){ + charge = true; + } - if(Float.isNaN(finalEach) || Float.isInfinite(finalEach)){ + if(totalInput + bufferInput <= 0.0001f || maxOutput + bufferOutput <= 0.0001f){ + return; + } + + float bufferUsed; + if(charge){ + bufferUsed = Math.min((totalInput - maxOutput) / bufferOutput, 1f); + }else{ + bufferUsed = Math.min((maxOutput - totalInput) / bufferInput, 1f); + } + + float inputUsed = charge ? Math.min((maxOutput + bufferOutput) / totalInput, 1f) : 1f; + for(Tile producer : producers){ + if(producer.block().consumesPower){ + if(!charge){ + producer.entity.power.amount -= producer.entity.power.amount * bufferUsed; + } continue; } + producer.entity.power.amount -= producer.entity.power.amount * inputUsed; + } - for(Tile tile : consumers){ - float used = Math.min(tile.block().powerCapacity - tile.entity.power.amount, finalEach) * accumulator / totalInput; - buffer += used; - tile.entity.power.amount += used; + float outputSatisfied = charge ? 1f : Math.min((totalInput + bufferInput) / maxOutput, 1f); + for(Tile consumer : consumers){ + if(consumer.block().outputsPower){ + if(charge){ + consumer.entity.power.amount += (consumer.block().powerCapacity - consumer.entity.power.amount) * bufferUsed; + } + continue; } - - producer.entity.power.amount -= buffer; + consumer.entity.power.amount += (consumer.block().powerCapacity - consumer.entity.power.amount) * outputSatisfied; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java index 7416986d6e..05f8daad7d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java @@ -4,7 +4,6 @@ import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeLiquid; -//TODO public class TurbineGenerator extends BurnerGenerator{ public TurbineGenerator(String name){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index e2854906dd..69abb7d4c2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -42,7 +42,7 @@ public class Cultivator extends Drill{ stats.remove(BlockStat.drillTier); stats.add(BlockStat.drillTier, table -> { 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); }); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index f0232c5cf3..212a71168b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -16,14 +16,11 @@ import io.anuke.mindustry.world.consumers.ConsumeLiquid; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.StatUnit; -import io.anuke.mindustry.world.meta.StatValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.scene.ui.Image; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.content; @@ -135,8 +132,9 @@ public class Drill extends Block{ for(int i = 0; i < list.size; i++){ Item item = list.get(i); - Cell imageCell = table.addImage(item.name + "1").size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); - StatValue.addToolTip(imageCell.getElement(), item); + + table.addImage(item.name + "1").size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); + table.add(item.localizedName()); if(i != list.size - 1){ table.add("/"); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java index 2f7562b82c..01e96fb5c3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java @@ -21,6 +21,7 @@ public class LiquidMixer extends LiquidBlock{ hasItems = true; rotate = false; solid = true; + singleLiquid = false; outputsLiquid = true; } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java index 49042d4180..e0481663f8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java @@ -152,11 +152,6 @@ public class Smelter extends Block{ Effects.effect(craftEffect, flameColor, tile.drawx(), tile.drawy()); } - @Override - public int getMaximumAccepted(Tile tile, Item item){ - return itemCapacity; - } - @Override public boolean acceptItem(Item item, Tile tile, Tile source){ boolean isInput = false; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java index 5c3a970112..dd7374536a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java @@ -11,12 +11,12 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.SelectionTrait; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.ui.layout.Table; -import io.anuke.ucore.util.Log; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import static io.anuke.mindustry.Vars.*; + +import static io.anuke.mindustry.Vars.content; public class SortedUnloader extends Unloader implements SelectionTrait{ protected float speed = 1f; @@ -38,7 +38,6 @@ public class SortedUnloader extends Unloader implements SelectionTrait{ SortedUnloaderEntity entity = tile.entity(); if(tile.entity.timer.get(timerUnload, speed) && tile.entity.items.total() == 0){ - Log.info(threads.getFrameID()); for(Tile other : tile.entity.proximity()){ if(other.getTeam() == tile.getTeam() && other.block() instanceof StorageBlock && entity.items.total() == 0 && ((entity.sortItem == null && other.entity.items.total() > 0) || ((StorageBlock) other.block()).hasItem(other, entity.sortItem))){ diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 8566a8017e..d7856bf1b3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -71,7 +71,7 @@ public class UnitFactory extends Block{ if(!Net.client()){ BaseUnit unit = factory.type.create(tile.getTeam()); unit.setSpawner(tile); - unit.set(tile.drawx(), tile.drawy()); + unit.set(tile.drawx() + Mathf.range(4), tile.drawy() + Mathf.range(4)); unit.add(); unit.getVelocity().y = factory.launchVelocity; } diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/io/anuke/mindustry/world/consumers/Consume.java index 8408389933..f4ec4cb01f 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consume.java @@ -11,8 +11,8 @@ import io.anuke.ucore.scene.ui.layout.Table; import static io.anuke.mindustry.Vars.mobile; public abstract class Consume{ - private boolean optional; - private boolean update = true; + protected boolean optional; + protected boolean update = true; public Consume optional(boolean optional){ this.optional = optional; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java index 863cbc8dc7..9476e43eff 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java @@ -53,6 +53,6 @@ public class ConsumeItem extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.inputItem, item); + stats.add(optional ? BlockStat.boostItem : BlockStat.inputItem, item); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 69e1077db1..c7c24114a4 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -58,6 +58,6 @@ public class ConsumeItemFilter extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.inputItems, new ItemFilterValue(filter)); + stats.add(optional ? BlockStat.boostItem : BlockStat.inputItem, new ItemFilterValue(filter)); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index f5a2a8e4b0..b46c984c2d 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -44,6 +44,6 @@ public class ConsumeItems extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.inputItems, new ItemListValue(items)); + stats.add(optional ? BlockStat.boostItem : BlockStat.inputItems, new ItemListValue(items)); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 0934cf73e5..be204b4dc0 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -32,7 +32,7 @@ public class ConsumeLiquid extends Consume{ @Override public String getIcon(){ - return "icon-liquid"; + return "icon-liquid-small"; } @Override @@ -47,8 +47,12 @@ public class ConsumeLiquid extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond); - stats.add(BlockStat.inputLiquid, liquid); + if(!optional){ + 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){ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 19a5395522..03750ffa3b 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -47,7 +47,7 @@ public class ConsumeLiquidFilter extends Consume{ @Override public String getIcon(){ - return "icon-liquid"; + return "icon-liquid-small"; } @Override @@ -62,10 +62,12 @@ public class ConsumeLiquidFilter extends Consume{ @Override 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.liquidFuelUse, 60f * use, StatUnit.liquidSecond); - }else{ + }else { stats.add(BlockStat.inputLiquid, new LiquidFilterValue(filter)); stats.add(BlockStat.liquidUse, 60f * use, StatUnit.liquidSecond); } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index fcbb35995e..d05ba2c4fa 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -21,7 +21,7 @@ public class ConsumePower extends Consume{ @Override public String getIcon(){ - return "icon-power"; + return "icon-power-small"; } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/Consumers.java b/core/src/io/anuke/mindustry/world/consumers/Consumers.java index cfabf5e7ca..9433de8c54 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consumers.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consumers.java @@ -52,7 +52,7 @@ public class Consumers{ return i; } - public ConsumeItems items(ItemStack[] items){ + public ConsumeItems items(ItemStack... items){ ConsumeItems i = new ConsumeItems(items); add(i); return i; diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStat.java b/core/src/io/anuke/mindustry/world/meta/BlockStat.java index 5bfd481570..834e8f3ce2 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStat.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStat.java @@ -45,8 +45,10 @@ public enum BlockStat{ shots(StatCategory.shooting), reload(StatCategory.shooting), powerShot(StatCategory.shooting), - targetsAir(StatCategory.shooting),; + targetsAir(StatCategory.shooting), + boostItem(StatCategory.optional), + boostLiquid(StatCategory.optional),; public final StatCategory category; diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStats.java b/core/src/io/anuke/mindustry/world/meta/BlockStats.java index 2e6b3507aa..105222cf7a 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStats.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStats.java @@ -12,9 +12,7 @@ import io.anuke.ucore.util.Log; import java.util.Locale; -/** - * Hold and organizes a list of block stats. - */ +/**Hold and organizes a list of block stats.*/ public class BlockStats{ private static final boolean errorWhenMissing = false; @@ -26,52 +24,37 @@ public class BlockStats{ 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){ 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){ add(stat, new BooleanValue(value)); } - /** - * Adds an item value. - */ + /**Adds an item value.*/ public void add(BlockStat stat, Item item){ add(stat, new ItemValue(new ItemStack(item, 1))); } - /** - * Adds a liquid value. - */ + /**Adds a liquid value.*/ public void add(BlockStat stat, Liquid liquid){ add(stat, new LiquidValue(liquid)); } - - /** - * Adds an item value. - */ + /**Adds an item value.*/ public void add(BlockStat stat, ItemStack 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){ add(stat, new StringValue(format, args)); } - /** - * Adds a stat value. - */ + /**Adds a stat value.*/ public void add(BlockStat stat, StatValue value){ if(!Bundles.has("text.blocks." + stat.name().toLowerCase(Locale.ROOT))){ if(!errorWhenMissing){ @@ -102,6 +85,7 @@ public class BlockStats{ dirty = true; } + /**Removes a stat, if it exists.*/ public void remove(BlockStat stat){ if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){ throw new RuntimeException("No stat entry found: \"" + stat + "\" in block '" + block.name + "'!"); diff --git a/core/src/io/anuke/mindustry/world/meta/StatCategory.java b/core/src/io/anuke/mindustry/world/meta/StatCategory.java index ce1ef5b6f2..0080d5daf5 100644 --- a/core/src/io/anuke/mindustry/world/meta/StatCategory.java +++ b/core/src/io/anuke/mindustry/world/meta/StatCategory.java @@ -1,13 +1,12 @@ package io.anuke.mindustry.world.meta; -/** - * A specific category for a stat. - */ +/**A specific category for a stat.*/ public enum StatCategory{ general, power, liquids, items, crafting, - shooting + shooting, + optional, } diff --git a/core/src/io/anuke/mindustry/world/meta/StatValue.java b/core/src/io/anuke/mindustry/world/meta/StatValue.java index ef3e51acef..df53cc2947 100644 --- a/core/src/io/anuke/mindustry/world/meta/StatValue.java +++ b/core/src/io/anuke/mindustry/world/meta/StatValue.java @@ -1,10 +1,5 @@ package io.anuke.mindustry.world.meta; -import io.anuke.mindustry.game.UnlockableContent; -import io.anuke.ucore.scene.Element; -import io.anuke.ucore.scene.ui.Image; -import io.anuke.ucore.scene.ui.Tooltip; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; /** @@ -13,37 +8,7 @@ import io.anuke.ucore.scene.ui.layout.Table; public interface StatValue{ /** * This method should provide all elements necessary to display this stat to the specified table. - * For example, a stat that is just text would add label to the table. + * For example, a stat that is just text would add a label to the table. */ void display(Table table); - - /** - * This method adds an icon image together with a tool tip which contains the name of the item. - * @param table the table to add the image cell to. - * @param item The item which provides the tool tip content. - * @return the image cell which was created. The cell is not yet sized or padded. - */ - static Cell addImageWithToolTip(Table table, UnlockableContent item){ - - // Create a table cell with a new image as provided by the item - Cell imageCell = table.addImage(item.getContentIcon()); - - // Retrieve the image and add a tool tip with the item's name - addToolTip(imageCell.getElement(), item); - - // Return the table cell for further processing (sizing, padding, ...) - return imageCell; - } - - /** - * Adds a tool tip containing the item's localized name to the given element. - * @param element The element to assign the tool tip to. - * @param item The item which provides the tool tip content. - */ - static void addToolTip(Element element, UnlockableContent item){ - element.addListener(new Tooltip<>(new Table("clear"){{ - add(item.localizedName()); - margin(4); - }})); - } } diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java index 669f5baa2c..0f917dda71 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java @@ -2,12 +2,12 @@ package io.anuke.mindustry.world.meta.values; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.ui.ItemDisplay; import io.anuke.mindustry.world.meta.StatValue; import io.anuke.ucore.function.Predicate; -import io.anuke.ucore.scene.ui.Image; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; -import static io.anuke.mindustry.Vars.*; + +import static io.anuke.mindustry.Vars.content; public class ItemFilterValue implements StatValue{ private final Predicate filter; @@ -27,10 +27,7 @@ public class ItemFilterValue implements StatValue{ for(int i = 0; i < list.size; i++){ Item item = list.get(i); - Cell imageCell = table.addImage(item.region); - imageCell.size(8 * 3).padRight(2).padLeft(2); - - StatValue.addToolTip(imageCell.getElement(), item); + table.add(new ItemDisplay(item)).padRight(5); if(i != list.size - 1){ table.add("/"); diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java index 7cb237296f..af9ab67af2 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java @@ -3,11 +3,8 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.ui.ItemDisplay; import io.anuke.mindustry.world.meta.ContentStatValue; -import io.anuke.mindustry.world.meta.StatValue; -import io.anuke.ucore.scene.ui.Image; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; public class ItemListValue implements ContentStatValue{ @@ -41,17 +38,11 @@ public class ItemListValue implements ContentStatValue{ public void display(Table table){ if(items != null){ for(Item item : items){ - Cell imageCell = table.addImage(item.region); - imageCell.size(8 * 3).padRight(5); - - StatValue.addToolTip(imageCell.getElement(), item); + table.add(new ItemDisplay(item)).padRight(5); } }else{ for(ItemStack stack : stacks){ - ItemImage image = new ItemImage(stack); - table.add(image).size(8 * 3).padRight(5); - - StatValue.addToolTip(image, stack.item); + table.add(new ItemDisplay(stack.item, stack.amount)).padRight(5); } } } diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java index 269c537dc5..2b54142976 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java @@ -3,9 +3,8 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.ui.ItemDisplay; import io.anuke.mindustry.world.meta.ContentStatValue; -import io.anuke.mindustry.world.meta.StatValue; import io.anuke.ucore.scene.ui.layout.Table; public class ItemValue implements ContentStatValue{ @@ -22,9 +21,6 @@ public class ItemValue implements ContentStatValue{ @Override public void display(Table table){ - //TODO better implementation, quantity support - ItemImage image = new ItemImage(item); - table.add(image).size(8 * 3); - StatValue.addToolTip(image, item.item); + table.add(new ItemDisplay(item.item, item.amount)); } } diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java index 9dc6a6bd0b..7c5d638be9 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java @@ -2,13 +2,12 @@ package io.anuke.mindustry.world.meta.values; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.LiquidDisplay; import io.anuke.mindustry.world.meta.StatValue; import io.anuke.ucore.function.Predicate; -import io.anuke.ucore.scene.ui.Image; -import io.anuke.ucore.scene.ui.Tooltip; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; -import static io.anuke.mindustry.Vars.*; + +import static io.anuke.mindustry.Vars.content; public class LiquidFilterValue implements StatValue{ private final Predicate filter; @@ -26,10 +25,7 @@ public class LiquidFilterValue implements StatValue{ } for(int i = 0; i < list.size; i++){ - Liquid item = list.get(i); - - Cell imageCell = StatValue.addImageWithToolTip(table, item); - imageCell.size(8 * 3).padRight(2).padLeft(2).padTop(2).padBottom(2); + table.add(new LiquidDisplay(list.get(i))).padRight(5); if(i != list.size - 1){ table.add("/"); diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java b/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java index d4d6734511..0dcc6c03c7 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java @@ -2,10 +2,8 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.LiquidDisplay; import io.anuke.mindustry.world.meta.ContentStatValue; -import io.anuke.mindustry.world.meta.StatValue; -import io.anuke.ucore.scene.ui.Image; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; public class LiquidValue implements ContentStatValue{ @@ -22,7 +20,6 @@ public class LiquidValue implements ContentStatValue{ @Override public void display(Table table){ - Cell imageCell = StatValue.addImageWithToolTip(table, liquid); - imageCell.size(8 * 3); + table.add(new LiquidDisplay(liquid)); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java index 1f29c1a906..d3bb8e1976 100644 --- a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java +++ b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java @@ -80,12 +80,11 @@ public class CrashHandler{ ex(() -> value.addChild("gamemode", new JsonValue(Vars.state.mode.name()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name()))); ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name")))); - ex(() -> value.addChild("multithreading", new JsonValue(Settings.getBool("multithread")))); ex(() -> value.addChild("trace", new JsonValue(parseException(e)))); try{ Path path = Paths.get(OS.getAppDataDirectoryString(Vars.appName), "crashes", - "crash-report-" + DateTimeFormatter.ofPattern("MM-dd-yyyy-HH:mm:ss").format(LocalDateTime.now()) + ".txt"); + "crash-report-" + DateTimeFormatter.ofPattern("MM dd yyyy HH mm ss").format(LocalDateTime.now()) + ".txt"); Files.createDirectories(Paths.get(OS.getAppDataDirectoryString(Vars.appName), "crashes")); Files.write(path, parseException(e).getBytes()); @@ -117,7 +116,7 @@ public class CrashHandler{ StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); - return sw.toString().replace(e.getMessage(), e.getMessage().replace(System.getProperty("user.name"), "[USERNAME]")); + return sw.toString(); } private static void ex(Runnable r){ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index 1a353b0656..d4cd5ad4e7 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -17,8 +17,6 @@ import io.anuke.ucore.util.OS; import io.anuke.ucore.util.Strings; import java.net.NetworkInterface; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Enumeration; import static io.anuke.mindustry.Vars.*; @@ -26,7 +24,6 @@ import static io.anuke.mindustry.Vars.*; public class DesktopPlatform extends Platform{ final static boolean useDiscord = OS.is64Bit; final static String applicationId = "398246104468291591"; - final static DateFormat format = SimpleDateFormat.getDateTimeInstance(); String[] args; public DesktopPlatform(String[] args){ diff --git a/ios/build.gradle b/ios/build.gradle index b14d976190..d0bfc1752f 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -14,9 +14,4 @@ createIPA.dependsOn build robovm { archs = "thumbv7:arm64" -} - -eclipse.project { - name = appName + "-ios" - natures 'org.robovm.eclipse.RoboVMNature' } \ No newline at end of file diff --git a/ios/robovm.properties b/ios/robovm.properties deleted file mode 100644 index 694b9dfa68..0000000000 --- a/ios/robovm.properties +++ /dev/null @@ -1,6 +0,0 @@ -app.version=4.0 -app.id=io.anuke.mindustry -app.mainclass=io.anuke.mindustry.IOSLauncher -app.executable=IOSLauncher -app.build=27 -app.name=Mindustry diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index e6bd6469ed..4938e4457f 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -10,7 +10,6 @@ import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.net.Net; -import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Strings; @@ -32,24 +31,12 @@ public class IOSLauncher extends IOSApplication.Delegate { Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); - Unit.dp.addition -= 0.2f; - if(UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad){ Unit.dp.addition = 0.5f; } Platform.instance = new Platform() { - @Override - public void addDialog(TextField field) { - TextFieldDialogListener.add(field, 16); - } - - @Override - public void addDialog(TextField field, int maxLength) { - TextFieldDialogListener.add(field, maxLength); - } - @Override public void shareFile(FileHandle file){ FileHandle to = Gdx.files.absolute(getDocumentsDirectory()).child(file.name()); diff --git a/ios/src/io/anuke/mindustry/TextFieldDialogListener.java b/ios/src/io/anuke/mindustry/TextFieldDialogListener.java deleted file mode 100644 index f8557f72a8..0000000000 --- a/ios/src/io/anuke/mindustry/TextFieldDialogListener.java +++ /dev/null @@ -1,105 +0,0 @@ -package io.anuke.mindustry; - -import com.badlogic.gdx.Gdx; -import io.anuke.ucore.scene.event.ClickListener; -import io.anuke.ucore.scene.event.InputEvent; -import io.anuke.ucore.scene.event.InputListener; -import io.anuke.ucore.scene.ui.TextField; -import org.robovm.apple.foundation.NSRange; -import org.robovm.apple.uikit.*; -import org.robovm.rt.bro.annotation.ByVal; - -public class TextFieldDialogListener { - - public static void add(TextField field, int maxLength){ - field.addListener(new ClickListener(){ - public void clicked(final InputEvent event, float x, float y){ - show(field, maxLength); - event.cancel(); - } - }); - field.addListener(new InputListener(){ - public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { - Gdx.input.setOnscreenKeyboardVisible(false); - return false; - } - }); - } - - @SuppressWarnings("deprecation") - private static void show(TextField field, int maxLength){ - - UIAlertViewDelegateAdapter delegate = new UIAlertViewDelegateAdapter() { - - @Override - public void didDismiss(UIAlertView alertView, long buttonIndex) { - if (buttonIndex == 1) { - UITextField textField = alertView.getTextField(0); - final String result = textField.getText(); - - Gdx.app.postRunnable(() -> { - field.setText(result); - field.change(); - }); - } - } - - @Override - public void clicked(UIAlertView alertView, long buttonIndex) { - - } - - @Override - public void cancel(UIAlertView alertView) { - - } - - @Override - public void willPresent(UIAlertView alertView) { - - } - - @Override - public void didPresent(UIAlertView alertView) { - - } - - @Override - public void willDismiss(UIAlertView alertView, long buttonIndex) { - - } - - @Override - public boolean shouldEnableFirstOtherButton(UIAlertView alertView) { - return false; - } - }; - - String[] otherButtons = new String[1]; - otherButtons[0] = "OK"; - - UIAlertView alertView = new UIAlertView("", "", delegate, "Cancel", otherButtons); - - alertView.setAlertViewStyle(UIAlertViewStyle.PlainTextInput); - - UITextField uiTextField = alertView.getTextField(0); - uiTextField.setText(field.getText()); - - uiTextField.setDelegate(new UITextFieldDelegateAdapter() { - @Override - public boolean shouldChangeCharacters(UITextField textField, @ByVal NSRange nsRange, String additionalText) { - - if (textField.getText().length() + additionalText.length() > maxLength) { - String oldText = textField.getText(); - String newText = oldText + additionalText; - textField.setText(newText.substring(0, maxLength)); - return false; - } - return true; - } - }); - - alertView.show(); - - } -} diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index c0a43aae57..22c1ab47f1 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -350,18 +350,30 @@ public class ServerControl extends Module{ } }); - handler.register("fillitems", "Fill the core with 2000 items.", arg -> { + handler.register("fillitems", "[team]", "Fill the core with 2000 items.", arg -> { if(!state.is(State.playing)){ err("Not playing. Host first."); return; } + + try{ + Team team = arg.length == 0 ? Team.blue : Team.valueOf(arg[0]); - for(Item item : content.items()){ - if(item.type == ItemType.material){ - state.teams.get(Team.blue).cores.first().entity.items.add(item, 2000); + if(state.teams.get(team).cores.isEmpty()){ + err("That team has no cores."); + return; } + + for(Item item : content.items()){ + if(item.type == ItemType.material){ + state.teams.get(team).cores.first().entity.items.add(item, 2000); + } + } + + info("Core filled."); + }catch(IllegalArgumentException ignored){ + err("No such team exists."); } - info("Core filled."); }); handler.register("crashreport", "", "Disables or enables automatic crash reporting", arg -> { diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index b9c82c56d6..fb7fd882dc 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -7,8 +7,8 @@ import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration; import io.anuke.kryonet.KryoClient; import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.net.Net; +import io.anuke.ucore.core.Settings; import io.anuke.ucore.util.EmptyLogger; -import io.anuke.ucore.util.OS; public class ServerLauncher extends HeadlessApplication{ @@ -26,7 +26,7 @@ public class ServerLauncher extends HeadlessApplication{ Net.setServerProvider(new KryoServer()); HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration(); - config.preferencesDirectory = OS.getAppDataDirectoryString("Mindustry"); + Settings.setPrefHandler((appName) -> Gdx.files.local("config")); new ServerLauncher(new MindustryServer(args), config); }catch(Throwable t){ diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 8c47aabbb4..9845480b31 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -4,17 +4,23 @@ import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration; import com.badlogic.gdx.math.GridPoint2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Items; +import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.content.blocks.Blocks; +import io.anuke.mindustry.content.blocks.CraftingBlocks; +import io.anuke.mindustry.content.blocks.PowerBlocks; import io.anuke.mindustry.content.blocks.StorageBlocks; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.Logic; import io.anuke.mindustry.core.NetServer; import io.anuke.mindustry.core.World; +import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.BundleLoader; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; @@ -205,7 +211,14 @@ public class ApplicationTests{ } @Test - void edgeTest(){ + void inventoryDeposit(){ + depositTest(CraftingBlocks.smelter, Items.copper); + depositTest(StorageBlocks.vault, Items.copper); + depositTest(PowerBlocks.thoriumReactor, Items.thorium); + } + + @Test + void edges(){ GridPoint2[] edges = Edges.getEdges(1); assertEquals(edges[0], new GridPoint2(1, 0)); assertEquals(edges[1], new GridPoint2(0, 1)); @@ -215,4 +228,22 @@ public class ApplicationTests{ GridPoint2[] edges2 = Edges.getEdges(2); assertEquals(8, edges2.length); } + + void depositTest(Block block, Item item){ + BaseUnit unit = UnitTypes.alphaDrone.create(Team.none); + Tile tile = new Tile(0, 0, Blocks.air.id, block.id); + int capacity = tile.block().itemCapacity; + + int deposited = tile.block().acceptStack(item, capacity - 1, tile, unit); + assertEquals(capacity - 1, deposited); + + tile.block().handleStack(item, capacity - 1, tile, unit); + assertEquals(tile.entity.items.get(item), capacity - 1); + + int overflow = tile.block().acceptStack(item, 10, tile, unit); + assertEquals(1, overflow); + + tile.block().handleStack(item, 1, tile, unit); + assertEquals(capacity, tile.entity.items.get(item)); + } } \ No newline at end of file diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java new file mode 100644 index 0000000000..5357bb515e --- /dev/null +++ b/tests/src/test/java/IOTests.java @@ -0,0 +1,34 @@ +import io.anuke.mindustry.io.TypeIO; +import org.junit.jupiter.api.Test; + +import java.nio.ByteBuffer; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class IOTests{ + + @Test + void writeEnglish(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + TypeIO.writeString(buffer, "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234"); + buffer.position(0); + assertEquals(TypeIO.readString(buffer), "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234"); + } + + @Test + void writeChinese(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + TypeIO.writeString(buffer, "这个服务器可以用自己的语言说话"); + buffer.position(0); + assertEquals(TypeIO.readString(buffer), "这个服务器可以用自己的语言说话"); + } + + @Test + void writeNull(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + TypeIO.writeString(buffer, null); + buffer.position(0); + assertEquals(TypeIO.readString(buffer), null); + } + +} diff --git a/tests/src/test/java/SectorTests.java b/tests/src/test/java/SectorTests.java index 3aae6cb305..bb07bc2743 100644 --- a/tests/src/test/java/SectorTests.java +++ b/tests/src/test/java/SectorTests.java @@ -46,7 +46,7 @@ public class SectorTests{ * This is achieved by adding at least one mission which defines a spawn point. */ @Test - void test_sectorHasACore(){ + void sectorHasACore(){ for(SectorPresets.SectorPreset preset : this.presets.getPresets().values()){ assertTrue(spawnPointIsDefined(preset.missions), "Sector at (" + preset.x + "|" + preset.y + ") contains no missions which define a spawn point. Add a battle or wave mission."); }