Formation cleanup

This commit is contained in:
Anuken
2020-08-16 15:54:41 -04:00
parent 01bd8d5148
commit 8dd4e9feb0
13 changed files with 82 additions and 8 deletions

View File

@@ -11,4 +11,6 @@ import arc.math.geom.*;
public interface FormationMember{
/** Returns the target location of this formation member. */
Vec3 formationPos();
float formationSize();
}

View File

@@ -12,6 +12,8 @@ import arc.math.geom.*;
*/
public abstract class FormationPattern{
public int slots;
/** Spacing between members. */
public float spacing = 20f;
/** Returns the location of the given slot index. */
public abstract Vec3 calculateSlotLocation(Vec3 out, int slot);

View File

@@ -0,0 +1,26 @@
package mindustry.ai.formations.patterns;
import arc.math.geom.*;
import mindustry.ai.formations.*;
public class ArrowFormation extends FormationPattern{
//total triangular numbers
private static final int totalTris = 30;
//triangular number table
private static final int[] triTable = new int[totalTris];
//calculat triangular numbers
static{
int sum = 0;
for(int i = 0; i < totalTris; i++){
triTable[i] = sum;
sum += (i + 1);
}
}
@Override
public Vec3 calculateSlotLocation(Vec3 out, int slot){
//TODO
return out;
}
}

View File

@@ -5,7 +5,6 @@ import arc.math.geom.*;
import mindustry.ai.formations.*;
public class SquareFormation extends FormationPattern{
public float spacing = 20;
@Override
public Vec3 calculateSlotLocation(Vec3 out, int slot){

View File

@@ -60,6 +60,15 @@ public class FormationAI extends AIController implements FormationMember{
}
}
@Override
public float formationSize(){
if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){
//TODO return formation size
//eturn ((Commanderc)unit).formation().
}
return unit.hitSize * 2f;
}
@Override
public boolean isBeingControlled(Unit player){
return leader == player;

View File

@@ -670,6 +670,12 @@ public class Fx{
}),
sporeSlowed = new Effect(40f, e -> {
color(Pal.spore);
Fill.circle(e.x, e.y, e.fslope() * 1.1f);
}),
oily = new Effect(42f, e -> {
color(Liquids.oil.color);

View File

@@ -9,7 +9,7 @@ import mindustry.type.StatusEffect;
import static mindustry.Vars.*;
public class StatusEffects implements ContentList{
public static StatusEffect none, burning, freezing, wet, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss;
public static StatusEffect none, burning, freezing, wet, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed;
@Override
public void load(){
@@ -82,6 +82,12 @@ public class StatusEffects implements ContentList{
effectChance = 0.1f;
}};
sporeSlowed = new StatusEffect("sapped"){{
speedMultiplier = 0.8f;
effect = Fx.sapped;
effectChance = 0.04f;
}};
tarred = new StatusEffect("tarred"){{
speedMultiplier = 0.6f;
effect = Fx.oily;

View File

@@ -255,6 +255,8 @@ public class Weathers implements ContentList{
{
attrs.set(Attribute.spores, 0.5f);
attrs.set(Attribute.light, -0.1f);
status = StatusEffects.sporeSlowed;
statusGround = false;
}
@Override

View File

@@ -45,18 +45,24 @@ abstract class CommanderComp implements Unitc{
void command(Formation formation, Seq<Unit> units){
clearCommand();
float spacing = 8f;
controlling.addAll(units);
for(Unit unit : units){
unit.controller(new FormationAI(base(), formation));
FormationAI ai;
unit.controller(ai = new FormationAI(base(), formation));
spacing = Math.max(spacing, ai.formationSize());
}
this.formation = formation;
//update formation spacing based on max size
formation.pattern.spacing = spacing;
members.clear();
for(Unitc u : units){
members.add((FormationAI)u.controller());
}
//TODO doesn't handle units that don't fit a formation
formation.addMembers(members);
}

View File

@@ -10,6 +10,8 @@ public class Pal{
sap = Color.valueOf("665c9f"),
spore = Color.valueOf("7457ce"),
shield = Color.valueOf("ffd37f").a(0.7f),
shieldIn = Color.black.cpy().a(0f),

View File

@@ -266,7 +266,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
if(commander.isCommanding()){
commander.clearCommand();
}else{
SquareFormation pattern = new SquareFormation();
FormationPattern pattern = new SquareFormation();
Formation formation = new Formation(new Vec3(player.x, player.y, player.unit().rotation), pattern);
formation.slotAssignmentStrategy = new DistanceAssignmentStrategy(pattern);
@@ -282,8 +282,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
units.sort(u -> u.dst2(player.unit()));
units.truncate(player.unit().type().commandLimit);
if(units.any()) pattern.spacing = units.max(u -> u.hitSize).hitSize * 2f;
commander.command(formation, units);
}

View File

@@ -23,6 +23,7 @@ public abstract class Weather extends MappableContent{
public Prov<WeatherState> type = WeatherState::create;
public StatusEffect status = StatusEffects.none;
public float statusDuration = 60f * 2;
public boolean statusAir = true, statusGround = true;
public Weather(String name, Prov<WeatherState> type){
super(name);
@@ -68,7 +69,11 @@ public abstract class Weather extends MappableContent{
if(state.effectTimer <= 0){
state.effectTimer = statusDuration - 5f;
Groups.unit.each(u -> u.apply(status, statusDuration));
Groups.unit.each(u -> {
if(u.checkTarget(statusAir, statusGround)){
u.apply(status, statusDuration);
}
});
}else{
state.effectTimer -= Time.delta;
}

View File

@@ -0,0 +1,11 @@
package mindustry.world.blocks.units;
import mindustry.world.*;
public class ControlCenter extends Block{
public ControlCenter(String name){
super(name);
update = true;
}
}