2015年3月30日月曜日

[Modding]xml解析:ingredients

本稿ではMOD作成の前提として、xmlに書かれた情報を解析していきます。

今回はクラフティングにおける"素材"を定義するingredientsテーブルを解析します。

※多分にネタバレを含みます。ご注意ください。


サンプルデータ

データの参照元はingredients.xmlです。
今回はパターンごとに適当なサンプルを用意してみました。
<table name="ingredients">
    <column name="nID">1</column>
    <column name="strName">flame source</column>
    <column name="strRequiredProps">3</column>
    <column name="strForbidProps"></column>
</table>

<table name="ingredients">
    <column name="nID">6</column>
    <column name="strName">fireproof, waterproof container</column>
    <column name="strRequiredProps">8&amp;9&amp;10</column>
    <column name="strForbidProps"></column>
</table>

<table name="ingredients">
    <column name="nID">17</column>
    <column name="strName">medium or large shaft</column>
    <column name="strRequiredProps">13&amp;28</column>
    <column name="strForbidProps">15</column>
</table>

columnの解析

今回はそれほど項目はありませんが、
実際には"itemprops"テーブルと"recipes"テーブル、
および"itemtypes"テーブルと密接に関連しているため、
実際の作業ではそれらのテーブルを行ったり来たりすることになります。

strNameは素材としての名前です。
レシピにも記載されるので、ちゃんとした名称を付けておきましょう。


strRequiredPropsはアイテムがその素材であるために必要な要素で、
数字は"itemprops"テーブルのIDです。

例えば、最初のサンプル(flame source)ですが、
記載された数字は"3"のみです。
"itemprops"テーブルで"3"は"igniter(点火装置)"と書かれています。
つまり、火を点ける機能のあるものはすべて火の源として扱われます。

データ上では、"itemtypes"テーブルのvProperties"3"と書かれていれば
そのアイテムはすべて"flame source"です。


もちろん、必要とされる要素が複数要求されるものも存在します。
2番目のサンプル(fireproof, waterproof container)の場合なら、
"8"(container)、"9"(waterproof)、"10"(fireproof)の3つを満たすものは
耐火・耐水性の容器として使用できます。

このとき、各要素は","ではなく"&amp;"で区切られていることを覚えておきましょう。


最後に、strForbidPropsはその素材が備えていてはいけない要素です。
つまり、strRequiredPropsだけでは絞り込めない要素を、
消去法によって絞り込むわけです。

3番目のサンプルの場合は、
"13"(shaft)かつ"28"(rigid)なアイテムのうち、
"15"(small)でないものが"medium or large shaft"となります。


データだけを見ると、情報量は少ないように見えますが
ingredientの設定には慎重さが要求されます。

例えばclean ragの素材となる"small absorbent, non-rigid sheet"は、
strRequiredProps"15,36,37"strForbidProps"28"となっています。

これに対してsmall animal hide(小さな毛皮)のvProperties
"1,15,20,36,37,48,50"となっているため、煮沸すればclean ragになってしまいます。
(これが仕様としてアリなのかどうかは分かりませんが)

こういった、一見ありえなさそうなクラフティングも出来てしまうため、
"recipes"テーブルや"ingredients"テーブルの設定で、
正確さと柔軟さのバランスをうまく取ってやりましょう。

0 件のコメント:

コメントを投稿