From 588faad6f938d35e65e8bf754d9495ce35033954 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 6 Feb 2025 14:27:35 -0500 Subject: [PATCH] Rule for extra core no-build radius per-team --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/game/Rules.java | 7 +++++++ core/src/mindustry/game/Teams.java | 13 +++++++++++++ core/src/mindustry/graphics/OverlayRenderer.java | 7 ++++--- .../src/mindustry/ui/dialogs/CustomRulesDialog.java | 2 ++ core/src/mindustry/world/Build.java | 2 +- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2a336125db..efe52a37a1 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1417,6 +1417,7 @@ rules.unitpayloadsexplode = Carried Payloads Explode With The Unit rules.unitcap = Base Unit Cap rules.limitarea = Limit Map Area rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) +rules.extracorebuildradius = Extra No-Build Radius:[lightgray] (tiles) rules.wavespacing = Wave Spacing:[lightgray] (sec) rules.initialwavespacing = Initial Wave Spacing:[lightgray] (sec) rules.buildcostmultiplier = Build Cost Multiplier diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 1afebb99e9..2339e5f1b2 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -243,6 +243,10 @@ public class Rules{ return (this.env & env) != 0; } + public float buildRadius(Team team){ + return enemyCoreBuildRadius + teams.get(team).extraCoreBuildRadius; + } + public float unitBuildSpeed(Team team){ return unitBuildSpeedMultiplier * teams.get(team).unitBuildSpeedMultiplier; } @@ -330,6 +334,9 @@ public class Rules{ public float blockDamageMultiplier = 1f; /** Multiplier for building speed. */ public float buildSpeedMultiplier = 1f; + /** Extra spacing added to the no-build zone around the core. */ + public float extraCoreBuildRadius = 0f; + //build cost disabled due to technical complexity } diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index 4597e5874e..eec1b68ee8 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -56,6 +56,19 @@ public class Teams{ return Geometry.findClosest(x, y, get(team).cores); } + public boolean anyEnemyCoresWithinBuildRadius(Team team, float x, float y){ + for(TeamData data : active){ + if(team != data.team){ + for(CoreBuild tile : data.cores){ + if(tile.within(x, y, state.rules.buildRadius(tile.team) + tilesize)){ + return true; + } + } + } + } + return false; + } + public boolean anyEnemyCoresWithin(Team team, float x, float y, float radius){ for(TeamData data : active){ if(team != data.team){ diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 3aa4be1bf8..6ec2d283ac 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -178,11 +178,12 @@ public class OverlayRenderer{ }else{ state.teams.eachEnemyCore(player.team(), core -> { //it must be clear that there is a core here. - if(/*core.wasVisible && */Core.camera.bounds(Tmp.r1).overlaps(Tmp.r2.setCentered(core.x, core.y, state.rules.enemyCoreBuildRadius * 2f))){ + float br = state.rules.buildRadius(core.team); + if(/*core.wasVisible && */Core.camera.bounds(Tmp.r1).overlaps(Tmp.r2.setCentered(core.x, core.y, br * 2f))){ Draw.color(Color.darkGray); - Lines.circle(core.x, core.y - 2, state.rules.enemyCoreBuildRadius); + Lines.circle(core.x, core.y - 2,br); Draw.color(Pal.accent, core.team.color, 0.5f + Mathf.absin(Time.time, 10f, 0.5f)); - Lines.circle(core.x, core.y, state.rules.enemyCoreBuildRadius); + Lines.circle(core.x, core.y, br); } }); } diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 83ef9ee840..8c9e1a16c5 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -302,6 +302,8 @@ public class CustomRulesDialog extends BaseDialog{ check("@rules.buildai", b -> teams.buildAi = b, () -> teams.buildAi, () -> team != rules.defaultTeam && rules.env != Planets.erekir.defaultEnv && !rules.pvp); number("@rules.buildaitier", false, f -> teams.buildAiTier = f, () -> teams.buildAiTier, () -> teams.buildAi && rules.env != Planets.erekir.defaultEnv && !rules.pvp, 0, 1); + number("@rules.extracorebuildradius", f -> teams.extraCoreBuildRadius = f * tilesize, () -> Math.min(teams.extraCoreBuildRadius / tilesize, 200), () -> !rules.polygonCoreProtection); + check("@rules.infiniteresources", b -> teams.infiniteResources = b, () -> teams.infiniteResources); number("@rules.buildspeedmultiplier", f -> teams.buildSpeedMultiplier = f, () -> teams.buildSpeedMultiplier, 0.001f, 50f); diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index d0129890fc..fe48fd74b7 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -196,7 +196,7 @@ public class Build{ if(closest != null && closest.team != team){ return false; } - }else if(state.teams.anyEnemyCoresWithin(team, x * tilesize + type.offset, y * tilesize + type.offset, state.rules.enemyCoreBuildRadius + tilesize)){ + }else if(state.teams.anyEnemyCoresWithinBuildRadius(team, x * tilesize + type.offset, y * tilesize + type.offset)){ return false; } }