はじめに
本稿では、7 Days to Die のMod作成時に欠かせない「デバッグ」について解説します。
以下の順番に解説していきます。
- デバッグって?
- デバッグの種類
- デバッグ実践
デバッグって?
デバッグとは、何らかの開発作業において切っては切れない関係です。
例えば「アイテムBを追加するModletを入れて起動したけど、アイテムBが追加されていない!」みたいなケースの場合に、なぜ追加されていないのか?どこが間違えているのか?それらを追求して不具合を修正する作業のことを言います。
7 Days to Die のMod制作においても重要な作業で、ものによってはxpathを記述するよりもバグ取りしてる時間の方が長い挙句、結局解決できなかった みたいな事も割と日常茶飯事です。
デバッグの種類
不具合にはある程度パターンが存在します。
以下に例を挙げると
- 起動時にエラーが発生するパターン
- 起動時にエラーは発生しないが、数値の反映などがうまくいっていない
- 起動したらゲームがクラッシュする
上記のような現象が大半かと思います。
この記事では、上記3パターンのデバッグ方法を記載していきます。
デバッグ実践
起動時にエラーが発生するパターン

ワールド選択時に、急に画面上部に半透明のUIが出てきて、赤色の文字でユーザーを脅してきます。
この赤色が出たときは、データを読み込む際に何かしら不具合があってデータとして認識できない時や、想定していた値を超えたものを設定したり逆に設定しなければいけないものが設定されていなかったりするとよく起こります。
一例ですが、以下のXmlにエラーがあります
<append xpath="items/item"
<item name="TestTool">
<property name="Class" value="Test" />
<effect_group>
<passive_effect name="EntityDamage" operation="base_set" value="100" />
</effect_group>
</item>
</append>
上記の例の場合は、appendタグの閉じカッコがないためエラーになっています。
赤文字が出るときは、意外とケアレスミスの事が多いので以下のプロセスである程度は原因が絞れます。
1.直近変更を加えたコードを削除(もしくはコメントアウト)して再度ワールド読み込み
2.赤文字が出なくなればエラー解消。まだ出る場合は再度遡って追加したコードを削除
3.1~2を繰り返し実行して赤文字が出なくなるまで根気よく繰り返す
上記でほとんどの不具合は解消できますが、この手法を用いるためには最初のあまりコードを書きなれていない時期は1変更毎にワールド起動しなおして問題ないか確認する ぐらいの慎重さがあってもいいかもしれません。
(慣れた頃に一度に大量に追加 -> 大量の赤エラー が一番ヒヤっとします)
起動時にエラーは発生しないが、数値の反映などがうまくいっていない
正直一番厄介です。
赤色が出てくれればとりあえず何か間違えているんだな?と予測もつきますが、このパターンでは一見何の問題もなくワールドが立ち上がってしまい、そのままプレイだってできます。
例として、以下のxmlでは石斧の攻撃力を10上昇させるコードです。
<!-- 石斧の攻撃力を10上げたい -->
<append xpath="items/item[@name='meleeToolRepairT0StoneAxe']">
<passive_effect name="EntityDamage" operation="base_add" value="10"/>
</append>
※ operation=”base_add” は、基礎値にvalue分「加算する」という構文です
上記をModletに記入してプレイしてみると
(適用前)

(適用後)

????????
なぜか適用されていません。起動時にエラーも吐いてないのに…
と、一瞬原因がわからずに途方に暮れるかもしれません。
そんな時は、一旦ゲーム画面から目を背けて以下のフォルダを漁りましょう。
「C:\Users\ユーザー名\AppData\Roaming\7DaysToDie」
※ ユーザー名 にはそれぞれのPCのユーザー名が入ります
上記のフォルダには、7 Days to Die のセーブデータが保管されています。
ワールド選択画面にて以下を確認します。

この画像から以下の情報が確認できます。
- 11: セーブデータ名(もうちょっとちゃんとした名前にすればよかった)
- Navezgane: ワールド名
上記2点を確認できます。
確認したら以下の手順を行います。
1.先ほどのセーブデータのフォルダ内「Saves」フォルダを開きます。
2.フォルダの中に「ワールド名」と同じ名称のフォルダがあるので開きます。
3.フォルダの中に「セーブデータ名」と同じ名称のフォルダがあるので開きます。
4.フォルダの中に「ConfigsDump」というフォルダがあるので開きます。
上記手順で「ConfigsDump」フォルダまで到達すると、見たことのあるファイル群があります。
このフォルダの中のxmlファイルは、Modletが読み込まれた「後」のxmlデータが格納されています。
今回は「items.xml」が対象なので開いて石斧の情報を確認します。



ファイルを最後まで見ると、itemタグ内の一番最後に
<passive_effect name="EntityDamage" operation="base_add" value="10">
<!--Element appended by: "zzz_RSM_Debug"-->
</passive_effect>
という見慣れないコードが挿入されています。
これこそが、Modletから適用されたコードになります。
↓バニラのitems.xml(上記のコードが無い)

さて、データが追加されているのでModletのコードは問題なさそうですが、よく見るとitemタグの中に<passive_effect>が挿入されています。
<passive_effect>は、<effect_group>内でしか効果を読み取ってくれないので今回の不具合はここに原因がありそうです。
Modletのコードを確認してみましょう
<!-- 石斧の攻撃力を10上げたい -->
<append xpath="items/item[@name='meleeToolRepairT0StoneAxe']">
<passive_effect name="EntityDamage" operation="base_add" value="10"/>
</append>
コードを改めてよく見直してみると、<effect_group>の中に入っていません。
コードを修正します
<!-- 石斧の攻撃力を10上げたい -->
<append xpath="items/item[@name='meleeToolRepairT0StoneAxe']">
<effect_group>
<passive_effect name="EntityDamage" operation="base_add" value="10"/>
</effect_group>
</append>
これでワールドを起動しなおしてみると…

無事、攻撃力が上昇しました。
今回のケースでは割と単純なミスだったとかと思いますが、思いのほかこのパス誤りというのは頻繁に見かけます。
なので、エラーが出ないのに反映されない みたいなケースの場合は以下の点を順番に確認していくと解決が早まるかもしれません。
1.まずは自分の書いたコードをよく見つめなおす
2.「ConfigsDump」の中身を確認する
3.(2)で期待した通りに反映されていない/そもそもコードが適用されていない場合は、
もう一度自分の書いたコードを見つめなおす
4.それでも解決しない場合は、近くの有識者に相談する
5.(4)が物理的に無理な場合は…質問でも投げてもらえれば時間あるときに答えます
起動したらゲームがクラッシュする
何かとんでもないやらかしをしている可能性か、ゲームの仕様的にやってはダメな事をやろうとしている可能性があります。諦めるか、諦めきれない場合は有識者に相談しましょう。
余白
今回は、実際に起こりうる不具合のケースとその解決方法の一部を紹介しました。
初級編ではまだまだ複雑なコードを書く機会もないとは思いますので大抵は解決できると思います。
「ConfigsDump」の存在は知らない人は知らないですが、知ってる人は知ってるうまい飯屋みたいな感じで、これの存在を知ってるのと知らないのとではデバッグの質が100倍ぐらい変わります。
コメント