本稿は、Winter MODの作成過程を記録したものです。
今回は、寒さの表現方法として、いくつかの飲料系アイテムの"凍結"を実装していきます。
今回実装する項目
まずは、前回出したアイデアから、"水・飲料の凍結"に関するものを抜き出します。
・中身入りのペットボトルが凍結した状態で生成される
・水源が凍ってしまい、そのままでは水を確保できなくなる
今回は、これらを実装していきます。
凍ったペットボトル
今回は、"凍った水のボトル"と"凍ったコーラのボトル"を実装します。
ウイスキーに関しては、凝固点が低いので凍結したものは用意しません。
また、扱いが面倒になるので、ペットボトル+凍った内容物としての実装や、
コーラ+水のボトルや水+コーラのボトルのような組み合わせは実装しません。
仕様としては以下のようなものを考えました。
・通常の水・コーラのボトルと同じテーブルで、凍ったものを生成する
・凍ったボトル+火で解凍された内容物(個数ランダム)が生成される(ボトルは破損)
・凍ったボトル+水+耐熱容器+火(湯煎)でボトルと内容物が生成される
解凍したボトルの再凍結や、コーラの分離・過冷却については考慮しないので、
・"凍ったボトル"2種を定義するためのingredients、itemprops要素
・アイテムとしての"凍ったボトル"2種(及びボトルの画像)
・"凍ったボトル"を生成するtreasuretable
・"凍ったボトル"を解凍するためのレシピ2×2種類
・ボトル解凍時に内容物(とボトル)を生成するtreasuretable
以上が実装に必要な項目となります。
これらを順に、過去に手を付けた部分を端折りつつ進めて行きます。
ingredientsとitempropsの定義
ingredientsとitempropsは、IDと名前を割り振るだけで定義できます。
今回必要なのは、凍ったボトルを解凍するためのレシピで必要な、
"凍ったボトル"というingredients要素とそれを定義するitempropsです。
itempropsは、ingredientsと1:1対応で作成しても構いませんが、
再利用・拡張することを考えてある程度分解して定義します。
<table name="ingredients">
<column name="nID">900</column>
<column name="strName">frozen water bottle</column>
<column name="strRequiredProps">900&901</column>
<column name="strForbidProps"></column>
</table>
<table name="ingredients">
<column name="nID">901</column>
<column name="strName">frozen cola bottle</column>
<column name="strRequiredProps">900&902</column>
<column name="strForbidProps"></column>
</table>
<table name="itemprops">
<column name="nID">900</column>
<column name="strPropertyName">frozen</column>
</table>
<table name="itemprops">
<column name="nID">901</column>
<column name="strPropertyName">water bottle</column>
</table>
<table name="itemprops">
<column name="nID">902</column>
<column name="strPropertyName">cola bottle</column>
</table>
今回定義したのは"凍った水のボトル"と"凍ったコーラのボトル"の2つで、
それぞれに"frozen(凍った)"と
"water bottle(水のボトル)"および"cola bottle(コーラのボトル)"を割り当てました。
"凍った水のボトル"のvPropertiesに900および901、
"凍ったコーラのボトル"のvPropertiesに900および902を定義すれば、
レシピ上でそれぞれ"frozen water bottle"と"frozen cola bottle"として認識されます。
凍ったボトルの実装と生成
ここの実装はおなじみの作業なので、ポイントのみ解説します。
重要なのは、
・vPropertiesに前述のIDを記述する
・凍っていないものと区別するため、画像を用意して指定する
・凍結/非凍結のボトル生成率は、よくテストして調整する
といったところです。
今回は、本来生成されるボトルの7割前後を凍ったものに変更しました。
また、通常のボトルと凍ったボトルの生成部分を","(AND)ではなく"|"(OR)で区切って
どちらか一方しか生成しないように設定しています。
解凍のためのレシピ作成
レシピの定義そのものは、かなりシンプルな作業になります。
<table name="recipes">
<column name="nID">900</column>
<column name="strName">melted water bottle (heated)</column>
<column name="strSecretName"></column>
<column name="strTools">1x0:7</column>
<column name="strConsumed">1x900</column>
<column name="strDestroyed"></column>
<column name="nTreasureID">900</column>
<column name="fHours">0.15</column>
(以下略)
まずは直火で解凍するレシピです。
要求するのは"7(heat source)"と"900(frozen water bottle)"のみです。
<table name="treasuretable">このレシピでははきれいな水か汚染された水を100%で1つと15%でもう1つ、選択して生成し
<column name="id">900</column>
<column name="strName">melted water bottle (heated)</column>
<column name="aTreasures">0:98.1x1.0x1-1|0:98.2x1.0x1-1,0:98.1x0.15x1-1|0:98.2x0.15x1-1,0:86.11x1.0x1-2</column>
(以下略)
破損したボトルとしてプラスチック片(100%)1-2個を生成することにしました。
後述の湯煎で溶かすレシピと区別するため、ペットボトルを使えなくしています。
<table name="recipes">
<column name="nID">901</column>
<column name="strName">melted water bottle (boiled)</column>
<column name="strSecretName"></column>
<column name="strTools">1x0:6+1x0:7</column>
<column name="strConsumed">1x900+1x0:4</column>
<column name="strDestroyed"></column>
<column name="nTreasureID">901</column>
<column name="fHours">0.25</column>
(以下略)
次は湯煎で解凍するレシピです。
直火のレシピに加え、"6(fireproof, waterproof container)"と
"4(water (non-chemical))"を追加しています。
<table name="treasuretable">
<column name="id">901</column>
<column name="strName">melted water bottle (boiled)</column>
<column name="aTreasures">0:11.4x1.0x1-1,0:98.1x1.0x1-2</column>
(以下略)
このレシピでは、単純にペットボトルときれいな水を生成しています。
実装項目の動作確認
最後に、作成したModで各項目のテストを行っていきます。
凍ったペットボトルを熱で溶かすレシピは、内容物+plastic shardを生成します。
水のボトルを溶かすレシピは、クラフト生成物の欄がwater1つになっていますが、
実際にconfirmすればwaterを1つか2つ生成してくれます。
水と耐熱容器を併用するレシピも、想定通りに動作しています。
こちらはちゃんとペットボトルも再利用できます。
凍結する/している水源
本MODでは、フィールドに配置される水源はすべて凍ったものに変更します。
今回は、それをクラフトによって使える状態にし、
一定時間で再び凍結するように改変していきます。
凍った水源の作成
NEO Scavengerの水源には、river,marsh,lakeの3種類があります。
今回作成するのは、それらに対応した"凍った水源"なので、
使い道の特にない、グラフィックだけのアイテムとして作成しておきます。
itemtypes.xmlに、それぞれのテーブルを用意します。
作成するにあたって、使用・拾得などは出来ないようにしておいてください。
使用はaUseConditions、拾得はvEquipSlotsを空欄にすれば制限できます。
クラフトの関係上、それぞれにriver、marsh、lakeのプロパティを付けておきます。
frozen riverからriverを、frozen marshからmarshを生成する必要があるため、
プロパティでしっかりと判別できるようにしました。
また、先に作成した"frozen(凍った)"のプロパティもこちらに付けておきます。
配置される水源の変更
まずは、初期配置される水源を凍ったものに変更します。
バニラのtreasuretableから、水源3種のID(25.0,25.1,25.2)で検索しました。
結果、水源の生成で使用されるのは
"7(forest idle loot)"、"149(hills idle loot)"、"309(hills (water) idle loot)"、
"310(marsh idle loot)"、"311(plains (water) idle loot)"
のテーブルになります。
※他にも検索でヒットするテーブルはありますが、
おそらくencounterの選択肢アイコン用なので除外しても問題ありません。
では、0フォルダ内に作成したtreasuretable.xmlで、
これらのテーブルを書き換えて、最初から凍った水源が生成されるようにしました。
水源を使えるようにするレシピの実装
水源を解凍するためのレシピには、
・凍った水源+熱源で溶かすレシピ
・凍った水源+medium以上のサイズの尖った道具で氷を割るレシピ
の2つを設定します。
crowbarやwrenchのような鈍器を使いたいところですが、
itempropsではっきり分類できるようなものではなかったため、
判別も確保も簡単な、"sharp point"を持つ道具を使わせることにしました。
<table name="recipes">
<column name="nID">906</column>
<column name="strName">melted frozen river</column>
<column name="strSecretName">melted frozen river</column>
<column name="strTools">1x0:7</column>
<column name="strConsumed">1x905</column>
<column name="strDestroyed"></column>
<column name="nTreasureID">915</column>
<column name="fHours">1.0</column>
<column name="nReverse">0</column>
<column name="nHiddenID">0</column>
<column name="bIdentify">1</column>
<column name="bTransferComponents">0</column>
<column name="vAlsoTry"></column>
<column name="nTempTreasureID">0:3</column>
<column name="bDegradeOutput">1</column>
<column name="strType">misc</column>
<column name="bScrap">1</column>
</table>
<table name="ingredients">水源の氷を割って壊すための道具は、上のように設定しました。
<column name="nID">912</column>
<column name="strName">medium or bigger sharp point</column>
<column name="strRequiredProps">0:18</column>
<column name="strForbidProps">0:15</column>
</table>
"18(sharp point)"を持ち、"15(small)"でないもの…
つまり、medium以上のサイズに限定されます。
<table name="recipes">実際のレシピはこのようになりました。
<column name="nID">910</column>
<column name="strName">cracked frozen river</column>
<column name="strSecretName">cracked frozen river</column>
<column name="strTools">1x912</column>
<column name="strConsumed">1x905</column>
<column name="strDestroyed"></column>
<column name="nTreasureID">915</column>
<column name="fHours">1.0</column>
<column name="nReverse">0</column>
<column name="nHiddenID">0</column>
<column name="bIdentify">1</column>
<column name="bTransferComponents">0</column>
<column name="vAlsoTry"></column>
<column name="nTempTreasureID">0:3</column>
<column name="bDegradeOutput">0</column>
<column name="strType">misc</column>
<column name="bScrap">1</column>
</table>
strTools以外は弄っていませんが、fHoursなどで差をつけてもいいかもしれません。
水源の時間経過による凍結
クラフトで凍結を解除された後、水源がそのまま残っているのも不自然です。
なので、水源にconditionを設定し、それが0になると凍結するように変更します。
ここで必要な作業は、
・バニラの水源のfDegradePerHourを設定し、conditionが減少するように変更
・凍った水源を生成するtreasuretableを作成し、追加する
・↑で作成したテーブルのIDを、vDegradeTreasureIDsに設定する
といった感じになります。
今回はfDegradePerHourを"0.5(50%)"に設定し、
2ターンで再凍結するようにしてあります。
実装項目の動作確認
こちらも動作確認を行います。
凍った水源とspear、もしくは熱源でそれぞれ通常の水源になることが確認できました。
1ターン進めて、conditionが50%になっていることも確認できます。
もう1ターン経過すると、再び凍った水源に戻ります。
今回のまとめ
今回は、凍った状態のボトルと水源を実装をしましたが、
どちらも、凍った状態の物はいわば外側だけのハリボテなので
比較的実装の簡単な要素でした。
クラフトのために新しいitemprops、ingredientsテーブルを作成し、
生成のためにtreasuretableテーブルを作成、改変するのが主な作業ですが、
このあたりはアイテムを実装するうえで頻出する作業なので、
しっかりと頭の中で流れを組み立てておく必要があります。
次回は、今回実装したものを応用して
飲食物に温かい/冷たい状態を実装していきます。
→(3) 温かい/冷たい飲食物へ
0 件のコメント:
コメントを投稿