Configurable RTS AI parameters for logic
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user