Since the game is open-source, you can poke around the source code files and at the very least figure out how things should be sorted around memory.
For instance, if you look at the player struct found inside the
player.h header file:
[Link]
Code: Select all
struct Player {
//...
int _pNumInv;
int _pStrength;
int _pBaseStr;
int _pMagic;
int _pBaseMag;
int _pDexterity;
int _pBaseDex;
int _pVitality;
int _pBaseVit;
int _pStatPts;
int _pDamageMod;
int _pBaseToBlk;
int _pHPBase;
int _pMaxHPBase;
int _pHitPoints;
int _pMaxHP;
int _pHPPer;
int _pManaBase;
int _pMaxManaBase;
int _pMana;
int _pMaxMana;
int _pManaPer;
int _pIMinDam;
int _pIMaxDam;
int _pIAC;
int _pIBonusDam;
int _pIBonusToHit;
int _pIBonusAC;
int _pIBonusDamMod;
int _pIGetHit;
int _pIEnAc;
int _pIFMinDam;
int _pIFMaxDam;
int _pILMinDam;
int _pILMaxDam;
uint32_t _pExperience;
PLR_MODE _pmode;
int8_t walkpath[MaxPathLength];
bool plractive;
action_id destAction;
int destParam1;
int destParam2;
int destParam3;
int destParam4;
int _pGold;
..you can see the order in which the player object is built. In other words, you can save a lot of work if you only find one working pointer, say, for your current strength value. Once you find one pointer successfully, you can derive that the next value in memory is BaseStr, then Magic, then BaseMagic, etc. always shifted by two bytes or 0x4 (Cheat Engine's default step size, if you click on the offset arrow left and right of an offset in the Change Address window).
Of course this is not always true, but generally. So, one good pointer and you can already deduce 80% of my table for an inevitable future update
And the pointers of this table most certainly won't withstand another major release.
So far, it's unclear if anything works in its current state for anyone else to begin with