1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#include "KingSystem/Physics/Ragdoll/physRagdollConfig.h"
#include "KingSystem/Resource/Actor/resResourceRagdollConfig.h"
namespace ksys::phys {
RagdollConfig::PartImpulseInfo::ReceiveObj::ReceiveObj()
: mTypeName({"null"}, "TypeName", "適用するラグドール剛体名", this),
mDivideFlag(false, "DivideFlag", "インパルスを親子に分散させるか", this),
mImpulseRate(1.0, "ImpulseRate", "インパルスの適用比率", this),
mDivideRate(0.5, "DivideRate", "親子へのインパルス分配比率", this) {}
RagdollConfig::PartImpulseInfo::ImpulseObj::ImpulseObj()
: mTypeName({""}, "TypeName", "適用するラグドール剛体名", this),
mUseFlag(false, "UseFlag", "このスロットのインパルス情報を使うかどうか", this),
mAttackVector({0, 0, 0}, "AttackVector", "インパルスの方向", this),
mAttackPoint({0, 0, 0}, "AttackPoint", "インパルスを与える点", this),
mImpulsePower(0.1, "ImpulsePower", "インパルスの強さ", this) {}
RagdollConfig::PartImpulseInfo::PartImpulseInfo()
: mIsUseReceiveImpulse(true, "IsUseReceiveImpulse", "攻撃インパルスを反映させるかどうか",
&mObj),
mIsUseFixedImpulse(true, "IsUseFixedImpulse", "固定インパルスを反映させるかどうか", &mObj) {
for (int i = 0; i < res::RagdollConfig::cNumReceiveObjs; ++i) {
sead::FormatFixedSafeString<128> name("ReceiveObj%02d", i + 1);
addObj(&mReceiveObjs(i), name);
}
for (int i = 0; i < res::RagdollConfig::cNumImpulseObjs; ++i) {
sead::FormatFixedSafeString<128> name("ImpulseObj%02d", i + 1);
addObj(&mImpulseObjs(i), name);
}
addObj(&mObj, "PartImpulseData");
}
RagdollConfig::ImpactImpulseInfo::ImpactImpulseInfo() {
for (int i = 0; i < NumParts; ++i) {
sead::FormatFixedSafeString<128> name("PartImpulseInfo%02d", i + 1);
addList(&mPartImpulseInfo[i], name);
sead::FormatFixedSafeString<32> use_flag_name("UseFlag%02d", i + 1);
mUseFlags[i].init(true, use_flag_name, "攻撃インパルスを反映させるかどうか", &mObj);
}
addObj(&mObj, "ImpactImpulseData");
}
RagdollConfig::RagdollConfig()
: agl::utl::IParameterIO("rgconfig", 0),
mImpulseUseRate(0.5, "ImpulseUseRate", "攻撃インパルスの混合率", &mObj),
mImpulsePower(0.1, "ImpulsePower", "インパルスの強さ", &mObj),
mLargeAttackRate(1.5, "LargeAttackRate", "大攻撃のインパルス倍率", &mObj),
mBlastOffAttackRateSmall(2.0, "BlastOffAttackRateSmall", "小攻撃のふっ飛ばしインパルス倍率",
&mObj),
mBlastOffAttackRateLarge(3.0, "BlastOffAttackRateLarge", "大攻撃のふっ飛ばしインパルス倍率",
&mObj),
mSpecialAttackRate(10.0, "SpecialAttackRate", "特殊攻撃のふっ飛ばしインパルス倍率", &mObj) {
for (int i = 0; i < mImpactImpulseInfo.size(); ++i) {
sead::FormatFixedSafeString<128> name("ImpactImpulseInfo%02d", i + 1);
addList(&mImpactImpulseInfo[i], name);
}
addObj(&mObj, "AttackTypeImpulseData");
}
RagdollConfig::~RagdollConfig() = default;
const RagdollConfig::PartImpulseInfo& RagdollConfig::getImpulseInfo(u32 impact_idx,
int part_idx) const {
return mImpactImpulseInfo.getBufferPtr()[impact_idx].getPartImpulseInfo()(part_idx);
}
float RagdollConfig::getImpulsePower(int attack_rate_type, bool is_blast_off) const {
switch (attack_rate_type) {
case 0:
if (!is_blast_off)
return *mImpulsePower;
return *mImpulsePower * *mBlastOffAttackRateSmall;
case 1:
if (!is_blast_off)
return *mImpulsePower * *mLargeAttackRate;
return *mImpulsePower * *mBlastOffAttackRateLarge;
case 2:
return *mImpulsePower * *mBlastOffAttackRateLarge;
case 3:
return *mImpulsePower * *mSpecialAttackRate;
default:
return 0.0;
}
}
} // namespace ksys::phys
|