diff --git a/README.md b/README.md index 30591a6ed7..f85d9cb702 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ _Building:_ `gradlew desktop:dist` _Running:_ `./gradlew desktop:run` _Building:_ `./gradlew desktop:dist` -#### For Server Builds... +#### Server -Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server' i.e. `gradlew server:dist`. +Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server', e.g. `gradlew server:dist`. --- diff --git a/android/build.gradle b/android/build.gradle index 2c3912aeba..5e2fb3e7f6 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.3.1' } } diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 8fbb105dc4..323352d9eb 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -172,10 +172,10 @@ public class AndroidLauncher extends AndroidApplication{ SaveSlot slot = control.saves.importSave(file); ui.load.runLoadSave(slot); }catch(IOException e){ - ui.showError(Core.bundle.format("text.save.import.fail", Strings.parseException(e, false))); + ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, false))); } }else{ - ui.showError("$text.save.import.invalid"); + ui.showError("$save.import.invalid"); } }else if(map){ //open map Core.app.post(() -> { diff --git a/build.gradle b/build.gradle index 8fb24f284b..d5c67790b1 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ allprojects{ ext{ versionNumber = '4' - versionModifier = 'alpha' + versionModifier = 'beta' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.9' diff --git a/core/assets-raw/sprites/blocks/drills/oil-extractor-top.png b/core/assets-raw/sprites/blocks/drills/oil-extractor-top.png index 37bebd60c1..ba07cbb184 100644 Binary files a/core/assets-raw/sprites/blocks/drills/oil-extractor-top.png and b/core/assets-raw/sprites/blocks/drills/oil-extractor-top.png differ diff --git a/core/assets-raw/sprites/blocks/drills/oil-extractor.png b/core/assets-raw/sprites/blocks/drills/oil-extractor.png index e137d2e773..8d363c44cb 100644 Binary files a/core/assets-raw/sprites/blocks/drills/oil-extractor.png and b/core/assets-raw/sprites/blocks/drills/oil-extractor.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/mechanical-pump.png b/core/assets-raw/sprites/blocks/liquid/mechanical-pump.png index 3e98ba5081..b92420f1c3 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/mechanical-pump.png and b/core/assets-raw/sprites/blocks/liquid/mechanical-pump.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/thermal-pump.png b/core/assets-raw/sprites/blocks/liquid/thermal-pump.png index 47d5349d23..c89ff8890d 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/thermal-pump.png and b/core/assets-raw/sprites/blocks/liquid/thermal-pump.png differ diff --git a/core/assets-raw/sprites/blocks/power/impact-reactor-top.png b/core/assets-raw/sprites/blocks/power/impact-reactor-top.png index baa449e990..b564994c56 100644 Binary files a/core/assets-raw/sprites/blocks/power/impact-reactor-top.png and b/core/assets-raw/sprites/blocks/power/impact-reactor-top.png differ diff --git a/core/assets-raw/sprites/blocks/production/biomattercompressor-frame0.png b/core/assets-raw/sprites/blocks/production/biomattercompressor-frame0.png deleted file mode 100644 index 1e46dc766e..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/biomattercompressor-frame0.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/biomattercompressor-frame1.png b/core/assets-raw/sprites/blocks/production/biomattercompressor-frame1.png deleted file mode 100644 index a4675cb48f..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/biomattercompressor-frame1.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/biomattercompressor-frame2.png b/core/assets-raw/sprites/blocks/production/biomattercompressor-frame2.png deleted file mode 100644 index 26c5cf37c3..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/biomattercompressor-frame2.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/biomattercompressor.png b/core/assets-raw/sprites/blocks/production/biomattercompressor.png deleted file mode 100644 index 0ab39ff8a2..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/biomattercompressor.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/cultivator-top.png b/core/assets-raw/sprites/blocks/production/cultivator-top.png index 7aacfdb839..c665608609 100644 Binary files a/core/assets-raw/sprites/blocks/production/cultivator-top.png and b/core/assets-raw/sprites/blocks/production/cultivator-top.png differ diff --git a/core/assets-raw/sprites/blocks/production/oilrefinery.png b/core/assets-raw/sprites/blocks/production/oilrefinery.png deleted file mode 100644 index b6fdea3228..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/oilrefinery.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/plastanium-compressor.png b/core/assets-raw/sprites/blocks/production/plastanium-compressor.png index 4bd9a0098f..8bcbc2c911 100644 Binary files a/core/assets-raw/sprites/blocks/production/plastanium-compressor.png and b/core/assets-raw/sprites/blocks/production/plastanium-compressor.png differ diff --git a/core/assets-raw/sprites/blocks/production/separator.png b/core/assets-raw/sprites/blocks/production/separator.png index d8afadff79..623bc76bba 100644 Binary files a/core/assets-raw/sprites/blocks/production/separator.png and b/core/assets-raw/sprites/blocks/production/separator.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press-frame0.png b/core/assets-raw/sprites/blocks/production/spore-press-frame0.png new file mode 100644 index 0000000000..58a7284a74 Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/spore-press-frame0.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press-frame1.png b/core/assets-raw/sprites/blocks/production/spore-press-frame1.png new file mode 100644 index 0000000000..9d6b5fba03 Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/spore-press-frame1.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press-frame2.png b/core/assets-raw/sprites/blocks/production/spore-press-frame2.png new file mode 100644 index 0000000000..8899a23501 Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/spore-press-frame2.png differ diff --git a/core/assets-raw/sprites/blocks/production/biomattercompressor-liquid.png b/core/assets-raw/sprites/blocks/production/spore-press-liquid.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/biomattercompressor-liquid.png rename to core/assets-raw/sprites/blocks/production/spore-press-liquid.png diff --git a/core/assets-raw/sprites/blocks/production/biomattercompressor-top.png b/core/assets-raw/sprites/blocks/production/spore-press-top.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/biomattercompressor-top.png rename to core/assets-raw/sprites/blocks/production/spore-press-top.png diff --git a/core/assets-raw/sprites/blocks/production/spore-press.png b/core/assets-raw/sprites/blocks/production/spore-press.png new file mode 100644 index 0000000000..def84f6512 Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/spore-press.png differ diff --git a/core/assets-raw/sprites/blocks/units/repair-point-turret.png b/core/assets-raw/sprites/blocks/units/repair-point.png similarity index 100% rename from core/assets-raw/sprites/blocks/units/repair-point-turret.png rename to core/assets-raw/sprites/blocks/units/repair-point.png diff --git a/core/assets-raw/sprites/effects/beam-end.png b/core/assets-raw/sprites/effects/beam-end.png deleted file mode 100644 index d0674d380d..0000000000 Binary files a/core/assets-raw/sprites/effects/beam-end.png and /dev/null differ diff --git a/core/assets-raw/sprites/effects/beam.png b/core/assets-raw/sprites/effects/beam.png deleted file mode 100644 index 327fd4b7f6..0000000000 Binary files a/core/assets-raw/sprites/effects/beam.png and /dev/null differ diff --git a/core/assets-raw/sprites/effects/laser-end.png b/core/assets-raw/sprites/effects/laser-end.png deleted file mode 100644 index 7c109d16dd..0000000000 Binary files a/core/assets-raw/sprites/effects/laser-end.png and /dev/null differ diff --git a/core/assets-raw/sprites/effects/laser.png b/core/assets-raw/sprites/effects/laser.png deleted file mode 100644 index eba798c01e..0000000000 Binary files a/core/assets-raw/sprites/effects/laser.png and /dev/null differ diff --git a/core/assets-raw/sprites/effects/laserfull.png b/core/assets-raw/sprites/effects/laserfull.png deleted file mode 100644 index fab831c1c4..0000000000 Binary files a/core/assets-raw/sprites/effects/laserfull.png and /dev/null differ diff --git a/core/assets-raw/sprites/effects/minelaser-end.png b/core/assets-raw/sprites/effects/minelaser-end.png deleted file mode 100644 index 8a04ee1a6d..0000000000 Binary files a/core/assets-raw/sprites/effects/minelaser-end.png and /dev/null differ diff --git a/core/assets-raw/sprites/effects/minelaser.png b/core/assets-raw/sprites/effects/minelaser.png deleted file mode 100644 index 956e4d2311..0000000000 Binary files a/core/assets-raw/sprites/effects/minelaser.png and /dev/null differ diff --git a/core/assets-raw/sprites/mechs/mechs/omega-mech-armor.png b/core/assets-raw/sprites/mechs/mechs/omega-mech-armor.png index 051c4f4791..943895deab 100644 Binary files a/core/assets-raw/sprites/mechs/mechs/omega-mech-armor.png and b/core/assets-raw/sprites/mechs/mechs/omega-mech-armor.png differ diff --git a/core/assets-raw/sprites/ui/button-right-down.9.png b/core/assets-raw/sprites/ui/button-right-down.9.png index 7f2a96cd21..475f255934 100644 Binary files a/core/assets-raw/sprites/ui/button-right-down.9.png and b/core/assets-raw/sprites/ui/button-right-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-over.9.png b/core/assets-raw/sprites/ui/button-right-over.9.png index 732a0d4797..c764c18dab 100644 Binary files a/core/assets-raw/sprites/ui/button-right-over.9.png and b/core/assets-raw/sprites/ui/button-right-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right.9.png b/core/assets-raw/sprites/ui/button-right.9.png index dfb9888a2d..2c8c4bb1e0 100644 Binary files a/core/assets-raw/sprites/ui/button-right.9.png and b/core/assets-raw/sprites/ui/button-right.9.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-database-small.png b/core/assets-raw/sprites/ui/icons/icon-database-small.png new file mode 100644 index 0000000000..dc105e3f67 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-database-small.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-database.png b/core/assets-raw/sprites/ui/icons/icon-database.png new file mode 100644 index 0000000000..f5bc48c80d Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-database.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-power-requirement.png b/core/assets-raw/sprites/ui/icons/icon-power-requirement.png new file mode 100644 index 0000000000..dc82f5942e Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-power-requirement.png differ diff --git a/core/assets-raw/sprites/units/alpha-drone.png b/core/assets-raw/sprites/units/alpha-drone.png deleted file mode 100644 index 8cd435aed6..0000000000 Binary files a/core/assets-raw/sprites/units/alpha-drone.png and /dev/null differ diff --git a/core/assets-raw/sprites/mechs/mechs/chaos-array-base.png b/core/assets-raw/sprites/units/chaos-array-base.png similarity index 100% rename from core/assets-raw/sprites/mechs/mechs/chaos-array-base.png rename to core/assets-raw/sprites/units/chaos-array-base.png diff --git a/core/assets-raw/sprites/mechs/mechs/chaos-array-leg.png b/core/assets-raw/sprites/units/chaos-array-leg.png similarity index 100% rename from core/assets-raw/sprites/mechs/mechs/chaos-array-leg.png rename to core/assets-raw/sprites/units/chaos-array-leg.png diff --git a/core/assets-raw/sprites/mechs/mechs/chaos-array.png b/core/assets-raw/sprites/units/chaos-array.png similarity index 100% rename from core/assets-raw/sprites/mechs/mechs/chaos-array.png rename to core/assets-raw/sprites/units/chaos-array.png diff --git a/core/assets-raw/sprites/mechs/mechs/eradicator-base.png b/core/assets-raw/sprites/units/eradicator-base.png similarity index 100% rename from core/assets-raw/sprites/mechs/mechs/eradicator-base.png rename to core/assets-raw/sprites/units/eradicator-base.png diff --git a/core/assets-raw/sprites/mechs/mechs/eradicator-leg.png b/core/assets-raw/sprites/units/eradicator-leg.png similarity index 100% rename from core/assets-raw/sprites/mechs/mechs/eradicator-leg.png rename to core/assets-raw/sprites/units/eradicator-leg.png diff --git a/core/assets-raw/sprites/mechs/mechs/eradicator.png b/core/assets-raw/sprites/units/eradicator.png similarity index 100% rename from core/assets-raw/sprites/mechs/mechs/eradicator.png rename to core/assets-raw/sprites/units/eradicator.png diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/bridge-conveyor-end.png b/core/assets-raw/sprites_replacement/blocks/distribution/bridge-conveyor-end.png new file mode 100644 index 0000000000..b553fc29a7 Binary files /dev/null and b/core/assets-raw/sprites_replacement/blocks/distribution/bridge-conveyor-end.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-0.png index 2e55ce429a..2e0a43ea3b 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-1.png index 34a281b719..24048d1a43 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-2.png index 0b7db4da5c..73b23fc35b 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-3.png index a85cfdad60..6306aa871a 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-0-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-0.png index 18736adf66..5227b0a105 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-1.png index 807b2bf17d..d7807ed213 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-2.png index faf67a8736..809e73f91e 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-3.png index edbb81841f..cbbcc06765 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-1-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-0.png index ffd0e24f58..7d83503a4c 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-1.png index f249623779..7c096f931d 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-2.png index 3c04427e1a..8f3bc82e43 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-3.png index 439afb9c4b..2ae54594cb 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-2-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-0.png index 2485ac23b6..4ab7a2b834 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-1.png index c7997843d0..078385b52e 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-2.png index 22e6868cce..353aed8146 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-3.png index 7a94546637..b0ca93a9ef 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-3-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-0.png index 3563503f6f..7cf6b7a50c 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-1.png index 83c49920b4..20edd79d73 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-2.png index c89f011734..d2857c3270 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-3.png index acfe7e8136..2533da2648 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/conveyor-4-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-0.png index 29af97eb5c..8b950f97f8 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-1.png index ecd054afa6..3254dc8756 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-2.png index 7dc49bd440..7f69cf0669 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-3.png index 97e31e5722..8675cc94d0 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-0-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-0.png index 7e7bb86c62..1329d5537d 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-1.png index ffbafc5cdf..ee5360c7fe 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-2.png index f9dd561d6d..92c8101998 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-3.png index 5377953723..427ffeacd3 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-1-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-0.png index 2f53cd53fd..9a3d6926f6 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-1.png index 29727566b0..9961efb201 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-2.png index 464a7d4cf8..14ba76c0fa 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-3.png index 53c6124f64..c9f72835e5 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-2-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-0.png index aee4b266b2..2707bc9288 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-1.png index a547a7790f..352665be11 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-2.png index 0dafebb699..4ce88b7534 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-3.png index ae7bad0c38..a555b6b661 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-3-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-0.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-0.png index e001d5f945..da3dafa312 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-0.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-0.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-1.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-1.png index 992e544fc7..9e040e9590 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-1.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-1.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-2.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-2.png index 9c26ceef47..a2b0ee6665 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-2.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-2.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-3.png b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-3.png index 09db7b8269..6a96832452 100644 Binary files a/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-3.png and b/core/assets-raw/sprites_replacement/blocks/distribution/conveyors/titanium-conveyor-4-3.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/environment/white-tree-dead.png b/core/assets-raw/sprites_replacement/blocks/environment/white-tree-dead.png new file mode 100644 index 0000000000..4831e1879e Binary files /dev/null and b/core/assets-raw/sprites_replacement/blocks/environment/white-tree-dead.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/environment/white-tree.png b/core/assets-raw/sprites_replacement/blocks/environment/white-tree.png new file mode 100644 index 0000000000..af2b61c5ca Binary files /dev/null and b/core/assets-raw/sprites_replacement/blocks/environment/white-tree.png differ diff --git a/core/assets-raw/sprites_replacement/blocks/extra/block-border.png b/core/assets-raw/sprites_replacement/blocks/extra/block-border.png new file mode 100644 index 0000000000..415c5a6849 Binary files /dev/null and b/core/assets-raw/sprites_replacement/blocks/extra/block-border.png differ diff --git a/core/assets-raw/sprites_replacement/effects/laser-end.png b/core/assets-raw/sprites_replacement/effects/laser-end.png new file mode 100644 index 0000000000..dc90d3620b Binary files /dev/null and b/core/assets-raw/sprites_replacement/effects/laser-end.png differ diff --git a/core/assets-raw/sprites_replacement/effects/laser.png b/core/assets-raw/sprites_replacement/effects/laser.png new file mode 100644 index 0000000000..0072419acc Binary files /dev/null and b/core/assets-raw/sprites_replacement/effects/laser.png differ diff --git a/core/assets-raw/sprites_replacement/effects/minelaser-end.png b/core/assets-raw/sprites_replacement/effects/minelaser-end.png new file mode 100644 index 0000000000..46ab615894 Binary files /dev/null and b/core/assets-raw/sprites_replacement/effects/minelaser-end.png differ diff --git a/core/assets-raw/sprites_replacement/effects/minelaser.png b/core/assets-raw/sprites_replacement/effects/minelaser.png new file mode 100644 index 0000000000..21acfa15d4 Binary files /dev/null and b/core/assets-raw/sprites_replacement/effects/minelaser.png differ diff --git a/core/assets-raw/sprites_replacement/items/item-biomatter.png b/core/assets-raw/sprites_replacement/items/item-biomatter.png deleted file mode 100644 index bb8217c746..0000000000 Binary files a/core/assets-raw/sprites_replacement/items/item-biomatter.png and /dev/null differ diff --git a/core/assets-raw/sprites_replacement/items/item-metaglass.png b/core/assets-raw/sprites_replacement/items/item-metaglass.png index 821b27f468..3c45a8873f 100644 Binary files a/core/assets-raw/sprites_replacement/items/item-metaglass.png and b/core/assets-raw/sprites_replacement/items/item-metaglass.png differ diff --git a/core/assets-raw/sprites_replacement/items/item-silicon.png b/core/assets-raw/sprites_replacement/items/item-silicon.png index 5d8e353603..5d4cfab004 100644 Binary files a/core/assets-raw/sprites_replacement/items/item-silicon.png and b/core/assets-raw/sprites_replacement/items/item-silicon.png differ diff --git a/core/assets-raw/sprites_replacement/items/item-spore-pod.png b/core/assets-raw/sprites_replacement/items/item-spore-pod.png new file mode 100644 index 0000000000..aa69408ee7 Binary files /dev/null and b/core/assets-raw/sprites_replacement/items/item-spore-pod.png differ diff --git a/core/assets-raw/sprites_replacement/items/item-surge-alloy.png b/core/assets-raw/sprites_replacement/items/item-surge-alloy.png index aed11704ab..9fc6aa4561 100644 Binary files a/core/assets-raw/sprites_replacement/items/item-surge-alloy.png and b/core/assets-raw/sprites_replacement/items/item-surge-alloy.png differ diff --git a/core/assets-raw/sprites_replacement/items/item-thorium.png b/core/assets-raw/sprites_replacement/items/item-thorium.png index b67f2789f8..80bd29633c 100644 Binary files a/core/assets-raw/sprites_replacement/items/item-thorium.png and b/core/assets-raw/sprites_replacement/items/item-thorium.png differ diff --git a/core/assets-raw/sprites_replacement/items/item-titanium.png b/core/assets-raw/sprites_replacement/items/item-titanium.png index e07bd283ad..3e15e1e7c7 100644 Binary files a/core/assets-raw/sprites_replacement/items/item-titanium.png and b/core/assets-raw/sprites_replacement/items/item-titanium.png differ diff --git a/core/assets-raw/sprites_replacement/items/liquid-cryofluid.png b/core/assets-raw/sprites_replacement/items/liquid-cryofluid.png index 209bb76894..198c21ad17 100644 Binary files a/core/assets-raw/sprites_replacement/items/liquid-cryofluid.png and b/core/assets-raw/sprites_replacement/items/liquid-cryofluid.png differ diff --git a/core/assets-raw/sprites_replacement/items/liquid-oil.png b/core/assets-raw/sprites_replacement/items/liquid-oil.png index c687ef4fbb..e0fbc07cf2 100644 Binary files a/core/assets-raw/sprites_replacement/items/liquid-oil.png and b/core/assets-raw/sprites_replacement/items/liquid-oil.png differ diff --git a/core/assets-raw/sprites_replacement/items/liquid-slag.png b/core/assets-raw/sprites_replacement/items/liquid-slag.png index 778c87479a..87c2a41d07 100644 Binary files a/core/assets-raw/sprites_replacement/items/liquid-slag.png and b/core/assets-raw/sprites_replacement/items/liquid-slag.png differ diff --git a/core/assets-raw/sprites_replacement/items/liquid-water.png b/core/assets-raw/sprites_replacement/items/liquid-water.png index 8e9df22eef..025c812967 100644 Binary files a/core/assets-raw/sprites_replacement/items/liquid-water.png and b/core/assets-raw/sprites_replacement/items/liquid-water.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 0f353e46be..8032ddd07a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -21,6 +21,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Are you sure you want to delete the map "[accent]{0}[]"? level.highscore = High Score: [accent]{0} @@ -187,7 +188,6 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a 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. map.invalid = Error loading map: corrupted or invalid map file. editor.brush = Brush -editor.slope = \\ editor.openin = Open In Editor editor.oregen = Ore Generation editor.oregen.info = Ore Generation: @@ -252,12 +252,17 @@ bestwave = [LIGHT_GRAY]Best Wave: {0} launch = < LAUNCH > launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.unable = [scarlet]Unable to LAUNCH.[] {0} Enemies. launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}. zone.unlocked = [LIGHT_GRAY]{0} unlocked. -zone.complete = Zone conditions met. +zone.complete = Wave {0} reached:\nNew zone requirements met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} error.unreachable = Server unreachable.\nIs the address spelled correctly? @@ -300,8 +305,11 @@ no = No info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Block Info +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Power Capacity blocks.powershot = Power/Shot blocks.targetsair = Targets Air @@ -326,6 +334,7 @@ blocks.inputitems = Input Items blocks.outputitem = Output Item blocks.drilltier = Drillables blocks.drillspeed = Base Drill Speed +blocks.maxunits = Max Active Units blocks.liquidoutput = Liquid Output blocks.liquidoutputspeed = Liquid Output Speed blocks.liquiduse = Liquid Use @@ -337,7 +346,10 @@ blocks.liquidfueluse = Liquid Fuel Use blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Health +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Inaccuracy blocks.shots = Shots @@ -405,7 +417,7 @@ keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.select.name = Select/Shoot keybind.pick.name = Pick Block -keybind.break.name = Break +keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = Shoot keybind.zoom_hold.name = Zoom Hold @@ -433,7 +445,7 @@ mode.freebuild.description = Limited resources and no timer for waves. mode.pvp.name = PvP mode.pvp.description = Fight against other players locally. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Items content.liquid.name = Liquids content.unit.name = Units @@ -458,8 +470,8 @@ 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.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Sand 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 @@ -517,6 +529,11 @@ mech.ability = [LIGHT_GRAY]Ability: {0} liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -526,22 +543,13 @@ block.spawn.name = Enemy Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Metal Floor -block.deepwater.name = deepwater -block.water.name = water -block.lava.name = lava +block.deepwater.name = Deep Water +block.water.name = Water block.tar.name = Tar -block.blackstone.name = Black Stone block.stone.name = Stone -block.dirt.name = Dirt block.sand.name = Dark 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.craters.name = Craters block.sand-water.name = Sand water block.char.name = Char @@ -561,9 +569,8 @@ block.stained-rocks-red.name = Stained Rocks Red block.stained-stone-red.name = Stained Stone Red block.stained-rocks-yellow.name = Stained Rocks Yellow block.stained-stone-yellow.name = Stained Stone Yellow -block.stained-boulder.name = Stained Boulde +block.stained-boulder.name = Stained Boulder block.metal-floor.name = Metal Floor -block.metal-floor-1.name = Metal Floor 1 block.metal-floor-2.name = Metal Floor 2 block.metal-floor-3.name = Metal Floor 3 block.metal-floor-5.name = Metal Floor 5 @@ -583,7 +590,6 @@ block.thorium-wall-large.name = Large Thorium Wall block.door.name = Door block.door-large.name = Large Door block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Conveyor @@ -595,17 +601,14 @@ block.sorter.name = Sorter 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.smelter.name = Smelter -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.spore-press.name = Spore Press block.separator.name = Separator -block.centrifuge.name = Centrifuge block.power-node.name = Power Node block.power-node-large.name = Large Power Node block.surge-tower.name = Surge Tower @@ -645,7 +648,6 @@ 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 @@ -666,7 +668,6 @@ 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 = Airblast Drill block.thermal-pump.name = Thermal Pump @@ -686,13 +687,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores and repairs blocks. unit.phantom.name = Phantom Drone @@ -737,8 +738,6 @@ tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a 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. @@ -768,9 +767,7 @@ block.titanium-conveyor.description = Advanced item transport block. Moves items 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.silicon-smelter.description = Reduces sand with highly pure coal 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. @@ -778,12 +775,10 @@ block.pulverizer.description = Crushes stone into sand. Useful when there is a l 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.melter.description = Melts down scrap into slag for further processing or usage in turrets. block.incinerator.description = Gets rid of any excess item or liquid. -block.biomattercompressor.description = Compresses biomatter in order to retrieve oil. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Extracts useful minerals from slag. -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. @@ -793,19 +788,18 @@ block.turbine-generator.description = More efficient than a combustion generator block.thermal-generator.description = Generates power when placed in hot locations. 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. Power output depends on fullness, with base power generated at half capacity. +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. Power output depends on fullness, with base power generated at full capacity. 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 of each type. Adjacent containers, vaults and cores will be treated as a single storage unit. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. -block.vault.description = Stores a large amount of items of each type. Adjacent containers, vaults and cores will be treated as a single storage unit. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. +block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. +block.vault.description = Stores a large amount of items of each type. 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.cultivator.description = Cultivates tiny concentrations of spores into industry-ready pods. 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. @@ -821,7 +815,6 @@ 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 air 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. @@ -831,17 +824,15 @@ block.liquid-junction.description = Acts as a bridge for two crossing conduits. 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.thermal-pump.description = The ultimate pump. 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.item-source.description = Infinitely outputs items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.power-void.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. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index c5cd86c905..9c665955be 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"? level.highscore = Nejvyšší skóre: [accent]{0} level.select = Výběr levelu @@ -185,7 +186,6 @@ map.nospawn = Tato mapa nemá žádná jádra pro hráče ke spawnutí! přidej[ map.nospawn.pvp = Tato mapa nemá žádné nepřátelské jádra pro hráče ke spawnutí! přidej[SCARLET] red[] jádro na tuto mapu v editoru. map.invalid = Chyba v načítání mapy: poškozený nebo neplatný soubor mapy. editor.brush = Štětec -editor.slope = \\ editor.openin = Otevřít v editoru. editor.oregen = Generovat nerostné zdroje. editor.oregen.info = Generování nerostných zdrojů: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0} error.unreachable = Server je nedostupný.\nJe adresa napsaná správně? error.invalidaddress = Neplatná adresa. @@ -290,12 +299,15 @@ no = Ne info.title = Informace error.title = [crimson]Objevila se chyba error.crashtitle = Objevila se chyba +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Informace o bloku +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Kapacita energie blocks.powershot = Energie na výstřel blocks.targetsair = Zaměřuje vzdušné jednotky -blocks.itemspeed = Zpracování +blocks.itemsmoved = Move Speed blocks.shootrange = Dostřel blocks.size = velikost blocks.liquidcapacity = Kapacita tekutin @@ -316,6 +328,7 @@ blocks.inputitems = Vstupní předměty blocks.outputitem = Výstupní předmět blocks.drilltier = Vrtatelné blocks.drillspeed = Základní rychlost vrtu +blocks.maxunits = Max Active Units blocks.liquidoutput = Výstup tekutin blocks.liquidoutputspeed = Rychlost výstupu tekutin blocks.liquiduse = Spotřebuje tekutin @@ -327,7 +340,10 @@ blocks.liquidfueluse = Spotřeba Paliva-tekutiny blocks.boostitem = Předmět pro zrychlení blocks.boostliquid = Tekutina pro zrychlení blocks.health = Životy +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Nepřesnost/výchylka blocks.shots = Střely @@ -336,11 +352,11 @@ blocks.inputfuel = Palivo blocks.fuelburntime = Čas spalování paliva blocks.inputcapacity = Vstupní kapacita blocks.outputcapacity = Výstupní kapacita +blocks.ammo = Ammo unit.blocks = Bloky unit.powersecond = jednotek energie/sekunda unit.liquidsecond = jednotek tekutin/sekundu unit.itemssecond = předmětů/sekundu -unit.pixelssecond = pixelů/sekundu unit.liquidunits = jednotek tekutin unit.powerunits = jednotek energie unit.degrees = úhly @@ -395,7 +411,7 @@ keybind.move_x.name = Pohyb na X keybind.move_y.name = Pohyb na Y keybind.select.name = Vybrat/Střílet keybind.pick.name = Pick Block -keybind.break.name = Ničit +keybind.break_block.name = Break Block keybind.deselect.name = Odznačit keybind.shoot.name = Střílet keybind.zoom_hold.name = Přiblížení-podržení @@ -423,7 +439,7 @@ mode.freebuild.description = Limitované zdroje a žádný čas pro vlny nepřá mode.pvp.name = PvP mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti. mode.attack.name = Útok -mode.attack.descrption = Žádné vlny, cílem je zničit nepřátelskou základnu. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Předměty content.liquid.name = Tekutiny content.unit.name = jednotky @@ -448,8 +464,8 @@ item.phase-fabric.name = Fázová tkanina item.phase-fabric.description = Skoro beztížná substance používaná v pokročilé elektronice a v sebeopravné technologii. item.surge-alloy.name = Impulzní slitina item.surge-alloy.description = Pokročilá slitina s unikátními elektronickými vlastnostmi. -item.biomatter.name = BioHmota -item.biomatter.description = Shluk organické kaše; Používá se k přeměně na ropu nebo jako jednoduché palivo. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Písek item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin. item.blast-compound.name = Výbušná směs @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Voda -liquid.lava.name = Láva +liquid.slag.name = Slag liquid.oil.name = Ropa liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alfa @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Schopnost: {0} liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0} liquid.viscosity = [LIGHT_GRAY]Viskozita: {0} liquid.temperature = [LIGHT_GRAY]Teplota: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Nepřátelský Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Kovová podlaha block.deepwater.name = Hluboká voda block.water.name = Voda -block.lava.name = Láva block.tar.name = Tar -block.blackstone.name = Černý kámen block.stone.name = Kámen -block.dirt.name = Hlína block.sand.name = Písek block.ice.name = Led block.snow.name = Sníh -block.grass.name = Tráva -block.shrub.name = Keř -block.rock.name = Kámen -block.blackrock.name = Černý kámen -block.icerock.name = Ledový kámen +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Měděná zeď block.copper-wall-large.name = Velká měděná zeď block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Velká thoriová stěna block.door.name = Dveře block.door-large.name = Velké dveře block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Dopravník @@ -555,17 +595,14 @@ block.sorter.name = Dělička block.sorter.description = Třídí předměty. Jestli je předmět shodný s výběrem, je mu dovoleno projít. Naopak neshodné předměty jsou vypuštěny do prava nebo do leva. block.overflow-gate.name = Brána přetečení block.overflow-gate.description = Kombinace distributoru a děličky která má výstup do leva nebo do prava jen pokud je přední strana zablokovaná. -block.smelter.name = Pec -block.arc-smelter.name = Oblouková Pec block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Tkalcovna pro fázovou tkaninu block.pulverizer.name = Rozmělňovač block.cryofluidmixer.name = Cryofluid mixér block.melter.name = Tavírna block.incinerator.name = Spalovna -block.biomattercompressor.name = Kompresor na Biohmotu +block.spore-press.name = Spore Press block.separator.name = Separátor -block.centrifuge.name = Centrifuga block.power-node.name = Energetický uzel block.power-node-large.name = Velký energetický uzel block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Mostový přepravník block.plastanium-compressor.name = Kompresor na Plastanium block.pyratite-mixer.name = Pyratit mixér block.blast-mixer.name = Výbušninový mixér -block.solidifer.name = Krystalizér block.solar-panel.name = Solární panel block.solar-panel-large.name = Velký solární panel block.oil-extractor.name = Ropný Extraktor @@ -626,7 +662,6 @@ block.liquid-junction.name = Křižovatka tekutin block.bridge-conduit.name = Mostové potrubí block.rotary-pump.name = Rotační pumpa block.thorium-reactor.name = Thoriový Reaktor -block.command-center.name = Příkazové centrum block.mass-driver.name = Hromadný Distributor block.blast-drill.name = Tlakovzdušný vrt block.thermal-pump.name = Termální pumpa @@ -646,13 +681,13 @@ block.spectre.name = Spektr block.meltdown.name = Meltdown block.container.name = Kontejnér block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = modrá team.red.name = červená team.orange.name = oranžová team.none.name = šedá team.green.name = zelená team.purple.name = fialová -unit.alpha-drone.name = Alfa Dron unit.spirit.name = Spirit Dron unit.spirit.description = Startovní dron. Standartně se objevuje u jádra. Automaticky těží rudy a opravuje stavby. unit.phantom.name = Fantom Dron @@ -697,8 +732,6 @@ tutorial.dagger = Propoj energetické uzly s továrnou.\nJakmile jsou požadavky tutorial.battle = [LIGHT_GRAY] Nepřítel[] prozradil lokaci svého jádra.\nZnič ho svými bojovými jednotkami. block.copper-wall.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel. block.copper-wall-large.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.\nZabírá více polí. -block.dense-alloy-wall.description = Standartní defenzivní blok.\nAdekvátní obrana vůči nepřátelům. -block.dense-alloy-wall-large.description = Standartní defenzivní blok.\nAdekvátní obrana vůči nepřátelům.\nZabírá více polí. block.thorium-wall.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům. block.thorium-wall-large.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům..\nZabírá více polí. block.phase-wall.description = Né tak silná jako zeď Thoria ale odráží nepřátelské projektily dokud nejsou moc silné. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Pokročilý blok přepravy předmětů. Ne block.phase-conveyor.description = Pokročilý blok přepravy předmětů. Využívá energii k přepravě od jednoho bodu k druhému po velice dlouhé vzdálenosti. block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. Užitečný při situaci kdy dva rozdílné dopravníky dopravují dva rozdílné materiálny na rozdílné místa. block.mass-driver.description = Ultimátní blok přepravy předmětů. Sbírá několik druhů předmětů a vystřelí je k dalšímu hromadnému distributoru přes veliké vzdálenosti. -block.smelter.description = Spaluje uhlí, měd a olovo pro vytvoření husté slitiny. -block.arc-smelter.description = Spaluje měd a olovo za pomocí externího energetického zdroje. block.silicon-smelter.description = Redukuje písek s vysoce čistým koksem za účelem výroby křemíku. block.plastanium-compressor.description = Produkuje plastánium za pomocí titánia a ropy. block.phase-weaver.description = Produkuje fázovou tkaninu z radioaktivního thoria a velkého množství písku. @@ -738,12 +769,10 @@ block.pulverizer.description = Drtí kámen na písek. Užitečné když se v ob block.pyratite-mixer.description = Míchá uhlí, olovo a písek do velice hořlavého pyratitu. block.blast-mixer.description = Používá ropu k přeměně pyratitu do méně hořlavé ale více explozivní těkavé směsi. block.cryofluidmixer.description = Kombinuje vodu a titánium do cryofluid, která je více efektivní pro chlazení. -block.solidifer.description = Velice rychle chladí lávu na kámen. block.melter.description = Taví kámen při velice vysokých teplotách na lávu. block.incinerator.description = Zbaví tě přebytku předmětů. -block.biomattercompressor.description = Stlačuje biohmotu k získání ropy. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Vystaví kámen velkému tlaku vody k získání různých materiálů obsažené v kameni. -block.centrifuge.description = Více efektivní než separátor. Za to více nákladný na provoz ke které vyžaduje energii. block.power-node.description = Vysílá energii mezi propojenými uzly. Dokáže se propojit až se čtyřmi uzly či stavbami najednou. Uzel bude dostávat zásobu energie a bude ji distribuovat mezi připojené bloky. block.power-node-large.description = Má větší dosah než standartní energetický uzel and a dokáže propojit až 6 staveb nebo uzly. block.battery.description = Ukládá energii kdykoliv kdy je nadbytek ,poskytuje energii kdykolik když je pokles energie v síti, tak dlouho doku zbývá kapacita. @@ -765,7 +794,6 @@ block.blast-drill.description = Ultimátní vrt, vyžaduje velké množství ene block.water-extractor.description = Extrahuje vodu ze země. Vhodný k použití když se v oblasti nenachází zdroj vody. block.cultivator.description = Kultivuje půdu vodou za účelem získání biohmoty. block.oil-extractor.description = Vyžaduje velké množství energie na extrakci ropy z písku. Použíj ho když se v oblasti nenachází žádný zdroj ropy. -block.dart-ship-pad.description = Zanech zde své aktuální plavidlo a žměn ho na klasický bojový letoun.\nPoužíj ho poklikáním když se nacházíš nad ním. block.trident-ship-pad.description = Zanech zde své aktuální plavidlo a změň ho do docela dobře obrněného těžkého bombardéru.\nPoužíj ho poklikáním když se nacházíš nad ním. block.javelin-ship-pad.description = Zanech zde své aktuální plavidlo a změn ho na silný a rychlý stíhač s bleskovými zbraněmi.\nPoužíj ho poklikáním když se nacházíš nad ním. block.glaive-ship-pad.description = Zanech zde své aktuální plavidlo a změn ho na velkou, dobře obrněnou střeleckou loď.\nPoužíj ho poklikáním když se nacházíš nad ním. @@ -781,7 +809,6 @@ block.titan-factory.description = Produkuje pokročilé, orněné pozemní jedno block.fortress-factory.description = Produkuje těžké artilérní, pozmení jednotky. block.revenant-factory.description = Produkuje vzdušné, težké laserové stíhače.. block.repair-point.description = Kontinuálně léčí nejbližší budovy a jednotky. -block.command-center.description = Dovoluje měnit umělou inteligenci spojeneckých jednotek. Aktuálně, útok, ztáhnout se a hlídkuj příkazy jsou podporovány. block.conduit.description = Základní blok přepravy tekutin. Funguje jako dopravník, ale na tekutiny, chápeš ne ? Užívá se s extraktory, pumpami nebo jiným potrubím. block.pulse-conduit.description = Pokročilý blok přepravy tekutin. Přepravuje tekutiny rychleji a více než standartní potrubí. block.phase-conduit.description = Pokročilý blok přepravy tekutin. Používá energii k teleportu tekutin do druhého bodu přez několik polí. @@ -795,13 +822,11 @@ block.thermal-pump.description = Ultimátní pumpa. Trojnásobně rychlejší ne block.router.description = Příijmá předměty z jednoho směru a posílá je rovnoměrně do zbylých tří směrů. Užitečný při rozdělení jednoho zdroje směřující do různých cílů. block.distributor.description = Pokročilý směrovač, který z libovolného počtu vstupů vytvoří libovolný počet výstupu a rozdělí přísun předmětů rovnoměrně do každého z nich, obdoba Multiplexeru a Demultiplexeru. block.bridge-conveyor.description = Pokročilý blok přepravy předmětů. Dovoluje transport předmětů až přez tři pole jakéhokoliv terénu nebo budovy. -block.alpha-mech-pad.description = Když je dodán dostatek energie, Přestaví tvoji loď na[accent] Alfa[] mecha. block.item-source.description = Nekonečný zdroj předmětů. Jen pro Sandbox. block.liquid-source.description = Nekonečný zdroj tekutin. Jen pro Sandbox. block.item-void.description = Likviduje jakéhokoliv vstupní předmět bež použití energie. Jen pro Sandbox. block.power-source.description = Nekonečný zdroj energie. Jen pro Sandbox. block.power-void.description = Prázdnota pro veškerou energii vstupující do něj. Jen pro Sandbox. liquid.water.description = Nejčastěji se používá ke chlazení a zpracování odpadu. -liquid.lava.description = Může být transformován na[LIGHT_GRAY] kámen[], nebo pro generátor energie nebo jako střelivo pro určitý druh střílen. liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení. liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 098e4ebdc1..2c9e710f68 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = High Score: [accent]{0} level.select = Level Auswahl @@ -185,7 +186,6 @@ map.nospawn = Diese Karte hat keine Kerne in denen die Spieler beginnen können! map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne wo Gegner starten könnten! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. map.invalid = Fehler beim Laden der Karte: Beschädigtes oder invalide Karten Datei. editor.brush = Pinsel -editor.slope = \\ editor.openin = Öffne im Editor editor.oregen = Erze generieren editor.oregen.info = Erze generiert: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0} error.unreachable = Server nicht erreichbar. error.invalidaddress = Ungültige Adresse. @@ -290,12 +299,15 @@ no = Nein info.title = [accent]Info error.title = [crimson] Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Blockinfo: +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Kapazität blocks.powershot = Stromverbrauch/Schuss blocks.targetsair = Visiert Luft Einheiten an -blocks.itemspeed = Beförderte Materialien +blocks.itemsmoved = Move Speed blocks.shootrange = Reichweite blocks.size = Größe blocks.liquidcapacity = Flüssigkeitskapazität @@ -316,6 +328,7 @@ blocks.inputitems = Akzeptierte Materialien blocks.outputitem = Erzeugtes Material blocks.drilltier = Abbaubare Erze blocks.drillspeed = Bohrgeschwindigkeit +blocks.maxunits = Max Active Units blocks.liquidoutput = Erzeugte Flüssigkeit blocks.liquidoutputspeed = Ausgabegeschwindigkeit blocks.liquiduse = Flüssigkeitsverbrauch @@ -327,7 +340,10 @@ blocks.liquidfueluse = Kraftstoffverbrauch blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Lebenspunkte +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse @@ -336,11 +352,11 @@ blocks.inputfuel = Kraftstoff blocks.fuelburntime = Kraftstoff Verbrennungs-Zeit blocks.inputcapacity = Annahmekapazität blocks.outputcapacity = Ausgabekapazität +blocks.ammo = Ammo unit.blocks = Blöcke unit.powersecond = Stromeinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde unit.itemssecond = Materialeinheiten/Sekunde -unit.pixelssecond = Pixel/Sekunde unit.liquidunits = Flüssigkeitseinheiten unit.powerunits = Stromeinheiten unit.degrees = Grad @@ -395,7 +411,7 @@ keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse keybind.select.name = Auswählen/Schießen keybind.pick.name = Pick Block -keybind.break.name = Abreißen +keybind.break_block.name = Break Block keybind.deselect.name = Auswahl aufheben keybind.shoot.name = Schießen keybind.zoom_hold.name = Zoom halten @@ -423,7 +439,7 @@ mode.freebuild.description = Begrenzte Ressourcen und kein Timer für Wellen. mode.pvp.name = PvP mode.pvp.description = Kämpfe gegen andere Spieler local. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Materialien content.liquid.name = Flüssigkeiten content.unit.name = Einheiten @@ -448,8 +464,8 @@ item.phase-fabric.name = Phasengewebe item.phase-fabric.description = Eine nahezu gewichtslose Substanz, die in fortgeschrittener Elektronik und in selbstreparierender Technologie verwendet wird. item.surge-alloy.name = Spannungsstoß-Legierung item.surge-alloy.description = Eine fortgeschrittene Legierung mit einzigartigen elektrischen Eigenschaften. -item.biomatter.name = Biomasse -item.biomatter.description = Ein Klumpen organischer Brei. Wird für die Umwandlung in Öl oder als grundliegender Kraftstoff verwendet. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Sand item.sand.description = Ein gängiges Material, welches häufig in geschmolzener Form, flüssig oder als Legierung verwendet wird. item.blast-compound.name = Explosive Mischung @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Wasser -liquid.lava.name = Lava +liquid.slag.name = Slag liquid.oil.name = Öl liquid.cryofluid.name = Kryoflüssigkeit mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Fähigkeit: {0} liquid.heatcapacity = [LIGHT_GRAY]Wärmekapazität: {0} liquid.viscosity = [LIGHT_GRAY]Viskosität: {0} liquid.temperature = [LIGHT_GRAY]Temperatur: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Gegnerischer Startpunkt block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Metallboden block.deepwater.name = Tiefes Wasser block.water.name = Wasser -block.lava.name = Lava block.tar.name = Teer -block.blackstone.name = Schwarzer Stein block.stone.name = Stein -block.dirt.name = Dreck block.sand.name = Sand block.ice.name = Eis block.snow.name = Schnee -block.grass.name = Gras -block.shrub.name = Busch -block.rock.name = Fels -block.blackrock.name = Schwarzer Fels -block.icerock.name = Eisfels +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Kupfermauer block.copper-wall-large.name = Große Kupfermauer block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Große Thorium-Mauer block.door.name = Tür block.door-large.name = Große Tür block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Förderband @@ -555,17 +595,14 @@ block.sorter.name = Sortierer block.sorter.description = Sortiert Materialien. Wenn ein Gegenstand der Auswahl entspricht, darf er vorbei. Andernfalls wird er links oder rechts ausgegeben. block.overflow-gate.name = Überlauftor block.overflow-gate.description = Ein Verteiler, der nur Materialien nach links oder rechts ausgibt, falls der Weg gerade aus blockiert ist. -block.smelter.name = Schmelzer -block.arc-smelter.name = Lichtbogen-Schmelzer block.silicon-smelter.name = Silizium-Schmelzer block.phase-weaver.name = Phasenweber block.pulverizer.name = Pulverisierer block.cryofluidmixer.name = Kryoflüssigkeitsmixer block.melter.name = Schmelzer block.incinerator.name = Verbrennungsanlage -block.biomattercompressor.name = Biomassenverdichter +block.spore-press.name = Spore Press block.separator.name = Separierer -block.centrifuge.name = Zentrifuge block.power-node.name = Stromknoten block.power-node-large.name = Großer Stromknoten block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Brücken-Transportband block.plastanium-compressor.name = Plastanium-Verdichter block.pyratite-mixer.name = Pyratit-Mixer block.blast-mixer.name = Sprengmixer -block.solidifer.name = Verhärter block.solar-panel.name = Solar Panel block.solar-panel-large.name = Großes Solar Panel block.oil-extractor.name = Oil Extraktor @@ -626,7 +662,6 @@ block.liquid-junction.name = Flüssigkeits-Kreuzung block.bridge-conduit.name = Kanalbrücke block.rotary-pump.name = Rotierende Pumpe block.thorium-reactor.name = Thorium-Reaktor -block.command-center.name = Kommandozentrum block.mass-driver.name = Massenbeschleuniger block.blast-drill.name = Sprengbohrer block.thermal-pump.name = Thermische Pumpe @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = Blau team.red.name = Rot team.orange.name = Orange team.none.name = Grau team.green.name = Grün team.purple.name = Lila -unit.alpha-drone.name = Alpha Drohne unit.spirit.name = Spirit Drohne unit.spirit.description = Die anfängliche Drohne. Sie wird gewöhnlich in der Basis Erz ab, sammelt Materialien und repariert Blöcke. unit.phantom.name = Phantom Drohne @@ -697,8 +732,6 @@ tutorial.dagger = Verbinde die Fabrik mit einem Stromknoten. Wenn alle Vorausset tutorial.battle = Der[LIGHT_GRAY] Gegner[] hat seinen Kern offenbart.\nZerstöre ihn mit deiner Einheit und den Dagger Mechs. 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. -block.dense-alloy-wall-large.description = Ein Standard-Verteidigungsblock.\nAngemessener Schutz vor Feinden.\nBenötigt mehrere Kacheln. block.thorium-wall.description = Ein starker Verteidigungsblock.\nGuter Schutz vor Feinden. block.thorium-wall-large.description = Ein starker Verteidigungsblock.\nGuter Schutz vor Feinden.\nBenötigt mehrere Kacheln. block.phase-wall.description = Nicht so stark wie eine Thorium-Mauer, aber reflektiert Schüsse bis zu einer gewissen Stärke. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Verbesserter Transportblock. Bewegt Materi block.phase-conveyor.description = Verbesserter Transportblock. Verwendet Strom, um Materialien zu einem verbundenen Phasen-Förderband über mehrere Kacheln zu teleportieren. block.junction.description = Fungiert als Brücke zwischen zwei kreuzenden Förderbändern. Nützlich, wenn zwei verschiedene Förderbänder sich kreuzen, aber unterschiedliche Materialien verwenden. block.mass-driver.description = Ultimativer Transportblock. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger über eine große Reichweite. -block.smelter.description = Verbrennt Kohle, um Kupfer und Blei zu einer dichten Legierung zu verschmelzen. -block.arc-smelter.description = Verschmilzt Kupfer und Blei zu einer dichten Legierung, indem es eine externe Stromquelle benutzt. block.silicon-smelter.description = Reduziert Sand mit hochreinem Kohlenstoff, um Silizium zu produzieren. block.plastanium-compressor.description = Produziert Plastanium aus Öl und Titan. block.phase-weaver.description = Produziert Phasengewebe aus radioaktivem Thorium und großen Mengen an Sand. @@ -738,12 +769,10 @@ block.pulverizer.description = Zertrümmert Stein zu Sand. Nützlich, wenn kein block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit. block.blast-mixer.description = Verwendet Öl, um Pyratit in eine weniger enzündliche aber explosivee Mischung umzuwandeln. block.cryofluidmixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt. -block.solidifer.description = Kühlt Lava zu großen Mengen Stein. block.melter.description = Erhitzt Stein auf extrem hohe Temperaturen, um Lava zu erhalten. block.incinerator.description = Vernichtet beliebige überschüssige Materialien oder Flüssigkeiten. -block.biomattercompressor.description = Komprimiert Biomasse, um Öl zu erhalten. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Setzt Stein Wasserdruck aus, um verschiedene Mineralien im Stein freizulegen. -block.centrifuge.description = Effizienter als der Separierer, aber auch teurer zum Bauen und benötigt Strom. block.power-node.description = Überträgt Strom zu verbundenen Knoten. Bis zu vier Stromquellen, -verbraucher oder -knoten können verbunden werden. Der Knoten erhält Strom von benachbarten Knoten und gibt Strom benachbarte Blöcke weiter. block.power-node-large.description = Hat einen größeren Radius als der normale Stromknoten und verbindet bis zu sechs Stromquellen, -verbraucher oder -knoten. block.battery.description = Speichert Strom, solange ein Überschuss besteht, und gibt ihn bei Knappheit ab, solange Kapazität vorhanden ist. @@ -765,7 +794,6 @@ block.blast-drill.description = Der ultimative Bohrer. Benötigt große Mengen a block.water-extractor.description = Extrahiert Wasser aus dem Boden. Verwende ihn, wenn es keinen See in der Nähe gibt. block.cultivator.description = Kultiviert den Boden mit Wasser, um Biomasse zu erzeugen. block.oil-extractor.description = Verwendet große Mengen an Strom, um Öl aus Sand zu extrahieren. Verwende ihn, wenn es keine direkte Ölquelle gibt. -block.dart-ship-pad.description = Wechsle in einen Standard-Jäger.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. block.trident-ship-pad.description = Wechsle in einen massiv gepanzerten schweren Bomber.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. block.javelin-ship-pad.description = Wechsle in einen starken und schnellen Abfangjäger mit Blitz-Waffen.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. block.glaive-ship-pad.description = Wechsle in ein großes, gut gepanzertes Kampfflugzeug.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. @@ -781,7 +809,6 @@ block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodene block.fortress-factory.description = Produziert schwere Artillerie-Bodeneinheiten. block.revenant-factory.description = Produziert schwere Laser-Bodeneinheiten. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. -block.command-center.description = Erlaubt es, die KI der eigenen Einheiten zu ändern. Momentan sind Angriff, Rückzug und Patroulle unterstützt. block.conduit.description = Standard Flüssigkeits-Transportblock. Funktioniert wie ein Förderband, nur für Flüssigkeiten. Wird am Besten mit Extraktoren, Pumpen oder anderen Kanälen benutzt. block.pulse-conduit.description = Verbesserter Flüssigkeits-Transportblock. Transportiert Flüssigkeiten schneller und speichert mehr als Standard Kanäle. block.phase-conduit.description = Verbesserter Flüssigkeits-Transportblock. Verwendet Strom, um Flüssigkeiten zu einem verbundenen Phasenkanal zu teleportieren. @@ -795,13 +822,11 @@ block.thermal-pump.description = Die ultimative Pumpe, dreimal so schnell wie ei block.router.description = Akzeptiert Materialien aus einer Richtung und leitet sie gleichmäßig in bis zu drei andere Richtungen weiter. Nützlich, wenn die Materialien aus einer Richtung an mehrere Empfänger verteilt werden sollen. block.distributor.description = Ein weiterentwickelter Router, der Materialien in bis zu sieben Richtungen gleichmäßig verteilt. block.bridge-conveyor.description = Verbesserter Transportblock. Erlaubt es, Materialien über bis zu 3 Kacheln beliebigen Terrains oder Inhalts zu transportieren. -block.alpha-mech-pad.description = Sofern genügend Strom zur Verfügung steht, baut dieses Pad deinen Schiff in einen [accent]Alpha[] mech zurück. block.item-source.description = Produziert unendlich items. Nur im Sandkasten verfügbar. block.liquid-source.description = Produziert unendlich Flüssigkeiten. Nur im Sandkasten verfügbar. block.item-void.description = Zerstört Materialien, die hereingegeben werden, ohne Strom zu verbrauchen. Nur im Sandkasten verfügbar. block.power-source.description = Erzeugt unendlich viel Strom. Nur im Sandkasten verfügbar. block.power-void.description = Verschlingt den kompletten übrigen Strom. Nur im Sandkasten verfügbar. liquid.water.description = Wird überlicherweise zum Kühlen von Maschinen und zur Müllverarbeitung verwendet. -liquid.lava.description = Kann zu [LIGHT_GRAY] Stein[] verarbeitet werden, zur Stromerzeugung verwendet werden oder als Munition für bestimmte Geschütztürme verwendet werden. liquid.oil.description = Kann verbrannt, zum explodieren gebracht, oder als Kühlung verwendet werden. liquid.cryofluid.description = Die effizienteste Flüssigkeit, um Dinge herunter zu kühlen. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index f0f25c6bac..84a6d51bc5 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = ¿Estás seguro que quieres borrar el mapa "[accent]{0}[]"? level.highscore = Puntuación más alta: [accent]{0} level.select = Selección de nivel @@ -185,7 +186,6 @@ map.nospawn = ¡Este mapa no tiene ningún núcleo en el cual pueda aparecer el map.nospawn.pvp = ¡Este mapa no tiene ningún núcleo enemigo para que aparezca el jugador! Añade un núcleo[SCARLET] red[] a este mapa en el editor. map.invalid = Error cargando el mapa: archivo corrupto o inválido. editor.brush = Pincel -editor.slope = \\ editor.openin = Abrir en el Editor editor.oregen = Generación de Minerales editor.oregen.info = Generación de Minerales: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Ha fallado la conexión con el servidor: [accent]{0} error.unreachable = Servidor inaccesible. error.invalidaddress = Dirección inválida. @@ -290,12 +299,15 @@ no = No info.title = [accent]Información error.title = [crimson]Un error ha ocurrido. error.crashtitle = Un error ha ocurrido. +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Información del Bloque +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Capacidad de Energía blocks.powershot = Energía/Disparo blocks.targetsair = Apunta al Aire -blocks.itemspeed = Unidades Movidas +blocks.itemsmoved = Move Speed blocks.shootrange = Rango blocks.size = Tamaño blocks.liquidcapacity = Capacidad de Líquidos @@ -316,6 +328,7 @@ blocks.inputitems = Objetos de Entrada blocks.outputitem = Objeto de Salida blocks.drilltier = Taladrables blocks.drillspeed = Velocidad Base del Taladro +blocks.maxunits = Max Active Units blocks.liquidoutput = Líquido de Salida blocks.liquidoutputspeed = Velocidad de Salida del Líquido blocks.liquiduse = Uso de Líquido @@ -327,7 +340,10 @@ blocks.liquidfueluse = Uso del Combustible Líquido blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Vida +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Imprecisión blocks.shots = Disparos @@ -336,11 +352,11 @@ blocks.inputfuel = Combustible blocks.fuelburntime = Tiempo de Quemado del Combustible blocks.inputcapacity = Capacidad de entrada blocks.outputcapacity = Capacidad de salida +blocks.ammo = Ammo unit.blocks = bloques unit.powersecond = unidades de energía/segundo unit.liquidsecond = unidades de líquido/segundo unit.itemssecond = objetos/segundo -unit.pixelssecond = píxeles/segundo unit.liquidunits = unidades de líquido unit.powerunits = unidades de energía unit.degrees = grados @@ -395,7 +411,7 @@ keybind.move_x.name = Mover x keybind.move_y.name = Mover y keybind.select.name = Seleccionar keybind.pick.name = Pick Block -keybind.break.name = Romper +keybind.break_block.name = Break Block keybind.deselect.name = Deseleccionar keybind.shoot.name = Disparar keybind.zoom_hold.name = Mantener Zoom @@ -423,7 +439,7 @@ mode.freebuild.description = recursos limitados y no hay temporizador para las h mode.pvp.name = PvP mode.pvp.description = Pelea contra otros jugadores localmente. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Objetos content.liquid.name = Líquidos content.unit.name = Unidades @@ -448,8 +464,8 @@ item.phase-fabric.name = Tejido de fase item.phase-fabric.description = Una sustancia casi sin peso usada en electrónica avanzada y en tecnología autoreparadora. item.surge-alloy.name = Surge Alloy item.surge-alloy.description = Una aleación avanzada con propiedades eléctricas únicas. -item.biomatter.name = Biomateria -item.biomatter.description = Una bola de restos orgánicos; usado para convertirlo a petróleo o combustible básico. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Arena item.sand.description = Un material común que es usado extensivamente en la fundición, para alear y como fundente. item.blast-compound.name = Compuesto Explosivo @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Agua -liquid.lava.name = Lava +liquid.slag.name = Slag liquid.oil.name = Petróleo liquid.cryofluid.name = Criogénico mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Hablidad: {0} liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Punto de generación block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Suelo de Metal block.deepwater.name = Aguas profundas block.water.name = Agua -block.lava.name = Lava block.tar.name = Alquitrán -block.blackstone.name = Piedra negra block.stone.name = Piedra -block.dirt.name = Tierra block.sand.name = Arena block.ice.name = Hielo block.snow.name = Nieve -block.grass.name = Pasto -block.shrub.name = Arbusto -block.rock.name = Roca -block.blackrock.name = Roca negra -block.icerock.name = Roca de hielo +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Muro de cobre block.copper-wall-large.name = Muro de cobre grande block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Pared de Torio grande block.door.name = Puerta block.door-large.name = Puerta Larga block.duo.name = Dúo -block.scorch.name = Lanzallamas block.hail.name = Granizo block.lancer.name = Lancero block.conveyor.name = Cinta Transportadora @@ -555,17 +595,14 @@ block.sorter.name = Clasificador block.sorter.description = Clasifica objetos. Si un objeto es igual al seleccionado, pasará al frente. Si no, el objeto saldrá por la izquierda y la derecha. block.overflow-gate.name = Compuerta de Desborde block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena. -block.smelter.name = Horno de Fundición -block.arc-smelter.name = Horno de Arco Eléctrico block.silicon-smelter.name = Horno para Silicona block.phase-weaver.name = Tejedor de Fase block.pulverizer.name = Pulverizador block.cryofluidmixer.name = Mezclador de Criogénicos block.melter.name = Fundidor block.incinerator.name = Incinerador -block.biomattercompressor.name = Compresor de Biomateria +block.spore-press.name = Spore Press block.separator.name = Separador -block.centrifuge.name = Centrifugadora block.power-node.name = Nodo de Energía block.power-node-large.name = Nodo de Energía Grande block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Cinta Transportadora Puente block.plastanium-compressor.name = Compresor de Plastanio block.pyratite-mixer.name = Mezclador de Pirotita block.blast-mixer.name = Mezclador de Explosivos -block.solidifer.name = Solidificador block.solar-panel.name = Panel Solar block.solar-panel-large.name = Panel Solar Grande block.oil-extractor.name = Extractor de Petróleo @@ -626,7 +662,6 @@ block.liquid-junction.name = Cruce de Líquidos block.bridge-conduit.name = Conducto Puente block.rotary-pump.name = Bomba Rotatoria block.thorium-reactor.name = Reactor de Torio -block.command-center.name = Centro de Comando block.mass-driver.name = Teletransportador de Masa block.blast-drill.name = Taladro de explosión block.thermal-pump.name = Bomba Térmica @@ -646,13 +681,13 @@ block.spectre.name = Espectro block.meltdown.name = Meltdown block.container.name = Contenedor block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = Azul team.red.name = Rojo team.orange.name = Naranja team.none.name = Gris team.green.name = Verde team.purple.name = Púrpura -unit.alpha-drone.name = Dron Alpha unit.spirit.name = Dron Espíritu unit.spirit.description = El dron del comienzo. Aparece en el núcleo por defecto. Mina automáticamente minerales, recoge objetos y repara bloques. unit.phantom.name = Dron Fantasmal @@ -697,8 +732,6 @@ tutorial.dagger = Conecta nodos de energía a la fábrica.\nUna vez las necesida tutorial.battle = El[LIGHT_GRAY] enemy[] ha revelado su núcleo.\nDestrúyelo con tu nave y tus unidades de combate. block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defneder e núcleo y las torres en las primeras hordas. block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defneder e núcleo y las torres en las primeras hordas.\nOcupa múltiples casillas. -block.dense-alloy-wall.description = Un bloque de defensa estándar.\nProtección adecuada contra enemigos. -block.dense-alloy-wall-large.description = Un bloque de defensa estándar.\nProtección adecuada contra enemigos.\nOcupa múltiples casillas. block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos. block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas. block.phase-wall.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Bloque de transporte avanzado. Mueve objet block.phase-conveyor.description = Bloque de transporte avanzado. Usa energía para transportar objetos a otro transportador de fase conectado por varias casillas. block.junction.description = Actúa como puente para dos transportadores que se cruzan. Útil en situaciones con dos diferentes transportadores transportando diferentes materiales a diferentes lugares. block.mass-driver.description = El mejor bloque de transorte. Recoge varios objetos y los dispara a otro conductor de masa en un largo rango. -block.smelter.description = Quema carbón para fundir cobre y plomo, produciendo así aleación densa. -block.arc-smelter.description = Funde cobre y plomo en aleación densa usando una fuented de energía externa. block.silicon-smelter.description = Reduce arena con coque de alta pureza para producir silicona. block.plastanium-compressor.description = Produce plastanio con aceite y titanio. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. @@ -738,12 +769,10 @@ block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: compuesto explosivo. block.cryofluidmixer.description = Combina agua y titanio en líquido criogénico que es mucho más eficiente para enfriar. -block.solidifer.description = Enfría la lava a piedra a una gran velocidad. block.melter.description = Calienta piedra a temperaturas muy altas para obtener lava. block.incinerator.description = Se deshace de cualquier líquido u objeto excesivo. -block.biomattercompressor.description = Comprime biomateria para extraer aceite. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra. -block.centrifuge.description = Más eficiente que un separador, pero es más caro de construir y requiere energía. block.power-node.description = Transmite energía a nodos conectados, conecta hasta cuatro fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente. block.power-node-large.description = Tiene un radio más amplio que el nodo de energía y conecta hasta seis fuentes de energía, edificios que usan energía o nodos. block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía. @@ -765,7 +794,6 @@ block.blast-drill.description = El mejor taladro. Requiere grandes cantidades de block.water-extractor.description = Extrae agua de la tierra. Úsalo cuando no haya lagos cercanos. block.cultivator.description = Cultiva la tierra para obtener biomateria. block.oil-extractor.description = Usa grandes cantidades de energía para extraer aceite de la arena. Úsalo cuando no hay fuentes directas de aceite cerca. -block.dart-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea básica.\nUsa el pad tocándolo dos veces mientras estás en él. block.trident-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea bombardera pesada.\nUsa el pad tocándolo dos veces mientras estás en él. block.javelin-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea fuerte y rápida interceptora con arma eléctrica.\nUsa el pad tocándolo dos veces mientras estás en él. 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. @@ -781,7 +809,6 @@ block.titan-factory.description = Produce unidades terrestres avanzadas. block.fortress-factory.description = Produce unidades terrestres de artillería pesada. block.revenant-factory.description = Produce unidades terrestres láser pesadas. block.repair-point.description = Repara la unidad dañada más cercana a su alrededor. -block.command-center.description = Permite cambiar el comportamiento de la IA aliada. Actualmente, atacar, retirarse y patrullar son los comandos soportados. block.conduit.description = Bloque de transporte de líquidos básico. Funciona como un transportador, pero con líquidos. Usado con bombas, extractores u otros conductos. block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Transporta líquidos más rápidamente y almacena más que los conductos estándar. block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado por varias casillas. @@ -795,13 +822,11 @@ block.thermal-pump.description = La mejor bomba. Tres veces más rápido que la block.router.description = Acepta objetos de una dirección y deja objetos equitativamente en hasta 3 direcciones diferentes. Útil para dividir los materiales de una fuente de recursos a múltiples objetivos. block.distributor.description = Un enrutador avanzado que distribuye objetos equitativamente en hasta otras 7 direcciones. block.bridge-conveyor.description = Bloque avanado de transporte. Puede transportar objetos por encima hasta 3 casillas de cualquier terreno o construcción. -block.alpha-mech-pad.description = Cuando se le da suficiente energía, reconstruye tu nave en el mecanoide[accent] Alpha[]. block.item-source.description = Da objetos infinitos. Solo en sandbox. block.liquid-source.description = Da líquido infinito. Solo en sandbox. block.item-void.description = Destruye cuanquier objeto que va a él sin necesitar energía. Solo en sandbox. block.power-source.description = Da energía infinita. Solo en sandbox. block.power-void.description = Elimina toda la energía que se le da. Solo en sandbox. liquid.water.description = Usado comúnmente para enfriar máquinas y para procesar residuos. -liquid.lava.description = Puede usarse para ser transformado en[LIGHT_GRAY] stone[], para generar energía o para munición de ciertas torres. liquid.oil.description = Puede ser quemado, explotado o como un enfriador. liquid.cryofluid.description = El líquido más eficiente pra enfriar las cosas. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 436c82e65b..c836a7610b 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Êtes-vous sûr de supprimer cette carte"[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection de niveau @@ -185,7 +186,6 @@ map.nospawn = Cette carte n'a pas de base pour que le joueur y apparaisse! Ajout map.nospawn.pvp = Cette carte n'a pas de base ennemies pour qu'un joueur ennemi y apparaisse! Ajouter au moins une [SCARLET]Base rouge[] sur cette carte dans l'éditeur. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. editor.brush = Pinceau -editor.slope = \\ editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération de minerais editor.oregen.info = Génération de minerais: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Échec de la connexion au serveur : [accent]{0} error.unreachable = Server injoignable. error.invalidaddress = Adresse invalide. @@ -290,12 +299,15 @@ no = Non info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Info sur le bloc +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = capacité d'énergie blocks.powershot = Énergie/Tir blocks.targetsair = Cible les unités aériennes -blocks.itemspeed = Objets déplacés +blocks.itemsmoved = Move Speed blocks.shootrange = Portée blocks.size = Taille blocks.liquidcapacity = Capacité en liquide @@ -316,6 +328,7 @@ blocks.inputitems = Objets utilisés blocks.outputitem = Objet produit blocks.drilltier = Forable blocks.drillspeed = Vitesse de forage de base +blocks.maxunits = Max Active Units blocks.liquidoutput = Liquide en sortie blocks.liquidoutputspeed = Vitesse de production de liquide blocks.liquiduse = Quantité de liquide utilisée @@ -327,7 +340,10 @@ blocks.liquidfueluse = Quantité de carburant liquide utilisé blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Santé +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Précision blocks.shots = Tir @@ -336,11 +352,11 @@ blocks.inputfuel = Carburant blocks.fuelburntime = Durée du carburant blocks.inputcapacity = Capacité d'entrée blocks.outputcapacity = Capacité de production +blocks.ammo = Ammo unit.blocks = blocs unit.powersecond = Énergie/seconde unit.liquidsecond = Liquides/seconde unit.itemssecond = Objets/seconde -unit.pixelssecond = Pixels/seconde unit.liquidunits = Unité de liquide unit.powerunits = Unité d'énergie unit.degrees = degrés @@ -395,7 +411,7 @@ keybind.move_x.name = mouvement x keybind.move_y.name = mouvement y keybind.select.name = sélectionner keybind.pick.name = Pick Block -keybind.break.name = Pause +keybind.break_block.name = Break Block keybind.deselect.name = Déselectionner keybind.shoot.name = tirer keybind.zoom_hold.name = tenir le zoom @@ -423,7 +439,7 @@ mode.freebuild.description = Ressources limitées et pas de timer pour les vague mode.pvp.name = JcJ mode.pvp.description = Battez-vous contre d'autres joueurs en local. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités @@ -448,8 +464,8 @@ item.phase-fabric.name = Tissu phasé item.phase-fabric.description = Une substance au poids quasiment inexistant utilisé pour l'électronique avancé et la technologie auto-réparatrice. item.surge-alloy.name = Alliage superchargé item.surge-alloy.description = Un alliage avancé avec des propriétés électriques avancées. -item.biomatter.name = Biomasse -item.biomatter.description = Un mélange de matières organiques; utilisé pour la transformation en huile ou en tant que carburant de base. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Sable item.sand.description = Un matériau commun utilisé largement dans la fonte, à la fois dans l'alliage et comme un flux. item.blast-compound.name = Mélange explosif @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Eau -liquid.lava.name = Lave +liquid.slag.name = Slag liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide cryogénique mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Compétence: {0} liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0} liquid.viscosity = [LIGHT_GRAY]Viscosité: {0} liquid.temperature = [LIGHT_GRAY]Température: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Générateur d'ennemis block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Sol en métal block.deepwater.name = Eau profonde block.water.name = Eau -block.lava.name = Lave block.tar.name = Pétrole -block.blackstone.name = Roche sombre block.stone.name = Roche -block.dirt.name = Terre block.sand.name = Sable block.ice.name = glace block.snow.name = Neige -block.grass.name = Herbe -block.shrub.name = Buisson -block.rock.name = Pierre -block.blackrock.name = Pierre sombre -block.icerock.name = Pierre gelée +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Mur de cuivre block.copper-wall-large.name = Grand mur de cuivre block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Mur en Thorium large block.door.name = Porte block.door-large.name = Grande porte block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancier block.conveyor.name = Convoyeur @@ -555,17 +595,14 @@ block.sorter.name = Sorteur block.sorter.description = Trie les articles. Si un article rcorrespond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite. block.overflow-gate.name = Barrière de Débordement block.overflow-gate.description = C'est la combinaison entre un Routeur et un Diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué. -block.smelter.name = Fonderie d'alliage lourd -block.arc-smelter.name = Fonderie d'alliage lourd électrique block.silicon-smelter.name = Fonderie de Silicone block.phase-weaver.name = Tisseur à Phase block.pulverizer.name = Pulvérisateur block.cryofluidmixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur -block.biomattercompressor.name = Compresseur de Biomasse +block.spore-press.name = Spore Press block.separator.name = Séparateur -block.centrifuge.name = Centrifugeuse block.power-node.name = Transmetteur énergétique block.power-node-large.name = Gros transmetteur énergétique block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Pont block.plastanium-compressor.name = Compresseur de Plastanium block.pyratite-mixer.name = Mixeur à Pyratite block.blast-mixer.name = Mixeur à Explosion -block.solidifer.name = Solidifieur block.solar-panel.name = Panneau Solaire block.solar-panel-large.name = Grand Panneau Solaire block.oil-extractor.name = Extracteur d'huile @@ -626,7 +662,6 @@ block.liquid-junction.name = Jonction à Liquide block.bridge-conduit.name = Pont à liquide block.rotary-pump.name = Pompe Rotative block.thorium-reactor.name = Réacteur à Thorium -block.command-center.name = Centre de commandement block.mass-driver.name = Transporteur de masse block.blast-drill.name = Foreuse à explosion block.thermal-pump.name = Pompe thermique @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Conteneur block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = Bleu team.red.name = Rouge team.orange.name = Orange team.none.name = Gris team.green.name = Vert team.purple.name = Violet -unit.alpha-drone.name = Alpha Drone unit.spirit.name = Drone sppirituel unit.spirit.description = L'unité de soutien de départ. Apparaît dans la base par défaut. Mine automatiquement les minerais, récupère les objets au sol et répare les blocs. unit.phantom.name = Drone Fantôme @@ -697,8 +732,6 @@ tutorial.dagger = Reliez des transmetteurs énergétiques à l'usine.\nUne fois 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 à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues. block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.\nFait du 2 sur 2. -block.dense-alloy-wall.description = Un bloc défensif standard .\nProcure une bonne protection contre les ennemis. -block.dense-alloy-wall-large.description = Un bloc défensif standard .\nProcure une bonne protection contre les ennemis.\nFait du 2 sur 2. block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis. block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.\nFait du 2 sur 2. block.phase-wall.description = Moins puissant qu'un mur en Thorium mais déviera les balles sauf si elles sont trop puissantes. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Convoyeur avancé . Déplace les objets pl block.phase-conveyor.description = convoyeur très avancé . Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance . block.junction.description = Agit comme un pont pour deux ligne de convoyeurs se croisant. Utile lorsque deux différents convoyeurs déplacent différents matériaux à différents endroits. block.mass-driver.description = Batiment de transport d'objet [accent]ultime[]. Collecte un grand nombre d'objets puis les tire à un autre transporteur de masse sur une très longue distance. -block.smelter.description = Brûle du charbon pour fondre du cuivre et du plomb en un alliage lourd. -block.arc-smelter.description = Fait fondre du cuivre et du plomb en un alliage lourd en utilisant une source d'énergie extérieure . block.silicon-smelter.description = Utilise du sable, du charbon et de l'énergie afin de produire du silicone. block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. block.phase-weaver.description = Produit du tissu phasé à partir de thorium et de grandes quantités de sable. @@ -738,12 +769,10 @@ block.pulverizer.description = Écrase la pierre pour en faire du sable. Utile q block.pyratite-mixer.description = Mélange charbon, plomb et sable en l'hautement inflammable pyratite. block.blast-mixer.description = Utilise du pétrole pour transformer la pyratite en un mélange explosif moins inflammable mais plus explosif que la pyratite. block.cryofluidmixer.description = Combine de l'eau et du titane en un liquide cryogénique bien plus efficace pour refroidir. -block.solidifer.description = Refroidit de la lave en pierre très rapidement. block.melter.description = chauffe de la pierre à de très hautes températures pour obtenir de la lave. block.incinerator.description = Permet de se débarasser de n'importe quel objet ou liquide en exces . -block.biomattercompressor.description = Compresse de la biomasse pour en récupérer le pétrole. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Expose la pierre à de l'eau sous pression afin d'obtenir différents minéraux contenus dansla pierre. -block.centrifuge.description = Plus efficace qu'un séparateur mais aussi plus cher à construire et demande plus d'énergie. block.power-node.description = Transmet l'énergie aux transmetteurs énergétiques connectés . Jusqu'à quatre sources d'énergie, consommateurs ou transmetteurs peuvent être connectés. Le transmetteur recevra de l'énergie ou le transmettra à n'importe quel batiment adjacent. block.power-node-large.description = A un plus grand rayon que le transmetteur énergétique standard et jusqu'à six sources d'énergie, consommateurs ou transmetteurs peuvent être connectés. block.battery.description = Stocke l'énergie quand elle est en abondance et le distribue si il y a trop peu d'énergie tant qu'il lui reste de l'énergie. @@ -765,7 +794,6 @@ block.blast-drill.description = La Foreuse ultime . Demande une grande quantité block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'eau à proximité. block.cultivator.description = Cultive le sol avec de l'eau afin d'obtenir de la biomasse. block.oil-extractor.description = Utilise une grande quantité d'énergie afin d'extraire du pétrole du sable . Utile quand il n'y a pas de lacs de pétrole à proximité. -block.dart-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un avion de combat basique .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. block.trident-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un bombardier lourd raisonnablement cuirassé .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. block.javelin-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un intercepteur rapide et puissant avec des armes électriques.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. block.glaive-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un large vaisseau cuirassé .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. @@ -781,7 +809,6 @@ block.titan-factory.description = Produit des unités terrestres avancées et cu block.fortress-factory.description = Produit des unités terrestres d'artillerie lourde . block.revenant-factory.description = Produit des unités terrestres lourdes avec des lasers. block.repair-point.description = Soigne en continu l'unité blessée la plus proche tant qu'elle est à sa portée. -block.command-center.description = Permet de changer le comportement des IA alliées. Pour le moment, l'attaque, la retraite et les patrouilles sont supportées. block.conduit.description = tuyau basique permettant le transport de liquide . Marche comme un convoyeur mais avec les liquides. Utile si utilisé avec des extracteurs, des pompes ou d'autres conduits. block.pulse-conduit.description = tuyau avancé permettant le transport de liquide . Transporte les liquides plus rapidement et en stocke plus que les tuyaux standards. block.phase-conduit.description = tuyau très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre tuyau phasé sur une longue distance. @@ -795,13 +822,11 @@ block.thermal-pump.description = La pompe ultime . Trois fois plus rapide qu'une block.router.description = Accepte les objets depuis une ou plus directions et le renvoie dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs.[accent]Le seul et l'Unique[] block.distributor.description = Un routeur avancé qui sépare les objets jusqu'à 7 autres directions équitablement. block.bridge-conveyor.description = bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou batiment. -block.alpha-mech-pad.description = Avec assez d'énergie, reconstruit votre vaisseau en un mécha [accent] Alpha[]. block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement . block.liquid-source.description = Source de liquide infinie . Bac à sable uniquement. block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur sans utiliser d'énergie. Bac à sable uniquement. block.power-source.description = Produit de l'énergie à l'infini. Bac à sable uniquement. block.power-void.description = Supprime toute l'énergie allant à l'intérieur.Bac à sable uniquement liquid.water.description = Couramment utilisé pour le refroidissement et le traitement des déchets. -liquid.lava.description = Peut être transformé en [LIGHT_GRAY]pierre[], utilisé pour produire de l'énergie ou utilisé comme munition par certaines tourelles. liquid.oil.description = Peut être brûlé, utilisé comme explosif ou comme liquide de refroidissement. liquid.cryofluid.description = Le liquide de refroidissement le plus efficace. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index cea1692a02..ee3b8fe759 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection de niveau @@ -185,7 +186,6 @@ map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse appa map.nospawn.pvp = Cette carte ne contient aucune base ennemi dans lequel le joueur apparaît!\nAjoutez des bases[SCARLET] rouge[] à cette carte dans l'éditeur. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. editor.brush = Pinceau -editor.slope = Pente editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération des minerais editor.oregen.info = Génération de minerais: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Échec de la connexion au serveur: [accent]{0} error.unreachable = Serveur inaccessible. error.invalidaddress = Adresse invalide. @@ -290,12 +299,15 @@ no = Non info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Info sur le bloc +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Capacité d'énergie blocks.powershot = Énergie/Tir blocks.targetsair = Cible les unités aériennes -blocks.itemspeed = Objets déplacés +blocks.itemsmoved = Move Speed blocks.shootrange = Portée blocks.size = Taille blocks.liquidcapacity = Capacité en liquide @@ -316,6 +328,7 @@ blocks.inputitems = Objets utilisés blocks.outputitem = Objet produit blocks.drilltier = Forable blocks.drillspeed = Vitesse de forage de base +blocks.maxunits = Max Active Units blocks.liquidoutput = Liquide en sortie blocks.liquidoutputspeed = Vitesse de sortie du liquide blocks.liquiduse = Quantité de liquide utilisé @@ -327,7 +340,10 @@ blocks.liquidfueluse = Quantité de carburant liquide utilisé blocks.boostitem = Objet boostant la production blocks.boostliquid = Liquide boostant la production blocks.health = Santé +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Précision blocks.shots = Tirs @@ -336,11 +352,11 @@ blocks.inputfuel = Carburant blocks.fuelburntime = Durée du carburant blocks.inputcapacity = Capacité d'entrée blocks.outputcapacity = Capacité de sortie +blocks.ammo = Ammo unit.blocks = Blocs unit.powersecond = Énergie/seconde unit.liquidsecond = Liquides/seconde unit.itemssecond = Objets/seconde -unit.pixelssecond = Pixels/seconde unit.liquidunits = Unité de liquide unit.powerunits = Unité d'énergie unit.degrees = degrés @@ -395,7 +411,7 @@ keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement Y keybind.select.name = Sélectionner/Tirer keybind.pick.name = Pick Block -keybind.break.name = Pause +keybind.break_block.name = Break Block keybind.deselect.name = Déselectionner keybind.shoot.name = Tirer keybind.zoom_hold.name = Tenir le zoom @@ -423,7 +439,7 @@ mode.freebuild.description = Ressources limitées et pas de compte à rebours po mode.pvp.name = PvP mode.pvp.description = Lutter contre d'autres joueurs pour gagner ! mode.attack.name = Attaque -mode.attack.descrption = Pas de vagues, le but est de détruire la base ennemie. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités @@ -448,8 +464,8 @@ item.phase-fabric.name = Phase Fabric item.phase-fabric.description = Une substance presque en apesanteur utilisée dans l'électronique de pointe et la technologie autoréparable. item.surge-alloy.name = Alliage superchargé item.surge-alloy.description = Un alliage avancé aux propriétés électriques uniques. -item.biomatter.name = Biomasse -item.biomatter.description = Un mélange de matières organiques; utilisé pour la transformation en pétrole ou en tant que carburant de base. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Sable item.sand.description = Un matériau commun utilisé largement dans la fonte, à la fois dans l'alliage et comme un flux. item.blast-compound.name = Mélange explosif @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Eau -liquid.lava.name = Lave +liquid.slag.name = Slag liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide Cryogénique mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Compétence: {0} liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique {0} liquid.viscosity = [LIGHT_GRAY]Viscosité: {0} liquid.temperature = [LIGHT_GRAY]Température: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Générateur d'ennemi block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Sol en métal block.deepwater.name = Eau profonde block.water.name = Eau -block.lava.name = Lave block.tar.name = Pétrole -block.blackstone.name = Roche sombre block.stone.name = Roche -block.dirt.name = Terre block.sand.name = Sable block.ice.name = Glace block.snow.name = Neige -block.grass.name = Herbe -block.shrub.name = Buisson -block.rock.name = Pierre -block.blackrock.name = Pierre sombre -block.icerock.name = Pierre gelée +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Mur de cuivre block.copper-wall-large.name = Grand mur de cuivre block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Mur en Thorium large block.door.name = Porte block.door-large.name = Grande porte block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Transporteur @@ -555,17 +595,14 @@ block.sorter.name = Trieur block.sorter.description = Trie les articles. Si un article correspond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite. block.overflow-gate.name = Barrière de Débordement block.overflow-gate.description = C'est la combinaison entre un Routeur et un Diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué. -block.smelter.name = Fonderie d'alliage lourd -block.arc-smelter.name = Fonderie d'alliage lourd électrique block.silicon-smelter.name = Fonderie de Silicone block.phase-weaver.name = Tisseur à phase block.pulverizer.name = Pulvérisateur block.cryofluidmixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur -block.biomattercompressor.name = Compresseur de Biomasse +block.spore-press.name = Spore Press block.separator.name = Séparateur -block.centrifuge.name = Centrifugeuse block.power-node.name = Transmetteur énergétique block.power-node-large.name = Grand transmetteur énergétique block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Pont transporteur block.plastanium-compressor.name = Compresseur de plastanium block.pyratite-mixer.name = Mixeur à pyratite block.blast-mixer.name = Mixeur à explosion -block.solidifer.name = Solidifieur block.solar-panel.name = Panneau solaire block.solar-panel-large.name = Grand panneau solaire block.oil-extractor.name = Extracteur de pétrol @@ -626,7 +662,6 @@ block.liquid-junction.name = Jonction à Liquide block.bridge-conduit.name = Pont à liquide block.rotary-pump.name = Pompe Rotative block.thorium-reactor.name = Réacteur à Thorium -block.command-center.name = Centre de commandement block.mass-driver.name = Transporteur de masse block.blast-drill.name = Foreuse à explosion block.thermal-pump.name = Pompe thermique @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Conteneur block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = Bleu team.red.name = Rouge team.orange.name = Orange team.none.name = Gris team.green.name = Vert team.purple.name = Violet -unit.alpha-drone.name = Drone alpha unit.spirit.name = Drone spirituel unit.spirit.description = L'unité de soutien de départ. Apparaît dans la base par défaut. Mine automatiquement les minerais, récupère les objets au sol et répare les blocs. unit.phantom.name = Drone Fantôme @@ -697,8 +732,6 @@ tutorial.dagger = Reliez des transmetteurs énergétiques à l'usine.\nUne fois 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. -block.dense-alloy-wall-large.description = Un bloc défensif standard.\nUne protection adéquate contre les ennemis.\nS'étend sur plusieurs tuiles. block.thorium-wall.description = Un puissant bloc défensif.\nBonne protection contre les ennemis. block.thorium-wall-large.description = Un puissant bloc défensif.\nBonne protection contre les ennemis.\nS'étend sur plusieurs tuiles. block.phase-wall.description = Pas aussi fort qu'un mur de thorium, mais détournera les balles à moins qu'elles ne soient trop puissantes. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Bloc de transport d'articles avancé.\nDé block.phase-conveyor.description = Bloc de transport d'articles avancé.\nUtilise le pouvoir de téléporter des articles vers un convoyeur de phase connecté sur plusieurs carreaux. block.junction.description = Agit comme un pont pour deux bandes transporteuses qui se croisent.\nUtile dans les situations avec deux convoyeurs différents transportant des matériaux différents à des endroits différents. block.mass-driver.description = Bloc de transport d'articles ultime.\nRecueille plusieurs objets et les envoie ensuite à un autre pilote de masse sur une longue distance. -block.smelter.description = Brûle le charbon pour fondre le cuivre et le plomb en un alliage dense. -block.arc-smelter.description = Fait fondre le cuivre et le plomb en un alliage dense en utilisant une source d'alimentation externe. block.silicon-smelter.description = Réduit le sable avec du coke* très pur afin de produire du silicium. (*Coke produit à partir de charbon:REF) block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. block.phase-weaver.description = Produit un tissu de phase à partir de thorium radioactif et de grandes quantités de sable. @@ -738,12 +769,10 @@ block.pulverizer.description = Brise la pierre en sable. Utile en cas de manque block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable. block.blast-mixer.description = Utilise du pétrole pour transformer la pyratite en un composé explosif moins inflammable mais plus explosif. block.cryofluidmixer.description = L'eau et le titane combinés forment un fluide cryo beaucoup plus efficace pour le refroidissement. -block.solidifer.description = Refroidit la lave en pierre à un rythme rapide. block.melter.description = Chauffe la pierre à des températures très élevées pour obtenir de la lave. block.incinerator.description = Se débarrasse de tout article ou liquide en excès. -block.biomattercompressor.description = Compresse biomatter afin de récupérer du pétrole. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Exposer la pierre à la pression de l'eau afin d'obtenir différents minéraux contenus dans la pierre. -block.centrifuge.description = Plus efficace que le séparateur, mais aussi plus coûteux à construire et à alimenter. block.power-node.description = Transmet la puissance à des noeuds connectés. Il est possible de connecter jusqu'à quatre sources d'alimentation, puits ou nœuds.\nLe nœud recevra de l’alimentation ou fournira l’alimentation à tous les blocs adjacents. block.power-node-large.description = Son rayon d'action est supérieur à celui du nœud d'alimentation et peut être connecté à six sources d'alimentation, puits ou nœuds au maximum. block.battery.description = Stocke l’énergie chaque fois qu’il ya abondance et en cas de pénurie, tant qu’il reste de la capacité. @@ -765,7 +794,6 @@ block.blast-drill.description = L'extracteur ultime. Nécessite de grandes quant block.water-extractor.description = Extrait l'eau du sol. Utilisez-le quand il n'y a pas de lac à proximité. block.cultivator.description = Cultiver le sol avec de l'eau afin d'obtenir du biomatter. block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité. -block.dart-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en avion de combat de base.\nUtilisez la plate-forme en tapotant deux fois dessus. block.trident-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un bombardier lourd raisonnablement bien blindé.\nUtilisez la plate-forme en tapotant deux fois dessus. block.javelin-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un intercepteur puissant et rapide doté d’armes légères.\nUtilisez la plate-forme en tapotant deux fois dessus. block.glaive-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un grand vaisseau de combat bien blindé.\nUtilisez la plate-forme en tapotant deux fois dessus. @@ -781,7 +809,6 @@ block.titan-factory.description = Produit des unités terrestres avancées et bl block.fortress-factory.description = Produit des unités terrestres d'artillerie lourde. block.revenant-factory.description = Produit des unités terrestres laser lourdes. block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. -block.command-center.description = Permet de changer le comportement amical de l'IA. Actuellement, les commandes d'attaque, de retraite et de patrouille sont prises en charge. block.conduit.description = Bloc de transport liquide de base. Fonctionne comme un convoyeur, mais avec des liquides. Utilisation optimale avec des extracteurs, des pompes ou d’autres conduits. block.pulse-conduit.description = Bloc de transport de liquide avancé. Transporte les liquides plus rapidement et stocke plus que des conduits standard. block.phase-conduit.description = Bloc de transport de liquide avancé. Utilise le pouvoir de téléporter des liquides vers un conduit de phase connecté sur plusieurs carreaux. @@ -795,13 +822,11 @@ block.thermal-pump.description = La pompe ultime. Trois fois plus rapide qu'une block.router.description = Accepte les éléments d'une direction et les envoie dans 3 autres directions de manière égale. Utile pour séparer les matériaux d'une source en plusieurs cibles. block.distributor.description = Un routeur avancé qui divise les articles en 7 autres directions de manière égale. [scarlet]Seule et unique ![] block.bridge-conveyor.description = Bloc de transport d'articles avancé. Permet de transporter des objets sur plus de 3 tuiles de n'importe quel terrain ou bâtiment. -block.alpha-mech-pad.description = Lorsque vous avez assez de puissance, reconstruisez votre vaisseau dans le [accent]Alpha[] mech. block.item-source.description = Sort infiniment les articles. Bac à sable seulement. block.liquid-source.description = Débit infini de liquides. Bac à sable seulement. block.item-void.description = Détruit tous les objets qui y entrent sans utiliser d'énergie. Bac à sable seulement. block.power-source.description = Débit infini d'énergie. Bac à sable seulement. block.power-void.description = Annule toute l'énergie qui y est introduite. Bac à sable seulement. liquid.water.description = Couramment utilisé pour les machines de refroidissement et le traitement des déchets. -liquid.lava.description = Peut être transformé en [LIGHT_GRAY]pierre[], utilisé pour générer de l'énergie ou utilisé comme munition pour certaines tourelles. liquid.oil.description = Peut être brûlé, explosé ou utilisé comme liquide de refroidissement. liquid.cryofluid.description = Le liquide de refroidissement le plus efficace. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index d1604949cd..d591dce885 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Apakah kamu yakin ingin menghapus peta "[orange]{0}[]"? level.highscore = Skor Tinggi: [accent]{0} level.select = Pilih Level @@ -185,7 +186,6 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a 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. map.invalid = Error loading map: corrupted or invalid map file. editor.brush = Brush -editor.slope = \\ editor.openin = Open In Editor editor.oregen = Ore Generation editor.oregen.info = Ore Generation: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Gagal terhubung ke server: [accent]{0} error.unreachable = Server unreachable. error.invalidaddress = Invalid address. @@ -290,12 +299,15 @@ no = No info.title = [accent]Info error.title = [crimson]Telah terjadi kesalahan error.crashtitle = Telah terjadi kesalahan +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Info Blok +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Kapasitas Tenaga blocks.powershot = Tenaga/tembakan blocks.targetsair = Targets Air -blocks.itemspeed = Units Moved +blocks.itemsmoved = Move Speed blocks.shootrange = Range blocks.size = Ukuran blocks.liquidcapacity = Kapasitas cairan @@ -316,6 +328,7 @@ blocks.inputitems = Input Items blocks.outputitem = Output Item blocks.drilltier = Drillables blocks.drillspeed = Base Drill Speed +blocks.maxunits = Max Active Units blocks.liquidoutput = Liquid Output blocks.liquidoutputspeed = Liquid Output Speed blocks.liquiduse = Liquid Use @@ -327,7 +340,10 @@ blocks.liquidfueluse = Liquid Fuel Use blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Darah +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Ketidaktelitian blocks.shots = Tembakan @@ -336,11 +352,11 @@ blocks.inputfuel = Fuel blocks.fuelburntime = Fuel Burn Time blocks.inputcapacity = Kapasitas masuk blocks.outputcapacity = Kapasitas keluar +blocks.ammo = Ammo unit.blocks = blocks unit.powersecond = power units/second unit.liquidsecond = liquid units/second unit.itemssecond = items/second -unit.pixelssecond = pixels/second unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees @@ -395,7 +411,7 @@ keybind.move_x.name = gerak_x keybind.move_y.name = gerak_y keybind.select.name = pilih keybind.pick.name = Pick Block -keybind.break.name = hapus +keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = tembak keybind.zoom_hold.name = perbesar_tahan @@ -423,7 +439,7 @@ mode.freebuild.description = limited resources and no timer for waves. mode.pvp.name = PvP mode.pvp.description = fight against other players locally. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Items content.liquid.name = Liquids content.unit.name = Units @@ -448,8 +464,8 @@ 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.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = pasir 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 @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = air -liquid.lava.name = lahar +liquid.slag.name = Slag liquid.oil.name = minyak liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Ability: {0} liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Enemy Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -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.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Large Thorium Wall block.door.name = pintu block.door-large.name = pintu besar block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = konveyor @@ -555,17 +595,14 @@ block.sorter.name = penyortir 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.smelter.name = peleburan -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.spore-press.name = Spore Press block.separator.name = Separator -block.centrifuge.name = Centrifuge block.power-node.name = Power Node block.power-node-large.name = Large Power Node block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ 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 @@ -626,7 +662,6 @@ 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 @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 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 @@ -697,8 +732,6 @@ tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a 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. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Advanced item transport block. Moves items 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. @@ -738,12 +769,10 @@ block.pulverizer.description = Crushes stone into sand. Useful when there is a l 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.spore-press.description = Compresses spore pods into 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. @@ -765,7 +794,6 @@ block.blast-drill.description = The ultimate drill. Requires large amounts of po 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. @@ -781,7 +809,6 @@ 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. @@ -795,13 +822,11 @@ block.thermal-pump.description = The ultimate pump. Three times as fast as a mec 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.item-source.description = Infinitely outputs items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.power-void.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. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 45c352c10a..54539615aa 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Sei sicuro di voler eliminare questa mappa"[accent]{0}[]"? level.highscore = Miglior punteggio: [accent]{0} level.select = Selezione del livello @@ -185,7 +186,6 @@ map.nospawn = Questa mappa non possiede un nucleo dove spawnare! Aggiungine uno 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. map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido. editor.brush = Pennello -editor.slope = \\ editor.openin = Apri nell'editor editor.oregen = Generazione dei minerali editor.oregen.info = Generazione dei minerali: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson] Impossibile connettersi al server: [accent] {0} error.unreachable = Server unreachable. error.invalidaddress = Invalid address. @@ -290,12 +299,15 @@ no = No info.title = [accent] Info error.title = [crimson]Si è verificato un errore error.crashtitle = Si è verificato un errore +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = info sul blocco +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Capacità Energetica blocks.powershot = Danno/Colpo blocks.targetsair = Attacca nemici aerei -blocks.itemspeed = Unità spostate +blocks.itemsmoved = Move Speed blocks.shootrange = Raggio blocks.size = Grandezza blocks.liquidcapacity = Capacità del liquido @@ -316,6 +328,7 @@ blocks.inputitems = Oggetti in entrata blocks.outputitem = Oggetti in uscita blocks.drilltier = Scavabili blocks.drillspeed = Velocità scavo stbile +blocks.maxunits = Max Active Units blocks.liquidoutput = Uscita liquidi blocks.liquidoutputspeed = Liquid Output Speed blocks.liquiduse = Uso liquidi @@ -327,7 +340,10 @@ blocks.liquidfueluse = Utilizzo carburante liquido blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Salute +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Inaccuratezza blocks.shots = Colpi @@ -336,11 +352,11 @@ blocks.inputfuel = Carburante blocks.fuelburntime = Tempo combustione carburante blocks.inputcapacity = Capacità di ingresso blocks.outputcapacity = Capacità di uscita +blocks.ammo = Ammo unit.blocks = blocchi unit.powersecond = unità energia/secondo unit.liquidsecond = unità liquide/secondo unit.itemssecond = oggetti/secondo -unit.pixelssecond = pixel/secondo unit.liquidunits = unità liquidi unit.powerunits = unità energia unit.degrees = gradi @@ -395,7 +411,7 @@ keybind.move_x.name = Sposta_x keybind.move_y.name = Sposta_y keybind.select.name = seleziona keybind.pick.name = Pick Block -keybind.break.name = rompi +keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = spara keybind.zoom_hold.name = zoom_hold @@ -423,7 +439,7 @@ mode.freebuild.description = risorse limitate e nessun timer per le ondate. mode.pvp.name = PvP mode.pvp.description = fight against other players locally. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Oggetti content.liquid.name = Liquidi content.unit.name = Units @@ -448,8 +464,8 @@ 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 = Biomateria -item.biomatter.description = Materiale organico; Utilizzato per essere convertito in petrolio o carburante. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = sabbia item.sand.description = Un materiale base che viene altamente usato nei processi di fusione, Sia come lega che come lubrificante. item.blast-compound.name = Polvere esplosiva @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = acqua -liquid.lava.name = lava +liquid.slag.name = Slag liquid.oil.name = petrolio liquid.cryofluid.name = criogenium mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Abilità: {0} liquid.heatcapacity = [LIGHT_GRAY]Capacità calorifica: {0} liquid.viscosity = [LIGHT_GRAY]Viscosità: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Enemy Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Pavimento di ferro block.deepwater.name = acqua profonda block.water.name = acqua -block.lava.name = lava block.tar.name = Tar -block.blackstone.name = pietra nera block.stone.name = pietra -block.dirt.name = terra block.sand.name = sabbia block.ice.name = ghiaccio block.snow.name = neve -block.grass.name = erba -block.shrub.name = arbusto -block.rock.name = roccia -block.blackrock.name = roccia nera -block.icerock.name = roccia di ghiaccio +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Muro di rame block.copper-wall-large.name = Muro grande di rame block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Muro grande di torio block.door.name = porta block.door-large.name = Porta grande block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Bombardiere block.lancer.name = Idrogetto block.conveyor.name = trasportatore @@ -555,17 +595,14 @@ block.sorter.name = Filtro block.sorter.description = Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati. block.overflow-gate.name = splitter per eccesso block.overflow-gate.description = Una combinazione di un divisore e di un router , che distribuisce sui suoi lati se la via centrale è bloccata. -block.smelter.name = fonderia -block.arc-smelter.name = Fonderia ad arco block.silicon-smelter.name = Fonderia per silicio block.phase-weaver.name = Tessitore di fase block.pulverizer.name = Polverizzatore block.cryofluidmixer.name = Mixer liqidi block.melter.name = Fonditore block.incinerator.name = Inceneritore -block.biomattercompressor.name = Compostore +block.spore-press.name = Spore Press block.separator.name = Separatore -block.centrifuge.name = Centrifugatore block.power-node.name = Snodo energetico block.power-node-large.name = Snodo energetico grande block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Nastro trasportatore sopraelevato block.plastanium-compressor.name = Compressore al plastanio block.pyratite-mixer.name = Mixer pirite block.blast-mixer.name = Mixer poleri -block.solidifer.name = Solidificatore block.solar-panel.name = Pannello solare block.solar-panel-large.name = Pannrllo solare 3x3 block.oil-extractor.name = Estrattore petrolio @@ -626,7 +662,6 @@ block.liquid-junction.name = Giunzione liquida block.bridge-conduit.name = Condotta sopraelevata block.rotary-pump.name = Pompa a turbina block.thorium-reactor.name = Reattore al torio -block.command-center.name = Centro di comando block.mass-driver.name = Lancia materiali block.blast-drill.name = Blast Drill block.thermal-pump.name = Pompa termica @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = Drone 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 @@ -697,8 +732,6 @@ tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a 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. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Advanced item transport block. Moves items 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. @@ -738,12 +769,10 @@ block.pulverizer.description = Crushes stone into sand. Useful when there is a l 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.spore-press.description = Compresses spore pods into 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. @@ -765,7 +794,6 @@ block.blast-drill.description = The ultimate drill. Requires large amounts of po 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. @@ -781,7 +809,6 @@ 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. @@ -795,13 +822,11 @@ block.thermal-pump.description = The ultimate pump. Three times as fast as a mec 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.item-source.description = Infinitely outputs items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.power-void.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. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index b2c971e7c5..7acc935c7a 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -14,14 +14,13 @@ screenshot = スクリーンショットを {0} に保存しました。 gameover = ゲームオーバー gameover.pvp = [accent] {0}[] チームの勝利! highscore = [accent]ハイスコアを記録! - -stat.wave = 敗北したウェーブ:[accent] {0} -stat.enemiesDestroyed = 敵よる破壊数:[accent] {0} -stat.built = 建設した建造物数:[accent] {0} -stat.destroyed = 破壊した建造物数:[accent] {0} -stat.deconstructed = 解体した建造物数:[accent] {0} -stat.delivered = 達成した資源: - +stat.wave = Waves Defeated:[accent] {0} +stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} +stat.built = Buildings Built:[accent] {0} +stat.destroyed = Buildings Destroyed:[accent] {0} +stat.deconstructed = Buildings Deconstructed:[accent] {0} +stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? level.highscore = ハイスコア: [accent]{0} level.select = レベル選択 @@ -187,7 +186,6 @@ map.nospawn = このマップにはスポーンするためのプレイヤーの map.nospawn.pvp = このマップには敵がスポーンするためのプレイヤーのコアがありません! [SCARLET]赤い[]コアをエディターでマップに追加してください。 map.invalid = マップの読み込みエラー: ファイルが無効、または破損しています。 editor.brush = ブラシ -editor.slope = \\ editor.openin = エディターで開く editor.oregen = 鉱石の生成 editor.oregen.info = 鉱石の生成: @@ -242,17 +240,26 @@ tutorial = チュートリアル editor = エディター mapeditor = マップエディター donate = 寄附 -abandon = 撤退 -abandon.text = このゾーンのすべての資源は全て敵に奪還されます。 -locked = ロック -complete = [LIGHT_GRAY]完了: -resume = 再開ゾーン:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]ベスト: {0} -launch = 出撃 -launch.title = 出撃成功 -launch.next = [LIGHT_GRAY]次の出撃は ウェーブ {0} -launch.unable = [scarlet]出撃できません[] 敵から妨害を受けています。 -zone.unlocked = [LIGHT_GRAY]{0} がアンロックされました。 +abandon = Abandon +abandon.text = This zone and all its resources will be lost to the enemy. +locked = Locked +complete = [LIGHT_GRAY]Complete: +resume = Resume Zone:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Best: {0} +launch = Launch +launch.title = Launch Successful +launch.next = [LIGHT_GRAY]next opportunity at wave {0} +launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. +zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]サーバーへの接続できませんでした:\n\n[accent]{0} error.unreachable = サーバーに到達できません。\nアドレスは正しいですか? error.invalidaddress = 無効なアドレスです。 @@ -292,12 +299,15 @@ no = いいえ info.title = 情報 error.title = [crimson]エラーが発生しました error.crashtitle = エラーが発生しました +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = ブロック情報 +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = 電力容量 blocks.powershot = 電力/ショット blocks.targetsair = 対空攻撃 -blocks.itemspeed = 輸送速度 +blocks.itemsmoved = Move Speed blocks.shootrange = 範囲 blocks.size = 大きさ blocks.liquidcapacity = 液体容量 @@ -318,6 +328,7 @@ blocks.inputitems = 必要なアイテム blocks.outputitem = 搬出アイテム blocks.drilltier = ドリル blocks.drillspeed = 基本採掘速度 +blocks.maxunits = Max Active Units blocks.liquidoutput = 搬出液体 blocks.liquidoutputspeed = 液体搬出速度 blocks.liquiduse = 液体使用量 @@ -329,7 +340,10 @@ blocks.liquidfueluse = 液体燃料使用量 blocks.boostitem = 加速アイテム blocks.boostliquid = 加速液体 blocks.health = 耐久値 +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = 精度のずれ blocks.shots = ショット @@ -338,11 +352,11 @@ blocks.inputfuel = 燃料 blocks.fuelburntime = 燃焼時間 blocks.inputcapacity = 搬入容量 blocks.outputcapacity = 搬出容量 +blocks.ammo = Ammo unit.blocks = ブロック unit.powersecond = 電力/秒 unit.liquidsecond = 液体/秒 unit.itemssecond = アイテム/秒 -unit.pixelssecond = ピクセル/秒 unit.liquidunits = 液体 unit.powerunits = 電力 unit.degrees = 度 @@ -397,7 +411,7 @@ keybind.move_x.name = 左右移動 keybind.move_y.name = 上下移動 keybind.select.name = 選択/ショット keybind.pick.name = Pick Block -keybind.break.name = 破壊 +keybind.break_block.name = Break Block keybind.deselect.name = 選択解除 keybind.shoot.name = ショット keybind.zoom_hold.name = ズーム長押し @@ -425,7 +439,7 @@ mode.freebuild.description = 限られた資源の中でウェーブを自由に mode.pvp.name = PvP mode.pvp.description = ローカル内で他のプレイヤーと戦います。 mode.attack.name = アタック -mode.attack.descrption = ウェーブはなく、敵基地の破壊を目指します。 +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = アイテム content.liquid.name = 液体 content.unit.name = ユニット @@ -450,8 +464,8 @@ item.phase-fabric.name = フェーズファイバー item.phase-fabric.description = 極めて軽量な素材です。高度な機械や自己修復技術に使用されます。 item.surge-alloy.name = サージ合金 item.surge-alloy.description = 電気的特性を持った特殊な合金です。 -item.biomatter.name = バイオメター -item.biomatter.description = 有機物を含んだ塊です。石油への転換や燃料として使われます。 +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = 砂 item.sand.description = 合金や融剤など広く使用されている一般的な材料です。 item.blast-compound.name = 爆発性化合物 @@ -463,7 +477,7 @@ item.metaglass.description = とても頑丈な強化ガラスです。液体の item.scrap.name = スクラップ item.scrap.description = 昔の建造物やユニットの残骸です。様々な種類の金属が微量に含まれています。 liquid.water.name = 水 -liquid.lava.name = 溶岩 +liquid.slag.name = Slag liquid.oil.name = 石油 liquid.cryofluid.name = 冷却水 mech.alpha-mech.name = アルファ @@ -509,8 +523,13 @@ mech.ability = [LIGHT_GRAY]能力: {0} liquid.heatcapacity = [LIGHT_GRAY]熱容量: {0} liquid.viscosity = [LIGHT_GRAY]粘度: {0} liquid.temperature = [LIGHT_GRAY]温度: {0} -block.kiln.name = かまど -block.kiln.description = 砂と鉛を溶かしてメタガラスを生成します。少量の電力が必要です。 +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster +block.kiln.name = Kiln +block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press block.multi-press.name = Multi-Press block.constructing = {0}\n[LIGHT_GRAY](建設中) @@ -518,22 +537,42 @@ block.spawn.name = エネミースポーン block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -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.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = 銅の壁 block.copper-wall-large.name = 大きな銅の壁 block.titanium-wall.name = チタンの壁 @@ -545,7 +584,6 @@ block.thorium-wall-large.name = 大きなトリウムの壁 block.door.name = ドア block.door-large.name = 大きなドア block.duo.name = デュオ -block.scorch.name = スコッチ block.hail.name = ヘイル block.lancer.name = ランサー block.conveyor.name = コンベアー @@ -557,17 +595,14 @@ block.sorter.name = ソーター block.sorter.description = アイテムを分別して搬出します。設定されたアイテムは通過させ、異なるアイテムの場合、左右に搬出します。 block.overflow-gate.name = オーバーフローゲート block.overflow-gate.description = 搬出先がいっぱいの場合に左右にアイテムを搬出します。 -block.smelter.name = 溶鉱炉 -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.spore-press.name = Spore Press block.separator.name = 分離機 -block.centrifuge.name = 遠心分離機 block.power-node.name = 電源ノード block.power-node-large.name = 大型電源ノード block.surge-tower.name = サージタワー @@ -607,7 +642,6 @@ 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 = 石油抽出機 @@ -628,7 +662,6 @@ 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 = サーマルポンプ @@ -648,13 +681,13 @@ block.spectre.name = スペクター block.meltdown.name = メルトダウン block.container.name = コンテナー block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = 初期のユニットです。デフォルトでコアからスポーンします。自動で鉱石の採掘やブロックの修理をします。 unit.phantom.name = ファントムドローン @@ -699,8 +732,6 @@ tutorial.dagger = 電源ノードを生産機に接続しましょう。\n要件 tutorial.battle = [LIGHT_GRAY]敵[]のコアが見つかりました。\nユニットやダガー機で敵の基地を破壊しましょう。 block.copper-wall.description = 安価な防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに便利です。 block.copper-wall-large.description = 安価な大型防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに便利です。 -block.dense-alloy-wall.description = 標準的な防壁ブロックです。\n敵からの保護に最適です。 -block.dense-alloy-wall-large.description = 標準的な大型防壁ブロックです。\n敵からの保護に最適です。 block.thorium-wall.description = 強化された防壁ブロックです。\n敵からの保護により強固です。 block.thorium-wall-large.description = 強化された大型防壁ブロックです。\n敵からの保護により強固です。 block.phase-wall.description = トリウムの壁ほど強固ではないが、強力な弾でなければ弾き返すことができます。 @@ -730,8 +761,6 @@ 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 = 放射性トリウムと多量の砂からフェーズファイバーを作り出します。 @@ -740,12 +769,10 @@ 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.spore-press.description = Compresses spore pods into oil. block.separator.description = 石を水圧で砕き、石に含まれる様々な鉱石を回収します。 -block.centrifuge.description = 建設費が高価で電力も必要ですが、分離機よりも効率的に回収できます。 block.power-node.description = 電力ノード間で電力の送電を行います。最大で4つの電力源やノードなどに接続できます。隣接するブロックから電力の送電や供給を行います。 block.power-node-large.description = 巨大な電力ノードです。最大で6つの電力源やノードに接続できます。 block.battery.description = 余分な電力の充電して、貯めておくことができます。必要があれば、溜まった電力を供給します。 @@ -767,7 +794,6 @@ 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パッドに乗って、パッドをダブルタップすることで使用できます。 @@ -783,7 +809,6 @@ 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 = 改良された液体転送ブロックです。電力を使用して、液体を他の離れたフューズコンベアーに転送することができます。 @@ -797,13 +822,11 @@ block.thermal-pump.description = 高級ポンプです。機械ポンプより3 block.router.description = 一つの方向から受け取ったアイテムを他の3方向に搬出します。一つの資源から複数に分ける際に便利です。 block.distributor.description = 高度なルーターです。アイテムを7方向に均等に分けて搬出します。 block.bridge-conveyor.description = 高度な輸送ブロックです。地形や建物を超えて、3ブロック離れた場所にアイテムを輸送することができます。 -block.alpha-mech-pad.description = 電力を使用して、機体を[accent]アルファ[]機体に作り替えます。 block.item-source.description = アイテムを無限に搬出します。サンドボックスのみ。 block.liquid-source.description = 液体を無限に搬出します。サンドボックスのみ。 block.item-void.description = 電力なしでアイテムを廃棄します。サンドボックスのみ。 block.power-source.description = 無限に電力を搬出します。サンドボックスのみ。 block.power-void.description = 入力されたすべての電力を破棄します。サンドボックスのみ。 liquid.water.description = 一般的に機械の冷却や廃棄物の処理などに使用されます。 -liquid.lava.description = 冷却して石にしたり、発電や一部ターレットの弾薬として使用することができます。 liquid.oil.description = 燃焼させたり、爆発させたり、冷却水としても使われます。 liquid.cryofluid.description = 冷却させるのに最も効率的な液体です。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 8e4ea16128..169cd42444 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1,7 +1,7 @@ -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!) +credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = 제작자 -contributors = Translators and Contributors -discord = Mindustry Discord 에 참여하세요! +contributors = 번역 및 기여자들 +discord = Mindustry Discord 에 참여 해 보세요! link.discord.description = 공식 Mindustry Discord 채팅방 link.github.description = 게임 소스코드 link.dev-builds.description = 개발중인 빌드 @@ -9,37 +9,38 @@ link.trello.description = 다음 출시될 기능들을 게시한 공식 Trello link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 link.google-play.description = Google Play 스토어 정보 link.wiki.description = 공식 Mindustry 위키 (영어) -linkfail = 링크를 여는데 실패했습니다! URL이 기기의 클립보드에 복사되었습니다. -screenshot = Screenshot saved to {0} +linkfail = 링크를 여는데 실패했습니다! URL이 기기의 클립보드에 복사되었습니다.\n +screenshot = 화면 캡쳐가 {0} 경로에 저장되었습니다. gameover = 코어가 터졌습니다. 게임 오버! gameover.pvp = [accent]{0}[] 팀이 승리했습니다! -highscore = [YELLOW]최고점수 달성! -stat.wave = Waves Defeated:[accent] {0} -stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} -stat.built = Buildings Built:[accent] {0} -stat.destroyed = Buildings Destroyed:[accent] {0} -stat.deconstructed = Buildings Deconstructed:[accent] {0} -stat.delivered = Resources Launched: -map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? -level.highscore = 최고 점수 : [accent]{0} +highscore = [yellow]최고점수 달성! +stat.wave = 단계 성공: [accent]{0} +stat.enemiesDestroyed = 적 파괴: [accent]{0} +stat.built = 건물 건설: [accent]{0} +stat.destroyed = 건물 파괴됨: [accent]{0} +stat.deconstructed = 건물 해체: [accent]{0} +stat.delivered = 획득한 자원 : +stat.rank = 최종 기록: [accent]{0} +map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?\n +level.highscore = 최고 점수: [accent]{0} level.select = 맵 선택 -level.mode = 게임모드 : -construction.desktop = PC 에서의 조작 방법이 변경되었습니다.\n블록 선택을 해제하거나 건설을 중지하려면 [accent]스페이스 바[]를 누르세요. -construction.title = 블록 배치 안내서 +level.mode = 게임 모드 : +construction.desktop = PC 에서의 조작 방법이 변경되었습니다.\n블록 선택을 해제하거나 건설을 중지하려면 [accent]스페이스 바[]를 누르세요.\n +construction.title = PC 에서의 조작 방법이 변경되었습니다. construction = [accent]블록 배치 모드[]를 선택하셨습니다.\n\n블록을 설치하고 싶으면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 배치 작업을 진행할 것입니다.\n\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요. \n- [accent]블록을 넓게 배치[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.\n- [accent]블록을 한줄로 배치[]하고 싶다면 배치하고 싶은 시작 영역을 한번 탭 하고 길게 누르면서 드래그 하면 됩니다. \n- [accent]블록 배치 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. deconstruction.title = 블록 삭제 안내서 deconstruction = [accent]블록 삭제 모드[]를 선택하셨습니다\n\n블록을 삭제하고 싶다면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 파괴 작업을 진행할 것입니다.\n\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요\n- [accent]블록을 넓은 범위로 삭제[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.\n- [accent]블록 삭제 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. showagain = 다음 세션에서 이 메세지를 표시하지 않습니다 coreattack = < 코어가 공격받고 있습니다! > -nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent -outofbounds = [[ OUT OF BOUNDS ]\n[]self-destruct in {0} -database = Core Database +nearpoint = [[ [scarlet]스폰 지점에서 나가세요[] ]\n모든 유닛 및 건물 파괴 임박 +outofbounds = [[출입 금지 구역]\n[]{0}초후 파괴됩니다. +database = 코어 데이터베이스 savegame = 게임 저장 loadgame = 게임 불러오기 joingame = 멀티플레이 addplayers = 플레이어 추가/제거 customgame = 커스텀 게임 -newgame = New Game +newgame = 새 게임 none = <없음> close = 닫기 quit = 나가기 @@ -47,15 +48,15 @@ maps = 맵 continue = 계속하기 maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다! about.button = 정보 -name = 이름 : -noname = Pick a[accent] player name[] first. -filename = 파일 이름 : +name = 이름 : +noname = 먼저 [accent] 플레이어 이름[] 을 설정하세요. +filename = 파일 이름 : unlocked = 새 블록 잠금 해제됨 -completed = [accent]Completed -techtree = Tech Tree -research.list = [LIGHT_GRAY]Research: -research = Research -researched = [LIGHT_GRAY]{0} researched. +completed = [accent]성공 +techtree = 기술 트리 +research.list = [LIGHT_GRAY]연구: +research = 연구 +researched = [LIGHT_GRAY]{0}연구됨. players = 현재 {0}명 접속중 players.single = 현재 {0}명만 있음. server.closing = [accent]서버 닫는중... @@ -63,14 +64,14 @@ server.kicked.kick = 서버에서 추방되었습니다! server.kicked.serverClose = 서버 종료됨. server.kicked.clientOutdated = 오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! -server.kicked.banned = 뭘 하셨는지는 모르겠지만, 이제 영원히 서버에 접속할 수 없습니다. -server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요.\n참고 : [accent]계속해서 접속을 시도하면 강퇴 시간이 길어집니다. +server.kicked.banned = 서버 규칙 위반으로 인해, 지금부터 영원히 서버에 접속할 수 없습니다. +server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요.\n참고: [accent]계속해서 접속을 시도하면 강퇴 시간이 길어집니다. server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다. server.kicked.nameEmpty = 닉네임에는 반드시 영어 또는 숫자가 있어야 합니다. server.kicked.idInUse = 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다. server.kicked.customClient = 이 서버는 직접 빌드한 버전을 지원하지 않습니다. 공식 버전을 사용하세요. server.kicked.gameover = 게임 오버로 인해 서버에서 추방되었습니다. -host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고 : LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. +host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다. hostserver = 서버 열기 hostserver.mobile = 서버\n열기 @@ -82,16 +83,16 @@ server.refreshing = 서버 목록 새로고치는중... hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다! host.invalid = [scarlet]서버에 연결할 수 없습니다! trace = 플레이어 정보 보기 -trace.playername = 이름 : [accent]{0} -trace.ip = IP : [accent]{0} -trace.id = 고유 ID : [accent]{0} -trace.android = Android 클라이언트 : [accent]{0} -trace.modclient = 수정된 클라이언트 : [accent]{0} -trace.totalblocksbroken = 총 블록 파괴 개수 : [accent]{0} -trace.structureblocksbroken = 구조 블록 파괴 수 : [accent]{0} -trace.lastblockbroken = 마지막으로 파괴한 블록 : [accent]{0} -trace.totalblocksplaced = 총 설치한 블록 개수 : [accent]{0} -trace.lastblockplaced = 마지막으로 설치한 블록 : [accent]{0} +trace.playername = 이름: [accent]{0} +trace.ip = IP: [accent]{0}{0} +trace.id = 고유 ID: [accent]{0} +trace.android = Android 클라이언트: [accent]{0} +trace.modclient = 수정된 클라이언트: [accent]{0} +trace.totalblocksbroken = 총 블록 파괴 개수: [accent]{0} +trace.structureblocksbroken = 구조 블록 파괴 수: [accent]{0} +trace.lastblockbroken = 마지막으로 파괴한 블록: [accent]{0} +trace.totalblocksplaced = 총 설치한 블록 개수: [accent]{0} +trace.lastblockplaced = 마지막으로 설치한 블록: [accent]{0} invalidid = 잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요. server.bans = 차단된 유저 server.bans.none = 차단된 플레이어가 없습니다. @@ -99,11 +100,11 @@ server.admins = 관리자 server.admins.none = 관리자가 없습니다! server.add = 서버 추가 server.delete = 이 서버를 삭제 하시겠습니까? -server.hostname = 호스트 : {0} +server.hostname = 호스트: {0} server.edit = 서버 수정 server.outdated = [crimson]서버 버전이 낮습니다![] server.outdated.client = [Crimson]클라이언트 버전이 낮습니다![] -server.version = [lightgray]서버 버전 : {0} +server.version = [lightgray]서버 버전: {0} {1} server.custombuild = [yellow]커스텀 서버 confirmban = 이 플레이어를 차단하시겠습니까? confirmkick = 정말로 이 플레이어를 추방시키겠습니까? @@ -111,12 +112,12 @@ confirmunban = 이 플레이어를 차단해제 하시겠습니까? confirmadmin = 이 플레이어를 관리자로 만들겠습니까? confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까? joingame.title = 게임 참가 -joingame.ip = IP : +joingame.ip = IP: disconnect = 서버와 연결이 해제되었습니다. disconnect.data = 맵 데이터를 받아오는데 실패했습니다. connecting = [accent]연결중... connecting.data = [accent]맵 데이터 다운로드중... -server.port = 포트 : +server.port = 포트 : server.addressinuse = 이 주소는 이미 사용중입니다! server.invalidport = 포트 번호가 잘못되었습니다. server.error = [crimson]{0}[accent]서버를 여는데 오류가 발생했습니다.[] @@ -131,28 +132,28 @@ save.delete.confirm = 이 저장파일을 삭제 하시겠습니까? save.delete = 삭제 save.export = 저장파일 내보내기 save.import.invalid = [accent]파일이 잘못되었습니다! -save.import.fail = [crimson]저장파일을 불러오지 못함 : [accent]{0} -save.export.fail = [crimson]저장파일을 내보내지 못함 : [accent]{0} +save.import.fail = [crimson]저장파일을 불러오지 못함: [accent]{0} +save.export.fail = [crimson]저장파일을 내보내지 못함: [accent]{0} save.import = 저장파일 불러오기 -save.newslot = 저장 파일이름 : +save.newslot = 저장 파일이름 : save.rename = 이름 변경 -save.rename.text = 새 이름 : +save.rename.text = 새 이름 : selectslot = 저장슬롯을 선택하십시오. slot = [accent]{0}번째 슬롯 save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[]. empty = <비어있음> on = 켜기 off = 끄기 -save.autosave = 자동저장 : {0} -save.map = 맵 : {0} -save.wave = {0}단계[] -save.difficulty = 난이도 : {0} -save.date = 마지막 저장날짜 : {0} -save.playtime = 플레이시간 : {0} -warning = Warning. +save.autosave = 자동저장: {0} +save.map = 맵: {0} +save.wave = 단계[]{0} +save.difficulty = 난이도: {0} +save.date = 마지막 저장날짜: {0} +save.playtime = 플레이시간: {0} +warning = 경고. confirm = 확인 delete = 삭제 -ok = 확인 +ok = OK open = 열기 cancel = 취소 openlink = 링크 열기 @@ -168,8 +169,8 @@ changelog.current = [accent][[현재 버전] changelog.latest = [accent][[최신 버전] loading = [accent]불러오는중... saving = [accent]저장중... -wave = [accent]{0}단계 -wave.waiting = 남은 시간 : [green]{0}초[] +wave = [accent]{0} 단계 +wave.waiting = 남은 시간: [green]{0}초[] waiting = [LIGHT_GRAY]대기중... waiting.players = 다른 플레이어를 기다리는 중.. wave.enemies = [LIGHT_GRAY]{0} 마리 남았음 @@ -181,18 +182,17 @@ custom = 커스텀 builtin = 기본맵 map.delete.confirm = 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다! map.random = [accent]랜덤 맵 -map.nospawn = 이 맵에 플레이어가 스폰 할 코어가 없습니다! 맵 편집기에서 [ROYAL]파란색[]코어를 맵에 추가하세요. +map.nospawn = 이 맵에 플레이어가 스폰 할 코어가 없습니다! 맵 편집기에서 [royal]파란색[]코어를 맵에 추가하세요. map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [scarlet]빨간팀[] 코어를 추가하세요. map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다. editor.brush = 브러쉬 -editor.slope = \\ editor.openin = 편집기 열기 editor.oregen = 광물 무작위 생성 -editor.oregen.info = 광물 무작위 생성 : +editor.oregen.info = 광물 무작위 생성 : editor.mapinfo = 맵 정보 -editor.author = 만든이 : -editor.description = 설명 : -editor.name = 이름 : +editor.author = 만든이 : +editor.description = 설명 : +editor.name = 이름 : editor.teams = 팀 editor.elevation = 지형 높이 editor.errorimageload = [accent]{0}[] 파일을 불러오는데 오류가 발생했습니다. @@ -204,7 +204,7 @@ editor.savemap = 맵 저장 editor.saved = 저장됨! editor.save.noname = 지도에 이름이 없습니다! 메뉴 -> '맵 정보' 에서 설정하세요. editor.save.overwrite = 이 맵의 이름은 기존에 있던 맵을 덮어씁니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요. -editor.import.exists = [scarlet]맵을 불러올 수 없음 : [] 기존에 있던 '{0}' 맵이 이미 존재합니다! +editor.import.exists = [scarlet]맵을 불러올 수 없음: [] 기존에 있던 '{0}' 맵이 이미 존재합니다! editor.import = 가져오기 editor.importmap = 맵 가져오기 editor.importmap.description = 이미 존재하는 맵 가져오기 @@ -221,36 +221,45 @@ editor.loadimage = 지형 가져오기 editor.saveimage = 지형 내보내기 editor.unsaved = [scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까? editor.resizemap = 맵 크기 조정 -editor.mapname = 맵 이름 : +editor.mapname = 맵 이름 : editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다. editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? -editor.selectmap = 불러올 맵 선택 : -width = 넓이 : -height = 높이 : +editor.selectmap = 불러올 맵 선택 : +width = 넓이 : +height = 높이 : menu = 메뉴 play = 플레이 load = 불러오기 save = 저장 -fps = {0}FPS -tps = {0}TPS -ping = ping : {0}ms +fps = FPS: {0} +tps = TPS: {0} +ping = 지연 시간: {0}ms language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요. settings = 설정 tutorial = 게임 방법 editor = 편집기 mapeditor = 맵 편집기 donate = 기부 -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Complete: -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. +abandon = 버리기 +abandon.text = 이 구역과 모든 자원이 적에게 빼앗길 것입니다. +locked = 잠김 +complete = [LIGHT_GRAY]완료 : +resume = 지역 계속 플레이 :\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]최고 점수: {0} +launch = < 출격 > +launch.title = 출격 성공 +launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다. +launch.unable = [scarlet]출격할 수 없습니다.[] 남은적 +launch.confirm = 출격하게 되면 모든 자원이 코어로 들어갑니다.\n또한 성공하기 전까지 기지로 돌아갈 수 없습니다. +uncover = 털어넣기 +configure = 로드아웃 설정 +configure.locked = {0} 단계에서 로드아웃을 설정할 수 있음. +zone.unlocked = [LIGHT_GRAY] 잠금 해제됨. +zone.complete = 지역 조건이 충족됨. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = 자원 감지됨: +add = Add... +boss.health = Boss Health connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] error.unreachable = 서버에 연결하지 못했습니다. error.invalidaddress = 잘못된 주소입니다. @@ -258,20 +267,20 @@ error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있 error.mismatch = 패킷 오류:\n클라이언트/서버 버전이 일치하지 않습니다.\n접속할려는 서버가 최신 버전의 Mindustry 인지 확인하세요! error.alreadyconnected = 이미 접속중입니다. error.mapnotfound = 맵 파일을 찾을 수 없습니다! -error.io = Network I/O error. +error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. -zone.groundZero.name = Ground Zero -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores +zone.groundZero.name = 그라운드 제로 +zone.craters.name = 분화구 +zone.frozenForest.name = 얼어붙은 숲 +zone.ruinousShores.name = 파멸의 기슭 zone.crags.name = Crags -zone.stainedMountains.name = Stained Mountains -zone.impact0079.name = Impact 0079 -zone.desolateRift.name = Desolate Rift -zone.arcticDesert.name = Arctic Desert -zone.dryWastes.name = Dry Wastes -zone.nuclearComplex.name = Nuclear Production Complex -zone.moltenFault.name = Molten Fault +zone.stainedMountains.name = 얼룩진 산맥 +zone.impact0079.name = 충격 0079 +zone.desolateRift.name = 황량한 강 +zone.arcticDesert.name = 북극 사막 +zone.dryWastes.name = 건조한 폐허 +zone.nuclearComplex.name = 핵 생산 단지 +zone.moltenFault.name = 녹은 결점 settings.language = 언어 settings.reset = 설정 초기화 settings.rebind = 키 재설정 @@ -290,57 +299,64 @@ no = 아니오 info.title = [accent]정보 error.title = [crimson]오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다. +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = 블록 정보 -blocks.powercapacity = 최대 전력 용량 -blocks.powershot = 1발당 전력 소모량 -blocks.targetsair = 공중공격 가능 -blocks.itemspeed = 유닛 이동 속도 -blocks.shootrange = 사거리 -blocks.size = 블록 크기 -blocks.liquidcapacity = 최대 액체 용량 -blocks.maxitemssecond = 최대 아이템 보관량 -blocks.powerrange = 전력 범위 -blocks.poweruse = 전력 사용 -blocks.powerdamage = 전력/데미지 -blocks.inputitemcapacity = 입력 아이템 용량 -blocks.outputitemcapacity = 출력 아이템 용량 -blocks.itemcapacity = 저장 용량 -blocks.basepowergeneration = 기지 전력 생성기 -blocks.powertransferspeed = 전력 전송량 -blocks.craftspeed = 생산 속도 -blocks.inputliquid = 사용되는 액체 -blocks.inputliquidaux = 보조 액체 -blocks.inputitem = 사용되는 아이템 -blocks.inputitems = 사용되는 아이템들 -blocks.outputitem = 출력 아이템 -blocks.drilltier = 드릴 -blocks.drillspeed = 기본 드릴 속도 -blocks.liquidoutput = 액체 출력 -blocks.liquidoutputspeed = 액체 출력속도 -blocks.liquiduse = 액체 사용량 -blocks.coolant = 냉각제 -blocks.liquid = Liquid -blocks.coolantuse = 냉각수 사용 -blocks.inputliquidfuel = 연료 액 -blocks.liquidfueluse = 액체 연료 사용 +blocks.powerbalance = 전력: {0} +blocks.poweroutput = 전력 출력: {0} +blocks.powercapacity = 최대 전력 용량 +blocks.powershot = 1발당 전력 소모량 +blocks.targetsair = 공중공격 가능 +blocks.itemsmoved = 이동 속도 +blocks.shootrange = 사거리 +blocks.size = 크기 +blocks.liquidcapacity = 최대 액체 용량 +blocks.maxitemssecond = 최대 아이템 보관량 +blocks.powerrange = 전력 범위 +blocks.poweruse = 전력 사용 +blocks.powerdamage = 전력/데미지 +blocks.inputitemcapacity = 입력 아이템 용량 +blocks.outputitemcapacity = 출력 아이템 용량 +blocks.itemcapacity = 저장 용량 +blocks.basepowergeneration = 기지 전력 생성기 +blocks.powertransferspeed = 전력 전송량 +blocks.craftspeed = 생산 속도 +blocks.inputliquid = 사용되는 액체 +blocks.inputliquidaux = 보조 액체 +blocks.inputitem = 사용되는 아이템 +blocks.inputitems = 사용되는 아이템들 +blocks.outputitem = 출력 아이템 +blocks.drilltier = 드릴 +blocks.drillspeed = 기본 드릴 속도 +blocks.maxunits = Max Active Units +blocks.liquidoutput = 액체 출력 +blocks.liquidoutputspeed = 액체 출력속도 +blocks.liquiduse = 액체 사용량 +blocks.coolant = 냉각제 +blocks.liquid = 액체 +blocks.coolantuse = 냉각수 사용 +blocks.inputliquidfuel = 연료 액 +blocks.liquidfueluse = 액체 연료 사용 blocks.boostitem = 가속 아이템 blocks.boostliquid = 가속 액체 -blocks.health = 체력 -blocks.power = Power -blocks.power.satisfaction = Power Satisfaction -blocks.inaccuracy = 오차각 -blocks.shots = 발포 횟수 -blocks.reload = 재장전 -blocks.inputfuel = 연료 -blocks.fuelburntime = 연료 연소 시간 -blocks.inputcapacity = 입력 용량 -blocks.outputcapacity = 출력 용량 +blocks.health = 체력 +blocks.heat = Heat +blocks.power = 전력 +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} +blocks.power.satisfaction = 전력 만족도 +blocks.inaccuracy = 오차각 +blocks.shots = 발포 횟수 +blocks.reload = 재장전 +blocks.inputfuel = 연료 +blocks.fuelburntime = 연료 연소 시간 +blocks.inputcapacity = 입력 용량 +blocks.outputcapacity = 출력 용량 +blocks.ammo = 탄약 unit.blocks = 블록 unit.powersecond = 전력/초 unit.liquidsecond = 액체/초 unit.itemssecond = 개/초 -unit.pixelssecond = 초당 픽셀 unit.liquidunits = 액체 unit.powerunits = 전력 unit.degrees = 도 @@ -352,23 +368,23 @@ category.liquids = 액체 category.items = 아이템 category.crafting = 제작 category.shooting = 사격 -category.optional = 선택적 가속 +category.optional = 보조 아이템 setting.indicators.name = 인디게이터 표시 setting.autotarget.name = 자동 조준 setting.fpscap.name = 최대 FPS setting.fpscap.none = 없음 -setting.fpscap.text = {0} FPS +setting.fpscap.text = FPS setting.difficulty.training = 훈련 setting.difficulty.easy = 쉬움 setting.difficulty.normal = 보통 setting.difficulty.hard = 어려움 -setting.difficulty.insane = [#00ff00]멀[#2efe2e]티[#58fa58]플[#81f781]레[#a9f5a9]이 [#81f781]전[#58fa58]용[] -setting.difficulty.name = 난이도 : -setting.screenshake.name = 화면 흔들기 강도 +setting.difficulty.insane = 매우 어려움 +setting.difficulty.name = 난이도 : +setting.screenshake.name = 화면 흔들기 강도 setting.effects.name = 화면 효과 setting.sensitivity.name = 컨트롤러 감도 -setting.saveinterval.name = 자동저장 간격 -setting.seconds = {0}초 +setting.saveinterval.name = 자동저장 간격 +setting.seconds = 초 setting.fullscreen.name = 전체 화면 setting.fps.name = FPS 표시 setting.vsync.name = VSync 활성화 @@ -392,13 +408,13 @@ keybind.press = 키를 누르세요... keybind.press.axis = 축 또는 키를 누르세요... keybind.screenshot.name = Map Screenshot keybind.move_x.name = 오른쪽/왼쪽 이동 -keybind.move_y.name = 위쪽/아래쪽 이동 +keybind.move_y.name = 위 / 아래 중간 keybind.select.name = 선택 -keybind.pick.name = Pick Block -keybind.break.name = 파괴 +keybind.pick.name = 블록 선택 +keybind.break_block.name = 블록 파괴 keybind.deselect.name = 선택해제 keybind.shoot.name = 사격 -keybind.zoom_hold.name = 길게눌러 확대 +keybind.zoom_hold.name = 길게 확대 keybind.zoom.name = 확대 keybind.menu.name = 메뉴 keybind.pause.name = 일시중지 @@ -414,20 +430,20 @@ keybind.chat_scroll.name = 채팅 스크롤 keybind.drop_unit.name = 유닛 드롭 keybind.zoom_minimap.name = 미니맵 확대 mode.help.title = 도움말 -mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +mode.survival.name = 생존 +mode.survival.description = 이것은 일반 모드입니다. 제한된 자원을 가지고 자동으로 다음 단계가 시작됩니다. mode.sandbox.name = 샌드박스 -mode.sandbox.description = 무한한 자원과 다음단계 시작을 위한 타이머가 없습니다. +mode.sandbox.description = 무한한 자원을 가지고 자유롭게 다음 단계를 시작할 수 있습니다. mode.freebuild.name = 자유 건축 -mode.freebuild.description = 제한된 자원과 다음단계 시작을 위한 타이머가 없습니다. +mode.freebuild.description = 제한된 자원을 가지고 다음 단계를 시작할 수 있습니다. mode.pvp.name = PvP mode.pvp.description = 몹이 아닌 실제 플레이어와 PvP를 합니다. -mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.name = 공격 +mode.attack.description = 일정 시간마다 적이 오는 단계가 없으며, 적의 기지를 파괴하는 것을 목표로 합니다. content.item.name = 아이템 content.liquid.name = 액체 content.unit.name = 유닛 -content.block.name = Blocks +content.block.name = 블록 content.mech.name = 기체 item.copper.name = 구리 item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다. @@ -435,7 +451,7 @@ item.lead.name = 납 item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. item.coal.name = 석탄 item.coal.description = 쉽게 구할 수 있으며, 주로 제련소 등에서 연료로 사용됩니다. -item.graphite.name = Graphite +item.graphite.name = 흑연 item.titanium.name = 티타늄 item.titanium.description = 파이프 재료나 고급 드릴, 비행기/기체 등에서 재료로 사용되는 자원입니다. item.thorium.name = 토륨 @@ -448,20 +464,20 @@ item.phase-fabric.name = 메타 item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.surge-alloy.name = 설금 item.surge-alloy.description = 독특한 전기 특성을 가진 고급 합금입니다. -item.biomatter.name = 바이오메터 -item.biomatter.description = 이것은 유기농 덤불입니다!\n압축기에 넣어 석유로 바꿀 수 있습니다. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = 모래 item.sand.description = 고밀도 합금 제작이나 제련시 이 광물을 사용하여 소모 재료를 줄이는 등 광범위하게 사용되는 일반적인 재료입니다. item.blast-compound.name = 폭발물 item.blast-compound.description = 포탑 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. item.pyratite.name = 피라테 item.pyratite.description = 폭발성을 가진 재료로, 주로 포탑의 탄약으로 사용됩니다. -item.metaglass.name = Metaglass -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.scrap.name = Scrap -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.metaglass.name = 메타유리 +item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다. +item.scrap.name = 조각 +item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 많은 금속이 포함되어 있습니다. liquid.water.name = 물 -liquid.lava.name = 용암 +liquid.slag.name = 광재 liquid.oil.name = 석유 liquid.cryofluid.name = 냉각수 mech.alpha-mech.name = 알파 @@ -483,7 +499,7 @@ mech.omega-mech.description = 지상 기체 최종판이자 건물 파괴용으 mech.dart-ship.name = 다트 mech.dart-ship.weapon = 소총 mech.dart-ship.description = 표준 비행선.\n빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다. -mech.javelin-ship.name = 자비린 +mech.javelin-ship.name = 재블린 mech.javelin-ship.description = 치고 빠지는 공격을 위한 비행선.\n처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 전격 능력을 사용할 수 있습니다. mech.javelin-ship.weapon = 유도 미사일 mech.javelin-ship.ability = 가속 전격 생성기 @@ -493,49 +509,74 @@ mech.trident-ship.weapon = 폭탄 저장고 mech.glaive-ship.name = 글레브 mech.glaive-ship.description = 크고 잘 무장된 총을 가진 비행선.\n방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다. mech.glaive-ship.weapon = 방화총 -item.explosiveness = [LIGHT_GRAY]폭발성 : {0} -item.flammability = [LIGHT_GRAY]인화성 : {0} -item.radioactivity = [LIGHT_GRAY]방사능 : {0} -unit.health = [LIGHT_GRAY]체력 : {0} -unit.speed = [LIGHT_GRAY]속도 : {0} -mech.weapon = [LIGHT_GRAY]무기 : {0} -mech.health = [LIGHT_GRAY]Health: {0} -mech.itemcapacity = [LIGHT_GRAY]아이템 수용 용량 : {0} -mech.minespeed = [LIGHT_GRAY]채광 속도 : {0} -mech.minepower = [LIGHT_GRAY]채광 레벨 : {0} -mech.ability = [LIGHT_GRAY]능력 : {0} -liquid.heatcapacity = [LIGHT_GRAY]발열량 : {0} -liquid.viscosity = [LIGHT_GRAY]점도 : {0} -liquid.temperature = [LIGHT_GRAY]온도 : {0} -block.kiln.name = Kiln -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press -block.constructing = {0}[LIGHT_GRAY](만드는중) +item.explosiveness = [LIGHT_GRAY]폭발성: {0} +item.flammability = [LIGHT_GRAY]인화성: {0} +item.radioactivity = [LIGHT_GRAY]방사능: {0} +unit.health = [LIGHT_GRAY]체력: {0} +unit.speed = [LIGHT_GRAY]속도: {0} +mech.weapon = [LIGHT_GRAY]무기: {0} +mech.health = [LIGHT_GRAY]체력: {0} +mech.itemcapacity = [LIGHT_GRAY]아이템 수용 용량: {0} +mech.minespeed = [LIGHT_GRAY]채광 속도: {0} +mech.minepower = [LIGHT_GRAY]채광 레벨: {0} +mech.ability = [LIGHT_GRAY]능력: {0} +liquid.heatcapacity = [LIGHT_GRAY]발열량: {0} +liquid.viscosity = [LIGHT_GRAY]점도: {0} +liquid.temperature = [LIGHT_GRAY]온도: {0} +block.scrap-wall.name = 조각벽 +block.scrap-wall-large.name = 큰 조각벽 +block.scrap-wall-huge.name = 거대한 조각 벽 +block.scrap-wall-gigantic.name = 엄청나게 큰 조각 벽 +block.thruster.name = 트릭스터 +block.kiln.name = 가마 +block.kiln.description = 모래를 녹여서 메타유리로 만듭니다. 소량의 전력이 필요합니다. +block.graphite-press.name = 흑연 압축기 +block.multi-press.name = 다중 압축기 +block.constructing = {0} [LIGHT_GRAY](만드는중) block.spawn.name = 적 스폰지점 -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Foundation -block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = 철판 +block.core-shard.name = 코어: 공유 +block.core-foundation.name = 코어: 기초 +block.core-nucleus.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.craters.name = 크레이터 +block.sand-water.name = 젖은모래 +block.char.name = 숯 +block.holostone.name = 홀로스톤 +block.ice-snow.name = 얼음눈 +block.rocks.name = 돌 +block.icerocks.name = 얼음바위 +block.snowrocks.name = 눈바위 +block.dunerocks.name = 모래돌 +block.pine.name = 소나무 +block.white-tree-dead.name = 죽은 하얀나무 +block.white-tree.name = 하얀 나무 +block.spore-cluster.name = 포자낭 +block.stained-rocks.name = 얼룩진 바위 +block.stained-stone.name = 얼룩진 돌 +block.stained-rocks-red.name = 얼룩진 빨간 바위 +block.stained-stone-red.name = 얼룩진 빨간 돌 +block.stained-rocks-yellow.name = 얼룩진 노란 바위 +block.stained-stone-yellow.name = 얼룩진 노란 돌 +block.stained-boulder.name = 얼룩진 둥근 돌 +block.metal-floor.name = 메탈 바닥 +block.metal-floor-2.name = 메탈 바닥 2 +block.metal-floor-3.name = 메탈 바닥 3 +block.metal-floor-5.name = 메탈 바닥 5 +block.metal-floor-damaged.name = 손상된 메탈 바닥 +block.ignarock.name = 얼은바위 +block.hotrock.name = 뜨거운바위 +block.magmarock.name = 마그마 바위 +block.cliffs.name = 절벽 block.copper-wall.name = 구리벽 block.copper-wall-large.name = 큰 구리벽 -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall +block.titanium-wall.name = 티타늄 벽 +block.titanium-wall-large.name = 대형 티타늄 벽 block.phase-wall.name = 메타벽 block.phase-wall-large.name = 큰 메타벽 block.thorium-wall.name = 토륨벽 @@ -543,7 +584,6 @@ block.thorium-wall-large.name = 대형 토륨벽 block.door.name = 문 block.door-large.name = 대형문 block.duo.name = 듀오 -block.scorch.name = 스코치 block.hail.name = 헤일 block.lancer.name = 랜서 block.conveyor.name = 컨베이어 @@ -555,34 +595,31 @@ block.sorter.name = 필터 block.sorter.description = 아이템을 넣어서 필터에 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다. block.overflow-gate.name = 오버플로 게이트 block.overflow-gate.description = 정면으로 가는 자원이 막히면 옆으로 출력하고, 그렇지 않으면 계속 정면으로 출력합니다. -block.smelter.name = 제련소 -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.spore-press.name = Spore Press block.separator.name = 셉터 -block.centrifuge.name = 원심 분리기 block.power-node.name = 전력 송신기 block.power-node-large.name = 대형 전력 송신기 -block.surge-tower.name = Surge Tower +block.surge-tower.name = 설금 타워 block.battery.name = 배터리 block.battery-large.name = 대형 배터리 -block.combustion-generator.name = 석탄 발전기 +block.combustion-generator.name = 화력 발전기 block.turbine-generator.name = 터빈 발전기 -block.differential-generator.name = Differential Generator -block.impact-reactor.name = Impact Reactor -block.mechanical-drill.name = 기계식 드릴 +block.differential-generator.name = 차동 발전기 +block.impact-reactor.name = 충격 반응기 +block.mechanical-drill.name = 기계 드릴 block.pneumatic-drill.name = 강철 드릴 block.laser-drill.name = 레이저 드릴 block.water-extractor.name = 물 추출기 block.cultivator.name = 온실 -block.alpha-dart-mech-pad.name = Alpha-Dart Mech Pad +block.alpha-dart-mech-pad.name = 알파-다트 기체 패드 block.delta-mech-pad.name = 델타 기체 패드 -block.javelin-ship-pad.name = 자비린 비행선 패드 +block.javelin-ship-pad.name = 재블린 비행선 패드 block.trident-ship-pad.name = 삼지창 비행선 패드 block.glaive-ship-pad.name = 글레브 비행선 패드 block.omega-mech-pad.name = 오메가 기체 패드 @@ -605,7 +642,6 @@ 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 = 석유 추출기 @@ -626,9 +662,8 @@ 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.blast-drill.name = 고속 드릴 block.thermal-pump.name = 화력 펌프 block.thermal-generator.name = 열발전기 block.alloy-smelter.name = 설금 제련소 @@ -645,21 +680,21 @@ block.rtg-generator.name = 토륨 발전소 block.spectre.name = 스펙터 block.meltdown.name = 멜트다운 block.container.name = 컨테이너 -block.launch-pad.name = Launch Pad +block.launch-pad.name = 발사대 +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = 기본 드론 유닛. 기본적으로 코어에서 1개가 스폰됩니다.\n자동으로 채광하며 아이템을 수집하고, 블록을 수리합니다. unit.phantom.name = 팬텀 드론 unit.phantom.description = 첨단 드론 유닛.\n광석을 자동으로 채광하며, 아이템을 수집하고 블록을 수리합니다. 일반 드론보다 훨씬 효과적입니다. unit.dagger.name = 디거 unit.dagger.description = 기본 지상 유닛입니다.\n플레이어 기체처럼 드론을 소환하지는 않습니다. -unit.crawler.name = Crawler +unit.crawler.name = 크롤러 unit.titan.name = 타이탄 unit.titan.description = 고급 지상 유닛입니다.\n원거리 총 대신에 근접 화염 방사기를 가지고 있으며, 지상과 공중 둘다 공격할 수 있습니다. unit.ghoul.name = 구울 폭격기 @@ -669,11 +704,11 @@ unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격 unit.fortress.name = 포트리스 unit.fortress.description = 중포 지상 유닛.\n높은 공격력을 가진 총과 높은 체력을 가지고 있습니다. unit.revenant.name = 레비던트 -unit.eruptor.name = Eruptor -unit.chaos-array.name = Chaos Array -unit.eradicator.name = Eradicator -unit.lich.name = Lich -unit.reaper.name = Reaper +unit.eruptor.name = 이어럽터 +unit.chaos-array.name = 혼돈 배열 +unit.eradicator.name = 에라데이터 +unit.lich.name = 리치 +unit.reaper.name = 사신 tutorial.begin = 플레이어의 주요 목표는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n이 게임은 [accent]구리를 채광[]하는 것으로 시작합니다.\n이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요. tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요. tutorial.conveyor = [accent]컨베이어[]를 사용하여 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요. @@ -697,8 +732,6 @@ tutorial.dagger = 전력 노드를 공장에 연결하세요.\n일단 요구 사 tutorial.battle = [LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요. block.copper-wall.description = 구리로 만든 방어벽.\n가장 약한 방어벽입니다. block.copper-wall-large.description = 구리로 만든 큰 방어벽.\n일반 구리벽의 4개를 합쳐놓은 벽이며, 가장 약한 방어벽입니다. -block.dense-alloy-wall.description = 고밀도 합금으로 만든 방어벽.\n구리벽보다 체력이 높습니다. -block.dense-alloy-wall-large.description = 고밀도 합금으로 만든 큰 방어벽.\n일반 고밀도 합금 벽을 4개 합쳐놓은 벽이며, 내구성이 좋습니다. block.thorium-wall.description = 토륨으로 만든 방어벽.\n아무 기능이 없는 튼튼한 방어벽입니다. block.thorium-wall-large.description = 토륨으로 만든 큰 방어벽.\n토륨벽을 4개 합쳐놓은 벽이며, 내구성이 뛰어납니다. block.phase-wall.description = 메타로 제작하는 방어벽.날라오는 모든 총알을 튕겨내고 데미지를 입는 특수한 벽입니다. @@ -728,9 +761,7 @@ block.titanium-conveyor.description = 빠른 속도로 자원을 수송할 수 block.phase-conveyor.description = 자원을 지정된 방향으로 바로 이동시켜 주는 컨베이어 입니다. block.junction.description = 컨베이어를 교차시켜 자원을 수송할 때 사용할 수 있는 블록입니다. block.mass-driver.description = 자원을 받아서 다른 물질 이동기로 전달할 수 있는 블록입니다.\n엄청난 사거리를 가지고 있으며, 주로 컨베이어가 접근할 수 없는 곳에 유용하게 사용됩니다. -block.smelter.description = 고밀도 합금을 제작할 수 있는 건물입니다. -block.arc-smelter.description = 고밀도 합금을 제작할 수 있는 건물이지만, 이 건물은 석탄이 필요 없고 좀더 빠른 속도로 합금을 생산해낼 수 있습니다. -block.silicon-smelter.description = 실리콘을 제작할 수 있는 건물입니다. +block.silicon-smelter.description = 실리콘을 제작하는 것은 어렵습니다. block.plastanium-compressor.description = 플라스터늄을 제조할 수 있는 건물입니다. block.phase-weaver.description = 메타를 제작할 수 있는 건물입니다. block.alloy-smelter.description = 설금을 제작할 수 있는 건물입니다. @@ -738,12 +769,10 @@ 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.spore-press.description = Compresses spore pods into oil. block.separator.description = 돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. -block.centrifuge.description = 돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물이지만, 이 건물은 좀 더 다양한 자원을 얻을 수 있게 해 줍니다. block.power-node.description = 생성된 전력를 다른 건물로 전달하기 위한 전력 노드입니다. block.power-node-large.description = 생성된 전력를 다른 건물로 전달하기 위한 건물이며, 일반 노드보다 더 많은 전력을 이동시킬 수 있습니다. block.battery.description = 흔히 아는 충전식 배터리입니다.\n전력을 사용하는 건물에 전력이 떨어질경우, 이 배터리를 전력 노드에 연결하면 이 배터리에 저장된 전력을 소모하여 지속적으로 공급할 수 있습니다. @@ -765,7 +794,6 @@ block.blast-drill.description = 최상위 드릴입니다.\n엄청난 양의 전 block.water-extractor.description = 바닥에서 물을 추출하여 건물에 공급할 수 있는 건물입니다. block.cultivator.description = 잔디에서 바이오메터를 추출할 수 있는 건물입니다. block.oil-extractor.description = 석유를 추출 해 주는 건물입니다. -block.dart-ship-pad.description = 다트 비행선으로 바꿀 수 있는 패드입니다.\n\n누르거나 클릭하여 이 기체로 바꿉니다. block.trident-ship-pad.description = 대형 폭격기 역할을 하는 삼지창 비행선으로 바꿀 수 있는 패드입니다.\n\n누르거나 클릭하여 이 기체로 바꿉니다. block.javelin-ship-pad.description = 처음에는 느리지만 가속도가 붙어 다른 비행선보다 5배 이상 빠르게 움직일 수 있으며, 적에게 부딛쳐서 공격할 수 있는 자비린 패드입니다.\n\n누르거나 클릭하여 이 기체로 바꿉니다. block.glaive-ship-pad.description = 글레브 비행선으로 바꿀 수 있는 패드입니다.\n\n누르거나 클릭하여 이 기체로 바꿉니다. @@ -781,7 +809,6 @@ block.titan-factory.description = 지상 및 공중을 공격할 수 있으며, block.fortress-factory.description = 지상 유닛의 최종판이며, 강력한 총을 가진 포트리스를 생산하는 공장입니다. block.revenant-factory.description = 공중 유닛의 최종판이며, 강력한 레이저 총을 가진 레비던트 유닛을 생산할 수 있는 공장입니다. block.repair-point.description = 근처 유닛들을 수리하는 건물입니다.\n커맨드 센터에서 후퇴 명령시 공중 유닛이 이 건물로 이동하여 수리를 받습니다. -block.command-center.description = 생산된 유닛들을 제어할 수 있는 건물.\n첫번째 버튼은 적 기지로 공격하며, 두번째는 대기 상태, 세번째는 기지 근처를 돌며 정찰합니다. block.conduit.description = 일반 파이프.\n액체가 지나갈 수 있도록 해 줍니다. block.pulse-conduit.description = 티타늄으로 만들어 졌으며, 일반 파이프보다 액체 수용량이 높습니다. block.phase-conduit.description = 물을 먼거리로 순간이동 시켜 주는 장치입니다. @@ -795,13 +822,11 @@ 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.item-source.description = 자원을 선택하면 그 자원이 무한하게 생성되는 블록입니다. block.liquid-source.description = 무한한 액체를 출력해냅니다. block.item-void.description = 아이템을 사라지게 만듭니다. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. block.power-void.description = 설정된 아이템을 계속해서 출력하는 블록입니다. liquid.water.description = 지상 유닛이 이 위를 지나가면 이동속도가 느려지고, 깊은 물에 빠지면 죽습니다. -liquid.lava.description = 지상 유닛이 이 위를 지나가면 이동속도가 매우 느려지고, 지속적으로 데미지를 입습니다. liquid.oil.description = 일부 조합 블록에서 사용되는 자원입니다. liquid.cryofluid.description = 포탑 및 토륨 원자로에서 사용되는 자원입니다. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties new file mode 100644 index 0000000000..627ed142be --- /dev/null +++ b/core/assets/bundles/bundle_nl.properties @@ -0,0 +1,832 @@ +credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits = Credits +contributors = Vertalers en Medewerkers +discord = Word lid van de Mindustry Discord! +link.discord.description = De officiële Mindustry discord chatroom +link.github.description = Game broncode +link.dev-builds.description = Onstabiele ontwikkeling builds +link.trello.description = Officiële trello-bord voor geplande functies +link.itch.io.description = itch.io pagina met pc-downloads en webversie +link.google-play.description = Google Play store vermelding +link.wiki.description = Officiële Mindustry wiki +linkfail = Kan link niet openen!\nDe URL is gekopieerd naar je klembord +screenshot = Schermafbeeling opgeslagen in {0} +gameover = Game Over +gameover.pvp = het[accent] {0}[] team heeft gewonnen! +highscore = [accent]Nieuw topscore! +stat.wave = Waves Verslagen:[accent] {0} +stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0} +stat.built = Gebouwen Gebouwd:[accent] {0} +stat.destroyed = Gebouwen Vernietigd:[accent] {0} +stat.deconstructed = Gebouwen Gesloopt:[accent] {0} +stat.delivered = Middelen Gelanceerd: +stat.rank = Eindrang: [accent]{0} +map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"? +level.highscore = Topscore: [accent]{0} +level.select = Selecteer Level +level.mode = Spelmodus: +construction.desktop = Om een blok te deselecteren of te stoppen met bouwen, [accent]gebruik spatiebalk[]. +construction.title = Blok Bouwhandleiding +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. +deconstruction.title = Block Deconstruction Guide +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. +showagain = Don't show again next session +coreattack = < Core is under attack! > +nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent +outofbounds = [[ OUT OF BOUNDS ]\n[]self-destruct in {0} +database = Core Database +savegame = Save Game +loadgame = Load Game +joingame = Join Game +addplayers = Add/Remove Players +customgame = Custom Game +newgame = New Game +none = +close = Close +quit = Quit +maps = Maps +continue = Continue +maps.none = [LIGHT_GRAY]No maps found! +about.button = About +name = Name: +noname = Pick a[accent] player name[] first. +filename = File Name: +unlocked = New content unlocked! +completed = [accent]Completed +techtree = Tech Tree +research.list = [LIGHT_GRAY]Research: +research = Research +researched = [LIGHT_GRAY]{0} researched. +players = {0} players online +players.single = {0} player online +server.closing = [accent]Closing server... +server.kicked.kick = You have been kicked from the server! +server.kicked.serverClose = Server closed. +server.kicked.clientOutdated = Outdated client! Update your game! +server.kicked.serverOutdated = Outdated server! Ask the host to update! +server.kicked.banned = You are banned on this server. +server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. +server.kicked.nameInUse = There is someone with that name\nalready on this server. +server.kicked.nameEmpty = Your chosen name is invalid. +server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. +server.kicked.customClient = This server does not support custom builds. Download an official version. +server.kicked.gameover = Game over! +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. +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. +hostserver = Host Game +hostserver.mobile = Host\nGame +host = Host +hosting = [accent]Opening server... +hosts.refresh = Refresh +hosts.discovering = Discovering LAN games +server.refreshing = Refreshing server +hosts.none = [lightgray]No local games found! +host.invalid = [scarlet]Can't connect to host. +trace = Trace Player +trace.playername = Player name: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = Unique ID: [accent]{0} +trace.android = Android Client: [accent]{0} +trace.modclient = Custom Client: [accent]{0} +trace.totalblocksbroken = Total blocks broken: [accent]{0} +trace.structureblocksbroken = Structure blocks broken: [accent]{0} +trace.lastblockbroken = Last block broken: [accent]{0} +trace.totalblocksplaced = Total blocks placed: [accent]{0} +trace.lastblockplaced = Last block placed: [accent]{0} +invalidid = Invalid client ID! Submit a bug report. +server.bans = Bans +server.bans.none = No banned players found! +server.admins = Admins +server.admins.none = No admins found! +server.add = Add Server +server.delete = Are you sure you want to delete this server? +server.hostname = Host: {0} +server.edit = Edit Server +server.outdated = [crimson]Outdated Server![] +server.outdated.client = [crimson]Outdated Client![] +server.version = [lightgray]Version: {0} {1} +server.custombuild = [yellow]Custom Build +confirmban = Are you sure you want to ban this player? +confirmkick = Are you sure you want to kick this player? +confirmunban = Are you sure you want to unban this player? +confirmadmin = Are you sure you want to make this player an admin? +confirmunadmin = Are you sure you want to remove admin status from this player? +joingame.title = Join Game +joingame.ip = Address: +disconnect = Disconnected. +disconnect.data = Failed to load world data! +connecting = [accent]Connecting... +connecting.data = [accent]Loading world data... +server.port = Port: +server.addressinuse = Address already in use! +server.invalidport = Invalid port number! +server.error = [crimson]Error hosting server: [accent]{0} +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. +save.new = New Save +save.overwrite = Are you sure you want to overwrite\nthis save slot? +overwrite = Overwrite +save.none = No saves found! +saveload = [accent]Saving... +savefail = Failed to save game! +save.delete.confirm = Are you sure you want to delete this save? +save.delete = Delete +save.export = Export Save +save.import.invalid = [accent]This save is invalid! +save.import.fail = [crimson]Failed to import save: [accent]{0} +save.export.fail = [crimson]Failed to export save: [accent]{0} +save.import = Import Save +save.newslot = Save name: +save.rename = Rename +save.rename.text = New name: +selectslot = Select a save. +slot = [accent]Slot {0} +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. +empty = +on = On +off = Off +save.autosave = Autosave: {0} +save.map = Map: {0} +save.wave = Wave {0} +save.difficulty = Difficulty: {0} +save.date = Last Saved: {0} +save.playtime = Playtime: {0} +warning = Warning. +confirm = Confirm +delete = Delete +ok = OK +open = Open +cancel = Cancel +openlink = Open Link +copylink = Copy Link +back = Back +quit.confirm = Are you sure you want to quit? +changelog.title = Changelog +changelog.loading = Getting changelog... +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. +changelog.error.ios = [accent]The changelog is currently not supported in iOS. +changelog.error = [scarlet]Error getting changelog!\nCheck your internet connection. +changelog.current = [yellow][[Current version] +changelog.latest = [accent][[Latest version] +loading = [accent]Loading... +saving = [accent]Saving... +wave = [accent]Wave {0} +wave.waiting = [LIGHT_GRAY]Wave in {0} +waiting = [LIGHT_GRAY]Waiting... +waiting.players = Waiting for players... +wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining +wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining +loadimage = Load Image +saveimage = Save Image +unknown = Unknown +custom = Custom +builtin = Built-In +map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! +map.random = [accent]Random Map +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. +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. +map.invalid = Error loading map: corrupted or invalid map file. +editor.brush = Brush +editor.openin = Open In Editor +editor.oregen = Ore Generation +editor.oregen.info = Ore Generation: +editor.mapinfo = Map Info +editor.author = Author: +editor.description = Description: +editor.name = Name: +editor.teams = Teams +editor.elevation = Elevation +editor.errorimageload = Error loading file:\n[accent]{0} +editor.errorimagesave = Error saving file:\n[accent]{0} +editor.generate = Generate +editor.resize = Resize +editor.loadmap = Load Map +editor.savemap = Save Map +editor.saved = Saved! +editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. +editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. +editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! +editor.import = Import... +editor.importmap = Import Map +editor.importmap.description = Import an already existing map +editor.importfile = Import File +editor.importfile.description = Import an external map file +editor.importimage = Import Legacy Image +editor.importimage.description = Import an external map image file +editor.export = Export... +editor.exportfile = Export File +editor.exportfile.description = Export a map file +editor.exportimage = Export Terrain Image +editor.exportimage.description = Export a map image file +editor.loadimage = Import Terrain +editor.saveimage = Export Terrain +editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? +editor.resizemap = Resize Map +editor.mapname = Map Name: +editor.overwrite = [accent]Warning!\nThis overwrites an existing map. +editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? +editor.selectmap = Select a map to load: +width = Width: +height = Height: +menu = Menu +play = Play +load = Load +save = Save +fps = FPS: {0} +tps = TPS: {0} +ping = Ping: {0}ms +language.restart = Please restart your game for the language settings to take effect. +settings = Settings +tutorial = Tutorial +editor = Editor +mapeditor = Map Editor +donate = Donate +abandon = Abandon +abandon.text = This zone and all its resources will be lost to the enemy. +locked = Locked +complete = [LIGHT_GRAY]Complete: +resume = Resume Zone:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Best Wave: {0} +launch = < LAUNCH > +launch.title = Launch Successful +launch.next = [LIGHT_GRAY]next opportunity at wave {0} +launch.unable = [scarlet]Unable to LAUNCH.[] {0} Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}. +zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Wave {0} reached:\nNew zone requirements met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health +connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} +error.unreachable = Server unreachable.\nIs the address spelled correctly? +error.invalidaddress = Invalid address. +error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! +error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! +error.alreadyconnected = Already connected. +error.mapnotfound = Map file not found! +error.io = Network I/O error. +error.any = Unknown network error. +zone.groundZero.name = Ground Zero +zone.craters.name = The Craters +zone.frozenForest.name = Frozen Forest +zone.ruinousShores.name = Ruinous Shores +zone.crags.name = Crags +zone.stainedMountains.name = Stained Mountains +zone.impact0079.name = Impact 0079 +zone.desolateRift.name = Desolate Rift +zone.arcticDesert.name = Arctic Desert +zone.dryWastes.name = Dry Wastes +zone.nuclearComplex.name = Nuclear Production Complex +zone.moltenFault.name = Molten Fault +settings.language = Language +settings.reset = Reset to Defaults +settings.rebind = Rebind +settings.controls = Controls +settings.game = Game +settings.sound = Sound +settings.graphics = Graphics +settings.cleardata = Clear Game Data... +settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! +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. +settings.clearunlocks = Clear Unlocks +settings.clearall = Clear All +paused = [accent]< Paused > +yes = Yes +no = No +info.title = Info +error.title = [crimson]An error has occured +error.crashtitle = An error has occured +blocks.outputspeed = Drill Speed: {0}/s +blocks.unknown = [LIGHT_GRAY]??? +blocks.blockinfo = Block Info +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} +blocks.powercapacity = Power Capacity +blocks.powershot = Power/Shot +blocks.targetsair = Targets Air +blocks.itemsmoved = Move Speed +blocks.shootrange = Range +blocks.size = Size +blocks.liquidcapacity = Liquid Capacity +blocks.maxitemssecond = Max Items +blocks.powerrange = Power Range +blocks.poweruse = Power Use +blocks.powerdamage = Power/Damage +blocks.inputitemcapacity = Input Item Capacity +blocks.outputitemcapacity = Output Item Capacity +blocks.itemcapacity = Item Capacity +blocks.basepowergeneration = Base Power Generation +blocks.powertransferspeed = Power Transfer +blocks.craftspeed = Production Speed +blocks.inputliquid = Input Liquid +blocks.inputliquidaux = Aux Liquid +blocks.inputitem = Input Item +blocks.inputitems = Input Items +blocks.outputitem = Output Item +blocks.drilltier = Drillables +blocks.drillspeed = Base Drill Speed +blocks.maxunits = Max Active Units +blocks.liquidoutput = Liquid Output +blocks.liquidoutputspeed = Liquid Output Speed +blocks.liquiduse = Liquid Use +blocks.coolant = Coolant +blocks.liquid = Liquid +blocks.coolantuse = Coolant Use +blocks.inputliquidfuel = Fuel Liquid +blocks.liquidfueluse = Liquid Fuel Use +blocks.boostitem = Boost Item +blocks.boostliquid = Boost Liquid +blocks.health = Health +blocks.heat = Heat +blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} +blocks.power.satisfaction = Power Satisfaction +blocks.inaccuracy = Inaccuracy +blocks.shots = Shots +blocks.reload = Shots/Second +blocks.inputfuel = Fuel +blocks.fuelburntime = Fuel Burn Time +blocks.inputcapacity = Input capacity +blocks.outputcapacity = Output capacity +blocks.ammo = Ammo +unit.blocks = blocks +unit.powersecond = power units/second +unit.liquidsecond = liquid units/second +unit.itemssecond = items/second +unit.liquidunits = liquid units +unit.powerunits = power units +unit.degrees = degrees +unit.seconds = seconds +unit.items = items +category.general = General +category.power = Power +category.liquids = Liquids +category.items = Items +category.crafting = Crafting +category.shooting = Shooting +category.optional = Optional Enhancements +setting.indicators.name = Ally Indicators +setting.autotarget.name = Auto-Target +setting.fpscap.name = Max FPS +setting.fpscap.none = None +setting.fpscap.text = {0} FPS +setting.difficulty.training = training +setting.difficulty.easy = easy +setting.difficulty.normal = normal +setting.difficulty.hard = hard +setting.difficulty.insane = insane +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.fps.name = Show FPS +setting.vsync.name = VSync +setting.lasers.name = Show Power Lasers +setting.minimap.name = Show Minimap +setting.musicvol.name = Music Volume +setting.mutemusic.name = Mute Music +setting.sfxvol.name = SFX Volume +setting.mutesound.name = Mute Sound +setting.crashreport.name = Send Anonymous Crash Reports +keybind.title = Rebind Keys +category.general.name = General +category.view.name = View +category.multiplayer.name = Multiplayer +command.attack = Attack +command.retreat = Retreat +command.patrol = Patrol +keybind.gridMode.name = Block Select +keybind.gridModeShift.name = Category Select +keybind.press = Press a key... +keybind.press.axis = Press an axis or key... +keybind.screenshot.name = Map Screenshot +keybind.move_x.name = Move x +keybind.move_y.name = Move y +keybind.select.name = Select/Shoot +keybind.pick.name = Pick Block +keybind.break_block.name = Break Block +keybind.deselect.name = Deselect +keybind.shoot.name = Shoot +keybind.zoom_hold.name = Zoom Hold +keybind.zoom.name = Zoom +keybind.menu.name = Menu +keybind.pause.name = Pause +keybind.dash.name = Dash +keybind.chat.name = Chat +keybind.player_list.name = Player list +keybind.console.name = Console +keybind.rotate.name = Rotate +keybind.toggle_menus.name = Toggle menus +keybind.chat_history_prev.name = Chat history prev +keybind.chat_history_next.name = Chat history next +keybind.chat_scroll.name = Chat scroll +keybind.drop_unit.name = Drop Unit +keybind.zoom_minimap.name = Zoom minimap +mode.help.title = Description of modes +mode.survival.name = Survival +mode.survival.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.freebuild.name = Freebuild +mode.freebuild.description = Limited resources and no timer for waves. +mode.pvp.name = PvP +mode.pvp.description = Fight against other players locally. +mode.attack.name = Attack +mode.attack.description = No waves, with the goal to destroy the enemy base. +content.item.name = Items +content.liquid.name = Liquids +content.unit.name = Units +content.block.name = Blocks +content.mech.name = Mechs +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 = Coal +item.coal.description = A common and readily available fuel. +item.graphite.name = Graphite +item.titanium.name = Titanium +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.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. +item.sand.name = Sand +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.metaglass.name = Metaglass +item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. +item.scrap.name = Scrap +item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +liquid.water.name = Water +liquid.slag.name = Slag +liquid.oil.name = Oil +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 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 +item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% +item.flammability = [LIGHT_GRAY]Flammability: {0}% +item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% +unit.health = [LIGHT_GRAY]Health: {0} +unit.speed = [LIGHT_GRAY]Speed: {0} +mech.weapon = [LIGHT_GRAY]Weapon: {0} +mech.health = [LIGHT_GRAY]Health: {0} +mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} +mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} +mech.minepower = [LIGHT_GRAY]Mining Power: {0} +mech.ability = [LIGHT_GRAY]Ability: {0} +liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} +liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} +liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster +block.kiln.name = Kiln +block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. +block.graphite-press.name = Graphite Press +block.multi-press.name = Multi-Press +block.constructing = {0} [LIGHT_GRAY](Constructing) +block.spawn.name = Enemy Spawn +block.core-shard.name = Core: Shard +block.core-foundation.name = Core: Foundation +block.core-nucleus.name = Core: Nucleus +block.deepwater.name = Deep Water +block.water.name = Water +block.tar.name = Tar +block.stone.name = Stone +block.sand.name = Dark Sand +block.ice.name = Ice +block.snow.name = Snow +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulder +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs +block.copper-wall.name = Copper Wall +block.copper-wall-large.name = Large Copper Wall +block.titanium-wall.name = Titanium Wall +block.titanium-wall-large.name = Large Titanium 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 +block.door.name = Door +block.door-large.name = Large Door +block.duo.name = Duo +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Conveyor +block.titanium-conveyor.name = Titanium Conveyor +block.junction.name = Junction +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sorter +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.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.spore-press.name = Spore Press +block.separator.name = Separator +block.power-node.name = Power Node +block.power-node-large.name = Large Power Node +block.surge-tower.name = Surge Tower +block.battery.name = Battery +block.battery-large.name = Large Battery +block.combustion-generator.name = Combustion Generator +block.turbine-generator.name = Turbine Generator +block.differential-generator.name = Differential Generator +block.impact-reactor.name = Impact Reactor +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-dart-mech-pad.name = Alpha-Dart Mech 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.conduit.name = Conduit +block.mechanical-pump.name = Mechanical Pump +block.item-source.name = Item Source +block.item-void.name = Item Void +block.liquid-source.name = Liquid Source +block.power-void.name = Power Void +block.power-source.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.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.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.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.mass-driver.name = Mass Driver +block.blast-drill.name = Airblast Drill +block.thermal-pump.name = Thermal Pump +block.thermal-generator.name = Thermal Generator +block.alloy-smelter.name = Alloy Smelter +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.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. +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.spirit.name = Spirit Drone +unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores and repairs blocks. +unit.phantom.name = Phantom Drone +unit.phantom.description = An advanced drone unit. Automatically mines ores and repairs blocks. Significantly more effective than a spirit drone. +unit.dagger.name = Dagger +unit.dagger.description = A basic ground unit. Useful in swarms. +unit.crawler.name = Crawler +unit.titan.name = Titan +unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. +unit.ghoul.name = Ghoul Bomber +unit.ghoul.description = A heavy carpet bomber. +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.eruptor.name = Eruptor +unit.chaos-array.name = Chaos Array +unit.eradicator.name = Eradicator +unit.lich.name = Lich +unit.reaper.name = Reaper +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.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 blocks 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. Moves 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.silicon-smelter.description = Reduces sand with highly pure coal 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.melter.description = Melts down scrap into slag for further processing or usage in turrets. +block.incinerator.description = Gets rid of any excess item or liquid. +block.spore-press.description = Compresses spore pods into oil. +block.separator.description = Extracts useful minerals from slag. +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 power when placed in hot locations. +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. Power output depends on fullness, with base power generated at half capacity. +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 of each type. Adjacent containers, vaults and cores will be treated as a single storage unit. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. +block.vault.description = Stores a large amount of items of each type. Adjacent containers, vaults and cores will be treated as a single storage unit. 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 spores 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.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 air units. +block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. +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.item-source.description = Infinitely outputs items. Sandbox only. +block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.item-void.description = Destroys any items which go into it without using power. Sandbox only. +block.power-source.description = Infinitely outputs power. Sandbox only. +block.power-void.description = Voids all power inputted into it. Sandbox only. +liquid.water.description = Commonly used for cooling machines and waste processing. +liquid.oil.description = Can be burnt, exploded or used as a coolant. +liquid.cryofluid.description = The most efficient liquid for cooling things down. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index ca030d032f..bab1016b6a 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -20,6 +20,7 @@ stat.built = Budynki zbudowane:[accent] {0} stat.destroyed = Budynki zniszczone:[accent] {0} stat.deconstructed = Budynki zrekonstruowane:[accent] {0} stat.delivered = Surowce wystrzelone: +stat.rank = Final Rank: [accent]{0} map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Wybrany poziom @@ -185,7 +186,6 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Musisz dodać [ROYAL]niebies map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze. map.invalid = Error podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. editor.brush = Pędzel -editor.slope = \\ editor.openin = Otwórz w edytorze editor.oregen = Generacja złóż editor.oregen.info = Generacja złóż: @@ -250,7 +250,16 @@ launch = Wystrzel launch.title = Wystrzelenie Udane launch.next = [LIGHT_GRAY]Następna okazja przy fali {0} launch.unable = [scarlet] Wystrzelenie niedozwolone![] Wykryto przeciwników. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY] Strefa {0} odblokowana! +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Nie można połączyć się z serwerem: [accent] {0} error.unreachable = Serwer niedostępny. error.invalidaddress = Niepoprawny adres. @@ -290,12 +299,15 @@ no = Nie ma mowy! info.title = [accent]Informacje error.title = [crimson]Wystąpił błąd error.crashtitle = Wystąpił błąd +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Informacje o bloku +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Pojemność mocy blocks.powershot = moc/strzał blocks.targetsair = Może namierzać wrogów powietrznych -blocks.itemspeed = Szybkość Transporterów +blocks.itemsmoved = Move Speed blocks.shootrange = Zasięg blocks.size = Rozmiar blocks.liquidcapacity = Pojemność cieczy @@ -316,6 +328,7 @@ blocks.inputitems = Materiały do produkcji blocks.outputitem = Produkty blocks.drilltier = Co może wykopać blocks.drillspeed = Postawowa szybkość kopania +blocks.maxunits = Max Active Units blocks.liquidoutput = Wyprodukowany płyn blocks.liquidoutputspeed = Prędkość odpływu cieczy blocks.liquiduse = Zużycie płynów @@ -327,7 +340,10 @@ blocks.liquidfueluse = Zużycie paliwa blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Zdrowie +blocks.heat = Heat blocks.power = Prąd +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Zapotrzebowanie Prądu blocks.inaccuracy = Niedokładność blocks.shots = Strzały @@ -336,11 +352,11 @@ blocks.inputfuel = Paliwo blocks.fuelburntime = Płonięcie paliwa blocks.inputcapacity = Pojemność wejściowa blocks.outputcapacity = Wydajność wyjściowa +blocks.ammo = Ammo unit.blocks = Klocki unit.powersecond = jednostek prądu na sekundę unit.liquidsecond = jednostek płynów na sekundę unit.itemssecond = przedmiotów na sekundę -unit.pixelssecond = pikseli na sekundę unit.liquidunits = jednostek płynów unit.powerunits = jednostek prądu unit.degrees = stopnie @@ -395,7 +411,7 @@ keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie keybind.select.name = Zaznacz keybind.pick.name = Wybierz Blok -keybind.break.name = Niszczenie +keybind.break_block.name = Break Block keybind.deselect.name = Odznacz keybind.shoot.name = Strzelanie keybind.zoom_hold.name = Inicjator przybliżania @@ -423,7 +439,7 @@ mode.freebuild.description = Normalne surowce i fale bez odliczania. mode.pvp.name = PvP mode.pvp.description = Walcz przeciwko innym graczom. mode.attack.name = Atak -mode.attack.descrption = Brak fal. Celem jest zniszczenie bazy wrogów. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Przedmioty content.liquid.name = Płyny content.unit.name = Jednostki @@ -448,8 +464,8 @@ item.phase-fabric.name = Włókno Fazowe item.phase-fabric.description = Niewiarygodnie lekkie włókno używane w zaawansowanej elektronice i technologii samo-naprawiającej się. item.surge-alloy.name = Energetyczny Stop item.surge-alloy.description = Zaawansowany materiał z niesłychanymi wartościami energetycznymi. -item.biomatter.name = Biomateria -item.biomatter.description = Zbita organiczna papka używana jako materiał do ropy lub jako podstawowy materiał energetyczny. Wegańska! +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Piasek item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne. item.blast-compound.name = Wybuchowy związek @@ -461,7 +477,7 @@ item.metaglass.description = Niesamowite silne szkło. Szeroko używane w transp item.scrap.name = Resztki item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego. liquid.water.name = Woda -liquid.lava.name = Lawa +liquid.slag.name = Slag liquid.oil.name = Ropa liquid.cryofluid.name = Lodociecz mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Umiejętność: {0} liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0} liquid.viscosity = [LIGHT_GRAY]Lepkość: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Piec Ceglany block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małą ilość energii. block.graphite-press.name = Grafitowa Prasa @@ -515,23 +536,43 @@ block.constructing = {0}\n[LIGHT_GRAY](Budowa) block.spawn.name = Spawn wrogów block.core-shard.name = Rdzeń: Ułamek block.core-foundation.name = Rdzeń: Podstawa -block.core-nucleus = Rdzeń: Jądro -block.metalfloor.name = Podłoga Metalowa +block.core-nucleus.name = Core: Nucleus block.deepwater.name = Głęboka Woda block.water.name = Woda -block.lava.name = Lawa block.tar.name = Smoła -block.blackstone.name = Czarny Kamień block.stone.name = Kamień -block.dirt.name = Ziemia block.sand.name = Piasek block.ice.name = Lód block.snow.name = Śnieg -block.grass.name = Trawa -block.shrub.name = Krzak -block.rock.name = Skała -block.blackrock.name = Czarna Skała -block.icerock.name = Lodowa Skała +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Miedziana Ściana block.copper-wall-large.name = Duża miedziana ściana block.titanium-wall.name = Tytanowa Ściana @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Duża Torowa Ściana block.door.name = Drzwi block.door-large.name = Duże drzwi block.duo.name = Podwójne działko -block.scorch.name = Ogniste działko block.hail.name = Święte działko block.lancer.name = Lancer block.conveyor.name = Przenośnik @@ -555,17 +595,14 @@ block.sorter.name = Sortownik block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki. block.overflow-gate.name = Brama Przeciwprzepełnieniowa block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona -block.smelter.name = Huta -block.arc-smelter.name = Duża Huta block.silicon-smelter.name = Huta Krzemu block.phase-weaver.name = Fazowa Fabryka block.pulverizer.name = Rozkruszacz block.cryofluidmixer.name = Mieszacz Cryofluidu block.melter.name = Przetapiacz block.incinerator.name = Spalacz -block.biomattercompressor.name = Kompresor Biomaterii +block.spore-press.name = Spore Press block.separator.name = Rozdzielacz -block.centrifuge.name = Wirnik block.power-node.name = Węzeł Prądu block.power-node-large.name = Duży Węzeł Prądu block.surge-tower.name = Wieża Energetyczna @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Most Transportowy block.plastanium-compressor.name = Kompresor Plastanu block.pyratite-mixer.name = Mieszacz Piratianu block.blast-mixer.name = Wybuchowy Mieszacz -block.solidifer.name = Utwardzacz block.solar-panel.name = Panel Słoneczny block.solar-panel-large.name = Duży Panel Słoneczny block.oil-extractor.name = Ekstraktor Ropy @@ -626,7 +662,6 @@ block.liquid-junction.name = Łącznik Płynów block.bridge-conduit.name = Most Płynów block.rotary-pump.name = Wirowa Pompa block.thorium-reactor.name = Reaktor Torowy -block.command-center.name = Centrum dowodzenia block.mass-driver.name = Katapulta Masy block.blast-drill.name = Wiertło Wybuchowe block.thermal-pump.name = Pompa Termalna @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Kontener block.launch-pad.name = Skocznia +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = niebieski team.red.name = czerwony team.orange.name = pomarańczowy team.none.name = szary team.green.name = zielony team.purple.name = fioletowy -unit.alpha-drone.name = Dron Alpha unit.spirit.name = Duch unit.spirit.description = Początkowy dron. Rdzeń zawsze tworzy jeden. Wydobywa surowce, naprawia budynki oraz pomaga przy budowie. unit.phantom.name = Widmo @@ -697,8 +732,6 @@ tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a 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. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Advanced item transport block. Moves items 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. @@ -738,12 +769,10 @@ block.pulverizer.description = Crushes stone into sand. Useful when there is a l 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.spore-press.description = Compresses spore pods into 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. @@ -765,7 +794,6 @@ block.blast-drill.description = The ultimate drill. Requires large amounts of po 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. @@ -781,7 +809,6 @@ 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 = Zaawansowany blok do przenoszenia cieczy. Transports liquids faster and stores more than standard conduits. block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego phase conduit przez kilka bloków. @@ -795,13 +822,11 @@ block.thermal-pump.description = The ultimate pump. Three times as fast as a mec block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów. block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków. block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek. -block.alpha-mech-pad.description = When given enough power, rebuilds your ship into the[accent] Alpha[] mech. block.item-source.description = Wydziela przedmioty w nieskończoność. Dostępny tylko w trybie sandbox. block.liquid-source.description = Wydziela ciecz w nieskończoność. Dostępny tylko w trybie sandbox. block.item-void.description = Niszczy wszystkie przedmioty, które idą do tego bloku, który nie wymaga prądu. Dostępny tylko w trybie sandbox. block.power-source.description = Wydziela prąd w nieskończoność. Dostępny tylko w trybie sandbox. block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox. liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów. -liquid.lava.description = Może być przekształcona w [LIGHT_GRAY] kamień[]; używana do generowania prądu lub używana jako amunicja dla niektórych działek. liquid.oil.description = Może się palić, eksplodować lub być używana do schładzania. liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index a9088f98cf..02e46340da 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -185,7 +186,6 @@ map.nospawn = Esse mapa não contém um [yellow]núcleo[] para o jogador Nascer! map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor. map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. editor.brush = Pincel -editor.slope = \\ editor.openin = Abrir no Editor editor.oregen = Geração de minério editor.oregen.info = Geração de minério: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} error.unreachable = Servidor inalcançavel. error.invalidaddress = Endereço invalido. @@ -290,12 +299,15 @@ no = Não info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Informação do Bloco +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Capacidade de Energia blocks.powershot = Energia/tiro blocks.targetsair = Mirar no ar -blocks.itemspeed = Unidades mobilizadas +blocks.itemsmoved = Move Speed blocks.shootrange = Alcance blocks.size = Tamanho blocks.liquidcapacity = Capacidade de Líquido @@ -316,6 +328,7 @@ blocks.inputitems = Itens de entrada blocks.outputitem = Itens de saida blocks.drilltier = Furaveis blocks.drillspeed = Velocidade da furadeira base +blocks.maxunits = Max Active Units blocks.liquidoutput = Saida de liquido blocks.liquidoutputspeed = Velocidade da saida de líquido blocks.liquiduse = Uso de liquido @@ -327,7 +340,10 @@ blocks.liquidfueluse = Uso do liquido de combustivel blocks.boostitem = Acelerar item blocks.boostliquid = Acelerar líquido blocks.health = Saúde +blocks.heat = Heat blocks.power = Poder +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = Imprecisão blocks.shots = Tiros @@ -336,11 +352,11 @@ blocks.inputfuel = Combustivel blocks.fuelburntime = Tempo de queima de combustivel blocks.inputcapacity = Capacidade de entrada blocks.outputcapacity = Capacidade de saída +blocks.ammo = Ammo unit.blocks = blocos unit.powersecond = Unidades de energia/segundo unit.liquidsecond = Unidades de líquido/segundo unit.itemssecond = itens/segundo -unit.pixelssecond = pixeis/segundo unit.liquidunits = Unidades de liquido unit.powerunits = Unidades de energia unit.degrees = Graus @@ -395,7 +411,7 @@ keybind.move_x.name = mover_x keybind.move_y.name = mover_y keybind.select.name = selecionar keybind.pick.name = Pick Block -keybind.break.name = quebrar +keybind.break_block.name = Break Block keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar keybind.zoom_hold.name = segurar_zoom @@ -423,7 +439,7 @@ mode.freebuild.description = recursos limitados e Sem tempo para Ataques. mode.pvp.name = PvP mode.pvp.description = Lutar contra outros jogadores locais. mode.attack.name = Ataque -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Itens content.liquid.name = Liquidos content.unit.name = Units @@ -448,8 +464,8 @@ item.phase-fabric.name = Fabrica fase item.phase-fabric.description = Uma substancia quase sem peso Usado em eletronica avançada E tecnologia de auto-reparo. item.surge-alloy.name = Liga de surto item.surge-alloy.description = Uma liga com propriedades unicas eletricas. -item.biomatter.name = Biomateria -item.biomatter.description = Um monte de materia organica; Usado na conversão de oleo Ou como oleo basico. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Areia item.sand.description = Um material comum Que é usado intensivamente em derretimento, Tanto em ligas como fluxo. item.blast-compound.name = Composto de explosão @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Água -liquid.lava.name = Lava +liquid.slag.name = Slag liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido mech.alpha-mech.name = Alfa @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Habilidade: {0} liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Spawn dos inimigos block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Chão de metal block.deepwater.name = água funda block.water.name = Água -block.lava.name = Lava block.tar.name = Tar -block.blackstone.name = Pedra negra block.stone.name = Pedra -block.dirt.name = Terra block.sand.name = Areia block.ice.name = Gelo block.snow.name = Neve -block.grass.name = Grama -block.shrub.name = Arbusto -block.rock.name = Rocha -block.blackrock.name = Rocha negra -block.icerock.name = Rocha de gelo +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Parede larga de tório block.door.name = Porta block.door-large.name = Porta Grande block.duo.name = Dupla -block.scorch.name = Queimar block.hail.name = Hail block.lancer.name = Lancador block.conveyor.name = Esteira @@ -555,17 +595,14 @@ block.sorter.name = Ordenador block.sorter.description = [interact]Aperte no bloco para configurar[] block.overflow-gate.name = Portão Sobrecarregado block.overflow-gate.description = Uma combinação de roteador e divisor Que apenas manda para a esquerda e Direita se a frente estiver bloqueada. -block.smelter.name = Fornalha -block.arc-smelter.name = Fundidora Arc block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador block.cryofluidmixer.name = Misturador de Crio Fluido block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador -block.biomattercompressor.name = Compressor de bio-matéria +block.spore-press.name = Spore Press block.separator.name = Separador -block.centrifuge.name = Centrifuga block.power-node.name = Célula de energia block.power-node-large.name = Célula de energia Grande block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = Esteira-Ponte block.plastanium-compressor.name = Compressor de Plastanio block.pyratite-mixer.name = Misturador de Piratita block.blast-mixer.name = Misturador de Explosão -block.solidifer.name = Solidificador block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande block.oil-extractor.name = Extrator de Óleo @@ -626,7 +662,6 @@ block.liquid-junction.name = Junção de Líquido block.bridge-conduit.name = Conduto-Ponte block.rotary-pump.name = Bomba Rotatoria block.thorium-reactor.name = Reator Torio -block.command-center.name = Centro De Comando block.mass-driver.name = Drive de Massa block.blast-drill.name = Mineradora de Explosão block.thermal-pump.name = Cano termico @@ -646,13 +681,13 @@ block.spectre.name = Espectra block.meltdown.name = Derreter block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. team.blue.name = Azul team.red.name = Vermelho team.orange.name = Laranja team.none.name = Cinza team.green.name = Verde team.purple.name = Roxo -unit.alpha-drone.name = Drone alfa unit.spirit.name = Drone Spirit unit.spirit.description = A unidade de drone inicial. Ele nasce no core por padrão. Minera minérios automaticamente, Coleta itens e repara blocos. unit.phantom.name = Drone Phantom @@ -697,8 +732,6 @@ tutorial.dagger = Ligue os nodos de energia a fabrica.\nQuando os requerimentos tutorial.battle = O[LIGHT_GRAY] Inimigo[] revelou seu core.\nDestrua com sua unidade e Dagger's. block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o core e torres no começo. block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o core e torres no começo.\nOcupa multiplos espaços. -block.dense-alloy-wall.description = Um bloco defensivo padrão.\nProteção adequada contra inimigos. -block.dense-alloy-wall-large.description = Um bloco defensivo padrão.\nProteção adequada contra inimigos.\nOcupa multiplos espaços. block.thorium-wall.description = A strong defensive block.\nBoa proteção contra inimigos. block.thorium-wall-large.description = Um bloco grande e defensivo.\nBoa proteção contra inimigos.\nOcupa multiplos espaços. block.phase-wall.description = Não tão forte quanto a parede de torio Mas vai defletir balas a menos que seja muito forte. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Bloco de transporte de item avancado. Move block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. block.mass-driver.description = Bloco de transporte de itens supremo. Coleta itens severos e atira eles em outro mass driver de uma longa distancia. -block.smelter.description = Queima carvão para derreter cobre e chumbo em liga densa. -block.arc-smelter.description = Derrete Cobre e chumbo em liga densa usando energia exterior. block.silicon-smelter.description = Reduz areia a coque altamente puro Para fazer silicio. block.plastanium-compressor.description = Produz plastanio para usando oleo e titanio. block.phase-weaver.description = Produz tecido de fase de torio radioativo e grandes quantidades de areia. @@ -738,12 +769,10 @@ block.pulverizer.description = Esmaga pedra em areia. Util quando esta em falta block.pyratite-mixer.description = Mistura carvão, Cobre e areia em piratite altamente inflamavel block.blast-mixer.description = Usa oleo em Transformar piratite em composto de explosão menos inflamavel mas mais explosivo block.cryofluidmixer.description = Combina agua e titanio em cryo fluido que é mais eficiente em esfriar. -block.solidifer.description = Esfria lava em pedra em um ritmo rapido. block.melter.description = Aquece pedra em altas temperaturas para fazer lava. block.incinerator.description = Se livra de itens em excesso ou liquidos. -block.biomattercompressor.description = Compressa Biomassa para recuperar oleo. +block.spore-press.description = Compresses spore pods into oil. block.separator.description = Expos pedra em agua em pressão para ter varios mineiras contendo na pedra. -block.centrifuge.description = Mais eficiente que o separador, Mas mais caro e precisa de energia. block.power-node.description = Transmite poder em nodos. Maximo de 4 fontes de energia, sinks ou nodos podem ser conectados. Os nodos vão receber energia de ou dar energia para qualquer bloco adjacente. block.power-node-large.description = Tem um raio maior que o nodo de energia e pode conectar até 6 fontes de energia, sinks ou nodos. block.battery.description = Guarda energia sempre que tiver em abundancia e da energia sempre que precisar enquanto tiver capacidade. @@ -765,7 +794,6 @@ block.blast-drill.description = A melhor mineradora. Requer muita energia. block.water-extractor.description = Extrai agua do chão. Use quando não tive nenhum lago proximo block.cultivator.description = Cultiva o solo com agua para pegar bio materia. block.oil-extractor.description = Usa altas quantidades de energia Para extrair oleo da areia. Use quando não tiver fontes de oleo por perto -block.dart-ship-pad.description = Deixe sua atual embarcação e mude para uma aeronave lutadora basica.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. block.trident-ship-pad.description = Deixe sua atual embarcação e mude para um bombardeiro resionavelmente bem armadurado.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. block.javelin-ship-pad.description = Deixe sua atual embarcação e mude para um interceptador forte e rapido com armas de raio.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. block.glaive-ship-pad.description = Deixe sua atual embarcação e mude para grande, bem armadurada nave de combate.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. @@ -781,7 +809,6 @@ block.titan-factory.description = Produz unidades avancadas, armaduradas e terre block.fortress-factory.description = Produz unidades terrestres pesadas de artilharia. block.revenant-factory.description = Produz unidades laser, pesadas e terrestres. block.repair-point.description = Continuamente repara a unidade danificada mais proxima. -block.command-center.description = Permite mudar o comportamento IA dos aliados. Atualmente, atacar, recuar e patrulha são suportados. block.conduit.description = Bloco de transporte de liquido basico. Funciona como a esteira, Mas com liquidos. Melhor usado com extratores, Bombas ou condutos. block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rapido E armazena mais que os condutos padrões. block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa energia para teleportar liquidos conduto de fase sobre uma distancia severa. @@ -795,13 +822,11 @@ block.thermal-pump.description = A melhor bomba. Trez vezes mais rapida que a bo block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais da fonte para multiplos alvos. block.distributor.description = Um roteador avancada que espalhas os itens em 7 outras direções igualmente. block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. -block.alpha-mech-pad.description = Quando dado energia o suficiente, Reconstrua sua nave em [accent] Alpha[] mech. block.item-source.description = Infinivamente da itens. Apenas caixa de areia. block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. block.power-source.description = Infinitivamente da energia. Apenas caixa de areia. block.power-void.description = Destroi qualquer energia que entre dentro. Apenas caixa de areia. liquid.water.description = Comumente usado em resfriamento e no processo de perda. -liquid.lava.description = Pode ser transformado em[LIGHT_GRAY] pedra[], usado para gerar energia ou usado como munição para certas torres. liquid.oil.description = Pode ser queimado, explodido ou usado como resfriador. liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index c330164986..c81158f62d 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1,6 +1,6 @@ -credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недоработки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[GREEN]xga\n[BLACK]XZimur\n[BLUE]Beryllium +credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в офф. discord-сервер Mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[BLACK]XZimur\n[BLUE]Beryllium credits = Авторы -contributors = Переводчики и контрибьюторы +contributors = Переводчики и Помощники discord = Присоединяйтесь к нашему Discord! link.discord.description = Официальный discord-сервер Mindustry link.github.description = Исходный код игры @@ -10,36 +10,37 @@ link.itch.io.description = itch.io страница с загрузкой ПК link.google-play.description = Скачать для Android c Google play link.wiki.description = Официальная вики Mindustry(англ.) linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. -screenshot = Screenshot saved to {0} +screenshot = Cкриншот сохранён в {0} gameover = Игра окончена gameover.pvp = [accent] {0}[] команда победила! highscore = [YELLOW]Новый рекорд! -stat.wave = Waves Defeated:[accent] {0} -stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} -stat.built = Buildings Built:[accent] {0} -stat.destroyed = Buildings Destroyed:[accent] {0} -stat.deconstructed = Buildings Deconstructed:[accent] {0} -stat.delivered = Resources Launched: +stat.wave = Волн отражено:[accent] {0} +stat.enemiesDestroyed = Врагов уничтожено:[accent] {0} +stat.built = Строений построено:[accent] {0} +stat.destroyed = Строений уничтожено:[accent] {0} +stat.deconstructed = Строений деконструировано:[accent] {0} +stat.delivered = Ресурсов добыто: +stat.rank = Финальный Счёт: [accent]{0} map.delete = Вы действительно хотите удалить карту "[accent]{0}[]"? level.highscore = Рекорд: [accent]{0} level.select = Выбор карты level.mode = Режим игры: construction.desktop = Чтобы отменить выбор блока или остановить строительство, [accent] используйте пробел[]. construction.title = Руководство по размещению блоков -construction = Вы только что перешли в режим размещения[accent]блоков[].\n\nЧтобы начать размещение, просто коснитесь подходящего места рядом с вашим мехом.\nПосле того, как вы поставили несколько блоков, нажмите на галочку, чтобы подтвердить, и ваш мех начнет их строительство.\n\n- [accent]Удалите блоки [] из вашего плана строительства, нажав на них.n- [accent]Нажав Shift [] и, удерживая, перетащите любой выбранный блок.\n- [accent]Поместите блоки в линию [], нажимая и удерживая на пустое место, а затем перетаскивая в любом направлении.\n- [accent]Отмените размещение блоков [], нажав X в нижнем правом углу. +construction = Вы только что перешли в режим размещения[accent]блоков[].\n\nЧтобы начать размещение, просто коснитесь подходящего места рядом с вашим мехом.\nПосле того, как вы поставили несколько блоков, нажмите на галочку, чтобы подтвердить, и ваш мех начнет их строительство.\n\n- [accent]Удалите блоки [] из вашего плана строительства, нажав на них.n- [accent]Нажав Shift [] и, удерживая, перетащите любой выбранный блок.\n- [accent]Поместите блоки в линию [], нажимая и удерживая на пустое место, а затем перетаскивая в любом направлении.\n- [accent]Отмените размещение блоков [], нажав X в нижнем правом углу. deconstruction.title = Руководство по разрушению блоков -deconstruction = Вы только что перешли в режим сноса[accent] блоков.[].\n\nЧтобы начать удалять, просто нажмите на блок рядом с вашим мехом.\nПосле того как вы выбрали несколько блоков, нажмите на галочку, чтобы подтвердить, и ваш мех начнёт их сносить.\n\n- [accent]Уберите блоки [] из вашего выбора, нажав на них.\n- [accent]Удалите блоки в области [], нажав и удерживая на пустом месте, а затем перетаскивая в нужном направлении.\n- [accent]Отменить снос или выбор [] можно нажав X в нижнем правом углу. +deconstruction = Вы только что перешли в режим сноса[accent] блоков.[].\n\nЧтобы начать удалять, просто нажмите на блок рядом с вашим мехом.\nПосле того как вы выбрали несколько блоков, нажмите на галочку, чтобы подтвердить, и ваш мех начнёт их сносить.\n\n- [accent]Уберите блоки [] из вашего выбора, нажав на них.\n- [accent]Удалите блоки в области [], нажав и удерживая на пустом месте, а затем перетаскивая в нужном направлении.\n- [accent]Отменить снос или выбор [] можно нажав X в нижнем правом углу. showagain = Не показывать снова до следующей сессии coreattack = < Ядро находится под атакой! > -nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent -outofbounds = [[ OUT OF BOUNDS ]\n[]self-destruct in {0} -database = Core Database +nearpoint = [[ [scarlet]ПОКИНЬТЕ ЗОНУ НЕМЕДЛЕННО[] ]\nаннигиляция неизбежна. +outofbounds = [[ ЗА ГРАНИЦАМИ ]\n[]самоуничтожение через{0} +database = База Данных Ядра savegame = Сохранить игру loadgame = Загрузить игру -joingame = Присоеди\nниться +joingame = Сетевая игра addplayers = Доб/удалить игроков customgame = Пользовательская игра -newgame = New Game +newgame = Новая игра none = <нет> close = Закрыть quit = Выход @@ -48,14 +49,14 @@ continue = Продолжить maps.none = [LIGHT_GRAY]Карты не найдены! about.button = Об игре name = Ник: -noname = Pick a[accent] player name[] first. +noname = Для начала, придумайте[accent] себе никнейм[]. filename = Имя файла: -unlocked = Новый блок разблокирован! -completed = [accent]Completed -techtree = Tech Tree -research.list = [LIGHT_GRAY]Research: -research = Research -researched = [LIGHT_GRAY]{0} researched. +unlocked = Новый контент разблокирован! +completed = [accent]Завершено +techtree = Технологическое Дерево +research.list = [LIGHT_GRAY]Исследование: +research = Исследование +researched = [LIGHT_GRAY]{0} исследовано. players = Игроков на сервере: {0} players.single = {0} игрок на сервере server.closing = [accent]Закрытие сервера... @@ -69,7 +70,7 @@ server.kicked.nameInUse = На этом сервере есть кто-то с server.kicked.nameEmpty = Ваше имя должно содержать хотя бы один символ или цифру. server.kicked.idInUse = Вы уже на этом сервере! Соединение с двумя учетными записями не разрешено. server.kicked.customClient = Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию. -server.kicked.gameover = Game over! +server.kicked.gameover = Игра окончена! host.info = Кнопка [accent] Сервер [] размещает сервер на порт [accent]6567[].[]\nЛюбой пользователь в той же [LIGHT_GRAY]сети [] получет возможность видеть ваш сервер в своём списке серверов.\n\nЕсли вы хотите, чтобы люди могли подключаться из любого места по IP, то требуется переадресация(проброс) портов.[].\n\n[LIGHT_GRAY] Примечание. Если у кого-то возникают проблемы с подключением к вашей локальной сети, убедитесь, что вы разрешили Mindustry доступ к вашей локальной сети в настройках брандмауэра. join.info = Здесь вы можете ввести IP-адрес [accent]сервера[] для подключения или открыть [accent]локальную сеть [] для подключения к другим серверам.\nПоддерживается многопользовательский режим LAN и WAN.\n\n[LIGHT_GRAY] Примечание: это не является автоматическим глобальным списком серверов; если вы хотите подключиться к кому-то по IP, вам нужно будет спросить у хоста его IP-адрес. hostserver = Запустить сервер @@ -149,7 +150,7 @@ save.wave = Волна: {0} save.difficulty = Сложность: {0} save.date = Последнее сохранение: {0} save.playtime = Время в игре: {0} -warning = Warning. +warning = Предупреждение confirm = Подтверждение delete = Удалить ok = ОК @@ -185,7 +186,6 @@ map.nospawn = Эта карта не имеет ядер, в которых иг map.nospawn.pvp = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте[SCARLET] красные[] ядра к этой карте в редакторе. map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты. editor.brush = Кисть -editor.slope = \\ editor.openin = Открыть в редакторе editor.oregen = Генерация Руд editor.oregen.info = Генерация Руд: @@ -240,38 +240,47 @@ tutorial = Обучение editor = Редактор mapeditor = Редактор карт donate = Пожертво\nвать -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Complete: -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. +abandon = Покинуть +abandon.text = Эта зона и все ресурсы будут потеряны. +locked = Заблокировано +complete = [LIGHT_GRAY]Завершено: +resume = Возобновить зону:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Наилучшая волна: {0} +launch = < ЗАПУСК > +launch.title = Запуск успешен +launch.next = [LIGHT_GRAY]следующая возможность на волне {0} +launch.unable = [scarlet]ЗАПУСК невозможен.[] {0} Враг. +launch.confirm = Это удалит все ресурсы в Вашем ядре.\nВы не сможете вернуться на эту базу. +uncover = Раскрыть +configure = Выгрузить конфигурацию +configure.locked = [LIGHT_GRAY]Разблокировать настройки выгрузки:\nВолна {0}. +zone.unlocked = [LIGHT_GRAY]{0} разблокировано. +zone.complete = {0} волн достигнуто:\nНовые требования зоны выполнены. +zone.config.complete = {0} волн достигнуто:\nВыгружаемая конфигурация разблокирована +zone.resources = Обнаруженные ресурсы: +add = Добавить... +boss.health = Здоровье босса connectfail = [crimson]Не удалось подключиться к серверу: [accent] {0} error.unreachable = Сервер недоступен. error.invalidaddress = Некорректный адрес. error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! -error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry! +error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у создателя сервера установлена последняя версия Mindustry! error.alreadyconnected = Вы уже подключены. -error.mapnotfound = Не найден файл карты! -error.io = Network I/O error. +error.mapnotfound = Файл карты не найден! +error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. -zone.groundZero.name = Ground Zero -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores -zone.crags.name = Crags -zone.stainedMountains.name = Stained Mountains -zone.impact0079.name = Impact 0079 -zone.desolateRift.name = Desolate Rift -zone.arcticDesert.name = Arctic Desert -zone.dryWastes.name = Dry Wastes -zone.nuclearComplex.name = Nuclear Production Complex -zone.moltenFault.name = Molten Fault +zone.groundZero.name = Нулевая земля +zone.craters.name = Кратеры +zone.frozenForest.name = Ледяной Лес +zone.ruinousShores.name = Разрушенные Берега +zone.crags.name = Утёсы +zone.stainedMountains.name = Окрашенные горы +zone.impact0079.name = Удар 0079 +zone.desolateRift.name = Пустынный Разлом +zone.arcticDesert.name = Арктическия Пустыня +zone.dryWastes.name = Грязные Отходы +zone.nuclearComplex.name = Ядерный Производственный Комплекс +zone.moltenFault.name = Расплавленый Разлом settings.language = Язык settings.reset = Сбросить по умолчанию settings.rebind = Смена @@ -290,12 +299,15 @@ no = Нет info.title = Информация error.title = [crimson]Произошла ошибка error.crashtitle = Произошла ошибка +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Информация о блоке +blocks.powerbalance = Энергия: {0} +blocks.poweroutput = Выходная энергия: {0} blocks.powercapacity = Вместимость энергии blocks.powershot = Энергия/выстрел -blocks.targetsair = Атакует воздуш. юнитов? -blocks.itemspeed = Скорость перемещения ресурсов +blocks.targetsair = Атакует воздуш. юнитов +blocks.itemsmoved = Скорость перемещения blocks.shootrange = Радиус действия blocks.size = Размер blocks.liquidcapacity = Вместимость жидкости @@ -316,19 +328,23 @@ blocks.inputitems = Входящие предметы blocks.outputitem = Выходящий предмет blocks.drilltier = Добывает blocks.drillspeed = Базовая скорость сверления +blocks.maxunits = Max Active Units blocks.liquidoutput = Выходящая жидкость blocks.liquidoutputspeed = Выходная скорость жидкости blocks.liquiduse = Используется жидкости blocks.coolant = Охлаждающая жидкость -blocks.liquid = Liquid +blocks.liquid = Жидкость blocks.coolantuse = Охлажд. жидкости используется blocks.inputliquidfuel = Жидкое топливо blocks.liquidfueluse = Жидкого топлива используется blocks.boostitem = Ускоряющий предмет blocks.boostliquid = Ускоряющая жидкость blocks.health = Здоровье -blocks.power = Power -blocks.power.satisfaction = Power Satisfaction +blocks.heat = Heat +blocks.power = Энергия +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} +blocks.power.satisfaction = Энергии хватает blocks.inaccuracy = Разброс blocks.shots = Выстрелы blocks.reload = Выстрелы/секунду @@ -336,11 +352,11 @@ blocks.inputfuel = Входящее топливо blocks.fuelburntime = Время горения топлива blocks.inputcapacity = Макс. вместимость входящих предметов blocks.outputcapacity = Макс. вместимость выходящих предметов +blocks.ammo = Боеприпасы unit.blocks = блоки unit.powersecond = единиц энергии/секунду unit.liquidsecond = жидкостных единиц/секунду unit.itemssecond = предметов/секунду -unit.pixelssecond = пикселей/секунду unit.liquidunits = жидкостных единиц unit.powerunits = энерг. единиц unit.degrees = град. @@ -351,9 +367,9 @@ category.power = Энергия category.liquids = Жидкости category.items = Предметы category.crafting = Создание -category.shooting = Стрельба +category.shooting = Cтрельба category.optional = Дополнительные улучшения -setting.indicators.name = Ally Indicators +setting.indicators.name = Показывать в сторону союзников setting.autotarget.name = Авто-цель setting.fpscap.name = Макс. FPS setting.fpscap.none = Неограниченный @@ -382,20 +398,20 @@ setting.crashreport.name = Отправлять анонимные отчёты keybind.title = Настройка управления category.general.name = Основное category.view.name = Просмотр -category.multiplayer.name = Мультиплеер +category.multiplayer.name = Сетевая игра command.attack = Атаковать command.retreat = Отступить command.patrol = Патрулирование -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +keybind.gridMode.name = Выбрать блок +keybind.gridModeShift.name = Выбрать категорию keybind.press = Нажмите клавишу... keybind.press.axis = Нажмите клавишу... -keybind.screenshot.name = Map Screenshot +keybind.screenshot.name = Скриншот карты keybind.move_x.name = Движение по оси x keybind.move_y.name = Движение по оси y keybind.select.name = Выбор/Выстрел -keybind.pick.name = Pick Block -keybind.break.name = Разрушение +keybind.pick.name = Выбрать блок +keybind.break_block.name = Разрушить блок keybind.deselect.name = Отмена keybind.shoot.name = Выстрел keybind.zoom_hold.name = Управление масштабом @@ -414,20 +430,20 @@ keybind.chat_scroll.name = Прокрутка чата keybind.drop_unit.name = Сбросить юнита keybind.zoom_minimap.name = Увеличить миникарту. mode.help.title = Описание режимов -mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +mode.survival.name = Выживание +mode.survival.description = Обычный режим. В этом режиме надо самим добывать ресурсы и сами волны идут безостановочно. mode.sandbox.name = Песочница mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. -mode.freebuild.name = Свободная\nстройка +mode.freebuild.name = Cвободная\nстройка mode.freebuild.description = Ограниченные ресурсы и нет таймера для волн. mode.pvp.name = Противо-\nстояние mode.pvp.description = боритесь против других игроков. -mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.name = Атака +mode.attack.description = Нет волн, цель - уничтожить базу противника. content.item.name = Предметы content.liquid.name = Жидкости content.unit.name = Боевые единицы -content.block.name = Blocks +content.block.name = Блоки content.mech.name = Мехи item.copper.name = Медь item.copper.description = Полезный строительный материал. Широко используется во всех типах блоков. @@ -435,7 +451,7 @@ item.lead.name = Свинец item.lead.description = Основной начальный материал. Широко используется в электронике и транспортировке жидкости. item.coal.name = Уголь item.coal.description = Распространённое и легкодоступное топливо. -item.graphite.name = Graphite +item.graphite.name = Графит item.titanium.name = Титан item.titanium.description = Редкий сверхлёгкий металл широко используется в производстве: транспорта, буров и самолётов. item.thorium.name = Торий @@ -446,26 +462,26 @@ item.plastanium.name = Пластиний item.plastanium.description = Легкий, пластичный материал, используемый в современных самолетах и боеприпасах для фрагментации. item.phase-fabric.name = Фазовая ткань item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. Не для вышивания. -item.surge-alloy.name = Высокопрочный сплав +item.surge-alloy.name = Кинетический сплав item.surge-alloy.description = Передовой сплав с уникальными электрическими свойствами. -item.biomatter.name = Биоматерия -item.biomatter.description = Скопление органической кашки; используется для переработки в нефть или в качестве топлива. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Песок item.sand.description = Обычный материал, который широко используется при плавке как в сплаве, так и в виде шлака. item.blast-compound.name = Взрывоопасное соединение item.blast-compound.description = Летучее соединение, используемое в бомбах и взрывчатых веществах. Также может гореть в качестве топлива, но не рекомендуется этого делать. item.pyratite.name = Пиротит item.pyratite.description = Очень огнеопасное вещество, используемое в зажигательном оружии. -item.metaglass.name = Metaglass -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.scrap.name = Scrap -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.metaglass.name = Биостекло +item.metaglass.description = Сверхпрочная смесь стекла. Широко используется для распределения и хранения жидкости. +item.scrap.name = Металлолом +item.scrap.description = Остатки старых сооружений и подразделений. Содержит незначительные количества многих различных металлов. liquid.water.name = Вода -liquid.lava.name = Лава +liquid.slag.name = Шлак liquid.oil.name = Нефть liquid.cryofluid.name = Криогенная жидкость mech.alpha-mech.name = Альфа -mech.alpha-mech.weapon = Обычный пулемёт +mech.alpha-mech.weapon = Тяжёлый пулемёт mech.alpha-mech.ability = Призыв дронов mech.alpha-mech.description = Стандартный мех для настольных устройств. Имеет приличную скорость и урон; может создать до 3-х дронов для увеличения возможности победы. mech.delta-mech.name = Дельта @@ -477,8 +493,8 @@ 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.weapon = Ракетомётная пулемёт +mech.omega-mech.ability = Поглощение урона mech.omega-mech.description = Громоздкий и хорошо бронированный мех, сделанный для фронтовых нападений. Его способность брони может блокировать до 90% входящего урона. mech.dart-ship.name = Дротик mech.dart-ship.weapon = Ретранслятор @@ -489,7 +505,7 @@ mech.javelin-ship.weapon = Взрывные ракеты mech.javelin-ship.ability = Дуговой генератор mech.trident-ship.name = Трезубец mech.trident-ship.description = Тяжелый бомбардировщик. Довольно хорошо бронирован. -mech.trident-ship.weapon = Грузовой отсек с бомбами +mech.trident-ship.weapon = Бомбы mech.glaive-ship.name = Копьё mech.glaive-ship.description = Большой, хорошо бронированный боевой корабль. Оснащён зажигательным ретранслятором. Хорошее ускорение и максимальная скорость. mech.glaive-ship.weapon = Огненный пулемёт @@ -507,35 +523,60 @@ mech.ability = [LIGHT_GRAY]Способность: {0} liquid.heatcapacity = [LIGHT_GRAY]Теплоёмкость: {0} liquid.viscosity = [LIGHT_GRAY]Вязкость: {0} liquid.temperature = [LIGHT_GRAY]Температура: {0} -block.kiln.name = Kiln -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press -block.constructing = {0}[LIGHT_GRAY](В процессе) +block.scrap-wall.name = Стена из металлолома +block.scrap-wall-large.name = Великая стена из металлолома +block.scrap-wall-huge.name = Огромная стена из металлолома +block.scrap-wall-gigantic.name = Гигантская стена из металлолома +block.thruster.name = Толкатель +block.kiln.name = Печь +block.kiln.description = Выплавляет песок и свинец в биостекло. Требует малого количества энергии. +block.graphite-press.name = Графитный пресс +block.multi-press.name = Мульти-пресс +block.constructing = {0}\n[LIGHT_GRAY](Строится) block.spawn.name = Точка появления врагов -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Foundation -block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Металлическая плита +block.core-shard.name = Ядро: Осколок +block.core-foundation.name = Ядро: Штаб +block.core-nucleus.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.sand.name = Тёмный песок block.ice.name = Лёд block.snow.name = Снег -block.grass.name = Трава -block.shrub.name = Куст -block.rock.name = Булыжник -block.blackrock.name = Чёрный булыжник -block.icerock.name = Ледяной булыжник +block.craters.name = Кратеры +block.sand-water.name = Песок с водой +block.char.name = Выжженная Земля +block.holostone.name = Голографический камень +block.ice-snow.name = Ледяной Снег +block.rocks.name = Камни +block.icerocks.name = Ледяные камни +block.snowrocks.name = Снежные камни +block.dunerocks.name = Песчаные Камни +block.pine.name = Сосна +block.white-tree-dead.name = Мёртвое Белое Дерево +block.white-tree.name = Белое Дерево +block.spore-cluster.name = Скопление спор +block.stained-rocks.name = Пятнистые Камни +block.stained-stone.name = Пятнистый Камень +block.stained-rocks-red.name = Красные Пятнистые Камни +block.stained-stone-red.name = Красный Пятнистый Камень +block.stained-rocks-yellow.name = Жёлтые Пятнистые Камни +block.stained-stone-yellow.name = Жёлтый Пятнистый Камень +block.stained-boulder.name = Пятнистый Валун +block.metal-floor.name = Металлический Пол +block.metal-floor-2.name = Металлический Пол 2 +block.metal-floor-3.name = Металлический Пол 3 +block.metal-floor-5.name = Металлический Пол 5 +block.metal-floor-damaged.name = Повреждённый Металлический Пол +block.ignarock.name = Магматические горные породы +block.hotrock.name = Горячий камень +block.magmarock.name = Магма камень +block.cliffs.name = Скалы block.copper-wall.name = Медная стена block.copper-wall-large.name = Большая медная стена -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall +block.titanium-wall.name = Титановая стена +block.titanium-wall-large.name = Большая титановая стена block.phase-wall.name = Фазовая стена block.phase-wall-large.name = Большая фазовая стена block.thorium-wall.name = Ториевая стена @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Большая ториевая стена block.door.name = Дверь block.door-large.name = Большая дверь block.duo.name = Двойная турель -block.scorch.name = Обжигатель block.hail.name = Град block.lancer.name = Копейщик block.conveyor.name = Конвейер @@ -555,33 +595,30 @@ block.sorter.name = Сортировщик block.sorter.description = Сортирует предметы. Если предмет соответствует выбранному, то он проходит насквозь(прямо). В противном случае предмет выводится слева или справа. block.overflow-gate.name = Избыточный затвор block.overflow-gate.description = Комбинированный разветвитель и маршрутизатор, который выводит только слева и справа, если передний путь заблокирован. -block.smelter.name = Плавильный завод -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.spore-press.name = Spore Press block.separator.name = Отделитель -block.centrifuge.name = Центрифуга block.power-node.name = Силовой узел block.power-node-large.name = Большой силовой узел -block.surge-tower.name = Surge Tower +block.surge-tower.name = Кинетическая башня block.battery.name = Аккумулятор block.battery-large.name = Большой аккумулятор block.combustion-generator.name = Генератор внутреннего сгорания block.turbine-generator.name = Турбинный генератор -block.differential-generator.name = Differential Generator -block.impact-reactor.name = Impact Reactor +block.differential-generator.name = Дифференциальный генератор +block.impact-reactor.name = Импульсный реактор block.mechanical-drill.name = Механический бур block.pneumatic-drill.name = Пневматический бур block.laser-drill.name = Лазерный бур block.water-extractor.name = Экстрактор воды block.cultivator.name = Культиватор -block.alpha-dart-mech-pad.name = Alpha-Dart Mech Pad -block.delta-mech-pad.name = Реконструктор мехов "Дельта" +block.alpha-dart-mech-pad.name = Реконструктор мехов "Альфа-Дротик" +block.delta-mech-pad.name = Delta Mech Pad block.javelin-ship-pad.name = Реконструктор кораблей "Джавелин" block.trident-ship-pad.name = Реконструктор кораблей "Трезубeц" block.glaive-ship-pad.name = Реконструктор кораблей "Копьё" @@ -605,7 +642,6 @@ 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 = Нефтяной экстрактор @@ -613,7 +649,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 = Завод бомбардировщиков "Потусторонний убийца" @@ -626,15 +662,14 @@ 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.alloy-smelter.name = Плавильня кинетического сплава block.mend-projector.name = Ремонтирующий гранатомёт -block.surge-wall.name = Стена из высокопрочного сплава -block.surge-wall-large.name = Большая стена из высокопрочного сплава +block.surge-wall.name = Стена из кинетического сплава +block.surge-wall-large.name = Большая стена из кинетического сплава block.cyclone.name = Циклон block.fuse.name = Взрыватель block.shock-mine.name = Шоковая мина @@ -645,35 +680,35 @@ block.rtg-generator.name = Радиоизотопный термоэлектри block.spectre.name = Призрак block.meltdown.name = Катастрофа block.container.name = Склад -block.launch-pad.name = Launch Pad +block.launch-pad.name = Стартовая площадка +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = Начальный дрон. По умолчанию появляется из ядра. Автоматически добывает руды, собирает предметы, ремонтирует блоки. unit.phantom.name = Фантомный дрон unit.phantom.description = Продвинутый дрон. Автоматически добывает руды, собирает предметы, ремонтирует блоки. Значительнее эффективней нежели обычный дрон -unit.dagger.name = Разведчик +unit.dagger.name = Кинджал unit.dagger.description = Основная наземная боевая единица. Может быть полезен в группах. unit.crawler.name = Crawler unit.titan.name = Титан 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.eruptor.name = Eruptor -unit.chaos-array.name = Chaos Array -unit.eradicator.name = Eradicator -unit.lich.name = Lich -unit.reaper.name = Reaper +unit.eruptor.name = Извергатель +unit.chaos-array.name = Массив хаос +unit.eradicator.name = Искоренитель +unit.lich.name = Лич +unit.reaper.name = Жнец tutorial.begin = Ваша миссия здесь состоит в том, чтобы уничтожить[LIGHT_GRAY] вашего врага[].\n\nНачните с[accent] добычи меди[]. Чтобы добыть её, коснитесь месторождения медной руды рядом с вашим ядром. tutorial.drill = Ручная работа не очень эффективна.\n[accent]Буры[] могут копать автоматически.\nПоставьте один на медной жиле. tutorial.conveyor = [accent]Конвейеры[] используются для транспортировки предметов. \nСоздайте конвейеры от бура к ядру. @@ -691,14 +726,12 @@ tutorial.generatordrill = Генератор внутреннего сгоран tutorial.node = Энергия требует транспортировки.\nСоздайте [accent] силовой узел[] рядом с генератором внутреннего сгорания для передачи энергии. tutorial.nodelink = Энергия может быть передана посредством соприкосновения блоков питания и генераторов или связанных силовых узлов.\n\nСоедините их, нажав на силовой узел и выбрав генератор, а затем кремниевый завод. tutorial.silicon = Производство кремния началось. Получите немного.\nРекомендуется улучшить эту систему. -tutorial.daggerfactory = Постройте[accent] завод по производству "разведчиков".[]\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 Хороша в начале игры. -block.dense-alloy-wall.description = Стена с показателем прочности "ниже среднего". -block.dense-alloy-wall-large.description = Большая стена с показателем прочности "ниже среднего". block.thorium-wall.description = Стена с показателем прочности "выше среднего". block.thorium-wall-large.description = Большая стена с показателем прочности "выше среднего". block.phase-wall.description = Стена с средним показателем прочности . @@ -714,13 +747,13 @@ block.shock-mine.description = Поставьте её на землю. Она block.duo.description = Маленькая и дешёвая турель. block.arc.description = Турель с малым радиусом атаки. В качестве патронов требует воду или криогенную жидкость. Также нужна энергия. block.hail.description = Дальнобойная начальная турель.\nИспользует в качестве снарядов плотный сплав, кремний и пиротит.\nДля ускорения стрельбы можно подвести воду и криогенную жидкость. -block.lancer.description = Турель, которая стреляет лазером на среднее расстояние.\nИспользует в качестве снарядов энергию.\nДля ускорения стрельбы можно подвести воду, нефть и криогенную жидкость. +block.lancer.description = Турель, которая стреляет лазером на среднее расстояние.\nИспользует в качестве снарядов энергию.\nДля ускорения стрельбы можно подвести воду или криогенную жидкость. block.wave.description = Турель с средним радиусом атаки, которая отталкивает противников в стороны. Использует в качестве снарядов воду, нефть, лаву или криогенную жидкость. -block.salvo.description = Турель с средним радиусом атаки. Использует в качестве снарядов медь, плотный сплав, торий, кремний и пиротит.\nТакже нужна какая-то жидкость:вода, нефть или криогенная. -block.swarmer.description = Турель с большим радиусом атаки. Использует в качестве снарядов высокопрочный сплав, пиротит и взрывоопасное соединение.\n Также нужна какая-то жидкость: вода, нефть или криогенная. -block.ripple.description = Первая турель 3х3.\nИспользует в качестве снарядов плотный сплав, кремний, взрывоопасное соединение и пиротит. \nТакже нужна какая-то жидкость: вода, нефть или криогенная. -block.cyclone.description = Турель с большой дальностью атаки. Использует в качестве снарядов пластиний, взрывоопасное соединение и высокопрочный сплав.\nТакже нужна какая-то жидкость:вода, нефть или криогенная. -block.fuse.description = Турель с малой дальностью атаки. Использует в качестве снарядов плотный сплав. \nТакже нужна какая-то жидкость: вода, нефть или криогенная. +block.salvo.description = Турель с средним радиусом атаки. Использует в качестве снарядов медь, плотный сплав, торий, кремний и пиротит.\nТакже нужна какая-то жидкость: вода или криогенная. +block.swarmer.description = Турель с большим радиусом атаки. Использует в качестве снарядов кинетический сплав, пиротит и взрывоопасное соединение.\n Также нужна какая-то жидкость: вода или криогенная. +block.ripple.description = Первая турель 3х3.\nИспользует в качестве снарядов плотный сплав, кремний, взрывоопасное соединение и пиротит. \nТакже нужна какая-то жидкость: вода или криогенная. +block.cyclone.description = Турель с большой дальностью атаки. Использует в качестве снарядов пластиний, взрывоопасное соединение и кинетический сплав.\nТакже нужна какая-то жидкость:вода или криогенная. +block.fuse.description = Турель с малой дальностью атаки. Использует в качестве снарядов плотный сплав. \nТакже нужна какая-то жидкость: вода или криогенная. block.spectre.description = Первая турель 4х4 с средним радиусом атаки. Использует в качестве снарядов плотный сплав, торий или пиротит. block.meltdown.description = Турель с средним радиусом атаки. Для патронов требует воду или криогенную жидкость. Также нужна энергия. block.conveyor.description = Перемещает ресурсы с маленькой скоростью. @@ -728,44 +761,39 @@ block.titanium-conveyor.description = Конвейер второго покол block.phase-conveyor.description = Пока игра находится в 2D, этот конвейер уже в четырёхмерном пространстве(возможно, это ложь).\nТребует энергии и подключается как мостовой конвейер. block.junction.description = Название говорит само за себя. С помощью него можно сделать две конвейерные ленты, которые проходят через друг друга и не смешиваются. block.mass-driver.description = При наличии энергии передают ресурсы на расстояние 100 блоков, стреляя в друг-друга. -block.smelter.description = Производит плотный сплав из меди и свинца. Можно подвести песок для ускорения производства. -block.arc-smelter.description = Улучшенная версия плавильного завода. Требует энергию. Производит плотный сплав из угля, меди и свинца. \nМожно подвести песок для ускорения производства. block.silicon-smelter.description = С помощью песка, угля и энергии производит кремний. block.plastanium-compressor.description = Создаёт пластиний из титана и нефти. Требует энергии. Для ускорения производства можно добавить в компрессор песок. -block.phase-weaver.description = Производит фазовую материю с тория и песка. Требует большего количества энергии. -block.alloy-smelter.description = Создаёт высокопрочный сплав из титана, кремния, меди и свинца. Требует энергию. -block.pulverizer.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.melter.description = Расплавляет металлолом в шлак для дальнейшей обработки или использования в турелях. block.incinerator.description = Если есть ненужные ресурсы, можно просто их сжечь.\n Требует энергии. -block.biomattercompressor.description = Производит нефть из биоматерии, биомусора и энергии. -block.separator.description = Ищет в камне различные ресурсы. Чем ценней ресурс, тем с меньшей вероятностью он "найдётся". -block.centrifuge.description = Улучшенная версия отделителя.\nИщет в камне различные ресурсы. Чем ценней ресурс, тем с меньшей вероятностью он "найдётся".\nТребует энергию. +block.spore-press.description = Compresses spore pods into oil. +block.separator.description = Извлекает полезные минералы из шлака. block.power-node.description = Максимум допустимо 4 подключения.\n Чтобы соединить с каким-то блоком нужно следующее:\n1. Чтобы он находился в радиусе действия\n2.Нажать на нужный силовой узел, а затем на другой силовой узел или блок. block.power-node-large.description = Силовой узел второго поколения. Увеличен радиус действия и количество максимально допустимых подключений. -block.battery.description = Позволяет хранить энергию, но БАТАРЕЙКИ DURACELL ХРАНЯТ БОЛЬШЕ!(скрытая реклама) -block.battery-large.description = Улучшенная версия малого аккумулятора. Наконец-то, хранит больше энергии чем какие-то там батарейки... +block.battery.description = Позволяет хранить энергию. +block.battery-large.description = Улучшенная версия обычного аккумулятора. block.combustion-generator.description = Начальный и дешёвый источник энергии. Для производства энергии использует нефть, уголь, пиротит, биоматерию и взрывоопасное соединение. block.turbine-generator.description = Для производства энергии использует нефть, уголь, пиротит, биоматерию или взрывоопасное соединение.\nТакже обязательно нужна вода. -block.thermal-generator.description = [accent]Горячее воспринимает на ура. []\n Производит энергию из лавы. +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 = Хранит небольшое количество предметов(200). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. -block.vault.description = Хранит большое количество предметов(900). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.container.description = Хранит небольшое количество предметов. Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.vault.description = Хранит большое количество предметов. Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[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.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Подробности про Копьё в "разблокированное". @@ -778,10 +806,9 @@ 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.fortress-factory.description = Производит тяжёлые артиллерийские боевые единицы. +block.revenant-factory.description = Производит тяжёлые летающие боевые единицы. block.repair-point.description = Может ремонтировать вас и ваши боевые единицы -block.command-center.description = Позволяет изменять дружественное поведение ИИ. В настоящее время поддерживаются команды атаки, отступления и патрулирования. block.conduit.description = Основной блок транспортировки жидкости. Работает как конвейер, но с жидкостями. Лучше всего использовать экстракторы, насосы или т.п.. block.pulse-conduit.description = Улучшенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные. block.phase-conduit.description = Улучшенный блок транспортировки жидкости. Использует энергию для передачи жидкостей на подключенный фазовый канал на несколько плиток. @@ -795,13 +822,11 @@ block.thermal-pump.description = Конечный насос. В три раза block.router.description = Принимает предметы из одного направления и равномерно выводит их до трёх других направлений. Полезно для разделения материалов из одного источника на несколько целей. block.distributor.description = Передовой маршрутизатор, который равномерно разбивает элементы до 7 других направлений. block.bridge-conveyor.description = Улучшенный транспортный блок элементов. Позволяет транспортировать предметы до 3-х блоков над любым ландшафтом или зданием. -block.alpha-mech-pad.description = Превращает вас в мех [accent] Альфа[]. Требует энергию. -block.item-source.description = Бесконечно выводит предметы. Работает только в песочнице. -block.liquid-source.description = Бесконечно выводит жидкости. Работает только в песочнице. -block.item-void.description = Уничтожает любые предметы, которые входят в него, без использования энергии. Работает только в режиме песочницы. -block.power-source.description = Бесконечность — не предел. Бесконечно выводит энергию. Доступен только в режиме песочницы. -block.power-void.description = Энергия просто уходит в пустоту. Присутствует только в песочнице. -liquid.water.description = Намного лучше чем [BLUE]монооксид дигидрогена[].\n\n Для получения воды используйте помпу(насос) на источнике(блоке) или экстрактор воды.\n\n Эту жидкость можно подвести к бурам для ускорения скорости добычи или к турелям для ускорения стрельбы. -liquid.lava.description = [accent]Горячо...\nВещество расплавленное из горно-каменных пород. -liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления. -liquid.cryofluid.description = Жидкость с температурой ниже чем -273 градусов по цельсию. Может быть использована для ускорения стрельбы турелей или для охлаждения чего-то. +block.item-source.description = Infinitely outputs items. Sandbox only. +block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.item-void.description = Destroys any items which go into it without using power. Sandbox only. +block.power-source.description = Infinitely outputs power. Sandbox only. +block.power-void.description = Voids all power inputted into it. Sandbox only. +liquid.water.description = Эту жидкость можно подвести к бурам для ускорения скорости добычи или к турелям для ускорения стрельбы. +liquid.oil.description = Может гореть, взрывоопасна и используется для охлаждения. +liquid.cryofluid.description = Может быть использована для ускорения стрельбы турелей или для охлаждения чего-то. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 10cefc3ba5..5561216c7b 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"? level.highscore = Yuksek Skor: [accent]{0} level.select = Seviye secimi @@ -185,7 +186,6 @@ map.nospawn = Haritada Oyncularin cikmasi icin cekirdek yok! Haritaya[ROYAL]Mavi 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. map.invalid = Harita yuklenemedi. Gecersiz yada bozuk dosya. editor.brush = Firca -editor.slope = \\ editor.openin = Editorde ac editor.oregen = Maden Yaratilma hizi editor.oregen.info = Maden Yaratilmasi: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]Su Oyuna baglanilamadi: [accent]{0} error.unreachable = Server unreachable. error.invalidaddress = Invalid address. @@ -290,12 +299,15 @@ no = Hayir info.title = [accent]Bilgi error.title = [crimson]Bir hata olustu error.crashtitle = Bir hata olustu +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Yapi bilgisi +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Guc kapasitesi blocks.powershot = Guc/Saldiri hizi blocks.targetsair = Havayi hedef alir mi? -blocks.itemspeed = Ilerleme hizi +blocks.itemsmoved = Move Speed blocks.shootrange = Menzil blocks.size = Buyukluk blocks.liquidcapacity = Sivi kapasitesi @@ -316,6 +328,7 @@ blocks.inputitems = Giris esyalari blocks.outputitem = Sonuc blocks.drilltier = Kazilabilirler blocks.drillspeed = Ana kazma hizi +blocks.maxunits = Max Active Units blocks.liquidoutput = Sivi cikisi blocks.liquidoutputspeed = Liquid Output Speed blocks.liquiduse = Sivi kullanimi @@ -327,7 +340,10 @@ blocks.liquidfueluse = Sivi yakit kullanimi blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Can +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = sekme blocks.shots = vuruslar @@ -336,11 +352,11 @@ blocks.inputfuel = Yakit blocks.fuelburntime = Yakit yakilma suresi blocks.inputcapacity = Giris kapasitesi blocks.outputcapacity = Cikis kapasitesi +blocks.ammo = Ammo unit.blocks = Yapilar unit.powersecond = saniyede bir unit.liquidsecond = Saniyede bir unit.itemssecond = Saniyede bir -unit.pixelssecond = Saniyede bir unit.liquidunits = Litre unit.powerunits = Volt unit.degrees = derece @@ -395,7 +411,7 @@ keybind.move_x.name = Sol/Sag hareket keybind.move_y.name = Yukari/asagi hareket keybind.select.name = Sec/silahi sik keybind.pick.name = Pick Block -keybind.break.name = Kirma +keybind.break_block.name = Break Block keybind.deselect.name = Eldeki yapiyi birak keybind.shoot.name = Sik keybind.zoom_hold.name = Yaklasma basili tutmasi @@ -423,7 +439,7 @@ mode.freebuild.description = Sinirli esyalar ama dalga suresi yok. mode.pvp.name = PvP mode.pvp.description = fight against other players locally. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Esyalar content.liquid.name = Sivilar content.unit.name = Units @@ -448,8 +464,8 @@ 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 = Kabarma karisimi item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.biomatter.name = Biomatter -item.biomatter.description = basit bir yakit olarak kullanilan organik bir madde +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Kum item.sand.description = karistirma maddesi olark kullanilan yaygin bir madde. item.blast-compound.name = patlama birlesimi @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Su -liquid.lava.name = Magma +liquid.slag.name = Slag liquid.oil.name = Benzin liquid.cryofluid.name = kriyo sivisi mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]yetenek gucu: {0} liquid.heatcapacity = [LIGHT_GRAY]isinma kapasitesi: {0} liquid.viscosity = [LIGHT_GRAY]Yari sivilik: {0} liquid.temperature = [LIGHT_GRAY]isi: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Enemy Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = metal zemin block.deepwater.name = su alti block.water.name = su -block.lava.name = magma block.tar.name = Tar -block.blackstone.name = kara tas block.stone.name = tas -block.dirt.name = cimen block.sand.name = kum block.ice.name = buz block.snow.name = kar -block.grass.name = cimen -block.shrub.name = cali -block.rock.name = tas -block.blackrock.name = bkara tas -block.icerock.name = buz tasi +block.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = bakir duvar block.copper-wall-large.name = buyuk bakir duvar block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = genis toryum duvari block.door.name = kapi block.door-large.name = genis kapi block.duo.name = ikili -block.scorch.name = Atesleyici block.hail.name = yagdirici block.lancer.name = Lazer topu block.conveyor.name = konvenyor @@ -555,17 +595,14 @@ block.sorter.name = secici block.sorter.description = esyalari secer. rengi ayni olan esya ileriden, digerleri sagdan ve soldan devam eder block.overflow-gate.name = Kapali dagatici block.overflow-gate.description = sadece saga ve sola dagatir. onu kapalidir -block.smelter.name = eritici -block.arc-smelter.name = elektrik eritici block.silicon-smelter.name = Silikon eritici block.phase-weaver.name = Dokumaci block.pulverizer.name = pulvarizor block.cryofluidmixer.name = Cryosivisi karistiricisi block.melter.name = eritici block.incinerator.name = isi firini -block.biomattercompressor.name = Biomatter kompresoru +block.spore-press.name = Spore Press block.separator.name = separator -block.centrifuge.name = Santrifuj block.power-node.name = Guc Dugumu block.power-node-large.name = buyuk Guc Dugumu block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ block.bridge-conveyor.name = kopru konvenyoru block.plastanium-compressor.name = Plastanium Kompresoru block.pyratite-mixer.name = Pyratite karistirici block.blast-mixer.name = Patlayici karistiricisi -block.solidifer.name = Sertlestirici block.solar-panel.name = gunes paneli block.solar-panel-large.name = genis gunes paneli block.oil-extractor.name = benzin ayirici @@ -626,7 +662,6 @@ block.liquid-junction.name = sivi yonlendirici block.bridge-conduit.name = kopru borusu block.rotary-pump.name = donen boru block.thorium-reactor.name = Thorium Reaktoru -block.command-center.name = komut merkezi block.mass-driver.name = kütle surucusu block.blast-drill.name = Patlatici kazici block.thermal-pump.name = Termal pompa @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 Dronu 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 @@ -697,8 +732,6 @@ tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a 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. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Advanced item transport block. Moves items 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. @@ -738,12 +769,10 @@ block.pulverizer.description = Crushes stone into sand. Useful when there is a l 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.spore-press.description = Compresses spore pods into 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. @@ -765,7 +794,6 @@ block.blast-drill.description = The ultimate drill. Requires large amounts of po 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. @@ -781,7 +809,6 @@ 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. @@ -795,13 +822,11 @@ block.thermal-pump.description = The ultimate pump. Three times as fast as a mec 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.item-source.description = Infinitely outputs items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.power-void.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. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 13c62b3f50..7f109d2189 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -20,6 +20,7 @@ stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = Su haritayi silmek istedigine emin misin? "[orange]{0}[]"? level.highscore = Yüksek Puan: [accent] {0} level.select = Seviye Seç @@ -185,7 +186,6 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a 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. map.invalid = Error loading map: corrupted or invalid map file. editor.brush = Brush -editor.slope = \\ editor.openin = Open In Editor editor.oregen = Ore Generation editor.oregen.info = Ore Generation: @@ -250,7 +250,16 @@ launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson] Sunucuya bağlanılamadı: [accent] {0} error.unreachable = Server unreachable. error.invalidaddress = Invalid address. @@ -290,12 +299,15 @@ no = No info.title = [Vurgu] Bilgi error.title = [crimson] Bir hata oluştu error.crashtitle = Bir hata oluştu +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Blok Bilgisi +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = Güç kapasitesi blocks.powershot = Güç / atış blocks.targetsair = Targets Air -blocks.itemspeed = Units Moved +blocks.itemsmoved = Move Speed blocks.shootrange = Range blocks.size = Boyut blocks.liquidcapacity = Sıvı kapasitesi @@ -316,6 +328,7 @@ blocks.inputitems = Input Items blocks.outputitem = Output Item blocks.drilltier = Drillables blocks.drillspeed = Base Drill Speed +blocks.maxunits = Max Active Units blocks.liquidoutput = Liquid Output blocks.liquidoutputspeed = Liquid Output Speed blocks.liquiduse = Liquid Use @@ -327,7 +340,10 @@ blocks.liquidfueluse = Liquid Fuel Use blocks.boostitem = Boost Item blocks.boostliquid = Boost Liquid blocks.health = Can +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = yanlışlık blocks.shots = atışlar @@ -336,11 +352,11 @@ blocks.inputfuel = Fuel blocks.fuelburntime = Fuel Burn Time blocks.inputcapacity = Giriş kapasitesi blocks.outputcapacity = Çıkış kapasitesi +blocks.ammo = Ammo unit.blocks = blocks unit.powersecond = power units/second unit.liquidsecond = liquid units/second unit.itemssecond = items/second -unit.pixelssecond = pixels/second unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees @@ -395,7 +411,7 @@ keybind.move_x.name = sağ / sol keybind.move_y.name = yukarı / aşağı keybind.select.name = seçmek keybind.pick.name = Pick Block -keybind.break.name = kırmak +keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = ateş etme keybind.zoom_hold.name = tut ve büyüt @@ -423,7 +439,7 @@ mode.freebuild.description = sınırlı kaynaklar ve dalgalar için zamanlayıc mode.pvp.name = PvP mode.pvp.description = fight against other players locally. mode.attack.name = Attack -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = Items content.liquid.name = Liquids content.unit.name = Units @@ -448,8 +464,8 @@ 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.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = kum 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 @@ -461,7 +477,7 @@ item.metaglass.description = A super-tough glass compound. Extensively used for item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = su -liquid.lava.name = lav +liquid.slag.name = Slag liquid.oil.name = petrol liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]Ability: {0} liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} liquid.temperature = [LIGHT_GRAY]Temperature: {0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = Enemy Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -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.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Large Thorium Wall block.door.name = kapı block.door-large.name = büyük kapı block.duo.name = Duo -block.scorch.name = Scorch block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = konveyör @@ -555,17 +595,14 @@ block.sorter.name = ayrıştırıcı 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.smelter.name = dökümcü -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.spore-press.name = Spore Press block.separator.name = Separator -block.centrifuge.name = Centrifuge block.power-node.name = Power Node block.power-node-large.name = Large Power Node block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ 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 @@ -626,7 +662,6 @@ 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 @@ -646,13 +681,13 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 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 @@ -697,8 +732,6 @@ tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a 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. @@ -728,8 +761,6 @@ block.titanium-conveyor.description = Advanced item transport block. Moves items 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. @@ -738,12 +769,10 @@ block.pulverizer.description = Crushes stone into sand. Useful when there is a l 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.spore-press.description = Compresses spore pods into 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. @@ -765,7 +794,6 @@ block.blast-drill.description = The ultimate drill. Requires large amounts of po 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. @@ -781,7 +809,6 @@ 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. @@ -795,13 +822,11 @@ block.thermal-pump.description = The ultimate pump. Three times as fast as a mec 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.item-source.description = Infinitely outputs items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.power-void.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. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 2e13882933..0400870ee6 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -14,12 +14,13 @@ screenshot = Скріншот збережено в {0} gameover = Гру закінчено gameover.pvp = [accent] {0}[] команда перемогла! highscore = [YELLOW]Новий рекорд! -stat.wave = Waves Defeated:[accent] {0} -stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} -stat.built = Buildings Built:[accent] {0} -stat.destroyed = Buildings Destroyed:[accent] {0} -stat.deconstructed = Buildings Deconstructed:[accent] {0} -stat.delivered = Resources Launched: +stat.wave = Хвиль відражено:[accent] {0} +stat.enemiesDestroyed = Ворогів вбито:[accent] {0} +stat.built = Будівель збудувано:[accent] {0} +stat.destroyed = Будівель знищено:[accent] {0} +stat.deconstructed = Будівель декоструйовано[accent] {0} +stat.delivered = Ресурсів здобуто: +stat.rank = Фінальний рахунок: [accent]{0} map.delete = Ви впевнені, що хочете видалити карту "[accent]{0}[]"? level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи @@ -31,15 +32,15 @@ deconstruction.title = Інструкція з деконструкції бло deconstruction = Ви тільки що перешли в [accent] режим деконструкції блоків[].\n\nЩоб почати руйнувати, просто торкніться блоку поруч із вашим кораблем.\nПісля вибору деяких блоків натисніть прапорець, щоб підтвердити, і ваш корабель почне їх деконструювати.\n\n- [accent]Вилучіть блоки[] з вашого вибору, торкнувшись їх.\n- [accent]Вилучіть блоки в зоні[] , торкнувшись і утримуючи порожнє місце, потім перетягніть у потрібному напрямку.\n- [accent]Скасуйте деконструкцію або виділення[] натиснувши X внизу праворуч. showagain = Не показувати знову до наступного сеансу coreattack = < Ядро під атакою! > -nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent -outofbounds = [[ OUT OF BOUNDS ]\n[]self-destruct in {0} -database = Core Database +nearpoint = [[ [scarlet]ЗАЛИШТЕ ТОЧ НЕГАЙНО[] ]\nаннігіляція неминуча. +outofbounds = [[ ПОЗА МЕЖАМИ ]\n[]саморуйнування через{0} +database = База Даних Ядра savegame = Зберегти гру loadgame = Завантажити гру joingame = Мережева гра addplayers = Дод/Видалити гравців customgame = Користувальницька гра -newgame = New Game +newgame = Нова гра none = <нічого> close = Закрити quit = Вийти @@ -50,12 +51,12 @@ about.button = Про гру name = Нік: noname = Спочатку придумайте[accent] собі нікнейм[]. filename = Ім'я файлу: -unlocked = Новий блок розблоковано! -completed = [accent]Completed -techtree = Tech Tree -research.list = [LIGHT_GRAY]Research: -research = Research -researched = [LIGHT_GRAY]{0} researched. +unlocked = Новий контент розблоковано! +completed = [accent]Завершено +techtree = Технологічне дерево +research.list = [LIGHT_GRAY]Дослідження: +research = Дослідження +researched = [LIGHT_GRAY]{0} досліджено. players = Гравців на сервері: {0} players.single = {0} гравець на сервері server.closing = [accent]Закриття серверу... @@ -149,7 +150,7 @@ save.wave = Хвиля {0} save.difficulty = Складність: {0} save.date = Останнє збереження save.playtime = Час гри: {0} -warning = Warning. +warning = Попередження confirm = Підтвердження delete = Видалити ok = ОК @@ -185,7 +186,6 @@ map.nospawn = Ця мапа не має жодного ядра для спав map.nospawn.pvp = У цій карти немає ворожих ядер, в яких гравець може з'явитися! Додайте[SCARLET] червоні[] ядра до цієї карті в редакторі. map.invalid = Помилка завантаження карти: пошкоджений або невірний файл карти. editor.brush = Пензлик -editor.slope = \\ editor.openin = Відкрити в редакторі editor.oregen = Генерація руд editor.oregen.info = Генерація руд: @@ -240,17 +240,26 @@ tutorial = Навчання editor = Редактор mapeditor = Редактор мап donate = Пожертву\nвання -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Complete: -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. +abandon = Покинути +abandon.text = Ця зона і всі її ресурси будуть втрачені для ворога. +locked = Заблоковано +complete = [LIGHT_GRAY]Завершено: +resume = Відновити зону:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Найкраща хвиля: {0} +launch = < ЗАПУСК > +launch.title = Запуск вдалий +launch.next = [LIGHT_GRAY]наступна можливість на хвилі{0} +launch.unable = [scarlet]ЗАПУСК неможливий.[] {0} Ворог. +launch.confirm = Це видалить всі ресурси у Вашому ядрі.\nВи не зможете повернутися до цієї бази. +uncover = Розкрити +configure = Вивантаження +configure.locked = [LIGHT_GRAY]Розблокувати можливість вивантаження ресурсів:\nWave {0}. +zone.unlocked = [LIGHT_GRAY]{0} розблоковано +zone.complete = {0} хвиль досясгнено:\nНові вимоги до зони виконані. +zone.config.complete = {0} хвиль досягнено. reached:\nРозблоковано можливість вивантаження. +zone.resources = Виявлені ресурси: +add = Додати... +boss.health = Здоров’я босу connectfail = [crimson]Не вдалося підключитися до сервера: [accent]{0} error.unreachable = Сервер не доступний. error.invalidaddress = Некоректна адреса. @@ -260,18 +269,18 @@ error.alreadyconnected = Ви вже підключилися. error.mapnotfound = Файл мапи не знайдено error.io = Мережева помилка введення-виведення error.any = Невідома мережева помилка -zone.groundZero.name = Ground Zero -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores -zone.crags.name = Crags -zone.stainedMountains.name = Stained Mountains +zone.groundZero.name = Нульова земля +zone.craters.name = Кратери +zone.frozenForest.name = Крижаний Ліс +zone.ruinousShores.name = Зруйновані Берега +zone.crags.name = Кручі +zone.stainedMountains.name = Пофарбовані гори zone.impact0079.name = Impact 0079 -zone.desolateRift.name = Desolate Rift -zone.arcticDesert.name = Arctic Desert -zone.dryWastes.name = Dry Wastes -zone.nuclearComplex.name = Nuclear Production Complex -zone.moltenFault.name = Molten Fault +zone.desolateRift.name = Пустельний Розлом +zone.arcticDesert.name = Арктична Пустеля +zone.dryWastes.name = Брудні Відходи +zone.nuclearComplex.name = Ядерний Виробничий Комплекс +zone.moltenFault.name = РозплавленийРозлом settings.language = Мова settings.reset = Скинути за замовчуванням settings.rebind = Зміна @@ -290,12 +299,15 @@ no = Ні info.title = Інформація error.title = [crimson]Виникла помилка error.crashtitle = Виникла помилка +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = Інформація про блок +blocks.powerbalance = Енергія: {0} +blocks.poweroutput = Вихідна енергія: {0} blocks.powercapacity = Місткість енергії blocks.powershot = Енергія/постріл blocks.targetsair = Атакуе повітряних ворогів -blocks.itemspeed = Швидкість переміщення ресурсів +blocks.itemsmoved = Швидкість переміщення blocks.shootrange = Діапазон дії blocks.size = Розмір blocks.liquidcapacity = Місткість рідини @@ -316,19 +328,23 @@ blocks.inputitems = Вхідні предмети blocks.outputitem = Вихідний предмет blocks.drilltier = Видобуває blocks.drillspeed = Базова швидкість свердління +blocks.maxunits = Max Active Units blocks.liquidoutput = Вихідна рідина blocks.liquidoutputspeed = Швидкість вихідної рідини blocks.liquiduse = Використовуеться рідин blocks.coolant = Охолоджуюча рідина -blocks.liquid = Liquid +blocks.liquid = Рідина blocks.coolantuse = Охолодж. рідини використовуеться blocks.inputliquidfuel = Рідке паливо blocks.liquidfueluse = Рідкого палива використовуеться blocks.boostitem = Прискорюючий предмет blocks.boostliquid = Прискорююча рідина blocks.health = Здоров'я -blocks.power = Power -blocks.power.satisfaction = Power Satisfaction +blocks.heat = Heat +blocks.power = Енергія +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} +blocks.power.satisfaction = Енергії вистачає blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду @@ -336,11 +352,11 @@ blocks.inputfuel = Паливо blocks.fuelburntime = Час горіння топлива blocks.inputcapacity = Макс. місткість вхідних предметів blocks.outputcapacity = Макс. місткість вихідних предметів +blocks.ammo = Боєприпаси unit.blocks = блоки unit.powersecond = одиниць енергії/секунду unit.liquidsecond = рідких одиниць/секунду unit.itemssecond = предметів/секунду -unit.pixelssecond = пікселів/секунду unit.liquidunits = рідинних одиниць unit.powerunits = енергетичних одиниць unit.degrees = град. @@ -393,9 +409,9 @@ keybind.press.axis = Натисніть клавішу... keybind.screenshot.name = Скріншот мапи keybind.move_x.name = Рух по осі x keybind.move_y.name = Рух по осі x -keybind.select.name = ВибратиПостріл -keybind.pick.name = Pick Block -keybind.break.name = Руйнування +keybind.select.name = Вибір/Постріл +keybind.pick.name = Вибрати блок +keybind.break_block.name = Зламати блок keybind.deselect.name = Скасувати keybind.shoot.name = Постріл keybind.zoom_hold.name = Удержание зума @@ -414,8 +430,8 @@ keybind.chat_scroll.name = Прокрутка чату keybind.drop_unit.name = Скинути бой. од. keybind.zoom_minimap.name = Збільшити мінікарту mode.help.title = Опис режимів -mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +mode.survival.name = Хвилі +mode.survival.description = Звичайний режим. В цьому режимі треба самим добувати ресурси та хвилі йдуть беззупинно. mode.sandbox.name = Пісочниця mode.sandbox.description = В режимі "Пісочниця" бескінечні ресурси(але їх все одно можно добувати) та хвилі йдуть за вашим бажанням. mode.freebuild.name = Вільне\nбудівництво @@ -423,11 +439,11 @@ mode.freebuild.description = В режимі "Пісочниця" треба с mode.pvp.name = PVP mode.pvp.description = боріться проти інших гравців. mode.attack.name = Атака -mode.attack.descrption = Немає хвиль, мета - знищити базу противника. +mode.attack.description = Немає хвиль, мета - знищити базу противника. content.item.name = Предмети content.liquid.name = Рідини content.unit.name = Бойові одиниці -content.block.name = Blocks +content.block.name = Блоки content.mech.name = Мехи item.copper.name = Мідь item.copper.description = Корисний структурний матеріал. Широко використовується у всіх типах блоків. @@ -435,7 +451,7 @@ item.lead.name = Свинець item.lead.description = Базовий стартовий матеріал. Широко використовується в електроніки та транспорту рідин. item.coal.name = Вугілля item.coal.description = Загальне та легкодоступне паливо. -item.graphite.name = Graphite +item.graphite.name = Графіт item.titanium.name = Титан item.titanium.description = Рідкий суперлегкий метал широко використовується в рідкому транспорті, свердлах та літальних апаратах. item.thorium.name = Торій @@ -448,20 +464,20 @@ item.phase-fabric.name = Фазова тканина item.phase-fabric.description = Невагоме речовина, що використовується в сучасній електроніці і технології самовідновлення. Не для вишивання. item.surge-alloy.name = Кінетичний сплав item.surge-alloy.description = Передовий сплав з унікальними електричними властивостями. -item.biomatter.name = Біоматерія -item.biomatter.description = Скупчення органічної муси; використовується для перетворення в нафту або як паливо. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Пісок item.sand.description = Загальний матеріал, який широко використовується при плавленні, як у процесі плавки, так і у вигляді шлака. item.blast-compound.name = Вибухонебезпечне з'єднання item.blast-compound.description = Нестійке з'єднання, що використовується в бомбах та вибухових речовинах. Хоча воно може спалюватися як паливо, та це не рекомендується. item.pyratite.name = Піротит item.pyratite.description = Вкрай легкозаймиста речовина, що використовується у запальній зброї. -item.metaglass.name = Metaglass -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.scrap.name = Scrap -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.metaglass.name = Біоскло +item.metaglass.description = Надміцна суміш скла. Широко використовується для розподілу і зберігання рідини. +item.scrap.name = Металобрухт +item.scrap.description = Залишки старих споруд і бойових одиниць. Містить незначні кількості багатьох різних металів. liquid.water.name = Вода -liquid.lava.name = Лава +liquid.slag.name = Slag liquid.oil.name = Нафта liquid.cryofluid.name = Кріогенна рідина mech.alpha-mech.name = Альфа @@ -507,35 +523,60 @@ mech.ability = [LIGHT_GRAY]Здібність: {0} liquid.heatcapacity = [LIGHT_GRAY]Теплоємність: {0} liquid.viscosity = [LIGHT_GRAY]В'язкість: {0} liquid.temperature = [LIGHT_GRAY]Температура: {0} -block.kiln.name = Kiln -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press +block.scrap-wall.name = Стіна з металобрухту +block.scrap-wall-large.name = Велика стіна з металобрухту +block.scrap-wall-huge.name = Величезна стіна з металобрухту +block.scrap-wall-gigantic.name = Гігантська стіна з металобрухту +block.thruster.name = Штовхач +block.kiln.name = Піч +block.kiln.description = Виплавляє пісок і свинець в біоскло. Потребує малої кількості енергії. +block.graphite-press.name = Графітний прес +block.multi-press.name = Мульти-прес block.constructing = {0}\n[LIGHT_GRAY](В процесі) block.spawn.name = Місце появи ворога -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Foundation -block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = Металева плитка +block.core-shard.name = Ядро: Осколок +block.core-foundation.name = Ядро: Штаб +block.core-nucleus.name = Ядро: Атом block.deepwater.name = Глибоководдя block.water.name = Вода -block.lava.name = Лава block.tar.name = Tar -block.blackstone.name = Чорний камінь block.stone.name = Камінь -block.dirt.name = Земля -block.sand.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.craters.name = Кратери +block.sand-water.name = Пісок з водою +block.char.name = Випалена Земля +block.holostone.name = Голографічний камінь +block.ice-snow.name = Крижаний Сніг +block.rocks.name = Камені +block.icerocks.name = Крижані камені +block.snowrocks.name = Снігові камені +block.dunerocks.name = Піщані Камені +block.pine.name = Сосна +block.white-tree-dead.name = Мертве Біле Дерево +block.white-tree.name = Біле Дерево +block.spore-cluster.name = Скупчення спор +block.stained-rocks.name = Плямисті Камені +block.stained-stone.name = Плямистий Камінь +block.stained-rocks-red.name = Червоні Плямисті Камні +block.stained-stone-red.name = Червоний Плямистий Камінь +block.stained-rocks-yellow.name = Жовті Плямисті Камні +block.stained-stone-yellow.name = Жовтий Плямистий Камінь +block.stained-boulder.name = Плямистий Валун +block.metal-floor.name = Металевий Пол +block.metal-floor-2.name = Металевий Пол 2 +block.metal-floor-3.name = Металевий Пол 3 +block.metal-floor-5.name = Металевий Пол 5 +block.metal-floor-damaged.name = Пошкоджений Металевий Пол +block.ignarock.name = Магматичні Гірські Породи +block.hotrock.name = Гарячий Камінь +block.magmarock.name = Магмакамінь +block.cliffs.name = Скелі block.copper-wall.name = Мідна стіна block.copper-wall-large.name = Велика мідна стіна -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall +block.titanium-wall.name = Титанова стіна +block.titanium-wall-large.name = Велика титанова стіна block.phase-wall.name = Фазова стіна block.phase-wall-large.name = Велика фазова стіна block.thorium-wall.name = Торієва стіна @@ -543,7 +584,6 @@ block.thorium-wall-large.name = Велика торієва стіна block.door.name = Двері block.door-large.name = Великі двері block.duo.name = Подвійна -block.scorch.name = Випалювач block.hail.name = Град block.lancer.name = Списоносець block.conveyor.name = Конвеєр @@ -555,33 +595,30 @@ block.sorter.name = Сортувальник block.sorter.description = Сортує предмети. Якщо товар відповідає виділенню, йому можна пройти. В іншому випадку предмет виводиться ліворуч і праворуч. block.overflow-gate.name = Надмірний затвор block.overflow-gate.description = Комбінований розподілювач і маршрутизатор, який виводить тільки вліво та вправо, якщо передній шлях заблоковано. -block.smelter.name = Плавильний завод -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.spore-press.name = Spore Press block.separator.name = Сепаратор -block.centrifuge.name = Центрифуга block.power-node.name = Енергійний вузол block.power-node-large.name = Великий енергетичний вузол -block.surge-tower.name = Surge Tower +block.surge-tower.name = Кінетична вежа block.battery.name = Акумулятор block.battery-large.name = Великий акумулятор block.combustion-generator.name = Генератор горіння block.turbine-generator.name = Турбогенератор -block.differential-generator.name = Differential Generator -block.impact-reactor.name = Impact Reactor +block.differential-generator.name = Дифернеціальний генератор +block.impact-reactor.name = Імпульсний реактор block.mechanical-drill.name = Механічний дриль block.pneumatic-drill.name = Пневматичний дриль block.laser-drill.name = Лазерний дриль block.water-extractor.name = Екстрактор води block.cultivator.name = Культиватор -block.alpha-dart-mech-pad.name = Alpha-Dart Mech Pad -block.delta-mech-pad.name = Реконструктор "Дельта" +block.alpha-dart-mech-pad.name = Реконструктор "Альфа-Дротик" +block.delta-mech-pad.name = Delta Mech Pad block.javelin-ship-pad.name = Реконструктор "Джавелін" block.trident-ship-pad.name = Реконструктор "Тризуб" block.glaive-ship-pad.name = Реконструктор "Спис" @@ -597,7 +634,7 @@ block.power-source.name = Нескінченна енергія block.unloader.name = Розвантажувач block.vault.name = Сховище block.wave.name = Хвиля -block.swarmer.name = Ройевик +block.swarmer.name = Роєвик block.salvo.name = Залп block.ripple.name = Рябь block.phase-conveyor.name = Фазовий конвеєр @@ -605,7 +642,6 @@ 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 = Екстрактор нафти @@ -626,7 +662,6 @@ 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 = Тепловий насос @@ -637,7 +672,7 @@ block.surge-wall.name = Хвиляста стіна block.surge-wall-large.name = Велика хвиляста стіна block.cyclone.name = Циклон block.fuse.name = Підривник -block.shock-mine.name = Шокуюча міна +block.shock-mine.name = Міна block.overdrive-projector.name = Сверхприводний проектор block.force-projector.name = Силовий проектор block.arc.name = Дуга @@ -645,14 +680,14 @@ block.rtg-generator.name = Радіоізотопний термоелектри block.spectre.name = Мара block.meltdown.name = Розтоплення block.container.name = Склад -block.launch-pad.name = Launch Pad +block.launch-pad.name = Стартовий майданчик +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = Початковий дрон. З'являється в ядрі за замовчуванням. Автоматично добуває руди та ремонтує блоки. unit.phantom.name = Фантом @@ -669,11 +704,11 @@ unit.wraith.description = Швидка бойова одиниця, котрий unit.fortress.name = Фортеця unit.fortress.description = Тяжка артилерійна наземна бойова одиниця. unit.revenant.name = Потойбічний вбивця -unit.eruptor.name = Eruptor -unit.chaos-array.name = Chaos Array -unit.eradicator.name = Eradicator -unit.lich.name = Lich -unit.reaper.name = Reaper +unit.eruptor.name = Вивиргатель +unit.chaos-array.name = Масив хаосу +unit.eradicator.name = Викорінювач +unit.lich.name = Лич +unit.reaper.name = Жнець tutorial.begin = Ваша місія тут полягає в ліквідації[LIGHT_GRAY] противника[].\n\nПочнімо з[accent] видобутку міді[]. Щоб зробити це, торкніться мідної рудної жили біля вашого ядра. tutorial.drill = Ручна робота не ефективна\n[accent]Бури []можуть копати автоматично.\nПоставте один на мідній жилі. tutorial.conveyor = [accent]Конвейери[] використовуються для транспортування предметів в ядра.\nЗробіть лінію конвейерів від бурів до ядра. @@ -697,8 +732,6 @@ tutorial.dagger = Зв'яжіть силовий вузол з заводом.\n tutorial.battle = [LIGHT_GRAY] Супротивник[] показав своє ядро.\nЗнищьте його з вашим мехом та бойовою одиницею. block.copper-wall.description = Дешевий оборонний блок.\nКорисен для захисту ядра і турелей під час перших хвиль. block.copper-wall-large.description = Велика стіна найменшим запасом міцності.\nКорисна на початку гри. -block.dense-alloy-wall.description = Стіна з показником міцності "нижче середнього". -block.dense-alloy-wall-large.description = Велика стіна з показником міцності "нижче середнього". block.thorium-wall.description = Стіна з показником міцності "вище середнього". block.thorium-wall-large.description = Велика стіна з показником міцності "вище середнього". block.phase-wall.description = Стіна з середнім показником міцності. @@ -725,11 +758,9 @@ block.spectre.description = Велика вежа, яка стріляє зра block.meltdown.description = Велика турель, яка стріляє могутніми далекобійними променями. block.conveyor.description = Переміщує ресурси з малою швидкістю. block.titanium-conveyor.description = Конвеєр другого покоління. Збільшена швидкість переміщення предметів і міцність конвеєра. -block.phase-conveyor.description = Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі (можливо, це брехня).\nПотрібує енергії і підключається як мостовий конвеєр. +block.phase-conveyor.description = Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі (можливо, це брехня).\nПотребує енергії і підключається як мостовий конвеєр. block.junction.description = Назва говорить сама за себе. За допомогою нього можна зробити дві конвеєрні стрічки, які проходять через один одного і не змішуються. block.mass-driver.description = При наявності енергії передають ресурси на відстань 100 блоків, стріляючи в один-одного. -block.smelter.description = Виробляє щільний сплав з міді і свинцю. Можна підвести пісок для прискорення виробництва. -block.arc-smelter.description = Покращена версія плавильного заводу. Вимагає енергію. Виробляє щільний сплав з міді і свинця.\nМожно підвести пісок для прискорення виробництва. block.silicon-smelter.description = За допомогою піску, вугілля і енергії виробляє кремній. block.plastanium-compressor.description = Створює пластинійи з титану і нафти. Вимагає енергії. Для прискорення виробництва можна додати в компресор пісок. block.phase-weaver.description = Виробляє фазову тканину торію і піску. Вимагає багато енергії. @@ -737,20 +768,18 @@ 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.cryofluidmixer.description = Виробляє криогенну рідину з води і титану. Вимагає енергії. +block.melter.description = Розплавляє металобрухт у шлаки для подальшої переробки або використання у турелях. block.incinerator.description = Якщо є непотрібні ресурси, можна просто їх спалити.\nВимагає енергії. -block.biomattercompressor.description = Виробляє нафту з біоматеріі, біосміття і енергії. -block.separator.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться". -block.centrifuge.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться".\nТребует енергію. +block.spore-press.description = Compresses spore pods into oil. +block.separator.description = Витягує корисні мінерали з шлаку. block.power-node.description = Максимум допустимо 4 підключення.\nЩоб з'єднати з якимось блоком потрібно наступне:\n1. Щоб він знаходився в радіусі дії \n2. Натиснити на потрібний силовий вузол, а потім на інший силовий вузол або блок. block.power-node-large.description = Силовий вузол другого покоління. Збільшено радіус дії і кількість максимально допустимих підключень. block.battery.description = Хранит энергию всякий раз, когда есть изобилие, и обеспечивает мощность всякий раз, когда есть недостаток, если есть мощность, але БАТАРЕЙКИ DURACELL ЗБЕРІГАЮТЬ БІЛЬШЕ! (прихована реклама) block.battery-large.description = Зберігає значно більше енергії, ніж звичайна батарейка... block.combustion-generator.description = Генерує енергію, спалюючи нафту або легкозаймисті матеріали. block.turbine-generator.description = Більш ефективний, ніж генератор горіння, але вимагає додаткової води. -block.thermal-generator.description = Генерує велику кількість енергії з лави. +block.thermal-generator.description = Генерує енергію при розміщенні в гарячих місцях. block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. block.solar-panel-large.description = Забезпечує набагато краще джерело живлення, ніж стандартна панель, але в той же час набагато дорожче її побудувати. block.thorium-reactor.description = Генерує величезну кількість енергії з високоактивного торію. Потребує постійного охолодження. Вибухне сильно, якщо постачається недостатня кількість рідини. @@ -763,9 +792,8 @@ block.pneumatic-drill.description = Покращена версія механі block.laser-drill.description = Покращена версія пневматичного бура.\nДобивает теж саме, що і пневматичний бур. Також може добувати торій.\nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління. block.blast-drill.description = Найпотужніший бур.\n\nВидобуває теж саме, що і лазерний бур. Свердлить швидше всіх бурів, але вимагає ще більше енергії.\nМожно підвести до нього[BLUE] воду [] для збільшення швидкості свердління. block.water-extractor.description = Витягує воду з землі. Використовуйте його, коли поблизу немає озера. -block.cultivator.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Використовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. @@ -779,9 +807,8 @@ block.ghoul-factory.description = Виробляє важких килимови block.dagger-factory.description = Виробляє основні наземні бойові одиниці. block.titan-factory.description = Виробляє просунуті захищені бойові одиниці. block.fortress-factory.description = Виробляє важкі артилерійські бойові одиниці. -block.revenant-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 = Покращений блок перевезення рідин. Використовує енергію для телепорту рідин до підключеного фазового каналу по декілька блоків. @@ -795,13 +822,11 @@ block.thermal-pump.description = Остаточний насос. Тричі ш block.router.description = Приймає елементи з одного напрямку і рівномірно виводить їх до 3 інших напрямків. Корисно для розділення матеріалів від одного джерела на кілька. block.distributor.description = Розширений маршрутизатор, який рівномірно розбиває елементи на 7 різних напрямків. block.bridge-conveyor.description = Покращений блок транспортування предметів. Дозволяє транспортувати предмети понад 3 блоки над будь-якої місцевостю або будівлеє. -block.alpha-mech-pad.description = Коли ви отримаєте достатньо енергії, перебудовує ваш корабель у [accent] Альфа[] мех. block.item-source.description = Безліченно виводить предмети. block.liquid-source.description = Безліченно виводить рідини. block.item-void.description = Знищує будь-які предмети, які входять, без використання енергії. block.power-source.description = Нескінченність не межа. Безмежно виводить енергію. block.power-void.description = Енергія просто йде в порожнечу. liquid.water.description = Цю рідину можно підвести до бурів для прискорення швидкості видобутку або к турелям для прискорення стрілянини. -liquid.lava.description = Можна перетворити в[LIGHT_GRAY] камінь[]. liquid.oil.description = Можна спалити, взірвати або використовувати для охолодження. liquid.cryofluid.description = Рідина з температурою нижче ніж -273 градусів за Цельсієм. Може бути використана для прискорення стрільби турелей або для охолодження чогось. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 9249d5ad23..8cbb346913 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -10,16 +10,17 @@ link.itch.io.description = PC版下载和网页版(itch.io) link.google-play.description = 从谷歌商店获取安卓版 link.wiki.description = 官方 Mindustry 维基 linkfail = 打开链接失败!\nURL 已经复制到剪贴板。 -screenshot = Screenshot saved to {0} +screenshot = 荧幕截图已放在 {0} gameover = 你的核心被摧毁了! gameover.pvp = accent] {0}[] 队获胜! highscore = [accent]新纪录! -stat.wave = Waves Defeated:[accent] {0} +stat.wave = 战胜的波数:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} map.delete = 确定要删除 "[accent]{0}[]" 地图吗? level.highscore = 最高分: [accent]{0} level.select = 选择关卡 @@ -69,7 +70,7 @@ server.kicked.nameInUse = 服务器中已经\n有人有相同的名字了。 server.kicked.nameEmpty = 你的名字必须至少包含一个字母或数字。 server.kicked.idInUse = 你已经在服务器中!不允许用两个账号。 server.kicked.customClient = 这个服务器不支持修改版客户端,请下载官方版本。 -server.kicked.gameover = Game over! +server.kicked.gameover = ! host.info = [accent]创建局域网游戏[]按钮会在[scarlet]6567[]端口运行一个服务器。[]\n任何在同一个[LIGHT_GRAY]网络或本地网络[]下的人都将在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过IP地址连接,你需要设定[accent]端口转发[]。\n\n[LIGHT_GRAY]请注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了Mindustry连接本地网络。 join.info = 你可以在这里输入[accent]服务器的IP地址[]以连接,或寻找[accent]本地网络[]中的服务器以连接。\n目前支持局域网或广域网多人游戏。\n\n[LIGHT_GRAY]请注意:没有全球服务器列表;如果你想通过IP地址连接某个服务器,你需要向房主询问IP地址。 hostserver = 创建服务器 @@ -139,7 +140,7 @@ save.rename = 重命名 save.rename.text = 新名字: selectslot = 选择一个存档。 slot = [accent]存档 {0} -save.corrupted = [accent]存档损坏或无效!\n如果你刚刚升级了游戏,那么这可能是因为存档格式改变了而[scarlet]不是[] bug 。 +save.corrupted = [accent]存档损坏或无效!\n如果你刚刚升级了游戏,那么这可能是因为存档格式改变了,而[scarlet]不是[] bug 。 empty = <空> on = 开 off = 关 @@ -185,7 +186,6 @@ map.nospawn = 这个地图没有核心!请在编辑器中添加一个[ROYAL] map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[ROYAL]红色[]的核心。 map.invalid = 地图载入错误:地图文件可能已经损坏。 editor.brush = 笔刷 -editor.slope = \\ editor.openin = 在编辑器中打开 editor.oregen = 生成矿石 editor.oregen.info = 生成矿石: @@ -195,16 +195,16 @@ editor.description = 描述: editor.name = 名字: editor.teams = 团队 editor.elevation = 高度 -editor.errorimageload = 载入文件出错:\n[accent]{0} -editor.errorimagesave = 保存文件出错:\n[accent]{0} +editor.errorimageload = 载入文件时出错:\n[accent]{0} +editor.errorimagesave = 保存文件时出错:\n[accent]{0} editor.generate = 生成 editor.resize = 调整 editor.loadmap = 载入地图 editor.savemap = 保存地图 editor.saved = 已保存! editor.save.noname = 你的地图还没有名字!在“地图信息”菜单里设置一个名字。 -editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个。 -editor.import.exists = [scarlet]无法导入:[] 一个叫 '{0}' 的内建地图已经存在。 +editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个新的名字。 +editor.import.exists = [scarlet]无法导入:[] 已经有一个叫 '{0}' 的内建地图存在。 editor.import = 导入…… editor.importmap = 导入地图 editor.importmap.description = 导入一个已经存在的地图 @@ -241,16 +241,25 @@ editor = 编辑器 mapeditor = 地图编辑器 donate = 捐赠 abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Complete: +abandon.text = 这个区域和它的所有资源会被敌人没收. +locked = 已被锁定 +complete = [LIGHT_GRAY]完成: resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. +bestwave = [LIGHT_GRAY]最好: {0} +launch = < 发射 > +launch.title = 发射成功 +launch.next = [LIGHT_GRAY]下一个发射机会在第 {0} 波 +launch.unable = [scarlet]发射失败。[] 敌人. +launch.confirm = 这样做会把您基地里的所有资源发射出去\n您不能再回来这个基地。 +uncover = Uncover +configure = 设定 Loadout +configure.locked = [LIGHT_GRAY]到达第 {0} 波\n才设定 loadout. +zone.unlocked = [LIGHT_GRAY]{0} 已解锁。 +zone.complete = 区域条件达成。 +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = 已被发现的资源: +add = Add... +boss.health = Boss Health connectfail = [crimson]服务器连接失败: [accent]{0} error.unreachable = 服务器无法访问。 error.invalidaddress = 地址无效。 @@ -290,12 +299,15 @@ no = 不 info.title = [accent]详情 error.title = [crimson]发生了一个错误 error.crashtitle = 发生了一个错误 +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = 方块详情 +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = 能量容量 blocks.powershot = 能量/发射 blocks.targetsair = 攻击空中单位 -blocks.itemspeed = 移动速度 +blocks.itemsmoved = 移动速度 blocks.shootrange = 范围 blocks.size = 尺寸 blocks.liquidcapacity = 液体容量 @@ -316,6 +328,7 @@ blocks.inputitems = 物品输入 blocks.outputitem = 物品输出 blocks.drilltier = 可钻探矿物 blocks.drillspeed = 基础钻探速度 +blocks.maxunits = Max Active Units blocks.liquidoutput = 液体输出 blocks.liquidoutputspeed = 液体输出速度 blocks.liquiduse = 液体使用速度 @@ -324,10 +337,13 @@ blocks.liquid = Liquid blocks.coolantuse = 冷却剂使用速度 blocks.inputliquidfuel = 液体燃料输入 blocks.liquidfueluse = 液体燃料使用速度 -blocks.boostitem = Boost Item -blocks.boostliquid = Boost Liquid +blocks.boostitem = 强化物件 +blocks.boostliquid = 强化液体 blocks.health = 生命值 +blocks.heat = Heat blocks.power = 电力 +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = 电力见面 blocks.inaccuracy = 误差 blocks.shots = 发射数 @@ -336,11 +352,11 @@ blocks.inputfuel = 燃料 blocks.fuelburntime = 燃料燃烧时间 blocks.inputcapacity = 输入容量 blocks.outputcapacity = 输出容量 +blocks.ammo = 子弹 unit.blocks = 方块 unit.powersecond = 能量单位/秒 unit.liquidsecond = 液体单位/秒 unit.itemssecond = 物品/秒 -unit.pixelssecond = 像素/秒 unit.liquidunits = 液体单位 unit.powerunits = 能量单位 unit.degrees = 度 @@ -352,8 +368,8 @@ category.liquids = 液体 category.items = 物品 category.crafting = 制造 category.shooting = 发射 -category.optional = Optional Enhancements -setting.indicators.name = Ally Indicators +category.optional = 可选的增强物品 +setting.indicators.name = 队友指示器 setting.autotarget.name = 自动发射 setting.fpscap.name = 最高 FPS setting.fpscap.none = 无 @@ -390,12 +406,12 @@ keybind.gridMode.name = 选择块 keybind.gridModeShift.name = 选择类别 keybind.press = 按一下键…… keybind.press.axis = 按一下轴或键…… -keybind.screenshot.name = Map Screenshot +keybind.screenshot.name = 地图截图 keybind.move_x.name = 水平移动 keybind.move_y.name = 垂直移动 keybind.select.name = 选择 -keybind.pick.name = Pick Block -keybind.break.name = 破坏 +keybind.pick.name = 选择方块 +keybind.break_block.name = 破坏方块 keybind.deselect.name = 取消 keybind.shoot.name = 射击 keybind.zoom_hold.name = 保持缩放 @@ -423,7 +439,7 @@ mode.freebuild.description = 有限的资源,不会自动生成敌人。 mode.pvp.name = PvP mode.pvp.description = 和本地玩家对战. mode.attack.name = 攻击 -mode.attack.descrption = 没有波浪,目标是摧毁敌人的基地。 +mode.attack.description = 没有波数,但是有吹毁敌人基地的任务. content.item.name = 物品 content.liquid.name = 液体 content.unit.name = 部队 @@ -448,8 +464,8 @@ item.phase-fabric.name = 相织物 item.phase-fabric.description = 一种接近0重量的物质,用于先进的电子技术和自我修复技术。 item.surge-alloy.name = 巨浪合金 item.surge-alloy.description = 一种具有独特电气性能的高级合金。 -item.biomatter.name = 生物质 -item.biomatter.description = 一种有机物;用于转化为油或作为基本燃料。 +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = 沙 item.sand.description = 一种常见的材料,广泛用于冶炼,包括制作合金和助熔剂。 item.blast-compound.name = 爆炸混合物 @@ -457,11 +473,11 @@ item.blast-compound.description = 一种用于炸弹和炸药的挥发性混合 item.pyratite.name = 硫 item.pyratite.description = 一种燃烧武器中使用的极易燃物质。 item.metaglass.name = Metaglass -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. +item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体 item.scrap.name = Scrap item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = 水 -liquid.lava.name = 岩浆 +liquid.slag.name = Slag liquid.oil.name = 石油 liquid.cryofluid.name = 冷冻液 mech.alpha-mech.name = Alpha @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]能力:{0} liquid.heatcapacity = [LIGHT_GRAY]热容量:{0} liquid.viscosity = [LIGHT_GRAY]粘度:{0} liquid.temperature = [LIGHT_GRAY]温度:{0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = 敌人出生点 block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.metalfloor.name = 金属地板 block.deepwater.name = 深水 block.water.name = 水 -block.lava.name = 岩浆 block.tar.name = Tar -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.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = 铜墙 block.copper-wall-large.name = 大型铜墙 block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = 大型钍墙 block.door.name = 门 block.door-large.name = 大门 block.duo.name = 双管炮 -block.scorch.name = 灼烧炮 block.hail.name = 冰雹炮 block.lancer.name = 蓝瑟炮 block.conveyor.name = 传送带 @@ -555,17 +595,14 @@ block.sorter.name = 分类器 block.sorter.description = 对物品进行分类。如果物品与所选种类,则允许其通过。否则,物品将从左边和右边输出。 block.overflow-gate.name = 溢流门 block.overflow-gate.description = 分离器和路由器的组合,如果前面被挡住,则向从左和右输出。 -block.smelter.name = 冶炼厂 -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.spore-press.name = Spore Press block.separator.name = 分离机 -block.centrifuge.name = 离心机 block.power-node.name = 能量节点 block.power-node-large.name = 大型能量节点 block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ 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 = 石油钻井 @@ -626,7 +662,6 @@ 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 = 热能泵 @@ -646,13 +681,13 @@ block.spectre.name = 幽灵 block.meltdown.name = 熔毁 block.container.name = 容器 block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = 轻型无人机 unit.spirit.description = 初始无人机。默认情况下在内核中生成。自动开采矿石,收集物品和修理块。 unit.phantom.name = 鬼怪无人机 @@ -697,8 +732,6 @@ tutorial.dagger = 链接能源节点到工厂.\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 = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。 @@ -728,8 +761,6 @@ 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 = 用放射性钍和大量沙子生产相织物。 @@ -738,12 +769,10 @@ 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.spore-press.description = Compresses spore pods into oil. block.separator.description = 将石头暴露在水压下,以获得石头中含有的各种矿物质。 -block.centrifuge.description = 比分离器更有效,但构建起来也更昂贵并且需要动力。 block.power-node.description = 连接节点传输电源。最多可连接四个电源,接收器或节点。节点将从任何相邻块接收电力或向其供电。 block.power-node-large.description = 传输径大于电源节点,最多可连接六个电源,接收器或节点。 block.battery.description = 储存电力,当储存有能量时,可在电力短缺时提供电力。 @@ -765,7 +794,6 @@ 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站在上面时双击切换。 @@ -781,7 +809,6 @@ 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 = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。 @@ -795,13 +822,11 @@ 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.item-source.description = 无限输出物品。仅限沙箱。 block.liquid-source.description = 无限输出液体。仅限沙箱。 block.item-void.description = 在不使用电源的情况下销毁任何进入它的物品。仅限沙箱。 block.power-source.description = 无限输出功率。仅限沙箱。 block.power-void.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 d270e4536d..8f96dc5461 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -20,6 +20,7 @@ stat.built = 建設的建築:[accent]{0} stat.destroyed = 摧毀的建築:[accent]{0} stat.deconstructed = 移除的建築:[accent]{0} stat.delivered = 發射的資源: +stat.rank = Final Rank: [accent]{0} map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? level.highscore = 最高分:[accent]{0} level.select = 選擇關卡 @@ -185,7 +186,6 @@ map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[ROYAL] map.nospawn.pvp = 這個地圖沒有核心讓敵人重生!請在編輯器中添加一個[SCARLET]紅色[]的核心。 map.invalid = 地圖載入錯誤:地圖可能已經損壞。 editor.brush = 粉刷 -editor.slope = \\ editor.openin = 在編輯器中開啟 editor.oregen = 礦石產生 editor.oregen.info = 礦石產生: @@ -248,9 +248,18 @@ resume = 繼續區域:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]高分:{0} launch = 發射 launch.title = 發射成功 -zone.unlocked = [LIGHT_GRAY]{0}已解鎖。 launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. +zone.unlocked = [LIGHT_GRAY]{0}已解鎖。 +zone.complete = Zone conditions met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Add... +boss.health = Boss Health connectfail = [crimson]無法連線到伺服器:[accent]{0} error.unreachable = 無法到達伺服器。 error.invalidaddress = 無效地址。 @@ -290,12 +299,15 @@ no = 否 info.title = [accent]資訊 error.title = [crimson]發生錯誤 error.crashtitle = 發生錯誤 +blocks.outputspeed = Drill Speed: {0}/s blocks.unknown = [LIGHT_GRAY]??? blocks.blockinfo = 方塊資訊 +blocks.powerbalance = Power: {0} +blocks.poweroutput = Power Output: {0} blocks.powercapacity = 蓄電量 blocks.powershot = 能量/射擊 blocks.targetsair = 攻擊空中目標 -blocks.itemspeed = 移動速度 +blocks.itemsmoved = Move Speed blocks.shootrange = 範圍 blocks.size = 尺寸 blocks.liquidcapacity = 液體容量 @@ -316,6 +328,7 @@ blocks.inputitems = 輸入物品 blocks.outputitem = 輸出物品 blocks.drilltier = 可鑽取礦物 blocks.drillspeed = 基本鑽取速度 +blocks.maxunits = Max Active Units blocks.liquidoutput = 輸出液體 blocks.liquidoutputspeed = 輸出液體速度 blocks.liquiduse = 使用液體速度 @@ -327,7 +340,10 @@ blocks.liquidfueluse = 使用液體燃料速度 blocks.boostitem = 強化物品 blocks.boostliquid = 強化液體 blocks.health = 耐久度 +blocks.heat = Heat blocks.power = Power +blocks.progress = Build Progress +blocks.spawned = Units: {0}/{1} blocks.power.satisfaction = Power Satisfaction blocks.inaccuracy = 誤差 blocks.shots = 射擊數 @@ -336,11 +352,11 @@ blocks.inputfuel = 燃料 blocks.fuelburntime = 燃燒燃料時間 blocks.inputcapacity = 輸入容量 blocks.outputcapacity = 輸出容量 +blocks.ammo = Ammo unit.blocks = 方塊 unit.powersecond = 能量單位/秒 unit.liquidsecond = 液體單位/秒 unit.itemssecond = 物品/秒 -unit.pixelssecond = 像素/秒 unit.liquidunits = 液體單位 unit.powerunits = 能量單位 unit.degrees = 度 @@ -395,7 +411,7 @@ keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 keybind.select.name = 選取 keybind.pick.name = Pick Block -keybind.break.name = 拆除 +keybind.break_block.name = Break Block keybind.deselect.name = 取消選取 keybind.shoot.name = 射擊 keybind.zoom_hold.name = 按住縮放 @@ -423,7 +439,7 @@ mode.freebuild.description = 有限的資源,與不倒數計時的波次。 mode.pvp.name = 對戰 mode.pvp.description = 和其他玩家鬥爭。 mode.attack.name = 攻擊 -mode.attack.descrption = No waves, with the goal to destroy the enemy base. +mode.attack.description = No waves, with the goal to destroy the enemy base. content.item.name = 物品 content.liquid.name = 液體 content.unit.name = 機組 @@ -448,8 +464,8 @@ item.phase-fabric.name = 相織布 item.phase-fabric.description = 一種近乎無重量的物質,用於先進的電子設備和自修復技術。 item.surge-alloy.name = 波動合金 item.surge-alloy.description = 一種具有獨特電子特性的高級合金。 -item.biomatter.name = 生物物質 -item.biomatter.description = 一叢有機糊;用於轉化為油或作為基本燃料。 +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = 沙 item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和助熔劑。 item.blast-compound.name = 爆炸混合物 @@ -461,7 +477,7 @@ item.metaglass.description = 一種超級強硬玻璃混合物。廣泛用於液 item.scrap.name = 廢料 item.scrap.description = 舊結構和單位的遺留剩餘物。含有痕量的許多不同的金屬。 liquid.water.name = 水 -liquid.lava.name = 岩漿 +liquid.slag.name = Slag liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 mech.alpha-mech.name = 阿爾法 @@ -507,6 +523,11 @@ mech.ability = [LIGHT_GRAY]能力:{0} liquid.heatcapacity = [LIGHT_GRAY]熱容量:{0} liquid.viscosity = [LIGHT_GRAY]粘性:{0} liquid.temperature = [LIGHT_GRAY]温度:{0} +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster block.kiln.name = Kiln block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press @@ -516,22 +537,42 @@ block.spawn.name = 敵人生成 block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -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.craters.name = Craters +block.sand-water.name = Sand water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.stained-rocks.name = Stained Rocks +block.stained-stone.name = Stained Stone +block.stained-rocks-red.name = Stained Rocks Red +block.stained-stone-red.name = Stained Stone Red +block.stained-rocks-yellow.name = Stained Rocks Yellow +block.stained-stone-yellow.name = Stained Stone Yellow +block.stained-boulder.name = Stained Boulde +block.metal-floor.name = Metal Floor +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Metal Floor Damaged +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs block.copper-wall.name = 銅牆 block.copper-wall-large.name = 大型銅牆 block.titanium-wall.name = Titanium Wall @@ -543,7 +584,6 @@ block.thorium-wall-large.name = 大型釷牆 block.door.name = 門 block.door-large.name = 大門 block.duo.name = 雙炮 -block.scorch.name = 灼燒炮 block.hail.name = 冰雹炮 block.lancer.name = 藍瑟炮 block.conveyor.name = 輸送帶 @@ -555,17 +595,14 @@ block.sorter.name = 分類器 block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從左邊和右邊輸出。 block.overflow-gate.name = 溢流器 block.overflow-gate.description = 分離器和分配器的組合。如果前面被擋住,則向從左邊和右邊輸出物品。 -block.smelter.name = 冶煉廠 -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.spore-press.name = Spore Press block.separator.name = 分離機 -block.centrifuge.name = 離心機 block.power-node.name = 能量節點 block.power-node-large.name = 大型能量節點 block.surge-tower.name = Surge Tower @@ -605,7 +642,6 @@ 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 = 石油鑽井 @@ -626,7 +662,6 @@ 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 = 熱能泵 @@ -645,15 +680,14 @@ block.rtg-generator.name = 放射性同位素熱發電機 block.spectre.name = 幽靈炮 block.meltdown.name = 熔毀炮 block.container.name = 容器 -block.core.description = 遊戲中最重要的建築。 block.launch-pad.name = 發射台 +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = 起始的無人機。默認在核心產生。自動挖掘礦石、收集物品和修理方塊。 unit.phantom.name = 幻影無人機 @@ -698,8 +732,6 @@ tutorial.dagger = 連接能量節點至工廠。\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 = 沒有釷牆那麼強但會使不太強的子彈偏離。 @@ -729,8 +761,6 @@ 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 = 使用放射性的釷和大量的沙子以生產相織布。 @@ -739,12 +769,10 @@ 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.spore-press.description = Compresses spore pods into oil. block.separator.description = 將石頭暴露在水壓下以獲得石頭中的各種礦物質。 -block.centrifuge.description = 比分離器更有效,但建造更昂貴和需要能量以操作。 block.power-node.description = 將能量傳輸到連接的節點。最多可連接四個能量來源、接收或節點。節點將從任何相鄰方塊接收能量或向其供能量。 block.power-node-large.description = 範圍大於能量節點,最多可連接六個能量來源、接收或節點。 block.battery.description = 有能量剩餘時,存儲電力並在能量短缺時提供能量。 @@ -766,7 +794,6 @@ 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站在上面雙擊墊以使用它。 @@ -782,7 +809,6 @@ 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 = 高級的液體運輸方塊。使用能量將液體傳送到多個方塊外連接的相織管線。 @@ -796,13 +822,11 @@ block.thermal-pump.description = 終極泵。輸出速度是機械泵的三倍 block.router.description = 接受來自一個方向的物品並將它們平均輸出到最多3個其他方向。 用於將物品從一個來源分割為多個目標。 block.distributor.description = 高級的分配器,可將物品均分到最多7個其他方向。 block.bridge-conveyor.description = 高級的物品運輸方塊。允許跨過最多3個任何地形或建築物的方塊運輸物品。 -block.alpha-mech-pad.description = 當給予足夠能量時,將你的船重建為[accent]阿爾法[]機甲。 block.item-source.description = 不限地輸出物品。僅限沙盒。 block.liquid-source.description = 不限地輸出液體。僅限沙盒。 block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。 block.power-source.description = 不限地輸出能量。僅限沙盒。 block.power-void.description = 銷毀所有輸入的能量。僅限沙盒。 liquid.water.description = 常用於冷卻機器和廢物處理。 -liquid.lava.description = 可以轉換為[LIGHT_GRAY]石頭[]、用於發電或用作某些砲塔的彈藥。 liquid.oil.description = 可以燃燒、爆炸或用作冷卻劑。 liquid.cryofluid.description = 冷卻東西最有效的液體。 diff --git a/core/assets/maps/craters.mmap b/core/assets/maps/craters.mmap index b3a6e5432d..6b614e442a 100644 Binary files a/core/assets/maps/craters.mmap and b/core/assets/maps/craters.mmap differ diff --git a/core/assets/maps/frozenForest.mmap b/core/assets/maps/frozenForest.mmap index 130da8e7a2..6b8bfc55f9 100644 Binary files a/core/assets/maps/frozenForest.mmap and b/core/assets/maps/frozenForest.mmap differ diff --git a/core/assets/maps/impact0079.mmap b/core/assets/maps/impact0079.mmap index 0451d04b2a..0353276104 100644 Binary files a/core/assets/maps/impact0079.mmap and b/core/assets/maps/impact0079.mmap differ diff --git a/core/assets/maps/nuclearProductionComplex.mmap b/core/assets/maps/nuclearProductionComplex.mmap index ad90b921fd..dcffed46cc 100644 Binary files a/core/assets/maps/nuclearProductionComplex.mmap and b/core/assets/maps/nuclearProductionComplex.mmap differ diff --git a/core/assets/shaders/blockpreview.fragment b/core/assets/shaders/blockpreview.fragment deleted file mode 100644 index 0f571d632b..0000000000 --- a/core/assets/shaders/blockpreview.fragment +++ /dev/null @@ -1,40 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform vec2 u_uv; -uniform vec2 u_uv2; - -varying vec4 v_color; -varying vec2 v_texCoord; - -bool id(vec2 coords, vec4 base){ - vec4 target = texture2D(u_texture, coords); - return target.a < 0.1 || (coords.x < u_uv.x || coords.y < u_uv.y || coords.x > u_uv2.x || coords.y > u_uv2.y); -} - -bool cont(vec2 T, vec2 v){ - float step = 1.0; - vec4 base = texture2D(u_texture, T); - return base.a > 0.1 && - (id(T + vec2(0, step) * v, base) || id(T + vec2(0, -step) * v, base) || - id(T + vec2(step, 0) * v, base) || id(T + vec2(-step, 0) * v, base)); -} - -void main() { - vec2 t = v_texCoord.xy; - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - vec2 coord = t / v; - vec4 c = texture2D(u_texture, t); - - if(cont(t, v) ){ - gl_FragColor = u_color; - }else{ - gl_FragColor = vec4(0.0); - } -} diff --git a/core/assets/shaders/build.fragment b/core/assets/shaders/build.fragment deleted file mode 100644 index a5bd5c05f1..0000000000 --- a/core/assets/shaders/build.fragment +++ /dev/null @@ -1,46 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform float u_time; -uniform float u_progress; -uniform vec4 u_color; -uniform vec2 u_uv; -uniform vec2 u_uv2; -uniform vec2 u_texsize; - -varying vec4 v_color; -varying vec2 v_texCoord; - -float rand(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); -} - -bool id(vec4 v){ - return v.a > 0.1; -} - -void main() { - vec2 coords = (v_texCoord.xy - u_uv) / (u_uv2 - u_uv); - vec2 t = v_texCoord.xy; - - vec4 c = texture2D(u_texture, v_texCoord.xy); - - if(1.0-abs(coords.x - 0.5)*2.0 < 1.0-u_progress){ - c = vec4(0.0); - } - - if(c.a > 0.01){ - float f = abs(sin(coords.x*2.0 + u_time)); - if(f > 0.9 ) - f = 1.0; - else - f = 0.0; - c = mix(c, u_color, f * u_color.a); - } - - gl_FragColor = c * v_color; -} diff --git a/core/assets/shaders/cache.vertex b/core/assets/shaders/cache.vertex deleted file mode 100644 index 058b8888ef..0000000000 --- a/core/assets/shaders/cache.vertex +++ /dev/null @@ -1,14 +0,0 @@ -attribute vec4 a_position; -attribute vec4 a_color; -attribute vec2 a_texCoord0; -uniform mat4 u_projectionViewMatrix; -varying vec4 v_color; -varying vec2 v_texCoords; - -void main() -{ - v_color = a_color; - v_color.a = v_color.a * (255.0/254.0); - v_texCoords = a_texCoord0; - gl_Position = u_projectionViewMatrix * a_position; -} \ No newline at end of file diff --git a/core/assets/shaders/fullmix.fragment b/core/assets/shaders/fullmix.fragment deleted file mode 100644 index 00ff3997a2..0000000000 --- a/core/assets/shaders/fullmix.fragment +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; -uniform vec4 u_color; - -varying vec4 v_color; -varying vec2 v_texCoord; - -void main() { - - vec4 c = texture2D(u_texture, v_texCoord.xy); - - c = mix(c, vec4(v_color.r, v_color.g, v_color.b, c.a), v_color.a); - - gl_FragColor = c * vec4(v_color.rgb, 1.0); -} diff --git a/core/assets/shaders/inline-blocks.fragment b/core/assets/shaders/inline-blocks.fragment deleted file mode 100644 index e6b3c94b21..0000000000 --- a/core/assets/shaders/inline-blocks.fragment +++ /dev/null @@ -1,96 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform vec2 u_uv; -uniform vec2 u_uv2; -uniform float u_progress; -uniform float u_time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -const float chunk = 4.0; -const float start = 0.7; -const float end = 0.9; - -float rand(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); -} - -float round(float f){ - return float(int(f / chunk)) * chunk; -} - -bool id(vec2 coords, vec4 base, float basediff){ - vec4 target = texture2D(u_texture, coords); - return target.a < 0.1 || (coords.x < u_uv.x || coords.y < u_uv.y || coords.x > u_uv2.x || coords.y > u_uv2.y); -} - -bool cont(vec2 T, vec2 v, float basediff){ - float step = 1.0; - vec4 base = texture2D(u_texture, T); - return base.a > 0.1 && - (id(T + vec2(0, step) * v, base, basediff) || id(T + vec2(0, -step) * v, base, basediff) || - id(T + vec2(step, 0) * v, base, basediff) || id(T + vec2(-step, 0) * v, base, basediff)); -} - -bool complete(vec2 coords){ - vec2 rc = vec2(round(coords.x), round(coords.y)); - float r = clamp(rand(rc) + u_progress, 0.0, 1.0); - float fr = (r-start)*(1.0/(end-start)); - - vec2 next = rc + chunk/2.0; - float rdst = max(abs(coords.x - next.x), abs(coords.y - next.y)); - return rdst / (chunk/2.0) < fr; -} - -void main() { - - vec2 t = v_texCoord.xy; - - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - - bool any = false; - - vec2 coords = (v_texCoord-u_uv) / v; - - - float value = coords.x + coords.y; - - vec4 color = texture2D(u_texture, t); - vec2 rc = vec2(round(coords.x), round(coords.y)); - vec2 center = ((u_uv + u_uv2)/2.0 - u_uv) /v; - - float r = clamp(rand(rc) + u_progress, 0.0, 1.0); - - const float scl = 10.0; - float dst = (abs(center.x - coords.x) + abs(center.y - coords.y)) / 2.0; - - if(dst - 1.0 < u_progress * (center.x) && dst> u_progress * (center.x) && color.a > 0.1){ - gl_FragColor = u_color; - }else if(r > end){ - gl_FragColor = color; - }else if((cont(t, v, 100.0) && mod(u_time / 1.5 + value, 20.0) < 5.0 && color.a > 0.1) || - (complete(coords) && (!complete(coords + vec2(1.0, 0.0)) || !complete(coords + vec2(-1.0, 0.0)) || !complete(coords + vec2(0.0, 1.0)) - || !complete(coords + vec2(0.0, -1.0))))){ - gl_FragColor = u_color; - }else if(r > start && color.a > 0.1){ - float fr = (r-start)*(1.0/(end-start)); - - vec2 next = rc + chunk/2.0; - float rdst = max(abs(coords.x - next.x), abs(coords.y - next.y)); - if(rdst / (chunk/2.0) < fr){ - gl_FragColor = u_color; - }else{ - gl_FragColor = vec4(0.0); - } - }else{ - gl_FragColor = vec4(0.0); - } -} diff --git a/core/assets/shaders/inline-contour.fragment b/core/assets/shaders/inline-contour.fragment deleted file mode 100644 index b7b201d373..0000000000 --- a/core/assets/shaders/inline-contour.fragment +++ /dev/null @@ -1,63 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform vec2 u_uv; -uniform vec2 u_uv2; -uniform float u_progress; -uniform float u_time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -float diff(vec4 target, vec4 base){ - return (max(target.a / base.a, max(target.r / base.r, max(target.g / base.g, target.b / base.b))) - - min (target.a / base.a, min(target.r / base.r, min(target.g / base.g, target.b / base.b)))) * 4.0; -} - -bool id(vec2 coords, vec4 base, float basediff){ - vec4 target = texture2D(u_texture, coords); - return (diff(target, base)) > basediff - basediff*u_progress - || (basediff < 5.0 && (coords.x < u_uv.x || coords.y < u_uv.y || coords.x > u_uv2.x || coords.y > u_uv2.y)); -} - -bool cont(vec2 T, vec2 v, float basediff){ - float step = 1.0; - vec4 base = texture2D(u_texture, T); - return base.a > 0.1 && - (id(T + vec2(0, step) * v, base, basediff) || id(T + vec2(0, -step) * v, base, basediff) || - id(T + vec2(step, 0) * v, base, basediff) || id(T + vec2(-step, 0) * v, base, basediff)); -} - -float rand(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); -} - -void main() { - - vec2 t = v_texCoord.xy; - - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - vec2 coords = (v_texCoord-u_uv) / v; - float value = coords.x + coords.y; - - vec4 color = texture2D(u_texture, t); - - vec2 center = ((u_uv + u_uv2)/2.0 - u_uv) /v; - float dst = (abs(center.x - coords.x) + abs(center.y - coords.y)) / 2.0; - - if(dst - 1.0 < u_progress * (center.x) && dst> u_progress * (center.x) && color.a > 0.1){ - gl_FragColor = u_color; - }else if(cont(t, v, 6.0)){ - gl_FragColor = color; - }else if(cont(t, v, 3.0) && color.a > 0.1){ - gl_FragColor = u_color; - }else{ - gl_FragColor = vec4(0.0); - } -} diff --git a/core/assets/shaders/inline-noise.fragment b/core/assets/shaders/inline-noise.fragment deleted file mode 100644 index f7167d1dcf..0000000000 --- a/core/assets/shaders/inline-noise.fragment +++ /dev/null @@ -1,111 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform vec2 u_uv; -uniform vec2 u_uv2; -uniform float u_progress; -uniform float u_time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} -vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} - -float snoise(vec3 v){ - const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; - const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); - -// First corner - vec3 i = floor(v + dot(v, C.yyy) ); - vec3 x0 = v - i + dot(i, C.xxx) ; - -// Other corners - vec3 g = step(x0.yzx, x0.xyz); - vec3 l = 1.0 - g; - vec3 i1 = min( g.xyz, l.zxy ); - vec3 i2 = max( g.xyz, l.zxy ); - - // x0 = x0 - 0. + 0.0 * C - vec3 x1 = x0 - i1 + 1.0 * C.xxx; - vec3 x2 = x0 - i2 + 2.0 * C.xxx; - vec3 x3 = x0 - 1. + 3.0 * C.xxx; - -// Permutations - i = mod(i, 289.0 ); - vec4 p = permute( permute( permute( - i.z + vec4(0.0, i1.z, i2.z, 1.0 )) - + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) - + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); - -// Gradients -// ( N*N points uniformly over a square, mapped onto an octahedron.) - float n_ = 1.0/7.0; // N=7 - vec3 ns = n_ * D.wyz - D.xzx; - - vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N) - - vec4 x_ = floor(j * ns.z); - vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) - - vec4 x = x_ *ns.x + ns.yyyy; - vec4 y = y_ *ns.x + ns.yyyy; - vec4 h = 1.0 - abs(x) - abs(y); - - vec4 b0 = vec4( x.xy, y.xy ); - vec4 b1 = vec4( x.zw, y.zw ); - - vec4 s0 = floor(b0)*2.0 + 1.0; - vec4 s1 = floor(b1)*2.0 + 1.0; - vec4 sh = -step(h, vec4(0.0)); - - vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; - vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; - - vec3 p0 = vec3(a0.xy,h.x); - vec3 p1 = vec3(a0.zw,h.y); - vec3 p2 = vec3(a1.xy,h.z); - vec3 p3 = vec3(a1.zw,h.w); - -//Normalise gradients - vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - -// Mix final noise value - vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); - m = m * m; - return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), - dot(p2,x2), dot(p3,x3) ) ); -} - -void main() { - - vec2 t = v_texCoord.xy; - - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - - vec2 coords = (v_texCoord-u_uv) / v; - - const float scl = 10.0; - float result = (snoise(vec3(coords.x / scl, coords.y / scl, u_time/400000.0)) + 1.0)/2.0; - - vec4 color = texture2D(u_texture, t); - - if(result < u_progress){ - gl_FragColor = color; - }else if(result < u_progress*2.0 && color.a > 0.1){ - gl_FragColor = u_color; - }else{ - gl_FragColor = vec4(0.0); - } - -} diff --git a/core/assets/shaders/inline.fragment b/core/assets/shaders/inline.fragment deleted file mode 100644 index d5d2f06f5b..0000000000 --- a/core/assets/shaders/inline.fragment +++ /dev/null @@ -1,184 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform vec2 u_uv; -uniform vec2 u_uv2; -uniform float u_progress; -uniform float u_time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -const float chunk = 4.0; - -bool id(vec2 coords, vec4 base, float basediff){ - vec4 target = texture2D(u_texture, coords); - return target.a < 0.1 || (coords.x < u_uv.x || coords.y < u_uv.y || coords.x > u_uv2.x || coords.y > u_uv2.y); -} - -bool cont(vec2 T, vec2 v, float basediff){ - float step = 1.0; - vec4 base = texture2D(u_texture, T); - return base.a > 0.1 && - (id(T + vec2(0, step) * v, base, basediff) || id(T + vec2(0, -step) * v, base, basediff) || - id(T + vec2(step, 0) * v, base, basediff) || id(T + vec2(-step, 0) * v, base, basediff)); -} - -float rand(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); -} - -float round(float f){ - return float(int(f / chunk)) * chunk; -} - -vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} -vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} - -float snoise(vec3 v){ - const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; - const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); - -// First corner - vec3 i = floor(v + dot(v, C.yyy) ); - vec3 x0 = v - i + dot(i, C.xxx) ; - -// Other corners - vec3 g = step(x0.yzx, x0.xyz); - vec3 l = 1.0 - g; - vec3 i1 = min( g.xyz, l.zxy ); - vec3 i2 = max( g.xyz, l.zxy ); - - // x0 = x0 - 0. + 0.0 * C - vec3 x1 = x0 - i1 + 1.0 * C.xxx; - vec3 x2 = x0 - i2 + 2.0 * C.xxx; - vec3 x3 = x0 - 1. + 3.0 * C.xxx; - -// Permutations - i = mod(i, 289.0 ); - vec4 p = permute( permute( permute( - i.z + vec4(0.0, i1.z, i2.z, 1.0 )) - + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) - + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); - -// Gradients -// ( N*N points uniformly over a square, mapped onto an octahedron.) - float n_ = 1.0/7.0; // N=7 - vec3 ns = n_ * D.wyz - D.xzx; - - vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N) - - vec4 x_ = floor(j * ns.z); - vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) - - vec4 x = x_ *ns.x + ns.yyyy; - vec4 y = y_ *ns.x + ns.yyyy; - vec4 h = 1.0 - abs(x) - abs(y); - - vec4 b0 = vec4( x.xy, y.xy ); - vec4 b1 = vec4( x.zw, y.zw ); - - vec4 s0 = floor(b0)*2.0 + 1.0; - vec4 s1 = floor(b1)*2.0 + 1.0; - vec4 sh = -step(h, vec4(0.0)); - - vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; - vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; - - vec3 p0 = vec3(a0.xy,h.x); - vec3 p1 = vec3(a0.zw,h.y); - vec3 p2 = vec3(a1.xy,h.z); - vec3 p3 = vec3(a1.zw,h.w); - -//Normalise gradients - vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - -// Mix final noise value - vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); - m = m * m; - return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), - dot(p2,x2), dot(p3,x3) ) ); -} - -void main() { - - vec2 t = v_texCoord.xy; - - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - - bool any = false; - - vec2 coords = (v_texCoord-u_uv) / v; - - /* - const float scl = 10.0; - float result = (snoise(vec3(coords.x / scl, coords.y / scl, u_time/400000.0)) + 1.0)/2.0; - - vec4 color = texture2D(u_texture, t); - - if(result < u_progress){ - gl_FragColor = color; - }else if(result < u_progress*2.0 && color.a > 0.1){ - gl_FragColor = u_color; - }else{ - gl_FragColor = vec4(0.0); - }*/ - - - float value = coords.x + coords.y; - - vec4 color = texture2D(u_texture, t); - vec2 rc = vec2(round(coords.x), round(coords.y)); - vec2 center = ((u_uv + u_uv2)/2.0 - u_uv) /v; - - float r = clamp(rand(rc) + u_progress, 0.0, 1.0); - - const float start = 0.7; - const float end = 0.9; - - const float scl = 10.0; - float result = snoise(vec3(coords.x / scl, coords.y / scl, u_time/400.0))*2.0; - float dst = (abs(center.x - coords.x) + abs(center.y - coords.y)) / 2.0; - - if(dst - 1.0 < u_progress * (center.x) && dst> u_progress * (center.x) && color.a > 0.1){ - gl_FragColor = u_color; - }else if(r > end){ - gl_FragColor = color; - }else if(cont(t, v, 100.0) && mod(u_time / 1.5 + value, 20.0) < 5.0 && color.a > 0.1){ - gl_FragColor = u_color; - }else if(r > start && color.a > 0.1){ - float fr = (r-start)*(1.0/(end-start)); - - vec2 next = rc + chunk/2.0; - float rdst = max(abs(coords.x - next.x), abs(coords.y - next.y)) + result; - if(rdst / (chunk/2.0) < fr){ - gl_FragColor = u_color; - }else{ - gl_FragColor = vec4(0.0); - } - }else{ - gl_FragColor = vec4(0.0); - } -/* - if(mod(u_time / 1.5 + value, 30.0) < 15.0 && color.a > 0.1){ - gl_FragColor = u_color; - }else if(cont(t, v, 3.0)){ - gl_FragColor = color; - }else if(cont(t, v, 1.5)){ - gl_FragColor = u_color; - //}else if(mix(rand(vec2(dst)) * u_progress, 1.0, u_progress) > 0.5){ - // gl_FragColor = texture2D(u_texture, T); - }else{ - gl_FragColor = vec4(0.0); - }*/ -} diff --git a/core/assets/shaders/lava.fragment b/core/assets/shaders/lava.fragment deleted file mode 100644 index d7f3b3235e..0000000000 --- a/core/assets/shaders/lava.fragment +++ /dev/null @@ -1,91 +0,0 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif - -#define s2 vec4(255.0, 165.0, 0.0, 255.0) / 255.0 -#define s1 vec4(255.0, 121.0, 62.0, 255.0) / 255.0 - -uniform sampler2D u_texture; - -uniform vec2 camerapos; -uniform vec2 screensize; -uniform float time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -float round(float num, float f){ - return float(int(num / f)) * f; -} - -vec3 permute(vec3 x) { return mod(((x*34.0)+1.0)*x, 289.0); } - -float snoise(vec2 v){ - const vec4 C = vec4(0.211324865405187, 0.366025403784439, - -0.577350269189626, 0.024390243902439); - vec2 i = floor(v + dot(v, C.yy) ); - vec2 x0 = v - i + dot(i, C.xx); - vec2 i1; - i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); - vec4 x12 = x0.xyxy + C.xxzz; - x12.xy -= i1; - i = mod(i, 289.0); - vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) - + i.x + vec3(0.0, i1.x, 1.0 )); - vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), - dot(x12.zw,x12.zw)), 0.0); - m = m*m ; - m = m*m ; - vec3 x = 2.0 * fract(p * C.www) - 1.0; - vec3 h = abs(x) - 0.5; - vec3 ox = floor(x + 0.5); - vec3 a0 = x - ox; - m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); - vec3 g; - g.x = a0.x * x0.x + h.x * x0.y; - g.yz = a0.yz * x12.xz + h.yz * x12.yw; - return 130.0 * dot(m, g); -} - -void main() { - - vec2 c = v_texCoord.xy; - vec4 color = texture2D(u_texture, c); - - vec2 v = vec2(1.0/screensize.x, 1.0/screensize.y); - ivec2 icoords = ivec2(int(c.x / v.x + camerapos.x), int(c.y / v.y + camerapos.y)); - vec2 coords = vec2(float(icoords.x), float(icoords.y)); - - float stime = time / 5.0; - - float mscl = 30.0; - float mth = 5.0; - - //if there's something actually there - if(color.r > 0.01){ - vec4 old = color; - color = texture2D(u_texture, c + vec2(sin(stime/3.0 + coords.y/0.75) * v.x, 0.0)) * vec4(0.9, 0.9, 1, 1.0); - color.a = 1.0; - - if(color.r < 0.01){ - color = old; - } - - const float bs = 1.0; - - float n1 = snoise(coords / (20.0 * bs) + vec2(time) / 250.0); - float n2 = snoise((coords + vec2(632.0)) / (9.0 * bs) + vec2(0.0, -time) / 220.0); - float n3 = snoise((coords + vec2(2233.0)) / (15.0 * bs) + vec2(time, 0.0) / 290.0); - - float r = (n1 + n2 + n3) / 3.0; - - if(r < -0.5){ - color = s2; - }else if(r < -0.2){ - color = s1; - } - } - - gl_FragColor = color; -} diff --git a/core/assets/shaders/mix.fragment b/core/assets/shaders/mix.fragment index 4a9ea9c64b..92c19f24a6 100644 --- a/core/assets/shaders/mix.fragment +++ b/core/assets/shaders/mix.fragment @@ -13,7 +13,7 @@ void main() { vec4 c = texture2D(u_texture, v_texCoord.xy); - c = mix(c, vec4(u_color.r, u_color.g, u_color.b, c.a), v_color.a); + c = mix(c, vec4(u_color.rgb, c.a), v_color.a); gl_FragColor = c * vec4(v_color.rgb, 1.0); } diff --git a/core/assets/shaders/oil.fragment b/core/assets/shaders/oil.fragment deleted file mode 100644 index 52701e09a2..0000000000 --- a/core/assets/shaders/oil.fragment +++ /dev/null @@ -1,86 +0,0 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif - -#define s1 vec4(63.0, 63.0, 63.0, 255.0) / 255.0 - -uniform sampler2D u_texture; - -uniform vec2 camerapos; -uniform vec2 screensize; -uniform float time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -float round(float num, float f){ - return float(int(num / f)) * f; -} - -vec3 permute(vec3 x) { return mod(((x*34.0)+1.0)*x, 289.0); } - -float snoise(vec2 v){ - const vec4 C = vec4(0.211324865405187, 0.366025403784439, - -0.577350269189626, 0.024390243902439); - vec2 i = floor(v + dot(v, C.yy) ); - vec2 x0 = v - i + dot(i, C.xx); - vec2 i1; - i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); - vec4 x12 = x0.xyxy + C.xxzz; - x12.xy -= i1; - i = mod(i, 289.0); - vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) - + i.x + vec3(0.0, i1.x, 1.0 )); - vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), - dot(x12.zw,x12.zw)), 0.0); - m = m*m ; - m = m*m ; - vec3 x = 2.0 * fract(p * C.www) - 1.0; - vec3 h = abs(x) - 0.5; - vec3 ox = floor(x + 0.5); - vec3 a0 = x - ox; - m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); - vec3 g; - g.x = a0.x * x0.x + h.x * x0.y; - g.yz = a0.yz * x12.xz + h.yz * x12.yw; - return 130.0 * dot(m, g); -} - -void main() { - - vec2 c = v_texCoord.xy; - vec4 color = texture2D(u_texture, c); - - vec2 v = vec2(1.0/screensize.x, 1.0/screensize.y); - ivec2 icoords = ivec2(int(c.x / v.x + camerapos.x), int(c.y / v.y + camerapos.y)); - vec2 coords = vec2(float(icoords.x), float(icoords.y)); - - float stime = time / 5.0; - - float mscl = 30.0; - float mth = 5.0; - - //if there's something actually there - if(color.r > 0.01){ - vec4 old = color; - color = texture2D(u_texture, c + vec2(sin(stime/3.0 + coords.y/0.75) * v.x, 0.0)) * vec4(0.9, 0.9, 1, 1.0); - color.a = 1.0; - - if(color.r < 0.01){ - color = old; - } - - float n1 = snoise(coords / 22.0 + vec2(-time) / 540.0); - float n2 = snoise((coords + vec2(632.0)) / 8.0 + vec2(0.0, time) / 510.0); - - float r = (n1 + n2) / 2.0; - - if(r < -0.3 && r > -0.6){ - color *= 1.4; - color.a = 1.0; - } - } - - gl_FragColor = color; -} diff --git a/core/assets/shaders/outline.fragment b/core/assets/shaders/outline.fragment deleted file mode 100644 index 09a9a4e041..0000000000 --- a/core/assets/shaders/outline.fragment +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -#define SPACE 2.0 - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform float u_scl; - -varying vec4 v_color; -varying vec2 v_texCoord; - -void main() { - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - - vec4 c = texture2D(u_texture, v_texCoord.xy); - float spacing = SPACE * u_scl; - - gl_FragColor = mix(c * v_color, u_color, - (1.0-step(0.001, texture2D(u_texture, v_texCoord.xy).a)) * - step(0.001, - //cardinals - texture2D(u_texture, v_texCoord.xy + vec2(0, spacing) * v).a + - texture2D(u_texture, v_texCoord.xy + vec2(0, -spacing) * v).a + - texture2D(u_texture, v_texCoord.xy + vec2(spacing, 0) * v).a + - texture2D(u_texture, v_texCoord.xy + vec2(-spacing, 0) * v).a + - - //cardinal edges - texture2D(u_texture, v_texCoord.xy + vec2(spacing, spacing) * v).a + - texture2D(u_texture, v_texCoord.xy + vec2(spacing, -spacing) * v).a + - texture2D(u_texture, v_texCoord.xy + vec2(-spacing, spacing) * v).a + - texture2D(u_texture, v_texCoord.xy + vec2(-spacing, -spacing) * v).a + - - //cardinals * 2 - texture2D(u_texture, v_texCoord.xy + vec2(0, spacing) * v*2.0).a + - texture2D(u_texture, v_texCoord.xy + vec2(0, -spacing) * v*2.0).a + - texture2D(u_texture, v_texCoord.xy + vec2(spacing, 0) * v*2.0).a + - texture2D(u_texture, v_texCoord.xy + vec2(-spacing, 0) * v*2.0).a - )); -} diff --git a/core/assets/shaders/pattern.fragment b/core/assets/shaders/pattern.fragment deleted file mode 100644 index 4a25d505b3..0000000000 --- a/core/assets/shaders/pattern.fragment +++ /dev/null @@ -1,60 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec4 u_color; -uniform vec2 u_texsize; -uniform float u_time; -uniform vec2 u_offset; - -varying vec4 v_color; -varying vec2 v_texCoord; - -void main() { - - vec2 T = v_texCoord.xy; - vec2 coords = (T * u_texsize) + u_offset; - - float si = 1.0 + sin(u_time / 20.0 /*+ (coords.x + coords.y) / 30.0*/) / 8.0; - - vec4 color = texture2D(u_texture, T) * vec4(si, si, si, 1.0); - - vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - - bool any = false; - - float thickness = 1.0; - float step = 1.0; - - if(texture2D(u_texture, T).a < 0.1 && - (texture2D(u_texture, T + vec2(0, step) * v).a > 0.1 || texture2D(u_texture, T + vec2(0, -step) * v).a > 0.1 || - texture2D(u_texture, T + vec2(step, 0) * v).a > 0.1 || texture2D(u_texture, T + vec2(-step, 0) * v).a > 0.1)) - any = true; - - if(any){ - gl_FragColor = u_color * vec4(si, si, si, 1.0); - }else{ - - //coords.x = float(int(coords.x)); - if(color.a > 0.1){ - float x = coords.x; - float y = coords.y; - float time = u_time; - float w = 1.0; - float h = 1.0; - float f1 = sin(2.0*time+(y/4.0*cos(time/3.0)+(x/2.0)-w/4.0)*((y/3.0)-h/4.0)/w); - float f2 = -2.0*cos(11.0*time/9.0-11.0*pow(y, x)/9.0); - - color.r = (f2 + f1) / 4.0*abs(cos(2.0*(x-y)/w + time)); - color.g = (f2 + f1) /(3.0 + color.r); - color.b = (f2 + f1) /(2.5 + color.g); - - - } - - gl_FragColor = color; - } -} diff --git a/core/assets/shaders/shadow.fragment b/core/assets/shaders/shadow.fragment index b1d73a8b1f..7346d78142 100644 --- a/core/assets/shaders/shadow.fragment +++ b/core/assets/shaders/shadow.fragment @@ -41,4 +41,4 @@ void main() { texture2D(u_texture, v_texCoord.xy + vec2(spacing, 0) * v*2.0).a + texture2D(u_texture, v_texCoord.xy + vec2(-spacing, 0) * v*2.0).a )); -} +} \ No newline at end of file diff --git a/core/assets/shaders/space.fragment b/core/assets/shaders/space.fragment deleted file mode 100644 index f2522b4fca..0000000000 --- a/core/assets/shaders/space.fragment +++ /dev/null @@ -1,77 +0,0 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif - -#define s1 vec4(63.0, 63.0, 63.0, 255.0) / 255.0 - -uniform sampler2D u_texture; - -uniform vec2 u_center; -uniform vec2 camerapos; -uniform vec2 screensize; -uniform float time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -float round(float num, float f){ - return float(int(num / f)) * f; -} - -vec3 permute(vec3 x) { return mod(((x*34.0)+1.0)*x, 289.0); } - -float snoise(vec2 v){ - const vec4 C = vec4(0.211324865405187, 0.366025403784439, - -0.577350269189626, 0.024390243902439); - vec2 i = floor(v + dot(v, C.yy) ); - vec2 x0 = v - i + dot(i, C.xx); - vec2 i1; - i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); - vec4 x12 = x0.xyxy + C.xxzz; - x12.xy -= i1; - i = mod(i, 289.0); - vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) - + i.x + vec3(0.0, i1.x, 1.0 )); - vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), - dot(x12.zw,x12.zw)), 0.0); - m = m*m ; - m = m*m ; - vec3 x = 2.0 * fract(p * C.www) - 1.0; - vec3 h = abs(x) - 0.5; - vec3 ox = floor(x + 0.5); - vec3 a0 = x - ox; - m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); - vec3 g; - g.x = a0.x * x0.x + h.x * x0.y; - g.yz = a0.yz * x12.xz + h.yz * x12.yw; - return 130.0 * dot(m, g); -} - -void main() { - - vec2 c = v_texCoord.xy; - vec4 color = texture2D(u_texture, c); - - vec2 v = vec2(1.0/screensize.x, 1.0/screensize.y); - ivec2 icoords = ivec2(int(c.x / v.x + camerapos.x), int(c.y / v.y + camerapos.y)); - vec2 coords = vec2(float(icoords.x), float(icoords.y)); - - float stime = time / 5.0; - - float mscl = 30.0; - float mth = 5.0; - - //if there's something actually there - if(color.a > 0.01){ - vec2 diff = camerapos + screensize/2.0 - u_center; - - float dst = mod((distance(coords, camerapos + screensize/2.0 - diff/5.0) + time * 2.0 + snoise(coords / 100.0) * 10.0), 150.0); - - if(dst < 40.0){ - color = vec4(vec3(0.2), 1.0); - } - } - - gl_FragColor = color; -} diff --git a/core/assets/shaders/space2.fragment b/core/assets/shaders/space2.fragment deleted file mode 100644 index 5b9ea44853..0000000000 --- a/core/assets/shaders/space2.fragment +++ /dev/null @@ -1,88 +0,0 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -uniform vec2 u_center; -uniform vec2 camerapos; -uniform vec2 screensize; -uniform float time; - -varying vec4 v_color; -varying vec2 v_texCoord; - -const float tau = 6.28318530717958647692; -const float tscl = 0.4; - -// Gamma correction -#define GAMMA (2.2) - -vec3 ToLinear(vec3 col ){ - // simulate a monitor, converting colour values into light values - return pow( col, vec3(GAMMA) ); -} - -vec3 ToGamma(vec3 col ){ - // convert back into colour values, so the correct light will come out of the monitor - return pow( col, vec3(1.0/GAMMA) ); -} - -float srand(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); -} - -vec4 Noise(ivec2 x ){ - return vec4(srand((vec2(x)+0.5)/256.0)); -} - -void main(){ - vec4 resultc = texture2D(u_texture, v_texCoord.xy); - - if(resultc.a > 0.0){ - - vec2 coords = v_texCoord.xy*screensize; - - vec3 ray; - ray.xy = 2.0*(coords-screensize.xy*.5)/screensize.x; - ray.z = 1.0; - - float literallyzero = 0.000000000001; - - float offset = time/60.0*.5 * tscl + camerapos.x * u_center.x * resultc.r * literallyzero; - float speed2 = 0.3; - float speed = speed2+.1; - offset += .1; - offset *= 2.0; - - vec3 col = vec3(0.0); - - vec3 stp = ray/max(abs(ray.x),abs(ray.y)); - - vec3 pos = 2.0*stp+.5; - for ( int i=0; i < 20; i++){ - float z = Noise(ivec2(pos.xy)).x; - z = fract(z-offset); - float d = 50.0*z-pos.z; - float w = pow(max(0.0,1.0-8.0*length(fract(pos.xy)-.5)),2.0); - vec3 c = max(vec3(0),vec3(1.0-abs(d+speed2*.5)/speed,1.0-abs(d)/speed,1.0-abs(d-speed2*.5)/speed)); - col += 1.5*(1.0-z)*c*w; - pos += stp; - } - - vec3 color = ToGamma(col); - - if(color.r > 0.3 && color.b > 0.3){ - color = vec3(240.0, 245.0, 255.0) / 255.0; - }else{ - color = vec3(0.0); - } - - gl_FragColor = vec4(color,1.0); - }else{ - gl_FragColor = vec4(0.0); - } - - -} diff --git a/core/assets/shaders/unitbuild.fragment b/core/assets/shaders/unitbuild.fragment new file mode 100644 index 0000000000..35a956c35a --- /dev/null +++ b/core/assets/shaders/unitbuild.fragment @@ -0,0 +1,60 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +#define step 3.0 + +uniform sampler2D u_texture; + +uniform float u_time; +uniform float u_progress; +uniform vec4 u_color; +uniform vec2 u_uv; +uniform vec2 u_uv2; +uniform vec2 u_texsize; + +varying vec4 v_color; +varying vec2 v_texCoord; + +bool id(vec4 v){ + return v.a > 0.1; +} + +bool id(vec2 coords, vec4 base){ + vec4 target = texture2D(u_texture, coords); + return target.a < 0.1 || (coords.x < u_uv.x || coords.y < u_uv.y || coords.x > u_uv2.x || coords.y > u_uv2.y); +} + +bool cont(vec2 T, vec2 v){ + vec4 base = texture2D(u_texture, T); + return base.a > 0.1 && + (id(T + vec2(0, step) * v, base) || id(T + vec2(0, -step) * v, base) || + id(T + vec2(step, 0) * v, base) || id(T + vec2(-step, 0) * v, base) || + id(T + vec2(step, step) * v, base) || id(T + vec2(-step, -step) * v, base) || + id(T + vec2(step, -step) * v, base) || id(T + vec2(-step, step) * v, base)); +} + +void main() { + vec2 coords = (v_texCoord.xy - u_uv) / (u_uv2 - u_uv); + vec2 t = v_texCoord.xy; + vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); + + vec4 c = texture2D(u_texture, v_texCoord.xy); + bool outl = cont(t, v); + + if(1.0-abs(coords.x - 0.5)*2.0 < 1.0-u_progress && !outl){ + c = vec4(0.0); + } + + if(c.a > 0.01){ + float f = abs(sin(coords.x*2.0 + u_time)); + if(f > 0.9 || outl) + f = 1.0; + else + f = 0.0; + c = mix(c, u_color, f * u_color.a); + } + + gl_FragColor = c * v_color; +} diff --git a/core/assets/shaders/water.fragment b/core/assets/shaders/water.fragment deleted file mode 100644 index 172725177b..0000000000 --- a/core/assets/shaders/water.fragment +++ /dev/null @@ -1,18 +0,0 @@ -#ifdef GL_ES -precision mediump float; -#endif -varying vec4 v_color; -varying vec2 v_texCoords; - -uniform sampler2D u_texture; -uniform float u_time; - -float round(float f, float v){ - return float(int(f / v)) * v; -} - -void main(){ - vec2 r = v_texCoords.xy; - vec4 c = v_color * texture2D(u_texture, v_texCoords.xy); - gl_FragColor = c * vec4(vec3(round(1.0 + sin((r.x + r.y) * 404.0 + u_time / 20.0) / 10.0, 0.05)), 1.0); -} \ No newline at end of file diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 94b5e2d2a9..6642bd33d3 100644 Binary files a/core/assets/sprites/block_colors.png and b/core/assets/sprites/block_colors.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index b704a47f15..eb58551b70 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -20,350 +20,350 @@ force-projector-top index: -1 mend-projector rotate: false - xy: 771, 807 + xy: 771, 873 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 705, 741 + xy: 705, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 771, 741 + xy: 771, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 705, 675 + xy: 705, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1391, 205 + xy: 1369, 318 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 1213, 480 + xy: 1263, 510 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1247, 477 + xy: 1275, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1281, 477 + xy: 1275, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1017, 206 + xy: 1615, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1017, 172 + xy: 579, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1055, 274 + xy: 613, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1051, 240 + xy: 647, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1051, 206 + xy: 571, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1051, 172 + xy: 571, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1063, 308 + xy: 605, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1089, 274 + xy: 571, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1085, 240 + xy: 605, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1085, 206 + xy: 639, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1085, 172 + xy: 605, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 745, 143 + xy: 639, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 779, 143 + xy: 639, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 813, 143 + xy: 1297, 569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 847, 143 + xy: 1331, 569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 881, 143 + xy: 1297, 535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1245, 362 + xy: 1331, 535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1067, 346 + xy: 1297, 501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1101, 333 + xy: 1331, 501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1135, 333 + xy: 1365, 556 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 1531, 275 + xy: 1913, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1565, 275 + xy: 1947, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1599, 275 + xy: 1913, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1633, 275 + xy: 1947, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1667, 275 + xy: 1981, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1493, 241 + xy: 2015, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1493, 207 + xy: 1947, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1527, 241 + xy: 1981, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1493, 173 + xy: 2015, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1527, 207 + xy: 1981, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1561, 241 + xy: 2015, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1493, 139 + xy: 1641, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1527, 173 + xy: 1675, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1561, 207 + xy: 1709, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1595, 241 + xy: 1743, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1493, 105 + xy: 1777, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1527, 139 + xy: 1811, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1561, 173 + xy: 1845, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1595, 207 + xy: 1879, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1629, 241 + xy: 1913, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 389, 45 + xy: 733, 1005 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 junction rotate: false - xy: 1869, 1021 + xy: 1739, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -377,49 +377,49 @@ mass-driver-base index: -1 overflow-gate rotate: false - xy: 657, 105 + xy: 1759, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 691, 105 + xy: 1861, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 691, 71 + xy: 1895, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 691, 37 + xy: 1895, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 589, 3 + xy: 1929, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1283, 409 + xy: 1199, 340 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1415, 391 + xy: 1471, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -482,21 +482,21 @@ laser-drill-top index: -1 mechanical-drill rotate: false - xy: 639, 741 + xy: 639, 873 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 705, 807 + xy: 705, 873 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 639, 675 + xy: 639, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -531,182 +531,182 @@ oil-extractor-top index: -1 pneumatic-drill rotate: false - xy: 1509, 1297 + xy: 421, 175 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 1641, 1297 + xy: 813, 543 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 1707, 1297 + xy: 847, 477 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 1459, 1091 + xy: 969, 707 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 1459, 959 + xy: 879, 641 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 1393, 893 + xy: 879, 575 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 1459, 893 + xy: 945, 641 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 char1 rotate: false - xy: 1315, 477 + xy: 1309, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 1349, 477 + xy: 1309, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 1383, 493 + xy: 1332, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliffs1 rotate: false - xy: 1417, 493 + xy: 1343, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal1 rotate: false - xy: 1383, 459 + xy: 1343, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 1417, 459 + xy: 1366, 692 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 1215, 396 + xy: 1400, 692 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 1169, 328 + xy: 1399, 556 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 1203, 328 + xy: 1365, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 1237, 328 + xy: 1399, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 1157, 294 + xy: 1501, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 1191, 294 + xy: 1535, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 1225, 294 + xy: 1569, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 1157, 260 + xy: 1603, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 1191, 260 + xy: 1535, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone1 rotate: false - xy: 1191, 260 + xy: 1535, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 1225, 260 + xy: 1569, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 1225, 260 + xy: 1569, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 1221, 226 + xy: 1467, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -727,21 +727,21 @@ differential-generator-top index: -1 dunerocks-large rotate: false - xy: 931, 971 + xy: 713, 939 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks1 rotate: false - xy: 1255, 226 + xy: 1637, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dunerocks2 rotate: false - xy: 1255, 192 + xy: 1651, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -762,63 +762,63 @@ edge-stencil-smooth index: -1 grass1 rotate: false - xy: 1323, 158 + xy: 1683, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 983, 139 + xy: 1717, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 1017, 138 + xy: 1751, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone1 rotate: false - xy: 1119, 129 + xy: 1853, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone2 rotate: false - xy: 1153, 124 + xy: 1887, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone3 rotate: false - xy: 1187, 124 + xy: 1921, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 1221, 124 + xy: 1957, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 1255, 124 + xy: 1955, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 1289, 124 + xy: 1671, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -832,574 +832,574 @@ ice-edge index: -1 ice-snow1 rotate: false - xy: 1699, 1063 + xy: 1705, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 1699, 1029 + xy: 1739, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 1699, 995 + xy: 1705, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 1323, 124 + xy: 1671, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 1699, 1131 + xy: 1705, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1699, 1097 + xy: 1671, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-large rotate: false - xy: 1641, 1363 + xy: 389, 45 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 icerocks1 rotate: false - xy: 1451, 427 + xy: 1739, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks2 rotate: false - xy: 1485, 427 + xy: 1773, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock1 rotate: false - xy: 1553, 411 + xy: 1807, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock2 rotate: false - xy: 1587, 411 + xy: 1773, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock3 rotate: false - xy: 1621, 411 + xy: 1807, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 1971, 1033 + xy: 1943, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 1903, 999 + xy: 1977, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 1937, 999 + xy: 2011, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 1809, 953 + xy: 1987, 961 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 1775, 919 + xy: 673, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 1843, 953 + xy: 673, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 1911, 931 + xy: 741, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged5 rotate: false - xy: 1911, 931 + xy: 741, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 1979, 965 + xy: 775, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 1945, 931 + xy: 809, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 1979, 931 + xy: 843, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 2013, 965 + xy: 877, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 2013, 931 + xy: 911, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 1877, 897 + xy: 945, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged4 rotate: false - xy: 1911, 897 + xy: 775, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged6 rotate: false - xy: 1945, 897 + xy: 809, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine rotate: false - xy: 725, 109 + xy: 1997, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rock1 rotate: false - xy: 1737, 641 + xy: 1727, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rock2 rotate: false - xy: 1737, 591 + xy: 1727, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-large rotate: false - xy: 1311, 1265 + xy: 1205, 1086 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rocks1 rotate: false - xy: 1283, 443 + xy: 1165, 340 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rocks2 rotate: false - xy: 1317, 443 + xy: 1233, 374 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water rotate: false - xy: 1327, 307 + xy: 1233, 272 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 1305, 341 + xy: 1131, 272 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 1339, 341 + xy: 1165, 272 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 1347, 375 + xy: 1199, 272 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 1327, 273 + xy: 1267, 365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 1361, 307 + xy: 1301, 365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 1361, 273 + xy: 1267, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow1 rotate: false - xy: 1425, 239 + xy: 1403, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 1425, 205 + xy: 1403, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 1425, 171 + xy: 1437, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks-large rotate: false - xy: 997, 956 + xy: 1665, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snowrocks1 rotate: false - xy: 1425, 137 + xy: 1403, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks2 rotate: false - xy: 1425, 103 + xy: 1437, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 987, 338 + xy: 2001, 755 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 1029, 380 + xy: 2001, 713 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 1071, 422 + xy: 1143, 696 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 stained-boulder1 rotate: false - xy: 1551, 377 + xy: 1505, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-boulder2 rotate: false - xy: 1585, 377 + xy: 1573, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-large rotate: false - xy: 1129, 1022 + xy: 1831, 1297 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-rocks-red-large rotate: false - xy: 1129, 956 + xy: 453, 441 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-rocks-red1 rotate: false - xy: 1687, 377 + xy: 1607, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-red2 rotate: false - xy: 1721, 355 + xy: 1539, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-yellow-large rotate: false - xy: 1205, 1186 + xy: 445, 375 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-rocks-yellow1 rotate: false - xy: 1755, 355 + xy: 1573, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-yellow2 rotate: false - xy: 1789, 355 + xy: 1573, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks1 rotate: false - xy: 1619, 377 + xy: 1505, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks2 rotate: false - xy: 1653, 377 + xy: 1539, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-red1 rotate: false - xy: 1925, 319 + xy: 1539, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-red2 rotate: false - xy: 1959, 319 + xy: 1573, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-red3 rotate: false - xy: 1993, 319 + xy: 1607, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-yellow1 rotate: false - xy: 1441, 357 + xy: 1641, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-yellow2 rotate: false - xy: 1475, 359 + xy: 1641, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-yellow3 rotate: false - xy: 1429, 323 + xy: 1675, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone1 rotate: false - xy: 1823, 337 + xy: 1607, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone2 rotate: false - xy: 1857, 337 + xy: 1607, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone3 rotate: false - xy: 1891, 319 + xy: 1505, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stainedrocks-large rotate: false - xy: 1173, 1120 + xy: 445, 309 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stainedrocks1 rotate: false - xy: 1429, 289 + xy: 1641, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stainedrocks2 rotate: false - xy: 1463, 323 + xy: 1675, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 1463, 289 + xy: 1709, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar rotate: false - xy: 1459, 119 + xy: 1743, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 1577, 343 + xy: 1811, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 1611, 343 + xy: 1777, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 1645, 343 + xy: 1811, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 1633, 309 + xy: 1879, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 1667, 309 + xy: 1913, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 1497, 275 + xy: 1879, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 1629, 173 + xy: 1071, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1420,35 +1420,35 @@ white-tree-dead index: -1 block-border rotate: false - xy: 1177, 362 + xy: 1161, 544 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 1729, 457 + xy: 1195, 544 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1729, 457 + xy: 1195, 544 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1763, 457 + xy: 1229, 544 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1689, 445 + xy: 1581, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1462,28 +1462,28 @@ place-arrow index: -1 rubble-1-0 rotate: false - xy: 1905, 1267 + xy: 1205, 1020 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 1971, 1267 + xy: 1195, 954 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 813, 609 + xy: 1129, 914 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 813, 543 + xy: 1195, 888 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1518,175 +1518,175 @@ rubble-4-1 index: -1 spawn rotate: false - xy: 1449, 393 + xy: 1403, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 1797, 457 + xy: 1161, 510 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 555, 94 + xy: 1195, 510 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 555, 94 + xy: 1195, 510 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 555, 60 + xy: 1229, 510 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 555, 26 + xy: 1263, 544 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1831, 473 + xy: 1411, 658 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 1831, 439 + xy: 1411, 624 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1451, 461 + xy: 1445, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1485, 461 + xy: 1479, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1519, 445 + xy: 1513, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1553, 445 + xy: 1445, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 1587, 445 + xy: 1479, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 1621, 445 + xy: 1513, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1723, 423 + xy: 1615, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1757, 423 + xy: 1377, 590 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1791, 423 + xy: 1411, 590 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1825, 405 + xy: 1445, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1859, 405 + xy: 1479, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1029, 308 + xy: 1513, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1021, 274 + xy: 1547, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 2005, 1067 + xy: 1945, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 2005, 999 + xy: 1979, 1131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1741, 953 + xy: 2013, 1147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1775, 987 + xy: 2013, 1113 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1714,112 +1714,112 @@ liquid-tank-top index: -1 mechanical-pump rotate: false - xy: 1877, 965 + xy: 741, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 623, 71 + xy: 1793, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 623, 37 + xy: 1827, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 657, 71 + xy: 1827, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 657, 37 + xy: 1861, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 861, 109 + xy: 1929, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 759, 7 + xy: 1963, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 793, 41 + xy: 1997, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 827, 75 + xy: 1063, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 793, 7 + xy: 1063, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 827, 41 + xy: 1097, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 861, 75 + xy: 1063, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 1905, 1333 + xy: 1139, 1046 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 1261, 922 - size: 64, 64 - orig: 64, 64 + xy: 1041, 1299 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 alpha-dart-mech-pad rotate: false - xy: 1483, 1429 + xy: 1409, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 931, 1037 + xy: 667, 1005 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1833,7 +1833,7 @@ glaive-ship-pad index: -1 javelin-ship-pad rotate: false - xy: 1707, 1363 + xy: 583, 473 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1847,21 +1847,21 @@ omega-mech-pad index: -1 tau-mech-pad rotate: false - xy: 1261, 988 + xy: 977, 905 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 1327, 927 + xy: 969, 839 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 battery rotate: false - xy: 1113, 401 + xy: 1173, 578 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1875,14 +1875,14 @@ battery-large index: -1 combustion-generator rotate: false - xy: 1211, 362 + xy: 1377, 658 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 1829, 507 + xy: 1377, 624 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1945,63 +1945,63 @@ impact-reactor-top index: -1 power-node rotate: false - xy: 793, 109 + xy: 1691, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 1773, 1297 + xy: 1225, 1218 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 759, 75 + xy: 1759, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 827, 109 + xy: 1793, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 powerinfinite rotate: false - xy: 725, 7 + xy: 1827, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 powervoid rotate: false - xy: 759, 41 + xy: 1861, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 1971, 1333 + xy: 1129, 980 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1279, 375 + xy: 1233, 340 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1351, 425 + xy: 1471, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2015,49 +2015,49 @@ solar-panel-large index: -1 surge-tower rotate: false - xy: 1239, 1120 + xy: 445, 243 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 1195, 922 + xy: 1043, 905 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 1041, 1299 + xy: 1139, 1397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 1139, 1397 + xy: 943, 1103 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 943, 1103 + xy: 1041, 1201 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 1371, 1157 + xy: 903, 773 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 1437, 1157 + xy: 1035, 839 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2076,163 +2076,121 @@ alloy-smelter-top orig: 96, 96 offset: 0, 0 index: -1 -biomattercompressor - rotate: false - xy: 1549, 1429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -biomattercompressor-frame0 - rotate: false - xy: 1615, 1429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -biomattercompressor-frame1 - rotate: false - xy: 1681, 1429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -biomattercompressor-frame2 - rotate: false - xy: 1747, 1429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -biomattercompressor-liquid - rotate: false - xy: 1879, 1429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -biomattercompressor-top - rotate: false - xy: 1041, 1088 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 blast-mixer rotate: false - xy: 1139, 1186 + xy: 1139, 1112 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 1945, 1465 + xy: 1607, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 601, 1005 + xy: 1739, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 667, 1005 + xy: 1805, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 733, 1005 + xy: 1871, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 647, 939 + xy: 1956, 1671 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 713, 939 + xy: 1945, 1605 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 1575, 1363 + xy: 1063, 1037 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 1689, 411 + xy: 1807, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1767, 1021 + xy: 1977, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1869, 1055 + xy: 1671, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 1773, 1363 + xy: 865, 971 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 1839, 1363 + xy: 931, 971 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 1839, 1363 + xy: 931, 971 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lavasmelter rotate: false - xy: 1971, 1067 + xy: 1909, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 1809, 987 + xy: 1987, 1063 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1877, 931 + xy: 673, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2244,100 +2202,135 @@ multi-press orig: 96, 96 offset: 0, 0 index: -1 -oilrefinery - rotate: false - xy: 1783, 885 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 phase-weaver rotate: false - xy: 747, 543 + xy: 681, 543 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 715, 477 + xy: 747, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 421, 175 + xy: 715, 477 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 1377, 1289 + xy: 781, 477 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 1443, 1289 + xy: 1335, 1355 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 827, 7 + xy: 1097, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 861, 7 + xy: 1097, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 1839, 1297 + xy: 1213, 1152 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 1905, 1201 + xy: 1467, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1971, 1201 + xy: 1533, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 997, 1022 + xy: 1599, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 smelter rotate: false - xy: 1391, 103 + xy: 1369, 250 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +spore-press + rotate: false + xy: 1929, 1341 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame0 + rotate: false + xy: 1435, 1289 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame1 + rotate: false + xy: 1501, 1297 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame2 + rotate: false + xy: 1567, 1297 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-liquid + rotate: false + xy: 1699, 1297 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-top + rotate: false + xy: 1765, 1297 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 container rotate: false - xy: 1945, 1597 + xy: 1475, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2379,42 +2372,42 @@ launch-pad index: -1 sortedunloader rotate: false - xy: 1381, 391 + xy: 1471, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 1561, 105 + xy: 1071, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 1237, 1397 + xy: 1041, 1103 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 983, 207 + xy: 1207, 612 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1143, 367 + xy: 1241, 578 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 1956, 1663 + xy: 1956, 1737 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2442,7 +2435,7 @@ hail-heat index: -1 lancer-heat rotate: false - xy: 639, 807 + xy: 1063, 971 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2463,70 +2456,70 @@ ripple-heat index: -1 salvo-heat rotate: false - xy: 1377, 1223 + xy: 1291, 1218 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 1509, 1231 + xy: 1271, 1086 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 1575, 1231 + xy: 1271, 1020 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 1459, 827 + xy: 1011, 575 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 799, 1005 + xy: 1945, 1539 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 799, 1005 + xy: 1945, 1539 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 799, 1005 + xy: 1945, 1539 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 799, 1005 + xy: 1945, 1539 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 1945, 1399 + xy: 535, 1005 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-top-open rotate: false - xy: 865, 1037 + xy: 601, 1005 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2589,28 +2582,21 @@ ghoul-factory index: -1 phantom-factory-top rotate: false - xy: 681, 609 + xy: 705, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory-top-open rotate: false - xy: 681, 543 + xy: 771, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 895, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -repair-point-turret - rotate: false - xy: 895, 41 + xy: 1165, 374 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2638,91 +2624,91 @@ revenant-factory-top-open index: -1 spirit-factory-top rotate: false - xy: 1063, 956 + xy: 1797, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory-top-open rotate: false - xy: 1107, 1088 + xy: 1863, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 1041, 1201 + xy: 1139, 1299 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 1569, 1165 + xy: 979, 509 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory-top-open rotate: false - xy: 1635, 1165 + xy: 913, 443 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 1123, 299 + xy: 1433, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 1945, 1531 + xy: 1541, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 1221, 158 + xy: 1603, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 583, 473 + xy: 581, 939 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 865, 971 + xy: 647, 939 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1259, 260 + xy: 1637, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 623, 3 + xy: 1929, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 747, 609 + xy: 681, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2757,91 +2743,91 @@ scrap-wall-huge3 index: -1 scrap-wall-large1 rotate: false - xy: 1641, 1231 + xy: 1261, 954 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 1707, 1231 + xy: 1261, 888 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1773, 1231 + xy: 1369, 1289 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1839, 1231 + xy: 1401, 1355 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 1373, 341 + xy: 1267, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1357, 239 + xy: 1301, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1357, 205 + xy: 1301, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1357, 171 + xy: 1267, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1357, 171 + xy: 1267, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1459, 221 + xy: 1709, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 1195, 1054 + xy: 487, 177 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 1497, 309 + xy: 1811, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 1271, 1191 + xy: 837, 839 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2855,63 +2841,49 @@ thruster index: -1 titanium-wall rotate: false - xy: 1527, 105 + xy: 1947, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 1327, 993 + xy: 837, 707 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -beam - rotate: false - xy: 1303, 1273 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -beam-end - rotate: false - xy: 1956, 1877 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 bullet rotate: false - xy: 477, 1507 + xy: 1995, 1353 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1583, 879 + xy: 1995, 1299 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 1449, 85 + xy: 1129, 1085 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 error rotate: false - xy: 1245, 872 + xy: 1395, 1134 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 2029, 405 + xy: 545, 1511 size: 4, 48 orig: 4, 48 offset: 0, 0 @@ -2923,254 +2895,219 @@ laser-end orig: 72, 72 offset: 0, 0 index: -1 -laserfull - rotate: false - xy: 1956, 1803 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 minelaser rotate: false - xy: 2037, 1292 + xy: 2043, 907 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 1409, 1421 + xy: 1139, 1178 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 1029, 342 + xy: 1135, 629 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 1071, 384 + xy: 1135, 591 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 1387, 855 + xy: 421, 111 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 929, 1 + xy: 1081, 1 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 959, 1 + xy: 1111, 28 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 989, 1 + xy: 1230, 136 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 1019, 1 + xy: 1260, 136 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 1049, 1 + xy: 1290, 161 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 shell rotate: false - xy: 945, 200 + xy: 1907, 1303 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 1337, 1227 + xy: 2001, 675 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shot rotate: false - xy: 1391, 171 + xy: 1369, 284 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 2043, 1292 + xy: 2043, 857 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1595, 173 + xy: 2015, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 1956, 1729 + xy: 1956, 1803 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 alloy-smelter-icon-large rotate: false - xy: 1641, 941 + xy: 477, 1511 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alloy-smelter-icon-medium rotate: false - xy: 1337, 1193 + xy: 1173, 646 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alloy-smelter-icon-small rotate: false - xy: 879, 545 + xy: 1451, 850 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 alpha-dart-mech-pad-icon-large rotate: false - xy: 1583, 829 + xy: 511, 341 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-dart-mech-pad-icon-medium rotate: false - xy: 987, 275 + xy: 1173, 612 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alpha-dart-mech-pad-icon-small rotate: false - xy: 1451, 501 + xy: 1551, 813 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 arc rotate: false - xy: 983, 241 + xy: 1207, 646 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc-icon-full rotate: false - xy: 983, 173 + xy: 1298, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc-icon-large rotate: false - xy: 453, 457 + xy: 561, 315 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 arc-icon-small rotate: false - xy: 1741, 893 + xy: 1003, 77 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 battery-icon-large rotate: false - xy: 503, 457 + xy: 561, 265 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 battery-icon-small rotate: false - xy: 2021, 871 + xy: 879, 549 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 battery-large-icon-large rotate: false - xy: 445, 349 + xy: 611, 257 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 battery-large-icon-medium rotate: false - xy: 1147, 401 + xy: 1207, 578 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-small rotate: false - xy: 715, 147 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -biomattercompressor-icon-full - rotate: false - xy: 1813, 1429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -biomattercompressor-icon-large - rotate: false - xy: 495, 407 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -biomattercompressor-icon-medium - rotate: false - xy: 1189, 430 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -biomattercompressor-icon-small - rotate: false - xy: 1663, 107 + xy: 1945, 1103 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3184,336 +3121,336 @@ blast-drill-icon-full index: -1 blast-drill-icon-large rotate: false - xy: 445, 299 + xy: 693, 423 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 blast-drill-icon-medium rotate: false - xy: 1181, 396 + xy: 1241, 646 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill-icon-small rotate: false - xy: 929, 103 + xy: 775, 89 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-mixer-icon-large rotate: false - xy: 495, 357 + xy: 743, 427 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 blast-mixer-icon-medium rotate: false - xy: 1109, 367 + xy: 1241, 612 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-mixer-icon-small rotate: false - xy: 955, 103 + xy: 1111, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 bridge-conduit-icon-large rotate: false - xy: 495, 257 + xy: 553, 215 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bridge-conduit-icon-small rotate: false - xy: 945, 145 + xy: 1349, 224 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 bridge-conveyor-icon-large rotate: false - xy: 845, 921 + xy: 553, 165 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bridge-conveyor-icon-small rotate: false - xy: 981, 103 + xy: 1320, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 char-icon-large rotate: false - xy: 945, 921 + xy: 603, 157 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 char-icon-small rotate: false - xy: 1033, 103 + xy: 1375, 224 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 cliffs-icon-large rotate: false - xy: 837, 871 + xy: 677, 365 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cliffs-icon-small rotate: false - xy: 1493, 79 + xy: 1349, 198 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 combustion-generator-icon-large rotate: false - xy: 837, 821 + xy: 661, 315 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 combustion-generator-icon-small rotate: false - xy: 1519, 79 + xy: 1375, 198 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 conduit-icon-full rotate: false - xy: 1655, 445 + xy: 1547, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-icon-large rotate: false - xy: 887, 871 + xy: 661, 265 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 conduit-icon-small rotate: false - xy: 1545, 79 + xy: 1401, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 container-icon-large rotate: false - xy: 837, 771 + xy: 711, 315 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 container-icon-medium rotate: false - xy: 1017, 240 + xy: 1581, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-small rotate: false - xy: 1571, 79 + xy: 1427, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 conveyor-icon-large rotate: false - xy: 937, 871 + xy: 711, 265 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 conveyor-icon-small rotate: false - xy: 1597, 79 + xy: 1453, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 copper-wall-icon-large rotate: false - xy: 887, 821 + xy: 1357, 1234 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 copper-wall-icon-small rotate: false - xy: 1623, 79 + xy: 1479, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 copper-wall-large-icon-large rotate: false - xy: 837, 721 + xy: 1407, 1239 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 copper-wall-large-icon-medium rotate: false - xy: 1123, 265 + xy: 1467, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-small rotate: false - xy: 1059, 103 + xy: 1136, 134 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core-foundation-icon-large rotate: false - xy: 887, 771 + xy: 1457, 1239 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 core-foundation-icon-medium rotate: false - xy: 1119, 231 + xy: 1501, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 core-foundation-icon-small rotate: false - xy: 1085, 112 + xy: 1401, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core-nucleus-icon-large rotate: false - xy: 937, 821 + xy: 1507, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 core-nucleus-icon-medium rotate: false - xy: 1119, 197 + xy: 1433, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 core-nucleus-icon-small rotate: false - xy: 1223, 451 + xy: 1427, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core-shard-icon-large rotate: false - xy: 887, 721 + xy: 1557, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 core-shard-icon-medium rotate: false - xy: 1119, 163 + xy: 1467, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 core-shard-icon-small rotate: false - xy: 1127, 1160 + xy: 1453, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 craters-icon-large rotate: false - xy: 937, 771 + xy: 1607, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 craters-icon-small rotate: false - xy: 1730, 329 + xy: 1479, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 cryofluidmixer-icon-full rotate: false - xy: 535, 1005 + xy: 1673, 1429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-icon-large rotate: false - xy: 1095, 906 + xy: 1807, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cryofluidmixer-icon-medium rotate: false - xy: 1153, 226 + xy: 1603, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-small rotate: false - xy: 1756, 329 + xy: 1505, 213 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 cultivator-icon-full rotate: false - xy: 581, 939 + xy: 1237, 1284 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-large rotate: false - xy: 1145, 906 + xy: 1857, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cultivator-icon-medium rotate: false - xy: 1153, 192 + xy: 1365, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cultivator-icon-small rotate: false - xy: 1730, 303 + xy: 1531, 213 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3534,49 +3471,49 @@ cyclone-icon-full index: -1 cyclone-icon-large rotate: false - xy: 987, 856 + xy: 1357, 1184 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cyclone-icon-medium rotate: false - xy: 1187, 226 + xy: 1399, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cyclone-icon-small rotate: false - xy: 1782, 329 + xy: 1557, 213 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dagger-factory-icon-full rotate: false - xy: 779, 939 + xy: 1945, 1473 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-icon-large rotate: false - xy: 987, 756 + xy: 1507, 1197 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-factory-icon-medium rotate: false - xy: 1187, 192 + xy: 1433, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dagger-factory-icon-small rotate: false - xy: 1756, 303 + xy: 1583, 213 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3590,175 +3527,175 @@ deepwater-edge index: -1 deepwater-icon-large rotate: false - xy: 1037, 756 + xy: 1657, 1197 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 deepwater-icon-small rotate: false - xy: 1782, 303 + xy: 1609, 213 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 delta-mech-pad-icon-large rotate: false - xy: 1137, 806 + xy: 1857, 1197 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-pad-icon-medium rotate: false - xy: 1221, 192 + xy: 1501, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 delta-mech-pad-icon-small rotate: false - xy: 1730, 277 + xy: 1505, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 differential-generator-icon-large rotate: false - xy: 1137, 756 + xy: 1345, 1134 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 differential-generator-icon-medium rotate: false - xy: 1153, 158 + xy: 1535, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-small rotate: false - xy: 1756, 277 + xy: 1531, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 distributor-icon-large rotate: false - xy: 987, 706 + xy: 1337, 1084 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 distributor-icon-medium rotate: false - xy: 1187, 158 + xy: 1569, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor-icon-small rotate: false - xy: 1782, 277 + xy: 1557, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 door-icon-large rotate: false - xy: 1037, 706 + xy: 1337, 1034 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 door-icon-small rotate: false - xy: 1649, 79 + xy: 1583, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 door-large-icon-large rotate: false - xy: 1087, 706 + xy: 1337, 984 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 door-large-icon-medium rotate: false - xy: 1259, 294 + xy: 1637, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-small rotate: false - xy: 1675, 81 + xy: 1609, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dunerocks-icon-large rotate: false - xy: 1137, 706 + xy: 1327, 934 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dunerocks-icon-small rotate: false - xy: 1689, 107 + xy: 1635, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 duo rotate: false - xy: 1255, 158 + xy: 1685, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-full rotate: false - xy: 1271, 328 + xy: 1719, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-large rotate: false - xy: 1195, 872 + xy: 1327, 884 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 duo-icon-small rotate: false - xy: 1701, 81 + xy: 1661, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 force-projector-icon-large rotate: false - xy: 1187, 714 + xy: 777, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 force-projector-icon-medium rotate: false - xy: 1293, 260 + xy: 1787, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 force-projector-icon-small rotate: false - xy: 1808, 311 + xy: 1687, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3772,21 +3709,21 @@ fortress-factory-icon-full index: -1 fortress-factory-icon-large rotate: false - xy: 1237, 764 + xy: 827, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fortress-factory-icon-medium rotate: false - xy: 1289, 226 + xy: 1821, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fortress-factory-icon-small rotate: false - xy: 1834, 311 + xy: 1713, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3807,21 +3744,21 @@ fuse-icon-full index: -1 fuse-icon-large rotate: false - xy: 1237, 714 + xy: 1445, 1139 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fuse-icon-medium rotate: false - xy: 1289, 192 + xy: 1855, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fuse-icon-small rotate: false - xy: 1808, 285 + xy: 1739, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3835,91 +3772,91 @@ ghoul-factory-icon-full index: -1 ghoul-factory-icon-large rotate: false - xy: 1287, 811 + xy: 1387, 976 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ghoul-factory-icon-medium rotate: false - xy: 1289, 158 + xy: 1889, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ghoul-factory-icon-small rotate: false - xy: 1860, 311 + xy: 1765, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 glaive-ship-pad-icon-large rotate: false - xy: 1337, 811 + xy: 1377, 926 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 glaive-ship-pad-icon-medium rotate: false - xy: 1323, 226 + xy: 1923, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 glaive-ship-pad-icon-small rotate: false - xy: 1834, 285 + xy: 1791, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 graphite-press-icon-large rotate: false - xy: 1287, 761 + xy: 1377, 876 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 graphite-press-icon-medium rotate: false - xy: 1323, 192 + xy: 1649, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 graphite-press-icon-small rotate: false - xy: 1860, 285 + xy: 1817, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hail rotate: false - xy: 1051, 138 + xy: 1785, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hail-icon-full rotate: false - xy: 1085, 138 + xy: 1819, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hail-icon-large rotate: false - xy: 1337, 761 + xy: 761, 315 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 hail-icon-small rotate: false - xy: 1886, 293 + xy: 1843, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3933,42 +3870,42 @@ holostone-edge index: -1 holostone-icon-large rotate: false - xy: 1337, 711 + xy: 811, 327 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 holostone-icon-small rotate: false - xy: 1912, 293 + xy: 1869, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hotrock-icon-large rotate: false - xy: 1387, 777 + xy: 811, 277 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 hotrock-icon-small rotate: false - xy: 1938, 293 + xy: 1895, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ice-icon-large rotate: false - xy: 1437, 777 + xy: 877, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ice-icon-small rotate: false - xy: 1964, 293 + xy: 1921, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3982,42 +3919,42 @@ ice-snow-edge index: -1 ice-snow-icon-large rotate: false - xy: 1387, 727 + xy: 861, 327 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ice-snow-icon-small rotate: false - xy: 1990, 293 + xy: 1947, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 icerocks-icon-large rotate: false - xy: 1437, 727 + xy: 861, 277 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icerocks-icon-small rotate: false - xy: 2016, 293 + xy: 1973, 187 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ignarock-icon-large rotate: false - xy: 1437, 677 + xy: 911, 327 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ignarock-icon-small rotate: false - xy: 1079, 34 + xy: 1141, 56 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4031,490 +3968,490 @@ impact-reactor-icon-full index: -1 impact-reactor-icon-large rotate: false - xy: 1487, 745 + xy: 911, 277 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 impact-reactor-icon-medium rotate: false - xy: 1655, 411 + xy: 1841, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-small rotate: false - xy: 1079, 8 + xy: 1141, 30 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 incinerator-icon-large rotate: false - xy: 1487, 695 + xy: 1495, 1139 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 incinerator-icon-small rotate: false - xy: 1111, 77 + xy: 1319, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-biomatter-medium - rotate: false - xy: 1105, 9 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-biomatter-small - rotate: false - xy: 1131, 2 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-biomatter-xlarge - rotate: false - xy: 837, 679 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 item-blast-compound-medium rotate: false - xy: 1137, 98 + xy: 1349, 172 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1149, 2 + xy: 509, 1000 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 477, 1716 + xy: 2007, 1257 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 1163, 98 + xy: 1375, 172 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1167, 2 + xy: 681, 121 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 913, 479 + xy: 511, 249 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 1189, 98 + xy: 1401, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 1185, 2 + xy: 2025, 657 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 955, 464 + xy: 2007, 1215 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 1215, 98 + xy: 1427, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 1203, 2 + xy: 527, 1507 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 997, 464 + xy: 477, 1716 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 1241, 98 + xy: 1453, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 1221, 2 + xy: 1193, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1039, 464 + xy: 1101, 713 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 1267, 98 + xy: 1479, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 1239, 2 + xy: 1193, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1081, 464 + xy: 1651, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 1293, 98 + xy: 1505, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1257, 2 + xy: 1193, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 1123, 464 + xy: 1951, 1199 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 1319, 98 + xy: 1531, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 1275, 2 + xy: 1193, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 1165, 464 + xy: 1693, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 1137, 72 + xy: 1557, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 1293, 2 + xy: 1193, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 945, 422 + xy: 1735, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 1163, 72 + xy: 1583, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 1311, 2 + xy: 1206, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 945, 380 + xy: 1777, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 1189, 72 + xy: 1609, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 1329, 2 + xy: 1211, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 987, 422 + xy: 1819, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 1215, 72 + xy: 1635, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 1347, 2 + xy: 1211, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 945, 338 + xy: 1861, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-source-icon-large rotate: false - xy: 1487, 645 + xy: 1545, 1147 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-source-icon-small rotate: false - xy: 1241, 72 + xy: 1661, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 +item-spore-pod-medium + rotate: false + xy: 1687, 161 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-spore-pod-small + rotate: false + xy: 1211, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-spore-pod-xlarge + rotate: false + xy: 1903, 655 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-surge-alloy-medium rotate: false - xy: 1267, 72 + xy: 1713, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1365, 7 + xy: 1211, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 987, 380 + xy: 1945, 655 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 1293, 72 + xy: 1739, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 1383, 7 + xy: 1211, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 1029, 422 + xy: 389, 3 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 1319, 72 + xy: 1765, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1401, 7 + xy: 1229, 118 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 945, 296 + xy: 537, 123 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-void-icon-large rotate: false - xy: 1537, 729 + xy: 1595, 1147 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-void-icon-small rotate: false - xy: 1131, 46 + xy: 1791, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 javelin-ship-pad-icon-large rotate: false - xy: 1587, 729 + xy: 1695, 1147 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 javelin-ship-pad-icon-medium rotate: false - xy: 1835, 1021 + xy: 1705, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 javelin-ship-pad-icon-small rotate: false - xy: 1131, 20 + xy: 1817, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 junction-icon-large rotate: false - xy: 1537, 629 + xy: 1795, 1147 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 junction-icon-small rotate: false - xy: 1157, 46 + xy: 1843, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 kiln-icon-large rotate: false - xy: 1587, 629 + xy: 1845, 1147 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 kiln-icon-medium rotate: false - xy: 1903, 1067 + xy: 1773, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-small rotate: false - xy: 1157, 20 + xy: 1869, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 lancer rotate: false - xy: 639, 873 + xy: 997, 971 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-full rotate: false - xy: 705, 873 + xy: 649, 473 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-large rotate: false - xy: 1625, 779 + xy: 811, 227 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer-icon-medium rotate: false - xy: 1903, 1033 + xy: 1807, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lancer-icon-small rotate: false - xy: 1183, 46 + xy: 1895, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4528,91 +4465,91 @@ laser-drill-icon-full index: -1 laser-drill-icon-large rotate: false - xy: 1633, 829 + xy: 861, 227 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser-drill-icon-medium rotate: false - xy: 1937, 1067 + xy: 1841, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 laser-drill-icon-small rotate: false - xy: 1183, 20 + xy: 1921, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 launch-pad-icon-large rotate: false - xy: 1637, 729 + xy: 911, 227 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 launch-pad-icon-medium rotate: false - xy: 1937, 1033 + xy: 1875, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 launch-pad-icon-small rotate: false - xy: 1209, 46 + xy: 1947, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-junction-icon-large rotate: false - xy: 1637, 629 + xy: 1945, 1291 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-junction-icon-small rotate: false - xy: 1209, 20 + xy: 1973, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-router-icon-full rotate: false - xy: 1741, 987 + xy: 2013, 1181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-large rotate: false - xy: 1675, 779 + xy: 1907, 1241 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-router-icon-small rotate: false - xy: 1235, 46 + xy: 1999, 161 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-source-icon-large rotate: false - xy: 1687, 729 + xy: 1957, 1241 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-source-icon-small rotate: false - xy: 1235, 20 + xy: 1162, 134 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4626,35 +4563,35 @@ liquid-tank-icon-full index: -1 liquid-tank-icon-large rotate: false - xy: 1687, 679 + xy: 1427, 926 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-tank-icon-medium rotate: false - xy: 1775, 953 + xy: 1987, 1029 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-small rotate: false - xy: 1261, 46 + xy: 1167, 108 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 magmarock-icon-large rotate: false - xy: 1687, 629 + xy: 1427, 876 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 magmarock-icon-small rotate: false - xy: 1261, 20 + xy: 1167, 82 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4675,119 +4612,119 @@ mass-driver-icon-full index: -1 mass-driver-icon-large rotate: false - xy: 479, 125 + xy: 1101, 855 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mass-driver-icon-medium rotate: false - xy: 1809, 919 + xy: 707, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-icon-small rotate: false - xy: 1287, 46 + xy: 1167, 56 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mech-icon-alpha-mech rotate: false - xy: 505, 75 + xy: 1101, 805 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-dart-ship rotate: false - xy: 505, 25 + xy: 1101, 755 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-delta-mech rotate: false - xy: 1187, 664 + xy: 1545, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-glaive-ship rotate: false - xy: 1766, 1173 + xy: 519, 449 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-icon-javelin-ship rotate: false - xy: 1237, 664 + xy: 1595, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-omega-mech rotate: false - xy: 1525, 961 + xy: 1045, 511 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-icon-tau-mech rotate: false - xy: 1824, 1173 + xy: 1103, 511 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-icon-trident-ship rotate: false - xy: 1525, 903 + xy: 455, 59 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mechanical-drill-icon-full rotate: false - xy: 771, 873 + xy: 639, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-icon-large rotate: false - xy: 1287, 661 + xy: 1645, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mechanical-drill-icon-medium rotate: false - xy: 1843, 919 + xy: 707, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-drill-icon-small rotate: false - xy: 1287, 20 + xy: 1167, 30 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mechanical-pump-icon-large rotate: false - xy: 1337, 661 + xy: 1695, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mechanical-pump-icon-small rotate: false - xy: 1313, 46 + xy: 2021, 1087 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4808,112 +4745,112 @@ meltdown-icon-full index: -1 meltdown-icon-large rotate: false - xy: 1387, 627 + xy: 1745, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 meltdown-icon-medium rotate: false - xy: 1911, 965 + xy: 741, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-small rotate: false - xy: 1313, 20 + xy: 2021, 1061 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 melter-icon-large rotate: false - xy: 1437, 627 + xy: 1795, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 melter-icon-small rotate: false - xy: 1345, 77 + xy: 2021, 1035 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mend-projector-icon-large rotate: false - xy: 1487, 595 + xy: 1845, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mend-projector-icon-medium rotate: false - xy: 1945, 965 + xy: 707, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-small rotate: false - xy: 1371, 77 + xy: 2021, 1009 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-2-icon-large rotate: false - xy: 1537, 579 + xy: 1895, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-2-icon-small rotate: false - xy: 1397, 77 + xy: 2021, 983 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-3-icon-large rotate: false - xy: 1587, 579 + xy: 653, 207 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-3-icon-small rotate: false - xy: 1423, 77 + xy: 2021, 957 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-5-icon-large rotate: false - xy: 1637, 579 + xy: 653, 157 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-5-icon-small rotate: false - xy: 2022, 1703 + xy: 2022, 1777 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-damaged-icon-large rotate: false - xy: 1687, 579 + xy: 703, 215 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-damaged-icon-small rotate: false - xy: 2022, 1677 + xy: 2022, 1751 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4927,35 +4864,35 @@ metal-floor-edge index: -1 metal-floor-icon-large rotate: false - xy: 1641, 891 + xy: 703, 165 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-icon-small rotate: false - xy: 1808, 259 + xy: 2022, 1725 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 multi-press-icon-large rotate: false - xy: 1691, 941 + xy: 753, 215 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 multi-press-icon-medium rotate: false - xy: 1979, 897 + xy: 843, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-small rotate: false - xy: 1834, 259 + xy: 2022, 1699 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4969,1904 +4906,1932 @@ oil-extractor-icon-full index: -1 oil-extractor-icon-large rotate: false - xy: 1691, 891 + xy: 753, 165 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 oil-extractor-icon-medium rotate: false - xy: 2013, 897 + xy: 877, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 oil-extractor-icon-small rotate: false - xy: 1860, 259 + xy: 2022, 1673 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 omega-mech-pad-icon-large rotate: false - xy: 1683, 841 + xy: 803, 177 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omega-mech-pad-icon-medium rotate: false - xy: 1783, 851 + xy: 911, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 omega-mech-pad-icon-small rotate: false - xy: 1886, 267 + xy: 1346, 146 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-coal-holostone-icon-large rotate: false - xy: 495, 207 + xy: 853, 177 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-coal-holostone-icon-small rotate: false - xy: 1912, 267 + xy: 1372, 146 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-coal-holostone1 rotate: false - xy: 1817, 885 + xy: 945, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-holostone2 rotate: false - xy: 1817, 851 + xy: 979, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-holostone3 rotate: false - xy: 1825, 817 + xy: 979, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-holostone-icon-full rotate: false - xy: 1825, 817 + xy: 979, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-holostone-icon-medium rotate: false - xy: 1825, 817 + xy: 979, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand-icon-large rotate: false - xy: 545, 407 + xy: 903, 177 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-coal-sand-icon-small rotate: false - xy: 1938, 267 + xy: 1345, 120 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 1851, 863 + xy: 1991, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 1885, 863 + xy: 977, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 1919, 863 + xy: 1011, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand-icon-full rotate: false - xy: 1919, 863 + xy: 1011, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand-icon-medium rotate: false - xy: 1919, 863 + xy: 1011, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-icon-large rotate: false - xy: 545, 357 + xy: 803, 127 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-coal-stained-stone-icon-small rotate: false - xy: 1964, 267 + xy: 1371, 120 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-coal-stained-stone-red-icon-large rotate: false - xy: 545, 307 + xy: 853, 127 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-coal-stained-stone-red-icon-small rotate: false - xy: 1990, 267 + xy: 1398, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-coal-stained-stone-red1 rotate: false - xy: 1893, 829 + xy: 961, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-red2 rotate: false - xy: 1927, 829 + xy: 961, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-red3 rotate: false - xy: 1961, 829 + xy: 961, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-red-icon-full rotate: false - xy: 1961, 829 + xy: 961, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-red-icon-medium rotate: false - xy: 1961, 829 + xy: 961, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone1 rotate: false - xy: 1953, 863 + xy: 977, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone2 rotate: false - xy: 1987, 863 + xy: 1011, 376 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone3 rotate: false - xy: 1859, 829 + xy: 961, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-icon-full rotate: false - xy: 1859, 829 + xy: 961, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stained-stone-icon-medium rotate: false - xy: 1859, 829 + xy: 961, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone-icon-large rotate: false - xy: 545, 257 + xy: 903, 127 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-coal-stone-icon-small rotate: false - xy: 2016, 267 + xy: 1424, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 1995, 829 + xy: 995, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 1859, 795 + xy: 995, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 1893, 795 + xy: 995, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone-icon-full rotate: false - xy: 1893, 795 + xy: 995, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone-icon-medium rotate: false - xy: 1893, 795 + xy: 995, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-holostone-icon-large rotate: false - xy: 545, 207 + xy: 1437, 1084 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-copper-holostone-icon-small rotate: false - xy: 1886, 241 + xy: 1450, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-copper-holostone1 rotate: false - xy: 1927, 795 + xy: 995, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-holostone2 rotate: false - xy: 1961, 795 + xy: 1029, 342 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-holostone3 rotate: false - xy: 1995, 795 + xy: 1029, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-holostone-icon-full rotate: false - xy: 1995, 795 + xy: 1029, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-holostone-icon-medium rotate: false - xy: 1995, 795 + xy: 1029, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand-icon-large rotate: false - xy: 595, 423 + xy: 1437, 1034 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-copper-sand-icon-small rotate: false - xy: 1912, 241 + xy: 1476, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-copper-sand1 rotate: false - xy: 1837, 761 + xy: 1029, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand2 rotate: false - xy: 1837, 727 + xy: 1029, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand3 rotate: false - xy: 1871, 761 + xy: 1003, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand-icon-full rotate: false - xy: 1871, 761 + xy: 1003, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand-icon-medium rotate: false - xy: 1871, 761 + xy: 1003, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-icon-large rotate: false - xy: 595, 373 + xy: 1437, 984 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-copper-stained-stone-icon-small rotate: false - xy: 1938, 241 + xy: 1397, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-copper-stained-stone-red-icon-large rotate: false - xy: 645, 423 + xy: 1487, 1089 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-copper-stained-stone-red-icon-small rotate: false - xy: 1964, 241 + xy: 1423, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-copper-stained-stone-red1 rotate: false - xy: 1837, 659 + xy: 1037, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-red2 rotate: false - xy: 1939, 761 + xy: 1037, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-red3 rotate: false - xy: 1905, 727 + xy: 1037, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-red-icon-full rotate: false - xy: 1905, 727 + xy: 1037, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-red-icon-medium rotate: false - xy: 1905, 727 + xy: 1037, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone1 rotate: false - xy: 1837, 693 + xy: 1003, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone2 rotate: false - xy: 1905, 761 + xy: 1003, 137 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone3 rotate: false - xy: 1871, 727 + xy: 1003, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-icon-full rotate: false - xy: 1871, 727 + xy: 1003, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stained-stone-icon-medium rotate: false - xy: 1871, 727 + xy: 1003, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone-icon-large rotate: false - xy: 595, 323 + xy: 1487, 1039 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-copper-stone-icon-small rotate: false - xy: 1990, 241 + xy: 1449, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-copper-stone1 rotate: false - xy: 1871, 693 + xy: 1037, 104 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone2 rotate: false - xy: 1837, 625 + xy: 1045, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone3 rotate: false - xy: 1973, 761 + xy: 1079, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone-icon-full rotate: false - xy: 1973, 761 + xy: 1079, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone-icon-medium rotate: false - xy: 1973, 761 + xy: 1079, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-holostone-icon-large rotate: false - xy: 645, 373 + xy: 1487, 989 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-lead-holostone-icon-small rotate: false - xy: 2016, 241 + xy: 1475, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-lead-holostone1 rotate: false - xy: 1939, 727 + xy: 1113, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-holostone2 rotate: false - xy: 1905, 693 + xy: 1147, 476 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-holostone3 rotate: false - xy: 1871, 659 + xy: 1181, 476 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-holostone-icon-full rotate: false - xy: 1871, 659 + xy: 1181, 476 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-holostone-icon-medium rotate: false - xy: 1871, 659 + xy: 1181, 476 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand-icon-large rotate: false - xy: 595, 273 + xy: 1537, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-lead-sand-icon-small rotate: false - xy: 1339, 46 + xy: 1502, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 1837, 591 + xy: 1215, 476 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 1973, 727 + xy: 1249, 476 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 1939, 693 + xy: 1283, 467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand-icon-full rotate: false - xy: 1939, 693 + xy: 1283, 467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand-icon-medium rotate: false - xy: 1939, 693 + xy: 1283, 467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-icon-large rotate: false - xy: 645, 323 + xy: 1537, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-lead-stained-stone-icon-small rotate: false - xy: 1339, 20 + xy: 1528, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-lead-stained-stone-red-icon-large rotate: false - xy: 595, 223 + xy: 1587, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-lead-stained-stone-red-icon-small rotate: false - xy: 1365, 51 + xy: 1554, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-lead-stained-stone-red1 rotate: false - xy: 1973, 693 + xy: 1419, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-red2 rotate: false - xy: 1939, 659 + xy: 1453, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-red3 rotate: false - xy: 1905, 625 + xy: 1487, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-red-icon-full rotate: false - xy: 1905, 625 + xy: 1487, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-red-icon-medium rotate: false - xy: 1905, 625 + xy: 1487, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone1 rotate: false - xy: 1905, 659 + xy: 1317, 467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone2 rotate: false - xy: 1871, 625 + xy: 1351, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone3 rotate: false - xy: 1837, 557 + xy: 1385, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-icon-full rotate: false - xy: 1837, 557 + xy: 1385, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stained-stone-icon-medium rotate: false - xy: 1837, 557 + xy: 1385, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone-icon-large rotate: false - xy: 645, 273 + xy: 1587, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-lead-stone-icon-small rotate: false - xy: 1365, 25 + xy: 1580, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 1871, 591 + xy: 1521, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 1973, 659 + xy: 1555, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 1939, 625 + xy: 1589, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone-icon-full rotate: false - xy: 1939, 625 + xy: 1589, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone-icon-medium rotate: false - xy: 1939, 625 + xy: 1589, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-holostone-icon-large rotate: false - xy: 645, 223 + xy: 1637, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-holostone-icon-small rotate: false - xy: 1391, 51 + xy: 1606, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-holostone1 rotate: false - xy: 1905, 591 + xy: 1623, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-holostone2 rotate: false - xy: 1871, 557 + xy: 1037, 70 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-holostone3 rotate: false - xy: 1973, 625 + xy: 1013, 36 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-holostone-icon-full rotate: false - xy: 1973, 625 + xy: 1013, 36 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-holostone-icon-medium rotate: false - xy: 1973, 625 + xy: 1013, 36 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-sand-icon-large rotate: false - xy: 695, 423 + xy: 1637, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-sand-icon-small rotate: false - xy: 1391, 25 + xy: 1632, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-sand1 rotate: false - xy: 1939, 591 + xy: 1013, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-sand2 rotate: false - xy: 1905, 557 + xy: 1047, 36 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-sand3 rotate: false - xy: 1973, 591 + xy: 1047, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-sand-icon-full rotate: false - xy: 1973, 591 + xy: 1047, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-sand-icon-medium rotate: false - xy: 1973, 591 + xy: 1047, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-snow-icon-large rotate: false - xy: 695, 373 + xy: 1687, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-snow-icon-small rotate: false - xy: 1417, 51 + xy: 1658, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-snow1 rotate: false - xy: 1939, 557 + xy: 1045, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-snow2 rotate: false - xy: 1973, 557 + xy: 1045, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-snow3 rotate: false - xy: 2007, 761 + xy: 1079, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-snow-icon-full rotate: false - xy: 2007, 761 + xy: 1079, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-snow-icon-medium rotate: false - xy: 2007, 761 + xy: 1079, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-icon-large rotate: false - xy: 695, 323 + xy: 1687, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-stained-stone-icon-small rotate: false - xy: 1417, 25 + xy: 1684, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-stained-stone-red-icon-large rotate: false - xy: 695, 273 + xy: 1737, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-stained-stone-red-icon-small rotate: false - xy: 1443, 51 + xy: 1710, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-stained-stone-red1 rotate: false - xy: 2007, 625 + xy: 1147, 442 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-red2 rotate: false - xy: 2007, 591 + xy: 1181, 442 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-red3 rotate: false - xy: 2007, 557 + xy: 1215, 442 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-red-icon-full rotate: false - xy: 2007, 557 + xy: 1215, 442 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-red-icon-medium rotate: false - xy: 2007, 557 + xy: 1215, 442 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone1 rotate: false - xy: 2007, 727 + xy: 1113, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone2 rotate: false - xy: 2007, 693 + xy: 1079, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone3 rotate: false - xy: 2007, 659 + xy: 1113, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-icon-full rotate: false - xy: 2007, 659 + xy: 1113, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stained-stone-icon-medium rotate: false - xy: 2007, 659 + xy: 1113, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stone-icon-large rotate: false - xy: 695, 223 + xy: 1737, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-stone-icon-small rotate: false - xy: 1443, 25 + xy: 1736, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-stone1 rotate: false - xy: 1863, 523 + xy: 1249, 442 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stone2 rotate: false - xy: 1897, 523 + xy: 1147, 408 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stone3 rotate: false - xy: 1931, 523 + xy: 1181, 408 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stone-icon-full rotate: false - xy: 1931, 523 + xy: 1181, 408 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-stone-icon-medium rotate: false - xy: 1931, 523 + xy: 1181, 408 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-holostone-icon-large rotate: false - xy: 745, 427 + xy: 1787, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-thorium-holostone-icon-small rotate: false - xy: 1701, 254 + xy: 1762, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-thorium-holostone1 rotate: false - xy: 1965, 523 + xy: 1215, 408 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-holostone2 rotate: false - xy: 1999, 523 + xy: 1249, 408 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-holostone3 rotate: false - xy: 1865, 489 + xy: 1283, 433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-holostone-icon-full rotate: false - xy: 1865, 489 + xy: 1283, 433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-holostone-icon-medium rotate: false - xy: 1865, 489 + xy: 1283, 433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand-icon-large rotate: false - xy: 745, 377 + xy: 1787, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-thorium-sand-icon-small rotate: false - xy: 1697, 228 + xy: 1788, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 1865, 455 + xy: 1317, 433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 1899, 489 + xy: 1283, 399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 1899, 455 + xy: 1317, 399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand-icon-full rotate: false - xy: 1899, 455 + xy: 1317, 399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand-icon-medium rotate: false - xy: 1899, 455 + xy: 1317, 399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-icon-large rotate: false - xy: 795, 427 + xy: 1837, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-thorium-stained-stone-icon-small rotate: false - xy: 1697, 202 + xy: 1814, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-thorium-stained-stone-red-icon-large rotate: false - xy: 745, 327 + xy: 1837, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-thorium-stained-stone-red-icon-small rotate: false - xy: 1697, 176 + xy: 1840, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-thorium-stained-stone-red1 rotate: false - xy: 1967, 455 + xy: 1453, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-red2 rotate: false - xy: 2001, 489 + xy: 1487, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-red3 rotate: false - xy: 2001, 455 + xy: 1521, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-red-icon-full rotate: false - xy: 2001, 455 + xy: 1521, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-red-icon-medium rotate: false - xy: 2001, 455 + xy: 1521, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone1 rotate: false - xy: 1933, 489 + xy: 1351, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone2 rotate: false - xy: 1933, 455 + xy: 1385, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone3 rotate: false - xy: 1967, 489 + xy: 1419, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-icon-full rotate: false - xy: 1967, 489 + xy: 1419, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stained-stone-icon-medium rotate: false - xy: 1967, 489 + xy: 1419, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone-icon-large rotate: false - xy: 795, 377 + xy: 1887, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-thorium-stone-icon-small rotate: false - xy: 1727, 251 + xy: 1866, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 1893, 421 + xy: 1555, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 1893, 387 + xy: 1589, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 1927, 421 + xy: 1623, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone-icon-full rotate: false - xy: 1927, 421 + xy: 1623, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone-icon-medium rotate: false - xy: 1927, 421 + xy: 1623, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-holostone-icon-large rotate: false - xy: 845, 427 + xy: 1887, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-titanium-holostone-icon-small rotate: false - xy: 1753, 251 + xy: 1892, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-titanium-holostone1 rotate: false - xy: 1927, 387 + xy: 1351, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-holostone2 rotate: false - xy: 1961, 421 + xy: 1385, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-holostone3 rotate: false - xy: 1961, 387 + xy: 1419, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-holostone-icon-full rotate: false - xy: 1961, 387 + xy: 1419, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-holostone-icon-medium rotate: false - xy: 1961, 387 + xy: 1419, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand-icon-large rotate: false - xy: 745, 277 + xy: 953, 177 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-titanium-sand-icon-small rotate: false - xy: 1779, 251 + xy: 1918, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 1995, 421 + xy: 1453, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 1995, 387 + xy: 1487, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 1893, 353 + xy: 1521, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand-icon-full rotate: false - xy: 1893, 353 + xy: 1521, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand-icon-medium rotate: false - xy: 1893, 353 + xy: 1521, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-icon-large rotate: false - xy: 795, 327 + xy: 953, 127 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-titanium-stained-stone-icon-small rotate: false - xy: 1723, 225 + xy: 1944, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-titanium-stained-stone-red-icon-large rotate: false - xy: 845, 377 + xy: 703, 115 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-titanium-stained-stone-red-icon-small rotate: false - xy: 1723, 199 + xy: 1970, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-titanium-stained-stone-red1 rotate: false - xy: 579, 139 + xy: 1657, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-red2 rotate: false - xy: 613, 139 + xy: 1657, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-red3 rotate: false - xy: 647, 139 + xy: 1691, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-red-icon-full rotate: false - xy: 647, 139 + xy: 1691, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-red-icon-medium rotate: false - xy: 647, 139 + xy: 1691, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone1 rotate: false - xy: 1927, 353 + xy: 1555, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone2 rotate: false - xy: 1961, 353 + xy: 1589, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone3 rotate: false - xy: 1995, 353 + xy: 1623, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-icon-full rotate: false - xy: 1995, 353 + xy: 1623, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stained-stone-icon-medium rotate: false - xy: 1995, 353 + xy: 1623, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone-icon-large rotate: false - xy: 745, 227 + xy: 753, 115 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-titanium-stone-icon-small rotate: false - xy: 1749, 225 + xy: 1996, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 681, 139 + xy: 1691, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 589, 105 + xy: 1725, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 623, 105 + xy: 1725, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone-icon-full rotate: false - xy: 623, 105 + xy: 1725, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone-icon-medium rotate: false - xy: 623, 105 + xy: 1725, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector-icon-large rotate: false - xy: 795, 277 + xy: 803, 77 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 overdrive-projector-icon-medium rotate: false - xy: 589, 71 + xy: 1759, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector-icon-small rotate: false - xy: 1749, 199 + xy: 1501, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 overflow-gate-icon-large rotate: false - xy: 845, 327 + xy: 853, 77 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 overflow-gate-icon-small rotate: false - xy: 1775, 225 + xy: 1527, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phantom-factory-icon-full rotate: false - xy: 771, 675 + xy: 771, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory-icon-large rotate: false - xy: 795, 227 + xy: 903, 77 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phantom-factory-icon-medium rotate: false - xy: 589, 37 + xy: 1793, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-small rotate: false - xy: 1775, 199 + xy: 1553, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conduit-icon-large rotate: false - xy: 845, 277 + xy: 953, 77 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-conduit-icon-small rotate: false - xy: 1723, 173 + xy: 1579, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conveyor-icon-large rotate: false - xy: 845, 227 + xy: 1537, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-conveyor-icon-small rotate: false - xy: 1749, 173 + xy: 1605, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-wall-icon-large rotate: false - xy: 529, 157 + xy: 1587, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-wall-icon-small rotate: false - xy: 1775, 173 + xy: 1631, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-wall-large-icon-large rotate: false - xy: 895, 427 + xy: 1637, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-wall-large-icon-medium rotate: false - xy: 657, 3 + xy: 1963, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-small rotate: false - xy: 1697, 150 + xy: 1657, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-weaver-icon-full rotate: false - xy: 781, 477 + xy: 747, 543 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-large rotate: false - xy: 895, 377 + xy: 1687, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-weaver-icon-medium rotate: false - xy: 691, 3 + xy: 1963, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-weaver-icon-small rotate: false - xy: 1723, 147 + xy: 1683, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pine-icon-large rotate: false - xy: 895, 327 + xy: 1737, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pine-icon-small rotate: false - xy: 1749, 147 + xy: 1709, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 plastanium-compressor-icon-large rotate: false - xy: 895, 277 + xy: 1787, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-medium rotate: false - xy: 759, 109 + xy: 1997, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-compressor-icon-small rotate: false - xy: 1775, 147 + xy: 1735, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pneumatic-drill-icon-full rotate: false - xy: 1575, 1297 + xy: 813, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-icon-large rotate: false - xy: 895, 227 + xy: 1837, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pneumatic-drill-icon-medium rotate: false - xy: 725, 75 + xy: 1657, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-small rotate: false - xy: 1805, 233 + xy: 1761, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-node-icon-large rotate: false - xy: 595, 173 + xy: 1887, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-node-icon-small rotate: false - xy: 1831, 233 + xy: 1787, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-node-large-icon-large rotate: false - xy: 645, 173 + xy: 1487, 939 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-node-large-icon-medium rotate: false - xy: 725, 41 + xy: 1725, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-small rotate: false - xy: 1857, 233 + xy: 1813, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-source-icon-large rotate: false - xy: 695, 173 + xy: 1477, 889 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-source-icon-small rotate: false - xy: 1801, 207 + xy: 1839, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-void-icon-large rotate: false - xy: 745, 177 + xy: 1477, 839 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-void-icon-small rotate: false - xy: 1801, 181 + xy: 1865, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pulse-conduit-icon-full rotate: false - xy: 793, 75 + xy: 1895, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-large rotate: false - xy: 795, 177 + xy: 1527, 889 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulse-conduit-icon-small rotate: false - xy: 1827, 207 + xy: 1891, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pulverizer-icon-full rotate: false - xy: 861, 41 + xy: 1063, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-large rotate: false - xy: 845, 177 + xy: 1527, 839 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulverizer-icon-small rotate: false - xy: 1801, 155 + xy: 1917, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pyratite-mixer-icon-large rotate: false - xy: 895, 177 + xy: 1577, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pyratite-mixer-icon-medium rotate: false - xy: 895, 109 + xy: 1097, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-small rotate: false - xy: 1827, 181 + xy: 1943, 109 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +repair-point + rotate: false + xy: 1131, 374 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +repair-point-icon-full + rotate: false + xy: 1131, 340 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +repair-point-icon-large + rotate: false + xy: 1627, 897 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +repair-point-icon-small + rotate: false + xy: 1969, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6880,21 +6845,21 @@ revenant-factory-icon-full index: -1 revenant-factory-icon-large rotate: false - xy: 1725, 791 + xy: 1627, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-factory-icon-medium rotate: false - xy: 895, 7 + xy: 1199, 374 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-small rotate: false - xy: 1853, 207 + xy: 1995, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6915,126 +6880,126 @@ ripple-icon-full index: -1 ripple-icon-large rotate: false - xy: 1737, 691 + xy: 1677, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ripple-icon-medium rotate: false - xy: 1249, 443 + xy: 1131, 306 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple-icon-small rotate: false - xy: 1827, 155 + xy: 1345, 94 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rocks-icon-large rotate: false - xy: 1775, 791 + xy: 1777, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-small rotate: false - xy: 1853, 181 + xy: 1371, 94 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rotary-pump-icon-large rotate: false - xy: 1787, 741 + xy: 1777, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rotary-pump-icon-medium rotate: false - xy: 1249, 409 + xy: 1165, 306 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-small rotate: false - xy: 1853, 155 + xy: 1397, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 router-icon-large rotate: false - xy: 1787, 691 + xy: 1827, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 router-icon-small rotate: false - xy: 1801, 129 + xy: 1423, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rtg-generator-icon-large rotate: false - xy: 1787, 641 + xy: 1827, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rtg-generator-icon-medium rotate: false - xy: 1317, 409 + xy: 1199, 306 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-small rotate: false - xy: 1827, 129 + xy: 1449, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salvo rotate: false - xy: 847, 477 + xy: 1303, 1284 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-icon-full rotate: false - xy: 1443, 1223 + xy: 1279, 1152 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-icon-large rotate: false - xy: 1787, 591 + xy: 1877, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 salvo-icon-medium rotate: false - xy: 1313, 375 + xy: 1233, 306 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-small rotate: false - xy: 1853, 129 + xy: 1475, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7048,14 +7013,14 @@ sand-edge index: -1 sand-icon-large rotate: false - xy: 1737, 541 + xy: 1877, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-icon-small rotate: false - xy: 1883, 215 + xy: 1501, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7069,147 +7034,147 @@ sand-water-edge index: -1 sand-water-icon-large rotate: false - xy: 1787, 541 + xy: 1927, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-water-icon-small rotate: false - xy: 1909, 215 + xy: 1527, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-large rotate: false - xy: 1766, 1123 + xy: 1927, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-medium rotate: false - xy: 1357, 137 + xy: 1301, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-small rotate: false - xy: 1935, 215 + xy: 1553, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-huge-icon-large rotate: false - xy: 1816, 1123 + xy: 1577, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-huge-icon-medium rotate: false - xy: 1357, 103 + xy: 1335, 352 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-huge-icon-small rotate: false - xy: 1961, 215 + xy: 1579, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-icon-large rotate: false - xy: 1866, 1123 + xy: 1627, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-icon-small rotate: false - xy: 1987, 215 + xy: 1605, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-large-icon-large rotate: false - xy: 1916, 1151 + xy: 1677, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-large-icon-medium rotate: false - xy: 1395, 307 + xy: 1369, 352 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-small rotate: false - xy: 2013, 215 + xy: 1631, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 separator-icon-large rotate: false - xy: 1966, 1151 + xy: 1727, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 separator-icon-medium rotate: false - xy: 1391, 239 + xy: 1335, 284 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator-icon-small rotate: false - xy: 1905, 189 + xy: 1709, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shock-mine-icon-large rotate: false - xy: 1916, 1101 + xy: 1777, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shock-mine-icon-small rotate: false - xy: 1905, 163 + xy: 1735, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 silicon-smelter-icon-large rotate: false - xy: 879, 671 + xy: 1877, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 silicon-smelter-icon-medium rotate: false - xy: 1391, 137 + xy: 1335, 250 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-smelter-icon-small rotate: false - xy: 1931, 189 + xy: 1761, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7223,91 +7188,91 @@ snow-edge index: -1 snow-icon-large rotate: false - xy: 879, 621 + xy: 1927, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-icon-small rotate: false - xy: 1905, 137 + xy: 1787, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 snowrocks-icon-large rotate: false - xy: 929, 671 + xy: 1937, 1047 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-small rotate: false - xy: 1931, 163 + xy: 1813, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-icon-large rotate: false - xy: 879, 571 + xy: 1937, 997 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 solar-panel-icon-small rotate: false - xy: 1957, 189 + xy: 1839, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-large-icon-large rotate: false - xy: 929, 621 + xy: 1937, 947 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 solar-panel-large-icon-medium rotate: false - xy: 1385, 425 + xy: 1437, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-small rotate: false - xy: 1931, 137 + xy: 1865, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sorter-icon-large rotate: false - xy: 929, 571 + xy: 1977, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sorter-icon-small rotate: false - xy: 1957, 163 + xy: 1891, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spawn-icon-large rotate: false - xy: 979, 656 + xy: 1977, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spawn-icon-small rotate: false - xy: 1983, 189 + xy: 1917, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7328,126 +7293,154 @@ spectre-icon-full index: -1 spectre-icon-large rotate: false - xy: 1029, 656 + xy: 1977, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spectre-icon-medium rotate: false - xy: 1483, 393 + xy: 1437, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-small rotate: false - xy: 1957, 137 + xy: 1943, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spirit-factory-icon-full rotate: false - xy: 1063, 1022 + xy: 1731, 1363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory-icon-large rotate: false - xy: 1079, 656 + xy: 1201, 838 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spirit-factory-icon-medium rotate: false - xy: 1407, 357 + xy: 1471, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spirit-factory-icon-small rotate: false - xy: 1983, 163 + xy: 1969, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spore-cluster-icon-large rotate: false - xy: 1029, 606 + xy: 1151, 788 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster-icon-medium rotate: false - xy: 1517, 377 + xy: 1505, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-cluster-icon-small rotate: false - xy: 2009, 189 + xy: 1995, 83 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +spore-press-icon-full + rotate: false + xy: 1633, 1297 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-icon-large + rotate: false + xy: 1251, 838 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-press-icon-medium + rotate: false + xy: 1539, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-press-icon-small + rotate: false + xy: 1709, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-boulder-icon-large rotate: false - xy: 1129, 656 + xy: 1201, 788 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-boulder-icon-small rotate: false - xy: 1983, 137 + xy: 1735, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-rocks-icon-large rotate: false - xy: 1079, 606 + xy: 1251, 788 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-rocks-icon-small rotate: false - xy: 2009, 163 + xy: 1761, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-rocks-red-icon-large rotate: false - xy: 1129, 606 + xy: 1151, 738 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-rocks-red-icon-small rotate: false - xy: 2009, 137 + xy: 1787, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-rocks-yellow-icon-large rotate: false - xy: 1179, 614 + xy: 1201, 738 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-rocks-yellow-icon-small rotate: false - xy: 1879, 110 + xy: 1813, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7461,14 +7454,14 @@ stained-stone-edge index: -1 stained-stone-icon-large rotate: false - xy: 1229, 614 + xy: 1251, 738 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-stone-icon-small rotate: false - xy: 1905, 111 + xy: 1839, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7482,14 +7475,14 @@ stained-stone-red-edge index: -1 stained-stone-red-icon-large rotate: false - xy: 1279, 611 + xy: 1301, 834 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-stone-red-icon-small rotate: false - xy: 1931, 111 + xy: 1865, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7503,14 +7496,14 @@ stained-stone-yellow-edge index: -1 stained-stone-yellow-icon-large rotate: false - xy: 1329, 611 + xy: 1301, 784 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-stone-yellow-icon-small rotate: false - xy: 1957, 111 + xy: 1891, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7524,105 +7517,105 @@ stone-edge index: -1 stone-icon-large rotate: false - xy: 979, 556 + xy: 1301, 734 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stone-icon-small rotate: false - xy: 1983, 111 + xy: 1917, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-tower-icon-large rotate: false - xy: 1029, 556 + xy: 1351, 826 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-tower-icon-medium rotate: false - xy: 1459, 255 + xy: 1675, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-small rotate: false - xy: 2009, 111 + xy: 1943, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-wall-icon-large rotate: false - xy: 1079, 556 + xy: 1401, 826 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-wall-icon-small rotate: false - xy: 1715, 121 + xy: 1969, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-wall-large-icon-large rotate: false - xy: 1129, 556 + xy: 1351, 776 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-wall-large-icon-medium rotate: false - xy: 1459, 187 + xy: 1743, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-small rotate: false - xy: 1741, 121 + xy: 1995, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 swarmer rotate: false - xy: 1195, 988 + xy: 845, 905 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-full rotate: false - xy: 1261, 1054 + xy: 911, 905 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-large rotate: false - xy: 1229, 564 + xy: 1351, 726 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-icon-medium rotate: false - xy: 1459, 153 + xy: 1709, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer-icon-small rotate: false - xy: 1767, 121 + xy: 1683, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7636,273 +7629,273 @@ tar-edge index: -1 tar-icon-large rotate: false - xy: 1279, 561 + xy: 1401, 726 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tar-icon-small rotate: false - xy: 1727, 95 + xy: 1709, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tau-mech-pad-icon-large rotate: false - xy: 1429, 577 + xy: 1451, 739 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-pad-icon-medium rotate: false - xy: 1459, 85 + xy: 1777, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tau-mech-pad-icon-small rotate: false - xy: 1753, 95 + xy: 1735, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thermal-generator-icon-large rotate: false - xy: 913, 521 + xy: 1501, 739 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thermal-generator-icon-medium rotate: false - xy: 1509, 343 + xy: 1743, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-generator-icon-small rotate: false - xy: 1727, 69 + xy: 1761, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thermal-pump-icon-large rotate: false - xy: 963, 506 + xy: 1551, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thermal-pump-icon-medium rotate: false - xy: 1543, 343 + xy: 1777, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-icon-small rotate: false - xy: 1753, 69 + xy: 1787, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor-icon-large rotate: false - xy: 1013, 506 + xy: 1601, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-reactor-icon-medium rotate: false - xy: 1679, 343 + xy: 1845, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-reactor-icon-small rotate: false - xy: 1779, 95 + xy: 1813, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-wall-icon-large rotate: false - xy: 1063, 506 + xy: 1651, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-wall-icon-small rotate: false - xy: 1779, 69 + xy: 1839, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-wall-large-icon-large rotate: false - xy: 1113, 506 + xy: 1701, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-wall-large-icon-medium rotate: false - xy: 1531, 309 + xy: 1845, 281 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-small rotate: false - xy: 1805, 103 + xy: 1865, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thruster-icon-large rotate: false - xy: 1379, 527 + xy: 1751, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thruster-icon-medium rotate: false - xy: 1565, 309 + xy: 1879, 315 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thruster-icon-small rotate: false - xy: 1831, 103 + xy: 1891, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-icon-full rotate: false - xy: 1139, 1299 + xy: 1237, 1397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titan-factory-icon-large rotate: false - xy: 1429, 527 + xy: 1801, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan-factory-icon-medium rotate: false - xy: 1599, 309 + xy: 1845, 247 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titan-factory-icon-small rotate: false - xy: 1805, 77 + xy: 1917, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-conveyor-icon-large rotate: false - xy: 1479, 545 + xy: 1851, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-conveyor-icon-small rotate: false - xy: 1831, 77 + xy: 1943, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-wall-icon-large rotate: false - xy: 1529, 529 + xy: 1901, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-wall-icon-small rotate: false - xy: 1805, 51 + xy: 1969, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-wall-large-icon-large rotate: false - xy: 1579, 529 + xy: 1951, 747 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-wall-large-icon-medium rotate: false - xy: 1561, 139 + xy: 1981, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-small rotate: false - xy: 1831, 51 + xy: 1995, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 trident-ship-pad-icon-large rotate: false - xy: 1629, 529 + xy: 1451, 689 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship-pad-icon-medium rotate: false - xy: 1629, 207 + xy: 1071, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 trident-ship-pad-icon-small rotate: false - xy: 1857, 84 + xy: 1170, 178 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 turbine-generator-icon-large rotate: false - xy: 1679, 529 + xy: 1501, 689 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 turbine-generator-icon-medium rotate: false - xy: 1663, 241 + xy: 1071, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 turbine-generator-icon-small rotate: false - xy: 1857, 58 + xy: 1196, 178 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -7916,14 +7909,14 @@ unit-icon-chaos-array index: -1 unit-icon-crawler rotate: false - xy: 1479, 495 + xy: 1551, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-icon-dagger rotate: false - xy: 1529, 479 + xy: 1601, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -7937,56 +7930,56 @@ unit-icon-eradicator index: -1 unit-icon-eruptor rotate: false - xy: 1393, 1091 + xy: 969, 773 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-icon-fortress rotate: false - xy: 1393, 1025 + xy: 903, 707 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-icon-titan rotate: false - xy: 1393, 959 + xy: 1035, 773 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unloader-icon-large rotate: false - xy: 1579, 479 + xy: 1651, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unloader-icon-small rotate: false - xy: 1883, 84 + xy: 1188, 152 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 vault-icon-large rotate: false - xy: 1629, 479 + xy: 1701, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vault-icon-medium rotate: false - xy: 1595, 139 + xy: 1071, 137 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-small rotate: false - xy: 1883, 58 + xy: 1137, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8000,312 +7993,1662 @@ water-edge index: -1 water-extractor-icon-full rotate: false - xy: 1459, 1025 + xy: 1035, 707 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-icon-large rotate: false - xy: 1679, 479 + xy: 1751, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 water-extractor-icon-medium rotate: false - xy: 1663, 207 + xy: 1105, 238 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-extractor-icon-small rotate: false - xy: 1909, 85 + xy: 1163, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 water-icon-large rotate: false - xy: 1729, 491 + xy: 1801, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 water-icon-small rotate: false - xy: 1909, 59 + xy: 1189, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 wave rotate: false - xy: 1327, 861 + xy: 945, 575 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-full rotate: false - xy: 1393, 827 + xy: 1011, 641 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-large rotate: false - xy: 1779, 491 + xy: 1851, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wave-icon-medium rotate: false - xy: 1595, 105 + xy: 1139, 238 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-icon-small rotate: false - xy: 1935, 85 + xy: 2022, 135 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 white-tree-dead-icon-large rotate: false - xy: 1163, 506 + xy: 1901, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 white-tree-dead-icon-medium rotate: false - xy: 1629, 139 + xy: 1105, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white-tree-dead-icon-small rotate: false - xy: 1935, 59 + xy: 2021, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 white-tree-icon-large rotate: false - xy: 1213, 514 + xy: 1951, 697 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 white-tree-icon-medium rotate: false - xy: 1663, 173 + xy: 1173, 238 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white-tree-icon-small rotate: false - xy: 1961, 85 + xy: 2021, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 wraith-factory-icon-full rotate: false - xy: 1503, 1157 + xy: 913, 509 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory-icon-large rotate: false - xy: 1313, 511 + xy: 1601, 647 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wraith-factory-icon-medium rotate: false - xy: 1629, 105 + xy: 1105, 170 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wraith-factory-icon-small rotate: false - xy: 1961, 59 + xy: 2021, 57 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-biomatter rotate: false - xy: 1723, 389 + xy: 1841, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1757, 389 + xy: 1875, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1791, 389 + xy: 1841, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1825, 371 + xy: 1875, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 1859, 371 + xy: 1909, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 1733, 1089 + xy: 1875, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 1767, 1089 + xy: 1909, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 1733, 1055 + xy: 1943, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 1801, 1089 + xy: 1909, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 1767, 1055 + xy: 1943, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 1733, 1021 + xy: 1943, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 1835, 1089 + xy: 1977, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1801, 1055 + xy: 1977, 519 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod + rotate: false + xy: 1989, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1869, 1089 + xy: 2011, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1835, 1055 + xy: 2011, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1801, 1021 + xy: 2011, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1971, 999 + xy: 1945, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 2005, 1033 + xy: 1979, 1165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1741, 919 + xy: 1979, 1097 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1843, 987 + xy: 1987, 995 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 455, 17 + xy: 511, 291 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 1525, 795 + xy: 577, 365 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 1575, 779 + xy: 627, 365 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +delta-mech + rotate: false + xy: 1707, 1197 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta-mech-base + rotate: false + xy: 1757, 1197 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta-mech-leg + rotate: false + xy: 1807, 1197 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +omega-mech + rotate: false + xy: 455, 1 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +omega-mech-armor + rotate: false + xy: 639, 675 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +omega-mech-base + rotate: false + xy: 479, 117 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +omega-mech-leg + rotate: false + xy: 513, 59 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +tau-mech + rotate: false + xy: 635, 415 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +tau-mech-base + rotate: false + xy: 1451, 789 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +tau-mech-leg + rotate: false + xy: 1501, 789 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dart-ship + rotate: false + xy: 1607, 1197 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +glaive-ship + rotate: false + xy: 421, 117 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +javelin-ship + rotate: false + xy: 1645, 1147 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +javelin-ship-shield + rotate: false + xy: 1745, 1147 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +trident-ship + rotate: false + xy: 519, 391 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +blank + rotate: false + xy: 1398, 169 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +circle + rotate: false + xy: 323, 1758 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +clear + rotate: false + xy: 2003, 1407 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +shape-3 + rotate: false + xy: 979, 444 + size: 63, 63 + orig: 63, 63 + offset: 0, 0 + index: -1 +bar + rotate: false + xy: 1290, 123 + size: 27, 36 + split: 9, 9, 9, 9 + orig: 27, 36 + offset: 0, 0 + index: -1 +bar-top + rotate: false + xy: 1139, 160 + size: 27, 36 + split: 9, 10, 9, 10 + orig: 27, 36 + offset: 0, 0 + index: -1 +button + rotate: false + xy: 1223, 709 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-disabled + rotate: false + xy: 2011, 1642 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-down + rotate: false + xy: 2011, 1613 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-1 + rotate: false + xy: 2011, 1584 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-2 + rotate: false + xy: 2011, 1555 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-3 + rotate: false + xy: 2011, 1526 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-4 + rotate: false + xy: 2011, 1497 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-over + rotate: false + xy: 2011, 1468 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right + rotate: false + xy: 1185, 709 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-down + rotate: false + xy: 639, 646 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-over + rotate: false + xy: 837, 678 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-select + rotate: false + xy: 1319, 135 + size: 24, 24 + split: 4, 4, 4, 4 + orig: 24, 24 + offset: 0, 0 + index: -1 +check-off + rotate: false + xy: 1207, 238 + size: 28, 32 + orig: 28, 32 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 1237, 238 + size: 28, 32 + orig: 28, 32 + offset: 0, 0 + index: -1 +check-on-over + rotate: false + xy: 1170, 204 + size: 28, 32 + orig: 28, 32 + offset: 0, 0 + index: -1 +check-over + rotate: false + xy: 1200, 204 + size: 28, 32 + orig: 28, 32 + offset: 0, 0 + index: -1 +clear + rotate: false + xy: 1225, 1287 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +content-background + rotate: false + xy: 1135, 667 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +content-background-locked + rotate: false + xy: 1261, 709 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +content-background-over + rotate: false + xy: 1299, 705 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +cursor + rotate: false + xy: 1045, 569 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +discord-banner + rotate: false + xy: 1139, 1252 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +empty-sector + rotate: false + xy: 1753, 621 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-crafting + rotate: false + xy: 2031, 397 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-defense + rotate: false + xy: 2031, 379 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-distribution + rotate: false + xy: 2031, 361 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-effect + rotate: false + xy: 1188, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-liquid + rotate: false + xy: 1135, 573 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-power + rotate: false + xy: 527, 1525 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-production + rotate: false + xy: 893, 441 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-turret + rotate: false + xy: 625, 3 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-units + rotate: false + xy: 437, 1000 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-upgrade + rotate: false + xy: 473, 1000 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +controller-cursor + rotate: false + xy: 453, 637 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-about + rotate: false + xy: 535, 1100 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-add + rotate: false + xy: 561, 375 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-admin + rotate: false + xy: 623, 923 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-admin-small + rotate: false + xy: 603, 257 + size: 6, 6 + orig: 6, 6 + offset: 0, 0 + index: -1 +icon-areaDelete + rotate: false + xy: 1213, 1240 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow + rotate: false + xy: 1045, 391 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-16 + rotate: false + xy: 1045, 391 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-down + rotate: false + xy: 1323, 1385 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow-left + rotate: false + xy: 1345, 1206 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow-right + rotate: false + xy: 777, 365 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-arrow-up + rotate: false + xy: 1173, 684 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-back + rotate: false + xy: 471, 637 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-ban + rotate: false + xy: 927, 377 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-break + rotate: false + xy: 489, 637 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cancel + rotate: false + xy: 1168, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cancel-2 + rotate: false + xy: 1999, 187 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +icon-chat + rotate: false + xy: 1365, 591 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-check + rotate: false + xy: 2031, 433 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-check-2 + rotate: false + xy: 1141, 108 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +icon-copy + rotate: false + xy: 2031, 415 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cursor + rotate: false + xy: 961, 227 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-database + rotate: false + xy: 1641, 359 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-database-small + rotate: false + xy: 775, 77 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-dev-builds + rotate: false + xy: 1551, 797 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-discord + rotate: false + xy: 845, 971 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-donate + rotate: false + xy: 911, 427 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-dots + rotate: false + xy: 2025, 161 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-editor + rotate: false + xy: 2025, 641 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-egg + rotate: false + xy: 535, 1084 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-elevation + rotate: false + xy: 845, 1543 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-eraser + rotate: false + xy: 845, 987 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-exit + rotate: false + xy: 623, 907 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-file + rotate: false + xy: 527, 1543 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-image + rotate: false + xy: 893, 459 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-text + rotate: false + xy: 943, 377 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-fill + rotate: false + xy: 1109, 953 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy + rotate: false + xy: 1214, 162 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-floppy-16 + rotate: false + xy: 477, 1698 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder + rotate: false + xy: 1993, 1199 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-folder-parent + rotate: false + xy: 959, 377 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-generated + rotate: false + xy: 927, 393 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-github + rotate: false + xy: 1434, 710 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-google-play + rotate: false + xy: 2032, 2033 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-grid + rotate: false + xy: 431, 27 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-hold + rotate: false + xy: 2023, 587 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-holdDelete + rotate: false + xy: 845, 1071 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-home + rotate: false + xy: 1229, 102 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-host + rotate: false + xy: 1247, 120 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-info + rotate: false + xy: 1434, 694 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-itch.io + rotate: false + xy: 2032, 2017 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-item + rotate: false + xy: 2031, 349 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-items-none + rotate: false + xy: 526, 1951 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +icon-line + rotate: false + xy: 1897, 1345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-link + rotate: false + xy: 1229, 86 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-liquid-small + rotate: false + xy: 845, 1495 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-load + rotate: false + xy: 1263, 120 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-load-image + rotate: false + xy: 1275, 585 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load-map + rotate: false + xy: 681, 139 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-loading + rotate: false + xy: 571, 3 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-locked + rotate: false + xy: 1267, 245 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-logic + rotate: false + xy: 1109, 905 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-map + rotate: false + xy: 2032, 2001 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-menu + rotate: false + xy: 1213, 1228 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-menu-large + rotate: false + xy: 1991, 623 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-missing + rotate: false + xy: 1323, 1373 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-mission-background + rotate: false + xy: 845, 1083 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +icon-mission-battle + rotate: false + xy: 1345, 1194 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-mission-defense + rotate: false + xy: 789, 365 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-mission-done + rotate: false + xy: 973, 227 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-none + rotate: false + xy: 787, 77 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-paste + rotate: false + xy: 2025, 195 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pause + rotate: false + xy: 1323, 1361 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-pencil + rotate: false + xy: 2021, 39 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pencil-small + rotate: false + xy: 1229, 70 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-pick + rotate: false + xy: 845, 1525 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play + rotate: false + xy: 985, 227 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-play-2 + rotate: false + xy: 2032, 1985 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-play-custom + rotate: false + xy: 1229, 54 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-players + rotate: false + xy: 537, 165 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-power-requirement + rotate: false + xy: 1739, 485 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-power-small + rotate: false + xy: 2035, 587 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-quit + rotate: false + xy: 2032, 1969 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-redo + rotate: false + xy: 1109, 935 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-refresh + rotate: false + xy: 2032, 1953 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rename + rotate: false + xy: 1229, 38 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-resize + rotate: false + xy: 495, 1698 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate + rotate: false + xy: 2021, 23 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rotate-arrow + rotate: false + xy: 2027, 941 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rotate-left + rotate: false + xy: 2027, 925 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-rotate-right + rotate: false + xy: 2027, 909 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-save + rotate: false + xy: 2027, 893 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-save-image + rotate: false + xy: 431, 9 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save-map + rotate: false + xy: 589, 3 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-settings + rotate: false + xy: 1275, 671 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-spray + rotate: false + xy: 2025, 177 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-terrain + rotate: false + xy: 845, 1507 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tools + rotate: false + xy: 2027, 877 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-touch + rotate: false + xy: 661, 9 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-touchDelete + rotate: false + xy: 1907, 1291 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-trash + rotate: false + xy: 2027, 861 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-trash-16 + rotate: false + xy: 1109, 917 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tree + rotate: false + xy: 607, 3 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tree-locked + rotate: false + xy: 1773, 519 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trello + rotate: false + xy: 2027, 845 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-tutorial + rotate: false + xy: 2027, 829 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-undo + rotate: false + xy: 643, 3 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-unlocked + rotate: false + xy: 455, 1000 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-unlocks + rotate: false + xy: 2027, 813 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-wiki + rotate: false + xy: 2027, 797 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-zone + rotate: false + xy: 1141, 82 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +icon-zone-locked + rotate: false + xy: 1907, 1197 + size: 42, 42 + orig: 42, 42 + offset: 0, 0 + index: -1 +icon-zoom + rotate: false + xy: 491, 1000 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-zoom-small + rotate: false + xy: 1337, 710 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +info-banner + rotate: false + xy: 1237, 1350 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +inventory + rotate: false + xy: 2023, 599 + size: 24, 40 + split: 10, 10, 10, 14 + orig: 24, 40 + offset: 0, 0 + index: -1 +logotext + rotate: false + xy: 1, 1961 + size: 579, 86 + orig: 579, 86 + offset: 0, 0 + index: -1 +pane + rotate: false + xy: 2003, 1410 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +pane-2 + rotate: false + xy: 2003, 1439 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +scroll + rotate: false + xy: 1683, 72 + size: 24, 35 + split: 10, 10, 6, 5 + orig: 24, 35 + offset: 0, 0 + index: -1 +scroll-horizontal + rotate: false + xy: 1261, 683 + size: 35, 24 + split: 6, 5, 10, 10 + orig: 35, 24 + offset: 0, 0 + index: -1 +scroll-knob-horizontal-black + rotate: false + xy: 1151, 888 + size: 40, 24 + split: 11, 10, 10, 10 + orig: 40, 24 + offset: 0, 0 + index: -1 +scroll-knob-vertical-black + rotate: false + xy: 1657, 67 + size: 24, 40 + split: 10, 10, 6, 10 + orig: 24, 40 + offset: 0, 0 + index: -1 +sector-select + rotate: false + xy: 1335, 318 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 1433, 587 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 1136, 160 + size: 1, 8 + orig: 1, 8 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 1139, 198 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-down + rotate: false + xy: 1105, 130 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 1105, 130 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-vertical + rotate: false + xy: 837, 675 + size: 8, 1 + orig: 8, 1 + offset: 0, 0 + index: -1 +underline + rotate: false + xy: 1223, 680 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-2 + rotate: false + xy: 1185, 680 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +white + rotate: false + xy: 1369, 1284 + size: 3, 3 + orig: 3, 3 + offset: 0, 0 + index: -1 +window-empty + rotate: false + xy: 1320, 187 + size: 27, 61 + split: 8, 8, 44, 11 + orig: 27, 61 + offset: 0, 0 + index: -1 chaos-array rotate: false xy: 786, 1821 @@ -8327,23 +9670,44 @@ chaos-array-leg orig: 128, 128 offset: 0, 0 index: -1 -delta-mech +crawler rotate: false - xy: 1087, 806 + xy: 1657, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -delta-mech-base +crawler-base rotate: false - xy: 1137, 856 + xy: 1707, 1247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -delta-mech-leg +crawler-leg rotate: false - xy: 1087, 756 + xy: 1757, 1247 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 1407, 1189 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 1457, 1189 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-leg + rotate: false + xy: 1557, 1197 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -8369,1408 +9733,58 @@ eradicator-leg orig: 152, 124 offset: 0, 0 index: -1 -omega-mech - rotate: false - xy: 1525, 845 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-mech-armor - rotate: false - xy: 1583, 1107 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-mech-base - rotate: false - xy: 1583, 1049 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-mech-leg - rotate: false - xy: 1641, 1107 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -tau-mech - rotate: false - xy: 1583, 933 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -tau-mech-base - rotate: false - xy: 1329, 561 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -tau-mech-leg - rotate: false - xy: 1379, 577 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dart-ship - rotate: false - xy: 1087, 856 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -glaive-ship - rotate: false - xy: 421, 117 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -javelin-ship - rotate: false - xy: 1537, 679 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -javelin-ship-shield - rotate: false - xy: 1587, 679 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -trident-ship - rotate: false - xy: 1641, 991 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 1727, 277 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -circle - rotate: false - xy: 323, 1758 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 1279, 661 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 1701, 1166 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -bar - rotate: false - xy: 2016, 1125 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 2016, 1163 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 1905, 1400 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 1487, 798 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 2011, 1634 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 2011, 1605 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 2011, 1576 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 2011, 1547 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 2011, 1518 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 2011, 1489 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 2011, 1402 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 2011, 1460 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 2011, 1431 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1007, 103 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 553, 473 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1419, 425 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 915, 143 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1733, 1132 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 1725, 779 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -content-background - rotate: false - xy: 987, 309 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -content-background-locked - rotate: false - xy: 529, 128 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -content-background-over - rotate: false - xy: 945, 267 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 421, 111 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -discord-banner - rotate: false - xy: 1041, 1154 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -empty-sector - rotate: false - xy: 1293, 294 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-crafting - rotate: false - xy: 1371, 1139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-defense - rotate: false - xy: 531, 1543 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-distribution - rotate: false - xy: 845, 987 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-effect - rotate: false - xy: 1882, 1213 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid - rotate: false - xy: 1857, 111 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-power - rotate: false - xy: 2005, 93 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-production - rotate: false - xy: 845, 1507 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-turret - rotate: false - xy: 1987, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-units - rotate: false - xy: 1097, 315 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-upgrade - rotate: false - xy: 2023, 75 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -controller-cursor - rotate: false - xy: 453, 637 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-about - rotate: false - xy: 1207, 464 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-add - rotate: false - xy: 535, 1100 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-admin - rotate: false - xy: 1537, 779 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-admin-small - rotate: false - xy: 1483, 1421 - size: 6, 6 - orig: 6, 6 - offset: 0, 0 - index: -1 -icon-areaDelete - rotate: false - xy: 1225, 1287 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow - rotate: false - xy: 1351, 459 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-16 - rotate: false - xy: 1351, 459 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-down - rotate: false - xy: 1683, 829 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow-left - rotate: false - xy: 639, 637 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow-right - rotate: false - xy: 567, 145 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-arrow-up - rotate: false - xy: 1127, 1189 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-back - rotate: false - xy: 471, 637 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-ban - rotate: false - xy: 553, 457 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-break - rotate: false - xy: 489, 637 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cancel - rotate: false - xy: 845, 1543 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cancel-2 - rotate: false - xy: 1111, 103 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -icon-chat - rotate: false - xy: 1345, 112 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-check - rotate: false - xy: 1335, 1403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-check-2 - rotate: false - xy: 1085, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -icon-copy - rotate: false - xy: 1173, 1102 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cursor - rotate: false - xy: 1715, 109 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-dev-builds - rotate: false - xy: 623, 923 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-discord - rotate: false - xy: 1363, 545 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-donate - rotate: false - xy: 1837, 541 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-dots - rotate: false - xy: 1865, 439 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-editor - rotate: false - xy: 579, 191 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-egg - rotate: false - xy: 1351, 409 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-elevation - rotate: false - xy: 433, 27 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-eraser - rotate: false - xy: 477, 1698 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-exit - rotate: false - xy: 1381, 375 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-file - rotate: false - xy: 1877, 1003 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-image - rotate: false - xy: 1851, 901 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-text - rotate: false - xy: 1407, 341 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-fill - rotate: false - xy: 1825, 799 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy - rotate: false - xy: 1429, 273 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 2016, 1107 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder - rotate: false - xy: 1767, 903 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-folder-parent - rotate: false - xy: 845, 971 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-generated - rotate: false - xy: 1387, 677 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-github - rotate: false - xy: 1843, 801 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-google-play - rotate: false - xy: 535, 1084 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-grid - rotate: false - xy: 1223, 433 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-hold - rotate: false - xy: 845, 1071 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-holdDelete - rotate: false - xy: 845, 1495 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-home - rotate: false - xy: 1553, 779 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-host - rotate: false - xy: 569, 457 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-info - rotate: false - xy: 623, 907 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-itch.io - rotate: false - xy: 1363, 529 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-item - rotate: false - xy: 1881, 443 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-items-none - rotate: false - xy: 526, 1951 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -icon-line - rotate: false - xy: 1153, 1168 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-link - rotate: false - xy: 579, 175 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-liquid-small - rotate: false - xy: 971, 159 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-load - rotate: false - xy: 1900, 1185 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-load-image - rotate: false - xy: 1987, 93 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-map - rotate: false - xy: 845, 1525 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-loading - rotate: false - xy: 1353, 1403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-locked - rotate: false - xy: 531, 1525 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-logic - rotate: false - xy: 1225, 1275 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-map - rotate: false - xy: 2033, 541 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-menu - rotate: false - xy: 1695, 829 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-menu-large - rotate: false - xy: 1882, 1195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing - rotate: false - xy: 651, 637 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-mission-background - rotate: false - xy: 845, 1083 - size: 18, 18 - orig: 18, 18 - offset: 0, 0 - index: -1 -icon-mission-battle - rotate: false - xy: 971, 147 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-mission-defense - rotate: false - xy: 1225, 1263 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-mission-done - rotate: false - xy: 1707, 829 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-none - rotate: false - xy: 663, 637 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-paste - rotate: false - xy: 433, 9 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pause - rotate: false - xy: 1497, 347 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-pencil - rotate: false - xy: 495, 1698 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pencil-small - rotate: false - xy: 2033, 525 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-pick - rotate: false - xy: 1987, 75 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play - rotate: false - xy: 1767, 891 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-play-2 - rotate: false - xy: 451, 1 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-play-custom - rotate: false - xy: 467, 1 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-players - rotate: false - xy: 2037, 1390 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-power-small - rotate: false - xy: 2037, 1378 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-quit - rotate: false - xy: 483, 1 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-redo - rotate: false - xy: 531, 1507 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-refresh - rotate: false - xy: 499, 1 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rename - rotate: false - xy: 945, 129 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-resize - rotate: false - xy: 1882, 1177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate - rotate: false - xy: 961, 129 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rotate-arrow - rotate: false - xy: 1363, 513 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rotate-left - rotate: false - xy: 2032, 2033 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-rotate-right - rotate: false - xy: 1419, 9 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-save - rotate: false - xy: 2032, 2017 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-save-image - rotate: false - xy: 2005, 75 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-map - rotate: false - xy: 437, 1000 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings - rotate: false - xy: 2037, 1366 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-spray - rotate: false - xy: 455, 1000 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-terrain - rotate: false - xy: 473, 1000 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tools - rotate: false - xy: 1435, 9 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-touch - rotate: false - xy: 2037, 1354 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-touchDelete - rotate: false - xy: 2037, 1342 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -icon-trash - rotate: false - xy: 2032, 2001 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-trash-16 - rotate: false - xy: 491, 1000 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree - rotate: false - xy: 509, 1000 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree-locked - rotate: false - xy: 1519, 411 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trello - rotate: false - xy: 1451, 9 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-tutorial - rotate: false - xy: 2032, 1985 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-undo - rotate: false - xy: 2005, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-unlocked - rotate: false - xy: 2023, 93 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-unlocks - rotate: false - xy: 2032, 1969 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-wiki - rotate: false - xy: 2032, 1953 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -icon-zone - rotate: false - xy: 1079, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -icon-zone-locked - rotate: false - xy: 389, 1 - size: 42, 42 - orig: 42, 42 - offset: 0, 0 - index: -1 -icon-zoom - rotate: false - xy: 2023, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-zoom-small - rotate: false - xy: 1694, 134 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -info-banner - rotate: false - xy: 1139, 1252 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -inventory - rotate: false - xy: 1105, 35 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -logotext - rotate: false - xy: 1, 1961 - size: 579, 86 - orig: 579, 86 - offset: 0, 0 - index: -1 -pane - rotate: false - xy: 945, 238 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 1113, 435 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 1879, 136 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 487, 181 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 639, 649 - size: 40, 24 - split: 11, 10, 10, 10 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 1879, 173 - size: 24, 40 - split: 10, 10, 6, 10 - orig: 24, 40 - offset: 0, 0 - index: -1 -sector-select - rotate: false - xy: 1395, 273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 1487, 795 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 1763, 1156 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 1295, 882 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 1663, 133 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 1663, 133 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 1263, 561 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 945, 171 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 1151, 435 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -white - rotate: false - xy: 1271, 1186 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 1701, 280 - size: 27, 61 - split: 8, 8, 44, 11 - orig: 27, 61 - offset: 0, 0 - index: -1 -alpha-drone - rotate: false - xy: 455, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler - rotate: false - xy: 937, 721 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 995, 906 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-leg - rotate: false - xy: 1045, 906 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 987, 806 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 1037, 856 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 1037, 806 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 eruptor rotate: false - xy: 649, 473 + xy: 799, 1005 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-base rotate: false - xy: 1237, 1257 + xy: 779, 939 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-leg rotate: false - xy: 1311, 1331 + xy: 1937, 1407 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress rotate: false - xy: 1377, 1355 + xy: 865, 1037 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 1443, 1355 + xy: 931, 1037 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-base rotate: false - xy: 1443, 1355 + xy: 931, 1037 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1509, 1363 + xy: 997, 1037 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ghoul rotate: false - xy: 1237, 1323 + xy: 1956, 1877 size: 72, 72 orig: 72, 72 offset: 0, 0 @@ -9784,14 +9798,14 @@ lich index: -1 phantom rotate: false - xy: 1583, 991 + xy: 513, 1 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 1641, 1049 + xy: 577, 415 size: 56, 56 orig: 56, 56 offset: 0, 0 @@ -9812,70 +9826,70 @@ revenant index: -1 spirit rotate: false - xy: 979, 606 + xy: 1151, 838 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan rotate: false - xy: 1305, 1125 + xy: 837, 773 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 1327, 1059 + xy: 903, 839 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith rotate: false - xy: 1263, 511 + xy: 1551, 647 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 445, 399 + xy: 611, 307 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 445, 249 + xy: 793, 427 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 495, 307 + xy: 843, 427 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 495, 307 + xy: 843, 427 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 895, 921 + xy: 603, 207 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chaos-equip rotate: false - xy: 1525, 1019 + xy: 1077, 569 size: 56, 136 orig: 56, 136 offset: 0, 0 @@ -9889,63 +9903,63 @@ eradication-equip index: -1 eruption-equip rotate: false - xy: 1187, 814 + xy: 1387, 1076 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 1187, 764 + xy: 1387, 1026 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 1237, 814 + xy: 727, 365 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 1287, 711 + xy: 761, 265 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lich-missiles-equip rotate: false - xy: 1637, 679 + xy: 1895, 1147 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 reaper-gun-equip rotate: false - xy: 1733, 841 + xy: 1577, 847 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles-equip rotate: false - xy: 1737, 741 + xy: 1677, 897 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 1966, 1101 + xy: 1827, 797 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 1179, 564 + xy: 1401, 776 size: 48, 48 orig: 48, 48 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 1e7dd1e515..bdbb2fe918 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 9831b5cec4..51e9bae7b5 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -45,6 +45,10 @@ public class Vars{ public static final Team defaultTeam = Team.blue; /**team of the enemy in waves/sectors*/ public static final Team waveTeam = Team.red; + /**how many times longer a boss wave takes*/ + public static final float bossWaveMultiplier = 3f; + /**how many times longer a launch wave takes*/ + public static final float launchWaveMultiplier = 2f; /**max chat message length*/ public static final int maxTextLength = 150; /**max player name length in bytes*/ diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index d7ebcad8eb..d82c6a8fe6 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -26,7 +26,7 @@ public class BlockIndexer{ private final static int structQuadrantSize = 12; /**Set of all ores that are being scanned.*/ - private final ObjectSet scanOres = new ObjectSet(){{addAll(Item.getAllOres());}}; + private final ObjectSet scanOres = ObjectSet.with(Item.getAllOres().toArray(Item.class)); private final ObjectSet itemSet = new ObjectSet<>(); /**Stores all ore quadtrants on the map.*/ private ObjectMap> ores; diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 024d83ed4a..9b5f4846b7 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ai; import io.anuke.arc.Events; import io.anuke.arc.collection.IntArray; -import io.anuke.arc.collection.Queue; +import io.anuke.arc.collection.IntQueue; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Point2; import io.anuke.arc.util.Structs; @@ -12,6 +12,7 @@ import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Teams.TeamData; import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockFlag; @@ -19,7 +20,7 @@ import static io.anuke.mindustry.Vars.state; import static io.anuke.mindustry.Vars.world; public class Pathfinder{ - private long maxUpdate = Time.millisToNanos(4); + private static final long maxUpdate = Time.millisToNanos(4); private PathData[] paths; private IntArray blocked = new IntArray(); @@ -39,10 +40,6 @@ public class Pathfinder{ }); } - public void activateTeamPath(Team team){ - createFor(team); - } - public void update(){ if(Net.client() || paths == null) return; @@ -110,7 +107,7 @@ public class Pathfinder{ for(Tile other : world.indexer.getEnemy(team, BlockFlag.target)){ path.weights[other.x][other.y] = 0; path.searches[other.x][other.y] = (short)path.search; - path.frontier.addFirst(other); + path.frontier.addFirst(other.pos()); } } } @@ -130,7 +127,7 @@ public class Pathfinder{ if(state.teams.areEnemies(tile.getTeam(), team) && tile.block().flags.contains(BlockFlag.target)){ - path.frontier.addFirst(tile); + path.frontier.addFirst(tile.pos()); path.weights[x][y] = 0; path.searches[x][y] = (short)path.search; }else{ @@ -148,9 +145,15 @@ public class Pathfinder{ long start = Time.nanos(); while(path.frontier.size > 0 && (nsToRun < 0 || Time.timeSinceNanos(start) <= nsToRun)){ - Tile tile = path.frontier.removeLast(); + Tile tile = world.tile(path.frontier.removeLast()); float cost = path.weights[tile.x][tile.y]; + //pathfinding overflowed for some reason, time to bail. the next block update will handle this, hopefully + if(path.frontier.size >= world.width() * world.height()){ + path.frontier.clear(); + return; + } + if(cost < Float.MAX_VALUE){ for(Point2 point : Geometry.d4){ @@ -160,7 +163,7 @@ public class Pathfinder{ if(other != null && (path.weights[dx][dy] > cost + other.cost || path.searches[dx][dy] < path.search) && passable(other, team)){ if(other.cost < 0) throw new IllegalArgumentException("Tile cost cannot be negative! " + other); - path.frontier.addFirst(world.tile(dx, dy)); + path.frontier.addFirst(Pos.get(dx, dy)); path.weights[dx][dy] = cost + other.cost; path.searches[dx][dy] = (short)path.search; } @@ -190,6 +193,6 @@ public class Pathfinder{ short[][] searches; int search = 0; long lastSearchTime; - Queue frontier = new Queue<>(); + IntQueue frontier = new IntQueue(); } } diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index 005712e733..c32006b4de 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -102,6 +102,7 @@ public class WaveSpawner{ } private void reset(){ + flySpawns.clear(); groundSpawns.clear(); groups = state.rules.spawns; diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index faa44e129c..7b23fc2898 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -20,7 +20,7 @@ import io.anuke.mindustry.world.blocks.production.*; import io.anuke.mindustry.world.blocks.sandbox.*; import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.LaunchPad; -import io.anuke.mindustry.world.blocks.storage.SortedUnloader; +import io.anuke.mindustry.world.blocks.storage.Unloader; import io.anuke.mindustry.world.blocks.storage.Vault; import io.anuke.mindustry.world.blocks.units.MechPad; import io.anuke.mindustry.world.blocks.units.RepairPoint; @@ -41,7 +41,7 @@ public class Blocks implements ContentList{ //crafting siliconSmelter, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, - melter, separator, centrifuge, biomatterCompressor, pulverizer, incinerator, + melter, separator, sporePress, pulverizer, incinerator, //sandbox powerVoid, powerSource, itemSource, liquidSource, itemVoid, @@ -88,6 +88,7 @@ public class Blocks implements ContentList{ public void draw(Tile tile){} public void load(){} public void init(){} + public boolean isHidden(){ return true; } public TextureRegion[] variantRegions(){ if(variantRegions == null){ variantRegions = new TextureRegion[]{Core.atlas.find("clear")}; @@ -411,7 +412,7 @@ public class Blocks implements ContentList{ output = Items.blastCompound; size = 2; - consumes.items(new ItemStack(Items.pyratite, 1), new ItemStack(Items.biomatter, 1)); + consumes.items(new ItemStack(Items.pyratite, 1), new ItemStack(Items.sporePod, 1)); consumes.power(0.40f); }}; @@ -449,7 +450,7 @@ public class Blocks implements ContentList{ Items.titanium, 2 ); hasPower = true; - filterTime = 30f; + filterTime = 35f; spinnerLength = 1.5f; spinnerRadius = 3.5f; spinnerThickness = 1.5f; @@ -457,12 +458,12 @@ public class Blocks implements ContentList{ size = 2; consumes.power(1f); - consumes.liquid(Liquids.slag, 0.09f); + consumes.liquid(Liquids.slag, 0.07f); }}; cultivator = new Cultivator("cultivator"){{ requirements(Category.crafting, ItemStack.with(Items.copper, 20, Items.lead, 50, Items.silicon, 20)); - output = Items.biomatter; + output = Items.sporePod; craftTime = 200; size = 2; hasLiquids = true; @@ -473,7 +474,7 @@ public class Blocks implements ContentList{ consumes.liquid(Liquids.water, 0.15f); }}; - biomatterCompressor = new Compressor("biomattercompressor"){{ + sporePress = new Compressor("spore-press"){{ requirements(Category.crafting, ItemStack.with(Items.lead, 70, Items.silicon, 60)); liquidCapacity = 60f; craftTime = 20f; @@ -483,7 +484,7 @@ public class Blocks implements ContentList{ health = 320; hasLiquids = true; - consumes.item(Items.biomatter, 1); + consumes.item(Items.sporePod, 1); consumes.power(0.60f); }}; @@ -637,7 +638,7 @@ public class Blocks implements ContentList{ }}; overdriveProjector = new OverdriveProjector("overdrive-projector"){{ - requirements(Category.effect, ItemStack.with(Items.lead, 200, Items.titanium, 150, Items.silicon, 250)); + requirements(Category.effect, ItemStack.with(Items.lead, 200, Items.titanium, 150, Items.silicon, 150, Items.plastanium, 60)); consumes.power(3.50f); size = 2; consumes.item(Items.phasefabric).optional(true).boost(true); @@ -668,7 +669,7 @@ public class Blocks implements ContentList{ }}; titaniumConveyor = new Conveyor("titanium-conveyor"){{ - requirements(Category.distribution, ItemStack.with(Items.copper, 2, Items.titanium, 1)); + requirements(Category.distribution, ItemStack.with(Items.copper, 2, Items.lead, 1, Items.titanium, 1)); health = 65; speed = 0.07f; }}; @@ -681,7 +682,7 @@ public class Blocks implements ContentList{ }}; itemBridge = new BufferedItemBridge("bridge-conveyor"){{ - requirements(Category.distribution, ItemStack.with(Items.titanium, 8, Items.copper, 8)); + requirements(Category.distribution, ItemStack.with(Items.lead, 8, Items.copper, 8)); range = 4; speed = 60f; bufferCapacity = 15; @@ -695,7 +696,7 @@ public class Blocks implements ContentList{ }}; sorter = new Sorter("sorter"){{ - requirements(Category.distribution, ItemStack.with(Items.titanium, 4, Items.copper, 4)); + requirements(Category.distribution, ItemStack.with(Items.lead, 4, Items.copper, 4)); }}; @@ -705,13 +706,12 @@ public class Blocks implements ContentList{ }}; distributor = new Router("distributor"){{ - requirements(Category.distribution, ItemStack.with(Items.titanium, 8, Items.copper, 8)); + requirements(Category.distribution, ItemStack.with(Items.lead, 8, Items.copper, 8)); size = 2; }}; overflowGate = new OverflowGate("overflow-gate"){{ - requirements(Category.distribution, ItemStack.with(Items.titanium, 4, Items.copper, 8)); - + requirements(Category.distribution, ItemStack.with(Items.lead, 4, Items.copper, 8)); }}; massDriver = new MassDriver("mass-driver"){{ @@ -727,65 +727,62 @@ public class Blocks implements ContentList{ mechanicalPump = new Pump("mechanical-pump"){{ requirements(Category.liquid, ItemStack.with(Items.copper, 30, Items.lead, 20)); pumpAmount = 0.1f; - tier = 0; }}; rotaryPump = new Pump("rotary-pump"){{ requirements(Category.liquid, ItemStack.with(Items.copper, 140, Items.lead, 100, Items.silicon, 40, Items.titanium, 70)); - pumpAmount = 0.2f; + pumpAmount = 0.8f; consumes.power(1.50f); liquidCapacity = 30f; hasPower = true; size = 2; - tier = 1; }}; thermalPump = new Pump("thermal-pump"){{ requirements(Category.liquid, ItemStack.with(Items.copper, 160, Items.lead, 130, Items.silicon, 60, Items.titanium, 80, Items.thorium, 70)); - pumpAmount = 0.275f; + pumpAmount = 1.95f; consumes.power(0.30f); liquidCapacity = 40f; hasPower = true; - size = 2; - tier = 2; + size = 3; }}; conduit = new Conduit("conduit"){{ - requirements(Category.liquid, ItemStack.with(Items.lead, 1)); + requirements(Category.liquid, ItemStack.with(Items.metaglass, 1)); health = 45; }}; pulseConduit = new Conduit("pulse-conduit"){{ - requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.lead, 1)); + requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.metaglass, 2)); liquidCapacity = 16f; liquidFlowFactor = 4.9f; health = 90; }}; liquidRouter = new LiquidRouter("liquid-router"){{ - requirements(Category.liquid, ItemStack.with(Items.titanium, 4, Items.lead, 4)); + requirements(Category.liquid, ItemStack.with(Items.titanium, 4, Items.metaglass, 4)); liquidCapacity = 20f; }}; liquidTank = new LiquidTank("liquid-tank"){{ - requirements(Category.liquid, ItemStack.with(Items.titanium, 50, Items.lead, 50)); + requirements(Category.liquid, ItemStack.with(Items.titanium, 50, Items.metaglass, 50)); size = 3; liquidCapacity = 1500f; health = 500; }}; liquidJunction = new LiquidJunction("liquid-junction"){{ - requirements(Category.liquid, ItemStack.with(Items.titanium, 4, Items.lead, 4)); + requirements(Category.liquid, ItemStack.with(Items.titanium, 4, Items.metaglass, 4)); }}; bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{ - requirements(Category.liquid, ItemStack.with(Items.titanium, 8, Items.lead, 8)); + requirements(Category.liquid, ItemStack.with(Items.titanium, 8, Items.metaglass, 8)); range = 4; hasPower = false; }}; phaseConduit = new LiquidBridge("phase-conduit"){{ - requirements(Category.liquid, ItemStack.with(Items.phasefabric, 10, Items.silicon, 15, Items.lead, 20, Items.titanium, 20)); + requirements(Category.liquid, ItemStack.with(Items.phasefabric, 10, Items.silicon, 15, Items.metaglass, 40, Items.titanium, 20)); range = 12; hasPower = true; consumes.power(0.30f); @@ -821,7 +818,6 @@ public class Blocks implements ContentList{ batteryLarge = new Battery("battery-large"){{ requirements(Category.power, ItemStack.with(Items.titanium, 40, Items.lead, 80, Items.silicon, 30)); - requirements(Category.power, ItemStack.with(Items.copper, 8, Items.lead, 30, Items.silicon, 4)); size = 3; consumes.powerBuffered(20000f, 1f); }}; @@ -833,8 +829,8 @@ public class Blocks implements ContentList{ }}; thermalGenerator = new ThermalGenerator("thermal-generator"){{ - requirements(Category.power, ItemStack.with(Items.copper, 80, Items.graphite, 70, Items.lead, 100, Items.silicon, 70, Items.thorium, 70)); - powerProduction = 3f; + requirements(Category.power, ItemStack.with(Items.copper, 80, Items.graphite, 70, Items.lead, 100, Items.silicon, 70, Items.metaglass, 80)); + powerProduction = 1.8f; generateEffect = Fx.redgeneratespark; size = 2; }}; @@ -844,17 +840,18 @@ public class Blocks implements ContentList{ powerProduction = 6f; itemDuration = 30f; consumes.liquid(Liquids.water, 0.05f); + hasLiquids = true; size = 2; }}; differentialGenerator = new DifferentialGenerator("differential-generator"){{ requirements(Category.power, ItemStack.with(Items.copper, 140, Items.titanium, 100, Items.lead, 200, Items.silicon, 130, Items.metaglass, 100)); - powerProduction = 16f; + powerProduction = 13f; itemDuration = 50f; consumes.remove(ConsumeItemFilter.class); consumes.remove(ConsumeLiquidFilter.class); consumes.item(Items.pyratite); - consumes.liquid(Liquids.cryofluid, 0.12f); + consumes.liquid(Liquids.cryofluid, 0.2f); size = 3; }}; @@ -880,18 +877,20 @@ public class Blocks implements ContentList{ requirements(Category.power, ItemStack.with(Items.lead, 600, Items.silicon, 400, Items.graphite, 300, Items.thorium, 300)); size = 3; health = 700; - powerProduction = 12f; - consumes.liquid(Liquids.cryofluid, maxLiquidUse); + powerProduction = 14f; + consumes.item(Items.thorium); + consumes.liquid(Liquids.cryofluid, 0.1f); }}; impactReactor = new ImpactReactor("impact-reactor"){{ - requirements(Category.power, ItemStack.with(Items.lead, 800, Items.silicon, 600, Items.graphite, 600, Items.thorium, 200, Items.surgealloy, 400, Items.metaglass, 200)); + requirements(Category.power, ItemStack.with(Items.lead, 1000, Items.silicon, 600, Items.graphite, 800, Items.thorium, 200, Items.surgealloy, 500, Items.metaglass, 500)); size = 4; health = 900; - powerProduction = 70f; + powerProduction = 80f; + useTime = 40f; consumes.power(23f); consumes.item(Items.blastCompound); - consumes.liquid(Liquids.water, 0.3f); + consumes.liquid(Liquids.cryofluid, 0.8f); }}; //endregion power @@ -911,6 +910,7 @@ public class Blocks implements ContentList{ drillTime = 480; size = 2; drawMineItem = true; + consumes.liquid(Liquids.water, 0.06f).optional(true); }}; laserDrill = new Drill("laser-drill"){{ @@ -923,6 +923,7 @@ public class Blocks implements ContentList{ drillEffect = Fx.mineBig; consumes.power(1.10f); + consumes.liquid(Liquids.water, 0.08f).optional(true); }}; blastDrill = new Drill("blast-drill"){{ @@ -939,12 +940,13 @@ public class Blocks implements ContentList{ warmupSpeed = 0.01f; consumes.power(3f); + consumes.liquid(Liquids.water, 0.1f).optional(true); }}; waterExtractor = new SolidPump("water-extractor"){{ requirements(Category.production, ItemStack.with(Items.copper, 50, Items.graphite, 50, Items.lead, 40)); result = Liquids.water; - pumpAmount = 0.065f; + pumpAmount = 0.13f; size = 2; liquidCapacity = 30f; rotateSpeed = 1.4f; @@ -958,7 +960,7 @@ public class Blocks implements ContentList{ updateEffect = Fx.pulverize; liquidCapacity = 50f; updateEffectChance = 0.05f; - pumpAmount = 0.09f; + pumpAmount = 0.25f; size = 3; liquidCapacity = 30f; @@ -1007,7 +1009,7 @@ public class Blocks implements ContentList{ itemCapacity = 300; }}; - unloader = new SortedUnloader("unloader"){{ + unloader = new Unloader("unloader"){{ requirements(Category.distribution, ItemStack.with(Items.titanium, 50, Items.silicon, 60)); speed = 7f; }}; @@ -1016,7 +1018,7 @@ public class Blocks implements ContentList{ requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.copper, 500, Items.titanium, 200, Items.silicon, 200, Items.lead, 200)); size = 3; itemCapacity = 100; - launchTime = 60f * 6; + launchTime = 60f * 8; hasPower = true; consumes.power(1f); }}; @@ -1058,7 +1060,7 @@ public class Blocks implements ContentList{ }}; wave = new LiquidTurret("wave"){{ - requirements(Category.turret, ItemStack.with(Items.titanium, 70, Items.lead, 150)); + requirements(Category.turret, ItemStack.with(Items.metaglass, 90, Items.lead, 150)); ammo( Liquids.water, Bullets.waterShot, Liquids.slag, Bullets.slagShot, @@ -1108,7 +1110,7 @@ public class Blocks implements ContentList{ }}; arc = new PowerTurret("arc"){{ - requirements(Category.turret, ItemStack.with(Items.copper, 70, Items.lead, 60)); + requirements(Category.turret, ItemStack.with(Items.copper, 70, Items.lead, 70)); shootType = Bullets.arc; reload = 20f; shootCone = 40f; @@ -1140,7 +1142,7 @@ public class Blocks implements ContentList{ }}; salvo = new BurstTurret("salvo"){{ - requirements(Category.turret, ItemStack.with(Items.copper, 210, Items.graphite, 190, Items.thorium, 130)); + requirements(Category.turret, ItemStack.with(Items.copper, 210, Items.graphite, 190, Items.titanium, 120)); ammo( Items.copper, Bullets.standardCopper, Items.graphite, Bullets.standardDense, @@ -1164,7 +1166,7 @@ public class Blocks implements ContentList{ }}; ripple = new ArtilleryTurret("ripple"){{ - requirements(Category.turret, ItemStack.with(Items.copper, 300, Items.graphite, 220, Items.thorium, 120)); + requirements(Category.turret, ItemStack.with(Items.copper, 300, Items.graphite, 270, Items.titanium, 120)); ammo( Items.graphite, Bullets.artilleryDense, Items.silicon, Bullets.artilleryHoming, @@ -1189,7 +1191,7 @@ public class Blocks implements ContentList{ }}; cyclone = new ItemTurret("cyclone"){{ - requirements(Category.turret, ItemStack.with(Items.copper, 400, Items.surgealloy, 200, Items.plastanium, 150)); + requirements(Category.turret, ItemStack.with(Items.copper, 400, Items.titanium, 250, Items.plastanium, 160)); ammo( Items.blastCompound, Bullets.flakExplosive, Items.plastanium, Bullets.flakPlastic, diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index bcc7a59e52..e0f4ed0a96 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -359,6 +359,7 @@ public class Bullets implements ContentList{ float healPercent = 3f; { + shootEffect = Fx.shootHeal; hitEffect = Fx.hitLaser; despawnEffect = Fx.hitLaser; collidesTeam = true; diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index 83592abc5d..dece137ea4 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.content; import io.anuke.arc.Core; -import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Fill; @@ -9,6 +8,7 @@ import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Tmp; +import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.game.ContentList; @@ -34,7 +34,7 @@ public class Fx implements ContentList{ bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke, shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke, shootBigSmoke2, shootSmallFlame, shootLiquid, shellEjectSmall, shellEjectMedium, shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot, - launchFull, unitSpawn, spawnShockwave, magmasmoke; + unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion; @Override public void load(){ @@ -567,6 +567,13 @@ public class Fx implements ContentList{ Draw.reset(); }); + impactShockwave = new Effect(13f, 300f, e -> { + Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, e.fin()); + Lines.stroke(e.fout() * 4f + 0.2f); + Lines.poly(e.x, e.y, 60, e.fin() * 200f); + Draw.reset(); + }); + spawnShockwave = new Effect(20f, 400f, e -> { Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin()); Lines.stroke(e.fout() * 3f + 0.5f); @@ -597,6 +604,31 @@ public class Fx implements ContentList{ Draw.reset(); }); + dynamicExplosion = new Effect(30, e -> { + float intensity = e.rotation; + + e.scaled(5 + intensity*2, i -> { + Lines.stroke(3.1f * i.fout()); + Lines.poly(e.x, e.y, (int)(20 * intensity), (3f + i.fin() * 14f) * intensity); + }); + + Draw.color(Color.GRAY); + + Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f*intensity, (x, y, in, out) -> { + Fill.circle(e.x + x, e.y + y, out * (2f+intensity) * 3 + 0.5f); + Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3); + }); + + Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin()); + Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f)); + + Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9*intensity), 40f*intensity, (x, y, in, out) -> { + Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f+intensity)); + }); + + Draw.reset(); + }); + blockExplosion = new Effect(30, e -> { e.scaled(7, i -> { Lines.stroke(3.1f * i.fout()); @@ -860,6 +892,22 @@ public class Fx implements ContentList{ Draw.reset(); }); }); + impactsmoke = new Effect(60, e -> { + Angles.randLenVectors(e.id, 7, e.fin() * 20f, (x, y) -> { + float size = e.fslope() * 4f; + Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + }); + impactcloud = new Effect(140, 400f, e -> { + Angles.randLenVectors(e.id, 20, e.finpow() * 160f, (x, y) -> { + float size = e.fout() * 15f; + Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, e.fin()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + }); redgeneratespark = new Effect(18, e -> { Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> { float len = e.fout() * 4f; @@ -1137,12 +1185,5 @@ public class Fx implements ContentList{ Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90); Draw.reset(); }); - - launchFull = new Effect(60, 9999999999f, e -> { - Draw.color(); - Draw.alpha(e.fslope()); - Fill.rect(Core.camera.position.x, Core.camera.position.y, Core.camera.width + 10, Core.camera.height + 10); - Draw.reset(); - }); } } diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index b52b169584..6c1fcdfa80 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -7,7 +7,7 @@ import io.anuke.mindustry.type.ItemType; public class Items implements ContentList{ public static Item scrap, copper, lead, graphite, coal, titanium, thorium, silicon, plastanium, phasefabric, surgealloy, - biomatter, sand, blastCompound, pyratite, metaglass; + sporePod, sand, blastCompound, pyratite, metaglass; @Override public void load(){ @@ -85,7 +85,7 @@ public class Items implements ContentList{ type = ItemType.material; }}; - biomatter = new Item("biomatter", Color.valueOf("648b55")){{ + sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{ flammability = 1.05f; }}; diff --git a/core/src/io/anuke/mindustry/content/Liquids.java b/core/src/io/anuke/mindustry/content/Liquids.java index dadd720f47..17cc695c0e 100644 --- a/core/src/io/anuke/mindustry/content/Liquids.java +++ b/core/src/io/anuke/mindustry/content/Liquids.java @@ -12,14 +12,12 @@ public class Liquids implements ContentList{ water = new Liquid("water", Color.valueOf("596ab8")){{ heatCapacity = 0.4f; - tier = 0; effect = StatusEffects.wet; }}; slag = new Liquid("slag", Color.valueOf("ffa166")){{ temperature = 1f; viscosity = 0.8f; - tier = 2; effect = StatusEffects.melting; }}; @@ -28,14 +26,12 @@ public class Liquids implements ContentList{ flammability = 1.2f; explosiveness = 1.2f; heatCapacity = 0.7f; - tier = 1; effect = StatusEffects.tarred; }}; cryofluid = new Liquid("cryofluid", Color.valueOf("6ecdec")){{ heatCapacity = 0.9f; temperature = 0.25f; - tier = 1; effect = StatusEffects.freezing; }}; } diff --git a/core/src/io/anuke/mindustry/content/Loadouts.java b/core/src/io/anuke/mindustry/content/Loadouts.java new file mode 100644 index 0000000000..a9c7f5bc3f --- /dev/null +++ b/core/src/io/anuke/mindustry/content/Loadouts.java @@ -0,0 +1,54 @@ +package io.anuke.mindustry.content; + +import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.type.Loadout; + +public class Loadouts implements ContentList{ + public static Loadout + basicShard, + advancedShard, + basicFoundation, + basicNucleus; + + @Override + public void load(){ + basicShard = new Loadout( + " ### ", + " #1# ", + " ### ", + " ^ ^ ", + " ## ## ", + " C# C# " + ); + + advancedShard = new Loadout( + " ### ", + " #1# ", + "#######", + "C#^ ^C#", + " ## ## ", + " C# C# " + ); + + basicFoundation = new Loadout( + " #### ", + " #### ", + " #2## ", + " #### ", + " ^^^^ ", + " ###### ", + " C#C#C# " + ); + + basicNucleus = new Loadout( + " ##### ", + " ##### ", + " ##3## ", + " ##### ", + " >#####< ", + " ^ ^ ^ ^ ", + "#### ####", + "C#C# C#C#" + ); + } +} diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index 5695a681bd..4ba2506664 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -206,16 +206,13 @@ public class Mechs implements ContentList{ public void draw(Player player){ if(player.shootHeat <= 0.01f) return; - float alpha = Draw.getColor().a; Shaders.build.progress = player.shootHeat; Shaders.build.region = armorRegion; Shaders.build.time = Time.time() / 10f; Shaders.build.color.set(Pal.accent).a = player.shootHeat; Draw.shader(Shaders.build); - Draw.alpha(1f); Draw.rect(armorRegion, player.x, player.y, player.rotation); - Draw.shader(Shaders.mix); - Draw.color(1f, 1f, 1f, alpha); + Draw.shader(); } }; @@ -295,16 +292,11 @@ public class Mechs implements ContentList{ public void draw(Player player){ float scl = scld(player); if(scl < 0.01f) return; - float alpha = Draw.getColor().a; - Draw.shader(); Draw.color(Pal.lancerLaser); Draw.alpha(scl/2f); Draw.blend(Blending.additive); Draw.rect(shield, player.x + Mathf.range(scl/2f), player.y + Mathf.range(scl/2f), player.rotation - 90); Draw.blend(); - Draw.shader(Shaders.mix); - Draw.color(); - Draw.alpha(alpha); } float scld(Player player){ diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index 328a617c1f..e9c87b39b6 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.type.StatusEffect; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded; + public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss; @Override public void load(){ @@ -71,6 +71,14 @@ public class StatusEffects implements ContentList{ armorMultiplier = 3f; }}; + boss = new StatusEffect(){{ + armorMultiplier = 3f; + damageMultiplier = 3f; + speedMultiplier = 1.1f; + //TODO custom effect + //effect = Fx.overdriven; + }}; + shocked = new StatusEffect(); //no effects, just small amounts of damage. diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index a656674c91..0ac28a96a9 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -127,7 +127,7 @@ public class TechTree implements ContentList{ node(siliconSmelter, () -> { - node(biomatterCompressor, () -> { + node(sporePress, () -> { node(multiPress, () -> { }); @@ -234,25 +234,19 @@ public class TechTree implements ContentList{ node(alphaDartPad, () -> { node(deltaPad, () -> { - node(javelinPad); - node(tauPad, () -> { - node(tridentPad); - node(omegaPad, () -> { + node(spiritFactory, () -> { + node(phantomFactory); + }); + + node(javelinPad, () -> { + node(tridentPad, () -> { node(glaivePad); }); }); - }); - node(spiritFactory, () -> { - node(daggerFactory, () -> { - node(titanFactory, () -> { - node(fortressFactory); - }); - node(wraithFactory, () -> { - node(phantomFactory); - node(ghoulFactory, () -> { - node(revenantFactory); - }); + node(tauPad, () -> { + node(omegaPad, () -> { + }); }); }); @@ -264,7 +258,7 @@ public class TechTree implements ContentList{ private TechNode node(Block block, Runnable children){ ItemStack[] requirements = new ItemStack[block.buildRequirements.length]; for(int i = 0; i < requirements.length; i++){ - requirements[i] = new ItemStack(block.buildRequirements[i].item, block.buildRequirements[i].amount * 40); + requirements[i] = new ItemStack(block.buildRequirements[i].item, block.buildRequirements[i].amount * 30); } return new TechNode(block, requirements, children); diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index f841cdb343..01410348cc 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -51,8 +51,8 @@ public class UnitTypes implements ContentList{ }}; crawler = new UnitType("crawler", Crawler.class, Crawler::new){{ - maxVelocity = 1.1f; - speed = 0.22f; + maxVelocity = 1.2f; + speed = 0.26f; drag = 0.4f; hitsize = 8f; mass = 1.75f; @@ -132,7 +132,7 @@ public class UnitTypes implements ContentList{ mass = 5f; hitsize = 20f; rotatespeed = 0.06f; - health = 20000; + health = 4000; weapon = new Weapon("chaos"){{ length = 8f; reload = 50f; @@ -155,7 +155,7 @@ public class UnitTypes implements ContentList{ mass = 5f; hitsize = 20f; rotatespeed = 0.06f; - health = 80000; + health = 10000; weapon = new Weapon("eradication"){{ length = 13f; reload = 30f; @@ -236,7 +236,7 @@ public class UnitTypes implements ContentList{ }}; revenant = new UnitType("revenant", Revenant.class, Revenant::new){{ - health = 4000; + health = 1000; mass = 5f; hitsize = 20f; speed = 0.1f; @@ -266,7 +266,7 @@ public class UnitTypes implements ContentList{ }}; lich = new UnitType("lich", Revenant.class, Revenant::new){{ - health = 15000; + health = 7000; mass = 20f; hitsize = 40f; speed = 0.01f; @@ -285,7 +285,7 @@ public class UnitTypes implements ContentList{ length = 4f; reload = 180f; width = 22f; - shots = 20; + shots = 22; shotDelay = 2; inaccuracy = 10f; roundrobin = true; @@ -297,7 +297,7 @@ public class UnitTypes implements ContentList{ }}; reaper = new UnitType("reaper", Revenant.class, Revenant::new){{ - health = 30000; + health = 13000; mass = 30f; hitsize = 56f; speed = 0.01f; diff --git a/core/src/io/anuke/mindustry/content/Zones.java b/core/src/io/anuke/mindustry/content/Zones.java index 628e9673e8..d2bd4d6b73 100644 --- a/core/src/io/anuke/mindustry/content/Zones.java +++ b/core/src/io/anuke/mindustry/content/Zones.java @@ -19,52 +19,54 @@ public class Zones implements ContentList{ public void load(){ groundZero = new Zone("groundZero", new MapGenerator("groundZero", 1)){{ - deployCost = ItemStack.with(); - startingItems = ItemStack.with(Items.copper, 50); + baseLaunchCost = ItemStack.with(Items.copper, -50); + startingItems = ItemStack.list(Items.copper, 50); alwaysUnlocked = true; - conditionWave = 10; + conditionWave = 5; launchPeriod = 5; resources = new Item[]{Items.copper, Items.scrap}; rules = () -> new Rules(){{ waves = true; waveTimer = true; - waveSpacing = 60 * 60 * 2; //2 mins + waveSpacing = 60 * 60 * 2; spawns = Array.with( new SpawnGroup(UnitTypes.dagger){{ unitScaling = 1.5f; }}, new SpawnGroup(UnitTypes.dagger){{ - begin = 10; + begin = 5; unitScaling = 2; }}, new SpawnGroup(UnitTypes.dagger){{ begin = 15; - unitScaling = 1; + unitScaling = 3; }}, new SpawnGroup(UnitTypes.dagger){{ begin = 20; - unitScaling = 1; + unitScaling = 3; }}, new SpawnGroup(UnitTypes.dagger){{ begin = 25; - unitScaling = 1; + unitScaling = 3; }}, new SpawnGroup(UnitTypes.dagger){{ begin = 30; - unitScaling = 1; - }} + unitScaling = 2; + }}, + + + bossGroup(UnitTypes.fortress) ); }}; }}; craters = new Zone("craters", new MapGenerator("craters", 1).dist(0)){{ - deployCost = ItemStack.with(Items.copper, 200); - startingItems = ItemStack.with(Items.copper, 200); + startingItems = ItemStack.list(Items.copper, 200); conditionWave = 10; itemRequirements = ItemStack.with(Items.copper, 2000); zoneRequirements = new Zone[]{groundZero}; @@ -73,9 +75,9 @@ public class Zones implements ContentList{ rules = () -> new Rules(){{ waves = true; waveTimer = true; - waveSpacing = 60 * 60 * 1.5f; + waveSpacing = 60 * 60 * 1f; spawns = Array.with( - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(UnitTypes.crawler){{ unitScaling = 1.5f; }}, @@ -87,8 +89,8 @@ public class Zones implements ContentList{ }}, new SpawnGroup(UnitTypes.dagger){{ - begin = 10; - unitScaling = 1; + begin = 3; + unitScaling = 1.5f; }}, new SpawnGroup(UnitTypes.crawler){{ @@ -99,23 +101,25 @@ public class Zones implements ContentList{ new SpawnGroup(UnitTypes.dagger){{ begin = 20; - unitScaling = 1; + unitScaling = 2; }}, new SpawnGroup(UnitTypes.crawler){{ begin = 25; unitScaling = 1; unitAmount = 2; - }} + }}, + + bossGroup(UnitTypes.revenant) ); }}; }}; - frozenForest = new Zone("frozenForest", new MapGenerator("frozenForest", 2) - .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02)) - .core(Blocks.coreFoundation)){{ - deployCost = ItemStack.with(Items.copper, 500); - startingItems = ItemStack.with(Items.copper, 400); + frozenForest = new Zone("frozenForest", new MapGenerator("frozenForest", 1) + .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02))){{ + loadout = Loadouts.basicFoundation; + baseLaunchCost = ItemStack.with(Items.copper, 100); + startingItems = ItemStack.list(Items.copper, 400); conditionWave = 10; zoneRequirements = new Zone[]{craters}; itemRequirements = ItemStack.with(Items.copper, 4000, Items.lead, 2000); @@ -168,15 +172,24 @@ public class Zones implements ContentList{ begin = 35; spacing = 10; unitAmount = 6; - }} + }}, + + //boss + new SpawnGroup(UnitTypes.revenant){{ + begin = configureWave; + effect = StatusEffects.boss; + unitScaling = never; + }}, + + bossGroup(UnitTypes.eruptor) ); }}; }}; - ruinousShores = new Zone("ruinousShores", new MapGenerator("ruinousShores", 1) - .core(Blocks.coreFoundation)){{ - deployCost = ItemStack.with(Items.copper, 600, Items.graphite, 50); - startingItems = ItemStack.with(Items.copper, 400); + ruinousShores = new Zone("ruinousShores", new MapGenerator("ruinousShores", 1)){{ + loadout = Loadouts.basicFoundation; + baseLaunchCost = ItemStack.with(Items.copper, 200, Items.graphite, 50); + startingItems = ItemStack.list(Items.copper, 400); conditionWave = 20; launchPeriod = 20; zoneRequirements = new Zone[]{frozenForest}; @@ -228,14 +241,31 @@ public class Zones implements ContentList{ spacing = 2; unitScaling = 2; unitAmount = 2; - }} + }}, + + new SpawnGroup(UnitTypes.dagger){{ + begin = 12; + spacing = 2; + unitScaling = 2; + unitAmount = 2; + }}, + + new SpawnGroup(UnitTypes.crawler){{ + begin = 12; + spacing = 3; + unitScaling = 3; + unitAmount = 2; + }}, + + bossGroup(UnitTypes.revenant), + bossGroup(UnitTypes.revenant) ); }}; }}; /* crags = new Zone("crags", new MapGenerator("groundZero", 1)){{ //TODO implement - deployCost = ItemStack.with(Items.copper, 300); + baseLaunchCost = ItemStack.with(Items.copper, 300); startingItems = ItemStack.with(Items.copper, 200); conditionWave = 15; zoneRequirements = new Zone[]{frozenForest}; @@ -249,10 +279,10 @@ public class Zones implements ContentList{ stainedMountains = new Zone("stainedMountains", new MapGenerator("stainedMountains", 2) .dist(2.5f, true) - .decor(new Decoration(Blocks.stainedStone, Blocks.stainedBoulder, 0.01)) - .core(Blocks.coreFoundation)){{ - deployCost = ItemStack.with(Items.copper, 500, Items.lead, 300, Items.silicon, 100); - startingItems = ItemStack.with(Items.copper, 400, Items.lead, 100); + .decor(new Decoration(Blocks.stainedStone, Blocks.stainedBoulder, 0.01))){{ + loadout = Loadouts.basicFoundation; + baseLaunchCost = ItemStack.with(Items.copper, 100, Items.lead, 200, Items.silicon, 100); + startingItems = ItemStack.list(Items.copper, 400, Items.lead, 100); conditionWave = 10; launchPeriod = 10; zoneRequirements = new Zone[]{frozenForest}; @@ -316,22 +346,26 @@ public class Zones implements ContentList{ spacing = 10; unitScaling = 0.5f; unitAmount = 10; - }} + }}, + + bossGroup(UnitTypes.chaosArray) ); }}; }}; impact = new Zone("impact0079", new MapGenerator("impact0079", 2) + .dist(2.2f, true) .decor( new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01), new Decoration(Blocks.metalFloor, Blocks.metalFloorDamaged, 0.02) - ).drops(ItemStack.with(Items.copper, 2000, Items.lead, 1500, Items.silicon, 1000, Items.graphite, 1000, Items.pyratite, 2000, Items.titanium, 2000, Items.metaglass, 1000))){{ - deployCost = ItemStack.with(Items.copper, 2500, Items.lead, 1000, Items.silicon, 300); - startingItems = ItemStack.with(Items.copper, 2000, Items.lead, 500, Items.silicon, 200); + ).drops(ItemStack.with(Items.copper, 2000, Items.lead, 1500, Items.silicon, 1000, Items.graphite, 2000, Items.pyratite, 2000, Items.titanium, 2000, Items.metaglass, 1000, Items.coal, 2000))){{ + loadout = Loadouts.basicFoundation; + baseLaunchCost = ItemStack.with(Items.copper, 500, Items.lead, 500, Items.silicon, 100); + startingItems = ItemStack.list(Items.copper, 2000, Items.lead, 500, Items.silicon, 200, Items.titanium, 400, Items.graphite, 200); itemRequirements = ItemStack.with(Items.silicon, 8000, Items.titanium, 6000, Items.graphite, 4000); conditionWave = 20; zoneRequirements = new Zone[]{stainedMountains}; - blockRequirements = new Block[]{Blocks.launchPad, Blocks.unloader}; + blockRequirements = new Block[]{Blocks.launchPad, Blocks.unloader, Blocks.melter, Blocks.separator}; resources = new Item[]{Items.scrap}; rules = () -> new Rules(){{ waves = true; @@ -345,6 +379,12 @@ public class Zones implements ContentList{ end = 10; }}, + new SpawnGroup(UnitTypes.dagger){{ + begin = 1; + unitScaling = 1; + spacing = 2; + }}, + new SpawnGroup(UnitTypes.dagger){{ begin = 2; unitScaling = 1; @@ -391,25 +431,27 @@ public class Zones implements ContentList{ spacing = 10; unitScaling = 0.5f; unitAmount = 10; - }} + }}, + + bossGroup(UnitTypes.lich) ); }}; }}; - desolateRift = new Zone("desolateRift", new MapGenerator("desolateRift") - .core(Blocks.coreNucleus).dist(2f)){{ - deployCost = ItemStack.with(Items.copper, 2000); - startingItems = ItemStack.with(Items.copper, 1500); + desolateRift = new Zone("desolateRift", new MapGenerator("desolateRift").dist(2f)){{ + loadout = Loadouts.basicNucleus; + baseLaunchCost = ItemStack.with(Items.copper, 500); + startingItems = ItemStack.list(Items.copper, 1500); itemRequirements = ItemStack.with(Items.copper, 8000, Items.metaglass, 2000, Items.graphite, 3000); conditionWave = 10; launchPeriod = 20; zoneRequirements = new Zone[]{ruinousShores}; blockRequirements = new Block[]{Blocks.thermalGenerator}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium}; + resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.sand}; rules = () -> new Rules(){{ waves = true; waveTimer = true; - waveSpacing = 30 * 60; + waveSpacing = 60 * 60 * 1.5f; spawns = Array.with( new SpawnGroup(UnitTypes.crawler){{ unitScaling = 1; @@ -417,6 +459,12 @@ public class Zones implements ContentList{ end = 10; }}, + new SpawnGroup(UnitTypes.titan){{ + begin = 1; + unitScaling = 3; + spacing = 2; + }}, + new SpawnGroup(UnitTypes.dagger){{ begin = 2; spacing = 2; @@ -456,14 +504,16 @@ public class Zones implements ContentList{ spacing = 2; unitAmount = 4; begin = 13; - }} + }}, + + bossGroup(UnitTypes.chaosArray) ); }}; }}; /* arcticDesert = new Zone("arcticDesert", new MapGenerator("groundZero", 1)){{ //TODO implement - deployCost = ItemStack.with(Items.copper, 300); + baseLaunchCost = ItemStack.with(Items.copper, 300); startingItems = ItemStack.with(Items.copper, 200); conditionWave = 15; zoneRequirements = new Zone[]{frozenForest}; @@ -476,7 +526,7 @@ public class Zones implements ContentList{ }}; dryWastes = new Zone("dryWastes", new MapGenerator("groundZero", 1)){{ //TODO implement - deployCost = ItemStack.with(Items.copper, 300); + baseLaunchCost = ItemStack.with(Items.copper, 300); startingItems = ItemStack.with(Items.copper, 200); conditionWave = 15; zoneRequirements = new Zone[]{frozenForest}; @@ -491,82 +541,97 @@ public class Zones implements ContentList{ */ nuclearComplex = new Zone("nuclearComplex", new MapGenerator("nuclearProductionComplex", 1) .drops(ItemStack.with(Items.copper, 2000, Items.lead, 1500, Items.silicon, 1000, Items.graphite, 1000, Items.thorium, 200, Items.titanium, 2000, Items.metaglass, 1000)) - .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01)) - .core(Blocks.coreFoundation)){{ - deployCost = ItemStack.with(Items.copper, 3000, Items.lead, 2000, Items.silicon, 1000, Items.metaglass, 500); - startingItems = ItemStack.with(Items.copper, 2500, Items.lead, 1500, Items.silicon, 800, Items.metaglass, 400); + .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01))){{ + loadout = Loadouts.basicNucleus; + baseLaunchCost = ItemStack.with(Items.copper, 500, Items.silicon, 200, Items.metaglass, 100); + startingItems = ItemStack.list(Items.copper, 2500, Items.lead, 3000, Items.silicon, 800, Items.metaglass, 400); itemRequirements = ItemStack.with(Items.copper, 10000, Items.titanium, 8000, Items.metaglass, 6000, Items.plastanium, 2000); conditionWave = 30; launchPeriod = 15; zoneRequirements = new Zone[]{impact}; blockRequirements = new Block[]{Blocks.blastDrill, Blocks.thermalGenerator}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium}; + resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium, Items.sand}; rules = () -> new Rules(){{ waves = true; waveTimer = true; waveSpacing = 60 * 60 * 2; spawns = Array.with( - new SpawnGroup(UnitTypes.titan){{ - unitScaling = 2; - spacing = 2; - end = 10; - }}, + new SpawnGroup(UnitTypes.titan){{ + unitScaling = 2; + spacing = 2; + end = 10; + }}, - new SpawnGroup(UnitTypes.dagger){{ - begin = 2; - unitScaling = 1; - spacing = 2; - }}, + new SpawnGroup(UnitTypes.crawler){{ + begin = 1; + unitScaling = 2; + spacing = 2; + unitAmount = 3; + }}, - new SpawnGroup(UnitTypes.dagger){{ - begin = 10; - spacing = 2; - unitScaling = 2; - unitAmount = 2; - }}, + new SpawnGroup(UnitTypes.dagger){{ + begin = 2; + unitScaling = 1; + spacing = 2; + }}, - new SpawnGroup(UnitTypes.ghoul){{ - begin = 5; - unitScaling = 0.5f; - unitAmount = 1; - spacing = 5; - }}, + new SpawnGroup(UnitTypes.dagger){{ + begin = 10; + spacing = 2; + unitScaling = 2; + unitAmount = 2; + }}, - new SpawnGroup(UnitTypes.wraith){{ - begin = 10; - unitScaling = 1f; - unitAmount = 1; - spacing = 5; - }}, + new SpawnGroup(UnitTypes.ghoul){{ + begin = 5; + unitScaling = 0.5f; + unitAmount = 1; + spacing = 5; + }}, - new SpawnGroup(UnitTypes.dagger){{ - begin = 2; - unitScaling = 1; - spacing = 2; - }}, + new SpawnGroup(UnitTypes.fortress){{ + begin = 13; + unitScaling = 2; + spacing = 3; + }}, - new SpawnGroup(UnitTypes.wraith){{ - begin = 23; - unitScaling = 1f; - unitAmount = 1; - spacing = 2; - }}, + new SpawnGroup(UnitTypes.wraith){{ + begin = 10; + unitScaling = 1f; + unitAmount = 1; + spacing = 5; + }}, - new SpawnGroup(UnitTypes.crawler){{ - begin = 20; - unitScaling = 1; - spacing = 10; - unitScaling = 0.5f; - unitAmount = 10; - }} + new SpawnGroup(UnitTypes.dagger){{ + begin = 2; + unitScaling = 1; + spacing = 2; + }}, + + new SpawnGroup(UnitTypes.wraith){{ + begin = 23; + unitScaling = 1f; + unitAmount = 1; + spacing = 2; + }}, + + new SpawnGroup(UnitTypes.crawler){{ + begin = 20; + unitScaling = 1; + spacing = 10; + unitScaling = 0.5f; + unitAmount = 10; + }}, + + bossGroup(UnitTypes.reaper) ); }}; }}; /* moltenFault = new Zone("moltenFault", new MapGenerator("groundZero", 1)){{ //TODO implement - deployCost = ItemStack.with(Items.copper, 300); + baseLaunchCost = ItemStack.with(Items.copper, 300); startingItems = ItemStack.with(Items.copper, 200); conditionWave = 15; zoneRequirements = new Zone[]{frozenForest}; diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 317a6a04bd..1d71ff81db 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -49,6 +49,7 @@ public class ContentLoader{ new Mechs(), new UnitTypes(), new Blocks(), + new Loadouts(), new TechTree(), new Zones(), @@ -80,7 +81,7 @@ public class ContentLoader{ for(Content c : contentMap[type.ordinal()]){ if(c instanceof MappableContent){ - String name = ((MappableContent) c).getContentName(); + String name = ((MappableContent) c).name; if(contentNameMap[type.ordinal()].containsKey(name)){ throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + name + "')"); } diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index b1f7c806a1..e890f7c0a9 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -7,7 +7,6 @@ import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureAtlas; import io.anuke.arc.input.KeyCode; -import io.anuke.arc.scene.ui.TextField; import io.anuke.arc.util.Interval; import io.anuke.arc.util.Strings; import io.anuke.arc.util.Time; @@ -101,9 +100,7 @@ public class Control implements ApplicationListener{ }); Events.on(WorldLoadEvent.class, event -> { - if(mobile){ - Core.app.post(() -> Core.camera.position.set(players[0])); - } + Core.app.post(() -> Core.camera.position.set(players[0])); }); Events.on(ResetEvent.class, event -> { @@ -169,7 +166,11 @@ public class Control implements ApplicationListener{ }); Events.on(ZoneCompleteEvent.class, e -> { - ui.hudfrag.showToast(Core.bundle.get("zone.complete")); + ui.hudfrag.showToast(Core.bundle.format("zone.complete", e.zone.conditionWave)); + }); + + Events.on(ZoneConfigureCompleteEvent.class, e -> { + ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave)); }); } @@ -278,16 +279,16 @@ public class Control implements ApplicationListener{ if(!Core.settings.getBool("4.0-warning-2", false)){ Time.run(5f, () -> { - FloatingDialog dialog = new FloatingDialog("WARNING!"); + FloatingDialog dialog = new FloatingDialog("VERY IMPORTANT"); dialog.buttons.addButton("$ok", () -> { dialog.hide(); Core.settings.put("4.0-warning-2", true); Core.settings.save(); }).size(100f, 60f); - dialog.cont.add("Reminder: The alpha version you are about to play is very unstable, and is [accent]not representative of the final 4.0 release.[]\n\n " + + dialog.cont.add("Reminder: The alpha version you are about to play is very unstable, and is [accent]not representative of the final v4 release.[]\n\n " + "\nThere is currently[scarlet] no sound implemented[]; this is intentional.\n" + - "All current art and UI is temporary, and will be re-drawn before release. " + - "\n\n[accent]Saves and maps may be corrupted without warning between updates.").wrap().width(400f); + "All current art and UI is unfinished, and will be changed before release. " + + "\n\n[accent]Saves may be corrupted without warning between updates.").wrap().width(400f); dialog.show(); }); } @@ -301,10 +302,8 @@ public class Control implements ApplicationListener{ inputHandler.updateController(); } - //autosave global data every second if it's modified - if(timer.get(1, 60)){ - data.checkSave(); - } + //autosave global data if it's modified + data.checkSave(); if(!state.is(State.menu)){ for(InputHandler input : inputs){ @@ -339,10 +338,6 @@ public class Control implements ApplicationListener{ } } - if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !ui.chatfrag.chatOpen()){ - renderer.takeMapScreenshot(); - } - }else{ if(!state.isPaused()){ Time.update(); diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java index fd521bf2c0..9765ae1786 100644 --- a/core/src/io/anuke/mindustry/core/GameState.java +++ b/core/src/io/anuke/mindustry/core/GameState.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.core; import io.anuke.arc.Events; +import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.Stats; @@ -32,13 +33,17 @@ public class GameState{ return Net.client() ? enemies : unitGroups[waveTeam.ordinal()].size(); } + public BaseUnit boss(){ + return unitGroups[waveTeam.ordinal()].find(BaseUnit::isBoss); + } + public void set(State astate){ Events.fire(new StateChangeEvent(state, astate)); state = astate; } public boolean isPaused(){ - return (is(State.paused) && !Net.active()) || gameOver; + return (is(State.paused) && !Net.active()) || (gameOver && !Net.active()); } public boolean is(State astate){ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 28a4e44461..83b3d52f31 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -34,7 +34,7 @@ public class Logic implements ApplicationListener{ public Logic(){ Events.on(WaveEvent.class, event -> { if(world.isZone()){ - data.updateWaveScore(world.getZone(), state.wave); + world.getZone().updateWave(state.wave); } }); } @@ -68,7 +68,6 @@ public class Logic implements ApplicationListener{ state.gameOver = state.launched = false; state.teams = new Teams(); state.rules = new Rules(); - state.rules.spawns = Waves.getDefaultSpawns(); state.stats = new Stats(); Time.clear(); @@ -81,7 +80,8 @@ public class Logic implements ApplicationListener{ public void runWave(){ world.spawner.spawnEnemies(); state.wave++; - state.wavetime = state.rules.waveSpacing; + state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * bossWaveMultiplier : + world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * launchWaveMultiplier : state.rules.waveSpacing; Events.fire(new WaveEvent()); } @@ -111,7 +111,9 @@ public class Logic implements ApplicationListener{ @Remote(called = Loc.both) public static void launchZone(){ - Effects.effect(Fx.launchFull, 0, 0); + if(!headless){ + ui.hudfrag.showLaunch(); + } for(Tile tile : new ObjectSetIterator<>(state.teams.get(defaultTeam).cores)){ Effects.effect(Fx.launch, tile); @@ -120,7 +122,7 @@ public class Logic implements ApplicationListener{ Time.runTask(30f, () -> { for(Tile tile : new ObjectSetIterator<>(state.teams.get(defaultTeam).cores)){ for(Item item : content.items()){ - data.addItem(item, tile.entity.items.get(item) / playerGroup.size()); + data.addItem(item, tile.entity.items.get(item)); } world.removeBlock(tile); } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 3a47eee4ff..45da7f1586 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -7,9 +7,8 @@ import io.anuke.annotations.Annotations.Variant; import io.anuke.arc.ApplicationListener; import io.anuke.arc.Core; import io.anuke.arc.collection.IntSet; -import io.anuke.mindustry.entities.Entities; -import io.anuke.mindustry.entities.EntityGroup; import io.anuke.arc.graphics.Color; +import io.anuke.arc.math.RandomXS128; import io.anuke.arc.util.Interval; import io.anuke.arc.util.Log; import io.anuke.arc.util.Time; @@ -17,10 +16,12 @@ import io.anuke.arc.util.io.ReusableByteArrayInputStream; import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.type.Player; +import io.anuke.mindustry.entities.Entities; +import io.anuke.mindustry.entities.EntityGroup; 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.entities.type.Player; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.RemoteReadClient; @@ -34,7 +35,6 @@ import io.anuke.mindustry.world.modules.ItemModule; import java.io.DataInputStream; import java.io.IOException; -import java.util.Random; import java.util.zip.InflaterInputStream; import static io.anuke.mindustry.Vars.*; @@ -364,7 +364,7 @@ public class NetClient implements ApplicationListener{ return Core.settings.getString("usid-" + ip, null); }else{ byte[] bytes = new byte[8]; - new Random().nextBytes(bytes); + new RandomXS128().nextBytes(bytes); String result = new String(Base64Coder.encode(bytes)); Core.settings.put("usid-" + ip, result); Core.settings.save(); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 7e0cdbef72..fceb8136af 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -7,10 +7,6 @@ import io.anuke.arc.Events; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.IntMap; import io.anuke.arc.collection.ObjectSet; -import io.anuke.mindustry.entities.Entities; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.EntityQuery; -import io.anuke.mindustry.entities.traits.Entity; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Colors; import io.anuke.arc.math.Mathf; @@ -19,14 +15,19 @@ import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.Log; import io.anuke.arc.util.Structs; import io.anuke.arc.util.Time; +import io.anuke.arc.util.Tmp; import io.anuke.arc.util.io.ByteBufferOutput; import io.anuke.arc.util.io.CountableByteArrayOutputStream; -import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.type.Player; +import io.anuke.mindustry.entities.Entities; +import io.anuke.mindustry.entities.EntityGroup; +import io.anuke.mindustry.entities.EntityQuery; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; +import io.anuke.mindustry.entities.traits.Entity; import io.anuke.mindustry.entities.traits.SyncTrait; +import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Version; @@ -51,12 +52,6 @@ import static io.anuke.mindustry.Vars.*; public class NetServer implements ApplicationListener{ public final static int maxSnapshotSize = 430; - - public final static boolean debugSnapshots = false; - public final static float maxSnapshotDelay = 200; - public final static float snapshotDropchance = 0.01f; - - private final static byte[] reusableSnapArray = new byte[maxSnapshotSize]; private final static float serverSyncTime = 4, kickDuration = 30 * 1000; private final static Vector2 vector = new Vector2(); private final static Rectangle viewport = new Rectangle(); @@ -475,7 +470,7 @@ public class NetServer implements ApplicationListener{ returnArray.clear(); if(represent.isClipped()){ EntityQuery.getNearby(group, viewport, entity -> { - if(((SyncTrait) entity).isSyncing() && viewport.contains(entity.getX(), entity.getY())){ + if(((SyncTrait) entity).isSyncing() && viewport.overlaps(Tmp.r3.setSize(((SyncTrait)entity).clipSize(), ((SyncTrait)entity).clipSize()).setCenter(entity.getX(), entity.getY()))){ returnArray.add(entity); } }); diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 999c57fa7f..4e7591f323 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -4,11 +4,10 @@ import io.anuke.arc.Core; import io.anuke.arc.Input.TextInput; import io.anuke.arc.files.FileHandle; import io.anuke.arc.function.Consumer; +import io.anuke.arc.math.RandomXS128; import io.anuke.arc.scene.ui.TextField; import io.anuke.arc.util.serialization.Base64Coder; -import java.util.Random; - import static io.anuke.mindustry.Vars.mobile; public abstract class Platform { @@ -49,7 +48,7 @@ public abstract class Platform { String uuid = Core.settings.getString("uuid", ""); if(uuid.isEmpty()){ byte[] result = new byte[8]; - new Random().nextBytes(result); + new RandomXS128().nextBytes(result); uuid = new String(Base64Coder.encode(result)); Core.settings.put("uuid", uuid); Core.settings.save(); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index cb33334a45..5bc7a270ce 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -15,6 +15,7 @@ import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.ScreenRecorder; import io.anuke.arc.util.Time; +import io.anuke.arc.util.Tmp; import io.anuke.arc.util.pooling.Pools; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.core.GameState.State; @@ -48,7 +49,6 @@ public class Renderer implements ApplicationListener{ private float targetscale = io.anuke.arc.scene.ui.layout.Unit.dp.scl(4); private float camerascale = targetscale; private Rectangle rect = new Rectangle(), rect2 = new Rectangle(); - private Vector2 avgPosition = new Vector2(); private float shakeIntensity, shaketime; public Renderer(){ @@ -65,8 +65,7 @@ public class Renderer implements ApplicationListener{ Effects.setEffectProvider((effect, color, x, y, rotation, data) -> { if(effect == Fx.none) return; if(Core.settings.getBool("effects")){ - Rectangle view = rect.setSize(camera.width, camera.height) - .setCenter(camera.position.x, camera.position.y); + Rectangle view = camera.bounds(rect); Rectangle pos = rect2.setSize(effect.size).setCenter(x, y); if(view.overlaps(pos)){ @@ -115,7 +114,7 @@ public class Renderer implements ApplicationListener{ if(state.is(State.menu)){ graphics.clear(Color.BLACK); }else{ - Vector2 position = averagePosition(); + Vector2 position = Tmp.v3.set(players[0]); if(players[0].isDead()){ TileEntity core = players[0].getClosestCore(); @@ -256,16 +255,9 @@ public class Renderer implements ApplicationListener{ drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder); - Shaders.outline.color.set(team.color); - Shaders.mix.color.set(Color.WHITE); - - //Graphics.beginShaders(Shaders.outline); - Draw.shader(Shaders.mix, true); drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll); - Draw.shader(); blocks.drawTeamBlocks(Layer.turret, team); - //Graphics.endShaders(); drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver); @@ -288,15 +280,6 @@ public class Renderer implements ApplicationListener{ return camerascale; } - public Vector2 averagePosition(){ - avgPosition.setZero(); - - drawAndInterpolate(playerGroup, p -> p.isLocal, p -> avgPosition.add(p.x, p.y)); - - avgPosition.scl(1f / players.length); - return avgPosition; - } - public void scaleCamera(float amount){ targetscale += amount; clampScale(); @@ -304,47 +287,7 @@ public class Renderer implements ApplicationListener{ public void clampScale(){ float s = io.anuke.arc.scene.ui.layout.Unit.dp.scl(1f); - targetscale = Mathf.clamp(targetscale, s * 2.5f, Math.round(s * 7)); - } - - public void takeMapScreenshot(){ - //TODO fix/implement - /* - float vpW = camera.width, vpH = camera.height; - int w = world.width()*tilesize, h = world.height()*tilesize; - int pw = pixelSurface.width(), ph = pixelSurface.height(); - disableUI = true; - pixelSurface.setSize(w, h, true); - Graphics.getEffectSurface().setSize(w, h, true); - camera.width = w; - camera.height = h; - camera.position.x = w/2f + tilesize/2f; - camera.position.y = h/2f + tilesize/2f; - - draw(); - - disableUI = false; - camera.width = vpW; - camera.height = vpH; - - pixelSurface.getBuffer().begin(); - byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true); - for(int i = 0; i < lines.length; i+= 4){ - lines[i + 3] = (byte)255; - } - pixelSurface.getBuffer().end(); - - Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); - - BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length); - FileHandle file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); - PixmapIO.writePNG(file, fullPixmap); - fullPixmap.dispose(); - - pixelSurface.setSize(pw, ph, false); - Graphics.getEffectSurface().setSize(pw, ph, false); - - ui.showInfoFade(Core.bundle.format("screenshot", file.toString()));*/ + targetscale = Mathf.clamp(targetscale, s * 2.5f, Math.round(s * 5)); } } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 85cf266f77..5bbccaf79a 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -250,17 +250,6 @@ public class UI implements ApplicationListener{ }}.show(); } - public void showInfo(String info, Runnable clicked){ - new Dialog("", "dialog"){{ - getCell(cont).growX(); - cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center); - buttons.addButton("$ok", () -> { - clicked.run(); - hide(); - }).size(90, 50).pad(4); - }}.show(); - } - public void showError(String text){ new Dialog("$error.title", "dialog"){{ cont.margin(15).add(text).width(400f).wrap().get().setAlignment(Align.center, Align.center); @@ -275,6 +264,13 @@ public class UI implements ApplicationListener{ }}.show(); } + public void showInfoText(String titleText, String text){ + new Dialog(titleText, "dialog"){{ + cont.margin(15).add(text).width(400f).wrap().left().get().setAlignment(Align.left, Align.left); + buttons.addButton("$ok", this::hide).size(90, 50).pad(4); + }}.show(); + } + public void showConfirm(String title, String text, Runnable confirmed){ FloatingDialog dialog = new FloatingDialog(title); dialog.cont.add(text).width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 48572dc653..c93e7151aa 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -5,7 +5,6 @@ import io.anuke.arc.Core; import io.anuke.arc.Events; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.IntArray; -import io.anuke.mindustry.entities.EntityQuery; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Point2; @@ -17,11 +16,13 @@ import io.anuke.mindustry.ai.Pathfinder; import io.anuke.mindustry.ai.WaveSpawner; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.entities.EntityQuery; import io.anuke.mindustry.game.EventType.TileChangeEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.maps.MapException; import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.maps.Maps; @@ -210,7 +211,7 @@ public class World implements ApplicationListener{ state.rules.zone = zone.id; loadGenerator(zone.generator); for(Tile core : state.teams.get(defaultTeam).cores){ - for(ItemStack stack : zone.startingItems){ + for(ItemStack stack : zone.getStartingItems()){ core.entity.items.add(stack.item, stack.amount); } } @@ -270,6 +271,17 @@ public class World implements ApplicationListener{ ui.showError("$map.nospawn.pvp"); } } + }else{ + invalidMap = true; + for(Team team : Team.all){ + if(state.teams.get(team).cores.size != 0){ + invalidMap = false; + } + } + + if(invalidMap){ + throw new MapException(map, "Map has no cores!"); + } } if(invalidMap) Core.app.post(() -> state.set(State.menu)); diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java index 3ec34b21da..ea40b3eb6d 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTool.java +++ b/core/src/io/anuke/mindustry/editor/EditorTool.java @@ -11,10 +11,10 @@ import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData.DataPosition; import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.blocks.BlockPart; import io.anuke.mindustry.world.blocks.Floor; -import static io.anuke.mindustry.Vars.content; -import static io.anuke.mindustry.Vars.ui; +import static io.anuke.mindustry.Vars.*; public enum EditorTool{ pick{ @@ -107,7 +107,7 @@ public enum EditorTool{ dest = floor ? bf : bw; byte draw = editor.getDrawBlock().id; - if(dest == draw){ + if(dest == draw || content.block(bw) instanceof BlockPart || content.block(bw).isMultiblock()){ return; } @@ -138,6 +138,17 @@ public enum EditorTool{ } } } + }else if(isAlt2()){ + for(int cx = 0; cx < width; cx++){ + for(int cy = 0; cy < height; cy++){ + byte w = data.read(cx, cy, DataPosition.wall); + if(content.block(w).synthetic()){ + TileDataMarker prev = editor.getPrev(cx, cy, false); + data.write(cx, cy, DataPosition.rotationTeam, (byte)editor.getDrawTeam().ordinal()); + editor.onWrite(cx, cy, prev); + } + } + } }else{ int x1; boolean spanAbove, spanBelow; @@ -201,6 +212,10 @@ public enum EditorTool{ return Core.input.keyDown(KeyCode.TAB); } + public static boolean isAlt2(){ + return Core.input.keyDown(KeyCode.GRAVE); + } + public void touched(MapEditor editor, int x, int y){ } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 17155c2af1..ab494b556a 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -29,6 +29,7 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block.Icon; import io.anuke.mindustry.world.blocks.OreBlock; +import io.anuke.mindustry.world.blocks.storage.CoreBlock; import java.io.DataInputStream; import java.io.InputStream; @@ -503,14 +504,20 @@ public class MapEditorDialog extends Dialog implements Disposable{ blocksOut.clear(); blocksOut.addAll(Vars.content.blocks()); - blocksOut.sort((b1, b2) -> b1.synthetic() && !b2.synthetic() ? 1 : b2.synthetic() && !b1.synthetic() ? -1 : - b1 instanceof OreBlock && !(b2 instanceof OreBlock) ? 1 : !(b1 instanceof OreBlock) && b2 instanceof OreBlock ? -1 : - Integer.compare(b1.id, b2.id)); + blocksOut.sort((b1, b2) -> { + int core = -Boolean.compare(b1 instanceof CoreBlock, b2 instanceof CoreBlock); + if(core != 0) return core; + int synth = Boolean.compare(b1.synthetic(), b2.synthetic()); + if(synth != 0) return synth; + int ore = Boolean.compare(b1 instanceof OreBlock, b2 instanceof OreBlock); + if(ore != 0) return ore; + return Integer.compare(b1.id, b2.id); + }); for(Block block : blocksOut){ TextureRegion region = block.icon(Icon.medium); - if(region == Core.atlas.find("jjfgj")) continue; + if(!Core.atlas.isFound(region)) continue; ImageButton button = new ImageButton("white", "clear-toggle"); button.getStyle().imageUp = new TextureRegionDrawable(region); @@ -527,7 +534,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ group.getButtons().get(2).setChecked(true); - table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(200f).center()).growX(); + table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().localizedName).width(200f).center()).growX(); table.row(); table.add(pane).growY().fillX(); } diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index 79194260c7..093c3f7b14 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -60,7 +60,7 @@ public class Damage{ float shake = Math.min(explosiveness / 4f + 3f, 9f); Effects.shake(shake, shake, x, y); - Effects.effect(Fx.blockExplosion, x, y); + Effects.effect(Fx.dynamicExplosion, x, y, radius/8f); } public static void createIncend(float x, float y, float range, int amount){ diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java index d9c82f7ec0..7c72ad9492 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/io/anuke/mindustry/entities/Units.java @@ -101,18 +101,20 @@ public class Units{ } /**Returns the neareset damaged tile.*/ - public static io.anuke.mindustry.entities.type.TileEntity findDamagedTile(Team team, float x, float y){ + public static TileEntity findDamagedTile(Team team, float x, float y){ Tile tile = Geometry.findClosest(x, y, world.indexer.getDamaged(team)); return tile == null ? null : tile.entity; } /**Returns the neareset ally tile in a range.*/ - public static io.anuke.mindustry.entities.type.TileEntity findAllyTile(Team team, float x, float y, float range, Predicate pred){ + public static TileEntity findAllyTile(Team team, float x, float y, float range, Predicate pred){ return world.indexer.findTile(team, x, y, range, pred); } /**Returns the neareset enemy tile in a range.*/ - public static io.anuke.mindustry.entities.type.TileEntity findEnemyTile(Team team, float x, float y, float range, Predicate pred){ + public static TileEntity findEnemyTile(Team team, float x, float y, float range, Predicate pred){ + if(team == Team.none) return null; + for(Team enemy : state.teams.enemiesOf(team)){ TileEntity entity = world.indexer.findTile(enemy, x, y, range, pred); if(entity != null){ @@ -134,28 +136,35 @@ public class Units{ } //then check all player groups - for(io.anuke.mindustry.entities.type.Player player : playerGroup.all()){ + for(Player player : playerGroup.all()){ cons.accept(player); } } /**Returns the closest target enemy. First, units are checked, then tile entities.*/ public static TargetTrait getClosestTarget(Team team, float x, float y, float range){ - return getClosestTarget(team, x, y, range, u -> !u.isDead() && u.isAdded()); + return getClosestTarget(team, x, y, range, Unit::isValid); } /**Returns the closest target enemy. First, units are checked, then tile entities.*/ public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate unitPred){ + return getClosestTarget(team, x, y, range, unitPred, t -> true); + } + + /**Returns the closest target enemy. First, units are checked, then tile entities.*/ + public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate unitPred, Predicate tilePred){ Unit unit = getClosestEnemy(team, x, y, range, unitPred); if(unit != null){ return unit; }else{ - return findEnemyTile(team, x, y, range, tile -> true); + return findEnemyTile(team, x, y, range, tilePred); } } /**Returns the closest enemy of this team. Filter by predicate.*/ public static Unit getClosestEnemy(Team team, float x, float y, float range, Predicate predicate){ + if(team == Team.none) return null; + result = null; cdist = 0f; diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index 9689824893..e4b1731661 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -23,6 +23,7 @@ import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import java.io.DataInput; @@ -64,10 +65,10 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ } public static boolean has(int x, int y){ - if(!Structs.inBounds(x, y, world.width(), world.height()) || !map.containsKey(x + y * world.width())){ + if(!Structs.inBounds(x, y, world.width(), world.height()) || !map.containsKey(Pos.get(x, y))){ return false; } - Fire fire = map.get(x + y * world.width()); + Fire fire = map.get(Pos.get(x, y)); return fire.isAdded() && fire.fin() < 1f && fire.tile != null && fire.tile.x == x && fire.tile.y == y; } diff --git a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java b/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java index 51dda93718..bc94ecbec9 100644 --- a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java +++ b/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java @@ -2,30 +2,43 @@ package io.anuke.mindustry.entities.effect; import io.anuke.arc.Core; import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; -public class RubbleDecal extends Decal{ - private int size; +import static io.anuke.mindustry.Vars.headless; - /** - * Creates a rubble effect at a position. Provide a block size to use. - */ +public class RubbleDecal extends Decal{ + private static final TextureRegion[][] regions = new TextureRegion[16][0]; + private TextureRegion region; + + /**Creates a rubble effect at a position. Provide a block size to use.*/ public static void create(float x, float y, int size){ + if(headless) return; + + if(regions[size].length == 0){ + regions[size] = new TextureRegion[2]; + for(int j = 0; j < 2; j++){ + regions[size][j] = Core.atlas.find("rubble-" + size + "-" + j); + } + } + RubbleDecal decal = new RubbleDecal(); - decal.size = size; + decal.region = regions[size][Mathf.clamp(Mathf.randomSeed(decal.id, 0, 1), 0, regions[size].length - 1)]; + + if(!Core.atlas.isFound(decal.region)){ + return; + } + decal.set(x, y); decal.add(); } @Override public void drawDecal(){ - String region = "rubble-" + size + "-" + Mathf.randomSeed(id, 0, 1); - - if(!Core.atlas.has(region)){ + if(!Core.atlas.isFound(region)){ remove(); return; } - Draw.rect(region, x, y, Mathf.randomSeed(id, 0, 4) * 90); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java b/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java index b9a4d35f84..eba584b76b 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java +++ b/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java @@ -16,6 +16,7 @@ public class ScorchDecal extends Decal{ public static void create(float x, float y){ if(headless) return; + if(regions[0] == null){ for(int i = 0; i < regions.length; i++){ regions[i] = Core.atlas.find("scorch" + (i + 1)); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index c9cc53e521..047a9d0dd5 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -347,7 +347,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ Draw.color(Color.LIGHT_GRAY, Color.WHITE, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl)); - Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey); + Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey, 0.75f); if(unit instanceof Player && ((Player) unit).isLocal){ Lines.stroke(1f, Pal.accent); diff --git a/core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java b/core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java index cb98c0086a..df23a1053d 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java @@ -1,9 +1,10 @@ package io.anuke.mindustry.entities.traits; +import io.anuke.arc.math.geom.Position; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.world.Tile; -public interface SpawnerTrait extends TargetTrait{ +public interface SpawnerTrait extends TargetTrait, Position{ Tile getTile(); void updateSpawning(Player unit); diff --git a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java index cbcc0317ee..81e5419014 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java @@ -62,6 +62,10 @@ public interface SyncTrait extends Entity, TypeTrait{ return true; } + default float clipSize(){ + return (this instanceof DrawTrait ? ((DrawTrait)this).drawSize() : 8f); + } + //Read and write sync data, usually position void write(DataOutput data) throws IOException; diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index fe2e74e53c..7d62c05d16 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -12,6 +12,7 @@ import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.util.Interval; import io.anuke.arc.util.Time; import io.anuke.mindustry.Vars; +import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.traits.ShooterTrait; @@ -163,6 +164,10 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } } + public boolean isBoss(){ + return hasEffect(StatusEffects.boss); + } + @Override public boolean isImmune(StatusEffect effect){ return type.immunities.contains(effect); @@ -212,11 +217,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return type.health; } - @Override - public float getSize(){ - return 8; - } - @Override public float mass(){ return type.mass; @@ -284,6 +284,11 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return type.hitsize * 10; } + @Override + public float clipSize(){ + return isBoss() ? 10000000000f : super.clipSize(); + } + @Override public void onDeath(){ Call.onUnitDeath(this); diff --git a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java index 4a45929f39..65d324e742 100644 --- a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java @@ -13,7 +13,6 @@ import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.units.UnitState; import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.world.meta.BlockFlag; @@ -38,7 +37,6 @@ public abstract class FlyingUnit extends BaseUnit{ retarget(() -> { targetClosest(); - if(target == null) targetClosestEnemyFlag(BlockFlag.target); if(target == null) targetClosestEnemyFlag(BlockFlag.producer); if(target == null) targetClosestEnemyFlag(BlockFlag.turret); @@ -114,13 +112,13 @@ public abstract class FlyingUnit extends BaseUnit{ @Override public void draw(){ - Draw.alpha(Draw.getShader() != Shaders.mix ? 1f : hitTime / hitDuration); + Draw.mixcol(Color.WHITE, hitTime / hitDuration); Draw.rect(type.region, x, y, rotation - 90); drawWeapons(); drawItems(); - Draw.alpha(1f); + Draw.mixcol(); } public void drawWeapons(){ diff --git a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java b/core/src/io/anuke/mindustry/entities/type/GroundUnit.java index 56523419bc..985f551bc6 100644 --- a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/GroundUnit.java @@ -12,7 +12,6 @@ import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.units.UnitState; import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; @@ -35,9 +34,15 @@ public abstract class GroundUnit extends BaseUnit{ public void update(){ TileEntity core = getClosestEnemyCore(); - float dst = core == null ? 0 : dst(core); - if(core != null && dst < getWeapon().bullet.range() / 1.1f){ + if(core == null){ + setState(patrol); + return; + } + + float dst = dst(core); + + if(dst < getWeapon().bullet.range() / 1.1f){ target = core; } @@ -103,14 +108,14 @@ public abstract class GroundUnit extends BaseUnit{ @Override public void draw(){ - Draw.alpha(Draw.getShader() != Shaders.mix ? 1f : hitTime / hitDuration); + Draw.mixcol(Color.WHITE, hitTime / hitDuration); float ft = Mathf.sin(walkTime * type.speed*5f, 6f, 2f + type.hitsize/15f); Floor floor = getFloorOn(); if(floor.isLiquid){ - Draw.tint(Color.WHITE, floor.liquidColor, 0.5f); + Draw.color(Color.WHITE, floor.liquidColor, 0.5f); } for(int i : Mathf.signs){ @@ -121,9 +126,9 @@ public abstract class GroundUnit extends BaseUnit{ } if(floor.isLiquid){ - Draw.tint(Color.WHITE, floor.liquidColor, drownTime * 0.4f); + Draw.color(Color.WHITE, floor.liquidColor, drownTime * 0.4f); }else{ - Draw.tint(Color.WHITE); + Draw.color(Color.WHITE); } Draw.rect(type.baseRegion, x, y, baseRotation - 90); @@ -140,7 +145,7 @@ public abstract class GroundUnit extends BaseUnit{ drawItems(); - Draw.alpha(1f); + Draw.mixcol(); } @Override @@ -173,7 +178,7 @@ public abstract class GroundUnit extends BaseUnit{ } protected void patrol(){ - vec.trns(baseRotation, type.speed * Time.delta()); + vec.trns(baseRotation, type.speed * Time.delta() * 2); 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/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index c22a184ae0..dfd5e02029 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -23,7 +23,6 @@ import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.input.Binding; import io.anuke.mindustry.io.TypeIO; import io.anuke.mindustry.net.Net; @@ -213,11 +212,6 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ return mech.flying || boostHeat > liftoffBoost; } - @Override - public float getSize(){ - return 8; - } - @Override public void damage(float amount){ hitTime = hitDuration; @@ -290,11 +284,11 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ Floor floor = getFloorOn(); Draw.color(); - Draw.alpha(Draw.getShader() != Shaders.mix ? 1f : hitTime / hitDuration); + Draw.mixcol(Color.WHITE, hitTime / hitDuration); if(!mech.flying){ if(floor.isLiquid){ - Draw.tint(Color.WHITE, floor.liquidColor, 0.5f); + Draw.color(Color.WHITE, floor.liquidColor, 0.5f); } float boostTrnsY = -boostHeat * 3f; @@ -314,9 +308,9 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ } if(floor.isLiquid){ - Draw.tint(Color.WHITE, floor.liquidColor, drownTime); + Draw.color(Color.WHITE, floor.liquidColor, drownTime); }else{ - Draw.tint(Color.WHITE); + Draw.color(Color.WHITE); } Draw.rect(mech.region, x, y, rotation - 90); @@ -349,13 +343,12 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ } } - Draw.alpha(1f); + Draw.reset(); } @Override public void drawStats(){ Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf() * 5f, 1f - healthf())); - Draw.alpha(hitTime / hitDuration); Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90); Draw.color(); } @@ -369,8 +362,9 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ @Override public void drawUnder(){ - float size = mech.engineSize * (mech.flying ? 1f : boostHeat); + if(dead) return; + float size = mech.engineSize * (mech.flying ? 1f : boostHeat); Draw.color(mech.engineColor); Fill.circle(x + Angles.trnsx(rotation + 180, mech.engineOffset), y + Angles.trnsy(rotation + 180, mech.engineOffset), size + Mathf.absin(Time.time(), 2f, size/4f)); @@ -449,7 +443,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ Draw.rect(request.block.icon(Icon.full), request.x * tilesize + request.block.offset(), - request.y * tilesize + request.block.offset(), rad*2, rad*2, request.rotation * 90); + request.y * tilesize + request.block.offset(), rad*2, rad*2, request.block.rotate ? request.rotation * 90 : 0); Draw.color(Pal.accent); @@ -470,6 +464,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ @Override public void update(){ + hitTime -= Time.delta(); if(Float.isNaN(x) || Float.isNaN(y)){ @@ -687,7 +682,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ if(target == null){ isShooting = false; if(Core.settings.getBool("autotarget")){ - target = Units.getClosestTarget(team, x, y, getWeapon().bullet.range()); + target = Units.getClosestTarget(team, x, y, getWeapon().bullet.range(), u -> u.getTeam() != Team.none, u -> u.getTeam() != Team.none); if(mech.canHeal && target == null){ target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.blue)); @@ -749,6 +744,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ dead = true; target = null; moveTarget = null; + spawner = lastSpawner = null; health = maxHealth(); boostHeat = drownTime = hitTime = 0f; mech = (isMobile ? Mechs.starterMobile : Mechs.starterDesktop); @@ -769,6 +765,8 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ }else if(getClosestCore() != null){ this.spawner = (SpawnerTrait)getClosestCore(); } + }else if(getClosestCore() != null){ + set(getClosestCore().getX(), getClosestCore().getY()); } } @@ -844,7 +842,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ @Override public void read(DataInput buffer) throws IOException{ - float lastx = x, lasty = y, lastrot = rotation; + float lastx = x, lasty = y, lastrot = rotation, lastvx = velocity.x, lastvy = velocity.y; super.readSave(buffer); name = TypeIO.readStringData(buffer); byte bools = buffer.readByte(); @@ -865,6 +863,8 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{ if(isLocal){ x = lastx; y = lasty; + velocity.x = lastvx; + velocity.y = lastvy; }else{ mining = world.tile(mine); isBoosting = boosting; diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 350857ee18..fee8f4ac00 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -195,7 +195,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ if(other == null) continue; other = other.target(); - if(other.entity == null || other.getTeamID() != tile.getTeamID()) continue; + if(other.entity == null || !(other.interactable(tile.getTeam()))) continue; other.block().onProximityUpdate(other); diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index cdfa1b9dcc..2312d36612 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -10,6 +10,7 @@ import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.Time; +import io.anuke.arc.util.Tmp; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Damage; @@ -218,6 +219,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ return status.hasEffect(effect); } + //TODO optimize public void avoidOthers(float scaling){ hitbox(queryRect); queryRect.setSize(queryRect.getWidth() * scaling); @@ -263,6 +265,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } if(isFlying()){ + drownTime = 0f; move(velocity.x * Time.delta(), velocity.y * Time.delta()); }else{ boolean onLiquid = floor.isLiquid; @@ -332,7 +335,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } public int maxAccepted(Item item){ - return this.item.item != item ? 0 : getItemCapacity() - this.item.amount; + return this.item.item != item && this.item.amount > 0 ? 0 : getItemCapacity() - this.item.amount; } public void applyEffect(StatusEffect effect, float duration){ @@ -362,7 +365,6 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public void drawStats(){ Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf()*5f, 1f - healthf())); - Draw.alpha(hitTime); Draw.rect(getPowerCellRegion(), x, y, rotation - 90); Draw.color(); } @@ -382,6 +384,11 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ Draw.rect(getIconRegion(), x + offsetX, y + offsetY, rotation - 90); } + public float getSize(){ + hitbox(Tmp.r1); + return Math.max(Tmp.r1.width, Tmp.r1.height) * 2f; + } + public abstract TextureRegion getIconRegion(); public abstract Weapon getWeapon(); @@ -391,6 +398,4 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public abstract float mass(); public abstract boolean isFlying(); - - public abstract float getSize(); } diff --git a/core/src/io/anuke/mindustry/entities/units/Statuses.java b/core/src/io/anuke/mindustry/entities/units/Statuses.java index 90fc24b270..ffc4fe8278 100644 --- a/core/src/io/anuke/mindustry/entities/units/Statuses.java +++ b/core/src/io/anuke/mindustry/entities/units/Statuses.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.entities.units; import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.Bits; import io.anuke.arc.graphics.Color; import io.anuke.arc.util.Time; import io.anuke.arc.util.Tmp; @@ -22,6 +23,7 @@ public class Statuses implements Saveable{ private static final Array removals = new Array<>(); private Array statuses = new Array<>(); + private Bits applied = new Bits(content.getBy(ContentType.status).size); private float speedMultiplier; private float damageMultiplier; @@ -76,6 +78,7 @@ public class Statuses implements Saveable{ } public void update(Unit unit){ + applied.clear(); speedMultiplier = damageMultiplier = armorMultiplier = 1f; if(statuses.size == 0) return; @@ -84,6 +87,7 @@ public class Statuses implements Saveable{ for(StatusEntry entry : statuses){ entry.time = Math.max(entry.time - Time.delta(), 0); + applied.set(entry.effect.id); if(entry.time <= 0){ Pools.free(entry); @@ -114,10 +118,7 @@ public class Statuses implements Saveable{ } public boolean hasEffect(StatusEffect effect){ - for(StatusEntry entry : statuses){ - if(entry.effect == effect) return true; - } - return false; + return applied.get(effect.id); } @Override @@ -125,7 +126,7 @@ public class Statuses implements Saveable{ stream.writeByte(statuses.size); for(StatusEntry entry : statuses){ stream.writeByte(entry.effect.id); - stream.writeShort((short) (entry.time * 2)); + stream.writeFloat(entry.time); } } @@ -140,7 +141,7 @@ public class Statuses implements Saveable{ byte amount = stream.readByte(); for(int i = 0; i < amount; i++){ byte id = stream.readByte(); - float time = stream.readShort() / 2f; + float time = stream.readFloat(); StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); entry.set(content.getByID(ContentType.status, id), time); statuses.add(entry); diff --git a/core/src/io/anuke/mindustry/game/Waves.java b/core/src/io/anuke/mindustry/game/DefaultWaves.java similarity index 86% rename from core/src/io/anuke/mindustry/game/Waves.java rename to core/src/io/anuke/mindustry/game/DefaultWaves.java index 865ae15424..dda11e2c48 100644 --- a/core/src/io/anuke/mindustry/game/Waves.java +++ b/core/src/io/anuke/mindustry/game/DefaultWaves.java @@ -6,20 +6,21 @@ import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.type.ItemStack; -public class Waves{ +public class DefaultWaves{ private static Array spawns; public static Array getDefaultSpawns(){ - if(spawns == null){ + if(spawns == null && UnitTypes.dagger != null){ spawns = Array.with( new SpawnGroup(UnitTypes.dagger){{ end = 8; - unitScaling = 3; + unitScaling = 2; }}, new SpawnGroup(UnitTypes.wraith){{ begin = 12; end = 14; + unitScaling = 2; }}, new SpawnGroup(UnitTypes.dagger){{ @@ -48,7 +49,7 @@ public class Waves{ new SpawnGroup(UnitTypes.titan){{ begin = 28; spacing = 3; - unitScaling = 2; + unitScaling = 1; end = 40; }}, @@ -138,7 +139,7 @@ public class Waves{ new SpawnGroup(UnitTypes.revenant){{ begin = 50; - unitAmount = 4; + unitAmount = 2; unitScaling = 3; spacing = 5; max = 8; @@ -163,25 +164,6 @@ public class Waves{ }} ); } - return spawns; - } - - public static void testWaves(Array spawns, int from, int to){ - for(int i = from; i <= to; i++){ - System.out.print(i + ": "); - int total = 0; - for(SpawnGroup spawn : spawns){ - int a = spawn.getUnitsSpawned(i); - total += a; - - if(a > 0){ - System.out.print(a + "x" + spawn.type.name); - - System.out.print(" "); - } - } - System.out.print(" (" + total + ")"); - System.out.println(); - } + return spawns == null ? new Array<>() : spawns; } } diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 40754f6604..c5dc0ba433 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -18,6 +18,15 @@ public class EventType{ } } + /**Called when a zone's requirements are met.*/ + public static class ZoneConfigureCompleteEvent implements Event{ + public final Zone zone; + + public ZoneConfigureCompleteEvent(Zone zone){ + this.zone = zone; + } + } + /**Called when the game is first loaded.*/ public static class GameLoadEvent implements Event{ diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index 87e52ab512..6726f6fd7f 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -8,13 +8,12 @@ import io.anuke.arc.collection.ObjectSet; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Items; import io.anuke.mindustry.game.EventType.UnlockEvent; -import io.anuke.mindustry.game.EventType.ZoneCompleteEvent; import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.type.Zone; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.state; /**Stores player unlocks. Clientside only.*/ public class GlobalData{ @@ -25,25 +24,19 @@ public class GlobalData{ public GlobalData(){ Core.settings.setSerializer(ContentType.class, (stream, t) -> stream.writeInt(t.ordinal()), stream -> ContentType.values()[stream.readInt()]); Core.settings.setSerializer(Item.class, (stream, t) -> stream.writeUTF(t.name), stream -> content.getByName(ContentType.item, stream.readUTF())); + + Core.settings.setSerializer(ItemStack.class, (stream, t) -> { + stream.writeUTF(t.item.name); + stream.writeInt(t.amount); + }, stream -> { + String name = stream.readUTF(); + int amount = stream.readInt(); + return new ItemStack(content.getByName(ContentType.item, name), amount); + }); } - public void updateWaveScore(Zone zone, int wave){ - int value = Core.settings.getInt(zone.name + "-wave", 0); - if(value < wave){ - Core.settings.put(zone.name + "-wave", wave); - modified = true; - if(wave == zone.conditionWave + 1){ - Events.fire(new ZoneCompleteEvent(zone)); - } - } - } - - public int getWaveScore(Zone zone){ - return Core.settings.getInt(zone.name + "-wave", 0); - } - - public boolean isCompleted(Zone zone){ - return getWaveScore(zone) >= zone.conditionWave; + public void modified(){ + modified = true; } public int getItem(Item item){ @@ -51,6 +44,7 @@ public class GlobalData{ } public void addItem(Item item, int amount){ + unlockContent(item); modified = true; items.getAndIncrement(item, 0, amount); state.stats.itemsDelivered.getAndIncrement(item, 0, amount); @@ -82,7 +76,7 @@ public class GlobalData{ /** Returns whether or not this piece of content is unlocked yet.*/ public boolean isUnlocked(UnlockableContent content){ - return content.alwaysUnlocked() || unlocked.getOr(content.getContentType(), ObjectSet::new).contains(content.getContentName()); + return content.alwaysUnlocked() || unlocked.getOr(content.getContentType(), ObjectSet::new).contains(content.name); } /** @@ -94,7 +88,7 @@ public class GlobalData{ if(content.alwaysUnlocked()) return; //fire unlock event so other classes can use it - if(unlocked.getOr(content.getContentType(), ObjectSet::new).add(content.getContentName())){ + if(unlocked.getOr(content.getContentType(), ObjectSet::new).add(content.name)){ modified = true; content.onUnlock(); Events.fire(new UnlockEvent(content)); @@ -122,7 +116,7 @@ public class GlobalData{ //set up default values if(!Core.settings.has("item-" + Items.copper.name)){ - addItem(Items.copper, 300); + addItem(Items.copper, 50); } } diff --git a/core/src/io/anuke/mindustry/game/MappableContent.java b/core/src/io/anuke/mindustry/game/MappableContent.java index 69fff736ec..9b1e7bbc36 100644 --- a/core/src/io/anuke/mindustry/game/MappableContent.java +++ b/core/src/io/anuke/mindustry/game/MappableContent.java @@ -1,15 +1,14 @@ package io.anuke.mindustry.game; public abstract class MappableContent extends Content { - /** - * Returns the unqiue name of this piece of content. - * The name only needs to be unique for all content of this type. - * Do not use IDs for names! Make sure this string stays constant with each update unless removed. - */ - public abstract String getContentName(); + public final String name; + + public MappableContent(String name){ + this.name = name; + } @Override public String toString(){ - return getContentName(); + return name; } } diff --git a/core/src/io/anuke/mindustry/game/Rank.java b/core/src/io/anuke/mindustry/game/Rank.java deleted file mode 100644 index aab896325b..0000000000 --- a/core/src/io/anuke/mindustry/game/Rank.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.game; - -public enum Rank{ - SS, S, A, B, C, D, F -} diff --git a/core/src/io/anuke/mindustry/game/RulePreset.java b/core/src/io/anuke/mindustry/game/RulePreset.java index 566c632159..174f9e0df9 100644 --- a/core/src/io/anuke/mindustry/game/RulePreset.java +++ b/core/src/io/anuke/mindustry/game/RulePreset.java @@ -9,13 +9,13 @@ public enum RulePreset{ waveTimer = true; waves = true; unitDrops = true; - spawns = Waves.getDefaultSpawns(); + spawns = DefaultWaves.getDefaultSpawns(); }}), sandbox(() -> new Rules(){{ infiniteResources = true; waves = true; waveTimer = false; - spawns = Waves.getDefaultSpawns(); + spawns = DefaultWaves.getDefaultSpawns(); }}), attack(() -> new Rules(){{ enemyCheat = true; diff --git a/core/src/io/anuke/mindustry/game/Rules.java b/core/src/io/anuke/mindustry/game/Rules.java index b7d9c86dc7..a23b15321d 100644 --- a/core/src/io/anuke/mindustry/game/Rules.java +++ b/core/src/io/anuke/mindustry/game/Rules.java @@ -28,5 +28,5 @@ public class Rules{ /**Zone ID, -1 for invalid zone.*/ public byte zone = -1; /**Spawn layout. Since only zones modify this, it should be assigned on save load.*/ - public transient Array spawns = new Array<>(); + public transient Array spawns = DefaultWaves.getDefaultSpawns(); } diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 5555684cef..0142f194f7 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -197,7 +197,7 @@ public class Saves{ } public boolean isHidden(){ - return false; + return getZone() != null; } public String getPlayTime(){ diff --git a/core/src/io/anuke/mindustry/game/SpawnGroup.java b/core/src/io/anuke/mindustry/game/SpawnGroup.java index dbdaaa8a7d..64e399b3db 100644 --- a/core/src/io/anuke/mindustry/game/SpawnGroup.java +++ b/core/src/io/anuke/mindustry/game/SpawnGroup.java @@ -11,16 +11,18 @@ import io.anuke.mindustry.type.UnitType; * Each spawn group can have multiple sub-groups spawned in different areas of the map. */ public class SpawnGroup{ + protected static final int never = Integer.MAX_VALUE; + /**The unit type spawned*/ public final UnitType type; /**When this spawn should end*/ - protected int end = Integer.MAX_VALUE; + protected int end = never; /**When this spawn should start*/ protected int begin; /**The spacing, in waves, of spawns. For example, 2 = spawns every other wave*/ protected int spacing = 1; /**Maximum amount of units that spawn*/ - protected int max = 60; + protected int max = 40; /**How many waves need to pass before the amount of units spawned increases by 1*/ protected float unitScaling = 9999f; /**Amount of enemies spawned initially, with no scaling*/ @@ -34,9 +36,7 @@ public class SpawnGroup{ this.type = type; } - /** - * Returns the amount of units spawned on a specific wave. - */ + /**Returns the amount of units spawned on a specific wave.*/ public int getUnitsSpawned(int wave){ if(wave < begin || wave > end || (wave - begin) % spacing != 0){ return 0; diff --git a/core/src/io/anuke/mindustry/game/Stats.java b/core/src/io/anuke/mindustry/game/Stats.java index 8ef12eee15..63e632440c 100644 --- a/core/src/io/anuke/mindustry/game/Stats.java +++ b/core/src/io/anuke/mindustry/game/Stats.java @@ -1,8 +1,12 @@ package io.anuke.mindustry.game; import io.anuke.annotations.Annotations.Serialize; +import io.anuke.arc.collection.Array; import io.anuke.arc.collection.ObjectIntMap; +import io.anuke.arc.math.Mathf; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemType; +import io.anuke.mindustry.type.Zone; @Serialize public class Stats{ @@ -21,7 +25,48 @@ public class Stats{ /**Friendly buildings destroyed.*/ public int buildingsDestroyed; - public Rank calculateRank(boolean launched){ - return Rank.F; + public RankResult calculateRank(Zone zone, boolean launched){ + float score = 0; + + //each new launch period adds onto the rank 1.5 'points' + if(wavesLasted >= zone.conditionWave){ + score += (float)((wavesLasted - zone.conditionWave) / zone.launchPeriod + 1) * 1.5f; + } + + int capacity = zone.loadout.core().itemCapacity; + + //weigh used fractions + float frac = 0f; + Array obtainable = Array.with(zone.resources).select(i -> i.type == ItemType.material); + for(Item item : obtainable){ + frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; + } + + score += frac*2.4f; + + if(!launched){ + score *= 0.5f; + } + + int rankIndex = Mathf.clamp((int)(score), 0, Rank.values().length-1); + Rank rank = Rank.values()[rankIndex]; + String sign = Math.abs((rankIndex + 0.5f) - score) < 0.2f || rank.name().contains("S") ? "" : (rankIndex + 0.5f) < score ? "-" : "+"; + + return new RankResult(rank, sign); + } + + public static class RankResult{ + public final Rank rank; + /**+ or -*/ + public final String modifier; + + public RankResult(Rank rank, String modifier){ + this.rank = rank; + this.modifier = modifier; + } + } + + public enum Rank{ + F, D, C, B, A, S, SS } } diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java index 7fac1100ad..28ffdfc2a2 100644 --- a/core/src/io/anuke/mindustry/game/Teams.java +++ b/core/src/io/anuke/mindustry/game/Teams.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.game; +import io.anuke.arc.collection.Array; import io.anuke.arc.collection.EnumSet; import io.anuke.arc.collection.ObjectSet; import io.anuke.mindustry.Vars; @@ -22,12 +23,7 @@ public class Teams{ /**Returns team data by type.*/ public TeamData get(Team team){ if(map[team.ordinal()] == null){ - //By default, a non-defined team will be enemies of everything. - Team[] others = new Team[Team.all.length-1]; - for(int i = 0, j = 0; i < Team.all.length; i++){ - if(Team.all[i] != team) others[j++] = Team.all[i]; - } - add(team, others); + add(team, Array.with(Team.all).select(t -> t != team).toArray(Team.class)); } return map[team.ordinal()]; } diff --git a/core/src/io/anuke/mindustry/game/UnlockableContent.java b/core/src/io/anuke/mindustry/game/UnlockableContent.java index b5dbb56619..7a843ecdfc 100644 --- a/core/src/io/anuke/mindustry/game/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/game/UnlockableContent.java @@ -1,11 +1,24 @@ package io.anuke.mindustry.game; +import io.anuke.arc.Core; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.Vars; /**Base interface for an unlockable content type.*/ public abstract class UnlockableContent extends MappableContent{ + /**Localized, formal name. Never null. Set to block name if not found in bundle.*/ + public String localizedName; + /**Localized description. May be null.*/ + public String description; + + public UnlockableContent(String name){ + super(name); + + this.localizedName = Core.bundle.get(getContentType() + "." + name + ".name", name); + this.description = Core.bundle.getOrNull(getContentType() + "." + name + ".description"); + } + /**Returns the localized name of this content.*/ public abstract String localizedName(); diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 35b0d9952e..8ab693b898 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -25,7 +25,7 @@ import static io.anuke.mindustry.Vars.*; public class BlockRenderer{ private final static int initialRequests = 32 * 32; - private final static int expandr = 6; + private final static int expandr = 9; private final static boolean disableShadows = false; private final static Color shadowColor = new Color(0, 0, 0, 0.19f); @@ -37,6 +37,7 @@ public class BlockRenderer{ private int iterateidx = 0; private FrameBuffer shadows = new FrameBuffer(2, 2); private FrameBuffer fog = new FrameBuffer(2, 2); + private Array outArray = new Array<>(); public BlockRenderer(){ @@ -181,6 +182,14 @@ public class BlockRenderer{ if(block.layer2 != null && block.isLayer2(tile)){ addRequest(tile, block.layer2); } + + if(tile.entity != null && tile.entity.power != null && tile.entity.power.links.size > 0){ + for(Tile other : block.getPowerConnections(tile, outArray)){ + if(other.block().layer == Layer.power){ + addRequest(other, Layer.power); + } + } + } } } } diff --git a/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java b/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java index c082b7c8a9..ca2e9787b4 100644 --- a/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java @@ -9,12 +9,43 @@ import io.anuke.arc.graphics.glutils.Shader; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Matrix3; import io.anuke.arc.util.Disposable; +import io.anuke.arc.util.Strings; //TODO this class is a trainwreck, remove it public class IndexedRenderer implements Disposable{ private final static int vsize = 5; - private Shader program = BatchShader.create(); + private Shader program = new Shader( + Strings.join("\n", + "attribute vec4 " + Shader.POSITION_ATTRIBUTE + ";", + "attribute vec4 " + Shader.COLOR_ATTRIBUTE + ";", + "attribute vec2 " + Shader.TEXCOORD_ATTRIBUTE + "0;", + "uniform mat4 u_projTrans;", + "varying vec4 v_color;", + "varying vec2 v_texCoords;", + "", + "void main(){", + " v_color = " + Shader.COLOR_ATTRIBUTE + ";", + " v_color.a = v_color.a * (255.0/254.0);", + " v_texCoords = " + Shader.TEXCOORD_ATTRIBUTE + "0;", + " gl_Position = u_projTrans * " + Shader.POSITION_ATTRIBUTE + ";", + "}"), + Strings.join("\n", + "#ifdef GL_ES", + "#define LOWP lowp", + "precision mediump float;", + "#else", + "#define LOWP ", + "#endif", + "", + "varying LOWP vec4 v_color;", + "varying vec2 v_texCoords;", + "uniform sampler2D u_texture;", + "", + "void main(){", + " gl_FragColor = v_color * texture2D(u_texture, v_texCoords);", + "}" + )); private Mesh mesh; private float[] tmpVerts = new float[vsize * 6]; private float[] vertices; diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index 2d9f50b4b5..af8ad777c2 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -29,8 +29,6 @@ public class OverlayRenderer{ if(!input.isDrawing() || player.isDead()) continue; - Shaders.outline.color.set(Pal.accent); - input.drawOutlined(); } } @@ -106,7 +104,7 @@ public class OverlayRenderer{ Tile tile = world.tileWorld(v.x, v.y); if(tile != null) tile = tile.target(); - if(tile != null && tile.getTeam() == player.getTeam() && tile.block().acceptStack(player.item().item, player.item().amount, tile, player) > 0){ + if(tile != null && tile.interactable(player.getTeam()) && tile.block().acceptStack(player.item().item, player.item().amount, tile, player) > 0){ Draw.color(Pal.place); Lines.square(tile.drawx(), tile.drawy(), tile.block().size * tilesize / 2f + 1 + Mathf.absin(Time.time(), 5f, 1f)); Draw.color(); diff --git a/core/src/io/anuke/mindustry/graphics/Pal.java b/core/src/io/anuke/mindustry/graphics/Pal.java index cad77809cb..b5c17c8604 100644 --- a/core/src/io/anuke/mindustry/graphics/Pal.java +++ b/core/src/io/anuke/mindustry/graphics/Pal.java @@ -53,6 +53,7 @@ public class Pal{ breakInvalid = Color.valueOf("d44b3d"), range = Color.valueOf("f4ba6e"), power = Color.valueOf("fbad67"), + powerBar = Color.valueOf("ec7b4c"), powerLight = Color.valueOf("fbd367"), placing = accent, diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 2d8219127d..223cf38dee 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -8,27 +8,19 @@ import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.util.Time; public class Shaders{ - public static Outline outline; public static Shadow shadow; public static BlockBuild blockbuild; - public static BlockPreview blockpreview; public static Shield shield; public static UnitBuild build; - public static MixShader mix; - public static Shader fullMix; public static FogShader fog; public static MenuShader menu; public static void init(){ - outline = new Outline(); shadow = new Shadow(); blockbuild = new BlockBuild(); - blockpreview = new BlockPreview(); shield = new Shield(); build = new UnitBuild(); - mix = new MixShader(); fog = new FogShader(); - fullMix = new LoadShader("fullmix", "default"); menu = new MenuShader(); } @@ -57,27 +49,13 @@ public class Shaders{ } } - public static class MixShader extends LoadShader{ - public Color color = new Color(Color.WHITE); - - public MixShader(){ - super("mix", "default"); - } - - @Override - public void apply(){ - super.apply(); - setUniformf("u_color", color); - } - } - public static class UnitBuild extends LoadShader{ public float progress, time; public Color color = new Color(); public TextureRegion region; public UnitBuild(){ - super("build", "default"); + super("unitbuild", "default"); } @Override @@ -91,23 +69,6 @@ public class Shaders{ } } - public static class Outline extends LoadShader{ - public Color color = new Color(); - public TextureRegion region = new TextureRegion(); - public float scl; - - public Outline(){ - super("outline", "default"); - } - - @Override - public void apply(){ - setUniformf("u_color", color); - setUniformf("u_scl", scl); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); - } - } - public static class Shadow extends LoadShader{ public Color color = new Color(); public TextureRegion region = new TextureRegion(); @@ -145,23 +106,6 @@ public class Shaders{ } } - public static class BlockPreview extends LoadShader{ - public Color color = new Color(); - public TextureRegion region = new TextureRegion(); - - public BlockPreview(){ - super("blockpreview", "default"); - } - - @Override - public void apply(){ - setUniformf("u_color", color); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); - } - } - public static class Shield extends LoadShader{ public Shield(){ diff --git a/core/src/io/anuke/mindustry/graphics/Shapes.java b/core/src/io/anuke/mindustry/graphics/Shapes.java index 5d87feaefd..899ed2ae8d 100644 --- a/core/src/io/anuke/mindustry/graphics/Shapes.java +++ b/core/src/io/anuke/mindustry/graphics/Shapes.java @@ -6,6 +6,7 @@ import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; +import io.anuke.arc.util.Tmp; //TODO remove public class Shapes{ @@ -19,16 +20,16 @@ public class Shapes{ } public static void laser(String line, String edge, float x, float y, float x2, float y2, float rotation, float scale){ - - Lines.stroke(12f * scale); - Lines.line(Core.atlas.find(line), x, y, x2, y2, CapStyle.none, 0f); - Lines.stroke(1f); - TextureRegion region = Core.atlas.find(edge); - Draw.rect(Core.atlas.find(edge), x, y, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl, rotation + 180); + Tmp.v1.trns(rotation, 8f * scale * Draw.scl); - Draw.rect(Core.atlas.find(edge), x2, y2, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl, rotation); + Draw.rect(Core.atlas.find(edge), x, y, region.getWidth() * scale * Draw.scl, region.getHeight() * scale * Draw.scl, rotation + 180); + Draw.rect(Core.atlas.find(edge), x2, y2, region.getWidth() * scale * Draw.scl, region.getHeight() * scale * Draw.scl, rotation); + + Lines.stroke(12f * scale); + Lines.line(Core.atlas.find(line), x + Tmp.v1.x, y + Tmp.v1.y, x2 - Tmp.v1.x, y2 - Tmp.v1.y, CapStyle.none, 0f); + Lines.stroke(1f); } public static void tri(float x, float y, float width, float length, float rotation){ diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 78049ad0c9..3e4068dfb2 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -18,7 +18,7 @@ public enum Binding implements KeyBind{ pick(KeyCode.MOUSE_MIDDLE), dash(KeyCode.SHIFT_LEFT), drop_unit(KeyCode.SHIFT_LEFT), - gridMode(KeyCode.SPACE), + gridMode(KeyCode.GRAVE), gridModeShift(KeyCode.ALT_LEFT), zoom_hold(KeyCode.CONTROL_LEFT, "view"), zoom(new Axis(KeyCode.SCROLL)), @@ -26,7 +26,6 @@ public enum Binding implements KeyBind{ menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE), pause(KeyCode.SPACE), toggle_menus(KeyCode.C), - screenshot(KeyCode.P), player_list(KeyCode.TAB, "multiplayer"), chat(KeyCode.ENTER), chat_history_prev(KeyCode.UP), diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index c9551a5a5d..71a0001de8 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.input; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.arc.Core; -import io.anuke.mindustry.entities.Effects; import io.anuke.arc.graphics.Color; import io.anuke.arc.input.InputProcessor; import io.anuke.arc.math.Angles; @@ -13,10 +12,10 @@ import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.type.Player; +import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.effect.ItemTransfer; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; -import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.ValidateException; @@ -157,7 +156,7 @@ public abstract class InputHandler implements InputProcessor{ boolean consumed = false, showedInventory = false; //check if tapped block is configurable - if(tile.block().configurable && tile.getTeam() == player.getTeam()){ + if(tile.block().configurable && tile.interactable(player.getTeam())){ consumed = true; if(((!frag.config.isShown() && tile.block().shouldShowConfigure(tile, player)) //if the config fragment is hidden, show //alternatively, the current selected block can 'agree' to switch config tiles @@ -178,14 +177,14 @@ public abstract class InputHandler implements InputProcessor{ } //call tapped event - if(!consumed && tile.getTeam() == player.getTeam()){ + if(!consumed && tile.interactable(player.getTeam())){ Call.onTileTapped(player, tile); } //consume tap event if necessary - if(tile.getTeam() == player.getTeam() && tile.block().consumesTap){ + if(tile.interactable(player.getTeam()) && tile.block().consumesTap){ consumed = true; - }else if((tile.getTeam() == player.getTeam() || tile.getTeam() == Team.none) && tile.block().synthetic() && !consumed){ + }else if(tile.interactable(player.getTeam()) && tile.block().synthetic() && !consumed){ if(tile.block().hasItems && tile.entity.items.total() > 0){ frag.inv.showFor(tile); consumed = true; @@ -288,7 +287,7 @@ public abstract class InputHandler implements InputProcessor{ } public void tryDropItems(Tile tile, float x, float y){ - if(!droppingItem || player.item().amount <= 0 || canTapPlayer(x, y)){ + if(!droppingItem || player.item().amount <= 0 || canTapPlayer(x, y) || state.isPaused()){ droppingItem = false; return; } @@ -297,7 +296,7 @@ public abstract class InputHandler implements InputProcessor{ ItemStack stack = player.item(); - if(tile.block().acceptStack(stack.item, stack.amount, tile, player) > 0 && tile.getTeam() == player.getTeam() && tile.block().hasItems){ + if(tile.block().acceptStack(stack.item, stack.amount, tile, player) > 0 && tile.interactable(player.getTeam()) && tile.block().hasItems){ Call.transferInventory(player, tile); }else{ Call.dropItem(player.angleTo(x, y)); diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index b6f7467520..bd9350b4dd 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -29,7 +29,6 @@ import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.input.PlaceUtils.NormalizeDrawResult; import io.anuke.mindustry.input.PlaceUtils.NormalizeResult; import io.anuke.mindustry.ui.dialogs.FloatingDialog; @@ -175,7 +174,7 @@ public class MobileInput extends InputHandler implements GestureListener{ float offset = request.block.offset(); TextureRegion region = request.block.icon(Icon.full); - Draw.alpha(Mathf.clamp((1f - request.scale) / 0.5f)); + Draw.mixcol(Pal.accent, Mathf.clamp((1f - request.scale) / 0.5f)); Draw.tint(Color.WHITE, Pal.breakInvalid, request.redness); Draw.rect(region, tile.worldx() + offset, tile.worldy() + offset, @@ -183,7 +182,7 @@ public class MobileInput extends InputHandler implements GestureListener{ region.getHeight() * request.scale * Draw.scl, request.block.rotate ? request.rotation * 90 : 0); - Draw.alpha(1f); + Draw.mixcol(Pal.accent, 1f); for(int i = 0; i < 4; i++){ Point2 p = Geometry.d8edge[i]; float poffset = -Math.max(request.block.size-1, 0)/2f * tilesize; @@ -194,7 +193,7 @@ public class MobileInput extends InputHandler implements GestureListener{ Draw.color(); }else{ float rad = (tile.block().size * tilesize / 2f - 1) * request.scale; - Draw.alpha(0f); + Draw.mixcol(); //draw removing request Draw.tint(Pal.removeBack); Lines.square(tile.drawx(), tile.drawy()-1, rad); @@ -289,9 +288,6 @@ public class MobileInput extends InputHandler implements GestureListener{ public void drawOutlined(){ Lines.stroke(1f); - Shaders.mix.color.set(Pal.accent); - Draw.shader(Shaders.mix); - //draw removals for(PlaceRequest request : removals){ Tile tile = request.tile(); @@ -319,17 +315,16 @@ public class MobileInput extends InputHandler implements GestureListener{ request.redness = Mathf.lerpDelta(request.redness, 1f, 0.2f); } - drawRequest(request); //draw last placed request if(!request.remove && request == lastPlaced && request.block != null){ + Draw.mixcol(); request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation)); } } - Draw.shader(); - + Draw.mixcol(); Draw.color(Pal.accent); //Draw lines diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index eebe565662..e304816eef 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.Array; +import io.anuke.arc.util.Pack; +import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.entities.Entities; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.traits.Entity; -import io.anuke.arc.util.Pack; -import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.entities.traits.SaveTrait; import io.anuke.mindustry.entities.traits.TypeTrait; import io.anuke.mindustry.game.Content; @@ -16,13 +16,13 @@ import io.anuke.mindustry.gen.Serialization; import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.BlockPart; -import io.anuke.mindustry.world.blocks.storage.CoreBlock; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.world; public abstract class SaveFileVersion{ public final int version; @@ -110,8 +110,6 @@ public abstract class SaveFileVersion{ byte team = Pack.leftByte(tr); byte rotation = Pack.rightByte(tr); - Team t = Team.all[team]; - tile.setTeam(Team.all[team]); tile.entity.health = health; tile.setRotation(rotation); @@ -123,10 +121,6 @@ public abstract class SaveFileVersion{ tile.entity.readConfig(stream); tile.entity.read(stream); - - if(tile.block() instanceof CoreBlock){ - state.teams.get(t).cores.add(tile); - } }else if(wallid == 0){ int consecutives = stream.readUnsignedByte(); @@ -217,7 +211,7 @@ public abstract class SaveFileVersion{ stream.writeByte(arr.first().getContentType().ordinal()); stream.writeShort(arr.size); for(Content c : arr){ - stream.writeUTF(((MappableContent) c).getContentName()); + stream.writeUTF(((MappableContent) c).name); } } } diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 35bf6ba75a..40c2c2f371 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.io.versions; +import io.anuke.arc.util.Strings; import io.anuke.arc.util.Time; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Serialization; @@ -34,7 +35,7 @@ public class Save16 extends SaveFileVersion{ } String mapname = stream.readUTF(); Map map = world.maps.getByName(mapname); - if(map == null) map = new Map("unknown", 1, 1); + if(map == null) map = new Map(Strings.capitalize(mapname), 1, 1); world.setMap(map); int wave = stream.readInt(); diff --git a/core/src/io/anuke/mindustry/maps/MapException.java b/core/src/io/anuke/mindustry/maps/MapException.java new file mode 100644 index 0000000000..7bc1c76805 --- /dev/null +++ b/core/src/io/anuke/mindustry/maps/MapException.java @@ -0,0 +1,10 @@ +package io.anuke.mindustry.maps; + +public class MapException extends RuntimeException{ + public final Map map; + + public MapException(Map map, String s){ + super(s); + this.map = map; + } +} diff --git a/core/src/io/anuke/mindustry/maps/MapTileData.java b/core/src/io/anuke/mindustry/maps/MapTileData.java index 15d6e30506..e7c550e919 100644 --- a/core/src/io/anuke/mindustry/maps/MapTileData.java +++ b/core/src/io/anuke/mindustry/maps/MapTileData.java @@ -11,7 +11,7 @@ import java.nio.ByteBuffer; public class MapTileData{ /** - * Tile size: 4 bytes.
+ * Tile size: 5 bytes.
* 0: ground tile
* 1: wall tile
* 2: rotation + team
diff --git a/core/src/io/anuke/mindustry/maps/generators/Generator.java b/core/src/io/anuke/mindustry/maps/generators/Generator.java index dac0b08093..a9d31fe87c 100644 --- a/core/src/io/anuke/mindustry/maps/generators/Generator.java +++ b/core/src/io/anuke/mindustry/maps/generators/Generator.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.maps.generators; +import io.anuke.mindustry.type.Loadout; import io.anuke.mindustry.world.Tile; public abstract class Generator{ @@ -12,7 +13,7 @@ public abstract class Generator{ public Generator(){} - public void init(){ + public void init(Loadout loadout){ } diff --git a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java index 3a85a83aac..c083662278 100644 --- a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java @@ -7,12 +7,12 @@ import io.anuke.arc.util.Structs; import io.anuke.arc.util.noise.Simplex; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.type.Loadout; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; @@ -21,22 +21,23 @@ import io.anuke.mindustry.world.blocks.StaticWall; import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.StorageBlock; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.world; public class MapGenerator extends Generator{ private Map map; private String mapName; private Array decorations = new Array<>(); + private Loadout loadout; /**How much the landscape is randomly distorted.*/ public float distortion = 3; /**The amount of final enemy spawns used. -1 to use everything in the map. * This amount of enemy spawns is selected randomly from the map.*/ public int enemySpawns = -1; - /*Whether floor is distorted along with blocks.*/ + /**Whether floor is distorted along with blocks.*/ public boolean distortFloor = false; /**Items randomly added to containers and vaults.*/ public ItemStack[] storageDrops = ItemStack.with(Items.copper, 300, Items.lead, 300, Items.silicon, 200, Items.graphite, 200, Items.blastCompound, 200); - public Block coreBlock; public MapGenerator(String mapName){ this.mapName = mapName; @@ -47,11 +48,6 @@ public class MapGenerator extends Generator{ this.enemySpawns = enemySpawns; } - public MapGenerator core(Block block){ - this.coreBlock = block; - return this; - } - public MapGenerator drops(ItemStack[] drops){ this.storageDrops = drops; return this; @@ -74,7 +70,8 @@ public class MapGenerator extends Generator{ } @Override - public void init(){ + public void init(Loadout loadout){ + this.loadout = loadout; map = world.maps.loadInternalMap(mapName); width = map.meta.width; height = map.meta.height; @@ -87,7 +84,6 @@ public class MapGenerator extends Generator{ data.position(0, 0); TileDataMarker marker = data.newDataMarker(); Array players = new Array<>(); - Array coreTypes = new Array<>(); Array enemies = new Array<>(); for(int y = 0; y < data.height(); y++){ @@ -96,7 +92,6 @@ public class MapGenerator extends Generator{ if(content.block(marker.wall) instanceof CoreBlock){ players.add(new Point2(x, y)); - coreTypes.add(content.block(marker.wall)); marker.wall = 0; } @@ -137,10 +132,10 @@ public class MapGenerator extends Generator{ } } - if(tile.getTeam() == Team.none && tile.block() instanceof StorageBlock){ + if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock)){ for(ItemStack stack : storageDrops){ if(Mathf.chance(0.3)){ - tile.entity.items.add(stack.item, Mathf.random(stack.amount)); + tile.entity.items.add(stack.item, Math.min(Mathf.random(stack.amount), tile.block().itemCapacity)); } } } @@ -180,7 +175,7 @@ public class MapGenerator extends Generator{ throw new IllegalArgumentException("All zone maps must have a core."); } - tiles[core.x][core.y].setBlock(coreBlock == null ? coreTypes.get(players.indexOf(core)) : coreBlock, defaultTeam); + loadout.setup(core.x, core.y); world.prepareTiles(tiles); world.setMap(map); diff --git a/core/src/io/anuke/mindustry/net/Interpolator.java b/core/src/io/anuke/mindustry/net/Interpolator.java index d4590ecec3..b7b32b321a 100644 --- a/core/src/io/anuke/mindustry/net/Interpolator.java +++ b/core/src/io/anuke/mindustry/net/Interpolator.java @@ -37,13 +37,6 @@ public class Interpolator{ public void update(){ - /* - if(pos.dst(target) > 128){ - pos.set(target); - lastUpdated = 0; - updateSpacing = 16; - }*/ - if(lastUpdated != 0 && updateSpacing != 0){ float timeSinceUpdate = Time.timeSinceMillis(lastUpdated); float alpha = Math.min(timeSinceUpdate / updateSpacing, 2f); diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 04375e7a15..e9bc9308f1 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -103,8 +103,6 @@ public class NetworkIO{ player.resetID(id); player.add(); - world.beginMapLoad(); - //map world.spawner.read(stream); SaveIO.getSaveWriter().readMap(stream); @@ -135,8 +133,6 @@ public class NetworkIO{ } } - world.endMapLoad(); - }catch(IOException e){ throw new RuntimeException(e); } diff --git a/core/src/io/anuke/mindustry/type/ContentType.java b/core/src/io/anuke/mindustry/type/ContentType.java index 30189125ee..c20ff0f310 100644 --- a/core/src/io/anuke/mindustry/type/ContentType.java +++ b/core/src/io/anuke/mindustry/type/ContentType.java @@ -11,5 +11,6 @@ public enum ContentType { unit, weather, effect, - zone + zone, + loadout } diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index f655e65b6e..f1f63d560d 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -13,8 +13,6 @@ import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.ui.ContentDisplay; public class Item extends UnlockableContent implements Comparable{ - public final String name; - public final String description; public final Color color; private TextureRegion[] regions; @@ -41,7 +39,7 @@ public class Item extends UnlockableContent implements Comparable{ public boolean alwaysUnlocked = false; public Item(String name, Color color){ - this.name = name; + super(name); this.color = color; this.description = Core.bundle.getOrNull("item." + this.name + ".description"); @@ -93,11 +91,6 @@ public class Item extends UnlockableContent implements Comparable{ return Integer.compare(id, item.id); } - @Override - public String getContentName(){ - return name; - } - @Override public ContentType getContentType(){ return ContentType.item; diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/io/anuke/mindustry/type/ItemStack.java index 5b77275b36..47cfc87868 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/io/anuke/mindustry/type/ItemStack.java @@ -1,6 +1,8 @@ package io.anuke.mindustry.type; -public class ItemStack{ +import io.anuke.arc.collection.Array; + +public class ItemStack implements Comparable{ public Item item; public int amount; @@ -21,6 +23,19 @@ public class ItemStack{ return stacks; } + public static Array list(Object... items){ + Array stacks = new Array<>(items.length/2); + for(int i = 0; i < items.length; i+= 2){ + stacks.add(new ItemStack((Item)items[i], (Integer)items[i + 1])); + } + return stacks; + } + + @Override + public int compareTo(ItemStack itemStack){ + return item.compareTo(itemStack.item); + } + @Override public String toString(){ return "ItemStack{" + diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index 378a6f4779..2f04dfa787 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -10,8 +10,6 @@ import io.anuke.mindustry.ui.ContentDisplay; public class Liquid extends UnlockableContent{ public final Color color; - public final String name; - public final String description; /**0-1, 0 is completely inflammable, anything above that may catch fire when exposed to heat, 0.5+ is very flammable.*/ public float flammability; @@ -27,13 +25,11 @@ public class Liquid extends UnlockableContent{ public Color flameColor = Color.valueOf("ffb763"); /**The associated status effect.*/ public StatusEffect effect = StatusEffects.none; - /**Pump tier. Controls which pumps can use this liquid.*/ - public int tier; /**Displayed icon. TODO fix it by removing autogen, draw icons manually*/ public TextureRegion iconRegion; public Liquid(String name, Color color){ - this.name = name; + super(name); this.color = new Color(color); this.description = Core.bundle.getOrNull("liquid." + name + ".description"); } @@ -67,11 +63,6 @@ public class Liquid extends UnlockableContent{ return localizedName(); } - @Override - public String getContentName(){ - return name; - } - @Override public ContentType getContentType(){ return ContentType.liquid; diff --git a/core/src/io/anuke/mindustry/type/Loadout.java b/core/src/io/anuke/mindustry/type/Loadout.java new file mode 100644 index 0000000000..312a5b4d4e --- /dev/null +++ b/core/src/io/anuke/mindustry/type/Loadout.java @@ -0,0 +1,118 @@ +package io.anuke.mindustry.type; + +import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.IntMap; +import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.content.Items; +import io.anuke.mindustry.game.Content; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.blocks.OreBlock; +import io.anuke.mindustry.world.blocks.storage.CoreBlock; + +import static io.anuke.mindustry.Vars.defaultTeam; +import static io.anuke.mindustry.Vars.world; + +public class Loadout extends Content{ + private final static Array outArray = new Array<>(); + private final static IntMap entries = new IntMap(){{ + put('>', new BlockEntry(Blocks.conveyor, 0)); + put('^', new BlockEntry(Blocks.conveyor, 1)); + put('<', new BlockEntry(Blocks.conveyor, 2)); + put('v', new BlockEntry(Blocks.conveyor, 3)); + + put('1', new BlockEntry(Blocks.coreShard)); + put('2', new BlockEntry(Blocks.coreFoundation)); + put('3', new BlockEntry(Blocks.coreNucleus)); + + put('C', new BlockEntry(Blocks.mechanicalDrill, Items.copper)); + }}; + + private final IntMap blocks = new IntMap<>(); + private Block core; + + public Loadout(String... layout){ + int coreX = -1, coreY = -1; + + outer: + for(int y = 0; y < layout.length; y ++){ + for(int x = 0; x < layout[0].length(); x++){ + char c = layout[y].charAt(x); + if(entries.get(c) != null && entries.get(c).block instanceof CoreBlock){ + core = entries.get(c).block; + coreX = x; + coreY = y; + break outer; + } + } + } + + if(coreX == -1) throw new IllegalArgumentException("Schematic does not have a core."); + + for(int y = 0; y < layout.length; y ++){ + for(int x = 0; x < layout[0].length(); x++){ + char c = layout[y].charAt(x); + if(entries.containsKey(c)){ + BlockEntry entry = entries.get(c); + blocks.put(Pos.get(x - coreX, -(y - coreY)), entry); + } + } + } + } + + public Loadout(){ + + } + + public Block core(){ + return core; + } + + public void setup(int x, int y){ + for(IntMap.Entry entry : blocks.entries()){ + int rx = Pos.x(entry.key); + int ry = Pos.y(entry.key); + Tile tile = world.tile(x + rx, y + ry); + world.setBlock(tile, entry.value.block, defaultTeam); + tile.setRotation((byte)entry.value.rotation); + if(entry.value.ore != null){ + for(Tile t : tile.getLinkedTiles(outArray)){ + Floor floor = t.floor(); + t.setFloor(OreBlock.get(floor, entry.value.ore) == null ? OreBlock.get(Blocks.stone, entry.value.ore) : OreBlock.get(floor, entry.value.ore)); + } + } + } + } + + @Override + public ContentType getContentType(){ + return ContentType.loadout; + } + + static class BlockEntry{ + final Block block; + final Item ore; + final int rotation; + + BlockEntry(Block block, Item ore){ + this.block = block; + this.ore = ore; + this.rotation = 0; + } + + BlockEntry(Block block, int rotation){ + this.block = block; + this.ore = null; + this.rotation = rotation; + } + + BlockEntry(Block block){ + this.block = block; + this.ore = null; + this.rotation = 0; + } + } + +} diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index bfe9842a62..aa56ac67fc 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -10,9 +10,6 @@ import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.ui.ContentDisplay; public class Mech extends UnlockableContent{ - public final String name; - public final String description; - public boolean flying; public float speed = 1.1f; public float maxSpeed = 10f; @@ -38,8 +35,8 @@ public class Mech extends UnlockableContent{ public TextureRegion baseRegion, legRegion, region, iconRegion; public Mech(String name, boolean flying){ + super(name); this.flying = flying; - this.name = name; this.description = Core.bundle.get("mech." + name + ".description"); } @@ -77,11 +74,6 @@ public class Mech extends UnlockableContent{ return iconRegion; } - @Override - public String getContentName(){ - return name; - } - @Override public ContentType getContentType(){ return ContentType.mech; diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index 2af1392bad..0ffbc9f177 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -16,9 +16,6 @@ import io.anuke.mindustry.ui.ContentDisplay; public class UnitType extends UnlockableContent{ protected final Supplier constructor; - - public final String name; - public final String description; public float health = 60; public float hitsize = 7f; public float hitsizeTile = 4f; @@ -44,7 +41,7 @@ public class UnitType extends UnlockableContent{ public TextureRegion iconRegion, legRegion, baseRegion, region; public UnitType(String name, Class type, Supplier mainConstructor){ - this.name = name; + super(name); this.constructor = mainConstructor; this.description = Core.bundle.getOrNull("unit." + name + ".description"); @@ -88,11 +85,6 @@ public class UnitType extends UnlockableContent{ return ContentType.unit; } - @Override - public String getContentName(){ - return name; - } - public BaseUnit create(Team team){ BaseUnit unit = constructor.get(); unit.init(this, team); diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index 265820d0de..93b5208c67 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -1,22 +1,30 @@ package io.anuke.mindustry.type; import io.anuke.arc.Core; +import io.anuke.arc.Events; +import io.anuke.arc.collection.Array; +import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Supplier; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.ui.layout.Table; +import io.anuke.mindustry.content.Loadouts; +import io.anuke.mindustry.content.StatusEffects; +import io.anuke.mindustry.game.EventType.ZoneCompleteEvent; +import io.anuke.mindustry.game.EventType.ZoneConfigureCompleteEvent; import io.anuke.mindustry.game.Rules; +import io.anuke.mindustry.game.SpawnGroup; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.maps.generators.Generator; +import io.anuke.mindustry.maps.generators.MapGenerator; import io.anuke.mindustry.world.Block; +import java.util.Arrays; + import static io.anuke.mindustry.Vars.data; import static io.anuke.mindustry.Vars.state; public class Zone extends UnlockableContent{ - public final String name; public final Generator generator; - public ItemStack[] deployCost = {}; - public ItemStack[] startingItems = {}; public Block[] blockRequirements = {}; public ItemStack[] itemRequirements = {}; public Zone[] zoneRequirements = {}; @@ -24,26 +32,115 @@ public class Zone extends UnlockableContent{ public Supplier rules = Rules::new; public boolean alwaysUnlocked; public int conditionWave = Integer.MAX_VALUE; - public int configureWave = 50; + public int configureWave = 40; public int launchPeriod = 10; + public Loadout loadout = Loadouts.basicShard; - public Zone(String name, Generator generator){ - this.name = name; + protected ItemStack[] baseLaunchCost = {}; + protected Array startingItems = new Array<>(); + protected ItemStack[] launchCost = null; + + public Zone(String name, MapGenerator generator){ + super(name); this.generator = generator; } + protected SpawnGroup bossGroup(UnitType type){ + return new SpawnGroup(type){{ + begin = configureWave-1; + effect = StatusEffects.boss; + unitScaling = 1; + spacing = configureWave; + }}; + } + + public boolean isBossWave(int wave){ + return wave % configureWave == 0 && wave > 0; + } + + public boolean isLaunchWave(int wave){ + return metCondition() && wave % launchPeriod == 0; + } + + public ItemStack[] getLaunchCost(){ + if(launchCost == null){ + updateLaunchCost(); + } + return launchCost; + } + + public Array getStartingItems(){ + return startingItems; + } + + public void updateWave(int wave){ + int value = Core.settings.getInt(name + "-wave", 0); + if(value < wave){ + Core.settings.put(name + "-wave", wave); + data.modified(); + + if(wave == conditionWave + 1){ + Events.fire(new ZoneCompleteEvent(this)); + } + + if(wave == configureWave + 1){ + Events.fire(new ZoneConfigureCompleteEvent(this)); + } + } + } + + public int bestWave(){ + return Core.settings.getInt(name + "-wave", 0); + } + + public boolean isCompleted(){ + return bestWave() >= conditionWave; + } + + public void updateLaunchCost(){ + Array stacks = new Array<>(); + + Consumer adder = stack -> { + for(ItemStack other : stacks){ + if(other.item == stack.item){ + other.amount += stack.amount; + return; + } + } + stacks.add(new ItemStack(stack.item, stack.amount)); + }; + + for(ItemStack stack : baseLaunchCost) adder.accept(stack); + for(ItemStack stack : startingItems) adder.accept(stack); + + for(ItemStack stack : stacks){ + if(stack.amount < 0) stack.amount = 0; + } + + stacks.sort(); + launchCost = stacks.toArray(ItemStack.class); + Core.settings.putObject(name + "-starting-items", startingItems); + data.modified(); + } + /**Whether this zone has met its condition; if true, the player can leave.*/ public boolean metCondition(){ return state.wave >= conditionWave; } public boolean canConfigure(){ - return data.getWaveScore(this) >= configureWave; + return bestWave() >= configureWave; } @Override public void init(){ - generator.init(); + generator.init(loadout); + Arrays.sort(resources); + + Array arr = Core.settings.getObject(name + "-starting-items", Array.class, () -> null); + if(arr != null){ + startingItems = arr; + } } @Override @@ -63,11 +160,6 @@ public class Zone extends UnlockableContent{ @Override public TextureRegion getContentIcon(){ return null; } - @Override - public String getContentName(){ - return name; - } - @Override public String localizedName(){ return Core.bundle.get("zone."+name+".name"); diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/io/anuke/mindustry/ui/ContentDisplay.java index 7f9e969938..62e571449e 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ContentDisplay.java @@ -25,7 +25,7 @@ public class ContentDisplay{ int size = 8 * 6; title.addImage(block.icon(Icon.large)).size(size); - title.add("[accent]" + block.formalName).padLeft(5); + title.add("[accent]" + block.localizedName).padLeft(5); }); table.row(); @@ -34,8 +34,8 @@ public class ContentDisplay{ table.row(); - if(block.fullDescription != null){ - table.add(block.fullDescription).padLeft(5).padRight(5).width(400f).wrap().fillX(); + if(block.description != null){ + table.add(block.description).padLeft(5).padRight(5).width(400f).wrap().fillX(); table.row(); table.addImage("white").height(3).color(Color.LIGHT_GRAY).pad(8).padLeft(0).padRight(0).fillX(); diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index 1ccd3a6f02..3e4692c270 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -10,6 +10,14 @@ import io.anuke.arc.scene.ui.layout.Table; public class ItemImage extends Stack{ + public ItemImage(TextureRegion region, int amount){ + Table t = new Table().left().bottom(); + t.add(amount + "").name("item-label"); + + add(new Image(region)); + add(t); + } + public ItemImage(TextureRegion region, Supplier text){ Table t = new Table().left().bottom(); t.label(text).name("item-label"); diff --git a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java index 49a3b40ccf..83a42a18b8 100644 --- a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java @@ -26,7 +26,7 @@ public class ItemsDisplay extends Table{ margin(0); table("flat", t -> { - t.margin(2); + t.margin(10).marginLeft(15).marginTop(15f); ObjectIntMap items = data.items(); for(Item item : content.items()){ if(item.type == ItemType.material && data.isUnlocked(item)){ diff --git a/core/src/io/anuke/mindustry/ui/MultiReqImage.java b/core/src/io/anuke/mindustry/ui/MultiReqImage.java new file mode 100644 index 0000000000..41c9ef2e44 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/MultiReqImage.java @@ -0,0 +1,31 @@ +package io.anuke.mindustry.ui; + +import io.anuke.arc.collection.Array; +import io.anuke.arc.scene.ui.layout.Stack; +import io.anuke.arc.util.Time; + +public class MultiReqImage extends Stack{ + private Array displays = new Array<>(); + private float time; + + public void add(ReqImage display){ + displays.add(display); + super.add(display); + } + + @Override + public void act(float delta){ + super.act(delta); + + time += Time.delta() / 60f; + + displays.each(req -> req.visible(false)); + + ReqImage valid = displays.find(ReqImage::valid); + if(valid != null){ + valid.visible(true); + }else{ + displays.get((int)(time) % displays.size).visible(true); + } + } +} diff --git a/core/src/io/anuke/mindustry/ui/ReqImage.java b/core/src/io/anuke/mindustry/ui/ReqImage.java new file mode 100644 index 0000000000..315ce91211 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/ReqImage.java @@ -0,0 +1,42 @@ +package io.anuke.mindustry.ui; + +import io.anuke.arc.function.BooleanProvider; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.Lines; +import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.arc.scene.Element; +import io.anuke.arc.scene.ui.Image; +import io.anuke.arc.scene.ui.layout.Stack; +import io.anuke.arc.scene.ui.layout.Unit; +import io.anuke.mindustry.graphics.Pal; + +public class ReqImage extends Stack{ + private final BooleanProvider valid; + + public ReqImage(Element image, BooleanProvider valid){ + this.valid = valid; + add(image); + add(new Element(){ + { + visible(() -> !valid.get()); + } + + @Override + public void draw(){ + Lines.stroke(Unit.dp.scl(2f), Pal.removeBack); + Lines.line(x, y - 2f + height, x + width, y - 2f); + Draw.color(Pal.remove); + Lines.line(x, y + height, x + width, y); + Draw.reset(); + } + }); + } + + public ReqImage(TextureRegion region, BooleanProvider valid){ + this(new Image(region), valid); + } + + public boolean valid(){ + return valid.get(); + } +} diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java index 879a9340e1..1a6e383dd3 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java @@ -1,24 +1,23 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.collection.Array; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.game.Content; -import io.anuke.mindustry.game.UnlockableContent; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.ContentType; import io.anuke.arc.scene.event.HandCursorListener; import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.ScrollPane; import io.anuke.arc.scene.ui.Tooltip; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.utils.UIUtils; - -import static io.anuke.mindustry.Vars.*; +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.game.Content; +import io.anuke.mindustry.game.UnlockableContent; +import io.anuke.mindustry.graphics.Pal; +import io.anuke.mindustry.type.ContentType; public class DatabaseDialog extends FloatingDialog{ public DatabaseDialog(){ - super("database"); + super("$database"); shouldPause = true; addCloseButton(); @@ -56,11 +55,11 @@ public class DatabaseDialog extends FloatingDialog{ for(int i = 0; i < array.size; i++){ UnlockableContent unlock = (UnlockableContent) array.get(i); - Image image = data.isUnlocked(unlock) ? new Image(unlock.getContentIcon()) : new Image("icon-tree-locked"); + Image image = unlocked(unlock) ? new Image(unlock.getContentIcon()) : new Image("icon-tree-locked"); image.addListener(new HandCursorListener()); list.add(image).size(size).pad(3); - if(data.isUnlocked(unlock)){ + if(unlocked(unlock)){ image.clicked(() -> Vars.ui.content.show(unlock)); image.addListener(new Tooltip<>(new Table("button"){{ add(unlock.localizedName()); @@ -77,4 +76,8 @@ public class DatabaseDialog extends FloatingDialog{ cont.add(pane); } + + boolean unlocked(UnlockableContent content){ + return (!Vars.world.isZone() && !Vars.state.is(State.menu)) || content.unlocked(); + } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index a3427894e8..ea3594e79c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -48,6 +48,13 @@ public class DeployDialog extends FloatingDialog{ titleTable.remove(); margin(0f).marginBottom(8); + if(!Core.settings.getBool("zone-info", false)){ + Core.app.post(() -> ui.showInfoText("TEMPORARY GUIDE ON HOW TO PLAY ZONES", "- deploy to zones by selecting them here\n- most zones require items to deploy\n- once you survive a set amount of waves, you can launch all the resources in your core\n- use these items to research in the tech tree or uncover new zones")); + + Core.settings.put("zone-info", true); + Core.settings.save(); + } + cont.stack(control.saves.getZoneSlot() == null ? new View() : new Table(){{ SaveSlot slot = control.saves.getZoneSlot(); @@ -64,7 +71,7 @@ public class DeployDialog extends FloatingDialog{ }catch(SaveException e){ //make sure to handle any save load errors! e.printStackTrace(); if(control.saves.getZoneSlot() != null) control.saves.getZoneSlot().delete(); - ui.showInfo("$save.corrupted"); + Core.app.post(() -> ui.showInfo("$save.corrupted")); show(); } }); @@ -106,93 +113,17 @@ public class DeployDialog extends FloatingDialog{ drawDefaultBackground(x, y); } - - void buildButton(Zone zone, TextButton button){ button.setDisabled(() -> hidden(zone)); button.clicked(() -> info.show(zone)); if(zone.unlocked()){ - //button.table(title -> { button.addImage("icon-zone").padRight(3); button.labelWrap(zone.localizedName()).width(140).growX(); - //}); - - //if(data.getWaveScore(zone) > 0){ - // button.add(Core.bundle.format("bestwave", data.getWaveScore(zone))); - //} - - /* - button.add("$launch").color(Color.LIGHT_GRAY).pad(4); - button.row(); - button.table(req -> { - for(ItemStack stack : zone.deployCost){ - req.addImage(stack.item.region).size(8 * 3); - req.add(stack.amount + "").left(); - } - }).pad(3).growX();*/ }else{ button.addImage("icon-zone-locked"); button.row(); button.add("$locked"); - - /*else{ - button.addImage("icon-zone-locked"); - button.row(); - button.add("$locked").padBottom(6); - - if(!hidden(zone)){ - button.row(); - - button.table(req -> { - req.defaults().left(); - - if(zone.zoneRequirements.length > 0){ - req.table(r -> { - r.add("$complete").colspan(2).left(); - r.row(); - for(Zone other : zone.zoneRequirements){ - r.addImage("icon-zone").padRight(4); - r.add(other.localizedName()).color(Color.LIGHT_GRAY); - r.addImage(data.isCompleted(other) ? "icon-check-2" : "icon-cancel-2") - .color(data.isCompleted(other) ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); - r.row(); - } - }); - } - - req.row(); - - if(zone.itemRequirements.length > 0){ - req.table(r -> { - for(ItemStack stack : zone.itemRequirements){ - r.addImage(stack.item.region).size(8 * 3).padRight(4); - r.add(Math.min(data.getItem(stack.item), stack.amount) + "/" + stack.amount) - .color(stack.amount > data.getItem(stack.item) ? Color.SCARLET : Color.LIGHT_GRAY).left(); - r.row(); - } - }).padTop(10); - } - - req.row(); - - if(zone.blockRequirements.length > 0){ - req.table(r -> { - r.add("$research.list").colspan(2).left(); - r.row(); - for(Block block : zone.blockRequirements){ - r.addImage(block.icon(Icon.small)).size(8 * 3).padRight(4); - r.add(block.formalName).color(Color.LIGHT_GRAY); - r.addImage(data.isUnlocked(block) ? "icon-check-2" : "icon-cancel-2") - .color(data.isUnlocked(block) ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); - r.row(); - } - - }).padTop(10); - } - }).growX(); - } - }*/ } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java index 4ad7908bec..7e95935bef 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java @@ -63,7 +63,7 @@ public class FloatingDialog extends Dialog{ @Override public void addCloseButton(){ - buttons.addImageTextButton("$back", "icon-arrow-left", 30f, this::hide).size(230f, 64f); + buttons.addImageTextButton("$back", "icon-arrow-left", 30f, this::hide).size(210f, 64f); keyDown(key -> { if(key == KeyCode.ESCAPE || key == KeyCode.BACK) { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java index a2fc45017c..f20e225fe2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.Core; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.game.Stats.RankResult; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item.Icon; @@ -67,6 +68,12 @@ public class GameOverDialog extends FloatingDialog{ } } } + + if(world.isZone()){ + RankResult result = state.stats.calculateRank(world.getZone(), state.launched); + cont.add(Core.bundle.format("stat.rank", result.rank + result.modifier)); + cont.row(); + } }).pad(12); if(world.isZone()){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index 62cc23e37a..4b79828534 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -89,7 +89,7 @@ public class MapsDialog extends FloatingDialog{ TextButton button = maps.addButton("", "clear", () -> showMapInfo(map)).width(mapsize).pad(8).get(); button.clearChildren(); button.margin(9); - button.add(map.meta.tags.get("name", map.name)).growX().center().get().setEllipsis(true); + button.add(map.meta.tags.get("name", map.name)).width(mapsize - 18f).center().get().setEllipsis(true); button.row(); button.addImage("white").growX().pad(4).color(Color.GRAY); button.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java index 76cb78078f..77e071c8a6 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java @@ -40,7 +40,11 @@ public class PausedDialog extends FloatingDialog{ cont.addButton("$back", this::hide).colspan(2).width(dw*2 + 20f); cont.row(); - cont.addButton("$techtree", ui.tech::show); + if(world.isZone()){ + cont.addButton("$techtree", ui.tech::show); + }else{ + cont.addButton("$database", ui.database::show); + } cont.addButton("$settings", ui.settings::show); if(!world.isZone()){ @@ -76,6 +80,8 @@ public class PausedDialog extends FloatingDialog{ cont.row(); cont.addRowImageTextButton("$load", "icon-load", isize, load::show).disabled(b -> Net.active()); + }else{ + cont.row(); } cont.addRowImageTextButton("$hostserver.mobile", "icon-host", isize, ui.host::show).disabled(b -> Net.active()); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 810bdd2e20..8b99145120 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -195,7 +195,6 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("fps", false); graphics.checkPref("indicators", true); graphics.checkPref("lasers", true); - graphics.checkPref("minimap", !mobile); //minimap is disabled by default on mobile devices } private void back(){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index 83274b4359..5401b901f6 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -47,6 +47,11 @@ public class TechTreeDialog extends FloatingDialog{ shown(() -> checkNodes(root)); hidden(ui.deploy::setup); addCloseButton(); + + buttons.addImageTextButton("$database", "icon-database", 14*2, () -> { + hide(); + ui.database.show(); + }).size(210f, 64f); } @Override @@ -166,7 +171,7 @@ public class TechTreeDialog extends FloatingDialog{ void unlock(TechNode node){ data.unlockContent(node.block); data.removeItems(node.requirements); - showToast(Core.bundle.format("researched", node.block.formalName)); + showToast(Core.bundle.format("researched", node.block.localizedName)); checkNodes(root); hoverNode = null; rebuild(); @@ -201,7 +206,7 @@ public class TechTreeDialog extends FloatingDialog{ infoTable.table(desc -> { desc.left().defaults().left(); - desc.add(node.block.formalName); + desc.add(node.block.localizedName); desc.row(); if(locked(node)){ desc.table(t -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java index b588d4d7e4..5dd8e13142 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java @@ -37,7 +37,7 @@ public class TraceDialog extends FloatingDialog{ table.row(); table.add(Core.bundle.format("trace.structureblocksbroken", info.structureBlocksBroken)); table.row(); - table.add(Core.bundle.format("trace.lastblockbroken", info.lastBlockBroken.formalName)); + table.add(Core.bundle.format("trace.lastblockbroken", info.lastBlockBroken.localizedName)); table.row(); table.add().pad(5); @@ -45,7 +45,7 @@ public class TraceDialog extends FloatingDialog{ table.add(Core.bundle.format("trace.totalblocksplaced", info.totalBlocksPlaced)); table.row(); - table.add(Core.bundle.format("trace.lastblockplaced", info.lastBlockPlaced.formalName)); + table.add(Core.bundle.format("trace.lastblockplaced", info.lastBlockPlaced.localizedName)); table.row(); cont.add(table); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index a046bcd909..bb5ef324f5 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -3,9 +3,12 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.Core; import io.anuke.arc.graphics.Color; import io.anuke.arc.scene.ui.Button; +import io.anuke.arc.scene.ui.TextButton; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.type.ItemType; import io.anuke.mindustry.type.Zone; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block.Icon; @@ -21,6 +24,11 @@ public class ZoneInfoDialog extends FloatingDialog{ addCloseButton(); } + @Override + protected void drawBackground(float x, float y){ + drawDefaultBackground(x, y); + } + public void show(Zone zone){ setup(zone); show(); @@ -29,6 +37,24 @@ public class ZoneInfoDialog extends FloatingDialog{ private void setup(Zone zone){ cont.clear(); + Table iteminfo = new Table(); + Runnable rebuildItems = () -> { + int i = 0; + iteminfo.clear(); + ItemStack[] stacks = zone.unlocked() ? zone.getLaunchCost() : zone.itemRequirements; + for(ItemStack stack : stacks){ + if(stack.amount == 0) continue; + + if(i++ % 2 == 0){ + iteminfo.row(); + } + iteminfo.addImage(stack.item.icon(Item.Icon.medium)).size(8*3).padRight(1); + iteminfo.add(stack.amount + "").color(Color.LIGHT_GRAY).padRight(5); + } + }; + + rebuildItems.run(); + cont.table(cont -> { if(zone.locked()){ cont.addImage("icon-zone-locked"); @@ -46,8 +72,8 @@ public class ZoneInfoDialog extends FloatingDialog{ for(Zone other : zone.zoneRequirements){ r.addImage("icon-zone").padRight(4); r.add(other.localizedName()).color(Color.LIGHT_GRAY); - r.addImage(data.isCompleted(other) ? "icon-check-2" : "icon-cancel-2") - .color(data.isCompleted(other) ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); + r.addImage(other.isCompleted() ? "icon-check-2" : "icon-cancel-2") + .color(other.isCompleted() ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); r.row(); } }); @@ -61,7 +87,7 @@ public class ZoneInfoDialog extends FloatingDialog{ r.row(); for(Block block : zone.blockRequirements){ r.addImage(block.icon(Icon.small)).size(8 * 3).padRight(4); - r.add(block.formalName).color(Color.LIGHT_GRAY); + r.add(block.localizedName).color(Color.LIGHT_GRAY); r.addImage(data.isUnlocked(block) ? "icon-check-2" : "icon-cancel-2") .color(data.isUnlocked(block) ? Color.LIGHT_GRAY : Color.SCARLET).padLeft(3); r.row(); @@ -87,10 +113,69 @@ public class ZoneInfoDialog extends FloatingDialog{ } }); - if(data.getWaveScore(zone) > 0){ + if(zone.bestWave() > 0){ cont.row(); - cont.add(Core.bundle.format("bestwave", data.getWaveScore(zone))); + cont.add(Core.bundle.format("bestwave", zone.bestWave())); } + + Table load = new Table(); + //thanks java, absolutely brilliant syntax here + Runnable[] rebuildLoadout = {null}; + rebuildLoadout[0] = () -> { + load.clear(); + float bsize = 40f; + int step = 100; + + load.left(); + for(ItemStack stack : zone.getStartingItems()){ + load.addButton("-", () -> { + stack.amount = Math.max(stack.amount - step, 0); + zone.updateLaunchCost(); + rebuildItems.run(); + }).size(bsize).pad(2); + load.addButton("+", () -> { + stack.amount = Math.min(stack.amount + step, zone.loadout.core().itemCapacity); + zone.updateLaunchCost(); + rebuildItems.run(); + }).size(bsize).pad(2); + + load.addImage(stack.item.icon(Item.Icon.medium)).size(8 * 3).padRight(4); + load.label(() -> stack.amount + "").left(); + + load.row(); + } + + load.addButton("$add", () -> { + FloatingDialog dialog = new FloatingDialog(""); + dialog.setFillParent(false); + for(Item item : content.items().select(item -> data.getItem(item) > 0 && item.type == ItemType.material && zone.getStartingItems().find(stack -> stack.item == item) == null)){ + TextButton button = dialog.cont.addButton("", () -> { + zone.getStartingItems().add(new ItemStack(item, 0)); + zone.updateLaunchCost(); + rebuildLoadout[0].run(); + dialog.hide(); + }).size(300f, 35f).pad(1).get(); + button.clearChildren(); + button.left(); + button.addImage(item.icon(Item.Icon.medium)).size(8*3).pad(4); + button.add(item.localizedName); + dialog.cont.row(); + } + dialog.show(); + }).colspan(4).size(100f, bsize).left().disabled(b -> !content.items().contains(item -> data.getItem(item) > 0 && item.type == ItemType.material && !zone.getStartingItems().contains(stack -> stack.item == item))); + }; + + rebuildLoadout[0].run(); + + cont.row(); + cont.table(zone.canConfigure() ? "button" : "button-disabled", t -> { + t.left(); + t.add(!zone.canConfigure() ? Core.bundle.format("configure.locked", zone.configureWave) : "$configure").growX().wrap(); + if(zone.canConfigure()){ + t.row(); + t.pane(load).pad(2).growX().left(); + } + }).width(300f).pad(4).left(); } }); @@ -104,20 +189,14 @@ public class ZoneInfoDialog extends FloatingDialog{ setup(zone); }else{ ui.deploy.hide(); - data.removeItems(zone.deployCost); + data.removeItems(zone.getLaunchCost()); hide(); world.playZone(zone); } - }).size(300f, 70f).padTop(5).disabled(b -> zone.locked() ? !canUnlock(zone) : !data.hasItems(zone.deployCost)).get(); + }).minWidth(150f).margin(13f).padTop(5).disabled(b -> zone.locked() ? !canUnlock(zone) : !data.hasItems(zone.getLaunchCost())).get(); button.row(); - button.table(r -> { - ItemStack[] stacks = zone.unlocked() ? zone.deployCost : zone.itemRequirements; - for(ItemStack stack : stacks){ - r.addImage(stack.item.icon(Item.Icon.medium)).size(8*3).padRight(1); - r.add(stack.amount + "").color(Color.LIGHT_GRAY).padRight(5); - } - }); + button.add(iteminfo); } private boolean canUnlock(Zone zone){ @@ -126,7 +205,7 @@ public class ZoneInfoDialog extends FloatingDialog{ } for(Zone other : zone.zoneRequirements){ - if(!data.isCompleted(other)){ + if(!other.isCompleted()){ return false; } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 171ac4c692..039d5f1152 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -131,7 +131,7 @@ public class BlockInventoryFragment extends Fragment{ container.add(i); - BooleanProvider canPick = () -> player.acceptsItem(item); + BooleanProvider canPick = () -> player.acceptsItem(item) && !state.isPaused(); HandCursorListener l = new HandCursorListener(); l.setEnabled(canPick); @@ -149,10 +149,12 @@ public class BlockInventoryFragment extends Fragment{ public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ if(!canPick.get() || !tile.entity.items.has(item)) return false; int amount = Math.min(1, player.maxAccepted(item)); - Call.requestItem(player, tile, item, amount); - lastItem = item; - holding = true; - holdTime = 0f; + if(amount > 0){ + Call.requestItem(player, tile, item, amount); + lastItem = item; + holding = true; + holdTime = 0f; + } return true; } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 0b1580d5b9..8070ccaab5 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -15,35 +15,32 @@ import io.anuke.arc.scene.ui.ImageButton; import io.anuke.arc.scene.ui.TextButton; import io.anuke.arc.scene.ui.layout.Stack; import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.scene.utils.Elements; -import io.anuke.arc.util.*; +import io.anuke.arc.util.Align; +import io.anuke.arc.util.Scaling; +import io.anuke.arc.util.Time; +import io.anuke.arc.util.Tmp; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.game.EventType.StateChangeEvent; -import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.input.Binding; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Packets.AdminAction; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.ui.IntFormat; -import io.anuke.mindustry.ui.dialogs.FloatingDialog; - -import java.lang.StringBuilder; import static io.anuke.mindustry.Vars.*; public class HudFragment extends Fragment{ public final PlacementFragment blockfrag = new PlacementFragment(); - private ImageButton menu, flip; - private Stack wavetable; - private Table infolabel; + private ImageButton flip; private Table lastUnlockTable; private Table lastUnlockLayout; private boolean shown = true; - private float dsize = 58; + private float dsize = 59; private float isize = 40; private float coreAttackTime; @@ -61,7 +58,7 @@ public class HudFragment extends Fragment{ select.left(); select.defaults().size(dsize).left(); - menu = select.addImageButton("icon-menu", "clear", isize, ui.paused::show).get(); + select.addImageButton("icon-menu", "clear", isize, ui.paused::show); flip = select.addImageButton("icon-arrow-up", "clear", isize, this::toggleMenus).get(); select.addImageButton("icon-pause", "clear", isize, () -> { @@ -86,6 +83,8 @@ public class HudFragment extends Fragment{ }else{ ui.chatfrag.toggle(); } + }else if(world.isZone()){ + ui.tech.show(); }else{ ui.database.show(); } @@ -93,15 +92,15 @@ public class HudFragment extends Fragment{ if(Net.active() && mobile){ i.getStyle().imageUp = Core.scene.skin.getDrawable("icon-chat"); }else{ - i.getStyle().imageUp = Core.scene.skin.getDrawable("icon-unlocks"); + i.getStyle().imageUp = Core.scene.skin.getDrawable("icon-database-small"); } }).get(); - select.addImage("blank").color(Pal.accent).width(6f).fillY(); - }); + select.addImage("blank").color(Pal.accent).width(3f).fillY(); + }).left(); cont.row(); - cont.addImage("blank").height(6f).color(Pal.accent).fillX(); + cont.addImage("blank").height(3f).color(Pal.accent).fillX(); cont.row(); } @@ -111,40 +110,35 @@ public class HudFragment extends Fragment{ } }); - Stack stack = new Stack(); - TextButton waves = new TextButton("", "wave"); - Table btable = new Table().margin(0); + cont.table(stuff -> { + stuff.left(); + Stack stack = new Stack(); + TextButton waves = new TextButton("", "wave"); + Table btable = new Table().margin(0); - stack.add(waves); - stack.add(btable); + stack.add(waves); + stack.add(btable); - wavetable = stack; - - addWaveTable(waves); - addPlayButton(btable); - cont.add(stack).width(dsize * 4 + 6f); - - cont.row(); - - //fps display - infolabel = cont.table(t -> { - IntFormat fps = new IntFormat("fps"); - IntFormat ping = new IntFormat("ping"); - t.label(() -> fps.get(Core.graphics.getFramesPerSecond())).padRight(10); - t.row(); - if(Net.hasClient()){ - t.label(() -> ping.get(Net.getPing())).visible(Net::client).colspan(2); - } - }).size(-1).visible(() -> Core.settings.getBool("fps")).update(t -> t.setTranslation(0, (!waves.isVisible() ? wavetable.getHeight() : Math.min(wavetable.getTranslation().y, wavetable.getHeight())))).get(); - - //make wave box appear below rest of menu - if(mobile){ - cont.swapActor(wavetable, menu.getParent()); - } + addWaveTable(waves); + addPlayButton(btable); + stuff.add(stack).width(dsize * 4 + 3f); + stuff.row(); + stuff.table("button", t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.WHITE)) + .grow()).fillX().visible(() -> world.isZone() && state.boss() != null).height(60f).get(); + stuff.row(); + }).visible(() -> shown); }); - //minimap - //parent.fill(t -> t.top().right().add(new Minimap()).visible(() -> !state.is(State.menu) && Core.settings.getBool("minimap"))); + + //fps display + parent.fill(info -> { + info.top().right().margin(4).visible(() -> Core.settings.getBool("fps")); + IntFormat fps = new IntFormat("fps"); + IntFormat ping = new IntFormat("ping"); + info.label(() -> fps.get(Core.graphics.getFramesPerSecond())).right(); + info.row(); + info.label(() -> ping.get(Net.getPing())).visible(Net::client).right(); + }); //spawner warning parent.fill(t -> { @@ -153,9 +147,7 @@ public class HudFragment extends Fragment{ t.table("flat", c -> c.add("$nearpoint") .update(l -> l.setColor(Tmp.c1.set(Color.WHITE).lerp(Color.SCARLET, Mathf.absin(Time.time(), 10f, 1f)))) .get().setAlignment(Align.center, Align.center)) - .margin(6).update(u -> { - u.color.a = Mathf.lerpDelta(u.color.a, Mathf.num(world.spawner.playerNear()), 0.1f); - }).get().color.a = 0f; + .margin(6).update(u -> u.color.a = Mathf.lerpDelta(u.color.a, Mathf.num(world.spawner.playerNear()), 0.1f)).get().color.a = 0f; }); //out of bounds warning @@ -227,7 +219,7 @@ public class HudFragment extends Fragment{ world.getZone().metCondition() && !Net.client() && state.wave % world.getZone().launchPeriod == 0 && - state.wavetime < state.rules.waveSpacing - 70); + state.wavetime < state.rules.waveSpacing * launchWaveMultiplier - 70); button.update(() -> { if(world.getZone() == null){ @@ -235,7 +227,7 @@ public class HudFragment extends Fragment{ return; } - button.setText(Core.bundle.get(state.enemies() > 0 ? "launch.unable" : "launch") + "\n" + + button.setText(state.enemies() > 0 ? Core.bundle.format("launch.unable", state.enemies()) : Core.bundle.get("launch") + "\n" + Core.bundle.format("launch.next", state.wave + world.getZone().launchPeriod)); button.getLabel().setColor(Tmp.c1.set(Color.WHITE).lerp(state.enemies() > 0 ? Color.WHITE : Pal.accent, @@ -285,6 +277,10 @@ public class HudFragment extends Fragment{ Actions.run(() -> container.actions(Actions.translateBy(0, table.getPrefHeight(), 1f, Interpolation.fade), Actions.removeActor()))); } + public boolean shown(){ + return shown; + } + /** Show unlock notification for a new recipe. */ public void showUnlock(UnlockableContent content){ //some content may not have icons... yet @@ -370,38 +366,25 @@ public class HudFragment extends Fragment{ } } - public void showTextDialog(String str){ - new FloatingDialog("$mission.info"){{ - shouldPause = true; - setFillParent(false); - getCell(cont).growX(); - cont.margin(15).add(str).width(400f).wrap().get().setAlignment(Align.left, Align.left); - buttons.addButton("$continue", this::hide).size(140, 60).pad(4); - }}.show(); + public void showLaunch(){ + Image image = new Image("white"); + image.getColor().a = 0f; + image.setFillParent(true); + image.actions(Actions.fadeIn(40f / 60f)); + image.update(() -> { + if(state.is(State.menu)){ + image.remove(); + } + }); + Core.scene.add(image); } private void toggleMenus(){ - wavetable.clearActions(); - infolabel.clearActions(); - - float dur = 0.3f; - Interpolation in = Interpolation.pow3Out; - if(flip != null){ flip.getStyle().imageUp = Core.scene.skin.getDrawable(shown ? "icon-arrow-down" : "icon-arrow-up"); } - if(shown){ - shown = false; - blockfrag.toggle(dur, in); - wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + Unit.dp.scl(dsize) + Unit.dp.scl(6)) - wavetable.getTranslation().y, dur, in)); - infolabel.actions(Actions.translateBy(0, (wavetable.getHeight()) - wavetable.getTranslation().y, dur, in)); - }else{ - shown = true; - blockfrag.toggle(dur, in); - wavetable.actions(Actions.translateBy(0, -wavetable.getTranslation().y, dur, in)); - infolabel.actions(Actions.translateBy(0, -infolabel.getTranslation().y, dur, in)); - } + shown = !shown; } private void addWaveTable(TextButton table){ @@ -447,12 +430,8 @@ public class HudFragment extends Fragment{ }else{ state.wavetime = 0f; } - }).growY().fillX().right().width(40f).update(l -> { - boolean vis = !state.rules.waveTimer && ((Net.server() || players[0].isAdmin) || !Net.active()); - boolean paused = state.is(State.paused) || !vis; - - l.getStyle().imageUp = Core.scene.skin.getDrawable(vis ? "icon-play" : "clear"); - l.touchable(!paused ? Touchable.enabled : Touchable.disabled); - }).visible(() -> !state.rules.waveTimer && ((Net.server() || players[0].isAdmin) || !Net.active()) && unitGroups[Team.red.ordinal()].size() == 0); + }).growY().fillX().right().width(40f) + .visible(() -> state.rules.waves && ((Net.server() || players[0].isAdmin) || !Net.active()) && state.enemies() == 0 + && (state.wavetime < state.rules.waveSpacing - 60 || !state.rules.waveTimer)); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 58c4354f4c..5e721f9d45 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -63,7 +63,6 @@ public class MenuFragment extends Fragment{ join = new MobileButton("icon-add", isize, "$joingame", ui.join::show), editor = new MobileButton("icon-editor", isize, "$editor", () -> ui.loadAnd(ui.editor::show)), tools = new MobileButton("icon-tools", isize, "$settings", ui.settings::show), - unlocks = new MobileButton("icon-unlocks", isize, "$database", ui.database::show), donate = new MobileButton("icon-donate", isize, "$donate", Platform.instance::openDonations); if(Core.graphics.getWidth() > Core.graphics.getHeight()){ @@ -78,7 +77,6 @@ public class MenuFragment extends Fragment{ table.add(editor); table.add(tools); - table.add(unlocks); if(Platform.instance.canDonate()) table.add(donate); }).colspan(4); @@ -96,8 +94,6 @@ public class MenuFragment extends Fragment{ container.table(table -> { table.defaults().set(container.defaults()); - table.add(unlocks); - if(Platform.instance.canDonate()) table.add(donate); }).colspan(2); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index efdf983bfb..b4c93d4195 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -5,11 +5,10 @@ import io.anuke.arc.Events; import io.anuke.arc.collection.Array; import io.anuke.arc.graphics.Color; import io.anuke.arc.input.KeyCode; -import io.anuke.arc.math.Interpolation; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.scene.Group; -import io.anuke.arc.scene.actions.Actions; import io.anuke.arc.scene.event.Touchable; +import io.anuke.arc.scene.style.TextureRegionDrawable; import io.anuke.arc.scene.ui.ButtonGroup; import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.ImageButton; @@ -42,7 +41,6 @@ public class PlacementFragment extends Fragment{ Tile lastHover; Tile hoverTile; Table blockTable, toggler, topTable; - boolean shown = true; boolean lastGround; //TODO make this configurable @@ -122,7 +120,7 @@ public class PlacementFragment extends Fragment{ public void build(Group parent){ parent.fill(full -> { toggler = full; - full.bottom().right().visible(() -> !state.is(State.menu)); + full.bottom().right().visible(() -> !state.is(State.menu) && ui.hudfrag.shown()); full.table(frame -> { InputHandler input = control.input(0); @@ -153,7 +151,7 @@ public class PlacementFragment extends Fragment{ } }).size(46f).group(group).get(); - button.replaceImage(new Image(block.icon(Icon.medium))); + button.getStyle().imageUp = new TextureRegionDrawable(block.icon(Icon.medium)); button.update(() -> { //color unplacable things gray TileEntity core = players[0].getClosestCore(); @@ -178,7 +176,7 @@ public class PlacementFragment extends Fragment{ top.add(new Table()).growX().update(topTable -> { //don't refresh unnecessarily if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) - || (tileDisplayBlock() != null && lastHover == hoverTile && lastGround)) + || (tileDisplayBlock() != null && lastHover == hoverTile && lastDisplay == tileDisplayBlock() && lastGround)) return; topTable.clear(); @@ -194,7 +192,7 @@ public class PlacementFragment extends Fragment{ topTable.table(header -> { header.left(); header.add(new Image(lastDisplay.icon(Icon.medium))).size(8 * 4); - header.labelWrap(() -> !unlocked(lastDisplay) ? Core.bundle.get("blocks.unknown") : lastDisplay.formalName) + header.labelWrap(() -> !unlocked(lastDisplay) ? Core.bundle.get("blocks.unknown") : lastDisplay.localizedName) .left().width(190f).padLeft(5); header.add().growX(); if(unlocked(lastDisplay)){ @@ -344,16 +342,4 @@ public class PlacementFragment extends Fragment{ 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/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 0867765cda..749e26f756 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -30,6 +30,7 @@ import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.ui.ContentDisplay; +import io.anuke.mindustry.world.consumers.Consume; import io.anuke.mindustry.world.consumers.ConsumeLiquid; import io.anuke.mindustry.world.consumers.ConsumePower; import io.anuke.mindustry.world.meta.BlockFlag; @@ -42,12 +43,6 @@ import java.util.Arrays; import static io.anuke.mindustry.Vars.*; public class Block extends BlockStorage{ - /** internal name */ - public final String name; - /** display name */ - public String formalName; - /** Detailed description of the block. Can be as long as necesary. */ - public final String fullDescription; /** whether this block has a tile entity that updates */ public boolean update; /** whether this block has health and can be destroyed */ @@ -121,9 +116,8 @@ public class Block extends BlockStorage{ protected TextureRegion region; public Block(String name){ - this.name = name; - this.formalName = Core.bundle.get("block." + name + ".name", name); - this.fullDescription = Core.bundle.getOrNull("block." + name + ".description"); + super(name); + this.description = Core.bundle.getOrNull("block." + name + ".description"); this.solid = false; } @@ -255,7 +249,7 @@ public class Block extends BlockStorage{ @Override public String localizedName(){ - return formalName; + return localizedName; } @Override @@ -273,11 +267,6 @@ public class Block extends BlockStorage{ return ContentType.block; } - @Override - public String getContentName() { - return name; - } - /** Called after all blocks are created. */ @Override public void init(){ @@ -378,7 +367,7 @@ public class Block extends BlockStorage{ } if(hasPower && consumes.has(ConsumePower.class)){ - bars.add("power", entity -> new Bar(consumes.get(ConsumePower.class).isBuffered ? "blocks.power" : "blocks.power.satisfaction", Pal.power, () -> entity.power.satisfaction)); + bars.add("power", entity -> new Bar(consumes.get(ConsumePower.class).isBuffered ? "blocks.power" : "blocks.power.satisfaction", Pal.powerBar, () -> entity.power.satisfaction)); } } @@ -478,7 +467,7 @@ public class Block extends BlockStorage{ } public String getDisplayName(Tile tile){ - return formalName; + return localizedName; } public TextureRegion getDisplayIcon(Tile tile){ @@ -494,17 +483,27 @@ public class Block extends BlockStorage{ displayBars(tile, bars); }).growX(); + table.row(); + table.table(ctable -> { + displayConsumption(tile, ctable); + }).growX(); table.marginBottom(-5); } } + public void displayConsumption(Tile tile, Table table){ + table.left(); + for(Consume cons : consumes.all()){ + cons.build(tile, table); + } + } + public void displayBars(Tile tile, Table table){ for(Function bar : bars.list()){ table.add(bar.get(tile.entity)).growX(); table.row(); } - } public TextureRegion icon(Icon icon){ @@ -553,6 +552,11 @@ public class Block extends BlockStorage{ return buildVisibility.get() && !isHidden(); } + @Override + public boolean isHidden(){ + return !buildVisibility.get(); + } + @Override public boolean alwaysUnlocked(){ return alwaysUnlocked; diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/io/anuke/mindustry/world/BlockStorage.java index a0308a9271..6232f22e4a 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/io/anuke/mindustry/world/BlockStorage.java @@ -1,19 +1,21 @@ package io.anuke.mindustry.world; import io.anuke.arc.collection.Array; -import io.anuke.mindustry.entities.Effects; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.Time; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; +import io.anuke.mindustry.entities.Effects; +import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.consumers.ConsumeItem; +import io.anuke.mindustry.world.consumers.ConsumeItems; import io.anuke.mindustry.world.consumers.ConsumeLiquid; import io.anuke.mindustry.world.consumers.Consumers; import io.anuke.mindustry.world.meta.BlockBars; @@ -39,6 +41,10 @@ public abstract class BlockStorage extends UnlockableContent{ public final Consumers consumes = new Consumers(); public final Producers produces = new Producers(); + public BlockStorage(String name){ + super(name); + } + public boolean shouldConsume(Tile tile){ return true; } @@ -62,6 +68,7 @@ public abstract class BlockStorage extends UnlockableContent{ /**Remove a stack from this inventory, and return the amount removed.*/ public int removeStack(Tile tile, Item item, int amount){ + amount = Math.min(amount, tile.entity.items.get(item)); tile.entity.noSleep(); tile.entity.items.remove(item, amount); return amount; @@ -91,6 +98,13 @@ public abstract class BlockStorage extends UnlockableContent{ } public boolean acceptItem(Item item, Tile tile, Tile source){ + if(tile.entity != null && consumes.has(ConsumeItems.class)){ + for(ItemStack stack : consumes.items()){ + if(stack.item == item){ + return tile.entity.items.get(item) < getMaximumAccepted(tile, item); + } + } + } return tile.entity != null && consumes.has(ConsumeItem.class) && consumes.item() == item && tile.entity.items.get(item) < getMaximumAccepted(tile, item); } diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index 1e8a5eac5b..cb7785e980 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -25,10 +25,15 @@ public class Build{ } Tile tile = world.tile(x, y); + float prevPercent = 1f; //just in case if(tile == null) return; + if(tile.entity != null){ + prevPercent = tile.entity.health(); + } + tile = tile.target(); Block previous = tile.block(); @@ -38,6 +43,7 @@ public class Build{ tile.setBlock(sub); tile.entity().setDeconstruct(previous); tile.setTeam(team); + tile.entity.health = tile.entity.maxHealth() * prevPercent; if(previous.isMultiblock()){ int offsetx = -(previous.size - 1) / 2; @@ -128,7 +134,7 @@ public class Build{ if(tile == null) return false; if(type.isMultiblock()){ - if(type.canReplace(tile.block()) && tile.block().size == type.size && type.canPlaceOn(tile)){ + if(type.canReplace(tile.block()) && tile.block().size == type.size && type.canPlaceOn(tile) && tile.interactable(team)){ return true; } @@ -154,7 +160,7 @@ public class Build{ } return true; }else{ - return (tile.getTeam() == Team.none || tile.getTeam() == team) + return tile.interactable(team) && contactsGround(tile.x, tile.y, type) && (!tile.floor().isLiquid || type.floating) && tile.floor().placeableOn @@ -190,6 +196,6 @@ public class Build{ Tile tile = world.tile(x, y); if(tile != null) tile = tile.target(); - return tile != null && tile.block().canBreak(tile) && tile.breakable() && (!tile.block().synthetic() || tile.getTeam() == team); + return tile != null && tile.block().canBreak(tile) && tile.breakable() && tile.interactable(team); } } diff --git a/core/src/io/anuke/mindustry/world/Pos.java b/core/src/io/anuke/mindustry/world/Pos.java index bdbf3a2f7c..9a2860ee2a 100644 --- a/core/src/io/anuke/mindustry/world/Pos.java +++ b/core/src/io/anuke/mindustry/world/Pos.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.world; /**Methods for a packed position 'struct', contained in an int.*/ public class Pos{ + public static final int invalid = get(-1, -1); /**Returns packed position from an x/y position. The values must be within short limits.*/ public static int get(int x, int y){ diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 6472edd13d..5bc7e46926 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -312,6 +312,10 @@ public class Tile implements Position, TargetTrait{ return null; } + public boolean interactable(Team team){ + return getTeam() == Team.none || team == getTeam(); + } + public void updateOcclusion(){ cost = 1; boolean occluded = false; @@ -327,15 +331,15 @@ public class Tile implements Position, TargetTrait{ } if(occluded){ - cost += 1; + cost += 2; } if(target().synthetic()){ - cost += Mathf.clamp(target().block().health / 10f, 0, 28); + cost += Mathf.clamp(target().block().health / 10f, 0, 20); } if(floor.isLiquid){ - cost += 80; + cost += 10; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/BlockPart.java b/core/src/io/anuke/mindustry/world/blocks/BlockPart.java index 2e06d62177..50ae9a08db 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BlockPart.java +++ b/core/src/io/anuke/mindustry/world/blocks/BlockPart.java @@ -18,6 +18,11 @@ public class BlockPart extends Block{ hasPower = hasItems = hasLiquids = true; } + @Override + public boolean isHidden(){ + return true; + } + @Override public void draw(Tile tile){ //do nothing diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 3296b08f4e..2eaba1415a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -39,7 +39,7 @@ public class BuildBlock extends Block{ super(name); update = true; size = Integer.parseInt(name.charAt(name.length() - 1) + ""); - health = 10; + health = 20; layer = Layer.placement; consumesTap = true; solidifes = true; @@ -70,10 +70,15 @@ public class BuildBlock extends Block{ Core.app.post(() -> Events.fire(new BlockBuildEndEvent(tile, team, false))); } + @Override + public boolean isHidden(){ + return true; + } + @Override public String getDisplayName(Tile tile){ BuildEntity entity = tile.entity(); - return Core.bundle.format("block.constructing", entity.block == null ? entity.previous.formalName : entity.block.formalName); + return Core.bundle.format("block.constructing", entity.block == null ? entity.previous.localizedName : entity.block.localizedName); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index 178a8ac83b..97c7dec8a9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -8,13 +8,13 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; public class OreBlock extends Floor{ - private static final ObjectMap> oreBlockMap = new ObjectMap<>(); + private static final ObjectMap> oreBlockMap = new ObjectMap<>(); public Floor base; public OreBlock(Item ore, Floor base){ super("ore-" + ore.name + "-" + base.name); - this.formalName = ore.localizedName() + " " + base.formalName; + this.localizedName = ore.localizedName() + " " + base.localizedName; this.itemDrop = ore; this.base = base; this.variants = 3; @@ -52,9 +52,8 @@ public class OreBlock extends Floor{ return other != base; } - public static Block get(Block floor, Item item){ - if(!oreBlockMap.containsKey(item)) throw new IllegalArgumentException("Item '" + item + "' is not an ore!"); - if(!oreBlockMap.get(item).containsKey(floor)) throw new IllegalArgumentException("Block '" + floor.name + "' does not support ores!"); + public static Floor get(Block floor, Item item){ + if(!oreBlockMap.containsKey(item) || !oreBlockMap.get(item).containsKey(floor)) return null; return oreBlockMap.get(item).get(floor); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java index 5b4c1a99a5..ef6d0d5c7c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java +++ b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java @@ -28,7 +28,7 @@ public interface SelectionTrait{ for(Item item : items){ if(!data.isUnlocked(item) && world.isZone()) continue; - ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> {}).group(group).get(); + ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> control.input(0).frag.config.hideConfig()).group(group).get(); button.changed(() -> consumer.accept(button.isChecked() ? item : null)); button.getStyle().imageUp = new TextureRegionDrawable(item.icon(Icon.medium)); button.update(() -> button.setChecked(holder.get() == item)); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 4d925f9856..ee321ac2ed 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.arc.collection.ObjectMap; import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.type.Item; @@ -11,10 +10,6 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.values.LiquidFilterValue; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; - import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.world; @@ -112,41 +107,4 @@ public abstract class LiquidTurret extends Turret{ && (tile.entity.liquids.current() == liquid || (ammo.containsKey(tile.entity.liquids.current()) && tile.entity.liquids.get(tile.entity.liquids.current()) <= ammo.get(tile.entity.liquids.current()).ammoMultiplier + 0.001f)); } - public class LiquidTurretEntity extends TurretEntity{ - @Override - public void write(DataOutput stream) throws IOException{ - stream.writeByte(ammo.size); - for(AmmoEntry entry : ammo){ - LiquidEntry i = (LiquidEntry)entry; - stream.writeByte(i.liquid.id); - stream.writeShort(i.amount); - } - } - - @Override - public void read(DataInput stream) throws IOException{ - byte amount = stream.readByte(); - for(int i = 0; i < amount; i++){ - Liquid liquid = Vars.content.liquid(stream.readByte()); - short a = stream.readShort(); - totalAmmo += a; - ammo.add(new LiquidEntry(liquid, a)); - } - } - } - - class LiquidEntry extends AmmoEntry{ - protected Liquid liquid; - - LiquidEntry(Liquid liquid, int amount){ - this.liquid = liquid; - this.amount = amount; - } - - @Override - public BulletType type(){ - return ammo.get(liquid); - } - } - } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 29fe2bab9a..4b6990d320 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -105,7 +105,7 @@ public abstract class Turret extends Block{ stats.add(BlockStat.shootRange, range, StatUnit.blocks); stats.add(BlockStat.inaccuracy, (int) inaccuracy, StatUnit.degrees); - stats.add(BlockStat.reload, 60f / reload, StatUnit.seconds); + stats.add(BlockStat.reload, 60f / reload, StatUnit.none); stats.add(BlockStat.shots, shots, StatUnit.none); stats.add(BlockStat.targetsAir, targetAir); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index 69b6d20d7d..ff8f0b0662 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -28,7 +28,6 @@ import static io.anuke.mindustry.Vars.*; public class Conveyor extends Block{ private static final float itemSpace = 0.135f * 3f; - private static final float offsetScl = 128f * 3f; private static final float minmove = 1f / (Short.MAX_VALUE - 2); private static ItemPos drawpos = new ItemPos(); private static ItemPos pos1 = new ItemPos(); @@ -156,7 +155,7 @@ public class Conveyor extends Block{ entity.noSleep(); - float speed = this.speed * tilesize / 2.3f; + float speed = this.speed * tilesize / 2.4f; float centerSpeed = 0.1f; float centerDstScl = 3f; float tx = Geometry.d4[tile.getRotation()].x, ty = Geometry.d4[tile.getRotation()].y; @@ -172,7 +171,7 @@ public class Conveyor extends Block{ } if(entity.convey.size * itemSpace < 0.9f){ - unit.velocity().add((tx * speed + centerx) * entity.delta(), (ty * speed + centery) * entity.delta()); + unit.applyImpulse((tx * speed + centerx) * entity.delta(), (ty * speed + centery) * entity.delta()); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 395251ecdf..b3b7ffc1d7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -7,12 +7,10 @@ import io.anuke.arc.collection.IntArray; import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet.IntSetIterator; import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.CapStyle; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Lines; -import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; +import io.anuke.arc.math.geom.Point2; import io.anuke.arc.util.Time; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.TileEntity; @@ -34,15 +32,14 @@ import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.world; public class ItemBridge extends Block{ - protected static int lastPlaced; - protected int timerTransport = timers++; protected int range; protected float transportTime = 2f; protected IntArray removals = new IntArray(); - protected TextureRegion endRegion, bridgeRegion, arrowRegion; + private static int lastPlaced = Pos.invalid; + public ItemBridge(String name){ super(name); update = true; @@ -85,29 +82,46 @@ public class ItemBridge extends Block{ @Override public void playerPlaced(Tile tile){ - Tile last = world.tile(lastPlaced); - if(linkValid(tile, last)){ - ItemBridgeEntity entity = last.entity(); - if(!linkValid(last, world.tile(entity.link))){ - Call.linkItemBridge(null, last, tile); + Tile link = findLink(tile.x, tile.y); + if(linkValid(tile, link)){ + Call.linkItemBridge(null, link, tile); + } + + lastPlaced = tile.pos(); + } + + public Tile findLink(int x, int y){ + if(linkValid(world.tile(x, y), world.tile(lastPlaced)) && lastPlaced != Pos.get(x, y)){ + return world.tile(lastPlaced); + } + + for(int j = 0; j < 4; j ++){ + Point2 p = Geometry.d4(j + 1); + for(int i = 1; i <= range; i++){ + Tile tile = world.tile(x + p.x * i, y + p.y * i); + + if(tile == null) break; + if(tile.block() == this && !(tile.x == x && tile.y == y) && tile.entity != null && tile.entity().link == Pos.invalid){ + return tile; + } } } - lastPlaced = tile.pos(); + return null; } @Override public void drawPlace(int x, int y, int rotation, boolean valid){ - Lines.stroke(2f); - Draw.color(Pal.placing); - for(int i = 0; i < 4; i++){ - Lines.dashLine( - x * tilesize + Geometry.d4[i].x * (tilesize / 2f + 2), - y * tilesize + Geometry.d4[i].y * (tilesize / 2f + 2), - x * tilesize + Geometry.d4[i].x * (range + 0.5f) * tilesize, - y * tilesize + Geometry.d4[i].y * (range + 0.5f) * tilesize, - range); - } + Tile link = findLink(x, y); + Draw.tint(Pal.placing); + Lines.stroke(1f); + if(link != null){ + int rot = link.absoluteRelativeTo(x, y); + float w = (link.x == x ? tilesize : Math.abs(link.x - x) * tilesize - tilesize); + float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize); + Lines.rect((x + link.x)/2f * tilesize - w/2f, (y + link.y)/2f * tilesize - h/2f, w, h); + Fill.poly(link.x * tilesize + Geometry.d4[rot].x * tilesize, link.y * tilesize + Geometry.d4[rot].y * tilesize, 3, 2.8f, link.absoluteRelativeTo(x, y)*90); + } Draw.reset(); } @@ -175,6 +189,7 @@ public class ItemBridge extends Block{ Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ + entity.link = Pos.invalid; tryDump(tile); entity.uptime = 0f; }else{ @@ -310,7 +325,7 @@ public class ItemBridge extends Block{ } public static class ItemBridgeEntity extends TileEntity{ - public int link = -1; + public int link = Pos.invalid; public IntSet incoming = new IntSet(); public float uptime; public float time; 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 3aa50c6d4d..84a6f32c6b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -74,7 +74,7 @@ public class Junction extends Block{ if(entity == null || relative == -1 || entity.buffers[relative].full()) return false; Tile to = tile.getNearby(relative); - return to != null && to.block().acceptItem(item, to, tile); + return to != null; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java index 6568242ddb..dba75d1e0c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.type.Liquid; public class BurnerGenerator extends ItemLiquidGenerator{ public BurnerGenerator(String name){ - super(true, true, name); + super(true, false, name); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java index 2313d1e429..38f20f53db 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java @@ -11,6 +11,7 @@ public class DifferentialGenerator extends TurbineGenerator{ public DifferentialGenerator(String name){ super(name); + hasLiquids = true; consumes.require(ConsumeItem.class); consumes.require(ConsumeLiquid.class); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java index c9f18e8aed..f98e8219d2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -6,20 +6,32 @@ import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; +import io.anuke.arc.util.Strings; import io.anuke.arc.util.Time; +import io.anuke.arc.util.Tmp; +import io.anuke.mindustry.content.Fx; +import io.anuke.mindustry.entities.Damage; +import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.graphics.Pal; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.consumers.ConsumePower; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import static io.anuke.mindustry.Vars.tilesize; + public class ImpactReactor extends PowerGenerator{ protected int timerUse = timers++; protected int plasmas = 4; protected float warmupSpeed = 0.001f; protected float useTime = 60f; + protected int explosionRadius = 30; + protected int explosionDamage = 180; protected Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b"); protected Color ind1 = Color.valueOf("858585"), ind2 = Color.valueOf("fea080"); @@ -34,6 +46,17 @@ public class ImpactReactor extends PowerGenerator{ outputsPower = consumesPower = true; } + @Override + public void setBars(){ + super.setBars(); + + bars.add("poweroutput", entity -> new Bar(() -> + Core.bundle.format("blocks.poweroutput", + Strings.toFixed(Math.max(entity.tile.block().getPowerProduction(entity.tile) - consumes.get(ConsumePower.class).powerPerTick, 0)*60, 1)), + () -> Pal.powerBar, + () -> ((GeneratorEntity)entity).productionEfficiency)); + } + @Override public void update(Tile tile){ FusionReactorEntity entity = tile.entity(); @@ -53,25 +76,6 @@ public class ImpactReactor extends PowerGenerator{ super.update(tile); } - @Override - public float handleDamage(Tile tile, float amount){ - FusionReactorEntity entity = tile.entity(); - - if(entity.warmup < 0.4f) return amount; - - float healthFract = tile.entity.health / health; - - //5% chance to explode when hit at <50% HP with a normal bullet - if(amount > 5f && healthFract <= 0.5f && Mathf.chance(0.05)){ - return health; - //10% chance to explode when hit at <25% HP with a powerful bullet - }else if(amount > 8f && healthFract <= 0.2f && Mathf.chance(0.1)){ - return health; - } - - return amount; - } - @Override public void draw(Tile tile){ FusionReactorEntity entity = tile.entity(); @@ -118,7 +122,28 @@ public class ImpactReactor extends PowerGenerator{ if(entity.warmup < 0.4f) return; - //TODO catastrophic failure + Effects.shake(6f, 16f, tile.worldx(), tile.worldy()); + Effects.effect(Fx.impactShockwave, tile.worldx(), tile.worldy()); + for(int i = 0; i < 6; i++){ + Time.run(Mathf.random(80), () -> Effects.effect(Fx.impactcloud, tile.worldx(), tile.worldy())); + } + + Damage.damage(tile.worldx(), tile.worldy(), explosionRadius * tilesize, explosionDamage * 4); + + + for(int i = 0; i < 20; i++){ + Time.run(Mathf.random(80), () -> { + Tmp.v1.rnd(Mathf.random(40f)); + Effects.effect(Fx.explosion, Tmp.v1.x + tile.worldx(), Tmp.v1.y + tile.worldy()); + }); + } + + for(int i = 0; i < 70; i++){ + Time.run(Mathf.random(90), () -> { + Tmp.v1.rnd(Mathf.random(120f)); + Effects.effect(Fx.impactsmoke, Tmp.v1.x + tile.worldx(), Tmp.v1.y + tile.worldy()); + }); + } } public static class FusionReactorEntity extends GeneratorEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index f6e548ff60..3300a6cf2e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.arc.Core; -import io.anuke.mindustry.entities.Effects; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; @@ -9,13 +8,13 @@ import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.content.Items; import io.anuke.mindustry.entities.Damage; +import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; import java.io.DataInput; import java.io.DataOutput; @@ -31,24 +30,21 @@ public class NuclearReactor extends PowerGenerator{ protected Color coolColor = new Color(1, 1, 1, 0f); protected Color hotColor = Color.valueOf("ff9575a3"); protected int fuelUseTime = 120; //time to consume 1 fuel - protected float heating = 0.013f; //heating per frame - protected float coolantPower = 0.015f; //how much heat decreases per coolant unit + protected float heating = 0.01f; //heating per frame * fullness protected float smokeThreshold = 0.3f; //threshold at which block starts smoking - protected float maxLiquidUse = 2f; //max liquid use per frame protected int explosionRadius = 19; protected int explosionDamage = 135; protected float flashThreshold = 0.46f; //heat threshold at which the lights start flashing + protected float coolantPower = 0.5f; protected TextureRegion topRegion, lightsRegion; public NuclearReactor(String name){ super(name); itemCapacity = 30; - liquidCapacity = 50; + liquidCapacity = 30; hasItems = true; hasLiquids = true; - - consumes.item(Items.thorium); } @Override @@ -60,11 +56,9 @@ public class NuclearReactor extends PowerGenerator{ } @Override - public void setStats(){ - super.setStats(); - - stats.remove(BlockStat.basePowerGeneration); - stats.add(BlockStat.basePowerGeneration, powerProduction * 60f, StatUnit.powerSecond); + public void setBars(){ + super.setBars(); + bars.add("heat", entity -> new Bar("blocks.heat", Pal.lightOrange, () -> ((NuclearReactorEntity)entity).heat)); } @Override @@ -79,24 +73,17 @@ public class NuclearReactor extends PowerGenerator{ entity.heat += fullness * heating * Math.min(entity.delta(), 4f); if(entity.timer.get(timerFuel, fuelUseTime)){ - entity.items.remove(consumes.item(), 1); + entity.cons.trigger(); } } - if(entity.liquids.total() > 0){ - Liquid liquid = entity.liquids.current(); + Liquid liquid = consumes.liquid(); + float liquidAmount = consumes.liquidAmount(); - if(liquid.temperature <= 0.5f){ //is coolant - float pow = coolantPower * (liquid.heatCapacity + 0.5f / liquid.temperature); //heat depleted per unit of liquid - float maxUsed = Math.min(Math.min(entity.liquids.get(liquid), entity.heat / pow), maxLiquidUse * entity.delta()); //max that can be cooled in terms of liquid - entity.heat -= maxUsed * pow; - entity.liquids.remove(liquid, maxUsed); - }else{ //is heater - float heat = coolantPower * liquid.heatCapacity / 4f; //heat created per unit of liquid - float maxUsed = Math.min(Math.min(entity.liquids.get(liquid), (1f - entity.heat) / heat), maxLiquidUse * entity.delta()); //max liquid used - entity.heat += maxUsed * heat; - entity.liquids.remove(liquid, maxUsed); - } + if(entity.heat > 0){ + float maxUsed = Math.min(Math.min(entity.liquids.get(liquid), entity.heat / coolantPower), liquidAmount * entity.delta()); + entity.heat -= maxUsed * coolantPower; + entity.liquids.remove(liquid, maxUsed); } if(entity.heat > smokeThreshold){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java index 5b5e675558..88d7608636 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -1,8 +1,13 @@ package io.anuke.mindustry.world.blocks.power; +import io.anuke.arc.Core; import io.anuke.arc.collection.EnumSet; +import io.anuke.arc.util.Strings; import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.graphics.Pal; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.consumers.ConsumePower; import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.StatUnit; @@ -28,6 +33,19 @@ public class PowerGenerator extends PowerDistributor{ stats.add(generationType, powerProduction * 60.0f, StatUnit.powerSecond); } + @Override + public void setBars(){ + super.setBars(); + + if(hasPower && outputsPower && !consumes.has(ConsumePower.class)){ + bars.add("power", entity -> new Bar(() -> + Core.bundle.format("blocks.poweroutput", + Strings.toFixed(entity.tile.block().getPowerProduction(entity.tile)*60 * entity.timeScale, 1)), + () -> Pal.powerBar, + () -> ((GeneratorEntity)entity).productionEfficiency)); + } + } + @Override public float getPowerProduction(Tile tile){ return powerProduction * tile.entity().productionEfficiency; 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 c1ad348d2e..e01eb0294c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -6,6 +6,8 @@ import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.collection.Queue; import io.anuke.arc.math.Mathf; +import io.anuke.arc.math.WindowedMean; +import io.anuke.arc.util.Time; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.Consume; import io.anuke.mindustry.world.consumers.ConsumePower; @@ -22,6 +24,8 @@ public class PowerGraph{ private final ObjectSet batteries = new ObjectSet<>(); private final ObjectSet all = new ObjectSet<>(); + private final WindowedMean powerBalance = new WindowedMean(60); + private long lastFrameUpdated = -1; private final int graphID; private static int lastGraphID; @@ -34,6 +38,10 @@ public class PowerGraph{ return graphID; } + public float getPowerBalance(){ + return powerBalance.getMean(); + } + public float getPowerProduced(){ float powerProduced = 0f; for(Tile producer : producers){ @@ -80,7 +88,7 @@ public class PowerGraph{ public float useBatteries(float needed){ float stored = getBatteryStored(); - if(Mathf.isEqual(stored, 0f)){ return 0f; } + if(Mathf.isEqual(stored, 0f)) return 0f; float used = Math.min(stored, needed); float consumedPowerPercentage = Math.min(1.0f, needed / stored); @@ -114,23 +122,19 @@ public class PowerGraph{ } public void distributePower(float needed, float produced){ - if(Mathf.isEqual(needed, 0f)){ return; } - + //distribute even if not needed. this is because some might be requiring power but not requesting it; it updates consumers float coverage = Math.min(1, produced / needed); for(Tile consumer : consumers){ Consumers consumes = consumer.block().consumes; if(consumes.has(ConsumePower.class)){ ConsumePower consumePower = consumes.get(ConsumePower.class); - if(!otherConsumersAreValid(consumer, consumePower)){ - consumer.entity.power.satisfaction = 0.0f; // Only supply power if the consumer would get valid that way + //currently satisfies power even if it's not required yet + if(consumePower.isBuffered){ + // Add an equal percentage of power to all buffers, based on the global power coverage in this graph + float maximumRate = consumePower.requestedPower(consumer.block(), consumer.entity()) * coverage * consumer.entity.delta(); + consumer.entity.power.satisfaction = Mathf.clamp(consumer.entity.power.satisfaction + maximumRate / consumePower.powerCapacity); }else{ - if(consumePower.isBuffered){ - // Add an equal percentage of power to all buffers, based on the global power coverage in this graph - float maximumRate = consumePower.requestedPower(consumer.block(), consumer.entity()) * coverage * consumer.entity.delta(); - consumer.entity.power.satisfaction = Mathf.clamp(consumer.entity.power.satisfaction + maximumRate / consumePower.powerCapacity); - }else{ - consumer.entity.power.satisfaction = coverage; - } + consumer.entity.power.satisfaction = coverage; } } } @@ -146,6 +150,8 @@ public class PowerGraph{ float powerNeeded = getPowerNeeded(); float powerProduced = getPowerProduced(); + powerBalance.addValue((powerProduced - powerNeeded) / Time.delta()); + if(!Mathf.isEqual(powerNeeded, powerProduced)){ if(powerNeeded > powerProduced){ powerProduced += useBatteries(powerNeeded - powerProduced); @@ -237,14 +243,12 @@ public class PowerGraph{ } } - //currently ignores all other consumers and consumes power anyway. private boolean otherConsumersAreValid(Tile tile, Consume consumePower){ - /* for(Consume cons : tile.block().consumes.all()){ if(cons != consumePower && !cons.isOptional() && !cons.valid(tile.block(), tile.entity())){ return false; } - }*/ + } return true; } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 3f7969efd8..338b433d9f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -3,17 +3,21 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.arc.Core; +import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; +import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.math.Angles; +import io.anuke.arc.util.Strings; import io.anuke.arc.util.Time; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Pal; +import io.anuke.mindustry.graphics.Shapes; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.mindustry.world.meta.BlockStat; @@ -23,9 +27,6 @@ import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.world; public class PowerNode extends PowerBlock{ - public static final float thicknessScl = 0.7f; - public static final float flashScl = 0.12f; - //last distribution block placed private static int lastPlaced = -1; @@ -89,6 +90,16 @@ public class PowerNode extends PowerBlock{ } } + @Override + public void setBars(){ + super.setBars(); + bars.add("power", entity -> new Bar(() -> + Core.bundle.format("blocks.powerbalance", + entity.power.graph == null ? "+0" : ((entity.power.graph.getPowerBalance() >= 0 ? "+" : "") + Strings.toFixed(entity.power.graph.getPowerBalance()*60, 1))), + () -> Pal.powerBar, + () -> entity.power.graph == null ? 0 : Mathf.clamp(entity.power.graph.getPowerProduced() / entity.power.graph.getPowerNeeded()))); + } + @Override public void playerPlaced(Tile tile){ Tile before = world.tile(lastPlaced); @@ -231,6 +242,7 @@ public class PowerNode extends PowerBlock{ } protected void drawLaser(Tile tile, Tile target){ + float x1 = tile.drawx(), y1 = tile.drawy(), x2 = target.drawx(), y2 = target.drawy(); @@ -245,9 +257,11 @@ public class PowerNode extends PowerBlock{ x2 += t2.x; y2 += t2.y; - Draw.color(Pal.powerLight, Pal.power, Mathf.absin(Time.time(), 8f, 1f)); - Lines.stroke(2f); - Lines.line(x1, y1, x2, y2); + Draw.color(Pal.powerLight, Color.WHITE, Mathf.absin(Time.time(), 8f, 0.3f) + 0.2f); + //Lines.stroke(2f); + //Lines.line(x1, y1, x2, y2); + + Shapes.laser("laser", "laser-end", x1, y1, x2, y2, 0.6f); } } 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 05f8daad7d..ed485d9492 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java @@ -15,6 +15,6 @@ public class TurbineGenerator extends BurnerGenerator{ @Override public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - return super.acceptLiquid(tile, source, liquid, amount) || liquid == consumes.liquid() && tile.entity.liquids.get(consumes.liquid()) < liquidCapacity; + return (liquid == consumes.liquid() && tile.entity.liquids.get(consumes.liquid()) < liquidCapacity); } } 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 857ab635a3..6a5ac51af7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -17,8 +17,8 @@ import java.io.DataOutput; import java.io.IOException; public class Cultivator extends GenericCrafter{ - protected static final Color plantColor = Color.valueOf("648b55"); - protected static final Color plantColorLight = Color.valueOf("73a75f"); + protected static final Color plantColor = Color.valueOf("5541b1"); + protected static final Color plantColorLight = Color.valueOf("7457ce"); protected static final Color bottomColor = Color.valueOf("474747"); protected TextureRegion middleRegion, topRegion; 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 bdd3279187..0d7d8c8e5a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.world.blocks.production; import io.anuke.arc.Core; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.ObjectIntMap; +import io.anuke.arc.util.Strings; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.arc.graphics.Blending; @@ -15,7 +16,9 @@ import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.graphics.Layer; +import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeLiquid; @@ -72,7 +75,18 @@ public class Drill extends Block{ liquidCapacity = 5f; hasItems = true; - consumes.add(new ConsumeLiquid(Liquids.water, 0.05f)).optional(true); + consumes.liquid(Liquids.water, 0.05f).optional(true); + } + + @Override + public void setBars(){ + super.setBars(); + + bars.add("drillspeed", e -> { + DrillEntity entity = (DrillEntity)e; + + return new Bar(() -> Core.bundle.format("blocks.outputspeed", Strings.toFixed(entity.lastDrillSpeed * 60 * entity.timeScale, 2)), () -> Pal.ammo, () -> entity.warmup); + }); } @Override @@ -146,13 +160,16 @@ public class Drill extends Block{ } }); - stats.add(BlockStat.drillSpeed, 60f / drillTime, StatUnit.itemsSecond); + stats.add(BlockStat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); } @Override public void update(Tile tile){ DrillEntity entity = tile.entity(); + if(Float.isNaN(entity.drillTime)) entity.drillTime = 0f; + if(Float.isNaN(entity.warmup)) entity.warmup = 0f; + if(entity.dominantItem == null){ oreCount.clear(); itemArray.clear(); @@ -197,6 +214,7 @@ public class Drill extends Block{ speed *= entity.power.satisfaction; // Drill slower when not at full power } + entity.lastDrillSpeed = (speed * entity.dominantItems * entity.warmup) / (drillTime + hardnessDrillMultiplier * Math.max(totalHardness, 1f) / entity.dominantItems); entity.warmup = Mathf.lerpDelta(entity.warmup, speed, warmupSpeed); entity.progress += entity.delta() * entity.dominantItems * speed * entity.warmup; @@ -204,6 +222,7 @@ public class Drill extends Block{ if(Mathf.chance(Time.delta() * updateEffectChance * entity.warmup)) Effects.effect(updateEffect, entity.x + Mathf.range(size * 2f), entity.y + Mathf.range(size * 2f)); }else{ + entity.lastDrillSpeed = 0f; entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, warmupSpeed); return; } @@ -257,6 +276,7 @@ public class Drill extends Block{ public int index; public float warmup; public float drillTime; + public float lastDrillSpeed; public int dominantItems; public Item dominantItem; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java index 75c168cc74..e788e380fb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -19,10 +19,8 @@ public class Pump extends LiquidBlock{ protected final int timerContentCheck = timers++; - /**Pump amount per tile this block is on.*/ + /**Pump amount, total.*/ protected float pumpAmount = 1f; - /**Maximum liquid tier this pump can use.*/ - protected int tier = 0; public Pump(String name){ super(name); @@ -95,7 +93,7 @@ public class Pump extends LiquidBlock{ } if(tile.entity.cons.valid() && liquidDrop != null){ - float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta()); + float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size); if(hasPower){ maxPump *= tile.entity.power.satisfaction; // Produce slower if not at full power } @@ -115,7 +113,7 @@ public class Pump extends LiquidBlock{ } protected boolean isValid(Tile tile){ - return tile != null && tile.floor().liquidDrop != null && tier >= tile.floor().liquidDrop.tier; + return tile != null && tile.floor().liquidDrop != null; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index 7af581fa66..226933c355 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -69,7 +69,7 @@ public class SolidPump extends Pump{ if(isMultiblock()){ for(Tile other : tile.getLinkedTiles(tempTiles)){ if(isValid(other)){ - fraction += 1f / size; + fraction += 1f / (size * size); } } }else{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 3a4d106d24..7bb4946473 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -4,17 +4,17 @@ import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.arc.Core; import io.anuke.arc.collection.EnumSet; -import io.anuke.mindustry.entities.Effects; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; +import io.anuke.mindustry.entities.Effects; +import io.anuke.mindustry.entities.traits.SpawnerTrait; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.entities.traits.SpawnerTrait; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Shaders; @@ -35,7 +35,7 @@ public class CoreBlock extends StorageBlock{ solid = true; update = true; hasItems = true; - flags = EnumSet.of(BlockFlag.target); + flags = EnumSet.of(BlockFlag.target, BlockFlag.producer); } @Remote(called = Loc.server) @@ -74,7 +74,7 @@ public class CoreBlock extends StorageBlock{ @Override public boolean canBreak(Tile tile){ - return state.teams.get(tile.getTeam()).cores.size > 1; + return false; } @Override @@ -105,9 +105,11 @@ public class CoreBlock extends StorageBlock{ Draw.rect(region, tile.drawx(), tile.drawy()); - Draw.alpha(entity.heat); - Draw.rect(topRegion, tile.drawx(), tile.drawy()); - Draw.color(); + if(Core.atlas.isFound(topRegion)){ + Draw.alpha(entity.heat); + Draw.rect(topRegion, tile.drawx(), tile.drawy()); + Draw.color(); + } if(entity.currentUnit != null){ Unit player = entity.currentUnit; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java rename to core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index 510fb22d66..ef37e6679f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -1,9 +1,11 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; +import io.anuke.arc.Core; +import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.gen.Call; @@ -11,8 +13,6 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.SelectionTrait; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.scene.ui.layout.Table; import java.io.DataInput; import java.io.DataOutput; @@ -20,13 +20,13 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.content; -public class SortedUnloader extends Block implements SelectionTrait{ +public class Unloader extends Block implements SelectionTrait{ protected float speed = 1f; protected final int timerUnload = timers++; private static Item lastItem; - public SortedUnloader(String name){ + public Unloader(String name){ super(name); update = true; solid = true; @@ -59,7 +59,7 @@ public class SortedUnloader extends Block implements SelectionTrait{ if(tile.entity.timer.get(timerUnload, speed) && tile.entity.items.total() == 0){ for(Tile other : tile.entity.proximity()){ - if(other.getTeam() == tile.getTeam() && other.block() instanceof StorageBlock && entity.items.total() == 0 && + if(other.interactable(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))){ offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, entity.sortItem)); } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index e0b959e1ff..92a8e9212c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -57,7 +57,7 @@ public class MechPad extends Block{ @Remote(targets = Loc.both, called = Loc.server) public static void onMechFactoryTap(Player player, Tile tile){ - if(player == null || !checkValidTap(tile, player) || !(tile.block() instanceof MechPad)) return; + if(player == null || !(tile.block() instanceof MechPad) || !checkValidTap(tile, player)) return; MechFactoryEntity entity = tile.entity(); MechPad pad = (MechPad)tile.block(); @@ -148,16 +148,15 @@ public class MechPad extends Block{ TextureRegion region = mech.iconRegion; if(entity.player.mech == mech){ - region = (entity.player.isMobile ? Mechs.starterMobile : Mechs.starterDesktop).iconRegion; + region = (entity.player.mech == Mechs.starterDesktop ? Mechs.starterMobile : Mechs.starterDesktop).iconRegion; } Shaders.build.region = region; Shaders.build.progress = entity.progress; - Shaders.build.time = -entity.time / 4f; + Shaders.build.time = -entity.time / 5f; Shaders.build.color.set(Pal.accent); - Draw.shader(Shaders.build, false); - Shaders.build.apply(); + Draw.shader(Shaders.build); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.shader(); @@ -223,7 +222,7 @@ public class MechPad extends Block{ player.rotation = 90f; player.baseRotation = 90f; - player.set(x, y); + player.setNet(x, y); player.beginRespawning(this); } } 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 a6cd265179..d831e44595 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -4,23 +4,24 @@ import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.arc.Core; import io.anuke.arc.collection.EnumSet; -import io.anuke.mindustry.entities.Effects; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; +import io.anuke.mindustry.entities.Effects; +import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.entities.type.BaseUnit; -import io.anuke.mindustry.type.UnitType; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.type.UnitType; +import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeItems; @@ -50,7 +51,7 @@ public class UnitFactory extends Block{ hasPower = true; hasItems = true; solid = false; - flags = EnumSet.of(BlockFlag.producer, BlockFlag.target); + flags = EnumSet.of(BlockFlag.producer); consumes.require(ConsumeItems.class); } @@ -84,6 +85,13 @@ public class UnitFactory extends Block{ topRegion = Core.atlas.find(name + "-top"); } + @Override + public void setBars(){ + super.setBars(); + bars.add("progress", entity -> new Bar("blocks.progress", Pal.ammo, () -> ((UnitFactoryEntity)entity).buildTime / produceTime)); + bars.add("spawned", entity -> new Bar(() -> Core.bundle.format("blocks.spawned", ((UnitFactoryEntity)entity).spawned, maxSpawn), () -> Pal.command, () -> (float)((UnitFactoryEntity)entity).spawned / maxSpawn)); + } + @Override public boolean outputsItems(){ return false; @@ -94,6 +102,7 @@ public class UnitFactory extends Block{ super.setStats(); stats.add(BlockStat.craftSpeed, produceTime / 60f, StatUnit.seconds); + stats.add(BlockStat.maxUnits, maxSpawn, StatUnit.none); } @Override @@ -120,8 +129,7 @@ public class UnitFactory extends Block{ Shaders.build.color.a = entity.speedScl; Shaders.build.time = -entity.time / 10f; - Draw.shader(Shaders.build, false); - Shaders.build.apply(); + Draw.shader(Shaders.build); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.shader(); @@ -143,8 +151,6 @@ public class UnitFactory extends Block{ public void update(Tile tile){ UnitFactoryEntity entity = tile.entity(); - entity.time += entity.delta() * entity.speedScl; - if(entity.spawned >= maxSpawn){ return; } @@ -155,9 +161,8 @@ public class UnitFactory extends Block{ if(!tile.isEnemyCheat()){ //player-made spawners have default behavior - if(hasRequirements(entity.items, entity.buildTime / produceTime) && entity.cons.valid()){ - + entity.time += entity.delta() * entity.speedScl; entity.buildTime += entity.delta() * entity.power.satisfaction; entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); }else{ @@ -166,6 +171,7 @@ public class UnitFactory extends Block{ //check if grace period had passed }else if(entity.warmup > produceTime*gracePeriodMultiplier){ float speedMultiplier = Math.min(0.1f + (entity.warmup - produceTime * gracePeriodMultiplier) / speedupTime, maxSpeedup); + entity.time += entity.delta() * entity.speedScl; //otherwise, it's an enemy, cheat by not requiring resources entity.buildTime += entity.delta() * speedMultiplier; entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/io/anuke/mindustry/world/consumers/Consume.java index 43c5b21866..1baea5fd3a 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consume.java @@ -1,14 +1,10 @@ package io.anuke.mindustry.world.consumers; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.meta.BlockStats; -import io.anuke.arc.scene.ui.Tooltip; import io.anuke.arc.scene.ui.layout.Table; - -import static io.anuke.mindustry.Vars.mobile; +import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.meta.BlockStats; /**An abstract class that defines a type of resource that a block can consume.*/ public abstract class Consume{ @@ -38,7 +34,8 @@ public abstract class Consume{ return update; } - public void build(Table table){ + public abstract void build(Tile tile, Table table);/*{ + Table t = new Table("flat"); t.margin(4); buildTooltip(t); @@ -50,15 +47,13 @@ public abstract class Consume{ out.addImage(getIcon()).size(10 * scale).color(Pal.accent); out.addImage("icon-missing").size(10 * scale).color(Pal.remove).padLeft(-10 * scale); }).size(10 * scale).get().addListener(new Tooltip<>(t)); - } + }*/ /**Called when a consumption is triggered manually.*/ public void trigger(Block block, TileEntity entity){ } - public abstract void buildTooltip(Table table); - public abstract String getIcon(); public abstract void update(Block block, TileEntity entity); diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java index 88e88e68c0..2afce34150 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java @@ -1,13 +1,15 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.type.Item.Icon; import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStats; -import io.anuke.arc.scene.ui.layout.Table; public class ConsumeItem extends Consume{ private final Item item; @@ -37,8 +39,8 @@ public class ConsumeItem extends Consume{ } @Override - public void buildTooltip(Table table){ - table.add(new ItemImage(new ItemStack(item, amount))).size(8 * 4); + public void build(Tile tile, Table table){ + table.add(new ReqImage(new ItemImage(item.icon(Icon.large), amount), () -> valid(tile.block(), tile.entity))).size(8*4); } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 5426510dd8..597a4a7b77 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -1,16 +1,21 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.Array; +import io.anuke.arc.function.Predicate; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item.Icon; +import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.ui.MultiReqImage; +import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStats; import io.anuke.mindustry.world.meta.values.ItemFilterValue; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.scene.ui.layout.Table; -import static io.anuke.mindustry.Vars.*; + +import static io.anuke.mindustry.Vars.content; public class ConsumeItemFilter extends Consume{ private final Predicate filter; @@ -20,20 +25,12 @@ public class ConsumeItemFilter extends Consume{ } @Override - public void buildTooltip(Table table){ - Array list = new Array<>(); + public void build(Tile tile, Table table){ + Array list = content.items().select(filter); + MultiReqImage image = new MultiReqImage(); + list.each(item -> image.add(new ReqImage(new ItemImage(item.icon(Icon.large), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item)))); - for(Item item : content.items()){ - if(filter.test(item)) list.add(item); - } - - for(int i = 0; i < list.size; i++){ - Item item = list.get(i); - table.addImage(item.icon(Icon.large)).size(8 * 4).padRight(2).padLeft(2); - if(i != list.size - 1){ - table.add("/"); - } - } + table.add(image).size(8*4); } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index 5c2fb5840c..517e29956d 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -1,13 +1,16 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.type.Item.Icon; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStats; import io.anuke.mindustry.world.meta.values.ItemListValue; -import io.anuke.arc.scene.ui.layout.Table; public class ConsumeItems extends Consume{ private ItemStack[] items; @@ -21,9 +24,9 @@ public class ConsumeItems extends Consume{ } @Override - public void buildTooltip(Table table){ + public void build(Tile tile, Table table){ for(ItemStack stack : items){ - table.add(new ItemImage(stack)).size(8 * 4).padRight(5); + table.add(new ReqImage(new ItemImage(stack.item.icon(Icon.large), stack.amount), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(stack.item, stack.amount))).size(8*4).padRight(5); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 5f605bdb7f..3ebeae1509 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -1,12 +1,14 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStats; import io.anuke.mindustry.world.meta.StatUnit; -import io.anuke.arc.scene.ui.layout.Table; public class ConsumeLiquid extends Consume{ protected final float use; @@ -26,8 +28,8 @@ public class ConsumeLiquid extends Consume{ } @Override - public void buildTooltip(Table table){ - table.addImage(liquid.getContentIcon()).size(8 * 3); + public void build(Tile tile, Table table){ + table.add(new ReqImage(liquid.getContentIcon(), () -> valid(tile.block(), tile.entity))).size(8*4); } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index c138143ceb..bb3accfefe 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -1,15 +1,18 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.Array; +import io.anuke.arc.function.Predicate; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.MultiReqImage; +import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStats; import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.mindustry.world.meta.values.LiquidFilterValue; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.scene.ui.layout.Table; import static io.anuke.mindustry.Vars.content; @@ -29,20 +32,12 @@ public class ConsumeLiquidFilter extends Consume{ } @Override - public void buildTooltip(Table table){ - Array list = new Array<>(); + public void build(Tile tile, Table table){ + Array list = content.liquids().select(l -> !l.isHidden() && filter.test(l)); + MultiReqImage image = new MultiReqImage(); + list.each(liquid -> image.add(new ReqImage(liquid.getContentIcon(), () -> tile.entity != null && tile.entity.liquids != null && tile.entity.liquids.get(liquid) >= use(tile.block(), tile.entity)))); - for(Liquid item : content.liquids()){ - if(!item.isHidden() && filter.test(item)) list.add(item); - } - - for(int i = 0; i < list.size; i++){ - Liquid item = list.get(i); - table.addImage(item.getContentIcon()).size(8 * 3).padRight(2).padLeft(2).padTop(2).padBottom(2); - if(i != list.size - 1){ - table.add("/"); - } - } + table.add(image).size(8*4); } @Override @@ -57,7 +52,7 @@ public class ConsumeLiquidFilter extends Consume{ @Override public boolean valid(Block block, TileEntity entity){ - return entity.liquids != null && filter.test(entity.liquids.current()) && entity.liquids.currentAmount() >= use(block, entity); + return entity != null && entity.liquids != null && filter.test(entity.liquids.current()) && entity.liquids.currentAmount() >= use(block, entity); } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index 9bc332daa1..a88b09a929 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -4,6 +4,7 @@ import io.anuke.arc.math.Mathf; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStats; import io.anuke.mindustry.world.meta.StatUnit; @@ -11,7 +12,7 @@ import io.anuke.mindustry.world.meta.StatUnit; /** Consumer class for blocks which consume power while being connected to a power graph. */ public class ConsumePower extends Consume{ /** The maximum amount of power which can be processed per tick. This might influence efficiency or load a buffer. */ - protected final float powerPerTick; + public final float powerPerTick; /** The maximum power capacity in power units. */ public final float powerCapacity; /** True if the module can store power. */ @@ -24,8 +25,8 @@ public class ConsumePower extends Consume{ } @Override - public void buildTooltip(Table table){ - // No tooltip for power + public void build(Tile tile, Table table){ + //No tooltip for power, for now } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/Consumers.java b/core/src/io/anuke/mindustry/world/consumers/Consumers.java index 23f6f456bf..0616e8ea80 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consumers.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consumers.java @@ -53,7 +53,7 @@ public class Consumers{ * @param powerCapacity The maximum capacity in power units. */ public ConsumePower powerBuffered(float powerCapacity){ - return powerBuffered(powerCapacity, 1f); + return powerBuffered(powerCapacity, 60f * 3); } /** @@ -99,6 +99,10 @@ public class Consumers{ return get(ConsumeLiquid.class).get(); } + public float liquidAmount(){ + return get(ConsumeLiquid.class).use; + } + public Consume add(Consume consume){ map.put((consume instanceof ConsumePower ? ConsumePower.class : consume.getClass()), consume); return consume; diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStat.java b/core/src/io/anuke/mindustry/world/meta/BlockStat.java index d34423625c..21fa588ea0 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStat.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStat.java @@ -39,6 +39,7 @@ public enum BlockStat{ outputItem(StatCategory.crafting), drillTier(StatCategory.crafting), drillSpeed(StatCategory.crafting), + maxUnits(StatCategory.crafting), shootRange(StatCategory.shooting), inaccuracy(StatCategory.shooting), 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 4aa7d9aef8..8bb1ecb6a0 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.arc.collection.Array; +import io.anuke.arc.function.Predicate; +import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.ui.ItemDisplay; import io.anuke.mindustry.world.meta.StatValue; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.scene.ui.layout.Table; import static io.anuke.mindustry.Vars.content; @@ -18,11 +18,7 @@ public class ItemFilterValue implements StatValue{ @Override public void display(Table table){ - Array list = new Array<>(); - - for(Item item : content.items()){ - if(filter.test(item)) list.add(item); - } + Array list = content.items().select(filter); for(int i = 0; i < list.size; i++){ Item item = list.get(i); diff --git a/core/src/io/anuke/mindustry/world/modules/PowerModule.java b/core/src/io/anuke/mindustry/world/modules/PowerModule.java index 7e601394a1..fead3d97c7 100644 --- a/core/src/io/anuke/mindustry/world/modules/PowerModule.java +++ b/core/src/io/anuke/mindustry/world/modules/PowerModule.java @@ -24,6 +24,7 @@ public class PowerModule extends BlockModule{ for(int i = 0; i < links.size; i++){ stream.writeInt(links.get(i)); } + stream.writeFloat(satisfaction); } @Override @@ -32,5 +33,6 @@ public class PowerModule extends BlockModule{ for(int i = 0; i < amount; i++){ links.add(stream.readInt()); } + satisfaction = stream.readFloat(); } } diff --git a/net/src/io/anuke/net/KryoServer.java b/net/src/io/anuke/net/KryoServer.java index 2a68deb1b6..47b495958a 100644 --- a/net/src/io/anuke/net/KryoServer.java +++ b/net/src/io/anuke/net/KryoServer.java @@ -249,7 +249,6 @@ public class KryoServer implements ServerProvider{ @Override public void dispose(){ close(); - Log.info("Disposed server."); } private void handleException(Throwable e){ diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 047ee35155..180430a1ee 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -14,14 +14,12 @@ import io.anuke.arc.util.CommandHandler.ResponseType; import io.anuke.arc.util.Timer.Task; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.game.Difficulty; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.GameOverEvent; -import io.anuke.mindustry.game.RulePreset; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.maps.MapException; import io.anuke.mindustry.net.Administration.PlayerInfo; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Packets.KickReason; @@ -29,6 +27,7 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemType; import java.io.IOException; +import java.net.BindException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Scanner; @@ -47,7 +46,7 @@ public class ServerControl implements ApplicationListener{ private FileHandle currentLogFile; private boolean inExtraRound; private Task lastTask; - + private RulePreset lastPreset; public ServerControl(String[] args){ Core.settings.defaults( @@ -213,7 +212,7 @@ public class ServerControl implements ApplicationListener{ try{ preset = RulePreset.valueOf(arg[1]); }catch(IllegalArgumentException e){ - err("No gamemode '{0}' found."); + err("No gamemode '{0}' found.", arg[1]); return; } } @@ -222,12 +221,16 @@ public class ServerControl implements ApplicationListener{ logic.reset(); state.rules = preset.get(); - world.loadMap(result); - logic.play(); + try{ + world.loadMap(result); + logic.play(); - info("Map loaded."); + info("Map loaded."); - host(); + host(); + }catch(MapException e){ + Log.err(e.map.getDisplayName() + ": " + e.getMessage()); + } }); handler.register("port", "[port]", "Sets or displays the port for hosting the server.", arg -> { @@ -642,7 +645,9 @@ public class ServerControl implements ApplicationListener{ players.add(p); p.setDead(true); } + Rules rules = state.rules; logic.reset(); + state.rules = rules; Call.onWorldDataBegin(); run.run(); logic.play(); @@ -657,7 +662,12 @@ public class ServerControl implements ApplicationListener{ lastTask = new Task(){ @Override public void run(){ - r.run(); + try{ + r.run(); + }catch(MapException e){ + Log.err(e.map.getDisplayName() + ": " + e.getMessage()); + Net.closeServer(); + } } }; @@ -671,6 +681,8 @@ public class ServerControl implements ApplicationListener{ try{ Net.host(Core.settings.getInt("port")); info("&lcOpened a server on port {0}.", Core.settings.getInt("port")); + }catch(BindException e){ + Log.err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network."); }catch(IOException e){ err(e); state.set(State.menu); diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 725b6246a4..f67122d9a7 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -1,6 +1,7 @@ import io.anuke.arc.ApplicationCore; import io.anuke.arc.backends.headless.HeadlessApplication; import io.anuke.arc.backends.headless.HeadlessApplicationConfiguration; +import io.anuke.arc.collection.Array; import io.anuke.arc.math.geom.Point2; import io.anuke.arc.util.Log; import io.anuke.arc.util.Time; @@ -16,12 +17,14 @@ import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.entities.type.base.Spirit; import io.anuke.mindustry.game.Content; +import io.anuke.mindustry.game.SpawnGroup; 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.ContentType; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.Zone; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; @@ -178,6 +181,7 @@ public class ApplicationTests{ @Test void save(){ world.loadMap(testMap); + assertTrue(state.teams.get(defaultTeam).cores.size > 0); SaveIO.saveToSlot(0); } @@ -192,6 +196,7 @@ public class ApplicationTests{ assertEquals(world.width(), map.meta.width); assertEquals(world.height(), map.meta.height); + assertTrue(state.teams.get(defaultTeam).cores.size > 0); } @Test @@ -235,6 +240,39 @@ public class ApplicationTests{ assertEquals(Blocks.part, world.tile(1, 1).block()); } + @Test + void zoneEmptyWaves(){ + for(Zone zone : content.zones()){ + Array spawns = zone.rules.get().spawns; + for(int i = 1; i <= 100; i++){ + int total = 0; + for(SpawnGroup spawn : spawns){ + total += spawn.getUnitsSpawned(i); + } + + assertNotEquals(0, total, "Zone " + zone + " has no spawned enemies at wave " + i); + } + } + } + + @Test + void zoneOverflowWaves(){ + for(Zone zone : content.zones()){ + Array spawns = zone.rules.get().spawns; + + for(int i = 1; i <= 40; i++){ + int total = 0; + for(SpawnGroup spawn : spawns){ + total += spawn.getUnitsSpawned(i); + } + + if(total >= 140){ + fail("Zone '" + zone + "' has too many spawned enemies at wave " + i + " : " + total); + } + } + } + } + @Test void buildingDestruction(){ initBuilding(); diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java index 5357bb515e..7a75b81d16 100644 --- a/tests/src/test/java/IOTests.java +++ b/tests/src/test/java/IOTests.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import java.nio.ByteBuffer; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class IOTests{ @@ -28,7 +29,7 @@ public class IOTests{ ByteBuffer buffer = ByteBuffer.allocate(500); TypeIO.writeString(buffer, null); buffer.position(0); - assertEquals(TypeIO.readString(buffer), null); + assertNull(TypeIO.readString(buffer)); } } diff --git a/tests/src/test/java/power/DirectConsumerTests.java b/tests/src/test/java/power/DirectConsumerTests.java index 5298c27fde..88233734ce 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -16,13 +16,13 @@ public class DirectConsumerTests extends PowerTestFixture{ @Test void noPowerRequestedWithNoItems(){ - testUnitFactory(0, 0, 0.08f, 0.08f, 1f); + testUnitFactory(0, 0, 0.08f, 0.08f, 0f); } @Test void noPowerRequestedWithInsufficientItems(){ - testUnitFactory(30, 0, 0.08f, 0.08f, 1f); - testUnitFactory(0, 30, 0.08f, 0.08f, 1f); + testUnitFactory(30, 0, 0.08f, 0.08f, 0f); + testUnitFactory(0, 30, 0.08f, 0.08f, 0f); } @Test diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index 87338158a1..153b9ead50 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -89,7 +89,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ assertTrue(generator.acceptLiquid(tile, null, liquid, availableLiquidAmount), inputType + " | " + parameterDescription + ": Liquids which will be declined by the generator don't need to be tested - The code won't be called for those cases."); entity.liquids.add(liquid, availableLiquidAmount); - entity.cons.update(tile.entity); + entity.cons.update(); assertTrue(entity.cons.valid()); // Perform an update on the generator once - This should use up any resource up to the maximum liquid usage @@ -116,7 +116,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ tests.add(dynamicTest("03", () -> simulateItemConsumption(inputType, Items.coal, 10, "Excess coal provided"))); tests.add(dynamicTest("04", () -> simulateItemConsumption(inputType, Items.blastCompound, 1, "Blast compound provided"))); //dynamicTest("03", () -> simulateItemConsumption(inputType, Items.plastanium, 1, "Plastanium provided")), // Not accepted by generator due to low flammability - tests.add(dynamicTest("05", () -> simulateItemConsumption(inputType, Items.biomatter, 1, "Biomatter provided"))); + tests.add(dynamicTest("05", () -> simulateItemConsumption(inputType, Items.sporePod, 1, "Biomatter provided"))); tests.add(dynamicTest("06", () -> simulateItemConsumption(inputType, Items.pyratite, 1, "Pyratite provided"))); } DynamicTest[] testArray = new DynamicTest[tests.size()]; @@ -134,7 +134,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ if(amount > 0){ entity.items.add(item, amount); } - entity.cons.update(tile.entity); + entity.cons.update(); assertTrue(entity.cons.valid()); // Perform an update on the generator once - This should use up one or zero items - dependent on if the item is accepted and available or not. @@ -161,7 +161,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ // Burn a single coal and test for the duration entity.items.add(Items.coal, 1); - entity.cons.update(tile.entity); + entity.cons.update(); generator.update(tile); float expectedEfficiency = entity.productionEfficiency; diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 66f3058554..e94a52ac55 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -85,7 +85,7 @@ public class PowerTestFixture{ // Simulate the "changed" method. Calling it through reflections would require half the game to be initialized. tile.entity = block.newEntity().init(tile, false); - tile.entity.cons = new ConsumeModule(); + tile.entity.cons = new ConsumeModule(tile.entity); if(block.hasItems) tile.entity.items = new ItemModule(); if(block.hasLiquids) tile.entity.liquids = new LiquidModule(); if(block.hasPower){ diff --git a/tools/build.gradle b/tools/build.gradle index e7b97903bb..3eace0a0c7 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -11,7 +11,7 @@ import java.awt.image.BufferedImage def outFolder = "../core/assets-raw/sprites_out/" def genFolder = "../core/assets-raw/sprites_out/generated/" -def doAntialias = true +def doAntialias = !project.hasProperty("disableAntialias") def antialias = {File file -> if(!doAntialias || file.lastModified() <= 1000) return @@ -24,7 +24,9 @@ def antialias = {File file -> } def color = new Color() + def color2 = new Color() def sum = new Color() + def suma = new Color() for (int x = 0; x < image.getWidth(); x++){ for(int y = 0; y < image.getHeight(); y++){ @@ -50,18 +52,30 @@ def antialias = {File file -> if ((F==H && F!=B && H!=D && E!=G) || (H==D && H!=F && D!=B && E!=I)) p8=H if (F==H && F!=B && H!=D) p9=F - int total = 0 + suma.set(0) [p1, p2, p3, p4, p5, p6, p7, p8, p9].each{ val -> Color.argb8888ToColor(color, val) + suma.r += color.r*color.a + suma.g += color.g*color.a + suma.b += color.b*color.a + suma.a += color.a + } - if(color.a > 0.1){ - sum.r += color.r - sum.g += color.g - sum.b += color.b - sum.a += color.a - total++ - } + suma.mul(suma.a <= 0.001f ? 0f : (float)(1f / suma.a)) + + float total = 0 + sum.set(0) + + [p1, p2, p3, p4, p5, p6, p7, p8, p9].each{ val -> + Color.argb8888ToColor(color, val) + float a = color.a + color.lerp(suma, (float)(1f - a)) + sum.r += color.r + sum.g += color.g + sum.b += color.b + sum.a += a + total += 1f } sum.mul((float)(1f / total)) @@ -73,7 +87,6 @@ def antialias = {File file -> ImageIO.write(out, "png", file) } - task swapColors(){ doLast{ if (project.hasProperty("colors")) { diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index bb41728471..e2a030ea3f 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -147,10 +147,10 @@ public class Generators { image.drawCenter(mech.region); } - int off = (image.width() - mech.weapon.region.getWidth())/2; + int off = image.width()/2 - mech.weapon.region.getWidth()/2; - image.draw(mech.weapon.region, -(int)mech.weaponOffsetX + off, (int)mech.weaponOffsetY + off, false, false); - image.draw(mech.weapon.region, (int)mech.weaponOffsetX + off, (int)mech.weaponOffsetY + off, true, false); + image.draw(mech.weapon.region, -(int)mech.weaponOffsetX + off, (int)mech.weaponOffsetY + off + 4, false, false); + image.draw(mech.weapon.region, (int)mech.weaponOffsetX + off, (int)mech.weaponOffsetY + off + 4, true, false); image.save("mech-icon-" + mech.name); diff --git a/tools/src/io/anuke/mindustry/Image.java b/tools/src/io/anuke/mindustry/Image.java index 36e1f6ccc1..d64214501c 100644 --- a/tools/src/io/anuke/mindustry/Image.java +++ b/tools/src/io/anuke/mindustry/Image.java @@ -101,21 +101,11 @@ class Image { int ofx = 0, ofy = 0; - if(x < 0){ - ofx = x; - x = 0; - } - - if(y < 0){ - ofy = y; - y = 0; - } - graphics.drawImage(ImagePacker.get(region).image, x, y, x + region.getWidth(), y + region.getHeight(), - (flipx ? region.getWidth() : 0) + ofx, + (flipx ? region.getWidth() : 0) + ofx, (flipy ? region.getHeight() : 0) + ofy, (flipx ? 0 : region.getWidth()) + ofx, (flipy ? 0 : region.getHeight()) + ofy,