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[] 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); + } +}