feat: tweak tilemap params

Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
方而静 2025-08-02 00:31:49 +08:00
parent 06a60b1a19
commit ad68a23629
Signed by: szTom
GPG Key ID: 072D999D60C6473C
3 changed files with 40 additions and 35 deletions

View File

@ -15,11 +15,11 @@ struct GenerationConfig {
Seed seed; Seed seed;
// Noise parameters // Noise parameters
double temperature_scale = 0.005; // Scale for temperature noise double temperature_scale = 0.05; // Scale for temperature noise
int temperature_octaves = 3; // Number of octaves for temperature noise int temperature_octaves = 3; // Number of octaves for temperature noise
double temperature_persistence = 0.4; // Persistence for temperature noise double temperature_persistence = 0.4; // Persistence for temperature noise
double humidity_scale = 0.005; // Scale for humidity noise double humidity_scale = 0.05; // Scale for humidity noise
int humidity_octaves = 3; // Number of octaves for humidity noise int humidity_octaves = 3; // Number of octaves for humidity noise
double humidity_persistence = 0.4; // Persistence for humidity noise double humidity_persistence = 0.4; // Persistence for humidity noise
@ -35,8 +35,8 @@ private:
UniformPerlinNoise UniformPerlinNoise
base_noise_; // For base terrain generation (uniform distribution) base_noise_; // For base terrain generation (uniform distribution)
PerlinNoise temperature_noise_; // For temperature UniformPerlinNoise temperature_noise_; // For temperature
PerlinNoise humidity_noise_; // For humidity UniformPerlinNoise humidity_noise_; // For humidity
public: public:
/** /**

View File

@ -11,11 +11,10 @@ constexpr BiomeProperties biome_properties[] = {
// Snowy Peeks (Cold & Dry) // Snowy Peeks (Cold & Dry)
{ {
.name = "Snowy Peeks", .name = "Snowy Peeks",
.water_ratio = .05, .water_ratio = .05,
.ice_ratio = .15, .ice_ratio = .2,
.sand_ratio = .1, .sand_ratio = .05,
.land_ratio = .2, .land_ratio = .3,
}, },
// Snowy Plains (Cold & Moderate) // Snowy Plains (Cold & Moderate)
{ {
@ -28,42 +27,42 @@ constexpr BiomeProperties biome_properties[] = {
// Frozen Ocean (Cold & Wet) // Frozen Ocean (Cold & Wet)
{ {
.name = "Frozen Ocean", .name = "Frozen Ocean",
.water_ratio = .3, .water_ratio = .1,
.ice_ratio = .4, .ice_ratio = .7,
.sand_ratio = .25, .sand_ratio = .25,
.land_ratio = .05, .land_ratio = .05,
}, },
// Plains (Temperate & Dry) // Plains (Temperate & Dry)
{ {
.name = "Plains", .name = "Plains",
.water_ratio = .1, .water_ratio = .05,
.ice_ratio = .0, .ice_ratio = .0,
.sand_ratio = .05, .sand_ratio = .05,
.land_ratio = .65, .land_ratio = .7,
}, },
// Forest (Temperate & Moderate) // Forest (Temperate & Moderate)
{ {
.name = "Forest", .name = "Forest",
.water_ratio = .2, .water_ratio = .1,
.ice_ratio = .0, .ice_ratio = .0,
.sand_ratio = .1, .sand_ratio = .05,
.land_ratio = .5, .land_ratio = .75,
}, },
// Ocean (Temperate & Wet) // Ocean (Temperate & Wet)
{ {
.name = "Ocean", .name = "Ocean",
.water_ratio = .7, .water_ratio = .8,
.ice_ratio = .0, .ice_ratio = .0,
.sand_ratio = .2, .sand_ratio = .15,
.land_ratio = .1, .land_ratio = .05,
}, },
// Desert (Hot & Dry) // Desert (Hot & Dry)
{ {
.name = "Desert", .name = "Desert",
.water_ratio = .0, .water_ratio = .0,
.ice_ratio = .0, .ice_ratio = .0,
.sand_ratio = .75, .sand_ratio = .8,
.land_ratio = .05, .land_ratio = .0,
}, },
// Savanna (Hot & Moderate) // Savanna (Hot & Moderate)
{ {
@ -78,8 +77,8 @@ constexpr BiomeProperties biome_properties[] = {
.name = "Luke Ocean", .name = "Luke Ocean",
.water_ratio = .8, .water_ratio = .8,
.ice_ratio = .0, .ice_ratio = .0,
.sand_ratio = .2, .sand_ratio = .05,
.land_ratio = .0, .land_ratio = .15,
}, },
}; };
@ -92,8 +91,8 @@ BiomeType determine_biome(double temperature, double humidity) {
temperature = std::clamp(temperature, 0.0, 1.0); temperature = std::clamp(temperature, 0.0, 1.0);
humidity = std::clamp(humidity, 0.0, 1.0); humidity = std::clamp(humidity, 0.0, 1.0);
const double threshold1 = 0.4; const double threshold1 = 0.33;
const double threshold2 = 0.6; const double threshold2 = 0.67;
BiomeTemperature temp_category; BiomeTemperature temp_category;
if (temperature < threshold1) { if (temperature < threshold1) {

View File

@ -11,15 +11,23 @@ TerrainGenerator::TerrainGenerator(const GenerationConfig &config)
Xoroshiro128PP rng{config.seed}; Xoroshiro128PP rng{config.seed};
base_noise_ = UniformPerlinNoise(rng); base_noise_ = UniformPerlinNoise(rng);
rng = rng.jump_96(); rng = rng.jump_96();
temperature_noise_ = PerlinNoise(rng); temperature_noise_ = UniformPerlinNoise(rng);
rng = rng.jump_96(); rng = rng.jump_96();
humidity_noise_ = PerlinNoise(rng); humidity_noise_ = UniformPerlinNoise(rng);
// Calibrate the uniform base noise with the same parameters that will be
// used for generation
base_noise_.calibrate( base_noise_.calibrate(
config.base_scale, config.base_octaves, config.base_persistence config.base_scale, config.base_octaves, config.base_persistence
); );
temperature_noise_.calibrate(
config.temperature_scale, config.temperature_octaves,
config.temperature_persistence
);
humidity_noise_.calibrate(
config.humidity_scale, config.humidity_octaves,
config.humidity_persistence
);
} }
void TerrainGenerator::generate_map(TileMap &tilemap) { void TerrainGenerator::generate_map(TileMap &tilemap) {
@ -126,16 +134,14 @@ std::pair<double, double> TerrainGenerator::get_climate(
double global_x, double global_y double global_x, double global_y
) const { ) const {
// Generate temperature noise (0-1 range) // Generate temperature noise (0-1 range)
double temperature = temperature_noise_.octave_noise( double temperature = temperature_noise_.uniform_noise(
global_x * config_.temperature_scale, global_x * config_.temperature_scale,
global_y * config_.temperature_scale, config_.temperature_octaves, global_y * config_.temperature_scale
config_.temperature_persistence
); );
// Generate humidity noise (0-1 range) // Generate humidity noise (0-1 range)
double humidity = humidity_noise_.octave_noise( double humidity = humidity_noise_.uniform_noise(
global_x * config_.humidity_scale, global_y * config_.humidity_scale, global_x * config_.humidity_scale, global_y * config_.humidity_scale
config_.humidity_octaves, config_.humidity_persistence
); );
return {temperature, humidity}; return {temperature, humidity};