diff options
| author | Léo Lam <leo@leolam.fr> | 2026-09-28 03:39:31 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2026-10-11 04:53:08 +0200 |
| commit | 419f8f46bb40763d9602e4f975a033194281c5f5 (patch) | |
| tree | bdd44d13360e6d6c5422c1f269aa7af84d7075a2 /src/Game/Actor/Damage/actDamageInfoMgr.cpp | |
| parent | bdf141cf2d4919bb08de69d8a0c6cb4b6dd3e4ef (diff) | |
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)
Diffstat (limited to 'src/Game/Actor/Damage/actDamageInfoMgr.cpp')
| -rw-r--r-- | src/Game/Actor/Damage/actDamageInfoMgr.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/Game/Actor/Damage/actDamageInfoMgr.cpp b/src/Game/Actor/Damage/actDamageInfoMgr.cpp new file mode 100644 index 00000000..e794326a --- /dev/null +++ b/src/Game/Actor/Damage/actDamageInfoMgr.cpp @@ -0,0 +1,69 @@ +#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::act { + +SEAD_SINGLETON_DISPOSER_IMPL(DamageInfoMgr) + +bool DamageInfoMgr::enableBoomerangRemoteBombs() { + return false; +} + +int DamageInfoMgr::getShieldRideBaseFrame() { + auto* global = ksys::act::GlobalParameter::instance(); + if (!global || !global->getGlobalParam()) + return 0; + + return global->getGlobalParam()->mShieldRideBaseFrame.ref(); +} + +int DamageInfoMgr::getShieldRideHitBaseDamage() { + auto* global = ksys::act::GlobalParameter::instance(); + if (!global || !global->getGlobalParam()) + return 0; + + return global->getGlobalParam()->mShieldRideHitBaseDamage.ref(); +} + +f32 DamageInfoMgr::getCriticalAttackRatio() { + auto* global = ksys::act::GlobalParameter::instance(); + if (!global || !global->getGlobalParam()) + return 1.0; + + return global->getGlobalParam()->mCriticalAttackRatio.ref(); +} + +bool DamageInfoMgr::isTrueFormMasterSword() const { + if (mMasterSwordDisableTrueForm) + return false; + + if (ksys::gdt::getFlag_Open_MasterSword_FullPower()) + return true; + + if (ksys::gdt::getFlag_IsInHyruleCastleArea()) + return true; + + if (ksys::gdt::getFlag_LastBossGanonBeastGenerateFlag()) + return true; + + const sead::SafeString& map = GameScene::getCurrentMapName(); + + if (!ksys::gdt::getFlag_Die_PGanonElectric() && map == "RemainsElectric") + return true; + + if (!ksys::gdt::getFlag_Die_PGanonFire() && map == "RemainsFire") + return true; + + if (!ksys::gdt::getFlag_Die_PGanonWater() && map == "RemainsWater") + return true; + + if (!ksys::gdt::getFlag_Die_PGanonWind() && map == "RemainsWind") + return true; + + return mMasterSwordDetectedEvil; +} + +} // namespace uking::act |
