diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 677fd1ee88..4613532a31 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1438,10 +1438,8 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.title.teams = Teams -rules.title.light = Lighting rules.title.planet = Planet rules.lighting = Lighting -rules.lighting.unitlight = Unit Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions rules.legacylaunchpads = Legacy Launch Pad Mechanics diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index b7b8d3243e..00fb77bfaf 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -320,37 +320,6 @@ public class Renderer implements ApplicationListener{ } } - //draw objective markers - float scaleFactor = 4f / renderer.getDisplayScale(); - state.rules.objectives.eachRunning(obj -> { - for(var marker : obj.markers){ - if(marker.world != -1){ - marker.draw(marker.autoscale ? scaleFactor : 1); - } - } - }); - - for(var marker : state.markers.worldMarkers){ - marker.draw(marker.autoscale ? scaleFactor : 1); - } - Draw.reset(); - - lights.add(() -> { - state.rules.objectives.eachRunning(obj -> { - for(var marker : obj.markers){ - if(marker.light != -1){ - marker.drawLight(marker.autoscale ? scaleFactor : 1); - } - } - }); - - for(var marker : state.markers.lightMarkers){ - marker.drawLight(marker.autoscale ? scaleFactor : 1); - } - - Draw.reset(); - }); - if(state.rules.lighting && drawLight){ Draw.draw(Layer.light, lights::draw); } @@ -384,6 +353,23 @@ public class Renderer implements ApplicationListener{ }); } + float scaleFactor = 4f / renderer.getDisplayScale(); + + //draw objective markers + state.rules.objectives.eachRunning(obj -> { + for(var marker : obj.markers){ + if(marker.world){ + marker.draw(marker.autoscale ? scaleFactor : 1); + } + } + }); + + for(var marker : state.markers){ + if(marker.world){ + marker.draw(marker.autoscale ? scaleFactor : 1); + } + } + Draw.reset(); Draw.draw(Layer.overlayUI, overlays::drawTop); diff --git a/core/src/mindustry/editor/MapObjectivesDialog.java b/core/src/mindustry/editor/MapObjectivesDialog.java index fd1d60cb11..c8f021f214 100644 --- a/core/src/mindustry/editor/MapObjectivesDialog.java +++ b/core/src/mindustry/editor/MapObjectivesDialog.java @@ -302,11 +302,6 @@ public class MapObjectivesDialog extends BaseDialog{ }).growX().fillY(); }); - - setInterpreter(IndexBool.class, int.class, (cont, name, type, field, remover, indexer, get, set) -> { - getInterpreter(Boolean.class).build(cont, name, type, field, remover, indexer, () -> get.get() != -1, v -> set.get(v ? +1 : -1)); - }); - // Special data structure interpreters. // Instantiate default `Seq`s with a reflectively allocated array. setProvider(Seq.class, (type, cons) -> cons.get(new Seq<>(type.element.raw))); diff --git a/core/src/mindustry/game/MapMarkers.java b/core/src/mindustry/game/MapMarkers.java index 4bd4193cea..3afb6895ee 100644 --- a/core/src/mindustry/game/MapMarkers.java +++ b/core/src/mindustry/game/MapMarkers.java @@ -1,37 +1,42 @@ package mindustry.game; -import arc.func.*; import arc.struct.*; import arc.util.*; import mindustry.game.MapObjectives.*; import mindustry.io.*; import java.io.*; +import java.util.*; -public class MapMarkers{ +public class MapMarkers implements Iterable{ /** Maps marker unique ID to marker. */ private IntMap map = new IntMap<>(); - - public Seq worldMarkers = new Seq<>(false); - public Seq mapMarkers = new Seq<>(false); - public Seq lightMarkers = new Seq<>(false); + /** Sequential list of markers. This allows for faster iteration than a map. */ + private Seq all = new Seq<>(false); public void add(int id, ObjectiveMarker marker){ if(marker == null) return; - var prev = map.put(id, marker); - setMarker(worldMarkers, marker, prev, m -> m.world, (m, i) -> m.world = i); - setMarker(mapMarkers, marker, prev, m -> m.minimap, (m, i) -> m.minimap = i); - setMarker(lightMarkers, marker, prev, m -> m.light, (m, i) -> m.light = i); + var prev = map.put(id, marker); + if(prev != null){ + all.set(prev.arrayIndex, marker); + }else{ + all.add(marker); + marker.arrayIndex = all.size - 1; + } } public void remove(int id){ var prev = map.remove(id); - if(prev != null){ - remove(worldMarkers, prev.world, (m, i) -> m.world = i); - remove(mapMarkers, prev.minimap, (m, i) -> m.minimap = i); - remove(lightMarkers, prev.light, (m, i) -> m.light = i); + if(all.size > prev.arrayIndex + 1){ //there needs to be something above the index to replace it with + all.remove(prev.arrayIndex); + //update its index + all.get(prev.arrayIndex).arrayIndex = prev.arrayIndex; + }else{ + //no sense updating the index of the replaced element when it was not replaced + all.remove(prev.arrayIndex); + } } } @@ -44,7 +49,7 @@ public class MapMarkers{ } public int size(){ - return map.size; + return all.size; } public void write(DataOutput stream) throws IOException{ @@ -52,64 +57,16 @@ public class MapMarkers{ } public void read(DataInput stream) throws IOException{ - worldMarkers.clear(); - mapMarkers.clear(); - lightMarkers.clear(); + all.clear(); map = JsonIO.readBytes(IntMap.class, ObjectiveMarker.class, (DataInputStream)stream); - for(var entry : map.entries()){ - var marker = entry.value; - - if(marker.world != -1) marker.world = worldMarkers.add(marker).size - 1; - if(marker.minimap != -1) marker.minimap = mapMarkers.add(marker).size - 1; - if(marker.light != -1) marker.light = lightMarkers.add(marker).size - 1; + all.add(entry.value); + entry.value.arrayIndex = all.size - 1; } } - public interface MarkerSetter{ - void set(ObjectiveMarker marker, int index); + @Override + public Iterator iterator(){ + return all.iterator(); } - - public void updateMarker(Seq markers, ObjectiveMarker marker, boolean visible, Intf getter, MarkerSetter setter){ - if((getter.get(marker) != -1) == visible) return; // nothing to change - - if(!visible){ - setter.set(markers.peek(), getter.get(marker)); - markers.remove(getter.get(marker)); - setter.set(marker, -1); - }else{ - setter.set(marker, markers.size); - markers.add(marker); - } - } - - private void setMarker(Seq markers, ObjectiveMarker curr, ObjectiveMarker prev, Intf getter, MarkerSetter setter){ - int currIndex = getter.get(curr); - - if(prev != null && getter.get(prev) != -1){ - int prevIndex = getter.get(prev); - if(currIndex != -1){ - // both markers visible, replace previous with current - setter.set(curr, prevIndex); - markers.set(prevIndex, curr); - }else{ - // previous marker visible but not current - setter.set(markers.peek(), prevIndex); - markers.remove(prevIndex); - } - }else{ - if(currIndex != -1){ - setter.set(curr, markers.size); - markers.add(curr); - } - } - } - - private void remove(Seq markers, int index, MarkerSetter setter){ - if(index != -1){ - setter.set(markers.peek(), index); - markers.remove(index); - } - } - } diff --git a/core/src/mindustry/game/MapObjectives.java b/core/src/mindustry/game/MapObjectives.java index 144b61bc73..7f158b264a 100644 --- a/core/src/mindustry/game/MapObjectives.java +++ b/core/src/mindustry/game/MapObjectives.java @@ -65,8 +65,7 @@ public class MapObjectives implements Iterable, Eachable, Eachable, Eachable state.markers.updateMarker(state.markers.worldMarkers, this, !Mathf.equal((float)p1, 0f), m -> m.world, (m, i) -> m.world = i); - case minimap -> state.markers.updateMarker(state.markers.mapMarkers, this, !Mathf.equal((float)p1, 0f), m -> m.minimap, (m, i) -> m.minimap = i); - case light -> state.markers.updateMarker(state.markers.lightMarkers, this, !Mathf.equal((float)p1, 0f), m -> m.light, (m, i) -> m.light = i); + case world -> world = !Mathf.equal((float)p1, 0f); + case minimap -> minimap = !Mathf.equal((float)p1, 0f); case autoscale -> autoscale = !Mathf.equal((float)p1, 0f); case drawLayer -> drawLayer = (float)p1; } @@ -847,13 +842,8 @@ public class MapObjectives implements Iterable, Eachable, Eachable, Eachable, Eachable radius = (float)p1; - case color -> color.fromDouble(p1); - } - } - } - } - private static void lookupRegion(String name, TextureRegion out){ TextureRegion region = Core.atlas.find(name); if(region.found()){ @@ -1330,11 +1275,6 @@ public class MapObjectives implements Iterable, Eachable { for(var marker : obj.markers){ - if(marker.minimap != -1){ + if(marker.minimap){ marker.draw(1); } } }); - for(var marker : state.markers.mapMarkers){ - marker.draw(1); + + for(var marker : state.markers){ + if(marker.minimap){ + marker.draw(1); + } } - Draw.reset(); Draw.trans(Tmp.m2); } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 10b7f05b0c..1ba96cc93a 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1548,7 +1548,6 @@ public class LExecutor{ } } case ambientLight -> state.rules.ambientLight.fromDouble(value.num()); - case unitLight -> state.rules.unitLight = value.bool(); case solarMultiplier -> state.rules.solarMultiplier = Math.max(value.numf(), 0f); case dragMultiplier -> state.rules.dragMultiplier = Math.max(value.numf(), 0f); case ban -> { diff --git a/core/src/mindustry/logic/LMarkerControl.java b/core/src/mindustry/logic/LMarkerControl.java index 4ea274563b..c24775af02 100644 --- a/core/src/mindustry/logic/LMarkerControl.java +++ b/core/src/mindustry/logic/LMarkerControl.java @@ -4,7 +4,6 @@ public enum LMarkerControl{ remove, world("true/false"), minimap("true/false"), - light("true/false"), autoscale("true/false"), pos("x", "y"), endPos("x", "y"), diff --git a/core/src/mindustry/logic/LogicRule.java b/core/src/mindustry/logic/LogicRule.java index f532af6441..b6ca757bb7 100644 --- a/core/src/mindustry/logic/LogicRule.java +++ b/core/src/mindustry/logic/LogicRule.java @@ -15,7 +15,6 @@ public enum LogicRule{ lighting, canGameOver, ambientLight, - unitLight, solarMultiplier, dragMultiplier, ban, diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 11fcb1c4b3..68513a7f58 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -1547,7 +1547,7 @@ public class UnitType extends UnlockableContent implements Senseable{ } public void drawLight(Unit unit){ - if(lightRadius > 0 && state.rules.unitLight){ + if(lightRadius > 0){ Drawf.light(unit.x, unit.y, lightRadius, lightColor, lightOpacity); } } diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 3c1c9b0ccc..8c9e1a16c5 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -221,11 +221,6 @@ public class CustomRulesDialog extends BaseDialog{ number("@rules.solarmultiplier", f -> rules.solarMultiplier = f, () -> rules.solarMultiplier); - if(Core.bundle.get("rules.weather").toLowerCase().contains(ruleSearch)){ - current.button("@rules.weather", this::weatherDialog).width(250f).left().row(); - } - - category("light"); if(Core.bundle.get("rules.ambientlight").toLowerCase().contains(ruleSearch)){ current.button(b -> { b.left(); @@ -237,7 +232,11 @@ public class CustomRulesDialog extends BaseDialog{ b.add("@rules.ambientlight"); }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row(); } - check("@rules.lighting.unitlight", b -> rules.unitLight = b, () -> rules.unitLight); + + if(Core.bundle.get("rules.weather").toLowerCase().contains(ruleSearch)){ + current.button("@rules.weather", this::weatherDialog).width(250f).left().row(); + } + category("planet"); if(Core.bundle.get("rules.title.planet").toLowerCase().contains(ruleSearch)){