2015年2月7日土曜日

[Modding]barterhexesを使った店hexの設定(1)

本稿では、barterhexesテーブルを使用した、店Hexの作成を目標としています。
実装に際して、適宜他テーブルの解説・導入を行っていく予定です。

最終的にはMODとして出せる程度にまで作り込みますが、
段階的に機能を実装して、その見え方と問題点を順に確認していきます。


(2015/10/17追記)
※本稿はVer1.1より前の時点で記述したものです。
現在、以降のデータはneogame.xmlから各テーブルごとのxmlに分割されていますので、
特に記載がない限り、データは各テーブルと同名のxmlを参照してください。


barterhexes解析のおさらい

まず、解析記事と内容は重複しますが
簡単にテーブルの設定項目だけ押さえておきます。

nXnYで店を配置する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 itemRandom drugsといった
個別の商品を生成するtreasuretableを呼び出しています。

もちろん、このテーブル内で直接商品を配置しても構いません。

未検証ですが、商品を鑑定済みにするためには
bIdentifyを1にする必要がありそうです。


任意のタイミングで商品を並べるパターン

次にコンビニ(C-Store)ですが、
barterhexesに指定されているtreasuretableには商品がありません。

商品の配置自体は"encounters"テーブルで指定されています。
<table name="encounters">
    <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>
(以下略)
つまり、DMC入り口に到達した時点ではなく
コンビニに入店したタイミングで商品を設定した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">
    <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>
Cryoの座標は20,164なので、少し右上に置いてみました。
あとは商品のtreasuretableを設定すれば店として成立するはずです。


商品を設定してみる

次に商品として何を置くか、ですが
"肉と毛皮をちょっと分けてくれるハンターのキャンプ"
という感じの簡単なものにしてみました。
置きたいものの数が多いので、複数のテーブルに分けて設定します。

<table name="treasuretable">
    <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>
raw、cooked、curedのsmall meatを適当に並べます。
新規アイテムではないので、"0:"を忘れないように付けておきます。
スタックしないのであまり多く配置しないように注意。
<table name="treasuretable">
    <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>
medium meatとhide・hide装備、おまけでベリーと水のボトルを入れておきます。
水のボトルは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 件のコメント:

コメントを投稿