feat(glue): implement Script_SetSelectedRace

This commit is contained in:
fallenoak 2025-12-30 22:53:18 -06:00
parent def6b42a7b
commit fdbcf6a9f1
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
7 changed files with 126 additions and 17 deletions

View File

@ -1048,6 +1048,21 @@ void CCharacterComponent::GeosRenderPrep() {
this->m_flags &= ~0x4; this->m_flags &= ~0x4;
} }
void CCharacterComponent::GetPreferences(CharacterPreferences* preferences) {
if (!preferences) {
return;
}
preferences->raceID = this->m_data.raceID;
preferences->sexID = this->m_data.sexID;
preferences->classID = this->m_data.classID;
preferences->hairColorID = this->m_data.hairColorID;
preferences->skinColorID = this->m_data.skinColorID;
preferences->faceID = this->m_data.faceID;
preferences->facialHairStyleID = this->m_data.facialHairStyleID;
preferences->hairStyleID = this->m_data.hairStyleID;
}
CharSectionsRec* CCharacterComponent::GetSectionsRecord(COMPONENT_VARIATIONS sectionIndex, int32_t variationIndex, int32_t colorIndex, bool* found) { CharSectionsRec* CCharacterComponent::GetSectionsRecord(COMPONENT_VARIATIONS sectionIndex, int32_t variationIndex, int32_t colorIndex, bool* found) {
return ComponentGetSectionsRecord( return ComponentGetSectionsRecord(
CCharacterComponent::s_chrVarArray, CCharacterComponent::s_chrVarArray,

View File

@ -88,6 +88,7 @@ class CCharacterComponent {
void CreateBaseTexture(); void CreateBaseTexture();
void* CreateTexture(const ItemDisplayInfoRec* displayRec, int32_t section); void* CreateTexture(const ItemDisplayInfoRec* displayRec, int32_t section);
void GeosRenderPrep(); void GeosRenderPrep();
void GetPreferences(CharacterPreferences* preferences);
CharSectionsRec* GetSectionsRecord(COMPONENT_VARIATIONS sectionIndex, int32_t variationIndex, int32_t colorIndex, bool* found); CharSectionsRec* GetSectionsRecord(COMPONENT_VARIATIONS sectionIndex, int32_t variationIndex, int32_t colorIndex, bool* found);
int32_t Init(ComponentData* data, const char* a3); int32_t Init(ComponentData* data, const char* a3);
int32_t ItemsLoaded(int32_t a2); int32_t ItemsLoaded(int32_t a2);

View File

@ -1,21 +1,6 @@
#include "component/ComponentData.hpp" #include "component/ComponentData.hpp"
#include "component/Types.hpp" #include "component/Types.hpp"
void ComponentData::GetPreferences(CharacterPreferences* preferences) {
if (!preferences) {
return;
}
preferences->raceID = this->raceID;
preferences->sexID = this->sexID;
preferences->classID = this->classID;
preferences->hairColorID = this->hairColorID;
preferences->skinColorID = this->skinColorID;
preferences->faceID = this->faceID;
preferences->facialHairStyleID = this->facialHairStyleID;
preferences->hairStyleID = this->hairStyleID;
}
void ComponentData::SetPreferences(CharacterPreferences* preferences) { void ComponentData::SetPreferences(CharacterPreferences* preferences) {
if (!preferences) { if (!preferences) {
return; return;

View File

@ -42,7 +42,6 @@ struct ComponentData {
1801, 1801,
}; };
void GetPreferences(CharacterPreferences* preferences);
void SetPreferences(CharacterPreferences* preferences); void SetPreferences(CharacterPreferences* preferences);
}; };

View File

@ -1,4 +1,5 @@
#include "glue/CCharacterCreation.hpp" #include "glue/CCharacterCreation.hpp"
#include "glue/CCharacterSelection.hpp"
#include "component/CCharacterComponent.hpp" #include "component/CCharacterComponent.hpp"
#include "component/Types.hpp" #include "component/Types.hpp"
#include "db/Db.hpp" #include "db/Db.hpp"
@ -10,6 +11,7 @@
CCharacterComponent* CCharacterCreation::s_character; CCharacterComponent* CCharacterCreation::s_character;
CSimpleModelFFX* CCharacterCreation::s_charCustomizeFrame; CSimpleModelFFX* CCharacterCreation::s_charCustomizeFrame;
float CCharacterCreation::s_charFacing; float CCharacterCreation::s_charFacing;
CharacterPreferences* CCharacterCreation::s_charPreferences[22][2];
TSFixedArray<const ChrClassesRec*> CCharacterCreation::s_classes; TSFixedArray<const ChrClassesRec*> CCharacterCreation::s_classes;
int32_t CCharacterCreation::s_existingCharacterIndex; int32_t CCharacterCreation::s_existingCharacterIndex;
int32_t CCharacterCreation::s_raceIndex; int32_t CCharacterCreation::s_raceIndex;
@ -262,6 +264,20 @@ void CCharacterCreation::SetFacing(float orientation) {
} }
} }
void CCharacterCreation::SavePreferences() {
auto raceID = CCharacterCreation::s_races.m_data[CCharacterCreation::s_raceIndex];
auto sexID = CCharacterCreation::s_character->m_data.sexID;
auto preferences = CCharacterCreation::s_charPreferences[raceID][sexID];
if (!preferences) {
preferences = STORM_NEW(CharacterPreferences);
CCharacterCreation::s_charPreferences[raceID][sexID] = preferences;
}
CCharacterCreation::s_character->GetPreferences(preferences);
}
void CCharacterCreation::SetSelectedClass(int32_t classID) { void CCharacterCreation::SetSelectedClass(int32_t classID) {
if (!CCharacterCreation::IsClassValid(classID)) { if (!CCharacterCreation::IsClassValid(classID)) {
return; return;
@ -287,3 +303,82 @@ void CCharacterCreation::SetSelectedClass(int32_t classID) {
CGlueLoading::StartLoad(CCharacterCreation::s_character, true); CGlueLoading::StartLoad(CCharacterCreation::s_character, true);
} }
void CCharacterCreation::SetSelectedRace(int32_t raceIndex) {
if (raceIndex >= CCharacterCreation::s_races.Count() || raceIndex == CCharacterCreation::s_raceIndex) {
return;
}
auto selectedRaceID = CCharacterCreation::s_races[raceIndex];
auto selectedSexID = CCharacterCreation::s_character->m_data.sexID;
CCharacterCreation::SavePreferences();
CCharacterCreation::s_raceIndex = raceIndex;
ComponentData data = {};
auto existingCharacter = CCharacterCreation::s_existingCharacterIndex >= 0
? CCharacterSelection::GetCharacterDisplay(CCharacterCreation::s_existingCharacterIndex)
: nullptr;
bool useExistingCharacter = existingCharacter
&& existingCharacter->m_info.raceID == selectedRaceID
&& existingCharacter->m_info.customizeFlags & 0x110000;
bool usePreferences = !useExistingCharacter &&
CCharacterCreation::s_charPreferences[selectedRaceID][selectedSexID];
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);
CCharacterCreation::SetSelectedSex(existingCharacter->m_info.sexID);
} else if (usePreferences) {
auto preferences = CCharacterCreation::s_charPreferences[selectedRaceID][selectedSexID];
data.SetPreferences(preferences);
CCharacterCreation::CalcClasses(data.raceID);
if (!CCharacterCreation::IsRaceClassValid(data.raceID, CCharacterCreation::s_selectedClassID)) {
CCharacterCreation::s_selectedClassID = CCharacterCreation::GetRandomClassID();
}
data.classID = CCharacterCreation::s_selectedClassID;
// TODO CCharacterComponent::ValidateComponentData(&data, 0);
CCharacterCreation::CreateComponent(&data, false);
} else {
data.raceID = selectedRaceID;
data.sexID = selectedSexID;
CCharacterCreation::CalcClasses(data.raceID);
if (!CCharacterCreation::IsRaceClassValid(data.raceID, CCharacterCreation::s_selectedClassID)) {
CCharacterCreation::SetSelectedClass(CCharacterCreation::GetRandomClassID());
}
data.classID = CCharacterCreation::s_selectedClassID;
CCharacterCreation::CreateComponent(&data, true);
}
// TODO name gen stuff
CCharacterCreation::Dress();
CGlueLoading::StartLoad(CCharacterCreation::s_character, true);
}
void CCharacterCreation::SetSelectedSex(int32_t sexID) {
// TODO
}

View File

@ -7,6 +7,8 @@
class ChrClassesRec; class ChrClassesRec;
class CCharacterComponent; class CCharacterComponent;
class CSimpleModelFFX; class CSimpleModelFFX;
struct CharacterPreferences;
struct ComponentData; struct ComponentData;
class CCharacterCreation { class CCharacterCreation {
@ -15,6 +17,7 @@ class CCharacterCreation {
static CCharacterComponent* s_character; static CCharacterComponent* s_character;
static CSimpleModelFFX* s_charCustomizeFrame; static CSimpleModelFFX* s_charCustomizeFrame;
static float s_charFacing; static float s_charFacing;
static CharacterPreferences* s_charPreferences[22][2];
static TSFixedArray<const ChrClassesRec*> s_classes; static TSFixedArray<const ChrClassesRec*> s_classes;
static int32_t s_existingCharacterIndex; static int32_t s_existingCharacterIndex;
static int32_t s_raceIndex; static int32_t s_raceIndex;
@ -31,9 +34,12 @@ class CCharacterCreation {
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);
static void ResetCharCustomizeInfo(); static void ResetCharCustomizeInfo();
static void SavePreferences();
static void SetCharCustomizeModel(const char* filename); static void SetCharCustomizeModel(const char* filename);
static void SetFacing(float orientation); static void SetFacing(float orientation);
static void SetSelectedClass(int32_t classID); static void SetSelectedClass(int32_t classID);
static void SetSelectedRace(int32_t raceIndex);
static void SetSelectedSex(int32_t sexID);
}; };
#endif #endif

View File

@ -237,7 +237,15 @@ int32_t Script_GetSelectedClass(lua_State* L) {
} }
int32_t Script_SetSelectedRace(lua_State* L) { int32_t Script_SetSelectedRace(lua_State* L) {
WHOA_UNIMPLEMENTED(0); if (!lua_isnumber(L, 1)) {
luaL_error(L, "Usage: SetSelectedRace(index)");
return 0;
}
auto raceIndex = lua_tointeger(L, 1);
CCharacterCreation::SetSelectedRace(raceIndex - 1);
return 0;
} }
int32_t Script_SetSelectedSex(lua_State* L) { int32_t Script_SetSelectedSex(lua_State* L) {