Skip to content

Commit

Permalink
Generator options (#396)
Browse files Browse the repository at this point in the history
* Add ResourceGenerator enum

* Add customizable style WIP

* Add customizable style

* Get rid of densities as parameter constraints

* Remove generators from GeneratorParameters

* Use texture generators instead of biome constraints

* Rename enums

* Bring back automatic map style selection

* Fix regeneration problems

* Add tests

* Rename generator suppliers

* Remove redundant semicolon

* Remove star imports

* Refactor

* Fix SCMapImporter

* Fix uninitialized random

* Add tests for new options

* Refactor CustomStyleGenerator

* Add commands to print all the styles

* Allow specifying the symmetry

* Add command to print symmetries

* Allow unknown options for backwards compatibility

* Fix flooded style

---------

Co-authored-by: Sheikah45 <[email protected]>
  • Loading branch information
BlackYps and Sheikah45 authored Jun 1, 2024
1 parent efd3779 commit 9a301fa
Show file tree
Hide file tree
Showing 68 changed files with 688 additions and 719 deletions.
Original file line number Diff line number Diff line change
@@ -1,39 +1,23 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.biomes.Biome;
import com.faforever.neroxis.map.Symmetry;
import lombok.Builder;

@Builder(toBuilder = true)
public record GeneratorParameters(int spawnCount,
float landDensity,
float plateauDensity,
float mountainDensity,
float rampDensity,
float reclaimDensity,
float mexDensity,
int mapSize,
int numTeams,
Visibility visibility,
Symmetry terrainSymmetry,
Biome biome) {
Symmetry terrainSymmetry) {

public String toString() {
if (visibility == null) {
return """
Spawns: %d
Map Size: %d
Num Teams: %d
Biome: %s
Land Density: %s
Plateau Density: %s
Mountain Density: %s
Ramp Density: %s
Reclaim Density: %s
Mex Density: %s
Terrain Symmetry: %s
""".formatted(spawnCount, mapSize, numTeams, biome.name(), landDensity, plateauDensity,
mountainDensity, rampDensity, reclaimDensity, mexDensity, terrainSymmetry);
""".formatted(spawnCount, mapSize, numTeams, terrainSymmetry);
} else {
return """
Spawns: %d
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,139 +1,28 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.biomes.BiomeName;
import com.faforever.neroxis.biomes.Biomes;
import com.faforever.neroxis.util.Range;

import java.util.Arrays;
import java.util.List;
import java.util.random.RandomGenerator;

@SuppressWarnings({"unused"})
public record ParameterConstraints(Range landDensityRange,
Range mountainDensityRange,
Range plateauDensityRange,
Range rampDensityRange,
Range reclaimDensityRange,
Range mexDensityRange,
Range spawnCountRange,
public record ParameterConstraints(Range spawnCountRange,
Range mapSizeRange,
Range numTeamsRange,
List<BiomeName> biomes) {
Range numTeamsRange) {
public static ParameterConstraintsBuilder builder() {
return new ParameterConstraintsBuilder();
}

public boolean matches(GeneratorParameters generatorParameters) {
return landDensityRange.contains(generatorParameters.landDensity())
&& mountainDensityRange.contains(generatorParameters.mountainDensity())
&& plateauDensityRange.contains(generatorParameters.plateauDensity())
&& rampDensityRange.contains(generatorParameters.rampDensity())
&& reclaimDensityRange.contains(generatorParameters.reclaimDensity())
&& mexDensityRange.contains(generatorParameters.mexDensity())
&& numTeamsRange.contains(generatorParameters.numTeams())
return numTeamsRange.contains(generatorParameters.numTeams())
&& spawnCountRange.contains(generatorParameters.spawnCount())
&& mapSizeRange.contains(generatorParameters.mapSize())
&& biomes.contains(generatorParameters.biome().name());
}

public boolean matches(int mapSize, int numTeams, int spawnCount) {
return mapSizeRange.contains(mapSize) && numTeamsRange.contains(numTeams) && spawnCountRange.contains(
spawnCount);
}

public GeneratorParameters randomizeParameters(RandomGenerator random, GeneratorParameters generatorParameters) {
return GeneratorParameters.builder()
.spawnCount(generatorParameters.spawnCount())
.landDensity(landDensityRange.getRandomFloat(random))
.plateauDensity(plateauDensityRange.getRandomFloat(random))
.mountainDensity(mountainDensityRange.getRandomFloat(random))
.rampDensity(rampDensityRange.getRandomFloat(random))
.reclaimDensity(reclaimDensityRange.getRandomFloat(random))
.mexDensity(mexDensityRange.getRandomFloat(random))
.mapSize(generatorParameters.mapSize())
.numTeams(generatorParameters.numTeams())
.visibility(generatorParameters.visibility())
.terrainSymmetry(generatorParameters.terrainSymmetry())
.biome(Biomes.loadBiome(biomes.get(random.nextInt(biomes.size()))))
.build();
}

public GeneratorParameters mapToLevel(float level, GeneratorParameters generatorParameters, RandomGenerator random) {
return GeneratorParameters.builder()
.spawnCount(generatorParameters.spawnCount())
.landDensity(landDensityRange.map(level))
.plateauDensity(plateauDensityRange.map(level))
.mountainDensity(mountainDensityRange.map(level))
.rampDensity(rampDensityRange.map(level))
.reclaimDensity(reclaimDensityRange.map(level))
.mexDensity(mexDensityRange.map(level))
.mapSize(generatorParameters.mapSize())
.numTeams(generatorParameters.numTeams())
.visibility(generatorParameters.visibility())
.terrainSymmetry(generatorParameters.terrainSymmetry())
.biome(Biomes.loadBiome(biomes.get(random.nextInt(biomes.size()))))
.build();
}

public GeneratorParameters initParameters(RandomGenerator random,
GeneratorParameters.GeneratorParametersBuilder generatorParametersBuilder) {
return generatorParametersBuilder.landDensity(landDensityRange.getRandomFloat(random))
.plateauDensity(plateauDensityRange.getRandomFloat(random))
.mountainDensity(mountainDensityRange.getRandomFloat(random))
.rampDensity(rampDensityRange.getRandomFloat(random))
.reclaimDensity(reclaimDensityRange.getRandomFloat(random))
.mexDensity(mexDensityRange.getRandomFloat(random))
.biome(Biomes.loadBiome(biomes.get(random.nextInt(biomes.size()))))
.build();
&& mapSizeRange.contains(generatorParameters.mapSize());
}

public static class ParameterConstraintsBuilder {
Range landDensityRange = Range.of(0, 1);
Range mountainDensityRange = Range.of(0, 1);
Range plateauDensityRange = Range.of(0, 1);
Range rampDensityRange = Range.of(0, 1);
Range reclaimDensityRange = Range.of(0, 1);
Range mexDensityRange = Range.of(0, 1);
Range spawnCountRange = Range.of(0, 16);
Range mapSizeRange = Range.of(0, 2048);
Range numTeamsRange = Range.of(0, 16);
Range hydroCountRange = Range.of(0, 32);
List<BiomeName> biomes = Arrays.stream(BiomeName.values()).toList();

public ParameterConstraints build() {
return new ParameterConstraints(landDensityRange, mountainDensityRange, plateauDensityRange,
rampDensityRange, reclaimDensityRange, mexDensityRange, spawnCountRange,
mapSizeRange, numTeamsRange, biomes);
}

public ParameterConstraintsBuilder landDensity(float min, float max) {
landDensityRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder mountainDensity(float min, float max) {
mountainDensityRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder plateauDensity(float min, float max) {
plateauDensityRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder rampDensity(float min, float max) {
rampDensityRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder reclaimDensity(float min, float max) {
reclaimDensityRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder mexDensity(float min, float max) {
mexDensityRange = Range.of(min, max);
return this;
return new ParameterConstraints(spawnCountRange,
mapSizeRange, numTeamsRange);
}

public ParameterConstraintsBuilder spawnCount(float min, float max) {
Expand All @@ -150,15 +39,5 @@ public ParameterConstraintsBuilder numTeams(float min, float max) {
numTeamsRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder hydroCount(float min, float max) {
hydroCountRange = Range.of(min, max);
return this;
}

public ParameterConstraintsBuilder biomes(BiomeName... biomeNames) {
biomes = List.of(biomeNames);
return this;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.generator.prop.BasicPropGenerator;
import com.faforever.neroxis.generator.prop.EnemyCivPropGenerator;
import com.faforever.neroxis.generator.prop.HighReclaimPropGenerator;
import com.faforever.neroxis.generator.prop.LargeBattlePropGenerator;
import com.faforever.neroxis.generator.prop.NavyWrecksPropGenerator;
import com.faforever.neroxis.generator.prop.NeutralCivPropGenerator;
import com.faforever.neroxis.generator.prop.RockFieldPropGenerator;
import com.faforever.neroxis.generator.prop.SmallBattlePropGenerator;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.function.Supplier;

@Getter
@AllArgsConstructor
public enum PropStyle {
BASIC(BasicPropGenerator.class, BasicPropGenerator::new),
ENEMY_CIV(EnemyCivPropGenerator.class, EnemyCivPropGenerator::new),
HIGH_RECLAIM(HighReclaimPropGenerator.class, HighReclaimPropGenerator::new),
LARGE_BATTLE(LargeBattlePropGenerator.class, LargeBattlePropGenerator::new),
NAVY_WRECKS(NavyWrecksPropGenerator.class, NavyWrecksPropGenerator::new),
NEUTRAL_CIV(NeutralCivPropGenerator.class, NeutralCivPropGenerator::new),
ROCK_FIELD(RockFieldPropGenerator.class, RockFieldPropGenerator::new),
SMALL_BATTLE(SmallBattlePropGenerator.class, SmallBattlePropGenerator::new);

private final Class<? extends com.faforever.neroxis.generator.prop.PropGenerator> generatorClass;
private final Supplier<com.faforever.neroxis.generator.prop.PropGenerator> generatorSupplier;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.generator.resource.BasicResourceGenerator;
import com.faforever.neroxis.generator.resource.LowMexResourceGenerator;
import com.faforever.neroxis.generator.resource.WaterMexResourceGenerator;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.function.Supplier;

@Getter
@AllArgsConstructor
public enum ResourceStyle {
BASIC(BasicResourceGenerator.class, BasicResourceGenerator::new),
LOW_MEX(LowMexResourceGenerator.class, LowMexResourceGenerator::new),
WATER_MEX(WaterMexResourceGenerator.class, WaterMexResourceGenerator::new);

private final Class<? extends com.faforever.neroxis.generator.resource.ResourceGenerator> generatorClass;
private final Supplier<com.faforever.neroxis.generator.resource.ResourceGenerator> generatorSupplier;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.generator.terrain.BasicTerrainGenerator;
import com.faforever.neroxis.generator.terrain.BigIslandsTerrainGenerator;
import com.faforever.neroxis.generator.terrain.CenterLakeTerrainGenerator;
import com.faforever.neroxis.generator.terrain.DropPlateauTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FloodedTerrainGenerator;
import com.faforever.neroxis.generator.terrain.LandBridgeTerrainGenerator;
import com.faforever.neroxis.generator.terrain.LittleMountainTerrainGenerator;
import com.faforever.neroxis.generator.terrain.MountainRangeTerrainGenerator;
import com.faforever.neroxis.generator.terrain.OneIslandTerrainGenerator;
import com.faforever.neroxis.generator.terrain.SmallIslandsTerrainGenerator;
import com.faforever.neroxis.generator.terrain.ValleyTerrainGenerator;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.function.Supplier;

@Getter
@AllArgsConstructor
public enum TerrainStyle {
BASIC(BasicTerrainGenerator.class, BasicTerrainGenerator::new),
BIG_ISLANDS(BigIslandsTerrainGenerator.class, BigIslandsTerrainGenerator::new),
CENTER_LAKE(CenterLakeTerrainGenerator.class, CenterLakeTerrainGenerator::new),
DROP_PLATEAU(DropPlateauTerrainGenerator.class, DropPlateauTerrainGenerator::new),
FLOODED(FloodedTerrainGenerator.class, FloodedTerrainGenerator::new),
LAND_BRIDGE(LandBridgeTerrainGenerator.class, LandBridgeTerrainGenerator::new),
LITTLE_MOUNTAIN(LittleMountainTerrainGenerator.class, LittleMountainTerrainGenerator::new),
MOUNTAIN_RANGE(MountainRangeTerrainGenerator.class, MountainRangeTerrainGenerator::new),
ONE_ISLAND(OneIslandTerrainGenerator.class, OneIslandTerrainGenerator::new),
SMALL_ISLANDS(SmallIslandsTerrainGenerator.class, SmallIslandsTerrainGenerator::new),
VALLEY(ValleyTerrainGenerator.class, ValleyTerrainGenerator::new);

private final Class<? extends com.faforever.neroxis.generator.terrain.TerrainGenerator> generatorClass;
private final Supplier<com.faforever.neroxis.generator.terrain.TerrainGenerator> generatorSupplier;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.generator.texture.BrimstoneTextureGenerator;
import com.faforever.neroxis.generator.texture.DesertTextureGenerator;
import com.faforever.neroxis.generator.texture.EarlyAutumnTextureGenerator;
import com.faforever.neroxis.generator.texture.FrithenTextureGenerator;
import com.faforever.neroxis.generator.texture.MarsTextureGenerator;
import com.faforever.neroxis.generator.texture.MoonlightTextureGenerator;
import com.faforever.neroxis.generator.texture.PrayerTextureGenerator;
import com.faforever.neroxis.generator.texture.StonesTextureGenerator;
import com.faforever.neroxis.generator.texture.SunsetTextureGenerator;
import com.faforever.neroxis.generator.texture.SyrtisTextureGenerator;
import com.faforever.neroxis.generator.texture.WindingRiverTextureGenerator;
import com.faforever.neroxis.generator.texture.WonderTextureGenerator;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.function.Supplier;

@Getter
@AllArgsConstructor
public enum TextureStyle {
BRIMSTONE(BrimstoneTextureGenerator::new, "Brimstone"),
DESERT(DesertTextureGenerator::new, "Desert"),
EARLYAUTUMN(EarlyAutumnTextureGenerator::new, "EarlyAutumn"),
FRITHEN(FrithenTextureGenerator::new, "Frithen"),
MARS(MarsTextureGenerator::new, "Mars"),
MOONLIGHT(MoonlightTextureGenerator::new, "Moonlight"),
PRAYER(PrayerTextureGenerator::new, "Prayer"),
STONES(StonesTextureGenerator::new, "Stones"),
SUNSET(SunsetTextureGenerator::new, "Sunset"),
SYRTIS(SyrtisTextureGenerator::new, "Syrtis"),
WINDINGRIVER(WindingRiverTextureGenerator::new, "WindingRiver"),
WONDER(WonderTextureGenerator::new, "Wonder");

private final Supplier<com.faforever.neroxis.generator.texture.TextureGenerator> generatorSupplier;
private final String folderName;
}
Loading

0 comments on commit 9a301fa

Please sign in to comment.