fix terrain collision and water recovery

This commit is contained in:
Alexander Sellite 2026-08-25 00:12:01 -04:00
parent da7f072365
commit 1ab2a291d2
13 changed files with 110 additions and 11 deletions

View file

@ -156,6 +156,7 @@ func _validate_portable_water_body() -> void:
PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN,
)
water_body.set("recovery_entry_depth_threshold", 0.1)
water_body.set("recovery_entry_confirmation_seconds", 0.2)
water_body.set("fish_pool", PondPool)
root.add_child(water_body)
await process_frame
@ -183,6 +184,34 @@ func _validate_portable_water_body() -> void:
== PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN
)
assert(is_equal_approx(recovery_region.entry_depth_threshold, 0.1))
assert(is_equal_approx(recovery_region.entry_confirmation_seconds, 0.2))
var recovery_player := PlayerScene.instantiate() as Player
assert(recovery_player != null)
root.add_child(recovery_player)
recovery_player.set_process(false)
recovery_player.set_physics_process(false)
var recovery_requests: Array[float] = []
recovery_region.recovery_requested.connect(
func(_player: Player, requested_surface_height: float) -> void:
recovery_requests.append(requested_surface_height)
)
recovery_region.call("_on_body_entered", recovery_player)
recovery_player.global_position.y = 6.8
recovery_region.call("_physics_process", 0.1)
assert(recovery_requests.is_empty())
# Breaking the submersion resets confirmation rather than carrying a stale
# partial fall into a later jump.
recovery_player.global_position.y = 7.0
recovery_region.call("_physics_process", 0.1)
recovery_player.global_position.y = 6.8
recovery_region.call("_physics_process", 0.11)
assert(recovery_requests.is_empty())
recovery_region.call("_physics_process", 0.1)
assert(recovery_requests == [7.0])
recovery_region.call("_on_body_exited", recovery_player)
recovery_player.queue_free()
await process_frame
water_body.queue_free()
await process_frame

View file

@ -490,6 +490,10 @@ func _validate_generated_region(
== PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN
)
assert(is_equal_approx(fresh_recovery.entry_depth_threshold, 0.1))
assert(is_equal_approx(
fresh_recovery.entry_confirmation_seconds,
0.2,
))
var coordinate_tokens := child.name.trim_prefix("FreshWater_").split("_")
assert(coordinate_tokens.size() == 2)
var coordinate := Vector2i(
@ -1043,6 +1047,25 @@ func _validate_prop_catalog(region: GeneratedWorldRegion) -> void:
assert(palm.maximum_cluster_radius > palm.minimum_cluster_radius)
assert(palm.prefer_ocean_facing)
assert(not palm.local_overhang_direction.is_zero_approx())
var aligned_tree_collisions: Dictionary[StringName, Vector2] = {
&"prop_tree_1": Vector2(0.08, 0.01),
&"prop_tree_2": Vector2(0.1, 0.075),
&"prop_tree_3": Vector2(-0.1, 0.18),
&"prop_tree_large": Vector2(0.084, 0.504),
&"prop_pine": Vector2(-0.044, 0.083),
&"prop_pine_large": Vector2(-0.04, 0.075),
&"prop_palm": Vector2(0.15, -0.1),
}
for tree_id: StringName in aligned_tree_collisions:
var aligned_tree := catalog.definition_for_id(tree_id)
assert(aligned_tree != null and aligned_tree.has_cylinder_collision())
var collision_center := Vector2(
aligned_tree.collision_offset.x,
aligned_tree.collision_offset.z,
)
assert(collision_center.is_equal_approx(
aligned_tree_collisions[tree_id]
))
var forest := region.get_biome_catalog().definition_for_id(&"biome_forest")
var forest_rule := forest.prop_rule_for_group(&"grass_tree")
var large_tree := catalog.definition_for_id(&"prop_tree_large")
@ -1139,6 +1162,20 @@ func _validate_decoration_transform(
or collision.shape is BoxShape3D
)
assert(collision.global_basis.get_scale().is_equal_approx(Vector3.ONE))
if collision.shape is CylinderShape3D:
var cylinder := collision.shape as CylinderShape3D
assert(is_equal_approx(
cylinder.radius,
definition.collision_radius * visual_scale,
))
assert(is_equal_approx(
cylinder.height,
definition.collision_height * visual_scale,
))
assert(collision.position.is_equal_approx(
definition.collision_offset * visual_scale
+ Vector3.UP * cylinder.height * 0.5
))
else:
assert(collision == null)
var query := PhysicsRayQueryParameters3D.create(