2015年3月21日土曜日

[Modding]xml解析:encounters

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

今回はイベントで表示される文章・画像・選択肢を設定する
encountersテーブルを解析します。

※多分にネタバレを含みます。ご注意ください。
サンプルデータ

データの参照元はencounters.xmlです。
今回のサンプルは、Cryoでのゲーム開始時のものを使用します。
<table name="encounters">
    <column name="id">2</column>
    <column name="strName">Wake up in cryo facility.</column>
    <column name="strDesc">You wake up disoriented, slumped over the base of an empty cryosleep pod, still damp from cryo fluid. The thick dust from the floor clings to your skin, leaving a clean spot on the ground, where a large &quot;05&quot; is painted.
Across the room, there is an open door to the hallway, and a broken window leading outside.
Just as you gather your wits, an unearthly scream erupts from down the hall beyond the doorway. Something is coming. Fast.</column>
    <column name="strImg">EncCryoFacility.png</column>
    <column name="nTreasureID">3</column>
    <column name="nRemoveTreasureID">3</column>
    <column name="aConditions">1</column>
    <column name="aPreConditions"></column>
    <column name="fPrice">0</column>
    <column name="aResponses">90.1x1=12x1x0x0x0,91.8x1+91.3x1=22x1x0x0x0,91.2x1=8x1x0x0x0,91.12x1=4x1x0x0x0,91.0x1=3x1x0x0x0,91.14x1=11x1x0x0x0,91.15x1=14x1x0x0x0,91.1x1=7x1x0x0x0,91.6x1=21x1x0x0x0,91.8x1=108x1x0x0x0,91.3x1=107x1x0x0x0,=2x1x0x0x0</column>
    <column name="aMinimapHexes">20x164=Gyges Cryo Facility</column>
    <column name="bRemoveCreatures">0</column>
    <column name="bRemoveUsed">0</column>
    <column name="nItemsID">4</column>
    <column name="nCreatureID">17</column>
    <column name="ptCreatureHex">40,0</column>
    <column name="ptTeleport">0,0</column>
    <column name="ptEditor">-2123,-2996</column>
    <column name="nType">0</column>
    <column name="fLootChance">0</column>
    <column name="fAccidentChance">0</column>
    <column name="fCreatureChance">0</column>
    <column name="vAccidents">1</column>
    <column name="vLoot">3</column>
</table>

columnの解析

今回はこちらの資料を基に説明しています。

strNameはencounterのタイトルで、
Currently Selected Responseにも表示される文章です。

strDescは表示される文章です。
"&quot;"のように、一部の記号は特殊文字として表記する必要があります。

&quot;(")、&apos;(')、&amp;(&)、&lt;(<)、&gt;(>)は、
変換しないとXMLの文法的なエラーの原因になりますので、
忘れずにチェックしておきましょう。

strImgは表示される画像ですが、
画像サイズに関わらず、大体中央に表示してくれるようです。

nTreasureIDはそのencounterに入った時に追加されるアイテムで、
nRemoveTreasureIDはその時に"プレイヤーから"除去されるアイテムです。

どちらも"treasuretable"テーブルのIDを参照しますが、
イベントなどでアイテムを渡す/受け取るといった処理はここで行います。
他にも、DMCのC-Storeに立ち寄った時点で商品を配置する、
といった処理にも使用しています。

aConditionsはこのイベントで追加/削除されるconditionです。
"conditions"テーブルのIDで表記しますが、
頭に"-"を付ければそのconditionを削除できます。

怪我やバッドステータスを付加したり、
医療行為で逆に怪我を直したり、といった使い方も出来ますが
表面に出てこないイベントフラグの付加にもこの処理を使用します。
("○○の情報を知っている"とか"××を渡した"みたいなものです)

fPriceは、このencounterの発生に必要な所持金です。
所持金が足りていないと、このencounterにはたどり着けなくなっています。

aResponsesはこのencounterで表示される選択肢です。

開発者様の表現を借りると、
AA.BBxCC=DDxEExFFxGGxHHという形で表記されていて、
"AA.BB"の部分はその選択肢に必要なアイテムのnGroupID.nSubGroupID
これは"itemtypes"テーブルのものを参照しています。

また、"AA.BB"が単一の数字で表されることもありますが、
これは"ingredients"テーブルを参照しているようです。
(Zom Zom'sの入場料として渡すアイテムの選別に使われていました)

各種スキルも、ここで使うためにそれぞれアイテムとして定義されているので
選択肢として使うときはそちらを参照してください。

"CC"は"AA.BB"で指定されたアイテムの必要数なので、
基本的には"1"にしておけば良さそうです。

右辺に移って、"DD"は結果として発生するencounterのIDで、
"EE"はその発生率です。
確率で発生するイベントが枝分かれするようなものに使われるようで、
数値を設定するなら合計を"1"にする必要がある、と書かれています。

残り3つは、消耗するアイテムを選択肢として使う場合の数値で
"FF"はper-use、"GG"はper-hour、"HH"はper-hexとなっています。
これらはアイテムの消耗タイミングの違いによるもので、
FF回使用し、使用してGG時間経って、
使用しながらHHヘックス分移動したのと同じだけ消耗させることになります。
ただ、基本的には"0"にしておいても問題は無さそうです。

aMinimapHexesは、このencounterでミニマップに表示するマーカーです。
hexの座標と、ミニマップに表記する名前が設定できますが、
"Glow"→"Detroit Megacity Gates"のように後から書き換えることも出来ます。

bRemoveCreaturesは現在のhexからcreatureを排除するかどうかを設定します。
"1"にするとそのhexは(自分以外)入れない、ということになりますが
ゲーム中で実際に使われているところは無いようです。

検証(のようなもの)も一応やってはみましたが、
creatureが"入れない"のか"入らない"のか確証が持てませんでした。

bRemoveUsedは、このencounterを発生させるために使ったアイテムを、
ここで削除するかどうかを設定します。
"1"ならそのアイテムは削除されるようです。
これは通常のアイテムでも適用されるため、
Zom Zom'sへ入場する際のイベントのように、
"持っているアイテムの中から指定して渡す"といった処理に使用できます。

nItemsIDは、このencounterに登場する"特別な"アイテムの指定を行います。
普通に所持しているアイテムやスキルはここでは関係ありません。

例えばサンプルのケースでは、Cryoの壊れた窓など
その場面にだけ登場する(配置される)アイテムをここで指定します。

サンプルでは"4"と単体の数字で指定されていますが、
やはり"treasuretable"テーブルのidを使用しているようです。
使用頻度は高そうなので、覚えておいて損はありません。

nCreatureIDは、このencounterで配置されるcreatureの設定を行っています。
が、数字は"creatures"テーブルと一致したものではなく
このIDは非公開(hidden in code)となっています。

コメントを読む限り、公開される予定はあるようですが
現在は使えない設定項目として考えておくのが良さそうです。

ptCreatureHexは、nCreatureIDで指定したcreatureがどこに配置されるかを
(radius,direction)の形で設定しています。
radiusは"半径"という意味ですが、自分のいるhexなら"0"
隣のhexなら"1"…ということで良さそうなのですが、
サンプルで"40"と指定されているのが何を意味するのかよく分かりません。

directionは方角の指定で、"0"なら北、そこから時計回りに数字が増えるようですが、
詳しい情報は読み取れませんでした。

ptTeleportは、encounter終了後?にプレイヤーをどこに移動させるか指定します。
座標のフォーマットは通常のx,y座標で記述されているようです。
実例で言うと、ATN Enclaveを出たときの移動処理などがこれに当たります。

資料には(radius,direction)の形で記述する、とも書かれていますが、
見たところ実際に記述されている例は無さそうでした。

また、xのみの記述で半径xの圏内にランダムワープする、ともありますので
演出として使えるかもしれません。

ptEditorは開発用に使用される数値なので、MOD作成等には一切関係ありません。

nTypeはencounterの種別を指定する数値で、
"0"が通常、"1"はScavenge用、
"2"が戦闘、"3"はハッキングで使用するencounterです。
この設定が実際にどのような影響を与えるかは分かりませんが、
基本的には用途に合わせて設定しておいた方が良さそうです。

fLootChancefAccidentChancefCreatureChanceの3つは、
Scavengeの際に表示される3つのパラメータに対応しています。
0.0が0%で、1.0だと100%という説明ですが、
fAccidentChancefCreatureChanceは少ないほど
Safety/Sneakは高くなるようです。

また、Scavenge時に選択する行動によって変動する数値も、
この3つのパラメータで記述されます(減少する場合は負の値)。
新しくScavenge可能な場所やオプションを用意する場合は、
これらの値の調整が重要になります。

vAccidentsはScavenge時にこのencounterで発生する事故のリストを
"encounters"テーブルのidで指定しています。

サンプルの"1"は空のencounterなので、
何もないときには"1"、もしくは空欄にしておけば良さそうです。
また、複数指定する場合はidをコンマで区切ります。

vLootはScavengeで入手できるアイテムのテーブルを、
"treasuretable"テーブルのidで指定します。
コンマで区切れば複数指定も可能です。


設定項目も用途も広いのがencounterテーブルの特徴ですが、
それだけに、使いこなせばMOD作成に幅が出て来ます。
読み解くのは大変ですが、細かいところまでしっかりとチェックしておきましょう。


0 件のコメント:

コメントを投稿