From 8e84e7284e59fba30430344bc45aab0e09eb69ef Mon Sep 17 00:00:00 2001
From: Anuken <arnukren@gmail.com>
Date: Fri, 2 Aug 2019 12:56:21 -0400
Subject: [PATCH] Added ore median filter

---
 core/assets/bundles/bundle.properties         |  1 +
 .../mindustry/editor/MapGenerateDialog.java   |  4 +-
 .../maps/filters/OreMedianFilter.java         | 43 +++++++++++++++++++
 3 files changed, 46 insertions(+), 2 deletions(-)
 create mode 100644 core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java

diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties
index f7e4ac45a6..f72be5fa6c 100644
--- a/core/assets/bundles/bundle.properties
+++ b/core/assets/bundles/bundle.properties
@@ -268,6 +268,7 @@ filters.empty = [lightgray]No filters! Add one with the button below.
 filter.distort = Distort
 filter.noise = Noise
 filter.median = Median
+filter.oremedian = Ore Median
 filter.blend = Blend
 filter.defaultores = Default Ores
 filter.ore = Ore
diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java
index a639dd36b3..2f014a614c 100644
--- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java
+++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java
@@ -28,8 +28,8 @@ import static io.anuke.mindustry.Vars.*;
 public class MapGenerateDialog extends FloatingDialog{
     private final Supplier<GenerateFilter>[] filterTypes = new Supplier[]{
         NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new,
-        RiverNoiseFilter::new, OreFilter::new, MedianFilter::new, BlendFilter::new,
-        MirrorFilter::new, ClearFilter::new
+        RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new,
+        BlendFilter::new, MirrorFilter::new, ClearFilter::new
     };
     private final MapEditor editor;
     private final boolean applied;
diff --git a/core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java b/core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java
new file mode 100644
index 0000000000..c6f69cc270
--- /dev/null
+++ b/core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java
@@ -0,0 +1,43 @@
+package io.anuke.mindustry.maps.filters;
+
+import io.anuke.arc.collection.*;
+import io.anuke.arc.math.*;
+import io.anuke.mindustry.maps.filters.FilterOption.*;
+import io.anuke.mindustry.world.*;
+
+import static io.anuke.mindustry.Vars.content;
+
+public class OreMedianFilter extends GenerateFilter{
+    float radius = 2;
+    float percentile = 0.5f;
+    IntArray blocks = new IntArray();
+
+    {
+        buffered = true;
+        options(
+            new SliderOption("radius", () -> radius, f -> radius = f, 1f, 12f),
+            new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f)
+        );
+    }
+
+    @Override
+    public void apply(){
+        int rad = (int)radius;
+        blocks.clear();
+        for(int x = -rad; x <= rad; x++){
+            for(int y = -rad; y <= rad; y++){
+                if(Mathf.dst2(x, y) > rad*rad) continue;
+
+                Tile tile = in.tile(in.x + x, in.y + y);
+                blocks.add(tile.overlay().id);
+            }
+        }
+
+        blocks.sort();
+
+        int index = Math.min((int)(blocks.size * percentile), blocks.size - 1);
+        int overlay = blocks.get(index), block = blocks.get(index);
+
+        in.ore = content.block(overlay);
+    }
+}