2015年3月26日木曜日

[Modding]xml解析:itemtypes

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

今回はアイテムやイベントの選択肢など、
GUIとして表示されるものの大半を定義するitemtypesテーブルを解析します。

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


サンプルデータ

データの参照元はitemtypes.xmlです。
今回のサンプルは靴(左)です。
<table name="itemtypes">
    <column name="id">5</column>
    <column name="nGroupID">50</column>
    <column name="nSubgroupID">0</column>
    <column name="strName">clothes (shoes)</column>
    <column name="strDesc">Pearson &quot;Wakefield&quot; pack boot (left)</column>
    <column name="strDescAlt"></column>
    <column name="nCondID">1</column>
    <column name="vImageList">ItmWorkBoot.png,ItmWorkBootStored.png</column>
    <column name="vSpriteList">2=CreItmWorkBootL.png,3=CreItmWorkBootR.png</column>
    <column name="vImageUsage">1,1,0,0,1,1</column>
    <column name="fWeight">1</column>
    <column name="fMonetaryValue">50</column>
    <column name="fMonetaryValueAlt">0</column>
    <column name="fDurability">1</column>
    <column name="fDegradePerHour">0</column>
    <column name="fEquipDegradePerHour">0.0007</column>
    <column name="fDegradePerUse">0</column>
    <column name="vDegradeTreasureIDs">758,3</column>
    <column name="aEquipConditions">2=21,2=-210,3=22,3=-210,3=715</column>
    <column name="aPossessConditions"></column>
    <column name="aUseConditions"></column>
    <column name="aCapacities"></column>
    <column name="vEquipSlots">2=0=0,3=0=0,20,21</column>
    <column name="vUseSlots"></column>
    <column name="bSocketLocked">0</column>
    <column name="vProperties">9,16,28,37,48,50,75,84</column>
    <column name="aContentIDs"></column>
    <column name="nFormatID">3</column>
    <column name="nTreasureID">0</column>
    <column name="nComponentID">3</column>
    <column name="bMirrored">1</column>
    <column name="nSlotDepth">0</column>
    <column name="strChargeProfiles"></column>
    <column name="aAttackModes"></column>
    <column name="nStackLimit">1</column>
    <column name="aSwitchIDs"></column>
    <column name="aSounds">cueShoeDrop2,cueShoeDrop3</column>
</table>
columnの解析

今回は特に項目数が多いので
こちらの資料を確認することをお勧めします。
スロットのIDに関してはこちらにすべて書かれています。

nGroupIDはアイテムのカテゴリごとに振り分けられたIDで、
nSubgroupIDはその中で付けられた通し番号です。
この2つのIDのセットは、他テーブルからの参照に使われるため
絶対に他と重複しないものである必要があります。


このブログで作成してきたサンプルでは、単に重複しないIDを使用していますが、
一部のnGroupIDには、特別な仕様を持つものもありますので
新規実装したアイテムに既存のIDを適用するのもいいかもしれません。
(nSubgroupIDを重複しないように記述するのが面倒ですが…)

割り当てられたnGroupIDのリストはこちらで確認できます。

strNameはゲームには関係のない名前です。
メモや分類用として使っているような気がします。

strDescはゲーム中に表示されるアイテム名です。

fMonetaryValueはアイテムの価値(1=$1)で、
Conditionが100%の時に表示される価格です。

nCondIDには"conditions"テーブルのIDが入ります。
プレイヤーがそのIDが指すステータスを持っている場合、
strDescstrDescAltに、
fMonetaryValuefMonetaryValueAltに上書きされます。
スキル取得時のアイテム識別などはここで指定しています。
必要なければnCondIDは"1"で問題ありません。

vImageListはアイテムに使用される画像のリストで、
vImageUsageは状態によってどの画像を使用するか設定しています。
サンプルの場合はItmWorkBoot.pngを"0"、ItmWorkBootStored.pngを"1"として
順に通常時、通常時(中身入り)、装備時、装備時(中身入り)、
カーソル保持時、カーソル保持時(中身入り)の時の画像を指定しています。
(中身入り)はコンテナ系アイテムの中にアイテムが入っているときの状態で、
plastic bagやsledなどで確認できる仕様です。

vSpriteListはアイテム装備時にhexマップ上で表示される画像(パーツ)で、
頭の数字は装備スロットのIDです。

fWeightはアイテムの重量(1=1kg)です。

fDurabilityは生成時の最大Conditionで、1なら最大100%で生成されます。

fDegradePerHourは1時間(=1Movement)ごとに消耗するConditionで、
fEquipDegradePerHourは装備時、1時間ごとに消耗するConditionです。
"1"なら1時間で100%、"0.0007"なら0.07%消耗することになります。

fDegradePerUseはアイテム使用時(1回ごと)に消耗するConditionです。

vDegradeTreasureIDsは、アイテムのConditionが0%になった時に、
生成されるアイテムを"treasuretable"テーブルのIDで指定します。
サンプルにある"758"番のテーブルでは皮と糸、靴底を生成しています。
なければ"3"で問題ありません。

aEquipConditionsは、そのアイテムを装備時に付加されるステータスで、
2(LEFT SHOE)に装備した時は
21(Wearing left shoe)を付加し、210(Barefoot)を削除します。
また、3(RIGHT SHOE)に装備した時は
22(Wearing right shoe)を付加し、210(Barefoot)を削除し、
さらに715(Improper Footware)を付加します。

aPossessConditionsは以前Campfireを作成した時に使用しましたが、
装備していないときに発揮される効果を設定しています。

例えば地面にある場合は200(GROUND)、キャンプ画面なら208(CAMP)で、
aEquipConditionsと同じ表記で記述します。

aUseConditionsは使用時に付加されるステータスで、
これもaEquipConditionsと同じ表記で、
スロットはすべて211(USE)として記述しています。

aCapacitiesはコンテナ型のアイテムの容量で、
"4x6"(plastic bagの場合)といった感じで記述します。

vEquipSlotsはこのアイテムの装備可能スロットで、
装備時の画像を指定したいときは後に数値を指定する文を追加します。
数値はvImageUsageと同じくvImageListの表記順で決まるもので、
サンプルのように2つ記述した場合は、
1つ目が中身なし、2つ目が中身入りの場合の数値です。

vUseSlotsはそのアイテムを使用できるスロットで、
基本的には211(USE)のみで、水などの傷の治療で使用できるアイテムは
100(upper left arm)などの表記もあります。
また、ragのような患部に着けるものはvUseSlotsではなく
vEquipSlotsのほうで記述します。

bSocketLockedは特殊なオプションで、"1"にすると装備した時に外せなくなります。
普通はGUIの枠(これもitemtypesで定義しています)の固定に使用しています。
一般的なアイテムを実装するなら、基本的に"0"で問題ありません。

vPropertiesにはそのアイテムが持つproperty(属性)を記述します。
数値は"itemprops"テーブルのIDで、クラフティングにも大きく関わる要素です。

サンプルの数値は、9(waterproof)で16(medium)、28(rigid)、37(absorbent)、
48(solid (not liquid/gas/idea))、50(handheld)、75(stuff Zom Zom's wants)、
84(shoe)…と、1つのアイテムに多くの属性が詰め込まれています。

自分で設定する場合は、想定外のレシピに使用されたりしないように注意しましょう。
(ケチャップでragを煮沸消毒できていた時代があったそうです)

aContentIDsはコンテナの中身に保持できるアイテムを
"containertypes"テーブルのID(複数可)で表記します。
銃の口径に合う弾丸しか装填できなかったり、
shopping cartに細かい物が入らなかったりするのはここの設定です。

nFormatIDはそのアイテムがどのタイプのコンテナに格納できるかを
"containertypes"テーブルのIDで表記します。
要するにこの数値がaContentIDsと対応しているのではないかと思われます。

nTreasureIDはそのアイテムの中に何が入っているかを
"treasuretable"テーブルのIDで指定します。

nComponentIDは、そのアイテムの素材として使われるアイテムを
"treasuretable"テーブルのIDで指定します。
この設定は分解可能なアイテムのCondition算出に使用されたりするようです。
ただし、プレイヤーが作成した場合は、その際に使用した素材が適用されます。

bMirroredはアイテムの画像を左右反転して使用するかどうかを指定します。
靴の画像は基本的に右足用のものなので、サンプルの場合は"1"になっています。

nSlotDepthはアイテムを装備する際の"深さ"で、
装備アイテムの(スロットごとの)内部的な位置を定義しています。

例えば、胴に装備するアイテムで説明すると
"0"はshirt、"1"はhoodie、"2"はtunicやcoat、"3"はsashが使用しています。

新たに装備アイテムを定義する場合でも、
この設定だけはしっかりと確認しておきましょう。

strChargeProfilesはアイテムに装填/格納されるアイテムを
"chargeprofiles"テーブルのID(複数可)で記述します。

aAttackModesは、そのアイテムを装備した時に追加される攻撃オプションを
スロットIDと"attackmodes"テーブルのIDのセットで記述します。
もちろんスロットごとに複数の攻撃オプションを設定しても構いません。

当然といえば当然ですが、スロットIDは20(HOLD IN LEFT HAND)
21(HOLD IN RIGHT HAND)しか定義されていません。

nStackLimitはアイテムをスタックできる最大数です。
ベリーなら5個、紙切れなら30枚までスタック可能です。

aSwitchIDsは、laptopやflashlightのような状態変化するアイテムに、
そのオプションと変化先のアイテムを記述しています。

例えば、開いていて、ロックされていて、電源の入っていないlaptopなら
aSwitchIDsには"Close=8.2,On=8.3"と書かれています。
左辺は右クリック時のメニューに表示される文字列で、
"8.2"は閉じたlaptop、"8.3"は電源の入った、かつロック状態のlaptopの
nGroupIDnSubGroupIDの組です。

aSoundsはそのアイテムを拾ったとき、
および置いた時に再生される効果音を指定しています。
音声は外部のものを読み込んで使用することは出来ないため、
MODでもすべて既存のものを使用することになります。



itemtypesテーブルは、MOD作成においてほぼ必須と言える項目なので、
最優先で理解すべき箇所でもあります。

が、豊富なサンプルがあるため、ある程度は既存のものを改変するだけでも
十分に要求を満たすものが作れてしまいます。

ただ、細かいギミックを入れたり設定依存のバグを修正するためにも必要なので、
ここに挙げた情報はできるだけ頭に入れておきましょう。


0 件のコメント:

コメントを投稿