記事一覧

[if]をネスト(=入れ子状に)できるように改造する

●バージョン

v455b standard pk.


●現在の[if]~[endif]関連の仕様

[if][elsif][else]タグがスタートすると、もし条件が真ならば次の行に進み、
偽ならばそのタグの次に(2000行以内に)現れる[elsif][else][endif]を探して(
見つかったらそこにいく、という仕様になっている。


●[if]~[endif]をネストしたときの問題点

いまの仕様だと、の際には、
見つかったタグのif深さを考慮せずに実行するようになっている。
たとえば次のようなスクリプトであれば、朱色の部分がマッチしてしまう。

[if]
  [if]
    ...
  [endif]
[else]
  ...
[endif]

これでは想定通りには動かない。
想定通りに動かすためには、次のようにマッチしてほしい。

[if]
  [if]
    ...
  [endif] <僕はif深さが違うから反応しないよ!
[else]
  ...
[endif]

こうするためには、のところを、
見つかったタグのif深さが呼び出し元のif深さと同一である場合にのみ実行する、
という仕様に変更すればよい。

そこで、いくつか変更を加え、[if]をネスト可能なようにしてみた。


●変更を加えたもの

※変更した箇所は「//#」で検索すると見つけることができます。

〇./tyrano/plugins/kag/kag.tag_system.js
  [if][elsif][else]の挙動を変えた。ifスタック関連の処理を変更。

〇./tyrano/plugins/kag/kag.tag.js
  の処理を変えた。の正体はnextOrderWithTagメソッド。

〇./tyrano/plugins/kag/kag.parser.js
  シナリオファイルをパースする(=文字列をエンジンが扱えるデータに変換する)とき、
  [if][elsif][else][endif]のif深さを記録するようにした。


●ダウンロード

次のリンクからプロジェクト一式をダウンロードし、
ティラノライダーで動作を確かめてみよう。

リンク:プロジェクト一式(DropBox)

また、次のJavascriptコード整形ツールにいつもお世話になっております。
リンク:JavaScriptのコード整形ツール
スポンサーサイト

コメント

コメントの投稿

非公開コメント