Improved approach behavior in formations/logic

This commit is contained in:
Anuken
2020-12-10 12:51:07 -05:00
parent 28e18332a0
commit 2d6db1583b
5 changed files with 37 additions and 13 deletions

View File

@@ -37,7 +37,6 @@ public class FormationAI extends AIController implements FormationMember{
} }
unit.controlWeapons(true, leader.isShooting); unit.controlWeapons(true, leader.isShooting);
// unit.moveAt(Tmp.v1.set(deltaX, deltaY).limit(unit.type().speed));
unit.aim(leader.aimX(), leader.aimY()); unit.aim(leader.aimX(), leader.aimY());
@@ -47,17 +46,10 @@ public class FormationAI extends AIController implements FormationMember{
unit.lookAt(unit.vel.angle()); 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() * unit.floorSpeedMultiplier();
unit.approach(Mathf.arrive(unit.x, unit.y, realtarget.x, realtarget.y, unit.vel, 0f, 0.01f, speed, 1f));
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));
}
if(unit.canMine() && leader.canMine()){ if(unit.canMine() && leader.canMine()){
if(leader.mineTile != null && unit.validMine(leader.mineTile)){ if(leader.mineTile != null && unit.validMine(leader.mineTile)){

View File

@@ -1,6 +1,7 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.ai.*; import mindustry.ai.*;
@@ -67,7 +68,7 @@ public class LogicAI extends AIController{
moveTo(Tmp.v1.set(moveX, moveY), 1f, 30f); moveTo(Tmp.v1.set(moveX, moveY), 1f, 30f);
} }
case approach -> { case approach -> {
moveTo(Tmp.v1.set(moveX, moveY), moveRad - 8f, 8f); moveTo(Tmp.v1.set(moveX, moveY), moveRad - 7f, 7);
} }
case pathfind -> { case pathfind -> {
Building core = unit.closestEnemyCore(); Building core = unit.closestEnemyCore();
@@ -112,6 +113,24 @@ public class LogicAI extends AIController{
return radars.add(radar); 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 //always retarget
@Override @Override
protected boolean retarget(){ protected boolean retarget(){

View File

@@ -83,4 +83,12 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati
walked = true; walked = true;
} }
} }
@Override
public void approach(Vec2 vector){
if(!vector.isZero(0.09f)){
//mark walking state when moving in a controlled manner
walked = true;
}
}
} }

View File

@@ -38,6 +38,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Import Team team; @Import Team team;
@Import int id; @Import int id;
@Import @Nullable Tile mineTile; @Import @Nullable Tile mineTile;
@Import Vec2 vel;
private UnitController controller; private UnitController controller;
UnitType type; UnitType type;
@@ -51,6 +52,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
moveAt(vector, type.accel); moveAt(vector, type.accel);
} }
public void approach(Vec2 vector){
vel.approachDelta(vector, type.accel * realSpeed() * floorSpeedMultiplier());
}
public void aimLook(Position pos){ public void aimLook(Position pos){
aim(pos); aim(pos);
lookAt(pos); lookAt(pos);

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=f0400adb14a72ca567ea3b48ea8c3a22c55e1b9e archash=9cb277618ace40f91c93987ad922c16922c1a8d6