diff --git a/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java b/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java index 35b2417d4..f0287e95e 100644 --- a/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java +++ b/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java @@ -227,7 +227,7 @@ public class IrisDepositModifier extends EngineAssignedModifier clumps = new ArrayList<>(limit - first); for (int l = first; l < limit; l++) { - RNG clumpRng = new RNG(clumpSeed(plan.seed(), l)); + RNG clumpRng = new ClumpRandom(clumpSeed(plan.seed(), l)); if (k.getPerClumpSpawnChance() < clumpRng.d()) { continue; } @@ -635,6 +635,30 @@ public class IrisDepositModifier extends EngineAssignedModifier>> (48 - bits)); + } + } + private record PreparedDeposit(IrisDepositGenerator generator, boolean ore, List clumps) { } diff --git a/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierProbabilityTest.java b/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierProbabilityTest.java index c45f8ed75..af5629457 100644 --- a/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierProbabilityTest.java +++ b/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierProbabilityTest.java @@ -19,6 +19,30 @@ public class IrisDepositModifierProbabilityTest { assertEquals(0.04D, accepted / (double) samples, 0.003D); } + @Test + public void clumpRandomMatchesRngDrawForDraw() { + RNG seeds = new RNG(-90181L); + for (int trial = 0; trial < 2_000; trial++) { + long seed = trial < 4 ? new long[]{0L, -1L, Long.MIN_VALUE, Long.MAX_VALUE}[trial] : seeds.nextLong(); + RNG expected = new RNG(seed); + RNG actual = new IrisDepositModifier.ClumpRandom(seed); + for (int draw = 0; draw < 48; draw++) { + String label = "seed " + seed + " draw " + draw; + switch (draw % 8) { + case 0 -> assertEquals(label, Float.floatToIntBits(expected.nextFloat()), Float.floatToIntBits(actual.nextFloat())); + case 1 -> assertEquals(label, expected.nextInt(3), actual.nextInt(3)); + case 2 -> assertEquals(label, Double.doubleToLongBits(expected.nextDouble()), Double.doubleToLongBits(actual.nextDouble())); + case 3 -> assertEquals(label, Double.doubleToLongBits(expected.d()), Double.doubleToLongBits(actual.d())); + case 4 -> assertEquals(label, expected.i(-5, 17), actual.i(-5, 17)); + case 5 -> assertEquals(label, expected.nextInt(1_000_000_007), actual.nextInt(1_000_000_007)); + case 6 -> assertEquals(label, expected.nextLong(), actual.nextLong()); + default -> assertEquals(label, expected.nextBoolean(), actual.nextBoolean()); + } + } + assertEquals(expected.getSeed(), actual.getSeed()); + } + } + @Test public void neighboringClumpChancesRemainIndependentAcrossBatchBoundaries() { int samples = 100_000;