engine.py · physics.py · tactics.py · sim/state

MatchSimulator

90′ match · 5767 sim frames @ 24 FPS · 14 styles in STYLE_PROFILES · 63 TEAM_STYLE_MAP entries

BOU · Gegenpress CRY · Vertical runners snapshot_state
User cache: javid_local_user

Bournemouth vs Crystal Palace

Score
0 - 0
Probabilities
0.334 / 0.445 / 0.221
xG
1.39 - 0.98

Loaded player data overview

Source: repo.fpl(latest season snapshot)
Latest season in CSV: 2025
Snapshot rule: latest available row per player for each selected team
BOU
Players shown11
Avg price5.0
Avg xG2.45
Avg xA1.31
Avg points80.0
Matchup totals
Players shown22
Avg price5.3
Avg xG2.91
Avg xA1.6
Avg points84.0
CRY
Players shown11
Avg price5.6
Avg xG3.36
Avg xA1.90
Avg points88.0

Live simulation stats

Updates live as the match evolves.
Attack / penetration
Home AttackStyle
Away AttackStyle
Home Penetration
Away Penetration
Home Defense Style
Defense / build / transition
Away Defense Style
Home Build Style
Away Build Style
Home Transition
Away Transition

Loaded player data overview

Source: repo.fpl(latest season snapshot)
Latest season in CSV: 2025
Snapshot rule: latest available row per player for each selected team
BOU
Players shown11
Avg price5.0
Avg xG2.45
Avg xA1.31
Avg points80.0
Live match stats
Stat BOU CRY
Possession0%0%
Shots0 (0)0 (0)
Passes0 (0%)0 (0%)
Fouls00
Goals00
CRY
Players shown11
Avg price5.6
Avg xG3.36
Avg xA1.90
Avg points88.0

Home player phases

Color-coded live phase tracking.

Away player phases

Color-coded live phase tracking.

BOU player stats

Click any column header to sort.
# Name Pos $ Min St Pts G A CS xG xA Inf IQ Thr
1 Đorđe Petrović GK 4.5 2610 29 94 0 0 8 0.00 0.00 22.6 0.0 0.0
2 Adrien Truffert DEF 4.6 2568 29 107 0 2 8 0.39 2.07 20.4 13.0 3.3
3 Marcos Senesi Baró… DEF 4.9 2478 28 126 0 4 8 1.25 4.03 31.5 10.8 6.0
4 Álex Jiménez Sánch… DEF 4.5 1855 21 63 1 2 5 1.04 1.49 16.1 10.3 8.2
5 Bafodé Diakité DEF 4.2 1275 15 46 0 0 4 0.02 0.19 18.8 3.8 1.6
6 Alex Scott MID 5.1 2128 26 101 2 2 8 3.26 1.63 17.8 13.4 11.0
7 Marcus Tavernier MID 5.3 1942 22 104 5 4 8 6.75 2.74 21.2 22.5 19.5
8 Tyler Adams MID 4.9 1412 18 60 2 1 6 0.56 0.37 19.4 6.1 6.7
9 Francisco Evanilso… FWD 6.9 2013 23 87 6 3 8 7.50 1.13 13.2 13.9 29.0
10 Junior Kroupi FWD 4.7 1052 13 72 8 0 5 4.78 0.71 28.8 17.3 29.4
11 Enes Ünal FWD 5.4 170 0 20 1 0 0 1.35 0.06 24.1 6.6 43.4

CRY player stats

Click any column header to sort.
# Name Pos $ Min St Pts G A CS xG xA Inf IQ Thr
1 Dean Henderson GK 5.0 2610 29 115 0 0 10 0.00 0.10 23.9 0.3 0.0
2 Tyrick Mitchell DEF 5.0 2578 29 108 1 1 10 1.06 1.61 17.4 12.7 6.5
3 Maxence Lacroix DEF 5.1 2395 27 119 1 2 9 1.87 0.73 23.6 3.0 8.2
4 Chris Richards DEF 4.4 2242 25 104 1 0 9 1.09 1.32 24.3 4.8 5.4
5 Daniel Muñoz Mejía DEF 5.9 1779 21 109 3 3 9 1.99 3.33 22.2 15.3 14.4
6 Adam Wharton MID 5.0 2135 26 90 0 6 8 1.25 5.91 16.0 22.6 6.2
7 Yéremy Pino Santos MID 5.8 1706 21 65 2 1 7 3.94 4.78 14.3 30.2 16.8
8 Ismaïla Sarr MID 6.3 1636 19 90 7 1 8 7.98 0.69 20.7 10.9 21.8
9 Jean-Philippe Mate… FWD 7.5 1904 23 84 8 0 8 11.88 1.26 19.5 5.7 31.4
10 Jørgen Strand Lars… FWD 6.1 1806 19 61 4 1 5 4.16 0.67 12.1 8.2 19.1
11 Eddie Nketiah FWD 5.4 414 2 23 2 0 0 1.77 0.46 26.1 18.4 37.6

Live zone read

Layout: one row — home tactical read and away tactical read. Same live frame as the match viewer, including smoothing and half-time flip. Mini-pitches use a stadium-fixed 5×5 grid. Blocked / Weak / ball / nav target stay aligned with the legend. RL vs rules telemetry remains below when applicable.

BOU — tactical read
Blocked Weak cover Ball Nav target
CRY — tactical read
Blocked Weak cover Ball Nav target
Bournemouth vs Crystal Palace Player heat maps
Player heat maps
LIVE
View
Heatmap
After The Stadium

How the Match Simulator turns data into a 90-minute control problem

The stadium shell is the visual layer. Under it, OpenArena builds a state vector from squad strength, formations, tactical style priors, venue context, and live player data, then advances the match frame by frame with a learned decision layer and a deterministic physics engine.

State Vector

Data enters as a structured football state

Every frame carries the ball, carrier, lane occupation, stamina, tactical role locks, and restart context. That means the engine reasons over football information, not only over visuals.

s_t = [ball_xy, carrier, formation, style, fatigue, restart, stadium, player_traits]
The venue choice shapes rendering and match context, while squad and FPL-derived traits shape the decision space.
Reinforcement Learning

The policy layer optimizes future reward, not only the next touch

The RL component learns that a good action is one that helps now and improves the future state. Pressing, buildup, and transition choices are scored by their long-run value, not by a single-frame heuristic.

Q(s, a) ← r + γ max_a' Q(s', a')
In plain terms: value an action by immediate reward r plus the discounted quality of the next state.
Engine Dynamics

Frame updates follow a data-driven transition function

Once an action is chosen, the simulator updates the world through player motion, ball physics, fouls, collisions, role intent, and tactical constraints. That creates the next state the policy will observe.

s_{t+1} = f(s_t, a_t, ε_t)
The noise term ε captures uncertainty: deflections, loose touches, interception windows, and other football chaos.
Outcome Model

Probabilities emerge from repeated state evolution

Match outcome estimates are not static odds pasted onto the page. They are generated from the same engine that drives the animation, then summarized into result and xG-style forecasts.

P(result) ≈ (1 / N) Σ 1{outcome_i = result}
Repeated simulations let the app compare model belief to market belief, which is where EV and pricing analysis begin.