Merge pull request #13 from notyourav/pr

decompile DamageParam
This commit is contained in:
Léo Lam 2020-10-24 01:21:18 +02:00 committed by GitHub
commit 1cbb1a3311
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 444 additions and 29 deletions

View File

@ -64501,10 +64501,10 @@
0x0000007100b8c084,nullsub_3333,4, 0x0000007100b8c084,nullsub_3333,4,
0x0000007100b8c088,nullsub_3334,4, 0x0000007100b8c088,nullsub_3334,4,
0x0000007100b8c08c,_ZN3aal8Debugger11LimiterType5text_Ei,428, 0x0000007100b8c08c,_ZN3aal8Debugger11LimiterType5text_Ei,428,
0x0000007100b8c238,j__ZdlPv_685,4, 0x0000007100b8c238,j__ZdlPv_685,4,_ZN4sead15FixedSafeStringILi24EED0Ev
0x0000007100b8c23c,_ZN4sead15FixedSafeStringILi130EEaSERKNS_14SafeStringBaseIcEE,240, 0x0000007100b8c23c,_ZN4sead15FixedSafeStringILi130EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi24EEaSERKNS_14SafeStringBaseIcEE
0x0000007100b8c32c,j__ZdlPv_686,4, 0x0000007100b8c32c,j__ZdlPv_686,4,_ZN4sead19FixedSafeStringBaseIcLi24EED0Ev
0x0000007100b8c330,_ZN4sead19FixedSafeStringBaseIcLi130EEaSERKNS_14SafeStringBaseIcEE,240, 0x0000007100b8c330,_ZN4sead19FixedSafeStringBaseIcLi130EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead19FixedSafeStringBaseIcLi24EEaSERKNS_14SafeStringBaseIcEE
0x0000007100b8c420,sub_7100B8C420,428, 0x0000007100b8c420,sub_7100B8C420,428,
0x0000007100b8c5cc,j__ZdlPv_687,4, 0x0000007100b8c5cc,j__ZdlPv_687,4,
0x0000007100b8c5d0,_ZN4sead15FixedSafeStringILi157EEaSERKNS_14SafeStringBaseIcEE,240, 0x0000007100b8c5d0,_ZN4sead15FixedSafeStringILi157EEaSERKNS_14SafeStringBaseIcEE,240,
@ -85803,30 +85803,30 @@
0x00000071010954b8,sub_71010954B8,624, 0x00000071010954b8,sub_71010954B8,624,
0x0000007101095728,sub_7101095728,580, 0x0000007101095728,sub_7101095728,580,
0x000000710109596c,nullsub_4467,4, 0x000000710109596c,nullsub_4467,4,
0x0000007101095970,ResourceBdmgparam::doCreate,4, 0x0000007101095970,ResourceBdmgparam::doCreate,4,_ZN4ksys3res11DamageParam9doCreate_EPhjPN4sead4HeapE
0x0000007101095974,Bdmgparam::parse,7556, 0x0000007101095974,Bdmgparam::parse,7556,_ZN4ksys3res11DamageParam6parse_EPhmPN4sead4HeapE
0x00000071010976f8,ResourceBdmgparam::parse,28, 0x00000071010976f8,ResourceBdmgparam::parse,28,_ZThn632_N4ksys3res11DamageParam6parse_EPhmPN4sead4HeapE
0x0000007101097714,sub_7101097714,288, 0x0000007101097714,sub_7101097714,288,_ZN4ksys3res11DamageParam13getDamageRateERKN4sead14SafeStringBaseIcEE
0x0000007101097834,sub_7101097834,956, 0x0000007101097834,sub_7101097834,956,_ZN4ksys3res11DamageParam17getDamageReactionERKN4sead14SafeStringBaseIcEES6_
0x0000007101097bf0,sub_7101097BF0,576, 0x0000007101097bf0,sub_7101097BF0,576,_ZN4ksys3res11DamageParamD2Ev
0x0000007101097e30,sub_7101097E30,36, 0x0000007101097e30,sub_7101097E30,36,_ZN4ksys3res11DamageParamD0Ev
0x0000007101097e54,sub_7101097E54,8, 0x0000007101097e54,sub_7101097E54,8,_ZN4ksys3res11DamageParam10ParamIO_m0Ev
0x0000007101097e5c,sub_7101097E5C,8, 0x0000007101097e5c,sub_7101097E5C,8,_ZNK4ksys3res11DamageParam27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x0000007101097e64,sub_7101097E64,92, 0x0000007101097e64,sub_7101097E64,92,_ZNK4ksys3res11DamageParam18getRuntimeTypeInfoEv
0x0000007101097ec0,sub_7101097EC0,8, 0x0000007101097ec0,sub_7101097EC0,8,_ZNK4ksys3res11DamageParam10needsParseEv
0x0000007101097ec8,ResourceBdmgparam::rtti1,8, 0x0000007101097ec8,ResourceBdmgparam::rtti1,8,_ZThn632_NK4ksys3res11DamageParam27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x0000007101097ed0,ResourceBdmgparam::rtti2,92, 0x0000007101097ed0,ResourceBdmgparam::rtti2,92,_ZThn632_NK4ksys3res11DamageParam18getRuntimeTypeInfoEv
0x0000007101097f2c,ResourceBdmgparam::dtor,8, 0x0000007101097f2c,ResourceBdmgparam::dtor,8,_ZThn632_N4ksys3res11DamageParamD1Ev
0x0000007101097f34,ResourceBdmgparam::dtorDelete,40, 0x0000007101097f34,ResourceBdmgparam::dtorDelete,40,_ZThn632_N4ksys3res11DamageParamD0Ev
0x0000007101097f5c,ResourceBdmgparam::needsParse,8, 0x0000007101097f5c,ResourceBdmgparam::needsParse,8,_ZThn632_NK4ksys3res11DamageParam10needsParseEv
0x0000007101097f64,sub_7101097F64,8, 0x0000007101097f64,sub_7101097F64,8,_ZThn664_N4ksys3res11DamageParamD1Ev
0x0000007101097f6c,sub_7101097F6C,40, 0x0000007101097f6c,sub_7101097F6C,40,_ZThn664_N4ksys3res11DamageParamD0Ev
0x0000007101097f94,getDamageRateTypes,428, 0x0000007101097f94,getDamageRateTypes,428,_ZN4ksys3res11DamageParam12DamageSource5text_Ei?
0x0000007101098140,j__ZdlPv_1173,4, 0x0000007101098140,j__ZdlPv_1173,4,_ZN4sead15FixedSafeStringILi75EED0Ev
0x0000007101098144,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE,240, 0x0000007101098144,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi75EEaSERKNS_14SafeStringBaseIcEE
0x0000007101098234,j__ZdlPv_1174,4, 0x0000007101098234,j__ZdlPv_1174,4,_ZN4sead19FixedSafeStringBaseIcLi75EED0Ev
0x0000007101098238,_ZN4sead15FixedSafeStringILi165EEaSERKNS_14SafeStringBaseIcEE,240, 0x0000007101098238,_ZN4sead15FixedSafeStringILi165EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead19FixedSafeStringBaseIcLi75EEaSERKNS_14SafeStringBaseIcEE
0x0000007101098328,getDamageReactionTypes,428, 0x0000007101098328,getDamageReactionTypes,428,_ZN4ksys3res11DamageParam10DamageSize5text_Ei?
0x0000007101098648,nullsub_4469,4,_ZN4ksys3res4Drop9doCreate_EPhjPN4sead4HeapE 0x0000007101098648,nullsub_4469,4,_ZN4ksys3res4Drop9doCreate_EPhjPN4sead4HeapE
0x000000710109864c,nullsub_4470,4,_ZThn632_N4ksys3res4Drop9doCreate_EPhjPN4sead4HeapE 0x000000710109864c,nullsub_4470,4,_ZThn632_N4ksys3res4Drop9doCreate_EPhjPN4sead4HeapE
0x0000007101098650,Bdrop::parse,1684,_ZN4ksys3res4Drop6parse_EPhmPN4sead4HeapE 0x0000007101098650,Bdrop::parse,1684,_ZN4ksys3res4Drop6parse_EPhmPN4sead4HeapE
@ -88916,7 +88916,7 @@
0x0000007101181824,sub_7101181824,372, 0x0000007101181824,sub_7101181824,372,
0x0000007101181998,sub_7101181998,8, 0x0000007101181998,sub_7101181998,8,
0x00000071011819a0,sub_71011819A0,8, 0x00000071011819a0,sub_71011819A0,8,
0x00000071011819a8,Bdmgparam::ctor,1808, 0x00000071011819a8,Bdmgparam::ctor,1808,_ZN4ksys3res11DamageParamC1Ev
0x00000071011820b8,EntryFactoryBdmgparam::dtor,68, 0x00000071011820b8,EntryFactoryBdmgparam::dtor,68,
0x00000071011820fc,EntryFactoryBdmgparam::dtorDelete,76, 0x00000071011820fc,EntryFactoryBdmgparam::dtorDelete,76,
0x0000007101182148,EntryFactoryBdmgparam::rtti1,132, 0x0000007101182148,EntryFactoryBdmgparam::rtti1,132,

Can't render this file because it is too large.

View File

@ -130,6 +130,8 @@ target_sources(uking PRIVATE
resResourceArchive.h resResourceArchive.h
resResourceAwareness.cpp resResourceAwareness.cpp
resResourceAwareness.h resResourceAwareness.h
resResourceDamageParam.cpp
resResourceDamageParam.h
resResourceDemo.cpp resResourceDemo.cpp
resResourceDemo.h resResourceDemo.h
resResourceDrop.cpp resResourceDrop.cpp

View File

@ -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

View File

@ -0,0 +1,155 @@
#include <agl/Utils/aglParameter.h>
#include <agl/Utils/aglParameterObj.h>
#include <container/seadBuffer.h>
#include <prim/seadEnum.h>
#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<agl::utl::Parameter<f32>> mDamageRateBuffer;
sead::Buffer<agl::utl::Parameter<sead::SafeString>> mDamageTypeBuffer;
public:
agl::utl::Parameter<sead::SafeString> mKeyString;
agl::utl::Parameter<bool> mBreakable;
agl::utl::Parameter<bool> mHammerAffect;
agl::utl::Parameter<bool> mWeakBreakerAffect;
agl::utl::Parameter<bool> mChemicalAttackAffect;
agl::utl::Parameter<f32> mSpAffectRatio;
agl::utl::Parameter<s32> mSpAffectDamage;
agl::utl::Parameter<bool> mVanishAffect;
agl::utl::Parameter<bool> mIsCriticalBlowOff;
agl::utl::Parameter<bool> mIsAcceptAtkImpulse;
agl::utl::Parameter<bool> mIsCommonCalcImpuleDamage;
agl::utl::Parameter<bool> mIsHeavyBreak;
agl::utl::Parameter<f32> mImpulseThresholdLv0;
agl::utl::Parameter<f32> mImpulseDamageLv0;
agl::utl::Parameter<f32> mImpulseThresholdLv1;
agl::utl::Parameter<f32> mImpulseDamageLv1;
agl::utl::Parameter<f32> mImpulseThresholdLv2;
agl::utl::Parameter<f32> mImpulseDamageLv2;
agl::utl::Parameter<f32> mImpulseThresholdLv3;
agl::utl::Parameter<f32> mImpulseDamageLv3;
agl::utl::Parameter<f32> mImpulseThresholdLv4;
agl::utl::Parameter<f32> mFallDamageStartHeight;
agl::utl::Parameter<s32> mFallDamageMin;
agl::utl::Parameter<f32> mFallDamagePerMeter;
agl::utl::Parameter<f32> mFallDamageHighStart;
agl::utl::Parameter<s32> mFallDamageHighPerMeter;
agl::utl::Parameter<f32> mFallDamageNoWaterDepth;
agl::utl::Parameter<sead::SafeString> mWeakPointBone;
agl::utl::Parameter<f32> mWeakPointCalcArea;
agl::utl::Parameter<sead::Vector3f> mWeakPointCalcOffset;
agl::utl::Parameter<f32> mWeakPointArea;
agl::utl::Parameter<sead::Vector3f> mWeakPointOffset;
agl::utl::Parameter<f32> mWeakPointRatio;
agl::utl::Parameter<bool> mWeakPointNoUIFlag;
agl::utl::Parameter<sead::SafeString> mWeakPointBone2;
agl::utl::Parameter<f32> mWeakPointCalcArea2;
agl::utl::Parameter<sead::Vector3f> mWeakPointCalcOffset2;
agl::utl::Parameter<f32> mWeakPointArea2;
agl::utl::Parameter<sead::Vector3f> mWeakPointOffset2;
agl::utl::Parameter<f32> mWeakPointRatio2;
agl::utl::Parameter<bool> mWeakPointNoUIFlag2;
agl::utl::Parameter<f32> mSillentKillMultRatio;
agl::utl::Parameter<s32> mSillentKillAddDamage;
agl::utl::Parameter<bool> mIsDeadBurnout;
agl::utl::Parameter<bool> mIsMetamorBurnout;
agl::utl::Parameter<bool> mIsMatamorFromTg;
agl::utl::Parameter<bool> mBurnable;
agl::utl::Parameter<s32> mBurnDamage;
agl::utl::Parameter<s32> mBurnDamage2;
agl::utl::Parameter<s32> mBurnDamage3;
agl::utl::Parameter<s32> mBurnDamage4;
agl::utl::Parameter<s32> mBurnDamage5;
agl::utl::Parameter<s32> mBurnTime;
agl::utl::Parameter<s32> mBurnDamageInterval;
agl::utl::Parameter<s32> mBurnContinuousDamage;
agl::utl::Parameter<bool> mBurnCritical;
agl::utl::Parameter<bool> mProofBurnAtSmallDamage;
agl::utl::Parameter<bool> mIsDeadIce;
agl::utl::Parameter<bool> mIsMetamorIce;
agl::utl::Parameter<bool> mIceable;
agl::utl::Parameter<s32> mIceDamage;
agl::utl::Parameter<s32> mIceTime;
agl::utl::Parameter<bool> mIceBreakableByAtk;
agl::utl::Parameter<f32> mIceBreakDamageRatio;
agl::utl::Parameter<bool> mIceCritical;
agl::utl::Parameter<bool> mProofIceAtSmallDamage;
agl::utl::Parameter<bool> mIsDeadElectric;
agl::utl::Parameter<bool> mIsMetamorElectric;
agl::utl::Parameter<bool> mElectricable;
agl::utl::Parameter<s32> mElectricDamage;
agl::utl::Parameter<s32> mElectricTime;
agl::utl::Parameter<bool> mElecCancelableByAtk;
agl::utl::Parameter<bool> mProofElecAtSmallDamage;
agl::utl::Parameter<bool> mWetAffect;
agl::utl::Parameter<bool> mLightningAffect;
agl::utl::Parameter<s32> mLightningDamage;
agl::utl::Parameter<bool> mGerudoHeroAffect;
agl::utl::Parameter<s32> mGerudoHeroDamage;
agl::utl::Parameter<s32> mGerudoHeroTime;
agl::utl::Parameter<bool> mGustAffect;
agl::utl::Parameter<f32> mDrownHeight;
agl::utl::Parameter<s32> mDrownDamage;
agl::utl::Parameter<s32> mColdWaterFrozenTime;
agl::utl::Parameter<bool> mColdWaterAffect;
agl::utl::Parameter<s32> mColdWaterDamage;
agl::utl::Parameter<s32> mColdWaterDamageInterval;
agl::utl::Parameter<f32> mColdWaterDamageStartDepth;
agl::utl::Parameter<s32> mColdWaterDamageIntervalDeep;
agl::utl::Parameter<f32> mColdWaterDamageDeepDepth;
agl::utl::Parameter<s32> mHotWaterBoiledTime;
agl::utl::Parameter<bool> mHotWaterHealAffect;
agl::utl::Parameter<s32> mHotWaterHeal;
agl::utl::Parameter<s32> mHotWaterHealInterval;
agl::utl::Parameter<f32> mHotWaterHealStartDepth;
agl::utl::Parameter<s32> mHotWaterHealIntervalDeep;
agl::utl::Parameter<f32> mHotWaterHealDeepDepth;
agl::utl::Parameter<bool> mHotWaterChemCrit;
agl::utl::Parameter<bool> mPoisonBogAffect;
agl::utl::Parameter<s32> mPoisonBogDamage;
agl::utl::Parameter<s32> mPoisonBogDamageInterval;
agl::utl::Parameter<bool> mLavaAffect;
agl::utl::Parameter<s32> mLavaDamage;
agl::utl::Parameter<s32> mLavaDamageInterval;
agl::utl::Parameter<f32> mLavaDeepDepth;
agl::utl::Parameter<s32> mLavaDeepDamage;
agl::utl::Parameter<bool> mCurseAffect;
agl::utl::Parameter<s32> mCurseDamage;
agl::utl::Parameter<s32> mCurseInterval;
agl::utl::Parameter<s32> mCurseContinuousDamage;
agl::utl::Parameter<s32> mHeavySnowColdTime;
};
} // namespace ksys::res