mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-06 08:57:45 +07:00
Patrol + pursue target stances
This commit is contained in:
parent
fccf6847c1
commit
9d9d5d2e18
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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"){{
|
||||
|
@ -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);
|
||||
|
@ -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};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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){
|
||||
|
Loading…
Reference in New Issue
Block a user