From 8dd4e9feb0b9f5b518764bb33b79168c91d1ee80 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 16 Aug 2020 15:54:41 -0400 Subject: [PATCH] Formation cleanup --- .../ai/formations/FormationMember.java | 2 ++ .../ai/formations/FormationPattern.java | 2 ++ .../formations/patterns/ArrowFormation.java | 26 +++++++++++++++++++ .../formations/patterns/SquareFormation.java | 1 - core/src/mindustry/ai/types/FormationAI.java | 9 +++++++ core/src/mindustry/content/Fx.java | 6 +++++ core/src/mindustry/content/StatusEffects.java | 8 +++++- core/src/mindustry/content/Weathers.java | 2 ++ .../entities/comp/CommanderComp.java | 10 +++++-- core/src/mindustry/graphics/Pal.java | 2 ++ core/src/mindustry/input/InputHandler.java | 4 +-- core/src/mindustry/type/Weather.java | 7 ++++- .../world/blocks/units/ControlCenter.java | 11 ++++++++ 13 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 core/src/mindustry/ai/formations/patterns/ArrowFormation.java create mode 100644 core/src/mindustry/world/blocks/units/ControlCenter.java diff --git a/core/src/mindustry/ai/formations/FormationMember.java b/core/src/mindustry/ai/formations/FormationMember.java index 7668f3aee6..2fdf259f62 100644 --- a/core/src/mindustry/ai/formations/FormationMember.java +++ b/core/src/mindustry/ai/formations/FormationMember.java @@ -11,4 +11,6 @@ import arc.math.geom.*; public interface FormationMember{ /** Returns the target location of this formation member. */ Vec3 formationPos(); + + float formationSize(); } diff --git a/core/src/mindustry/ai/formations/FormationPattern.java b/core/src/mindustry/ai/formations/FormationPattern.java index 02f6754421..5fe84bcda9 100644 --- a/core/src/mindustry/ai/formations/FormationPattern.java +++ b/core/src/mindustry/ai/formations/FormationPattern.java @@ -12,6 +12,8 @@ import arc.math.geom.*; */ public abstract class FormationPattern{ public int slots; + /** Spacing between members. */ + public float spacing = 20f; /** Returns the location of the given slot index. */ public abstract Vec3 calculateSlotLocation(Vec3 out, int slot); diff --git a/core/src/mindustry/ai/formations/patterns/ArrowFormation.java b/core/src/mindustry/ai/formations/patterns/ArrowFormation.java new file mode 100644 index 0000000000..e3db12d2fe --- /dev/null +++ b/core/src/mindustry/ai/formations/patterns/ArrowFormation.java @@ -0,0 +1,26 @@ +package mindustry.ai.formations.patterns; + +import arc.math.geom.*; +import mindustry.ai.formations.*; + +public class ArrowFormation extends FormationPattern{ + //total triangular numbers + private static final int totalTris = 30; + //triangular number table + private static final int[] triTable = new int[totalTris]; + + //calculat triangular numbers + static{ + int sum = 0; + for(int i = 0; i < totalTris; i++){ + triTable[i] = sum; + sum += (i + 1); + } + } + + @Override + public Vec3 calculateSlotLocation(Vec3 out, int slot){ + //TODO + return out; + } +} diff --git a/core/src/mindustry/ai/formations/patterns/SquareFormation.java b/core/src/mindustry/ai/formations/patterns/SquareFormation.java index 9f4b271df6..9d7ddab549 100644 --- a/core/src/mindustry/ai/formations/patterns/SquareFormation.java +++ b/core/src/mindustry/ai/formations/patterns/SquareFormation.java @@ -5,7 +5,6 @@ import arc.math.geom.*; import mindustry.ai.formations.*; public class SquareFormation extends FormationPattern{ - public float spacing = 20; @Override public Vec3 calculateSlotLocation(Vec3 out, int slot){ diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index 884dc2150c..883804f42c 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -60,6 +60,15 @@ public class FormationAI extends AIController implements FormationMember{ } } + @Override + public float formationSize(){ + if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ + //TODO return formation size + //eturn ((Commanderc)unit).formation(). + } + return unit.hitSize * 2f; + } + @Override public boolean isBeingControlled(Unit player){ return leader == player; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 38d82fcd7b..d6bbf8b08f 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -670,6 +670,12 @@ public class Fx{ }), + sporeSlowed = new Effect(40f, e -> { + color(Pal.spore); + + Fill.circle(e.x, e.y, e.fslope() * 1.1f); + }), + oily = new Effect(42f, e -> { color(Liquids.oil.color); diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index be6e9ac4ba..d50428ff56 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -9,7 +9,7 @@ import mindustry.type.StatusEffect; import static mindustry.Vars.*; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, wet, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss; + public static StatusEffect none, burning, freezing, wet, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; @Override public void load(){ @@ -82,6 +82,12 @@ public class StatusEffects implements ContentList{ effectChance = 0.1f; }}; + sporeSlowed = new StatusEffect("sapped"){{ + speedMultiplier = 0.8f; + effect = Fx.sapped; + effectChance = 0.04f; + }}; + tarred = new StatusEffect("tarred"){{ speedMultiplier = 0.6f; effect = Fx.oily; diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 86d6575c35..56f39995a8 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -255,6 +255,8 @@ public class Weathers implements ContentList{ { attrs.set(Attribute.spores, 0.5f); attrs.set(Attribute.light, -0.1f); + status = StatusEffects.sporeSlowed; + statusGround = false; } @Override diff --git a/core/src/mindustry/entities/comp/CommanderComp.java b/core/src/mindustry/entities/comp/CommanderComp.java index 5462014a16..9fa314cfcf 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -45,18 +45,24 @@ abstract class CommanderComp implements Unitc{ void command(Formation formation, Seq units){ clearCommand(); + float spacing = 8f; + controlling.addAll(units); for(Unit unit : units){ - unit.controller(new FormationAI(base(), formation)); + FormationAI ai; + unit.controller(ai = new FormationAI(base(), formation)); + spacing = Math.max(spacing, ai.formationSize()); } this.formation = formation; + //update formation spacing based on max size + formation.pattern.spacing = spacing; + members.clear(); for(Unitc u : units){ members.add((FormationAI)u.controller()); } - //TODO doesn't handle units that don't fit a formation formation.addMembers(members); } diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 84121a9893..3bff10a11a 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -10,6 +10,8 @@ public class Pal{ sap = Color.valueOf("665c9f"), + spore = Color.valueOf("7457ce"), + shield = Color.valueOf("ffd37f").a(0.7f), shieldIn = Color.black.cpy().a(0f), diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 5b57b69174..a5ff045642 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -266,7 +266,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(commander.isCommanding()){ commander.clearCommand(); }else{ - SquareFormation pattern = new SquareFormation(); + FormationPattern pattern = new SquareFormation(); Formation formation = new Formation(new Vec3(player.x, player.y, player.unit().rotation), pattern); formation.slotAssignmentStrategy = new DistanceAssignmentStrategy(pattern); @@ -282,8 +282,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ units.sort(u -> u.dst2(player.unit())); units.truncate(player.unit().type().commandLimit); - if(units.any()) pattern.spacing = units.max(u -> u.hitSize).hitSize * 2f; - commander.command(formation, units); } diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index fd277a05b0..9b1ca3a09f 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -23,6 +23,7 @@ public abstract class Weather extends MappableContent{ public Prov type = WeatherState::create; public StatusEffect status = StatusEffects.none; public float statusDuration = 60f * 2; + public boolean statusAir = true, statusGround = true; public Weather(String name, Prov type){ super(name); @@ -68,7 +69,11 @@ public abstract class Weather extends MappableContent{ if(state.effectTimer <= 0){ state.effectTimer = statusDuration - 5f; - Groups.unit.each(u -> u.apply(status, statusDuration)); + Groups.unit.each(u -> { + if(u.checkTarget(statusAir, statusGround)){ + u.apply(status, statusDuration); + } + }); }else{ state.effectTimer -= Time.delta; } diff --git a/core/src/mindustry/world/blocks/units/ControlCenter.java b/core/src/mindustry/world/blocks/units/ControlCenter.java new file mode 100644 index 0000000000..48a78c0b58 --- /dev/null +++ b/core/src/mindustry/world/blocks/units/ControlCenter.java @@ -0,0 +1,11 @@ +package mindustry.world.blocks.units; + +import mindustry.world.*; + +public class ControlCenter extends Block{ + + public ControlCenter(String name){ + super(name); + update = true; + } +}