From 2d6db1583bf8f4d74cdec03a22adffc275b7b0cf Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 10 Dec 2020 12:51:07 -0500 Subject: [PATCH] Improved approach behavior in formations/logic --- core/src/mindustry/ai/types/FormationAI.java | 14 +++---------- core/src/mindustry/ai/types/LogicAI.java | 21 ++++++++++++++++++- .../src/mindustry/entities/comp/MechComp.java | 8 +++++++ .../src/mindustry/entities/comp/UnitComp.java | 5 +++++ gradle.properties | 2 +- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index bb4182c254..026d323488 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -37,7 +37,6 @@ public class FormationAI extends AIController implements FormationMember{ } unit.controlWeapons(true, leader.isShooting); - // unit.moveAt(Tmp.v1.set(deltaX, deltaY).limit(unit.type().speed)); unit.aim(leader.aimX(), leader.aimY()); @@ -47,17 +46,10 @@ public class FormationAI extends AIController implements FormationMember{ unit.lookAt(unit.vel.angle()); } - Vec2 realtarget = vec.set(target); + Vec2 realtarget = vec.set(target).add(leader.vel.x, leader.vel.y); - float margin = 4f; - - float speed = unit.realSpeed(); - - if(unit.dst(realtarget) <= margin){ - //unit.vel.approachDelta(Vec2.ZERO, speed * type.accel / 2f); - }else{ - unit.moveAt(realtarget.sub(unit).limit(speed)); - } + float speed = unit.realSpeed() * unit.floorSpeedMultiplier(); + unit.approach(Mathf.arrive(unit.x, unit.y, realtarget.x, realtarget.y, unit.vel, 0f, 0.01f, speed, 1f)); if(unit.canMine() && leader.canMine()){ if(leader.mineTile != null && unit.validMine(leader.mineTile)){ diff --git a/core/src/mindustry/ai/types/LogicAI.java b/core/src/mindustry/ai/types/LogicAI.java index 3384af0b2f..a0eb6d1fa9 100644 --- a/core/src/mindustry/ai/types/LogicAI.java +++ b/core/src/mindustry/ai/types/LogicAI.java @@ -1,6 +1,7 @@ package mindustry.ai.types; import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.ai.*; @@ -67,7 +68,7 @@ public class LogicAI extends AIController{ moveTo(Tmp.v1.set(moveX, moveY), 1f, 30f); } case approach -> { - moveTo(Tmp.v1.set(moveX, moveY), moveRad - 8f, 8f); + moveTo(Tmp.v1.set(moveX, moveY), moveRad - 7f, 7); } case pathfind -> { Building core = unit.closestEnemyCore(); @@ -112,6 +113,24 @@ public class LogicAI extends AIController{ return radars.add(radar); } + @Override + protected void moveTo(Position target, float circleLength, float smooth){ + if(target == null) return; + + vec.set(target).sub(unit); + + float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); + + vec.setLength(unit.realSpeed() * length); + if(length < -0.5f){ + vec.rotate(180f); + }else if(length < 0){ + vec.setZero(); + } + + unit.approach(vec); + } + //always retarget @Override protected boolean retarget(){ diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index 2d6f7441b6..6d99f368cb 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -83,4 +83,12 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati walked = true; } } + + @Override + public void approach(Vec2 vector){ + if(!vector.isZero(0.09f)){ + //mark walking state when moving in a controlled manner + walked = true; + } + } } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index b2f81d5526..fb4e23e6e5 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -38,6 +38,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Import Team team; @Import int id; @Import @Nullable Tile mineTile; + @Import Vec2 vel; private UnitController controller; UnitType type; @@ -51,6 +52,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I moveAt(vector, type.accel); } + public void approach(Vec2 vector){ + vel.approachDelta(vector, type.accel * realSpeed() * floorSpeedMultiplier()); + } + public void aimLook(Position pos){ aim(pos); lookAt(pos); diff --git a/gradle.properties b/gradle.properties index 9e82b5721f..858d44b46f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=f0400adb14a72ca567ea3b48ea8c3a22c55e1b9e +archash=9cb277618ace40f91c93987ad922c16922c1a8d6