diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 390b92ce2..a2a074aa9 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -19436,21 +19436,21 @@ Address,Quality,Size,Name 0x00000071002ce67c,U,000160, 0x00000071002ce71c,U,000152, 0x00000071002ce7b4,U,000160, -0x00000071002ce854,U,000072,DamageMgrShield::ctor -0x00000071002ce89c,U,000060,DamageMgrShield::setDamage -0x00000071002ce8d8,U,000540,DamageMgrShield::m22 -0x00000071002ceaf4,U,000632,DamageMgrShield::shieldSurfDamageLogic -0x00000071002ced6c,U,000404,DamageMgrShield::shieldDamageLogic -0x00000071002cef00,U,000008,DamageMgrShield::rtti1 -0x00000071002cef08,U,000092,DamageMgrShield::rtti2 -0x00000071002cef64,U,000004,DamageMgrShield::dtor -0x00000071002cef68,U,000004,j__ZdlPv_79 -0x00000071002cef6c,U,000008,DamageMgrShield::getNumCallbacks -0x00000071002cef74,U,000048,DamageMgrShield::freeCallbacks -0x00000071002cefa4,U,000008,DamageMgrShield::getDamage -0x00000071002cefac,U,000008,DamageMgrShield::m53 -0x00000071002cefb4,U,000004,nullsub_937 -0x00000071002cefb8,U,000008, +0x00000071002ce854,O,000072,_ZN5uking3dmg15DamageMgrShieldC1EPN4ksys3act5ActorE +0x00000071002ce89c,O,000060,_ZN5uking3dmg15DamageMgrShield10setDamage2Ef +0x00000071002ce8d8,O,000540,_ZN5uking3dmg15DamageMgrShield3m22Ev +0x00000071002ceaf4,U,000632,_ZN5uking3dmg15DamageMgrShield21shieldSurfDamageLogicEPiS2_S2_S2_S2_S2_ +0x00000071002ced6c,U,000404,_ZN5uking3dmg15DamageMgrShield17shieldDamageLogicEPiS2_S2_S2_S2_S2_ +0x00000071002cef00,U,000008, +0x00000071002cef08,O,000092,_ZNK5uking3dmg15DamageMgrShield18getRuntimeTypeInfoEv +0x00000071002cef64,O,000004,_ZN5uking3dmg15DamageMgrShieldD2Ev +0x00000071002cef68,O,000004,_ZN5uking3dmg15DamageMgrShieldD0Ev +0x00000071002cef6c,O,000008,_ZN5uking3dmg15DamageMgrShield15getNumCallbacksEv +0x00000071002cef74,O,000048,_ZN5uking3dmg15DamageMgrShield10preDelete1Ev +0x00000071002cefa4,O,000008,_ZN5uking3dmg15DamageMgrShield10getDamage2Ev +0x00000071002cefac,O,000008,_ZNK5uking3dmg15DamageMgrShield13isDamageType4Ev +0x00000071002cefb4,O,000004,_ZThn56_N5uking3dmg15DamageMgrShieldD1Ev +0x00000071002cefb8,O,000008,_ZThn56_N5uking3dmg15DamageMgrShieldD0Ev 0x00000071002cefc0,U,000372, 0x00000071002cf134,U,000360,SiteBoss::construct 0x00000071002cf29c,U,000016,MesTransceiverId::dtor @@ -45365,7 +45365,7 @@ Address,Quality,Size,Name 0x00000071006dfdd8,U,000096,DamageMgrBase::m20 0x00000071006dfe38,U,000020,DamageMgrBase::resetStuff 0x00000071006dfe4c,O,000500,_ZN5uking3dmg17DamageManagerBase11applyDamageERi -0x00000071006e0040,O,000204,_ZN5uking3dmg17DamageManagerBase21handleDamageForPlayerEPjS2_S2_S2_S2_ +0x00000071006e0040,O,000204,_ZN5uking3dmg17DamageManagerBase21handleDamageForPlayerEPjS2_S2_PiS3_ 0x00000071006e010c,O,000072,_ZN5uking3dmg17DamageManagerBase9addDamageEliiiiii 0x00000071006e0154,U,000004,_ZN5uking3dmg17DamageManagerBase10isSlowTimeEv 0x00000071006e0158,U,000324,DamageMgrBase::m29 diff --git a/src/Game/Damage/CMakeLists.txt b/src/Game/Damage/CMakeLists.txt index 1a5903888..e429e1635 100644 --- a/src/Game/Damage/CMakeLists.txt +++ b/src/Game/Damage/CMakeLists.txt @@ -2,6 +2,9 @@ target_sources(uking PRIVATE dmgDamageCallback.h dmgDamageManagerBase.h dmgDamageManagerBase.cpp + dmgDamageMgrShield.cpp + dmgDamageMgrShield.h + dmgDamageMgrWeapon.h dmgInfoManager.cpp dmgInfoManager.h dmgStruct20.h diff --git a/src/Game/Damage/dmgDamageManagerBase.cpp b/src/Game/Damage/dmgDamageManagerBase.cpp index ce029d3e6..e6a6e7176 100644 --- a/src/Game/Damage/dmgDamageManagerBase.cpp +++ b/src/Game/Damage/dmgDamageManagerBase.cpp @@ -238,7 +238,7 @@ bool DamageManagerBase::canTakeDamage() { return item.mCanTakeDamageFromType[damageTypeMaybe] & 0x1; } -void DamageManagerBase::handleDamageForPlayer(u32* a2, u32* a3, u32* a4, u32* a5, u32* a6) { +void DamageManagerBase::handleDamageForPlayer(u32* a2, u32* a3, u32* a4, s32* a5, s32* a6) { Struct20* currentStruct = sead::DynamicCast(mStruct20_b); if (!currentStruct) { return; diff --git a/src/Game/Damage/dmgDamageManagerBase.h b/src/Game/Damage/dmgDamageManagerBase.h index a324f3ebf..43405ac78 100644 --- a/src/Game/Damage/dmgDamageManagerBase.h +++ b/src/Game/Damage/dmgDamageManagerBase.h @@ -110,7 +110,7 @@ class DamageManagerBase : public DamageManagerBase_UnknownBase1, virtual void m43() {} virtual bool canTakeDamage(); virtual void m45() {} - virtual void handleDamageForPlayer(u32* a2, u32* a3, u32* a4, u32* a5, u32* a6); + virtual void handleDamageForPlayer(u32* a2, u32* a3, u32* a4, s32* a5, s32* a6); virtual bool addDamage(s64 a2, s32 damage, s32 df48, s32 minDmg, s32 f50, s32 f54, s32 f40); virtual void onApplyDamage() {} @@ -119,17 +119,21 @@ class DamageManagerBase : public DamageManagerBase_UnknownBase1, void clearCallbacks(); void resetStuff(); - void callDamageCallbacks(u32 a2, u32* a3, s32* a4, u32* a5, u32* a6, u32* a7, u64 a8); + void callDamageCallbacks(u32 a2, u32* a3, s32* a4, u32* a5, s32* a6, s32* a7, u64 a8); s64 calcMaybe(); inline void tryBuffDamage(s32& damage); inline void tryApplyDamageRecovery(s32& damage); -private: + void setDamageType(s32 type) { mDamageType = type; } + + bool isOwnedByPlayer() const { return mIsOwnedByPlayer; } + +public: s32 mField_40 = 0; - s32 mDamage = 0; + u32 mDamage = 0; s32 mField_48 = 0; - s32 mMinDmg = 0; + u32 mMinDmg = 0; s32 mField_50 = -1; s32 mField_54 = -1; s32 mFlags2 = 0; diff --git a/src/Game/Damage/dmgDamageMgrShield.cpp b/src/Game/Damage/dmgDamageMgrShield.cpp new file mode 100644 index 000000000..7c6633629 --- /dev/null +++ b/src/Game/Damage/dmgDamageMgrShield.cpp @@ -0,0 +1,93 @@ +#include "Game/Damage/dmgDamageMgrShield.h" + +#include "Game/Actor/actWeapon.h" +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/ActorSystem/actActorConstDataAccess.h" + +namespace uking::dmg { + +DamageMgrShield::DamageMgrShield(ksys::act::Actor* actor) : DamageMgrWeapon(actor) { + mDamage2 = act::WeaponModifierInfo::getLifeMultiplier(); + mIsDamageType4 = false; +} + +DamageMgrShield::~DamageMgrShield() = default; + +void DamageMgrShield::setDamage2(f32 damage) { + mDamage2 = act::WeaponModifierInfo::getLifeMultiplier() * damage; +} + +void DamageMgrShield::m22() { + u32 aDamage = 0; + u32 aDf48 = 0; + s32 a5 = -1; + s32 a6 = -1; + u32 aMinDmg = 0; + + if (isOwnedByPlayer()) { + handleDamageForPlayer(&aDamage, &aDf48, &aMinDmg, &a5, &a6); + } + + mIsDamageType4 = false; + resetStuff(); + + s32 bDamage = 0; + s32 bDf48 = 0; + s32 bMinDmg = 0; + s32 b6 = -1; + s32 b5 = -1; + s32 b7 = 0; + + if (mField_34) + return; + + if (isOwnedByPlayer() && shieldSurfDamageLogic(&bDamage, &bDf48, &bMinDmg, &b5, &b6, &b7) && + addDamage(2, bDamage, bDf48, bMinDmg, b5, b6, b7)) { + setDamageType(2); + } + + if (shieldDamageLogic(&bDamage, &bDf48, &bMinDmg, &b5, &b6, &b7) && + addDamage(3, bDamage, bDf48, bMinDmg, b5, b6, b7)) { + setDamageType(3); + } + + ksys::act::Chemical* chemical = mActor->getChemicalStuff(); + if (chemical && chemical->value == 3) { + s32* life = mActor->getLife(); + bDamage = life ? *life : 1; + bDf48 = 0; + bMinDmg = 0; + b5 = 9; + b6 = 30; + b7 = 1; + if (addDamage(1, bDamage, bDf48, bMinDmg, b5, b6, b7)) + setDamageType(1); + } + + if (addDamage(4, aDamage, aDf48, aMinDmg, a5, a6, 1)) { + mIsDamageType4 = true; + setDamageType(4); + } + + callDamageCallbacks(0, &mDamage, &mField_48, &mMinDmg, &mField_50, &mField_54, 0); +} + +s32 DamageMgrShield::getNumCallbacks() { + return 1; +} + +void DamageMgrShield::preDelete1() { + m20(); + resetStuff(); + mCallback = nullptr; + mIsDamageType4 = false; +} + +s32 DamageMgrShield::getDamage2() { + return mDamage2; +} + +bool DamageMgrShield::isDamageType4() const { + return mIsDamageType4; +} +} // namespace uking::dmg diff --git a/src/Game/Damage/dmgDamageMgrShield.h b/src/Game/Damage/dmgDamageMgrShield.h new file mode 100644 index 000000000..e4b8cc34e --- /dev/null +++ b/src/Game/Damage/dmgDamageMgrShield.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include "Game/Damage/dmgDamageMgrWeapon.h" + +namespace ksys::act { +// TODO: Move Chemical to correct file +class Chemical { +public: + char filler[0xc0]; + u8 value; +}; +} // namespace ksys::act + +namespace uking::dmg { + +class DamageMgrShield : public DamageMgrWeapon { + SEAD_RTTI_OVERRIDE(DamageMgrShield, DamageMgrWeapon) + +public: + DamageMgrShield(ksys::act::Actor* actor); + ~DamageMgrShield() override; + + void setDamage2(f32 damage) override; + void m22() override; + bool shieldSurfDamageLogic(s32* damage, s32* df48, s32* minDmg, s32* f50, s32* f54, s32* f40); + bool shieldDamageLogic(s32* damage, s32* df48, s32* minDmg, s32* f50, s32* f54, s32* f40); + s32 getNumCallbacks() override; + + void preDelete1() override; + s32 getDamage2() override; + bool isDamageType4() const override; + +private: + /* 0x0068 */ void* mCallback = nullptr; + /* 0x0070 */ s32 mDamage2; + /* 0x0074 */ bool mIsDamageType4; +}; + +KSYS_CHECK_SIZE_NX150(DamageMgrShield, 0x78); + +} // namespace uking::dmg diff --git a/src/Game/Damage/dmgDamageMgrWeapon.h b/src/Game/Damage/dmgDamageMgrWeapon.h new file mode 100644 index 000000000..d454f2e51 --- /dev/null +++ b/src/Game/Damage/dmgDamageMgrWeapon.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include "Game/Damage/dmgDamageManagerBase.h" + +namespace uking::dmg { + +class DamageMgrWeapon : public DamageManagerBase { + SEAD_RTTI_OVERRIDE(DamageMgrWeapon, DamageManagerBase) + +public: + DamageMgrWeapon(ksys::act::Actor* actor); + + virtual void setDamage2(f32 damage); + virtual s32 getDamage2(); + virtual s32 m52(); + virtual bool isDamageType4() const; + + void m20(); +}; +KSYS_CHECK_SIZE_NX150(DamageMgrWeapon, 0x68); + +} // namespace uking::dmg