FM27: support fixtures, league tables and competition rules

Open
#42 2 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
python
Domain
data

Research direction

Start by reading the implementations of fixtures(), league_tables() and competition_rules(), then trace the shared span pass and the layout handling they use. Run fmsave validate against FM27 data and compare results with the issue’s reported game screens. Done means all three reads work, table checks catch lost blocks, and stadiums() still works if calendar parsing fails.

Written by the indexing model from the issue text.

Description

No save files or real data
  • I have not attached or linked a save file, screenshot, or any real player data
What is missing

On FM27, fmsave 0.8.0 refuses fixtures(), league_tables() and competition_rules(). They report error in fmsave validate. These can be read, and the results agree with the game where I could compare them.

How the results compare with the game

The comparisons below used a local build, because 0.8.0 refuses this on FM27.

Table Read on the 9 August save Compared with the game
fixtures() 18,884 records All 3 results on a fixture schedule screen match, and the first competitive result matches. The dates of 2 further friendlies on the training screen match.
league_tables() 229 tables, 1,694 rows 4 of 4 league positions shown on club screens match, across 3 competitions.
competition_rules() 241 records Not compared.

Every table has an unbroken run of positions. Every double round-robin stage in the calendar has a table.

Suggested approach
  • Fixtures: register FM27 layouts for the calendar, stage results and match summaries.
  • Tables: FM27 stores a table in more than one form. One form has no match rows, so matches stays empty for those tables. A lost block should fail a check, not silently drop a table.
  • Rules: read them from the span pass. Enabling all three together makes sense, because they share that pass.

stadiums() needs the calendar for its home grounds, so it should keep working if the calendar fails.

What remains uncertain
  • I checked one career, from the start of the first season to early August. I will send the saves and matching screens by email.
  • 6 rows, all in one 18-club competition, have won + drawn + lost below played, and their points suggest a fourth kind of result. I have not found it on a screen.
  • 13 rows have points that differ from 3 for a win and 1 for a draw. I have not looked at why.
  • competition_name is empty on all fixtures in this read, while competition_id is set on all of them.
  • I have not seen a table after the season changes, so a next-season block beside an unfinished block is untested.
  • Some bytes of a rules round stay unidentified.
Versions
  • fmsave 0.8.0 (main at 418c837), Python 3.13.13, macOS 27.2
  • FM27 build 27.0.0+2486695
Dominant language
Python
Stars
28
Forks
8
Avg merge
42m
Merged PRs (30d)
33

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from rhiever/fmsave

All issues in rhiever/fmsave

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.