Fixed a bug in espr_stats where the esp_stats structure was not being properly initialised.

Also, significantly sped up the header printing functions.
This commit is contained in:
2022-09-07 20:56:43 +10:00
parent de1a27e337
commit 4d7bdcf3cc
7 changed files with 579 additions and 483 deletions

View File

@@ -209,76 +209,76 @@ const uint8_t rth2rt[RT_HASH_SIZE] = {
[RT_WTHR] = WTHR,
};
const char *const group_type_strings[GTS_SIZE] = {
"Top Type",
"World Children",
"Interior Cell Block",
"Interior Cell Sub-Block",
"Exterior Cell",
"Exterior Cell Sub-Block",
"Cell Children",
"Topic Children",
"Cell Persistent Children",
"Cell Temporary Children",
const struct str_lit group_type_strings[GTS_SIZE] = {
STR_LIT("Top Type"),
STR_LIT("World Children"),
STR_LIT("Interior Cell Block"),
STR_LIT("Interior Cell Sub-Block"),
STR_LIT("Exterior Cell"),
STR_LIT("Exterior Cell Sub-Block"),
STR_LIT("Cell Children"),
STR_LIT("Topic Children"),
STR_LIT("Cell Persistent Children"),
STR_LIT("Cell Temporary Children"),
};
// Non-REFR flags
rfs_inner achr = {
[9] = "Starts Dead",
[10] = "Persistent",
[11] = "Initially Disabled",
[25] = "No AI Acquire",
[29] = "Don't Havok Settle",
[30] = "ACHR Unknown 30",
[9] = STR_LIT("Starts Dead"),
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[25] = STR_LIT("No AI Acquire"),
[29] = STR_LIT("Don't Havok Settle"),
[30] = STR_LIT("ACHR Unknown 30"),
};
rfs_inner acti = {
[6] = "Has Tree LOD",
[8] = "Must Update Anims",
[9] = "Hidden From Local Map",
[15] = "Has Distant LOD",
[16] = "Random Anim Start",
[17] = "Dangerous",
[20] = "Ignore Object Interaction",
[23] = "Is Marker",
[25] = "Obstacle",
[26] = "NavMesh Generation - Filter",
[27] = "NavMesh Generation - Bounding Box",
[29] = "Child Can Use",
[30] = "NavMesh Generation - Ground",
[6] = STR_LIT("Has Tree LOD"),
[8] = STR_LIT("Must Update Anims"),
[9] = STR_LIT("Hidden From Local Map"),
[15] = STR_LIT("Has Distant LOD"),
[16] = STR_LIT("Random Anim Start"),
[17] = STR_LIT("Dangerous"),
[20] = STR_LIT("Ignore Object Interaction"),
[23] = STR_LIT("Is Marker"),
[25] = STR_LIT("Obstacle"),
[26] = STR_LIT("NavMesh Generation - Filter"),
[27] = STR_LIT("NavMesh Generation - Bounding Box"),
[29] = STR_LIT("Child Can Use"),
[30] = STR_LIT("NavMesh Generation - Ground"),
};
rfs_inner tact = {
[9] = "Hidden From Local Map",
[16] = "Random Anim Start",
[17] = "Radio Station",
[9] = STR_LIT("Hidden From Local Map"),
[16] = STR_LIT("Random Anim Start"),
[17] = STR_LIT("Radio Station"),
};
rfs_inner alch = {
[29] = "Medicine",
[29] = STR_LIT("Medicine"),
};
rfs_inner ammo = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner anio = {
[9] = "ANIO Unknown 9",
[9] = STR_LIT("ANIO Unknown 9"),
};
rfs_inner armo = {
[2] = "Non-Playable",
[6] = "Shield",
[10] = "ARMO Unknown 10",
[15] = "ARMO Unknown 15",
[2] = STR_LIT("Non-Playable"),
[6] = STR_LIT("Shield"),
[10] = STR_LIT("ARMO Unknown 10"),
[15] = STR_LIT("ARMO Unknown 15"),
};
#define REFERENCE_RECORD { \
[7] = "Turn Off Fire", \
[10] = "Persistent", \
[11] = "Initially Disabled", \
[28] = "Reflected by Auto Water", \
[30] = "No Respawn", \
[7] = STR_LIT("Turn Off Fire"), \
[10] = STR_LIT("Persistent"), \
[11] = STR_LIT("Initially Disabled"), \
[28] = STR_LIT("Reflected by Auto Water"), \
[30] = STR_LIT("No Respawn"), \
}
rfs_inner parw = REFERENCE_RECORD;
@@ -293,187 +293,187 @@ rfs_inner pmis = REFERENCE_RECORD;
#undef REFERENCE_RECORD
rfs_inner cell = {
[10] = "Persistent",
[17] = "Off Limits",
[18] = "Compressed",
[19] = "Can't Wait",
[10] = STR_LIT("Persistent"),
[17] = STR_LIT("Off Limits"),
[18] = STR_LIT("Compressed"),
[19] = STR_LIT("Can't Wait"),
};
rfs_inner cont = {
[15] = "Has Distant LOD",
[16] = "Random Anim Start",
[25] = "Obstacle",
[26] = "NavMesh Generation - Filter",
[27] = "NavMesh Generation - Bounding Box",
[30] = "NavMesh Generation - Ground",
[15] = STR_LIT("Has Distant LOD"),
[16] = STR_LIT("Random Anim Start"),
[25] = STR_LIT("Obstacle"),
[26] = STR_LIT("NavMesh Generation - Filter"),
[27] = STR_LIT("NavMesh Generation - Bounding Box"),
[30] = STR_LIT("NavMesh Generation - Ground"),
};
rfs_inner csty = {
[19] = "Allow Dual Wielding",
[19] = STR_LIT("Allow Dual Wielding"),
};
rfs_inner door = {
[15] = "Has Distant LOD",
[16] = "Random Anim Start",
[23] = "Is Marker",
[15] = STR_LIT("Has Distant LOD"),
[16] = STR_LIT("Random Anim Start"),
[23] = STR_LIT("Is Marker"),
};
rfs_inner eyes = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner furn = {
[7] = "Is Perch",
[16] = "Has Distant LOD",
[23] = "Is Marker",
[28] = "Must Exit To Talk",
[29] = "Child Can Use",
[7] = STR_LIT("Is Perch"),
[16] = STR_LIT("Has Distant LOD"),
[23] = STR_LIT("Is Marker"),
[28] = STR_LIT("Must Exit To Talk"),
[29] = STR_LIT("Child Can Use"),
};
rfs_inner glob = {
[6] = "Constant",
[6] = STR_LIT("Constant"),
};
rfs_inner hdpt = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner mstt = {
[8] = "Must Update Anims",
[9] = "Hidden From Local Map",
[15] = "Has Distant LOD",
[16] = "Random Anim Start",
[19] = "Has Currents",
[25] = "Obstacle",
[26] = "NavMesh Generation - Filter",
[27] = "NavMesh Generation - Bounding Box",
[30] = "NavMesh Generation - Ground",
[8] = STR_LIT("Must Update Anims"),
[9] = STR_LIT("Hidden From Local Map"),
[15] = STR_LIT("Has Distant LOD"),
[16] = STR_LIT("Random Anim Start"),
[19] = STR_LIT("Has Currents"),
[25] = STR_LIT("Obstacle"),
[26] = STR_LIT("NavMesh Generation - Filter"),
[27] = STR_LIT("NavMesh Generation - Bounding Box"),
[30] = STR_LIT("NavMesh Generation - Ground"),
};
rfs_inner idlm = {
[29] = "Child Can Use",
[29] = STR_LIT("Child Can Use"),
};
rfs_inner slgm = {
[17] = "Can Hold NPC Soul",
[17] = STR_LIT("Can Hold NPC Soul"),
};
rfs_inner navm = {
[18] = "Compressed",
[26] = "AutoGen",
[31] = "NavmeshGenCell",
[18] = STR_LIT("Compressed"),
[26] = STR_LIT("AutoGen"),
[31] = STR_LIT("NavmeshGenCell"),
};
rfs_inner perk = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner shou = {
[7] = "Treat Spells As Powers",
[7] = STR_LIT("Treat Spells As Powers"),
};
rfs_inner rela = {
[6] = "Secret",
[6] = STR_LIT("Secret"),
};
rfs_inner clfm = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner info = {
[13] = "Actor Changed",
[13] = STR_LIT("Actor Changed"),
};
rfs_inner keym = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner land = {
[18] = "Compressed",
[18] = STR_LIT("Compressed"),
};
rfs_inner ligh = {
[16] = "Random Anim Start",
[17] = "Portal-strict",
[25] = "Obstacle",
[16] = STR_LIT("Random Anim Start"),
[17] = STR_LIT("Portal-strict"),
[25] = STR_LIT("Obstacle"),
};
rfs_inner lscr = {
[10] = "Displays In Main Menu",
[10] = STR_LIT("Displays In Main Menu"),
};
rfs_inner misc = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner npc_ = {
[10] = "NPC_ Unknown 10",
[18] = "Compressed",
[19] = "NPC_ Unknown 19",
[29] = "Bleedout Override",
[10] = STR_LIT("NPC_ Unknown 10"),
[18] = STR_LIT("Compressed"),
[19] = STR_LIT("NPC_ Unknown 19"),
[29] = STR_LIT("Bleedout Override"),
};
rfs_inner race = {
[19] = "Critter (?)",
[19] = STR_LIT("Critter (?)"),
};
// these are generic refr flags for any reference type not handled by the refr
// specific flag lut
rfs_inner refr = {
[10] = "Persistent",
[11] = "Initially Disabled",
[16] = "Is Full LOD",
[26] = "Filter (Collision Geometry)",
[27] = "Bounding Box (Collision Geometry)",
[30] = "Ground",
[31] = "Multibound",
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[16] = STR_LIT("Is Full LOD"),
[26] = STR_LIT("Filter (Collision Geometry)"),
[27] = STR_LIT("Bounding Box (Collision Geometry)"),
[30] = STR_LIT("Ground"),
[31] = STR_LIT("Multibound"),
};
rfs_inner regn = {
[6] = "Border Region",
[6] = STR_LIT("Border Region"),
};
rfs_inner stat = {
[2] = "Never Fades",
[5] = "Deleted",
[6] = "Has Tree LOD",
[7] = "Add-On LOD Object",
[9] = "Hidden From Local Map",
[11] = "STAT Unknown 11",
[15] = "Has Distant LOD",
[16] = "STAT Unknown 16",
[17] = "Uses HD LOD Texture",
[19] = "Has Currents",
[23] = "Is Marker",
[25] = "Obstacle",
[26] = "NavMesh Generation - Filter",
[27] = "NavMesh Generation - Bounding Box",
[28] = "Show In World Map",
[30] = "NavMesh Generation - Ground",
[2] = STR_LIT("Never Fades"),
[5] = STR_LIT("Deleted"),
[6] = STR_LIT("Has Tree LOD"),
[7] = STR_LIT("Add-On LOD Object"),
[9] = STR_LIT("Hidden From Local Map"),
[11] = STR_LIT("STAT Unknown 11"),
[15] = STR_LIT("Has Distant LOD"),
[16] = STR_LIT("STAT Unknown 16"),
[17] = STR_LIT("Uses HD LOD Texture"),
[19] = STR_LIT("Has Currents"),
[23] = STR_LIT("Is Marker"),
[25] = STR_LIT("Obstacle"),
[26] = STR_LIT("NavMesh Generation - Filter"),
[27] = STR_LIT("NavMesh Generation - Bounding Box"),
[28] = STR_LIT("Show In World Map"),
[30] = STR_LIT("NavMesh Generation - Ground"),
};
rfs_inner tes4 = {
[0] = "ESM",
[1] = "Altered",
[2] = "Checked",
[3] = "Active",
[4] = "Optimized File",
[5] = "Temp ID Owner",
[7] = "Localized",
[8] = "Precalc Data Only",
[9] = "ESL",
[0] = STR_LIT("ESM"),
[1] = STR_LIT("Altered"),
[2] = STR_LIT("Checked"),
[3] = STR_LIT("Active"),
[4] = STR_LIT("Optimized File"),
[5] = STR_LIT("Temp ID Owner"),
[7] = STR_LIT("Localized"),
[8] = STR_LIT("Precalc Data Only"),
[9] = STR_LIT("ESL"),
};
rfs_inner tree = {
[15] = "Has Distant LOD",
[15] = STR_LIT("Has Distant LOD"),
};
rfs_inner weap = {
[2] = "Non-Playable",
[2] = STR_LIT("Non-Playable"),
};
rfs_inner wrld = {
[19] = "Can't Wait",
[19] = STR_LIT("Can't Wait"),
};
rfs_inner *const rfs[RT_SIZE] = {
@@ -524,18 +524,18 @@ rfs_inner *const rfs[RT_SIZE] = {
// REFR flags depend on what its NAME field references
#define REFR_GROUP1 { \
[9] = "Hidden From Local Map", \
[10] = "Persistent", \
[11] = "Initially Disabled", \
[13] = "Sky Marker", \
[15] = "Visible When Distant", \
[16] = "Is Full LOD", \
[26] = "Filter (Collision Geometry)", \
[27] = "Bounding Box (Collision Geometry)", \
[28] = "Reflected By Auto Water", \
[29] = "Don't Havok Settle", \
[30] = "No Respawn", \
[31] = "Multibound", \
[9] = STR_LIT("Hidden From Local Map"), \
[10] = STR_LIT("Persistent"), \
[11] = STR_LIT("Initially Disabled"), \
[13] = STR_LIT("Sky Marker"), \
[15] = STR_LIT("Visible When Distant"), \
[16] = STR_LIT("Is Full LOD"), \
[26] = STR_LIT("Filter (Collision Geometry)"), \
[27] = STR_LIT("Bounding Box (Collision Geometry)"), \
[28] = STR_LIT("Reflected By Auto Water"), \
[29] = STR_LIT("Don't Havok Settle"), \
[30] = STR_LIT("No Respawn"), \
[31] = STR_LIT("Multibound"), \
}
rfs_inner r_acti = REFR_GROUP1;
@@ -546,78 +546,78 @@ rfs_inner r_flor = REFR_GROUP1;
#undef REFR_GROUP1
rfs_inner r_cont = {
[10] = "Persistent",
[11] = "Initially Disabled",
[16] = "Is Full LOD",
[25] = "No AI Acquire",
[26] = "Filter (Collision Geometry)",
[27] = "Bounding Box (Collision Geometry)",
[28] = "Reflected By Auto Water",
[29] = "Don't Havok Settle",
[30] = "Ground",
[31] = "Multibound",
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[16] = STR_LIT("Is Full LOD"),
[25] = STR_LIT("No AI Acquire"),
[26] = STR_LIT("Filter (Collision Geometry)"),
[27] = STR_LIT("Bounding Box (Collision Geometry)"),
[28] = STR_LIT("Reflected By Auto Water"),
[29] = STR_LIT("Don't Havok Settle"),
[30] = STR_LIT("Ground"),
[31] = STR_LIT("Multibound"),
};
rfs_inner r_door = {
[6] = "Hidden From Local Map",
[8] = "Inaccessible",
[10] = "Persistent",
[11] = "Initially Disabled",
[16] = "Is Full LOD",
[26] = "Filter (Collision Geometry)",
[27] = "Bounding Box (Collision Geometry)",
[28] = "Reflected By Auto Water",
[29] = "Don't Havok Settle",
[30] = "No Respawn",
[31] = "Multibound",
[6] = STR_LIT("Hidden From Local Map"),
[8] = STR_LIT("Inaccessible"),
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[16] = STR_LIT("Is Full LOD"),
[26] = STR_LIT("Filter (Collision Geometry)"),
[27] = STR_LIT("Bounding Box (Collision Geometry)"),
[28] = STR_LIT("Reflected By Auto Water"),
[29] = STR_LIT("Don't Havok Settle"),
[30] = STR_LIT("No Respawn"),
[31] = STR_LIT("Multibound"),
};
rfs_inner r_ligh = {
[8] = "Doesn't Light Water",
[9] = "Casts Shadows",
[10] = "Persistent",
[11] = "Initially Disabled",
[16] = "Never Fades",
[17] = "Doesn't Light Landscape",
[25] = "No AI Acquire",
[28] = "Reflected By Auto Water",
[29] = "Don't Havok Settle",
[30] = "No Respawn",
[31] = "Multibound",
[8] = STR_LIT("Doesn't Light Water"),
[9] = STR_LIT("Casts Shadows"),
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[16] = STR_LIT("Never Fades"),
[17] = STR_LIT("Doesn't Light Landscape"),
[25] = STR_LIT("No AI Acquire"),
[28] = STR_LIT("Reflected By Auto Water"),
[29] = STR_LIT("Don't Havok Settle"),
[30] = STR_LIT("No Respawn"),
[31] = STR_LIT("Multibound"),
};
rfs_inner r_mstt = {
[9] = "Motion Blur",
[10] = "Persistent",
[11] = "Initially Disabled",
[16] = "Is Full LOD",
[26] = "Filter (Collision Geometry)",
[27] = "Bounding Box (Collision Geometry)",
[28] = "Reflected By Auto Water",
[29] = "Don't Havok Settle",
[30] = "No Respawn",
[31] = "Multibound",
[9] = STR_LIT("Motion Blur"),
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[16] = STR_LIT("Is Full LOD"),
[26] = STR_LIT("Filter (Collision Geometry)"),
[27] = STR_LIT("Bounding Box (Collision Geometry)"),
[28] = STR_LIT("Reflected By Auto Water"),
[29] = STR_LIT("Don't Havok Settle"),
[30] = STR_LIT("No Respawn"),
[31] = STR_LIT("Multibound"),
};
rfs_inner r_addn = {
[10] = "Persistent",
[11] = "Initially Disabled",
[16] = "Is Full LOD",
[28] = "Reflected By Auto Water",
[29] = "Don't Havok Settle",
[30] = "No Respawn",
[31] = "Multibound",
[10] = STR_LIT("Persistent"),
[11] = STR_LIT("Initially Disabled"),
[16] = STR_LIT("Is Full LOD"),
[28] = STR_LIT("Reflected By Auto Water"),
[29] = STR_LIT("Don't Havok Settle"),
[30] = STR_LIT("No Respawn"),
[31] = STR_LIT("Multibound"),
};
#define REFR_GROUP2 { \
[10] = "Persistent", \
[11] = "Initially Disabled", \
[16] = "Is Full LOD", \
[25] = "No AI Acquire", \
[28] = "Reflected By Auto Water", \
[29] = "Don't Havok Settle", \
[30] = "No Respawn", \
[31] = "Multibound", \
[10] = STR_LIT("Persistent"), \
[11] = STR_LIT("Initially Disabled"), \
[16] = STR_LIT("Is Full LOD"), \
[25] = STR_LIT("No AI Acquire"), \
[28] = STR_LIT("Reflected By Auto Water"), \
[29] = STR_LIT("Don't Havok Settle"), \
[30] = STR_LIT("No Respawn"), \
[31] = STR_LIT("Multibound"), \
}
rfs_inner r_alch = REFR_GROUP2;
@@ -630,6 +630,8 @@ rfs_inner r_misc = REFR_GROUP2;
rfs_inner r_slgm = REFR_GROUP2;
rfs_inner r_weap = REFR_GROUP2;
#undef REFR_GROUP2
rfs_inner *const rfs_r[RT_SIZE] = {
[AACT] = CP(NULL ),[ACHR] = CP(NULL ),[ACTI] = CP(r_acti),
[ADDN] = CP(r_addn),[ALCH] = CP(r_alch),[AMMO] = CP(r_ammo),