From b11347344ad74a8730d2eb03ae415d953ba8cf7b Mon Sep 17 00:00:00 2001 From: theo3 Date: Thu, 22 Oct 2020 03:12:31 -0700 Subject: [PATCH] decompile DamageParam --- data/uking_functions.csv | 58 ++-- src/KingSystem/Resource/CMakeLists.txt | 2 + .../Resource/resResourceDamageParam.cpp | 258 ++++++++++++++++++ .../Resource/resResourceDamageParam.h | 155 +++++++++++ 4 files changed, 444 insertions(+), 29 deletions(-) create mode 100644 src/KingSystem/Resource/resResourceDamageParam.cpp create mode 100644 src/KingSystem/Resource/resResourceDamageParam.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index f2a613ac..fcc7251a 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -64501,10 +64501,10 @@ 0x0000007100b8c084,nullsub_3333,4, 0x0000007100b8c088,nullsub_3334,4, 0x0000007100b8c08c,_ZN3aal8Debugger11LimiterType5text_Ei,428, -0x0000007100b8c238,j__ZdlPv_685,4, -0x0000007100b8c23c,_ZN4sead15FixedSafeStringILi130EEaSERKNS_14SafeStringBaseIcEE,240, -0x0000007100b8c32c,j__ZdlPv_686,4, -0x0000007100b8c330,_ZN4sead19FixedSafeStringBaseIcLi130EEaSERKNS_14SafeStringBaseIcEE,240, +0x0000007100b8c238,j__ZdlPv_685,4,_ZN4sead15FixedSafeStringILi24EED0Ev +0x0000007100b8c23c,_ZN4sead15FixedSafeStringILi130EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi24EEaSERKNS_14SafeStringBaseIcEE +0x0000007100b8c32c,j__ZdlPv_686,4,_ZN4sead19FixedSafeStringBaseIcLi24EED0Ev +0x0000007100b8c330,_ZN4sead19FixedSafeStringBaseIcLi130EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead19FixedSafeStringBaseIcLi24EEaSERKNS_14SafeStringBaseIcEE 0x0000007100b8c420,sub_7100B8C420,428, 0x0000007100b8c5cc,j__ZdlPv_687,4, 0x0000007100b8c5d0,_ZN4sead15FixedSafeStringILi157EEaSERKNS_14SafeStringBaseIcEE,240, @@ -85803,30 +85803,30 @@ 0x00000071010954b8,sub_71010954B8,624, 0x0000007101095728,sub_7101095728,580, 0x000000710109596c,nullsub_4467,4, -0x0000007101095970,ResourceBdmgparam::doCreate,4, -0x0000007101095974,Bdmgparam::parse,7556, -0x00000071010976f8,ResourceBdmgparam::parse,28, -0x0000007101097714,sub_7101097714,288, -0x0000007101097834,sub_7101097834,956, -0x0000007101097bf0,sub_7101097BF0,576, -0x0000007101097e30,sub_7101097E30,36, -0x0000007101097e54,sub_7101097E54,8, -0x0000007101097e5c,sub_7101097E5C,8, -0x0000007101097e64,sub_7101097E64,92, -0x0000007101097ec0,sub_7101097EC0,8, -0x0000007101097ec8,ResourceBdmgparam::rtti1,8, -0x0000007101097ed0,ResourceBdmgparam::rtti2,92, -0x0000007101097f2c,ResourceBdmgparam::dtor,8, -0x0000007101097f34,ResourceBdmgparam::dtorDelete,40, -0x0000007101097f5c,ResourceBdmgparam::needsParse,8, -0x0000007101097f64,sub_7101097F64,8, -0x0000007101097f6c,sub_7101097F6C,40, -0x0000007101097f94,getDamageRateTypes,428, -0x0000007101098140,j__ZdlPv_1173,4, -0x0000007101098144,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE,240, -0x0000007101098234,j__ZdlPv_1174,4, -0x0000007101098238,_ZN4sead15FixedSafeStringILi165EEaSERKNS_14SafeStringBaseIcEE,240, -0x0000007101098328,getDamageReactionTypes,428, +0x0000007101095970,ResourceBdmgparam::doCreate,4,_ZN4ksys3res11DamageParam9doCreate_EPhjPN4sead4HeapE +0x0000007101095974,Bdmgparam::parse,7556,_ZN4ksys3res11DamageParam6parse_EPhmPN4sead4HeapE +0x00000071010976f8,ResourceBdmgparam::parse,28,_ZThn632_N4ksys3res11DamageParam6parse_EPhmPN4sead4HeapE +0x0000007101097714,sub_7101097714,288,_ZN4ksys3res11DamageParam13getDamageRateERKN4sead14SafeStringBaseIcEE +0x0000007101097834,sub_7101097834,956,_ZN4ksys3res11DamageParam17getDamageReactionERKN4sead14SafeStringBaseIcEES6_ +0x0000007101097bf0,sub_7101097BF0,576,_ZN4ksys3res11DamageParamD2Ev +0x0000007101097e30,sub_7101097E30,36,_ZN4ksys3res11DamageParamD0Ev +0x0000007101097e54,sub_7101097E54,8,_ZN4ksys3res11DamageParam10ParamIO_m0Ev +0x0000007101097e5c,sub_7101097E5C,8,_ZNK4ksys3res11DamageParam27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007101097e64,sub_7101097E64,92,_ZNK4ksys3res11DamageParam18getRuntimeTypeInfoEv +0x0000007101097ec0,sub_7101097EC0,8,_ZNK4ksys3res11DamageParam10needsParseEv +0x0000007101097ec8,ResourceBdmgparam::rtti1,8,_ZThn632_NK4ksys3res11DamageParam27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007101097ed0,ResourceBdmgparam::rtti2,92,_ZThn632_NK4ksys3res11DamageParam18getRuntimeTypeInfoEv +0x0000007101097f2c,ResourceBdmgparam::dtor,8,_ZThn632_N4ksys3res11DamageParamD1Ev +0x0000007101097f34,ResourceBdmgparam::dtorDelete,40,_ZThn632_N4ksys3res11DamageParamD0Ev +0x0000007101097f5c,ResourceBdmgparam::needsParse,8,_ZThn632_NK4ksys3res11DamageParam10needsParseEv +0x0000007101097f64,sub_7101097F64,8,_ZThn664_N4ksys3res11DamageParamD1Ev +0x0000007101097f6c,sub_7101097F6C,40,_ZThn664_N4ksys3res11DamageParamD0Ev +0x0000007101097f94,getDamageRateTypes,428,_ZN4ksys3res11DamageParam12DamageSource5text_Ei? +0x0000007101098140,j__ZdlPv_1173,4,_ZN4sead15FixedSafeStringILi75EED0Ev +0x0000007101098144,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi75EEaSERKNS_14SafeStringBaseIcEE +0x0000007101098234,j__ZdlPv_1174,4,_ZN4sead19FixedSafeStringBaseIcLi75EED0Ev +0x0000007101098238,_ZN4sead15FixedSafeStringILi165EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead19FixedSafeStringBaseIcLi75EEaSERKNS_14SafeStringBaseIcEE +0x0000007101098328,getDamageReactionTypes,428,_ZN4ksys3res11DamageParam10DamageSize5text_Ei? 0x0000007101098648,nullsub_4469,4,_ZN4ksys3res4Drop9doCreate_EPhjPN4sead4HeapE 0x000000710109864c,nullsub_4470,4,_ZThn632_N4ksys3res4Drop9doCreate_EPhjPN4sead4HeapE 0x0000007101098650,Bdrop::parse,1684,_ZN4ksys3res4Drop6parse_EPhmPN4sead4HeapE @@ -88916,7 +88916,7 @@ 0x0000007101181824,sub_7101181824,372, 0x0000007101181998,sub_7101181998,8, 0x00000071011819a0,sub_71011819A0,8, -0x00000071011819a8,Bdmgparam::ctor,1808, +0x00000071011819a8,Bdmgparam::ctor,1808,_ZN4ksys3res11DamageParamC1Ev 0x00000071011820b8,EntryFactoryBdmgparam::dtor,68, 0x00000071011820fc,EntryFactoryBdmgparam::dtorDelete,76, 0x0000007101182148,EntryFactoryBdmgparam::rtti1,132, diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index b285ff4c..fa45e59b 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -130,6 +130,8 @@ target_sources(uking PRIVATE resResourceArchive.h resResourceAwareness.cpp resResourceAwareness.h + resResourceDamageParam.cpp + resResourceDamageParam.h resResourceDemo.cpp resResourceDemo.h resResourceDrop.cpp diff --git a/src/KingSystem/Resource/resResourceDamageParam.cpp b/src/KingSystem/Resource/resResourceDamageParam.cpp new file mode 100644 index 00000000..0a969370 --- /dev/null +++ b/src/KingSystem/Resource/resResourceDamageParam.cpp @@ -0,0 +1,258 @@ +#include "KingSystem/Resource/resResourceDamageParam.h" + +namespace ksys::res { + +SEAD_ENUM_IMPL(DamageParam::DamageSize) +SEAD_ENUM_IMPL(DamageParam::DamageSource) + +DamageParam::DamageParam() : ParamIO("dmgparam", 0) {} + +bool DamageParam::parse_(u8* data, size_t, sead::Heap* heap) { + mDamageRateBuffer.allocBufferAssert(DamageSource::size(), heap); + mDamageTypeBuffer.allocBufferAssert(DamageSource::size() * DamageSize::size(), heap); + + sead::FormatFixedSafeString<64> str; + for (auto source : DamageSource{}) { + str.format("%s", source.text()); + mDamageRateBuffer[source.getRelativeIndex()].init(1.0, str, "", &mDamageRateObj); + } + + for (auto source : DamageSource{}) { + for (auto size : DamageSize{}) { + str.format("%s-%s", source.text(), size.text()); + const auto i = source.getRelativeIndex(); + const auto j = size.getRelativeIndex(); + if (source == DamageSource::Arrow) { + mDamageTypeBuffer.get(i * 4 + j)->init("通常ダメージ", str, "", &mReactionTableObj); + } else if (j == DamageSize::Large || j == DamageSize::Huge || + source == DamageSource::Bomb || source == DamageSource::LargeSword) { + mDamageTypeBuffer.get(i * 4 + j)->init("吹っ飛び", str, "", &mReactionTableObj); + } else if (j == DamageSize::Middle) { + mDamageTypeBuffer.get(i * 4 + j)->init("中ダメージ", str, "", &mReactionTableObj); + } else { + mDamageTypeBuffer.get(i * 4 + j)->init("通常ダメージ", str, "", &mReactionTableObj); + } + } + } + + mBreakable.init(false, "Breakable", "壊れるかどうか(AI無しで破壊エフェクト・消滅挙動を行う)", + "", &mParametersObj); + mHammerAffect.init( + false, "HammerAffect", + "ハンマーが有効かどうか(ハンマー属性にチェックを入れた武器で攻撃されると即死する)", "", + &mParametersObj); + mWeakBreakerAffect.init(false, "WeakBreakerAffect", "Objを一撃破壊しない武器設定が有効か", "", + &mParametersObj); + mChemicalAttackAffect.init(true, "ChemicalAttackAffect", + "ケミカルAtによる追加ダメージを受けるか(Ex:ロッドの玉)", "", + &mParametersObj); + mSpAffectRatio.init(1.0, "SpAffectRatio", "特効ダメージ倍率(武器倍率と掛け算される)", "", + &mParametersObj); + mSpAffectDamage.init(0, "SpAffectDamage", "特効ダメージ加算値(ダメージ計算後に加算される)", "", + &mParametersObj); + mVanishAffect.init(false, "VanishAffect", "消滅攻撃有効(Ex:古代の矢)", "", &mParametersObj); + mIsCriticalBlowOff.init(true, "IsCriticalBlowOff", "クリティカルで吹き飛ぶ", "", + &mParametersObj); + mIsAcceptAtkImpulse.init(false, "IsAcceptAtkImpulse", + "攻撃的衝撃力を受けるかどうか(Ex:ボコブリンの石)", "", + &mParametersObj); + mIsCommonCalcImpuleDamage.init( + true, "IsCommonCalcImpuleDamage", + "衝撃力ダメージを自動計算する(Offの場合のみImpulseDamageTableが有効になります)", "", + &mParametersObj); + mIsHeavyBreak.init(false, "IsHeavyBreak", "巨体属性でへし折れる", "", &mParametersObj); + mImpulseThresholdLv0.init(-1.0, "ImpulseThresholdLv0", "(Small)衝撃力ダメージ閾値", "", + &mParametersObj); + mImpulseDamageLv0.init(0.0, "ImpulseDamageLv0", "(Small)衝撃力ダメージ値", "", &mParametersObj); + mImpulseThresholdLv1.init(-1.0, "ImpulseThresholdLv1", "(Middle)衝撃力ダメージ閾値", "", + &mParametersObj); + mImpulseDamageLv1.init(0.0, "ImpulseDamageLv1", "(Middle)衝撃力ダメージ値", "", + &mParametersObj); + mImpulseThresholdLv2.init(-1.0, "ImpulseThresholdLv2", "(Large)衝撃力ダメージ閾値", "", + &mParametersObj); + mImpulseDamageLv2.init(0.0, "ImpulseDamageLv2", "(Large)衝撃力ダメージ値", "", &mParametersObj); + mImpulseThresholdLv3.init(-1.0, "ImpulseThresholdLv3", "(Huge)衝撃力ダメージ閾値", "", + &mParametersObj); + mImpulseDamageLv3.init(0.0, "ImpulseDamageLv3", "(Huge)衝撃力ダメージ値", "", &mParametersObj); + mImpulseThresholdLv4.init(-1.0, "ImpulseThresholdLv4", "(即死)衝撃力ダメージ閾値", "", + &mParametersObj); + mFallDamageStartHeight.init(10000.0, "FallDamageStartHeight", "落下ダメージ開始高さ", "", + &mParametersObj); + mFallDamageMin.init(0, "FallDamageMin", "落下ダメージ最低値", "", &mParametersObj); + mFallDamagePerMeter.init(0.0, "FallDamagePerMeter", "1mあたりの加算落下ダメージ量", "", + &mParametersObj); + mFallDamageHighStart.init(-1.0, "FallDamageHighStart", "強落下ダメージ開始高さ(-1で無効)", "", + &mParametersObj); + mFallDamageHighPerMeter.init(0, "FallDamageHighPerMeter", + "強落下時1mあたりの加算落下ダメージ量", "", &mParametersObj); + mFallDamageNoWaterDepth.init(-1.0, "FallDamageNoWaterDepth", "落下ダメージ受けない水深", "", + &mParametersObj); + mWeakPointBone.init(sead::SafeString(""), "WeakPointBone", "弱手ボーン名(空白だとモデル原点)", + "", &mParametersObj); + mWeakPointCalcArea.init(0.0, "WeakPointCalcArea", "弱点判定エリア(弱点不要アクターはここを0に)", + "", &mParametersObj); + mWeakPointCalcOffset.init({0, 0, 0}, "WeakPointCalcOffset", + "弱手判定エリアの指定ボーンからのオフセット(ローカル座標系)", "", + &mParametersObj); + mWeakPointArea.init(0.0, "WeakPointArea", "弱点エリア", "", &mParametersObj); + mWeakPointOffset.init({0, 0, 0}, "WeakPointOffset", + "弱点エリアの指定ボーンからのオフセット(ローカル座標系)", "", + &mParametersObj); + mWeakPointRatio.init(4.0, "WeakPointRatio", "弱点ダメージ倍率", "", &mParametersObj); + mWeakPointNoUIFlag.init(false, "WeakPointNoUIFlag", "ヒット時説明UIを出さない", "", + &mParametersObj); + mWeakPointBone2.init(sead::SafeString(""), "WeakPointBone2", "弱手ボーン名(空白だとモデル原点)", + "", &mParametersObj); + mWeakPointCalcArea2.init(0.0, "WeakPointCalcArea2", + "弱点判定エリア(弱点不要アクターはここを0に)", "", &mParametersObj); + mWeakPointCalcOffset2.init({0, 0, 0}, "WeakPointCalcOffset2", + "弱手判定エリアの指定ボーンからのオフセット(ローカル座標系)", "", + &mParametersObj); + mWeakPointArea2.init(0.0, "WeakPointArea2", "弱点エリア", "", &mParametersObj); + mWeakPointOffset2.init({0, 0, 0}, "WeakPointOffset2", + "弱点エリアの指定ボーンからのオフセット(ローカル座標系)", "", + &mParametersObj); + mWeakPointRatio2.init(1.0, "WeakPointRatio2", "弱点ダメージ倍率", "", &mParametersObj); + mWeakPointNoUIFlag2.init(false, "WeakPointNoUIFlag2", "ヒット時説明UIを出さない", "", + &mParametersObj); + mSillentKillMultRatio.init(1.0, "SillentKillMultRatio", "奇襲ダメージ乗算倍率", "", + &mParametersObj); + mSillentKillAddDamage.init(0, "SillentKillAddDamage", "奇襲ダメージ加算値", "", + &mParametersObj); + mIsDeadBurnout.init(false, "IsDeadBurnout", "燃え尽きでライフ0", "", &mParametersObj); + mIsMetamorBurnout.init(false, "IsMetamorBurnout", "燃え尽きでアクタ変化", "", &mParametersObj); + mIsMatamorFromTg.init(true, "IsMatamorFromTg", "炎剣で切っても変化する", "", &mParametersObj); + mBurnable.init(false, "Burnable", "燃え状態有効", "", &mParametersObj); + mBurnDamage.init(10, "BurnDamage", "燃えダメージLv1(-1でダメージ受けない)", "", + &mParametersObj); + mBurnDamage2.init(-1, "BurnDamage2", "燃えダメージLv2(-1でLv1と同じ)", "", &mParametersObj); + mBurnDamage3.init(-1, "BurnDamage3", "燃えダメージLv3(-1でLv2と同じ)", "", &mParametersObj); + mBurnDamage4.init(-1, "BurnDamage4", "燃えダメージLv4(-1でLv3と同じ)", "", &mParametersObj); + mBurnDamage5.init(-1, "BurnDamage5", "燃えダメージLv5(-1でLv4と同じ)", "", &mParametersObj); + mBurnTime.init(10, "BurnTime", "燃え時間", "", &mParametersObj); + mBurnDamageInterval.init(-1, "BurnDamageInterval", "[火に接触時]燃えダメージ間隔(-1で無し)", "", + &mParametersObj); + mBurnContinuousDamage.init(0, "BurnContinuousDamage", "[火に接触時]燃え継続ダメージ", "", + &mParametersObj); + mBurnCritical.init(false, "BurnCritical", "火異常がクリティカル扱いか", "", &mParametersObj); + mProofBurnAtSmallDamage.init(false, "ProofBurnAtSmallDamage", + "火弾無効時小ダメージアクションをとるか", "", &mParametersObj); + mIsDeadIce.init(false, "IsDeadIce", "凍結でライフ0", "", &mParametersObj); + mIsMetamorIce.init(false, "IsMetamorIce", "凍結でアクタ変化", "", &mParametersObj); + mIceable.init(false, "Iceable", "凍結状態有効", "", &mParametersObj); + mIceDamage.init(10, "IceDamage", "凍結ダメージ", "", &mParametersObj); + mIceTime.init(10, "IceTime", "凍結時間(f)", "", &mParametersObj); + mIceBreakableByAtk.init(true, "IceBreakableByAtk", "凍結時攻撃で割れるか", "", &mParametersObj); + mIceBreakDamageRatio.init(4.0, "IceBreakDamageRatio", "凍結破壊ダメージ倍率", "", + &mParametersObj); + mIceCritical.init(false, "IceCritical", + "凍結異常がクリティカル扱いか(濡れたら死ぬようになります)", "", + &mParametersObj); + mProofIceAtSmallDamage.init(false, "ProofIceAtSmallDamage", + "冷凍弾無効時小ダメージアクションをとるか", "", &mParametersObj); + mIsDeadElectric.init(false, "IsDeadElectric", "帯電でライフ0", "", &mParametersObj); + mIsMetamorElectric.init(false, "IsMetamorElectric", "帯電でアクタ変化", "", &mParametersObj); + mElectricable.init(false, "Electricable", "痺れ状態有効", "", &mParametersObj); + mElectricDamage.init(0, "ElectricDamage", "痺れダメージ", "", &mParametersObj); + mElectricTime.init(10, "ElectricTime", "痺れ時間(f)", "", &mParametersObj); + mElecCancelableByAtk.init(false, "ElecCancelableByAtk", "痺れ時攻撃でキャンセルされるか", "", + &mParametersObj); + mProofElecAtSmallDamage.init(false, "ProofElecAtSmallDamage", + "電気弾無効時小ダメージアクションをとるか", "", &mParametersObj); + mWetAffect.init(false, "WetAffect", "濡れ有効", "", &mParametersObj); + mLightningAffect.init(true, "LightningAffect", "落雷有効", "", &mParametersObj); + mLightningDamage.init(999999, "LightningDamage", "落雷ダメージ", "", &mParametersObj); + mGerudoHeroAffect.init(true, "GerudoHeroAffect", "英傑加護(雷)有効", "", &mParametersObj); + mGerudoHeroDamage.init(100, "GerudoHeroDamage", "英傑加護(雷)ダメージ", "", &mParametersObj); + mGerudoHeroTime.init(300, "GerudoHeroTime", "英傑加護(雷)痺れ時間(0だと吹っ飛び)", "", + &mParametersObj); + mGustAffect.init(true, "GustAffect", "突風有効", "", &mParametersObj); + mDrownHeight.init(-1.0, "DrownHeight", "溺れる水深(-1で溺れない)", "", &mParametersObj); + mDrownDamage.init(0, "DrownDamage", "溺れた瞬間に食らうダメージ(特殊な場合を除き0でいい)", "", + &mParametersObj); + mColdWaterFrozenTime.init(-1, "ColdWaterFrozenTime", "冷たい水地形で凍結する時間", "", + &mParametersObj); + mColdWaterAffect.init(true, "ColdWaterAffect", "冷たい水地形でダメージ有", "", &mParametersObj); + mColdWaterDamage.init(0, "ColdWaterDamage", "冷たい水ダメージ値", "", &mParametersObj); + mColdWaterDamageInterval.init(-1, "ColdWaterDamageInterval", "冷たい水ダメージ最浅間隔", "", + &mParametersObj); + mColdWaterDamageStartDepth.init(0.0, "ColdWaterDamageStartDepth", "冷たい水ダメージ最浅閾値", + "", &mParametersObj); + mColdWaterDamageIntervalDeep.init(-1, "ColdWaterDamageIntervalDeep", + "冷たい水ダメージ最深間隔(-1なら使わない)", "", + &mParametersObj); + mColdWaterDamageDeepDepth.init(-1.0, "ColdWaterDamageDeepDepth", + "冷たい水ダメージ最深閾値(-1で最深間隔は使わない)", "", + &mParametersObj); + mHotWaterBoiledTime.init( + -1, "HotWaterBoiledTime", + "熱湯地形で茹であがる時間(-1で無効,有効にする場合は以下は無効設定にして下さい)", "", + &mParametersObj); + mHotWaterHealAffect.init(false, "HotWaterHealAffect", "温泉地形で影響有", "", &mParametersObj); + mHotWaterHeal.init(0, "HotWaterHeal", "温泉回復値", "", &mParametersObj); + mHotWaterHealInterval.init(-1, "HotWaterHealInterval", "温泉影響最浅間隔", "", &mParametersObj); + mHotWaterHealStartDepth.init(0.0, "HotWaterHealStartDepth", "温泉影響最浅閾値", "", + &mParametersObj); + mHotWaterHealIntervalDeep.init(-1, "HotWaterHealIntervalDeep", + "温泉影響最深間隔(-1なら使わない)", "", &mParametersObj); + mHotWaterHealDeepDepth.init(-1.0, "HotWaterHealDeepDepth", + "温泉影響最深閾値(-1で最深間隔は使わない)", "", &mParametersObj); + mHotWaterChemCrit.init(false, "HotWaterChemCrit", "温泉入るとケミカルクリティカル", "", + &mParametersObj); + mPoisonBogAffect.init(true, "PoisonBogAffect", "毒沼地形でダメージ有", "", &mParametersObj); + mPoisonBogDamage.init(0, "PoisonBogDamage", "毒沼ダメージ値", "", &mParametersObj); + mPoisonBogDamageInterval.init(-1, "PoisonBogDamageInterval", "毒沼ダメージ間隔", "", + &mParametersObj); + mLavaAffect.init(true, "LavaAffect", "溶岩地形でダメージ有", "", &mParametersObj); + mLavaDamage.init(999999, "LavaDamage", "溶岩ダメージ値", "", &mParametersObj); + mLavaDamageInterval.init(-1, "LavaDamageInterval", "溶岩ダメージ間隔", "", &mParametersObj); + mLavaDeepDepth.init(-1.0, "LavaDeepDepth", "深い溶岩閾値", "", &mParametersObj); + mLavaDeepDamage.init(999999, "LavaDeepDamage", "深い溶岩ダメージ値", "", &mParametersObj); + mCurseAffect.init(false, "CurseAffect", "怨念ダメージ状態有効", "", &mParametersObj); + mCurseDamage.init(30, "CurseDamage", "怨念ダメージ", "", &mParametersObj); + mCurseInterval.init(60, "CurseInterval", "怨念ダメージ間隔(-1で無し)", "", &mParametersObj); + mCurseContinuousDamage.init(5, "CurseContinuousDamage", "怨念継続ダメージ", "", + &mParametersObj); + mHeavySnowColdTime.init(-1, "HeavySnowColdTime", "大雪時凍るまでの時間(-1で凍らない)", "", + &mParametersObj); + + mKeyString.init(sead::SafeString(""), "key", "", &mDamageTypeObj); + + mParamList.addObj(&mDamageRateObj, "DamageRate"); + mParamList.addObj(&mReactionTableObj, "ReactionTable"); + mParamList.addObj(&mParametersObj, "Parameters"); + mParamList.addObj(&mDamageTypeObj, "DamageType"); + addList(&mParamList, "damage_param"); + + if (data) + applyResParameterArchive(agl::utl::ResParameterArchive(data)); + + return true; +} + +f32 DamageParam::getDamageRate(const sead::SafeString& damage_source) { + u32 hash = agl::utl::ParameterBase::calcHash(damage_source); + +#pragma clang loop unroll(full) + for (int idx = 0; idx != 10; ++idx) { + if (hash == mDamageRateBuffer[idx].getNameHash()) + return mDamageRateBuffer[idx].ref(); + } + return 0.0; +} + +const sead::SafeString& DamageParam::getDamageReaction(const sead::SafeString& damage_source, + const sead::SafeString& size) { + sead::FormatFixedSafeString<128> key("%s-%s", damage_source.cstr(), size.cstr()); + + u32 hash = agl::utl::ParameterBase::calcHash(key); + +#pragma clang loop unroll(full) + for (int idx = 0; idx != 40; ++idx) { + if (hash == mDamageTypeBuffer.get(idx)->getNameHash()) + return mDamageTypeBuffer.get(idx)->ref(); + } + return sead::SafeString::cEmptyString; +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceDamageParam.h b/src/KingSystem/Resource/resResourceDamageParam.h new file mode 100644 index 00000000..a6258094 --- /dev/null +++ b/src/KingSystem/Resource/resResourceDamageParam.h @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include "KingSystem/Resource/resResource.h" +#include "KingSystem/Utils/ParamIO.h" + +namespace ksys::res { + +class DamageParam : public ParamIO, public Resource { + SEAD_RTTI_OVERRIDE(DamageParam, Resource) + +public: + DamageParam(); + ~DamageParam() = default; + + bool needsParse() const override { return true; } + bool ParamIO_m0() override { return false; } + + f32 getDamageRate(const sead::SafeString& damage_source); + const sead::SafeString& getDamageReaction(const sead::SafeString& damage_source, + const sead::SafeString& damage_size); + + // clang-format off + SEAD_ENUM(DamageSize,Small,Middle,Large,Huge) + SEAD_ENUM(DamageSource,Sword,LargeSword,Spear,Arrow,Bomb,Body,Ancient,ShockWave,Impulse,GanonBeam) + // clang-format on + +private: + void doCreate_(u8*, u32, sead::Heap*) override {} + bool parse_(u8* data, size_t size, sead::Heap* heap) override; + + agl::utl::ParameterList mParamList; + agl::utl::ParameterObj mReactionTableObj; + agl::utl::ParameterObj mDamageRateObj; + agl::utl::ParameterObj mParametersObj; + agl::utl::ParameterObj mDamageTypeObj; + + sead::Buffer> mDamageRateBuffer; + sead::Buffer> mDamageTypeBuffer; + +public: + agl::utl::Parameter mKeyString; + agl::utl::Parameter mBreakable; + agl::utl::Parameter mHammerAffect; + agl::utl::Parameter mWeakBreakerAffect; + agl::utl::Parameter mChemicalAttackAffect; + agl::utl::Parameter mSpAffectRatio; + agl::utl::Parameter mSpAffectDamage; + agl::utl::Parameter mVanishAffect; + agl::utl::Parameter mIsCriticalBlowOff; + agl::utl::Parameter mIsAcceptAtkImpulse; + agl::utl::Parameter mIsCommonCalcImpuleDamage; + agl::utl::Parameter mIsHeavyBreak; + agl::utl::Parameter mImpulseThresholdLv0; + agl::utl::Parameter mImpulseDamageLv0; + agl::utl::Parameter mImpulseThresholdLv1; + agl::utl::Parameter mImpulseDamageLv1; + agl::utl::Parameter mImpulseThresholdLv2; + agl::utl::Parameter mImpulseDamageLv2; + agl::utl::Parameter mImpulseThresholdLv3; + agl::utl::Parameter mImpulseDamageLv3; + agl::utl::Parameter mImpulseThresholdLv4; + agl::utl::Parameter mFallDamageStartHeight; + agl::utl::Parameter mFallDamageMin; + agl::utl::Parameter mFallDamagePerMeter; + agl::utl::Parameter mFallDamageHighStart; + agl::utl::Parameter mFallDamageHighPerMeter; + agl::utl::Parameter mFallDamageNoWaterDepth; + agl::utl::Parameter mWeakPointBone; + agl::utl::Parameter mWeakPointCalcArea; + agl::utl::Parameter mWeakPointCalcOffset; + agl::utl::Parameter mWeakPointArea; + agl::utl::Parameter mWeakPointOffset; + agl::utl::Parameter mWeakPointRatio; + agl::utl::Parameter mWeakPointNoUIFlag; + agl::utl::Parameter mWeakPointBone2; + agl::utl::Parameter mWeakPointCalcArea2; + agl::utl::Parameter mWeakPointCalcOffset2; + agl::utl::Parameter mWeakPointArea2; + agl::utl::Parameter mWeakPointOffset2; + agl::utl::Parameter mWeakPointRatio2; + agl::utl::Parameter mWeakPointNoUIFlag2; + agl::utl::Parameter mSillentKillMultRatio; + agl::utl::Parameter mSillentKillAddDamage; + agl::utl::Parameter mIsDeadBurnout; + agl::utl::Parameter mIsMetamorBurnout; + agl::utl::Parameter mIsMatamorFromTg; + agl::utl::Parameter mBurnable; + agl::utl::Parameter mBurnDamage; + agl::utl::Parameter mBurnDamage2; + agl::utl::Parameter mBurnDamage3; + agl::utl::Parameter mBurnDamage4; + agl::utl::Parameter mBurnDamage5; + agl::utl::Parameter mBurnTime; + agl::utl::Parameter mBurnDamageInterval; + agl::utl::Parameter mBurnContinuousDamage; + agl::utl::Parameter mBurnCritical; + agl::utl::Parameter mProofBurnAtSmallDamage; + agl::utl::Parameter mIsDeadIce; + agl::utl::Parameter mIsMetamorIce; + agl::utl::Parameter mIceable; + agl::utl::Parameter mIceDamage; + agl::utl::Parameter mIceTime; + agl::utl::Parameter mIceBreakableByAtk; + agl::utl::Parameter mIceBreakDamageRatio; + agl::utl::Parameter mIceCritical; + agl::utl::Parameter mProofIceAtSmallDamage; + agl::utl::Parameter mIsDeadElectric; + agl::utl::Parameter mIsMetamorElectric; + agl::utl::Parameter mElectricable; + agl::utl::Parameter mElectricDamage; + agl::utl::Parameter mElectricTime; + agl::utl::Parameter mElecCancelableByAtk; + agl::utl::Parameter mProofElecAtSmallDamage; + agl::utl::Parameter mWetAffect; + agl::utl::Parameter mLightningAffect; + agl::utl::Parameter mLightningDamage; + agl::utl::Parameter mGerudoHeroAffect; + agl::utl::Parameter mGerudoHeroDamage; + agl::utl::Parameter mGerudoHeroTime; + agl::utl::Parameter mGustAffect; + agl::utl::Parameter mDrownHeight; + agl::utl::Parameter mDrownDamage; + agl::utl::Parameter mColdWaterFrozenTime; + agl::utl::Parameter mColdWaterAffect; + agl::utl::Parameter mColdWaterDamage; + agl::utl::Parameter mColdWaterDamageInterval; + agl::utl::Parameter mColdWaterDamageStartDepth; + agl::utl::Parameter mColdWaterDamageIntervalDeep; + agl::utl::Parameter mColdWaterDamageDeepDepth; + agl::utl::Parameter mHotWaterBoiledTime; + agl::utl::Parameter mHotWaterHealAffect; + agl::utl::Parameter mHotWaterHeal; + agl::utl::Parameter mHotWaterHealInterval; + agl::utl::Parameter mHotWaterHealStartDepth; + agl::utl::Parameter mHotWaterHealIntervalDeep; + agl::utl::Parameter mHotWaterHealDeepDepth; + agl::utl::Parameter mHotWaterChemCrit; + agl::utl::Parameter mPoisonBogAffect; + agl::utl::Parameter mPoisonBogDamage; + agl::utl::Parameter mPoisonBogDamageInterval; + agl::utl::Parameter mLavaAffect; + agl::utl::Parameter mLavaDamage; + agl::utl::Parameter mLavaDamageInterval; + agl::utl::Parameter mLavaDeepDepth; + agl::utl::Parameter mLavaDeepDamage; + agl::utl::Parameter mCurseAffect; + agl::utl::Parameter mCurseDamage; + agl::utl::Parameter mCurseInterval; + agl::utl::Parameter mCurseContinuousDamage; + agl::utl::Parameter mHeavySnowColdTime; +}; + +} // namespace ksys::res