動作チェックやバグ発見はアドオン開発においてとても大事です。このページでは、そのような用途に役立つデバッグモードの機能他を紹介します。
チートに使うのはやめましょう。
デバッグモードの起動方法
起動コマンドに -d もしくは --debug をつけて起動すればいいです。Windows, Mac, Linuxで共通(のはず)です。
※Macユーザーの方は馴染みが無いかもしれませんが、この方法はターミナルから起動コマンドを使用してWesnothを起動するときに使う方法です。
Macユーザー向け-ターミナルで起動する方法
ターミナルを起動したら下の二行をターミナルにコピペしてリターンキーを押す。
cd /Applications/The\ Battle\ for\ Wesnoth.app/Contents/MacOS/ ./The\ Battle\ for\ Wesnoth
別の方法として、普通に起動した上、コマンドモードでdebugとタイプする(:debug)ことでも起動できます。
デバッグモードでの機能
特殊機能は色々あります。網羅するのはだるいのでやめます。まぁ知らないし、調べるのもだるいとも言う。
右クリックメニュー
右クリックメニューにいくつか特殊コマンドが増えます。
ユニットの作成
文字通り現在のカーソル位置にユニットを作成します
陣営変更
カーソル上のユニットの陣営を変更します
ユニットを殺す
文字通りカーソル位置のユニットを殺します。イベント等も発生するようですが、secondary unitとかを設定できないので、それ系のチェックには使い辛いです。
コマンドモード
一部の機能はデバッグモードでなくても元々使えます(:droid あたりはマルチやる人なら結構使う?)が、デバッグモードにすることでコマンドが増えます。
- コマンドの使い方
ゲーム画面中(タイトル画面とかではダメ)、コロン(:)をタイプすると画面下部にコマンドウィンドウが開き、そこにコマンドを入力する形になります。
1.13ではキーボードのレイアウトを気にしていないのか、セミコロン(;)でコマンドモードを起動することになるかもしれません。その場合、開いたコマンドウィンドウに;が入力されているかもしれませんが、それはしれっと消しましょう。
参考(英語) https://wiki.wesnoth.org/CommandMode
イベントを発生させるコマンド等(:throw :fire)、他にも色々ありますが、とりあえずは省略で。
コマンドモードを実行していると画面左上に色々表示されると思いますが、これはCtrl+xで消せます。コマンドモードに関係無いエラーメッセージとかも同じようにCtrl+xで消せます。
以下、覚えとくと良さげなコマンド
:help
コマンドの一覧が表示されます。デバッグモードがonの時には、デバッグモード専用のコマンドも表示されます。
:fog
霧のon/offを切り替えます。
:shroud
幕のon/offを切り替えます
:n [シナリオid; 省略可] (or :next_level [シナリオid; 省略可])
次のシナリオに移動します。オプションとしてシナリオIDを渡すと(:n (シナリオのid))、指定したシナリオに移動します。
:cl (or :choose_level; 1.13以降)
シナリオリストのポップアップウィンドウを開き、そこで指定したシナリオに移動します。
:gold [量; 省略可]
現在プレイ中の陣営に金を与えます。:gold 300だと300ゴールド追加されます。量を指定しない時には1000追加されるようです(1.12)。
:turn [ターン数; 省略可]
オプション省略時には現在のターンを1増やします。オプションでターン数を指定した場合は、現在のターンが指定したターンになります。制限ターンの方を変える場合には:turn_limitを使用してください
:turn_limit [ターン数; 省略可]
オプションを省略するか、-1以下を指定した場合、制限ターンが無制限になります。それ以外の場合は制限ターンが指定したターン数に設定されます。
:unit (各種オプション)
ユニットの状態を変更とか色々します。マウスカーソルで指定しているユニットに対して操作することに注意してください。いくつか有用な例をあげると、
:unit hitpoints=(値)
ユニットのHPを変更。最大値以上の値も、負の値も受け付けられます。なお、HPが0以下のユニットは、攻撃を受けるとそれが当たろうが当たらまいが関係なく即死します。特定のユニットで特定のユニットを殺すテストなどに有用です。
:unit advances=(値)
ユニットを(値)回レベルアップさせる
:unit moves=(値)
ユニットの移動力を変更。最大値をこえても問題ありません。
:unit attacks_left=(値)
ユニットの攻撃可能回数を(値)にします。例えばattacks_left=20とした場合、そのユニットはそのターンに20回攻撃することが可能です。
:unit experience=(値)
見たまんまなので略。max_experience, max_hitpointsとかも余裕で変更できます。
:unit status=petrified
1.13ではステータスも変更できるようです(これは石化)
:inspect
割と最終に近い手段です。ゲームの内部状態(変数、イベント、AI他)をすべて表示します。規模が大きいキャンペーン等でやると表示とか動作速度が割と悲惨なことになるので注意しましょう。小中規模ならほとんど問題無いと思います。
エラーメッセージの表示(デバッグモード関係なし)
イベント途中のデバッグをするには以上の機能ではやりにくいこともあるでしょう。そーゆー時は残念ながら、古典的なデバッグ出力をするのが基本になる…なりますよね?
[message]で表示しても良いんですが、ある程度数があるとうざいし、スキップ機能(Esc)は融通があまりに効かないので、この記事の著者的にはいまいちだと感じています。
そこで、代替として[wml_message]を使います。これは[message]のようにメッセージウィンドウに表示されるわけではなく、画面左上のログっぽいところと、標準エラーに出力されるものです。多分。
とりあえず以下のように使います。本来の用途から大分ずれているような気がしますが、諦めてください。
[wml_message] message = "$unit.id $var hogehoge" logger = err [/wml_message]
この例のように変数も問題無く表示できます。以下のようにしてマクロ化して使うのもありかもしれません。
- マクロ
#define MY_DEBUG MSG [wml_message] message = {MSG} logger = err [/wml_message] #enddef
- チェックしたいイベントへマクロを埋め込む
[event] name = attack end first_time_only = no {MY_DEBUG "$unit.id $secondary_unit.id attack_end"} ...
メンテナンスツール wmllint, wmlscope, wmlindent
wesnothパッケージに付属しているツール群です。これも有用かもしれません。wmllint,wmlindentはファイルを直接修正します(バックアップは残りますが)。エラー箇所を調べるだけならdryrunで実行しましょう(-d or --dryrun)。
これら三つの共通インターフェイスとなるGUI.pywってのもあります。1.13系以降ではwmlxgettextも含まれるようになりました。ちなみに、1.12系ではpython2系を使っていますが、1.13以降ではpython3を使うようになったようです。
特殊なコメント文を与えることで、チェックをスキップすることもできます。例えば、mainline系のブツの中身を見ると、# wmllint: (何か) みたいなものを良く目にするかと思いますが、それらはまさにエラーチェックのための特殊コメントです。基本的に、公式系のモノはこれらのツールに何も文句を言われない形にするようになっている(はず)ため、そのようになっているような気がします。
参考(英語): https://wiki.wesnoth.org/Maintenance_tools
wmllint
文法チェック、英単語のチェック、翻訳関連のチェックとか色々チェックしてくれます。普通に実行するとファイルを置き換えたりします。自動で直してもらってもいいですが、その場合でも一応ログは確認した方が良いでしょう。妙なことをする可能性は低いですが、ゼロではないです。
安全にやるなら、dryrun(-d or --dryrun)で実行した後、手動でそれを反映させていく方がいいかも。
wmlscope
あんまり使ったことないんで良くわかんないですが…マクロとかの整合性チェックとかするらしいです。便利なんですかね?
不足している画像の検索に便利らしいですよ。
wmlindent
インデントを自動的に修正してくれます。四つのスペース(" ")がインデントのユニットです。これは実行時オプションとかで修正できないようになっているようです。
この記事の著者はこんな大きいインデント幅は憤死しそうなほど嫌い(自分が書いているもの限定)なのでほとんど使ったことないです…