feat: scale village queries and enrich Jajce center
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user