Enemies and bosses follow fixed, fully deterministic patterns; mastery is memorization and execution, not reaction to randomness.
The boss runs a fixed, telegraphed attack pattern — read the tell, dodge to the safe spot, and punish the recovery window.
The whole point is determinism: no RNG anywhere in the enemy. Mastery comes from the pattern being identical every attempt.
Author the attack sequence as a fixed timeline — telegraph, strike, recover. Same animation every loop means a memorizable, repeatable pattern.
func _ready():
$Anim.play("attack_cycle")
$Anim.animation_finished.connect(func(_n): $Anim.play("attack_cycle"))Fixed intervals between pattern steps. A constant wait_time keeps the rhythm learnable — never randf() the delay.
$Beat.wait_time = 1.2 # constant, never randomized
$Beat.timeout.connect(next_pattern_step)Step index through the pattern. Advancing it deterministically (not by chance) is what makes the fight a puzzle of execution.
var step := 0
func next_pattern_step():
step = (step + 1) % PATTERN.size()
do(PATTERN[step])In short: AnimationPlayer-driven enemy state machine with no RNG; attack sequences are scripted and repeatable
6 catalogued game(s) use this mechanic, spanning 1987–1995.
▶ Explore Pattern Recognition Combat interactively — see every game + the Godot system