Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.faforever.neroxis.generator;

public record FractalFlattenParams(
float minHeight,
float maxHeight,
float destinationMinHeight,
float destinationMaxHeight,
float slope,
int blurAmount,
boolean hasRamps,
boolean spawnable,
float spawnMaskDeflate
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.faforever.neroxis.generator;

import java.util.List;

public record FractalParams(
float waterHeight,
boolean useRandomWaterMask,
int noiseMapBlurAmount,
float noiseOctaveMultiplier,
float noiseExpMultiplier,
int teamSeparation,
List<FractalFlattenParams> fractalFlattenParams
) {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import com.faforever.neroxis.generator.style.BigIslandsStyleGenerator;
import com.faforever.neroxis.generator.style.CenterLakeStyleGenerator;
import com.faforever.neroxis.generator.style.DropPlateauStyleGenerator;
import com.faforever.neroxis.generator.style.FloodedMultiLevelStyleGenerator;
import com.faforever.neroxis.generator.style.FloodedStyleGenerator;
import com.faforever.neroxis.generator.style.FractalNoiseStyleGenerator;
import com.faforever.neroxis.generator.style.FractalLandStyleGenerator;
import com.faforever.neroxis.generator.style.FractalNavyStyleGenerator;
import com.faforever.neroxis.generator.style.FractalPlateauStyleGenerator;
import com.faforever.neroxis.generator.style.FractalUpsideDownStyleGenerator;
import com.faforever.neroxis.generator.style.HighReclaimStyleGenerator;
import com.faforever.neroxis.generator.style.LandBridgeStyleGenerator;
import com.faforever.neroxis.generator.style.LittleMountainStyleGenerator;
Expand All @@ -27,24 +29,26 @@
@Getter
@AllArgsConstructor
public enum MapStyle {
BASIC(BasicStyleGenerator::new, 1),
BASIC(BasicStyleGenerator::new, 2f),
Copy link
Contributor Author

@clivepaterson clivepaterson Nov 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I feel this needs a bit of a re-balance.
I'm not sure what that balance should be...

But I guess this is what I think.

I felt the BasicStyleGenerator should be bumped to 2... This is arguably the best generator for ladder, in my opinion..
And bump the FLOODED one... It seems good to me, it's better than the fractal navy...

And I put the frcatal one's as 0.25 for ladder..
Maybe the FRACTAL_NAVY should be 0.1 for ladder? it's not super consist...
But it does make some good navy maps (some great navy maps maybe), but some maybe fringe.
(I guess every terrain generator can have some funky seeds)

BIG_ISLANDS(BigIslandsStyleGenerator::new, 1),
CENTER_LAKE(CenterLakeStyleGenerator::new, 1),
DROP_PLATEAU(DropPlateauStyleGenerator::new, .5f),
FLOODED(FloodedStyleGenerator::new, .01f),
FLOODED(FloodedStyleGenerator::new, 0.5f),
HIGH_RECLAIM(HighReclaimStyleGenerator::new, .25f),
LAND_BRIDGE(LandBridgeStyleGenerator::new, 2),
LITTLE_MOUNTAIN(LittleMountainStyleGenerator::new, 1),
LOW_MEX(LowMexStyleGenerator::new, .5f),
MOUNTAIN_RANGE(MountainRangeStyleGenerator::new, 1),
MULTILEVEL(MultiLevelStyleGenerator::new, 1f),
FLOODED_MULTILEVEL(FloodedMultiLevelStyleGenerator::new, 0.75f),
ONE_ISLAND(OneIslandStyleGenerator::new, 1),
SMALL_ISLANDS(SmallIslandsStyleGenerator::new, 1),
VALLEY(ValleyStyleGenerator::new, 1),
RIVERS(RiversStyleGenerator::new, 0.25f),
RIVERS_AND_OCEANS(RiversAndOceansStyleGenerator::new, 0.75f),
FRACTAL(FractalNoiseStyleGenerator::new, 1f);
FRACTAL_LAND(FractalLandStyleGenerator::new, 0.25f),
FRACTAL_PLATEAU(FractalPlateauStyleGenerator::new, 0.25f),
FRACTAL_NAVY(FractalNavyStyleGenerator::new, 0.25f),
FRACTAL_UPSIDE_DOWN(FractalUpsideDownStyleGenerator::new, 0.25f);

private final Supplier<StyleGenerator> generatorSupplier;
private final float weight;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.faforever.neroxis.generator;

import com.faforever.neroxis.generator.resource.BasicResourceGenerator;
import com.faforever.neroxis.generator.resource.HighMexLandLowMexWaterResourceGenerator;
import com.faforever.neroxis.generator.resource.LowMexResourceGenerator;
import com.faforever.neroxis.generator.resource.WaterMexResourceGenerator;
import lombok.AllArgsConstructor;
Expand All @@ -13,7 +14,8 @@
public enum ResourceStyle {
BASIC(BasicResourceGenerator::new),
LOW_MEX(LowMexResourceGenerator::new),
WATER_MEX(WaterMexResourceGenerator::new);
WATER_MEX(WaterMexResourceGenerator::new),
HI_MEX_LAND_LOW_MEX_WATER(HighMexLandLowMexWaterResourceGenerator::new);

private final Supplier<com.faforever.neroxis.generator.resource.ResourceGenerator> generatorSupplier;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import com.faforever.neroxis.generator.terrain.CenterLakeTerrainGenerator;
import com.faforever.neroxis.generator.terrain.DropPlateauLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.DropPlateauTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FloodedMultiLevelLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FloodedTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalNoiseLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalLandLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalNavyLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalPlateauLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalUpsideDownLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.LandBridgeTerrainGenerator;
import com.faforever.neroxis.generator.terrain.LittleMountainLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.LittleMountainTerrainGenerator;
Expand Down Expand Up @@ -44,14 +46,16 @@ public enum TerrainStyle {
MOUNTAIN_RANGE(MountainRangeTerrainGenerator::new),
MOUNTAIN_RANGE_LAST(MountainRangeLastTerrainGenerator::new),
MULTILEVEL_LAST(MultiLevelLastTerrainGenerator::new),
FLOODED_MULTILEVEL_LAST(FloodedMultiLevelLastTerrainGenerator::new),
ONE_ISLAND(OneIslandTerrainGenerator::new),
SMALL_ISLANDS(SmallIslandsTerrainGenerator::new),
VALLEY(ValleyTerrainGenerator::new),
VALLEY_LAST(ValleyLastTerrainGenerator::new),
RIVERS(RiversTerrainGenerator::new),
RIVERS_AND_OCEANS(RiversAndOceansTerrainGenerator::new),
FRACTAL_LAST(FractalNoiseLastTerrainGenerator::new);
FRACTAL_LAND(FractalLandLastTerrainGenerator::new),
FRACTAL_PLATEAU(FractalPlateauLastTerrainGenerator::new),
FRACTAL_NAVY(FractalNavyLastTerrainGenerator::new),
FRACTAL_UPSIDE_DOWN(FractalUpsideDownLastTerrainGenerator::new);

private final Supplier<com.faforever.neroxis.generator.terrain.TerrainGenerator> generatorSupplier;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
import com.faforever.neroxis.map.SCMap;
import com.faforever.neroxis.map.SymmetrySettings;
import com.faforever.neroxis.mask.FloatMask;
import com.faforever.neroxis.util.DebugUtil;
import com.faforever.neroxis.util.Pipeline;

public class RiversAndOceansMexResourceGenerator extends BasicResourceGenerator {
public class HighMexLandLowMexWaterResourceGenerator extends BasicResourceGenerator {

private FloatMask waterResourceLimitNoiseMask;

Expand All @@ -16,6 +17,29 @@ public void initialize(SCMap map, long seed, GeneratorParameters generatorParame
super.initialize(map, seed, generatorParameters, symmetrySettings, terrainGenerator, pipeline);

waterResourceLimitNoiseMask = new FloatMask(1, random.nextLong(), symmetrySettings, "waterResourceLimitNoiseMask", pipeline);
resourceDensity = random.nextFloat(1.5f, 2.0f);
}

@Override
public void placeResources() {
DebugUtil.timedRun("com.faforever.neroxis.map.generator", "generateResources", () -> {
mexPlacer.placeMexes(getMexCount(), resourceMask.getFinalMask(), waterResourceMask.getFinalMask(), 16, 16, 12);
hydroPlacer.placeHydros(generatorParameters.spawnCount(), resourceMask.getFinalMask().deflate(8));
});
}

@Override
protected int getMexCount() {
int mapSize = generatorParameters.mapSize();
int spawnCount = generatorParameters.spawnCount();

// Add about 24 mexes per 256 chunk of the map multiplied by resource density
int mexCount = StrictMath.round( (mapSize / 256f) * 24f * resourceDensity);

// Add an additional 4 mexes per player
mexCount += spawnCount * 4;

return mexCount;
}

@Override
Expand All @@ -26,7 +50,7 @@ public void setupPipeline() {
resourceMask.init(passableLand);
resourceMask.add(passableWater
.copy()
.subtract(waterResourceLimitNoiseMask.copyAsBooleanMask(0.01f)));
.subtract(waterResourceLimitNoiseMask.copyAsBooleanMask(0.1f)));
resourceMask.subtract(unbuildable.copy().inflate(2));

waterResourceMask.setSize(resourceMask.getSize());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@
import com.faforever.neroxis.generator.prop.PropGenerator;
import com.faforever.neroxis.generator.prop.RockFieldPropGenerator;
import com.faforever.neroxis.generator.prop.SmallBattlePropGenerator;
import com.faforever.neroxis.generator.terrain.FractalNoiseLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalLandLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.TerrainGenerator;

public class FractalNoiseStyleGenerator extends StyleGenerator {
public class FractalLandStyleGenerator extends StyleGenerator {
@Override
protected WeightedOptionsWithFallback<TerrainGenerator> getTerrainGeneratorOptions() {
return WeightedOptionsWithFallback.of(new FractalNoiseLastTerrainGenerator());
return WeightedOptionsWithFallback.of(new FractalLandLastTerrainGenerator());
}

@Override
protected WeightedOptionsWithFallback<PropGenerator> getPropGeneratorOptions() {
return WeightedOptionsWithFallback.of(new BasicPropGenerator(),
new WeightedOption<>(new BasicPropGenerator(), 1f),
new WeightedOption<>(new BoulderFieldPropGenerator(), .1f),
new WeightedOption<>(new BoulderFieldPropGenerator(), .5f),
new WeightedOption<>(new EnemyCivPropGenerator(), .5f),
new WeightedOption<>(new HighReclaimPropGenerator(), .25f),
new WeightedOption<>(new LargeBattlePropGenerator(), .5f),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.faforever.neroxis.generator.style;

import com.faforever.neroxis.generator.WeightedOption;
import com.faforever.neroxis.generator.WeightedOptionsWithFallback;
import com.faforever.neroxis.generator.prop.BasicPropGenerator;
import com.faforever.neroxis.generator.prop.BoulderFieldPropGenerator;
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.PropGenerator;
import com.faforever.neroxis.generator.prop.RockFieldPropGenerator;
import com.faforever.neroxis.generator.prop.SmallBattlePropGenerator;
import com.faforever.neroxis.generator.resource.ResourceGenerator;
import com.faforever.neroxis.generator.resource.HighMexLandLowMexWaterResourceGenerator;
import com.faforever.neroxis.generator.terrain.FractalNavyLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.TerrainGenerator;

public class FractalNavyStyleGenerator extends StyleGenerator {
@Override
protected WeightedOptionsWithFallback<ResourceGenerator> getResourceGeneratorOptions() {
return WeightedOptionsWithFallback.of(new HighMexLandLowMexWaterResourceGenerator());
}

@Override
protected WeightedOptionsWithFallback<TerrainGenerator> getTerrainGeneratorOptions() {
return WeightedOptionsWithFallback.of(new FractalNavyLastTerrainGenerator());
}

@Override
protected WeightedOptionsWithFallback<PropGenerator> getPropGeneratorOptions() {
return WeightedOptionsWithFallback.of(new BasicPropGenerator(),
new WeightedOption<>(new BasicPropGenerator(), 1f),
new WeightedOption<>(new NavyWrecksPropGenerator(), 3f),
new WeightedOption<>(new BoulderFieldPropGenerator(), 2f),
new WeightedOption<>(new HighReclaimPropGenerator(), 1f),
new WeightedOption<>(new LargeBattlePropGenerator(), .5f),
new WeightedOption<>(new RockFieldPropGenerator(), 0.5f),
new WeightedOption<>(new SmallBattlePropGenerator(), 0.5f));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.faforever.neroxis.generator.style;

import com.faforever.neroxis.generator.WeightedOption;
import com.faforever.neroxis.generator.WeightedOptionsWithFallback;
import com.faforever.neroxis.generator.prop.BasicPropGenerator;
import com.faforever.neroxis.generator.prop.BoulderFieldPropGenerator;
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.NeutralCivPropGenerator;
import com.faforever.neroxis.generator.prop.PropGenerator;
import com.faforever.neroxis.generator.prop.RockFieldPropGenerator;
import com.faforever.neroxis.generator.prop.SmallBattlePropGenerator;
import com.faforever.neroxis.generator.terrain.FractalPlateauLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.TerrainGenerator;

public class FractalPlateauStyleGenerator extends StyleGenerator {
@Override
protected WeightedOptionsWithFallback<TerrainGenerator> getTerrainGeneratorOptions() {
return WeightedOptionsWithFallback.of(new FractalPlateauLastTerrainGenerator());
}

@Override
protected WeightedOptionsWithFallback<PropGenerator> getPropGeneratorOptions() {
return WeightedOptionsWithFallback.of(new BasicPropGenerator(),
new WeightedOption<>(new BasicPropGenerator(), 1f),
Comment on lines +25 to +26
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

BasicPropGenerator appears twice.

BasicPropGenerator is instantiated both as the fallback (Line 25) and as a weighted option with weight 1f (Line 26). This duplication is likely unintentional. Please clarify whether the fallback should be a different generator or if the weighted option on Line 26 should be removed.

🤖 Prompt for AI Agents
In
generator/src/main/java/com/faforever/neroxis/generator/style/FractalPlateauStyleGenerator.java
around lines 25-26, BasicPropGenerator is duplicated as both the fallback and as
a weighted option; either remove the redundant WeightedOption<>(new
BasicPropGenerator(), 1f) or replace the fallback BasicPropGenerator() with the
correct intended fallback generator. Update the code so only one instance of
BasicPropGenerator remains (either as the fallback or as a weighted option),
adjust the constructor call accordingly, and update imports and any tests/usages
if you changed the fallback type.

new WeightedOption<>(new BoulderFieldPropGenerator(), .5f),
new WeightedOption<>(new EnemyCivPropGenerator(), .5f),
new WeightedOption<>(new HighReclaimPropGenerator(), .5f),
new WeightedOption<>(new LargeBattlePropGenerator(), .5f),
new WeightedOption<>(new NeutralCivPropGenerator(), 1f),
new WeightedOption<>(new RockFieldPropGenerator(), 1f),
new WeightedOption<>(new SmallBattlePropGenerator(), 1f));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,28 @@
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.PropGenerator;
import com.faforever.neroxis.generator.prop.RockFieldPropGenerator;
import com.faforever.neroxis.generator.prop.SmallBattlePropGenerator;
import com.faforever.neroxis.generator.resource.ResourceGenerator;
import com.faforever.neroxis.generator.resource.RiversAndOceansMexResourceGenerator;
import com.faforever.neroxis.generator.terrain.FloodedMultiLevelLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.FractalUpsideDownLastTerrainGenerator;
import com.faforever.neroxis.generator.terrain.TerrainGenerator;

public class FloodedMultiLevelStyleGenerator extends StyleGenerator {
public class FractalUpsideDownStyleGenerator extends StyleGenerator {
@Override
protected WeightedOptionsWithFallback<TerrainGenerator> getTerrainGeneratorOptions() {
return WeightedOptionsWithFallback.of(new FloodedMultiLevelLastTerrainGenerator());
}

@Override
protected WeightedOptionsWithFallback<ResourceGenerator> getResourceGeneratorOptions() {
return WeightedOptionsWithFallback.of(new RiversAndOceansMexResourceGenerator());
return WeightedOptionsWithFallback.of(new FractalUpsideDownLastTerrainGenerator());
}

@Override
protected WeightedOptionsWithFallback<PropGenerator> getPropGeneratorOptions() {
return WeightedOptionsWithFallback.of(new BasicPropGenerator(),
new WeightedOption<>(new BasicPropGenerator(), 1f),
new WeightedOption<>(new BoulderFieldPropGenerator(), .1f),
new WeightedOption<>(new BoulderFieldPropGenerator(), .5f),
new WeightedOption<>(new EnemyCivPropGenerator(), .5f),
new WeightedOption<>(new HighReclaimPropGenerator(), .25f),
new WeightedOption<>(new LargeBattlePropGenerator(), .5f),
new WeightedOption<>(new NavyWrecksPropGenerator(), 4f),
new WeightedOption<>(new NeutralCivPropGenerator(), 1f),
new WeightedOption<>(new RockFieldPropGenerator(), 1f),
new WeightedOption<>(new SmallBattlePropGenerator(), 1f));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
import com.faforever.neroxis.generator.prop.RockFieldPropGenerator;
import com.faforever.neroxis.generator.prop.SmallBattlePropGenerator;
import com.faforever.neroxis.generator.resource.ResourceGenerator;
import com.faforever.neroxis.generator.resource.RiversAndOceansMexResourceGenerator;
import com.faforever.neroxis.generator.resource.HighMexLandLowMexWaterResourceGenerator;
import com.faforever.neroxis.generator.terrain.RiversAndOceansTerrainGenerator;
import com.faforever.neroxis.generator.terrain.TerrainGenerator;

public class RiversAndOceansStyleGenerator extends StyleGenerator {

@Override
protected WeightedOptionsWithFallback<ResourceGenerator> getResourceGeneratorOptions() {
return WeightedOptionsWithFallback.of(new RiversAndOceansMexResourceGenerator());
return WeightedOptionsWithFallback.of(new HighMexLandLowMexWaterResourceGenerator());
}

@Override
Expand Down
Loading