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. |
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.