theHunter: Call of the Wild is a hunting simulator, which - unfortunately - has some characteristics of a typical first-person shooter, namely missions, rewards and locked equipment. Since this prevents actual hunting, I thought it would be interesting to analyse the file format that saves level, XP, cash and so on.
I wrote a fairly generic tool called laymanshex that takes a partial file description and a binary file as input and outputs the values. Values can be changed with the ‘-set’ argument.
For example:
% ./laymanshex thp_player_profile_adf.layhex thp_player_profile_adf
Level = 19
XP = 20235
SkillPoints = 0
PerkPoints = 0
SkillPointsSpent = 7
PerkPointsSpent = 6
Cash = 16640
RifleLevel = 14
HandgunLevel = 4
ShotgunLevel = 4
BowLevel = 1
RifleScore = 1992
HandgunScore = 382
ShotgunScore = 417
BowScore = 0
% ./laymanshex -set="Level=60,XP=100000" thp_player_profile_adf.layhex thp_player_profile_adf
Created backup thp_player_profile_adf.bak20200426231811
Level = 60
XP = 100000
SkillPoints = 0
PerkPoints = 0
SkillPointsSpent = 7
PerkPointsSpent = 6
Cash = 16640
RifleLevel = 14
HandgunLevel = 4
ShotgunLevel = 4
BowLevel = 1
RifleScore = 1992
HandgunScore = 382
ShotgunScore = 417
BowScore = 0
% ./laymanshex -set="Cash=0x7FFFFFFF" thp_player_profile_adf.layhex thp_player_profile_adf | grep Cash
Cash = 2147483647
The partial file description for thp_player_profile_adf (COTW version 1.49) looks like this:
little endian
: byte[113]
Level : int32
XP : int32
SkillPoints : int32
PerkPoints : int32
SkillPointsSpent : int32
: byte[60]
PerkPointsSpent : int32
: byte[60]
Cash : int32
RifleLevel : int32
HandgunLevel : int32
ShotgunLevel : int32
BowLevel : int32
RifleScore : int32
HandgunScore : int32
ShotgunScore : int32
BowScore : int32
Go sources can be found in the laymanshex git repo and possible further file descriptions in the laymanshex-files git repo.
The file format of COTW saves has changed many times in the past and I assume it will again at some point in the future.