Today was about something you do not notice until you actually try to play it: a broadcast camera shows you maybe a third of the pitch. You cannot make a run you cannot see.
Radar. All 22 players and the ball, bottom centre. It is one C++ widget that draws the entire thing in a single pass: no child widgets, no per-frame bindings. Every dot pulls that player's real kit colour, so the blue dot on the radar is the blue shirt on the pitch.
Scoreboard. The club colour slivers now come from the fixture data instead of values I had typed in by hand. New opponent, new colours, nothing to edit.
This one was a proper bug. It had been showing my player the entire time. The name came from a property binding, which never shows up in the event graph so it is invisible until you go looking, quietly reading "get owning player pawn." Always you, on both cards. Now it names their ball carrier when they attack, and their nearest defender when I am on it.
It also ignores goalkeepers. That is the third separate system I have had to explicitly tell that keepers are not outfielders.
Plus offside detection and the free kick that follows it, now running in the full stadium.
Shipped: single-pass C++ radar · fixture-driven scoreboard colours · opponent nameplate