Adds basic camp generation and placement

Adds basic camp generation and placement logic to the map generation process.

It attempts to place the camp in a valid location, avoiding paths and water bodies. It also sets the player's spawn point to the center of the generated camp, including some basic camp props like a tent, campfire, and bed.

Additionally, vegetation spawning is now dependent on the `should_spawn_*` methods of the `CellDataResource`, allowing more control over what spawns where.
This commit is contained in:
Dan Baker 2025-06-29 14:05:48 +01:00
parent 3959333534
commit a1efaf6294
8 changed files with 402 additions and 125 deletions

View file

@ -5,13 +5,134 @@ extends Resource
@export var x: int = 0
@export var z: int = 0
@export var vegetation_density: float = 0.5
@export var ground_compaction: float = 0.0
@export var water: float = 0
@export var moisture_level: float = 0.6
# Core cell type properties - these will trigger automatic updates
@export var camp: bool = false: set = set_camp
@export var path: bool = false: set = set_trail
@export var water: bool = false: set = set_water
# Dependent properties that get automatically managed
@export var vegetation_density: float = 0.5: set = set_vegetation_density
@export var ground_compaction: float = 0.0: set = set_ground_compaction
@export var moisture_level: float = 0.6
@export var trees: Array = []
# Internal flag to prevent infinite recursion during initialization
var _initializing: bool = false
func _init():
_initializing = true
# Set default values
vegetation_density = 0.5
ground_compaction = 0.0
camp = false
path = false
water = false
_initializing = false
func set_camp(value: bool):
camp = value
if not _initializing:
_update_dependent_properties()
## Using a different name due to Resource using the function set_path in Godot
func set_trail(value: bool):
path = value
if not _initializing:
_update_dependent_properties()
func set_water(value: bool):
water = value
if not _initializing:
_update_dependent_properties()
func set_vegetation_density(value: float):
# Only allow manual setting if not a special cell type
if _initializing or not (camp or path or water):
vegetation_density = value
else:
vegetation_density = 0.0
func set_ground_compaction(value: float):
# Camp always has maximum compaction, others can be set manually
if camp:
ground_compaction = 1.0
elif not _initializing:
ground_compaction = value
func _update_dependent_properties():
# Update vegetation density - always 0 for camp, path, or water
if camp or path or water:
vegetation_density = 0.0
# Update ground compaction - camp always has maximum compaction
if camp:
ground_compaction = 1.0
# Utility function to set cell type and ensure only one is active
func set_cell_type(cell_type: String):
_initializing = true
# Clear all cell types first
camp = false
path = false
water = false
# Set the specified type
match cell_type.to_lower():
"camp":
camp = true
"path":
path = true
"water":
water = true
"terrain", "normal", "":
pass # Leave all false for normal terrain
_:
push_warning("Unknown cell type: " + cell_type)
_initializing = false
_update_dependent_properties()
# Utility function to get the primary cell type
func get_cell_type() -> String:
if camp:
return "camp"
elif path:
return "path"
elif water:
return "water"
else:
return "terrain"
# Check if this is a special cell type (not normal terrain)
func is_special_cell() -> bool:
return camp or path or water
func add_trees(tree: TreeDataResource, qty: int) -> void:
for i in qty:
trees.append(tree)
for i in qty:
trees.append(tree)
# Override vegetation density and ground compaction for special cases
func force_set_vegetation_density(value: float):
# Allows bypassing the automatic management if absolutely needed
vegetation_density = value
func force_set_ground_compaction(value: float):
# Allows bypassing the automatic management if absolutely needed
ground_compaction = value
func should_spawn_trees() -> bool:
# Only spawn trees if this is not a special cell type
return not (camp or path or water) and vegetation_density > 0.0
func should_spawn_grass() -> bool:
# Grass can spawn in any terrain cell, but not in special cells
return not (camp or path or water) and vegetation_density > 0.0
func should_spawn_bushes() -> bool:
# Bushes can spawn in any terrain cell, but not in special cells
return not (camp or path or water) and vegetation_density > 0.1
func should_spawn_flowers() -> bool:
# Flowers can spawn in any terrain cell, but not in special cells
return not (camp or path or water) and vegetation_density > 0.1