From 0564f803174bea2e2bf9704d41fd99336bc5d635 Mon Sep 17 00:00:00 2001 From: Qudix <17361645+Qudix@users.noreply.github.com> Date: Sat, 5 Oct 2024 18:55:01 -0500 Subject: [PATCH] feat: `ChargenMenu` --- include/RE/C/ChargenMenu.h | 127 ++++++++++++++++++++++++++++++++++ include/RE/G/GameMenuBase.h | 6 +- include/RE/I/IDataModel.h | 19 +++++ include/RE/I/IMenu.h | 1 + include/RE/M/MenuPaperDoll.h | 35 ++++++++++ include/RE/T/TESNPCData.h | 16 +---- include/RE/U/UICellRenderer.h | 29 ++++++++ 7 files changed, 215 insertions(+), 18 deletions(-) create mode 100644 include/RE/C/ChargenMenu.h create mode 100644 include/RE/I/IDataModel.h create mode 100644 include/RE/M/MenuPaperDoll.h create mode 100644 include/RE/U/UICellRenderer.h diff --git a/include/RE/C/ChargenMenu.h b/include/RE/C/ChargenMenu.h new file mode 100644 index 00000000..02265d1a --- /dev/null +++ b/include/RE/C/ChargenMenu.h @@ -0,0 +1,127 @@ +#pragma once + +#include "RE/G/GameMenuBase.h" +#include "RE/I/IDataModel.h" + +namespace RE +{ + class MenuPaperDoll; + class TESNPC; + + struct CharGen_CloseMenu; + struct CharGen_PresetChange; + struct CharGen_HeadpartPresetChange; + struct CharGen_SetSex; + struct CharGen_SetSlider; + struct CharGen_StartTextEntry; + struct CharGen_EndTextEntry; + struct CharGen_CancelTextEntry; + struct CharGen_ShowPlayerRenameMessage; + struct CharGen_ShowChooseBackgroundMessage; + struct CharGen_SetBodyValues; + struct CharGen_SetCameraPosition; + struct CharGen_HeadpartPlusSelectorChange; + struct CharGen_SkintoneChange; + struct CharGen_DirtScarsEtcChange; + struct CharGen_ToggleMarking; + struct CharGen_SetTrait; + struct CharGen_SetBackground; + struct CharGen_EyeColorChange; + struct CharGen_BrowChange; + struct CharGen_HairChange; + struct CharGen_HairColorChange; + struct CharGen_FacialHairChange; + struct CharGen_FacialHairColorChange; + struct CharGen_BrowColorChange; + struct CharGen_TeethChange; + struct CharGen_CyclePronoun; + struct CharGen_SetPronoun; + struct CharGen_TogglePreviewHabSuit; + struct CharGen_SwitchLocomotion; + struct CharGen_SwitchBodyType; + struct CharGen_RotatePaperdoll; + struct CharGen_RollOnLocomotion; + struct CharGen_RollOffLocomotion; + struct CharGen_TeethRollOn; + struct CharGen_TeethRollOff; + struct CharGen_JewelryChange; + struct CharGen_JewelryColorChange; + struct CharGen_StartBodyChange; + struct CharGen_EndBodyChange; + struct CharGen_SetAdditionalSlider; + struct CharGen_SetBlockInputUnderPopup; + struct CharGen_PostBlendFaceChange; + struct CharGen_PostBlendColorOptionChange; + struct CharGen_PostBlendIntensityChange; + struct CharGen_MakeupChange; + struct CharGen_MarkingsChange; + struct UIMenuChargenMenuDisablePaperdoll; + + class ChargenMenu : + public GameMenuBase, // 000 + public IDataModel, // 138 + public BSTEventSink, // 140 + public BSTEventSink, // 148 + public BSTEventSink, // 150 + public BSTEventSink, // 158 + public BSTEventSink, // 160 + public BSTEventSink, // 168 + public BSTEventSink, // 170 + public BSTEventSink, // 178 + public BSTEventSink, // 180 + public BSTEventSink, // 188 + public BSTEventSink, // 190 + public BSTEventSink, // 198 + public BSTEventSink, // 1A0 + public BSTEventSink, // 1A8 + public BSTEventSink, // 1B0 + public BSTEventSink, // 1B8 + public BSTEventSink, // 1C0 + public BSTEventSink, // 1C8 + public BSTEventSink, // 1D0 + public BSTEventSink, // 1D8 + public BSTEventSink, // 1E0 + public BSTEventSink, // 1E8 + public BSTEventSink, // 1F0 + public BSTEventSink, // 1F8 + public BSTEventSink, // 200 + public BSTEventSink, // 208 + public BSTEventSink, // 210 + public BSTEventSink, // 218 + public BSTEventSink, // 220 + public BSTEventSink, // 228 + public BSTEventSink, // 230 + public BSTEventSink, // 238 + public BSTEventSink, // 240 + public BSTEventSink, // 248 + public BSTEventSink, // 250 + public BSTEventSink, // 258 + public BSTEventSink, // 260 + public BSTEventSink, // 268 + public BSTEventSink, // 270 + public BSTEventSink, // 278 + public BSTEventSink, // 280 + public BSTEventSink, // 288 + public BSTEventSink, // 290 + public BSTEventSink, // 298 + public BSTEventSink, // 2A0 + public BSTEventSink, // 2A8 + public BSTEventSink, // 2B0 + public BSTEventSink // 2B8 + { + public: + SF_RTTI_VTABLE(ChargenMenu); + SF_MENU_NAME("ChargenMenu"); + + virtual ~ChargenMenu(); // 00 + + // members + MenuPaperDoll* paperDoll; // 2C8 + TESNPC* npc; // 2D0 + std::byte pad2D8[(0x5B8 - 0x2D8)]; // 2D8 + std::uint32_t cameraPosition; // 5B8 + std::uint32_t unk5BC; // 5BC + std::byte pad5C0[(0x650 - 0x5C0)]; // 5C0 + }; + static_assert(sizeof(ChargenMenu) == 0x650); +} diff --git a/include/RE/G/GameMenuBase.h b/include/RE/G/GameMenuBase.h index 6e8eb6b4..171f54fb 100644 --- a/include/RE/G/GameMenuBase.h +++ b/include/RE/G/GameMenuBase.h @@ -24,14 +24,14 @@ namespace RE virtual ~GameMenuBase() = default; // 00 //override - virtual uint64_t Unk10() override + virtual std::uint64_t Unk10() override { using func_t = decltype(&GameMenuBase::Unk10); static REL::Relocation func(REL::ID(141505)); return func(this); }; - virtual uint64_t Unk11() override + virtual std::uint64_t Unk11() override { using func_t = decltype(&GameMenuBase::Unk11); static REL::Relocation func(REL::ID(141506)); @@ -65,7 +65,7 @@ namespace RE return result; } - void RegisterNativeFunction(const char* a_name, uint64_t a_idx) + void RegisterNativeFunction(const char* a_name, std::uint64_t a_idx) { if (!uiMovie) { return; diff --git a/include/RE/I/IDataModel.h b/include/RE/I/IDataModel.h new file mode 100644 index 00000000..43c197c5 --- /dev/null +++ b/include/RE/I/IDataModel.h @@ -0,0 +1,19 @@ +#pragma once + +namespace RE +{ + class IDataModel + { + public: + SF_RTTI_VTABLE(IDataModel); + + virtual ~IDataModel(); + + virtual void Unk01(); + virtual void Unk02(); + virtual void Unk03(); + + // members + void* unk08; // 08 - model object? + }; +} diff --git a/include/RE/I/IMenu.h b/include/RE/I/IMenu.h index a9351137..2a2ab648 100644 --- a/include/RE/I/IMenu.h +++ b/include/RE/I/IMenu.h @@ -231,6 +231,7 @@ namespace RE std::uint64_t unk118; // 118 std::uint64_t unk120; // 120 std::uint64_t unk128; // 128 + std::uint64_t unk130; // 130 }; static_assert(offsetof(IMenu, uiMovie) == 0x088); static_assert(offsetof(IMenu, menuName) == 0x0B0); diff --git a/include/RE/M/MenuPaperDoll.h b/include/RE/M/MenuPaperDoll.h new file mode 100644 index 00000000..96457956 --- /dev/null +++ b/include/RE/M/MenuPaperDoll.h @@ -0,0 +1,35 @@ +#pragma once + +#include "RE/U/UICellRenderer.h" + +namespace RE +{ + class BGSKeyword; + class MenuActor; + class TESObjectREFR; + + class MenuPaperDoll : + public UICellRenderer + { + public: + SF_RTTI_VTABLE(MenuPaperDoll); + + virtual ~MenuPaperDoll(); // 00 + + // members + std::uint64_t unk070; // 070 + std::uint64_t unk078; // 078 + std::uint64_t unk080; // 080 + std::uint64_t unk088; // 088 + std::uint64_t unk090; // 090 + std::uint64_t unk098; // 098 + std::uint64_t unk0A0; // 0A0 + std::uint64_t unk0A8; // 0A8 + MenuActor* menuActor; // 0B0 + std::byte pad0B8[(0x1A0 - 0xB8)]; // 0B8 + BGSKeyword* unk1A0; // 1A0 + TESObjectREFR* unk1A8; // 1A8 + }; + static_assert(offsetof(MenuPaperDoll, menuActor) == 0xB0); + static_assert(offsetof(MenuPaperDoll, unk1A0) == 0x1A0); +} diff --git a/include/RE/T/TESNPCData.h b/include/RE/T/TESNPCData.h index 8f4d9ed6..9f3a5a15 100644 --- a/include/RE/T/TESNPCData.h +++ b/include/RE/T/TESNPCData.h @@ -1,25 +1,11 @@ #pragma once #include "RE/B/BSTSingleton.h" +#include "RE/I/IDataModel.h" namespace RE { class MenuActor; - - class IDataModel - { - public: - SF_RTTI_VTABLE(IDataModel); - - virtual ~IDataModel(); - - virtual void Unk01(); - virtual void Unk02(); - virtual void Unk03(); - - // members - void* unk08; // 08 - model object? - }; } namespace RE::TESNPCData diff --git a/include/RE/U/UICellRenderer.h b/include/RE/U/UICellRenderer.h new file mode 100644 index 00000000..c3891fa2 --- /dev/null +++ b/include/RE/U/UICellRenderer.h @@ -0,0 +1,29 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" + +namespace RE +{ + class TESObjectCELL; + + class UICellRenderer : + public BSIntrusiveRefCounted + { + public: + SF_RTTI_VTABLE(UICellRenderer); + + virtual ~UICellRenderer(); // 00 + + // members + TESObjectCELL* unk10; // 10 + void* unk18; // 18 - const BSResource2::TEntryType<0,LoadedCellDB::DBTraits, BSResource2::DBDefaultStreamPolicy> + float unk20; // 20 + float unk24; // 24 + std::uint64_t unk28; // 28 + void* unk30[4]; // 30 - const BSResource2::TEntryType<0,TextureDB::DBTraits, BSResource2::DBDefaultStreamPolicy> + std::uint64_t unk50; // 50 + std::uint8_t unk58[8]; // 58 + std::uint64_t unk60; // 60 + std::uint64_t unk68; // 68 - BSMenu3D::Scene + }; +}