diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 8caa0380..a8320b37 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -40218,7 +40218,7 @@ 0x000000710067446c,sub_710067446C,664, 0x0000007100674704,sub_7100674704,44, 0x0000007100674730,sub_7100674730,44, -0x000000710067475c,enableBoomerangBombs,8, +0x000000710067475c,enableBoomerangBombs,8,_ZN5uking3dmg13DamageInfoMgr26enableBoomerangRemoteBombsEv 0x0000007100674764,sub_7100674764,8, 0x000000710067476c,sub_710067476C,8, 0x0000007100674774,sub_7100674774,8, @@ -40226,11 +40226,11 @@ 0x0000007100674788,sub_7100674788,8, 0x0000007100674790,sub_7100674790,12, 0x000000710067479c,sub_710067479C,8, -0x00000071006747a4,getShieldRideBaseFrame,48, -0x00000071006747d4,getShieldRideHitBaseDamage,48, +0x00000071006747a4,getShieldRideBaseFrame,48,_ZN5uking3dmg13DamageInfoMgr22getShieldRideBaseFrameEv +0x00000071006747d4,getShieldRideHitBaseDamage,48,_ZN5uking3dmg13DamageInfoMgr26getShieldRideHitBaseDamageEv 0x0000007100674804,get10,8, -0x000000710067480c,sub_710067480C,36, -0x0000007100674830,DamageInfoMgr::isTrueFormMasterSword,612, +0x000000710067480c,sub_710067480C,36,_ZN5uking3dmg13DamageInfoMgr22getCriticalAttackRatioEv +0x0000007100674830,DamageInfoMgr::isTrueFormMasterSword,612,_ZNK5uking3dmg13DamageInfoMgr21isTrueFormMasterSwordEv 0x0000007100674a94,sub_7100674A94,156, 0x0000007100674b30,sub_7100674B30,144, 0x0000007100674bc0,sub_7100674BC0,100, diff --git a/src/Game/Damage/dmgDamageManagerBase.cpp b/src/Game/Damage/dmgDamageManagerBase.cpp index 2a28f532..18864e98 100644 --- a/src/Game/Damage/dmgDamageManagerBase.cpp +++ b/src/Game/Damage/dmgDamageManagerBase.cpp @@ -229,11 +229,11 @@ bool DamageManagerBase::canTakeDamage() { return false; } - if (!DamageInfoMgr::instance()->mDamagesArray.isBufferReady()) { + if (!DamageInfoMgr::instance()->getDamagesArray().isBufferReady()) { return false; } - DamageInfoMgr::DamageItem& item = DamageInfoMgr::instance()->mDamagesArray[idx]; + DamageInfoMgr::DamageItem& item = DamageInfoMgr::instance()->getDamagesArray()[idx]; return item.mCanTakeDamageFromType[damageTypeMaybe] & 0x1; } diff --git a/src/Game/Damage/dmgInfoManager.cpp b/src/Game/Damage/dmgInfoManager.cpp index 7a0613a1..093dffe2 100644 --- a/src/Game/Damage/dmgInfoManager.cpp +++ b/src/Game/Damage/dmgInfoManager.cpp @@ -1,7 +1,69 @@ #include "Game/Damage/dmgInfoManager.h" +#include "Game/gameScene.h" +#include "KingSystem/ActorSystem/actGlobalParameter.h" +#include "KingSystem/GameData/gdtCommonFlagsUtils.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectGlobal.h" namespace uking::dmg { 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::dmg diff --git a/src/Game/Damage/dmgInfoManager.h b/src/Game/Damage/dmgInfoManager.h index 14df5548..f68b0c5e 100644 --- a/src/Game/Damage/dmgInfoManager.h +++ b/src/Game/Damage/dmgInfoManager.h @@ -24,8 +24,22 @@ public: sead::SafeArray mCanTakeDamageFromType; }; + /// Boomerang remote bombs are a scrapped feature. + static bool enableBoomerangRemoteBombs(); + static int getShieldRideBaseFrame(); + static int getShieldRideHitBaseDamage(); + static f32 getCriticalAttackRatio(); + bool isTrueFormMasterSword() const; + sead::Buffer& getDamagesArray() { return mDamagesArray; } + const sead::Buffer& getDamagesArray() const { return mDamagesArray; } + f32 getMasterSwordSearchEvilDist() const { return mMasterSwordSearchEvilDist; } + bool isMasterSwordDetectedEvil() const { return mMasterSwordDetectedEvil; } + bool isMasterSwordDisableTrueForm() const { return mMasterSwordDisableTrueForm; } + bool isOneHitObliteratorActive() const { return mOneHitObliteratorActive; } + +private: /* 0x0028 */ u8 TEMP_8[0x5d0 - 0x28]; /* 0x05d0 */ ksys::res::Handle mReactionTable; /* 0x0620 */ sead::Buffer mDamagesArray; diff --git a/src/Game/gameScene.h b/src/Game/gameScene.h index d7178a33..4a492877 100644 --- a/src/Game/gameScene.h +++ b/src/Game/gameScene.h @@ -1,5 +1,7 @@ #pragma once +#include + namespace uking { // TODO @@ -7,6 +9,12 @@ class GameScene { public: static bool isOpenWorldDemo() { return sIsOpenWorldDemo; } + /// Get the current map type (e.g. MainFieldDungeon) + static const sead::SafeString& getCurrentMapType(); + + /// Get the current map name (e.g. RemainsWind, FinalTrial, ...) + static const sead::SafeString& getCurrentMapName(); + private: static bool sIsOpenWorldDemo; };