ティラノスクリプトではじめてのノベルゲーム制作をした (作業編)

前回の記事

wandervogel.hateblo.jp

でティラノスクリプトで制作してノベルゲームコレクションで公開中の「探しものは、夏ですか。」を制作するにあたって使用したツール類を紹介しました。
今回は実際に僕の行った作業の中で、「制作開始時と終了時で大きく方法が変わった部分」について記事にしてみようと思います。

具体的には

  • マクロの使用方法
  • シナリオ担当者から貰うテキストをシナリオファイルにする時の手順
  • プリロードのファイル等、いくつかの作業の自動化
    の3点です。

当然、ティラノスクリプトを使用しない方にはあまり関係のない話となりますので、その点はご了承ください。

その前に宣伝!笑

探しものは、夏ですか。

f:id:unity-ta:20180905221709j:plain

2018年8月、数年ぶりに帰省した田舎町で僕は何故かビー玉を探す不思議な女の子と出会った。
「──じゃあ、私のお願い……聞いてくれない?」
きっと忘れることのない、僕の見つけた平成最後の夏休み。

https://novelgame.jp/games/show/1111

圧倒的夏感を感じていただければ嬉しいです。

ティラノスクリプトではじめてのノベルゲーム制作をした (作業編)

マクロの使用方法

ティラノスクリプトにはいくつかのタグのまとまりをマクロとして登録し、呼び出す便利な機能があります。
このマクロですが、使い始めた頃は適当に書いていたものの、途中で大きく方針を変更したところ大変効率が上がりました。
そこで、「マクロはこんな感じで書くと調子いいよ」という意味を込めて、今回実装したマクロの作成ルールについて説明したいと思います。

1.命名規則

ティラノスクリプトはたぶん歴史的な経緯により、タグの命名が実装された時期等によって異なります。

たとえば、 [reset_camera][resetdelay]といった具合に、lower_snake_caseだったり、アンダーバーがなかったりします。
また、[chara_show][playse]のように、[名詞_動詞][動詞名詞]も存在します。
あまり詳しくはないのですが、タグの源流が吉里吉里から続いているらしいという経緯を鑑みると、ティラノの実装がこのようになっているのは仕方ないのだろうと思います。
しかし、初心者からするといかんせん覚えづらかったりします。
シケモクMKさん、今のタグをdeprecatedにしろとはいいませんが、ぜひラップした新タグの実装を……

そこで、

  • マクロは[動詞_名詞(_補足)]で書く

を徹底するようにしました。

2.すべてのパラメータにデフォルト値を設定したラッパーマクロを作成する

まずやったことは標準のタグをラップしただけのマクロを作ることです(よく使うものに限り)

たとえば標準で存在するレイヤの表示非表示を切り替えるタグlayoptであれば

;メッセージ枠隠す
[macro name="hide_mes"]
    [layopt layer=message0 visible=false]
[endmacro]

;メッセージ枠表示
[macro name="show_mes"]
    [layopt layer=message0 visible=true]
[endmacro]

といった具合にラップしました。
余談ですが、マクロの定義では[macro name=~~]から[endmacro]の中はインデントすることで可読性が上がります。
シナリオファイル内でも、例えば暗転と暗転解除の間などインデントを利用すると可読性がよくなるのでオススメです。

また、引数(パラメータ)のあるタグについてはなるべくデフォルト値のある状態で定義しました。

; --- 暗転.
[macro name=start_dark]
    [backlay]
    [image layer=3 page=back folder=bgimage storage=black.jpg name=black width=1280 height=720 top=0 zindex=99]
    [trans layer=3 time=%time|500 wait=true]
    [wt]
[endmacro]

; --- 暗転解除.
[macro name=finish_dark]
    [backlay]
    [free layer=3 name=black page=back time=%time|500]
    [free layer=3 name=black page=fore time=%time|500]
[endmacro]

といった感じですね。

3.アスタリスクは使わない

アスタリスク(*)をマクロ内で利用すると呼び出し側でパラメータを決めることができます。

[macro name=change_message_visibility]
    [layopt layer=message0 *]
[endmacro]

と設定した場合、呼び出し側は[change_message_visibility visible=true]と呼び出すことができます。
これは便利な機能ですが、僕は今回使わないようにしました。その理由は上記の「デフォルト値」にこだわったためです。
背景変更時のwidthheightといったパラメータはおおよそゲームを通して、同一の値が設定されることが多いと思います。

下記が「サガナツ」で使った背景トランジションのマクロの定義になります。

; - 背景変更 -
[macro name=transition]
    [backlay]
    [image layer=%layer|1 page=back folder=%folder|bgimage storage=%storage name=%name|name width=%width|1280 height=%height|960 top=%top|-100]
    [trans layer=%layer|1 time=%time|1]
    [wt]
    [free layer=%layer|1 name=%delete_image|"" time=1 wait=true]
[endmacro]

呼び出し側は[transition name=back storage=back.jpg]と呼び出すこともできますが、[transition name=after storage=after.jpg width=2560 height=1920 time=1000 delete_image=before]といったようにパラメータも設定できます。

この3つのルールを徹底したところ、シナリオファイルの可読性が一気に上がりましたと思っています。

以下、背景変更時の記述の比較です。

;macroの作成なし
[layopt layer=message0 visible=false]
[backlay]
[image layer=3 page=back folder=bgimage storage=black.jpg name=black width=1280 height=720 top=0 zindex=99]
[trans layer=3 time=500 wait=true]
[wt]
[backlay]
[image layer=1 page=back folder=bgimage storage=hoge.jpg name=hoge width=1280 height=960 top=-100]
[trans layer=1 time=1]
[wt]
[free layer=1 name=fuga time=1 wait=true]
[backlay]
[free layer=3 name=black page=back time=500]
[free layer=3 name=black page=fore time=500]

という冗長な記述が

;macroを利用
[hide_mes]
    [start_dark]
        [transition name=hoge storage=hoge.jpg delete_image=fuga]
    [finish_dark]
[show_mes]

と簡潔になります。

シナリオファイル作成時の手順

まず、サガナツの制作ではシナリオ担当者にはプレーンテキストでシナリオを書いてもらったうえで、いくつかのルールを守ってもらいました。

  • コメントを入れる行は行頭に*を入れる
  • 鉤括弧の前の名前欄に表示したい名前には+をつける

など。

これをおこなったテキストファイルは、

*会話シーン

+k
「これは会話シーンだよ」
+女の子
「そうなの?」

彼女は不思議そうな目でこちらを見つめている。

といった感じになります。
(頻出する名前は+k等の省略方法を決めました)

その上で上記形式のテキストファイルから、ティラノスクリプトで利用する拡張子.ksのシナリオファイルに変換するコンバータをpythonで書くことで効率をあげました。
具体的には+/+を#に置換したり、*/*を;に置換。:ファイル名とした行にファイル名.jpgに背景を変更するタグを挿入。
」で終わっている文の次の文が#で始まらない時は名前欄の表示を消すために#1文字の行の挿入、タグやコメントではじまらない行末に[p]を追加……
のような感じですね。 pythonのソースを公開してもいいんですが、ちょっと雑に書きすぎて恥ずかしいので、リファクタする気分になったら記事にしますw

コンバータによって

*もとのテキストファイル
+女の子
「場面転換!」
:hoge
+男の子
「場面転換したよ」

というプレーンテキストをボタンひとつで

;もとのテキストファイル
#女の子
「場面転換!」[p]
#
[hide_mes]
    [start_dark]
        [transition name=hoge storage=hoge.jpg]
    [finish_dark]
[show_mes]
#男の子
「場面転換したよ」[p]

といったように変換できるようになりました。

もちろん、ここから調整やら演出追加やらを行うのですが、ゼロからやるのに比べて何倍も作業速度が上がりました。(このツールを作るまではちまちまエディタの置換機能使ってました。ちょっと正規表現に強くなれた気がするのでいい経験ですw)
なので、ちょっとpython書いて単純な作業はツール任せにしていくと幸せになるなぁと、極めて当たり前でとっても重要なことを再認識しました。
pythonは割と初学者にもオススメできる言語なので、pythonナニソレな方もこれを機にpythonを一緒に勉強しましょう!w

その他、一部の自動化

まず、サガナツはタイトル画面の前にリソースファイルのプリロードを行っているのですが、このプリロードをスクリプト(正確にはスクリプトインナーのjs)で書くと、各リソースのパスの配列を定義しなきゃいけなくて。
タイポ怖いし、リソース変えていちいち変更しなきゃいけないの面倒だったので、これもpythonで自動化。
bgimageフォルダ以下、fgimageフォルダ以下の画像のパスをすべて取得してプリロード時の配列を定義させることにしました。

これで、ひとまずタイポやミスがないので「プリロード対象のリソースがない」といった事態は避けられるようになりました。
こちらも大したコードではないですが、需要があればリファクタして共有します。

他に、これは公開後に作成したのですが、シナリオファイルの中で
* storage=で指定しているリソースファイルが見つからない場合に警告を出す
* シナリオファイル内に閉じられていない[]や、全角の#や;を検知したら警告を出す

といったツールを作成しました。 公開最初のバージョンで上記のミスが残っていた為です。こういう凡ミスはなるべく人の目で確認しないでも発見できる方が幸せです。

まとめ

マクロにしてもpythonで作ったツールとも呼べないレベルのツールにしても、実装者を疑う(補助する)ための方法ですね。
演出や効果音のタイミングなどクリエイティブな作業に時間を使うことは結構ですが、機械的な作業に時間を使うのは無駄だと思い、できる範囲で自動化しました。

特にpreloadのところは人間の手で書いたら100%ミスが絶対出てイラつくだろうなって思ったので。笑 今度はこれらのpythonを順に実行し、警告がなければzipで固めるようなプログラムでも書こうかな、なんて思ったりしてます。
pythonについては参考にはならないかもしれませんが、マクロ作成ルールを決めるというのは結構オススメです。 「マクロの使用回数を減らす」よりも「マクロの記述量を減らす」ことを前提に汎用性のあるマクロの定義を意識すると使いやすくなるなぁといった印象でした。

僕の検索が足りないのかもしれませんが、特定の実装方法についての記事は見られても、ティラノスクリプト全体の使い方や効率化の方法があまり見つからなかったので、今回はちょっと真面目に書いてみました。
マクロにしても、変換ツールにしても、おそらくこのあたりはプロジェクトごとに全然違うものになると思いますので、「こんなやり方をしてる人もいるんだ」程度に思っていただければ幸いです。