package net.glowstone.generator.biomegrid; import java.util.HashMap; import java.util.Map; public class WhittakerMapLayer extends MapLayer { private static final Map<ClimateType, Climate> MAP = new HashMap<>(); private final MapLayer belowLayer; private final ClimateType type; public WhittakerMapLayer(long seed, MapLayer belowLayer, ClimateType type) { super(seed); this.belowLayer = belowLayer; this.type = type; } @Override public int[] generateValues(int x, int z, int sizeX, int sizeZ) { if (type == ClimateType.WARM_WET || type == ClimateType.COLD_DRY) { return swapValues(x, z, sizeX, sizeZ); } else { return modifyValues(x, z, sizeX, sizeZ); } } private int[] swapValues(int x, int z, int sizeX, int sizeZ) { int gridX = x - 1; int gridZ = z - 1; int gridSizeX = sizeX + 2; int gridSizeZ = sizeZ + 2; int[] values = belowLayer.generateValues(gridX, gridZ, gridSizeX, gridSizeZ); final Climate climate = MAP.get(type); int[] finalValues = new int[sizeX * sizeZ]; for (int i = 0; i < sizeZ; i++) { for (int j = 0; j < sizeX; j++) { int centerVal = values[j + 1 + (i + 1) * gridSizeX]; if (centerVal == climate.value) { int upperVal = values[j + 1 + i * gridSizeX]; int lowerVal = values[j + 1 + (i + 2) * gridSizeX]; int leftVal = values[j + (i + 1) * gridSizeX]; int rightVal = values[j + 2 + (i + 1) * gridSizeX]; for (int type : climate.crossTypes) { if (upperVal == type || lowerVal == type || leftVal == type || rightVal == type) { centerVal = climate.finalValue; break; } } } finalValues[j + i * sizeX] = centerVal; } } return finalValues; } private int[] modifyValues(int x, int z, int sizeX, int sizeZ) { int[] values = belowLayer.generateValues(x, z, sizeX, sizeZ); int[] finalValues = new int[sizeX * sizeZ]; for (int i = 0; i < sizeZ; i++) { for (int j = 0; j < sizeX; j++) { int val = values[j + i * sizeX]; if (val != 0) { setCoordsSeed(x + j, z + i); if (nextInt(13) == 0) { val += 1000; } } finalValues[j + i * sizeX] = val; } } return finalValues; } public static enum ClimateType { WARM_WET, COLD_DRY, LARGER_BIOMES } static { MAP.put(ClimateType.WARM_WET, new Climate(2, new int[] {3, 1}, 4)); MAP.put(ClimateType.COLD_DRY, new Climate(3, new int[] {2, 4}, 1)); } private static class Climate { public final int value; public final int[] crossTypes; public final int finalValue; public Climate(int value, int[] crossTypes, int finalValue) { this.value = value; this.crossTypes = crossTypes; this.finalValue = finalValue; } } }