diff --git a/core/assets-raw/sprites/blocks/extra/block-select.png b/core/assets-raw/sprites/blocks/extra/block-select.png index f2c77caa2b..559131b263 100644 Binary files a/core/assets-raw/sprites/blocks/extra/block-select.png and b/core/assets-raw/sprites/blocks/extra/block-select.png differ diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 3b1dbc0ad1..3c65367e70 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index cd296a0692..ad6c6a173f 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -355,7 +355,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public void drawOver(){ if(dead) return; - drawMechanics(); + if(isBuilding()){ + if(!state.isPaused()){ + drawBuilding(); + } + }else{ + drawMining(); + } } @Override diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 767ffa9ec2..e07f10316e 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -10,11 +10,10 @@ import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.type.base.*; -import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.Block.*; import static io.anuke.arc.Core.camera; import static io.anuke.mindustry.Vars.*; @@ -131,7 +130,7 @@ public class BlockRenderer implements Disposable{ if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue; Draw.alpha(0.5f); - Draw.mixcol(Pal.accent, 0.2f + Mathf.absin(5f, 0.2f)); + Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime(), 6f, 0.2f)); Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f); } Draw.reset(); diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 09e7025003..4dfd2b6d01 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -7,19 +7,13 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.*; import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.PlaceUtils.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; -import java.util.*; - import static io.anuke.arc.Core.scene; import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.input.PlaceMode.*; @@ -44,7 +38,7 @@ public class DesktopInput extends InputHandler{ @Override public void buildUI(Group group){ group.fill(t -> { - t.bottom().update(() -> t.getColor().a = Mathf.lerpDelta(t.getColor().a, player.isBuilding() ? 1f : 0f, 0.1f)); + t.bottom().update(() -> t.getColor().a = Mathf.lerpDelta(t.getColor().a, player.isBuilding() ? 1f : 0f, 0.15f)); t.table(Styles.black6, b -> b.add(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.name())).style(Styles.outlineLabel)).margin(10f); }); } @@ -65,36 +59,7 @@ public class DesktopInput extends InputHandler{ drawRequest(lineRequests.get(i)); } }else if(mode == breaking){ - NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, selectX, selectY, cursorX, cursorY, false, maxLength, 1f); - NormalizeResult dresult = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength); - - for(int x = dresult.x; x <= dresult.x2; x++){ - for(int y = dresult.y; y <= dresult.y2; y++){ - Tile tile = world.ltile(x, y); - if(tile == null || !validBreak(tile.x, tile.y)) continue; - - drawBreaking(tile.x, tile.y); - } - } - - Tmp.r1.set(result.x, result.y, result.x2 - result.x, result.y2 - result.y); - - Draw.color(Pal.remove); - Lines.stroke(1f); - - for(BuildRequest req : player.buildQueue()){ - if(req.breaking) continue; - if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ - drawBreaking(req); - } - } - - Lines.stroke(2f); - - Draw.color(Pal.removeBack); - Lines.rect(result.x, result.y - 1, result.x2 - result.x, result.y2 - result.y); - Draw.color(Pal.remove); - Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); + drawSelection(selectX, selectY, cursorX, cursorY); }else if(isPlacing()){ if(block.rotate){ drawArrow(block, cursorX, cursorY, rotation); @@ -257,24 +222,7 @@ public class DesktopInput extends InputHandler{ lineRequests.clear(); Events.fire(new LineConfirmEvent()); }else if(mode == breaking){ //touch up while breaking, break everything in selection - NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength); - for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){ - for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){ - int wx = selectX + x * Mathf.sign(cursorX - selectX); - int wy = selectY + y * Mathf.sign(cursorY - selectY); - - tryBreakBlock(wx, wy); - } - } - - Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize); - Iterator it = player.buildQueue().iterator(); - while(it.hasNext()){ - BuildRequest req = it.next(); - if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ - it.remove(); - } - } + removeSelection(selectX, selectY, cursorX, cursorY); } if(selected != null){ diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 8c6500de6b..9ba51b1572 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -20,13 +20,17 @@ import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.input.PlaceUtils.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.fragments.*; import io.anuke.mindustry.world.*; +import java.util.*; + import static io.anuke.mindustry.Vars.*; public abstract class InputHandler implements InputProcessor, GestureListener{ @@ -189,18 +193,23 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return false; } + public void drawSelected(int x, int y, Block block, Color color){ + Draw.color(Pal.remove); + for(int i = 0; i < 4; i++){ + Point2 p = Geometry.d8edge[i]; + float offset = -Math.max(block.size - 1, 0) / 2f * tilesize; + Draw.rect("block-select", + x*tilesize + block.offset() + offset * p.x, + y*tilesize + block.offset() + offset * p.y, i * 90); + } + Draw.reset(); + } + public void drawBreaking(BuildRequest request){ if(request.breaking){ drawBreaking(request.x, request.y); }else{ - Block block = request.block; - Draw.color(Pal.remove); - for(int i = 0; i < 4; i++){ - Point2 p = Geometry.d8edge[i]; - float offset = -Math.max(block.size - 1, 0) / 2f * tilesize; - Draw.rect("block-select", request.drawx() + offset * p.x, request.drawy() + offset * p.y, i * 90); - } - Draw.reset(); + drawSelected(request.x, request.y, request.block, Pal.remove); } } @@ -209,13 +218,47 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(tile == null) return; Block block = tile.block(); - Draw.color(Pal.remove); - for(int i = 0; i < 4; i++){ - Point2 p = Geometry.d8edge[i]; - float offset = -Math.max(block.size - 1, 0) / 2f * tilesize; - Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90); + drawSelected(x, y, block, Pal.remove); + } + + protected void drawSelection(int x1, int y1, int x2, int y2){ + NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); + NormalizeResult dresult = PlaceUtils.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); + + for(int x = dresult.x; x <= dresult.x2; x++){ + for(int y = dresult.y; y <= dresult.y2; y++){ + Tile tile = world.ltile(x, y); + if(tile == null || !validBreak(tile.x, tile.y)) continue; + + drawBreaking(tile.x, tile.y); + } } - Draw.reset(); + + Tmp.r1.set(result.x, result.y, result.x2 - result.x, result.y2 - result.y); + + Draw.color(Pal.remove); + Lines.stroke(1f); + + for(BuildRequest req : player.buildQueue()){ + if(req.breaking) continue; + if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ + drawBreaking(req); + } + } + + for(BrokenBlock req : state.teams.get(player.getTeam()).brokenBlocks){ + Block block = content.block(req.block); + if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){ + drawSelected(req.x, req.y, content.block(req.block), Pal.remove); + } + } + + Lines.stroke(2f); + + Draw.color(Pal.removeBack); + Lines.rect(result.x, result.y - 1, result.x2 - result.x, result.y2 - result.y); + Draw.color(Pal.remove); + Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); } protected void flushRequests(Array requests){ @@ -236,6 +279,39 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ block.drawRequest(brequest, allRequests(), validPlace(x, y, block, rotation)); } + /** Remove everything from the queue in a selection. */ + protected void removeSelection(int x1, int y1, int x2, int y2){ + NormalizeResult result = PlaceUtils.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); + for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){ + for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){ + int wx = x1 + x * Mathf.sign(x2 - x1); + int wy = y1 + y * Mathf.sign(y2 - y1); + + tryBreakBlock(wx, wy); + } + } + + //remove build requests + Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize); + Iterator it = player.buildQueue().iterator(); + while(it.hasNext()){ + BuildRequest req = it.next(); + if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ + it.remove(); + } + } + + //remove blocks to rebuild + Iterator broken = state.teams.get(player.getTeam()).brokenBlocks.iterator(); + while(broken.hasNext()){ + BrokenBlock req = broken.next(); + Block block = content.block(req.block); + if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){ + broken.remove(); + } + } + } + protected void updateLine(int selectX, int selectY){ lineRequests.clear(); iterateLine(selectX, selectY, tileX(getMouseX()), tileY(getMouseY()), l -> { diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index a7ed57ce63..d98d901e1d 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -48,8 +48,6 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Used for shifting build requests. */ private float shiftDeltaX, shiftDeltaY; - /** List of currently selected tiles to place. */ - private Array selection = new Array<>(); /** Place requests to be removed. */ private Array removals = new Array<>(); /** Whether or not the player is currently shifting all placed tiles. */ @@ -98,7 +96,7 @@ public class MobileInput extends InputHandler implements GestureListener{ r2.setSize(block.size * tilesize); r2.setCenter(x * tilesize + block.offset(), y * tilesize + block.offset()); - for(BuildRequest req : selection){ + for(BuildRequest req : selectRequests){ Tile other = req.tile(); if(other == null || req.breaking) continue; @@ -131,7 +129,7 @@ public class MobileInput extends InputHandler implements GestureListener{ r2.setSize(tilesize); r2.setCenter(tile.worldx(), tile.worldy()); - for(BuildRequest req : selection){ + for(BuildRequest req : selectRequests){ Tile other = req.tile(); if(other == null) continue; @@ -156,7 +154,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } void removeRequest(BuildRequest request){ - selection.removeValue(request, true); + selectRequests.removeValue(request, true); removals.add(request); } @@ -194,7 +192,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //confirm button table.addImageButton(Icon.checkSmall, Styles.clearPartiali, () -> { - for(BuildRequest request : selection){ + for(BuildRequest request : selectRequests){ Tile tile = request.tile(); //actually place/break all selected blocks @@ -212,10 +210,10 @@ public class MobileInput extends InputHandler implements GestureListener{ } //move all current requests to removal array so they fade out - removals.addAll(selection); - selection.clear(); + removals.addAll(selectRequests); + selectRequests.clear(); selecting = false; - }).visible(() -> !selection.isEmpty()).name("confirmplace"); + }).visible(() -> !selectRequests.isEmpty()).name("confirmplace"); } @Override @@ -232,7 +230,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public boolean isDrawing(){ - return selection.size > 0 || removals.size > 0 || lineMode || player.target != null || mode != PlaceMode.none; + return selectRequests.size > 0 || removals.size > 0 || lineMode || player.target != null || mode != PlaceMode.none; } @Override @@ -257,7 +255,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //draw list of requests - for(BuildRequest request : selection){ + for(BuildRequest request : selectRequests){ Tile tile = request.tile(); if(tile == null) continue; @@ -296,7 +294,7 @@ public class MobileInput extends InputHandler implements GestureListener{ int tileX = tileX(Core.input.mouseX()); int tileY = tileY(Core.input.mouseY()); - if(mode == placing && block != null){ + /*if(mode == placing && block != null){ //draw placing iterateLine(lineStartX, lineStartY, tileX, tileY, l -> { @@ -307,7 +305,8 @@ public class MobileInput extends InputHandler implements GestureListener{ rotation = l.rotation; }); - }else if(mode == breaking){ + }else */ + if(mode == breaking){ //draw breaking NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, lineStartX, lineStartY, tileX, tileY, false, maxLength, 1f); NormalizeResult dresult = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, false, maxLength); @@ -330,7 +329,6 @@ public class MobileInput extends InputHandler implements GestureListener{ Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); } - } TargetTrait target = player.target; @@ -409,7 +407,7 @@ public class MobileInput extends InputHandler implements GestureListener{ BuildRequest request = new BuildRequest(l.x, l.y, l.rotation, block); request.animScale = 1f; - selection.add(request); + selectRequests.add(request); }); Events.fire(new LineConfirmEvent()); }else if(mode == breaking){ @@ -429,7 +427,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(!hasRequest(world.tile(tar.x, tar.y)) && validBreak(tar.x, tar.y)){ BuildRequest request = new BuildRequest(tar.x, tar.y); request.animScale = 1f; - selection.add(request); + selectRequests.add(request); } } } @@ -490,11 +488,11 @@ public class MobileInput extends InputHandler implements GestureListener{ removeRequest(getRequest(cursor)); }else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){ //add to selection queue if it's a valid place position - selection.add(lastPlaced = new BuildRequest(cursor.x, cursor.y, rotation, block)); + selectRequests.add(lastPlaced = new BuildRequest(cursor.x, cursor.y, rotation, block)); }else if(mode == breaking && validBreak(cursor.link().x, cursor.link().y) && !hasRequest(cursor.link())){ //add to selection queue if it's a valid BREAK position cursor = cursor.link(); - selection.add(new BuildRequest(cursor.x, cursor.y)); + selectRequests.add(new BuildRequest(cursor.x, cursor.y)); }else if(!canTapPlayer(worldx, worldy) && !tileTapped(cursor.link())){ tryBeginMine(cursor); } @@ -505,7 +503,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public void update(){ if(state.is(State.menu) || player.isDead()){ - selection.clear(); + selectRequests.clear(); removals.clear(); mode = none; } @@ -535,8 +533,8 @@ public class MobileInput extends InputHandler implements GestureListener{ if(mode == none){ selecting = false; lineMode = false; - removals.addAll(selection); - selection.clear(); + removals.addAll(selectRequests); + selectRequests.clear(); } if(lineMode && mode == placing && block == null){ @@ -628,7 +626,7 @@ public class MobileInput extends InputHandler implements GestureListener{ int shiftedY = (int)(shiftDeltaY / tilesize); if(Math.abs(shiftedX) > 0 || Math.abs(shiftedY) > 0){ - for(BuildRequest req : selection){ + for(BuildRequest req : selectRequests){ if(req.breaking) continue; //don't shift removal requests req.x += shiftedX; req.y += shiftedY; diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 76e7ce5e09..f1fceb5ce3 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -257,7 +257,7 @@ public abstract class SaveVersion extends SaveFileReader{ TeamData data = state.teams.get(team); int blocks = stream.readInt(); for(int j = 0; j < blocks; j++){ - data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), stream.readShort(), stream.readInt())); + data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, stream.readInt())); } } diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 8678b9b0c4..fe618ab7d9 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -669,7 +669,7 @@ public class Block extends BlockStorage{ public void drawRequest(BuildRequest req, Eachable list, boolean valid){ Draw.reset(); - Draw.mixcol(!valid ? Pal.breakInvalid : Pal.accent, 0.24f + Mathf.absin(Time.globalTime(), 7f, 0.3f)); + Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime(), 6f, 0.28f)); Draw.alpha(1f); drawRequestRegion(req, list); Draw.reset(); diff --git a/gradle.properties b/gradle.properties index 8a382fec2a..f5341b4f6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=5b52af54b7f87db9732c4fa97781b2f2ae09c5ab +archash=92070bb15802eb8a37b9c0734caffc6fecb557fc