Patrol + pursue target stances

This commit is contained in:
Anuken 2023-09-20 22:45:45 -04:00
parent fccf6847c1
commit 9d9d5d2e18
7 changed files with 37 additions and 5 deletions

View File

@ -356,6 +356,8 @@ command.boost = Boost
stance.stop = Cancel Orders
stance.shoot = Stance: Shoot
stance.holdfire = Stance: Hold Fire
stance.pursuetarget = Stance: Pursue Target
stance.patrol = Stance: Patrol Path
openlink = Open Link
copylink = Copy Link
back = Back

View File

@ -13,7 +13,9 @@ public class UnitStance{
stopStance = new UnitStance("stop", "cancel"), //not a real stance, cannot be selected, just cancels ordewrs
shootStance = new UnitStance("shoot", "commandAttack"),
holdFireStance = new UnitStance("holdfire", "none");
holdFireStance = new UnitStance("holdfire", "none"),
pursueTarget = new UnitStance("pursuetarget", "right"),
patrol = new UnitStance("patrol", "refresh");
/** Unique ID number. */
public final int id;

View File

@ -67,6 +67,10 @@ public class CommandAI extends AIController{
//this should not be possible
if(stance == UnitStance.stopStance) stance = UnitStance.shootStance;
if(stance == UnitStance.pursueTarget && target != null && attackTarget == null && targetPos == null){
commandTarget(target, false);
}
//remove invalid targets
if(commandQueue.any()){
commandQueue.removeAll(e -> e instanceof Healthc h && !h.isValid());
@ -194,11 +198,13 @@ public class CommandAI extends AIController{
target = attackTarget;
circleAttack(80f);
}else{
boolean isFinalPoint = targetPos.epsilonEquals(vecOut, 4.1f) && commandQueue.size == 0;
moveTo(vecOut,
attackTarget != null && unit.within(attackTarget, engageRange) ? engageRange :
unit.isGrounded() ? 0f :
attackTarget != null ? engageRange :
0f, unit.isFlying() ? 40f : 100f, false, null, targetPos.epsilonEquals(vecOut, 4.1f));
0f, unit.isFlying() ? 40f : 100f, false, null, isFinalPoint);
}
}
@ -243,6 +249,7 @@ public class CommandAI extends AIController{
}
void finishPath(){
Vec2 prev = targetPos;
targetPos = null;
if(commandQueue.size > 0){
var next = commandQueue.remove(0);
@ -251,6 +258,10 @@ public class CommandAI extends AIController{
}else if(next instanceof Vec2 position){
commandPosition(position);
}
if(prev != null && stance == UnitStance.patrol){
commandQueue.add(prev.cpy());
}
}
}

View File

@ -1285,6 +1285,7 @@ public class UnitTypes{
lowAltitude = true;
ammoType = new PowerAmmoType(900);
stances = new UnitStance[]{UnitStance.stopStance, UnitStance.shootStance, UnitStance.holdFireStance};
mineTier = 2;
mineSpeed = 3.5f;
@ -1344,6 +1345,7 @@ public class UnitTypes{
isEnemy = false;
ammoType = new PowerAmmoType(1100);
stances = new UnitStance[]{UnitStance.stopStance, UnitStance.shootStance, UnitStance.holdFireStance};
weapons.add(
new Weapon("heal-weapon-mount"){{

View File

@ -122,6 +122,18 @@ public class ContentParser{
throw new IllegalArgumentException("Unit commands must be strings.");
}
});
put(UnitStance.class, (type, data) -> {
if(data.isString()){
var cmd = UnitStance.all.find(u -> u.name.equals(data.asString()));
if(cmd != null){
return cmd;
}else{
throw new IllegalArgumentException("Unknown unit stance name: " + data.asString());
}
}else{
throw new IllegalArgumentException("Unit stances must be strings.");
}
});
put(BulletType.class, (type, data) -> {
if(data.isString()){
return field(Bullets.class, data);

View File

@ -836,9 +836,9 @@ public class UnitType extends UnlockableContent implements Senseable{
if(stances.length == 0){
if(canAttack){
stances = new UnitStance[]{UnitStance.stopStance, UnitStance.shootStance, UnitStance.holdFireStance};
stances = new UnitStance[]{UnitStance.stopStance, UnitStance.shootStance, UnitStance.holdFireStance, UnitStance.pursueTarget, UnitStance.patrol};
}else{
stances = new UnitStance[]{UnitStance.stopStance, UnitStance.shootStance};
stances = new UnitStance[]{UnitStance.stopStance};
}
}

View File

@ -524,12 +524,15 @@ public class PlacementFragment{
}
//list stances
if(stances.size > 0){
if(stances.size > 1){
u.row();
u.table(coms -> {
coms.left();
for(var stance : stances){
//TODO: patrolling is pointless on mobile since you can't queue commands
if(stance == UnitStance.patrol && mobile) continue;
coms.button(Icon.icons.get(stance.icon, Icon.cancel), Styles.clearNoneTogglei, () -> {
IntSeq ids = new IntSeq();
for(var unit : units){