diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java new file mode 100644 index 000000000..aa086d707 --- /dev/null +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.biome.palette; + +import org.bukkit.block.data.BlockData; +import org.polydev.gaea.math.ProbabilityCollection; + +public class PaletteLayer { + private final ProbabilityCollection layer; + private final int size; + + public PaletteLayer(ProbabilityCollection layer, int size) { + this.layer = layer; + this.size = size; + } + + public ProbabilityCollection getLayer() { + return layer; + } + + public int getSize() { + return size; + } +} diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 726763a67..f84f9c755 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -6,6 +6,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.Debug; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.palette.PaletteHolder; +import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.builder.BiomeGridBuilder; @@ -13,26 +14,31 @@ import com.dfsek.terra.config.exception.FileMissingException; import com.dfsek.terra.config.factories.BiomeFactory; import com.dfsek.terra.config.factories.BiomeGridFactory; import com.dfsek.terra.config.factories.CarverFactory; +import com.dfsek.terra.config.factories.PaletteFactory; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.loaders.GridSpawnLoader; import com.dfsek.terra.config.loaders.NoiseBuilderLoader; import com.dfsek.terra.config.loaders.PaletteHolderLoader; +import com.dfsek.terra.config.loaders.PaletteLayerLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; import com.dfsek.terra.config.loaders.base.CarverPaletteLoader; import com.dfsek.terra.config.templates.BiomeGridTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; +import com.dfsek.terra.config.templates.PaletteTemplate; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; +import com.dfsek.terra.registry.PaletteRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.util.ConfigUtil; import org.polydev.gaea.math.ProbabilityCollection; import org.polydev.gaea.math.Range; +import org.polydev.gaea.world.palette.Palette; import java.io.File; import java.io.FileInputStream; @@ -52,6 +58,7 @@ public class ConfigPack { private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry(); private final StructureRegistry structureRegistry = new StructureRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry(); + private final PaletteRegistry paletteRegistry = new PaletteRegistry(); public ConfigPack(File folder) throws ConfigException { @@ -73,7 +80,16 @@ public class ConfigPack { .registerLoader(Range.class, new RangeLoader()) .registerLoader(CarverPalette.class, new CarverPaletteLoader()) .registerLoader(GridSpawn.class, new GridSpawnLoader()) - .registerLoader(PaletteHolder.class, new PaletteHolderLoader()); + .registerLoader(PaletteHolder.class, new PaletteHolderLoader()) + .registerLoader(PaletteLayer.class, new PaletteLayerLoader()) + .registerLoader(Palette.class, paletteRegistry); + + List paletteTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "palettes").toPath()), PaletteTemplate::new); + PaletteFactory paletteFactory = new PaletteFactory(); + paletteTemplates.forEach(palette -> { + paletteRegistry.add(palette.getID(), paletteFactory.build(palette)); + Debug.info("Loaded palette " + palette.getID()); + }); List structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new); structureTemplates.forEach(structure -> { diff --git a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java new file mode 100644 index 000000000..8b6b68d08 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.config.factories; + +import com.dfsek.terra.biome.palette.PaletteLayer; +import com.dfsek.terra.config.templates.PaletteTemplate; +import org.bukkit.block.data.BlockData; +import org.polydev.gaea.math.FastNoiseLite; +import org.polydev.gaea.util.FastRandom; +import org.polydev.gaea.world.palette.Palette; +import org.polydev.gaea.world.palette.RandomPalette; +import org.polydev.gaea.world.palette.SimplexPalette; + +public class PaletteFactory implements TerraFactory> { + @Override + public Palette build(PaletteTemplate config) { + Palette palette; + if(config.isSimplex()) { + FastNoiseLite noise = new FastNoiseLite((int) config.getSeed()); + noise.setFrequency(config.getFrequency()); + palette = new SimplexPalette<>(noise); + } else palette = new RandomPalette<>(new FastRandom(config.getSeed())); + + for(PaletteLayer layer : config.getPalette()) { + palette.add(layer.getLayer(), layer.getSize()); + } + return palette; + } +} diff --git a/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java b/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java index a9722bbca..6a7717a9d 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/PaletteHolderLoader.java @@ -20,7 +20,7 @@ public class PaletteHolderLoader implements TypeLoader { PaletteHolderBuilder builder = new PaletteHolderBuilder(); for(Map layer : palette) { for(Map.Entry entry : layer.entrySet()) { - builder.add(entry.getValue(), (Palette) configLoader.loadType(Types.BLOCK_DATA_PALETTE, entry.getKey())); + builder.add(entry.getValue(), (Palette) configLoader.loadType(Types.BLOCK_DATA_PALETTE_TYPE, entry.getKey())); } } return builder.build(); diff --git a/src/main/java/com/dfsek/terra/config/loaders/PaletteLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/PaletteLayerLoader.java new file mode 100644 index 000000000..26593194d --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/loaders/PaletteLayerLoader.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.config.loaders; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.biome.palette.PaletteLayer; +import org.bukkit.block.data.BlockData; +import org.polydev.gaea.math.ProbabilityCollection; + +import java.lang.reflect.Type; +import java.util.Map; + +@SuppressWarnings("unchecked") +public class PaletteLayerLoader implements TypeLoader { + @Override + public PaletteLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + Map map = (Map) o; + ProbabilityCollection collection = (ProbabilityCollection) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials")); + return new PaletteLayer(collection, (Integer) map.get("layers")); + } +} diff --git a/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java index 53790b83a..12690e56c 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java @@ -7,21 +7,33 @@ import org.polydev.gaea.math.ProbabilityCollection; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.List; import java.util.Map; @SuppressWarnings("unchecked") public class ProbabilityCollectionLoader implements TypeLoader> { @Override public ProbabilityCollection load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - Map map = (Map) o; + + ProbabilityCollection collection = new ProbabilityCollection<>(); if(type instanceof ParameterizedType) { ParameterizedType pType = (ParameterizedType) type; Type generic = pType.getActualTypeArguments()[0]; - for(Map.Entry entry : map.entrySet()) { - collection.add(configLoader.loadType(generic, entry.getKey()), entry.getValue()); - } + if(o instanceof Map) { + Map map = (Map) o; + for(Map.Entry entry : map.entrySet()) { + collection.add(configLoader.loadType(generic, entry.getKey()), entry.getValue()); + } + } else if(o instanceof List) { + List> map = (List>) o; + for(Map l : map) { + for(Map.Entry entry : l.entrySet()) { + collection.add(configLoader.loadType(generic, entry.getKey()), entry.getValue()); + } + } + } else throw new LoadException("Malformed Probability Collection: " + o); } else throw new LoadException("Unable to load config! Could not retrieve parameterized type: " + type); diff --git a/src/main/java/com/dfsek/terra/config/loaders/Types.java b/src/main/java/com/dfsek/terra/config/loaders/Types.java index 8140ae526..da85047fe 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -15,17 +15,20 @@ import java.util.Set; public final class Types { public static final Type MATERIAL_SET_TYPE; public static final Type MATERIAL_PROBABILITY_COLLECTION_TYPE; - public static final Type BLOCK_DATA_PALETTE; + public static final Type BLOCK_DATA_PALETTE_TYPE; + public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE; static { MATERIAL_SET_TYPE = getType("materialSet"); MATERIAL_PROBABILITY_COLLECTION_TYPE = getType("materialProbabilityCollection"); - BLOCK_DATA_PALETTE = getType("blockDataPalette"); + BLOCK_DATA_PALETTE_TYPE = getType("blockDataPalette"); + BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection"); } private Set materialSet; private Palette blockDataPalette; private ProbabilityCollection materialProbabilityCollection; + private ProbabilityCollection blockDataProbabilityCollection; private static Type getType(String dummyFieldName) { try { diff --git a/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java b/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java index 80a4eb148..ffe35883a 100644 --- a/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java @@ -4,17 +4,18 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import org.bukkit.block.data.BlockData; -import org.polydev.gaea.world.palette.Palette; +import com.dfsek.terra.biome.palette.PaletteLayer; + +import java.util.List; @SuppressWarnings({"FieldMayBeFinal", "unused"}) public class PaletteTemplate implements ConfigTemplate { @Value("id") private String id; - @Value("palette") + @Value("layers") @Abstractable - private Palette palette; + private List palette; @Value("simplex") @Abstractable @@ -31,7 +32,7 @@ public class PaletteTemplate implements ConfigTemplate { @Default private long seed = 0; - public String getId() { + public String getID() { return id; } @@ -43,7 +44,11 @@ public class PaletteTemplate implements ConfigTemplate { return seed; } - public Palette getPalette() { + public List getPalette() { return palette; } + + public boolean isSimplex() { + return simplex; + } } diff --git a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java b/src/main/java/com/dfsek/terra/registry/TerraRegistry.java index 37e4bc742..385a388d1 100644 --- a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/TerraRegistry.java @@ -1,14 +1,23 @@ package com.dfsek.terra.registry; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; + +import java.lang.reflect.Type; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.function.Consumer; -public abstract class TerraRegistry { +public abstract class TerraRegistry implements TypeLoader { private final Map objects = new HashMap<>(); + @Override + public T load(Type type, Object o, ConfigLoader configLoader) { + return get((String) o); + } + /** * Add an object to the registry with a name. *