Better attack-mode core spawning limits

This commit is contained in:
Anuken
2020-09-08 11:54:23 -04:00
parent 27565cfe1c
commit fdca6771fb
2 changed files with 30 additions and 2 deletions

Binary file not shown.

View File

@@ -3,6 +3,7 @@ package mindustry.ai;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
@@ -17,10 +18,11 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class WaveSpawner{ public class WaveSpawner{
private static final float margin = 40f, coreMargin = tilesize * 3.5f; private static final float margin = 40f, coreMargin = tilesize * 2f, maxSteps = 30;
private Seq<Tile> spawns = new Seq<>(); private Seq<Tile> spawns = new Seq<>();
private boolean spawning = false; private boolean spawning = false;
private boolean any = false;
public WaveSpawner(){ public WaveSpawner(){
Events.on(WorldLoadEvent.class, e -> reset()); Events.on(WorldLoadEvent.class, e -> reset());
@@ -92,7 +94,33 @@ public class WaveSpawner{
Building firstCore = state.teams.playerCores().first(); Building firstCore = state.teams.playerCores().first();
for(Building core : state.rules.waveTeam.cores()){ for(Building core : state.rules.waveTeam.cores()){
Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block().size * tilesize /2f * Mathf.sqrt2); Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block().size * tilesize /2f * Mathf.sqrt2);
cons.accept(core.x + Tmp.v1.x, core.y + Tmp.v1.y, false);
boolean valid = false;
int steps = 0;
//keep moving forward until the max step amount is reached
while(steps++ < maxSteps){
int tx = world.toTile(core.x + Tmp.v1.x), ty = world.toTile(core.y + Tmp.v1.y);
any = false;
Geometry.circle(tx, ty, world.width(), world.height(), 3, (x, y) -> {
if(world.solid(x, y)){
any = true;
}
});
//nothing is in the way, spawn it
if(!any){
valid = true;
break;
}else{
//make the vector longer
Tmp.v1.setLength(Tmp.v1.len() + tilesize*1.1f);
}
}
if(valid){
cons.accept(core.x + Tmp.v1.x, core.y + Tmp.v1.y, false);
}
} }
} }
} }