diff --git a/src/main/java/com/volmit/iris/engine/object/IRare.java b/src/main/java/com/volmit/iris/engine/object/IRare.java index c4edd12f3..a4d60905e 100644 --- a/src/main/java/com/volmit/iris/engine/object/IRare.java +++ b/src/main/java/com/volmit/iris/engine/object/IRare.java @@ -18,8 +18,11 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.Iris; +import com.volmit.iris.engine.EnginePanic; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.reflect.V; +import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.stream.ProceduralStream; import com.volmit.iris.util.stream.arithmetic.FittedStream; import com.volmit.iris.util.stream.interpolation.Interpolated; @@ -29,7 +32,7 @@ import java.util.List; import java.util.Set; public interface IRare { - static ProceduralStream stream(ProceduralStream noise, List possibilities) + static ProceduralStream stream(ProceduralStream noise, List possibilities) { return ProceduralStream.of((x, z) -> pick(possibilities, noise.get(x, z)), (x, y, z) -> pick(possibilities, noise.get(x, y, z)), @@ -46,6 +49,31 @@ public interface IRare { }); } + static T pickSlowly(List possibilities, double noiseValue) + { + if(possibilities.isEmpty()) + { + return null; + } + + if(possibilities.size() == 1) + { + return possibilities.get(0); + } + + KList rarityTypes = new KList<>(); + int totalRarity = 0; + for (T i : possibilities) { + totalRarity += IRare.get(i); + } + + for (T i : possibilities) { + rarityTypes.addMultiple(i, totalRarity / IRare.get(i)); + } + + return rarityTypes.get((int) (noiseValue * rarityTypes.last())); + } + static T pick(List possibilities, double noiseValue) { if(possibilities.isEmpty()) @@ -80,7 +108,7 @@ public interface IRare { } } - return null; + return possibilities.get(possibilities.size() - 1); } static int get(Object v) {