uking/dmg: Implement DamageInfoMgr::isTrueFormMasterSword

And some trivial getters.
This commit is contained in:
Léo Lam
2021-01-22 17:20:24 +01:00
parent 5328fd2782
commit 5280254ef1
5 changed files with 91 additions and 7 deletions
+2 -2
View File
@@ -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;
}
+62
View File
@@ -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
+14
View File
@@ -24,8 +24,22 @@ public:
sead::SafeArray<u8, 3> 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<DamageItem>& getDamagesArray() { return mDamagesArray; }
const sead::Buffer<DamageItem>& 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<DamageItem> mDamagesArray;
+8
View File
@@ -1,5 +1,7 @@
#pragma once
#include <prim/seadSafeString.h>
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;
};