This commit is contained in:
Anuken 2020-10-26 16:06:50 -04:00
parent 73ca6eeb74
commit 909da9de3c
6 changed files with 35 additions and 13 deletions

View File

@ -68,6 +68,8 @@ public class Vars implements Loadable{
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
/** list of built-in servers.*/ /** list of built-in servers.*/
public static final Seq<String> defaultServers = Seq.with(); public static final Seq<String> defaultServers = Seq.with();
/** whether multi-tile mining is enabled */
public static final boolean multimine = false;
/** maximum distance between mine and core that supports automatic transferring */ /** maximum distance between mine and core that supports automatic transferring */
public static final float mineTransferRange = 220f; public static final float mineTransferRange = 220f;
/** max chat message length */ /** max chat message length */

View File

@ -314,6 +314,7 @@ public class BlockIndexer{
/** Find the closest ore block relative to a position. */ /** Find the closest ore block relative to a position. */
public Tile findClosestOre(Unit unit, Item item){ public Tile findClosestOre(Unit unit, Item item){
if(multimine) return findClosestOre(unit.x, unit.y, item);
if(!(unit instanceof Minerc miner)) return null; if(!(unit instanceof Minerc miner)) return null;
TileArray arr = getOrePositions(item); TileArray arr = getOrePositions(item);

View File

@ -2,14 +2,19 @@ package mindustry.ai.types;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.ai.formations.*; import mindustry.ai.formations.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.blocks.storage.CoreBlock.*;
import static mindustry.Vars.*;
public class FormationAI extends AIController implements FormationMember{ public class FormationAI extends AIController implements FormationMember{
private static Seq<Tile> tiles = new Seq<>();
public Unit leader; public Unit leader;
private Vec3 target = new Vec3(); private Vec3 target = new Vec3();
@ -51,19 +56,33 @@ public class FormationAI extends AIController implements FormationMember{
Vec2 realtarget = vec.set(target); Vec2 realtarget = vec.set(target);
float margin = 3f; float margin = 4f;
float speed = unit.realSpeed(); float speed = unit.realSpeed();
if(unit.dst(realtarget) <= margin){ if(unit.dst(realtarget) <= margin){
unit.vel.approachDelta(Vec2.ZERO, speed * type.accel / 2f); //unit.vel.approachDelta(Vec2.ZERO, speed * type.accel / 2f);
}else{ }else{
unit.moveAt(realtarget.sub(unit).limit(speed)); unit.moveAt(realtarget.sub(unit).limit(speed));
} }
if(unit instanceof Minerc mine && leader instanceof Minerc com){ if(unit instanceof Minerc mine && leader instanceof Minerc com){
if(mine.validMine(com.mineTile())){ if(com.mineTile() != null){
mine.mineTile(com.mineTile()); if(multimine){
mine.mineTile(mine.validMine(com.mineTile()) ? com.mineTile() : null);
}else{
if(mine.mineTile() == null){
tiles.clear();
com.mineTile().circle(6, (cx, cy) -> {
Tile tile = world.tile(cx, cy);
if(mine.validMine(tile) && tile.drop() == com.mineTile().drop() && tile != com.mineTile()){
tiles.add(tile);
}
});
Tile min = tiles.min(t -> t.dst2(com.mineTile()));
mine.mineTile(min);
}
}
CoreBuild core = unit.team.core(); CoreBuild core = unit.team.core();
@ -77,7 +96,6 @@ public class FormationAI extends AIController implements FormationMember{
}else{ }else{
mine.mineTile(null); mine.mineTile(null);
} }
} }
if(unit instanceof Builderc build && leader instanceof Builderc com && com.activelyBuilding()){ if(unit instanceof Builderc build && leader instanceof Builderc com && com.activelyBuilding()){

View File

@ -474,7 +474,7 @@ public class Bullets implements ContentList{
drag = 0.001f; drag = 0.001f;
ammoMultiplier = 2f; ammoMultiplier = 2f;
statusDuration = 60f * 4f; statusDuration = 60f * 4f;
damage = 0.1f; damage = 0.2f;
}}; }};
heavyCryoShot = new LiquidBulletType(Liquids.cryofluid){{ heavyCryoShot = new LiquidBulletType(Liquids.cryofluid){{
@ -485,7 +485,7 @@ public class Bullets implements ContentList{
drag = 0.001f; drag = 0.001f;
ammoMultiplier = 2f; ammoMultiplier = 2f;
statusDuration = 60f * 4f; statusDuration = 60f * 4f;
damage = 0.1f; damage = 0.2f;
}}; }};
heavySlagShot = new LiquidBulletType(Liquids.slag){{ heavySlagShot = new LiquidBulletType(Liquids.slag){{
@ -507,7 +507,7 @@ public class Bullets implements ContentList{
drag = 0.001f; drag = 0.001f;
ammoMultiplier = 2f; ammoMultiplier = 2f;
statusDuration = 60f * 4f; statusDuration = 60f * 4f;
damage = 0.1f; damage = 0.2f;
}}; }};
driverBolt = new MassDriverBolt(); driverBolt = new MassDriverBolt();

View File

@ -37,7 +37,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{
public boolean validMine(Tile tile, boolean checkDst){ public boolean validMine(Tile tile, boolean checkDst){
return !(tile == null || tile.block() != Blocks.air || (!within(tile.worldx(), tile.worldy(), miningRange) && checkDst) return !(tile == null || tile.block() != Blocks.air || (!within(tile.worldx(), tile.worldy(), miningRange) && checkDst)
|| tile.drop() == null || !canMine(tile.drop())) && state.teams.canMine(self(), tile); || tile.drop() == null || !canMine(tile.drop())) && state.teams.isValidMine(self(), tile);
} }
public boolean validMine(Tile tile){ public boolean validMine(Tile tile){
@ -105,7 +105,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{
float ex = mineTile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag); float ex = mineTile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag);
float ey = mineTile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag); float ey = mineTile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag);
Draw.z(Layer.flyingUnit - 0.1f); Draw.z(Layer.flyingUnitLow - 0.1f);
Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl)); Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl));

View File

@ -145,15 +145,16 @@ public class Teams{
} }
} }
/** @return whether this ore is taken. */ /** @return whether this ore is not taken. */
public boolean canMine(Unit unit, Tile tile){ public boolean isValidMine(Unit unit, Tile tile){
if(multimine) return true;
if(tile == null) return false; if(tile == null) return false;
Unit u = mined.get(tile.pos()); Unit u = mined.get(tile.pos());
return u == unit || u == null; return u == unit || u == null;
} }
public void registerMined(Tile tile, Unit unit){ public void registerMined(Tile tile, Unit unit){
if(tile == null || unit == null) return; if(tile == null || unit == null || multimine) return;
mined.put(tile.pos(), unit); mined.put(tile.pos(), unit);
} }