Skip to content

Releases: rhiever/fmsave

fmsave 0.6.0

Choose a tag to compare

@rhiever rhiever released this 25 Oct 00:20
d1ec89d

fmsave 0.6.0 adds Save.player_season_history() and player-season-history exports for retained player statistics from completed seasons. Rows include the existing statistics and computed rates, plus stored year and competition references.

Year and competition metadata remain unconfirmed. Imported history can omit detailed counts, rows retain their stored order, and goalkeeper interpretation uses current natural positions. Large histories can require substantial RAM because the reader materializes every row.

This release also prevents missing player details from being borrowed from following non-player objects and prevents cached failed reads from retaining decompressed sections.

Thanks to thaffy for the archive lead.

Install or update: python -m pip install -U fmsave

fmsave 0.5.11

Choose a tag to compare

@rhiever rhiever released this 19 Oct 19:42
41eb8dd

fmsave 0.5.11 restores omitted cross-border clubs and the dependent data that can now resolve through them, including unique IDs and affiliate-parent links.

Tactics and set-piece validation now accepts club teams without stored tactics blocks. It still rejects unread, ambiguous, duplicate, and inconsistent stored blocks. This release also corrects the sponsorship documentation for ended contracts.

Install or update: python -m pip install -U fmsave

fmsave 0.5.10

Choose a tag to compare

@rhiever rhiever released this 11 Oct 02:34
34d3855

Fixed

  • finances(), sponsorships() and facilities() no longer give a club the data of a club record stored after it that the club scan does not accept, such as a club playing in another nation's league. Such data was reported under the wrong club, or failed finance_clubs_with_two_chains when both clubs stored a series. Other readers are unaffected and no slower.

Refs #20.

Install or update: python -m pip install -U fmsave

fmsave 0.5.9

Choose a tag to compare

@rhiever rhiever released this 10 Oct 22:42
aa7cdbe

Fixed

  • Name pools are found when their header stores nonzero values in a field that most saves leave at zero. Every other header byte, each pool entry and the uniqueness check are still verified.
  • The stage table is found however far it sits from the end of game_db. Longer careers move it further back, which made stages, competitions, fixtures, league tables, competition rules, match stats, stadiums and job vacancies fail.
  • Tactics validation accepts managers who also run national teams, whose tactic blocks the section stores alongside the club's.
  • Newly generated players stored with object kind 3, and newly generated staff whose ability codes are outside the observed code set, are read instead of being dropped.

Refs #20.

Install or update: python -m pip install -U fmsave

fmsave 0.5.8

Choose a tag to compare

@rhiever rhiever released this 07 Oct 18:14
27f024e

Fixed

  • Unrecognized FM26 builds can open saves that use an already observed metadata layout, including older metadata variants, without requiring a build-specific registration.
  • Metadata detection rejects ambiguous or malformed candidates. Other readers retain their existing compatibility checks.

Refs #18.

Install or update: python -m pip install -U fmsave

fmsave 0.5.7

Choose a tag to compare

@rhiever rhiever released this 06 Oct 23:33
629cac2

Fixed

  • Exports accept UTF-8 names longer than 64 bytes, including Korean and Chinese names, with a 1,024-byte safety ceiling and structural checks retained.
  • Injury labels accept Unicode space separators, including fullwidth and nonbreaking spaces. Invalid UTF-8 and control characters remain rejected.

Refs #14.

Install or update: python -m pip install -U fmsave

fmsave 0.5.6

Choose a tag to compare

@rhiever rhiever released this 06 Oct 22:32
064a95a

Fixed

  • Continued careers with variable metadata now open without false build or date errors, including saves using Russian localization.
  • Localized names and larger player and staff populations read without rejecting valid tables.
  • Player, staff and injury readers handle additional record variants; tactics validation accepts the broader valid range.

Refs #5.

Install or update: pip install -U fmsave

fmsave 0.5.5

Choose a tag to compare

@rhiever rhiever released this 04 Oct 19:52

Added

  • player_season_stats() adds possession_lost and non_penalty_expected_goals, with possession_lost_per_90 and non_penalty_expected_goals_per_90. All four are unconfirmed.
  • Saves from build 26.3.1 are read as a known build with the 26.3.2 layouts.
  • Saves from build 26.1.0 read the in-game date, so players, contracts, staff, injuries, finances and most other tables load. Fixtures, league tables, tactics and set pieces still fail their checks there, and the build is still reported as unknown.

Fixed

  • job_vacancies() reads job-centre records that store a list of ids; such saves no longer fail the section size check.
  • set_pieces() reads user routines whose tail flag differs from the usual value instead of merging them into the next routine.
  • finances() validation accepts a club's first month when its oldest row holds the opening balance, as series begun with the career do. Early-career saves no longer fail finance_balance_continuity. New anomaly opening_balance_steps.
  • league_tables() validation applies double_round_robin_divisions only once the fixture calendar shows enough divisions under way, so preseason saves no longer fail it. New anomaly started_calendar_divisions.
  • facilities() counts a club that stores no corporate-facilities rating (a zero in an all-zero block) as unset instead of out of range. Saves tracking many nations no longer fail its checks. New check facility_unset_ratings and anomaly unset_ratings.
  • The "game_info does not match build" error says which build check failed.

Install or update: pip install --upgrade fmsave

fmsave 0.5.4

Choose a tag to compare

@rhiever rhiever released this 30 Sep 20:11

Fixed

  • tactics() reads presets and alternate tactics. tactics() and set_pieces() support more continued careers. Validation checks complete team lists, including empty lists, with tactic_records_count_matching; unrelated tactics cannot fill gaps.
  • stadiums() excludes a spurious ground. Validation drops stadiums.template_rows.
  • staff_lists() keeps valid members beside empty references.
  • Player and staff readers recover missed people, contracts and season-stat joins. Club data no longer appears as staff contracts.
  • Retained contracts without substantive terms no longer count as current paid contracts when registration is absent and no independent current end date exists. Raw chains remain available.
  • competition_rules() recovers missed rounds, including in continued careers. Legacy match_count stays raw and is no longer a verified fixture count.
  • fixtures() recovers missing scores, rejects ambiguous or conflicting joins, keeps distinct fixtures with proven ownership, separates final scores from penalties, and leaves unplayed matches unscored.
  • fixtures() recovers omitted calendar rows, including unplayed and trailing fixtures, corrects played statuses, and excludes proven cached copies. Calendar checks still apply; neutral-venue flags use recovered fixtures.
  • player_match_stats() recovers stored histories with missing team references, excludes unrelated data, and detects incomplete or unresolved histories. Empty output passes validation only when every player explicitly has no stored history. Malformed histories no longer cause repeated scans.
  • suspensions() recovers entries with attached match records when the full list can be read.
  • sponsorships() respects each club's primary list, including empty lists, and retains historical contracts. Other sponsor-shaped data cannot replace an empty or invalid list.

Install or update: pip install --upgrade fmsave

fmsave 0.5.3

Choose a tag to compare

@rhiever rhiever released this 29 Sep 21:59

This patch fixes fixture, staff and set-piece validation warnings in continued careers.

  • Read previously missed set-piece routines and check that all routine groups decode completely.
  • Read complete player records with zero current ability, keeping their contracts out of staff discovery.
  • Distinguish fixture references to team stubs from missing club joins without lowering the join threshold.

The validation checks are now named set_piece_blocks_complete and fixture_club_teams_resolved.

Install with pip install --upgrade fmsave.