What a save holds

A save is the whole game world, not only your club. A career a decade in holds over a hundred thousand players and tens of thousands of clubs, every fixture the calendar has ever generated, and every injury it has recorded.

Twenty-six readers get at it. Each one returns a Table of records, and each one reads the save you point it at and nothing else.

People

players(), contracts(), suspensions(), staff(), staff_lists()

Players carry names, birth date and age, nationality, club, height, positions, all 52 attributes, the eight personality attributes, current and potential ability, reputation, transfer value, condition, traits, contract and any unserved ban. contracts() is the same contract record as a table of its own, which is what you want when you are looking across every deal in the save rather than at one club’s players. Staff carry their people data, ability, personality and how they prefer a side to be run; of the twenty or so attributes a staff profile rates, only adaptability has been located in the save.

Clubs

clubs(), managed_clubs(), finances(), sponsorships(), facilities(), stadiums(), affiliates(), job_vacancies()

managed_clubs() is the club you run, and is empty between jobs. finances() is monthly figures per club, in the save’s own unit. stadiums() holds capacities and ownership for tens of thousands of grounds, but a name for only a couple of hundred of them.

Competitions

stages(), competitions(), fixtures(), league_tables(), competition_rules(), transfer_windows(), player_match_stats()

Fixtures are the calendar: date, teams, round, and a score where the save still keeps one.

Injuries

injury_types(), injuries()

A career keeps a long injury history, but not an endless one.

Your own club’s work

training(), mentoring(), tactics(), set_pieces()

Only the club you manage stores these. Every other club returns no rows. It is not a gap in fmsave; the data is not in the save.

What no save can tell you

This half of the page matters as much as the half above. Knowing a thing is absent saves you an afternoon and saves the tracker a bug report.

Names the game renders from its own installed database. Competitions, leagues, nations, cities and all but a couple of hundred grounds. fmsave ships none of these and reads nothing from your game install. See Competition names below.

Links the save does not store. Which competition a rules block belongs to, which ground a club plays at. fmsave works these out from the fixture calendar where it can and leaves them empty where it cannot.

Meanings for numbers the game never displayed. Staff job titles, the settings inside a tactic. These come back as raw numbers rather than as labels fmsave guessed at.

What the save keeps only in part, or not at all. Of the matches a long career has played, only about a quarter still carry a score; the rest are played fixtures with the result dropped. Injuries older than about two years are gone. Today’s availability, line-ups, staff attribute values, card counts, club debt and asking prices are not stored at all.

Anywhere fmsave cannot read a value it gives you None, never a guess.

Competition names

Competitions carry a database_id, the id every outside name source is keyed on. Supply a map and fmsave fills in name and every denormalised competition_name:

import fmsave

competition_names = fmsave.read_competition_names("competition-names.csv")
with fmsave.open("career.fm", competition_names=competition_names) as career_save:
    for competition in career_save.competitions():
        print(competition.database_id, competition.name)  # 12345 "Example League"

The file is UTF-8, two columns, database_id then name; a leading header row is skipped. Any mapping of database id to name works in its place, and fmsave export --competition-names PATH takes the same file.

Without a map, name and every competition_name is None. About one competition in ten carries no database id and can never be named, and one the game created during a career carries an id no outside source holds.

Which reader has the field you want

The reference lists every record type and every field. If you are not sure a number means what you think it means, read Trusting a number first.