イベントとステップ実行

CardWirthPyのデバッガを使うと、実行中のイベントの内容を表示したり、任意のイベントを実行したりといった操作が行えます。

その上、イベントを1コンテントずつ手動で進めて処理経過を見るようなことも行えます。この機能は、処理を1ステップずつ実行するという意味で、「ステップ実行」と呼ばれています。

これらの機能を使いこなせるようになると、シナリオのテストやデバッグの効率が大幅にアップします。

このページでは、イベントの内容の確認からステップ実行までの流れを、順を追って説明します。

デバッガでイベントの内容を見る

デバッガ上で一番大きな領域を占めているのが、イベントの内容を表示し、操作するためのイベントビューです。

イベントを実行中であれば、ここにイベントツリーの内容が表示されます。普通、イベントの処理はあっという間に進行しますが、メッセージの表示や空白時間などによって処理が止まった時に、このような表示を見ることができます。

「ACTIVE!」と表示されているのは、今まさに実行されようとしているイベントコンテントです。

任意のイベントを開く

メニューやツールバーにあるイベントを開くボタンを押すと、シナリオ内のイベントを選択する画面が表示されます。

ここから任意のイベントを選択して開いたり、実行したりすることができます。

イベントを選んで「実行」を押すと、ただちに選択したイベントが開始されます。

「開く」を押したり、イベントをダブルクリックしたりすると、イベントは実行されないままイベントビュー上に表示されます。あるイベントの実行中に他のイベントの内容を確認したり、後述するブレークポイントを設定したりする時に便利です。

イベントの実行を止める

イベントは、イベントビューを開いているあいだも次々と処理されていきます。途中にメッセージなどがない限り、あっという間に終了してしまうでしょう。

処理の状況をじっくり見ながらテストやデバッグを行いたければ、イベントの処理を、冒頭で、あるいは途中で止めなくてはなりません。

処理を止める方法は2種類あります。「一時停止」と「ブレークポイント」です。

一時停止

「一時停止」とは、イベントが自動的に次々と実行されていく状態の反対、つまり手動で操作しなければイベントが進行しない状態のことです。

イベント一時停止ボタンを押すことで、CardWirthPyを一時停止状態にすることができます。

一時停止中は、ボタンがイベント実行再開ボタンに変化し、もう一度押すことで停止状態が解除されます。

一時停止状態でイベントが開始されると、最初のイベントコンテントで処理が停止します。

ブレークポイント

イベントの冒頭ではなく、途中の、あるイベントコンテントのところで一時停止したい、ということは、複雑なイベントを作成しているとよくあります。

そういう時は「ブレークポイント」を試してみてください。

まずイベントを開くボタンで、途中で止めたいイベントを開きます。

次に、停止したい箇所の左側の灰色の領域をクリックするか、そこのイベントコンテントを選択してからブレークポイントの切替ボタンを押します。すると、そこにブレークポイントマークが現れます。

これで、このイベントコンテントのところにブレークポイントが設定できました。

イベントの実行中、ブレークポイントの設定されたイベントコンテントのところに処理が至ると、自動的に一時停止状態になり、イベントの処理が停止します。

ブレークポイントの整理

ブレークポイントは、イベントビュー上で個別に削除できる他、「ブレークポイントの整理」によって、シナリオ単位でまとめて削除することができます。

一時停止状態は、デバッガを開いている時に限り有効です。デバッガを閉じていた場合は、処理中のイベントコンテントにブレークポイントが設定されていても処理が停止することはありません。

イベントをステップ実行する

イベントが停止している時、「ステップイン」「ステップオーバー」「ステップリターン」の3つの操作が可能になります。

これらは止まっている処理を進行させるツールで、それぞれ微妙に挙動が異なります。

挙動の違いは「スタートのコール」や「パッケージのコール」に関係するところで表れます。各ツールの動作を説明します。

ステップイン

ステップインを実行すると、イベントコンテントが1つだけ処理され、イベントが進行します。



スタートやパッケージへのリンクが処理されて別のイベントツリーへのジャンプが発生すると、ジャンプ先で停止した状態になります。

もちろん、コールの場合も同様です。



コール先の処理が終了すると、コール元へ戻ります。



つまり、「ステップイン」は普通にイベント処理を進行させるツールです。

「ステップ」はともかく、なぜ「イン」などという名前がついているのでしょうか。それは次に説明する「ステップオーバー」との対比のためです。

ステップオーバー

ステップオーバーも、ステップインと同じく、イベントコンテントが1つだけ処理されます。スタートやパッケージのリンクを処理した時も同様に、ジャンプ先で停止します。

しかし、スタートやパッケージへのコールを処理した時には、コール先での処理を一気に行って、コールの次のイベントコンテントで停止した状態になります。



つまり、他のイベントツリーを一時的に呼び出して、終了したら戻ってくるような処理があった場合には、それを踏み越える(オーバーする)ような動作をするのがステップオーバーです。ステップインは、呼び出し先の処理の中にも入っていくので、「イン」という名前がついています。

ステップオーバーを行った場合でも、コール先にメッセージや空白時間があると処理が停止しますが、これは通常のイベント処理時の停止と同じで、一時停止状態ではありません。メッセージ送りなどを行う事で、停止が解除されて処理の続きが行われます。

ステップオーバーは、コール先の処理にわずらわされずに特定のイベントツリーの処理の流れを追いたいとか、パッケージをコールして戻ってきた時の結果だけ確認したいというような場合に便利です。

イベントツリーの末尾にパッケージへのコールがあるような場合には、処理の内容がリンクと同じになるため、ステップオーバーを使ってもコール先の処理で停止します。

これは「呼び出し階層」を節約してイベント処理を効率化するための仕様です。「呼び出し階層」については後述する呼び出し履歴の項を参照してください。

ステップリターン

コール先のイベントを処理している時、コール元へ戻るまでの処理を一気に進めるのがステップリターンです。

現在処理中のイベントツリーがどこからコールされたものでもない場合は、イベント自体が終了するまで処理を進めます。

コール先の処理をある程度見たいのでステップインしたものの、必要なところまで見終えたのですぐにコール元まで戻りたい、というような時に使います。


これらのツールを使って一歩一歩処理を進めていくのがステップ実行です。

使いこなせるようになると、複雑な処理をテスト・デバッグする時に大変便利です。ぜひ、既成のシナリオをステップ実行するなどして練習してみてください。

その他のイベント操作

ゆっくり実行する

CardWirthPyには、ステップ実行の他に、各イベントコンテントの実行前に空白時間を入れる機能もあります。

デバッガのツールバーにあるウェイト欄に数値を入れると、1つのイベントコンテントを処理する前に、指定された時間だけ待機するようになります。

イベントの流れを観察したいが手動でステップ実行するのは面倒、というような時に便利です。

処理のジャンプ

一時停止中に、イベントビュー上に表示されているイベントコンテントをダブルクリックすると、次に実行されるイベントコンテントを変更する事ができます。



行き過ぎてしまった処理を戻したい時や、途中の処理を省略してイベント終盤だけテストしたい、というような時に便利です。

本来処理されるべきだった箇所からまったく異なるところへジャンプするため、本来実行されるはずだったイベントツリーが実行されず、普通にプレイしていたのではありえない結果になるような場合があります。

イベントの構造をしっかり把握した上で、注意してご利用ください。

イベントの強制終了

イベント強制終了を押すことで、実行中のイベントを強制的に中止することができます。

呼び出し履歴

イベント処理の途中で他のイベントツリーのコール(呼び出し)が行われ、その中でまた別の処理のコールが行われ……というように、何段階もコールが重ねられるのは、よくある事です。

そのような処理の構造は、階層にして表すことができます。これを「呼び出し階層」といいます。

コール先では、どこからコールされたかが記憶されていなければなりません。そうでなければ、戻り先がどこかがわからなくなってしまうからです。

デバッガには、記憶されているコール元を一覧表示する機能があります。

呼び出し履歴ボタンを押すと、「呼び出し履歴」が表示されます。

この機能を使うと、複雑なコールの先にあるイベント処理が、どのような経路をたどってきているのかを、ある程度まで確認することができます。

履歴上の各コール元をダブルクリックすると、コール元のイベントコンテントがイベントビュー上で表示・選択されます。

「呼び出し履歴」では、全ての経路を確認できるわけではありません。

たとえばスタートやパッケージへのリンクは履歴に記憶されません。リンクは、イベント処理上、コール元へ戻ることがないので、戻り先を記憶する必要がないからです。

イベントツリーの末尾にあるパッケージのコールなども、リンクと同様に扱われます。これは、呼び出し階層が増えれば増えるほどメモリなどのリソースを消費するため、できるだけ階層を増やさないようにCardWirthPyが設計されているためです。

また、エリア移動やバトル開始を挟むと、イベントはいったん終了し、別のイベントが開始されたことになるため、エリア移動前の呼び出し履歴を追跡するようなこともできません。