From 58954a9655de7e7b73bba0dc33dba6657f01d619 Mon Sep 17 00:00:00 2001 From: VDm Date: Sat, 17 May 2025 21:38:30 +0400 Subject: [PATCH] feat(glue): implement CCharacterCreation::Initialize --- src/glue/CCharacterComponent.cpp | 1 + src/glue/CCharacterCreation.cpp | 44 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/glue/CCharacterComponent.cpp b/src/glue/CCharacterComponent.cpp index 448ed19..6941ef0 100644 --- a/src/glue/CCharacterComponent.cpp +++ b/src/glue/CCharacterComponent.cpp @@ -132,5 +132,6 @@ void CCharacterComponent::SetRandomFacialFeature(COMPONENT_CONTEXT context) { } bool CCharacterComponent::Init(ComponentData* data, const char* a3) { + this->m_data = *data; return false; } diff --git a/src/glue/CCharacterCreation.cpp b/src/glue/CCharacterCreation.cpp index 29877ee..712fbae 100644 --- a/src/glue/CCharacterCreation.cpp +++ b/src/glue/CCharacterCreation.cpp @@ -19,8 +19,52 @@ TSGrowableArray CCharacterCreation::m_races; void CCharacterCreation::Initialize() { CCharacterCreation::m_charFacing = 0.0; + int32_t factionSwitch = 0; CCharacterCreation::m_charCustomizeFrame = nullptr; CCharacterCreation::m_existingCharacterIndex = -1; + // TODO: memset + int32_t factionSwitch2 = 0; + + bool weirdCondition = false; + + do + { + for (int32_t raceIndex = 0; raceIndex < g_chrRacesDB.GetNumRecords(); ++raceIndex) + { + auto raceRecord = g_chrRacesDB.GetRecordByIndex(raceIndex); + if (!raceRecord || (raceRecord->m_flags & 1) != 0) { + continue; + } + + auto factionTemplateRecord = g_factionTemplateDB.GetRecord(raceRecord->m_factionID); + if (!factionTemplateRecord) { + continue; + } + + for (int32_t factionGroupIndex = 0; factionGroupIndex < g_factionGroupDB.GetNumRecords(); ++factionGroupIndex) { + auto factionGroupRecord = g_factionGroupDB.GetRecordByIndex(factionGroupIndex); + if (!factionGroupRecord || factionGroupRecord->m_maskID == 0) { + continue; + } + + if (((1 << factionGroupRecord->m_maskID) & factionTemplateRecord->m_factionGroup) == 0) { + continue; + } + + if (SStrCmpI(factionGroupRecord->m_internalName, factionSwitch == 1 ? "Horde" : "Alliance", STORM_MAX_STR)) { + continue; + } + + uint32_t raceID = raceRecord->m_ID; + CCharacterCreation::m_races.Add(1, &raceID); + + factionSwitch = factionSwitch2; + } + } + + weirdCondition = factionSwitch++ == -1; + factionSwitch2 = factionSwitch; + } while (weirdCondition || factionSwitch == 1); } void CCharacterCreation::SetCharCustomizeFrame(CSimpleModel* frame) {