Implement/match LegoPathStruct (#944)

* Implement/match LegoPathStruct

* Rename some nums

* Consistent naming

* Naming

* relax regex

* Name some functions

* Improve naming

* Rename
This commit is contained in:
Christian Semmler 2024-05-21 15:03:50 -04:00 committed by GitHub
parent bc91fd2189
commit 8fee73c525
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 225 additions and 40 deletions

View file

@ -26,6 +26,7 @@ class Isle : public LegoWorld {
public: public:
// For g_unk0x100f1198 // For g_unk0x100f1198
enum { enum {
c_bit6 = 0x20,
c_bit7 = 0x40 c_bit7 = 0x40
}; };

View file

@ -30,7 +30,7 @@ class JukeBoxState : public LegoState {
// SYNTHETIC: LEGO1 0x1000f3d0 // SYNTHETIC: LEGO1 0x1000f3d0
// JukeBoxState::`scalar deleting destructor' // JukeBoxState::`scalar deleting destructor'
protected: // protected:
MxU32 m_state; // 0x08 MxU32 m_state; // 0x08
MxU32 m_active; // 0x0c MxU32 m_active; // 0x0c
}; };

View file

@ -9,11 +9,11 @@
#include "mxgeometry/mxgeometry3d.h" #include "mxgeometry/mxgeometry3d.h"
class AnimState; class AnimState;
class IslePathActor;
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoEntity; class LegoEntity;
class LegoExtraActor; class LegoExtraActor;
class LegoFile; class LegoFile;
class LegoPathActor;
class LegoPathBoundary; class LegoPathBoundary;
class LegoROIList; class LegoROIList;
struct LegoUnknown100db7f4; struct LegoUnknown100db7f4;
@ -102,7 +102,7 @@ class LegoAnimationManager : public MxCore {
MxBool p_param8, MxBool p_param8,
MxBool p_param9 MxBool p_param9
); );
void CameraTriggerFire(IslePathActor* p_actor, undefined4, MxU32 p_location, MxBool p_bool); void CameraTriggerFire(LegoPathActor* p_actor, undefined4, MxU32 p_location, MxBool p_bool);
void FUN_10061010(MxBool p_und); void FUN_10061010(MxBool p_und);
LegoTranInfo* GetTranInfo(MxU32 p_index); LegoTranInfo* GetTranInfo(MxU32 p_index);
void FUN_10062770(); void FUN_10062770();

View file

@ -47,10 +47,11 @@ class LegoHideAnimPresenter : public LegoLoopingAnimPresenter {
void VTable0x8c() override; // vtable+0x8c void VTable0x8c() override; // vtable+0x8c
void VTable0x90() override; // vtable+0x90 void VTable0x90() override; // vtable+0x90
void FUN_1006db40(LegoTime p_time);
private: private:
void Init(); void Init();
void Destroy(MxBool p_fromDestructor); void Destroy(MxBool p_fromDestructor);
void FUN_1006db40(LegoTime p_time);
void FUN_1006db60(LegoTreeNode* p_node, LegoTime p_time); void FUN_1006db60(LegoTreeNode* p_node, LegoTime p_time);
void FUN_1006dc10(); void FUN_1006dc10();
void FUN_1006e3f0(LegoHideAnimStructMap& p_map, LegoTreeNode* p_node); void FUN_1006e3f0(LegoHideAnimStructMap& p_map, LegoTreeNode* p_node);

View file

@ -9,7 +9,7 @@
#include "mxstl/stlcompat.h" #include "mxstl/stlcompat.h"
class LegoAnimPresenter; class LegoAnimPresenter;
struct LegoPathStruct; class LegoPathStruct;
class LegoWorld; class LegoWorld;
class MxAtomId; class MxAtomId;
class Vector3; class Vector3;

View file

@ -12,7 +12,17 @@ class LegoWorld;
// SIZE 0x0c // SIZE 0x0c
struct LegoPathStructBase { struct LegoPathStructBase {
public: public:
LegoPathStructBase() : m_name(NULL), m_unk0x08(0) {} enum {
c_bit1 = 0x01 << 24,
c_bit2 = 0x02 << 24,
c_bit3 = 0x04 << 24,
c_bit4 = 0x08 << 24,
c_bit5 = 0x10 << 24,
c_bit6 = 0x20 << 24,
c_bit7 = 0x40 << 24
};
LegoPathStructBase() : m_name(NULL), m_flags(0) {}
// FUNCTION: LEGO1 0x10047420 // FUNCTION: LEGO1 0x10047420
virtual ~LegoPathStructBase() virtual ~LegoPathStructBase()
@ -22,25 +32,41 @@ struct LegoPathStructBase {
} }
} }
char* m_name; // 0x04 char* m_name; // 0x04
undefined4 m_unk0x08; // 0x08 MxU32 m_flags; // 0x08
}; };
// VTABLE: LEGO1 0x100d7da0 // VTABLE: LEGO1 0x100d7da0
// SIZE 0x14 // SIZE 0x14
struct LegoPathStruct : public LegoPathStructBase { class LegoPathStruct : public LegoPathStructBase {
public: public:
enum Trigger {
c_camAnim = 'C',
c_d = 'D',
c_e = 'E',
c_g = 'G',
c_h = 'H',
c_music = 'M',
c_s = 'S',
c_w = 'W'
};
// FUNCTION: LEGO1 0x100473a0 // FUNCTION: LEGO1 0x100473a0
LegoPathStruct() : m_world(NULL) {} LegoPathStruct() : m_world(NULL) {}
// FUNCTION: LEGO1 0x10047470 // FUNCTION: LEGO1 0x10047470
~LegoPathStruct() override {} ~LegoPathStruct() override {}
virtual void VTable0x04(LegoPathActor*, undefined4, undefined4); // vtable+0x04 virtual void HandleTrigger(LegoPathActor* p_actor, MxBool p_direction, MxU32 p_data); // vtable+0x04
inline void SetWorld(LegoWorld* p_world) { m_world = p_world; } inline void SetWorld(LegoWorld* p_world) { m_world = p_world; }
inline void SetAtomId(const MxAtomId& p_atomId) { m_atomId = p_atomId; } inline void SetAtomId(const MxAtomId& p_atomId) { m_atomId = p_atomId; }
private:
MxBool HandleTrigger(LegoPathActor* p_actor, MxBool p_direction, MxU32 p_data, MxBool p_bool);
void FUN_1001bc40(const char* p_name, MxU32 p_data, MxBool p_bool);
void PlayMusic(MxBool p_direction, MxU32 p_data);
LegoWorld* m_world; // 0x0c LegoWorld* m_world; // 0x0c
MxAtomId m_atomId; // 0x10 MxAtomId m_atomId; // 0x10
}; };

View file

@ -7,12 +7,12 @@
#include <windows.h> #include <windows.h>
class IslePathActor;
class MxAtomId; class MxAtomId;
class LegoEntity; class LegoEntity;
class LegoFile; class LegoFile;
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoNamedTexture; class LegoNamedTexture;
class LegoPathActor;
class LegoROI; class LegoROI;
class LegoTreeNode; class LegoTreeNode;
@ -24,7 +24,7 @@ Extra::ActionType MatchActionString(const char*);
void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p_targetEntityId, LegoEntity* p_sender); void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p_targetEntityId, LegoEntity* p_sender);
void SetCameraControllerFromIsle(); void SetCameraControllerFromIsle();
void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut); void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut);
void PlayCamAnim(IslePathActor* p_actor, undefined4 p_unused, MxU32 p_location, MxBool p_bool); void PlayCamAnim(LegoPathActor* p_actor, MxBool p_unused, MxU32 p_location, MxBool p_bool);
void FUN_1003eda0(); void FUN_1003eda0();
MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id); MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id);
void FUN_1003ef00(MxBool p_enable); void FUN_1003ef00(MxBool p_enable);

View file

@ -94,6 +94,7 @@ class LegoWorld : public LegoEntity {
inline MxS32 GetScriptIndex() { return m_scriptIndex; } inline MxS32 GetScriptIndex() { return m_scriptIndex; }
inline MxCoreSet& GetUnknown0xd0() { return m_set0xd0; } inline MxCoreSet& GetUnknown0xd0() { return m_set0xd0; }
inline list<LegoROI*>& GetROIList() { return m_roiList; } inline list<LegoROI*>& GetROIList() { return m_roiList; }
inline LegoHideAnimPresenter* GetHideAnimPresenter() { return m_hideAnimPresenter; }
inline void SetScriptIndex(MxS32 p_scriptIndex) { m_scriptIndex = p_scriptIndex; } inline void SetScriptIndex(MxS32 p_scriptIndex) { m_scriptIndex = p_scriptIndex; }

View file

@ -535,7 +535,7 @@ void IslePathActor::SpawnPlayer(LegoGameState::Area p_area, MxBool p_und, MxU8 p
} }
if (camAnim) { if (camAnim) {
PlayCamAnim(this, 0, g_spawnLocations[i].m_location, TRUE); PlayCamAnim(this, FALSE, g_spawnLocations[i].m_location, TRUE);
} }
} }

View file

@ -1153,7 +1153,7 @@ MxResult LegoAnimationManager::FUN_10060dc0(
// FUNCTION: LEGO1 0x10060eb0 // FUNCTION: LEGO1 0x10060eb0
// FUNCTION: BETA10 0x1004206c // FUNCTION: BETA10 0x1004206c
void LegoAnimationManager::CameraTriggerFire(IslePathActor* p_actor, undefined4, MxU32 p_location, MxBool p_bool) void LegoAnimationManager::CameraTriggerFire(LegoPathActor* p_actor, undefined4, MxU32 p_location, MxBool p_bool)
{ {
if (Lego()->m_unk0x13c && m_enableCamAnims && !m_animRunning) { if (Lego()->m_unk0x13c && m_enableCamAnims && !m_animRunning) {
LegoLocation* location = LegoNavController::GetLocation(p_location); LegoLocation* location = LegoNavController::GetLocation(p_location);

View file

@ -344,7 +344,7 @@ void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bO
// FUNCTION: LEGO1 0x1003ecc0 // FUNCTION: LEGO1 0x1003ecc0
// FUNCTION: BETA10 0x100d4b38 // FUNCTION: BETA10 0x100d4b38
void PlayCamAnim(IslePathActor* p_actor, undefined4 p_unused, MxU32 p_location, MxBool p_bool) void PlayCamAnim(LegoPathActor* p_actor, MxBool p_unused, MxU32 p_location, MxBool p_bool)
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
MxLong result = 0; MxLong result = 0;

View file

@ -61,19 +61,19 @@ void LegoPathBoundary::FUN_100575b0(Vector3& p_point1, Vector3& p_point2, LegoPa
if (dot2 > dot1) { if (dot2 > dot1) {
for (MxS32 i = 0; i < m_unk0x48; i++) { for (MxS32 i = 0; i < m_unk0x48; i++) {
LegoPathStruct* s = m_unk0x4c[i].m_unk0x00; LegoPathStruct* s = m_unk0x4c[i].m_pathStruct;
if (m_unk0x4c[i].m_unk0x08 >= dot1 && m_unk0x4c[i].m_unk0x08 < dot2) { if (m_unk0x4c[i].m_unk0x08 >= dot1 && m_unk0x4c[i].m_unk0x08 < dot2) {
s->VTable0x04(p_actor, 1, m_unk0x4c[i].m_unk0x04); s->HandleTrigger(p_actor, TRUE, m_unk0x4c[i].m_data);
} }
} }
} }
else if (dot2 < dot1) { else if (dot2 < dot1) {
for (MxS32 i = 0; i < m_unk0x48; i++) { for (MxS32 i = 0; i < m_unk0x48; i++) {
LegoPathStruct* s = m_unk0x4c[i].m_unk0x00; LegoPathStruct* s = m_unk0x4c[i].m_pathStruct;
if (m_unk0x4c[i].m_unk0x08 >= dot2 && m_unk0x4c[i].m_unk0x08 < dot1) { if (m_unk0x4c[i].m_unk0x08 >= dot2 && m_unk0x4c[i].m_unk0x08 < dot1) {
s->VTable0x04(p_actor, 0, m_unk0x4c[i].m_unk0x04); s->HandleTrigger(p_actor, FALSE, m_unk0x4c[i].m_data);
} }
} }
} }

View file

@ -528,7 +528,7 @@ MxResult LegoPathController::ReadStructs(LegoStorage* p_storage)
m_structs[i].m_name[length] = '\0'; m_structs[i].m_name[length] = '\0';
} }
if (p_storage->Read(&m_structs[i].m_unk0x08, sizeof(m_structs[i].m_unk0x08)) != SUCCESS) { if (p_storage->Read(&m_structs[i].m_flags, sizeof(m_structs[i].m_flags)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
} }
@ -678,17 +678,16 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
if (boundary.m_unk0x48 > 0) { if (boundary.m_unk0x48 > 0) {
boundary.m_unk0x50 = new Mx3DPointFloat; boundary.m_unk0x50 = new Mx3DPointFloat;
boundary.m_unk0x4c = new LegoWEGEdge::Path[boundary.m_unk0x48]; boundary.m_unk0x4c = new LegoWEGEdge::PathWithTrigger[boundary.m_unk0x48];
for (j = 0; j < boundary.m_unk0x48; j++) { for (j = 0; j < boundary.m_unk0x48; j++) {
if (p_storage->Read(&s, sizeof(s)) != SUCCESS) { if (p_storage->Read(&s, sizeof(s)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
boundary.m_unk0x4c[j].m_unk0x00 = &m_structs[s]; boundary.m_unk0x4c[j].m_pathStruct = &m_structs[s];
if (p_storage->Read(&boundary.m_unk0x4c[j].m_unk0x04, sizeof(boundary.m_unk0x4c[j].m_unk0x04)) != if (p_storage->Read(&boundary.m_unk0x4c[j].m_data, sizeof(boundary.m_unk0x4c[j].m_data)) != SUCCESS) {
SUCCESS) {
return FAILURE; return FAILURE;
} }

View file

@ -1,11 +1,168 @@
#include "legopathstruct.h" #include "legopathstruct.h"
#include "isle.h"
#include "jukebox_actions.h"
#include "jukeboxstate.h"
#include "legohideanimpresenter.h"
#include "legopathactor.h"
#include "legoutils.h"
#include "misc.h"
#include "mxbackgroundaudiomanager.h"
#include "mxmisc.h"
#include "mxnotificationmanager.h"
#include "mxtype19notificationparam.h"
#include "scripts.h"
DECOMP_SIZE_ASSERT(LegoPathStructBase, 0x0c) DECOMP_SIZE_ASSERT(LegoPathStructBase, 0x0c)
DECOMP_SIZE_ASSERT(LegoPathStruct, 0x14) DECOMP_SIZE_ASSERT(LegoPathStruct, 0x14)
// STUB: LEGO1 0x1001b700 // Flags used in isle.cpp
// FUNCTION: BETA10 0x100c26c5 extern MxU32 g_unk0x100f1198;
void LegoPathStruct::VTable0x04(LegoPathActor*, undefined4, undefined4)
// GLOBAL: LEGO1 0x100f119c
MxBool g_unk0x100f119c = FALSE;
// FUNCTION: LEGO1 0x1001b700
void LegoPathStruct::HandleTrigger(LegoPathActor* p_actor, MxBool p_direction, MxU32 p_data)
{ {
// TODO if (!HandleTrigger(p_actor, p_direction, p_data, FALSE) && g_unk0x100f119c) {
HandleTrigger(p_actor, p_direction, p_data, TRUE);
}
}
// FUNCTION: LEGO1 0x1001b740
// FUNCTION: BETA10 0x100c26c5
MxBool LegoPathStruct::HandleTrigger(LegoPathActor* p_actor, MxBool p_direction, MxU32 p_data, MxBool p_bool)
{
MxBool triggered = FALSE;
MxBool bool2 = p_bool ? !p_direction : p_direction;
MxU32 flags = bool2 ? c_bit5 : c_bit6;
flags |= p_actor->GetCameraFlag() ? c_bit1 : (c_bit2 | c_bit3 | c_bit4);
if ((m_flags & flags & (c_bit5 | c_bit6 | c_bit7)) && (m_flags & flags & (c_bit1 | c_bit2 | c_bit3 | c_bit4))) {
triggered = TRUE;
switch (m_name[2]) {
case c_camAnim:
if (g_unk0x100f1198 & Isle::c_bit6) {
PlayCamAnim(p_actor, bool2, p_data, TRUE);
}
break;
case c_d: {
p_actor->VTable0x58(p_data);
MxType19NotificationParam param(c_notificationType19, p_actor, m_name[2], p_data);
p_actor->Notify(param);
LegoWorld* world = CurrentWorld();
if (world != NULL) {
NotificationManager()->Send(world, param);
}
break;
}
case c_e:
FUN_1001bc40(m_name, p_data, !(p_bool == FALSE));
break;
case c_g:
break;
case c_h: {
LegoHideAnimPresenter* presenter = m_world->GetHideAnimPresenter();
if (presenter != NULL) {
presenter->FUN_1006db40(p_data * 100);
}
break;
}
case c_music:
if (g_unk0x100f1198 & Isle::c_bit7) {
PlayMusic(p_direction, p_data);
}
break;
case c_s: {
LegoWorld* world = CurrentWorld();
if (world != NULL) {
MxType19NotificationParam param(c_notificationType19, p_actor, m_name[2], p_data);
if (world->Notify(param) != 0) {
break;
}
}
FUN_1001bc40(m_name, p_data, p_bool == FALSE);
break;
}
case c_w: {
LegoWorld* world = CurrentWorld();
if (world != NULL) {
MxType19NotificationParam param(c_notificationType19, p_actor, m_name[2], p_data);
NotificationManager()->Send(world, param);
}
break;
}
}
}
return triggered;
}
// FUNCTION: LEGO1 0x1001bc40
// FUNCTION: BETA10 0x100c2a6c
void LegoPathStruct::FUN_1001bc40(const char* p_name, MxU32 p_data, MxBool p_bool)
{
MxDSAction action;
action.SetObjectId(p_data);
action.SetAtomId(m_atomId);
if (p_bool) {
action.SetUnknown24(-1);
Start(&action);
}
else {
action.SetUnknown24(-2);
DeleteObject(action);
}
}
// FUNCTION: LEGO1 0x1001bd10
// FUNCTION: BETA10 0x100c2b4a
void LegoPathStruct::PlayMusic(MxBool p_direction, MxU32 p_data)
{
JukeBoxState* state = (JukeBoxState*) GameState()->GetState("JukeBoxState");
if (state != NULL && state->m_active) {
return;
}
JukeboxScript::Script music[] = {
JukeboxScript::c_ResidentalArea_Music,
JukeboxScript::c_BeachBlvd_Music,
JukeboxScript::c_Cave_Music,
JukeboxScript::c_CentralRoads_Music,
JukeboxScript::c_Jail_Music,
JukeboxScript::c_Hospital_Music,
JukeboxScript::c_InformationCenter_Music,
JukeboxScript::c_PoliceStation_Music,
JukeboxScript::c_Park_Music,
JukeboxScript::c_CentralNorthRoad_Music,
JukeboxScript::c_GarageArea_Music,
JukeboxScript::c_RaceTrackRoad_Music,
JukeboxScript::c_Beach_Music,
JukeboxScript::c_Quiet_Audio
};
MxS16 triggersReff[24][2] = {{11, 10}, {6, 10}, {3, 1}, {4, 1}, {1, 4}, {1, 4}, {13, 2}, {13, 2},
{13, 2}, {4, 10}, {11, 9}, {9, 7}, {8, 7}, {8, 5}, {5, 2}, {2, 4},
{4, 2}, {4, 5}, {11, 4}, {12, 10}, {10, 12}, {10, 12}, {14, 2}, {14, 2}};
MxDSAction action;
action.SetAtomId(*g_jukeboxScript);
action.SetUnknown24(-1);
if (p_data <= sizeOfArray(triggersReff)) {
action.SetObjectId(music[triggersReff[p_data - 1][p_direction == FALSE] - 1]);
}
if (action.GetObjectId() != -1) {
BackgroundAudioManager()->PlayMusic(action, 5, 4);
}
} }

View file

@ -38,7 +38,7 @@
DECOMP_SIZE_ASSERT(Isle, 0x140) DECOMP_SIZE_ASSERT(Isle, 0x140)
// GLOBAL: LEGO1 0x100f1198 // GLOBAL: LEGO1 0x100f1198
undefined4 g_unk0x100f1198 = 0x7f; MxU32 g_unk0x100f1198 = 0x7f;
// FUNCTION: LEGO1 0x10030820 // FUNCTION: LEGO1 0x10030820
Isle::Isle() Isle::Isle()

View file

@ -1,7 +1,7 @@
#include "legowegedge.h" #include "legowegedge.h"
DECOMP_SIZE_ASSERT(LegoWEGEdge, 0x54) DECOMP_SIZE_ASSERT(LegoWEGEdge, 0x54)
DECOMP_SIZE_ASSERT(LegoWEGEdge::Path, 0x0c) DECOMP_SIZE_ASSERT(LegoWEGEdge::PathWithTrigger, 0x0c)
// FUNCTION: LEGO1 0x1009a730 // FUNCTION: LEGO1 0x1009a730
LegoWEGEdge::LegoWEGEdge() LegoWEGEdge::LegoWEGEdge()

View file

@ -5,7 +5,7 @@
#include "legoweedge.h" #include "legoweedge.h"
#include "mxgeometry/mxgeometry3d.h" #include "mxgeometry/mxgeometry3d.h"
struct LegoPathStruct; class LegoPathStruct;
// might be a struct with public members // might be a struct with public members
// VTABLE: LEGO1 0x100db7f8 // VTABLE: LEGO1 0x100db7f8
@ -20,19 +20,19 @@ class LegoWEGEdge : public LegoWEEdge {
}; };
// SIZE 0x0c // SIZE 0x0c
struct Path { struct PathWithTrigger {
// FUNCTION: LEGO1 0x10048280 // FUNCTION: LEGO1 0x10048280
// FUNCTION: BETA10 0x100bd450 // FUNCTION: BETA10 0x100bd450
Path() PathWithTrigger()
{ {
m_unk0x00 = NULL; m_pathStruct = NULL;
m_unk0x04 = 0; m_data = 0;
m_unk0x08 = 0.0f; m_unk0x08 = 0.0f;
} }
LegoPathStruct* m_unk0x00; // 0x00 LegoPathStruct* m_pathStruct; // 0x00
undefined4 m_unk0x04; // 0x04 unsigned int m_data; // 0x04
float m_unk0x08; // 0x08 float m_unk0x08; // 0x08
}; };
LegoWEGEdge(); LegoWEGEdge();
@ -71,7 +71,7 @@ class LegoWEGEdge : public LegoWEEdge {
Mx3DPointFloat m_unk0x30; // 0x30 Mx3DPointFloat m_unk0x30; // 0x30
LegoU32 m_unk0x44; // 0x44 LegoU32 m_unk0x44; // 0x44
LegoU8 m_unk0x48; // 0x48 LegoU8 m_unk0x48; // 0x48
Path* m_unk0x4c; // 0x4c PathWithTrigger* m_unk0x4c; // 0x4c
Mx3DPointFloat* m_unk0x50; // 0x50 Mx3DPointFloat* m_unk0x50; // 0x50
}; };

View file

@ -1,7 +1,7 @@
ClassName: '^[A-Z][a-zA-Z0-9]+$' ClassName: '^[A-Z][a-zA-Z0-9]+$'
CppMethod: '^operator|^FUN_[a-f0-9]{8}$|^VTable0x[a-f0-9]{1,8}$|^(?!VTable)[A-Z][a-zA-Z0-9]+$' CppMethod: '^operator|^FUN_[a-f0-9]{8}$|^VTable0x[a-f0-9]{1,8}$|^(?!VTable)[A-Z][a-zA-Z0-9]+$'
EnumName: '^\(unnamed|^[A-Z][a-zA-Z0-9]+$' EnumName: '^\(unnamed|^[A-Z][a-zA-Z0-9]+$'
EnumConstantName: '^(c_|e_)[a-z][a-zA-Z0-9]+$' EnumConstantName: '^(c_|e_)[a-z][a-zA-Z0-9]*$'
FunctionName: '^operator|^FUN_[a-f0-9]{8}$|^VTable0x[a-f0-9]{1,8}$|^(?!VTable)[A-Z][a-zA-Z0-9]+$' FunctionName: '^operator|^FUN_[a-f0-9]{8}$|^VTable0x[a-f0-9]{1,8}$|^(?!VTable)[A-Z][a-zA-Z0-9]+$'
ParameterName: '^p_(unk0x[a-f0-9]{1,8}$|(?!unk)[a-z][a-zA-Z0-9]*)$|^$' ParameterName: '^p_(unk0x[a-f0-9]{1,8}$|(?!unk)[a-z][a-zA-Z0-9]*)$|^$'
StructName: '^\(anon|^\(unnamed|^[A-Z][a-zA-Z0-9]+$' StructName: '^\(anon|^\(unnamed|^[A-Z][a-zA-Z0-9]+$'