Positioning geometry: owning the angle
The net is 1.83 m wide and 1.22 m tall. From a shooter standing 10 m out on the centre line, the full width of the goal mouth subtends an angle of:
θ_net = 2 · atan( (W/2) / d ) = 2 · atan(0.915 / 10) ≈ 10.5°
A goaltender does not need to physically cover 1.83 m. They need to cover that 10.5° cone. By stepping out from the goal line toward the shooter, the goalie intercepts the cone where it is narrower. If the goalie stands at depth c in front of the line, the width of net they must block at their own position is:
w_required = W · (d − c) / d
At 0.45 m of depth, the default in our engine, a 10 m shot requires the goalie to cover about 1.75 m of the cone rather than 1.83 m. From 6 m the saving grows to more than 7%. Real goaltenders trade depth against lateral recovery: the further out they play, the longer they must travel to reach a cross-crease pass or a bank rebound. Our AI stays square to the shooter along the bisector of the cone before release, with a slight idle sway to reflect weight shifting in stance.
The reaction pipeline
A save has three stages: perception (seeing and tracking the release), decision (committing to a movement) and motor execution (the body actually moving). The engine compresses perception and decision into a single reaction delay, sampled for every shot:
t_react = base_tier + N(0, 0.02 s), clamped to 0.08–0.40 s
| Tier | Base reaction | Lateral slide | Hand speed | Read error σ |
|---|---|---|---|---|
| Rookie | 260 ms | 2.4 m/s | 3.0 m/s | 0.18 m |
| Pro | 180 ms | 3.0 m/s | 3.8 m/s | 0.10 m |
| Elite | 130 ms | 3.6 m/s | 4.6 m/s | 0.05 m |
The time budget
Whether a goalie can make a save depends on how much time remains after the reaction delay. Flight time is approximately distance over speed:
t_flight ≈ d / v
t_move = t_flight − t_react
A 144 km/h (40 m/s) shot from 10 m arrives in about 250 ms. A Pro goalie spends 180 ms reacting, leaving only 70 ms to move. At a hand speed of 3.8 m/s, the glove can travel about 27 cm in that window. If your shot requires more than that, it goes in, unless the goalie was already standing in the way. Drop the release to 25 m/s and the flight time jumps to 400 ms, giving the same goalie 220 ms to move and over 80 cm of glove travel. Speed buys you time; accuracy decides whether you needed it.
Butterfly slide mechanics
When the predicted arrival height is below 0.5 m, the AI drops into the butterfly. The transition takes 120 ms and changes the coverage model continuously:
- Pad span widens from ±0.30 m to ±0.64 m around the goalie's centre.
- Pad top height lowers from 0.72 m to 0.30 m, sealing the ice.
- The five-hole gap closes from 0.22 m to zero.
- The torso drops, lowering the shoulder line from 1.40 m to 1.00 m, which opens the top corners.
While dropping, the goalie also slides laterally toward the predicted crossing point, capped at the tier's slide speed and a maximum offset of 0.60 m from centre. This is the classic butterfly trade-off: the ice is sealed but the upper third of the net becomes vulnerable, which is exactly why a high-corner shot after a low fake is so effective.
The save prediction algorithm
Once the reaction delay expires, the goalie continuously extrapolates the puck's current state to its own plane, positioned at depth z_g in front of the goal line:
t̂ = (z_g − z) / v_z
x̂ = x + v_x · t̂ + ε_x
ŷ = y + v_y · t̂ − ½ · g · t̂² + ε_y
The error terms ε are drawn once per read from a normal distribution with the tier's read error. The body slides toward x̂, and the hand on that side (glove for pucks to the shooter's right, blocker for the left) drives toward (x̂, ŷ) at the tier's hand speed. When a bank shot touches the boards, the prediction becomes invalid: the AI waits a 100 ms re-read delay and samples a fresh, larger error before tracking again.
Coverage model
A save is registered when the puck crosses the goalie plane inside any covered region: pads, torso, mask, a 0.12 m glove radius, a 0.11 m blocker radius or the stick blade lying on the ice. The puck's own 38 mm radius is added to every region, so a shot that clips the edge of a pad is a save. Rebounds are ejected at 22% of incoming speed with a lateral kick away from the goalie's centre.
How to beat it: shoot before the reaction resolves, force the goalie to travel laterally, go high once the butterfly is committed, and use bank shots to trigger the re-read delay.