diff options
| author | Léo Lam <leo@leolam.fr> | 2020-10-25 11:07:45 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-10-25 14:32:56 +0100 |
| commit | c612f77fcda4b6d42f69cf22135669980764df4e (patch) | |
| tree | bae909825b4fc981e61cdf50675c294d08df1c35 /src/KingSystem/GameData/gdtTriggerParam.cpp | |
| parent | da2a57992c7fa7ef0219489f1250e628f2f37791 (diff) | |
ksys/gdt: Implement TriggerParam::recordFlagChange
Diffstat (limited to 'src/KingSystem/GameData/gdtTriggerParam.cpp')
| -rw-r--r-- | src/KingSystem/GameData/gdtTriggerParam.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/KingSystem/GameData/gdtTriggerParam.cpp b/src/KingSystem/GameData/gdtTriggerParam.cpp index 2148f2bb..f36b6a1d 100644 --- a/src/KingSystem/GameData/gdtTriggerParam.cpp +++ b/src/KingSystem/GameData/gdtTriggerParam.cpp @@ -1,5 +1,6 @@ #include "KingSystem/GameData/gdtTriggerParam.h" #include <algorithm> +#include <mc/seadCoreInfo.h> #include "KingSystem/GameData/gdtFlagProxy.h" #include "KingSystem/Resource/resResourceGameData.h" #include "KingSystem/Utils/SafeDelete.h" @@ -7,10 +8,12 @@ namespace ksys::gdt { TriggerParam::TriggerParam() { - mUnkArray.constructDefault(); - mCriticalSections.constructDefault(); + for (auto& buffer : mFlagChangeRecords) + buffer.constructDefault(); + for (auto& cs : mCriticalSections) + cs.constructDefault(); mBitFlags.constructDefault(); - mCounts.fill(0); + mFlagChangeRecordIndices.fill(0); mNumBoolFlagsPerCategory.fill(0); } @@ -459,8 +462,8 @@ void TriggerParam::copyAllFlags(const TriggerParam& src, sead::Heap* heap, bool #undef COPY_ARRAY_ if (init_reset_data) { - for (auto& array : *mUnkArray.data()) - array.allocBufferAssert(num_flags, heap); + for (auto& array : mFlagChangeRecords) + array.ref().allocBufferAssert(num_flags, heap); initResetData(heap); initRevivalRandomBools(heap); } @@ -855,6 +858,25 @@ bool TriggerParam::getMaxValueForS32(s32* max, const sead::SafeString& name) con return true; } +void TriggerParam::recordFlagChange(const FlagBase* flag, s32 idx, s16 sub_idx) { + const auto core = sead::CoreInfo::getCurrentCoreId(); + const u32 platform_core_id = sead::CoreInfo::getPlatformCoreId(core); + + auto& buffer = mFlagChangeRecords[platform_core_id].ref(); + if (buffer.size() < 1) + return; + + auto lock = sead::makeScopedLock(mCriticalSections[platform_core_id].ref()); + + buffer[mFlagChangeRecordIndices[platform_core_id]].type.mValue = u8(flag->getType()); + buffer[mFlagChangeRecordIndices[platform_core_id]].index = idx; + buffer[mFlagChangeRecordIndices[platform_core_id]].sub_index = sub_idx; + ++mFlagChangeRecordIndices[platform_core_id]; + + if (flag->getType() == FlagType::Bool) + mBitFlags.ref().set(BitFlag::_8); +} + s32 TriggerParam::getBoolIdx(u32 name) const { return getFlagIndex(mBoolFlags, name); } |
