47 lines
1.7 KiB
GDScript
47 lines
1.7 KiB
GDScript
class_name BiomeDataClass
|
|
extends Node
|
|
|
|
var tree_collection = preload("res://Entities/Tree/Resources/TreeData.tres") as TreeDataCollection
|
|
|
|
# Calculate spawn probability for each tree type
|
|
func calculate_tree_probabilities(x: int, z: int) -> Dictionary:
|
|
if Global.biome_data == null:
|
|
Log.pr("Biome data not initialized. Call generate_environment_maps first.")
|
|
return {}
|
|
|
|
if x > Global.map_data.size() and x <= 0:
|
|
if z > Global.map_data[x].size() and z <= 0:
|
|
Log.pr("Coordinates out of bounds: (%d, %d)" % [x, z])
|
|
return {}
|
|
|
|
var moisture = Global.biome_data.moisture.get_pixel(x, z).r
|
|
var temperature = Global.biome_data.temperature.get_pixel(x, z).r
|
|
var elevation = Global.biome_data.elevation.get_pixel(x, z).r
|
|
|
|
var probabilities = {}
|
|
|
|
for tree in tree_collection.trees:
|
|
# Calculate suitability for each environmental factor
|
|
var moisture_suit = calculate_suitability(moisture, tree.moisture_range[0], tree.moisture_range[1])
|
|
var temp_suit = calculate_suitability(temperature, tree.temperature_range[0], tree.temperature_range[1])
|
|
var elev_suit = calculate_suitability(elevation, tree.elevation_range[0], tree.elevation_range[1])
|
|
|
|
# Combined probability
|
|
probabilities[tree.tree_name] = {}
|
|
probabilities[tree.tree_name]['chance'] = moisture_suit * temp_suit * elev_suit
|
|
probabilities[tree.tree_name]['resource'] = tree
|
|
|
|
return probabilities
|
|
|
|
func calculate_suitability(value: float, min_pref: float, max_pref: float) -> float:
|
|
if value >= min_pref and value <= max_pref:
|
|
return 1.0
|
|
else:
|
|
var distance_outside = 0.0
|
|
if value < min_pref:
|
|
distance_outside = min_pref - value
|
|
else:
|
|
distance_outside = value - max_pref
|
|
|
|
# Exponential decay - drops very quickly
|
|
return max(0.01, exp(-distance_outside * 10.0))
|