Skip to content

Add Season 3: scene layouts, teams without roles, points scoring - #139

Merged
adri0 merged 3 commits into
mainfrom
season-3
Oct 22, 2026
Merged

adri0 merged 3 commits into
mainfrom
season-3

Conversation

@adri0

@adri0 adri0 commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Season 3 (April 2024) is 2v2 with both teammates in the base game, and every game, round robin and playoffs, is scored on points rather than lockout. This adds what extraction and validation need for it.

Layout: two scenes, picked per frame

The broadcast cuts between a team view (grid bottom center, timer to its right) and a one-player focus view (grid on the right, timer above it), often every minute or two. One layout per video would miss most of the claims, so LAYOUT_SEASON_3 is the pair (Layout.scenes):

  • board.scene_for picks the scene for each frame, and a game's square text, names and commentators are read from one scene (extract._text_scene, the larger grid when it's seen long enough).
  • Neither scene shows claim counts or names (score_box_*/name_box_* are now optional), so a scene is recognized by its timer box reading as a clock. Team names stay "unknown" for the contributor to fill in.
  • Calibrated on Jo W Bush vs Monkey Ballers (youtube.com/watch?v=miUkeOU8ue8), with a redacted fixture per scene. redact_fixture.py keeps only the grid box (not the whole column) for these layouts, since the column holds players' webcams.

Teams without roles

In Season 3 the overlay can't tell which teammate completed a square, so a teams.yaml team can list two members instead of base_player/dlc_player, and every claim is both players'. Season 5 files are written exactly as before.

Points scoring

A Season 3 round robin game is a race to 13 points: each side scores a point per square plus 2 per completed line, a line alone doesn't win, and the first side to 13 points wins. A game stopped by the clock before either side gets there goes to the higher total. There's no one-hour limit: one game ran to 1:03:25 and ended at 13. I worked this out from the VODs, since the archive has no Season 3 rules: in the first four games play stopped 13–38 s after a team reached 13. In one of them, play stopped six minutes after that team had already completed a line. Points = squares + 2 × lines also fits all six teams' totals on the archived bingobrawlers.com leaderboard.

  • Scoring (lockout by default, points) per game, set at extraction from SEASON_FORMATS[season].scoring (validation.scoring_for). Points for every Season 3 game: the semi-final VOD shows both playoff games going on after a line (a179804).
  • WinType.POINTS, plus winner.points, winner.LINE_POINTS (2) and winner.POINTS_TO_WIN (13). Equal totals at time up are a tie.
  • A points game's game_end is the claim that reached 13, found the same way as for a line. If nobody got to 13 (a game stopped by the clock), it's the segment's last reading, where the game screen gives way to the "TIME FINISHED" end screen. The JSON gets scoring, red_points and blue_points; a lockout game's JSON doesn't change.
  • New validation rules: season_scoring and points_mismatch. last_event_not_game_end and mark_after_win also cover points games.

The first match (site #139) extracts with no hand-added events: 23 claims, and the final board matches the end screen (blue reaches 13 at 59:20).

Tests: 560 unit tests pass, plus new tests for the scenes, points, teams, validation and settling. A release is needed before the site's validate check can pass on Season 3 matches.

🤖 Generated with Claude Code

adri0 and others added 3 commits October 18, 2026 18:07
Season 3 is 2v2 with both teammates in the base game (April 2024, before
the DLC), and its round robin is scored on points rather than lockout.

- Layout: the broadcast cuts between a team view and a one-player focus
  view, each with the grid and timer elsewhere. LAYOUT_SEASON_3 is the
  pair (Layout.scenes); board.scene_for picks the scene per frame, and a
  game's square text, names and commentators come from one scene. Neither
  scene shows claim counts or names, so a scene is recognized by its timer
  reading. Calibrated on Jo W Bush vs Monkey Ballers, with a redacted
  fixture per scene.
- Teams: a team can list two members without base/DLC roles, and every
  claim is both players'. Season 5 files are written as before.
- Scoring: a round robin game runs a full hour and a line doesn't end it;
  when the clock stops each side scores a point per square plus 2 per
  completed line, and the higher total wins (WinType.POINTS, equal is a
  tie). Games carry Scoring (lockout by default) set from the season's
  format, and a points game stores red_points/blue_points. Its game_end
  is the segment's last reading. New rules: season_scoring and
  points_mismatch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first VODs show play stopping seconds after a team reaches 13 points
(squares + 2 per line); one game ended six minutes after that team's line.
A points game is now won on reaching winner.POINTS_TO_WIN, with its
game_end on that claim, and only a game nobody won that way is decided on
points at time up. mark_after_win covers points games won at 13.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fourth VOD's game ran to 1:03:25 and ended when a team reached 13
points, so the docs no longer say a game runs to its hour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adri0
adri0 merged commit 62a8478 into main Oct 22, 2026
1 check passed
adri0 added a commit that referenced this pull request Oct 22, 2026
Main moved scoring to _settle_game, which runs once the match's season is
known. The time limit now fits that: _game_events returns the game's events
and the sample where the clock reached two hours, and _settle_game adds the
GAME_END there and calls the count, as it does for a points game that ran
out of time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant