diff --git a/src/main/java/com/livingworld/platform/neoforge/NeoForgeWorldEffectExecutor.java b/src/main/java/com/livingworld/platform/neoforge/NeoForgeWorldEffectExecutor.java index a361de2..062f129 100644 --- a/src/main/java/com/livingworld/platform/neoforge/NeoForgeWorldEffectExecutor.java +++ b/src/main/java/com/livingworld/platform/neoforge/NeoForgeWorldEffectExecutor.java @@ -131,9 +131,37 @@ public final class NeoForgeWorldEffectExecutor implements WorldEffectConsumer { if (!state.is(Blocks.GRASS_BLOCK) && !state.is(Blocks.DIRT)) continue; BlockPos above = pos.above(); if (!level.isLoaded(above) || !level.getBlockState(above).isAir()) continue; - level.setBlock(above, Blocks.OAK_SAPLING.defaultBlockState(), Block.UPDATE_ALL); + Block sapling = pickSapling(intensity); + level.setBlock(above, sapling.defaultBlockState(), Block.UPDATE_ALL); LivingWorldLogger.info(DiagnosticCategory.SIMULATION, - "WorldEffect SAPLING_GROWTH_BOOSTED at " + pos); + "WorldEffect SAPLING_GROWTH_BOOSTED (" + sapling + ") at " + pos); + } + } + + /** + * Selects a sapling species weighted by succession intensity. + * Low intensity (young woodland, ~0.5): pioneer species — oak and birch dominate. + * High intensity (mature forest, ~1.0): diverse canopy — spruce, dark oak, cherry join in. + */ + private Block pickSapling(double intensity) { + int r = random.nextInt(100); + if (intensity < 0.7) { + // Young woodland: pioneer species only + return r < 55 ? Blocks.OAK_SAPLING : Blocks.BIRCH_SAPLING; + } else if (intensity < 0.9) { + // Developing forest: conifers begin to establish + if (r < 35) return Blocks.OAK_SAPLING; + if (r < 65) return Blocks.BIRCH_SAPLING; + if (r < 85) return Blocks.SPRUCE_SAPLING; + return Blocks.DARK_OAK_SAPLING; + } else { + // Mature forest: full species diversity + if (r < 25) return Blocks.OAK_SAPLING; + if (r < 45) return Blocks.BIRCH_SAPLING; + if (r < 62) return Blocks.SPRUCE_SAPLING; + if (r < 77) return Blocks.DARK_OAK_SAPLING; + if (r < 90) return Blocks.CHERRY_SAPLING; + return Blocks.JUNGLE_SAPLING; } }