From 660336044fbe384105687f162bb87890e6de3d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 22 Oct 2020 19:03:41 +0200 Subject: [PATCH] ksys/gdt: Implement more TriggerParam functions --- data/uking_functions.csv | 558 +++++------ src/KingSystem/GameData/CMakeLists.txt | 1 + src/KingSystem/GameData/gdtFlag.h | 37 +- src/KingSystem/GameData/gdtFlagProxy.h | 148 +++ src/KingSystem/GameData/gdtTriggerParam.cpp | 921 +++++++++++++++++- src/KingSystem/GameData/gdtTriggerParam.h | 274 +++++- src/KingSystem/Resource/resResourceGameData.h | 21 + src/KingSystem/System/PlayReportMgr.h | 2 + src/KingSystem/Utils/CMakeLists.txt | 1 + src/KingSystem/Utils/TypeTraits.h | 13 + 10 files changed, 1652 insertions(+), 324 deletions(-) create mode 100644 src/KingSystem/GameData/gdtFlagProxy.h create mode 100644 src/KingSystem/Utils/TypeTraits.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 6a3d1bd6..68281993 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -74339,75 +74339,79 @@ 0x0000007100dd8390,sub_7100DD8390,144, 0x0000007100dd8420,nullsub_5546,4, 0x0000007100dd8424,TriggerParam::ctor,140,_ZN4ksys3gdt12TriggerParamC1Ev -0x0000007100dd84b0,TriggerParam::copyFromBgdata,3644, -0x0000007100dd92ec,TriggerParam::init,128, -0x0000007100dd936c,TriggerParam::Buffer::sort,760, -0x0000007100dd9664,TriggerParam::d_0,2536, -0x0000007100dda04c,TriggerParam::d_1,260, -0x0000007100dda150,TriggerParam::destroyHeap,52, -0x0000007100dda184,TriggerParam::allocBuffer,12, -0x0000007100dda190,TriggerParam::allocBuffer2,12, -0x0000007100dda19c,TriggerParam::initResetData,4764, -0x0000007100ddb438,TriggerParam::initArrayForRevivalRandomBools,248, -0x0000007100ddb530,TriggerParam::initFromOther,3960, -0x0000007100ddc4a8,sub_7100DDC4A8,432, -0x0000007100ddc658,sub_7100DDC658,472, -0x0000007100ddc830,sub_7100DDC830,472, -0x0000007100ddca08,sub_7100DDCA08,612, -0x0000007100ddcc6c,sub_7100DDCC6C,612, -0x0000007100ddced0,sub_7100DDCED0,612, -0x0000007100ddd134,sub_7100DDD134,380, -0x0000007100ddd2b0,sub_7100DDD2B0,380, -0x0000007100ddd42c,sub_7100DDD42C,380, -0x0000007100ddd5a8,sub_7100DDD5A8,3816, -0x0000007100dde490,sub_7100DDE490,3176, -0x0000007100ddf0f8,TriggerParam::getBoolByIdx,124, -0x0000007100ddf174,TriggerParam::getIntByIdx,120, -0x0000007100ddf1ec,TriggerParam::getFloatByIdx,120, -0x0000007100ddf264,TriggerParam::getString32ByIdx,140, -0x0000007100ddf2f0,TriggerParam::getString64ByIdx,140, -0x0000007100ddf408,TriggerParam::getVec3ByIdx,124, -0x0000007100ddf484,TriggerParam::getBoolByKey_0,368, -0x0000007100ddf5f4,TriggerParam::getBoolByKey,368, -0x0000007100ddf764,TriggerParam::getIntByKey,364, -0x0000007100ddf8d0,TriggerParam::getFloatByKey,364, -0x0000007100ddfa3c,TriggerParam::getString32ByKey,384, -0x0000007100ddfbbc,TriggerParam::getString64ByKey,384, -0x0000007100ddfd3c,TriggerParam::getString256ByKey,384, -0x0000007100ddfebc,TriggerParam::getVec3ByKey,368, -0x0000007100de002c,TriggerParam::getBoolFromArray,164, -0x0000007100de00d0,TriggerParam::getS32FromArray,160, -0x0000007100de0170,TriggerParam::getF32FromArray,160, -0x0000007100de0210,TriggerParam::getString64FromArray,180, -0x0000007100de02c4,TriggerParam::getString256FromArray,180, -0x0000007100de04bc,TriggerParam::getBoolFromArrayByKey,356, -0x0000007100de0620,TriggerParam::getIntFromArrayByKey,352, -0x0000007100de0780,TriggerParam::getFloatFromArrayByKey,352, -0x0000007100de08e0,TriggerParam::getString32FromArrayByKey,372, -0x0000007100de0a54,TriggerParam::getString64FromArrayByKey,372, -0x0000007100de0bc8,TriggerParam::getString256FromArrayByKey,372, -0x0000007100de0d3c,sub_7100DE0D3C,56, -0x0000007100de0d74,sub_7100DE0D74,56, -0x0000007100de0dac,sub_7100DE0DAC,56, -0x0000007100de0de4,sub_7100DE0DE4,56, -0x0000007100de0e1c,sub_7100DE0E1C,56, -0x0000007100de0e54,sub_7100DE0E54,56, -0x0000007100de0e8c,sub_7100DE0E8C,56, -0x0000007100de0ec4,sub_7100DE0EC4,56, -0x0000007100de0efc,sub_7100DE0EFC,56, -0x0000007100de0f34,sub_7100DE0F34,192, -0x0000007100de0ff4,sub_7100DE0FF4,192, -0x0000007100de10b4,sub_7100DE10B4,192, -0x0000007100de1174,sub_7100DE1174,192, -0x0000007100de1234,sub_7100DE1234,192, -0x0000007100de12f4,sub_7100DE12F4,192, -0x0000007100de13b4,sub_7100DE13B4,192, -0x0000007100de1474,sub_7100DE1474,192, -0x0000007100de1534,sub_7100DE1534,192, -0x0000007100de15f4,TriggerParam::getIntArraySizeByKey,248, -0x0000007100de16ec,TriggerParam::getString64ArraySizeByKey,248, -0x0000007100de17e4,TriggerParam::getVec3fArraySizeByKey,248, -0x0000007100de1a20,TriggerParam::getS32Max,324, +0x0000007100dd84b0,TriggerParam::copyFromBgdata,3644,_ZN4ksys3gdt12TriggerParam19copyFromGameDataResEPNS_3res8GameDataEPN4sead4HeapE +0x0000007100dd92ec,TriggerParam::init,128,_ZN4ksys3gdt12TriggerParam4initEPN4sead4HeapE +0x0000007100dd936c,TriggerParam::Buffer::sort,760,_ZN4ksys3gdt12_GLOBAL__N_116sortFlagPtrArrayERN4sead8PtrArrayINS0_8FlagBaseEEE! +0x0000007100dd9664,TriggerParam::d_0,2536,_ZN4ksys3gdt12TriggerParam23allocCombinedFlagArraysEPN4sead4HeapE +0x0000007100dda04c,TriggerParam::d_1,260,_ZN4ksys3gdt12TriggerParam20updateBoolFlagCountsEv +0x0000007100dda150,TriggerParam::destroyHeap,52,_ZN4ksys3gdt12TriggerParam11destroyHeapEv +0x0000007100dda184,TriggerParam::allocBuffer,12,_ZN4ksys3gdt12TriggerParam10allocBoolsEiPN4sead4HeapE +0x0000007100dda190,TriggerParam::allocBuffer2,12,_ZN4ksys3gdt12TriggerParam9allocS32sEiPN4sead4HeapE +0x0000007100dda19c,TriggerParam::initResetData,4764,_ZN4ksys3gdt12TriggerParam13initResetDataEPN4sead4HeapE +0x0000007100ddb438,TriggerParam::initArrayForRevivalRandomBools,248,_ZN4ksys3gdt12TriggerParam22initRevivalRandomBoolsEPN4sead4HeapE +0x0000007100ddb530,TriggerParam::initFromOther,3960,_ZN4ksys3gdt12TriggerParam12copyAllFlagsERKS1_PN4sead4HeapEb +0x0000007100ddc4a8,sub_7100DDC4A8,432,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIbEEvRN4sead8PtrArrayINS0_8FlagBaseEEERKS6_iPNS3_4HeapEb +0x0000007100ddc658,sub_7100DDC658,472,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIiEEvRN4sead8PtrArrayINS0_8FlagBaseEEERKS6_iPNS3_4HeapEb +0x0000007100ddc830,sub_7100DDC830,472,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIfEEvRN4sead8PtrArrayINS0_8FlagBaseEEERKS6_iPNS3_4HeapEb +0x0000007100ddca08,sub_7100DDCA08,612,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIN4sead15FixedSafeStringILi32EEEEEvRNS3_8PtrArrayINS0_8FlagBaseEEERKS8_iPNS3_4HeapEb +0x0000007100ddcc6c,sub_7100DDCC6C,612,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIN4sead15FixedSafeStringILi64EEEEEvRNS3_8PtrArrayINS0_8FlagBaseEEERKS8_iPNS3_4HeapEb +0x0000007100ddced0,sub_7100DDCED0,612,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIN4sead15FixedSafeStringILi256EEEEEvRNS3_8PtrArrayINS0_8FlagBaseEEERKS8_iPNS3_4HeapEb +0x0000007100ddd134,sub_7100DDD134,380,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIN4sead7Vector2IfEEEEvRNS3_8PtrArrayINS0_8FlagBaseEEERKS8_iPNS3_4HeapEb +0x0000007100ddd2b0,sub_7100DDD2B0,380,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIN4sead7Vector3IfEEEEvRNS3_8PtrArrayINS0_8FlagBaseEEERKS8_iPNS3_4HeapEb +0x0000007100ddd42c,sub_7100DDD42C,380,_ZN4ksys3gdt12_GLOBAL__N_115makeFlagProxiesIN4sead7Vector4IfEEEEvRNS3_8PtrArrayINS0_8FlagBaseEEERKS8_iPNS3_4HeapEb +0x0000007100ddd5a8,sub_7100DDD5A8,3816,_ZN4ksys3gdt12TriggerParam18copyPermanentFlagsERKS1_PN4sead4HeapE +0x0000007100dde490,sub_7100DDE490,3176,_ZNK4ksys3gdt12TriggerParam11getFlagTypeERKN4sead14SafeStringBaseIcEE +0x0000007100ddf0f8,TriggerParam::getBoolByIdx,124,_ZNK4ksys3gdt12TriggerParam7getBoolEPbib +0x0000007100ddf174,TriggerParam::getIntByIdx,120,_ZNK4ksys3gdt12TriggerParam6getS32EPiib +0x0000007100ddf1ec,TriggerParam::getFloatByIdx,120,_ZNK4ksys3gdt12TriggerParam6getF32EPfib +0x0000007100ddf264,TriggerParam::getString32ByIdx,140,_ZNK4ksys3gdt12TriggerParam6getStrEPPKcib +0x0000007100ddf2f0,TriggerParam::getString64ByIdx,140,_ZNK4ksys3gdt12TriggerParam8getStr64EPPKcib +0x0000007100ddf37c,_ZNK4ksys3gdt12TriggerParam9getStr256EPPKcib,0x8c,_ZNK4ksys3gdt12TriggerParam9getStr256EPPKcib +0x0000007100ddf408,TriggerParam::getVec3ByIdx,124,_ZNK4ksys3gdt12TriggerParam8getVec3fEPN4sead7Vector3IfEEib +0x0000007100ddf484,TriggerParam::getBoolByKey_0,368,_ZNK4ksys3gdt12TriggerParam7getBoolEPbRKN4sead14SafeStringBaseIcEEb +0x0000007100ddf5f4,TriggerParam::getBoolByKey,368,_ZNK4ksys3gdt12TriggerParam8getBool2EPbRKN4sead14SafeStringBaseIcEEb +0x0000007100ddf764,TriggerParam::getIntByKey,364,_ZNK4ksys3gdt12TriggerParam6getS32EPiRKN4sead14SafeStringBaseIcEEb +0x0000007100ddf8d0,TriggerParam::getFloatByKey,364,_ZNK4ksys3gdt12TriggerParam6getF32EPfRKN4sead14SafeStringBaseIcEEb +0x0000007100ddfa3c,TriggerParam::getString32ByKey,384,_ZNK4ksys3gdt12TriggerParam6getStrEPPKcRKN4sead14SafeStringBaseIcEEb +0x0000007100ddfbbc,TriggerParam::getString64ByKey,384,_ZNK4ksys3gdt12TriggerParam8getStr64EPPKcRKN4sead14SafeStringBaseIcEEb +0x0000007100ddfd3c,TriggerParam::getString256ByKey,384,_ZNK4ksys3gdt12TriggerParam9getStr256EPPKcRKN4sead14SafeStringBaseIcEEb +0x0000007100ddfebc,TriggerParam::getVec3ByKey,368,_ZNK4ksys3gdt12TriggerParam8getVec3fEPN4sead7Vector3IfEERKNS2_14SafeStringBaseIcEEb +0x0000007100de002c,TriggerParam::getBoolFromArray,164,_ZNK4ksys3gdt12TriggerParam7getBoolEPbiib +0x0000007100de00d0,TriggerParam::getS32FromArray,160,_ZNK4ksys3gdt12TriggerParam6getS32EPiiib +0x0000007100de0170,TriggerParam::getF32FromArray,160,_ZNK4ksys3gdt12TriggerParam6getF32EPfiib +0x0000007100de0210,TriggerParam::getString64FromArray,180,_ZNK4ksys3gdt12TriggerParam8getStr64EPPKciib +0x0000007100de02c4,TriggerParam::getString256FromArray,180,_ZNK4ksys3gdt12TriggerParam9getStr256EPPKciib +0x0000007100DE0378,_ZNK4ksys3gdt12TriggerParam8getVec2fEPN4sead7Vector2IfEEiib,0xa0,_ZNK4ksys3gdt12TriggerParam8getVec2fEPN4sead7Vector2IfEEiib +0x0000007100DE0418,_ZNK4ksys3gdt12TriggerParam8getVec3fEPN4sead7Vector3IfEEiib,0xa4,_ZNK4ksys3gdt12TriggerParam8getVec3fEPN4sead7Vector3IfEEiib +0x0000007100de04bc,TriggerParam::getBoolFromArrayByKey,356,_ZNK4ksys3gdt12TriggerParam7getBoolEPbRKN4sead14SafeStringBaseIcEEib +0x0000007100de0620,TriggerParam::getIntFromArrayByKey,352,_ZNK4ksys3gdt12TriggerParam6getS32EPiRKN4sead14SafeStringBaseIcEEib +0x0000007100de0780,TriggerParam::getFloatFromArrayByKey,352,_ZNK4ksys3gdt12TriggerParam6getF32EPfRKN4sead14SafeStringBaseIcEEib +0x0000007100de08e0,TriggerParam::getString32FromArrayByKey,372,_ZNK4ksys3gdt12TriggerParam6getStrEPPKcRKN4sead14SafeStringBaseIcEEib +0x0000007100de0a54,TriggerParam::getString64FromArrayByKey,372,_ZNK4ksys3gdt12TriggerParam8getStr64EPPKcRKN4sead14SafeStringBaseIcEEib +0x0000007100de0bc8,TriggerParam::getString256FromArrayByKey,372,_ZNK4ksys3gdt12TriggerParam9getStr256EPPKcRKN4sead14SafeStringBaseIcEEib +0x0000007100de0d3c,sub_7100DE0D3C,56,_ZNK4ksys3gdt12TriggerParam16getBoolArraySizeEPii +0x0000007100de0d74,sub_7100DE0D74,56,_ZNK4ksys3gdt12TriggerParam15getS32ArraySizeEPii +0x0000007100de0dac,sub_7100DE0DAC,56,_ZNK4ksys3gdt12TriggerParam15getF32ArraySizeEPii +0x0000007100de0de4,sub_7100DE0DE4,56,_ZNK4ksys3gdt12TriggerParam15getStrArraySizeEPii +0x0000007100de0e1c,sub_7100DE0E1C,56,_ZNK4ksys3gdt12TriggerParam17getStr64ArraySizeEPii +0x0000007100de0e54,sub_7100DE0E54,56,_ZNK4ksys3gdt12TriggerParam18getStr256ArraySizeEPii +0x0000007100de0e8c,sub_7100DE0E8C,56,_ZNK4ksys3gdt12TriggerParam17getVec2fArraySizeEPii +0x0000007100de0ec4,sub_7100DE0EC4,56,_ZNK4ksys3gdt12TriggerParam17getVec3fArraySizeEPii +0x0000007100de0efc,sub_7100DE0EFC,56,_ZNK4ksys3gdt12TriggerParam17getVec4fArraySizeEPii +0x0000007100de0f34,sub_7100DE0F34,192,_ZNK4ksys3gdt12TriggerParam22getBoolArraySizeByHashEPij +0x0000007100de0ff4,sub_7100DE0FF4,192,_ZNK4ksys3gdt12TriggerParam21getS32ArraySizeByHashEPij +0x0000007100de10b4,sub_7100DE10B4,192,_ZNK4ksys3gdt12TriggerParam21getF32ArraySizeByHashEPij +0x0000007100de1174,sub_7100DE1174,192,_ZNK4ksys3gdt12TriggerParam21getStrArraySizeByHashEPij +0x0000007100de1234,sub_7100DE1234,192,_ZNK4ksys3gdt12TriggerParam23getStr64ArraySizeByHashEPij +0x0000007100de12f4,sub_7100DE12F4,192,_ZNK4ksys3gdt12TriggerParam24getStr256ArraySizeByHashEPij +0x0000007100de13b4,sub_7100DE13B4,192,_ZNK4ksys3gdt12TriggerParam23getVec2fArraySizeByHashEPij +0x0000007100de1474,sub_7100DE1474,192,_ZNK4ksys3gdt12TriggerParam23getVec3fArraySizeByHashEPij +0x0000007100de1534,sub_7100DE1534,192,_ZNK4ksys3gdt12TriggerParam23getVec4fArraySizeByHashEPij +0x0000007100de15f4,TriggerParam::getIntArraySizeByKey,248,_ZNK4ksys3gdt12TriggerParam15getS32ArraySizeEPiRKN4sead14SafeStringBaseIcEE +0x0000007100de16ec,TriggerParam::getString64ArraySizeByKey,248,_ZNK4ksys3gdt12TriggerParam17getStr64ArraySizeEPiRKN4sead14SafeStringBaseIcEE +0x0000007100de17e4,TriggerParam::getVec3fArraySizeByKey,248,_ZNK4ksys3gdt12TriggerParam17getVec3fArraySizeEPiRKN4sead14SafeStringBaseIcEE +0x0000007100DE18DC,_ZNK4ksys3gdt12TriggerParam17getMinValueForS32EPiRKN4sead14SafeStringBaseIcEE,0x144,_ZNK4ksys3gdt12TriggerParam17getMinValueForS32EPiRKN4sead14SafeStringBaseIcEE +0x0000007100de1a20,TriggerParam::getS32Max,324,_ZNK4ksys3gdt12TriggerParam17getMaxValueForS32EPiRKN4sead14SafeStringBaseIcEE 0x0000007100de1b64,TriggerParam::setBoolByIndex,236, 0x0000007100de1c50,sub_7100DE1C50,260, 0x0000007100de1d54,TriggerParam::postSetFlagMaybe,360, @@ -74490,21 +74494,21 @@ 0x0000007100df0778,TriggerParam::getGameDataFlagBool,32, 0x0000007100df0798,TriggerParam::getBoolFlag,256, 0x0000007100df0898,sub_7100DF0898,32, -0x0000007100df08b8,TriggerParam::getBoolIdx,184, -0x0000007100df0970,TriggerParam::getS32Idx,184, -0x0000007100df0a28,TriggerParam::getF32Idx,184, -0x0000007100df0ae0,TriggerParam::getString32Idx,184, -0x0000007100df0b98,TriggerParam::getString64Idx,184, -0x0000007100df0c50,TriggerParam::getString256Idx,184, -0x0000007100df0d08,TriggerParam::getVec2Idx,184, -0x0000007100df0dc0,TriggerParam::getVec3Idx,184, -0x0000007100df0e78,TriggerParam::getBoolArrayIdx,144, -0x0000007100df0f08,TriggerParam::getIntArrayIdx,144, -0x0000007100df0f98,TriggerParam::getFloatArrayIdx,144, -0x0000007100df1028,TriggerParam::getString64ArrayIdx,144, -0x0000007100df10b8,TriggerParam::getString256ArrayIdx,144, -0x0000007100df1148,TriggerParam::getVec2ArrayIdx,144, -0x0000007100df11d8,TriggerParam::getVec3ArrayIdx,144, +0x0000007100df08b8,TriggerParam::getBoolIdx,184,_ZNK4ksys3gdt12TriggerParam10getBoolIdxEj +0x0000007100df0970,TriggerParam::getS32Idx,184,_ZNK4ksys3gdt12TriggerParam9getS32IdxEj +0x0000007100df0a28,TriggerParam::getF32Idx,184,_ZNK4ksys3gdt12TriggerParam9getF32IdxEj +0x0000007100df0ae0,TriggerParam::getString32Idx,184,_ZNK4ksys3gdt12TriggerParam9getStrIdxEj +0x0000007100df0b98,TriggerParam::getString64Idx,184,_ZNK4ksys3gdt12TriggerParam11getStr64IdxEj +0x0000007100df0c50,TriggerParam::getString256Idx,184,_ZNK4ksys3gdt12TriggerParam12getStr256IdxEj +0x0000007100df0d08,TriggerParam::getVec2Idx,184,_ZNK4ksys3gdt12TriggerParam11getVec2fIdxEj +0x0000007100df0dc0,TriggerParam::getVec3Idx,184,_ZNK4ksys3gdt12TriggerParam11getVec3fIdxEj +0x0000007100df0e78,TriggerParam::getBoolArrayIdx,144,_ZNK4ksys3gdt12TriggerParam15getBoolArrayIdxEj +0x0000007100df0f08,TriggerParam::getIntArrayIdx,144,_ZNK4ksys3gdt12TriggerParam14getS32ArrayIdxEj +0x0000007100df0f98,TriggerParam::getFloatArrayIdx,144,_ZNK4ksys3gdt12TriggerParam14getF32ArrayIdxEj +0x0000007100df1028,TriggerParam::getString64ArrayIdx,144,_ZNK4ksys3gdt12TriggerParam16getStr64ArrayIdxEj +0x0000007100df10b8,TriggerParam::getString256ArrayIdx,144,_ZNK4ksys3gdt12TriggerParam17getStr256ArrayIdxEj +0x0000007100df1148,TriggerParam::getVec2ArrayIdx,144,_ZNK4ksys3gdt12TriggerParam16getVec2fArrayIdxEj +0x0000007100df11d8,TriggerParam::getVec3ArrayIdx,144,_ZNK4ksys3gdt12TriggerParam16getVec3fArrayIdxEj 0x0000007100df1268,TriggerParam::getS32Flag,256, 0x0000007100df1368,TriggerParam::getF32Flag,256, 0x0000007100df1468,TriggerParam::getString32Flag,256, @@ -74548,208 +74552,208 @@ 0x0000007100df2aa8,sub_7100DF2AA8,8, 0x0000007100df2ab0,sub_7100DF2AB0,36, 0x0000007100df2ad4,sub_7100DF2AD4,16, -0x0000007100df2ae4,nullsub_3860,4, -0x0000007100df2ae8,j__ZdlPv_896,4, -0x0000007100df2aec,sub_7100DF2AEC,16, -0x0000007100df2afc,sub_7100DF2AFC,16, -0x0000007100df2b0c,sub_7100DF2B0C,36, -0x0000007100df2b30,sub_7100DF2B30,20, -0x0000007100df2b44,sub_7100DF2B44,16, -0x0000007100df2b54,sub_7100DF2B54,16, -0x0000007100df2b64,sub_7100DF2B64,88, -0x0000007100df2bbc,sub_7100DF2BBC,76, -0x0000007100df2c08,sub_7100DF2C08,60, -0x0000007100df2c44,sub_7100DF2C44,64, -0x0000007100df2c84,sub_7100DF2C84,16, -0x0000007100df2c94,sub_7100DF2C94,16, +0x0000007100df2ae4,nullsub_3860,4,_ZN4ksys3gdt8FlagBaseD2Ev +0x0000007100df2ae8,j__ZdlPv_896,4,_ZN4ksys3gdt9FlagProxyIbED0Ev +0x0000007100df2aec,sub_7100DF2AEC,16,_ZNK4ksys3gdt9FlagProxyIbE7getHashEv +0x0000007100df2afc,sub_7100DF2AFC,16,_ZN4ksys3gdt9FlagProxyIbE7setHashEj +0x0000007100df2b0c,sub_7100DF2B0C,36,_ZNK4ksys3gdt9FlagProxyIbE7getTypeEv +0x0000007100df2b30,sub_7100DF2B30,20,_ZN4ksys3gdt9FlagProxyIbE7setTypeENS0_8FlagTypeE +0x0000007100df2b44,sub_7100DF2B44,16,_ZNK4ksys3gdt9FlagProxyIbE13getPropertiesEv +0x0000007100df2b54,sub_7100DF2B54,16,_ZN4ksys3gdt9FlagProxyIbE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df2b64,sub_7100DF2B64,88,_ZN4ksys3gdt9FlagProxyIbE19resetToInitialValueEv +0x0000007100df2bbc,sub_7100DF2BBC,76,_ZNK4ksys3gdt9FlagProxyIbE14isInitialValueEv +0x0000007100df2c08,sub_7100DF2C08,60,_ZNK4ksys3gdt9FlagProxyIbE11getCategoryEv +0x0000007100df2c44,sub_7100DF2C44,64,_ZN4ksys3gdt9FlagProxyIbE11setCategoryEj +0x0000007100df2c84,sub_7100DF2C84,16,_ZNK4ksys3gdt9FlagProxyIbE7getNameEv +0x0000007100df2c94,sub_7100DF2C94,16,_ZNK4ksys3gdt9FlagProxyIbE12getDeleteRevEv 0x0000007100df2ca4,GameDataFlagBool::getRandomResetData,36,_ZNK4ksys3gdt5FlagTIbE18getRandomResetDataEv -0x0000007100df2cc8,sub_7100DF2CC8,16, -0x0000007100df2cd8,sub_7100DF2CD8,16, -0x0000007100df2ce8,sub_7100DF2CE8,12, -0x0000007100df2cf4,sub_7100DF2CF4,8, -0x0000007100df2cfc,sub_7100DF2CFC,8, -0x0000007100df2d04,sub_7100DF2D04,52, -0x0000007100df2d38,sub_7100DF2D38,88, -0x0000007100df2d90,sub_7100DF2D90,16, -0x0000007100df2da0,j__ZdlPv_897,4, -0x0000007100df2da4,sub_7100DF2DA4,16, -0x0000007100df2db4,sub_7100DF2DB4,16, -0x0000007100df2dc4,sub_7100DF2DC4,36, -0x0000007100df2de8,sub_7100DF2DE8,20, -0x0000007100df2dfc,sub_7100DF2DFC,16, -0x0000007100df2e0c,sub_7100DF2E0C,16, -0x0000007100df2e1c,sub_7100DF2E1C,48, -0x0000007100df2e4c,sub_7100DF2E4C,68, -0x0000007100df2e90,sub_7100DF2E90,60, -0x0000007100df2ecc,sub_7100DF2ECC,64, -0x0000007100df2f0c,sub_7100DF2F0C,16, -0x0000007100df2f1c,sub_7100DF2F1C,16, +0x0000007100df2cc8,sub_7100DF2CC8,16,_ZNK4ksys3gdt9FlagProxyIbE9getConfigEv +0x0000007100df2cd8,sub_7100DF2CD8,16,_ZN4ksys3gdt9FlagProxyIbE9setConfigERKNS0_10FlagConfigIbEE +0x0000007100df2ce8,sub_7100DF2CE8,12,_ZNK4ksys3gdt9FlagProxyIbE8getValueEv +0x0000007100df2cf4,sub_7100DF2CF4,8,_ZN4ksys3gdt9FlagProxyIbE11getValueRefEv +0x0000007100df2cfc,sub_7100DF2CFC,8,_ZNK4ksys3gdt9FlagProxyIbE11getValueRefEv +0x0000007100df2d04,sub_7100DF2D04,52,_ZNK4ksys3gdt9FlagProxyIbE8hasValueERKb +0x0000007100df2d38,sub_7100DF2D38,88,_ZN4ksys3gdt9FlagProxyIbE8setValueEb +0x0000007100df2d90,sub_7100DF2D90,16,_ZNK4ksys3gdt9FlagProxyIbE12getDebugDataEv +0x0000007100df2da0,j__ZdlPv_897,4,_ZN4ksys3gdt9FlagProxyIiED0Ev +0x0000007100df2da4,sub_7100DF2DA4,16,_ZNK4ksys3gdt9FlagProxyIiE7getHashEv +0x0000007100df2db4,sub_7100DF2DB4,16,_ZN4ksys3gdt9FlagProxyIiE7setHashEj +0x0000007100df2dc4,sub_7100DF2DC4,36,_ZNK4ksys3gdt9FlagProxyIiE7getTypeEv +0x0000007100df2de8,sub_7100DF2DE8,20,_ZN4ksys3gdt9FlagProxyIiE7setTypeENS0_8FlagTypeE +0x0000007100df2dfc,sub_7100DF2DFC,16,_ZNK4ksys3gdt9FlagProxyIiE13getPropertiesEv +0x0000007100df2e0c,sub_7100DF2E0C,16,_ZN4ksys3gdt9FlagProxyIiE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df2e1c,sub_7100DF2E1C,48,_ZN4ksys3gdt9FlagProxyIiE19resetToInitialValueEv +0x0000007100df2e4c,sub_7100DF2E4C,68,_ZNK4ksys3gdt9FlagProxyIiE14isInitialValueEv +0x0000007100df2e90,sub_7100DF2E90,60,_ZNK4ksys3gdt9FlagProxyIiE11getCategoryEv +0x0000007100df2ecc,sub_7100DF2ECC,64,_ZN4ksys3gdt9FlagProxyIiE11setCategoryEj +0x0000007100df2f0c,sub_7100DF2F0C,16,_ZNK4ksys3gdt9FlagProxyIiE7getNameEv +0x0000007100df2f1c,sub_7100DF2F1C,16,_ZNK4ksys3gdt9FlagProxyIiE12getDeleteRevEv 0x0000007100df2f2c,sub_7100DF2F2C,32,_ZNK4ksys3gdt5FlagTIiE18getRandomResetDataEv -0x0000007100df2f4c,sub_7100DF2F4C,16, -0x0000007100df2f5c,sub_7100DF2F5C,16, -0x0000007100df2f6c,sub_7100DF2F6C,8, -0x0000007100df2f74,sub_7100DF2F74,8, -0x0000007100df2f7c,sub_7100DF2F7C,8, -0x0000007100df2f84,sub_7100DF2F84,48, -0x0000007100df2fb4,sub_7100DF2FB4,136, -0x0000007100df303c,sub_7100DF303C,16, -0x0000007100df304c,j__ZdlPv_898,4, -0x0000007100df3050,sub_7100DF3050,16, -0x0000007100df3060,sub_7100DF3060,16, -0x0000007100df3070,sub_7100DF3070,36, -0x0000007100df3094,sub_7100DF3094,20, -0x0000007100df30a8,sub_7100DF30A8,16, -0x0000007100df30b8,sub_7100DF30B8,16, -0x0000007100df30c8,sub_7100DF30C8,48, -0x0000007100df30f8,sub_7100DF30F8,76, -0x0000007100df3144,sub_7100DF3144,60, -0x0000007100df3180,sub_7100DF3180,64, -0x0000007100df31c0,sub_7100DF31C0,16, -0x0000007100df31d0,sub_7100DF31D0,16, +0x0000007100df2f4c,sub_7100DF2F4C,16,_ZNK4ksys3gdt9FlagProxyIiE9getConfigEv +0x0000007100df2f5c,sub_7100DF2F5C,16,_ZN4ksys3gdt9FlagProxyIiE9setConfigERKNS0_10FlagConfigIiEE +0x0000007100df2f6c,sub_7100DF2F6C,8,_ZNK4ksys3gdt9FlagProxyIiE8getValueEv +0x0000007100df2f74,sub_7100DF2F74,8,_ZN4ksys3gdt9FlagProxyIiE11getValueRefEv +0x0000007100df2f7c,sub_7100DF2F7C,8,_ZNK4ksys3gdt9FlagProxyIiE11getValueRefEv +0x0000007100df2f84,sub_7100DF2F84,48,_ZNK4ksys3gdt9FlagProxyIiE8hasValueERKi +0x0000007100df2fb4,sub_7100DF2FB4,136,_ZN4ksys3gdt9FlagProxyIiE8setValueEi +0x0000007100df303c,sub_7100DF303C,16,_ZNK4ksys3gdt9FlagProxyIiE12getDebugDataEv +0x0000007100df304c,j__ZdlPv_898,4,_ZN4ksys3gdt9FlagProxyIfED0Ev +0x0000007100df3050,sub_7100DF3050,16,_ZNK4ksys3gdt9FlagProxyIfE7getHashEv +0x0000007100df3060,sub_7100DF3060,16,_ZN4ksys3gdt9FlagProxyIfE7setHashEj +0x0000007100df3070,sub_7100DF3070,36,_ZNK4ksys3gdt9FlagProxyIfE7getTypeEv +0x0000007100df3094,sub_7100DF3094,20,_ZN4ksys3gdt9FlagProxyIfE7setTypeENS0_8FlagTypeE +0x0000007100df30a8,sub_7100DF30A8,16,_ZNK4ksys3gdt9FlagProxyIfE13getPropertiesEv +0x0000007100df30b8,sub_7100DF30B8,16,_ZN4ksys3gdt9FlagProxyIfE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df30c8,sub_7100DF30C8,48,_ZN4ksys3gdt9FlagProxyIfE19resetToInitialValueEv +0x0000007100df30f8,sub_7100DF30F8,76,_ZNK4ksys3gdt9FlagProxyIfE14isInitialValueEv +0x0000007100df3144,sub_7100DF3144,60,_ZNK4ksys3gdt9FlagProxyIfE11getCategoryEv +0x0000007100df3180,sub_7100DF3180,64,_ZN4ksys3gdt9FlagProxyIfE11setCategoryEj +0x0000007100df31c0,sub_7100DF31C0,16,_ZNK4ksys3gdt9FlagProxyIfE7getNameEv +0x0000007100df31d0,sub_7100DF31D0,16,_ZNK4ksys3gdt9FlagProxyIfE12getDeleteRevEv 0x0000007100df31e0,sub_7100DF31E0,32,_ZNK4ksys3gdt5FlagTIfE18getRandomResetDataEv -0x0000007100df3200,sub_7100DF3200,16, -0x0000007100df3210,sub_7100DF3210,16, -0x0000007100df3220,sub_7100DF3220,8, -0x0000007100df3228,sub_7100DF3228,8, -0x0000007100df3230,sub_7100DF3230,8, -0x0000007100df3238,sub_7100DF3238,48, -0x0000007100df3268,sub_7100DF3268,136, -0x0000007100df32f0,sub_7100DF32F0,16, -0x0000007100df3300,nullsub_3861,4, -0x0000007100df3304,j__ZdlPv_899,4, -0x0000007100df3308,sub_7100DF3308,16, -0x0000007100df3318,sub_7100DF3318,16, -0x0000007100df3328,sub_7100DF3328,36, -0x0000007100df334c,sub_7100DF334C,20, -0x0000007100df3360,sub_7100DF3360,16, -0x0000007100df3370,sub_7100DF3370,16, -0x0000007100df3380,sub_7100DF3380,236, -0x0000007100df346c,sub_7100DF346C,500, -0x0000007100df3660,sub_7100DF3660,60, -0x0000007100df369c,sub_7100DF369C,64, -0x0000007100df36dc,sub_7100DF36DC,16, -0x0000007100df36ec,sub_7100DF36EC,16, +0x0000007100df3200,sub_7100DF3200,16,_ZNK4ksys3gdt9FlagProxyIfE9getConfigEv +0x0000007100df3210,sub_7100DF3210,16,_ZN4ksys3gdt9FlagProxyIfE9setConfigERKNS0_10FlagConfigIfEE +0x0000007100df3220,sub_7100DF3220,8,_ZNK4ksys3gdt9FlagProxyIfE8getValueEv +0x0000007100df3228,sub_7100DF3228,8,_ZN4ksys3gdt9FlagProxyIfE11getValueRefEv +0x0000007100df3230,sub_7100DF3230,8,_ZNK4ksys3gdt9FlagProxyIfE11getValueRefEv +0x0000007100df3238,sub_7100DF3238,48,_ZNK4ksys3gdt9FlagProxyIfE8hasValueERKf +0x0000007100df3268,sub_7100DF3268,136,_ZN4ksys3gdt9FlagProxyIfE8setValueEf +0x0000007100df32f0,sub_7100DF32F0,16,_ZNK4ksys3gdt9FlagProxyIfE12getDebugDataEv +0x0000007100df3300,nullsub_3861,4,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEED2Ev +0x0000007100df3304,j__ZdlPv_899,4,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEED0Ev +0x0000007100df3308,sub_7100DF3308,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE7getHashEv +0x0000007100df3318,sub_7100DF3318,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE7setHashEj +0x0000007100df3328,sub_7100DF3328,36,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE7getTypeEv +0x0000007100df334c,sub_7100DF334C,20,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE7setTypeENS0_8FlagTypeE +0x0000007100df3360,sub_7100DF3360,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE13getPropertiesEv +0x0000007100df3370,sub_7100DF3370,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df3380,sub_7100DF3380,236,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE19resetToInitialValueEv +0x0000007100df346c,sub_7100DF346C,500,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE14isInitialValueEv +0x0000007100df3660,sub_7100DF3660,60,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE11getCategoryEv +0x0000007100df369c,sub_7100DF369C,64,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE11setCategoryEj +0x0000007100df36dc,sub_7100DF36DC,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE7getNameEv +0x0000007100df36ec,sub_7100DF36EC,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE12getDeleteRevEv 0x0000007100df36fc,sub_7100DF36FC,32,_ZNK4ksys3gdt5FlagTIN4sead15FixedSafeStringILi32EEEE18getRandomResetDataEv -0x0000007100df371c,sub_7100DF371C,16, -0x0000007100df372c,sub_7100DF372C,16, -0x0000007100df373c,_ZN4sead15FixedSafeStringILi57EEaSERKNS_14SafeStringBaseIcEE,308, -0x0000007100df3870,sub_7100DF3870,8, -0x0000007100df3878,sub_7100DF3878,8, -0x0000007100df3880,sub_7100DF3880,220, -0x0000007100df395c,sub_7100DF395C,1184, -0x0000007100df3dfc,sub_7100DF3DFC,16, -0x0000007100df3e0c,nullsub_3862,4, -0x0000007100df3e10,j__ZdlPv_900,4, -0x0000007100df3e14,sub_7100DF3E14,16, -0x0000007100df3e24,sub_7100DF3E24,16, -0x0000007100df3e34,sub_7100DF3E34,36, -0x0000007100df3e58,sub_7100DF3E58,20, -0x0000007100df3e6c,sub_7100DF3E6C,16, -0x0000007100df3e7c,sub_7100DF3E7C,16, -0x0000007100df3e8c,sub_7100DF3E8C,236, -0x0000007100df3f78,sub_7100DF3F78,500, -0x0000007100df416c,sub_7100DF416C,60, -0x0000007100df41a8,sub_7100DF41A8,64, -0x0000007100df41e8,sub_7100DF41E8,16, -0x0000007100df41f8,sub_7100DF41F8,16, +0x0000007100df371c,sub_7100DF371C,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE9getConfigEv +0x0000007100df372c,sub_7100DF372C,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE9setConfigERKNS0_10FlagConfigIS4_EE +0x0000007100df373c,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE8getValueEv,308,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE8getValueEv +0x0000007100df3870,sub_7100DF3870,8,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE11getValueRefEv +0x0000007100df3878,sub_7100DF3878,8,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE11getValueRefEv +0x0000007100df3880,sub_7100DF3880,220,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE8hasValueERKS4_ +0x0000007100df395c,sub_7100DF395C,1184,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE8setValueES4_ +0x0000007100df3dfc,sub_7100DF3DFC,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi32EEEE12getDebugDataEv +0x0000007100df3e0c,nullsub_3862,4,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEED2Ev +0x0000007100df3e10,j__ZdlPv_900,4,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEED0Ev +0x0000007100df3e14,sub_7100DF3E14,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE7getHashEv +0x0000007100df3e24,sub_7100DF3E24,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE7setHashEj +0x0000007100df3e34,sub_7100DF3E34,36,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE7getTypeEv +0x0000007100df3e58,sub_7100DF3E58,20,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE7setTypeENS0_8FlagTypeE +0x0000007100df3e6c,sub_7100DF3E6C,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE13getPropertiesEv +0x0000007100df3e7c,sub_7100DF3E7C,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df3e8c,sub_7100DF3E8C,236,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE19resetToInitialValueEv +0x0000007100df3f78,sub_7100DF3F78,500,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE14isInitialValueEv +0x0000007100df416c,sub_7100DF416C,60,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE11getCategoryEv +0x0000007100df41a8,sub_7100DF41A8,64,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE11setCategoryEj +0x0000007100df41e8,sub_7100DF41E8,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE7getNameEv +0x0000007100df41f8,sub_7100DF41F8,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE12getDeleteRevEv 0x0000007100df4208,sub_7100DF4208,32,_ZNK4ksys3gdt5FlagTIN4sead15FixedSafeStringILi64EEEE18getRandomResetDataEv -0x0000007100df4228,sub_7100DF4228,16, -0x0000007100df4238,sub_7100DF4238,16, -0x0000007100df4248,_ZN4sead15FixedSafeStringILi41EEaSERKNS_14SafeStringBaseIcEE,308, -0x0000007100df437c,sub_7100DF437C,8, -0x0000007100df4384,sub_7100DF4384,8, -0x0000007100df438c,sub_7100DF438C,220, -0x0000007100df4468,sub_7100DF4468,1188, -0x0000007100df490c,sub_7100DF490C,16, -0x0000007100df491c,nullsub_3863,4, -0x0000007100df4920,j__ZdlPv_901,4, -0x0000007100df4924,sub_7100DF4924,16, -0x0000007100df4934,sub_7100DF4934,16, -0x0000007100df4944,sub_7100DF4944,36, -0x0000007100df4968,sub_7100DF4968,20, -0x0000007100df497c,sub_7100DF497C,16, -0x0000007100df498c,sub_7100DF498C,16, -0x0000007100df499c,sub_7100DF499C,236, -0x0000007100df4a88,sub_7100DF4A88,500, -0x0000007100df4c7c,sub_7100DF4C7C,60, -0x0000007100df4cb8,sub_7100DF4CB8,64, -0x0000007100df4cf8,sub_7100DF4CF8,16, -0x0000007100df4d08,sub_7100DF4D08,16, +0x0000007100df4228,sub_7100DF4228,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE9getConfigEv +0x0000007100df4238,sub_7100DF4238,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE9setConfigERKNS0_10FlagConfigIS4_EE +0x0000007100df4248,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE8getValueEv,308,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE8getValueEv +0x0000007100df437c,sub_7100DF437C,8,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE11getValueRefEv +0x0000007100df4384,sub_7100DF4384,8,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE11getValueRefEv +0x0000007100df438c,sub_7100DF438C,220,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE8hasValueERKS4_ +0x0000007100df4468,sub_7100DF4468,1188,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE8setValueES4_ +0x0000007100df490c,sub_7100DF490C,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi64EEEE12getDebugDataEv +0x0000007100df491c,nullsub_3863,4,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEED2Ev +0x0000007100df4920,j__ZdlPv_901,4,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEED0Ev +0x0000007100df4924,sub_7100DF4924,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE7getHashEv +0x0000007100df4934,sub_7100DF4934,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE7setHashEj +0x0000007100df4944,sub_7100DF4944,36,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE7getTypeEv +0x0000007100df4968,sub_7100DF4968,20,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE7setTypeENS0_8FlagTypeE +0x0000007100df497c,sub_7100DF497C,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE13getPropertiesEv +0x0000007100df498c,sub_7100DF498C,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df499c,sub_7100DF499C,236,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE19resetToInitialValueEv +0x0000007100df4a88,sub_7100DF4A88,500,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE14isInitialValueEv +0x0000007100df4c7c,sub_7100DF4C7C,60,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE11getCategoryEv +0x0000007100df4cb8,sub_7100DF4CB8,64,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE11setCategoryEj +0x0000007100df4cf8,sub_7100DF4CF8,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE7getNameEv +0x0000007100df4d08,sub_7100DF4D08,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE12getDeleteRevEv 0x0000007100df4d18,sub_7100DF4D18,32,_ZNK4ksys3gdt5FlagTIN4sead15FixedSafeStringILi256EEEE18getRandomResetDataEv -0x0000007100df4d38,sub_7100DF4D38,16, -0x0000007100df4d48,sub_7100DF4D48,16, -0x0000007100df4d58,_ZN4sead15FixedSafeStringILi384EEaSERKNS_14SafeStringBaseIcEE,308, -0x0000007100df4e8c,sub_7100DF4E8C,8, -0x0000007100df4e94,sub_7100DF4E94,8, -0x0000007100df4e9c,sub_7100DF4E9C,228, -0x0000007100df4f80,sub_7100DF4F80,1184, -0x0000007100df5420,sub_7100DF5420,16, -0x0000007100df5430,j__ZdlPv_902,4, -0x0000007100df5434,sub_7100DF5434,16, -0x0000007100df5444,sub_7100DF5444,16, -0x0000007100df5454,sub_7100DF5454,36, -0x0000007100df5478,sub_7100DF5478,20, -0x0000007100df548c,sub_7100DF548C,16, -0x0000007100df549c,sub_7100DF549C,16, -0x0000007100df54ac,sub_7100DF54AC,56, -0x0000007100df54e4,sub_7100DF54E4,88, -0x0000007100df553c,sub_7100DF553C,60, -0x0000007100df5578,sub_7100DF5578,64, -0x0000007100df55b8,sub_7100DF55B8,16, -0x0000007100df55c8,sub_7100DF55C8,16, +0x0000007100df4d38,sub_7100DF4D38,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE9getConfigEv +0x0000007100df4d48,sub_7100DF4D48,16,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE9setConfigERKNS0_10FlagConfigIS4_EE +0x0000007100df4d58,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE8getValueEv,308,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE8getValueEv +0x0000007100df4e8c,sub_7100DF4E8C,8,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE11getValueRefEv +0x0000007100df4e94,sub_7100DF4E94,8,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE11getValueRefEv +0x0000007100df4e9c,sub_7100DF4E9C,228,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE8hasValueERKS4_ +0x0000007100df4f80,sub_7100DF4F80,1184,_ZN4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE8setValueES4_ +0x0000007100df5420,sub_7100DF5420,16,_ZNK4ksys3gdt9FlagProxyIN4sead15FixedSafeStringILi256EEEE12getDebugDataEv +0x0000007100df5430,j__ZdlPv_902,4,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEED0Ev +0x0000007100df5434,sub_7100DF5434,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE7getHashEv +0x0000007100df5444,sub_7100DF5444,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE7setHashEj +0x0000007100df5454,sub_7100DF5454,36,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE7getTypeEv +0x0000007100df5478,sub_7100DF5478,20,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE7setTypeENS0_8FlagTypeE +0x0000007100df548c,sub_7100DF548C,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE13getPropertiesEv +0x0000007100df549c,sub_7100DF549C,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df54ac,sub_7100DF54AC,56,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE19resetToInitialValueEv +0x0000007100df54e4,sub_7100DF54E4,88,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE14isInitialValueEv +0x0000007100df553c,sub_7100DF553C,60,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE11getCategoryEv +0x0000007100df5578,sub_7100DF5578,64,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE11setCategoryEj +0x0000007100df55b8,sub_7100DF55B8,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE7getNameEv +0x0000007100df55c8,sub_7100DF55C8,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE12getDeleteRevEv 0x0000007100df55d8,sub_7100DF55D8,32,_ZNK4ksys3gdt5FlagTIN4sead7Vector2IfEEE18getRandomResetDataEv -0x0000007100df55f8,sub_7100DF55F8,16, -0x0000007100df5608,sub_7100DF5608,16, -0x0000007100df5618,sub_7100DF5618,8, -0x0000007100df5620,sub_7100DF5620,8, -0x0000007100df5628,sub_7100DF5628,8, -0x0000007100df5630,sub_7100DF5630,64, -0x0000007100df5670,sub_7100DF5670,192, -0x0000007100df5730,sub_7100DF5730,16, -0x0000007100df5740,j__ZdlPv_903,4, -0x0000007100df5744,sub_7100DF5744,16, -0x0000007100df5754,sub_7100DF5754,16, -0x0000007100df5764,sub_7100DF5764,36, -0x0000007100df5788,sub_7100DF5788,20, -0x0000007100df579c,sub_7100DF579C,16, -0x0000007100df57ac,sub_7100DF57AC,16, -0x0000007100df57bc,sub_7100DF57BC,64, -0x0000007100df57fc,sub_7100DF57FC,108, -0x0000007100df5868,sub_7100DF5868,60, -0x0000007100df58a4,sub_7100DF58A4,64, -0x0000007100df58e4,sub_7100DF58E4,16, -0x0000007100df58f4,sub_7100DF58F4,16, +0x0000007100df55f8,sub_7100DF55F8,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE9getConfigEv +0x0000007100df5608,sub_7100DF5608,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE9setConfigERKNS0_10FlagConfigIS4_EE +0x0000007100df5618,sub_7100DF5618,8,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE8getValueEv +0x0000007100df5620,sub_7100DF5620,8,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE11getValueRefEv +0x0000007100df5628,sub_7100DF5628,8,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE11getValueRefEv +0x0000007100df5630,sub_7100DF5630,64,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE8hasValueERKS4_ +0x0000007100df5670,sub_7100DF5670,192,_ZN4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE8setValueES4_ +0x0000007100df5730,sub_7100DF5730,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector2IfEEE12getDebugDataEv +0x0000007100df5740,j__ZdlPv_903,4,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEED0Ev +0x0000007100df5744,sub_7100DF5744,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE7getHashEv +0x0000007100df5754,sub_7100DF5754,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE7setHashEj +0x0000007100df5764,sub_7100DF5764,36,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE7getTypeEv +0x0000007100df5788,sub_7100DF5788,20,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE7setTypeENS0_8FlagTypeE +0x0000007100df579c,sub_7100DF579C,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE13getPropertiesEv +0x0000007100df57ac,sub_7100DF57AC,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df57bc,sub_7100DF57BC,64,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE19resetToInitialValueEv +0x0000007100df57fc,sub_7100DF57FC,108,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE14isInitialValueEv +0x0000007100df5868,sub_7100DF5868,60,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE11getCategoryEv +0x0000007100df58a4,sub_7100DF58A4,64,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE11setCategoryEj +0x0000007100df58e4,sub_7100DF58E4,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE7getNameEv +0x0000007100df58f4,sub_7100DF58F4,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE12getDeleteRevEv 0x0000007100df5904,sub_7100DF5904,32,_ZNK4ksys3gdt5FlagTIN4sead7Vector3IfEEE18getRandomResetDataEv -0x0000007100df5924,sub_7100DF5924,16, -0x0000007100df5934,sub_7100DF5934,16, -0x0000007100df5944,sub_7100DF5944,12, -0x0000007100df5950,sub_7100DF5950,8, -0x0000007100df5958,sub_7100DF5958,8, -0x0000007100df5960,sub_7100DF5960,84, -0x0000007100df59b4,sub_7100DF59B4,232, -0x0000007100df5a9c,sub_7100DF5A9C,16, -0x0000007100df5aac,j__ZdlPv_904,4, -0x0000007100df5ab0,sub_7100DF5AB0,16, -0x0000007100df5ac0,sub_7100DF5AC0,16, -0x0000007100df5ad0,sub_7100DF5AD0,36, -0x0000007100df5af4,sub_7100DF5AF4,20, -0x0000007100df5b08,sub_7100DF5B08,16, -0x0000007100df5b18,sub_7100DF5B18,16, -0x0000007100df5b28,sub_7100DF5B28,72, -0x0000007100df5b70,sub_7100DF5B70,112, -0x0000007100df5be0,sub_7100DF5BE0,60, -0x0000007100df5c1c,sub_7100DF5C1C,64, -0x0000007100df5c5c,sub_7100DF5C5C,16, -0x0000007100df5c6c,sub_7100DF5C6C,16, +0x0000007100df5924,sub_7100DF5924,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE9getConfigEv +0x0000007100df5934,sub_7100DF5934,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE9setConfigERKNS0_10FlagConfigIS4_EE +0x0000007100df5944,sub_7100DF5944,12,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE8getValueEv +0x0000007100df5950,sub_7100DF5950,8,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE11getValueRefEv +0x0000007100df5958,sub_7100DF5958,8,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE11getValueRefEv +0x0000007100df5960,sub_7100DF5960,84,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE8hasValueERKS4_ +0x0000007100df59b4,sub_7100DF59B4,232,_ZN4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE8setValueES4_ +0x0000007100df5a9c,sub_7100DF5A9C,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector3IfEEE12getDebugDataEv +0x0000007100df5aac,j__ZdlPv_904,4,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEED0Ev +0x0000007100df5ab0,sub_7100DF5AB0,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE7getHashEv +0x0000007100df5ac0,sub_7100DF5AC0,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE7setHashEj +0x0000007100df5ad0,sub_7100DF5AD0,36,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE7getTypeEv +0x0000007100df5af4,sub_7100DF5AF4,20,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE7setTypeENS0_8FlagTypeE +0x0000007100df5b08,sub_7100DF5B08,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE13getPropertiesEv +0x0000007100df5b18,sub_7100DF5B18,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE13setPropertiesERKNS0_14FlagPropertiesE +0x0000007100df5b28,sub_7100DF5B28,72,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE19resetToInitialValueEv +0x0000007100df5b70,sub_7100DF5B70,112,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE14isInitialValueEv +0x0000007100df5be0,sub_7100DF5BE0,60,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE11getCategoryEv +0x0000007100df5c1c,sub_7100DF5C1C,64,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE11setCategoryEj +0x0000007100df5c5c,sub_7100DF5C5C,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE7getNameEv +0x0000007100df5c6c,sub_7100DF5C6C,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE12getDeleteRevEv 0x0000007100df5c7c,sub_7100DF5C7C,32,_ZNK4ksys3gdt5FlagTIN4sead7Vector4IfEEE18getRandomResetDataEv -0x0000007100df5c9c,sub_7100DF5C9C,16, -0x0000007100df5cac,sub_7100DF5CAC,16, -0x0000007100df5cbc,sub_7100DF5CBC,12, -0x0000007100df5cc8,sub_7100DF5CC8,8, -0x0000007100df5cd0,sub_7100DF5CD0,8, -0x0000007100df5cd8,sub_7100DF5CD8,96, -0x0000007100df5d38,sub_7100DF5D38,272, -0x0000007100df5e48,sub_7100DF5E48,16, +0x0000007100df5c9c,sub_7100DF5C9C,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE9getConfigEv +0x0000007100df5cac,sub_7100DF5CAC,16,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE9setConfigERKNS0_10FlagConfigIS4_EE +0x0000007100df5cbc,sub_7100DF5CBC,12,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE8getValueEv +0x0000007100df5cc8,sub_7100DF5CC8,8,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE11getValueRefEv +0x0000007100df5cd0,sub_7100DF5CD0,8,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE11getValueRefEv +0x0000007100df5cd8,sub_7100DF5CD8,96,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE8hasValueERKS4_ +0x0000007100df5d38,sub_7100DF5D38,272,_ZN4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE8setValueES4_ +0x0000007100df5e48,sub_7100DF5E48,16,_ZNK4ksys3gdt9FlagProxyIN4sead7Vector4IfEEE12getDebugDataEv 0x0000007100df5e58,gdm::debugReportFlagChange,792, 0x0000007100df6170,sub_7100DF6170,268, 0x0000007100df627c,sub_7100DF627C,268, diff --git a/src/KingSystem/GameData/CMakeLists.txt b/src/KingSystem/GameData/CMakeLists.txt index a7f9fc57..60a64b50 100644 --- a/src/KingSystem/GameData/CMakeLists.txt +++ b/src/KingSystem/GameData/CMakeLists.txt @@ -1,6 +1,7 @@ target_sources(uking PRIVATE gdtFlag.cpp gdtFlag.h + gdtFlagProxy.h gdtManager.cpp gdtManager.h gdtTriggerParam.cpp diff --git a/src/KingSystem/GameData/gdtFlag.h b/src/KingSystem/GameData/gdtFlag.h index 96d63377..fa99617a 100644 --- a/src/KingSystem/GameData/gdtFlag.h +++ b/src/KingSystem/GameData/gdtFlag.h @@ -7,6 +7,7 @@ #include #include #include +#include "KingSystem/Utils/TypeTraits.h" #include "KingSystem/Utils/Types.h" namespace al { @@ -28,6 +29,10 @@ enum class ResetType { ResetOnAnimalMasterAppearance = 4, }; +constexpr bool isResettableFlag(ResetType type) { + return type > ResetType::NoReset; +} + struct FlagDebugData { sead::SafeString name; s32 delete_rev = 0; @@ -87,6 +92,27 @@ SEAD_ENUM(FlagType, Bool = 0, S32 = 1, F32 = 2, String = 3, String64 = 4, String StringArray = 12, String64Array = 13, String256Array = 14, Vector2fArray = 15, Vector3fArray = 16, Vector4fArray = 17, Invalid = 18) +template +constexpr bool isValidFlagArrayType() { + return IsAnyOfType, sead::Buffer, sead::Buffer, + sead::Buffer>, + sead::Buffer>, + sead::Buffer>, sead::Buffer, + sead::Buffer, sead::Buffer>(); +} + +template +constexpr bool isValidFlagValueType() { + return IsAnyOfType, sead::FixedSafeString<64>, + sead::FixedSafeString<256>, sead::Vector2f, sead::Vector3f, + sead::Vector4f>(); +} + +template +constexpr bool isValidFlagType() { + return isValidFlagValueType() || isValidFlagArrayType(); +} + class FlagBase { public: virtual ~FlagBase() = 0; @@ -109,6 +135,15 @@ public: virtual const sead::SafeString& getName() const = 0; virtual s32 getDeleteRev() const = 0; + virtual u32 getRandomResetData() const = 0; + + bool isResettable() const { return isResettableFlag(getProperties().getResetType()); } + + bool isPermanent() const { + return getProperties().isSave() && getProperties().getResetType() == ResetType::NoReset && + getRandomResetData() == 0; + } + protected: s32 clampValue_(const s32& min_value, s32* value, const s32& max_value); s32 clampValue_(const f32& min_value, f32* value, const f32& max_value); @@ -151,7 +186,7 @@ public: using ConfigType = FlagConfig; using RawValueType = std::conditional_t, u8, T>; - virtual u32 getRandomResetData() const; + u32 getRandomResetData() const override; virtual const ConfigType& getConfig() const = 0; virtual void setConfig(const ConfigType& config) = 0; diff --git a/src/KingSystem/GameData/gdtFlagProxy.h b/src/KingSystem/GameData/gdtFlagProxy.h new file mode 100644 index 00000000..d54b7ded --- /dev/null +++ b/src/KingSystem/GameData/gdtFlagProxy.h @@ -0,0 +1,148 @@ +#pragma once + +#include "KingSystem/GameData/gdtFlag.h" + +namespace ksys::gdt { + +template +class FlagProxy : public FlagT { +public: + using ConfigType = FlagConfig; + using RawValueType = typename Flag::RawValueType; + + FlagProxy() = default; + explicit FlagProxy(Flag* flag) : mFlag(flag) {} + ~FlagProxy() override = default; + + Flag* getFlag() const { return mFlag; } + void setFlag(Flag* flag) { mFlag = flag; } + + u32 getHash() const override { return mFlag->getHash(); } + void setHash(u32 hash) override { mFlag->setHash(hash); } + + FlagType getType() const override { return mFlag->getType(); } + void setType(FlagType type) override { mFlag->setType(type); } + + const FlagProperties& getProperties() const override { return mFlag->getProperties(); } + void setProperties(const FlagProperties& properties) override { + mFlag->setProperties(properties); + } + + void resetToInitialValue() override; + bool isInitialValue() const override; + + u32 getCategory() const override; + void setCategory(u32 category) override; + + const sead::SafeString& getName() const override { return mFlag->getName(); } + s32 getDeleteRev() const override { return mFlag->getDeleteRev(); } + + const ConfigType& getConfig() const override { return mFlag->getConfig(); } + void setConfig(const ConfigType& config) override { mFlag->setConfig(config); } + + T getValue() const override; + + RawValueType& getValueRef() override; + const RawValueType& getValueRef() const override; + + bool hasValue(const T& value) const override; + bool setValue(T value) override; + + FlagDebugData* getDebugData() const override { return mFlag->getDebugData(); } + void setDebugData(FlagDebugData* data) { mFlag->setDebugData(data); } + +private: + Flag* mFlag = nullptr; + RawValueType mValue{}; +}; + +template +inline void FlagProxy::resetToInitialValue() { + if constexpr (std::is_same()) { + const auto category = getCategory(); + mValue = getConfig().initial_value & 1; + setCategory(category); + } else { + mValue = getConfig().initial_value; + } +} + +template +inline bool FlagProxy::isInitialValue() const { + if constexpr (std::is_same()) { + const bool initial_value = getConfig().initial_value & 1; + return getValue() == initial_value; + } else { + T initial_value; + initial_value = getConfig().initial_value; + return getValue() == initial_value; + } +} + +template +inline u32 FlagProxy::getCategory() const { + if (!this->isBoolean_()) + return 0; + return this->getCategoryForBool_(&mValue); +} + +template +inline void FlagProxy::setCategory(u32 category) { + if (!this->isBoolean_()) + return; + this->setCategoryForBool_(&mValue, category); +} + +template +inline T FlagProxy::getValue() const { + if constexpr (std::is_same()) + return mValue & 1; + else + return mValue; +} + +template +inline typename FlagProxy::RawValueType& FlagProxy::getValueRef() { + return mValue; +} + +template +inline const typename FlagProxy::RawValueType& FlagProxy::getValueRef() const { + return mValue; +} + +template +inline bool FlagProxy::hasValue(const T& value) const { + return value == getValue(); +} + +template +inline bool FlagProxy::setValue(T value) { + if constexpr (std::is_same()) { + if (value == getValue()) + return false; + + if (value) + mValue |= 1; + else + mValue &= ~1; + + return true; + } else { + [[maybe_unused]] const T new_value = value; + + T min_value; + T max_value; + min_value = getConfig().min_value; + max_value = getConfig().max_value; + this->clampValue_(min_value, &value, max_value); + + if (mValue != value) { + mValue = value; + return true; + } + return false; + } +} + +} // namespace ksys::gdt diff --git a/src/KingSystem/GameData/gdtTriggerParam.cpp b/src/KingSystem/GameData/gdtTriggerParam.cpp index 25356752..2148f2bb 100644 --- a/src/KingSystem/GameData/gdtTriggerParam.cpp +++ b/src/KingSystem/GameData/gdtTriggerParam.cpp @@ -1,11 +1,930 @@ #include "KingSystem/GameData/gdtTriggerParam.h" +#include +#include "KingSystem/GameData/gdtFlagProxy.h" +#include "KingSystem/Resource/resResourceGameData.h" +#include "KingSystem/Utils/SafeDelete.h" namespace ksys::gdt { TriggerParam::TriggerParam() { + mUnkArray.constructDefault(); mCriticalSections.constructDefault(); - mFlags.constructDefault(); + mBitFlags.constructDefault(); mCounts.fill(0); + mNumBoolFlagsPerCategory.fill(0); +} + +namespace { +// TODO (low-priority): implement this without using to match the original code +// The original code appears to perform a heapsort. +[[gnu::noinline]] void sortFlagPtrArray(sead::PtrArray& array) { + std::sort(array.dataBegin(), array.dataEnd(), + [](const FlagBase* a, const FlagBase* b) { return a->getHash() < b->getHash(); }); +} + +inline s32 getFlagIndex(const sead::PtrArray& flags, u32 name_hash) { + s32 a = 0; + s32 b = flags.size() - 1; + while (a < b) { + const s32 m = (a + b) / 2; + if (flags[m]->getHash() == name_hash) + return m; + if (flags[m]->getHash() < name_hash) + a = m + 1; + else + b = m; + } + + if (flags[a]->getHash() == name_hash) + return a; + + return -1; +} + +inline s32 getFlagIndex(const sead::PtrArray>& flags, u32 name_hash) { + for (s32 i = 0; i < flags.size(); ++i) { + const auto& array = *flags[i]; + if (array.size() > 0 && array[0]->getHash() == name_hash) + return i; + } + return -1; +} + +template +inline Flag* getFlagByIndex(const sead::PtrArray& flags, s32 index) { + if (index < 0 || index >= flags.size()) + return nullptr; + return static_cast*>(flags[index]); +} + +template +inline Flag* getFlag(const sead::PtrArray& flags, u32 name_hash) { + return getFlagByIndex(flags, getFlagIndex(flags, name_hash)); +} + +template +inline Flag* getFlag(const sead::PtrArray& flags, const sead::SafeString& name) { + if (name.isEmpty()) + return nullptr; + return getFlag(flags, sead::HashCRC32::calcStringHash(name)); +} + +template +inline bool getFlagValue(const sead::PtrArray& array, T* out_value, s32 index, + bool check_permissions) { + static_assert(isValidFlagValueType()); + + const auto* flag = getFlagByIndex(array, index); + if (!flag) + return false; + + if (check_permissions && !flag->getProperties().isProgramReadable()) + return false; + + if constexpr (std::is_same()) + *out_value = flag->getValueRef().cstr(); + else + *out_value = flag->getValue(); + + return true; +} + +template +inline bool getFlagValue(const sead::PtrArray>& arrays, T* out_value, + s32 array_index, s32 flag_index, bool check_permissions) { + static_assert(isValidFlagValueType()); + + if (array_index < 0 || array_index >= arrays.size()) + return false; + + const auto* array = arrays[array_index]; + if (!array) + return false; + + const auto* flag = getFlagByIndex(*array, flag_index); + if (!flag) + return false; + + if (check_permissions && !flag->getProperties().isProgramReadable()) + return false; + + if constexpr (std::is_same()) + *out_value = flag->getValueRef().cstr(); + else + *out_value = flag->getValue(); + + return true; +} + +bool getFlagArraySize(const sead::PtrArray>& arrays, s32 index, s32* out) { + if (index < 0 || index >= arrays.size()) + return false; + *out = arrays[index]->size(); + return true; +} + +template +inline void copyGameDataResBuffer(sead::Buffer& source, sead::PtrArray& dest, + sead::Heap* heap) { + if (source.size() == 0) + return; + + if (!dest.isBufferReady()) + dest.allocBuffer(source.size(), heap); + + for (auto& flag : source) + dest.pushBack(&flag); +} + +template +inline void copyGameDataResBuffer(sead::PtrArray>& source, + sead::PtrArray>& dest, + sead::Heap* heap) { + const auto n = source.capacity(); + if (n < 1) + return; + + if (!dest.isBufferReady()) + dest.allocBuffer(n, heap); + + for (s32 i = 0; i < n; ++i) { + dest.pushBack(new (heap) sead::PtrArray); + const auto num_flags = source[i]->size(); + + if (!dest[i]->isBufferReady()) + dest[i]->allocBuffer(num_flags, heap); + + for (s32 j = 0; j < num_flags; ++j) + dest[i]->pushBack(std::addressof((*source[i])[j])); + } +} + +template +void makeFlagProxies(sead::PtrArray& dest, const sead::PtrArray& src, s32 count, + sead::Heap* heap, bool permanent_flags_only) { + for (s32 i = 0; i < count; ++i) { + auto* flag = static_cast*>(src[i]); + if (!permanent_flags_only) { + auto* proxy = new (heap) FlagProxy; + proxy->setFlag(flag); + proxy->setValue(flag->getValue()); + proxy->setCategory(flag->getCategory()); + dest.pushBack(proxy); + } else if (flag->isPermanent()) { + auto* proxy = new (heap) FlagProxy; + proxy->setFlag(flag); + proxy->setValue(flag->getValue()); + proxy->setCategory(flag->getCategory()); + dest.pushBack(proxy); + } + } +} +} // namespace + +void TriggerParam::copyFromGameDataRes(res::GameData* gdata, sead::Heap* heap) { + if (!gdata) + return; + + copyGameDataResBuffer(gdata->getBoolFlags(), mBoolFlags, heap); + copyGameDataResBuffer(gdata->getS32Flags(), mS32Flags, heap); + copyGameDataResBuffer(gdata->getF32Flags(), mF32Flags, heap); + copyGameDataResBuffer(gdata->getStringFlags(), mStringFlags, heap); + copyGameDataResBuffer(gdata->getString64Flags(), mString64Flags, heap); + copyGameDataResBuffer(gdata->getString256Flags(), mString256Flags, heap); + copyGameDataResBuffer(gdata->getVector2fFlags(), mVector2fFlags, heap); + copyGameDataResBuffer(gdata->getVector3fFlags(), mVector3fFlags, heap); + copyGameDataResBuffer(gdata->getVector4fFlags(), mVector4fFlags, heap); + + copyGameDataResBuffer(gdata->getBoolArrayFlags(), mBoolArrayFlags, heap); + copyGameDataResBuffer(gdata->getS32ArrayFlags(), mS32ArrayFlags, heap); + copyGameDataResBuffer(gdata->getF32ArrayFlags(), mF32ArrayFlags, heap); + copyGameDataResBuffer(gdata->getStringArrayFlags(), mStringArrayFlags, heap); + copyGameDataResBuffer(gdata->getString64ArrayFlags(), mString64ArrayFlags, heap); + copyGameDataResBuffer(gdata->getString256ArrayFlags(), mString256ArrayFlags, heap); + copyGameDataResBuffer(gdata->getVector2fArrayFlags(), mVector2fArrayFlags, heap); + copyGameDataResBuffer(gdata->getVector3fArrayFlags(), mVector3fArrayFlags, heap); + copyGameDataResBuffer(gdata->getVector4fArrayFlags(), mVector4fArrayFlags, heap); + + mResourceFlags = gdata->getField14(); +} + +void TriggerParam::init(sead::Heap* heap) { + sortFlagPtrArray(mBoolFlags); + sortFlagPtrArray(mS32Flags); + sortFlagPtrArray(mF32Flags); + sortFlagPtrArray(mStringFlags); + sortFlagPtrArray(mString64Flags); + sortFlagPtrArray(mString256Flags); + sortFlagPtrArray(mVector2fFlags); + sortFlagPtrArray(mVector3fFlags); + sortFlagPtrArray(mVector4fFlags); + allocCombinedFlagArrays(heap); + updateBoolFlagCounts(); + mHeap = heap; +} + +void TriggerParam::allocCombinedFlagArrays(sead::Heap* heap) { +#define ALLOC_COMBINED_ARRAY_(FLAGS, FLAG_ARRAYS, DEST) \ + { \ + s32 size = FLAGS.size(); \ + for (s32 i = 0; i < FLAG_ARRAYS.size(); ++i) \ + size += FLAG_ARRAYS[i]->size(); \ + \ + DEST.allocBuffer(size, heap); \ + } + + ALLOC_COMBINED_ARRAY_(mBoolFlags, mBoolArrayFlags, mCombinedBoolFlags); + ALLOC_COMBINED_ARRAY_(mS32Flags, mS32ArrayFlags, mCombinedS32Flags); + ALLOC_COMBINED_ARRAY_(mF32Flags, mF32ArrayFlags, mCombinedF32Flags); + ALLOC_COMBINED_ARRAY_(mStringFlags, mStringArrayFlags, mCombinedStringFlags); + ALLOC_COMBINED_ARRAY_(mString64Flags, mString64ArrayFlags, mCombinedString64Flags); + ALLOC_COMBINED_ARRAY_(mString256Flags, mString256ArrayFlags, mCombinedString256Flags); + ALLOC_COMBINED_ARRAY_(mVector2fFlags, mVector2fArrayFlags, mCombinedVector2fFlags); + ALLOC_COMBINED_ARRAY_(mVector3fFlags, mVector3fArrayFlags, mCombinedVector3fFlags); + ALLOC_COMBINED_ARRAY_(mVector4fFlags, mVector4fArrayFlags, mCombinedVector4fFlags); + +#undef ALLOC_COMBINED_ARRAY_ +} + +void TriggerParam::updateBoolFlagCounts() { + for (s32 i = 0; i < mBoolFlags.size(); ++i) { + const s32 category = mBoolFlags[i]->getCategory(); + if (category > 0) + ++mNumBoolFlagsPerCategory[category - 1]; + } + + for (s32 array_i = 0; array_i < mBoolArrayFlags.size(); ++array_i) { + for (s32 i = 0; i < mBoolArrayFlags[array_i]->size(); ++i) { + const s32 category = (*mBoolArrayFlags[array_i])[i]->getCategory(); + if (category > 0) + ++mNumBoolFlagsPerCategory[category - 1]; + } + } +} + +void TriggerParam::destroyHeap() { + util::safeDeleteHeap(mHeap); +} + +void TriggerParam::allocBools(s32 size, sead::Heap* heap) { + mBoolFlags.allocBuffer(size, heap); +} + +void TriggerParam::allocS32s(s32 size, sead::Heap* heap) { + mS32Flags.allocBuffer(size, heap); +} + +void TriggerParam::initResetData(sead::Heap* heap) { + s32 num_reset_entries = 0; + +#define COUNT_FLAGS_(FLAGS) \ + do { \ + for (s32 i = 0; i < FLAGS.size(); ++i) { \ + if (FLAGS[i]->isResettable()) \ + ++num_reset_entries; \ + } \ + } while (0) + +#define COUNT_FLAGS_ARRAY_(ARRAYS) \ + do { \ + for (s32 i = 0; i < ARRAYS.size(); ++i) { \ + if ((*ARRAYS[i])[0]->isResettable()) \ + ++num_reset_entries; \ + } \ + } while (0) + + COUNT_FLAGS_(mBoolFlags); + COUNT_FLAGS_(mS32Flags); + COUNT_FLAGS_(mF32Flags); + COUNT_FLAGS_(mStringFlags); + COUNT_FLAGS_(mString64Flags); + COUNT_FLAGS_(mString256Flags); + COUNT_FLAGS_(mVector2fFlags); + COUNT_FLAGS_(mVector3fFlags); + COUNT_FLAGS_(mVector4fFlags); + + COUNT_FLAGS_ARRAY_(mBoolArrayFlags); + COUNT_FLAGS_ARRAY_(mS32ArrayFlags); + COUNT_FLAGS_ARRAY_(mF32ArrayFlags); + COUNT_FLAGS_ARRAY_(mStringArrayFlags); + COUNT_FLAGS_ARRAY_(mString64ArrayFlags); + COUNT_FLAGS_ARRAY_(mString256ArrayFlags); + COUNT_FLAGS_ARRAY_(mVector2fArrayFlags); + COUNT_FLAGS_ARRAY_(mVector3fArrayFlags); + COUNT_FLAGS_ARRAY_(mVector4fArrayFlags); + +#undef COUNT_FLAGS_ +#undef COUNT_FLAGS_ARRAY_ + + if (num_reset_entries == 0) + return; + + mResetEntries.allocBufferAssert(num_reset_entries, heap); + + s32 reset_entry_idx = 0; + +#define ADD_ENTRIES_(TYPE, FLAGS) \ + do { \ + for (s32 i = 0; i < FLAGS.size(); ++i) { \ + if (!FLAGS[i]->isResettable()) \ + continue; \ + mResetEntries[reset_entry_idx].type = TYPE; \ + mResetEntries[reset_entry_idx].index = i; \ + mResetEntries[reset_entry_idx].reset_type = FLAGS[i]->getProperties().getResetType(); \ + ++reset_entry_idx; \ + if (reset_entry_idx == num_reset_entries) \ + return; \ + } \ + } while (0) + +#define ADD_ENTRIES_ARRAY_(TYPE, ARRAYS) \ + do { \ + for (s32 i = 0; i < ARRAYS.size(); ++i) { \ + if (!(*ARRAYS[i])[0]->isResettable()) \ + continue; \ + \ + mResetEntries[reset_entry_idx].type = TYPE; \ + \ + /* ??? */ \ + if constexpr (TYPE == FlagType::String256Array) \ + mResetEntries[reset_entry_idx].index = s16(i); \ + else \ + mResetEntries[reset_entry_idx].index = i; \ + \ + mResetEntries[reset_entry_idx].reset_type = \ + (*ARRAYS[i])[0]->getProperties().getResetType(); \ + \ + ++reset_entry_idx; \ + if (reset_entry_idx == num_reset_entries) \ + return; \ + } \ + } while (0) + + ADD_ENTRIES_(FlagType::Bool, mBoolFlags); + ADD_ENTRIES_(FlagType::S32, mS32Flags); + ADD_ENTRIES_(FlagType::F32, mF32Flags); + ADD_ENTRIES_(FlagType::String, mStringFlags); + ADD_ENTRIES_(FlagType::String64, mString64Flags); + ADD_ENTRIES_(FlagType::String256, mString256Flags); + ADD_ENTRIES_(FlagType::Vector2f, mVector2fFlags); + ADD_ENTRIES_(FlagType::Vector3f, mVector3fFlags); + ADD_ENTRIES_(FlagType::Vector4f, mVector4fFlags); + + ADD_ENTRIES_ARRAY_(FlagType::BoolArray, mBoolArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::S32Array, mS32ArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::F32Array, mF32ArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::StringArray, mStringArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::String64Array, mString64ArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::String256Array, mString256ArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::Vector2fArray, mVector2fArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::Vector3fArray, mVector3fArrayFlags); + ADD_ENTRIES_ARRAY_(FlagType::Vector4fArray, mVector4fArrayFlags); + +#undef ADD_ENTRIES_ +#undef ADD_ENTRIES_ARRAY_ +} + +void TriggerParam::initRevivalRandomBools(sead::Heap* heap) { + s32 count = 0; + for (s32 i = 0; i < mBoolFlags.size(); ++i) { + if (static_cast(mBoolFlags[i])->getRandomResetData()) + ++count; + } + + if (count == 0) + return; + + mRevivalRandomBools.allocBuffer(count, heap); + for (s32 i = 0; i < mBoolFlags.size(); ++i) { + if (static_cast(mBoolFlags[i])->getRandomResetData()) + mRevivalRandomBools.pushBack(static_cast(mBoolFlags[i])); + } +} + +void TriggerParam::copyAllFlags(const TriggerParam& src, sead::Heap* heap, bool init_reset_data) { + mResourceFlags = src.mResourceFlags; + + s32 num_flags = 0; + +#define COPY_(MEMBER, T) \ + do { \ + const auto size = src.MEMBER.size(); \ + if (size > 0) { \ + MEMBER.allocBuffer(size, heap); \ + makeFlagProxies(MEMBER, src.MEMBER, size, heap, false); \ + num_flags += size; \ + } \ + } while (0) + + COPY_(mBoolFlags, bool); + COPY_(mS32Flags, s32); + COPY_(mF32Flags, f32); + COPY_(mStringFlags, sead::FixedSafeString<32>); + COPY_(mString64Flags, sead::FixedSafeString<64>); + COPY_(mString256Flags, sead::FixedSafeString<256>); + COPY_(mVector2fFlags, sead::Vector2f); + COPY_(mVector3fFlags, sead::Vector3f); + COPY_(mVector4fFlags, sead::Vector4f); + +#undef COPY_ + +#define COPY_ARRAY_(MEMBER, T) \ + do { \ + const auto size = src.MEMBER.size(); \ + if (size > 0) { \ + MEMBER.allocBuffer(size, heap); \ + for (s32 i = 0; i < size; ++i) { \ + const auto array_size = src.MEMBER[i]->size(); \ + if (array_size > 0) { \ + MEMBER.pushBack(new (heap) sead::PtrArray); \ + MEMBER[i]->allocBuffer(std::max(1, array_size), heap); \ + makeFlagProxies(*MEMBER[i], *src.MEMBER[i], array_size, heap, false); \ + num_flags += size; \ + } \ + } \ + } \ + } while (0) + + COPY_ARRAY_(mBoolArrayFlags, bool); + COPY_ARRAY_(mS32ArrayFlags, s32); + COPY_ARRAY_(mF32ArrayFlags, f32); + COPY_ARRAY_(mStringArrayFlags, sead::FixedSafeString<32>); + COPY_ARRAY_(mString64ArrayFlags, sead::FixedSafeString<64>); + COPY_ARRAY_(mString256ArrayFlags, sead::FixedSafeString<256>); + COPY_ARRAY_(mVector2fArrayFlags, sead::Vector2f); + COPY_ARRAY_(mVector3fArrayFlags, sead::Vector3f); + COPY_ARRAY_(mVector4fArrayFlags, sead::Vector4f); + +#undef COPY_ +#undef COPY_ARRAY_ + + if (init_reset_data) { + for (auto& array : *mUnkArray.data()) + array.allocBufferAssert(num_flags, heap); + initResetData(heap); + initRevivalRandomBools(heap); + } + + mHeap = heap; +} + +void TriggerParam::copyPermanentFlags(const TriggerParam& src, sead::Heap* heap) { +#define COPY_(MEMBER, T) \ + do { \ + const auto size = src.MEMBER.size(); \ + if (size > 0) { \ + s32 num_permanent_flags = 0; \ + for (s32 i = 0; i < size; ++i) { \ + if (src.MEMBER[i]->isPermanent()) \ + ++num_permanent_flags; \ + } \ + MEMBER.allocBuffer(std::max(1, num_permanent_flags), heap); \ + makeFlagProxies(MEMBER, src.MEMBER, size, heap, true); \ + } \ + } while (0) + + COPY_(mBoolFlags, bool); + COPY_(mS32Flags, s32); + COPY_(mF32Flags, f32); + COPY_(mStringFlags, sead::FixedSafeString<32>); + COPY_(mString64Flags, sead::FixedSafeString<64>); + COPY_(mString256Flags, sead::FixedSafeString<256>); + COPY_(mVector2fFlags, sead::Vector2f); + COPY_(mVector3fFlags, sead::Vector3f); + COPY_(mVector4fFlags, sead::Vector4f); + +#undef COPY_ + +#define COPY_ARRAY_(MEMBER, T) \ + do { \ + const auto size = src.MEMBER.size(); \ + if (size > 0) { \ + MEMBER.allocBuffer(size, heap); \ + for (s32 i = 0; i < size; ++i) { \ + const auto array_size = src.MEMBER[i]->size(); \ + if (array_size > 0) { \ + auto* array = new (heap) sead::PtrArray; \ + MEMBER.pushBack(array); \ + MEMBER[i]->allocBuffer(std::max(1, array_size), heap); \ + makeFlagProxies(*MEMBER[i], *src.MEMBER[i], array_size, heap, true); \ + } \ + } \ + } \ + } while (0) + + COPY_ARRAY_(mBoolArrayFlags, bool); + COPY_ARRAY_(mS32ArrayFlags, s32); + COPY_ARRAY_(mF32ArrayFlags, f32); + COPY_ARRAY_(mStringArrayFlags, sead::FixedSafeString<32>); + COPY_ARRAY_(mString64ArrayFlags, sead::FixedSafeString<64>); + COPY_ARRAY_(mString256ArrayFlags, sead::FixedSafeString<256>); + COPY_ARRAY_(mVector2fArrayFlags, sead::Vector2f); + COPY_ARRAY_(mVector3fArrayFlags, sead::Vector3f); + COPY_ARRAY_(mVector4fArrayFlags, sead::Vector4f); + +#undef COPY_ +#undef COPY_ARRAY_ + + mHeap = heap; +} + +FlagType TriggerParam::getFlagType(const sead::SafeString& name) const { + if (getBoolIdx(name) != -1) + return FlagType::Bool; + if (getBoolArrayIdx(name) != -1) + return FlagType::BoolArray; + + if (getS32Idx(name) != -1) + return FlagType::S32; + if (getS32ArrayIdx(name) != -1) + return FlagType::S32Array; + + if (getStrIdx(name) != -1) + return FlagType::String; + if (getStrArrayIdx(name) != -1) + return FlagType::StringArray; + + if (getF32Idx(name) != -1) + return FlagType::F32; + if (getF32ArrayIdx(name) != -1) + return FlagType::F32Array; + + if (getVec3fIdx(name) != -1) + return FlagType::Vector3f; + if (getVec3fArrayIdx(name) != -1) + return FlagType::Vector3fArray; + + if (getStr64Idx(name) != -1) + return FlagType::String64; + + if (getStr256ArrayIdx(name) != -1) + return FlagType::String256Array; + if (getStr256Idx(name) != -1) + return FlagType::String256; + + if (getStr64ArrayIdx(name) != -1) + return FlagType::String64Array; + + if (getVec2fIdx(name) != -1) + return FlagType::Vector2f; + if (getVec2fArrayIdx(name) != -1) + return FlagType::Vector2fArray; + + if (getVec4fIdx(name) != -1) + return FlagType::Vector4f; + if (getVec4fArrayIdx(name) != -1) + return FlagType::Vector4fArray; + + return FlagType::Invalid; +} + +bool TriggerParam::getBool(bool* value, s32 index, bool check_permissions) const { + return getFlagValue(mBoolFlags, value, index, check_permissions); +} + +bool TriggerParam::getS32(s32* value, s32 index, bool check_permissions) const { + return getFlagValue(mS32Flags, value, index, check_permissions); +} + +bool TriggerParam::getF32(f32* value, s32 index, bool check_permissions) const { + return getFlagValue(mF32Flags, value, index, check_permissions); +} + +bool TriggerParam::getStr(const char** value, s32 index, bool check_permissions) const { + return getFlagValue>(mStringFlags, value, index, + check_permissions); +} + +bool TriggerParam::getStr64(const char** value, s32 index, bool check_permissions) const { + return getFlagValue>(mString64Flags, value, index, + check_permissions); +} + +bool TriggerParam::getStr256(const char** value, s32 index, bool check_permissions) const { + return getFlagValue>(mString256Flags, value, index, + check_permissions); +} + +bool TriggerParam::getVec2f(sead::Vector2f* value, s32 index, bool check_permissions) const { + return getFlagValue(mVector2fFlags, value, index, check_permissions); +} + +bool TriggerParam::getVec3f(sead::Vector3f* value, s32 index, bool check_permissions) const { + return getFlagValue(mVector3fFlags, value, index, check_permissions); +} + +bool TriggerParam::getVec4f(sead::Vector4f* value, s32 index, bool check_permissions) const { + return getFlagValue(mVector4fFlags, value, index, check_permissions); +} + +bool TriggerParam::getBool(bool* value, const sead::SafeString& name, + bool check_permissions) const { + return getBool(value, getBoolIdx(name), check_permissions); +} + +bool TriggerParam::getBool2(bool* value, const sead::SafeString& name, + bool check_permissions) const { + return getBool(value, getBoolIdx(name), check_permissions); +} + +bool TriggerParam::getS32(s32* value, const sead::SafeString& name, bool check_permissions) const { + return getS32(value, getS32Idx(name), check_permissions); +} + +bool TriggerParam::getF32(f32* value, const sead::SafeString& name, bool check_permissions) const { + return getF32(value, getF32Idx(name), check_permissions); +} + +bool TriggerParam::getStr(const char** value, const sead::SafeString& name, + bool check_permissions) const { + return getStr(value, getStrIdx(name), check_permissions); +} + +bool TriggerParam::getStr64(const char** value, const sead::SafeString& name, + bool check_permissions) const { + return getStr64(value, getStr64Idx(name), check_permissions); +} + +bool TriggerParam::getStr256(const char** value, const sead::SafeString& name, + bool check_permissions) const { + return getStr256(value, getStr256Idx(name), check_permissions); +} + +bool TriggerParam::getVec2f(sead::Vector2f* value, const sead::SafeString& name, + bool check_permissions) const { + return getVec2f(value, getVec2fIdx(name), check_permissions); +} + +bool TriggerParam::getVec3f(sead::Vector3f* value, const sead::SafeString& name, + bool check_permissions) const { + return getVec3f(value, getVec3fIdx(name), check_permissions); +} + +bool TriggerParam::getVec4f(sead::Vector4f* value, const sead::SafeString& name, + bool check_permissions) const { + return getVec4f(value, getVec4fIdx(name), check_permissions); +} + +bool TriggerParam::getBool(bool* value, s32 array_index, s32 index, bool check_permissions) const { + return getFlagValue(mBoolArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getS32(s32* value, s32 array_index, s32 index, bool check_permissions) const { + return getFlagValue(mS32ArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getF32(f32* value, s32 array_index, s32 index, bool check_permissions) const { + return getFlagValue(mF32ArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getStr(const char** value, s32 array_index, s32 index, + bool check_permissions) const { + return getFlagValue>( + mStringArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getStr64(const char** value, s32 array_index, s32 index, + bool check_permissions) const { + return getFlagValue>( + mString64ArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getStr256(const char** value, s32 array_index, s32 index, + bool check_permissions) const { + return getFlagValue>( + mString256ArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getVec2f(sead::Vector2f* value, s32 array_index, s32 index, + bool check_permissions) const { + return getFlagValue(mVector2fArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getVec3f(sead::Vector3f* value, s32 array_index, s32 index, + bool check_permissions) const { + return getFlagValue(mVector3fArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getVec4f(sead::Vector4f* value, s32 array_index, s32 index, + bool check_permissions) const { + return getFlagValue(mVector4fArrayFlags, value, array_index, index, check_permissions); +} + +bool TriggerParam::getBool(bool* value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getBool(value, getBoolArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getS32(s32* value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getS32(value, getS32ArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getF32(f32* value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getF32(value, getF32ArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getStr(const char** value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getStr(value, getStrArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getStr64(const char** value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getStr64(value, getStr64ArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getStr256(const char** value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getStr256(value, getStr256ArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getVec2f(sead::Vector2f* value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getVec2f(value, getVec2fArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getVec3f(sead::Vector3f* value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getVec3f(value, getVec3fArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getVec4f(sead::Vector4f* value, const sead::SafeString& name, s32 index, + bool check_permissions) const { + return getVec4f(value, getVec4fArrayIdx(name), index, check_permissions); +} + +bool TriggerParam::getBoolArraySize(s32* size, s32 index) const { + return getFlagArraySize(mBoolArrayFlags, index, size); +} + +bool TriggerParam::getS32ArraySize(s32* size, s32 index) const { + return getFlagArraySize(mS32ArrayFlags, index, size); +} + +bool TriggerParam::getF32ArraySize(s32* size, s32 index) const { + return getFlagArraySize(mF32ArrayFlags, index, size); +} + +bool TriggerParam::getStrArraySize(s32* size, s32 index) const { + return getFlagArraySize(mStringArrayFlags, index, size); +} + +bool TriggerParam::getStr64ArraySize(s32* size, s32 index) const { + return getFlagArraySize(mString64ArrayFlags, index, size); +} + +bool TriggerParam::getStr256ArraySize(s32* size, s32 index) const { + return getFlagArraySize(mString256ArrayFlags, index, size); +} + +bool TriggerParam::getVec2fArraySize(s32* size, s32 index) const { + return getFlagArraySize(mVector2fArrayFlags, index, size); +} + +bool TriggerParam::getVec3fArraySize(s32* size, s32 index) const { + return getFlagArraySize(mVector3fArrayFlags, index, size); +} + +bool TriggerParam::getVec4fArraySize(s32* size, s32 index) const { + return getFlagArraySize(mVector4fArrayFlags, index, size); +} + +bool TriggerParam::getBoolArraySizeByHash(s32* size, u32 name) const { + return getBoolArraySize(size, getBoolArrayIdx(name)); +} + +bool TriggerParam::getS32ArraySizeByHash(s32* size, u32 name) const { + return getS32ArraySize(size, getS32ArrayIdx(name)); +} + +bool TriggerParam::getF32ArraySizeByHash(s32* size, u32 name) const { + return getF32ArraySize(size, getF32ArrayIdx(name)); +} + +bool TriggerParam::getStrArraySizeByHash(s32* size, u32 name) const { + return getStrArraySize(size, getStrArrayIdx(name)); +} + +bool TriggerParam::getStr64ArraySizeByHash(s32* size, u32 name) const { + return getStr64ArraySize(size, getStr64ArrayIdx(name)); +} + +bool TriggerParam::getStr256ArraySizeByHash(s32* size, u32 name) const { + return getStr256ArraySize(size, getStr256ArrayIdx(name)); +} + +bool TriggerParam::getVec2fArraySizeByHash(s32* size, u32 name) const { + return getVec2fArraySize(size, getVec2fArrayIdx(name)); +} + +bool TriggerParam::getVec3fArraySizeByHash(s32* size, u32 name) const { + return getVec3fArraySize(size, getVec3fArrayIdx(name)); +} + +bool TriggerParam::getVec4fArraySizeByHash(s32* size, u32 name) const { + return getVec4fArraySize(size, getVec4fArrayIdx(name)); +} + +bool TriggerParam::getS32ArraySize(s32* size, const sead::SafeString& name) const { + return getS32ArraySize(size, getS32ArrayIdx(name)); +} + +bool TriggerParam::getStr64ArraySize(s32* size, const sead::SafeString& name) const { + return getStr64ArraySize(size, getStr64ArrayIdx(name)); +} + +bool TriggerParam::getVec3fArraySize(s32* size, const sead::SafeString& name) const { + return getVec3fArraySize(size, getVec3fArrayIdx(name)); +} + +bool TriggerParam::getMinValueForS32(s32* min, const sead::SafeString& name) const { + const auto* flag = getFlag(mS32Flags, name); + if (!flag) + return false; + *min = flag->getConfig().min_value; + return true; +} + +bool TriggerParam::getMaxValueForS32(s32* max, const sead::SafeString& name) const { + const auto* flag = getFlag(mS32Flags, name); + if (!flag) + return false; + *max = flag->getConfig().max_value; + return true; +} + +s32 TriggerParam::getBoolIdx(u32 name) const { + return getFlagIndex(mBoolFlags, name); +} + +s32 TriggerParam::getS32Idx(u32 name) const { + return getFlagIndex(mS32Flags, name); +} + +s32 TriggerParam::getF32Idx(u32 name) const { + return getFlagIndex(mF32Flags, name); +} + +s32 TriggerParam::getStrIdx(u32 name) const { + return getFlagIndex(mStringFlags, name); +} + +s32 TriggerParam::getStr64Idx(u32 name) const { + return getFlagIndex(mString64Flags, name); +} + +s32 TriggerParam::getStr256Idx(u32 name) const { + return getFlagIndex(mString256Flags, name); +} + +s32 TriggerParam::getVec2fIdx(u32 name) const { + return getFlagIndex(mVector2fFlags, name); +} + +s32 TriggerParam::getVec3fIdx(u32 name) const { + return getFlagIndex(mVector3fFlags, name); +} + +s32 TriggerParam::getVec4fIdx(u32 name) const { + return getFlagIndex(mVector4fFlags, name); +} + +s32 TriggerParam::getBoolArrayIdx(u32 name) const { + return getFlagIndex(mBoolArrayFlags, name); +} + +s32 TriggerParam::getS32ArrayIdx(u32 name) const { + return getFlagIndex(mS32ArrayFlags, name); +} + +s32 TriggerParam::getF32ArrayIdx(u32 name) const { + return getFlagIndex(mF32ArrayFlags, name); +} + +s32 TriggerParam::getStrArrayIdx(u32 name) const { + return getFlagIndex(mStringArrayFlags, name); +} + +s32 TriggerParam::getStr64ArrayIdx(u32 name) const { + return getFlagIndex(mString64ArrayFlags, name); +} + +s32 TriggerParam::getStr256ArrayIdx(u32 name) const { + return getFlagIndex(mString256ArrayFlags, name); +} + +s32 TriggerParam::getVec2fArrayIdx(u32 name) const { + return getFlagIndex(mVector2fArrayFlags, name); +} + +s32 TriggerParam::getVec3fArrayIdx(u32 name) const { + return getFlagIndex(mVector3fArrayFlags, name); +} + +s32 TriggerParam::getVec4fArrayIdx(u32 name) const { + return getFlagIndex(mVector4fArrayFlags, name); } } // namespace ksys::gdt diff --git a/src/KingSystem/GameData/gdtTriggerParam.h b/src/KingSystem/GameData/gdtTriggerParam.h index 10944cb7..89653999 100644 --- a/src/KingSystem/GameData/gdtTriggerParam.h +++ b/src/KingSystem/GameData/gdtTriggerParam.h @@ -1,7 +1,9 @@ #pragma once #include +#include #include +#include #include #include #include @@ -9,6 +11,10 @@ #include "KingSystem/GameData/gdtFlag.h" #include "KingSystem/Utils/Types.h" +namespace ksys::res { +class GameData; +} + namespace ksys::gdt { class TriggerParam { @@ -22,69 +28,247 @@ public: TriggerParam(); + void copyFromGameDataRes(res::GameData* gdata, sead::Heap* heap); + void init(sead::Heap* heap); + void destroyHeap(); + void allocBools(s32 size, sead::Heap* heap); + void allocS32s(s32 size, sead::Heap* heap); + void copyAllFlags(const TriggerParam& src, sead::Heap* heap, bool init_reset_data); + void copyPermanentFlags(const TriggerParam& src, sead::Heap* heap); + + FlagType getFlagType(const sead::SafeString& name) const; + + // region Value getters (by hash) + + bool getBool(bool* value, s32 index, bool check_permissions) const; + bool getS32(s32* value, s32 index, bool check_permissions) const; + bool getF32(f32* value, s32 index, bool check_permissions) const; + bool getStr(const char** value, s32 index, bool check_permissions) const; + bool getStr64(const char** value, s32 index, bool check_permissions) const; + bool getStr256(const char** value, s32 index, bool check_permissions) const; + bool getVec2f(sead::Vector2f* value, s32 index, bool check_permissions) const; + bool getVec3f(sead::Vector3f* value, s32 index, bool check_permissions) const; + bool getVec4f(sead::Vector4f* value, s32 index, bool check_permissions) const; + + bool getBool(bool* value, s32 array_index, s32 index, bool check_permissions) const; + bool getS32(s32* value, s32 array_index, s32 index, bool check_permissions) const; + bool getF32(f32* value, s32 array_index, s32 index, bool check_permissions) const; + bool getStr(const char** value, s32 array_index, s32 index, bool check_permissions) const; + bool getStr64(const char** value, s32 array_index, s32 index, bool check_permissions) const; + bool getStr256(const char** value, s32 array_index, s32 index, bool check_permissions) const; + bool getVec2f(sead::Vector2f* value, s32 array_index, s32 index, bool check_permissions) const; + bool getVec3f(sead::Vector3f* value, s32 array_index, s32 index, bool check_permissions) const; + bool getVec4f(sead::Vector4f* value, s32 array_index, s32 index, bool check_permissions) const; + + // endregion + + // region Value getters (by name) + + bool getBool(bool* value, const sead::SafeString& name, bool check_permissions) const; + bool getBool2(bool* value, const sead::SafeString& name, bool check_permissions) const; + bool getS32(s32* value, const sead::SafeString& name, bool check_permissions) const; + bool getF32(f32* value, const sead::SafeString& name, bool check_permissions) const; + bool getStr(const char** value, const sead::SafeString& name, bool check_permissions) const; + bool getStr64(const char** value, const sead::SafeString& name, bool check_permissions) const; + bool getStr256(const char** value, const sead::SafeString& name, bool check_permissions) const; + bool getVec2f(sead::Vector2f* value, const sead::SafeString& name, + bool check_permissions) const; + bool getVec3f(sead::Vector3f* value, const sead::SafeString& name, + bool check_permissions) const; + bool getVec4f(sead::Vector4f* value, const sead::SafeString& name, + bool check_permissions) const; + + bool getBool(bool* value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + bool getS32(s32* value, const sead::SafeString& name, s32 index, bool check_permissions) const; + bool getF32(f32* value, const sead::SafeString& name, s32 index, bool check_permissions) const; + bool getStr(const char** value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + bool getStr64(const char** value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + bool getStr256(const char** value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + bool getVec2f(sead::Vector2f* value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + bool getVec3f(sead::Vector3f* value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + bool getVec4f(sead::Vector4f* value, const sead::SafeString& name, s32 index, + bool check_permissions) const; + + // endregion + + // region Index getters (by hash) + + s32 getBoolIdx(u32 name) const; + s32 getS32Idx(u32 name) const; + s32 getF32Idx(u32 name) const; + s32 getStrIdx(u32 name) const; + s32 getStr64Idx(u32 name) const; + s32 getStr256Idx(u32 name) const; + s32 getVec2fIdx(u32 name) const; + s32 getVec3fIdx(u32 name) const; + s32 getVec4fIdx(u32 name) const; + s32 getBoolArrayIdx(u32 name) const; + s32 getS32ArrayIdx(u32 name) const; + s32 getF32ArrayIdx(u32 name) const; + s32 getStrArrayIdx(u32 name) const; + s32 getStr64ArrayIdx(u32 name) const; + s32 getStr256ArrayIdx(u32 name) const; + s32 getVec2fArrayIdx(u32 name) const; + s32 getVec3fArrayIdx(u32 name) const; + s32 getVec4fArrayIdx(u32 name) const; + + // endregion + + // region Index getters (by name) + + s32 getBoolIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getBoolIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getS32Idx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getS32Idx(sead::HashCRC32::calcStringHash(name)); + } + s32 getF32Idx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getF32Idx(sead::HashCRC32::calcStringHash(name)); + } + s32 getStrIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getStrIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getStr64Idx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getStr64Idx(sead::HashCRC32::calcStringHash(name)); + } + s32 getStr256Idx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getStr256Idx(sead::HashCRC32::calcStringHash(name)); + } + s32 getVec2fIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getVec2fIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getVec3fIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getVec3fIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getVec4fIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getVec4fIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getBoolArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getBoolArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getS32ArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getS32ArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getF32ArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getF32ArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getStrArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getStrArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getStr64ArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getStr64ArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getStr256ArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getStr256ArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getVec2fArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getVec2fArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getVec3fArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getVec3fArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + s32 getVec4fArrayIdx(const sead::SafeString& name) const { + return name.isEmpty() ? -1 : getVec4fArrayIdx(sead::HashCRC32::calcStringHash(name)); + } + + // endregion + + // region Array size getters + + bool getBoolArraySize(s32* size, s32 index) const; + bool getS32ArraySize(s32* size, s32 index) const; + bool getF32ArraySize(s32* size, s32 index) const; + bool getStrArraySize(s32* size, s32 index) const; + bool getStr64ArraySize(s32* size, s32 index) const; + bool getStr256ArraySize(s32* size, s32 index) const; + bool getVec2fArraySize(s32* size, s32 index) const; + bool getVec3fArraySize(s32* size, s32 index) const; + bool getVec4fArraySize(s32* size, s32 index) const; + + bool getBoolArraySizeByHash(s32* size, u32 name) const; + bool getS32ArraySizeByHash(s32* size, u32 name) const; + bool getF32ArraySizeByHash(s32* size, u32 name) const; + bool getStrArraySizeByHash(s32* size, u32 name) const; + bool getStr64ArraySizeByHash(s32* size, u32 name) const; + bool getStr256ArraySizeByHash(s32* size, u32 name) const; + bool getVec2fArraySizeByHash(s32* size, u32 name) const; + bool getVec3fArraySizeByHash(s32* size, u32 name) const; + bool getVec4fArraySizeByHash(s32* size, u32 name) const; + + bool getS32ArraySize(s32* size, const sead::SafeString& name) const; + bool getStr64ArraySize(s32* size, const sead::SafeString& name) const; + bool getVec3fArraySize(s32* size, const sead::SafeString& name) const; + + // endregion + + bool getMinValueForS32(s32* min, const sead::SafeString& name) const; + bool getMaxValueForS32(s32* max, const sead::SafeString& name) const; + private: - enum class Flag : u8 { + enum class BitFlag : u8 { }; - sead::TypedBitFlag& getFlags() { return *mFlags.data(); } - const sead::TypedBitFlag& getFlags() const { return *mFlags.data(); } + void allocCombinedFlagArrays(sead::Heap* heap); + void updateBoolFlagCounts(); + void initResetData(sead::Heap* heap); + void initRevivalRandomBools(sead::Heap* heap); + + sead::TypedBitFlag& getBitFlags() { return *mBitFlags.data(); } + const sead::TypedBitFlag& getBitFlags() const { return *mBitFlags.data(); } sead::SafeArray& getCriticalSections() { return *mCriticalSections.data(); } u32 mResourceFlags = 0; - sead::PtrArray mBoolFlags; - sead::PtrArray mS32Flags; - sead::PtrArray mF32Flags; - sead::PtrArray mStringFlags; - sead::PtrArray mString64Flags; - sead::PtrArray mString256Flags; - sead::PtrArray mVector2fFlags; - sead::PtrArray mVector3fFlags; - sead::PtrArray mVector4fFlags; + sead::PtrArray mBoolFlags; + sead::PtrArray mS32Flags; + sead::PtrArray mF32Flags; + sead::PtrArray mStringFlags; + sead::PtrArray mString64Flags; + sead::PtrArray mString256Flags; + sead::PtrArray mVector2fFlags; + sead::PtrArray mVector3fFlags; + sead::PtrArray mVector4fFlags; - sead::PtrArray mBoolArrayFlags; - sead::PtrArray mS32ArrayFlags; - sead::PtrArray mF32ArrayFlags; - sead::PtrArray mStringArrayFlags; - sead::PtrArray mString64ArrayFlags; - sead::PtrArray mString256ArrayFlags; - sead::PtrArray mVector2fArrayFlags; - sead::PtrArray mVector3fArrayFlags; - sead::PtrArray mVector4fArrayFlags; + sead::PtrArray> mBoolArrayFlags; + sead::PtrArray> mS32ArrayFlags; + sead::PtrArray> mF32ArrayFlags; + sead::PtrArray> mStringArrayFlags; + sead::PtrArray> mString64ArrayFlags; + sead::PtrArray> mString256ArrayFlags; + sead::PtrArray> mVector2fArrayFlags; + sead::PtrArray> mVector3fArrayFlags; + sead::PtrArray> mVector4fArrayFlags; + + sead::StorageFor, 3>> mUnkArray{}; + + sead::ObjArray mCombinedBoolFlags; + sead::ObjArray mCombinedS32Flags; + sead::ObjArray mCombinedF32Flags; + sead::ObjArray mCombinedStringFlags; + sead::ObjArray mCombinedString64Flags; + sead::ObjArray mCombinedString256Flags; + sead::ObjArray mCombinedVector2fFlags; + sead::ObjArray mCombinedVector3fFlags; + sead::ObjArray mCombinedVector4fFlags; - // FIXME - sead::PtrArray mUnkArray0; - sead::PtrArray mUnkArray1; - sead::PtrArray mUnkArray2; - sead::PtrArray mUnkArray3; - sead::PtrArray mUnkArray4; - sead::PtrArray mUnkArray5; - sead::PtrArray mUnkArray6; - sead::PtrArray mUnkArray7; - sead::PtrArray mUnkArray8; - sead::PtrArray mUnkArray9; - sead::PtrArray mUnkArray10; - sead::PtrArray mUnkArray11; - sead::PtrArray mUnkArray12; - sead::PtrArray mUnkArray13; - sead::PtrArray mUnkArray14; - sead::PtrArray mUnkArray15; - sead::PtrArray mUnkArray16; - sead::PtrArray mUnkArray17; - sead::PtrArray mUnkArray18; - sead::PtrArray mUnkArray19; - sead::PtrArray mUnkArray20; sead::Buffer mResetEntries; sead::PtrArray mRevivalRandomBools; sead::Heap* mHeap = nullptr; - sead::SafeArray mCounts; + sead::SafeArray mCounts; + sead::SafeArray mNumBoolFlagsPerCategory; sead::StorageFor> mCriticalSections{}; - sead::StorageFor> mFlags; + sead::StorageFor> mBitFlags; }; KSYS_CHECK_SIZE_NX150(TriggerParam, 0x3f0); diff --git a/src/KingSystem/Resource/resResourceGameData.h b/src/KingSystem/Resource/resResourceGameData.h index da8beeeb..a5e9d154 100644 --- a/src/KingSystem/Resource/resResourceGameData.h +++ b/src/KingSystem/Resource/resResourceGameData.h @@ -23,6 +23,27 @@ public: s32 getField14() const { return _14; } + sead::Buffer& getBoolFlags() { return mBoolFlags; } + sead::Buffer& getS32Flags() { return mS32Flags; } + sead::Buffer& getF32Flags() { return mF32Flags; } + sead::Buffer& getStringFlags() { return mStringFlags; } + sead::Buffer& getString64Flags() { return mString64Flags; } + sead::Buffer& getString256Flags() { return mString256Flags; } + sead::Buffer& getVector2fFlags() { return mVector2fFlags; } + sead::Buffer& getVector3fFlags() { return mVector3fFlags; } + sead::Buffer& getVector4fFlags() { return mVector4fFlags; } + sead::PtrArray& getBoolArrayFlags() { return mBoolArrayFlags; } + sead::PtrArray& getS32ArrayFlags() { return mS32ArrayFlags; } + sead::PtrArray& getF32ArrayFlags() { return mF32ArrayFlags; } + sead::PtrArray& getStringArrayFlags() { return mStringArrayFlags; } + sead::PtrArray& getString64ArrayFlags() { return mString64ArrayFlags; } + sead::PtrArray& getString256ArrayFlags() { + return mString256ArrayFlags; + } + sead::PtrArray& getVector2fArrayFlags() { return mVector2fArrayFlags; } + sead::PtrArray& getVector3fArrayFlags() { return mVector3fArrayFlags; } + sead::PtrArray& getVector4fArrayFlags() { return mVector4fArrayFlags; } + const sead::Buffer& getBoolFlags() const { return mBoolFlags; } const sead::Buffer& getS32Flags() const { return mS32Flags; } const sead::Buffer& getF32Flags() const { return mF32Flags; } diff --git a/src/KingSystem/System/PlayReportMgr.h b/src/KingSystem/System/PlayReportMgr.h index e92250df..12c43940 100644 --- a/src/KingSystem/System/PlayReportMgr.h +++ b/src/KingSystem/System/PlayReportMgr.h @@ -26,6 +26,8 @@ public: void calc(); + void reportDebug(const sead::SafeString& message, const sead::SafeString& data); + ProductReporter* getReporter() const { return mReporter; } bool get30() const { return _30; } diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index 84f1f5dd..1fa59cff 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -35,5 +35,6 @@ target_sources(uking PRIVATE ParamIO.h SafeDelete.h StrTreeMap.h + TypeTraits.h Types.h ) diff --git a/src/KingSystem/Utils/TypeTraits.h b/src/KingSystem/Utils/TypeTraits.h new file mode 100644 index 00000000..f6ddcc82 --- /dev/null +++ b/src/KingSystem/Utils/TypeTraits.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace ksys { + +template +struct IsAnyOfType : std::false_type {}; +template +struct IsAnyOfType + : std::conditional_t, std::true_type, IsAnyOfType> {}; + +} // namespace ksys