先取出一段近战武器最重要def数据文件。和远程武器不同,这里没有子弹类,也找不到damage相关的def,第一眼看上去唯一可能与伤害计算有关的就是tools中有个stab,blunt,poke,这三个单词都和伤害相关。
MeleeWeapon_Spear
A polearm tipped with a sharp point for stabbing opponents.
Things/Item/Equipment/WeaponMelee/Spear
Graphic_Single
Neolithic
NeolithicMeleeAdvanced
MedievalMeleeAdvanced
75
RewardStandardQualitySuper
12000
2
-25
Metallic
Woody
Blunt
Poke
13
2.6
Stab
23
0.50
2.6
LongBlades
4
首先我们要弄明白这三个值在C#中对应的class
而ToolCapacityDef中仅有两个数据,Maneuvers,VerbProperties。
但我们追查xml文件,ToolCapacityDef却是这样:
几乎没什么数据
SR_RC_Cut
SR_RC_Stab
而ManeuverDef则似乎包含了我们需要的数据
SR_Maneuver_Cut
SR_RC_Cut
Verb_MeleeAttackDamage
SR_Damage_Cut
MeleeAttack
Maneuver_Slash_MeleeHit
Maneuver_Slash_MeleeDeflect
Maneuver_Slash_MeleeMiss
Maneuver_Slash_MeleeDodge
SR_Maneuver_Stab
SR_RC_Stab
Verb_MeleeAttackDamage
SR_Damage_Stab
MeleeAttack
Maneuver_Stab_MeleeHit
Maneuver_Stab_MeleeDeflect
Maneuver_Stab_MeleeMiss
Maneuver_Stab_MeleeDodge
看一眼这里恍然大悟,ToolCapacityDef仅仅是用来枢纽ManeuverDef,而ManeuverDef中则包含了战斗日志相关以及verb组件。而伤害计算相关则在verb中被调用。verb中的meleeDamageDef参数的class实际上就是个DamageDef,所以修改这里就可以实现自定义的武器伤害类别,buff效果。
关于ManeuverDef的底层调用顺序,我大概说一下,需要仔细研究的话要追源码。
1.创建角色或者复活角色
Verse.PawnGenerator.TryGenerateNewPawnInternal(ref PawnGenerationRequest, out string, bool, bool) : Pawn @06001218
RimWorld.ResurrectionUtility.Resurrect(Pawn) : void @06004245
2.在1的过程中为小人创建所有控制器,其中包含我们需要的VerbTracker,管理小人身上的verb组件相关
RimWorld.PawnComponentsUtility.CreateInitialComponents(Pawn) : void @06004129
3.绑定角色与verb控制器
Verse.VerbTracker..ctor(IVerbOwner) : void @060021E1
4.初始化与更新控制器,除此之外带有CompEquippable组件的可装备物品会为角色提供额外的verb动作,我们的近战武器就属于这一类,默认的是小人基础动作,比如赤手空拳。
Verse.VerbTracker.InitVerbs(Func) : void @060021E8
Verse.VerbTracker.VerbsTick() : void @060021E2
Verse.Pawn_EquipmentTracker.EquipmentTrackerTick() : void @060012BB(装备中的额外verb)
5.调用verb的过程,不同的verb会重写该方法。
Verse.Verb.TryCastNextBurstShot() : void @060021BF
Verse.Verb.TryCastShot() : bool @060021C1
以RimWorld.Verb_MeleeAttack.TryCastShot() : bool @06006082为例,近战的verb过程中实现了伤害机制计算,装备效果影响,闪避,反击,战斗技能熟练度获取,战斗日志等等。