diff --git a/core/assets-raw/sprites/blocks/payload/payload-loader-in.png b/core/assets-raw/sprites/blocks/payload/payload-loader-in.png new file mode 100644 index 0000000000..f8427f0ba9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-loader-in.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-loader-out.png b/core/assets-raw/sprites/blocks/payload/payload-loader-out.png new file mode 100644 index 0000000000..afb61bf138 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-loader-out.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-loader-top.png b/core/assets-raw/sprites/blocks/payload/payload-loader-top.png index 2207273e02..4c737ab093 100644 Binary files a/core/assets-raw/sprites/blocks/payload/payload-loader-top.png and b/core/assets-raw/sprites/blocks/payload/payload-loader-top.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-loader.png b/core/assets-raw/sprites/blocks/payload/payload-loader.png index 19762a9ef4..0262be6c74 100644 Binary files a/core/assets-raw/sprites/blocks/payload/payload-loader.png and b/core/assets-raw/sprites/blocks/payload/payload-loader.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-unloader-in.png b/core/assets-raw/sprites/blocks/payload/payload-unloader-in.png new file mode 100644 index 0000000000..f8427f0ba9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-unloader-in.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-unloader-out.png b/core/assets-raw/sprites/blocks/payload/payload-unloader-out.png new file mode 100644 index 0000000000..afb61bf138 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-unloader-out.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-unloader-top.png b/core/assets-raw/sprites/blocks/payload/payload-unloader-top.png index 34ec963e54..1590a12792 100644 Binary files a/core/assets-raw/sprites/blocks/payload/payload-unloader-top.png and b/core/assets-raw/sprites/blocks/payload/payload-unloader-top.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-unloader.png b/core/assets-raw/sprites/blocks/payload/payload-unloader.png index 2511a0db65..fb55b6eb6f 100644 Binary files a/core/assets-raw/sprites/blocks/payload/payload-unloader.png and b/core/assets-raw/sprites/blocks/payload/payload-unloader.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/afflict/afflict.png b/core/assets-raw/sprites/blocks/turrets/afflict/afflict.png index d62f5abc79..8b2c7fd1f8 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/afflict/afflict.png and b/core/assets-raw/sprites/blocks/turrets/afflict/afflict.png differ diff --git a/core/src/mindustry/ai/ControlPathfinder.java b/core/src/mindustry/ai/ControlPathfinder.java index cc0d09d66e..c6e1c5aa86 100644 --- a/core/src/mindustry/ai/ControlPathfinder.java +++ b/core/src/mindustry/ai/ControlPathfinder.java @@ -16,10 +16,9 @@ import mindustry.world.*; import static mindustry.Vars.*; import static mindustry.ai.Pathfinder.*; -//TODO I'm sure this class has countless problems public class ControlPathfinder{ private static final long maxUpdate = Time.millisToNanos(20); - private static final int updateFPS = 50; + private static final int updateFPS = 60; private static final int updateInterval = 1000 / updateFPS; public static boolean showDebug = false; @@ -202,6 +201,7 @@ public class ControlPathfinder{ for(int i = len - 1; i >= idx; i--){ Tile tile = tile(items[i]); float dst = unit.dst2(tile); + //TODO maybe put this on a timer since raycasts can be expensive? if(dst < minDst && !permissiveRaycast(pathType, tileX, tileY, tile.x, tile.y)){ req.pathIndex = Math.max(dst <= range * range ? i + 1 : i, req.pathIndex); minDst = Math.min(dst, minDst); @@ -401,7 +401,6 @@ public class ControlPathfinder{ } } - //TODO each one of these could run in its own thread. static class PathRequest{ final PathfindThread thread; diff --git a/core/src/mindustry/ai/types/MissileAI.java b/core/src/mindustry/ai/types/MissileAI.java index 80ceee9f93..d1d6bbc962 100644 --- a/core/src/mindustry/ai/types/MissileAI.java +++ b/core/src/mindustry/ai/types/MissileAI.java @@ -29,7 +29,8 @@ public class MissileAI extends AIController{ } @Override - public void updateTargeting(){ - //no + public boolean retarget(){ + //more frequent retarget due to high speed. TODO won't this lag? + return timer.get(timerTarget, 10f); } } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 93dfbe413f..6f944bff4f 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -145,7 +145,7 @@ public class Blocks{ droneCenter, //payloads - payloadConveyor, payloadRouter, reinforcedPayloadConveyor, reinforcedPayloadRouter, payloadPropulsionTower, smallDeconstructor, deconstructor, constructor, largeConstructor, payloadLoader, payloadUnloader, + payloadConveyor, payloadRouter, reinforcedPayloadConveyor, reinforcedPayloadRouter, payloadMassDriver, payloadPropulsionTower, smallDeconstructor, deconstructor, constructor, largeConstructor, payloadLoader, payloadUnloader, //logic @@ -3575,6 +3575,18 @@ public class Blocks{ canOverdrive = false; }}; + //TODO + if(false) + payloadMassDriver = new PayloadMassDriver("payload-mass-driver"){{ + requirements(Category.units, with(Items.tungsten, 120, Items.silicon, 120, Items.oxide, 60)); + size = 3; + reloadTime = 150f; + chargeTime = 120f; + range = 300f; + maxPayloadSize = 2.5f; + consumes.power(3f); + }}; + payloadPropulsionTower = new PayloadMassDriver("payload-propulsion-tower"){{ requirements(Category.units, with(Items.thorium, 300, Items.silicon, 200, Items.plastanium, 200, Items.phaseFabric, 50)); size = 5; @@ -3623,14 +3635,14 @@ public class Blocks{ }}; payloadLoader = new PayloadLoader("payload-loader"){{ - requirements(Category.units, with(Items.graphite, 50, Items.silicon, 50, Items.copper, 100)); + requirements(Category.units, with(Items.graphite, 50, Items.silicon, 50, Items.tungsten, 80)); hasPower = true; consumes.power(2f); size = 3; }}; payloadUnloader = new PayloadUnloader("payload-unloader"){{ - requirements(Category.units, with(Items.graphite, 50, Items.silicon, 50, Items.copper, 100)); + requirements(Category.units, with(Items.graphite, 50, Items.silicon, 50, Items.oxide, 30)); hasPower = true; consumes.power(2f); size = 3; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 2086bf09bb..197996422a 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -3130,6 +3130,7 @@ public class UnitTypes{ isCounted = false; envDisabled = 0; + targetPriority = -2; lowAltitude = false; mineWalls = true; mineFloor = false; @@ -3186,6 +3187,7 @@ public class UnitTypes{ isCounted = false; envDisabled = 0; + targetPriority = -2; lowAltitude = false; mineWalls = true; mineFloor = false; @@ -3254,6 +3256,8 @@ public class UnitTypes{ isCounted = false; envDisabled = 0; + ; + lowAltitude = false; mineWalls = true; mineFloor = false; diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index e51c95b13e..095c380c86 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -271,14 +271,16 @@ public class Units{ result = null; cdist = 0f; + cpriority = -99999f; nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { if(e.dead() || !predicate.get(e) || e.team == Team.derelict || !e.type.targetable) return; float dst2 = e.dst2(x, y) - (e.hitSize * e.hitSize); - if(dst2 < range*range && (result == null || dst2 < cdist)){ + if(dst2 < range*range && (result == null || dst2 < cdist || e.type.targetPriority > cpriority) && e.type.targetPriority >= cpriority){ result = e; cdist = dst2; + cpriority = e.type.targetPriority; } }); @@ -297,7 +299,7 @@ public class Units{ if(e.dead() || !predicate.get(e) || e.team == Team.derelict || !e.within(x, y, range + e.hitSize/2f) || !e.type.targetable) return; float cost = sort.cost(e, x, y); - if((result == null || cost < cdist) && e.type.targetPriority >= cpriority){ + if((result == null || cost < cdist || e.type.targetPriority > cpriority) && e.type.targetPriority >= cpriority){ result = e; cdist = cost; cpriority = e.type.targetPriority; diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 80803cff07..07ab619cbc 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -124,8 +124,13 @@ public class DesktopInput extends InputHandler{ Position lineDest = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; Tmp.v1.set(lineDest).sub(unit).setLength(unit.hitSize / 2f); + Tmp.v2.set(Tmp.v1).scl(-1f).setLength(3.5f); - Drawf.line(Pal.accent, unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, lineDest.getX(), lineDest.getY()); + Drawf.line(Pal.accent, unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, lineDest.getX() + Tmp.v2.x, lineDest.getY() + Tmp.v2.y); + + if(ai.attackTarget == null){ + Drawf.square(lineDest.getX(), lineDest.getY(), 3.5f); + } } Drawf.square(unit.x, unit.y, unit.hitSize / 1.4f + 1f);