feat: scale village queries and enrich Jajce center

This commit is contained in:
Rijad Zuzo
2026-07-16 23:51:08 +02:00
parent 4be72639d8
commit 2c88ed6ea8
48 changed files with 2059 additions and 280 deletions
+61 -1
View File
@@ -63,10 +63,48 @@ func _run() -> void:
_check(world.has_node("WaterRoot"), "JajceWorld should expose WaterRoot")
_check(world.has_node("VillageRoot"), "JajceWorld should expose VillageRoot")
_check(world.has_node("FoliageRoot"), "JajceWorld should expose FoliageRoot")
_check(world.has_node("WildlifeRoot"), "JajceWorld should expose ambient WildlifeRoot")
_check(
world.get_node("FoliageRoot").get_child_count() >= 10,
"JajceWorld should include restrained authored foliage clusters"
)
var conifer_count := 0
for foliage in world.get_node("FoliageRoot").get_children():
if foliage.name.begins_with("Conifer_"):
conifer_count += 1
_check(conifer_count >= 6, "Citadel and river edges should include conifer silhouettes")
_check(
world.get_node("WildlifeRoot").get_child_count() >= 3,
"Village center should include a few oversized ambient butterflies"
)
var grass_field := world.get_node("TerrainRoot/Terrain3D/CozyGrassField")
var grass_material := grass_field.get("mesh_material_override") as ShaderMaterial
var grass_process := grass_field.get("process_material") as ShaderMaterial
_check(
int(grass_field.get("particle_count")) in range(9000, 15001),
"Camera-local Terrain3D grass should stay inside its bounded particle budget"
)
_check(
(
grass_material != null
and grass_material.shader == load("res://world/jajce/materials/cozy_grass.gdshader")
),
"Terrain grass should use the cozy wind-and-interaction shader"
)
var grass_max_scale := Vector3.ZERO
var grass_clod_boost := INF
if grass_process != null:
grass_max_scale = grass_process.get_shader_parameter("max_scale") as Vector3
grass_clod_boost = float(grass_process.get_shader_parameter("clod_scale_boost"))
_check(
grass_process != null and grass_max_scale.y <= 0.5 and grass_clod_boost <= 0.2,
"Grass placement should stay short enough to preserve villagers and paths"
)
var grass_controller := world.get_node("TerrainRoot/GrassInteractionController")
_check(
grass_controller.get("grass_material") == grass_material,
"Grass interaction should update the same material rendered by Terrain3D particles"
)
_check(
(
not world.has_node("WindStrokes_Valley")
@@ -156,7 +194,15 @@ func _run() -> void:
)
_check(tree_wind_is_bounded, "Tree wind should stay within the restrained cozy-motion budget")
_check(world.has_node("FortressBlockout"), "JajceWorld should include the fortress landmark")
_check(
world.has_node("FortressBlockout/Keep/CitadelKeep"),
"Fortress silhouette should expose a distinct summit citadel"
)
_check(world.has_node("WaterRoot/WaterfallBody"), "WaterRoot should include a waterfall drop")
_check(
world.has_node("WaterRoot/WaterfallBody/RockFrame"),
"Waterfall should be framed by the rocky river threshold"
)
_check(
world.has_node("WaterRoot/WaterfallMist"),
"WaterRoot should include waterfall mist particles"
@@ -167,10 +213,19 @@ func _run() -> void:
"Waterfall mist particles should have visible billboard geometry"
)
_check(
waterfall_mist.position.distance_to(Vector3(25.0, 0.8, -24.0)) < 0.01,
waterfall_mist.position.distance_to(Vector3(25.0, 2.05, -24.0)) < 0.01,
"Waterfall mist should stay at the waterfall base instead of obscuring the village"
)
_check(world.has_node("WaterRoot/RiverSurface"), "WaterRoot should include a river surface")
var river_ribbon := world.get_node("WaterRoot/RiverSurface/RiverRibbon") as MeshInstance3D
_check(
river_ribbon.mesh is ArrayMesh,
"River should build a lightweight ribbon from the current Terrain3D surface"
)
_check(
world.has_node("WaterRoot/RiverSurface/PlungePool"),
"River should widen into a readable plunge pool beneath the waterfall"
)
var environment: Environment = (
(world.get_node("WorldEnvironment") as WorldEnvironment).environment
)
@@ -190,6 +245,11 @@ func _run() -> void:
world.has_node("VillageRoot/Mill") and world.has_node("VillageRoot/Bridge"),
"VillageRoot should include the mill and bridge blockouts"
)
var house_count := 0
for village_child in world.get_node("VillageRoot").get_children():
if village_child.name.begins_with("House_"):
house_count += 1
_check(house_count >= 8, "Roofs should form a small residential amphitheater below the citadel")
var smoke_count := 0
var smoke_is_translucent := true
var smoke_follows_wind := true