← All projects

Design reference

Goal2 — illustrated interface design

A screen-by-screen design for managing a country, preparing the team and following a match.

This is the design of goal2's interface, made before anything is rebuilt (design phase #524, task T157, issue #526). It starts from the original: its flow screen by screen, as one uninterrupted sitting shows it (playthrough, run T156-R1), and the other chapters of docs/original-game. Today's window is used only in section 4, to say what it keeps, changes and drops. [designed: owner, 2026-11-02, #523, #524]

The design follows the original exactly: its decisions, information, layout and keys, in the same order. It departs only where a DOS limit forced the original's way or where the owner hit a problem in the playtest (#523), and each departure is tagged [designed] with its reason (the rule). The look is the original's: its own palette and a blocky VGA-style font, on a modern, readable layout. It chooses no toolkit and no technology; that is T158. [designed: owner, 2026-11-03, owner decisions, 2026-11-03, #526]

Contents:

  1. The player's journey
  2. Every screen, S01 to S22, each with its mockup
  3. Rules for the whole UI
  4. What today's window keeps, changes and drops
  5. The mapping of every original screen
  6. Decisions (owner, 2026-11-03)

The mockups are static pages at desktop size (1440×900), written by mockups/build.py into mockups/*.html with mockups/style.css, and rendered to images/. Their colours are read from the captures by palette.py and their font is vendored in mockups/fonts/. They are pictures of the design, not app code. Their names, scores and fixtures are those of run T156-R1 so that each can be read beside the capture it replaces; skill values and a few figures are illustrative. Regenerate with python3 docs/design/ui-2026-11/mockups/build.py --render <chrome binary>. [designed: T157]

The mapping check. check_mapping.py reads every classified screen of the screen inventory and every original image embedded in the chapters (the playthrough's included), and checks that the table in section 5 maps each to a new screen or drops it with a reason. It also checks that every new screen has its section here and an embedded mockup. python3 docs/design/ui-2026-11/check_mapping.py exits 0 only when nothing is missing. [designed: T157]

Evidence notation is the original-game chapters' own: T156-R1 step N is a step of the uninterrupted run, E031 Cnn a claim of the observed-claims register, E015-r… state S and M244-… step S other captures. [designed] marks a choice of this design. [confirmed: docs/original-game/README.md]

1. The player's journey

From the first start to a played season, the player meets these screens in this order. Each step names the original screen it replaces, from T156-R1 unless said otherwise. [designed: T157]

flowchart TD
  imp[S01 Import your data, first start only] --> start[S02 Start: continue, load or new]
  start -->|N new game| count[S03 How many managers]
  start -->|Enter continue, or Y and a save| desk
  count -->|Enter| country[S04 Country and manager's name]
  country -->|Enter, name, Enter| news[S05 Bulletin]
  news -->|Enter| desk[S06 Manager's desk]
  desk -->|team info| team[S07 Team info]
  desk -->|Space select squad| squad[S08 Squad and pool]
  squad -->|T| ptac[S09 Player tactics]
  desk -->|T| ttac[S10 Team tactics]
  desk -->|fixture list| fix[S11 Fixtures]
  desk -->|tournament| tour[S12 Tournament]
  desk -->|history| hist[S13 History]
  desk -->|F7 / F10 / F3 / F4| save[S21 Save, quit, load goal or summary]
  desk -->|F1| help[S22 Help]
  desk ==>|Enter play next game| round[S14 Round results]
  round ==>|Enter| menu[S15 Match menu]
  menu -->|players| bench[S19 Bench]
  menu ==>|Enter play| captain[S16 Choose captain]
  captain ==>|Enter or C| pitch[S17 Pitch]
  pitch -->|stops: goal, injury, set piece| stop[S18 Match stop]
  stop --> pitch
  stop -->|any key, your player injured| menu
  pitch -->|half time, full time| board[S20 Match board]
  board -->|Enter| menu
  menu ==>|exit after full time| board
  board ==>|Enter| news
  news ==>|Enter| desk

The thick arrows are the match day: play next game on the desk, then Enter through the round, the match menu (play) and the captain to kick-off. Your own matches are watched; nothing asks whether to watch them unless the original asks. [confirmed: T156-R1 steps 36–45, 262–266; designed: owner decision 1, #526]

# Original screen (capture) Decision in the original goal2 screen Same decision?
0 — — S01 Import goal2 adds it: the data files are imported once, on the first start, because no original file ships with goal2 (CLAUDE.md rule 14; T153).
1 Title, load a saved game? (step 0) Y load / N new S02 Start Same Y and N; departs [owner decision 4]: Continue (Enter) for the last save, and a list of saves by free names instead of typing a file name.
2 Load name (step 243) / file not found which save; retry S02 Start Same, as a list; a save that fails says why, with Y try again / N back.
3 How many players (step 1), HANG ON A TICK (step 2) 1–6 managers S03 New game Same, hot seat. Departs [owner decision 9]: one optional field for the starting year, the PC clock's year by default as the original takes it (NG-9).
4 Country browser (steps 3–5) which country S04 Country Same, with the card and the list together.
5 Name entry (steps 6–10) manager's name S04 Country Same, on the same screen, as in the original (an overlay of the browser).
6 Bulletins (steps 11–12) read the news S05 Bulletin Same.
7 Hub (step 13) what to do next S06 Desk Same: the landing page with all six options visible, play next game among them, the cursor on team info, the same F-keys.
8 Squad and pool (steps 14–29) who is in the twenty S08 Squad Same keys and the same two-Enter exchange.
9 Player tactics (step 30) one player's tactics S09 Player tactics Same.
10 Team tactics (steps 33–34) the team's tactics S10 Team tactics Same.
11 Round results so far (step 41) — (read) S14 Round Same.
12 Match menu (step 42) inspect, change, play S15 Match menu Same; play names what follows ("choose your captain").
13 Captain card (steps 43–45) the captain S16 Captain Same keys; changed: the screen says that kick-off waits for this choice (#523).
14 Pitch (steps 45–118) speed, display, result, bench S17 Pitch Same keys; the pitch is in the main window.
15 Taker cards (steps 46, 56) taker, or C S16 (same stop, other title) Same, including the timeout.
16 Substitution opportunity (step 67) go to the bench S18 Match stop Same.
17 Bench (steps 74–81, 124–132) substitutions S19 Bench Same keys; the bench says its mode (request or make now) and the step of the exchange.
18 Half-time / full-time board (steps 119, 192) — (read) S20 Board Same.
19 Replay and save-goal questions (steps 175–178) replay? save? name S18 Match stop Same three questions, in one box.
20 Full-time menu, exit (steps 193–198) stats; exit S15 Match menu Same.
21 Save the summary? name (steps 198–199) save? name S20 Board, S21 name box Same.
22 Bulletin (step 200), hub (step 201) — S05, S06 Same.
23 Fixture list, tournament (steps 224–231) which matches to watch; standings S11, S12 Same.
24 F7 save, F10 quit (steps 233–241) name; quit? save? S21 Same.
25 Reload (steps 242–244) which save S02 Same, as in rows 1–2.
26 F3 saved goal (steps 245–256) which goal S21 name box, S15, S17 Same.
27 Round two: results, menu, captain C, R quick result (steps 262–313) quick result S14, S15, S16, S17, S20 Same; R on the pitch, as in the original.
28 Group table, bulletin, hub (steps 316–318) — S12, S05, S06 Same.

A season goes on like rows 7–28: the desk, the round, the match, the news, the desk. At the year's end the original shows the remaining results, winners and a new stage on the desk (E031 C54–C56, M244-G1E-06 steps 14–19): goal2 shows them on S14, S12 and S05 in the same order. [confirmed: T156-R1 steps 0–321; E031 C54–C56; M244-G1E-06 steps 14–19]

Multi-manager play. With more than one manager, S04 repeats for each, and the desk gains next player, which hands the desk to the next manager. [confirmed: E031 C16–C16b] The design keeps it: 1 to 6 managers, hot seat, as the original. [owner decision 5, #526]

The bot (idle play, plan G-M5) is left out of this design; where it goes is decided later. [owner decision 6, #526]

2. Every screen

Each screen lists its purpose, what it shows, its actions and keys, and the original screens it replaces (all of them are in section 5). A key in bold is the original's own. Enter does the highlighted choice; the right end of the bottom bar says what that is now, as the original's hint line does ("◄┘-move player", "Hit ◄┘ to watch match").

S01 Import your data

S01 Import your data
S01 Import your data Open full size

S02 Start

S02 Start
S02 Start Open full size

S03 New game: how many managers

S03 New game
S03 New game Open full size

S04 Country and manager's name

S04 Country and name
S04 Country and name Open full size

S05 Bulletin

S05 Bulletin
S05 Bulletin Open full size

S06 Manager's desk

S06 Manager's desk
S06 Manager's desk Open full size

S07 Team info

S07 Team info
S07 Team info Open full size

S08 Squad and pool

S08 Squad and pool
S08 Squad and pool Open full size

S09 Player tactics

S09 Player tactics
S09 Player tactics Open full size

S10 Team tactics

S10 Team tactics
S10 Team tactics Open full size

S11 Fixtures

S11 Fixtures
S11 Fixtures Open full size

S12 Tournament

S12 Tournament
S12 Tournament Open full size

S13 History

S13 History
S13 History Open full size

S14 Round results

S14 Round results
S14 Round results Open full size

S15 Match menu

S15 Match menu
S15 Match menu Open full size

S16 Choose a player: captain, taker, penalty order

S16 Choose your captain
S16 Choose your captain Open full size

S17 Pitch

S17 Pitch
S17 Pitch Open full size

S18 Match stop

S18 Match stop
S18 Match stop Open full size

S19 Bench

S19 Bench
S19 Bench Open full size

S20 Match board

S20 Match board
S20 Match board Open full size

S21 Save, quit, load a goal or a summary

S21 Save
S21 Save Open full size

S22 Help

S22 Help
S22 Help Open full size

3. Rules for the whole UI

The rule. Follow the original exactly. Depart only where a DOS limit forced the original's way, or where the owner hit a problem in the playtest. Every departure is marked [designed] with its reason. Everything below, and every screen in section 2, applies it. [designed: owner, 2026-11-03, owner decisions, 2026-11-03, #526]

Navigation. [confirmed: T156-R1 steps 0–321]

The Enter hint. The right end of the bottom bar says what Enter does on the highlighted choice now, as the original's hint line does ("Hit ◄┘ to select option", "◄┘-move player", "Hit ◄┘ to watch match"). The cursor starts where the original's does: team info on the desk, play on the match menu, the computer's pick on the captain card. The hint is drawn as the original's highlight bar, light grey with black text. [confirmed: T156-R1 steps 13, 17, 42, 43, 224]

Stops. [designed: #523, the owner did not know that the match waited for a captain]

The match.

The look. The original's palette and a blocky font, on a modern layout. [designed: owner, 2026-11-03, #526: "try to mimic the color scheme of goal and try to have more of a retro feeling, maybe a blocky font is enough and we can keep the rest"]

The keyboard.

4. What today's window keeps, changes and drops

Today's window is the default route a player gets from the portable build: the import dialog, the Launch window, then the core route's main window (goal2/desktop/core_window.py), with the pitch in a separate pygame window. [confirmed: goal2/desktop/main.py:79–134; goal2/desktop/window.py:556–561]

Today's screen Keeps Changes Drops
Import dialog (data_setup.py) the check and the copy, the plain-words errors becomes S01, with each file's check on screen —
Launch: Return to your country (launch.py) the saved career summary, Resume, retry becomes S02: Continue, the saves as a list, the title's Y/N the path field ("Open another save")
Launch: Choose your country the 128 countries, the card becomes S04: groups of 16, Ins, Space players, the name on the same screen the 1990/1992 start-year list, replaced by S03's optional year field (owner decision 9)
Launch: Review before starting the manager name (14 characters) the name moves into S04 the review page
Launch: bulletins the three-column bulletin becomes S05 —
Main window: top bar country, manager, year and stage, next match as in section 3 —
Main window: side bar (Country, Team, Pool, Fixtures & match, Save; Ctrl+1–5) and SHOW MATCH (F8) — the desk's six options take its place the side bar, Ctrl+1–5, F8
Main window: status line — each screen says what it waits for itself the status line
Country (the desk) the desk's panels and its six options; history becomes S06, the landing page with all six actions on it (play next game included) and the cursor on team info; history becomes S13 —
Team: card, own tactics, team tactics the card, R / Shift+R / C, T, F2 becomes S08, S09, S10 —
Pool: card, compare, suggest the pool card; the exchange joins S08 (←→ squad / pool), the exchange shown before it is made Compare as a separate view; Suggest becomes Ins (the assistant's 20)
Fixtures & match: fixture list, tournament the boards become S11 and S12, reached from the desk —
Round pages (Next > (Enter)) the order of the pages become S14, S20, S12, S05 the generic page titles
Captain view with Watch this match toggle the eleven, the suggested captain, Enter, C becomes S16, which says the match waits for it; C bound the Watch toggle: own matches are watched, the original's watch question and R remain (owner decisions 1, 3)
Pre-match team (bench, pre-match) the swap joins S15's players and S19 —
Pitch window (pygame) its keys moves into the main window as S17 the second window, its fixed caption
Substitution notice, action replay, takers, shoot-out order the questions and their keys become S18 and S16 —
Half time / bench substitutions left, make substitutions now becomes S19 and S20 —
Match summary the board, the save question becomes S20 with S21's name box; N bound —
Save page (path, Save F7) F7 becomes S21's name box, with F10 quit the path field

5. The mapping of every original screen

Every classified screen of the screen inventory and every original image embedded in the chapters is in one row: the new screen that replaces it, or dropped with the reason. check_mapping.py checks this table. [designed: T157]

New screen Original screens it replaces Note
S01 — goal2 adds it: the first-start import (T153)
S02 title-load-prompt, m244-load-name, t156-243-load-name, file-not-found-prompt title, load, error
S03 title-player-count, t156-002-hang-on-a-tick managers, busy
S04 country-select, country-select-name-entry, t156-005-country-holland, t156-006-name-entry, t156-010-name-typed country, name
S05 bulletin, t156-011-bulletin-welcome, t156-012-bulletin-groups, t156-200-bulletin-after-match, t156-317-bulletin-round2, m244-elimination-bulletin news
S06 manager-menu, t156-013-hub, t156-201-hub-after-round1, t156-244-loaded-hub, t156-318-hub-round2, m244-holland-menu, m244-finals-stage-hub hub
S07 m244-team-info-2030, m244-team-info-players-2030 competitors
S08 m244-squad, m244-squad-next, m244-pool, m244-pool-next, m244-position-next, m244-position-club, t156-014-squad, t156-016-pool, t156-017-pool-put-here, t156-029-pool-pick-done, t156-202-card-recovered, t156-320-card-recovered-round2 squad, pool
S09 m244-individual-tactics, m244-position-tactic-toggle, mark-protect-zone, mark-named-opponent, squad-substitution-tactic, t156-030-player-tactics player tactics
S10 team-tactics, m244-team-tactics, t156-033-team-tactics, t156-034-team-tactic-changed team tactics
S11 fixtures-watch, fixtures-auto, m244-fixtures, m244-fixtures-watch, t156-224-fixture-list fixtures
S12 m244-tournament-group-f, m244-tournament-group-g, m244-world-finals-bracket, m244-world-qualifying-a, m244-world-qualifying-b, m244-final-qualifying-table, t156-227-tournament-europe, t156-228-tournament-americas, t156-229-tournament-finals, t156-230-tournament-championship, t156-316-group-table tournament
S13 m244-history history
S14 round-playing, round-results, t156-041-round1-results, t156-262-round2-results-rolling, t156-263-round2-results round
S15 match-menu, match-menu-halftime, match-menu-fulltime, match-watch-prompt, t156-042-match-menu, t156-048-menu-after-taker, t156-193-fulltime-menu, t156-264-round2-match-menu, t156-246-goal-replay-menu, m244-knockout-halftime, m244-extra-time-menu, m244-extra-time-halftime match menu
S16 captain-select, t156-043-captain, t156-044-captain-chosen, t156-265-round2-captain, t156-046-goal-kick-taker, t156-056-corner-taker, m244-shootout-order, m244-shootout-five-chosen captain, takers, order
S17 match-live, match-commentary, injury-event, t156-045-kick-off, t156-058-taker-timed-out, t156-066-injury-and-booking, t156-178-replay-playing, t156-247-goal-replay, t156-254-goal-replay-goal, t156-267-quick-hang-on, m244-shootout-first-goal pitch
S18 t156-067-substitution-opportunity, t156-149-opponent-substitution, t156-175-replay-prompt, t156-176-save-goal-prompt, t156-177-goal-file-name, t156-274-quick-substitution-opportunity, e031-shootout-start, m244-shootout-prompt stops
S19 squad-substitution-take-off, squad-substitution-put-on, squad-substitution-illegal, t156-074-bench-requested, t156-080-bench-request-cancelled, t156-124-halftime-bench, t156-132-substitution-made, t156-279-quick-bench, t156-301-quick-substitution-made bench
S20 t156-119-halftime-board, t156-192-fulltime-board, t156-270-quick-halftime, t156-310-quick-fulltime, match-summary-save-prompt, match-summary, t156-198-summary-prompt, t156-199-summary-file-name boards, summary
S21 save-game-name-entry, save-game-prompt, quit-confirm, t156-233-save-name-prompt, t156-237-save-name-typed, t156-239-quit-confirm, t156-240-quit-save-prompt, t156-245-load-goal-prompt save, quit, load goal
S22 — goal2 adds it in place of the original's help viewer, of which no capture exists
dropped dos-shell The emulator's DOS prompt before GOAL2 starts: not a game screen; goal2 starts on S01 or S02

6. Decisions (owner, 2026-11-03)

The owner answered the design's nine questions on #526 (owner decisions, 2026-11-03, #526); this design applies them.

  1. The desk is the original's landing page with every action visible, play next game included; own matches are watched by default; no watch control the original lacks; the cursor starts where the original's does.
  2. The pitch is in the main window, with the commentary always beside it.
  3. Watch or quick result as the original: its question where it asks one, R on the pitch, no extra button.
  4. Load: Continue plus a list of saves, in place of typing a file name.
  5. Managers: 1 to 6, hot seat, as the original.
  6. Autopilot: decided later; left out of this design.
  7. The look: modern and readable, with the original's layout, colour meanings and role codes. Revised the same day (below).
  8. Save names: free names, shown in the save list, not the 8.3 names.
  9. The start year: the PC clock's year by default, as the original (NG-9), changeable in one optional field.

Approval, 2026-11-03 (the owner, on #526: "let us keep the design"), with three changes this design applies:

  1. Mouse support stays, as the owner's decision.
  2. GOAL.HLP joins the first-start import (S01), and F1 shows the original's help from it (S22). The change to the import is made in T153's code, in a separate PR.
  3. The look: the original's colour scheme and a retro feel. The mockups use the original's palette, read from the captures, and a blocky VGA-style font (PxPlus IBM VGA 8x16, CC BY-SA 4.0). The layout and everything else stay (the look).

Owner decisions, 2026-11-03 (on T162's questions, #536: "do as proposed"):

  1. S22's text box fills most of the screen, not the mockup's nine lines: the original's help is a long text. Made in T163.
  2. Adding GOAL.HLP later: the desk (S06) gets a re-import data entry, which opens S01 over the imported folder. Made in T164. Until then, F1's message names the re-import command.

Owner decisions, 2026-11-03 (on gaps that T163 and T165 found):

  1. S05 waits for the original's news. Until Track B ports it (U2, #509), a new career goes from S04 to the home screen. goal2 writes no bulletin of its own.
  2. Ins (the assistant's 20) says coming later until the original's assistant (0791:DC7E) is ported in Track B's U3. There is no Unicorn and no stand-in rule meanwhile.

Owner decisions, 2026-11-03 (on the main session's gap audit, #509):

  1. The ZIP keeps today's window as its default until the Python route plays a whole season (T170). T169 adds the new window beside it, for the playtest. No build plays less than the one before it.
  2. Four of today's extras stay, though the original lacks them. Each is marked [designed] where it departs:
    • Pool search and filter on S08: by name, accent-insensitive, and by position.
    • A standalone friendly between any two countries, outside a career, from S02.
    • Renaming the manager after the career started, from the desk.
    • A new career from inside a game, from the desk, with the unsaved-progress question first.