実装に際して、適宜他テーブルの解説・導入を行っていく予定です。
最終的にはMODとして出せる程度にまで作り込みますが、
段階的に機能を実装して、その見え方と問題点を順に確認していきます。
(2015/10/17追記)
※本稿はVer1.1より前の時点で記述したものです。
現在、以降のデータはneogame.xmlから各テーブルごとのxmlに分割されていますので、
特に記載がない限り、データは各テーブルと同名のxmlを参照してください。
barterhexes解析のおさらい
まず、解析記事と内容は重複しますが
簡単にテーブルの設定項目だけ押さえておきます。
nXとnYで店を配置するX/Y座標を設定します。
座標はマップ左上が起点となっています。
ただし、Hexマップなので座標の配置には少し癖があるようです(後述)。
アイテムを売却可能な店ならbBuysを1にします。
商品入れ替え時に参照するtreasuretableは、
nRestockTreasureIDで設定します。
補充用treasuretableの設定
サンプルとしてDMC郊外の品揃えを見てみます。
<table name="treasuretable">テーブルそのものの解析は別記事で行いますが、
<column name="id">23</column>
<column name="strName">Junk store starting inventory</column>
<column name="aTreasures">411x1x3-5,412x1x1-2,413x1x3-5,414x0.5x1-2,415x1x3-6,416x1x3-6,418x1x2-5,394x1x1-3,395x1x1-3,420x0.5x1-1,420x0.5x1-1,421x0.5x1-1,89.1x1x1-1,94.0x0.1x1-1,94.1x0.15x1-2,426x1.0x1-2,454x1.0x1-2,455x0.8x1-1</column>
<column name="bNested">0</column>
<column name="bSuppress">0</column>
<column name="bIdentify">1</column>
</table>
テーブル内でRandom food itemやRandom drugsといった
個別の商品を生成するtreasuretableを呼び出しています。
もちろん、このテーブル内で直接商品を配置しても構いません。
未検証ですが、商品を鑑定済みにするためには
bIdentifyを1にする必要がありそうです。
任意のタイミングで商品を並べるパターン
次にコンビニ(C-Store)ですが、
barterhexesに指定されているtreasuretableには商品がありません。
商品の配置自体は"encounters"テーブルで指定されています。
<table name="encounters">つまり、DMC入り口に到達した時点ではなく
<column name="id">1241</column>
<column name="strName">Start shopping.</column>
<column name="strDesc">Pick up items to purchase them.
You cannot sell items here, however.</column>
<column name="strImg">EncConcreteForest.png</column>
<column name="nTreasureID">504</column>
<column name="nRemoveTreasureID">3</column>
(以下略)
コンビニに入店したタイミングで商品を設定したtreasuretableを呼び出し、
商品として配置しているようです。
中身の詰まったアイテムを生成する
最後に、中身が完全な状態の商品(ペットボトルなど)を生成する方法ですが、
<table name="treasuretable">ボトルと中身(ちょうど満タンになる量)を生成して、
<column name="id">505</column>
<column name="strName">Soda bottle (full)</column>
<column name="aTreasures">11.1x1x1-1,98.6x1x2-2</column>
<column name="bNested">1</column>
<column name="bSuppress">1</column>
<column name="bIdentify">1</column>
</table>
bNested(容器に入れられるものがあれば詰める)と
bSuppress(容器の生成時に中身を空にする)を1にすればいいようです。
bSuppressを1にしないと、容器生成時に中身が入っているため
追加で生成した分は容器と別に配置されてしまいます。
以前作成したStoli Modですが、そのあたりの設定が抜けていたため
Cryo初期配置の瓶に中身が入っていないことがよくありました。
barterhexesを追加してみる
では、本題のbarterhexesを設定してみます。
肝心の場所は、デバッグもしやすいようにCryoの近くに配置します。
あまりバランスブレイカーにしたくないので、貴重な品も置きません。
まずは場所から決めてしまいましょう。
<table name="barterhexes">Cryoの座標は20,164なので、少し右上に置いてみました。
<column name="id">4</column>
<column name="nX">22</column>
<column name="nY">162</column>
<column name="bBuys">1</column>
<column name="nRestockTreasureID">999</column>
</table>
あとは商品のtreasuretableを設定すれば店として成立するはずです。
商品を設定してみる
次に商品として何を置くか、ですが
"肉と毛皮をちょっと分けてくれるハンターのキャンプ"
という感じの簡単なものにしてみました。
置きたいものの数が多いので、複数のテーブルに分けて設定します。
<table name="treasuretable">raw、cooked、curedのsmall meatを適当に並べます。
<column name="id">995</column>
<column name="strName">Hunter's camp small meat stocks</column>
<column name="aTreasures">0:101.9x0.6x1-3,0:101.11x0.8x1-3,0:101.20x0.6x2-4</column>
<column name="bNested">0</column>
<column name="bSuppress">0</column>
<column name="bIdentify">1</column>
</table>
新規アイテムではないので、"0:"を忘れないように付けておきます。
スタックしないのであまり多く配置しないように注意。
<table name="treasuretable">medium meatとhide・hide装備、おまけでベリーと水のボトルを入れておきます。
<column name="id">996</column>
<column name="strName">Hunter's camp medium meat stocks</column>
<column name="aTreasures">0:101.6x0.6x1-2,0:101.13x0.8x1-2,0:101.15x0.6x1-2</column>
<column name="bNested">0</column>
<column name="bSuppress">0</column>
<column name="bIdentify">1</column>
</table>
<table name="treasuretable">
<column name="id">997</column>
<column name="strName">Hunter's camp cloth stocks</column>
<column name="aTreasures">0:78.0x0.2x1-1,0:78.6x0.3x1-1,0:24.0x0.4x2-2,0:4.1x0.8x1-6,0:4.3x0.8x1-6,0:4.4x0.8x1-6</column>
<column name="bNested">0</column>
<column name="bSuppress">0</column>
<column name="bIdentify">1</column>
</table>
<table name="treasuretable">
<column name="id">998</column>
<column name="strName">Hunter's camp other stocks</column>
<column name="aTreasures">0:101.12x0.4x5-10,0:196x0.8x1-2</column>
<column name="bNested">0</column>
<column name="bSuppress">0</column>
<column name="bIdentify">1</column>
</table>
水のボトルはC-Storeの商品を流用しているので、
bNested/bSupressは0のままにしています。
<table name="treasuretable">以上のテーブルをまとめて、入荷アイテムのテーブルを作成します。
<column name="id">999</column>
<column name="strName">Hunter's camp stocks</column>
<column name="aTreasures">995x1x1-1,996x1x1-1,997x1x1-1,998x1x1-1</column>
<column name="bNested">0</column>
<column name="bSuppress">0</column>
<column name="bIdentify">1</column>
</table>
確率は各テーブルで設定しているので、こちらでは1(100%)にしています。
動作確認&デバッグ作業
では、この状態で動作を確認します。
キャラメイクは適当にして…
ゲームスタート、というところでフリーズします。
テーブルを削ったりしながら原因を探してみたところ、
bartarhexesテーブルがあるとフリーズが発生するようです。
他のMODの内容もチェックしながら試行錯誤した結果…
idを2以上に設定すると駄目なようでした。
M(m)MoDではidを1にしていたので、それに倣ってみたところ、
問題なく動作したのでひとまずそれで良しとしました。
※デバッグと言うには問題のある方法ですが、
原因そのものが特定できないのでこのままで通します。
ちなみに、上書きしたidのJunk Marketも問題なく動いているのを確認しています。
さて、まともに動いたところで動作確認を続けます。
20,164のCryoに対して22,162に設定したので、店の場所はここ…ではなく
ここになります。
マップ上での座標カウントは、この画像のようになっているような気がします。
店の品揃えも、だいたい期待した通りのようです。
発見までの時間経過で少し劣化していますが…
生もの以外はちゃんと新品です。
生肉が増えただけのように見えますが、ちゃんとアイテムの買い取りもしてくれました。
というわけで、一見これで実装は成功したかのように見えますが…
店のあるhexが固定ではないので、店であるにもかかわらず、
水が汲めたり、Scavenge出来たり、石やゴミが落ちていたりします。
今回は森なので、treesや未鑑定waterが落ちていて、
これも商品として扱われてしまいます。
※価値のないものは自由に拾えますが、
Scavengeで手に入れたアイテムを自動的に売ってしまったりします。
さすがにこれはMODとして扱うには問題がある仕様です。
さらに、今の段階ではただ"物を売り買い出来るHex"があるだけで、
"ここに店がある"とはとても言えません。
というわけで、次回の記事では…
・このキャンプをランダム配置ではないHexとして設定する
・キャンプをもう少し店らしく見せる工夫をする
以上2つをメインの目標とします。
次回:[Modding]barterhexesを使った店hexの設定(2)
0 件のコメント:
コメントを投稿