diff --git a/src/glue/CCharacterCreation.cpp b/src/glue/CCharacterCreation.cpp index 7eb320c..9b7c676 100644 --- a/src/glue/CCharacterCreation.cpp +++ b/src/glue/CCharacterCreation.cpp @@ -8,9 +8,11 @@ CCharacterComponent* CCharacterCreation::s_character; CSimpleModelFFX* CCharacterCreation::s_charCustomizeFrame; +float CCharacterCreation::s_charFacing; TSFixedArray CCharacterCreation::s_classes; int32_t CCharacterCreation::s_existingCharacterIndex; int32_t CCharacterCreation::s_raceIndex; +TSGrowableArray CCharacterCreation::s_races; int32_t CCharacterCreation::s_selectedClassID; void CCharacterCreation::CalcClasses(int32_t raceID) { @@ -109,6 +111,53 @@ void CCharacterCreation::GetRandomRaceAndSex(ComponentData* data) { data->sexID = UNITSEX_MALE; } +void CCharacterCreation::Initialize() { + CCharacterCreation::s_charFacing = 0.0f; + CCharacterCreation::s_charCustomizeFrame = nullptr; + CCharacterCreation::s_existingCharacterIndex = -1; + + CCharacterCreation::s_races.SetCount(0); + + // TODO enum or define for faction sides + for (int32_t side = 0; side < 2; side++) { + for (int32_t race = 0; race < g_chrRacesDB.GetNumRecords(); race++) { + auto raceRec = g_chrRacesDB.GetRecordByIndex(race); + + // TODO NPCOnly? + if (raceRec->m_flags & 0x1) { + continue; + } + + auto factionTemplateRec = g_factionTemplateDB.GetRecord(raceRec->m_factionID); + + for (int32_t group = 0; group < g_factionGroupDB.GetNumRecords(); group++) { + auto factionGroupRec = g_factionGroupDB.GetRecordByIndex(group); + + if (!factionGroupRec || !factionGroupRec->m_maskID) { + continue; + } + + bool templateMatch = (1 << factionGroupRec->m_maskID) & factionTemplateRec->m_factionGroup; + + if (!templateMatch) { + continue; + } + + bool sideMatch = + (side == 0 && !SStrCmpI(factionGroupRec->m_internalName, "Alliance")) + || (side == 1 && !SStrCmpI(factionGroupRec->m_internalName, "Horde")); + + if (!sideMatch) { + continue; + } + + // Race is playable and part of a faction aligned to either Alliance or Horde + *CCharacterCreation::s_races.New() = raceRec->m_ID; + } + } + } +} + bool CCharacterCreation::IsClassValid(int32_t classID) { for (int32_t i = 0; i < CCharacterCreation::s_classes.Count(); i++) { auto classRec = CCharacterCreation::s_classes[i]; diff --git a/src/glue/CCharacterCreation.hpp b/src/glue/CCharacterCreation.hpp index 7908147..d3a55b9 100644 --- a/src/glue/CCharacterCreation.hpp +++ b/src/glue/CCharacterCreation.hpp @@ -14,9 +14,11 @@ class CCharacterCreation { // Static variables static CCharacterComponent* s_character; static CSimpleModelFFX* s_charCustomizeFrame; + static float s_charFacing; static TSFixedArray s_classes; static int32_t s_existingCharacterIndex; static int32_t s_raceIndex; + static TSGrowableArray s_races; static int32_t s_selectedClassID; // Static functions @@ -25,6 +27,7 @@ class CCharacterCreation { static void Dress(); static int32_t GetRandomClassID(); static void GetRandomRaceAndSex(ComponentData* data); + static void Initialize(); static bool IsClassValid(int32_t classID); static void ResetCharCustomizeInfo(); static void SetSelectedClass(int32_t classID); diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index e92ddb9..5af6db7 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -5,6 +5,7 @@ #include "console/CVar.hpp" #include "db/Db.hpp" #include "ffx/Effect.hpp" +#include "glue/CCharacterCreation.hpp" #include "glue/CCharacterCreationScript.hpp" #include "glue/CCharacterSelection.hpp" #include "glue/CCharacterSelectionScript.hpp" @@ -953,6 +954,8 @@ void CGlueMgr::Resume() { FrameScript_CreateEvents(g_glueScriptEvents, NUM_GLUESCRIPTEVENTS); + CCharacterCreation::Initialize(); + OsCreateDirectory("Logs", 0); CWOWClientStatus status;