diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 390b92ce2..d9ae4a8ec 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -74874,7 +74874,7 @@ Address,Quality,Size,Name 0x0000007100d68ad4,U,000088, 0x0000007100d68b2c,U,000048,LifeRecoverInfo::onApplyDamage_0 0x0000007100d68b5c,U,000420, -0x0000007100d68d00,U,000084,_ZN4ksys3act15LifeRecoverInfo13onApplyDamageERi +0x0000007100d68d00,O,000084,_ZN4ksys3act15LifeRecoverInfo13onApplyDamageERi 0x0000007100d68d54,U,000064, 0x0000007100d68d94,U,000192,printLifeRecoverInfo 0x0000007100d68e54,U,000188, diff --git a/src/Game/DLC/aocManager.cpp b/src/Game/DLC/aocManager.cpp index bb7ca50cb..84e654fa0 100644 --- a/src/Game/DLC/aocManager.cpp +++ b/src/Game/DLC/aocManager.cpp @@ -1,8 +1,11 @@ #include "Game/DLC/aocManager.h" +#include #include #include +#include #include #include +#include "KingSystem/ActorSystem/actLifeRecoveryInfo.h" #include "KingSystem/Resource/resLoadRequest.h" #include "KingSystem/Resource/resResourceMgrTask.h" #include "KingSystem/Utils/InitTimeInfo.h" @@ -15,6 +18,21 @@ #include #endif +namespace ksys::act { + +bool LifeRecoverInfo::onApplyDamage(s32& damage) { + if (mExtraHp1 == 0) + return damage > 0; + + const auto previous_extra_hp = mExtraHp1; + const auto remaining_extra_hp = std::max(previous_extra_hp - damage, 0); + damage -= previous_extra_hp - remaining_extra_hp; + mExtraHp1 = sead::Mathf::clampMax(remaining_extra_hp, mExtraHp2); + return remaining_extra_hp != previous_extra_hp; +} + +} // namespace ksys::act + namespace uking::aoc { namespace { diff --git a/src/KingSystem/ActorSystem/actLifeRecoveryInfo.h b/src/KingSystem/ActorSystem/actLifeRecoveryInfo.h index f382d1b9f..a49924cdf 100644 --- a/src/KingSystem/ActorSystem/actLifeRecoveryInfo.h +++ b/src/KingSystem/ActorSystem/actLifeRecoveryInfo.h @@ -23,8 +23,8 @@ class LifeRecoverInfo { f32 mCounter; f32 mField_4; u8 gap_8[16]; // Is this really a gap? - u32 mExtraHp1; - u32 mExtraHp2; + s32 mExtraHp1; + s32 mExtraHp2; u32 mMaxLife; f32 mRecoverFactor; s32 mField_28;