本讲以LongSword【长剑】讲解一把最简单的近战武器如何制作。而复杂的部分要留在本章的后面几讲来剖析。
考虑到很多人喜欢做武器,甚至可能跳过前面的片段直接看到本章节,让我们重新复习一下如何从0开始制作mod。
首先启动合适的编辑器,找到文件内查找功能,
路径设置为这游戏的简中翻译包(Steam\steamapps\common\RimWorld\Data\Core\Languages\ChineseSimplified (简体中文).tar,注意需要解压)
查找内容为长剑
能看到搜索结果
如果你不确定哪个是长剑物品,哪个是长剑相关的其他东西(比如合成配方,研究项目之类的),就去看搜索结果所在的文件位置,肯定是要在ThingDef里面的。
经过上述操作,我们就能得到长剑的defName:MeleeWeapon_LongSword
再次搜索该defName,我们就能找到长剑def所在的xml文件了
接下来我们看到Core/ThingDefs_Misc/Weapons/MeleeMedieval.xml,line120开始就是长剑了
但在一切开始之前,我们从ParentName="BaseMeleeWeapon_Sharp_Quality"开始,不断追溯父定义。
首先BaseMeleeWeapon_Sharp_Quality这一层让武器有了品质的区分
找到一个合适的父定义能省不少事,我稍微列一下
BaseMeleeWeapon_Sharp_Quality:有品质和艺术区分的锐器近战武器
BaseMeleeWeapon_Blunt_Quality:有品质和艺术区分的钝器近战武器
上面这两个父级是:
BaseMeleeWeapon_Sharp:没有品质和艺术区分的锐器近战武器
BaseMeleeWeapon_Blunt:没有品质和艺术区分的钝器近战武器
上面两个父级是:
BaseMeleeWeapon:没有锐器和钝器来区分,需要手动填写weaponClasses,同时也少了合成材料的筛选,一般来说不会用到这一个,用上面四种就够了。这一级提供了近战武器相关的基础东西,但我就不细讲了,你们直接拿来用就可以。
再往父级找,就是BaseWeapon
它有一个非常重要的comp就是CompEquippable。如果处于什么原因你不想直接使用原版的这些父定义,请一定记得要把thingClass改为ThingWithComps及其子类,然后加上这一个comp。
就是这个Comp使得你的武器可以被小人拿在手上。
哦对了,这个父定义还提到了武器扔在地上会有最高35°的随机旋转角度
好了,现在开始正式地分析长剑
<ThingDef ParentName="BaseMeleeWeapon_Sharp_Quality">
<defName>MeleeWeapon_LongSword</defName>
<label>longsword</label>
<description>The ancient weapon of kings, the longsword can be used for slashing or stabbing.</description>
<possessionCount>1</possessionCount>
<graphicData>
<texPath>Things/Item/Equipment/WeaponMelee/LongSword</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<techLevel>Medieval</techLevel>
<weaponTags>
<li>MedievalMeleeAdvanced</li>
<li>LongSword</li>
</weaponTags>
<costStuffCount>100</costStuffCount>
<thingSetMakerTags><li>RewardStandardQualitySuper</li></thingSetMakerTags>
<statBases>
<WorkToMake>18000</WorkToMake>
<Mass>2</Mass>
</statBases>
<relicChance>2</relicChance>
<equippedAngleOffset>-65</equippedAngleOffset>
<stuffCategories>
<li>Metallic</li>
<li>Woody</li>
</stuffCategories>
<tools>
<li>
<label>handle</label>
<capacities>
<li>Blunt</li>
</capacities>
<power>9</power>
<cooldownTime>2</cooldownTime>
</li>
<li>
<label>point</label>
<capacities>
<li>Stab</li>
</capacities>
<power>23</power>
<cooldownTime>2.6</cooldownTime>
</li>
<li>
<label>edge</label>
<capacities>
<li>Cut</li>
</capacities>
<power>23</power>
<cooldownTime>2.6</cooldownTime>
</li>
</tools>
<recipeMaker>
<researchPrerequisite>LongBlades</researchPrerequisite>
<skillRequirements>
<Crafting>5</Crafting>
</skillRequirements>
<displayPriority>420</displayPriority>
</recipeMaker>
</ThingDef>
我们只看重要的几个东西
>weaponTags:一个字符串的list,如果敌人拥有相同的weaponTag,那么敌人在生成时就有可能选择该武器。
>equippedAngleOffset:武器的旋转角度,顺时针为正方向。该旋转只在小人手持时生效,在地上是不生效的。
>equippedDistanceOffset:这条长剑没有,我就顺带补充一下,表示的是手持时武器贴图的偏移量,填的内容是格数。偏移方向由小人瞄准方向决定。
>tools:近战的重头戏,它是一个list,内容是若干个Tool,接下来我们详细讲一下Tool
<tools>
<li>
<label>handle</label>
<capacities>
<li>Blunt</li>
</capacities>
<power>9</power>
<cooldownTime>2</cooldownTime>
</li>
<li>
<label>point</label>
<capacities>
<li>Stab</li>
</capacities>
<power>23</power>
<cooldownTime>2.6</cooldownTime>
</li>
<li>
<label>edge</label>
<capacities>
<li>Cut</li>
</capacities>
<power>23</power>
<cooldownTime>2.6</cooldownTime>
</li>
</tools>
这里就是游戏里长剑对应的三个Tools
>>label:填一个文本,可以翻译。
>>capacities:填一些“ToolCapacityDef”,一般情况下只填一个,多个的话就是每次攻击时选一个。后文会列出常用的ToolCapacityDef。
>>power:单次攻击基础伤害。这个伤害还会受到很多因素影响,从而造成最终伤害。比如武器品质,武器材质什么的都会影响。
>>cooldownTime:近战后摇,也会受到很多因素影响。单位是秒。
再补充一些额外的东西。
>>armorPenetration:伤害穿透。在默认情况下,其值为伤害的0.015倍。手动指定时,就是指定的值,并且会乘以“MeleeWeapon_DamageMultiplier”【近战伤害乘数】
>>chanceFactor:权重乘数,每个tool的基础权重由其单次伤害决定,然后会再乘以这个值,默认值是1。
>>soundMeleeHit:填一个SoundDef,表示命中之后播放该音效。
>>soundMeleeMiss:填一个SoundDef,表示没有命中时播放的音效。
>>extraMeleeDamages:ExtraDamage的List,表示额外伤害,这里再引入一个新的例子。MeleeWeapon_PlasmaSword等离子剑的Tools内:
<li>
<label>point</label>
<capacities>
<li>Stab</li>
</capacities>
<power>21</power>
<cooldownTime>2.6</cooldownTime>
<extraMeleeDamages>
<li>
<def>Flame</def>
<amount>10</amount>
<chance>0.5</chance>
</li>
</extraMeleeDamages>
</li>
<li>
<label>edge</label>
<capacities>
<li>Cut</li>
</capacities>
<power>21</power>
<cooldownTime>2.6</cooldownTime>
<extraMeleeDamages>
<li>
<def>Flame</def>
<amount>10</amount>
<chance>0.5</chance>
</li>
</extraMeleeDamages>
</li>
看到这里的extraMeleeDamages里的元素,每个代表一种额外伤害的属性
>>>def:填一个DamageDef,Flame是那个带点燃的烧伤,详细可以看我另一个文章【RimWorld 代码机制:伤害机制与伤害类型】
>>>amount:伤害量,跟上面的amount类似
>>>armorPenetration:穿甲,跟上面的armorPenetration类似,不填的话也是自动生成
>>>chance:默认值是1,如果填了的话就是填0~1,表示该额外伤害的触发概率
综上所述,等离子剑的效果就是,当使用剑头或剑刃进行攻击时,有50%概率触发额外的10点火焰伤害,该伤害会引燃目标。
如果有extraMeleeDamages有多个元素,就会分别进行判定
需要注意的是,必须主攻击命中了,额外伤害才会开始判定。
这里再给一些capacities里能填的东西:
Stab【刺】,Cut【割】,Blunt【钝击】,Demolish【拆除】,KickMaterialInEyes【扬沙】,Poke【捅】,Scratch【抓】,ScratchToxic【毒击】,Bite【咬】,ToxicBite【蛰】
比如edge+Cut在上面长剑的页面写的是剑刃(割)
这些capacities具体的细节我们在后续有机会再分析。
我得提一下,所有加群的人必须查看群公告,然后按照指定的规则来提问。
提问的时候必须附上你的代码和游戏给你的报错内容。
不要忽视红字在解决问题时的重要性,它能提供最直观的错误信息。
也不要把你的代码藏着掖着,在看不到你的代码的情况下解答者只能用猜的。
我的教学工作和答疑工作都是无偿的,就请给到我基本的尊重,我不是你解答问题的工具。