RimWorld

RimWorld

Range Animal Framework
 This topic has been pinned, so it's probably important
Hatena  [developer] 21 Apr, 2024 @ 4:55pm
(Modder向け)Range Animal Frameworkの利用ガイド
このModは動物のThingDefに<verbs>の記述を足すだけで、動物に遠距離攻撃を持たせることができます。
<verbs>の記述については、銃などの遠距離武器を参考にしてください。

<verbs> <li> <!-- verb --> </li> </verbs>
Last edited by Hatena; 21 Apr, 2024 @ 4:56pm
< >
Showing 1-8 of 8 comments
Hatena  [developer] 21 Apr, 2024 @ 4:56pm 
ただし、このときいくつか注意点があります。
遠距離武器の記述をそのまま持ってくると、命中率とクールダウン時間の設定がありません。
これは武器の場合、<statBases>に記述されているからです。
なので<statBases>の記述を以下のように変化させ、<verbs>に入れます。

<AccuracyTouch>0.80</AccuracyTouch> <AccuracyShort>0.75</AccuracyShort> <AccuracyMedium>0.45</AccuracyMedium> <AccuracyLong>0.35</AccuracyLong> <RangedWeapon_Cooldown>1.6</RangedWeapon_Cooldown>

<accuracyTouch>0.80</accuracyTouch> <accuracyShort>0.75</accuracyShort> <accuracyMedium>0.45</accuracyMedium> <accuracyLong>0.35</accuracyLong> <defaultCooldownTime>1.6</defaultCooldownTime>

v1.5以降では、爆発系の攻撃に命中率の設定は必要ありません。
元々<verbs>に設定されているはずの<forcedMissRadius>が動作します。
Last edited by Hatena; 21 Apr, 2024 @ 5:12pm
Hatena  [developer] 21 Apr, 2024 @ 4:57pm 
また、少なくともv1.5以降ではバニラで戦闘ログを生成するときに、武器のnullチェックが入るため、ProjectileののThingDefで<thingClass>を変更する必要はありません。
以前はエラー回避のためのDef・クラスがありましたが、廃止されました。
もし、あなたがそれを利用していた場合は変更してください。
Hatena  [developer] 21 Apr, 2024 @ 4:57pm 
<verbClass>がVerb_ShootBeamまたはVerb_ArcSprayIncineratorの場合、nullチェックが無いためエラーが発生します。
この対処として「AnimalRangeAttack.Verb_ShootBeam」、「AnimalRangeAttack.Verb_ArcSprayIncinerator」を用意してあるので、こちらをご利用ください。


もしあなたがオリジナルのVerbやProjectileを作成するときは武器のnullチェックを忘れないようにしてください。
多くの場合、EquipmentSource.defで武器を取得しようとしますが、動物は通常武器を持てないためnullエラーが発生します。
Last edited by Hatena; 21 Apr, 2024 @ 4:58pm
Hatena  [developer] 21 Apr, 2024 @ 4:59pm 
Tips
動物に複数の遠距離攻撃を持たせたいですか?
OK、それも簡単に実装できますよ。


距離に応じて攻撃を変化させたい場合は以下のように記述するだけです。

<verbs> <li> <!-- first verb --> </li> <li> <!-- second verb --> </li> </verbs>

このとき、射程(range)が短い攻撃を上に記述してください。
なぜならverbを探すとき、上から優先して探すからです。
Last edited by Hatena; 21 Apr, 2024 @ 4:59pm
Hatena  [developer] 21 Apr, 2024 @ 5:00pm 
v1.5からは細かなオプションとして、DefModExtensionを用意しました。
DefModExtensionの設定もxmlに記述を足すだけで簡単に実装できます。



同距離で複数の攻撃を設定することができます(近接攻撃のように)

従来は最大射程から有効なVerbを探す都合上、ある一定の距離においては特定のVerbが必ず選ばれる仕様でした。
しかし、<allowRandomVerb>をtrueに設定することで、Verbに設定されている<commonality>に応じて、ランダムに選ばれるようになります。
(<commonality>のデフォルト値は1で数字が大きいほど選ばれやすくなります)

<verbs> <li> <!-- first verb --> <commonality>1<commonality> <range>19.9</range> </li> <li> <!-- second verb --> <commonality>0.5<commonality> <minRange>9.9</minRange> <range>36.9</range> </li> </verbs> <modExtensions> <li Class="AnimalRangeAttack.ARADefModExtension"> <allowRandomVerb>true</allowRandomVerb> </li> </modExtensions>

例えばこのようなDefになっている場合、距離9.9~19.9の間では、1:0.5の割合でfirst verbとsecond verbが選ばれるという仕様になります。


<allowRandomVerb>はデフォルトではfalseになっているため、設定されていない動物のVerb選択は従来のままです。
Last edited by Hatena; 21 Apr, 2024 @ 5:01pm
Hatena  [developer] 21 Apr, 2024 @ 5:02pm 
動物たちは遠距離攻撃をするときに、積極的に遮蔽を利用しようとします。
これは戦術的には正しい行動ですが、もし巨大な体を持つ絶対強者のような生物が遮蔽に身を潜めながら攻撃していたらどう思いますか?
賢いけどダサい、と私は思います。
ということで<wantCover>という項目を用意しました。

<modExtensions> <li Class="AnimalRangeAttack.ARADefModExtension"> <allowRandomVerb>true</allowRandomVerb> <wantCover>false</wantCover> </li> </modExtensions>

<wantCover>をfalseにすることで、遮蔽を利用しなくなります。
また、<wantCover>のデフォルト値はtrueであるため、こんな設定はいらないと思うのであれば、DefModExtensionの記述は必要ありません。
Hatena  [developer] 21 Apr, 2024 @ 5:03pm 
ここまでのDefModExtensionはThingDefに対するオプションでしたが、PawnKindDefにも1つ用意しました。

<modExtensions> <li Class="AnimalRangeAttack.ARADefModExtension"> <allowRangeAttackOfRace>false</allowRangeAttackOfRace> </li> </modExtensions>

PawnKindDefにこの記述を加えることで、ThingDefとしては遠距離攻撃を持っているが、PawnKindDefでは遠距離攻撃を使用できない設定ができるようになりました。
つまり種族としては遠距離攻撃を持っているが、PawnKindDefによってそれを使えたり使えなかったりする、ということです。

ある意味ではハズレPawnとも言えますが、DLLを作れるのであればPawnKindDefは後からでも変更できるので、覚醒みたいな仕様も作れそうです。

<allowRangeAttackOfRace>もデフォルト値はtrueなので、この機能が必要ない場合は記述しなくてもOKです。
Last edited by Hatena; 21 Apr, 2024 @ 5:04pm
Hatena  [developer] 21 Apr, 2024 @ 5:05pm 
Range Animal Frameworkの機能は以上です。
他に何か機能の要望があれば、コメントしてください。
実現できるかは約束できませんが検討はします。

現時点でポケモンバトルのような複数の攻撃の中から特定の攻撃を指示する、といった機能を実装する気はありません。
< >
Showing 1-8 of 8 comments
Per page: 1530 50