Tweaked terrain values for bigger biomes and more tile variation

Still need to figure out how to get more dead bushes tho.....
This commit is contained in:
Chris Bell 2025-03-02 13:52:01 -06:00
parent bd2130dfa0
commit 2d79747a82
3 changed files with 14 additions and 92 deletions

BIN
game/game

Binary file not shown.

View File

@ -79,7 +79,7 @@ handle_player_input :: proc(p:^Player, w:^World) {
// Movement
dt := rl.GetFrameTime()
move_delay : f32 = 0.2
move_delay : f32 = 0.0
if p.move_timer > 0 {
p.move_timer -= dt
}
@ -208,23 +208,9 @@ draw_player :: proc(player:^Player) {
will_collide :: proc(direction:InteractDirection, p:^Player, w:^World) -> bool {
tile, pos := get_tile_in_direction(direction, p, w)
if tile.type == .SOLID { return true }
// if tile.type == .SOLID { return true }
return false
}
// will_collide :: proc(w:^World, pos:rl.Vector2) -> bool {
// world_grid_pos := vec2_to_vec2i(pos)
// chunk_pos := world_pos_to_chunk_pos(pos)
// local_pos := get_local_chunk_pos(world_grid_pos)
// chunk := get_chunk(w, chunk_pos)
// tile := get_chunk_tile(chunk, local_pos)
// #partial switch tile.type {
// case .SOLID:
// return true
// }
// return false
// }

View File

@ -65,69 +65,11 @@ get_biome_from_id :: proc(id:u32) -> Biome {
return biome_list[id]
}
// // Improved biome selection with multiple noise layers and better scaling
// get_biome_type :: proc(world_pos: Vec2i, seed: i64) -> Biome {
// // Use multiple noise scales for different features
// continent_scale := 0.001 // Very large scale features (continents)
// region_scale := 0.005 // Medium scale features (regions)
// local_scale := 0.02 // Local variations
//
// // Use different seed offsets for each noise layer
// continent_seed := seed
// region_seed := seed + 10000
// moisture_seed := seed + 20000
// temperature_seed := seed + 30000
//
// // Generate base continent shapes
// continent := noise.noise_2d(continent_seed, {f64(world_pos.x) * continent_scale, f64(world_pos.y) * continent_scale})
// // Amplify to get more defined continents
// continent = math.pow(continent * 0.5 + 0.5, 1.5) * 2.0 - 1.0
//
// // Generate regional variations
// region := noise.noise_2d(region_seed, {f64(world_pos.x) * region_scale, f64(world_pos.y) * region_scale})
//
// // Generate moisture and temperature maps for biome determination
// moisture := noise.noise_2d(moisture_seed, {f64(world_pos.x) * region_scale, f64(world_pos.y) * region_scale})
// temperature := noise.noise_2d(temperature_seed, {f64(world_pos.x) * region_scale, f64(world_pos.y) * region_scale})
//
// // Local variations (small details)
// local_var := noise.noise_2d(seed, {f64(world_pos.x) * local_scale, f64(world_pos.y) * local_scale}) * 0.1
//
// // Combine all factors with proper weighting
// elevation := continent * 0.7 + region * 0.3 + local_var
//
// // Use temperature and moisture to determine biome type instead of just elevation
// // This creates more natural and varied biome transitions
//
// // Convert noise values to 0-1 range for easier thresholding
// normalized_elevation := elevation * 0.5 + 0.5
// normalized_moisture := moisture * 0.5 + 0.5
// normalized_temperature := temperature * 0.5 + 0.5
//
// // Lakes appear in low elevation areas
// if normalized_elevation < 0.3 {
// return lake_biome
// }
//
// // Deserts appear in hot, dry areas
// if normalized_temperature > 0.6 && normalized_moisture < 0.3 {
// return desert_biome
// }
//
// // Forests need moderate to high moisture
// if normalized_moisture > 0.5 {
// return forest_biome
// }
//
// // Default to grasslands
// return grasslands_biome
// }
get_biome_type :: proc(world_pos: Vec2i, seed: i64) -> Biome {
// Use multiple noise scales for different features
continent_scale := 0.001 // Very large scale features (continents)
region_scale := 0.005 // Medium scale features (regions)
local_scale := 0.02 // Local variations
continent_scale := 0.0008 // Very large scale features (continents)
region_scale := 0.007 // Medium scale features (regions)
local_scale := 0.025 // Local variations
// Use different seed offsets for each noise layer
continent_seed := seed
@ -166,18 +108,12 @@ get_biome_type :: proc(world_pos: Vec2i, seed: i64) -> Biome {
return lake_biome
}
if normalized_temperature > 0.6 && normalized_moisture < 0.3 {
if normalized_temperature > 0.7 && normalized_moisture < 0.2 {
return desert_biome
}
// You could also try this alternative approach that uses temperature-moisture balance:
// desert_score := normalized_temperature - normalized_moisture
// if desert_score > 0.3 {
// return desert_biome
// }
// Forests need moderate to high moisture
if normalized_moisture > 0.5 {
if normalized_moisture > 0.55 {
return forest_biome
}
@ -234,9 +170,9 @@ generate_tile :: proc(pos: Vec2i, seed: i64, biome: Biome) -> Tile {
hash_value := hash_noise(pos.x, pos.y, seed)
// Use multiple noise scales for natural-looking features
large_scale := 0.02
medium_scale := 0.05
small_scale := 0.15
large_scale := 0.025
medium_scale := 0.07
small_scale := 0.20
large_noise := noise.noise_2d(seed, {f64(pos.x) * large_scale, f64(pos.y) * large_scale})
medium_noise := noise.noise_2d(seed + 5000, {f64(pos.x) * medium_scale, f64(pos.y) * medium_scale})
@ -248,15 +184,15 @@ generate_tile :: proc(pos: Vec2i, seed: i64, biome: Biome) -> Tile {
// Different biomes use the noise differently
switch biome.type {
case .GRASSLAND:
if combined_noise > 0.7 {
if combined_noise > 0.8 {
return tree_tile
} else if combined_noise > 0.5 {
} else if combined_noise > 0.2 {
return grass_tile
} else {
return nothing_tile
}
case .FOREST:
if combined_noise > 0.8 {
if combined_noise > 0.75 {
return double_tree_tile
} else if combined_noise > 0.4 {
return tree_tile
@ -269,7 +205,7 @@ generate_tile :: proc(pos: Vec2i, seed: i64, biome: Biome) -> Tile {
cactus_noise := medium_noise * 0.5 + 0.5 // Normalize to 0-1
if cactus_noise > 0.7 && hash_value > 0.6 {
if cactus_noise > 0.8 && hash_value > 0.65 {
return cactus_tile
} else if combined_noise > 0.85 {
return dead_bush_tile