feat(glue): implement CCharacterCreation::SetSelectedSex

This commit is contained in:
fallenoak 2026-01-04 13:10:38 -06:00
parent 6c3998b3b0
commit 3d41f0cf26
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
3 changed files with 79 additions and 2 deletions

View File

@ -114,6 +114,10 @@ void CCharacterCreation::GetRandomRaceAndSex(ComponentData* data) {
data->sexID = UNITSEX_MALE; data->sexID = UNITSEX_MALE;
} }
int32_t CCharacterCreation::GetSelectedRaceID() {
return CCharacterCreation::s_races[CCharacterCreation::s_raceIndex];
}
void CCharacterCreation::Initialize() { void CCharacterCreation::Initialize() {
CCharacterCreation::s_charFacing = 0.0f; CCharacterCreation::s_charFacing = 0.0f;
CCharacterCreation::s_charCustomizeFrame = nullptr; CCharacterCreation::s_charCustomizeFrame = nullptr;
@ -382,5 +386,64 @@ void CCharacterCreation::SetSelectedRace(int32_t raceIndex) {
} }
void CCharacterCreation::SetSelectedSex(int32_t sexID) { void CCharacterCreation::SetSelectedSex(int32_t sexID) {
// TODO if (sexID >= UNITSEX_LAST) {
return;
}
auto currentRaceID = CCharacterCreation::s_character->m_data.raceID;
auto currentSexID = CCharacterCreation::s_character->m_data.sexID;
auto currentClassID = CCharacterCreation::s_selectedClassID;
if (sexID == currentSexID) {
return;
}
CCharacterCreation::SavePreferences();
ComponentData data = {};
data.raceID = currentRaceID;
data.sexID = sexID;
data.classID = currentClassID;
auto existingCharacter = CCharacterCreation::s_existingCharacterIndex >= 0
? CCharacterSelection::GetCharacterDisplay(CCharacterCreation::s_existingCharacterIndex)
: nullptr;
auto preferences = CCharacterCreation::s_charPreferences[CCharacterCreation::GetSelectedRaceID()][sexID];
bool useExistingCharacter = existingCharacter
&& existingCharacter->m_info.sexID == sexID
&& existingCharacter->m_info.customizeFlags & 0x1;
bool usePreferences = !useExistingCharacter && preferences;
if (useExistingCharacter) {
data.raceID = existingCharacter->m_info.raceID;
data.sexID = existingCharacter->m_info.sexID;
data.classID = existingCharacter->m_info.classID;
data.skinColorID = existingCharacter->m_info.skinColorID;
data.hairStyleID = existingCharacter->m_info.hairStyleID;
data.hairColorID = existingCharacter->m_info.hairColorID;
data.facialHairStyleID = existingCharacter->m_info.facialHairStyleID;
data.faceID = existingCharacter->m_info.faceID;
CCharacterCreation::CreateComponent(&data, false);
} else if (usePreferences) {
data.SetPreferences(preferences);
data.classID = currentClassID;
// TODO CCharacterComponent::ValidateComponentData(&data, 0);
CCharacterCreation::CreateComponent(&data, false);
} else {
data.raceID = currentRaceID;
data.sexID = sexID;
data.classID = currentClassID;
CCharacterCreation::CreateComponent(&data, true);
}
// TODO name gen stuff
CGlueLoading::StartLoad(CCharacterCreation::s_character, true);
} }

View File

@ -30,6 +30,7 @@ class CCharacterCreation {
static void Dress(); static void Dress();
static int32_t GetRandomClassID(); static int32_t GetRandomClassID();
static void GetRandomRaceAndSex(ComponentData* data); static void GetRandomRaceAndSex(ComponentData* data);
static int32_t GetSelectedRaceID();
static void Initialize(); static void Initialize();
static bool IsClassValid(int32_t classID); static bool IsClassValid(int32_t classID);
static bool IsRaceClassValid(int32_t raceID, int32_t classID); static bool IsRaceClassValid(int32_t raceID, int32_t classID);

View File

@ -249,7 +249,20 @@ int32_t Script_SetSelectedRace(lua_State* L) {
} }
int32_t Script_SetSelectedSex(lua_State* L) { int32_t Script_SetSelectedSex(lua_State* L) {
WHOA_UNIMPLEMENTED(0); if (!lua_isnumber(L, 1)) {
luaL_error(L, "Usage: SetSelectedSex(index)");
return 0;
}
auto sexIndex = lua_tointeger(L, 1);
for (int32_t sexID = 0; sexID < UNITSEX_LAST; sexID++) {
if (sexIndex == g_glueFrameScriptGenders[sexID]) {
CCharacterCreation::SetSelectedSex(sexID);
}
}
return 0;
} }
int32_t Script_SetSelectedClass(lua_State* L) { int32_t Script_SetSelectedClass(lua_State* L) {