ksys/dmg: Implementing some of DamageManagerBase. Added some temporary classes/variables used by DamageManagerBase.

This commit is contained in:
Wildex999 2020-10-18 17:12:23 +02:00
parent e3fd543178
commit 05a69f745b
15 changed files with 751 additions and 57 deletions

View File

@ -204,33 +204,33 @@
0x0000007100003f48,DamageMgrBow::m54,164,
0x0000007100003fec,DamageMgrBow::m0,132,
0x0000007100004070,DamageMgrBow::m1,92,
0x00000071000040cc,DamageMgrBase::m2_null,4,
0x00000071000040cc,DamageMgrBase::m2_null,4,_ZN4ksys3dmg17DamageManagerBaseD2Ev
0x00000071000040d0,j__ZdlPv_0,4,
0x00000071000040d4,DamageMgrBase::m5,8,
0x00000071000040dc,DamageMgrBase::getMinDmg,8,
0x00000071000040e4,DamageMgrBase::m7,8,
0x00000071000040ec,DamageMgrBase::m9,8,
0x00000071000040f4,DamageMgrBase::m10,8,
0x00000071000040fc,DamageMgrBase::m13,8,
0x0000007100004104,DamageMgrBase::m14,8,
0x000000710000410c,DamageMgrBase::m16,8,
0x0000007100004114,DamageMgrBase::m17_null,4,
0x00000071000040d4,DamageMgrBase::m5,8,_ZN4ksys3dmg17DamageManagerBase10getField48Ev
0x00000071000040dc,DamageMgrBase::getMinDmg,8,_ZN4ksys3dmg17DamageManagerBase9getMinDmgEv
0x00000071000040e4,DamageMgrBase::m7,8,_ZN4ksys3dmg17DamageManagerBase10getField50Ev
0x00000071000040ec,DamageMgrBase::m9,8,_ZN4ksys3dmg17DamageManagerBase16checkDamageFlagsEv
0x00000071000040f4,DamageMgrBase::m10,8,_ZN4ksys3dmg17DamageManagerBase9getFlags2Ev
0x00000071000040fc,DamageMgrBase::m13,8,_ZN4ksys3dmg17DamageManagerBase3m13Ev
0x0000007100004104,DamageMgrBase::m14,8,_ZN4ksys3dmg17DamageManagerBase3m14Ev
0x000000710000410c,DamageMgrBase::m16,8,_ZN4ksys3dmg17DamageManagerBase3m16Ev
0x0000007100004114,DamageMgrBase::m17_null,4,_ZN4ksys3dmg17DamageManagerBase3m17Ev
0x0000007100004118,DamageMgrBow::m18,8,
0x0000007100004120,DamageMgrBase::initCallbacks,8,
0x0000007100004128,DamageMgrBase::m21_null,4,
0x000000710000412c,DamageMgrBase::m25,8,
0x0000007100004134,DamageMgrBase::m26,8,
0x000000710000413c,DamageMgrBase::m31,8,
0x0000007100004144,DamageMgrBase::m32,8,
0x000000710000414c,DamageMgrBase::m34,8,
0x0000007100004154,DamageMgrBase::m35,8,
0x000000710000415c,DamageMgrBase::m38,8,
0x0000007100004164,DamageMgrBase::m40,8,
0x000000710000416c,DamageMgrBase::m41,8,
0x0000007100004174,DamageMgrBase::m42,8,
0x000000710000417c,DamageMgrBase::m43_null,4,
0x0000007100004120,DamageMgrBase::initCallbacks,8,_ZN4ksys3dmg17DamageManagerBase13initCallbacksEPN4sead4HeapE
0x0000007100004128,DamageMgrBase::m21_null,4,_ZN4ksys3dmg17DamageManagerBase10preDelete2Ev
0x000000710000412c,DamageMgrBase::m25,8,_ZN4ksys3dmg17DamageManagerBase3m25Ev
0x0000007100004134,DamageMgrBase::m26,8,_ZN4ksys3dmg17DamageManagerBase3m26Ev
0x000000710000413c,DamageMgrBase::m31,8,_ZN4ksys3dmg17DamageManagerBase3m31Ev
0x0000007100004144,DamageMgrBase::m32,8,_ZN4ksys3dmg17DamageManagerBase3m32Ev
0x000000710000414c,DamageMgrBase::m34,8,_ZN4ksys3dmg17DamageManagerBase26tgSensorMaterialOnHitMaybeEv
0x0000007100004154,DamageMgrBase::m35,8,_ZN4ksys3dmg17DamageManagerBase3m35Ev
0x000000710000415c,DamageMgrBase::m38,8,_ZN4ksys3dmg17DamageManagerBase3m38Ev
0x0000007100004164,DamageMgrBase::m40,8,_ZN4ksys3dmg17DamageManagerBase3m40Ev
0x000000710000416c,DamageMgrBase::m41,8,_ZN4ksys3dmg17DamageManagerBase3m41Ev
0x0000007100004174,DamageMgrBase::m42,8,_ZN4ksys3dmg17DamageManagerBase3m42Ev
0x000000710000417c,DamageMgrBase::m43_null,4,_ZN4ksys3dmg17DamageManagerBase3m43Ev
0x0000007100004180,DamageMgr::m44,8,
0x0000007100004188,DamageMgrBase::onApplyDamage,4,
0x0000007100004188,DamageMgrBase::onApplyDamage,4,_ZN4ksys3dmg17DamageManagerBase13onApplyDamageEv
0x000000710000418c,DamageMgrBow::m51,8,
0x0000007100004194,DamageMgrBow::m52,8,
0x000000710000419c,DamageMgrBow::m53,8,
@ -620,11 +620,11 @@
0x000000710001bd9c,DamageMgrWeapon::rtti1,288,
0x000000710001bebc,sub_710001BEBC,92,
0x000000710001bf18,j__ZdlPv_12,4,
0x000000710001bf1c,DamageMgrBase::m18,8,
0x000000710001bf24,DamageMgrBase::m22_null,4,
0x000000710001bf28,DamageMgrBase::m27,8,
0x000000710001bf30,DamageMgrBase::m28,8,
0x000000710001bf38,DamageMgrBase::m33,8,
0x000000710001bf1c,DamageMgrBase::m18,8,_ZN4ksys3dmg17DamageManagerBase15getNumCallbacksEv
0x000000710001bf24,DamageMgrBase::m22_null,4,_ZN4ksys3dmg17DamageManagerBase3m22Ev
0x000000710001bf28,DamageMgrBase::m27,8,_ZN4ksys3dmg17DamageManagerBase11getPositionEv
0x000000710001bf30,DamageMgrBase::m28,8,_ZN4ksys3dmg17DamageManagerBase3m28Ev
0x000000710001bf38,DamageMgrBase::m33,8,_ZN4ksys3dmg17DamageManagerBase3m33Ev
0x000000710001bf40,nullsub_55,4,
0x000000710001bf44,sub_710001BF44,8,
0x000000710001bf4c,DamageMgrWeapon::m52,8,
@ -44061,7 +44061,7 @@
0x00000071006d8be4,DamageMgr::m55,516,
0x00000071006d8de8,sub_71006D8DE8,148,
0x00000071006d8e7c,sub_71006D8E7C,68,
0x00000071006d8ec0,sub_71006D8EC0,244,
0x00000071006d8ec0,sub_71006D8EC0,244,_ZN4ksys3dmg10Struct20_212combineMaybeEPNS0_12Struct20BaseE
0x00000071006d8fb4,DamageMgr::rtti0,288,
0x00000071006d90d4,DamageMgr::rtti2,92,
0x00000071006d9130,DamageMgr::m2,212,
@ -44073,10 +44073,10 @@
0x00000071006d9310,DamageMgr::m53,8,
0x00000071006d9318,sub_71006D9318,212,
0x00000071006d93ec,sub_71006D93EC,224,
0x00000071006d94cc,sub_71006D94CC,288,
0x00000071006d95ec,sub_71006D95EC,92,
0x00000071006d9648,j__ZdlPv_292,4,
0x00000071006d964c,sub_71006D964C,24,
0x00000071006d94cc,sub_71006D94CC,288,_ZNK4ksys3dmg10Struct20_227checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071006d95ec,sub_71006D95EC,92,_ZNK4ksys3dmg10Struct20_218getRuntimeTypeInfoEv
0x00000071006d9648,j__ZdlPv_292,4,_ZN4ksys3dmg10Struct20_2D0Ev
0x00000071006d964c,sub_71006D964C,24,_ZN4ksys3dmg10Struct20_25resetEv
0x00000071006d9664,j__ZdlPv_293,4,
0x00000071006d9668,sub_71006D9668,8,
0x00000071006d9670,j__ZdlPv_294,4,
@ -44085,7 +44085,7 @@
0x00000071006d9748,sub_71006D9748,92,
0x00000071006d97a4,sub_71006D97A4,112,
0x00000071006d9814,sub_71006D9814,92,
0x00000071006d9870,Struct20::m2,20,
0x00000071006d9870,Struct20::m2,20,_ZN4ksys3dmg8Struct20D2Ev
0x00000071006d9884,j__ZdlPv_295,4,
0x00000071006d9888,nullsub_2287,4,
0x00000071006d988c,nullsub_2288,4,
@ -44224,21 +44224,21 @@
0x00000071006dfcb0,nullsub_2297,4,
0x00000071006dfcb4,nullsub_2298,4,
0x00000071006dfcb8,nullsub_2299,4,
0x00000071006dfcbc,DamageMgrBase::allocStruct20,132,
0x00000071006dfd40,DamageMgrBase::m24,76,
0x00000071006dfd8c,DamageMgrBase::ctor,76,
0x00000071006dfcbc,DamageMgrBase::allocStruct20,132,_ZN4ksys3dmg17DamageManagerBase13allocStruct20EPN4sead4HeapE
0x00000071006dfd40,DamageMgrBase::m24,76,_ZN4ksys3dmg17DamageManagerBase10preDelete1Ev
0x00000071006dfd8c,DamageMgrBase::ctor,76,_ZN4ksys3dmg17DamageManagerBaseC1EPNS_3act5ActorE?
0x00000071006dfdd8,DamageMgrBase::m20,96,
0x00000071006dfe38,DamageMgrBase::resetStuff,20,
0x00000071006dfe4c,DamageMgrBase::applyDamage,500,
0x00000071006e0040,DamageMgrBase::m46,204,
0x00000071006e010c,DamageMgrBase::addDamage,72,
0x00000071006dfe4c,DamageMgrBase::applyDamage,500,_ZN4ksys3dmg17DamageManagerBase11applyDamageERi?
0x00000071006e0040,DamageMgrBase::m46,204,_ZN4ksys3dmg17DamageManagerBase21handleDamageForPlayerEPjS2_S2_S2_S2_
0x00000071006e010c,DamageMgrBase::addDamage,72,_ZN4ksys3dmg17DamageManagerBase9addDamageEliiiiii
0x00000071006e0154,DamageMgrBase::isSlowTime,4,
0x00000071006e0158,DamageMgrBase::m29,324,
0x00000071006e029c,DamageMgrBase::m30,2296,
0x00000071006e0b94,DamageMgrBase::getDamage,56,
0x00000071006e0bcc,DamageMgrBase::m8,8,
0x00000071006e0b94,DamageMgrBase::getDamage,56,_ZN4ksys3dmg17DamageManagerBase9getDamageEv
0x00000071006e0bcc,DamageMgrBase::m8,8,_ZN4ksys3dmg17DamageManagerBase10getField54Ev
0x00000071006e0bd4,sub_71006E0BD4,100,
0x00000071006e0c38,DamageMgrBase::canTakeDamage,136,
0x00000071006e0c38,DamageMgrBase::canTakeDamage,136,_ZN4ksys3dmg17DamageManagerBase13canTakeDamageEv
0x00000071006e0cc0,sub_71006E0CC0,100,
0x00000071006e0d24,sub_71006E0D24,196,
0x00000071006e0de8,sub_71006E0DE8,144,
@ -44246,21 +44246,21 @@
0x00000071006e0f24,sub_71006E0F24,144,
0x00000071006e0fb4,sub_71006E0FB4,156,
0x00000071006e10d0,sub_71006E10D0,292,
0x00000071006e1274,DamageMgrBase::m45_null,4,
0x00000071006e1278,DamageMgrBase::m49,16,
0x00000071006e1274,DamageMgrBase::m45_null,4,_ZN4ksys3dmg17DamageManagerBase3m45Ev
0x00000071006e1278,DamageMgrBase::m49,16,_ZN4ksys3dmg17DamageManagerBase3m49Ei
0x00000071006e1288,DamageMgr::getActorDamageParam,28,
0x00000071006e12a4,Struct20::m5,208,
0x00000071006e12a4,Struct20::m5,208,_ZN4ksys3dmg8Struct2012combineMaybeEPNS0_12Struct20BaseE
0x00000071006e1374,DamageMgrBase::m36,20,
0x00000071006e1388,DamageMgrBase::m37,20,
0x00000071006e139c,DamageMgrBase::rtti1,204,
0x00000071006e1468,DamageMgrBase::rtti2,92,
0x00000071006e14c4,DamageMgrBase::m3,4,
0x00000071006e14c8,nullsub_2301,4,
0x00000071006e14cc,sub_71006E14CC,8,
0x00000071006e14d4,Struct20::rtti1,204,
0x00000071006e15a0,Struct20::rtti2,92,
0x00000071006e15fc,j__ZdlPv_299,4,
0x00000071006e1600,Struct20::m4,20,
0x00000071006e14c4,DamageMgrBase::m3,4,_ZN4ksys3dmg17DamageManagerBaseD0Ev
0x00000071006e14c8,nullsub_2301,4,_ZThn56_N4ksys3dmg17DamageManagerBaseD1Ev
0x00000071006e14cc,sub_71006E14CC,8,_ZThn56_N4ksys3dmg17DamageManagerBaseD0Ev
0x00000071006e14d4,Struct20::rtti1,204,_ZNK4ksys3dmg8Struct2027checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071006e15a0,Struct20::rtti2,92,_ZNK4ksys3dmg8Struct2018getRuntimeTypeInfoEv
0x00000071006e15fc,j__ZdlPv_299,4,_ZN4ksys3dmg8Struct20D0Ev
0x00000071006e1600,Struct20::m4,20,_ZN4ksys3dmg8Struct205resetEv
0x00000071006e1614,sub_71006E1614,112,
0x00000071006e1684,sub_71006E1684,120,
0x00000071006e16fc,sub_71006E16FC,84,
@ -71591,8 +71591,8 @@
0x0000007100d2d370,DamageMgrBase::calcMaybe,180,
0x0000007100d2d424,sub_7100D2D424,160,
0x0000007100d2d4c4,DamageMgrBase::callDamageCallbacks,152,
0x0000007100d2d55c,DamageMgrBase::addDamageCallback,80,
0x0000007100d2d5ac,DamageMgrBase::removeDamageCallback,220,
0x0000007100d2d55c,DamageMgrBase::addDamageCallback,80,_ZN4ksys3dmg17DamageManagerBase17addDamageCallbackEiPNS0_14DamageCallbackE
0x0000007100d2d5ac,DamageMgrBase::removeDamageCallback,220,_ZN4ksys3dmg17DamageManagerBase20removeDamageCallbackEPNS0_14DamageCallbackE
0x0000007100d2d688,sub_7100D2D688,20,
0x0000007100d2d69c,act::getSystemIsGetItemSelf,20,
0x0000007100d2d6b0,ActorInfoData::getGeneralLife,20,
@ -72748,7 +72748,7 @@
0x0000007100d6d3d4,aoc2::modifyEnemyNoticeDuration,60,
0x0000007100d6d410,sub_7100D6D410,304,
0x0000007100d6d540,aoc2::shouldApplyMasterModeDamageMultiplier,6164,_ZN5uking4aoc237shouldApplyMasterModeDamageMultiplierERKN4ksys3act20ActorConstDataAccessE
0x0000007100d6ed54,aoc2::buffDamage,40,
0x0000007100d6ed54,aoc2::buffDamage,40,_ZN5uking4aoc210buffDamageERi
0x0000007100d6ed7c,aoc2::initHardModeFlag,172,
0x0000007100d6ee28,aoc2::setAocFlag2,172,
0x0000007100d6eed4,aoc2::setIsLastPlayHardMode,60,

Can't render this file because it is too large.

View File

@ -2,6 +2,9 @@
namespace uking {
SEAD_ENUM_IMPL(aoc2::Flags1)
SEAD_ENUM_IMPL(aoc2::Flags2)
bool aoc2::shouldApplyMasterModeDamageMultiplier(const ksys::act::ActorConstDataAccess& accessor) {
if (!accessor.hasProc())
return false;
@ -180,4 +183,11 @@ bool aoc2::rankUpEnemy(const sead::SafeString& actor_name, const ksys::map::Obje
return true;
}
void aoc2::buffDamage(s32& damage) {
damage = damage * 1.5f;
if (damage == 1) {
damage = 2;
}
}
} // namespace uking

View File

@ -1,6 +1,8 @@
#pragma once
#include <heap/seadDisposer.h>
#include <prim/seadBitFlag.h>
#include <prim/seadEnum.h>
#include <prim/seadSafeString.h>
#include "KingSystem/ActorSystem/actActorConstDataAccess.h"
#include "KingSystem/Map/mapObject.h"
@ -15,15 +17,26 @@ class aoc2 {
virtual ~aoc2();
public:
SEAD_ENUM(Flags1, F0, F1, F2, F3, F4, EnableLifeRegen, F7, ApplyDamageMultiplier);
SEAD_ENUM(Flags2, EnableHardMode);
void init(sead::Heap* heap);
static bool
shouldApplyMasterModeDamageMultiplier(const ksys::act::ActorConstDataAccess& accessor);
static void buffDamage(s32& damage);
bool isTestOfStrengthShrine() const;
bool rankUpEnemy(const sead::SafeString& actor_name, const ksys::map::Object& obj,
const char** new_name);
bool checkFlag1(Flags1 flag) const { return mFlags1.isOnBit(flag); }
bool checkFlag2(Flags2 flag) const { return mFlags2.isOnBit(flag); }
u8 TEMP[0x28]; // Temp to get flag offsets correct
sead::BitFlag32 mFlags1;
sead::BitFlag32 mFlags2;
};
} // namespace uking

View File

@ -31,6 +31,7 @@ target_sources(uking PRIVATE
actBaseProcMgr.h
actBaseProcUnit.cpp
actBaseProcUnit.h
actLifeRecoveryInfo.h
actInstParamPack.cpp
actInstParamPack.h
actTag.h

View File

@ -6,6 +6,9 @@ namespace ksys {
namespace act {
class LifeRecoverInfo;
class ActorParam;
class Actor : public BaseProc {
public:
Actor(); // FIXME
@ -13,9 +16,18 @@ public:
SEAD_RTTI_OVERRIDE(Actor, BaseProc)
virtual LifeRecoverInfo* getLifeRecoverInfo();
void emitBasicSigOn();
void emitBasicSigOff();
void nullsub_4649(); // Some kind of logging which has been excluded from the build?
u8 TEMP1[0x3F4]; // FIXME
ActorParam* mActorParam;
u8 TEMP2[0x2C0]; // FIXME
};
KSYS_CHECK_SIZE_NX150(Actor, 0x838);
} // namespace act

View File

@ -10,6 +10,29 @@ class GParamList;
namespace act {
// FIXME: incomplete
class ActorParam {
public:
// FIXME: incomplete
struct Data {
public:
u8 TEMP1[0xA0];
res::GParamList* mGParamList;
u8 TEMP2[0x18];
void* mDamageParam;
u8 TEMP3[0x128];
};
KSYS_CHECK_SIZE_NX150(ActorParam::Data, 0x1F0);
// vtable is still unknown
virtual void TEMP_VTABLE();
u64 TEMP; // Unknown number of fields(2+)
Data mData;
};
KSYS_CHECK_SIZE_NX150(ActorParam, 0x200);
// FIXME: incomplete
class ActorParamMgr {
SEAD_SINGLETON_DISPOSER(ActorParamMgr)

View File

@ -0,0 +1,37 @@
#pragma once
#include <basis/seadTypes.h>
#include <prim/seadSafeString.h>
#include "KingSystem/Utils/Types.h"
namespace ksys::act {
// FIXME: incomplete
class LifeRecoverInfo {
public:
void init(void* params);
// Modifies extra Hp1 and Damage. (Regen?)
bool onApplyDamage(s32& damage);
// Update flags and counter
void onApplyDamage_0();
void printLifeRecoverInfo(u32 life, sead::FormatFixedSafeString<128>** Output);
f32 mCounter;
f32 mField_4;
u8 gap_8[16]; // Is this really a gap?
u32 mExtraHp1;
u32 mExtraHp2;
u32 mMaxLife;
f32 mRecoverFactor;
s32 mField_28;
f32 mField_2C;
u8 mFlags;
u8 mUnknown[7]; // Flags might just be two u32
};
KSYS_CHECK_SIZE_NX150(LifeRecoverInfo, 0x38);
} // namespace ksys::act

View File

@ -1,5 +1,6 @@
add_subdirectory(ActorSystem)
add_subdirectory(Ecosystem)
add_subdirectory(Damage)
add_subdirectory(Framework)
add_subdirectory(GameData)
add_subdirectory(Map)

View File

@ -0,0 +1,8 @@
target_sources(uking PRIVATE
dmgDamageCallback.h
dmgDamageInfoManager.h
dmgDamageManagerBase.h
dmgDamageManagerBase.cpp
dmgStruct20.h
dmgStruct20.cpp
)

View File

@ -0,0 +1,23 @@
#pragma once
#include <basis/seadTypes.h>
#include "KingSystem/Damage/dmgDamageManagerBase.h"
namespace ksys::dmg {
class DamageManagerBase;
// FIXME: incomplete
class DamageCallback {
public:
virtual ~DamageCallback() {}
virtual void call(u32* a1, s32* a2, u32* a3, u32* a4, u32* a5, u64 a6);
DamageCallback* mPrev;
DamageCallback* mNext;
DamageManagerBase* mDamageManager; // Might be a different base class(Interface?)
u32 mEventId;
};
} // namespace ksys::dmg

View File

@ -0,0 +1,31 @@
#pragma once
#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include <container/seadSafeArray.h>
#include <heap/seadDisposer.h>
#include "KingSystem/Resource/resHandle.h"
namespace ksys::dmg {
// FIXME: incomplete
class DamageInfoMgr {
public:
SEAD_SINGLETON_DISPOSER(DamageInfoMgr);
public:
// FIXME: incomplete
class DamageItem {
public:
s32 mField_0; // unknown
sead::SafeArray<u8, 3> mCanTakeDamageFromType;
};
u8 TEMP1[0x5F8]; // Fields
res::Handle* mReactionTable; // 0x5D0
sead::Buffer<DamageItem> mDamagesArray; // 0x620
};
// KSYS_CHECK_SIZE_NX150(DamageInfoMgr, 0x12F0);
} // namespace ksys::dmg

View File

@ -0,0 +1,273 @@
#include "KingSystem/Damage/dmgDamageManagerBase.h"
#include "Game/DLC/aoc2.h"
#include "KingSystem/ActorSystem/actActor.h"
#include "KingSystem/ActorSystem/actActorConstDataAccess.h"
#include "KingSystem/ActorSystem/actActorParamMgr.h"
#include "KingSystem/ActorSystem/actLifeRecoveryInfo.h"
#include "KingSystem/Resource/GeneralParamList/resGParamListObjectGeneral.h"
#include "KingSystem/Resource/resResourceGParamList.h"
namespace ksys::dmg {
DamageManagerBase_UnknownBase1::DamageManagerBase_UnknownBase1(act::Actor* actor) : mActor(actor) {}
// Compiler seems to combine zero(0) writes to (0x0 ,0x8) and (0x10, 0x18)
// when writing the vtable and Actor.
// The original Compiler writes (0x8, 0x10) in one 'stp', and writes 0x0 and 0x18 individually with
// 'str'. The rest seems to fall out of sync due to that, but it's otherwise functionally the same.
// NON_MATCHING: Incorrect order.
DamageManagerBase::DamageManagerBase(act::Actor* actor) : DamageManagerBase_UnknownBase1(actor) {}
u32 DamageManagerBase::getDamage() {
u32 result;
if (canTakeDamage())
result = mDamage;
else
result = 0LL;
return result;
}
void DamageManagerBase::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 DamageManagerBase::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;
}
bool DamageManagerBase::applyDamage(s32& life) {
auto* param_list = mActor->mActorParam->mData.mGParamList;
const res::GParamListObjectGeneral& params = param_list->getGeneral();
if (params.mIsLifeInfinite.ref()) {
// Since life is infinite, we don't need to modify the damage or life.
// But we still call the "callback" as if damage was done.
onApplyDamage();
return false;
}
s32 damage = getDamage();
if (damage >= 1) {
if (isPlayerClass(mActor)) {
if (getAttacker()->hasProc()) {
tryBuffDamage(damage);
}
}
}
tryApplyDamageRecovery(damage);
// Actually deal damage
onApplyDamage();
f32 old_life = life;
life = std::max(0, life - damage);
bool did_damage = old_life != life;
return did_damage;
}
void DamageManagerBase::tryBuffDamage(s32& damage) {
if (!uking::aoc2::instance()) {
return;
}
if (!uking::aoc2::instance()->checkFlag2(uking::aoc2::Flags2::EnableHardMode)) {
return;
}
if (!uking::aoc2::instance()->checkFlag1(uking::aoc2::Flags1::ApplyDamageMultiplier)) {
return;
}
act::ActorConstDataAccess acc;
act::acquireActor(getAttacker(), &acc);
if (uking::aoc2::shouldApplyMasterModeDamageMultiplier(acc)) {
uking::aoc2::buffDamage(damage);
}
}
void DamageManagerBase::tryApplyDamageRecovery(s32& damage) {
if (!uking::aoc2::instance()) {
return;
}
if (!uking::aoc2::instance()->checkFlag2(uking::aoc2::Flags2::EnableHardMode)) {
return;
}
if (!uking::aoc2::instance()->checkFlag1(uking::aoc2::Flags1::EnableLifeRegen)) {
return;
}
if (!mActor->getLifeRecoverInfo()) {
return;
}
// Take damage from extra HP1, and modify damage.
// Returns true if damage remains? No more regen?
act::LifeRecoverInfo* life_recovery_info = mActor->getLifeRecoverInfo();
if (life_recovery_info->onApplyDamage(damage)) {
// Update flags and counter.
life_recovery_info->onApplyDamage_0();
}
}
s32 DamageManagerBase::getNumCallbacks() {
// More like number of supported event types, than number of callbacks.
// These seem to return a fixed number for each different DamageManager class.
return 0;
}
bool DamageManagerBase::initCallbacks(sead::Heap*) {
// Does nothing in the Base class, and doesn't seem like any of the known classes actually
// override this yet.
return true;
}
bool DamageManagerBase::allocStruct20(sead::Heap* heap) {
mStruct20_a = new (heap) Struct20;
if (!mStruct20_a) {
return false;
}
mStruct20_b = new (heap) Struct20;
return mStruct20_b != nullptr;
}
void DamageManagerBase::preDelete1() {
if (mStruct20_a) {
delete mStruct20_a;
mStruct20_a = nullptr;
}
if (mStruct20_b) {
delete mStruct20_b;
mStruct20_b = nullptr;
}
}
bool DamageManagerBase::canTakeDamage() {
u32 damageTypeMaybe = m49(getField50());
if (!DamageInfoMgr::instance()) {
return false;
}
s32 idx = mDamageReactionTableStuff;
if (idx < 0) {
return false;
}
if (!DamageInfoMgr::instance()->mDamagesArray.isBufferReady()) {
return false;
}
DamageInfoMgr::DamageItem& item = DamageInfoMgr::instance()->mDamagesArray[idx];
return item.mCanTakeDamageFromType[damageTypeMaybe] & 0x1;
}
void DamageManagerBase::handleDamageForPlayer(u32* a2, u32* a3, u32* a4, u32* a5, u32* a6) {
Struct20* currentStruct = sead::DynamicCast<Struct20>(mStruct20_b);
if (!currentStruct) {
return;
}
*a2 = currentStruct->mField_8;
*a3 = currentStruct->mField_C;
*a5 = currentStruct->mField_14;
*a6 = currentStruct->mField_18;
*a4 = currentStruct->mField_10;
}
bool DamageManagerBase::addDamage(s64, s32 damage, s32 df48, s32 minDmg, s32 f50, s32 f54,
s32 f40) {
mDamage += damage;
mField_48 += df48;
mMinDmg += minDmg;
if (mField_54 >= f54) {
return false;
}
mField_50 = f50;
mField_54 = f54;
mField_40 = f40;
return true;
}
s32 DamageManagerBase::m49(s32 damageTypeMaybe) {
if (damageTypeMaybe == 3) {
return 2;
}
return 0;
}
} // namespace ksys::dmg

View File

@ -0,0 +1,145 @@
#pragma once
#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include <heap/seadExpHeap.h>
#include <prim/seadRuntimeTypeInfo.h>
#include "KingSystem/ActorSystem/actBaseProcLink.h"
#include "KingSystem/Damage/dmgDamageCallback.h"
#include "KingSystem/Damage/dmgDamageInfoManager.h"
#include "KingSystem/Damage/dmgStruct20.h"
namespace ksys::act {
class Actor;
class ActorParam;
} // namespace ksys::act
namespace ksys::dmg {
// FIXME: Unknown base. This base seems to handle callbacks and messaging, so maybe a shared base?
class DamageManagerBase_UnknownBase1 {
public:
DamageManagerBase_UnknownBase1(act::Actor* WeaponActor);
virtual ~DamageManagerBase_UnknownBase1() {}
// Sturct20 for Damage receive/send?
Struct20Base* mStruct20_a = nullptr;
Struct20Base* mStruct20_b = nullptr;
ksys::act::Actor* mActor = nullptr;
sead::Buffer<DamageCallback*> mCallbacks{};
// Callback status flags?
s32 mField_30 = 0;
s8 mField_34 = 0;
};
// FIXME: Unknown base 2. Helper functions maybe? Might also contain some of the fields from
// DamageManagerBase.
class DamageManagerBase_UnknownBase2 {
public:
virtual ~DamageManagerBase_UnknownBase2() = default;
};
class DamageManagerBase : public DamageManagerBase_UnknownBase1,
public DamageManagerBase_UnknownBase2 {
public:
DamageManagerBase(act::Actor* actor);
virtual ~DamageManagerBase() = default;
SEAD_RTTI_BASE(DamageManagerBase)
virtual u32 getDamage();
virtual s32 getField48() { return mField_48; }
virtual s32 getMinDmg() { return mMinDmg; }
virtual s32 getField50() { return mField_50; }
virtual s32 getField54() { return mField_54; }
virtual bool checkDamageFlags() { return false; }
virtual s32 getFlags2() { return mFlags2; }
virtual void addDamageCallback(s32 eventId, DamageCallback* callback);
virtual void removeDamageCallback(DamageCallback* callback);
virtual f32 m13() { return 0.0f; }
virtual bool m14() { return false; }
virtual bool applyDamage(s32& life);
virtual bool m16() { return false; }
virtual void m17() {}
virtual s32 getNumCallbacks();
virtual bool initCallbacks(sead::Heap* heap);
// m20 (FIXME: incomplete)
virtual void resetDamage();
virtual void preDelete2() {}
virtual void m22() {}
virtual bool allocStruct20(sead::Heap* heap);
virtual void preDelete1();
virtual s64 m25() { return 0; }
virtual s64 m26() { return 0; }
virtual s32 getPosition() { return 0; }
virtual s32 m28() { return 0; }
//(FIXME: incomplete)
virtual s64 m29(s64 a2);
// qword pointer? (FIXME: incomplete)
virtual s64 m30(u64 a2);
virtual s32 m31() { return 0; }
virtual s32 m32() { return 0; }
virtual s64 m33() { return 0; }
virtual s64 tgSensorMaterialOnHitMaybe() { return 0; }
virtual s32 m35() { return 0; }
// FIXME: incomplete. Return dummy Base Proc Link
virtual ksys::act::BaseProcLink* getAttacker();
// FIXME: incomplete. Same as getAttacker, but return different Actor ProcLink I assume.
virtual s64 m37();
virtual s32 m38() { return 0; }
// FIXME: Incomplete. Call isSlowTimeMaybe
virtual bool isSlowTime();
virtual s32 m40() { return 0; }
virtual s32 m41() { return 0; }
virtual s32 m42() { return 0; }
virtual void m43() {}
virtual bool canTakeDamage();
virtual void m45() {}
virtual void handleDamageForPlayer(u32* a2, u32* a3, u32* a4, u32* a5, u32* a6);
virtual bool addDamage(s64 a2, s32 damage, s32 df48, s32 minDmg, s32 f50, s32 f54, s32 f40);
virtual void onApplyDamage() {}
// Something depending on damage type?
virtual s32 m49(s32 damageTypeMaybe);
void clearCallbacks();
void resetStuff();
void callDamageCallbacks(u32 a2, u32* a3, s32* a4, u32* a5, u32* a6, u32* a7, u64 a8);
s64 calcMaybe();
inline void tryBuffDamage(s32& damage);
inline void tryApplyDamageRecovery(s32& damage);
private:
s32 mField_40 = 0;
s32 mDamage = 0;
s32 mField_48 = 0;
s32 mMinDmg = 0;
s32 mField_50 = -1;
s32 mField_54 = -1;
s32 mFlags2 = 0;
s32 mDamageType = 0;
s32 mDamageReactionTableStuff = -1;
u8 mField_64 = 0;
bool mIsOwnedByPlayer;
};
KSYS_CHECK_SIZE_NX150(DamageManagerBase, 0x68);
// FIXME: Move into static helper class?
bool isPlayerClass(ksys::act::Actor* Actor);
} // namespace ksys::dmg

View File

@ -0,0 +1,53 @@
#include "KingSystem/Damage/dmgStruct20.h"
namespace ksys::dmg {
void Struct20::reset() {
mField_8 = 0;
mField_C = 0;
mField_10 = 0;
mField_14 = -1;
mField_18 = -1;
}
void Struct20::combineMaybe(Struct20Base* other) {
Struct20* otherStruct = sead::DynamicCast<Struct20>(other);
if (!otherStruct) {
return;
}
mField_8 += otherStruct->mField_8;
mField_C += otherStruct->mField_C;
mField_10 += otherStruct->mField_10;
if (mField_18 < otherStruct->mField_18) {
mField_14 = otherStruct->mField_14;
mField_18 = otherStruct->mField_18;
}
}
void Struct20_2::reset() {
mField_1C = 0;
mField_30 = false;
Struct20::reset();
}
void Struct20_2::combineMaybe(Struct20Base* other) {
Struct20_2* otherStruct = sead::DynamicCast<Struct20_2>(other);
if (!otherStruct) {
Struct20::combineMaybe(other);
return;
}
mField_1C |= otherStruct->mField_1C;
Struct20::combineMaybe(other);
if (mField_18 == otherStruct->mField_18 && otherStruct->mField_30) {
mField_30 = true;
mField_20 = otherStruct->mField_20;
mField_24 = otherStruct->mField_24;
mField_28 = otherStruct->mField_28;
mField_2C = otherStruct->mField_2C;
}
}
} // namespace ksys::dmg

View File

@ -0,0 +1,64 @@
#pragma once
#include <basis/seadTypes.h>
#include <prim/seadRuntimeTypeInfo.h>
#include "KingSystem/Utils/Types.h"
namespace ksys::dmg {
// What exactly Struct20 is, isn't known yet.
// It is used by the Damage Managers, especially DamageManager and up, not so much in
// DamageManagerBase. It contains flags and values which seems to be returned and modified when
// handling damage.
// TODO: Figure out exactly what Struct20 does and rename struct + variables to fit.
class Struct20Base {
SEAD_RTTI_BASE(Struct20Base)
public:
virtual ~Struct20Base(){};
virtual void reset();
virtual void combineMaybe(Struct20Base* other);
};
class Struct20 : public Struct20Base {
SEAD_RTTI_OVERRIDE(Struct20, Struct20Base)
public:
~Struct20() override { ; }
void reset() override;
__attribute__((noinline)) virtual void combineMaybe(Struct20Base* other) override;
// Unknown which fields belong in Struct20 vs Struct20Base
u32 mField_8 = 0;
u32 mField_C = 0;
s32 mField_10 = 0;
s32 mField_14 = -1;
s32 mField_18 = -1;
u32 mField_1C; // Flag of some kind
};
KSYS_CHECK_SIZE_NX150(Struct20, 0x20);
class Struct20_2 : public Struct20 {
SEAD_RTTI_OVERRIDE(Struct20_2, Struct20)
public:
~Struct20_2() override { ; }
void reset() override;
void combineMaybe(Struct20Base* other) override;
f32 mField_20;
f32 mField_24;
f32 mField_28;
f32 mField_2C;
bool mField_30;
};
KSYS_CHECK_SIZE_NX150(Struct20_2, 0x38);
} // namespace ksys::dmg