ksys/act: split IDamageManager out of DamageManagerBase

DamageManagerBase's root base class (previously
DamageManagerBase_UnknownBase1) holds the damage callback list, and its
code is linked among the ActorSystem objects rather than with the
Game/Actor/Damage files. It appears to be an engine-side abstract base,
so let's move it to KingSystem/ActorSystem as ksys::act::IDamageManager
(unofficial name, following the ksys IManager/Manager pattern and
Actor::getDamageMgr), together with DamageCallback and Struct20Base, and
have Actor::getDamageMgr return it. DamageManagerBase now overrides its
getters and inherits addDamageCallback/removeDamageCallback from it.

The rest of the damage code stays in Game/Actor/Damage but is regrouped
to match link order: Struct20::combineMaybe moves into
actDamageManagerBase.cpp, Struct20::reset becomes inline and
dmgStruct20.cpp becomes actDamageMgr.cpp. The uking::dmg namespace is
merged into uking::act, so the files there take the act prefix too, and
dmgInfoManager becomes actDamageInfoMgr after the class it holds.

(AI assisted using Claude Fable 5.1 and Claude Opus 5.5)
This commit is contained in:
Léo Lam
2026-09-28 03:39:31 +02:00
parent bdf141cf2d
commit 419f8f46bb
15 changed files with 315 additions and 304 deletions
+72 -72
View File
@@ -213,33 +213,33 @@ Address,Quality,Size,Name
0x0000007100003f48,U,000164,DamageMgrBow::m54
0x0000007100003fec,U,000132,DamageMgrBow::m0
0x0000007100004070,U,000092,DamageMgrBow::m1
0x00000071000040cc,O,000004,_ZN5uking3dmg17DamageManagerBaseD2Ev
0x00000071000040cc,O,000004,_ZN5uking3act17DamageManagerBaseD2Ev
0x00000071000040d0,U,000004,j__ZdlPv_0
0x00000071000040d4,O,000008,_ZN5uking3dmg17DamageManagerBase10getField48Ev
0x00000071000040dc,O,000008,_ZN5uking3dmg17DamageManagerBase9getMinDmgEv
0x00000071000040e4,O,000008,_ZN5uking3dmg17DamageManagerBase10getField50Ev
0x00000071000040ec,O,000008,_ZN5uking3dmg17DamageManagerBase16checkDamageFlagsEv
0x00000071000040f4,O,000008,_ZN5uking3dmg17DamageManagerBase9getFlags2Ev
0x00000071000040fc,O,000008,_ZN5uking3dmg17DamageManagerBase3m13Ev
0x0000007100004104,O,000008,_ZN5uking3dmg17DamageManagerBase3m14Ev
0x000000710000410c,O,000008,_ZN5uking3dmg17DamageManagerBase3m16Ev
0x0000007100004114,O,000004,_ZN5uking3dmg17DamageManagerBase28accumulateStasisBlowVelocityEv
0x00000071000040d4,O,000008,_ZN5uking3act17DamageManagerBase10getField48Ev
0x00000071000040dc,O,000008,_ZN5uking3act17DamageManagerBase9getMinDmgEv
0x00000071000040e4,O,000008,_ZN5uking3act17DamageManagerBase10getField50Ev
0x00000071000040ec,O,000008,_ZN5uking3act17DamageManagerBase16checkDamageFlagsEv
0x00000071000040f4,O,000008,_ZN5uking3act17DamageManagerBase9getFlags2Ev
0x00000071000040fc,O,000008,_ZN5uking3act17DamageManagerBase3m13Ev
0x0000007100004104,O,000008,_ZN5uking3act17DamageManagerBase21getStasisBlowVelocityEPN4sead7Vector3IfEE
0x000000710000410c,O,000008,_ZN5uking3act17DamageManagerBase3m16Ev
0x0000007100004114,O,000004,_ZN5uking3act17DamageManagerBase28accumulateStasisBlowVelocityEv
0x0000007100004118,U,000008,DamageMgrBow::m18
0x0000007100004120,O,000008,_ZN5uking3dmg17DamageManagerBase13initCallbacksEPN4sead4HeapE
0x0000007100004128,O,000004,_ZN5uking3dmg17DamageManagerBase10preDelete2Ev
0x000000710000412c,O,000008,_ZN5uking3dmg17DamageManagerBase3m25Ev
0x0000007100004134,O,000008,_ZN5uking3dmg17DamageManagerBase3m26Ev
0x000000710000413c,O,000008,_ZN5uking3dmg17DamageManagerBase3m31Ev
0x0000007100004144,O,000008,_ZN5uking3dmg17DamageManagerBase3m32Ev
0x000000710000414c,O,000008,_ZN5uking3dmg17DamageManagerBase26tgSensorMaterialOnHitMaybeEv
0x0000007100004154,O,000008,_ZN5uking3dmg17DamageManagerBase3m35Ev
0x000000710000415c,O,000008,_ZN5uking3dmg17DamageManagerBase3m38Ev
0x0000007100004164,O,000008,_ZN5uking3dmg17DamageManagerBase3m40Ev
0x000000710000416c,O,000008,_ZN5uking3dmg17DamageManagerBase3m41Ev
0x0000007100004174,O,000008,_ZN5uking3dmg17DamageManagerBase3m42Ev
0x000000710000417c,O,000004,_ZN5uking3dmg17DamageManagerBase3m43Ev
0x0000007100004120,O,000008,_ZN5uking3act17DamageManagerBase13initCallbacksEPN4sead4HeapE
0x0000007100004128,O,000004,_ZN5uking3act17DamageManagerBase10preDelete2Ev
0x000000710000412c,O,000008,_ZN5uking3act17DamageManagerBase3m25Ev
0x0000007100004134,O,000008,_ZN5uking3act17DamageManagerBase3m26Ev
0x000000710000413c,O,000008,_ZN5uking3act17DamageManagerBase3m31Ev
0x0000007100004144,O,000008,_ZN5uking3act17DamageManagerBase3m32Ev
0x000000710000414c,O,000008,_ZN5uking3act17DamageManagerBase26tgSensorMaterialOnHitMaybeEv
0x0000007100004154,O,000008,_ZN5uking3act17DamageManagerBase3m35Ev
0x000000710000415c,O,000008,_ZN5uking3act17DamageManagerBase3m38Ev
0x0000007100004164,O,000008,_ZN5uking3act17DamageManagerBase3m40Ev
0x000000710000416c,O,000008,_ZN5uking3act17DamageManagerBase3m41Ev
0x0000007100004174,O,000008,_ZN5uking3act17DamageManagerBase3m42Ev
0x000000710000417c,O,000004,_ZN5uking3act17DamageManagerBase3m43Ev
0x0000007100004180,U,000008,DamageMgr::m44
0x0000007100004188,O,000004,_ZN5uking3dmg17DamageManagerBase13onApplyDamageEv
0x0000007100004188,O,000004,_ZN5uking3act17DamageManagerBase13onApplyDamageEv
0x000000710000418c,U,000008,DamageMgrBow::m51
0x0000007100004194,U,000008,DamageMgrBow::m52
0x000000710000419c,U,000008,DamageMgrBow::m53
@@ -249,7 +249,7 @@ Address,Quality,Size,Name
0x0000007100004324,U,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_13ControlDeviceEE9isDerivedEPKNS0_9InterfaceE
0x00000071000043b0,U,000140,
0x000000710000443c,U,000140,
0x00000071000044c8,U,000140,
0x00000071000044c8,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys3act14IDamageManagerEE9isDerivedEPKNS0_9InterfaceE
0x0000007100004554,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_18LogicalFrameBufferEE9isDerivedEPKNS0_9InterfaceE
0x00000071000045e0,U,000344,Bullet::construct
0x0000007100004738,U,000196,Bullet::m31
@@ -643,11 +643,11 @@ Address,Quality,Size,Name
0x000000710001bd9c,U,000288,DamageMgrWeapon::rtti1
0x000000710001bebc,U,000092,
0x000000710001bf18,U,000004,j__ZdlPv_12
0x000000710001bf1c,O,000008,_ZN5uking3dmg17DamageManagerBase15getNumCallbacksEv
0x000000710001bf24,O,000004,_ZN5uking3dmg17DamageManagerBase3m22Ev
0x000000710001bf28,O,000008,_ZN5uking3dmg17DamageManagerBase11getPositionEv
0x000000710001bf30,O,000008,_ZN5uking3dmg17DamageManagerBase3m28Ev
0x000000710001bf38,O,000008,_ZN5uking3dmg17DamageManagerBase3m33Ev
0x000000710001bf1c,O,000008,_ZN5uking3act17DamageManagerBase15getNumCallbacksEv
0x000000710001bf24,O,000004,_ZN5uking3act17DamageManagerBase3m22Ev
0x000000710001bf28,O,000008,_ZN5uking3act17DamageManagerBase11getPositionEv
0x000000710001bf30,O,000008,_ZN5uking3act17DamageManagerBase3m28Ev
0x000000710001bf38,O,000008,_ZN5uking3act17DamageManagerBase3m33Ev
0x000000710001bf40,U,000004,nullsub_55
0x000000710001bf44,U,000008,
0x000000710001bf4c,U,000008,DamageMgrWeapon::m52
@@ -40357,9 +40357,9 @@ Address,Quality,Size,Name
0x0000007100670fe4,U,000960,IceBlockMgr::x_0
0x00000071006713a4,U,000656,IceBlockMgr::x_1
0x0000007100671634,U,000008,IceBlockMgr::x_2
0x000000710067163c,O,000100,_ZN5uking3dmg13DamageInfoMgr18SingletonDisposer_D1Ev
0x00000071006716a0,O,000108,_ZN5uking3dmg13DamageInfoMgr18SingletonDisposer_D0Ev
0x000000710067170c,O,000136,_ZN5uking3dmg13DamageInfoMgr14createInstanceEPN4sead4HeapE
0x000000710067163c,O,000100,_ZN5uking3act13DamageInfoMgr18SingletonDisposer_D1Ev
0x00000071006716a0,O,000108,_ZN5uking3act13DamageInfoMgr18SingletonDisposer_D0Ev
0x000000710067170c,O,000136,_ZN5uking3act13DamageInfoMgr14createInstanceEPN4sead4HeapE
0x0000007100671794,U,000684,
0x0000007100671a40,U,000036,
0x0000007100671a64,U,000016,
@@ -40391,7 +40391,7 @@ Address,Quality,Size,Name
0x0000007100673444,U,000492,
0x0000007100673630,U,000184,
0x00000071006736e8,U,000268,
0x00000071006737f4,U,000732,_ZN5uking3dmg13DamageInfoMgrC1Ev
0x00000071006737f4,U,000732,_ZN5uking3act13DamageInfoMgrC1Ev
0x0000007100673ad0,U,000268,
0x0000007100673bdc,U,000396,
0x0000007100673d68,U,000036,
@@ -40407,7 +40407,7 @@ Address,Quality,Size,Name
0x000000710067446c,U,000664,
0x0000007100674704,U,000044,
0x0000007100674730,U,000044,
0x000000710067475c,O,000008,_ZN5uking3dmg13DamageInfoMgr26enableBoomerangRemoteBombsEv
0x000000710067475c,O,000008,_ZN5uking3act13DamageInfoMgr26enableBoomerangRemoteBombsEv
0x0000007100674764,U,000008,
0x000000710067476c,U,000008,
0x0000007100674774,U,000008,
@@ -40415,11 +40415,11 @@ Address,Quality,Size,Name
0x0000007100674788,U,000008,
0x0000007100674790,U,000012,
0x000000710067479c,U,000008,
0x00000071006747a4,O,000048,_ZN5uking3dmg13DamageInfoMgr22getShieldRideBaseFrameEv
0x00000071006747d4,O,000048,_ZN5uking3dmg13DamageInfoMgr26getShieldRideHitBaseDamageEv
0x00000071006747a4,O,000048,_ZN5uking3act13DamageInfoMgr22getShieldRideBaseFrameEv
0x00000071006747d4,O,000048,_ZN5uking3act13DamageInfoMgr26getShieldRideHitBaseDamageEv
0x0000007100674804,U,000008,get10
0x000000710067480c,O,000036,_ZN5uking3dmg13DamageInfoMgr22getCriticalAttackRatioEv
0x0000007100674830,O,000612,_ZNK5uking3dmg13DamageInfoMgr21isTrueFormMasterSwordEv
0x000000710067480c,O,000036,_ZN5uking3act13DamageInfoMgr22getCriticalAttackRatioEv
0x0000007100674830,O,000612,_ZNK5uking3act13DamageInfoMgr21isTrueFormMasterSwordEv
0x0000007100674a94,U,000156,
0x0000007100674b30,U,000144,
0x0000007100674bc0,U,000100,
@@ -45188,14 +45188,14 @@ Address,Quality,Size,Name
0x00000071006d8520,U,000020,DamageMgr::m49
0x00000071006d8534,U,000024,
0x00000071006d854c,U,000028,DamageMgr::m13
0x00000071006d8568,U,000064,DamageMgr::m14
0x00000071006d8568,U,000064,DamageMgr::getStasisBlowVelocity
0x00000071006d85a8,U,000740,uking::act::DamageMgr::applyRequestedDamage
0x00000071006d888c,U,000456,
0x00000071006d8a54,U,000400,DamageMgr::m54
0x00000071006d8be4,U,000516,DamageMgr::m55
0x00000071006d8de8,U,000148,
0x00000071006d8e7c,U,000068,
0x00000071006d8ec0,O,000244,_ZN5uking3dmg10Struct20_212combineMaybeEPNS0_12Struct20BaseE
0x00000071006d8ec0,O,000244,_ZN5uking3act10Struct20_212combineMaybeEPN4ksys3act12Struct20BaseE
0x00000071006d8fb4,U,000288,DamageMgr::rtti0
0x00000071006d90d4,U,000092,DamageMgr::rtti2
0x00000071006d9130,U,000212,DamageMgr::m2
@@ -45207,10 +45207,10 @@ Address,Quality,Size,Name
0x00000071006d9310,U,000008,DamageMgr::m53
0x00000071006d9318,U,000212,
0x00000071006d93ec,U,000224,
0x00000071006d94cc,O,000288,_ZNK5uking3dmg10Struct20_227checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071006d95ec,O,000092,_ZNK5uking3dmg10Struct20_218getRuntimeTypeInfoEv
0x00000071006d9648,O,000004,_ZN5uking3dmg10Struct20_2D0Ev
0x00000071006d964c,O,000024,_ZN5uking3dmg10Struct20_25resetEv
0x00000071006d94cc,O,000288,_ZNK5uking3act10Struct20_227checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071006d95ec,O,000092,_ZNK5uking3act10Struct20_218getRuntimeTypeInfoEv
0x00000071006d9648,O,000004,_ZN5uking3act10Struct20_2D0Ev
0x00000071006d964c,O,000024,_ZN5uking3act10Struct20_25resetEv
0x00000071006d9664,U,000004,j__ZdlPv_293
0x00000071006d9668,U,000008,
0x00000071006d9670,U,000004,j__ZdlPv_294
@@ -45219,12 +45219,12 @@ Address,Quality,Size,Name
0x00000071006d9748,U,000092,
0x00000071006d97a4,U,000112,
0x00000071006d9814,U,000092,
0x00000071006d9870,O,000020,_ZN5uking3dmg8Struct20D2Ev
0x00000071006d9870,O,000020,_ZN5uking3act8Struct20D2Ev
0x00000071006d9884,U,000004,j__ZdlPv_295
0x00000071006d9888,U,000004,nullsub_2287
0x00000071006d988c,U,000004,nullsub_2288
0x00000071006d9890,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN5uking3dmg8Struct20EE9isDerivedEPKNS0_9InterfaceE
0x00000071006d991c,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN5uking3dmg12Struct20BaseEE9isDerivedEPKNS0_9InterfaceE
0x00000071006d9890,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN5uking3act8Struct20EE9isDerivedEPKNS0_9InterfaceE
0x00000071006d991c,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys3act12Struct20BaseEE9isDerivedEPKNS0_9InterfaceE
0x00000071006d99a8,U,000076,
0x00000071006d99f4,U,000048,
0x00000071006d9a24,U,000268,
@@ -45359,21 +45359,21 @@ Address,Quality,Size,Name
0x00000071006dfcb0,U,000004,nullsub_2297
0x00000071006dfcb4,U,000004,nullsub_2298
0x00000071006dfcb8,U,000004,nullsub_2299
0x00000071006dfcbc,O,000132,_ZN5uking3dmg17DamageManagerBase13allocStruct20EPN4sead4HeapE
0x00000071006dfd40,O,000076,_ZN5uking3dmg17DamageManagerBase10preDelete1Ev
0x00000071006dfd8c,m,000076,_ZN5uking3dmg17DamageManagerBaseC1EPN4ksys3act5ActorE
0x00000071006dfcbc,O,000132,_ZN5uking3act17DamageManagerBase13allocStruct20EPN4sead4HeapE
0x00000071006dfd40,O,000076,_ZN5uking3act17DamageManagerBase10preDelete1Ev
0x00000071006dfd8c,m,000076,_ZN5uking3act17DamageManagerBaseC1EPN4ksys3act5ActorE
0x00000071006dfdd8,U,000096,DamageMgrBase::m20
0x00000071006dfe38,U,000020,DamageMgrBase::resetStuff
0x00000071006dfe4c,O,000500,_ZN5uking3dmg17DamageManagerBase11applyDamageERi
0x00000071006e0040,O,000204,_ZN5uking3dmg17DamageManagerBase21handleDamageForPlayerEPjS2_S2_S2_S2_
0x00000071006e010c,O,000072,_ZN5uking3dmg17DamageManagerBase9addDamageEliiiiii
0x00000071006e0154,U,000004,_ZN5uking3dmg17DamageManagerBase10isSlowTimeEv
0x00000071006dfe4c,O,000500,_ZN5uking3act17DamageManagerBase11applyDamageERi
0x00000071006e0040,O,000204,_ZN5uking3act17DamageManagerBase21handleDamageForPlayerEPjS2_S2_S2_S2_
0x00000071006e010c,O,000072,_ZN5uking3act17DamageManagerBase9addDamageEliiiiii
0x00000071006e0154,U,000004,_ZN5uking3act17DamageManagerBase10isSlowTimeEv
0x00000071006e0158,U,000324,DamageMgrBase::m29
0x00000071006e029c,U,002296,DamageMgrBase::m30
0x00000071006e0b94,O,000056,_ZN5uking3dmg17DamageManagerBase9getDamageEv
0x00000071006e0bcc,O,000008,_ZN5uking3dmg17DamageManagerBase10getField54Ev
0x00000071006e0b94,O,000056,_ZN5uking3act17DamageManagerBase9getDamageEv
0x00000071006e0bcc,O,000008,_ZN5uking3act17DamageManagerBase10getField54Ev
0x00000071006e0bd4,U,000100,
0x00000071006e0c38,O,000136,_ZN5uking3dmg17DamageManagerBase13canTakeDamageEv
0x00000071006e0c38,O,000136,_ZN5uking3act17DamageManagerBase13canTakeDamageEv
0x00000071006e0cc0,U,000100,
0x00000071006e0d24,U,000196,
0x00000071006e0de8,U,000144,
@@ -45383,21 +45383,21 @@ Address,Quality,Size,Name
0x00000071006e1050,U,000128,
0x00000071006e10d0,U,000292,
0x00000071006e11f4,U,000128,
0x00000071006e1274,O,000004,_ZN5uking3dmg17DamageManagerBase20applyRequestedDamageEv
0x00000071006e1278,O,000016,_ZN5uking3dmg17DamageManagerBase3m49Ei
0x00000071006e1274,O,000004,_ZN5uking3act17DamageManagerBase20applyRequestedDamageEv
0x00000071006e1278,O,000016,_ZN5uking3act17DamageManagerBase3m49Ei
0x00000071006e1288,U,000028,DamageMgr::getActorDamageParam
0x00000071006e12a4,O,000208,_ZN5uking3dmg8Struct2012combineMaybeEPNS0_12Struct20BaseE
0x00000071006e12a4,O,000208,_ZN5uking3act8Struct2012combineMaybeEPN4ksys3act12Struct20BaseE
0x00000071006e1374,U,000020,DamageMgrBase::m36
0x00000071006e1388,U,000020,DamageMgrBase::m37
0x00000071006e139c,U,000204,DamageMgrBase::rtti1
0x00000071006e1468,U,000092,DamageMgrBase::rtti2
0x00000071006e14c4,O,000004,_ZN5uking3dmg17DamageManagerBaseD0Ev
0x00000071006e14c8,O,000004,_ZThn56_N5uking3dmg17DamageManagerBaseD1Ev
0x00000071006e14cc,O,000008,_ZThn56_N5uking3dmg17DamageManagerBaseD0Ev
0x00000071006e14d4,O,000204,_ZNK5uking3dmg8Struct2027checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071006e15a0,O,000092,_ZNK5uking3dmg8Struct2018getRuntimeTypeInfoEv
0x00000071006e15fc,O,000004,_ZN5uking3dmg8Struct20D0Ev
0x00000071006e1600,O,000020,_ZN5uking3dmg8Struct205resetEv
0x00000071006e139c,U,000204,uking::act::DamageManagerBase::checkDerivedRuntimeTypeInfo
0x00000071006e1468,U,000092,uking::act::DamageManagerBase::getRuntimeTypeInfo
0x00000071006e14c4,O,000004,_ZN5uking3act17DamageManagerBaseD0Ev
0x00000071006e14c8,O,000004,_ZThn56_N5uking3act17DamageManagerBaseD1Ev
0x00000071006e14cc,O,000008,_ZThn56_N5uking3act17DamageManagerBaseD0Ev
0x00000071006e14d4,O,000204,_ZNK5uking3act8Struct2027checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071006e15a0,O,000092,_ZNK5uking3act8Struct2018getRuntimeTypeInfoEv
0x00000071006e15fc,O,000004,_ZN5uking3act8Struct20D0Ev
0x00000071006e1600,O,000020,_ZN5uking3act8Struct205resetEv
0x00000071006e1614,U,000112,
0x00000071006e1684,U,000120,
0x00000071006e16fc,U,000084,Player::RideInfo::x
@@ -73715,8 +73715,8 @@ Address,Quality,Size,Name
0x0000007100d2d370,U,000180,DamageMgrBase::calcMaybe
0x0000007100d2d424,U,000160,
0x0000007100d2d4c4,U,000152,DamageMgrBase::callDamageCallbacks
0x0000007100d2d55c,O,000080,_ZN5uking3dmg17DamageManagerBase17addDamageCallbackEiPNS0_14DamageCallbackE
0x0000007100d2d5ac,O,000220,_ZN5uking3dmg17DamageManagerBase20removeDamageCallbackEPNS0_14DamageCallbackE
0x0000007100d2d55c,O,000080,_ZN4ksys3act14IDamageManager17addDamageCallbackEiPNS0_14DamageCallbackE
0x0000007100d2d5ac,O,000220,_ZN4ksys3act14IDamageManager20removeDamageCallbackEPNS0_14DamageCallbackE
0x0000007100d2d688,O,000020,_ZN4ksys3act22getSystemIsGetItemSelfEPNS0_8InfoDataEPKc
0x0000007100d2d69c,O,000020,_ZN4ksys3act22getSystemIsGetItemSelfERKN2al9ByamlIterE
0x0000007100d2d6b0,O,000020,_ZN4ksys3act14getGeneralLifeEPNS0_8InfoDataEPKc
Can't render this file because it is too large.
+6 -7
View File
@@ -1,9 +1,8 @@
target_sources(uking PRIVATE
dmgDamageCallback.h
dmgDamageManagerBase.h
dmgDamageManagerBase.cpp
dmgInfoManager.cpp
dmgInfoManager.h
dmgStruct20.h
dmgStruct20.cpp
actDamageInfoMgr.cpp
actDamageInfoMgr.h
actDamageManagerBase.cpp
actDamageManagerBase.h
actDamageMgr.cpp
actStruct20.h
)
@@ -1,10 +1,10 @@
#include "Game/Actor/Damage/dmgInfoManager.h"
#include "Game/Actor/Damage/actDamageInfoMgr.h"
#include "Game/Scene/gameScene.h"
#include "KingSystem/ActorSystem/actGlobalParameter.h"
#include "KingSystem/GameData/gdtCommonFlagsUtils.h"
#include "KingSystem/Resource/GeneralParamList/resGParamListObjectGlobal.h"
namespace uking::dmg {
namespace uking::act {
SEAD_SINGLETON_DISPOSER_IMPL(DamageInfoMgr)
@@ -66,4 +66,4 @@ bool DamageInfoMgr::isTrueFormMasterSword() const {
return mMasterSwordDetectedEvil;
}
} // namespace uking::dmg
} // namespace uking::act
@@ -8,7 +8,7 @@
#include "KingSystem/ActorSystem/actBaseProcLink.h"
#include "KingSystem/Resource/resHandle.h"
namespace uking::dmg {
namespace uking::act {
// FIXME: incomplete
class DamageInfoMgr {
@@ -59,4 +59,4 @@ private:
};
KSYS_CHECK_SIZE_NX150(DamageInfoMgr, 0x12F0);
} // namespace uking::dmg
} // namespace uking::act
@@ -1,6 +1,5 @@
#include "Game/Actor/Damage/dmgDamageManagerBase.h"
#include "Game/Actor/Damage/actDamageManagerBase.h"
#include "Game/AOC/aocHardModeManager.h"
#include "Game/Actor/Damage/dmgDamageCallback.h"
#include "KingSystem/ActorSystem/actActor.h"
#include "KingSystem/ActorSystem/actActorLinkConstDataAccess.h"
#include "KingSystem/ActorSystem/actActorParam.h"
@@ -9,18 +8,14 @@
#include "KingSystem/Resource/Actor/resResourceGParamList.h"
#include "KingSystem/Resource/GeneralParamList/resGParamListObjectGeneral.h"
namespace uking::dmg {
DamageManagerBase_UnknownBase1::DamageManagerBase_UnknownBase1(ksys::act::Actor* actor)
: mActor(actor) {}
namespace uking::act {
// 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(ksys::act::Actor* actor)
: DamageManagerBase_UnknownBase1(actor) {}
DamageManagerBase::DamageManagerBase(ksys::act::Actor* actor) : IDamageManager(actor) {}
u32 DamageManagerBase::getDamage() {
u32 result;
@@ -32,81 +27,6 @@ u32 DamageManagerBase::getDamage() {
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->getParam()->getRes().mGParamList;
@@ -276,4 +196,19 @@ s32 DamageManagerBase::m49(s32 damageTypeMaybe) {
return 0;
}
} // namespace uking::dmg
void Struct20::combineMaybe(ksys::act::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;
}
}
} // namespace uking::act
@@ -3,39 +3,20 @@
#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include <heap/seadExpHeap.h>
#include <math/seadVector.h>
#include <prim/seadRuntimeTypeInfo.h>
#include "Game/Actor/Damage/dmgInfoManager.h"
#include "Game/Actor/Damage/dmgStruct20.h"
#include "Game/Actor/Damage/actDamageInfoMgr.h"
#include "Game/Actor/Damage/actStruct20.h"
#include "KingSystem/ActorSystem/actBaseProcLink.h"
#include "KingSystem/ActorSystem/actIDamageManager.h"
namespace ksys::act {
class Actor;
class ActorParam;
} // namespace ksys::act
namespace uking::dmg {
class DamageCallback;
// FIXME: Unknown base. This base seems to handle callbacks and messaging, so maybe a shared base?
class DamageManagerBase_UnknownBase1 {
public:
explicit DamageManagerBase_UnknownBase1(ksys::act::Actor* WeaponActor);
virtual ~DamageManagerBase_UnknownBase1() = default;
// 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;
};
namespace uking::act {
// FIXME: Unknown base 2. Helper functions maybe? Might also contain some of the fields from
// DamageManagerBase.
@@ -44,25 +25,22 @@ public:
virtual ~DamageManagerBase_UnknownBase2() = default;
};
class DamageManagerBase : public DamageManagerBase_UnknownBase1,
public DamageManagerBase_UnknownBase2 {
class DamageManagerBase : public ksys::act::IDamageManager, public DamageManagerBase_UnknownBase2 {
public:
explicit DamageManagerBase(ksys::act::Actor* actor);
~DamageManagerBase() override = default;
SEAD_RTTI_BASE(DamageManagerBase)
SEAD_RTTI_OVERRIDE(DamageManagerBase, ksys::act::IDamageManager)
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);
u32 getDamage() override;
s32 getField48() override { return mField_48; }
s32 getMinDmg() override { return mMinDmg; }
s32 getField50() override { return mField_50; }
s32 getField54() override { return mField_54; }
bool checkDamageFlags() override { return false; }
s32 getFlags2() override { return mFlags2; }
virtual f32 m13() { return 0.0f; }
virtual bool m14() { return false; }
virtual bool getStasisBlowVelocity(sead::Vector3f* velocity) { return false; }
virtual bool applyDamage(s32& life);
virtual bool m16() { return false; }
virtual void accumulateStasisBlowVelocity() {}
@@ -140,4 +118,4 @@ private:
};
KSYS_CHECK_SIZE_NX150(DamageManagerBase, 0x68);
} // namespace uking::dmg
} // namespace uking::act
+30
View File
@@ -0,0 +1,30 @@
#include "Game/Actor/Damage/actStruct20.h"
namespace uking::act {
void Struct20_2::reset() {
mField_1C = 0;
mField_30 = false;
Struct20::reset();
}
void Struct20_2::combineMaybe(ksys::act::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 uking::act
@@ -3,9 +3,10 @@
#include <basis/seadTypes.h>
#include <prim/seadRuntimeTypeInfo.h>
#include "KingSystem/ActorSystem/actIDamageManager.h"
#include "KingSystem/Utils/Types.h"
namespace uking::dmg {
namespace uking::act {
// What exactly Struct20 is, isn't known yet.
// It is used by the Damage Managers, especially DamageManager and up, not so much in
@@ -14,25 +15,15 @@ namespace uking::dmg {
// TODO: Figure out exactly what Struct20 does and rename struct + variables to fit.
class Struct20Base {
SEAD_RTTI_BASE(Struct20Base)
public:
virtual ~Struct20Base() = default;
virtual void reset();
virtual void combineMaybe(Struct20Base* other);
};
class Struct20 : public Struct20Base {
SEAD_RTTI_OVERRIDE(Struct20, Struct20Base)
class Struct20 : public ksys::act::Struct20Base {
SEAD_RTTI_OVERRIDE(Struct20, ksys::act::Struct20Base)
public:
~Struct20() override { ; }
void reset() override;
__attribute__((noinline)) void combineMaybe(Struct20Base* other) override;
__attribute__((noinline)) void combineMaybe(ksys::act::Struct20Base* other) override;
// Unknown which fields belong in Struct20 vs Struct20Base
u32 mField_8 = 0;
@@ -44,6 +35,14 @@ public:
};
KSYS_CHECK_SIZE_NX150(Struct20, 0x20);
inline void Struct20::reset() {
mField_8 = 0;
mField_C = 0;
mField_10 = 0;
mField_14 = -1;
mField_18 = -1;
}
class Struct20_2 : public Struct20 {
SEAD_RTTI_OVERRIDE(Struct20_2, Struct20)
@@ -51,7 +50,7 @@ public:
~Struct20_2() override { ; }
void reset() override;
void combineMaybe(Struct20Base* other) override;
void combineMaybe(ksys::act::Struct20Base* other) override;
f32 mField_20;
f32 mField_24;
@@ -61,4 +60,4 @@ public:
};
KSYS_CHECK_SIZE_NX150(Struct20_2, 0x38);
} // namespace uking::dmg
} // namespace uking::act
-21
View File
@@ -1,21 +0,0 @@
#pragma once
#include <basis/seadTypes.h>
namespace uking::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 uking::dmg
-53
View File
@@ -1,53 +0,0 @@
#include "Game/Actor/Damage/dmgStruct20.h"
namespace uking::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 uking::dmg
+3 -3
View File
@@ -1,6 +1,6 @@
#include "Game/UI/uiUtils.h"
#include "Game/AOC/aocHardModeManager.h"
#include "Game/Actor/Damage/dmgInfoManager.h"
#include "Game/Actor/Damage/actDamageInfoMgr.h"
#include "Game/Actor/actPlayerCreateMgr.h"
#include "Game/Actor/actWeapon.h"
#include "Game/UI/uiPauseMenuDataMgr.h"
@@ -56,7 +56,7 @@ void getWeaponStats(const PouchItem& item, WeaponStats* stats) {
} else if (isMasterSwordItem(item)) {
int power = 0;
if (item.getValue() > 0) {
const bool is_true_form = dmg::DamageInfoMgr::instance()->isTrueFormMasterSword();
const bool is_true_form = act::DamageInfoMgr::instance()->isTrueFormMasterSword();
auto* info_ = ksys::act::InfoData::instance();
const char* name = item.getName().cstr();
if (is_true_form) {
@@ -69,7 +69,7 @@ void getWeaponStats(const PouchItem& item, WeaponStats* stats) {
stats->power = power;
} else if (isOneHitObliteratorActorName(item.getName())) {
stats->power = dmg::DamageInfoMgr::instance()->isOneHitObliteratorActive() ? 99999 : 1;
stats->power = act::DamageInfoMgr::instance()->isOneHitObliteratorActive() ? 99999 : 1;
} else {
stats->power =
ksys::act::getAttackPower(ksys::act::InfoData::instance(), item.getName().cstr());
@@ -101,6 +101,8 @@ target_sources(uking PRIVATE
actDebug.h
actGlobalParameter.cpp
actGlobalParameter.h
actIDamageManager.cpp
actIDamageManager.h
actInfoCommon.cpp
actInfoCommon.h
actInfoData.cpp
+2 -5
View File
@@ -23,10 +23,6 @@ namespace gsys {
class Model;
} // namespace gsys
namespace uking::dmg {
class DamageManagerBase;
} // namespace uking::dmg
namespace ksys {
namespace as {
@@ -74,6 +70,7 @@ class BaseProcLink;
class BoneControl;
class Chemical;
class ImpulseBaseProcLink;
class IDamageManager;
class ModelBindInfo;
class Schedule;
@@ -270,7 +267,7 @@ public:
virtual void onPlacementObjReset();
virtual void getAtk();
virtual void m126();
virtual uking::dmg::DamageManagerBase* getDamageMgr();
virtual IDamageManager* getDamageMgr();
virtual void m128();
virtual void m129();
virtual void getPlayerRideInfo();
@@ -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
@@ -0,0 +1,64 @@
#pragma once
#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include <prim/seadRuntimeTypeInfo.h>
namespace ksys::act {
class Actor;
class IDamageManager;
class DamageCallback {
public:
virtual ~DamageCallback() {}
virtual void call(u32* a1, s32* a2, u32* a3, u32* a4, u32* a5, u64 a6);
DamageCallback* mPrev;
DamageCallback* mNext;
IDamageManager* mDamageManager;
u32 mEventId;
};
class Struct20Base {
SEAD_RTTI_BASE(Struct20Base)
public:
virtual ~Struct20Base() = default;
virtual void reset();
virtual void combineMaybe(Struct20Base* other);
};
class IDamageManager {
public:
explicit IDamageManager(Actor* actor) : mActor(actor) {}
SEAD_RTTI_BASE(IDamageManager)
virtual ~IDamageManager() = default;
virtual u32 getDamage() = 0;
virtual s32 getField48() = 0;
virtual s32 getMinDmg() = 0;
virtual s32 getField50() = 0;
virtual s32 getField54() = 0;
virtual bool checkDamageFlags() = 0;
virtual s32 getFlags2() = 0;
virtual void addDamageCallback(s32 eventId, DamageCallback* callback);
virtual void removeDamageCallback(DamageCallback* callback);
// Sturct20 for Damage receive/send?
Struct20Base* mStruct20_a = nullptr;
Struct20Base* mStruct20_b = nullptr;
Actor* mActor = nullptr;
sead::Buffer<DamageCallback*> mCallbacks{};
// Callback status flags?
s32 mField_30 = 0;
s8 mField_34 = 0;
};
} // namespace ksys::act