P5 the Old Stag: standing stones and altar, three-phase boss with charges, stun window, spirit wolves and stomps; antler pickaxe and trophy; group scaling and credit for every fighter; online 3-player test (protocol 12)

This commit is contained in:
Paul Bailey
2026-11-05 13:39:06 +00:00
parent 3389ec9a21
commit e03411ffdb
24 changed files with 1587 additions and 17 deletions

View File

@@ -180,8 +180,17 @@ func _desired_speed() -> float:
"charge", "flee": return def.run
return 0.0
## (The chest it's going for isn't in its way: it walks right up to it.)
## (The chest it's going for isn't in its way: it walks right up to it. Nor
## is the person it's charging: it runs into them, not round them.)
func _blocked(dir: Vector3) -> bool:
if state == "charge" and player != null and global_position.distance_to(player.global_position) < 6.0:
var probe := global_position + dir * (1.4 + speed * 0.15)
var h: float = terrain.sample_height(probe.x, probe.z)
if not terrain.inside_boundary(probe.x, probe.z, 6.0) or h < terrain.water_level + 0.2 or absf(h - global_position.y) > 1.1:
return true
var q := PhysicsRayQueryParameters3D.create(global_position + Vector3(0, 0.45, 0), Vector3(probe.x, h + 0.45, probe.z), 1)
q.exclude = [get_rid(), player.get_rid(), terrain.get_node("TerrainBody").get_rid()]
return not get_world_3d().direct_space_state.intersect_ray(q).is_empty()
if state == "raid" and food != null and is_instance_valid(food) and global_position.distance_to(food.global_position) < 3.5:
var probe := global_position + dir * 1.4
var h: float = terrain.sample_height(probe.x, probe.z)