diff --git a/core/assets/maps/taintedWoods.msav b/core/assets/maps/taintedWoods.msav index 237bae65ba..066c991eba 100644 Binary files a/core/assets/maps/taintedWoods.msav and b/core/assets/maps/taintedWoods.msav differ diff --git a/core/src/mindustry/ai/RtsAI.java b/core/src/mindustry/ai/RtsAI.java index 95d861430d..6c5292421b 100644 --- a/core/src/mindustry/ai/RtsAI.java +++ b/core/src/mindustry/ai/RtsAI.java @@ -111,6 +111,7 @@ public class RtsAI{ for(var unit : data.units){ if(used.add(unit.id) && unit.controller() instanceof CommandAI cai && !cai.hasCommand() && !cai.isAttacking()){ squad.clear(); + squad.add(unit); stack.clear(); stack.add(unit); diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index 593b6893fe..e579cdb91c 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -129,7 +129,7 @@ public class SerpuloTechTree{ }); }); - node(siliconSmelter, () -> { + node(siliconSmelter, Seq.with(new SectorComplete(frozenForest)), () -> { node(sporePress, () -> { node(coalCentrifuge, () -> { diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index fef911ca70..2761f3c842 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -18,9 +18,11 @@ public class CampaignRules{ rules.showSpawns = showSpawns; rules.randomWaveAI = randomWaveAI; rules.objectiveTimerMultiplier = difficulty.waveTimeMultiplier; - if(planet.showRtsAIRule && rules.attackMode){ - boolean swapped = rules.teams.get(rules.waveTeam).rtsAi != rtsAI; - rules.teams.get(rules.waveTeam).rtsAi = rtsAI; + if(planet.showRtsAIRule){ + boolean enabled = rtsAI && rules.attackMode; //if attackMode becomes false (waves enabled), turn off RTS AI + boolean swapped = rules.teams.get(rules.waveTeam).rtsAi != enabled; + + rules.teams.get(rules.waveTeam).rtsAi = enabled; rules.teams.get(rules.waveTeam).rtsMaxSquad = 15; if(swapped && Vars.state.isGame()){ diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index 962d24bbdf..4aa04be99d 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -110,7 +110,7 @@ public class Team implements Comparable, Senseable{ /** @return whether this team is supposed to be AI-controlled. */ public boolean isAI(){ - return (state.rules.waves || state.rules.attackMode) && this != state.rules.defaultTeam && !state.rules.pvp; + return (state.rules.waves || state.rules.attackMode || state.isCampaign()) && this != state.rules.defaultTeam && !state.rules.pvp; } /** @return whether this team is solely comprised of AI (with no players possible). */ diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 33fcc893c1..e82224d6e5 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -285,6 +285,7 @@ public class Universe{ state.rules.winWave = waveMax; state.rules.waves = true; state.rules.attackMode = false; + planet.campaignRules.apply(planet, state.rules); //enabling waves may force changes in campaign rules //update rules in multiplayer if(net.server()){ Call.setRules(state.rules); diff --git a/core/src/mindustry/ui/fragments/ConsoleFragment.java b/core/src/mindustry/ui/fragments/ConsoleFragment.java index 5d19246520..3542163354 100644 --- a/core/src/mindustry/ui/fragments/ConsoleFragment.java +++ b/core/src/mindustry/ui/fragments/ConsoleFragment.java @@ -185,6 +185,7 @@ public class ConsoleFragment extends Table{ "var items = Vars.player.team().items();" + "var build = Vars.world.buildWorld(Core.input.mouseWorldX(), Core.input.mouseWorldY());" + "var cursor = Vars.world.tileWorld(Core.input.mouseWorldX(), Core.input.mouseWorldY());" + + "var cursorUnit = Units.closestEnemy(null, Core.input.mouseWorldX(), Core.input.mouseWorldY(), 70, u => true);" + "\n"; }