Configurable RTS AI parameters for logic

This commit is contained in:
Anuken
2022-04-24 16:46:26 -04:00
parent abdb1c1252
commit d5e522994e
7 changed files with 15 additions and 11 deletions

View File

@@ -167,7 +167,7 @@ public class RtsAI{
//defend when close, or this is the only squad defending //defend when close, or this is the only squad defending
//TODO will always rush to defense no matter what //TODO will always rush to defense no matter what
if(best instanceof CoreBuild || units.size >= data.team.rules().rtsAiMinSquadSize || best.within(ax, ay, 500f)){ if(best instanceof CoreBuild || units.size >= data.team.rules().rtsMinSquad || best.within(ax, ay, 500f)){
defend = best; defend = best;
if(debug){ if(debug){
@@ -234,7 +234,7 @@ public class RtsAI{
} }
@Nullable Building findTarget(float x, float y, int total, float dps, float health){ @Nullable Building findTarget(float x, float y, int total, float dps, float health){
if(total < data.team.rules().rtsAiMinSquadSize) return null; if(total < data.team.rules().rtsMinSquad) return null;
//flag priority? //flag priority?
//1. generator //1. generator
@@ -264,7 +264,7 @@ public class RtsAI{
); );
float weight = weights.get(result, 0f); float weight = weights.get(result, 0f);
if(weight < data.team.rules().minAttackWeight && total < Units.getCap(data.team)){ if(weight < data.team.rules().rtsMinWeight && total < Units.getCap(data.team)){
return null; return null;
} }

View File

@@ -597,7 +597,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
remove(); remove();
} }
/** @return name of direct or indirect player controller. TODO comamnd support*/ /** @return name of direct or indirect player controller. */
@Override @Override
public @Nullable String getControllerName(){ public @Nullable String getControllerName(){
if(isPlayer()) return getPlayer().name; if(isPlayer()) return getPlayer().name;

View File

@@ -225,9 +225,9 @@ public class Rules{
/** Enables "RTS" unit AI. TODO wip */ /** Enables "RTS" unit AI. TODO wip */
public boolean rtsAi; public boolean rtsAi;
/** Minimum size of attack squads. */ /** Minimum size of attack squads. */
public int rtsAiMinSquadSize = 4; public int rtsMinSquad = 4;
/** Minimum "advantage" needed for a squad to attack. Higher -> more cautious. */ /** Minimum "advantage" needed for a squad to attack. Higher -> more cautious. */
public float minAttackWeight = 1.2f; public float rtsMinWeight = 1.2f;
/** How fast unit factories build units. */ /** How fast unit factories build units. */
public float unitBuildSpeedMultiplier = 1f; public float unitBuildSpeedMultiplier = 1f;

View File

@@ -1355,7 +1355,7 @@ public class LExecutor{
} }
} }
case ambientLight -> state.rules.ambientLight.fromDouble(exec.num(value)); case ambientLight -> state.rules.ambientLight.fromDouble(exec.num(value));
case unitBuildSpeed, unitDamage, blockHealth, blockDamage, buildSpeed -> { case unitBuildSpeed, unitDamage, blockHealth, blockDamage, buildSpeed, rtsMinSquad, rtsMinWeight -> {
if(exec.obj(p1) instanceof Team team){ if(exec.obj(p1) instanceof Team team){
float num = exec.numf(value); float num = exec.numf(value);
switch(rule){ switch(rule){
@@ -1364,6 +1364,8 @@ public class LExecutor{
case unitDamage -> team.rules().unitDamageMultiplier = Math.max(num, 0f); case unitDamage -> team.rules().unitDamageMultiplier = Math.max(num, 0f);
case blockHealth -> team.rules().blockHealthMultiplier = Math.max(num, 0.001f); case blockHealth -> team.rules().blockHealthMultiplier = Math.max(num, 0.001f);
case blockDamage -> team.rules().blockDamageMultiplier = Math.max(num, 0f); case blockDamage -> team.rules().blockDamageMultiplier = Math.max(num, 0f);
case rtsMinWeight -> team.rules().rtsMinWeight = num;
case rtsMinSquad -> team.rules().rtsMinSquad = (int)num;
} }
} }
} }

View File

@@ -1265,7 +1265,7 @@ public class LStatements{
fields(table, "w", p3, s -> p3 = s); fields(table, "w", p3, s -> p3 = s);
fields(table, "h", p4, s -> p4 = s); fields(table, "h", p4, s -> p4 = s);
} }
case buildSpeed, unitBuildSpeed, unitDamage, blockHealth, blockDamage -> { case buildSpeed, unitBuildSpeed, unitDamage, blockHealth, blockDamage, rtsMinSquad, rtsMinWeight -> {
if(p1.equals("0")){ if(p1.equals("0")){
p1 = "@sharded"; p1 = "@sharded";
} }

View File

@@ -18,7 +18,9 @@ public enum LogicRule{
unitBuildSpeed, unitBuildSpeed,
unitDamage, unitDamage,
blockHealth, blockHealth,
blockDamage; blockDamage,
rtsMinWeight,
rtsMinSquad;
public static final LogicRule[] all = values(); public static final LogicRule[] all = values();
} }

View File

@@ -254,8 +254,8 @@ public class CustomRulesDialog extends BaseDialog{
number("@rules.blockdamagemultiplier", f -> teams.blockDamageMultiplier = f, () -> teams.blockDamageMultiplier); number("@rules.blockdamagemultiplier", f -> teams.blockDamageMultiplier = f, () -> teams.blockDamageMultiplier);
check("@rules.rtsai", b -> teams.rtsAi = b, () -> teams.rtsAi, () -> team != rules.defaultTeam); check("@rules.rtsai", b -> teams.rtsAi = b, () -> teams.rtsAi, () -> team != rules.defaultTeam);
numberi("@rules.rtsminsquadsize", f -> teams.rtsAiMinSquadSize = f, () -> teams.rtsAiMinSquadSize, () -> teams.rtsAi, 0, 100); numberi("@rules.rtsminsquadsize", f -> teams.rtsMinSquad = f, () -> teams.rtsMinSquad, () -> teams.rtsAi, 0, 100);
number("@rules.rtsminattackweight", f -> teams.minAttackWeight = f, () -> teams.minAttackWeight, () -> teams.rtsAi); number("@rules.rtsminattackweight", f -> teams.rtsMinWeight = f, () -> teams.rtsMinWeight, () -> teams.rtsAi);
check("@rules.infiniteresources", b -> teams.infiniteResources = b, () -> teams.infiniteResources); check("@rules.infiniteresources", b -> teams.infiniteResources = b, () -> teams.infiniteResources);
number("@rules.buildspeedmultiplier", f -> teams.buildSpeedMultiplier = f, () -> teams.buildSpeedMultiplier, 0.001f, 50f); number("@rules.buildspeedmultiplier", f -> teams.buildSpeedMultiplier = f, () -> teams.buildSpeedMultiplier, 0.001f, 50f);