PoundforPound Games

API DOCUMENTATION / SAVE FILE

Save File API

Schema 63

Public data-shape reference for Pound for Pound save files.

This document describes the public shape of a Pound for Pound save file. It is intended for tools that inspect save data and for players who want to understand what is stored in a career.

Save editing is unsupported. Back up the original file and close the game before inspecting or changing a save. The schema can change between game versions, and an invalid or inconsistent value may prevent a save from loading.

Compatibility

Game version Save format version Document status
0.7.3 63 Current

This page describes save format version 63. It will be updated as the public save shape changes. Tools should preserve properties they do not recognize and should never change version to bypass migration.

File Location

The game stores saves in Godot's user data directory under Pound for Pound/saves.

Platform Typical directory
Windows %APPDATA%\Godot\app_userdata\Pound for Pound\saves\
Linux and Steam Deck ~/.local/share/godot/app_userdata/Pound for Pound/saves/
macOS ~/Library/Application Support/Godot/app_userdata/Pound for Pound/saves/

The primary file for a slot is <slot>.sav. The game may also create numbered backup files beside it. Operating-system settings and portable installations can change the exact base directory.

File Encoding

Current .sav files contain Brotli-compressed UTF-8 JSON. The data is not encrypted and has no checksum or signature. Older saves may use gzip compression.

JSON value Representation
Property names camelCase and case-sensitive
IDs GUID strings
Dates ISO 8601 strings
Durations .NET TimeSpan strings such as 00:03:45
Enum values Usually camel-cased strings
Lists and sets JSON arrays
Dictionaries JSON objects keyed by an ID or name
Optional values Omitted or null, depending on the property

Unknown properties are generally ignored by the game. Unknown enum values, missing references, and invalid nested objects may not be recoverable, so consumers should treat the document as a shape reference rather than a validation guarantee.

Top-Level Shape

interface SaveFile {
  version: number;
  savedAt: string;
  summary: SaveSlotSummary;
  gameState: GameState;
}

interface SaveSlotSummary {
  promotionName: string;
  week: number;
  year: number;
  nextEventName?: string;
  nextEventDate?: string;
}
Property Type Meaning
version number Save schema version. Current value: 63.
savedAt string UTC timestamp of the save operation.
summary SaveSlotSummary Display information used by the save selector.
gameState GameState The complete career and world state.

The summary is display metadata. Career data lives under gameState.

SaveSlotSummary

Property Type Meaning
promotionName string Player promotion name shown in the save selector.
week number Saved in-game week.
year number Saved in-game year.
nextEventName string | undefined Next event name, when one is scheduled.
nextEventDate string | undefined Next event date, when one is scheduled.

GameState

interface GameState {
  currentDate: GameDate;
  promotions: Promotion[];
  allFighters: Fighter[];
  gyms: Gym[];
  coaches: Coach[];
  fightCamps: FightCamp[];
  contracts: Record<string, Contract>;
  freeAgentIds: string[];
  scheduledEvents: Event[];
  eventHistory: Event[];
  hallOfFame: HallOfFameInductee[];
  news: NewsRepository;
  narratives: NarrativeRepository;
  tokenLedger: TokenLedger;
  wireFeed: WireFeed;
  imagePackId: string;
  womensDivisionsEnabled: boolean;
  tutorialsEnabled: boolean;
  enabledWeightClassIds: string[];
}

GameState contains additional state used by current game systems. The properties below are the main entry points for tools reading a career.

Property Type Meaning
currentDate GameDate Current in-game week and year.
promotions Promotion[] Every promotion in the career.
allFighters Fighter[] Active, free-agent, and retired fighters.
gyms Gym[] Gyms in the generated world.
coaches Coach[] Coaches in the generated world.
fightCamps FightCamp[] Stored fight-camp records.
contracts Record<string, Contract> Contracts keyed by fighter ID.
freeAgentIds string[] IDs of fighters currently in free agency.
scheduledEvents Event[] Upcoming events.
eventHistory Event[] Completed events.
hallOfFame HallOfFameInductee[] Hall of Fame entries.
news NewsRepository Stored news items.
narratives NarrativeRepository Stored narrative records.
tokenLedger TokenLedger Promotional Capital transaction records.
wireFeed WireFeed Persistent feed items.
imagePackId string Image pack selected for the career.
womensDivisionsEnabled boolean Whether women's divisions are enabled.
tutorialsEnabled boolean Whether tutorials are enabled.
enabledWeightClassIds string[] IDs of divisions enabled for the career.

GameDate

interface GameDate {
  week: number;
  year: number;
  totalWeeks: number;
}
Property Type Meaning
week number Week within the current game year.
year number Current game year.
totalWeeks number Absolute week value emitted with the date.

Fighter

interface Fighter {
  id: string;
  firstName: string;
  lastName: string;
  nickname?: string;
  nationality: string;
  dateOfBirth: string;
  gender: string;
  stats: FighterStats;
  record: FighterRecord;
  status: string;
  currentPromotionId?: string;
  currentContractId?: string;
  currentWeightClass?: WeightClass;
  imagePath?: string;
}
Property Type Meaning
id string Fighter GUID.
firstName string First name.
lastName string Last name.
nickname string | undefined Optional nickname.
nationality string Nationality value.
dateOfBirth string Date of birth.
gender string Serialized gender enum.
stats FighterStats Stored ability attributes.
record FighterRecord Record totals and fight history.
status string Serialized career status.
currentPromotionId string | undefined Current promotion GUID, when assigned.
currentContractId string | undefined Current contract GUID, when assigned.
currentWeightClass WeightClass | undefined Current division value.
imagePath string | undefined Selected fighter-image path.

FighterStats

All stored fighter stats are numbers. Current saves include the following properties:

interface FighterStats {
  punching: number;
  kicking: number;
  kneeElbow: number;
  clinchStriking: number;
  wrestling: number;
  takedownDefense: number;
  clinchControl: number;
  topControl: number;
  bottomGame: number;
  submissions: number;
  submissionDefense: number;
  wrestlingIntent: number;
  speed: number;
  strength: number;
  cardio: number;
  durability: number;
  recovery: number;
  heart: number;
  composure: number;
  killerInstinct: number;
  fightIQ: number;
  ceiling: number;
  growthRate: number;
}
Property Type Meaning
punching number Stored punching attribute.
kicking number Stored kicking attribute.
kneeElbow number Stored knee-and-elbow attribute.
clinchStriking number Stored clinch-striking attribute.
wrestling number Stored wrestling attribute.
takedownDefense number Stored takedown-defense attribute.
clinchControl number Stored clinch-control attribute.
topControl number Stored top-control attribute.
bottomGame number Stored bottom-game attribute.
submissions number Stored submission attribute.
submissionDefense number Stored submission-defense attribute.
wrestlingIntent number Stored wrestling-intent attribute.
speed number Stored speed attribute.
strength number Stored strength attribute.
cardio number Stored cardio attribute.
durability number Stored durability attribute.
recovery number Stored recovery attribute.
heart number Stored heart attribute.
composure number Stored composure attribute.
killerInstinct number Stored killer-instinct attribute.
fightIQ number Stored fight-IQ attribute.
ceiling number Stored ceiling attribute.
growthRate number Stored growth-rate attribute.

FighterRecord

interface FighterRecord {
  wins: number;
  losses: number;
  draws: number;
  noContests: number;
  koWins: number;
  submissionWins: number;
  decisionWins: number;
  koLosses: number;
  submissionLosses: number;
  decisionLosses: number;
  fightHistory: FightHistoryEntry[];
}

Record totals and fightHistory are both stored in the save.

Property Type Meaning
wins number Total wins.
losses number Total losses.
draws number Total draws.
noContests number Total no contests.
koWins number Wins by knockout or technical knockout.
submissionWins number Wins by submission.
decisionWins number Wins by decision.
koLosses number Losses by knockout or technical knockout.
submissionLosses number Losses by submission.
decisionLosses number Losses by decision.
fightHistory FightHistoryEntry[] Stored fight-history entries.

Promotion

interface Promotion {
  id: string;
  name: string;
  abbreviation: string;
  isPlayerControlled: boolean;
  prestige: number;
  tokens: number;
  roster: string[];
  titles: Title[];
  supportedWeightClasses: WeightClass[];
  ownedUnlocks: string[];
  completedMilestones: string[];
  tvDeal?: TvDeal;
  sponsorContracts: SponsorContract[];
}
Property Type Meaning
id string Promotion GUID.
name string Full promotion name.
abbreviation string Short promotion name.
isPlayerControlled boolean Identifies the player's promotion.
prestige number Stored prestige value.
tokens number Promotional Capital balance.
roster string[] Fighter IDs on the roster.
titles Title[] Promotion championships.
supportedWeightClasses WeightClass[] Divisions supported by the promotion.
ownedUnlocks string[] IDs of owned progression unlocks.
completedMilestones string[] IDs of completed milestones.
tvDeal TvDeal | undefined Current television deal, when present.
sponsorContracts SponsorContract[] Stored sponsor contracts.

Contract

Contracts are stored in gameState.contracts, keyed by fighter ID.

interface Contract {
  id: string;
  fighterId: string;
  promotionId: string;
  fightsRemaining: number;
  totalFights: number;
  startDate: string;
  endDate?: string;
  exclusive: boolean;
  status: string;
  signingCost: number;
  signedWeek: number;
  signedYear: number;
}
Property Type Meaning
id string Contract GUID.
fighterId string Fighter GUID.
promotionId string Promotion GUID.
fightsRemaining number Contracted fights remaining.
totalFights number Total fight slots in the current contract term.
startDate string Contract start date.
endDate string | undefined Contract end date, when present.
exclusive boolean Whether the contract is exclusive.
status string Serialized contract status.
signingCost number Stored signing cost.
signedWeek number Week when the contract was signed.
signedYear number Year when the contract was signed.

Event

Upcoming events are stored in scheduledEvents; completed events are stored in eventHistory.

interface Event {
  id: string;
  promotionId: string;
  name: string;
  date: string;
  status: string;
  venueId?: string;
  cityId?: string;
  card: Bout[];
  sponsorSelections: EventSponsorSelection[];
}
Property Type Meaning
id string Event GUID.
promotionId string Owning promotion GUID.
name string Event name.
date string Scheduled event date.
status string Serialized event status.
venueId string | undefined Venue ID, when assigned.
cityId string | undefined City ID, when assigned.
card Bout[] Bouts booked on the event.
sponsorSelections EventSponsorSelection[] Sponsor selections stored with the event.

Bout

interface Bout {
  id: string;
  eventId: string;
  fighter1Id: string;
  fighter2Id: string;
  weightClass: WeightClass;
  scheduledRounds: number;
  isTitleFight: boolean;
  titleId?: string;
  status: string;
  result?: FightResult;
}
Property Type Meaning
id string Bout GUID.
eventId string Parent event GUID.
fighter1Id string First fighter GUID.
fighter2Id string Second fighter GUID.
weightClass WeightClass Bout division.
scheduledRounds number Scheduled round count.
isTitleFight boolean Whether the bout is for a title.
titleId string | undefined Title GUID, when applicable.
status string Serialized bout status.
result FightResult | undefined Completed result, when available.

FightResult

interface FightResult {
  winnerId?: string;
  loserId?: string;
  method: string;
  endingRound: number;
  endingTime: string;
  submissionType?: string;
  stats?: FightStats;
  scorecards?: ScorePair[];
}

interface ScorePair {
  f1: number;
  f2: number;
}
Property Type Meaning
winnerId string | undefined Winner GUID; omitted for draws and no contests.
loserId string | undefined Loser GUID; omitted for draws and no contests.
method string Serialized result method.
endingRound number Round in which the fight ended.
endingTime string Time within the ending round.
submissionType string | undefined Submission description, when applicable.
stats FightStats | undefined Stored aggregate fight statistics.
scorecards ScorePair[] | undefined Final judge totals, when available.

WeightClass

interface WeightClass {
  id: string;
  name: string;
  minWeight: number;
  maxWeight: number;
  gender: string;
  isActive: boolean;
}
Property Type Meaning
id string Serialized division ID.
name string Display name.
minWeight number Minimum weight in pounds.
maxWeight number Maximum weight in pounds.
gender string Serialized gender enum.
isActive boolean Whether the division is active.

Entity References

Large entities are stored once and connected by GUID. Consumers should preserve those references and unknown properties when reading and writing data.

Reference Target
promotion.roster[] gameState.allFighters[].id
fighter.currentPromotionId gameState.promotions[].id
fighter.currentContractId gameState.contracts.*.id
contract.fighterId gameState.allFighters[].id
contract.promotionId gameState.promotions[].id
event.promotionId gameState.promotions[].id
bout.eventId Parent event id
bout.fighter1Id / fighter2Id gameState.allFighters[].id
bout.titleId A promotion title id

Changing or removing an ID without updating its references can make the save inconsistent.