From 6967d4e762845e1127a54ef686046d1b2f74d2f8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 7 Nov 2018 16:32:28 -0500 Subject: [PATCH 01/42] Branch created --- .../io/anuke/mindustry/ai/BlockIndexer.java | 6 ++--- core/src/io/anuke/mindustry/core/Control.java | 1 + .../io/anuke/mindustry/core/NetServer.java | 2 +- core/src/io/anuke/mindustry/core/World.java | 9 +++----- .../io/anuke/mindustry/entities/Player.java | 6 ++--- .../anuke/mindustry/entities/effect/Fire.java | 12 +++++----- .../mindustry/entities/effect/Puddle.java | 16 +++++++------- .../entities/traits/BuilderTrait.java | 12 ++++++---- .../mindustry/entities/units/BaseUnit.java | 2 +- .../mindustry/entities/units/types/Drone.java | 4 ++-- .../anuke/mindustry/graphics/FogRenderer.java | 14 +++++++----- .../anuke/mindustry/io/SaveFileVersion.java | 8 +++---- core/src/io/anuke/mindustry/io/SaveIO.java | 2 +- core/src/io/anuke/mindustry/io/TypeIO.java | 12 +++++----- .../anuke/mindustry/io/versions/Save16.java | 2 +- core/src/io/anuke/mindustry/maps/Sector.java | 2 +- core/src/io/anuke/mindustry/maps/Sectors.java | 2 +- .../maps/generation/WorldGenerator.java | 7 +++--- .../src/io/anuke/mindustry/net/NetworkIO.java | 12 +++++----- core/src/io/anuke/mindustry/world/Block.java | 4 ++-- core/src/io/anuke/mindustry/world/Pos.java | 20 +++++++++++++++++ core/src/io/anuke/mindustry/world/Tile.java | 9 +++----- .../anuke/mindustry/world/blocks/Floor.java | 6 ++--- .../mindustry/world/blocks/OreBlock.java | 4 ++-- .../io/anuke/mindustry/world/blocks/Rock.java | 4 ++-- .../world/blocks/defense/MendProjector.java | 4 ++-- .../blocks/defense/OverdriveProjector.java | 4 ++-- .../world/blocks/distribution/ItemBridge.java | 21 +++++++++--------- .../distribution/LiquidExtendingBridge.java | 5 ++--- .../world/blocks/distribution/MassDriver.java | 4 ++-- .../world/blocks/power/PowerGraph.java | 8 +++---- .../world/blocks/power/PowerNode.java | 22 +++++++++---------- .../world/blocks/production/Cultivator.java | 2 +- .../world/blocks/storage/StorageGraph.java | 4 ++-- .../world/blocks/units/Reconstructor.java | 8 +++---- 35 files changed, 141 insertions(+), 119 deletions(-) create mode 100644 core/src/io/anuke/mindustry/world/Pos.java diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index c8b87d4750..c533186978 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -52,8 +52,8 @@ public class BlockIndexer{ public BlockIndexer(){ Events.on(TileChangeEvent.class, event -> { - if(typeMap.get(event.tile.packedPosition()) != null){ - TileIndex index = typeMap.get(event.tile.packedPosition()); + if(typeMap.get(event.tile.pos()) != null){ + TileIndex index = typeMap.get(event.tile.pos()); for(BlockFlag flag : index.flags){ getFlagged(index.team)[flag.ordinal()].remove(event.tile); } @@ -230,7 +230,7 @@ public class BlockIndexer{ map[flag.ordinal()] = arr; } - typeMap.put(tile.packedPosition(), new TileIndex(tile.block().flags, tile.getTeam())); + typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.getTeam())); } if(ores == null) return; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index e55d559ec1..44833a7406 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -23,6 +23,7 @@ import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.mindustry.world.Pos; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.EntityQuery; import io.anuke.ucore.modules.Module; diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 6fefd332ba..2a9103f14d 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -476,7 +476,7 @@ public class NetServer extends Module{ //write all core inventory data for(Tile tile : cores){ - dataStream.writeInt(tile.packedPosition()); + dataStream.writeInt(tile.pos()); tile.entity.items.write(dataStream); } diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 50469edacf..67b5f8b94f 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -14,6 +14,7 @@ import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.maps.generation.WorldGenerator; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.OreBlock; import io.anuke.ucore.core.Events; @@ -101,12 +102,8 @@ public class World extends Module{ return tiles == null ? 0 : tiles[0].length; } - public int toPacked(int x, int y){ - return x + y * width(); - } - - public Tile tile(int packed){ - return tiles == null ? null : tile(packed % width(), packed / width()); + public Tile tile(int pos){ + return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos)); } public Tile tile(int x, int y){ diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index cf98629d50..d4abe7e77d 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -792,13 +792,13 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra }else{ CoreEntity entity = (CoreEntity) getClosestCore(); if(entity != null && !netServer.isWaitingForPlayers()){ - this.spawner = entity.tile.id(); + this.spawner = entity.tile.pos(); } } } public void beginRespawning(SpawnerTrait spawner){ - this.spawner = spawner.getTile().packedPosition(); + this.spawner = spawner.getTile().pos(); this.dead = true; } @@ -853,7 +853,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra buffer.writeByte(Bits.toByte(isAdmin) | (Bits.toByte(dead) << 1) | (Bits.toByte(isBoosting) << 2)); buffer.writeInt(Color.rgba8888(color)); buffer.writeByte(mech.id); - buffer.writeInt(mining == null ? -1 : mining.packedPosition()); + buffer.writeInt(mining == null ? -1 : mining.pos()); buffer.writeInt(spawner); buffer.writeShort((short) (baseRotation * 2)); diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index e6581a41ed..bf6e58c698 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -48,7 +48,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ public static void create(Tile tile){ if(Net.client() || tile == null) return; //not clientside. - Fire fire = map.get(tile.packedPosition()); + Fire fire = map.get(tile.pos()); if(fire == null){ fire = Pooling.obtain(Fire.class, Fire::new); @@ -56,7 +56,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ fire.lifetime = baseLifetime; fire.set(tile.worldx(), tile.worldy()); fire.add(); - map.put(tile.packedPosition(), fire); + map.put(tile.pos(), fire); }else{ fire.lifetime = baseLifetime; fire.time = 0f; @@ -75,8 +75,8 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ * Attempts to extinguish a fire by shortening its life. If there is no fire here, does nothing. */ public static void extinguish(Tile tile, float intensity){ - if(tile != null && map.containsKey(tile.packedPosition())){ - map.get(tile.packedPosition()).time += intensity * Timers.delta(); + if(tile != null && map.containsKey(tile.pos())){ + map.get(tile.pos()).time += intensity * Timers.delta(); } } @@ -157,7 +157,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ @Override public void writeSave(DataOutput stream) throws IOException{ - stream.writeInt(tile.packedPosition()); + stream.writeInt(tile.pos()); stream.writeFloat(lifetime); stream.writeFloat(time); } @@ -202,7 +202,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ @Override public void removed(){ if(tile != null){ - map.remove(tile.packedPosition()); + map.remove(tile.pos()); } reset(); } diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index f521f1568c..ce9dfc4926 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -73,7 +73,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai /**Returns the puddle on the specified tile. May return null.*/ public static Puddle getPuddle(Tile tile){ - return map.get(tile.packedPosition()); + return map.get(tile.pos()); } private static void deposit(Tile tile, Tile source, Liquid liquid, float amount, int generation){ @@ -83,7 +83,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai reactPuddle(tile.floor().liquidDrop, liquid, amount, tile, (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); - Puddle p = map.get(tile.packedPosition()); + Puddle p = map.get(tile.pos()); if(generation == 0 && p != null && p.lastRipple <= Timers.time() - 40f){ Effects.effect(BlockFx.ripple, tile.floor().liquidDrop.color, @@ -93,7 +93,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai return; } - Puddle p = map.get(tile.packedPosition()); + Puddle p = map.get(tile.pos()); if(p == null){ if(Net.client()) return; //not clientside. @@ -104,7 +104,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai puddle.generation = (byte) generation; puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); puddle.add(); - map.put(tile.packedPosition(), puddle); + map.put(tile.pos(), puddle); }else if(p.liquid == liquid){ p.accepting = Math.max(amount, p.accepting); @@ -249,7 +249,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai @Override public void writeSave(DataOutput stream) throws IOException{ - stream.writeInt(tile.packedPosition()); + stream.writeInt(tile.pos()); stream.writeFloat(x); stream.writeFloat(y); stream.writeByte(liquid.id); @@ -288,7 +288,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai @Override public void removed(){ - map.remove(tile.packedPosition()); + map.remove(tile.pos()); reset(); } @@ -298,7 +298,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai data.writeFloat(y); data.writeByte(liquid.id); data.writeShort((short) (amount * 4)); - data.writeInt(tile.packedPosition()); + data.writeInt(tile.pos()); } @Override @@ -309,7 +309,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai targetAmount = data.readShort() / 4f; tile = world.tile(data.readInt()); - map.put(tile.packedPosition(), this); + map.put(tile.pos(), this); } @Override diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index a086bea466..82b551103d 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.Build; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; @@ -26,7 +27,10 @@ import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Shapes; -import io.anuke.ucore.util.*; +import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Geometry; +import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Translator; import java.io.DataInput; import java.io.DataOutput; @@ -68,7 +72,7 @@ public interface BuilderTrait extends Entity{ if(request != null){ output.writeByte(request.breaking ? 1 : 0); - output.writeInt(world.toPacked(request.x, request.y)); + output.writeInt(Pos.get(request.x, request.y)); output.writeFloat(request.progress); if(!request.breaking){ output.writeByte(request.recipe.id); @@ -94,11 +98,11 @@ public interface BuilderTrait extends Entity{ BuildRequest request; if(type == 1){ //remove - request = new BuildRequest(position % world.width(), position / world.width()); + request = new BuildRequest(Pos.x(position), Pos.y(position)); }else{ //place byte recipe = input.readByte(); byte rotation = input.readByte(); - request = new BuildRequest(position % world.width(), position / world.width(), rotation, content.recipe(recipe)); + request = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.recipe(recipe)); } request.progress = progress; diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index b49db5d02c..0c0ed161b6 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -119,7 +119,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } public void setSpawner(Tile tile){ - this.spawner = tile.packedPosition(); + this.spawner = tile.pos(); } public void setIntSpawner(int pos){ diff --git a/core/src/io/anuke/mindustry/entities/units/types/Drone.java b/core/src/io/anuke/mindustry/entities/units/types/Drone.java index ed5cc2c6fd..319879254a 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java @@ -386,8 +386,8 @@ public class Drone extends FlyingUnit implements BuilderTrait{ @Override public void write(DataOutput data) throws IOException{ super.write(data); - data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.packedPosition()); - data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.packedPosition() : -1); + data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.pos()); + data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.pos() : -1); writeBuilding(data); } diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java index 98857f1db0..7c920c78b0 100644 --- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FogRenderer.java @@ -77,9 +77,11 @@ public class FogRenderer implements Disposable{ pixelBuffer.position(0); for(int i = 0; i < world.width() * world.height(); i++){ + int x = i % world.width(); + int y = i / world.width(); byte r = pixelBuffer.get(); if(r != 0){ - world.tile(i).setVisibility((byte)1); + world.tile(x, y).setVisibility((byte)1); } pixelBuffer.position(pixelBuffer.position() + 3); } @@ -128,10 +130,12 @@ public class FogRenderer implements Disposable{ changeQueue.clear(); if(dirty){ - for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); - if(tile.discovered()){ - Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize); + for(int x = 0; x < world.width(); x++){ + for(int y = 0; y < world.height(); y++){ + Tile tile = world.tile(x, y); + if(tile.discovered()){ + Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize); + } } } dirty = false; diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index b4b60634a9..0b4b40f5d2 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -50,7 +50,7 @@ public abstract class SaveFileVersion{ stream.writeShort(world.height()); for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width()); stream.writeByte(tile.getFloorID()); stream.writeByte(tile.getBlockID()); @@ -73,7 +73,7 @@ public abstract class SaveFileVersion{ int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width()); if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getElevation() != tile.getElevation()){ break; @@ -89,13 +89,13 @@ public abstract class SaveFileVersion{ //write visibility, length-run encoded for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width()); boolean discovered = tile.discovered(); int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width()); if(nextTile.discovered() != discovered){ break; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index af0e9287b2..c6706a43a7 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -14,7 +14,7 @@ import java.util.zip.InflaterInputStream; import static io.anuke.mindustry.Vars.*; public class SaveIO{ - public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56); + public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58); public static final IntMap versions = new IntMap<>(); public static final Array versionArray = Array.with( new Save16() diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 7a0f2d3069..d804710840 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -18,6 +18,7 @@ import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.net.Packets.KickReason; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; @@ -140,13 +141,12 @@ public class TypeIO{ @WriteClass(Tile.class) public static void writeTile(ByteBuffer buffer, Tile tile){ - buffer.putInt(tile == null ? -1 : tile.packedPosition()); + buffer.putInt(tile == null ? Pos.get(-1, -1) : tile.pos()); } @ReadClass(Tile.class) public static Tile readTile(ByteBuffer buffer){ - int position = buffer.getInt(); - return position == -1 ? null : world.tile(position); + return world.tile(buffer.getInt()); } @WriteClass(Block.class) @@ -164,7 +164,7 @@ public class TypeIO{ buffer.putShort((short)requests.length); for(BuildRequest request : requests){ buffer.put(request.breaking ? (byte) 1 : 0); - buffer.putInt(world.toPacked(request.x, request.y)); + buffer.putInt(Pos.get(request.x, request.y)); if(!request.breaking){ buffer.put(request.recipe.id); buffer.put((byte) request.rotation); @@ -182,11 +182,11 @@ public class TypeIO{ BuildRequest currentRequest; if(type == 1){ //remove - currentRequest = new BuildRequest(position % world.width(), position / world.width()); + currentRequest = new BuildRequest(Pos.x(position), Pos.y(position)); }else{ //place byte recipe = buffer.get(); byte rotation = buffer.get(); - currentRequest = new BuildRequest(position % world.width(), position / world.width(), rotation, content.recipe(recipe)); + currentRequest = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.recipe(recipe)); } reqs[i] = (currentRequest); diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 3431873465..0f637638a7 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -59,7 +59,7 @@ public class Save16 extends SaveFileVersion{ stream.writeLong(TimeUtils.millis()); //last saved stream.writeLong(headless ? 0 : control.saves.getTotalPlaytime()); //playtime stream.writeInt(Version.build); //build - stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().packedPosition()); //sector ID + stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().pos()); //sector ID //--GENERAL STATE-- stream.writeByte(state.mode.ordinal()); //gamemode diff --git a/core/src/io/anuke/mindustry/maps/Sector.java b/core/src/io/anuke/mindustry/maps/Sector.java index bba6876781..e184409ae1 100644 --- a/core/src/io/anuke/mindustry/maps/Sector.java +++ b/core/src/io/anuke/mindustry/maps/Sector.java @@ -67,7 +67,7 @@ public class Sector{ return !headless && control.saves.getByID(saveID) != null; } - public int packedPosition(){ + public int pos(){ return Bits.packInt(x, y); } } diff --git a/core/src/io/anuke/mindustry/maps/Sectors.java b/core/src/io/anuke/mindustry/maps/Sectors.java index 140be792ed..1854b14bf7 100644 --- a/core/src/io/anuke/mindustry/maps/Sectors.java +++ b/core/src/io/anuke/mindustry/maps/Sectors.java @@ -53,7 +53,7 @@ public class Sectors{ world.loadSector(sector); logic.play(); if(!headless){ - sector.saveID = control.saves.addSave("sector-" + sector.packedPosition()).index; + sector.saveID = control.saves.addSave("sector-" + sector.pos()).index; } world.sectors.save(); world.setSector(sector); diff --git a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java index 1424903a14..f83c03b84c 100644 --- a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java @@ -17,6 +17,7 @@ import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.maps.missions.Mission; import io.anuke.mindustry.type.Item; 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; @@ -86,7 +87,7 @@ public class WorldGenerator{ Tile tile = tiles[x][y]; if(tile.block().isMultiblock()){ - multiblocks.add(tile.packedPosition()); + multiblocks.add(tile.pos()); } } } @@ -95,8 +96,8 @@ public class WorldGenerator{ for(int i = 0; i < multiblocks.size; i++){ int pos = multiblocks.get(i); - int x = pos % tiles.length; - int y = pos / tiles.length; + int x = Pos.x(pos); + int y = Pos.y(pos); Block result = tiles[x][y].block(); Team team = tiles[x][y].getTeam(); diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 5f23abf5b3..a35c491b99 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -32,7 +32,7 @@ public class NetworkIO{ //--GENERAL STATE-- stream.writeByte(state.mode.ordinal()); //gamemode stream.writeUTF(world.getMap().name); //map name - stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().packedPosition()); //sector ID + stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().pos()); //sector ID stream.writeInt(world.getSector() == null ? 0 : world.getSector().completedMissions); //write tags @@ -56,7 +56,7 @@ public class NetworkIO{ stream.writeShort(world.height()); for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width()); stream.writeByte(tile.getFloorID()); stream.writeByte(tile.getBlockID()); @@ -79,7 +79,7 @@ public class NetworkIO{ int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width()); if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getElevation() != tile.getElevation()){ break; @@ -95,13 +95,13 @@ public class NetworkIO{ //write visibility, length-run encoded for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width());; boolean discovered = tile.discovered(); int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width());; if(nextTile.discovered() != discovered){ break; @@ -129,7 +129,7 @@ public class NetworkIO{ stream.writeByte(data.cores.size); for(Tile tile : data.cores){ - stream.writeInt(tile.packedPosition()); + stream.writeInt(tile.pos()); } } diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 90e513763b..979b48f3d6 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -164,7 +164,7 @@ public class Block extends BaseBlock { for(int i = 0; i < tile.entity.power.links.size; i++){ Tile other = world.tile(tile.entity.power.links.get(i)); if(other != null && other.entity != null && other.entity.power != null){ - other.entity.power.links.removeValue(tile.packedPosition()); + other.entity.power.links.removeValue(tile.pos()); } } } @@ -173,7 +173,7 @@ public class Block extends BaseBlock { out.clear(); for(Tile other : tile.entity.proximity()){ if(other.entity.power != null && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) - && !tile.entity.power.links.contains(other.packedPosition())){ + && !tile.entity.power.links.contains(other.pos())){ out.add(other); } } diff --git a/core/src/io/anuke/mindustry/world/Pos.java b/core/src/io/anuke/mindustry/world/Pos.java new file mode 100644 index 0000000000..bdbf3a2f7c --- /dev/null +++ b/core/src/io/anuke/mindustry/world/Pos.java @@ -0,0 +1,20 @@ +package io.anuke.mindustry.world; + +/**Methods for a packed position 'struct', contained in an int.*/ +public class Pos{ + + /**Returns packed position from an x/y position. The values must be within short limits.*/ + public static int get(int x, int y){ + return (((short)x) << 16) | (((short)y) & 0xFFFF); + } + + /**Returns the x component of a position.*/ + public static short x(int pos){ + return (short) (pos >>> 16); + } + + /**Returns the y component of a position.*/ + public static short y(int pos){ + return (short) (pos & 0xFFFF); + } +} diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index f3fad923ef..6089fe0218 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -72,8 +72,9 @@ public class Tile implements PosTrait, TargetTrait{ return visibility > 0; } - public int packedPosition(){ - return x + y * world.width(); + /**Returns this tile's position as a {@link Pos}.*/ + public int pos(){ + return Pos.get(x, y); } public byte getBlockID(){ @@ -105,10 +106,6 @@ public class Tile implements PosTrait, TargetTrait{ return (T) entity; } - public int id(){ - return x + y * world.width(); - } - public float worldx(){ return x * tilesize; } diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index fd4d581f2d..be9c7ca8ec 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -130,16 +130,16 @@ public class Floor extends Block{ @Override public void drawNonLayer(Tile tile){ - MathUtils.random.setSeed(tile.id()); + MathUtils.random.setSeed(tile.pos()); drawEdges(tile, true); } @Override public void draw(Tile tile){ - MathUtils.random.setSeed(tile.id()); + MathUtils.random.setSeed(tile.pos()); - Draw.rect(variantRegions[Mathf.randomSeed(tile.id(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); + Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); if(tile.hasCliffs() && cliffRegions != null){ for(int i = 0; i < 4; i++){ diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index 7333c7dcd2..5e3f8f1323 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -34,14 +34,14 @@ public class OreBlock extends Floor{ @Override public void draw(Tile tile){ - Draw.rect(variantRegions[Mathf.randomSeed(tile.id(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); + Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); drawEdges(tile, false); } @Override public void drawNonLayer(Tile tile){ - MathUtils.random.setSeed(tile.id()); + MathUtils.random.setSeed(tile.pos()); base.drawEdges(tile, true); } diff --git a/core/src/io/anuke/mindustry/world/blocks/Rock.java b/core/src/io/anuke/mindustry/world/blocks/Rock.java index f5771124fe..aecca1b444 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Rock.java +++ b/core/src/io/anuke/mindustry/world/blocks/Rock.java @@ -19,7 +19,7 @@ public class Rock extends Block{ @Override public void draw(Tile tile){ if(variants > 0){ - Draw.rect(regions[Mathf.randomSeed(tile.id(), 0, Math.max(0, regions.length - 1))], tile.worldx(), tile.worldy()); + Draw.rect(regions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, regions.length - 1))], tile.worldx(), tile.worldy()); }else{ Draw.rect(region, tile.worldx(), tile.worldy()); } @@ -28,7 +28,7 @@ public class Rock extends Block{ @Override public void drawShadow(Tile tile){ if(shadowRegions != null){ - Draw.rect(shadowRegions[(Mathf.randomSeed(tile.id(), 0, variants - 1))], tile.worldx(), tile.worldy()); + Draw.rect(shadowRegions[(Mathf.randomSeed(tile.pos(), 0, variants - 1))], tile.worldx(), tile.worldy()); }else if(shadowRegion != null){ Draw.rect(shadowRegion, tile.drawx(), tile.drawy()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 1119cf311f..85ec47d34f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -83,10 +83,10 @@ public class MendProjector extends Block{ if(other == null) continue; other = other.target(); - if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ + if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat*phaseBoost)/100f); Effects.effect(BlockFx.healBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); - healed.add(other.packedPosition()); + healed.add(other.pos()); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index cb340d1e40..0ccb602e83 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -84,11 +84,11 @@ public class OverdriveProjector extends Block{ if(other == null) continue; other = other.target(); - if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null){ + if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null){ other.entity.timeScaleDuration = Math.max(other.entity.timeScaleDuration, reload + 1f); other.entity.timeScale = Math.max(other.entity.timeScale, realBoost); Effects.effect(BlockFx.overdriveBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); - healed.add(other.packedPosition()); + healed.add(other.pos()); } } } 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 b53f39d1f3..5d15e6ae9c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.core.Timers; @@ -58,8 +59,8 @@ public class ItemBridge extends Block{ public static void linkItemBridge(Player player, Tile tile, Tile other){ ItemBridgeEntity entity = tile.entity(); ItemBridgeEntity oe = other.entity(); - entity.link = other.packedPosition(); - oe.incoming.add(tile.packedPosition()); + entity.link = other.pos(); + oe.incoming.add(tile.pos()); } @Remote(targets = Loc.both, called = Loc.server, forward = true) @@ -68,7 +69,7 @@ public class ItemBridge extends Block{ entity.link = -1; if(other != null){ ItemBridgeEntity oe = other.entity(); - oe.incoming.remove(tile.packedPosition()); + oe.incoming.remove(tile.pos()); } } @@ -90,7 +91,7 @@ public class ItemBridge extends Block{ Call.linkItemBridge(null, last, tile); } } - lastPlaced = tile.packedPosition(); + lastPlaced = tile.pos(); } @Override @@ -122,7 +123,7 @@ public class ItemBridge extends Block{ for(int j = 0; j < 4; j++){ Tile other = tile.getNearby(Geometry.d4[j].x * i, Geometry.d4[j].y * i); if(linkValid(tile, other)){ - boolean linked = other.packedPosition() == entity.link; + boolean linked = other.pos() == entity.link; Draw.color(linked ? Palette.place : Palette.breakInvalid); Lines.square(other.drawx(), other.drawy(), @@ -139,7 +140,7 @@ public class ItemBridge extends Block{ ItemBridgeEntity entity = tile.entity(); if(linkValid(tile, other)){ - if(entity.link == other.packedPosition()){ + if(entity.link == other.pos()){ Call.unlinkItemBridge(null, tile, other); }else{ Call.linkItemBridge(null, tile, other); @@ -254,7 +255,7 @@ public class ItemBridge extends Block{ if(rel == rel2) return false; }else{ - return source.block() instanceof ItemBridge && source.entity().link == tile.packedPosition() && tile.entity.items.total() < itemCapacity; + return source.block() instanceof ItemBridge && source.entity().link == tile.pos() && tile.entity.items.total() < itemCapacity; } return tile.entity.items.total() < itemCapacity; @@ -273,9 +274,7 @@ public class ItemBridge extends Block{ while(it.hasNext){ int v = it.next(); - int x = v % world.width(); - int y = v / world.width(); - if(tile.absoluteRelativeTo(x, y) == i){ + if(tile.absoluteRelativeTo(Pos.x(v), Pos.y(v)) == i){ return false; } } @@ -315,7 +314,7 @@ public class ItemBridge extends Block{ return false; } - return other.block() == this && (!checkDouble || other.entity().link != tile.packedPosition()); + return other.block() == this && (!checkDouble || other.entity().link != tile.pos()); } public static class ItemBridgeEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java index 3a2ca9b15e..7f28ea8ec5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.utils.IntSet.IntSetIterator; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.core.Timers; @@ -65,9 +66,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ while(it.hasNext){ int v = it.next(); - int x = v % world.width(); - int y = v / world.width(); - if(tile.absoluteRelativeTo(x, y) == i){ + if(tile.absoluteRelativeTo(Pos.x(v), Pos.y(v)) == i){ return false; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index 8e33ea1e4d..2c901785c1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -225,11 +225,11 @@ public class MassDriver extends Block{ MassDriverEntity entity = tile.entity(); - if(entity.link == other.packedPosition()){ + if(entity.link == other.pos()){ Call.linkMassDriver(null, tile, -1); return false; }else if(other.block() instanceof MassDriver && other.distanceTo(tile) <= range){ - Call.linkMassDriver(null, tile, other.packedPosition()); + Call.linkMassDriver(null, tile, other.pos()); return false; } 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 f9d4a8aba2..7dfdfa57d2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -134,9 +134,9 @@ public class PowerGraph{ child.entity.power.graph = this; add(child); for(Tile next : child.block().getPowerConnections(child, outArray2)){ - if(next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.packedPosition())){ + if(next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.pos())){ queue.addLast(next); - closedSet.add(next.packedPosition()); + closedSet.add(next.pos()); } } } @@ -156,9 +156,9 @@ public class PowerGraph{ child.entity.power.graph = graph; graph.add(child); for(Tile next : child.block().getPowerConnections(child, outArray2)){ - if(next != tile && next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.packedPosition())){ + if(next != tile && next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.pos())){ queue.addLast(next); - closedSet.add(next.packedPosition()); + closedSet.add(next.pos()); } } } 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 21d50003f1..f999d198b1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -51,14 +51,14 @@ public class PowerNode extends PowerBlock{ TileEntity entity = tile.entity(); - if(!entity.power.links.contains(other.packedPosition())){ - entity.power.links.add(other.packedPosition()); + if(!entity.power.links.contains(other.pos())){ + entity.power.links.add(other.pos()); } if(other.getTeamID() == tile.getTeamID()){ - if(!other.entity.power.links.contains(tile.packedPosition())){ - other.entity.power.links.add(tile.packedPosition()); + if(!other.entity.power.links.contains(tile.pos())){ + other.entity.power.links.add(tile.pos()); } } @@ -75,8 +75,8 @@ public class PowerNode extends PowerBlock{ PowerGraph tg = entity.power.graph; tg.clear(); - entity.power.links.removeValue(other.packedPosition()); - other.entity.power.links.removeValue(tile.packedPosition()); + entity.power.links.removeValue(other.pos()); + other.entity.power.links.removeValue(tile.pos()); //reflow from this point, covering all tiles on this side tg.reflow(tile); @@ -99,14 +99,14 @@ public class PowerNode extends PowerBlock{ if(linkValid(tile, before) && before.block() instanceof PowerNode){ for(Tile near : before.entity.proximity()){ if(near.target() == tile){ - lastPlaced = tile.packedPosition(); + lastPlaced = tile.pos(); return; } } Call.linkPowerNodes(null, tile, before); } - lastPlaced = tile.packedPosition(); + lastPlaced = tile.pos(); } @Override @@ -202,7 +202,7 @@ public class PowerNode extends PowerBlock{ for(int i = 0; i < entity.power.links.size; i++){ Tile link = world.tile(entity.power.links.get(i)); if(linkValid(tile, link) && (!(link.block() instanceof PowerNode) - || ((tile.block().size > link.block().size) || (tile.block().size == link.block().size && tile.id() < link.id())))){ + || ((tile.block().size > link.block().size) || (tile.block().size == link.block().size && tile.pos() < link.pos())))){ drawLaser(tile, link); } } @@ -211,7 +211,7 @@ public class PowerNode extends PowerBlock{ } protected boolean linked(Tile tile, Tile other){ - return tile.entity.power.links.contains(other.packedPosition()); + return tile.entity.power.links.contains(other.pos()); } protected boolean linkValid(Tile tile, Tile link){ @@ -227,7 +227,7 @@ public class PowerNode extends PowerBlock{ return Vector2.dst(tile.drawx(), tile.drawy(), link.drawx(), link.drawy()) <= Math.max(laserRange * tilesize, ((PowerNode) link.block()).laserRange * tilesize) + (link.block().size - 1) * tilesize / 2f + (tile.block().size - 1) * tilesize / 2f && - (!checkMaxNodes || (oe.power.links.size < ((PowerNode) link.block()).maxNodes || oe.power.links.contains(tile.packedPosition()))); + (!checkMaxNodes || (oe.power.links.size < ((PowerNode) link.block()).maxNodes || oe.power.links.contains(tile.pos()))); }else{ return Vector2.dst(tile.drawx(), tile.drawy(), link.drawx(), link.drawy()) <= laserRange * tilesize + (link.block().size - 1) * tilesize; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index e2854906dd..df161e79c3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -74,7 +74,7 @@ public class Cultivator extends Drill{ Draw.color(bottomColor, plantColorLight, entity.warmup); - random.setSeed(tile.packedPosition()); + random.setSeed(tile.pos()); for(int i = 0; i < 12; i++){ float offset = random.nextFloat() * 999999f; float x = random.range(4f), y = random.range(4f); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java index d139f84693..fd8edb912b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java @@ -101,9 +101,9 @@ public class StorageGraph{ add(child); for(Tile next : child.entity.proximity()){ - if(next != base && next.block() instanceof StorageBlock && next.entity().graph == null && !closedSet.contains(next.packedPosition())){ + if(next != base && next.block() instanceof StorageBlock && next.entity().graph == null && !closedSet.contains(next.pos())){ queue.addLast(next); - closedSet.add(next.packedPosition()); + closedSet.add(next.pos()); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java b/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java index 066f8584f2..128c962086 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java @@ -62,7 +62,7 @@ public class Reconstructor extends Block{ if(other != null && other.block() instanceof Reconstructor){ ReconstructorEntity oe = other.entity(); - if(oe.link == entity.tile.packedPosition()){ + if(oe.link == entity.tile.pos()){ oe.link = -1; } } @@ -103,8 +103,8 @@ public class Reconstructor extends Block{ unlink(entity); unlink(oe); - entity.link = other.packedPosition(); - oe.link = tile.packedPosition(); + entity.link = other.pos(); + oe.link = tile.pos(); }); } @@ -161,7 +161,7 @@ public class Reconstructor extends Block{ ReconstructorEntity entity = tile.entity(); - if(entity.link == other.packedPosition()){ + if(entity.link == other.pos()){ Call.unlinkReconstructor(null, tile, other); return false; }else if(other.block() instanceof Reconstructor){ From 832aac0e6e4903c040c6265b2413121c086fe9c5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 7 Nov 2018 16:41:33 -0500 Subject: [PATCH 02/42] Fixed potential spawner issues --- core/src/io/anuke/mindustry/core/Renderer.java | 2 +- .../io/anuke/mindustry/entities/Player.java | 8 ++++---- core/src/io/anuke/mindustry/entities/Unit.java | 2 ++ .../mindustry/entities/units/BaseUnit.java | 18 +++++------------- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index b9e9ea9567..7931a10827 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -145,7 +145,7 @@ public class Renderer extends RendererModule{ if(players[0].isDead()){ TileEntity core = players[0].getClosestCore(); - if(core != null && players[0].spawner == -1){ + if(core != null && players[0].spawner == Unit.noSpawner){ smoothCamera(core.x, core.y, 0.08f); }else{ smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index d4abe7e77d..38d4724446 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -60,7 +60,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra public boolean achievedFlight; public Color color = new Color(); public Mech mech; - public int spawner = -1; + public int spawner = noSpawner; public NetConnection con; public int playerIndex = 0; @@ -497,7 +497,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra updateRespawning(); return; }else{ - spawner = -1; + spawner = noSpawner; } avoidOthers(1f); @@ -787,7 +787,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra public void updateRespawning(){ - if(spawner != -1 && world.tile(spawner) != null && world.tile(spawner).entity instanceof SpawnerTrait){ + if(spawner != noSpawner && world.tile(spawner) != null && world.tile(spawner).entity instanceof SpawnerTrait){ ((SpawnerTrait) world.tile(spawner).entity).updateSpawning(this); }else{ CoreEntity entity = (CoreEntity) getClosestCore(); @@ -803,7 +803,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra } public void endRespawning(){ - spawner = -1; + spawner = noSpawner; } //endregion diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index 62e1d20232..9508693e30 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -12,6 +12,7 @@ import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.Weapon; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.core.Effects; @@ -39,6 +40,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public static final float velocityPercision = 8f; /**Maximum absolute value of a velocity vector component.*/ public static final float maxAbsVelocity = 127f / velocityPercision; + public static final int noSpawner = Pos.get(-1, 1); private static final Rectangle queryRect = new Rectangle(); private static final Vector2 moveVector = new Vector2(); diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index 0c0ed161b6..74472c764a 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -55,7 +55,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ protected boolean isWave; protected Squad squad; - protected int spawner = -1; + protected int spawner = noSpawner; /**internal constructor used for deserialization, DO NOT USE*/ public BaseUnit(){ @@ -114,18 +114,10 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return type; } - public Tile getSpawner(){ - return world.tile(spawner); - } - public void setSpawner(Tile tile){ this.spawner = tile.pos(); } - public void setIntSpawner(int pos){ - this.spawner = pos; - } - /**Sets this to a 'wave' unit, which means it has slightly different AI and will not run out of ammo.*/ public void setWave(){ isWave = true; @@ -146,7 +138,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } public void updateRespawning(){ - if(spawner == -1) return; + if(spawner == noSpawner) return; Tile tile = world.tile(spawner); if(tile != null && tile.entity != null){ @@ -154,7 +146,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ ((SpawnerTrait) tile.entity).updateSpawning(this); } }else{ - spawner = -1; + spawner = noSpawner; } } @@ -308,7 +300,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ avoidOthers(1.25f); - if(spawner != -1 && (world.tile(spawner) == null || world.tile(spawner).entity == null)){ + if(spawner != noSpawner && (world.tile(spawner) == null || world.tile(spawner).entity == null)){ damage(health); } @@ -341,7 +333,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ @Override public void removed(){ - spawner = -1; + spawner = noSpawner; } @Override From 22aeddc655468ccf1f7fc2c90c5073603a9e9e20 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 28 Nov 2018 20:30:34 -0500 Subject: [PATCH 03/42] Fixed screenshot key firing when chat open --- core/src/io/anuke/mindustry/core/Control.java | 2 +- core/src/io/anuke/mindustry/game/Unlocks.java | 21 ------------------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 84991cacce..465015f230 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -372,7 +372,7 @@ public class Control extends Module{ } } - if(Inputs.keyTap("screenshot")){ + if(Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){ renderer.takeMapScreenshot(); } diff --git a/core/src/io/anuke/mindustry/game/Unlocks.java b/core/src/io/anuke/mindustry/game/Unlocks.java index ff2853f59b..7b624263b9 100644 --- a/core/src/io/anuke/mindustry/game/Unlocks.java +++ b/core/src/io/anuke/mindustry/game/Unlocks.java @@ -1,8 +1,6 @@ package io.anuke.mindustry.game; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.ObjectSet; import io.anuke.mindustry.game.EventType.UnlockEvent; import io.anuke.mindustry.type.ContentType; @@ -67,27 +65,8 @@ public class Unlocks{ save(); } - /**Loads 'legacy' unlocks. Will be removed in final release.*/ - public void tryLoadLegacy(){ - try{ - ObjectMap>> sets = Settings.getObject("content-sets", ObjectMap.class, ObjectMap::new); - for(Entry> entry : sets.get("root").entries()){ - unlocked.put(entry.key, new ObjectSet<>()); - unlocked.get(entry.key).addAll(entry.value); - } - }catch(Throwable t){ - t.printStackTrace(); - } - Settings.prefs().remove("content-sets"); - Settings.save(); - } - public void load(){ unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new); - - if(Settings.has("content-sets")){ - tryLoadLegacy(); - } } public void save(){ From 23750bab5544d3e9440394a2c28ad72297da3332 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 28 Nov 2018 22:05:34 -0500 Subject: [PATCH 04/42] Layout fixes --- android/AndroidManifest.xml | 2 +- .../mindustry/ui/fragments/PlayerListFragment.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 8fdb041fc7..b0e4475812 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -20,7 +20,7 @@ diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index 333659134d..03864af7ca 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -104,19 +104,19 @@ public class PlayerListFragment extends Fragment{ if((Net.server() || players[0].isAdmin) && !player.isLocal && (!player.isAdmin || Net.server())){ button.add().growY(); - float bs = (h + 14) / 2f; + float bs = (h) / 2f; button.table(t -> { t.defaults().size(bs); - t.addImageButton("icon-ban", 14 * 2, + t.addImageButton("icon-ban", "clear-partial", 14 * 2, () -> ui.showConfirm("$text.confirm", "$text.confirmban", () -> Call.onAdminRequest(player, AdminAction.ban))); - t.addImageButton("icon-cancel", 16 * 2, + t.addImageButton("icon-cancel", "clear-partial", 16 * 2, () -> ui.showConfirm("$text.confirm", "$text.confirmkick", () -> Call.onAdminRequest(player, AdminAction.kick))); t.row(); - t.addImageButton("icon-admin", "toggle", 14 * 2, () -> { + t.addImageButton("icon-admin", "clear-toggle", 14 * 2, () -> { if(Net.client()) return; String id = player.uuid; @@ -132,9 +132,9 @@ public class PlayerListFragment extends Fragment{ .touchable(() -> Net.client() ? Touchable.disabled : Touchable.enabled) .checked(player.isAdmin); - t.addImageButton("icon-zoom-small", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); + t.addImageButton("icon-zoom-small", "clear-partial", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); - }).padRight(12).padTop(-5).padLeft(0).padBottom(-10).size(bs + 10f, bs); + }).padRight(12).size(bs + 10f, bs); } content.add(button).padBottom(-6).width(350f).maxHeight(h + 14); From e40e5e6a99d49cb15fd38e589492d9c0c74635a0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 09:22:39 -0500 Subject: [PATCH 05/42] UI fix --- core/assets-raw/sprites/ui/button-left-down.9.png | Bin 266 -> 0 bytes core/assets-raw/sprites/ui/button-left-over.9.png | Bin 281 -> 0 bytes core/assets-raw/sprites/ui/button-left.9.png | Bin 277 -> 0 bytes .../anuke/mindustry/ui/fragments/HudFragment.java | 8 ++++++-- 4 files changed, 6 insertions(+), 2 deletions(-) delete mode 100644 core/assets-raw/sprites/ui/button-left-down.9.png delete mode 100644 core/assets-raw/sprites/ui/button-left-over.9.png delete mode 100644 core/assets-raw/sprites/ui/button-left.9.png diff --git a/core/assets-raw/sprites/ui/button-left-down.9.png b/core/assets-raw/sprites/ui/button-left-down.9.png deleted file mode 100644 index a8d4d637d24ade94d51217aef938297f706c510c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmeAS@N?(olHy`uVBq!ia0y~yU{GUVV36ftV_;x7)*yF)fq{W7$=lt9;Xep2*t>i( z0|NtRfk$L90|U1(2s1Lwnj^u$z`$PO>Fdh=h+9TbT;ZnQ5|9DYJzX3_A`ZWuevtQo z0*C9u!a3`joOgK4UE=&g{armn7C*n-P>$ zp?@*@y{+DYkSyV1*^hrWCw*S9=7_k|(fhoq!Bd()MuvZLjFdQWP|J+>RCV~HF8&L< zikc!TkEMT&UCgzn?bB~I?c-S*U*(mjM(pNbWcYF8)Van^#YOj;!`JGm-_<<-t7yh6 Q1_lNOPgg&ebxsLQ042g^R{#J2 diff --git a/core/assets-raw/sprites/ui/button-left-over.9.png b/core/assets-raw/sprites/ui/button-left-over.9.png deleted file mode 100644 index e6727f11bd8bd350c231c76be0e65c6636d9050b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0y~yU{GUVV36ftV_;x7)*yF)fq{W7$=lt9;Xep2*t>i( z0|NtRfk$L90|U1(2s1Lwnj^u$z`$PO>Fdh=h+9TbTukhX;d}-LhGm{Ejv*0;lfQiZ znyMh0b8pX2d(Bt1wY8F-Tbo-WT4&$t5$MY_R=O%T$>vdbY2U=o#0gD~uMNZ&EzUPN z(iRmWBwB05>lw1~uh-!{7gsFF3b|zZ%dJ>-?V_U3&(8iYyjEM%x9{SLB^p`_bC>>S z;XZIN#?s}Lms`_XUn}?586iQ7S-qpS^tn9^c+n#uy4HlLhlhuU=fD2-;JufmdKI;Vst03%arrT_o{ diff --git a/core/assets-raw/sprites/ui/button-left.9.png b/core/assets-raw/sprites/ui/button-left.9.png deleted file mode 100644 index a3e813eefba51c0da2e3674abee532e0b0df23fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmeAS@N?(olHy`uVBq!ia0y~yU{GUVV36ftV_;x7)*yF)fq{W7$=lt9;Xep2*t>i( z0|NtRfk$L90|U1(2s1Lwnj^u$z`$PO>Fdh=h+9TbOygXiY$*c+!y-=?$B>A_Z?9W( z9Z=w5xUj53R{Z@$xfR}pA05ux?)u{JGU!E!&xd9wBkoSS9zlV^i)?}$(`=QR%-SdG z*#!US@^qZ-zI9^m{)AYz-bC)=Bs=SkH#Jmi9w=Y&IQRXaTjbPD>htfON}J+xq&`1B z-)^zaqMCHobEXHne6MQE-Zyo^Y%}kOr8RDm)lH!rqnhVFGFD2=6mdKI;Vst02}0FT>t<8 diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 6e09a4c468..bc94461864 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -24,9 +24,13 @@ import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.event.Touchable; -import io.anuke.ucore.scene.ui.*; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.ImageButton; +import io.anuke.ucore.scene.ui.Label; +import io.anuke.ucore.scene.ui.TextButton; import io.anuke.ucore.scene.ui.layout.Stack; import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; @@ -347,7 +351,7 @@ public class HudFragment extends Fragment{ if(shown){ shown = false; blockfrag.toggle(dur, in); - wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + dsize + 6) - wavetable.getTranslation().y, dur, in)); + wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + 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; From f474d2c834c655cb4c694585891735fcbfc71299 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 09:32:36 -0500 Subject: [PATCH 06/42] Fixed ghost connections --- core/src/io/anuke/mindustry/core/NetServer.java | 10 +++++++++- kryonet/src/io/anuke/kryonet/KryoServer.java | 1 - 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 052e31bc8f..d23b9cd376 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -79,7 +79,9 @@ public class NetServer extends Module{ public NetServer(){ Events.on(WorldLoadEvent.class, event -> { - connections.clear(); + if(!headless){ + connections.clear(); + } }); Net.handleServer(Connect.class, (id, connect) -> { @@ -596,6 +598,12 @@ public class NetServer extends Module{ } void sync(){ + for(Player player : playerGroup.all()){ + if(player.con == null || connections.get(player.con.id) == null){ + onDisconnect(player); + } + } + try{ //iterate through each player diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 45269e42fb..334abab5ab 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -71,7 +71,6 @@ public class KryoServer implements ServerProvider { @Override public void disconnected (Connection connection) { KryoConnection k = getByKryoID(connection.getID()); - Log.info("&bLost kryonet connection {0}", connection.getID()); if(k == null) return; Disconnect c = new Disconnect(); From 0eec5383ed6b3ecd8496551c81fe9049281cf3ef Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 12:07:43 -0500 Subject: [PATCH 07/42] UI fixes / Better ghost connection fix --- core/src/io/anuke/mindustry/core/NetServer.java | 13 +++++-------- .../io/anuke/mindustry/ui/dialogs/JoinDialog.java | 6 +++--- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index d23b9cd376..463eab9692 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -598,20 +598,17 @@ public class NetServer extends Module{ } void sync(){ - for(Player player : playerGroup.all()){ - if(player.con == null || connections.get(player.con.id) == null){ - onDisconnect(player); - } - } try{ //iterate through each player - for(Player player : connections.values()){ + for(Player player : playerGroup.all()){ + if(player.isLocal) continue; + NetConnection connection = player.con; - if(!connection.isConnected()){ - //player disconnected, ignore them + if(!connection.isConnected() || !connections.containsKey(connection.id)){ + //player disconnected, call d/c event onDisconnect(player); return; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index cc3de460cb..53044715b2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -96,11 +96,11 @@ public class JoinDialog extends FloatingDialog{ //why are java lambdas this bad TextButton[] buttons = {null}; - TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), () -> { + TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), "clear", () -> { if(!buttons[0].childrenPressed()){ connect(server.ip, server.port); } - }).width(targetWidth()).height(150f).pad(4f).get(); + }).width(targetWidth()).height(155f).pad(4f).get(); button.getLabel().setWrap(true); @@ -159,7 +159,7 @@ public class JoinDialog extends FloatingDialog{ Bundles.format("text.server.version", host.version); }else if(host.version > Version.build && Version.build != -1){ versionString = Bundles.get("text.server.outdated.client") + "\n" + - Bundles.format("text.server.version", host.version); + Bundles.format("text.server.version", host.version, ""); }else{ versionString = Bundles.format("text.server.version", host.version, host.versionType); } From 7fd05b7ca67929b54e1e26e0a3e93f67c706d206 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 13:04:34 -0500 Subject: [PATCH 08/42] Added mobile copy/paste --- build.gradle | 2 +- .../assets-raw/sprites/ui/icons/icon-copy.png | Bin 0 -> 195 bytes .../sprites/ui/icons/icon-paste.png | Bin 0 -> 200 bytes core/assets/sprites/sprites.atlas | 1842 ++++++++--------- core/assets/sprites/sprites.png | Bin 103192 -> 105101 bytes core/assets/ui/uiskin.json | 1 - .../src/io/anuke/mindustry/core/Platform.java | 13 + 7 files changed, 930 insertions(+), 928 deletions(-) create mode 100644 core/assets-raw/sprites/ui/icons/icon-copy.png create mode 100644 core/assets-raw/sprites/ui/icons/icon-paste.png diff --git a/build.gradle b/build.gradle index 147a1be3fb..8e06fca630 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = '7eb80a9765557d025d589f28fa1910dffa3fc8ed' + uCoreVersion = '3dfb820142a0fc583ad19413a24fc5038aa29d89' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/assets-raw/sprites/ui/icons/icon-copy.png b/core/assets-raw/sprites/ui/icons/icon-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a8d0a6071da90c023913776e576d007ef222d0 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>lgJ0Ffasox;TbdoIV?5$;Y6; zvAFGjy`(w&qKG3By9>9e9yqgvskCql@8%Tc_UWamGb6Ys1+e5R8rxJ&N$lj9CGzn) r)182Z=VD);)Jn4Uh`tdC`2NC0fm>^yd^I-%0|SGntDnm{r-UW|U4%O8 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/ui/icons/icon-paste.png b/core/assets-raw/sprites/ui/icons/icon-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddee0eb9b662aa4f5ed3890451ece2c0d876ce2 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>lEak-ar*6KLp}xt z4(6o~|HmKmOcvlcl;!UInpL^;#ETAQfAipF2e>;wl}R>j5Z#lOIOEBKSX>4}s yS!VH*Nl&!=gMDNChcCMWc7C1nRO{CzmQR2AEuQm#7h_;xVDNPHb6Mw<&;$V7?L>G0 literal 0 HcmV?d00001 diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index d0c0e306ca..9a52df3e11 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -6,1232 +6,1232 @@ filter: Nearest,Nearest repeat: none force-projector-top rotate: false - xy: 314, 349 + xy: 392, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 405, 260 + xy: 530, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 405, 242 + xy: 512, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 97, 75 + xy: 84, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 107, 75 + xy: 124, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 403, 143 + xy: 124, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 732, 304 + xy: 174, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 732, 294 + xy: 164, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 612, 220 + xy: 154, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 622, 220 + xy: 144, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 632, 220 + xy: 134, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 284, 304 + xy: 184, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 428, 179 + xy: 174, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 736, 434 + xy: 164, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 736, 424 + xy: 154, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 736, 414 + xy: 144, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 736, 404 + xy: 184, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 736, 394 + xy: 174, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 736, 384 + xy: 164, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 746, 428 + xy: 154, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 746, 418 + xy: 184, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 746, 408 + xy: 174, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 746, 398 + xy: 164, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 746, 388 + xy: 184, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 754, 329 + xy: 93, 39 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 754, 319 + xy: 103, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 742, 308 + xy: 113, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 742, 298 + xy: 123, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 768, 333 + xy: 133, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 778, 333 + xy: 143, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 788, 333 + xy: 153, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 798, 333 + xy: 163, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 808, 333 + xy: 173, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 818, 333 + xy: 183, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 828, 333 + xy: 91, 29 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 764, 323 + xy: 91, 19 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 774, 323 + xy: 91, 9 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 784, 323 + xy: 101, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 794, 323 + xy: 101, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 804, 323 + xy: 111, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 814, 323 + xy: 111, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 824, 323 + xy: 121, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 742, 288 + xy: 121, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mass-driver-turret rotate: false - xy: 522, 348 + xy: 778, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 918, 357 + xy: 457, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 928, 367 + xy: 467, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 918, 347 + xy: 467, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 warp-gate rotate: false - xy: 626, 346 + xy: 934, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 warp-gate-top rotate: false - xy: 652, 372 + xy: 960, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 535, 418 + xy: 39, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 39, 45 + xy: 622, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 561, 418 + xy: 648, 461 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 39, 19 + xy: 288, 372 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 369, 260 + xy: 531, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 369, 242 + xy: 512, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 376, 278 + xy: 512, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 387, 260 + xy: 530, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 387, 242 + xy: 512, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 394, 278 + xy: 548, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 548, 392 + xy: 804, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 548, 366 + xy: 804, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 574, 392 + xy: 830, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 574, 366 + xy: 830, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 plasma-drill rotate: false - xy: 337, 450 + xy: 269, 398 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-rim rotate: false - xy: 337, 416 + xy: 303, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-rotator rotate: false - xy: 371, 450 + xy: 303, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-top rotate: false - xy: 371, 416 + xy: 254, 364 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 448, 278 + xy: 566, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 459, 260 + xy: 548, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 459, 242 + xy: 602, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 567, 242 + xy: 554, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 574, 278 + xy: 549, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 585, 260 + xy: 584, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 585, 242 + xy: 582, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 blackrock1 rotate: false - xy: 117, 166 + xy: 672, 353 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackrock rotate: false - xy: 117, 166 + xy: 672, 353 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackrockshadow1 rotate: false - xy: 127, 166 + xy: 684, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone1 rotate: false - xy: 137, 166 + xy: 708, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackstone rotate: false - xy: 137, 166 + xy: 708, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone2 rotate: false - xy: 147, 166 + xy: 672, 343 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone3 rotate: false - xy: 157, 166 + xy: 1012, 437 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstoneedge rotate: false - xy: 472, 228 + xy: 288, 332 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 coal1 rotate: false - xy: 93, 65 + xy: 114, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal2 rotate: false - xy: 93, 55 + xy: 104, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal3 rotate: false - xy: 103, 65 + xy: 94, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper1 rotate: false - xy: 756, 428 + xy: 174, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper2 rotate: false - xy: 756, 418 + xy: 184, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper3 rotate: false - xy: 766, 423 + xy: 84, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 766, 383 + xy: 154, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 746, 378 + xy: 164, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirtedge rotate: false - xy: 85, 176 + xy: 634, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 generic-cliff-edge rotate: false - xy: 768, 363 + xy: 103, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge rotate: false - xy: 768, 363 + xy: 103, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-1 rotate: false - xy: 768, 353 + xy: 83, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-1 rotate: false - xy: 768, 353 + xy: 83, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-2 rotate: false - xy: 758, 349 + xy: 93, 59 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-2 rotate: false - xy: 758, 349 + xy: 93, 59 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-side rotate: false - xy: 768, 343 + xy: 103, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-side rotate: false - xy: 768, 343 + xy: 103, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge rotate: false - xy: 223, 148 + xy: 103, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-1 rotate: false - xy: 233, 148 + xy: 113, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-2 rotate: false - xy: 243, 148 + xy: 123, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-side rotate: false - xy: 253, 148 + xy: 113, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass2 rotate: false - xy: 203, 148 + xy: 113, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass3 rotate: false - xy: 213, 148 + xy: 93, 49 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grassedge rotate: false - xy: 141, 176 + xy: 585, 256 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 ice2 rotate: false - xy: 273, 148 + xy: 133, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice3 rotate: false - xy: 283, 148 + xy: 123, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 iceedge rotate: false - xy: 169, 176 + xy: 620, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 icerock2 rotate: false - xy: 293, 148 + xy: 133, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow1 rotate: false - xy: 303, 148 + xy: 143, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow1 rotate: false - xy: 303, 148 + xy: 143, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow2 rotate: false - xy: 313, 148 + xy: 133, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow2 rotate: false - xy: 313, 148 + xy: 133, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lavaedge rotate: false - xy: 211, 180 + xy: 585, 242 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 lead1 rotate: false - xy: 806, 403 + xy: 183, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead2 rotate: false - xy: 816, 413 + xy: 1004, 395 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead3 rotate: false - xy: 786, 373 + xy: 1004, 385 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor2 rotate: false - xy: 806, 383 + xy: 694, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor3 rotate: false - xy: 816, 393 + xy: 708, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor4 rotate: false - xy: 826, 403 + xy: 740, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor5 rotate: false - xy: 778, 343 + xy: 682, 353 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor6 rotate: false - xy: 788, 353 + xy: 682, 343 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalflooredge rotate: false - xy: 267, 180 + xy: 641, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 rock2 rotate: false - xy: 958, 347 + xy: 497, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand2 rotate: false - xy: 978, 367 + xy: 517, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand3 rotate: false - xy: 968, 347 + xy: 507, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sandedge rotate: false - xy: 281, 180 + xy: 599, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shrubshadow rotate: false - xy: 1008, 347 + xy: 557, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow2 rotate: false - xy: 838, 337 + xy: 547, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow3 rotate: false - xy: 848, 337 + xy: 567, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snowedge rotate: false - xy: 309, 180 + xy: 627, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 spaceedge rotate: false - xy: 323, 180 + xy: 641, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 stone-cliff-edge rotate: false - xy: 968, 337 + xy: 204, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-1 rotate: false - xy: 978, 337 + xy: 204, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-2 rotate: false - xy: 988, 337 + xy: 204, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-side rotate: false - xy: 998, 337 + xy: 204, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone2 rotate: false - xy: 948, 337 + xy: 205, 142 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone3 rotate: false - xy: 958, 337 + xy: 204, 132 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stoneedge rotate: false - xy: 351, 180 + xy: 655, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 taredge rotate: false - xy: 69, 158 + xy: 998, 433 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 734, 338 + xy: 203, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 734, 328 + xy: 193, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 744, 338 + xy: 203, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 734, 318 + xy: 203, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 744, 328 + xy: 193, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 744, 318 + xy: 203, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge rotate: false - xy: 633, 268 + xy: 131, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-1 rotate: false - xy: 633, 258 + xy: 141, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-2 rotate: false - xy: 633, 248 + xy: 141, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-side rotate: false - xy: 638, 278 + xy: 151, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 wateredge rotate: false - xy: 379, 180 + xy: 1000, 349 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 block-border rotate: false - xy: 82, 135 + xy: 672, 323 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-elevation rotate: false - xy: 92, 145 + xy: 662, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 92, 145 + xy: 662, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-middle rotate: false - xy: 81, 22 + xy: 104, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 81, 22 + xy: 104, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-slope rotate: false - xy: 403, 163 + xy: 94, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 border rotate: false - xy: 88, 85 + xy: 84, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 123, 45 + xy: 144, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-1 rotate: false - xy: 756, 408 + xy: 94, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-2 rotate: false - xy: 910, 443 + xy: 950, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cross-3 rotate: false - xy: 470, 364 + xy: 340, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 cross-4 rotate: false - xy: 160, 276 + xy: 949, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 nuclearreactor-shadow rotate: false - xy: 507, 416 + xy: 499, 416 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 928, 357 + xy: 467, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ripples rotate: false - xy: 365, 168 + xy: 684, 387 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 477, 260 + xy: 528, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 477, 242 + xy: 584, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 484, 278 + xy: 548, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 495, 260 + xy: 566, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 522, 322 + xy: 882, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 522, 322 + xy: 882, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shadow-1 rotate: false - xy: 377, 168 + xy: 684, 375 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-2 rotate: false - xy: 698, 388 + xy: 418, 316 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-3 rotate: false - xy: 720, 456 + xy: 39, 71 size: 26, 26 orig: 26, 26 offset: 0, 0 @@ -1259,322 +1259,322 @@ shadow-6 index: -1 shadow-corner rotate: false - xy: 274, 314 + xy: 672, 363 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-1 rotate: false - xy: 272, 302 + xy: 696, 387 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-2 rotate: false - xy: 678, 364 + xy: 438, 390 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-round-3 rotate: false - xy: 39, 71 + xy: 39, 43 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 shadow-round-4 rotate: false - xy: 789, 477 + xy: 675, 477 size: 34, 34 orig: 34, 34 offset: 0, 0 index: -1 shadow-rounded-2 rotate: false - xy: 698, 368 + xy: 438, 370 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-shock-mine rotate: false - xy: 1008, 367 + xy: 537, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 98, 85 + xy: 114, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 98, 85 + xy: 114, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 108, 85 + xy: 104, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 87, 75 + xy: 94, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 103, 35 + xy: 104, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 113, 65 + xy: 94, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 113, 55 + xy: 144, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 113, 45 + xy: 134, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 113, 35 + xy: 124, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 117, 75 + xy: 114, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 123, 65 + xy: 104, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 123, 55 + xy: 154, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 123, 35 + xy: 134, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 403, 153 + xy: 124, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 393, 150 + xy: 114, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 93, 25 + xy: 164, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 103, 25 + xy: 154, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 113, 25 + xy: 144, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 123, 25 + xy: 134, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 778, 353 + xy: 1014, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 796, 373 + xy: 1014, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 788, 363 + xy: 1014, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 444, 338 + xy: 726, 401 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 470, 338 + xy: 752, 411 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 496, 338 + xy: 778, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 908, 357 + xy: 457, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 918, 367 + xy: 447, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 908, 347 + xy: 457, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 938, 367 + xy: 477, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 928, 347 + xy: 477, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 938, 357 + xy: 487, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 948, 367 + xy: 487, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 938, 347 + xy: 477, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 948, 357 + xy: 497, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 958, 367 + xy: 497, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 alpha-mech-pad rotate: false - xy: 189, 258 + xy: 796, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-alpha-mech-pad rotate: false - xy: 189, 258 + xy: 796, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 battery rotate: false - xy: 107, 166 + xy: 302, 312 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-battery rotate: false - xy: 107, 166 + xy: 302, 312 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1595,378 +1595,378 @@ block-icon-battery-large index: -1 fusion-reactor rotate: false - xy: 121, 242 + xy: 92, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-bottom rotate: false - xy: 155, 242 + xy: 126, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-light rotate: false - xy: 89, 208 + xy: 160, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-0 rotate: false - xy: 123, 208 + xy: 87, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-1 rotate: false - xy: 157, 208 + xy: 121, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-2 rotate: false - xy: 269, 432 + xy: 155, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-3 rotate: false - xy: 269, 398 + xy: 89, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-top rotate: false - xy: 303, 435 + xy: 123, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 968, 357 + xy: 517, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 626, 398 + xy: 908, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 626, 372 + xy: 908, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 549, 242 + xy: 554, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 39, 1 + xy: 438, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-alloy-smelter rotate: false - xy: 39, 1 + xy: 438, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 57, 1 + xy: 778, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 arc-smelter rotate: false - xy: 214, 278 + xy: 814, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-arc-smelter rotate: false - xy: 214, 278 + xy: 814, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 arc-smelter-top rotate: false - xy: 232, 278 + xy: 832, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 232, 278 + xy: 832, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor rotate: false - xy: 626, 328 + xy: 850, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame0 rotate: false - xy: 644, 328 + xy: 438, 314 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame1 rotate: false - xy: 207, 258 + xy: 908, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame2 rotate: false - xy: 225, 260 + xy: 926, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-liquid rotate: false - xy: 243, 260 + xy: 944, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-top rotate: false - xy: 250, 278 + xy: 962, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 261, 260 + xy: 1006, 461 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-blast-mixer rotate: false - xy: 261, 260 + xy: 1006, 461 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 centrifuge-liquid rotate: false - xy: 910, 461 + xy: 968, 379 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 928, 461 + xy: 968, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 910, 425 + xy: 986, 363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 928, 443 + xy: 189, 258 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator rotate: false - xy: 946, 461 + xy: 207, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 928, 425 + xy: 225, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 946, 443 + xy: 243, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 lavasmelter rotate: false - xy: 796, 393 + xy: 173, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 oilrefinery rotate: false - xy: 788, 343 + xy: 682, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 423, 242 + xy: 530, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 430, 278 + xy: 548, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 441, 260 + xy: 584, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 441, 242 + xy: 530, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 948, 347 + xy: 487, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 958, 357 + xy: 507, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 998, 347 + xy: 547, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 core-open rotate: false - xy: 418, 364 + xy: 392, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core-top rotate: false - xy: 444, 364 + xy: 314, 323 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sortedunloader rotate: false - xy: 898, 337 + xy: 194, 132 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1 rotate: false - xy: 93, 155 + xy: 752, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1-top rotate: false - xy: 82, 145 + xy: 662, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-2 rotate: false - xy: 672, 346 + xy: 458, 392 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-2-top rotate: false - xy: 690, 346 + xy: 458, 374 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-3 rotate: false - xy: 288, 372 + xy: 314, 375 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-3-top rotate: false - xy: 314, 375 + xy: 674, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-4 rotate: false - xy: 825, 479 + xy: 711, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-4-top rotate: false - xy: 859, 479 + xy: 745, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1980,343 +1980,343 @@ arc index: -1 arc-heat rotate: false - xy: 256, 296 + xy: 256, 312 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cyclone rotate: false - xy: 496, 364 + xy: 366, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 duo rotate: false - xy: 748, 358 + xy: 83, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 fuse rotate: false - xy: 392, 338 + xy: 726, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hail rotate: false - xy: 263, 148 + xy: 123, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 735, 444 + xy: 242, 339 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 lancer rotate: false - xy: 351, 242 + xy: 495, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 358, 278 + xy: 513, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 meltdown rotate: false - xy: 303, 401 + xy: 157, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 254, 364 + xy: 269, 432 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 548, 340 + xy: 856, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 574, 340 + xy: 856, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salvo rotate: false - xy: 495, 242 + xy: 602, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 502, 278 + xy: 548, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 513, 260 + xy: 546, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 513, 242 + xy: 536, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 scatter rotate: false - xy: 998, 367 + xy: 537, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch rotate: false - xy: 988, 347 + xy: 527, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch-shoot rotate: false - xy: 998, 357 + xy: 547, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spectre rotate: false - xy: 473, 416 + xy: 405, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 531, 242 + xy: 584, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wave rotate: false - xy: 592, 278 + xy: 572, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 603, 260 + xy: 602, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 964, 461 + xy: 494, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory-top-open rotate: false - xy: 946, 425 + xy: 494, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 288, 346 + xy: 700, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 340, 338 + xy: 700, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 340, 338 + xy: 700, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 340, 338 + xy: 700, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-top-open rotate: false - xy: 366, 338 + xy: 700, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-top-open rotate: false - xy: 366, 338 + xy: 700, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-top-open rotate: false - xy: 366, 338 + xy: 700, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 418, 338 + xy: 726, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 412, 278 + xy: 512, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phantom-factory-top-open rotate: false - xy: 423, 260 + xy: 566, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 reconstructor-open rotate: false - xy: 466, 278 + xy: 530, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 repair-point-turret rotate: false - xy: 968, 367 + xy: 507, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 revenant-factory rotate: false - xy: 405, 450 + xy: 337, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-top rotate: false - xy: 405, 416 + xy: 337, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-top-open rotate: false - xy: 439, 450 + xy: 371, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spirit-factory-top rotate: false - xy: 520, 278 + xy: 536, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 spirit-factory-top-open rotate: false - xy: 531, 260 + xy: 566, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 652, 398 + xy: 934, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 603, 242 + xy: 572, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wraith-factory-top-open rotate: false - xy: 610, 278 + xy: 567, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 deflector-wall rotate: false - xy: 766, 393 + xy: 144, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deflector-wall-large rotate: false - xy: 964, 443 + xy: 494, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 982, 461 + xy: 494, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-open rotate: false - xy: 738, 358 + xy: 93, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2330,84 +2330,84 @@ beam index: -1 beam-end rotate: false - xy: 652, 352 + xy: 418, 396 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 blank rotate: false - xy: 415, 210 + xy: 290, 466 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 bullet rotate: false - xy: 389, 195 + xy: 197, 195 size: 13, 13 orig: 13, 13 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 415, 227 + xy: 197, 180 size: 13, 13 orig: 13, 13 offset: 0, 0 index: -1 casing rotate: false - xy: 764, 333 + xy: 85, 198 size: 2, 4 orig: 2, 4 offset: 0, 0 index: -1 clear rotate: false - xy: 300, 466 + xy: 254, 398 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 command-attack rotate: false - xy: 93, 45 + xy: 84, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-idle rotate: false - xy: 103, 55 + xy: 134, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-patrol rotate: false - xy: 93, 35 + xy: 124, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-retreat rotate: false - xy: 103, 45 + xy: 114, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 enemyarrow rotate: false - xy: 758, 359 + xy: 93, 69 size: 8, 7 orig: 8, 7 offset: 0, 0 index: -1 error rotate: false - xy: 99, 176 + xy: 642, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -2421,161 +2421,161 @@ laser index: -1 laser-end rotate: false - xy: 678, 404 + xy: 418, 376 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 laserfull rotate: false - xy: 678, 384 + xy: 418, 356 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 minelaser rotate: false - xy: 85, 190 + xy: 414, 298 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 698, 408 + xy: 418, 336 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 missile rotate: false - xy: 732, 371 + xy: 868, 416 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 missile-back rotate: false - xy: 417, 178 + xy: 314, 312 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1016, 380 + xy: 702, 338 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 643, 251 + xy: 702, 311 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 752, 291 + xy: 702, 284 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 761, 292 + xy: 699, 238 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 770, 296 + xy: 211, 153 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 shell rotate: false - xy: 85, 165 + xy: 325, 312 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 shell-back rotate: false - xy: 96, 165 + xy: 696, 376 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 shot rotate: false - xy: 1008, 357 + xy: 557, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 transfer rotate: false - xy: 33, 3 + xy: 1020, 447 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 628, 278 + xy: 131, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 194, 276 + xy: 438, 350 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 blackstone-cliff-edge rotate: false - xy: 167, 166 + xy: 1012, 427 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-1 rotate: false - xy: 177, 166 + xy: 1012, 417 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-2 rotate: false - xy: 187, 166 + xy: 1012, 407 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-side rotate: false - xy: 83, 155 + xy: 672, 333 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-arc rotate: false - xy: 82, 125 + xy: 672, 313 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-biomattercompressor rotate: false - xy: 662, 328 + xy: 458, 356 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -2589,343 +2589,343 @@ block-icon-blast-drill index: -1 block-icon-bridge-conduit rotate: false - xy: 92, 135 + xy: 656, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 92, 135 + xy: 656, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-bridge-conveyor rotate: false - xy: 82, 115 + xy: 662, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 82, 115 + xy: 662, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-centrifuge rotate: false - xy: 680, 328 + xy: 476, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 centrifuge rotate: false - xy: 680, 328 + xy: 476, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-combustion-generator rotate: false - xy: 92, 125 + xy: 662, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 92, 125 + xy: 662, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-command-center rotate: false - xy: 698, 328 + xy: 476, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 command-center rotate: false - xy: 698, 328 + xy: 476, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-conduit rotate: false - xy: 82, 105 + xy: 662, 277 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-container rotate: false - xy: 588, 321 + xy: 476, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 container rotate: false - xy: 588, 321 + xy: 476, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-conveyor rotate: false - xy: 92, 115 + xy: 662, 267 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 92, 115 + xy: 662, 267 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall rotate: false - xy: 92, 105 + xy: 672, 303 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 92, 105 + xy: 672, 303 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall-large rotate: false - xy: 606, 321 + xy: 752, 393 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 606, 321 + xy: 752, 393 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-core rotate: false - xy: 587, 418 + xy: 648, 435 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core rotate: false - xy: 587, 418 + xy: 648, 435 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-cryofluidmixer rotate: false - xy: 708, 350 + xy: 194, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-cultivator rotate: false - xy: 716, 332 + xy: 212, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-cyclone rotate: false - xy: 613, 424 + xy: 622, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-dagger-factory rotate: false - xy: 624, 310 + xy: 230, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dart-ship-pad rotate: false - xy: 642, 310 + xy: 770, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dart-ship-pad rotate: false - xy: 642, 310 + xy: 770, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-deepwater rotate: false - xy: 389, 170 + xy: 672, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater rotate: false - xy: 389, 170 + xy: 672, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-delta-mech-pad rotate: false - xy: 660, 310 + xy: 788, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 660, 310 + xy: 788, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dense-alloy-wall rotate: false - xy: 103, 155 + xy: 672, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dense-alloy-wall rotate: false - xy: 103, 155 + xy: 672, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-dense-alloy-wall-large rotate: false - xy: 678, 310 + xy: 806, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dense-alloy-wall-large rotate: false - xy: 678, 310 + xy: 806, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dirt rotate: false - xy: 102, 145 + xy: 672, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt1 rotate: false - xy: 102, 145 + xy: 672, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-distributor rotate: false - xy: 696, 310 + xy: 824, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 distributor rotate: false - xy: 696, 310 + xy: 824, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-door rotate: false - xy: 102, 135 + xy: 672, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 door rotate: false - xy: 102, 135 + xy: 672, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-door-large rotate: false - xy: 89, 190 + xy: 842, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-large rotate: false - xy: 89, 190 + xy: 842, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-duo rotate: false - xy: 102, 125 + xy: 669, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-force-projector rotate: false - xy: 639, 424 + xy: 674, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 force-projector rotate: false - xy: 639, 424 + xy: 674, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fortress-factory rotate: false - xy: 665, 424 + xy: 648, 409 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fuse rotate: false - xy: 691, 428 + xy: 674, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fusion-reactor rotate: false - xy: 893, 479 + xy: 779, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2953,168 +2953,168 @@ glaive-ship-pad index: -1 block-icon-grass rotate: false - xy: 102, 115 + xy: 669, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass1 rotate: false - xy: 102, 115 + xy: 669, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-hail rotate: false - xy: 102, 105 + xy: 669, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-ice rotate: false - xy: 113, 156 + xy: 679, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice1 rotate: false - xy: 113, 156 + xy: 679, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-icerock rotate: false - xy: 123, 156 + xy: 679, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerock1 rotate: false - xy: 123, 156 + xy: 679, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-incinerator rotate: false - xy: 133, 156 + xy: 679, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 incinerator rotate: false - xy: 133, 156 + xy: 679, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemsource rotate: false - xy: 143, 156 + xy: 205, 248 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemsource rotate: false - xy: 143, 156 + xy: 205, 248 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemvoid rotate: false - xy: 153, 156 + xy: 215, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemvoid rotate: false - xy: 153, 156 + xy: 215, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-javelin-ship-pad rotate: false - xy: 107, 190 + xy: 248, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 javelin-ship-pad rotate: false - xy: 107, 190 + xy: 248, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-junction rotate: false - xy: 163, 156 + xy: 225, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 junction rotate: false - xy: 163, 156 + xy: 225, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-lancer rotate: false - xy: 125, 190 + xy: 860, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-laser-drill rotate: false - xy: 143, 190 + xy: 878, 398 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-lava rotate: false - xy: 173, 156 + xy: 235, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava rotate: false - xy: 173, 156 + xy: 235, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-junction rotate: false - xy: 183, 156 + xy: 245, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 183, 156 + xy: 245, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-router rotate: false - xy: 193, 156 + xy: 255, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3128,14 +3128,14 @@ block-icon-liquid-tank index: -1 block-icon-liquidsource rotate: false - xy: 203, 158 + xy: 265, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidsource rotate: false - xy: 203, 158 + xy: 265, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3156,70 +3156,70 @@ mass-driver index: -1 block-icon-mechanical-drill rotate: false - xy: 161, 190 + xy: 878, 380 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-mechanical-pump rotate: false - xy: 213, 158 + xy: 275, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 213, 158 + xy: 275, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-meltdown rotate: false - xy: 927, 479 + xy: 813, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-melter rotate: false - xy: 223, 158 + xy: 285, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 melter rotate: false - xy: 223, 158 + xy: 285, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-mend-projector rotate: false - xy: 179, 190 + xy: 532, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 179, 190 + xy: 532, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-metalfloor rotate: false - xy: 233, 158 + xy: 295, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor1 rotate: false - xy: 233, 158 + xy: 295, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3233,1995 +3233,1995 @@ block-icon-oil-extractor index: -1 block-icon-omega-mech-pad rotate: false - xy: 418, 390 + xy: 340, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 omega-mech-pad rotate: false - xy: 418, 390 + xy: 340, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-overdrive-projector rotate: false - xy: 748, 466 + xy: 550, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 748, 466 + xy: 550, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-overflow-gate rotate: false - xy: 243, 158 + xy: 305, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 243, 158 + xy: 305, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phantom-factory rotate: false - xy: 766, 469 + xy: 568, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-phase-conduit rotate: false - xy: 253, 158 + xy: 315, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 253, 158 + xy: 315, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-conveyor rotate: false - xy: 263, 158 + xy: 325, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 263, 158 + xy: 325, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall rotate: false - xy: 273, 158 + xy: 335, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 273, 158 + xy: 335, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall-large rotate: false - xy: 748, 448 + xy: 586, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 748, 448 + xy: 586, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-phase-weaver rotate: false - xy: 766, 451 + xy: 604, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-plasma-drill rotate: false - xy: 961, 479 + xy: 847, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-plastanium-compressor rotate: false - xy: 784, 459 + xy: 527, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 784, 459 + xy: 527, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-pneumatic-drill rotate: false - xy: 802, 459 + xy: 545, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-power-node rotate: false - xy: 283, 158 + xy: 345, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 power-node rotate: false - xy: 283, 158 + xy: 345, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-power-node-large rotate: false - xy: 784, 441 + xy: 563, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 784, 441 + xy: 563, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-powerinfinite rotate: false - xy: 293, 158 + xy: 355, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powerinfinite rotate: false - xy: 293, 158 + xy: 355, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-powervoid rotate: false - xy: 303, 158 + xy: 365, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powervoid rotate: false - xy: 303, 158 + xy: 365, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulse-conduit rotate: false - xy: 313, 158 + xy: 375, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulverizer rotate: false - xy: 323, 158 + xy: 385, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pyratite-mixer rotate: false - xy: 802, 441 + xy: 581, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 802, 441 + xy: 581, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-reconstructor rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 reconstructor rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-repair-point rotate: false - xy: 333, 158 + xy: 395, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 repair-point rotate: false - xy: 333, 158 + xy: 395, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-revenant-factory rotate: false - xy: 92, 276 + xy: 881, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-ripple rotate: false - xy: 444, 390 + xy: 366, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-rock rotate: false - xy: 343, 158 + xy: 405, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rock1 rotate: false - xy: 343, 158 + xy: 405, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-rotary-pump rotate: false - xy: 784, 423 + xy: 617, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 784, 423 + xy: 617, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-router rotate: false - xy: 353, 158 + xy: 415, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 router rotate: false - xy: 353, 158 + xy: 415, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-rtg-generator rotate: false - xy: 802, 423 + xy: 980, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 802, 423 + xy: 980, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-salvo rotate: false - xy: 820, 459 + xy: 980, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-sand rotate: false - xy: 363, 158 + xy: 425, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand1 rotate: false - xy: 363, 158 + xy: 425, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-scorch rotate: false - xy: 373, 158 + xy: 435, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-separator rotate: false - xy: 383, 158 + xy: 445, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator rotate: false - xy: 383, 158 + xy: 445, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shock-mine rotate: false - xy: 393, 160 + xy: 455, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 393, 160 + xy: 455, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shrub rotate: false - xy: 68, 92 + xy: 465, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shrub rotate: false - xy: 68, 92 + xy: 465, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-silicon-smelter rotate: false - xy: 820, 441 + xy: 962, 397 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 820, 441 + xy: 962, 397 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-smelter rotate: false - xy: 67, 82 + xy: 85, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 smelter rotate: false - xy: 67, 82 + xy: 85, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-snow rotate: false - xy: 67, 72 + xy: 95, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow1 rotate: false - xy: 67, 72 + xy: 95, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel rotate: false - xy: 78, 92 + xy: 105, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 78, 92 + xy: 105, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel-large rotate: false - xy: 470, 390 + xy: 392, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 470, 390 + xy: 392, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-solidifer rotate: false - xy: 77, 82 + xy: 115, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solidifer rotate: false - xy: 77, 82 + xy: 115, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-sorter rotate: false - xy: 77, 72 + xy: 125, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sorter rotate: false - xy: 77, 72 + xy: 125, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-space rotate: false - xy: 88, 95 + xy: 135, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space rotate: false - xy: 88, 95 + xy: 135, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spawn rotate: false - xy: 98, 95 + xy: 145, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spawn rotate: false - xy: 98, 95 + xy: 145, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spectre rotate: false - xy: 126, 276 + xy: 915, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-spirit-factory rotate: false - xy: 820, 423 + xy: 980, 399 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-stone rotate: false - xy: 108, 95 + xy: 155, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone1 rotate: false - xy: 108, 95 + xy: 155, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall rotate: false - xy: 747, 438 + xy: 165, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 747, 438 + xy: 165, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall-large rotate: false - xy: 838, 461 + xy: 458, 338 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 838, 461 + xy: 458, 338 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-swarmer rotate: false - xy: 838, 443 + xy: 476, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-tar rotate: false - xy: 399, 173 + xy: 175, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar rotate: false - xy: 399, 173 + xy: 175, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-tau-mech-pad rotate: false - xy: 856, 461 + xy: 456, 320 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 tau-mech-pad rotate: false - xy: 856, 461 + xy: 456, 320 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thermal-generator rotate: false - xy: 838, 425 + xy: 896, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 838, 425 + xy: 896, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thermal-pump rotate: false - xy: 856, 443 + xy: 914, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 856, 443 + xy: 914, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thorium-reactor rotate: false - xy: 496, 390 + xy: 314, 349 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 496, 390 + xy: 314, 349 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-thorium-wall rotate: false - xy: 83, 62 + xy: 185, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 83, 62 + xy: 185, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-thorium-wall-large rotate: false - xy: 874, 461 + xy: 932, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 874, 461 + xy: 932, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-titan-factory rotate: false - xy: 340, 364 + xy: 288, 346 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-titanium-conveyor rotate: false - xy: 83, 52 + xy: 84, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 83, 52 + xy: 84, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-trident-ship-pad rotate: false - xy: 856, 425 + xy: 896, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 856, 425 + xy: 896, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-turbine-generator rotate: false - xy: 874, 443 + xy: 914, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 874, 443 + xy: 914, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-unloader rotate: false - xy: 83, 42 + xy: 94, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unloader rotate: false - xy: 83, 42 + xy: 94, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-vault rotate: false - xy: 366, 364 + xy: 340, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 vault rotate: false - xy: 366, 364 + xy: 340, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-water rotate: false - xy: 83, 32 + xy: 84, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water rotate: false - xy: 83, 32 + xy: 84, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-water-extractor rotate: false - xy: 892, 461 + xy: 932, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-wave rotate: false - xy: 874, 425 + xy: 456, 302 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-wraith-factory rotate: false - xy: 892, 443 + xy: 950, 379 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 deepwater-cliff-edge rotate: false - xy: 766, 413 + xy: 104, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-1 rotate: false - xy: 756, 398 + xy: 114, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-2 rotate: false - xy: 766, 403 + xy: 124, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-side rotate: false - xy: 756, 388 + xy: 134, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge rotate: false - xy: 756, 378 + xy: 174, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-1 rotate: false - xy: 766, 373 + xy: 184, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-2 rotate: false - xy: 743, 368 + xy: 83, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-side rotate: false - xy: 753, 368 + xy: 83, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge rotate: false - xy: 786, 393 + xy: 133, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-1 rotate: false - xy: 796, 403 + xy: 143, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-2 rotate: false - xy: 806, 413 + xy: 153, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-side rotate: false - xy: 786, 383 + xy: 163, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-cryofluid rotate: false - xy: 796, 383 + xy: 1004, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-lava rotate: false - xy: 806, 393 + xy: 1014, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-oil rotate: false - xy: 816, 403 + xy: 1014, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-water rotate: false - xy: 826, 413 + xy: 1014, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mech-icon-alpha-mech rotate: false - xy: 225, 180 + xy: 599, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-dart-ship rotate: false - xy: 239, 180 + xy: 613, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-delta-mech rotate: false - xy: 253, 180 + xy: 627, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-omega-mech rotate: false - xy: 351, 210 + xy: 165, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-tau-mech rotate: false - xy: 341, 194 + xy: 181, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-trident-ship rotate: false - xy: 367, 226 + xy: 68, 140 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 367, 226 + xy: 68, 140 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 metalfloor-cliff-edge rotate: false - xy: 806, 373 + xy: 682, 333 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-1 rotate: false - xy: 798, 363 + xy: 682, 323 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-2 rotate: false - xy: 816, 383 + xy: 682, 313 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-side rotate: false - xy: 826, 393 + xy: 682, 303 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone1 rotate: false - xy: 798, 353 + xy: 682, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone2 rotate: false - xy: 816, 373 + xy: 682, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone3 rotate: false - xy: 808, 363 + xy: 682, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass1 rotate: false - xy: 826, 383 + xy: 692, 355 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass2 rotate: false - xy: 798, 343 + xy: 692, 345 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass3 rotate: false - xy: 808, 353 + xy: 692, 335 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice1 rotate: false - xy: 826, 373 + xy: 692, 325 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice2 rotate: false - xy: 818, 363 + xy: 692, 315 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice3 rotate: false - xy: 808, 343 + xy: 692, 305 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 818, 353 + xy: 692, 295 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 818, 343 + xy: 692, 285 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 836, 397 + xy: 692, 275 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow1 rotate: false - xy: 836, 387 + xy: 692, 265 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow2 rotate: false - xy: 846, 397 + xy: 689, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow3 rotate: false - xy: 836, 377 + xy: 689, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 846, 387 + xy: 689, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 856, 397 + xy: 207, 238 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 846, 377 + xy: 207, 228 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone1 rotate: false - xy: 856, 387 + xy: 207, 218 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone2 rotate: false - xy: 866, 397 + xy: 217, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone3 rotate: false - xy: 856, 377 + xy: 217, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass1 rotate: false - xy: 866, 387 + xy: 227, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass2 rotate: false - xy: 876, 397 + xy: 217, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass3 rotate: false - xy: 866, 377 + xy: 227, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice1 rotate: false - xy: 876, 387 + xy: 237, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice2 rotate: false - xy: 886, 397 + xy: 227, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice3 rotate: false - xy: 876, 377 + xy: 237, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand1 rotate: false - xy: 886, 387 + xy: 247, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand2 rotate: false - xy: 896, 397 + xy: 237, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand3 rotate: false - xy: 886, 377 + xy: 247, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow1 rotate: false - xy: 896, 387 + xy: 257, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow2 rotate: false - xy: 906, 397 + xy: 247, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow3 rotate: false - xy: 896, 377 + xy: 257, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone1 rotate: false - xy: 906, 387 + xy: 267, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone2 rotate: false - xy: 916, 397 + xy: 257, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone3 rotate: false - xy: 906, 377 + xy: 267, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone1 rotate: false - xy: 916, 387 + xy: 277, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone2 rotate: false - xy: 926, 397 + xy: 267, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone3 rotate: false - xy: 916, 377 + xy: 277, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass1 rotate: false - xy: 926, 387 + xy: 287, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass2 rotate: false - xy: 936, 397 + xy: 277, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass3 rotate: false - xy: 926, 377 + xy: 287, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice1 rotate: false - xy: 936, 387 + xy: 297, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice2 rotate: false - xy: 946, 397 + xy: 287, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice3 rotate: false - xy: 936, 377 + xy: 297, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 946, 387 + xy: 307, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 956, 397 + xy: 297, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 946, 377 + xy: 307, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow1 rotate: false - xy: 956, 387 + xy: 317, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow2 rotate: false - xy: 966, 397 + xy: 307, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow3 rotate: false - xy: 956, 377 + xy: 317, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 966, 387 + xy: 327, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 976, 397 + xy: 317, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 966, 377 + xy: 327, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone1 rotate: false - xy: 976, 387 + xy: 337, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone2 rotate: false - xy: 986, 397 + xy: 327, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone3 rotate: false - xy: 976, 377 + xy: 337, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass1 rotate: false - xy: 986, 387 + xy: 347, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass2 rotate: false - xy: 996, 397 + xy: 337, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass3 rotate: false - xy: 986, 377 + xy: 347, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice1 rotate: false - xy: 996, 387 + xy: 357, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice2 rotate: false - xy: 1006, 397 + xy: 347, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice3 rotate: false - xy: 996, 377 + xy: 357, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 1006, 387 + xy: 367, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 1006, 377 + xy: 357, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 828, 363 + xy: 367, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow1 rotate: false - xy: 828, 353 + xy: 377, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow2 rotate: false - xy: 828, 343 + xy: 367, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow3 rotate: false - xy: 838, 367 + xy: 377, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 838, 357 + xy: 387, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 848, 367 + xy: 377, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 838, 347 + xy: 387, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone1 rotate: false - xy: 848, 357 + xy: 397, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone2 rotate: false - xy: 858, 367 + xy: 387, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone3 rotate: false - xy: 848, 347 + xy: 397, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass1 rotate: false - xy: 858, 357 + xy: 407, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass2 rotate: false - xy: 868, 367 + xy: 397, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass3 rotate: false - xy: 858, 347 + xy: 407, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice1 rotate: false - xy: 868, 357 + xy: 417, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice2 rotate: false - xy: 878, 367 + xy: 407, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice3 rotate: false - xy: 868, 347 + xy: 417, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 878, 357 + xy: 427, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 888, 367 + xy: 417, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 878, 347 + xy: 427, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow1 rotate: false - xy: 888, 357 + xy: 437, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow2 rotate: false - xy: 898, 367 + xy: 427, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow3 rotate: false - xy: 888, 347 + xy: 437, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 898, 357 + xy: 447, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 908, 367 + xy: 437, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 898, 347 + xy: 447, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge rotate: false - xy: 978, 357 + xy: 527, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-1 rotate: false - xy: 988, 367 + xy: 527, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-2 rotate: false - xy: 978, 347 + xy: 517, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-side rotate: false - xy: 988, 357 + xy: 537, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge rotate: false - xy: 858, 337 + xy: 567, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-1 rotate: false - xy: 868, 337 + xy: 557, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-2 rotate: false - xy: 878, 337 + xy: 567, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-side rotate: false - xy: 888, 337 + xy: 195, 142 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge rotate: false - xy: 908, 337 + xy: 194, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-1 rotate: false - xy: 918, 337 + xy: 194, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-2 rotate: false - xy: 928, 337 + xy: 194, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-side rotate: false - xy: 938, 337 + xy: 194, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge rotate: false - xy: 1008, 337 + xy: 194, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-1 rotate: false - xy: 738, 348 + xy: 204, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-2 rotate: false - xy: 748, 348 + xy: 193, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-side rotate: false - xy: 758, 339 + xy: 193, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unit-icon-dagger rotate: false - xy: 68, 116 + xy: 726, 387 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-fortress rotate: false - xy: 556, 278 + xy: 584, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-icon-titan rotate: false - xy: 567, 260 + xy: 602, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-icon-wraith rotate: false - xy: 68, 102 + xy: 986, 349 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 wraith rotate: false - xy: 68, 102 + xy: 986, 349 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 item-biomatter rotate: false - xy: 343, 148 + xy: 143, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 353, 148 + xy: 153, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-coal rotate: false - xy: 363, 148 + xy: 163, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-copper rotate: false - xy: 373, 148 + xy: 153, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-dense-alloy rotate: false - xy: 383, 148 + xy: 163, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-lead rotate: false - xy: 393, 140 + xy: 173, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 403, 133 + xy: 163, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 776, 413 + xy: 173, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 776, 403 + xy: 183, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-sand rotate: false - xy: 786, 413 + xy: 173, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 776, 393 + xy: 183, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-stone rotate: false - xy: 786, 403 + xy: 183, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 796, 413 + xy: 103, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 776, 383 + xy: 113, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 776, 373 + xy: 123, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon rotate: false - xy: 778, 363 + xy: 1004, 375 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 415, 213 + xy: 197, 166 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 430, 228 + xy: 197, 152 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 444, 228 + xy: 274, 324 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech rotate: false - xy: 584, 228 + xy: 628, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech-base rotate: false - xy: 598, 228 + xy: 632, 320 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech-leg rotate: false - xy: 404, 196 + xy: 634, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 omega-mech rotate: false - xy: 367, 210 + xy: 68, 124 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-armor rotate: false - xy: 357, 194 + xy: 68, 108 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-base rotate: false - xy: 383, 226 + xy: 68, 92 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-leg rotate: false - xy: 383, 210 + xy: 67, 76 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 tau-mech rotate: false - xy: 399, 210 + xy: 620, 334 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 tau-mech-base rotate: false - xy: 68, 144 + xy: 998, 419 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 68, 130 + xy: 998, 405 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dart-ship rotate: false - xy: 570, 228 + xy: 620, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -5242,21 +5242,21 @@ mech-icon-glaive-ship index: -1 javelin-ship rotate: false - xy: 183, 176 + xy: 634, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-javelin-ship rotate: false - xy: 183, 176 + xy: 634, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 197, 180 + xy: 648, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -5277,7 +5277,7 @@ shape-3 index: -1 button rotate: false - xy: 562, 484 + xy: 486, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -5323,15 +5323,7 @@ button-edge-4 orig: 36, 27 offset: 0, 0 index: -1 -button-left - rotate: false - xy: 448, 484 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-left-down +button-over rotate: false xy: 410, 484 size: 36, 27 @@ -5339,15 +5331,7 @@ button-left-down orig: 36, 27 offset: 0, 0 index: -1 -button-left-over - rotate: false - xy: 1, 75 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over +button-right rotate: false xy: 1, 46 size: 36, 27 @@ -5355,17 +5339,9 @@ button-over orig: 36, 27 offset: 0, 0 index: -1 -button-right - rotate: false - xy: 524, 484 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 button-right-down rotate: false - xy: 486, 484 + xy: 1, 75 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -5373,7 +5349,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1, 17 + xy: 448, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -5381,7 +5357,7 @@ button-right-over index: -1 button-select rotate: false - xy: 392, 364 + xy: 366, 338 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -5389,42 +5365,42 @@ button-select index: -1 check-off rotate: false - xy: 995, 479 + xy: 532, 450 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 600, 450 + xy: 562, 450 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 630, 450 + xy: 592, 450 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 660, 450 + xy: 439, 410 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 242, 339 + xy: 950, 397 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 cursor rotate: false - xy: 600, 444 + xy: 998, 399 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -5438,84 +5414,84 @@ discord-banner index: -1 empty-sector rotate: false - xy: 87, 242 + xy: 983, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 717, 436 + xy: 266, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 718, 418 + xy: 279, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 718, 400 + xy: 284, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 718, 382 + xy: 297, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-liquid rotate: false - xy: 892, 407 + xy: 374, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-power rotate: false - xy: 268, 278 + xy: 459, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-production rotate: false - xy: 279, 260 + xy: 476, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-turret rotate: false - xy: 315, 242 + xy: 510, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-units rotate: false - xy: 333, 260 + xy: 482, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-upgrade rotate: false - xy: 340, 278 + xy: 518, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 controller-cursor rotate: false - xy: 892, 425 + xy: 986, 381 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5536,231 +5512,238 @@ icon-add index: -1 icon-admin rotate: false - xy: 65, 19 + xy: 33, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-admin-small rotate: false - xy: 332, 341 + xy: 1017, 505 size: 6, 6 orig: 6, 6 offset: 0, 0 index: -1 icon-areaDelete rotate: false - xy: 393, 183 + xy: 302, 334 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 982, 425 + xy: 125, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 982, 425 + xy: 125, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 405, 184 + xy: 302, 322 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 612, 230 + xy: 740, 389 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 418, 201 + xy: 274, 312 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 621, 266 + xy: 635, 420 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-back rotate: false - xy: 1000, 443 + xy: 143, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-ban rotate: false - xy: 242, 322 + xy: 49, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-break rotate: false - xy: 1000, 425 + xy: 161, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 716, 314 + xy: 179, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 621, 254 + xy: 636, 408 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-check rotate: false - xy: 314, 331 + xy: 418, 298 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-copy + rotate: false + xy: 436, 296 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cursor rotate: false - xy: 621, 242 + xy: 636, 396 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-dev-builds rotate: false - xy: 189, 242 + xy: 242, 322 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-discord rotate: false - xy: 69, 188 + xy: 189, 242 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 258, 322 + xy: 69, 188 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 256, 306 + xy: 256, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 205, 242 + xy: 602, 326 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-egg rotate: false - xy: 191, 226 + xy: 69, 172 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 65, 53 + xy: 302, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 65, 35 + xy: 315, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 69, 172 + xy: 272, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-file rotate: false - xy: 225, 242 + xy: 320, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-image rotate: false - xy: 243, 242 + xy: 333, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-text rotate: false - xy: 191, 210 + xy: 258, 322 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-fill rotate: false - xy: 261, 242 + xy: 338, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-floppy rotate: false - xy: 207, 226 + xy: 288, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-floppy-16 rotate: false - xy: 838, 407 + xy: 351, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-folder rotate: false - xy: 207, 210 + xy: 304, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-folder-parent rotate: false - xy: 197, 194 + xy: 320, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -5774,455 +5757,462 @@ icon-generated index: -1 icon-github rotate: false - xy: 223, 226 + xy: 336, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-google-play rotate: false - xy: 223, 210 + xy: 352, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-grid rotate: false - xy: 856, 407 + xy: 356, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-hold rotate: false - xy: 624, 230 + xy: 648, 397 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-holdDelete rotate: false - xy: 75, 7 + xy: 636, 384 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-home rotate: false - xy: 213, 194 + xy: 368, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-host rotate: false - xy: 239, 226 + xy: 384, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-info rotate: false - xy: 274, 326 + xy: 660, 397 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-itch.io rotate: false - xy: 239, 210 + xy: 620, 398 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-item rotate: false - xy: 726, 356 + xy: 648, 385 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-items-none rotate: false - xy: 323, 148 + xy: 143, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-line rotate: false - xy: 874, 407 + xy: 369, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-link rotate: false - xy: 229, 194 + xy: 620, 382 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-liquid-small rotate: false - xy: 418, 189 + xy: 636, 372 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-load rotate: false - xy: 255, 226 + xy: 620, 366 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-load-image rotate: false - xy: 910, 407 + xy: 387, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load-map rotate: false - xy: 928, 407 + xy: 392, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-loading rotate: false - xy: 946, 407 + xy: 410, 280 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-locked rotate: false - xy: 964, 407 + xy: 428, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-logic rotate: false - xy: 197, 168 + xy: 660, 385 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-map rotate: false - xy: 255, 210 + xy: 620, 350 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-menu rotate: false - xy: 209, 168 + xy: 648, 373 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-menu-large rotate: false - xy: 982, 407 + xy: 446, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-missing rotate: false - xy: 221, 168 + xy: 636, 360 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-background rotate: false - xy: 568, 320 + xy: 986, 459 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 icon-mission-battle rotate: false - xy: 233, 168 + xy: 648, 361 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-defense rotate: false - xy: 245, 168 + xy: 660, 373 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-done rotate: false - xy: 257, 168 + xy: 636, 348 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-none rotate: false - xy: 269, 168 + xy: 648, 349 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-nullitem rotate: false - xy: 333, 148 + xy: 153, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 +icon-paste + rotate: false + xy: 405, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 icon-pause rotate: false - xy: 281, 168 + xy: 660, 361 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-pencil rotate: false - xy: 1000, 407 + xy: 423, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pencil-small rotate: false - xy: 245, 194 + xy: 191, 226 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-pick rotate: false - xy: 714, 296 + xy: 441, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play rotate: false - xy: 293, 168 + xy: 636, 336 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-play-2 rotate: false - xy: 271, 226 + xy: 191, 210 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-players rotate: false - xy: 305, 168 + xy: 648, 337 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-power-small rotate: false - xy: 317, 168 + xy: 660, 349 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-quit rotate: false - xy: 271, 210 + xy: 85, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-redo rotate: false - xy: 279, 242 + xy: 494, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-refresh rotate: false - xy: 261, 194 + xy: 101, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rename rotate: false - xy: 287, 226 + xy: 117, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-resize rotate: false - xy: 286, 278 + xy: 474, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate rotate: false - xy: 287, 210 + xy: 133, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-arrow rotate: false - xy: 277, 194 + xy: 149, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-left rotate: false - xy: 303, 226 + xy: 165, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-right rotate: false - xy: 303, 210 + xy: 181, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save rotate: false - xy: 293, 194 + xy: 590, 290 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save-image rotate: false - xy: 297, 260 + xy: 492, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save-map rotate: false - xy: 297, 242 + xy: 464, 284 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-settings rotate: false - xy: 329, 168 + xy: 660, 337 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-terrain rotate: false - xy: 304, 278 + xy: 482, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tools rotate: false - xy: 319, 226 + xy: 590, 274 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-touch rotate: false - xy: 341, 168 + xy: 672, 387 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-touchDelete rotate: false - xy: 353, 168 + xy: 672, 375 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-trash rotate: false - xy: 319, 210 + xy: 69, 156 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-trash-16 rotate: false - xy: 315, 260 + xy: 500, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-trello rotate: false - xy: 309, 194 + xy: 85, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-tutorial rotate: false - xy: 335, 226 + xy: 101, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-undo rotate: false - xy: 322, 278 + xy: 518, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocked rotate: false - xy: 333, 242 + xy: 500, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocks rotate: false - xy: 335, 210 + xy: 117, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-wiki rotate: false - xy: 325, 194 + xy: 133, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-zoom rotate: false - xy: 351, 260 + xy: 477, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-zoom-small rotate: false - xy: 351, 226 + xy: 149, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -6236,7 +6226,7 @@ info-banner index: -1 inventory rotate: false - xy: 522, 374 + xy: 752, 437 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -6251,7 +6241,7 @@ logotext index: -1 pane rotate: false - xy: 638, 484 + xy: 524, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6259,7 +6249,7 @@ pane index: -1 pane-2 rotate: false - xy: 600, 484 + xy: 1, 17 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6267,7 +6257,7 @@ pane-2 index: -1 scroll rotate: false - xy: 600, 339 + xy: 882, 416 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -6275,7 +6265,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 752, 487 + xy: 638, 487 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -6291,7 +6281,7 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 600, 376 + xy: 65, 1 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -6299,63 +6289,63 @@ scroll-knob-vertical-black index: -1 sector-edge rotate: false - xy: 439, 416 + xy: 371, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sector-select rotate: false - xy: 473, 450 + xy: 405, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 selection rotate: false - xy: 254, 398 + xy: 303, 398 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 784, 477 + xy: 879, 417 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 507, 444 + xy: 439, 444 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 538, 444 + xy: 470, 444 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 569, 444 + xy: 501, 444 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 290, 466 + xy: 638, 484 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 714, 484 + xy: 600, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6363,7 +6353,7 @@ underline index: -1 underline-2 rotate: false - xy: 676, 484 + xy: 562, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6371,7 +6361,7 @@ underline-2 index: -1 white rotate: false - xy: 763, 368 + xy: 87, 282 size: 3, 3 orig: 3, 3 offset: 0, 0 @@ -6386,210 +6376,210 @@ window-empty index: -1 alpha-drone rotate: false - xy: 718, 368 + xy: 400, 298 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-alpha-drone rotate: false - xy: 718, 368 + xy: 400, 298 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger rotate: false - xy: 528, 228 + xy: 606, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 542, 228 + xy: 606, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 556, 228 + xy: 620, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 fortress rotate: false - xy: 964, 425 + xy: 261, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 982, 443 + xy: 89, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-base rotate: false - xy: 982, 443 + xy: 89, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1000, 461 + xy: 107, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 ghoul rotate: false - xy: 548, 320 + xy: 960, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 unit-icon-ghoul rotate: false - xy: 548, 320 + xy: 960, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 phantom rotate: false - xy: 373, 194 + xy: 67, 60 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 unit-icon-phantom rotate: false - xy: 373, 194 + xy: 67, 60 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 power-cell rotate: false - xy: 399, 226 + xy: 67, 44 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 revenant rotate: false - xy: 690, 454 + xy: 469, 414 size: 28, 28 orig: 28, 28 offset: 0, 0 index: -1 unit-icon-revenant rotate: false - xy: 690, 454 + xy: 469, 414 size: 28, 28 orig: 28, 28 offset: 0, 0 index: -1 spirit rotate: false - xy: 337, 180 + xy: 655, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-spirit rotate: false - xy: 337, 180 + xy: 655, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 titan rotate: false - xy: 538, 278 + xy: 566, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 549, 260 + xy: 564, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 458, 228 + xy: 618, 320 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 486, 228 + xy: 288, 318 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 500, 228 + xy: 600, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 500, 228 + xy: 600, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 514, 228 + xy: 614, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 113, 176 + xy: 648, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 127, 176 + xy: 648, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 155, 176 + xy: 606, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 295, 180 + xy: 613, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 365, 180 + xy: 1006, 447 size: 12, 12 orig: 12, 12 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index f444aa0c9350ecb00098be17d178dfd1fd1420eb..83413e626213c117fe97ac004f2092b1909eb3fe 100644 GIT binary patch literal 105101 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

EBYD-A5Bn=$aw{>|tmDnzet+lh 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

+*i7AK%6D;M6t-gKCD1T82L} z8D?@cY}oz%t}8>$)Bk_gPG+ch(8!Jyw|8S13{GzSqZw+o_u74?fcWG3umArveJA=r zi-GNV&zE$Df)D>sh3{L$UcXi4fxG>?iC`f2_w}HoXQGPsoW8eoHbdRp?0WdZ z%?5@B1`ctC)}xz~@|kB?=ahK8`2R?J{|kBl*@oKR%o@bwc8E#*`~UTEeK1qP$xWr@ zY1%5P4SGyDNs3w04%0;Th&ZS?Y}@|*^@&`D%44mqCX51`SdjW(4&M(5G3?uYPSN_6 z-=2`mzs_b_GhVrNZPl$Uo2O37{$hJP=)I<RI2(WBXJ-K4IpM|O;V zR?Oc%wY#F?>D6c@t)K^~EXR1*&pQeQJiKyKGwFz#Szbc9?)CG<67E~M!z?%%5G!37 z3;Oe!XXr8-WZiKI{maI;?DzZq@th6&f6m^&aDCm^)ipkk)y1_84HCU3#`pS4&qk{!)lR zme#)P#RqmgKD2M$O_m9#MY|a`h(VKw14D^2euo&{+El3f4?g?e%WnSH`AZRKXM**F_r&=n|G7*Z_4U( zVhn$3?zBiQWO^_&S9c>T!+D7rApuL9z8p$@9rDp|{$m3zA%}PWia$)RW7x&=;2uM0 zXsE0n!skpAKMzrutP`kg$5%7tYzH5u;Vw2L&C=%hI`-ow0A}~`26qR%Hm+x z@4P=}v%2rs9VMI!Obv(knQC0~^`bY!wY;FGr`_)KBS~qg+yuSgoeX* zg=4e+d|TnS_p!VRqs5it3(u|p#0dS^`6J@oX9>CLhd-w$`)?Fy6cAWd%lP4_ew|@z zc*BBMH#e*6#_ieRyq(dcn&CwHhq?8&HuY-ytOA@D0&o9LEtGaZ^n(xFRbhCdXK(Ly zV)~`!e_tO>4mW$ZFj)M4p%{bt{U0-;zR7lqFl^nr)$d_^S2@RoSf*F6Ung@n2&(r^auhW)>H z?+;c|P**>`enlkX`S@MazTI@R<@$2{XZ5r9|F1>AU-2l}Zh7x_*Mr5&&;9=N@WRDl z%|!=X`BH);IT+3dGE^XUcun5k7hyIK|9Oi; zUvCc%J!_;j)6jk!s3U&=-`o4kas*#!F}N^&c*C-enZ5t=#>dZJocVbgwBbP3w(MBt z%7gc=DQhw{q;tGD%eK3Tfg^$mzJ8N|qhWU_gU>7@V^;=`2hWe+zRJ4lOL3$C!?m

dg7`{8>UTEKT&6YJ`6=bkW9Tqf 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

-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⪚r5 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 z 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 diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index 0ec75e9725..0cea588242 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -24,7 +24,6 @@ ButtonStyle: { }, TextButtonStyle: { default: {over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: gray, down: button-down, up: button}, - left: {over: button-left-over, font: default-font, fontColor: white, disabledFontColor: gray, down: button-left-down, up: button-left}, right: {over: button-right-over, font: default-font, fontColor: white, disabledFontColor: gray, down: button-right-down, up: button-right}, wave: {font: default-font, fontColor: white, disabledFontColor: gray, up: button-edge-4}, clear: {over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray, down: pane, up: flat}, diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 6c184cca81..da1e806dc6 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -32,9 +32,22 @@ public abstract class Platform { dialog.setFillParent(true); dialog.content().top(); dialog.content().defaults().height(65f); + + TextField[] use = {null}; + + dialog.content().addImageButton("icon-copy", "clear", 16*3, () -> use[0].copy()) + .visible(() -> !use[0].getSelection().isEmpty()).width(65f); + + dialog.content().addImageButton("icon-paste", "clear", 16*3, () -> + use[0].paste(Gdx.app.getClipboard().getContents(), false)) + .visible(() -> !Gdx.app.getClipboard().getContents().isEmpty()).width(65f); + TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); to.setMaxLength(maxLength); to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); + + use[0] = to; + dialog.content().addButton("$text.ok", () -> { field.clearText(); field.appendText(to.getText()); From d25fe028b861a9dc3367505264b84546fe1a07b5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 16:23:11 -0500 Subject: [PATCH 09/42] Fixed mobile recipe switching --- core/src/io/anuke/mindustry/input/MobileInput.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index dba880f8c0..6187b738d9 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -242,8 +242,10 @@ public class MobileInput extends InputHandler implements GestureListener{ if(tile != null){ if(!request.remove){ rotation = request.rotation; + Recipe before = recipe; recipe = request.recipe; tryPlaceBlock(tile.x, tile.y); + recipe = before; }else{ tryBreakBlock(tile.x, tile.y); } From 897c296fbe6d410227b2fd1b18719c6457daea77 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 16:30:41 -0500 Subject: [PATCH 10/42] Fixed server crash --- core/src/io/anuke/mindustry/core/NetServer.java | 3 ++- core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 463eab9692..0f2028ebea 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -602,7 +602,8 @@ public class NetServer extends Module{ try{ //iterate through each player - for(Player player : playerGroup.all()){ + for(int i = 0; i < playerGroup.size(); i ++){ + Player player = playerGroup.all().get(i); if(player.isLocal) continue; NetConnection connection = player.con; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 53044715b2..4cb355edef 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -273,7 +273,7 @@ public class JoinDialog extends FloatingDialog{ local.row(); - TextButton button = local.addButton("[accent]" + host.name, () -> connect(host.address, port)) + TextButton button = local.addButton("[accent]" + host.name, "clear", () -> connect(host.address, port)) .width(w).height(80f).pad(4f).get(); button.left(); button.row(); From be48ed5589d1b142d96a04befadf0883440b0817 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 16:37:22 -0500 Subject: [PATCH 11/42] Fixed another boring layout issue --- core/src/io/anuke/mindustry/ui/fragments/HudFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index bc94461864..a0f3694477 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -351,7 +351,7 @@ public class HudFragment extends Fragment{ if(shown){ shown = false; blockfrag.toggle(dur, in); - wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + dsize + Unit.dp.scl(6)) - wavetable.getTranslation().y, 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; From d56c041c4a98b737cd430a31e598ee75fa14d3db Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Nov 2018 16:58:11 -0500 Subject: [PATCH 12/42] Fixed ground units always spawning in (-1, -1) --- core/src/io/anuke/mindustry/ai/WaveSpawner.java | 2 +- core/src/io/anuke/mindustry/core/World.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index 44c39e1b59..a75eed644d 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -10,9 +10,9 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Waves; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Events; -import io.anuke.ucore.util.Structs; import io.anuke.ucore.util.GridBits; import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Structs; import java.io.DataInput; import java.io.DataOutput; diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index cf72719411..742a8f8549 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -30,8 +30,8 @@ public class World extends Module{ public final Sectors sectors = new Sectors(); public final WorldGenerator generator = new WorldGenerator(); public final BlockIndexer indexer = new BlockIndexer(); - public final Pathfinder pathfinder = new Pathfinder(); public final WaveSpawner spawner = new WaveSpawner(); + public final Pathfinder pathfinder = new Pathfinder(); private Map currentMap; private Sector currentSector; From 99fb1a4c5fc1d11dc4d7e27e05a49aede428a77d Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 30 Nov 2018 10:28:27 -0500 Subject: [PATCH 13/42] Implemented null-items for sorters and item sources --- build.gradle | 3 +-- .../mindustry/content/blocks/DebugBlocks.java | 3 +++ .../mindustry/ui/dialogs/JoinDialog.java | 2 +- .../world/blocks/SelectionTrait.java | 21 +++++-------------- .../world/blocks/distribution/Sorter.java | 12 +++++++---- .../world/blocks/power/PowerNode.java | 2 +- .../world/blocks/storage/SortedUnloader.java | 2 +- tools/build.gradle | 1 - 8 files changed, 20 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 8e06fca630..562a981a97 100644 --- a/build.gradle +++ b/build.gradle @@ -8,12 +8,11 @@ buildscript { } dependencies { classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0' - classpath "com.badlogicgames.gdx:gdx-tools:1.9.8" + classpath "com.badlogicgames.gdx:gdx-tools:1.9.9" } } allprojects { - apply plugin: "eclipse" apply plugin: "idea" version = 'release' diff --git a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java index 9d6c8e1afc..53ac78afb1 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java @@ -92,8 +92,11 @@ public class DebugBlocks extends BlockList implements ContentList{ @Override public void update(Tile tile){ SorterEntity entity = tile.entity(); + if(entity.sortItem == null) return; + entity.items.set(entity.sortItem, 1); tryDump(tile, entity.sortItem); + entity.items.set(entity.sortItem, 0); } @Override diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 4cb355edef..5e611b762f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -156,7 +156,7 @@ public class JoinDialog extends FloatingDialog{ versionString = Bundles.get("text.server.outdated"); }else if(host.version < Version.build && Version.build != -1){ versionString = Bundles.get("text.server.outdated") + "\n" + - Bundles.format("text.server.version", host.version); + Bundles.format("text.server.version", host.version, ""); }else if(host.version > Version.build && Version.build != -1){ versionString = Bundles.get("text.server.outdated.client") + "\n" + Bundles.format("text.server.version", host.version, ""); diff --git a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java index 9c84856aac..8d31879965 100644 --- a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java +++ b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java @@ -4,43 +4,32 @@ import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.type.Item; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Supplier; -import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.style.TextureRegionDrawable; import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.layout.Table; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.control; public interface SelectionTrait{ default void buildItemTable(Table table, Supplier holder, Consumer consumer){ - buildItemTable(table, false, holder, consumer); - } - - default void buildItemTable(Table table, boolean nullItem, Supplier holder, Consumer consumer){ Array items = content.items(); ButtonGroup group = new ButtonGroup<>(); + group.setMinCheckCount(0); Table cont = new Table(); cont.defaults().size(38); int i = 0; - if(nullItem){ - ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> consumer.accept(null)).group(group).get(); - button.getStyle().imageUp = new TextureRegionDrawable(Draw.region("icon-nullitem")); - button.setChecked(holder.get() == null); - - i ++; - } - for(Item item : items){ if(!control.unlocks.isUnlocked(item)) continue; - ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> consumer.accept(item)) - .group(group).get(); + ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> {}).group(group).get(); + button.changed(() -> consumer.accept(button.isChecked() ? item : null)); button.getStyle().imageUp = new TextureRegionDrawable(item.region); button.setChecked(holder.get() == item); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index c7a5737e54..a04472a29f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -48,7 +48,9 @@ public class Sorter extends Block implements SelectionTrait{ @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void setSorterItem(Player player, Tile tile, Item item){ SorterEntity entity = tile.entity(); - if(entity != null) entity.sortItem = item; + if(entity != null){ + entity.sortItem = item; + } } @Override @@ -56,6 +58,7 @@ public class Sorter extends Block implements SelectionTrait{ super.draw(tile); SorterEntity entity = tile.entity(); + if(entity.sortItem == null) return; Draw.color(entity.sortItem.color); Draw.rect("blank", tile.worldx(), tile.worldy(), 4f, 4f); @@ -130,16 +133,17 @@ public class Sorter extends Block implements SelectionTrait{ } public static class SorterEntity extends TileEntity{ - public Item sortItem = content.item(0); + public Item sortItem; @Override public void writeConfig(DataOutput stream) throws IOException{ - stream.writeByte(sortItem.id); + stream.writeByte(sortItem == null ? -1 : sortItem.id); } @Override public void readConfig(DataInput stream) throws IOException{ - sortItem = content.items().get(stream.readByte()); + byte b = stream.readByte(); + sortItem = b == -1 ? null : content.items().get(b); } } } 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 21d50003f1..fdf1034604 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -67,7 +67,7 @@ public class PowerNode extends PowerBlock{ @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void unlinkPowerNodes(Player player, Tile tile, Tile other){ - if(tile.entity.power == null) return; + if(tile.entity.power == null || other.entity == null || other.entity.power == null) return; TileEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java index dd7374536a..222efc9c4b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java @@ -65,7 +65,7 @@ public class SortedUnloader extends Unloader implements SelectionTrait{ @Override public void buildTable(Tile tile, Table table){ SortedUnloaderEntity entity = tile.entity(); - buildItemTable(table, true, () -> entity.sortItem, item -> Call.setSortedUnloaderItem(null, tile, item)); + buildItemTable(table, () -> entity.sortItem, item -> Call.setSortedUnloaderItem(null, tile, item)); } @Override diff --git a/tools/build.gradle b/tools/build.gradle index 876fa569c8..b7e87d5fb1 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -3,7 +3,6 @@ apply plugin: "java" sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = [ "src/" ] - import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.tools.texturepacker.TexturePacker From 9ab3f7e5aa616b17ac4876dd9ca35ac232cd9fe1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 30 Nov 2018 13:20:15 -0500 Subject: [PATCH 14/42] Crash fix --- core/src/io/anuke/mindustry/core/Platform.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index da1e806dc6..0064c066c3 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -40,7 +40,7 @@ public abstract class Platform { dialog.content().addImageButton("icon-paste", "clear", 16*3, () -> use[0].paste(Gdx.app.getClipboard().getContents(), false)) - .visible(() -> !Gdx.app.getClipboard().getContents().isEmpty()).width(65f); + .visible(() -> Gdx.app.getClipboard() != null && Gdx.app.getClipboard().getContents() != null && !Gdx.app.getClipboard().getContents().isEmpty()).width(65f); TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); to.setMaxLength(maxLength); From 58b87aa999053e21885cb4cfdb3e43d1d3252938 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 30 Nov 2018 13:49:43 -0500 Subject: [PATCH 15/42] Additional crash fixes --- core/src/io/anuke/mindustry/net/NetworkIO.java | 2 +- core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 6e7687948e..3adc617b51 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -298,7 +298,7 @@ public class NetworkIO{ int maxlen = 32; String host = (headless ? "Server" : players[0].name); - String map = world.getMap().name; + String map = world.getMap() == null ? "None" : world.getMap().name; host = host.substring(0, Math.min(host.length(), maxlen)); map = map.substring(0, Math.min(map.length(), maxlen)); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java index e1c9001874..31496a5e3a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java @@ -41,17 +41,10 @@ public class AdminsDialog extends FloatingDialog{ ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> { netServer.admins.unAdminPlayer(info.id); playerGroup.forEach(player -> { - if(player.uuid.equals(info.id)){ + if(player != null && player.uuid != null && player.uuid.equals(info.id)){ player.isAdmin = false; } }); - /* - for(Player player : playerGroup.all()){ - if(player.con != null){ - player.isAdmin = false; - break; - } - }*/ setup(); }); }).size(h).pad(-14f); From 7ec6586c4a21fb75e97c07697c8ed2cac793bba3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 30 Nov 2018 15:14:27 -0500 Subject: [PATCH 16/42] Line power nodes --- .../world/blocks/distribution/Sorter.java | 4 +--- .../world/blocks/power/PowerNode.java | 19 +++---------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index a04472a29f..a541d53aee 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -40,9 +40,7 @@ public class Sorter extends Block implements SelectionTrait{ @Override public void playerPlaced(Tile tile){ - if(lastItem != null){ - threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem)); - } + threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem)); } @Remote(targets = Loc.both, called = Loc.both, forward = 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 fdf1034604..b20f167214 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -249,23 +249,10 @@ public class PowerNode extends PowerBlock{ x2 += t2.x; y2 += t2.y; - float space = Vector2.dst(x1, y1, x2, y2); - float scl = 4f, mag = 2f, tscl = 4f, segscl = 3f; + Draw.color(Palette.powerLight, Palette.power, Mathf.absin(Timers.time(), 8f, 1f)); + Lines.stroke(2f); + Lines.line(x1, y1, x2, y2); - int segments = Mathf.ceil(space / segscl); - - Draw.color(Palette.power, Palette.powerLight, Mathf.absin(Timers.time(), 5f, 1f)); - Lines.stroke(1f); - - for(int i = 0; i < segments; i++){ - float f1 = (float)i / segments; - float f2 = (float)(i+1) / segments; - t1.trns(angle1 + 90f, Mathf.lerp(Mathf.sin(tile.entity.id * 124f + Timers.time()/tscl + f1 * space, scl, mag), 0f, Math.abs(f1 - 0.5f)*2f)); - t2.trns(angle1 + 90f, Mathf.lerp(Mathf.sin(tile.entity.id * 124f + Timers.time()/tscl + f2 * space, scl, mag), 0f, Math.abs(f2 - 0.5f)*2f)); - - Lines.line(x1 + (x2 - x1) * f1 + t1.x, y1 + (y2 - y1) * f1 + t1.y, - x1 + (x2 - x1) * f2 + t2.x, y1 + (y2 - y1) * f2 + t2.y); - } } } From 56ef7ae60c4e0b8893e2b4babcdf7d3eb598b8b6 Mon Sep 17 00:00:00 2001 From: elmenda452 <44818832+elmenda452@users.noreply.github.com> Date: Fri, 30 Nov 2018 21:16:54 +0100 Subject: [PATCH 17/42] Update bundle_es.properties (#360) It was strangely hard to find the (Constructing) translation... (for block.constructing), but anyway I finally found it --- core/assets/bundles/bundle_es.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index a8d9fa9b3e..cd975d0fb1 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -493,7 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Hablidad: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} -block.constructing = {0}\n[LIGHT_GRAY](Constructing) +block.constructing = {0}\n[LIGHT_GRAY](Construyendo) block.spawn.name = Punto de generación block.core.name = Núcleo block.metalfloor.name = Suelo de Metal From 51475d600c743b7bf00386c89ea0b424b3b4a29f Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 30 Nov 2018 17:48:09 -0500 Subject: [PATCH 18/42] iOS fix --- build.gradle | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 562a981a97..ba398346bf 100644 --- a/build.gradle +++ b/build.gradle @@ -104,17 +104,19 @@ project(":ios") { apply plugin: "robovm" task copyGen{ - copy{ - from ("core/build/classes/java/main/io/anuke/mindustry/gen/"){ - include "**/*.java" - } + doLast { + copy { + from("../core/build/classes/java/main/io/anuke/mindustry/gen/") { + include "**/*.java" + } - into "core/src/io/anuke/mindustry/gen" + into "../core/src/io/anuke/mindustry/gen" + } } doFirst{ delete{ - delete "core/src/io/anuke/mindustry/gen/" + delete "../core/src/io/anuke/mindustry/gen/" } } } @@ -132,7 +134,7 @@ project(":ios") { props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher' props['app.executable'] = 'IOSLauncher' props['app.name'] = 'Mindustry' - props['app.build'] = (!props.hasProperty("app.build") ? 40 : props['app.build'].toInteger() + 1)+"" + props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1)+"" props.store(vfile.newWriter(), null) } @@ -148,7 +150,7 @@ project(":ios") { compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios" - compileOnly project(":annotations") + //compileOnly project(":annotations") } } From 236e3c7e6109f03cdd20ab7ade4b8fd934b56102 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 30 Nov 2018 23:12:48 -0500 Subject: [PATCH 19/42] Added wet shocking --- .gitignore | 1 + .../mindustry/content/StatusEffects.java | 20 ++++++++++++++++++- .../content/bullets/TurretBullets.java | 2 ++ .../mindustry/entities/effect/Lightning.java | 1 - 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 20247e61be..611dd73e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ logs/ /ios/src/io/anuke/mindustry/gen/ /core/src/io/anuke/mindustry/gen/ ios/robovm.properties +config/ *.gif version.properties diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index a6e569e48f..c1671f481f 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -11,7 +11,7 @@ import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Mathf; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded; + public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked; @Override public void load(){ @@ -65,6 +65,17 @@ public class StatusEffects implements ContentList{ speedMultiplier = 0.9f; } + @Override + public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result){ + if(to == shocked){ + //get shocked when wet + unit.damage(15f); + return result.set(this, time); + } + + return super.getTransition(unit, to, time, newTime, result); + } + @Override public void update(Unit unit, float time){ if(Mathf.chance(Timers.delta() * 0.15f)){ @@ -145,6 +156,13 @@ public class StatusEffects implements ContentList{ } }; + shocked = new StatusEffect(1f){ + { + armorMultiplier = 3f; + } + }; + + wet.setOpposites(shocked); melting.setOpposites(wet, freezing); wet.setOpposites(burning); freezing.setOpposites(burning, melting); diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index 2b28ec0016..8cd8d02a08 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -39,6 +39,8 @@ public class TurretBullets extends BulletList implements ContentList{ lifetime = Lightning.lifetime; hiteffect = BulletFx.hitLancer; despawneffect = Fx.none; + status = StatusEffects.shocked; + statusIntensity = 1f; } }; diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index d6ccaaf50f..1cf162f286 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -91,7 +91,6 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time x += Angles.trnsx(rotation, hitRange/2f); y += Angles.trnsy(rotation, hitRange/2f); } - } } From 17432d1f94b2c52de7e37d3690ebc08af616ac0e Mon Sep 17 00:00:00 2001 From: VizardAlpha <43859764+VizardAlpha@users.noreply.github.com> Date: Sat, 1 Dec 2018 17:22:28 +0100 Subject: [PATCH 20/42] Update bundle_fr_BE.properties (#361) * Update bundle_fr_BE.properties * Updates bundle_fr_BE.properties --- core/assets/bundles/bundle_fr_BE.properties | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 1abdc7f293..1e2cf89a15 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -349,6 +349,7 @@ text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense text.category.optional = Améliorations facultatives +setting.indicators.name = Indicateurs d'alliés setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = Vide @@ -437,9 +438,9 @@ item.silicon.description = Un matériau semi-conducteur extrêmement utile, avec item.plastanium.name = Plastanium item.plastanium.description = Un matériau léger et docile utilisé dans l'aviation avancée et dans les munitions à fragmentation. item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.phase-fabric.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 = An advanced alloy with unique electrical properties. +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.sand.name = Sable @@ -463,7 +464,7 @@ mech.delta-mech.description = Un mécha rapide avec une armure légère fait pou mech.tau-mech.name = Tau mech.tau-mech.weapon = Laser restructurant mech.tau-mech.ability = Explosion réparante -mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence. +mech.tau-mech.description = Le support technique. Soigne les blocs alliés en leur tirant dessus. Peut soigner les alliés dans un rayon grâce à sa capacité de réparation. mech.omega-mech.name = Omega mech.omega-mech.weapon = Essaim de missiles auto-guidés mech.omega-mech.ability = Armure From 3397d6c907358e55161239418e368fcd9e6e5f08 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Dec 2018 12:03:18 -0500 Subject: [PATCH 21/42] Misc bug/crash fixes --- core/assets/ui/uiskin.json | 1 + core/src/io/anuke/mindustry/ai/WaveSpawner.java | 8 ++++---- .../src/io/anuke/mindustry/editor/MapEditorDialog.java | 6 +++--- core/src/io/anuke/mindustry/input/InputHandler.java | 2 +- core/src/io/anuke/mindustry/io/TypeIO.java | 5 +++++ .../src/io/anuke/mindustry/ui/dialogs/FileChooser.java | 10 +++------- .../mindustry/world/blocks/distribution/Sorter.java | 2 +- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index 0cea588242..6ca21b566a 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -32,6 +32,7 @@ TextButtonStyle: { clear-partial: {down: white, up: button-select, over: flat-down, font: default-font, fontColor: white, disabledFontColor: gray }, clear-partial-2: {down: flat-over, up: none, over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray }, empty: {font: default-font}, + clear-toggle: {font: default-font, fontColor: white, checked: flat-down, down: flat-down, up: flat, over: flat-over, disabled: flat, disabledFontColor: gray } toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: gray } }, ImageButtonStyle: { diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index a75eed644d..7a7d58fc14 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -21,7 +21,7 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.*; public class WaveSpawner{ - private static final int quadsize = 4; + private static final int quadsize = 6; private GridBits quadrants; @@ -164,7 +164,7 @@ public class WaveSpawner{ for(int y = quady * quadsize; y < world.height() && y < (quady + 1) * quadsize; y++){ Tile tile = world.tile(x, y); - if(tile == null || tile.solid() || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE){ + if(tile == null || tile.solid() || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE || tile.floor().isLiquid){ setQuad(quadx, quady, false); break outer; } @@ -217,8 +217,8 @@ public class WaveSpawner{ //TODO instead of randomly scattering locations around the map, find spawns close to each other private void findLocation(GroundSpawn spawn){ - spawn.x = -1; - spawn.y = -1; + spawn.x = Mathf.random(quadWidth()-1); + spawn.y = Mathf.random(quadHeight()-1); int shellWidth = quadWidth() * 2 + quadHeight() * 2 * 6; shellWidth = Math.min(quadWidth() * quadHeight() / 4, shellWidth); diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 12a75b9496..90d18ac61e 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -567,16 +567,16 @@ public class MapEditorDialog extends Dialog implements Disposable{ button.getImage().remove(); button.update(() -> button.setChecked(editor.getDrawBlock() == block)); group.add(button); - content.add(button).size(60f); + content.add(button).size(50f); - if(i++ % 3 == 2){ + if(++i % 4 == 0){ content.row(); } } group.getButtons().get(2).setChecked(true); - table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center()).growX(); + table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(200f).center()).growX(); table.row(); table.add(pane).growY().fillX(); } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 111b2f9718..ac8007737c 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -95,7 +95,7 @@ public abstract class InputHandler extends InputAdapter{ ItemTransfer.create(item, player.x + Angles.trnsx(player.rotation + 180f, backTrns), player.y + Angles.trnsy(player.rotation + 180f, backTrns), new Translator(tile.drawx() + stackTrns.x, tile.drawy() + stackTrns.y), () -> { - if(tile.block() != block || tile.entity == null) return; + if(tile.block() != block || tile.entity == null || tile.entity.items == null) return; tile.block().handleStack(item, removed, tile, player); remaining[1] -= removed; diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 0463346256..2d0f9feb08 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -53,6 +53,10 @@ public class TypeIO{ @WriteClass(Unit.class) public static void writeUnit(ByteBuffer buffer, Unit unit){ + if(unit.getGroup() == null){ + buffer.put((byte)-1); + return; + } buffer.put((byte) unit.getGroup().getID()); buffer.putInt(unit.getID()); } @@ -60,6 +64,7 @@ public class TypeIO{ @ReadClass(Unit.class) public static Unit readUnit(ByteBuffer buffer){ byte gid = buffer.get(); + if(gid == -1) return null; int id = buffer.getInt(); return (Unit) Entities.getGroup(gid).getByID(id); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java index be56e08427..fd94891b8c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java @@ -38,10 +38,6 @@ public class FileChooser extends FloatingDialog{ private Consumer selectListener; private boolean open; - public FileChooser(String title, boolean open, Consumer result){ - this(title, defaultFilter, open, result); - } - public FileChooser(String title, Predicate filter, boolean open, Consumer result){ super(title); this.open = open; @@ -127,7 +123,7 @@ public class FileChooser extends FloatingDialog{ updateFiles(true); }); - icontable.defaults().height(50).growX().uniform(); + icontable.defaults().height(50).growX().padTop(5).uniform(); icontable.add(home); icontable.add(back); icontable.add(forward); @@ -202,7 +198,7 @@ public class FileChooser extends FloatingDialog{ //macs are confined to the Downloads/ directory if(!OS.isMac){ Image upimage = new Image("icon-folder-parent"); - TextButton upbutton = new TextButton(".." + directory.toString()); + TextButton upbutton = new TextButton(".." + directory.toString(), "clear"); upbutton.clicked(() -> { directory = directory.parent(); updateFiles(true); @@ -224,7 +220,7 @@ public class FileChooser extends FloatingDialog{ String filename = file.name(); - TextButton button = new TextButton(shorten(filename), "toggle"); + TextButton button = new TextButton(shorten(filename), "clear"); group.add(button); button.clicked(() -> { diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index a541d53aee..d8e5b57594 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -4,6 +4,7 @@ import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -12,7 +13,6 @@ import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Mathf; -import io.anuke.mindustry.gen.Call; import java.io.DataInput; import java.io.DataOutput; From 5afb5d24d83b636291b8059cb3b32b956651bf20 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Dec 2018 13:57:13 -0500 Subject: [PATCH 22/42] Wave preset changes --- core/src/io/anuke/mindustry/game/Waves.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/src/io/anuke/mindustry/game/Waves.java b/core/src/io/anuke/mindustry/game/Waves.java index 4da4c37701..12fe04c959 100644 --- a/core/src/io/anuke/mindustry/game/Waves.java +++ b/core/src/io/anuke/mindustry/game/Waves.java @@ -96,6 +96,14 @@ public class Waves{ max = 10; }}, + new SpawnGroup(UnitTypes.fortress){{ + begin = 40; + spacing = 5; + unitAmount = 2; + unitScaling = 3; + max = 10; + }}, + new SpawnGroup(UnitTypes.dagger){{ begin = 35; spacing = 3; @@ -134,6 +142,15 @@ public class Waves{ max = 8; }}, + new SpawnGroup(UnitTypes.revenant){{ + begin = 50; + unitAmount = 4; + unitScaling = 3; + spacing = 5; + groupAmount = 2; + max = 8; + }}, + new SpawnGroup(UnitTypes.ghoul){{ begin = 53; unitAmount = 2; From e33c863162bd5cf65e0a0a14e86579ac2c314dd6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Dec 2018 16:56:44 -0500 Subject: [PATCH 23/42] Bugfixes --- core/assets/bundles/bundle.properties | 2 +- core/src/io/anuke/mindustry/ai/BlockIndexer.java | 4 ++-- core/src/io/anuke/mindustry/core/NetServer.java | 2 +- core/src/io/anuke/mindustry/entities/TileEntity.java | 4 ++++ .../mindustry/maps/missions/MissionWithStartingCore.java | 7 +++++++ core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java | 1 + .../anuke/mindustry/ui/fragments/PlayerListFragment.java | 2 +- 7 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 55a215f9cc..bff7ab1003 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -133,7 +133,7 @@ text.confirmunban = Are you sure you want to unban this player? text.confirmadmin = Are you sure you want to make this player an admin? text.confirmunadmin = Are you sure you want to remove admin status from this player? text.joingame.title = Join Game -text.joingame.ip = IP: +text.joingame.ip = Address: text.disconnect = Disconnected. text.disconnect.data = Failed to load world data! text.connecting = [accent]Connecting... diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 6777c40d9c..8bc2d080d9 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -86,7 +86,7 @@ public class BlockIndexer{ process(tile); - if(tile.entity != null && tile.entity.healthf() < 0.9999f){ + if(tile.entity != null && tile.entity.damaged()){ notifyTileDamaged(tile.entity); } } @@ -116,7 +116,7 @@ public class BlockIndexer{ ObjectSet set = damagedTiles[team.ordinal()]; for(Tile tile : set){ - if(tile.entity == null || tile.entity.getTeam() != team || tile.entity.healthf() >= 0.9999f){ + if(tile.entity == null || tile.entity.getTeam() != team || !tile.entity.damaged()){ returnArray.add(tile); } } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 589d24f34e..eb019eca50 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -381,7 +381,7 @@ public class NetServer extends Module{ return; } - if(other == null || (other.isAdmin && other != player)){ //fun fact: this means you can ban yourself + if(other == null || ((other.isAdmin && !player.isLocal) && other != player)){ Log.err("{0} attempted to perform admin action on nonexistant or admin player.", player.name); return; } diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index 10aec5f47b..7df1e6d659 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -154,6 +154,10 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ } } + public boolean damaged(){ + return health < maxHealth() - 0.00001f; + } + public Tile getTile(){ return tile; } diff --git a/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java b/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java index 1dbb2b81a3..a134891329 100644 --- a/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java +++ b/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java @@ -42,6 +42,13 @@ public abstract class MissionWithStartingCore extends Mission{ startingCoreTile.setBlock(StorageBlocks.core); startingCoreTile.setTeam(team); state.teams.get(team).cores.add(startingCoreTile); + + //makes sure there's a flat area around core + for(int dx = -2; dx <= 2; dx++){ + for(int dy = -2; dy <= 2; dy++){ + gen.tiles[startingCoreTile.x + dx][startingCoreTile.y + dy].setElevation(startingCoreTile.getElevation()); + } + } } /** diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 5e611b762f..c81c77e13b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -268,6 +268,7 @@ public class JoinDialog extends FloatingDialog{ if(totalHosts == 0){ local.clear(); } + local.background((Drawable) null); totalHosts ++; float w = targetWidth(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index 03864af7ca..d9876ef1b3 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -116,7 +116,7 @@ public class PlayerListFragment extends Fragment{ t.row(); - t.addImageButton("icon-admin", "clear-toggle", 14 * 2, () -> { + t.addImageButton("icon-admin", "clear-toggle-partial", 14 * 2, () -> { if(Net.client()) return; String id = player.uuid; From 9c012560294532d9bcd8067d97ed34e72b411a52 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Dec 2018 17:04:55 -0500 Subject: [PATCH 24/42] Output cleanup --- core/src/io/anuke/mindustry/core/NetServer.java | 1 + kryonet/src/io/anuke/kryonet/KryoServer.java | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index eb019eca50..6b71668db5 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -281,6 +281,7 @@ public class NetServer extends Module{ } player.remove(); netServer.connections.remove(player.con.id); + Log.info("&lc{0} has disconnected.", player.name); } private static float compound(float speed, float drag){ diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 334abab5ab..0320c91416 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -62,7 +62,7 @@ public class KryoServer implements ServerProvider { c.id = kn.id; c.addressTCP = ip; - Log.info("&bRecieved connection: {0} / {1}. Kryonet ID: {2}", c.id, c.addressTCP, connection.getID()); + Log.info("&bRecieved connection: {0}", c.addressTCP); connections.add(kn); threads.runDelay(() -> Net.handleServerReceived(kn.id, c)); @@ -76,8 +76,6 @@ public class KryoServer implements ServerProvider { Disconnect c = new Disconnect(); c.id = k.id; - Log.info("&bLost connection: {0}", k.id); - threads.runDelay(() -> { Net.handleServerReceived(k.id, c); connections.remove(k); From 6d59fe30805442931868100c75635515ba0a1fd1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Dec 2018 10:33:50 -0500 Subject: [PATCH 25/42] Bugfixes --- .../io/anuke/mindustry/content/bullets/TurretBullets.java | 2 +- core/src/io/anuke/mindustry/input/MobileInput.java | 4 ++++ .../io/anuke/mindustry/ui/fragments/PlacementFragment.java | 7 +++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index 8cd8d02a08..3b356f3251 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -73,7 +73,7 @@ public class TurretBullets extends BulletList implements ContentList{ super.hit(b); tile = tile.target(); - if(tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ + if(tile != null && tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ Effects.effect(BlockFx.healBlockFull, Palette.heal, tile.drawx(), tile.drawy(), tile.block().size); tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth()); } diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 6187b738d9..314d20819e 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -598,6 +598,10 @@ public class MobileInput extends InputHandler implements GestureListener{ showGuide("construction"); } + if(recipe == null && mode == placing){ + mode = none; + } + //automatically switch to placing after a new recipe is selected if(lastRecipe != recipe && mode == breaking && recipe != null){ mode = placing; diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 0ed4a6d9b6..d3ad336dc2 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -36,9 +36,11 @@ public class PlacementFragment extends Fragment{ Tile hoverTile; Table blockTable, toggler, topTable; boolean shown = true; + boolean lastGround; public PlacementFragment(){ Events.on(WorldLoadGraphicsEvent.class, event -> { + currentCategory = Category.turret; Group group = toggler.getParent(); toggler.remove(); build(group); @@ -109,13 +111,14 @@ public class PlacementFragment extends Fragment{ frame.table("button-edge-2", top -> { topTable = top; top.add(new Table()).growX().update(topTable -> { - if((tileDisplayBlock() == null && lastDisplay == getSelected()) || - (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return; + if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) || + (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock() && lastGround)) return; topTable.clear(); topTable.top().left().margin(5); lastDisplay = getSelected(); + lastGround = tileDisplayBlock() != null; if(lastDisplay != null){ //show selected recipe topTable.table(header -> { From 989034c7996732b7b38407af2172132d0363a3a1 Mon Sep 17 00:00:00 2001 From: Skybbles // L5474 Date: Mon, 3 Dec 2018 12:46:31 -0500 Subject: [PATCH 26/42] Made Unloader have the same "memory" as the sorter (#366) I implemented the same 'memory' feature as the sorter's, introduced in b62. It's sort of under the 'sorter' category in terms of features, so I thought it would be logical to do so. --- .../world/blocks/storage/SortedUnloader.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java index 222efc9c4b..a0e1545255 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java @@ -17,15 +17,22 @@ import java.io.DataOutput; import java.io.IOException; import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.threads; public class SortedUnloader extends Unloader implements SelectionTrait{ protected float speed = 1f; + private static Item lastItem; public SortedUnloader(String name){ super(name); configurable = true; } + @Override + public void playerPlaced(Tile tile){ + threads.runDelay(() -> Call.setSortedUnloaderItem(null, tile, lastItem)); + } + @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void setSortedUnloaderItem(Player player, Tile tile, Item item){ SortedUnloaderEntity entity = tile.entity(); @@ -65,7 +72,10 @@ public class SortedUnloader extends Unloader implements SelectionTrait{ @Override public void buildTable(Tile tile, Table table){ SortedUnloaderEntity entity = tile.entity(); - buildItemTable(table, () -> entity.sortItem, item -> Call.setSortedUnloaderItem(null, tile, item)); + buildItemTable(table, () -> entity.sortItem, item -> { + lastItem = item; + Call.setSortedUnloaderItem(null, tile, item); + }); } @Override From 004ad0eb8c4688855a511399beb1382c5a8f5b92 Mon Sep 17 00:00:00 2001 From: Predator127 <41844491+Predator127@users.noreply.github.com> Date: Mon, 3 Dec 2018 15:46:48 -0200 Subject: [PATCH 27/42] PT-BR updated (#365) --- core/assets/bundles/bundle_pt_BR.properties | 632 ++++++++++---------- 1 file changed, 316 insertions(+), 316 deletions(-) diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index d663e8f5ac..cb44f65e08 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -2,15 +2,15 @@ text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[ text.credits = Creditos text.discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês) text.link.discord.description = O discord oficial do Mindustry -text.link.github.description = Game source code +text.link.github.description = Codigo fonte do jogo. text.link.dev-builds.description = Desenvolvimentos Instaveis text.link.trello.description = Trello Oficial para Updates Planejados text.link.itch.io.description = Pagina da Itch.io com os Downloads -text.link.google-play.description = Google Play store listing +text.link.google-play.description = Listamento do google play store text.link.wiki.description = Wiki oficial do Mindustry text.linkfail = Falha ao abrir o link\nO Url foi copiado text.gameover = O núcleo foi destruído. -text.gameover.pvp = The[accent] {0}[] team is victorious! +text.gameover.pvp = O time[accent] {0}[] É vitorioso! text.sector.gameover = Esse setor foi perdido! Soltar Novamente? text.sector.retry = Tentar novamente? text.highscore = [YELLOW]Novo recorde! @@ -20,11 +20,11 @@ text.level.delete.title = Confirmar exclusão text.map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? text.level.select = Seleção de Fase text.level.mode = Modo de Jogo: -text.construction.desktop = Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[]. +text.construction.desktop = Os controles do Desktop foram Mudados.\nPara descelecionar um bloco ou parar de construir, [accent]Use espaço.[]. text.construction.title = Guia de contrução de blocos -text.construction = You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left. +text.construction =Você selecionou [accent]Modo de construção de blocos[].\n\nPara começar a colocar, Simplesmente clique um lugar valido perto de sua nave.\nUma vez que você selecionou alguns blocos, Clique na caixa para confirmar, E sua nave vai começar a construi-los.\n\n- [accent]Remova blocos[] De sua seleção clicando neles.\n- [accent]Mude a seleção[] Segurando e arrastando qualquer bloco na seleção.\n- [accent]Coloque os blocos em linha[] Clicando e segurando em um lugar vazio e arrastando em uma direção.\n- [accent]Cancele a construção ou seleção[] Pressionando X no canto esquerdo. text.deconstruction.title = Block Deconstruction Guide -text.deconstruction = You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left. +text.deconstruction = Você selecionou [accent]O modo de destruição de blocos[].\n\nPara Começar a quebrar, Simplesmente clique num bloco perto da nave.\nQuando tiver selecionados alguns blocos, Aperte a caixa para confirmar, E sua nave vai começar a construir.\n\n- [accent]Remova blocos[] De sua seleção clicando neles.\n- [accent]Remova blocos em uma area[] Clicando e Apertando um lugar vazio então arraste numa direção.\n- [accent]Cancele a construção ou Seleção[] Apertando X no canto Esquerdo. text.showagain = Não mostrar na proxima sessão text.coreattack = < A base está sobre ataque! > text.unlocks = Desbloqueados @@ -37,31 +37,31 @@ text.sectors = Setores text.sector = Setor Selecionado: [LIGHT_GRAY]{0} text.sector.time = Tempo: [LIGHT_GRAY]{0} text.sector.deploy = Soltar -text.sector.abandon = Abandon -text.sector.abandon.confirm = Are you sure you want to abandon all progress at this sector?\nThis cannot be undone! +text.sector.abandon = Abandonar +text.sector.abandon.confirm = Certeza que quer abandonar seu progresso nesse setor?\nThis cannot be undone! text.sector.resume = Voltar -text.sector.locked = [scarlet][[Incomplete] -text.sector.unexplored = [accent][[Unexplored] -text.missions = Missions:[LIGHT_GRAY] {0} +text.sector.locked = [scarlet][[Não liberado] +text.sector.unexplored = [accent][[Inexplorado] +text.missions = Missões:[LIGHT_GRAY] {0} text.mission = Missão:[LIGHT_GRAY] {0} -text.mission.main = Main Mission:[LIGHT_GRAY] {0} -text.mission.info = Mission Info -text.mission.complete = Mission complete! -text.mission.complete.body = Sector {0},{1} has been conquered. +text.mission.main = Missão principal:[LIGHT_GRAY] {0} +text.mission.info = Info da missão +text.mission.complete = Missão completa! +text.mission.complete.body = Setor {0},{1} Foi conquistado. text.mission.wave = Sobrevive [accent]{0}/{1}[] Onda\nOnda em {2} -text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies -text.mission.wave.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy -text.mission.wave.menu = Survive[accent] {0} []waves +text.mission.wave.enemies = Sobreviva[accent] {0}/{1} []ondas\n{2} inimigos +text.mission.wave.enemy = Sobreviva[accent] {0}/{1} []Ondas\n{2} Inimigos +text.mission.wave.menu = Sobreviva[accent] {0} []Ondas text.mission.battle = Destrua a base inimiga. -text.mission.resource.menu = Obtain {0} x{1} -text.mission.resource = Obtain {0}:\n[accent]{1}/{2}[] -text.mission.block = Create {0} -text.mission.unit = Create {0} Unit -text.mission.command = Send Command {0} To Units -text.mission.linknode = Link Power Node -text.mission.display = [accent]Mission:\n[LIGHT_GRAY]{0} -text.mission.mech = Switch to mech[accent] {0}[] -text.mission.create = Create[accent] {0}[] +text.mission.resource.menu = Obtenha {0} x{1} +text.mission.resource = Obtenha {0}:\n[accent]{1}/{2}[] +text.mission.block = Criar {0} +text.mission.unit = Criar {0} Unidade +text.mission.command = Enviar comando {0} As unidades +text.mission.linknode = Ligar nodo de energia +text.mission.display = [accent]Missão:\n[LIGHT_GRAY]{0} +text.mission.mech = Trocar para Meca[accent] {0}[] +text.mission.create = Criar[accent] {0}[] text.none = text.close = Fechar text.quit = Sair @@ -71,16 +71,16 @@ text.nextmission = Próxima Missão text.maps.none = [LIGHT_GRAY]Nenhum Mapa Encontrado! text.about.button = Sobre text.name = Nome: -text.filename = File Name: +text.filename = Nome do arquivo: text.unlocked = Novo bloco Desbloqueado! text.unlocked.plural = Novos Blocos desbloqueados! text.players = {0} Jogadores Ativos text.players.single = {0} Jogador Ativo text.server.closing = [accent]Fechando servidor... text.server.kicked.kick = Voce foi expulso do servidor! -text.server.kicked.serverClose = Server closed. -text.server.kicked.sectorComplete = Sector completed. -text.server.kicked.sectorComplete.text = Your mission is complete.\nThe server will now continue at the next sector. +text.server.kicked.serverClose = Servidor Fechado. +text.server.kicked.sectorComplete = Setor completo. +text.server.kicked.sectorComplete.text = Sua missão esta completa.\nO servidor vai continuar no proximo setor. text.server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! text.server.kicked.serverOutdated = Servidor desatualiado! Peca ao dono para atualizar! text.server.kicked.banned = Voce foi banido do servidor. @@ -90,9 +90,9 @@ text.server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero. text.server.kicked.idInUse = Voce ja esta neste servidor! Conectar com duas contas não é permitido. text.server.kicked.customClient = Este servidor não suporta construções customizadas. Baixe a versão original. text.host.info = The [accent]Hospedar[]Botão Hopeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall -text.join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. +text.join.info = Aqui, Você pode entar em um [accent]IP De servidor[] Para conectar, Ou descobrir [accent]Servidores[] Da rede local.\nAmbos os servidores LAN e WAN São suportados.\n\n[LIGHT_GRAY]Note: Não tem uma lista de servidores automaticos; Se você quer conectar ao IP de alguem, Você precisa pedir o IP Ao Rosteador. text.hostserver = Hospedar servidor -text.hostserver.mobile = Host\nGame +text.hostserver.mobile = Hospedar\nJogo text.host = Hospedar text.hosting = [accent]Abrindo server... text.hosts.refresh = atualizar @@ -103,7 +103,7 @@ text.host.invalid = [scarlet]Não foi possivel Hospedar. text.trace = Traçar jogador text.trace.playername = Nome do jogador: [accent]{0} text.trace.ip = IP: [accent]{0} -text.trace.id = Unique ID: [accent]{0} +text.trace.id = ID unico: [accent]{0} text.trace.android = Cliente Androide: [accent]{0} text.trace.modclient = Cliente Customizado: [accent]{0} text.trace.totalblocksbroken = Blocos totais quebrados: [accent]{0} @@ -125,7 +125,7 @@ text.server.outdated.client = [crimson]Cliente desatualizado![] text.server.version = [lightgray]Versão: {0} text.server.custombuild = [yellow]Construção customizada text.confirmban = Certeza que quer banir este jogador? -text.confirmkick = Are you sure you want to kick this player? +text.confirmkick = Certeza que quer kickar o jogador? text.confirmunban = Certeza que quer desbanir este jogador? text.confirmadmin = Certeza que quer fazer este jogador um administrador? text.confirmunadmin = Certeza que quer remover o estatus de adminstrador deste jogador? @@ -201,9 +201,9 @@ text.builtin = Built-In text.map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser desfeito! text.map.random = [accent]Mapa aleatório text.map.nospawn = Esse mapa não contém um [yellow]core[] para o jogador Nascer! [ROYAL]blue[] Coloque um [yellow]core[] no editor de mapa. -text.map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor. -text.map.invalid = Error loading map: corrupted or invalid map file. -text.editor.brush = Brush +text.map.nospawn.pvp = Esse mapa não tem cores inimigos para os jogadores nascerem! Adicione[SCARLET] Cores vermelhos[] no mapa no editor. +text.map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. +text.editor.brush = Pincel text.editor.slope = \\ text.editor.openin = Abrir no Editor text.editor.oregen = Geração de minério @@ -260,13 +260,13 @@ text.editor = Editor text.mapeditor = Editor de mapa text.donate = Doar text.connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} -text.error.unreachable = Server unreachable. -text.error.invalidaddress = Invalid address. -text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -text.error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -text.error.alreadyconnected = Already connected. -text.error.mapnotfound = Map file not found! -text.error.any = Unkown network error. +text.error.unreachable = Servidor inalcançavel. +text.error.invalidaddress = Endereço invalido. +text.error.timedout = Desconectado!\nTenha certeza que o Rosteador tenha feito Port forwading, E que o indereço esteja correto! +text.error.mismatch = Erro de pacote:\nPossivel versão do cliente/Servidor incompatibilidade.\nTenha certeza que você e o host tenham a ultima versão! +text.error.alreadyconnected = Já conectado. +text.error.mapnotfound = Arquivo de mapa não encontrado! +text.error.any = Erro de rede desconhecido. text.settings.language = Linguagem text.settings.reset = Restaurar Padrões text.settings.rebind = Religar @@ -274,12 +274,12 @@ text.settings.controls = Controles text.settings.game = Jogo text.settings.sound = Som text.settings.graphics = Gráficos -text.settings.cleardata = Clear Game Data... -text.settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! -text.settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -text.settings.clearsectors = Clear Sectors -text.settings.clearunlocks = Clear Unlocks -text.settings.clearall = Clear All +text.settings.cleardata = Data do jogo limpa... +text.settings.clear.confirm = Certeza que quer limpar a data?\nOque é feito não pode ser desfeito! +text.settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. +text.settings.clearsectors = Limpar setores +text.settings.clearunlocks = Limpar liberados +text.settings.clearall = Limpar tudo text.paused = Pausado text.yes = Sim text.no = Não @@ -298,11 +298,11 @@ text.blocks.liquidcapacity = Capacidade de Líquido text.blocks.maxitemssecond = Máximo de itens/segundo text.blocks.powerrange = Alcance da Energia text.blocks.poweruse = Uso de energia -text.blocks.powerdamage = Power/Damage +text.blocks.powerdamage = Dano/Poder text.blocks.inputitemcapacity = Configurar capacidade de itens text.blocks.outputitemcapacity = Configurar capacidade de itens text.blocks.itemcapacity = Capacidade de Itens -text.blocks.basepowergeneration = Base Power Generation +text.blocks.basepowergeneration = Geração de poder base text.blocks.powertransferspeed = Transferência de energia text.blocks.craftspeed = Velocidade de produção text.blocks.inputliquid = Líquido de entrada @@ -313,14 +313,14 @@ text.blocks.outputitem = Itens de saida text.blocks.drilltier = Furaveis text.blocks.drillspeed = Velocidade da furadeira base text.blocks.liquidoutput = Saida de liquido -text.blocks.liquidoutputspeed = Liquid Output Speed +text.blocks.liquidoutputspeed = Velocidade da saida de líquido text.blocks.liquiduse = Uso de liquido text.blocks.coolant = Esfriador text.blocks.coolantuse = Uso do esfriador text.blocks.inputliquidfuel = Liquido de combustivel text.blocks.liquidfueluse = Uso do liquido de combustivel -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = Acelerar item +text.blocks.boostliquid = Acelerar líquido text.blocks.health = Saúde text.blocks.inaccuracy = Imprecisão text.blocks.shots = Tiros @@ -345,12 +345,12 @@ text.category.liquids = Liquidos text.category.items = Itens text.category.crafting = Construindo text.category.shooting = Atirando -text.category.optional = Optional Enhancements -setting.autotarget.name = Auto-Target +text.category.optional = Melhoras opcionais +setting.autotarget.name = Alvo automatico setting.fpscap.name = FPS Maximo setting.fpscap.none = Nenhum setting.fpscap.text = {0} FPS -setting.difficulty.training = training +setting.difficulty.training = treinamento setting.difficulty.easy = Fácil setting.difficulty.normal = Normal setting.difficulty.hard = Difícil @@ -370,21 +370,21 @@ setting.musicvol.name = Volume da Música setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Send Anonymous Crash Reports +setting.crashreport.name = Enviar denuncias de crash anonimas text.keybind.title = Refazer teclas -category.general.name = General -category.view.name = View -category.multiplayer.name = Multiplayer -command.attack = Attack -command.retreat = Retreat -command.patrol = Patrol -keybind.press = Press a key... -keybind.press.axis = Press an axis or key... -keybind.move_x.name = move_x -keybind.move_y.name = move_y +category.general.name = Geral +category.view.name = Ver +category.multiplayer.name = Multijogador +command.attack = Atacar +command.retreat = Recuar +command.patrol = Patrulha +keybind.press = Pressione uma tecla... +keybind.press.axis = Pressione uma Axis ou tecla... +keybind.move_x.name = mover_x +keybind.move_y.name = mover_y keybind.select.name = selecionar keybind.break.name = quebrar -keybind.deselect.name = Deselect +keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar keybind.zoom_hold.name = segurar_zoom keybind.zoom.name = zoom @@ -396,49 +396,49 @@ keybind.player_list.name = Lista_de_jogadores keybind.console.name = console keybind.rotate.name = girar 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.chat_history_prev.name = Historico do chat anterior +keybind.chat_history_next.name = Historico do proximo chat +keybind.chat_scroll.name = Rolar chat +keybind.drop_unit.name = Soltar unidade keybind.zoom_minimap.name = Zoom minimap mode.text.help.title = Descrição dos modos mode.waves.name = hordas mode.waves.description = O modo normal. Recursos limitados E os ataques vem automaticamente. -mode.sandbox.name = sandbox +mode.sandbox.name = Caixa de areia mode.sandbox.description = Recursos infinitos E sem tempo para Ataques. mode.freebuild.name = construção \nlivre mode.freebuild.description = recursos limitados e Sem tempo para Ataques. mode.pvp.name = PvP -mode.pvp.description = fight against other players locally. +mode.pvp.description = Lutar contra outros jogadores locais. content.item.name = Itens content.liquid.name = Liquidos content.unit.name = Units content.recipe.name = Blocos -content.mech.name = Mechs +content.mech.name = Mecas item.stone.name = Pedra item.stone.description = Um Material Incomum Cru. Usado para separar e refinar Em outros materiais,Ou Derreter em Lava. item.copper.name = Cobre -item.copper.description = A useful structure material. Used extensively in all types of blocks. +item.copper.description = Um material de estrutura util. Usado extensivamente em Maioria dos blocos. item.lead.name = Chumbo item.lead.description = Material de comeco basico. usado intensivamente em Blocos de transporte de liquidos e eletronicos. item.coal.name = Carvão item.coal.description = Combustivel pronto. -item.dense-alloy.name = Dense Alloy -item.dense-alloy.description = A tough alloy made with lead and copper. Used in advanced transportation blocks and high-tier drills. +item.dense-alloy.name = Liga densa +item.dense-alloy.description = Uma liga densa de chumbo e cobre. Usado na transportação de blocos e mineradoras de alto nivel. item.titanium.name = Titânio item.titanium.description = Um Material raro super leve, metal usado intensivamente na transportação de líquidos, Brocas e Aeronaves. item.thorium.name = Urânio -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. +item.thorium.description = Um metal denso e radioativo, Usado como suporte material e combustivel nuclear. item.silicon.name = Sílicio item.silicon.description = Condutor extremamente importante,Com aplicação em paneis solares e dispositivos complexos. item.plastanium.name = Plastanio item.plastanium.description = Leve, Material dutil Usado em aeronaves Avançadas E munição de fragmentação. -item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.phase-fabric.name = 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 = An advanced alloy with unique electrical properties. +item.surge-alloy.description = Uma liga com propriedades unicas eletricas. item.biomatter.name = Biomateria -item.biomatter.description = A clump of organic mush; used for conversion into oil or as a basic fuel. +item.biomatter.description = Um monte de materia organica; Usado na conversão de oleo Ou como oleo basico. 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 @@ -449,54 +449,54 @@ liquid.water.name = Água liquid.lava.name = Lava liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido -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.alpha-mech.name = Alfa +mech.alpha-mech.weapon = Repetidor pesado +mech.alpha-mech.ability = Onda de drones +mech.alpha-mech.description = O meca padrão. Tem uma saida de dano e velocidade decente; Pode criar até 3 drones Para capacidades ofensivas aumentadas. 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.delta-mech.weapon = Gerador Arc +mech.delta-mech.ability = Descarga +mech.delta-mech.description = Um meca rapido, De baixa armadura Feito for para ataques rapidos. Da pouco dano as estruturas, Mas pode matar grandes grupos de unidades inimigas muito rapidamente Com sua arma ARC. mech.tau-mech.name = Tau -mech.tau-mech.weapon = Restruct Laser -mech.tau-mech.ability = Repair Burst -mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability. +mech.tau-mech.weapon = Laser restruturador +mech.tau-mech.ability = Tiro reparador +mech.tau-mech.description = O meca de suporte. Conserta blocos aliados Atirando neles. Pode extinguir o fogo e consertar aliados em uma distancia Com sua habilidade de consertar. 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.omega-mech.weapon = Onda de missies +mech.omega-mech.ability = Configuração Armadurada +mech.omega-mech.description = Um meca volumoso e bem armadurado, Feito para assaltos da primeira linha. Sua habilidade de armadura Pode bloquear 90% de dano. +mech.dart-ship.name = Dardo +mech.dart-ship.weapon = Repetidor +mech.dart-ship.description = Nave padrão. Consideravelmente leve e rapido, Tem pouca capacidade ofensiva E baixa velocidade de mineração. 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.javelin-ship.description = Uma nave de espinhos de atacar e correr. Quando inicialmente lento, pode acelerar a altas velocidades e voar até bases inimigas, Dando altas quantidades de dano Com seus raios e habilidades. +mech.javelin-ship.weapon = Ondas de misseis +mech.javelin-ship.ability = Acelerador de explosão +mech.trident-ship.name = Tridente +mech.trident-ship.description = Um bombardeiro pesado. Consideravelmente bem armadurado. +mech.trident-ship.weapon = Carga de bombas 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 +mech.glaive-ship.description = Uma nave armada, bem armadurada. Com um repetidor incendario equipado. Boa aceleração e maxima velocidade. +mech.glaive-ship.weapon = Repetidor de fogo text.item.explosiveness = [LIGHT_GRAY]Explosividade: {0} text.item.flammability = [LIGHT_GRAY]Inflamabilidade: {0} text.item.radioactivity = [LIGHT_GRAY]RadioAtividade: {0} text.item.fluxiness = [LIGHT_GRAY]Poder do fluxo: {0} -text.unit.health = [LIGHT_GRAY]Health: {0} -text.unit.speed = [LIGHT_GRAY]Speed: {0} -text.mech.weapon = [LIGHT_GRAY]Weapon: {0} -text.mech.armor = [LIGHT_GRAY]Armor: {0} -text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} -text.mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} -text.mech.minepower = [LIGHT_GRAY]Mining Power: {0} -text.mech.ability = [LIGHT_GRAY]Ability: {0} +text.unit.health = [LIGHT_GRAY]Vida: {0} +text.unit.speed = [LIGHT_GRAY]Velocidade: {0} +text.mech.weapon = [LIGHT_GRAY]Arma: {0} +text.mech.armor = [LIGHT_GRAY]Armadura: {0} +text.mech.itemcapacity = [LIGHT_GRAY]Capacidade de itens: {0} +text.mech.minespeed = [LIGHT_GRAY]Velocidade de mineração: {0} +text.mech.minepower = [LIGHT_GRAY]Poder de mineração: {0} +text.mech.ability = [LIGHT_GRAY]Habilidade: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} -block.constructing = {0}\n[LIGHT_GRAY](Constructing) -block.spawn.name = Enemy Spawn +block.constructing = {0}\n[LIGHT_GRAY](Construindo) +block.spawn.name = Spawn dos inimigos block.core.name = Core -block.metalfloor.name = Metal Floor +block.metalfloor.name = Chão de metal block.deepwater.name = água funda block.water.name = água block.lava.name = lava @@ -508,24 +508,24 @@ block.sand.name = areia block.ice.name = gelo block.snow.name = neve block.grass.name = grama -block.shrub.name = shrub +block.shrub.name = Arbusto block.rock.name = rocha block.blackrock.name = rocha negra block.icerock.name = rocha de gelo block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande -block.dense-alloy-wall.name = Dense Alloy Wall -block.dense-alloy-wall-large.name = Large Dense Alloy Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall +block.dense-alloy-wall.name = Parede de liga densa +block.dense-alloy-wall-large.name = Parede de liga densa grande +block.phase-wall.name = Parede de fase +block.phase-wall-large.name = Parde de fase grande block.thorium-wall.name = Parede de tório block.thorium-wall-large.name = Parede larga de tório block.door.name = Porta block.door-large.name = Porta Grande -block.duo.name = Duplo -block.scorch.name = Quimar +block.duo.name = Dupla +block.scorch.name = Queimar block.hail.name = Hail -block.lancer.name = Lancer +block.lancer.name = Lancador block.conveyor.name = Esteira block.titanium-conveyor.name = Esteira de Titanio block.junction.name = Junção @@ -553,21 +553,21 @@ block.battery-large.name = Bateria Grande block.combustion-generator.name = Gerador de combustão block.turbine-generator.name = Gerador de Turbina block.mechanical-drill.name = Furadera Mecânica -block.pneumatic-drill.name = Pneumatic Drill +block.pneumatic-drill.name = Mineradora Pneumatica block.laser-drill.name = Broca a Laser block.water-extractor.name = Extrator de Agua block.cultivator.name = Cultivador -block.alpha-mech-pad.name = Alpha Mech Pad -block.dart-ship-pad.name = Dart Ship Pad -block.delta-mech-pad.name = Delta Mech Pad -block.javelin-ship-pad.name = Javelin Ship Pad -block.trident-ship-pad.name = Trident Ship Pad -block.glaive-ship-pad.name = Glaive Ship Pad -block.omega-mech-pad.name = Omega Mech Pad -block.tau-mech-pad.name = Tau Mech Pad +block.alpha-mech-pad.name = Controle do meca Alfa +block.dart-ship-pad.name = Controle do meca Dart +block.delta-mech-pad.name = Controle do meca Delta +block.javelin-ship-pad.name = Controle do meca Javelin +block.trident-ship-pad.name = Controle do meca Tridente +block.glaive-ship-pad.name = Controle do meca Glaive +block.omega-mech-pad.name = Controle do meca Omega +block.tau-mech-pad.name = Controle do meca Tau block.conduit.name = Cano block.mechanical-pump.name = Bomba Mecanica -block.itemsource.name = Item Source +block.itemsource.name = Fonte do item block.itemvoid.name = Item Void block.liquidsource.name = Liquid Source block.powervoid.name = Power Void @@ -582,19 +582,19 @@ block.phase-conveyor.name = Esteira de Fases block.bridge-conveyor.name = Esteira-Ponte block.plastanium-compressor.name = Compressor de Plastanio block.pyratite-mixer.name = Misturador de Piratita -block.blast-mixer.name = Blast Mixer +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 Oleo -block.spirit-factory.name = Spirit Drone Factory -block.phantom-factory.name = Phantom Drone Factory -block.wraith-factory.name = Wraith Fighter Factory -block.ghoul-factory.name = Ghoul Bomber Factory -block.dagger-factory.name = Dagger Mech Factory -block.titan-factory.name = Titan Mech Factory -block.fortress-factory.name = Fortress Mech Factory -block.revenant-factory.name = Revenant Fighter Factory +block.spirit-factory.name = Fabrica de Drone Spirit +block.phantom-factory.name = Fabrica de Drone Phantom +block.wraith-factory.name = Fabrica de Drone Wraith +block.ghoul-factory.name = Fabrica de Bombardeiro Ghoul +block.dagger-factory.name = Fabrica de meca Dagger +block.titan-factory.name = Fabrica de meca titan +block.fortress-factory.name = Fabrica de meca Fortress +block.revenant-factory.name = Fabrica de lutadores Revenant block.repair-point.name = Ponto de Reparo block.pulse-conduit.name = Conduto de Pulso block.phase-conduit.name = Conduto de Fase @@ -603,178 +603,178 @@ block.liquid-tank.name = Tanque de Líquido 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 = Thorium Reactor +block.thorium-reactor.name = Reator Torio block.command-center.name = Centro De Comando -block.mass-driver.name = Mass Driver -block.blast-drill.name = Blast Drill -block.thermal-pump.name = Thermal Pump +block.mass-driver.name = Drive de Massa +block.blast-drill.name = Mineradora de Explosão +block.thermal-pump.name = Cano termico block.thermal-generator.name = Gerador Térmico -block.alloy-smelter.name = Alloy Smtler -block.mend-projector.name = Mend Projector -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Large Surge Wall -block.cyclone.name = Cyclone -block.fuse.name = Fuse -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector +block.alloy-smelter.name = Fundidora de Liga +block.mend-projector.name = Projetor Mend +block.surge-wall.name = Parede de Surge +block.surge-wall-large.name = Parede de surge grande +block.cyclone.name = Ciclone +block.fuse.name = Fundir +block.shock-mine.name = Mina de Choque +block.overdrive-projector.name = Projetor Overdrive +block.force-projector.name = Projetor Force block.arc.name = Arc -block.rtg-generator.name = RTG Generator -block.spectre.name = Spectre -block.meltdown.name = Meltdown +block.rtg-generator.name = Gerador RTG +block.spectre.name = Espectra +block.meltdown.name = Derreter block.container.name = Container -block.core.description = The most important building in the game. -team.blue.name = blue -team.red.name = red -team.orange.name = orange -team.none.name = gray -team.green.name = green -team.purple.name = purple -unit.alpha-drone.name = Alpha Drone -unit.spirit.name = Spirit Drone -unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. -unit.phantom.name = Phantom Drone -unit.phantom.description = An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. +block.core.description = A mais importante construção do jogo. +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 +unit.phantom.description = Uma unidade de drone avançada. Minera minérios automaticamente, Coleta itens e repara blocos automaticamente. Significantemente mais efetiva. unit.dagger.name = Dagger -unit.dagger.description = A basic ground unit. Useful in swarms. +unit.dagger.description = Unidade terrestre basica, Forte em grupos. unit.titan.name = Titan -unit.titan.description = An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. -unit.ghoul.name = Ghoul Bomber -unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. -unit.wraith.name = Wraith Fighter -unit.wraith.description = A fast, hit-and-run interceptor unit. -unit.fortress.name = Fortress -unit.fortress.description = A heavy artillery ground unit. +unit.titan.description = Uma unidade armadurada terreste avancada. Usa carbide como munição. Ataca ambas as unidades de Aereas e terrestres. +unit.ghoul.name = Bombardeiro Ghoul +unit.ghoul.description = Um bombardeiro pesado. Usa composto de explosão Ou piratite como munição. +unit.wraith.name = Lutador Wraith +unit.wraith.description = Uma unidade rapida, Interceptadora de bater e correr. +unit.fortress.name = Fortaleza +unit.fortress.description = Uma unidade pesada de artilharia terrestre. unit.revenant.name = Revenant -unit.revenant.description = A heavy laser platform. -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. -tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. -tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. -block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. -block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. -block.dense-alloy-wall.description = A standard defensive block.\nAdequate protection from enemies. -block.dense-alloy-wall-large.description = A standard defensive block.\nAdequate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nGood protection from enemies. -block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. -block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. -block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. -block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. -block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. -block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. -block.mend-projector.description = Periodically heals buildings in its vicinity. -block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.duo.description = A small, cheap turret. -block.arc.description = A small turret which shoots electricity in a random arc towards the enemy. -block.hail.description = A small artillery turret. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.fuse.description = A large turret which shoots powerful short-range beams. -block.spectre.description = A large turret which shoots two powerful bullets at once. -block.meltdown.description = A large turret which shoots powerful long-range beams. -block.conveyor.description = Basic item transport block. Moved items forward and automatically deposits them into turrets or crafters. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. -block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. -block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. -block.smelter.description = Burns coal for smelting copper and lead into dense alloy. -block.arc-smelter.description = Smelts copper and lead into dense alloy by using an external power source. -block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. -block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.pulverizer.description = Crushes stone into sand. Useful when there is a lack of natural sand. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. -block.solidifer.description = Cools lava to stone at a fast pace. -block.melter.description = Heats up stone to very high temperatures to obtain lava. -block.incinerator.description = Gets rid of any excess item or liquid. -block.biomattercompressor.description = Compresses biomatter in order to retrieve oil. -block.separator.description = Exposes stone to water pressure in order to obtain various minerals contained in the stone. -block.centrifuge.description = More efficient than the separator, but also more expensive to build and requires power. -block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. -block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning oil or flammable materials. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. -block.thermal-generator.description = Generates a large amount of power from lava. -block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. -block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. -block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. -block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. -block.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. -block.vault.description = Stores a large amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. -block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. -block.cultivator.description = Cultivates the soil with water in order to obtain biomatter. -block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. -block.dart-ship-pad.description = Leave your current vessel and change into a basic fighter aircraft.\nUse the pad by double tapping while standing on it. -block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. -block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. -block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. -block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. -block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. -block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. -block.spirit-factory.description = Produces light drones which mine ore and repair blocks. -block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. -block.wraith-factory.description = Produces fast, hit-and-run interceptor units. -block.ghoul-factory.description = Produces heavy carpet bombers. -block.dagger-factory.description = Produces basic ground units. -block.titan-factory.description = Produces advanced, armored ground units. -block.fortress-factory.description = Produces heavy artillery ground units. -block.revenant-factory.description = Produces heavy laser ground units. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.command-center.description = Allows changing friendly AI behavior. Currently, attack, retreat and patrol commands are supported. -block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. -block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Stores a large amount of liquids. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump which doubles up speed by using power. -block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. -block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. -block.distributor.description = An advanced router which splits items to up to 7 other directions equally. -block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. -block.alpha-mech-pad.description = When given enough power, rebuilds your ship into the[accent] Alpha[] mech. -block.itemsource.description = Infinitely outputs items. Sandbox only. -block.liquidsource.description = Infinitely outputs liquids. Sandbox only. -block.itemvoid.description = Destroys any items which go into it without using power. Sandbox only. -block.powerinfinite.description = Infinitely outputs power. Sandbox only. -block.powervoid.description = Voids all power inputted into it. Sandbox only. -liquid.water.description = Commonly used for cooling machines and waste processing. -liquid.lava.description = Can be transformed into[LIGHT_GRAY] stone[], used for generating power or used as ammo for certain turrets. -liquid.oil.description = Can be burnt, exploded or used as a coolant. -liquid.cryofluid.description = The most efficient liquid for cooling things down. +unit.revenant.description = Uma plataforma de laser pesada. +tutorial.begin = Sua missão aqui é de erradicar[LIGHT_GRAY] Inimigo[].\n\nComeçe por[accent] Minerar cobre[]. Clique numa veia de cobre perto de seu core para fazer isso. +tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Mineradoras []podem minerar automaticamente.\nColoque uma numa veia de cobre. +tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o core.\nFaça uma linha de Esteiras da mineradora até o core. +tutorial.morecopper = Mais cobre é preciso.\n\nTanto minere manualmente, Ou coloque mais mineradoras. +tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] O inimigo[].\nConstrua uma torre dupla perto de sua base. +tutorial.drillturret = Torres duplas precisam de[accent] Cobre como munição []Para atirar.\nColoque uma mineradoura Proxima a torre Para carregar ela com cobre minerado. +tutorial.waves = O[LIGHT_GRAY] Inimigo[] se aproxima.\n\nDefenda seu core por 2 ondas. Construa mais torres. +tutorial.lead = Mais minerios estão disponiveis. Explore e minere[accent] Cobre[].\n\nArraste Da sua unidade até o core para transferir recursos. +tutorial.smelter = Cobre e chumbo são materiais fracos.\nLiga densa[accent] Superior[] Pode ser feito num fundidor.\n\nConstrua um. +tutorial.densealloy = O fundidor agora vai fazer a liga.\nPegue.\nMelhore a produção se necessario. +tutorial.siliconsmelter = O core agora vai criar[accent] O drone Spirit[] Para minerar e consertar blocos.\n\nFabricas para outras unidades podem ser criadas usando [accent] silicio.\nFaça um fundidor de Silicio. +tutorial.silicondrill = Silicio requer[accent] carvão[] e[accent] areia[].\nComeçe a fazer mineradouras. +tutorial.generator = Essa tecnologia requer energia.\nCrie[accent] um gerador a combustão[] para isso. +tutorial.generatordrill = Gerador de combustão requer combustivel.\nCarregue com carvão minerado. +tutorial.node = Energia requer transporte.\nCrie um[accent] Nodo de energia[] Proximo do gerador de combustão. +tutorial.nodelink = Poder pode ser transportado construindo blocos de energia e geradores, Apenas construindo nodos de Energia.\n\nLigue a energia clicando no nodo e selecionando o gerador e o fundidor de silicio. +tutorial.silicon = Silicio esta sendo feito. Pegue.\n\nMelhorar a produção é recomendado. +tutorial.daggerfactory = Construa uma[accent] Fabrica do meca Dagger.[]\n\nIsso vai ser feito para construi mecas de ataque. +tutorial.router = Fabricas precisam de recursos pra construir\nCrie um roteador para espalhadar recursos da esteira. +tutorial.dagger = Ligue os nodos de energia a fabrica.\nQuando os requerimentos forem alcançados, Um meca vai ser criado.\n\nCrie mais mineradoras, geradoras e esteiras se necessario. +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. +block.phase-wall-large.description = Não tão forte quanto a parde de torio mas vai defletir balas a menos que seja muito forte.\nOcupa multiplos espaços. +block.surge-wall.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lancar um raio Contra o atacante. +block.surge-wall-large.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lancar um raio Contra o atacante.\nOcupa multiplos espaços +block.door.description = Uma pequena porta que pode ser aberta o fechada quando voce clica.\nSe aberta, Os inimigos podem atirar e passar. +block.door-large.description = Uma grande porta que pode ser aberta o fechada quando voce clica.\nSe aberta, Os inimigos podem atirar e passar..\nOcupa multiplos espaços. +block.mend-projector.description = Periodicamente conserta as construções. +block.overdrive-projector.description = Aumenta a velocidade de unidades proximas de geradores e esteiras. +block.force-projector.description = Cria um campo de forca hexagonal em volta de si mesmo, Protegendo construções e unidades dentro de dano por balas. +block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. +block.duo.description = Uma torre pequena e barata. +block.arc.description = Uma pequena torre que atira eletricidade em um pequeno arc aleatoriamente no inimigo. +block.hail.description = Uma pequena torre de artilharia. +block.lancer.description = Uma torre de Tamanho-Medio que atira raios de eletricidade. +block.wave.description = Uma torre que Tamanho medio que atira bolhas. +block.salvo.description = Uma torre media que da tiros em salvos. +block.swarmer.description = Uma torre media que atira ondas de misseis. +block.ripple.description = Uma grande torre que atira simultaneamente. +block.cyclone.description = Uma grande torre de tiro rapido. +block.fuse.description = Uma torre grande que atira raios de curta distancia poderosos. +block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo. +block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo. +block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente Em torres ou construtores. Rotacionavel. +block.titanium-conveyor.description = Bloco de transporte de item avancado. Move itens mais rapidos que esteiras padrões. +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. +block.alloy-smelter.description = Produz liga de surge de titanio, chumbo, silicio e cobre. +block.pulverizer.description = Esmaga pedra em areia. Util quando esta em falta de areia natural. +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.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. +block.battery-large.description = Guarda muito mais energia que uma beteria comum +block.combustion-generator.description = Gera poder usando combustivel ou oleo. +block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. +block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. +block.solar-panel.description = Gera pequenas quantidades de energia do sol. +block.solar-panel-large.description = Da muito mais energia que o painel solar comum, Mas sua produção é mais cara. +block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido. +block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito mais energia que o reator de torio. +block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. +block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. +block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. +block.mechanical-drill.description = Uma mineradoura barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. +block.pneumatic-drill.description = Uma mineradora improvisada que é mais rapida e capaz de processar mateirais mais duros usando a pressao do ar +block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora +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. +block.tau-mech-pad.description = Deixe sua atual embarcação e mude para o meca de suporte que pode consertar construções aliadas e unidades.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.delta-mech-pad.description = Deixe sua atual embarcação e mude para o rapido, Levemente armadurado meca feito para ataques rapidos.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.omega-mech-pad.description = Deixe sua atual embarcação e mude para o volumoso e bem armadurado meca feito para ataques da primeira linha.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.spirit-factory.description = Produz drones leves que mineram e reparam blocos. +block.phantom-factory.description = Produz unidades de drone avancadas Que são significativamente mais efetivos que um drone spirit. +block.wraith-factory.description = produz unidades interceptor de ataque rapido. +block.ghoul-factory.description = Produz bombardeiros pesados. +block.dagger-factory.description = Produz unidades terrestres. +block.titan-factory.description = Produz unidades avancadas, armaduradas e terrestres. +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. +block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidosd a fonte para multiplos alvos. +block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. +block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Util em situações que tem dois condutos carregando liquidos diferentes até localizações diferentes. +block.bridge-conduit.description = Bloco de transporte de liquidos avancados. Possibilita o transporte de liquido sobre 3 blocos acima de construções ou paredes +block.mechanical-pump.description = Uma bomba barata mais saida de liquidos lenta, Sem consumo de energia. +block.rotary-pump.description = Uma bomba avancada que duplica a velocidade da saida de liquida usando energia. +block.thermal-pump.description = A melhor bomba. Trez vezes mais rapida que a bomba mecanica e a unica bomba capaz de pegar lava. +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.itemsource.description = Infinivamente da itens. Apenas caixa de areia. +block.liquidsource.description = Infinitivamente da Liquidos. Apenas caixa de areia. +block.itemvoid.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. +block.powerinfinite.description = Infinitivamente da energia. Apenas caixa de areia. +block.powervoid.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. From 6bf7d8b111cb6560139f16b4b9f19468c3fb1bd0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Dec 2018 18:30:55 -0500 Subject: [PATCH 28/42] ok desktop --- core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index d3ad336dc2..2c0f16d28e 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -184,7 +184,7 @@ public class PlacementFragment extends Fragment{ categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16*2, () -> { currentCategory = cat; rebuildCategory.run(); - }).group(group); + }).group(group).update(i -> i.setChecked(group.getChecked() == i)); if(cat.ordinal() %2 == 1) categories.row(); } From 80360214df21e00139bcf04b78831c4cdc5fd1d6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Dec 2018 13:33:03 -0500 Subject: [PATCH 29/42] Bar re-scaling --- core/src/io/anuke/mindustry/graphics/OverlayRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index c1ece11c93..e589e674fb 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -202,7 +202,7 @@ public class OverlayRenderer{ void drawBar(Color color, float x, float y, float finion){ finion = Mathf.clamp(finion); - if(finion > 0) finion = Mathf.clamp(finion + 0.2f, 0.24f, 1f); + if(finion > 0) finion = Mathf.clamp(finion, 0.24f, 1f); float len = 3; From ca04504573fbb705307cf8e8ebed8430869d0163 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Dec 2018 15:38:32 -0500 Subject: [PATCH 30/42] Renamed internal 'noWaves' mode / Fixed text encoding issues --- core/assets/bundles/bundle.properties | 16 +++++++------ .../src/io/anuke/mindustry/game/GameMode.java | 2 +- .../maps/missions/BattleMission.java | 2 +- .../mindustry/maps/missions/Mission.java | 4 +--- .../mindustry/maps/missions/WaveMission.java | 2 +- core/src/io/anuke/mindustry/net/Host.java | 6 ++++- .../src/io/anuke/mindustry/net/NetworkIO.java | 23 +++++++++++-------- .../world/blocks/power/PowerNode.java | 1 - .../mindustry/desktop/DesktopPlatform.java | 2 +- 9 files changed, 32 insertions(+), 26 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index bff7ab1003..ab0e7e3510 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -409,14 +409,16 @@ keybind.chat_scroll.name = Chat scroll keybind.drop_unit.name = drop unit keybind.zoom_minimap.name = Zoom minimap mode.text.help.title = Description of modes -mode.waves.name = waves -mode.waves.description = the normal mode. limited resources and automatic incoming waves. -mode.sandbox.name = sandbox -mode.sandbox.description = infinite resources and no timer for waves. -mode.freebuild.name = freebuild -mode.freebuild.description = limited resources and no timer for waves. +mode.waves.name = Waves +mode.waves.description = The normal mode. Limited resources and automatic incoming waves. +mode.sandbox.name = Sandbox +mode.sandbox.description = Infinite resources and no timer for waves. +mode.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.pvp.description = Fight against other players locally. +mode.attack.name = Attack +mode.attack.descrption = No waves, with the goal to destroy the enemy base. content.item.name = Items content.liquid.name = Liquids content.unit.name = Units diff --git a/core/src/io/anuke/mindustry/game/GameMode.java b/core/src/io/anuke/mindustry/game/GameMode.java index 6d14023da8..0e7de8475f 100644 --- a/core/src/io/anuke/mindustry/game/GameMode.java +++ b/core/src/io/anuke/mindustry/game/GameMode.java @@ -11,7 +11,7 @@ public enum GameMode{ freebuild{{ disableWaveTimer = true; }}, - noWaves{{ + attack{{ disableWaves = true; hidden = true; enemyCheat = true; diff --git a/core/src/io/anuke/mindustry/maps/missions/BattleMission.java b/core/src/io/anuke/mindustry/maps/missions/BattleMission.java index bd2e8e26a9..e1f5bc5614 100644 --- a/core/src/io/anuke/mindustry/maps/missions/BattleMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/BattleMission.java @@ -38,7 +38,7 @@ public class BattleMission extends MissionWithStartingCore{ @Override public GameMode getMode(){ - return GameMode.noWaves; + return GameMode.attack; } @Override diff --git a/core/src/io/anuke/mindustry/maps/missions/Mission.java b/core/src/io/anuke/mindustry/maps/missions/Mission.java index 25c9c5574e..eba443be21 100644 --- a/core/src/io/anuke/mindustry/maps/missions/Mission.java +++ b/core/src/io/anuke/mindustry/maps/missions/Mission.java @@ -2,10 +2,8 @@ package io.anuke.mindustry.maps.missions; import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.content.blocks.StorageBlocks; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.maps.generation.Generation; @@ -34,7 +32,7 @@ public abstract class Mission{ } public GameMode getMode(){ - return GameMode.noWaves; + return GameMode.attack; } /**Sets the message displayed on mission begin. Returns this mission for chaining.*/ diff --git a/core/src/io/anuke/mindustry/maps/missions/WaveMission.java b/core/src/io/anuke/mindustry/maps/missions/WaveMission.java index be7d83bf46..e31120af00 100644 --- a/core/src/io/anuke/mindustry/maps/missions/WaveMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/WaveMission.java @@ -74,7 +74,7 @@ public class WaveMission extends MissionWithStartingCore{ @Override public void update(){ if(state.wave > target){ - state.mode = GameMode.noWaves; + state.mode = GameMode.attack; } } diff --git a/core/src/io/anuke/mindustry/net/Host.java b/core/src/io/anuke/mindustry/net/Host.java index 77a281d8ec..261c60fc7e 100644 --- a/core/src/io/anuke/mindustry/net/Host.java +++ b/core/src/io/anuke/mindustry/net/Host.java @@ -1,5 +1,7 @@ package io.anuke.mindustry.net; +import io.anuke.mindustry.game.GameMode; + public class Host{ public final String name; public final String address; @@ -8,8 +10,9 @@ public class Host{ public final int players; public final int version; public final String versionType; + public final GameMode mode; - public Host(String name, String address, String mapname, int wave, int players, int version, String versionType){ + public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, GameMode mode){ this.name = name; this.address = address; this.players = players; @@ -17,5 +20,6 @@ public class Host{ this.wave = wave; this.version = version; this.versionType = versionType; + this.mode = mode; } } diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index d1173ec19d..f8a9a5ddbe 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -21,6 +21,7 @@ import io.anuke.ucore.util.Bits; import java.io.*; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import static io.anuke.mindustry.Vars.*; @@ -305,17 +306,18 @@ public class NetworkIO{ ByteBuffer buffer = ByteBuffer.allocate(128); - buffer.put((byte) host.getBytes().length); - buffer.put(host.getBytes()); + buffer.put((byte) host.getBytes(StandardCharsets.UTF_8).length); + buffer.put(host.getBytes(StandardCharsets.UTF_8)); - buffer.put((byte) map.getBytes().length); - buffer.put(map.getBytes()); + buffer.put((byte) map.getBytes(StandardCharsets.UTF_8).length); + buffer.put(map.getBytes(StandardCharsets.UTF_8)); buffer.putInt(playerGroup.size()); buffer.putInt(state.wave); buffer.putInt(Version.build); - buffer.put((byte)Version.type.getBytes().length); - buffer.put(Version.type.getBytes()); + buffer.put((byte)Version.type.getBytes(StandardCharsets.UTF_8).length); + buffer.put(Version.type.getBytes(StandardCharsets.UTF_8)); + buffer.put((byte)state.mode.ordinal()); return buffer; } @@ -328,8 +330,8 @@ public class NetworkIO{ byte[] mb = new byte[mlength]; buffer.get(mb); - String host = new String(hb); - String map = new String(mb); + String host = new String(hb, StandardCharsets.UTF_8); + String map = new String(mb, StandardCharsets.UTF_8); int players = buffer.getInt(); int wave = buffer.getInt(); @@ -337,8 +339,9 @@ public class NetworkIO{ byte tlength = buffer.get(); byte[] tb = new byte[tlength]; buffer.get(tb); - String vertype = new String(tb); + String vertype = new String(tb, StandardCharsets.UTF_8); + GameMode mode = GameMode.values()[buffer.get()]; - return new Host(host, hostAddress, map, wave, players, version, vertype); + return new Host(host, hostAddress, map, wave, players, version, vertype, mode); } } 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 9a2e80e55c..20504efd70 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -252,7 +252,6 @@ public class PowerNode extends PowerBlock{ Draw.color(Palette.powerLight, Palette.power, Mathf.absin(Timers.time(), 8f, 1f)); Lines.stroke(2f); Lines.line(x1, y1, x2, y2); - } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index d4cd5ad4e7..0604d62e53 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -60,7 +60,7 @@ public class DesktopPlatform extends Platform{ presence.largeImageText = "Wave " + state.wave; } - if(state.mode != GameMode.noWaves){ + if(state.mode != GameMode.attack){ presence.state = Strings.capitalize(state.mode.name()); }else{ presence.state = unitGroups[players[0].getTeam().ordinal()].size() == 1 ? "1 Unit Active" : From 8a582f8872756f009c670247bc2d1fbbccc74bb9 Mon Sep 17 00:00:00 2001 From: iczero Date: Wed, 5 Dec 2018 12:43:13 -0800 Subject: [PATCH 31/42] Check client version type against server version type (#367) --- build.gradle | 2 +- core/src/io/anuke/mindustry/core/NetServer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ba398346bf..7576433e92 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ allprojects { ext { versionNumber = '4' versionModifier = 'alpha' - versionType = 'official' + if (!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 6b71668db5..a88ea19301 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -127,7 +127,7 @@ public class NetServer extends Module{ return; } - if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients())){ + if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){ kick(id, KickReason.customClient); return; } From 8d28976b0d54dcc9c1114ef3fe6bed5982d2ac4f Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Dec 2018 19:00:10 -0500 Subject: [PATCH 32/42] Misc cleanup --- build.gradle | 2 +- core/src/io/anuke/mindustry/ai/WaveSpawner.java | 2 +- .../io/anuke/mindustry/entities/effect/GroundEffectEntity.java | 2 +- core/src/io/anuke/mindustry/game/EventType.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index ba398346bf..2a4f828ef1 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = '3dfb820142a0fc583ad19413a24fc5038aa29d89' + uCoreVersion = '5871d2d0385370bc937fed3e5e301d6962a50476' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index 7a7d58fc14..897cdcda3f 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -164,7 +164,7 @@ public class WaveSpawner{ for(int y = quady * quadsize; y < world.height() && y < (quady + 1) * quadsize; y++){ Tile tile = world.tile(x, y); - if(tile == null || tile.solid() || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE || tile.floor().isLiquid){ + if(tile == null || tile.solid() || tile.getTeam() == defaultTeam || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE || tile.floor().isLiquid){ setQuad(quadx, quady, false); break outer; } diff --git a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java index 889c04a7ce..ceaceb8ba7 100644 --- a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java +++ b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java @@ -6,7 +6,7 @@ import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.impl.EffectEntity; -import io.anuke.ucore.function.EffectRenderer; +import io.anuke.ucore.core.Effects.EffectRenderer; import io.anuke.ucore.util.Mathf; /** diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index f2e91965f9..0724be398a 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.game; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.function.Event; +import io.anuke.ucore.core.Events.Event; public class EventType{ From da86dee9810f148076e34ff97f1699812be11cda Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 6 Dec 2018 09:30:41 -0500 Subject: [PATCH 33/42] Freezing armor multiplier --- .../mindustry/content/StatusEffects.java | 3 ++- core/src/io/anuke/mindustry/core/Control.java | 6 +++-- core/src/io/anuke/mindustry/world/Block.java | 26 +++++++++---------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index c1671f481f..62e1de504f 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -47,7 +47,8 @@ public class StatusEffects implements ContentList{ freezing = new StatusEffect(5 * 60f){ { oppositeScale = 0.4f; - speedMultiplier = 0.5f; + speedMultiplier = 0.6f; + armorMultiplier = 0.8f; } @Override diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index f64e543aa7..f5bf4b2fa0 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -23,11 +23,13 @@ import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.ui.dialogs.FloatingDialog; -import io.anuke.mindustry.world.Pos; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.EntityQuery; import io.anuke.ucore.modules.Module; -import io.anuke.ucore.util.*; +import io.anuke.ucore.util.Atlas; +import io.anuke.ucore.util.Bundles; +import io.anuke.ucore.util.Strings; +import io.anuke.ucore.util.Timer; import java.io.IOException; diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 8c6d09e529..0e574b0303 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -337,10 +337,8 @@ public class Block extends BaseBlock { public void setBars(){ if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); - if(hasLiquids) - bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.total() / liquidCapacity)); - if(hasItems) - bars.add(new BlockBar(BarType.inventory, true, tile -> (float) tile.entity.items.total() / itemCapacity)); + if(hasLiquids) bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.total() / liquidCapacity)); + if(hasItems) bars.add(new BlockBar(BarType.inventory, true, tile -> (float) tile.entity.items.total() / itemCapacity)); } public String name(){ @@ -543,16 +541,16 @@ public class Block extends BaseBlock { public Array getDebugInfo(Tile tile){ return Array.with( - "block", tile.block().name, - "floor", tile.floor().name, - "x", tile.x, - "y", tile.y, - "entity.name", tile.entity.getClass(), - "entity.x", tile.entity.x, - "entity.y", tile.entity.y, - "entity.id", tile.entity.id, - "entity.items.total", hasItems ? tile.entity.items.total() : null, - "entity.graph", tile.entity.power != null && tile.entity.power.graph != null ? tile.entity.power.graph.getID() : null + "block", tile.block().name, + "floor", tile.floor().name, + "x", tile.x, + "y", tile.y, + "entity.name", tile.entity.getClass(), + "entity.x", tile.entity.x, + "entity.y", tile.entity.y, + "entity.id", tile.entity.id, + "entity.items.total", hasItems ? tile.entity.items.total() : null, + "entity.graph", tile.entity.power != null && tile.entity.power.graph != null ? tile.entity.power.graph.getID() : null ); } } \ No newline at end of file From 1a66b7c4c3fdafdd0dd92e7159546eda240f9234 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 6 Dec 2018 11:41:05 -0500 Subject: [PATCH 34/42] Graphical fix --- core/src/io/anuke/mindustry/core/Renderer.java | 4 ++-- core/src/io/anuke/mindustry/graphics/OverlayRenderer.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index f7e285ba11..df097fc0f9 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -395,8 +395,8 @@ public class Renderer extends RendererModule{ Graphics.getEffectSurface().setSize(w, h, true); Core.camera.viewportWidth = w; Core.camera.viewportHeight = h; - Core.camera.position.x = w/2f; - Core.camera.position.y = h/2f; + Core.camera.position.x = w/2f + tilesize/2f; + Core.camera.position.y = h/2f + tilesize/2f; draw(); diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index e589e674fb..43662203ea 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -200,6 +200,7 @@ public class OverlayRenderer{ } void drawBar(Color color, float x, float y, float finion){ + if(finion > 0.9f) finion = 1f; //fixes precision errors finion = Mathf.clamp(finion); if(finion > 0) finion = Mathf.clamp(finion, 0.24f, 1f); From 2f726cf7f2425e04a3064d47dabafdac18a91217 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 6 Dec 2018 19:57:26 -0500 Subject: [PATCH 35/42] (2) --- core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 2c0f16d28e..f7c9944b67 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -184,7 +184,7 @@ public class PlacementFragment extends Fragment{ categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16*2, () -> { currentCategory = cat; rebuildCategory.run(); - }).group(group).update(i -> i.setChecked(group.getChecked() == i)); + }).group(group).update(i -> i.setChecked(currentCategory == cat)); if(cat.ordinal() %2 == 1) categories.row(); } From 81c24b3de14365eb43c38964e9c221965e3e15ae Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 6 Dec 2018 22:27:39 -0500 Subject: [PATCH 36/42] Fixed file chooser style / Fixed sector save invisibility --- core/src/io/anuke/mindustry/game/Saves.java | 1 + core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java | 4 ++-- core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 3947d578cd..5d45bfd52f 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -127,6 +127,7 @@ public class Saves{ saveMap.put(slot.index, slot); slot.meta = SaveIO.getData(slot.index); current = slot; + slot.meta.sector = invalidSector; saveSlots(); return slot; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java index fd94891b8c..b608f3527c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java @@ -198,7 +198,7 @@ public class FileChooser extends FloatingDialog{ //macs are confined to the Downloads/ directory if(!OS.isMac){ Image upimage = new Image("icon-folder-parent"); - TextButton upbutton = new TextButton(".." + directory.toString(), "clear"); + TextButton upbutton = new TextButton(".." + directory.toString(), "clear-toggle"); upbutton.clicked(() -> { directory = directory.parent(); updateFiles(true); @@ -220,7 +220,7 @@ public class FileChooser extends FloatingDialog{ String filename = file.name(); - TextButton button = new TextButton(shorten(filename), "clear"); + TextButton button = new TextButton(shorten(filename), "clear-toggle"); group.add(button); button.clicked(() -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index facfcab706..d402ed9eeb 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -161,6 +161,7 @@ public class LoadDialog extends FloatingDialog{ control.saves.importSave(file); setup(); }catch(IOException e){ + e.printStackTrace(); ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false))); } }else{ From a09bd09a0e26f2da284ae0ac6388f83a40b48f00 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 7 Dec 2018 12:11:58 -0500 Subject: [PATCH 37/42] Removed tank chaining --- .../mindustry/content/blocks/LiquidBlocks.java | 4 ++-- .../mindustry/graphics/OverlayRenderer.java | 2 +- .../world/blocks/distribution/LiquidTank.java | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java diff --git a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java index 3ca87efef1..e4eb6ff040 100644 --- a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java @@ -50,10 +50,10 @@ public class LiquidBlocks extends BlockList implements ContentList{ }}; liquidRouter = new LiquidRouter("liquid-router"){{ - liquidCapacity = 40f; + liquidCapacity = 20f; }}; - liquidtank = new LiquidRouter("liquid-tank"){{ + liquidtank = new LiquidTank("liquid-tank"){{ size = 3; liquidCapacity = 1500f; health = 500; diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index 43662203ea..3c070132fa 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -203,7 +203,7 @@ public class OverlayRenderer{ if(finion > 0.9f) finion = 1f; //fixes precision errors finion = Mathf.clamp(finion); - if(finion > 0) finion = Mathf.clamp(finion, 0.24f, 1f); + if(finion > 0.001f) finion = Mathf.clamp(finion, 0.24f, 1f); float len = 3; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java new file mode 100644 index 0000000000..84ec99523e --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java @@ -0,0 +1,16 @@ +package io.anuke.mindustry.world.blocks.distribution; + +import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.Tile; + +public class LiquidTank extends LiquidRouter{ + + public LiquidTank(String name){ + super(name); + } + + @Override + public boolean canDumpLiquid(Tile tile, Tile to, Liquid liquid){ + return super.canDumpLiquid(tile, to, liquid) && !(to.block() instanceof LiquidTank); + } +} From 94665e80555bc373c44a7f7c25adc70242e616a4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 7 Dec 2018 13:10:25 -0500 Subject: [PATCH 38/42] Formatting / Removed mobile map screenshots due to crashes --- core/src/io/anuke/mindustry/core/Control.java | 2 +- core/src/io/anuke/mindustry/game/Saves.java | 27 +++---- kryonet/build.gradle | 2 +- .../src/io/anuke/kryonet/ByteSerializer.java | 26 +++---- .../io/anuke/kryonet/FrameworkSerializer.java | 24 +++---- kryonet/src/io/anuke/kryonet/KryoClient.java | 34 ++++----- kryonet/src/io/anuke/kryonet/KryoCore.java | 12 ++-- kryonet/src/io/anuke/kryonet/KryoServer.java | 71 ++++++++++--------- 8 files changed, 96 insertions(+), 102 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index f5bf4b2fa0..415f58b87c 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -375,7 +375,7 @@ public class Control extends Module{ } } - if(Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){ + if(!mobile && Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){ renderer.takeMapScreenshot(); } diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 5d45bfd52f..0a2f2fcf28 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -165,26 +165,17 @@ public class Saves{ public void save(){ long time = totalPlaytime; + renderer.fog.writeFog(); + long prev = totalPlaytime; + totalPlaytime = time; - threads.runGraphics(() -> { - //Renderer fog needs to be written on graphics thread, but save() can run on logic thread - //thus, runGraphics is required here - renderer.fog.writeFog(); + SaveIO.saveToSlot(index); + meta = SaveIO.getData(index); + if(!state.is(State.menu)){ + current = this; + } - //save on the logic thread - threads.run(() -> { - long prev = totalPlaytime; - totalPlaytime = time; - - SaveIO.saveToSlot(index); - meta = SaveIO.getData(index); - if(!state.is(State.menu)){ - current = this; - } - - totalPlaytime = prev; - }); - }); + totalPlaytime = prev; } public boolean isHidden(){ diff --git a/kryonet/build.gradle b/kryonet/build.gradle index afd5e6ab73..57fced1dd2 100644 --- a/kryonet/build.gradle +++ b/kryonet/build.gradle @@ -1,4 +1,4 @@ apply plugin: "java" sourceCompatibility = 1.8 -sourceSets.main.java.srcDirs = [ "src/" ] +sourceSets.main.java.srcDirs = ["src/"] diff --git a/kryonet/src/io/anuke/kryonet/ByteSerializer.java b/kryonet/src/io/anuke/kryonet/ByteSerializer.java index c8155e458d..119a876658 100644 --- a/kryonet/src/io/anuke/kryonet/ByteSerializer.java +++ b/kryonet/src/io/anuke/kryonet/ByteSerializer.java @@ -10,18 +10,18 @@ import io.anuke.ucore.util.Pooling; import java.nio.ByteBuffer; @SuppressWarnings("unchecked") -public class ByteSerializer implements Serialization { +public class ByteSerializer implements Serialization{ @Override - public void write(ByteBuffer byteBuffer, Object o) { + public void write(ByteBuffer byteBuffer, Object o){ if(o instanceof FrameworkMessage){ - byteBuffer.put((byte)-2); //code for framework message - FrameworkSerializer.write(byteBuffer, (FrameworkMessage)o); - }else { - if (!(o instanceof Packet)) + byteBuffer.put((byte) -2); //code for framework message + FrameworkSerializer.write(byteBuffer, (FrameworkMessage) o); + }else{ + if(!(o instanceof Packet)) throw new RuntimeException("All sent objects must implement be Packets! Class: " + o.getClass()); byte id = Registrator.getID(o.getClass()); - if (id == -1) + if(id == -1) throw new RuntimeException("Unregistered class: " + o.getClass()); byteBuffer.put(id); ((Packet) o).write(byteBuffer); @@ -29,10 +29,10 @@ public class ByteSerializer implements Serialization { } @Override - public Object read(ByteBuffer byteBuffer) { + public Object read(ByteBuffer byteBuffer){ byte id = byteBuffer.get(); if(id == -2){ - return FrameworkSerializer.read(byteBuffer); + return FrameworkSerializer.read(byteBuffer); }else{ Packet packet = Pooling.obtain((Class) Registrator.getByID(id).type, (Supplier) Registrator.getByID(id).constructor); packet.read(byteBuffer); @@ -41,17 +41,17 @@ public class ByteSerializer implements Serialization { } @Override - public int getLengthLength() { + public int getLengthLength(){ return 2; } @Override - public void writeLength(ByteBuffer byteBuffer, int i) { - byteBuffer.putShort((short)i); + public void writeLength(ByteBuffer byteBuffer, int i){ + byteBuffer.putShort((short) i); } @Override - public int readLength(ByteBuffer byteBuffer) { + public int readLength(ByteBuffer byteBuffer){ return byteBuffer.getShort(); } } diff --git a/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java b/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java index 347f825855..9b95ccdf98 100644 --- a/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java +++ b/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java @@ -5,32 +5,32 @@ import com.esotericsoftware.kryonet.FrameworkMessage.*; import java.nio.ByteBuffer; -public class FrameworkSerializer { +public class FrameworkSerializer{ public static void write(ByteBuffer buffer, FrameworkMessage message){ if(message instanceof Ping){ - Ping p = (Ping)message; + Ping p = (Ping) message; - buffer.put((byte)0); + buffer.put((byte) 0); buffer.putInt(p.id); - buffer.put(p.isReply ? 1 : (byte)0); + buffer.put(p.isReply ? 1 : (byte) 0); }else if(message instanceof DiscoverHost){ - DiscoverHost p = (DiscoverHost)message; + DiscoverHost p = (DiscoverHost) message; - buffer.put((byte)1); + buffer.put((byte) 1); }else if(message instanceof KeepAlive){ - KeepAlive p = (KeepAlive)message; + KeepAlive p = (KeepAlive) message; - buffer.put((byte)2); + buffer.put((byte) 2); }else if(message instanceof RegisterUDP){ - RegisterUDP p = (RegisterUDP)message; + RegisterUDP p = (RegisterUDP) message; - buffer.put((byte)3); + buffer.put((byte) 3); buffer.putInt(p.connectionID); }else if(message instanceof RegisterTCP){ - RegisterTCP p = (RegisterTCP)message; + RegisterTCP p = (RegisterTCP) message; - buffer.put((byte)4); + buffer.put((byte) 4); buffer.putInt(p.connectionID); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index 30e59bac14..abed5b9e2c 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -35,14 +35,14 @@ public class KryoClient implements ClientProvider{ public KryoClient(){ KryoCore.init(); - handler = new ClientDiscoveryHandler() { + handler = new ClientDiscoveryHandler(){ @Override - public DatagramPacket onRequestNewDatagramPacket() { + public DatagramPacket onRequestNewDatagramPacket(){ return new DatagramPacket(new byte[128], 128); } @Override - public void onDiscoveredHost(DatagramPacket datagramPacket) { + public void onDiscoveredHost(DatagramPacket datagramPacket){ ByteBuffer buffer = ByteBuffer.wrap(datagramPacket.getData()); Host host = NetworkIO.readServerData(datagramPacket.getAddress().getHostAddress(), buffer); for(InetAddress address : foundAddresses){ @@ -55,7 +55,7 @@ public class KryoClient implements ClientProvider{ } @Override - public void onFinally() { + public void onFinally(){ } }; @@ -65,7 +65,7 @@ public class KryoClient implements ClientProvider{ Listener listener = new Listener(){ @Override - public void connected (Connection connection) { + public void connected(Connection connection){ Connect c = new Connect(); c.addressTCP = connection.getRemoteAddressTCP().getAddress().getHostAddress(); c.id = connection.getID(); @@ -75,7 +75,7 @@ public class KryoClient implements ClientProvider{ } @Override - public void disconnected (Connection connection) { + public void disconnected(Connection connection){ if(connection.getLastProtocolError() != null){ netClient.setQuiet(); } @@ -85,13 +85,13 @@ public class KryoClient implements ClientProvider{ } @Override - public void received (Connection connection, Object object) { + public void received(Connection connection, Object object){ if(object instanceof FrameworkMessage) return; threads.runDelay(() -> { try{ Net.handleClientReceived(object); - }catch (Exception e){ + }catch(Exception e){ handleException(e); } }); @@ -106,12 +106,12 @@ public class KryoClient implements ClientProvider{ } } - private static boolean isLocal(InetAddress addr) { - if (addr.isAnyLocalAddress() || addr.isLoopbackAddress()) return true; + private static boolean isLocal(InetAddress addr){ + if(addr.isAnyLocalAddress() || addr.isLoopbackAddress()) return true; - try { + try{ return NetworkInterface.getByInetAddress(addr) != null; - } catch (Exception e) { + }catch(Exception e){ return false; } } @@ -150,12 +150,12 @@ public class KryoClient implements ClientProvider{ } @Override - public void disconnect() { + public void disconnect(){ client.close(); } @Override - public void send(Object object, SendMode mode) { + public void send(Object object, SendMode mode){ if(mode == SendMode.tcp){ client.sendTCP(object); }else{ @@ -166,12 +166,12 @@ public class KryoClient implements ClientProvider{ } @Override - public void updatePing() { + public void updatePing(){ client.updateReturnTripTime(); } @Override - public int getPing() { + public int getPing(){ return client.getReturnTripTime(); } @@ -218,7 +218,7 @@ public class KryoClient implements ClientProvider{ public void dispose(){ try{ client.dispose(); - }catch (IOException e){ + }catch(IOException e){ throw new RuntimeException(e); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoCore.java b/kryonet/src/io/anuke/kryonet/KryoCore.java index 412fc1000b..01d582edc6 100644 --- a/kryonet/src/io/anuke/kryonet/KryoCore.java +++ b/kryonet/src/io/anuke/kryonet/KryoCore.java @@ -10,8 +10,8 @@ import java.util.concurrent.ScheduledExecutorService; import static io.anuke.mindustry.Vars.headless; -/**Utilities and configs for kryo module.*/ -public class KryoCore { +/** Utilities and configs for kryo module. */ +public class KryoCore{ public static boolean fakeLag = false; public static final int fakeLagMax = 500; public static final int fakeLagMin = 0; @@ -26,7 +26,7 @@ public class KryoCore { Log.set(fakeLag ? Log.LEVEL_DEBUG : Log.LEVEL_WARN); Log.setLogger(new Logger(){ - public void log (int level, String category, String message, Throwable ex) { + public void log(int level, String category, String message, Throwable ex){ if(fakeLag){ if(message.contains("UDP")){ lastUDP = true; @@ -45,7 +45,7 @@ public class KryoCore { builder.append(message); - if (ex != null) { + if(ex != null){ StringWriter writer = new StringWriter(256); ex.printStackTrace(new PrintWriter(writer)); builder.append('\n'); @@ -60,7 +60,7 @@ public class KryoCore { }); } - private static int calculateLag() { - return fakeLagMin + (int)(Math.random() * (fakeLagMax - fakeLagMin)); + private static int calculateLag(){ + return fakeLagMin + (int) (Math.random() * (fakeLagMax - fakeLagMin)); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 0320c91416..83e8623f52 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -29,7 +29,7 @@ import java.util.concurrent.CopyOnWriteArraySet; import static io.anuke.mindustry.Vars.threads; -public class KryoServer implements ServerProvider { +public class KryoServer implements ServerProvider{ final Server server; final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); final CopyOnWriteArraySet missing = new CopyOnWriteArraySet<>(); @@ -42,7 +42,7 @@ public class KryoServer implements ServerProvider { public KryoServer(){ KryoCore.init(); - server = new Server(4096*2, 4096, connection -> new ByteSerializer()); + server = new Server(4096 * 2, 4096, connection -> new ByteSerializer()); server.setDiscoveryHandler((datagramChannel, fromAddress) -> { ByteBuffer buffer = NetworkIO.writeServerData(); buffer.position(0); @@ -53,10 +53,10 @@ public class KryoServer implements ServerProvider { Listener listener = new Listener(){ @Override - public void connected (Connection connection) { + public void connected(Connection connection){ String ip = connection.getRemoteAddressTCP().getAddress().getHostAddress(); - KryoConnection kn = new KryoConnection(lastconnection ++, ip, connection); + KryoConnection kn = new KryoConnection(lastconnection++, ip, connection); Connect c = new Connect(); c.id = kn.id; @@ -69,7 +69,7 @@ public class KryoServer implements ServerProvider { } @Override - public void disconnected (Connection connection) { + public void disconnected(Connection connection){ KryoConnection k = getByKryoID(connection.getID()); if(k == null) return; @@ -83,14 +83,14 @@ public class KryoServer implements ServerProvider { } @Override - public void received (Connection connection, Object object) { + public void received(Connection connection, Object object){ KryoConnection k = getByKryoID(connection.getID()); if(object instanceof FrameworkMessage || k == null) return; threads.runDelay(() -> { try{ Net.handleServerReceived(k.id, object); - }catch (Exception e){ + }catch(Exception e){ e.printStackTrace(); } }); @@ -110,7 +110,7 @@ public class KryoServer implements ServerProvider { } @Override - public Array getConnections() { + public Array getConnections(){ array.clear(); for(KryoConnection c : connections){ array.add(c); @@ -120,7 +120,7 @@ public class KryoServer implements ServerProvider { @Override public KryoConnection getByID(int id){ - for(int i = 0; i < connections.size(); i ++){ + for(int i = 0; i < connections.size(); i++){ KryoConnection con = connections.get(i); if(con.id == id){ return con; @@ -131,7 +131,7 @@ public class KryoServer implements ServerProvider { } @Override - public void host(int port) throws IOException { + public void host(int port) throws IOException{ //attempt to open default ports if they're not already open //this only opens the default port due to security concerns (?) if(port == Vars.port){ @@ -139,7 +139,8 @@ public class KryoServer implements ServerProvider { try{ if(!UPnP.isMappedTCP(port)) UPnP.openPortTCP(port); if(!UPnP.isMappedUDP(port)) UPnP.openPortUDP(port); - }catch(Throwable ignored){} + }catch(Throwable ignored){ + } }); } @@ -151,7 +152,7 @@ public class KryoServer implements ServerProvider { serverThread = new Thread(() -> { try{ server.run(); - }catch (Throwable e){ + }catch(Throwable e){ if(!(e instanceof ClosedSelectorException)) handleException(e); } }, "Kryonet Server"); @@ -160,7 +161,7 @@ public class KryoServer implements ServerProvider { } @Override - public void close() { + public void close(){ connections.clear(); lastconnection = 0; @@ -168,17 +169,17 @@ public class KryoServer implements ServerProvider { } @Override - public void sendStream(int id, Streamable stream) { + public void sendStream(int id, Streamable stream){ KryoConnection connection = getByID(id); if(connection == null) return; - try { + try{ - if (connection.connection != null) { + if(connection.connection != null){ - connection.connection.addListener(new InputStreamSender(stream.stream, 512) { + connection.connection.addListener(new InputStreamSender(stream.stream, 512){ int id; - protected void start() { + protected void start(){ //send an object so the receiving side knows how to handle the following chunks StreamBegin begin = new StreamBegin(); begin.total = stream.stream.available(); @@ -187,14 +188,14 @@ public class KryoServer implements ServerProvider { id = begin.id; } - protected Object next(byte[] bytes) { + protected Object next(byte[] bytes){ StreamChunk chunk = new StreamChunk(); chunk.id = id; chunk.data = bytes; return chunk; //wrap the byte[] with an object so the receiving side knows how to handle it. } }); - } else { + }else{ int cid; StreamBegin begin = new StreamBegin(); begin.total = stream.stream.available(); @@ -202,7 +203,7 @@ public class KryoServer implements ServerProvider { connection.send(begin, SendMode.tcp); cid = begin.id; - while (stream.stream.available() > 0) { + while(stream.stream.available() > 0){ byte[] bytes = new byte[Math.min(512, stream.stream.available())]; stream.stream.read(bytes); @@ -212,20 +213,20 @@ public class KryoServer implements ServerProvider { connection.send(chunk, SendMode.tcp); } } - }catch (IOException e){ + }catch(IOException e){ throw new RuntimeException(e); } } @Override - public void send(Object object, SendMode mode) { - for(int i = 0; i < connections.size(); i ++){ + public void send(Object object, SendMode mode){ + for(int i = 0; i < connections.size(); i++){ connections.get(i).send(object, mode); } } @Override - public void sendTo(int id, Object object, SendMode mode) { + public void sendTo(int id, Object object, SendMode mode){ NetConnection conn = getByID(id); if(conn == null){ if(!missing.contains(id)) @@ -237,8 +238,8 @@ public class KryoServer implements ServerProvider { } @Override - public void sendExcept(int id, Object object, SendMode mode) { - for(int i = 0; i < connections.size(); i ++){ + public void sendExcept(int id, Object object, SendMode mode){ + for(int i = 0; i < connections.size(); i++){ KryoConnection conn = connections.get(i); if(conn.id != id) conn.send(object, mode); } @@ -251,11 +252,13 @@ public class KryoServer implements ServerProvider { } private void handleException(Throwable e){ - Timers.run(0f, () -> { throw new RuntimeException(e);}); + Timers.run(0f, () -> { + throw new RuntimeException(e); + }); } KryoConnection getByKryoID(int id){ - for(int i = 0; i < connections.size(); i ++){ + for(int i = 0; i < connections.size(); i++){ KryoConnection con = connections.get(i); if(con.connection != null && con.connection.getID() == id){ return con; @@ -274,7 +277,7 @@ public class KryoServer implements ServerProvider { class KryoConnection extends NetConnection{ public final Connection connection; - public KryoConnection(int id, String address, Connection connection) { + public KryoConnection(int id, String address, Connection connection){ super(id, address); this.connection = connection; } @@ -286,13 +289,13 @@ public class KryoServer implements ServerProvider { @Override public void send(Object object, SendMode mode){ - try { - if (mode == SendMode.tcp) { + try{ + if(mode == SendMode.tcp){ connection.sendTCP(object); - } else { + }else{ connection.sendUDP(object); } - }catch (Exception e){ + }catch(Exception e){ Log.err(e); Log.info("Disconnecting invalid client!"); connection.close(); From 6fa14accfec9bdd35d461e8e00561f6fb6b04911 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 7 Dec 2018 15:19:14 -0500 Subject: [PATCH 39/42] Added proper core blocks / Murdered snek --- .../io/anuke/mindustry/content/Recipes.java | 24 +-- .../content/blocks/StorageBlocks.java | 5 +- .../world/blocks/storage/CoreBlock.java | 8 +- .../world/blocks/storage/SortedUnloader.java | 18 ++- .../world/blocks/storage/StorageBlock.java | 103 ++---------- .../world/blocks/storage/StorageGraph.java | 151 ------------------ .../world/blocks/storage/Unloader.java | 26 --- .../mindustry/world/blocks/storage/Vault.java | 1 - 8 files changed, 48 insertions(+), 288 deletions(-) delete mode 100644 core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java delete mode 100644 core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java diff --git a/core/src/io/anuke/mindustry/content/Recipes.java b/core/src/io/anuke/mindustry/content/Recipes.java index f236469ff9..7bca788480 100644 --- a/core/src/io/anuke/mindustry/content/Recipes.java +++ b/core/src/io/anuke/mindustry/content/Recipes.java @@ -42,17 +42,23 @@ public class Recipes implements ContentList{ new Recipe(defense, DefenseBlocks.surgeWall, new ItemStack(Items.surgealloy, 12)); new Recipe(defense, DefenseBlocks.surgeWallLarge, new ItemStack(Items.surgealloy, 12 * 4)); + new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200)); + new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250)); + + //core disabled due to being broken + new Recipe(effect, StorageBlocks.core, + new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500), + new ItemStack(Items.silicon, 1500), new ItemStack(Items.thorium, 500), + new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750) + ); + //projectors new Recipe(effect, DefenseBlocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180)); new Recipe(effect, DefenseBlocks.overdriveProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); new Recipe(effect, DefenseBlocks.forceProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); - new Recipe(effect, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60)); - new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200)); - new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250)); - new Recipe(effect, DefenseBlocks.shockMine, new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 25)) - .setDependencies(Items.blastCompound); + .setDependencies(Items.blastCompound); //TURRETS new Recipe(turret, TurretBlocks.duo, new ItemStack(Items.copper, 40)).setAlwaysUnlocked(true); @@ -82,6 +88,7 @@ public class Recipes implements ContentList{ new Recipe(distribution, DistributionBlocks.sorter, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 4)); new Recipe(distribution, DistributionBlocks.overflowGate, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 8)); new Recipe(distribution, DistributionBlocks.itemBridge, new ItemStack(Items.densealloy, 8), new ItemStack(Items.copper, 8)); + new Recipe(distribution, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60)); new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.densealloy, 250), new ItemStack(Items.silicon, 150), new ItemStack(Items.lead, 250), new ItemStack(Items.thorium, 100)); //CRAFTING @@ -134,13 +141,6 @@ public class Recipes implements ContentList{ new Recipe(power, PowerBlocks.thoriumReactor, new ItemStack(Items.lead, 600), new ItemStack(Items.silicon, 400), new ItemStack(Items.densealloy, 300), new ItemStack(Items.thorium, 300)); new Recipe(power, PowerBlocks.rtgGenerator, new ItemStack(Items.lead, 200), new ItemStack(Items.silicon, 150), new ItemStack(Items.phasefabric, 50), new ItemStack(Items.plastanium, 150), new ItemStack(Items.thorium, 100)); - //core disabled due to being broken - /*new Recipe(distribution, StorageBlocks.core, - new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500), - new ItemStack(Items.silicon, 1500), new ItemStack(Items.thorium, 500), - new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750) - );*/ - //DRILLS, PRODUCERS new Recipe(production, ProductionBlocks.mechanicalDrill, new ItemStack(Items.copper, 45)).setAlwaysUnlocked(true); new Recipe(production, ProductionBlocks.pneumaticDrill, new ItemStack(Items.copper, 60), new ItemStack(Items.densealloy, 50)); diff --git a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java index 460a79da77..a4519d04cb 100644 --- a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java @@ -13,16 +13,17 @@ public class StorageBlocks extends BlockList implements ContentList{ public void load(){ core = new CoreBlock("core"){{ health = 1100; + itemCapacity = 3000; }}; vault = new Vault("vault"){{ size = 3; - itemCapacity = 900; + itemCapacity = 1000; }}; container = new Vault("container"){{ size = 2; - itemCapacity = 200; + itemCapacity = 300; }}; unloader = new SortedUnloader("unloader"){{ 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 591344afdb..3c6abdf84f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -51,7 +51,6 @@ public class CoreBlock extends StorageBlock{ update = true; size = 3; hasItems = true; - itemCapacity = 2000; viewRange = 200f; flags = EnumSet.of(BlockFlag.resupplyPoint, BlockFlag.target); } @@ -85,6 +84,11 @@ public class CoreBlock extends StorageBlock{ @Override public void onProximityUpdate(Tile tile) { + for(Tile other : state.teams.get(tile.getTeam()).cores){ + if(other != tile){ + tile.entity.items = other.entity.items; + } + } state.teams.get(tile.getTeam()).cores.add(tile); } @@ -222,7 +226,7 @@ public class CoreBlock extends StorageBlock{ return new CoreEntity(); } - public class CoreEntity extends StorageEntity implements SpawnerTrait{ + public class CoreEntity extends TileEntity implements SpawnerTrait{ public Unit currentUnit; int droneID = -1; boolean solid = true; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java index a0e1545255..7db33b0cac 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java @@ -7,6 +7,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.gen.Call; 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.ucore.graphics.Draw; @@ -19,15 +20,30 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.threads; -public class SortedUnloader extends Unloader implements SelectionTrait{ +public class SortedUnloader extends Block implements SelectionTrait{ protected float speed = 1f; + protected final int timerUnload = timers++; + private static Item lastItem; public SortedUnloader(String name){ super(name); + update = true; + solid = true; + health = 70; + hasItems = true; configurable = true; } + @Override + public boolean canDump(Tile tile, Tile to, Item item){ + Block block = to.target().block(); + return !(block instanceof StorageBlock); + } + + @Override + public void setBars(){} + @Override public void playerPlaced(Tile tile){ threads.runDelay(() -> Call.setSortedUnloaderItem(null, tile, lastItem)); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index b6d2c738a9..530e49171c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -1,20 +1,10 @@ package io.anuke.mindustry.world.blocks.storage; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.Unit; -import io.anuke.mindustry.graphics.Palette; -import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.core.Graphics; -import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.graphics.Fill; - -import static io.anuke.mindustry.Vars.tilesize; public abstract class StorageBlock extends Block{ @@ -23,6 +13,16 @@ public abstract class StorageBlock extends Block{ hasItems = true; } + @Override + public boolean acceptItem(Item item, Tile tile, Tile source){ + return tile.entity.items.get(item) < itemCapacity; + } + + @Override + public int getMaximumAccepted(Tile tile, Item item){ + return itemCapacity; + } + @Override public void setBars(){ super.setBars(); @@ -34,85 +34,6 @@ public abstract class StorageBlock extends Block{ return false; } - @Override - public void onProximityAdded(Tile tile){ - StorageEntity entity = tile.entity(); - entity.graph.set(tile); - - for(Tile prox : tile.entity.proximity()){ - if(prox.block() instanceof StorageBlock){ - StorageEntity other = prox.entity(); - entity.graph.merge(other.graph); - } - } - } - - @Override - public void onProximityRemoved(Tile tile){ - StorageEntity entity = tile.entity(); - entity.graph.remove(tile); - } - - @Override - public void drawSelect(Tile tile){ - - StorageEntity entity = tile.entity(); - - if(entity.graph.getTiles().size > 1){ - - Shaders.outline.color.set(Palette.accent); - Graphics.beginShaders(Shaders.outline); - - for(Tile other : entity.graph.getTiles()){ - Fill.square(other.drawx(), other.drawy(), other.block().size * tilesize); - } - - Draw.color(Color.CLEAR); - Graphics.endShaders(); - Draw.color(); - } - } - - @Override - public boolean acceptItem(Item item, Tile tile, Tile source){ - StorageEntity entity = tile.entity(); - return entity.graph.accept(item); - } - - @Override - public int acceptStack(Item item, int amount, Tile tile, Unit source){ - StorageEntity entity = tile.entity(); - if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){ - return Math.min(entity.graph.accept(item, amount), amount); - }else{ - return 0; - } - } - - @Override - public float inventoryScaling(Tile tile){ - StorageEntity entity = tile.entity(); - return 1f / entity.graph.getTiles().size; - } - - @Override - public TileEntity newEntity(){ - return new StorageEntity(); - } - - @Override - public Array getDebugInfo(Tile tile){ - Array arr = super.getDebugInfo(tile); - - StorageEntity entity = tile.entity(); - arr.addAll("storage graph", entity.graph.getID(), - "graph capacity", entity.graph.getCapacity(), - "graph tiles", entity.graph.getTiles().size, - "graph item ID", entity.graph.items().getID()); - - return arr; - } - /** * Removes an item and returns it. If item is not null, it should return the item. * Returns null if no items are there. @@ -144,8 +65,4 @@ public abstract class StorageBlock extends Block{ return entity.items.has(item); } } - - public class StorageEntity extends TileEntity{ - public StorageGraph graph = new StorageGraph(); - } } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java deleted file mode 100644 index fd8edb912b..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java +++ /dev/null @@ -1,151 +0,0 @@ -package io.anuke.mindustry.world.blocks.storage; - -import com.badlogic.gdx.utils.IntSet; -import com.badlogic.gdx.utils.ObjectSet; -import com.badlogic.gdx.utils.Queue; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.storage.StorageBlock.StorageEntity; -import io.anuke.mindustry.world.modules.ItemModule; - -public class StorageGraph{ - private static IntSet closedSet = new IntSet(); - private static Queue queue = new Queue<>(); - private static ObjectSet itemSet = new ObjectSet<>(); - private static int lastID; - - private final int id = lastID++; - private ObjectSet tiles = new ObjectSet<>(); - private ItemModule items = new ItemModule(); - private int capacity; - - public void set(Tile tile){ - items.addAll(tile.entity.items); - items.setID(tile.entity.items.getID()); - - add(tile); - } - - public void add(Tile tile){ - - if(!tiles.add(tile)) return; - - StorageEntity e = tile.entity(); - e.graph = this; - - capacity += tile.block().itemCapacity; - - if(tile.entity.items != null && tile.entity.items.getID() != items.getID()){ - items.addAll(tile.entity.items); - } - - tile.entity.items = items; - } - - public void remove(Tile tile){ - if(!tiles.contains(tile)) return; - - for(Tile other : tiles){ - if(other == tile) continue; - - StorageEntity entity = other.entity(); - entity.graph = null; - entity.items = new ItemModule(); - - float fraction = (float)other.block().itemCapacity / capacity; - items.forEach((item, amount) -> { - int added = (int)(fraction * amount); - entity.items.add(item, added); - items.remove(item, added); - }); - } - - //handle remaining items that didn't get added - Item taken; - while((taken = items.take()) != null){ - for(Tile other : tiles){ - if(other == tile) continue; - - //insert item into first found block - if(other.entity.items.get(taken) < other.block().itemCapacity){ - other.entity.items.add(taken, 1); - break; - } - } - } - - items.clear(); - capacity = 0; - - for(Tile other : tile.entity.proximity()){ - if(other.block() instanceof StorageBlock && other.entity().graph == null){ - StorageGraph graph = new StorageGraph(); - other.entity().graph = graph; - graph.reflow(tile, other); - } - } - } - - public void reflow(Tile base, Tile tile){ - queue.clear(); - queue.addLast(tile); - closedSet.clear(); - itemSet.clear(); - - while(queue.size > 0){ - Tile child = queue.removeFirst(); - StorageEntity entity = child.entity(); - entity.graph = this; - - if(!itemSet.add(child.entity.items)) child.entity.items = null; - add(child); - - for(Tile next : child.entity.proximity()){ - if(next != base && next.block() instanceof StorageBlock && next.entity().graph == null && !closedSet.contains(next.pos())){ - queue.addLast(next); - closedSet.add(next.pos()); - } - } - } - } - - public void merge(StorageGraph other){ - if(this == other || other == null) return; - - itemSet.clear(); - for(Tile tile : other.tiles){ - if(!itemSet.add(tile.entity.items)){ - tile.entity.items = null; - } - } - - for(Tile tile : other.tiles){ - add(tile); - } - } - - public boolean accept(Item item){ - return accept(item, 1) == 1; - } - - public int accept(Item item, int amount){ - return Math.min(capacity - items.get(item), amount); - } - - public ObjectSet getTiles(){ - return tiles; - } - - public int getID(){ - return id; - } - - public int getCapacity(){ - return capacity; - } - - public ItemModule items(){ - return items; - } - -} diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java deleted file mode 100644 index c42c272985..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.anuke.mindustry.world.blocks.storage; - -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; - -public abstract class Unloader extends Block{ - protected final int timerUnload = timers++; - - public Unloader(String name){ - super(name); - update = true; - solid = true; - health = 70; - hasItems = true; - } - - @Override - public boolean canDump(Tile tile, Tile to, Item item){ - Block block = to.target().block(); - return !(block instanceof StorageBlock); - } - - @Override - public void setBars(){} -} diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java b/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java index 28beaad8f2..4ee9cf97b7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java @@ -7,7 +7,6 @@ public class Vault extends StorageBlock{ solid = true; update = false; destructible = true; - itemCapacity = 1000; } } From b427185fac832b68895f2ae1ad397507edd7baa6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 7 Dec 2018 19:32:44 -0500 Subject: [PATCH 40/42] 'Added' attack mode / Core inventory sharing --- core/src/io/anuke/mindustry/game/GameMode.java | 1 - core/src/io/anuke/mindustry/input/MobileInput.java | 10 +++++----- .../mindustry/world/blocks/storage/CoreBlock.java | 10 ++++++++++ .../mindustry/world/blocks/storage/StorageBlock.java | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/src/io/anuke/mindustry/game/GameMode.java b/core/src/io/anuke/mindustry/game/GameMode.java index 0e7de8475f..cd4057012a 100644 --- a/core/src/io/anuke/mindustry/game/GameMode.java +++ b/core/src/io/anuke/mindustry/game/GameMode.java @@ -13,7 +13,6 @@ public enum GameMode{ }}, attack{{ disableWaves = true; - hidden = true; enemyCheat = true; }}, victory{{ diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 314d20819e..9379b8c917 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -221,11 +221,6 @@ public class MobileInput extends InputHandler implements GestureListener{ } }).update(l -> l.setChecked(mode == breaking)); - //rotate button - table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4)) - .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)) - .visible(() -> recipe != null && recipe.result.rotate); - //cancel button table.addImageButton("icon-cancel", "clear-partial", 16 * 2f, () -> { player.clearBuilding(); @@ -233,6 +228,11 @@ public class MobileInput extends InputHandler implements GestureListener{ recipe = null; }).visible(() -> player.isBuilding() || recipe != null || mode == breaking); + //rotate button + table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4)) + .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)) + .visible(() -> recipe != null && recipe.result.rotate); + //confirm button table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> { for(PlaceRequest request : selection){ 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 3c6abdf84f..33f98fd2ce 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -82,6 +82,11 @@ public class CoreBlock extends StorageBlock{ if(entity != null) entity.solid = solid; } + @Override + public int getMaximumAccepted(Tile tile, Item item){ + return itemCapacity * state.teams.get(tile.getTeam()).cores.size; + } + @Override public void onProximityUpdate(Tile tile) { for(Tile other : state.teams.get(tile.getTeam()).cores){ @@ -100,6 +105,11 @@ public class CoreBlock extends StorageBlock{ @Override public void removed(Tile tile){ state.teams.get(tile.getTeam()).cores.remove(tile); + + int max = itemCapacity * state.teams.get(tile.getTeam()).cores.size; + for(Item item : content.items()){ + tile.entity.items.set(item, Math.min(tile.entity.items.get(item), max)); + } } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index 530e49171c..324c86008a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -15,7 +15,7 @@ public abstract class StorageBlock extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - return tile.entity.items.get(item) < itemCapacity; + return tile.entity.items.get(item) < getMaximumAccepted(tile, item); } @Override From 061c55614b2814090c4d2e3e05dc20e1bfd5c04e Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 8 Dec 2018 20:11:15 -0500 Subject: [PATCH 41/42] Balancing / Tau mech mobile block repair --- core/src/io/anuke/mindustry/content/Items.java | 2 +- core/src/io/anuke/mindustry/content/Liquids.java | 2 +- core/src/io/anuke/mindustry/content/Mechs.java | 5 +++-- core/src/io/anuke/mindustry/content/Weapons.java | 2 +- .../mindustry/content/blocks/CraftingBlocks.java | 4 ++-- .../mindustry/content/blocks/PowerBlocks.java | 2 +- .../content/blocks/ProductionBlocks.java | 4 ++-- .../mindustry/content/blocks/StorageBlocks.java | 2 +- .../mindustry/content/blocks/TurretBlocks.java | 2 +- .../mindustry/content/bullets/TurretBullets.java | 2 +- core/src/io/anuke/mindustry/entities/Player.java | 16 ++++++++++++++-- .../io/anuke/mindustry/input/MobileInput.java | 3 +++ core/src/io/anuke/mindustry/type/Mech.java | 1 + .../world/blocks/distribution/LiquidTank.java | 8 -------- .../world/blocks/power/LiquidHeatGenerator.java | 2 +- .../mindustry/world/blocks/power/PowerNode.java | 3 ++- 16 files changed, 35 insertions(+), 25 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index a19a2a4048..8c1d7064db 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -83,7 +83,7 @@ public class Items implements ContentList{ }}; biomatter = new Item("biomatter", Color.valueOf("648b55")){{ - flammability = 0.4f; + flammability = 0.55f; fluxiness = 0.3f; }}; diff --git a/core/src/io/anuke/mindustry/content/Liquids.java b/core/src/io/anuke/mindustry/content/Liquids.java index f2e8ec6c0f..fc8bb44bfb 100644 --- a/core/src/io/anuke/mindustry/content/Liquids.java +++ b/core/src/io/anuke/mindustry/content/Liquids.java @@ -26,7 +26,7 @@ public class Liquids implements ContentList{ lava = new Liquid("lava", Color.valueOf("e37341")){ { - temperature = 0.8f; + temperature = 1f; viscosity = 0.8f; tier = 2; effect = StatusEffects.melting; diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index 88fb7b6a9e..589ef08b95 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -123,6 +123,7 @@ public class Mechs implements ContentList{ speed = 0.44f; drag = 0.35f; boostSpeed = 0.8f; + canHeal = true; weapon = Weapons.healBlaster; armor = 15f; trailColorTo = Palette.heal; @@ -287,8 +288,8 @@ public class Mechs implements ContentList{ trident = new Mech("trident-ship", true){ { drillPower = 2; - speed = 0.12f; - drag = 0.035f; + speed = 0.14f; + drag = 0.034f; mass = 2.5f; turnCursor = false; armor = 20f; diff --git a/core/src/io/anuke/mindustry/content/Weapons.java b/core/src/io/anuke/mindustry/content/Weapons.java index bc77a1e784..480c8988bf 100644 --- a/core/src/io/anuke/mindustry/content/Weapons.java +++ b/core/src/io/anuke/mindustry/content/Weapons.java @@ -152,7 +152,7 @@ public class Weapons implements ContentList{ bomberTrident = new Weapon("bomber"){{ length = 0f; width = 2f; - reload = 9f; + reload = 8f; shots = 2; roundrobin = true; ejectEffect = Fx.none; diff --git a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java index b9a0a383e0..de9b602fe2 100644 --- a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java @@ -196,9 +196,9 @@ public class CraftingBlocks extends BlockList implements ContentList{ biomatterCompressor = new Compressor("biomattercompressor"){{ liquidCapacity = 60f; itemCapacity = 50; - craftTime = 25f; + craftTime = 20f; outputLiquid = Liquids.oil; - outputLiquidAmount = 1.5f; + outputLiquidAmount = 2.5f; size = 2; health = 320; hasLiquids = true; diff --git a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java index 9e3df7f685..1101a106e8 100644 --- a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java @@ -21,7 +21,7 @@ public class PowerBlocks extends BlockList implements ContentList{ thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{ maxLiquidGenerate = 2f; powerCapacity = 40f; - powerPerLiquid = 0.3f; + powerPerLiquid = 0.35f; generateEffect = BlockFx.redgeneratespark; size = 2; }}; diff --git a/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java b/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java index 8bd571620b..389cb425c7 100644 --- a/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java @@ -99,13 +99,13 @@ public class ProductionBlocks extends BlockList implements ContentList{ cultivator = new Cultivator("cultivator"){{ result = Items.biomatter; - drillTime = 260; + drillTime = 200; size = 2; hasLiquids = true; hasPower = true; consumes.power(0.08f); - consumes.liquid(Liquids.water, 0.2f); + consumes.liquid(Liquids.water, 0.15f); }}; } diff --git a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java index a4519d04cb..9972317a99 100644 --- a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java @@ -27,7 +27,7 @@ public class StorageBlocks extends BlockList implements ContentList{ }}; unloader = new SortedUnloader("unloader"){{ - speed = 12f; + speed = 7f; }}; } } diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index a3a805a557..9569fd7826 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -69,7 +69,7 @@ public class TurretBlocks extends BlockList implements ContentList{ inaccuracy = 5f; shootCone = 50f; shootEffect = ShootFx.shootLiquid; - range = 70f; + range = 90f; health = 360; drawer = (tile, entity) -> { diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index 3b356f3251..1ec5252b02 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -334,7 +334,7 @@ public class TurretBullets extends BulletList implements ContentList{ lifetime = 200f; despawneffect = BlockFx.smeltsmoke; hiteffect = BulletFx.hitBulletBig; - drag = 0.01f; + drag = 0.005f; } @Override diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index e70562a1db..c4708c9951 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -645,7 +645,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra } protected void updateFlying(){ - if(Units.invalidateTarget(target, this)){ + if(Units.invalidateTarget(target, this) && !(target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team && + mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){ target = null; } @@ -726,11 +727,22 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra isShooting = false; if(Settings.getBool("autotarget")){ target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange()); + + if(mech.canHeal && target == null){ + target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.blue)); + if(target != null && distanceTo(target) > getWeapon().getAmmo().getRange()){ + target = null; + }else if(target != null){ + target = ((Tile)target).entity; + } + } + if(target != null){ setMineTile(null); } } - }else if(target.isValid()){ + }else if(target.isValid() || (target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team && + mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){ //rotate toward and shoot the target if(mech.turnCursor){ rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 9379b8c917..f4272a40cb 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -96,6 +96,9 @@ public class MobileInput extends InputHandler implements GestureListener{ TileEntity entity = tile.entity; player.setMineTile(null); player.target = entity; + }else if(tile != null && player.mech.canHeal && tile.entity != null && tile.getTeam() == player.getTeam() && tile.entity.damaged()){ + player.setMineTile(null); + player.target = tile.entity; } } } diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index f075f1c2e1..744bf11be1 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -34,6 +34,7 @@ public class Mech extends UnlockableContent{ public Color trailColorTo = Palette.boostTo; public int itemCapacity = 30; public boolean turnCursor = true; + public boolean canHeal = false; public float weaponOffsetX, weaponOffsetY; public Weapon weapon = Weapons.blaster; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java index 84ec99523e..c73ab0d2d0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java @@ -1,16 +1,8 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; - public class LiquidTank extends LiquidRouter{ public LiquidTank(String name){ super(name); } - - @Override - public boolean canDumpLiquid(Tile tile, Tile to, Liquid liquid){ - return super.canDumpLiquid(tile, to, liquid) && !(to.block() instanceof LiquidTank); - } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java index 67a5bed015..87e5275cc9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java @@ -14,7 +14,7 @@ public class LiquidHeatGenerator extends LiquidGenerator{ public void setStats(){ super.setStats(); - stats.add(BlockStat.basePowerGeneration, maxLiquidGenerate * powerPerLiquid * 60f, StatUnit.powerSecond); + stats.add(BlockStat.basePowerGeneration, maxLiquidGenerate * powerPerLiquid * 60f * 0.5f, StatUnit.powerSecond); } @Override 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 20504efd70..3ac43cc98d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -47,7 +47,8 @@ public class PowerNode extends PowerBlock{ @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void linkPowerNodes(Player player, Tile tile, Tile other){ - if(tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other)) return; + if(tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other) + || tile.entity.power.links.size >= ((PowerNode)tile.block()).maxNodes) return; TileEntity entity = tile.entity(); From aacd9dc62ccf4568c522903701bd83293ab7a7b5 Mon Sep 17 00:00:00 2001 From: BasedUser Date: Sun, 9 Dec 2018 08:05:09 +0300 Subject: [PATCH 42/42] Update bundle_ru.properties (#369) --- core/assets/bundles/bundle_ru.properties | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 4d5e3040c6..fa1d1c3e04 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1,4 +1,4 @@ -text.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 +text.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 text.credits = Авторы text.contributors = Переводчики и контрибьюторы text.discord = Присоединяйтесь к нашему Discord! @@ -12,7 +12,7 @@ text.link.wiki.description = Официальная вики Mindustry(англ. text.linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. text.gameover = Игра окончена text.gameover.pvp = [accent] {0}[] команда победила! -text.sector.gameover = Этот сектор потерян. Высадится повторно? +text.sector.gameover = Этот сектор потерян. Высадиться повторно? text.sector.retry = Повторить попытку text.highscore = [YELLOW]Новый рекорд! text.wave.lasted = Вы продержались до [accent]{0}[]-ой волны. @@ -49,9 +49,9 @@ text.mission.main = Главная мисия:[LIGHT_GRAY] {0} text.mission.info = Информация о миссии text.mission.complete = Миссия выполнена! text.mission.complete.body = Сектор {0},{1} был завоёван. -text.mission.wave = Осталось[accent] {0}[] волн из[accent] {1}[]\nВолна через {2} -text.mission.wave.enemies = Осталось[accent] {0}/{1}[] волн:\n{2} враг. -text.mission.wave.enemy = Осталось[accent] {0}/{1}[] волн\n{2} враг +text.mission.wave = Волна[accent] {0}[] из[accent] {1}[]\nВолна через {2} +text.mission.wave.enemies = Волна[accent] {0} из {1}[]\n{2} враг. +text.mission.wave.enemy = Волна[accent] {0} из {1}[]\n{2} враг text.mission.wave.menu = Пережить[accent] {0} []волн text.mission.battle = Уничтожьте ядро противника. text.mission.resource.menu = Добыть {0} х{1} @@ -266,7 +266,7 @@ text.error.invalidaddress = Некорректный адрес. text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry! text.error.alreadyconnected = Вы уже подключены. -text.error.mapnotfound = Map file not found! +text.error.mapnotfound = Не найден файл карты! text.error.any = Неизвестная сетевая ошибка. text.settings.language = Язык text.settings.reset = Сбросить по умолчанию @@ -345,7 +345,7 @@ text.category.power = Энергия text.category.liquids = Жидкости text.category.items = Предметы text.category.crafting = Создание -text.category.shooting = Cтрельба +text.category.shooting = Стрельба text.category.optional = Дополнительные улучшения setting.autotarget.name = Авто-цель setting.fpscap.name = Макс. FPS @@ -407,8 +407,8 @@ mode.waves.name = Волны mode.waves.description = Обычный режим. В режиме "Волны" надо самим добывать ресурсы и сами волны идут безостановочно. mode.sandbox.name = Песочница mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. -mode.freebuild.name = Cвободная\nстрой -mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. +mode.freebuild.name = Свободная\nстройка +mode.freebuild.description = Ограниченные ресурсы и нет таймера для волн. mode.pvp.name = Противо-\nстояние mode.pvp.description = боритесь против других игроков. content.item.name = Предметы @@ -435,7 +435,7 @@ item.silicon.description = Очень полезный полупроводни item.plastanium.name = Пластиний item.plastanium.description = Легкий, пластичный материал, используемый в современных самолетах и боеприпасах для фрагментации. item.phase-fabric.name = Фазовая ткань -item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. +item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. Непригодна для вышивания. item.surge-alloy.name = Высокопрочный сплав item.surge-alloy.description = Передовой сплав с уникальными электрическими свойствами. item.biomatter.name = Биоматерия @@ -461,7 +461,7 @@ mech.delta-mech.description = Быстрый, легкобронированны mech.tau-mech.name = Тау mech.tau-mech.weapon = Восстановительный лазер mech.tau-mech.ability = Регенирирующая вспышка -mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления. +mech.tau-mech.description = Мех поддержки. Чинит союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления. mech.omega-mech.name = Омега mech.omega-mech.weapon = Ракетомётный пулемётконфигурация mech.omega-mech.ability = Защитная @@ -498,7 +498,7 @@ block.constructing = {0}[LIGHT_GRAY](В процессе) block.spawn.name = Точка появления врагов block.core.name = Ядро block.space.name = Пустота -block.metalfloor.name = Мeталичeский пoл +block.metalfloor.name = Металлическая плита block.deepwater.name = Глубоководье block.water.name = Вода block.lava.name = Лава @@ -731,8 +731,8 @@ block.solar-panel-large.description = Зелёная энергия. Больш block.thorium-reactor.description = Производит энергию в большом количестве. Может взорваться. Требуется торий и жидкость для охлаждения (вода или криогенная). block.rtg-generator.description = Радиоизотопный термоэлектрический генератор, который не требует охлаждения, но обеспечивает меньшую мощность, чем ториевый реактор. block.unloader.description = Выгружает из ядра или хранилища верхний левый предмет. -block.container.description = Хранит небольшое количество предметов(250). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. -block.vault.description = Хранит большое количество предметов(1000). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.container.description = Хранит небольшое количество предметов(200). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.vault.description = Хранит большое количество предметов(900). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[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] воду[] для увеличения скорости сверления.