2016年6月29日水曜日

[Modding]Winter MOD作成記録(4) 暖房器具の実装



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

今回は、暖房効果のあるアイテムを実装していきます。





今回実装する項目

今回実装するのは、
・毛布やコートなど、衣類やキャンプ用品に幅を持たせる
です。

後回しにする予定でしたが、実装機能がそこそこ出揃ってきたので手を付けていきます。
暖房はテストプレイで重要な救済措置なので、しっかり用意しておきたいところです。


欲しいアイテムを妄想する

この手の実装で重要なのは、"何が欲しいかをちゃんと決める"ことです。
できればどんなメリット・デメリット・役割を与えるかまで考えておきましょう。

今回実装するのは以下の4つです。

・毛布
寝袋より見つかりやすく、効果の低いアイテム。
ただし寝袋と重複して使えるためちょっと重宝する。

・スタッフジャンパー
隠しアイテム的な扱いで、Cryoのイベント中に追加する服。
具体的にはhoodieからポケットを取り外した代用品レベルの立ち位置。
(運が悪いとスタート直後に凍死するので救済措置的に配置しています)

・薪ストーブ
ガスストーブや石油ストーブだと燃料の実装が面倒なので薪ストーブに。
着火の手間があるとcampfireと変わりないため、薪だけ追加すれば点けられる仕様に。
その代わり、使用後は掃除が必要になる軽いデメリットを追加。
都市部より森で見つかりやすい設定。

・電気ストーブ
一番確保しやすい電池式にしたストーブ。
軽量で持ち歩きが可能なタイプにし、代わりに効果は低く設定。
都市部で見つかりやすくします。

体温調節の基本は温かい飲食物があるので、こちらの効果はそこそこに設定します。
要はバリエーションを増やして遭遇率を上げたいだけなので、有用性は二の次です。


薪ストーブを実装する

実装アイテムのうち、毛布は寝袋の、
ジャンパーはhoodieのコピペ改変で実装しています。

薪ストーブは使用前、点火中、煤で汚れた状態のitemを作成し、
クラフト用にそれぞれ"909(wood stove)"というプロパティを設定し、
点火中の物にはバニラから"0:11(hot)""0:49(light source)"のプロパティを、
汚れた物には"910(begrimed with soot)"というプロパティを追加で設定します。

また、点火したストーブにはcampfire使用時と同等のconditionを付加し、
消えたときに汚れたストーブを生成するようtreasuretableを設定します。

クラフト用のingredientsテーブルでは、使用前と汚れた状態のstoveを
<table name="ingredients">
    <column name="nID">913</column>
    <column name="strName">wood stove(non-fired,non-begrimed)</column>
    <column name="strRequiredProps">909</column>
    <column name="strForbidProps">0:11&amp;910</column>
</table>
<table name="ingredients">
    <column name="nID">914</column>
    <column name="strName">wood stove(begrimed)</column>
    <column name="strRequiredProps">909&amp;910</column>
    <column name="strForbidProps"></column>
</table>
と定義します。

ストーブ点火用のレシピは
<column name="strConsumed">1x913+1x0:3</column>
と定義し、汚れたストーブを掃除するレシピには
<column name="strConsumed">1x914+1x0:30</column>

と定義して、それぞれ点火したストーブと使用前のストーブ(+汚れた布)を生成させます。

これで、
使用前→(クラフトで)着火→点火中→時間で消える→汚れた状態→(クラフトで)掃除
という1つのサイクルが完成しました。


電気ストーブを実装する

電気ストーブは、動力源として電池を使用するタイプなので、
アイテムとしてはオフ/オンの2状態を定義します。

両方のアイテムに共通して、
<column name="aCapacities">3x1</column>
で電池を収納するためのスペースを設定し、
<column name="aContentIDs">0:23</column>
で電池のみを収納できるように設定します。

また、生成時に電池が入っている状態にするため、
<table name="treasuretable">
    <column name="id">933</column>
    <column name="strName">elec. stove contents</column>
    <column name="aTreasures">0:33.1x0.5x3-6</column>
    <column name="bNested">0</column>
    <column name="bSuppress">0</column>
    <column name="bIdentify">0</column>
</table>
上記のtreasuretableを作成し、電源の入っていない方のnTreasureIDに設定します。

また、電源が入っている方のストーブには、
薪ストーブと同様に"0:11(hot)""0:49(light source)"のプロパティを追加し、
<table name="chargeprofiles">
    <column name="nID">100</column>
    <column name="strName">elec. stove electricity</column>
    <column name="strItemID">0:10.3</column>
    <column name="fPerUse">0</column>
    <column name="fPerHour">10</column>
    <column name="fPerHourEquipped">0</column>
    <column name="fPerHex">0</column>
    <column name="bDegrade">0</column>
</table>
chargeprofilesテーブルを以上のように作成してstrChargeProfilesに設定します。
消費電力などのバランス調整は、実装してからテストしつつ行うくらいで問題ありません。

電気ストーブの状態遷移は、シンプルにaSwitchIDsで設定するだけです。


アイテムの出現エリアを決める

毛布は寝袋に準ずるアイテムなので、生成パターンもほぼ同じです。
重要度の低いアイテムなので、それなりに見つかりさえすれば問題ありません。

ストーブ2種は、家やビルなどの室内で見つかるように設定します。
設置式の薪ストーブは倉庫やオフィスで生成されないようにしています。
逆に、電気ストーブは都市部で見つかりやすくなるよう調整しています。

MODの仕様上、これらの出現率が難易度に直結するため
そこそこ低確率、かつ薪ストーブは複数生成されることが少ないように調整しました。


スタッフジャンパーはイベント入手のみのアイテムなので、
生成用treasuretableを作成したら、Cryoの探索イベントに新規encounterを割り込ませます。

割り込ませるポイントは、弄りやすいExam Room 17の探索シーンにします。
<table name="encounters">
    <column name="id">9000</column>
    <column name="strName">Examine staff jacket</column>
    <column name="strDesc">You opened package.
Jacket has &quot;STAFF&quot; logo on the chest. Looks good condition, and not smelling bad... Anyway, this is exactly what you need.</column>
    <column name="strImg">0:EncCryo2Dark.png</column>
    <column name="nTreasureID">904</column>
    <column name="nRemoveTreasureID">0:3</column>
    <column name="aConditions">1000</column>
    <column name="aPreConditions">-1000</column>
    <column name="fPrice">0</column>
    <column name="aResponses">=0:244x1x0x0x0</column>
(中略)
    <column name="vAccidents">1</column>
    <column name="vLoot">0:3</column>
</table>
MODフォルダ内にencountersテーブルを作成し、メッセージを表示させます。
アイテムはnTreasureIDで生成、
イベントを繰り返さないようにフラグ管理用conditionを用意し、
aConditionsおよびaPreConditionsに設定します。
あとはaResponsesでバニラのencounterに戻してやるだけです。

次にバニラ側のencounterを改変します。
<table name="encounters">
    <column name="id">244</column>
    <column name="strName">Exam Room 17</column>
(中略)
    <column name="fPrice">0</column>
    <column name="aResponses">...,WinterMod:205.0x1=WinterMod:9000x1x0x0x0,...</column>
    <column name="aMinimapHexes"></column>
(中略)
    <column name="vAccidents">1</column>
    <column name="vLoot">3</column>
</table>
0フォルダ内で、該当するencountersテーブルのaResponses
作成したencounterを呼び出す選択肢を追加します。
選択肢用のアイテムには、スタッフジャンパーをそのまま指定しています。



実装項目の動作確認

最後に今回実装分の動作確認です。


まずはCryoでencounterの分岐を確認しました。
文章も微妙に変えて、包装された衣服があることを説明しています。


試着&他の実装アイテムです。
今回もtreasuretableを弄って用意しておきました。


毛布は設置するだけで効果があります。
もちろんキャンプにも使えます。


電気ストーブです。ちゃんと電池も入っています。




電源を入れると電力の残りと消費量が表示されます。
設定上、熱源なので肉も焼けてしまいます。
凍ったドリンクの解凍に使いたかったのであえてこういう仕様ですが、
プロパティを削ればクラフトには使えなくなります。




薪ストーブはクラフトでのみ着火できます。
着火した後は消えるまでそのままです。


数ターンで消えて、再使用には掃除する必要があります。


今回のまとめ

今回は、あえて2種類の手法で異なる暖房器具を実装しました。
クラフトによって状態を遷移させる薪ストーブは、
状態遷移の定義が面倒ですが、実装後の手間は少なく済ませられます。

電源を必要とする電気ストーブは、状態遷移はシンプルなものの
生成時に入っている電池/電力のバランスや電力消費のバランス調整が面倒でした。


どちらの手法も一長一短と言ったところですが、
結局は実装したいアイテムによって選択するのが妥当ではないでしょうか。


(5) 雪による地形効果と雪玉の実装へ

0 件のコメント:

コメントを投稿