Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions README_breaking_changes.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,50 @@
## v.1005 from 2026-08-10

- CAERadioTrackManager refector
- Updated field names and offset validation of CAERadioTrackManager class and structs based on reversed classes.
* **Structure: `tRadioSettings`**
* `m_djIndex[4]` & `field_10` replaced with `TrackQueue[5]`
* `trackId` renamed to `CurrTrackID`
* `field_18` renamed to `PrevTrackID`
* `trackPlayTime` renamed to `PlayTime`
* `trackLength` renamed to `TrackLengthMs`
* `field_24` renamed to `TrackFlags`
* `_pad` renamed to `_pad27`
* `currRadioBC_[4]` & `field_30` replaced with `TrackTypes[5]`
* `field_31` renamed to `CurrTrackType`
* `m_musicTrackIndices[10]` replaced with `PrevTrackType`, `TrackIndices[5]`, `CurrTrackIdx`, `PrevTrackIdx`, and `_pad[2]`

* **Structure: `tRadioStationData`**
* `field_0`, `field_4`, `field_8` replaced with `m_aElapsed[3]`
* `m_nTimeRetuneStopped` renamed to `m_iTimeInPauseModeInMs`
* `lastPlayingTime` renamed to `m_iTimeInMs`
* `trackPlayTime` renamed to `m_iTrackPlayTime`
* `field_18`, `field_1C`, `field_20` replaced with `m_aTrackQueue[3]`
* `field_24`, `field_25`, `field_26` replaced with `m_aTrackTypes[3]`
* `lastGameClockDays` renamed to `m_nGameClockDays`
* `lastGameClockHours` renamed to `m_nGameClockHours`

* **Structure: `CAERadioTrackManager`**
* `field_0` replaced with `m_bInitialised`
* `field_1` replaced with `m_bDisplayStationName`
* `field_2` replaced with `m_prev`
* `field_3` replaced with `m_bEnabledInPauseMode`
* `field_4` replaced with `m_bBassEnhance`
* `field_5` replaced with `m_bPauseMode`
* `field_8[14]` renamed to `m_nTracksInARow[14]`
* `m_nMonthDay` renamed to `m_nSavedGameClockDays`
* `m_nClockHours` renamed to `m_nSavedGameClockHours`
* `m_anPlayerStats[14]` renamed to `m_aListenTimes[14]`
* `field_58` renamed to `m_nSavedTimeMs`
* `field_5C` renamed to `m_nRetuneStartedTime`
* `field_64` renamed to `m_HwClientHandle`
* `field_68` renamed to `m_nMode`
* `field_74` replaced with `m_nSavedRadioStationId`
* `field_78` replaced with `m_iRadioStationMenuRequest`
* `field_7C` replaced with `m_iRadioStationScriptRequest`
* `field_80` replaced with `m_f80`
* `field_84` replaced with `m_f84`

## v.1004 from 2026-04-18

- III, VC, SA enums refactor
Expand Down
183 changes: 86 additions & 97 deletions plugin_sa/game_sa/CAERadioTrackManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,69 +10,61 @@
#include "CAEVehicleAudioEntity.h"

struct PLUGIN_API tRadioSettings {
int m_djIndex[4];
int field_10;
int trackId;
int field_18;
int trackPlayTime;
int trackLength;
char field_24;
char m_nCurrentRadioStation;
int TrackQueue[5];
int CurrTrackID;
int PrevTrackID;
int PlayTime;
int TrackLengthMs;
char TrackFlags;
eRadioID m_nCurrentRadioStation;
char m_nBassSet;
char _pad;
char _pad27;
float m_fBassGain;
char currRadioBC_[4];
char field_30;
char field_31;
char m_musicTrackIndices[10];
char TrackTypes[5];
char CurrTrackType;
char PrevTrackType;
char TrackIndices[5];
char CurrTrackIdx;
char PrevTrackIdx;
char _pad[2];
};
VALIDATE_OFFSET(tRadioSettings, m_djIndex, 0x0);
VALIDATE_OFFSET(tRadioSettings, field_10, 0x10);
VALIDATE_OFFSET(tRadioSettings, trackId, 0x14);
VALIDATE_OFFSET(tRadioSettings, field_18, 0x18);
VALIDATE_OFFSET(tRadioSettings, trackPlayTime, 0x1C);
VALIDATE_OFFSET(tRadioSettings, trackLength, 0x20);
VALIDATE_OFFSET(tRadioSettings, field_24, 0x24);
VALIDATE_OFFSET(tRadioSettings, TrackQueue, 0x0);
VALIDATE_OFFSET(tRadioSettings, CurrTrackID, 0x14);
VALIDATE_OFFSET(tRadioSettings, PrevTrackID, 0x18);
VALIDATE_OFFSET(tRadioSettings, PlayTime, 0x1C);
VALIDATE_OFFSET(tRadioSettings, TrackLengthMs, 0x20);
VALIDATE_OFFSET(tRadioSettings, TrackFlags, 0x24);
VALIDATE_OFFSET(tRadioSettings, m_nCurrentRadioStation, 0x25);
VALIDATE_OFFSET(tRadioSettings, m_nBassSet, 0x26);
VALIDATE_OFFSET(tRadioSettings, _pad, 0x27);
VALIDATE_OFFSET(tRadioSettings, _pad27, 0x27);
VALIDATE_OFFSET(tRadioSettings, m_fBassGain, 0x28);
VALIDATE_OFFSET(tRadioSettings, currRadioBC_, 0x2C);
VALIDATE_OFFSET(tRadioSettings, field_30, 0x30);
VALIDATE_OFFSET(tRadioSettings, field_31, 0x31);
VALIDATE_OFFSET(tRadioSettings, m_musicTrackIndices, 0x32);
VALIDATE_OFFSET(tRadioSettings, TrackTypes, 0x2C);
VALIDATE_OFFSET(tRadioSettings, CurrTrackType, 0x31);
VALIDATE_OFFSET(tRadioSettings, PrevTrackType, 0x32);
VALIDATE_OFFSET(tRadioSettings, TrackIndices, 0x33);
VALIDATE_OFFSET(tRadioSettings, CurrTrackIdx, 0x38);
VALIDATE_OFFSET(tRadioSettings, PrevTrackIdx, 0x39);
VALIDATE_OFFSET(tRadioSettings, _pad, 0x3A);
VALIDATE_SIZE(tRadioSettings, 0x3C);

struct PLUGIN_API tRadioStationData {
int field_0;
int field_4;
int field_8;
int m_nTimeRetuneStopped;
int lastPlayingTime;
int trackPlayTime;
int field_18;
int field_1C;
int field_20;
char field_24;
char field_25;
char field_26;
char lastGameClockDays;
int lastGameClockHours;
int m_aElapsed[3];
int m_iTimeInPauseModeInMs;
int m_iTimeInMs;
int m_iTrackPlayTime;
int m_aTrackQueue[3];
char m_aTrackTypes[3];
char m_nGameClockDays;
int m_nGameClockHours;
};
VALIDATE_OFFSET(tRadioStationData, field_0, 0x0);
VALIDATE_OFFSET(tRadioStationData, field_4, 0x4);
VALIDATE_OFFSET(tRadioStationData, field_8, 0x8);
VALIDATE_OFFSET(tRadioStationData, m_nTimeRetuneStopped, 0xC);
VALIDATE_OFFSET(tRadioStationData, lastPlayingTime, 0x10);
VALIDATE_OFFSET(tRadioStationData, trackPlayTime, 0x14);
VALIDATE_OFFSET(tRadioStationData, field_18, 0x18);
VALIDATE_OFFSET(tRadioStationData, field_1C, 0x1C);
VALIDATE_OFFSET(tRadioStationData, field_20, 0x20);
VALIDATE_OFFSET(tRadioStationData, field_24, 0x24);
VALIDATE_OFFSET(tRadioStationData, field_25, 0x25);
VALIDATE_OFFSET(tRadioStationData, field_26, 0x26);
VALIDATE_OFFSET(tRadioStationData, lastGameClockDays, 0x27);
VALIDATE_OFFSET(tRadioStationData, lastGameClockHours, 0x28);
VALIDATE_OFFSET(tRadioStationData, m_aElapsed, 0x0);
VALIDATE_OFFSET(tRadioStationData, m_iTimeInPauseModeInMs, 0xC);
VALIDATE_OFFSET(tRadioStationData, m_iTimeInMs, 0x10);
VALIDATE_OFFSET(tRadioStationData, m_iTrackPlayTime, 0x14);
VALIDATE_OFFSET(tRadioStationData, m_aTrackQueue, 0x18);
VALIDATE_OFFSET(tRadioStationData, m_aTrackTypes, 0x24);
VALIDATE_OFFSET(tRadioStationData, m_nGameClockDays, 0x27);
VALIDATE_OFFSET(tRadioStationData, m_nGameClockHours, 0x28);
VALIDATE_SIZE(tRadioStationData, 0x2C);

struct PLUGIN_API tMusicTrackHistory {
Expand All @@ -83,32 +75,32 @@ VALIDATE_SIZE(tMusicTrackHistory, 0x14);

class PLUGIN_API CAERadioTrackManager {
public:
unsigned char field_0;
unsigned char field_1;
unsigned char field_2;
unsigned char field_3;
unsigned char field_4;
unsigned char field_5;
bool m_bInitialised;
bool m_bDisplayStationName;
char m_prev;
bool m_bEnabledInPauseMode;
bool m_bBassEnhance;
bool m_bPauseMode;
bool m_bRetuneJustStarted;
bool m_bRadioAutoSelect;
char field_8[14];
unsigned char m_nMonthDay;
unsigned char m_nClockHours;
int m_anPlayerStats[14];
char m_nTracksInARow[14];
unsigned char m_nSavedGameClockDays;
unsigned char m_nSavedGameClockHours;
int m_aListenTimes[14];
unsigned int m_nTimeRadioStationRetuned;
unsigned int m_nTimeToDisplayRadioName;
int field_58;
int field_5C;
int m_nSavedTimeMs;
int m_nRetuneStartedTime;
int field_60;
int field_64;
int field_68;
int m_HwClientHandle;
int m_nMode;
int m_nStationsListed;
int m_nStationsListDown;
unsigned long field_74;
unsigned long field_78;
unsigned long field_7C;
unsigned long field_80;
unsigned long field_84;
int m_nSavedRadioStationId;
int m_iRadioStationMenuRequest;
int m_iRadioStationScriptRequest;
float m_f80;
float m_f84;
tRadioSettings m_TempSettings;
tRadioSettings m_Settings;
tRadioStationData m_RadioStationsData[13];
Expand All @@ -120,42 +112,41 @@ class PLUGIN_API CAERadioTrackManager {

public:
bool IsVehicleRadioActive();
char *GetRadioStationName(signed char id);
char* GetRadioStationName(signed char id);
void StartRadio(int stationId, float bass, int arg, char unused);
void StopRadio(tVehicleAudioSettings* settings, char arg);

static void Load();
static void Save();

// 11 structures
static tMusicTrackHistory *m_nMusicTrackIndexHistory;
static tMusicTrackHistory* m_nMusicTrackIndexHistory;
};
VALIDATE_OFFSET(CAERadioTrackManager, field_0, 0x0);
VALIDATE_OFFSET(CAERadioTrackManager, field_1, 0x1);
VALIDATE_OFFSET(CAERadioTrackManager, field_2, 0x2);
VALIDATE_OFFSET(CAERadioTrackManager, field_3, 0x3);
VALIDATE_OFFSET(CAERadioTrackManager, field_4, 0x4);
VALIDATE_OFFSET(CAERadioTrackManager, field_5, 0x5);
VALIDATE_OFFSET(CAERadioTrackManager, m_bInitialised, 0x0);
VALIDATE_OFFSET(CAERadioTrackManager, m_bDisplayStationName, 0x1);
VALIDATE_OFFSET(CAERadioTrackManager, m_prev, 0x2);
VALIDATE_OFFSET(CAERadioTrackManager, m_bEnabledInPauseMode, 0x3);
VALIDATE_OFFSET(CAERadioTrackManager, m_bBassEnhance, 0x4);
VALIDATE_OFFSET(CAERadioTrackManager, m_bPauseMode, 0x5);
VALIDATE_OFFSET(CAERadioTrackManager, m_bRetuneJustStarted, 0x6);
VALIDATE_OFFSET(CAERadioTrackManager, m_bRadioAutoSelect, 0x7);
VALIDATE_OFFSET(CAERadioTrackManager, field_8, 0x8);
VALIDATE_OFFSET(CAERadioTrackManager, m_nMonthDay, 0x16);
VALIDATE_OFFSET(CAERadioTrackManager, m_nClockHours, 0x17);
VALIDATE_OFFSET(CAERadioTrackManager, m_anPlayerStats, 0x18);
VALIDATE_OFFSET(CAERadioTrackManager, m_nTracksInARow, 0x8);
VALIDATE_OFFSET(CAERadioTrackManager, m_nSavedGameClockDays, 0x16);
VALIDATE_OFFSET(CAERadioTrackManager, m_nSavedGameClockHours, 0x17);
VALIDATE_OFFSET(CAERadioTrackManager, m_aListenTimes, 0x18);
VALIDATE_OFFSET(CAERadioTrackManager, m_nTimeRadioStationRetuned, 0x50);
VALIDATE_OFFSET(CAERadioTrackManager, m_nTimeToDisplayRadioName, 0x54);
VALIDATE_OFFSET(CAERadioTrackManager, field_58, 0x58);
VALIDATE_OFFSET(CAERadioTrackManager, field_5C, 0x5C);
VALIDATE_OFFSET(CAERadioTrackManager, m_nSavedTimeMs, 0x58);
VALIDATE_OFFSET(CAERadioTrackManager, m_nRetuneStartedTime, 0x5C);
VALIDATE_OFFSET(CAERadioTrackManager, field_60, 0x60);
VALIDATE_OFFSET(CAERadioTrackManager, field_64, 0x64);
VALIDATE_OFFSET(CAERadioTrackManager, field_68, 0x68);
VALIDATE_OFFSET(CAERadioTrackManager, m_HwClientHandle, 0x64);
VALIDATE_OFFSET(CAERadioTrackManager, m_nMode, 0x68);
VALIDATE_OFFSET(CAERadioTrackManager, m_nStationsListed, 0x6C);
VALIDATE_OFFSET(CAERadioTrackManager, m_nStationsListDown, 0x70);
VALIDATE_OFFSET(CAERadioTrackManager, field_74, 0x74);
VALIDATE_OFFSET(CAERadioTrackManager, field_78, 0x78);
VALIDATE_OFFSET(CAERadioTrackManager, field_7C, 0x7C);
VALIDATE_OFFSET(CAERadioTrackManager, field_80, 0x80);
VALIDATE_OFFSET(CAERadioTrackManager, field_84, 0x84);
VALIDATE_OFFSET(CAERadioTrackManager, m_nSavedRadioStationId, 0x74);
VALIDATE_OFFSET(CAERadioTrackManager, m_iRadioStationMenuRequest, 0x78);
VALIDATE_OFFSET(CAERadioTrackManager, m_iRadioStationScriptRequest, 0x7C);
VALIDATE_OFFSET(CAERadioTrackManager, m_f80, 0x80);
VALIDATE_OFFSET(CAERadioTrackManager, m_f84, 0x84);
VALIDATE_OFFSET(CAERadioTrackManager, m_TempSettings, 0x88);
VALIDATE_OFFSET(CAERadioTrackManager, m_Settings, 0xC4);
VALIDATE_OFFSET(CAERadioTrackManager, m_RadioStationsData, 0x100);
Expand All @@ -166,6 +157,4 @@ VALIDATE_OFFSET(CAERadioTrackManager, field_36C, 0x36C);
VALIDATE_OFFSET(CAERadioTrackManager, field_36D, 0x36D);
VALIDATE_SIZE(CAERadioTrackManager, 0x370);

extern CAERadioTrackManager &AERadioTrackManager;

VALIDATE_SIZE(CAERadioTrackManager, 0x370);
extern CAERadioTrackManager& AERadioTrackManager;