Enemies have multi-state awareness of the player; avoidance rather than engagement is the primary success condition.
Metal Gear-style box stealth: the box hides you, but lift it while the guard faces the lane and you're spotted — move only while it looks away to reach the exit.
Line of sight. Cast from the guard toward the player; a clear ray (nothing solid in the way) means the player is potentially seen.
$Sight.target_position = to_local(player.global_position)
if $Sight.is_colliding() and $Sight.get_collider() == player:
raise_awareness(delta)Hearing radius. An Area2D around the guard catches noise events — running or gunfire inside it nudges awareness even with no line of sight.
func _on_noise_entered(src):
awareness += src.loudnessAwareness as discrete states (UNAWARE / SUSPICIOUS / ALERT). Sight and sound push a meter; crossing thresholds flips the state and the guard's behavior.
enum Awareness { UNAWARE, SUSPICIOUS, ALERT }
if meter > 80: state = Awareness.ALERTIn short: Detection state machine (UNAWARE / SUSPICIOUS / ALERT) per enemy; RayCast2D for sight lines; Area2D for sound radius
4 catalogued game(s) use this mechanic, spanning 1987–2000.
▶ Explore Stealth Detection interactively — see every game + the Godot system