2016年7月6日水曜日

[Modding]Winter MOD作成記録(5) 雪による地形効果と雪玉の実装


本稿は、Winter MODの作成過程を記録したものです。

今回は、雪に覆われた土地(snow covered land)とお遊びアイテムの雪玉を実装します。



今回実装する項目

今回実装するのは、
・移動を阻害する雪の地形効果
・雪のあるところで作成出来て、投擲武器になる雪玉
です。

今までの実装項目と比べ、システムの深い部分に踏み込んだ項目なので
作業もほんの少し手間の掛かるものになっています。

ソースは極力詳しく記述しますが、
battlemovesテーブルのリファレンスを参照するとより理解できるかもしれません。


実装するための仕様を固める

今回の実装に必要な要素は、
・hex上に配置されるアイテムとしての"snow covered land"
・"snow covered land"から発生するconditionによる移動阻害効果
・"snow covered land"から生成できるアイテム"snowball"
・"snowball"の武器としての効果/コマンド
です。これらを順に実装し、方法を模索していきます。


"地形"の実装

まずは"snow covered land"の実装です。
作成のモデルはlakeなどのterrain resourceを参考にしました。

<table name="itemtypes">
    <column name="id">929</column>
    <column name="nGroupID">203</column>
    <column name="nSubgroupID">3</column>
    <column name="strName">terrain resource</column>
    <column name="strDesc">
        snow covered land - &quot;use&quot; or &quot;craft&quot; to correct snow</column>
    <column name="strDescAlt"></column>
(中略)
    <column name="aPossessConditions">200=1012</column>
    <column name="aUseConditions">211=1011</column>
    <column name="aCapacities"></column>
    <column name="vEquipSlots"></column>
    <column name="vUseSlots">211</column>
(中略)
    <column name="vProperties">900,913</column>
(以下略)

strDescには"use"もしくは"craft"で雪玉が作成できることを記述しました。

aPossessConditionsに、この地形にいる間付加されるconditionを、
aUseConditionsには使用時にsnowballを生成するためのconditionを指定します。

また、クラフト素材としても扱うため、vPropertiesには
"900(frozen)""913(land resource,新規)"を指定しました。

地形効果の実装

まず、前項で指定したid:1012のconditionを作成します。
<table name="conditions">
    <column name="id">1012</column>
    <column name="strName">Standing in snowy land</column>
    <column name="strDesc">&lt;us&gt; is standing in slippery snow.</column>
(以下略)

と言っても、condition自体はただのフラグとして使うため、
上記の3column以外はハリボテで構いません。
これでsnow covered landのあるhexに入った時にメッセージが表示されます。

このcondition自体に移動阻害効果(移動コスト増加など)を付ける方法もありますが、
マップ上で視認できない状態では、かなりのストレスになってしまいます。

そこで、このconditionが付加されている=雪の上に立っている場合は、
戦闘時の移動コマンドを変更し、転ぶ確率をわずかに上昇させることにしました。

元のコマンド("0"フォルダ)
<table name="battlemoves">
    <column name="id">6</column>
    <column name="strID">90.31</column>
    <column name="strName">Run!</column>
    <column name="strNotes"></column>
(中略)
    <column name="vChanceType">0,0,0</column>
    <column name="vUsConditions">[-137,0,0],[147,0,0],[155,0,0],[339,0,0],[737,0,0]</column>
    <column name="vThemConditions"></column>
    <column name="vPairConditions">[209,0,0],[209,0,0],[209,7,0],[209,7,0],[159,4,2]</column>
    <column name="vUsFailConditions"></column>
    <column name="vThemFailConditions"></column>
    <column name="vPairFailConditions"></column>
    <column name="vUsPreConditions">-66,-56,-55,-143,-144,-148,-145,-146,-190,-191,-367,-390,-464,-477,WinterMod:-1012</column>
    <column name="vThemPreConditions"></column>
(以下略)

元のコマンドの変更箇所はvUsPreConditionsにおいて、
先ほどのid:1012のconditionを付加されていないという前提条件のみです。

追加したコマンド(MODフォルダ)
<table name="battlemoves">
    <column name="id">101</column>
    <column name="strID">207.1</column>
    <column name="strName">Run! (in snow)</column>
    <column name="strNotes"></column>
(中略)
    <column name="vChanceType">0,0,0</column>
    <column name="vUsConditions">[0:-137,0,0],[0:147,0,0],[0:155,0,0],[0:339,0,0],[0:737,0,0]</column>
    <column name="vThemConditions"></column>
    <column name="vPairConditions">[0:209,0,0],[0:209,0,0],[0:209,7,0],[0:209,7,0],[0:159,4,4]</column>
    <column name="vUsFailConditions"></column>
    <column name="vThemFailConditions"></column>
    <column name="vPairFailConditions"></column>
    <column name="vUsPreConditions">0:-66,0:-56,0:-55,0:-143,0:-144,0:-148,0:-145,0:-146,0:-190,0:-191,0:-367,0:-390,0:-464,0:-477,1012</column>
            <column name="vThemPreConditions"></column>
(以下略)

追加コマンドの変更点は、0:の追記はもちろんですが
vUsPreConditionsの条件を逆に、id:1012のconditonを付加されていることとし、
vPairConditionsにおいて、
condition:159(Tripped)の発生確率であるfChanceの値を2から4に変更しました。

数値としては倍ですが、もともと低確率なTrippedなので、
目に見えて転びやすくなったとは言えない程度の微修正です。
過酷さを演出するなら、これに加えてfFatigue(スタミナ消費)を弄るのも良さそうです。

あとは、この作業を移動系コマンド9種類(Run!を含む)に適用します。
※cover状態での移動コマンドなどは含んでいません。
また、内部的にAdvanceが2種類あるので忘れないように注意してください。

さらに、(in snow)系統のコマンド用にアイコンを用意し、
itemtypesテーブルで全コマンド分のアイコンを作成する必要があります。
strIDも忘れずに指定して、作成したテーブルを参照できるようにしておきます。


雪玉作成機能の追加

雪玉作成のためのconditionは、順序としては前後しますが
"snow covered land"作成時にaUseConditionsで指定しています。
<table name="conditions">
    <column name="id">1011</column>
    <column name="strName">Gather snow from land.</column>
    <column name="strDesc">&lt;us&gt; gathered snow from snow covered land.</column>
    <column name="aFieldNames"></column>
    <column name="aModifiers"></column>
    <column name="aEffects">AddItemGround=934,0,0,0;</column>
    <column name="bFatal">0</column>
(以下略)

これで"snow covered land"を"use"すると、
id:934のtreasuretableの中身が生成されます。
<table name="treasuretable">
    <column name="id">934</column>
    <column name="strName">gathered snow</column>
    <column name="aTreasures">206.7x1.0x3</column>
    <column name="bNested">0</column>
    <column name="bSuppress">0</column>
    <column name="bIdentify">0</column>
</table>
テーブルの中身はもちろんsnowball(x3)です。

さらに、クラフトでsnowballが生成できるように設定します。
<table name="ingredients">
    <column name="nID">917</column>
    <column name="strName">snow covered land</column>
    <column name="strRequiredProps">900&amp;913</column>
    <column name="strForbidProps"></column>
</table>
前項で設定したプロパティで、"snow covered land"を素材として定義します。

<table name="recipes">
    <column name="nID">919</column>
    <column name="strName">snow covered land resources</column>
    <column name="strSecretName"></column>
    <column name="strTools">1x917</column>
    <column name="strConsumed"></column>
    <column name="strDestroyed"></column>
    <column name="nTreasureID">934</column>
(以下略)

素材は"snow covered land"のみで、
生成物は先ほどのtreasuretableを指定します。


雪玉の使用効果の実装

いよいよsnowball本体を作成していきます。

<table name="itemtypes">
    <column name="id">927</column>
    <column name="nGroupID">206</column>
    <column name="nSubgroupID">7</column>
    <column name="strName">ammo</column>
    <column name="strDesc">snowball</column>
    <column name="strDescAlt">snowball</column>
(中略)
    <column name="fDurability">1</column>
    <column name="fDegradePerHour">0.05</column>
    <column name="fEquipDegradePerHour">0</column>
    <column name="fDegradePerUse">0</column>
    <column name="vDegradeTreasureIDs">0:3,0:3</column>
    <column name="aEquipConditions">21=1010,20=1010</column>
(以下略)

今回の仕様では、雪玉はスタックせずに
持っている間のみ専用の戦闘コマンドを追加するものとしました。
これは、NPCが雪玉を手に入れたときに投擲させやすくするための仕様でもあります。

ここではaEquipConditionsで雪玉を手に持った際、フラグ用conditionを付加しています。
次は、投擲用コマンドの中身を作成します。
<table name="battlemoves">
    <column name="id">100</column>
    <column name="strID">207.0</column>
    <column name="strName">Throw Snowball</column>
    <column name="strNotes"></column>
    <column name="strSuccess">&lt;us&gt; thrown snowball at &lt;them&gt;...and hits!</column>
    <column name="strFail">&lt;us&gt; thrown snowball at &lt;them&gt;...but misses!</column>
    <column name="strPopUp">Throw Snowball
Throw snowball on target.
Must see target.
Low chance of making you vulnerable.
Chance of being detected if hidden.
Chance of make enemy chill if hits.</column>
    <column name="vChanceType">0,2,1</column>
    <column name="vUsConditions"></column>
    <column name="vThemConditions">[1009,0,0]</column>
    <column name="vPairConditions"></column>
    <column name="vUsFailConditions">[0:147,0,0.2]</column>
    <column name="vThemFailConditions"></column>
    <column name="vPairFailConditions"></column>
    <column name="vUsPreConditions">1010,0:-188,0:-158,0:-144,0:-148,0:-145,0:-146</column>
(中略)
    <column name="nMinRange">1</column>
    <column name="nMaxRange">5</column>
    <column name="nAttackModeType">-1</column>
(以下略)

命中判定ロール(vChanceType)は遠隔攻撃のものを使用し、
命中時にid:1009のconditionを付加(vThemConditions)します。
前提条件(vUsPreConditions)として、先ほどのid:1010と、
RecoveringやStunnedなど、一般的な行動阻害状態でないことを指定しておきます。

射程距離(nMinRangeおよびnMaxRange)は1~5としました。

<table name="conditions">
    <column name="id">1009</column>
    <column name="strName">Covered with snow</column>
    <column name="strDesc">&lt;us&gt;'s body is covered with snow.</column>
    <column name="aFieldNames">fCoreTemp</column>
    <column name="aModifiers">-2</column>
    <column name="aEffects"></column>
    <column name="bFatal">0</column>
    <column name="vIDNext">0</column>
    <column name="fDuration">2</column>
(以下略)

最後は、命中時に付加されるconditionです。
中身はシンプルに、体温(fCoreTemp)を短時間下げるだけのものにしました。
地味な効果ですが、雪玉が壊れるまで投げられるうえに
重複すれば装甲の厚い相手にも効果があるため、長期戦覚悟なら一応使えます。


実装項目の動作確認

あとは機能の動作確認です。


ランダムなhexに、"snow covered land"が生成されています。
マップでは確認できませんが、移動時にメッセージが表示されます。


"使用"もしくはクラフトするとsnowballが3つ生成されます。


その場で戦闘に入ると、移動系コマンドがすべて変更されます。
スリップ率は気持ち程度の変更なので、転ばないときは案外転びません。


snowball装備時の特殊コマンドです。
当たれば少しだけ体温を下げる効果があります。
低体温による死亡を狙うにはかなり時間が掛かるため、実用性はありません。


今回のまとめ

今回は、雪による地形効果を実装してみました。
あえて戦闘時のみ影響するようにしましたが、
移動時やキャンプに影響を与える設定でも面白いかもしれません。

ただ、今回は雪の積もったエリアが可視化されていないので、
移動時のペナルティを付けるなら雪のないHexと雪のあるHexを個別に実装して、
雪の深いところを避けて歩くことができるように調整したほうがいいでしょう。


snowballが投擲武器でない理由は、敵に持たせて使わせたかったからですが、
突貫で実装したためバグが取れず結局雪玉だけが残った、という経緯があります。

今回の仕様を応用するなら、雪のあるhexで
"雪玉を作る"→"雪玉を投げる"というアクションを追加しても表現できそうです。


未実装部分については次回に枠を取って紹介しますが、
実装した項目については今回で最後になります。

ぶつ切りの説明で分かりづらかったかもしれませんが、
"実際にこういうことが出来ました"という参考用の資料としてお使いください。


(6) 実装しなかった項目の紹介へ

0 件のコメント:

コメントを投稿