diff --git a/core/assets/maps/fungalPass.msav b/core/assets/maps/fungalPass.msav index c154c2e4db..1e3a26f520 100644 Binary files a/core/assets/maps/fungalPass.msav and b/core/assets/maps/fungalPass.msav differ diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 42c76c058e..429ba00587 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -49,7 +49,7 @@ public class WaveSpawner{ /** @return true if the player is near a ground spawn point. */ public boolean playerNear(){ - return state.rules.waves && !player.dead() && spawns.contains(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < state.rules.dropZoneRadius && player.team() != state.rules.waveTeam); + return state.hasSpawns() && !player.dead() && spawns.contains(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < state.rules.dropZoneRadius && player.team() != state.rules.waveTeam); } public void spawnEnemies(){ @@ -105,8 +105,10 @@ public class WaveSpawner{ } private void eachGroundSpawn(SpawnConsumer cons){ - for(Tile spawn : spawns){ - cons.accept(spawn.worldx(), spawn.worldy(), true); + if(state.hasSpawns()){ + for(Tile spawn : spawns){ + cons.accept(spawn.worldx(), spawn.worldy(), true); + } } if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 061d82c1cc..7d39da5176 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -48,6 +48,10 @@ public class GameState{ state = astate; } + public boolean hasSpawns(){ + return rules.waves && !(isCampaign() && rules.attackMode); + } + /** Note that being in a campaign does not necessarily mean having a sector. */ public boolean isCampaign(){ return rules.sector != null; diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 989f24a305..0a703366e9 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -277,7 +277,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); //apply knockback based on spawns - if(team != state.rules.waveTeam && state.rules.waves){ + if(team != state.rules.waveTeam && state.hasSpawns()){ float relativeSize = state.rules.dropZoneRadius + hitSize/2f + 1f; for(Tile spawn : spawner.getSpawns()){ if(within(spawn.worldx(), spawn.worldy(), relativeSize)){ diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 524ee79ea6..9bb3a95fa3 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -121,7 +121,7 @@ public class OverlayRenderer{ Lines.stroke(2f); Draw.color(Color.gray, Color.lightGray, Mathf.absin(Time.time(), 8f, 1f)); - if(state.rules.waves){ + if(state.hasSpawns()){ for(Tile tile : spawner.getSpawns()){ if(tile.within(player.x, player.y, state.rules.dropZoneRadius + spawnerMargin)){ Draw.alpha(Mathf.clamp(1f - (player.dst(tile) - state.rules.dropZoneRadius) / spawnerMargin)); diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index 02e2c20016..0400d28717 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -303,7 +303,8 @@ public class SectorDamage{ //enemy units like to aim for a lot of non-essential things, so increase resulting health slightly info.sumHealth = sumHealth * 1.2f; - info.sumDps = sumDps; + //players tend to have longer range units/turrets, so assume DPS is higher + info.sumDps = sumDps * 1.2f; info.sumRps = sumRps; //finally, find an equation to put it all together and produce a 0-1 number