It seems to me (although I'm bad at RE), they have gathered most SNOs into one big SNOGroup called "Global". I ran a program to list all the SNOGroup lists and this is what came out:
Code:
[0] {Name=0x00c8e848 "Global" Limit=32768 SizeOf=20 ...}
[1] {Name=0x00c8e9b8 "ShaderMap Def" Limit=1024 SizeOf=20 ...}
[2] {Name=0x00c8eb28 "Global" Limit=32768 SizeOf=20 ...}
[3] {Name=0x00c8ec98 "Global" Limit=32768 SizeOf=20 ...}
[4] {Name=0x00c8ee08 "Globals Def" Limit=1 SizeOf=20 ...}
[5] {Name=0x00c8ef78 "Observer Def" Limit=64 SizeOf=20 ...}
[6] {Name=0x00c8f0e8 "Global" Limit=32768 SizeOf=20 ...}
[7] {Name=0x00c8f258 "Global" Limit=32768 SizeOf=20 ...}
[8] {Name=0x00c8f3c8 "Global" Limit=32768 SizeOf=20 ...}
[9] {Name=0x00c8f538 "AnimSet Def" Limit=2359 SizeOf=20 ...}
[10] {Name=0x00c8f6a8 "Global" Limit=32768 SizeOf=20 ...}
[11] {Name=0x00c8f818 "Global" Limit=32768 SizeOf=20 ...}
[12] {Name=0x00c8f988 "Global" Limit=32768 SizeOf=20 ...}
[13] {Name=0x00c8faf8 "Global" Limit=32768 SizeOf=20 ...}
[14] {Name=0x00c8fc68 "Global" Limit=32768 SizeOf=20 ...}
[15] {Name=0x00c8fdd8 "GameBalance Def" Limit=128 SizeOf=20 ...}
[16] {Name=0x00c8ff48 "Encounter Def" Limit=369 SizeOf=20 ...}
[17] {Name=0x00c900b8 "Adventure Def" Limit=578 SizeOf=20 ...}
[18] {Name=0x00c90228 "Global" Limit=32768 SizeOf=20 ...}
[19] {Name=0x00c90398 "ConversationList Def" Limit=32 SizeOf=20 ...}
[20] {Name=0x00c90508 "FlagSet Def" Limit=8 SizeOf=20 ...}
[21] {Name=0x00c90678 "SceneGroup Def" Limit=128 SizeOf=20 ...}
[22] {Name=0x00c907e8 "Global" Limit=32768 SizeOf=20 ...}
[23] {Name=0x00c90958 "Quest Def" Limit=1024 SizeOf=20 ...}
[24] {Name=0x00c90ac8 "QuestRange Def" Limit=1334 SizeOf=20 ...}
[25] {Name=0x00c90c38 "SkillKit Def" Limit=128 SizeOf=20 ...}
[26] {Name=0x00c90da8 "Global" Limit=32768 SizeOf=20 ...}
[27] {Name=0x00c90f18 "Recipe Def" Limit=598 SizeOf=20 ...}
[28] {Name=0x00c91088 "TimedEvent Def" Limit=1024 SizeOf=20 ...}
[29] {Name=0x00c911f8 "Act Def" Limit=7 SizeOf=20 ...}
[30] {Name=0x00c91368 "Lore Def" Limit=401 SizeOf=20 ...}
[31] {Name=0x00c914d8 "Global" Limit=32768 SizeOf=20 ...}
[32] {Name=0x00c91648 "Global" Limit=32768 SizeOf=20 ...}
[33] {Name=0x00c917b8 "Global" Limit=32768 SizeOf=20 ...}
[34] {Name=0x00c91928 "BossEncounter Def" Limit=64 SizeOf=20 ...}
[35] {Name=0x00c91a98 "Tutorial Def" Limit=256 SizeOf=20 ...}
[36] {Name=0x00c91c08 "Accolade Def" Limit=256 SizeOf=20 ...}
[37] {Name=0x00c91d78 "AmbientSound Def" Limit=849 SizeOf=20 ...}
[38] {Name=0x00c91ee8 "Physics Def" Limit=128 SizeOf=20 ...}
[39] {Name=0x00c92058 "Explosion Def" Limit=500 SizeOf=20 ...}
[40] {Name=0x00c921c8 "Surface Def" Limit=128 SizeOf=20 ...}
[41] {Name=0x00c92338 "Global" Limit=32768 SizeOf=20 ...}
[42] {Name=0x00c924a8 "Cloth Def" Limit=128 SizeOf=20 ...}
[43] {Name=0x00c92618 "Global" Limit=32768 SizeOf=20 ...}
[44] {Name=0x00c92788 "Global" Limit=32768 SizeOf=20 ...}
[45] {Name=0x00c928f8 "Font Def" Limit=64 SizeOf=20 ...}
[46] {Name=0x00c92a68 "Anim2D Def" Limit=256 SizeOf=20 ...}
[47] {Name=0x00c92bd8 "Shaders Def" Limit=1313 SizeOf=20 ...}
[48] {Name=0x00c92d48 "Global" Limit=32768 SizeOf=20 ...}
[49] {Name=0x00c92eb8 "Global" Limit=32768 SizeOf=20 ...}
[50] {Name=0x00c93028 "Global" Limit=32768 SizeOf=20 ...}
[51] {Name=0x00c93198 "Global" Limit=32768 SizeOf=20 ...}
[52] {Name=0x00c93308 "Global" Limit=32768 SizeOf=20 ...}
[53] {Name=0x00c93478 "Global" Limit=32768 SizeOf=20 ...}
[54] {Name=0x00c935e8 "Weather Def" Limit=504 SizeOf=20 ...}
[55] {Name=0x00c93758 "Global" Limit=32768 SizeOf=20 ...}
[56] {Name=0x00c938c8 "Vibrations Def" Limit=32 SizeOf=20 ...}
[57] {Name=0x00c93a38 "Global" Limit=32768 SizeOf=20 ...}
[58] {Name=0x00c93ba8 "Reverb Def" Limit=128 SizeOf=20 ...}
[59] {Name=0x00c93d18 "AnimTree Def" Limit=256 SizeOf=20 ...}
Started at 0x01a7c14c (SnoGroup pointers as enigma32 explained with 2.0.3 offset)
its worth pointing out that I'm reading [[[[0x1a7c14c]]] + 0x20] if that make sense. However reading [[[[0x1a7c14c]]] + 0x24] gives the old list names but with "empty" lists.
Like so:
Code:
[0] {Name=0x00827a50 "Textures Def" Limit=64 SizeOf=24 ...}
[1] {Name=0x00827bc0 "Textures Def" Limit=64 SizeOf=24 ...}
[2] {Name=0x00827d30 "Appearance Def" Limit=64 SizeOf=24 ...}
[3] {Name=0x00827ea0 "PhysMesh Def" Limit=64 SizeOf=24 ...}
[4] {Name=0x00828010 "PhysMesh Def" Limit=64 SizeOf=24 ...}
[5] {Name=0x00828180 "PhysMesh Def" Limit=64 SizeOf=24 ...}
[6] {Name=0x008282f0 "Scene Def" Limit=64 SizeOf=24 ...}
[7] {Name=0x00828460 "Worlds Def" Limit=64 SizeOf=24 ...}
[8] {Name=0x008285d0 "Actor Def" Limit=64 SizeOf=24 ...}
[9] {Name=0x00828740 "AnimSet Def" Limit=64 SizeOf=24 ...}
[10] {Name=0x008288b0 "Anim Def" Limit=64 SizeOf=24 ...}
[11] {Name=0x00828a20 "StringList Def" Limit=64 SizeOf=24 ...}
[12] {Name=0x00828b90 "Power Def" Limit=64 SizeOf=24 ...}
[13] {Name=0x00828d00 "MarkerSet Def" Limit=64 SizeOf=24 ...}
[14] {Name=0x00828e70 "Hero Def" Limit=64 SizeOf=24 ...}
[15] {Name=0x00828fe0 "Hero Def" Limit=64 SizeOf=24 ...}
[16] {Name=0x00829150 "Hero Def" Limit=64 SizeOf=24 ...}
[17] {Name=0x008292c0 "Hero Def" Limit=64 SizeOf=24 ...}
[18] {Name=0x00829430 "Conversation Def" Limit=64 SizeOf=24 ...}
[19] {Name=0x008295a0 "Conversation Def" Limit=64 SizeOf=24 ...}
[20] {Name=0x00829710 "Conversation Def" Limit=64 SizeOf=24 ...}
[21] {Name=0x00829880 "Conversation Def" Limit=64 SizeOf=24 ...}
[22] {Name=0x008299f0 "LevelArea Def" Limit=64 SizeOf=24 ...}
[23] {Name=0x00829b60 "LevelArea Def" Limit=64 SizeOf=24 ...}
[24] {Name=0x00829cd0 "LevelArea Def" Limit=64 SizeOf=24 ...}
[25] {Name=0x00829e40 "LevelArea Def" Limit=64 SizeOf=24 ...}
[26] {Name=0x00829fb0 "Monster Def" Limit=64 SizeOf=24 ...}
[27] {Name=0x0082a120 "Monster Def" Limit=64 SizeOf=24 ...}
[28] {Name=0x0082a290 "Monster Def" Limit=64 SizeOf=24 ...}
[29] {Name=0x0082a400 "Monster Def" Limit=64 SizeOf=24 ...}
[30] {Name=0x0082a570 "Monster Def" Limit=64 SizeOf=24 ...}
[31] {Name=0x0082a6e0 "Condition Def" Limit=64 SizeOf=24 ...}
[32] {Name=0x0082a850 "Account Def" Limit=64 SizeOf=24 ...}
[33] {Name=0x0082a9c0 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[34] {Name=0x0082ab30 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[35] {Name=0x0082aca0 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[36] {Name=0x0082ae10 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[37] {Name=0x0082af80 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[38] {Name=0x0082b0f0 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[39] {Name=0x0082b260 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[40] {Name=0x0082b3d0 "TreasureClass Def" Limit=64 SizeOf=24 ...}
[41] {Name=0x0082b540 "EffectGroup Def" Limit=64 SizeOf=24 ...}
[42] {Name=0x0082b6b0 "EffectGroup Def" Limit=64 SizeOf=24 ...}
[43] {Name=0x0082b820 "Trail Def" Limit=64 SizeOf=24 ...}
[44] {Name=0x0082b990 "Particle Def" Limit=64 SizeOf=24 ...}
[45] {Name=0x0082bb00 "Particle Def" Limit=64 SizeOf=24 ...}
[46] {Name=0x0082bc70 "Particle Def" Limit=64 SizeOf=24 ...}
[47] {Name=0x0082d010 "Particle Def" Limit=64 SizeOf=24 ...}
[48] {Name=0x0082d180 "UI Def" Limit=64 SizeOf=24 ...}
[49] {Name=0x0082d2f0 "Light Def" Limit=64 SizeOf=24 ...}
[50] {Name=0x0082d460 "SoundBank Def" Limit=64 SizeOf=24 ...}
[51] {Name=0x0082d5d0 "Sound Def" Limit=64 SizeOf=24 ...}
[52] {Name=0x0082d740 "Music Def" Limit=64 SizeOf=24 ...}
[53] {Name=0x0082d8b0 "Rope Def" Limit=64 SizeOf=24 ...}
[54] {Name=0x0082da20 "Rope Def" Limit=64 SizeOf=24 ...}
[55] {Name=0x0082db90 "Shakes Def" Limit=64 SizeOf=24 ...}
[56] {Name=0x0082dd00 "Shakes Def" Limit=64 SizeOf=24 ...}
[57] {Name=0x0082de70 "Material Def" Limit=64 SizeOf=24 ...}
[58] {Name=0x0082dfe0 "Material Def" Limit=64 SizeOf=24 ...}
[59] {Name=0x0082e150 "Material Def" Limit=64 SizeOf=24 ...}
Heres the code I used to generate:
Code:
struct a
{
DWORD pDef;
DWORD unknown_4;
};
class CSNODef
{
public:
DWORD unk[4]; // 0x000
DWORD pSNOAddr; // 0x00C
};
template <class T>
class tContainer
{
public:
CHAR Name[256]; // 0x000
ULONG Limit; // 0x100
ULONG SizeOf; // 0x104
ULONG Count; // 0x108
DWORD unknown_10C[5]; // 0x10C
T* List; // 0x120
DWORD unknown_124; // 0x124
ULONG Bits; // 0x128
};
std::list<a> grps;
for (DWORD i = 0; i < 60; i++)
{
a curGrp;
CProcess::Instance().Read(0x01A7C14C + (i * sizeof(a)), sizeof(curGrp), &curGrp);
grps.push_back(curGrp);
}
std::list<CSNODef> defs;
for (std::list<a>::iterator it = grps.begin(); it != grps.end(); it++)
{
CSNODef curDef;
CProcess::Instance().Read(CProcess::Instance().Read<DWORD>(it->pDef), sizeof(CSNODef), &curDef);
defs.push_back(curDef);
}
std::list<tContainer<CSNODef>> lists;
for (std::list<CSNODef>::iterator it = defs.begin(); it != defs.end(); it++)
{
tContainer<CSNODef> curList;
CProcess::Instance().Read(it->pSNOAddr, sizeof(curList), &curList);
lists.push_back(curList);
}
The code stinks but it does the job...
As a sidenote here as updated (2.0.3.22427) list of all snogroup pointers:
Code:
[0] {pDef=0x01aa7f90 unknown_4=0x01086a80 }
[1] {pDef=0x01c9a218 unknown_4=0x01086ae0 }
[2] {pDef=0x01aab758 unknown_4=0x01086b40 }
[3] {pDef=0x01d53040 unknown_4=0x01086ba0 }
[4] {pDef=0x01d31538 unknown_4=0x01086c00 }
[5] {pDef=0x01d444a8 unknown_4=0x01086c60 }
[6] {pDef=0x01cec778 unknown_4=0x01086cc0 }
[7] {pDef=0x01cef108 unknown_4=0x01086d20 }
[8] {pDef=0x01d2ddb0 unknown_4=0x01086d80 }
[9] {pDef=0x01cf6ab8 unknown_4=0x01086de0 }
[10] {pDef=0x01d54c40 unknown_4=0x01086e40 }
[11] {pDef=0x01cea678 unknown_4=0x01086ea0 }
[12] {pDef=0x01cf6160 unknown_4=0x01086f00 }
[13] {pDef=0x01d51c20 unknown_4=0x01086f60 }
[14] {pDef=0x01d70d80 unknown_4=0x01086fc0 }
[15] {pDef=0x01cf7028 unknown_4=0x01087020 }
[16] {pDef=0x01d70250 unknown_4=0x01087080 }
[17] {pDef=0x01d811a8 unknown_4=0x010870e0 }
[18] {pDef=0x01d49fe8 unknown_4=0x01087140 }
[19] {pDef=0x01d806a8 unknown_4=0x010871a0 }
[20] {pDef=0x01d802c8 unknown_4=0x01087200 }
[21] {pDef=0x01d51728 unknown_4=0x01087260 }
[22] {pDef=0x01ceaec8 unknown_4=0x010872c0 }
[23] {pDef=0x01d46290 unknown_4=0x01087320 }
[24] {pDef=0x01d52ab0 unknown_4=0x01087380 }
[25] {pDef=0x01d3f8d0 unknown_4=0x010873e0 }
[26] {pDef=0x01d4dc78 unknown_4=0x01087440 }
[27] {pDef=0x01d54a90 unknown_4=0x010874a0 }
[28] {pDef=0x01d801a8 unknown_4=0x01087500 }
[29] {pDef=0x01d406a8 unknown_4=0x01087560 }
[30] {pDef=0x01d74098 unknown_4=0x010875c0 }
[31] {pDef=0x01d7db40 unknown_4=0x01087620 }
[32] {pDef=0x01d7bd04 unknown_4=0x01087680 }
[33] {pDef=0x01d7ca40 unknown_4=0x010876e0 }
[34] {pDef=0x01d41578 unknown_4=0x01087740 }
[35] {pDef=0x01d51230 unknown_4=0x010877a0 }
[36] {pDef=0x01d74478 unknown_4=0x01087800 }
[37] {pDef=0x01cd05f8 unknown_4=0x01087860 }
[38] {pDef=0x01ccd1f0 unknown_4=0x010878c0 }
[39] {pDef=0x01cd18a8 unknown_4=0x01087920 }
[40] {pDef=0x01cce598 unknown_4=0x01087980 }
[41] {pDef=0x01ccdde8 unknown_4=0x010879e0 }
[42] {pDef=0x01cd1f40 unknown_4=0x01087a40 }
[43] {pDef=0x01cd1068 unknown_4=0x01087aa0 }
[44] {pDef=0x01ccab10 unknown_4=0x01087b00 }
[45] {pDef=0x01c980c0 unknown_4=0x01087b60 }
[46] {pDef=0x01cd2da0 unknown_4=0x01087bc0 }
[47] {pDef=0x01ab2ae8 unknown_4=0x01087c20 }
[48] {pDef=0x01ab4910 unknown_4=0x01087c80 }
[49] {pDef=0x01cc3178 unknown_4=0x01087ce0 }
[50] {pDef=0x01c9a4a8 unknown_4=0x01087d40 }
[51] {pDef=0x01c9ae90 unknown_4=0x01087da0 }
[52] {pDef=0x01cc8fc8 unknown_4=0x01087e00 }
[53] {pDef=0x01ccf098 unknown_4=0x01087e60 }
[54] {pDef=0x01cc1610 unknown_4=0x01087ec0 }
[55] {pDef=0x01cce8e8 unknown_4=0x01087f20 }
[56] {pDef=0x01def9d0 unknown_4=0x01087f80 }
[57] {pDef=0x01c6da40 unknown_4=0x01087fe0 }
[58] {pDef=0x01cc8180 unknown_4=0x01088040 }
[59] {pDef=0x01d6e9a0 unknown_4=0x00008a6b }
[ [ [ pDef ] ] + 0x10 ] gives to a tContainer<CSNODef> as defined in the code above