diff options
Diffstat (limited to 'src/KingSystem/ActorSystem/actIDamageManager.cpp')
| -rw-r--r-- | src/KingSystem/ActorSystem/actIDamageManager.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/KingSystem/ActorSystem/actIDamageManager.cpp b/src/KingSystem/ActorSystem/actIDamageManager.cpp new file mode 100644 index 00000000..fd4f09a6 --- /dev/null +++ b/src/KingSystem/ActorSystem/actIDamageManager.cpp @@ -0,0 +1,81 @@ +#include "KingSystem/ActorSystem/actIDamageManager.h" +#include "KingSystem/ActorSystem/actActor.h" + +namespace ksys::act { + +void IDamageManager::addDamageCallback(s32 eventId, DamageCallback* callback) { + if (mCallbacks.isBufferReady() && !callback->mDamageManager) { + DamageCallback* next = mCallbacks[eventId]; + if (next) { + DamageCallback* prev; + while (next) { + prev = next; + next = next->mNext; + } + + prev->mNext = callback; + callback->mPrev = prev; + } else { + mCallbacks[eventId] = callback; + } + + callback->mDamageManager = this; + callback->mEventId = eventId; + } +} + +void IDamageManager::removeDamageCallback(DamageCallback* callback) { + if (!mCallbacks.isBufferReady() || callback->mDamageManager != this) { + return; + } + + u32 event_id = callback->mEventId; + DamageCallback* current_callback = mCallbacks[event_id]; + if (!current_callback) { + if (mActor) { + // Logging about trying to remove missing callback? + mActor->nullsub_4649(); + } + + callback->mDamageManager = nullptr; + callback->mEventId = -1; +#ifdef MATCHING_HACK_NX_CLANG + asm(""); // Stop optimizing with the other clear below +#endif + return; + } + + if (current_callback == callback) { + mCallbacks[event_id] = callback->mNext; + current_callback = mCallbacks[event_id]; + if (current_callback) { + current_callback->mPrev = nullptr; + } +#ifdef MATCHING_HACK_NX_CLANG + asm(""); // Stop re-using variables, generating an extra register +#endif + } else { + do { + if (current_callback == callback) { + DamageCallback* prev = callback->mPrev; + if (prev) { + prev->mNext = callback->mNext; + } + DamageCallback* next = callback->mNext; + if (next) { + next->mPrev = callback->mPrev; + } + } + current_callback = current_callback->mNext; + } while (current_callback); + } + callback->mNext = nullptr; +#ifdef MATCHING_HACK_NX_CLANG + asm(""); // Stop combining the mNext and mDamageManager +#endif + callback->mDamageManager = nullptr; + callback->mEventId = -1; + callback->mPrev = nullptr; +} + +} // namespace ksys::act |
