From 6260e146c3ac717d9cd491d652b0b8a8314e8799 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 13 Sep 2024 18:26:00 -0400 Subject: [PATCH] Experimental rule for randomized air unit targets --- core/src/mindustry/ai/WaveSpawner.java | 5 ++++- core/src/mindustry/ai/types/FlyingAI.java | 18 +++++++++++++++++- core/src/mindustry/game/CampaignRules.java | 1 + core/src/mindustry/game/Rules.java | 2 ++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 58f770f20d..7935418c5f 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -69,7 +69,10 @@ public class WaveSpawner{ if(spawned == 0) continue; if(state.isCampaign()){ - spawned = Math.max(1, Mathf.round(spawned * state.getPlanet().campaignRules.difficulty.enemySpawnMultiplier)); + //when spawning a boss, round down, so 1.5x (hard) * 1 boss does not result in 2 bosses + spawned = Math.max(1, group.effect == StatusEffects.boss ? + (int)(spawned * state.getPlanet().campaignRules.difficulty.enemySpawnMultiplier) : + Mathf.round(spawned * state.getPlanet().campaignRules.difficulty.enemySpawnMultiplier)); } int spawnedf = spawned; diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index a938b5d3b6..c9eba7a8d9 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -6,9 +6,10 @@ import mindustry.gen.*; import mindustry.world.meta.*; import static mindustry.Vars.*; +import static mindustry.world.meta.BlockFlag.*; -//TODO very strange idle behavior sometimes public class FlyingAI extends AIController{ + final static BlockFlag[] randomTargets = {core, storage, generator, launchPad, factory, repair, battery, reactor, drill}; @Override public void updateMovement(){ @@ -44,6 +45,21 @@ public class FlyingAI extends AIController{ return core; } + if(state.rules.randomAirTargeting){ + //when there are no waves, it's just random based on the unit + Mathf.rand.setSeed(unit.type.id + (state.rules.waves ? state.wave : unit.id)); + //try a few random flags first + for(int attempt = 0; attempt < 5; attempt++){ + Teamc result = targetFlag(x, y, randomTargets[Mathf.rand.random(randomTargets.length - 1)], true); + if(result != null) return result; + } + //try the closest target + Teamc result = target(x, y, range, air, ground); + if(result != null) return result; + //default to the core + return core; + } + for(var flag : unit.type.targetFlags){ if(flag == null){ Teamc result = target(x, y, range, air, ground); diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index c0be0548a5..10157cc173 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -11,5 +11,6 @@ public class CampaignRules{ rules.showSpawns = showSpawns; rules.teams.get(rules.waveTeam).blockHealthMultiplier = difficulty.enemyHealthMultiplier; rules.teams.get(rules.waveTeam).unitHealthMultiplier = difficulty.enemyHealthMultiplier; + rules.randomAirTargeting = difficulty.ordinal() >= Difficulty.hard.ordinal(); } } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 7bee6a6e68..daeec9687d 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -61,6 +61,8 @@ public class Rules{ public boolean fire = true; /** Whether units use and require ammo. */ public boolean unitAmmo = false; + /** EXPERIMENTAL! If true, air units target random things each wave instead of only generators. */ + public boolean randomAirTargeting = false; /** EXPERIMENTAL! If true, blocks will update in units and share power. */ public boolean unitPayloadUpdate = false; /** If true, units' payloads are destroy()ed when the unit is destroyed. */