『愛とはあなたを破壊する魔法』制作記録十七
進捗
デバッグ作業をして、BOOTH・ノベルゲームコレクションでゲームを公開しました。
甘翼内の紹介ページです。
ティラノスクリプト版のデバッグについて
いろいろなバグが見つかりました。「わかっているのにやりがちなミス」から「これは気づきにくいなと思うバグ」まで色々あったので、いくつかご紹介します。
NextOrder()由来のバグ
タグをjavascript内で使ったり、自作タグを作ったりするときにありがちなミスです。
NextOrder()は、ざっくり言うと、ティラノスクリプトにおいて次のタグに進むための関数です。
当たり前ですが、NextOrder()を実行した回数分タグは進みます。
そのため基本的にタグ一つにつきNextOrder()は一つしかありません。
ただ、自作タグを作るとき、特に複雑な条件で終了するタグを作るときには、タグの中に複数のNextOrder()が記述される場合があります。
上手くプログラムを組むことで、「複数のNextOrder()が記述されていても、タグ一つにつきNextOrder()は一回のみ発生する」ようにすれば、バグは発生しません。
ただプログラムを組み間違って、複数のNextOrder()が発生してしまうと、当然バグが出ます。
具体的には、クリックしていないのにシナリオが進行します。
この現象が起きたときは十中八九NextOrder()が原因です。
javascript内でタグを使うときは、NextOrder()がタグの中で複数回発生しないようにプログラムを書くのが望ましいです。
ogg形式の音声がブラウザ版で鳴らない
iOS環境でプレイするときや、ノベルゲームコレクションのブラウザ版でプレイするときに発生するバグです。
まずiOS環境のブラウザではogg形式の音声を再生できません。
ティラノスクリプトのタグリファレンスにも記述があります(playbgmの項目にあります)。
タグリファレンスによれば、oggファイルと同名のm4aファイルを用意すれば、どの環境でも音声が再生されます。
ただし、ノベルゲームコレクションに公開する場合、ブラウザ版はoggファイルとm4aファイルが削除されます。
それでいて、タグで指定した音声形式は変わりません※。そのため、音声を再生しようとするとファイルが無いと警告が出ます。
※愛まほはマクロを使用して音声を再生しているため、それも影響している可能性があります。
対策方法は、「mp3で音声形式を統一する」「実行環境ごとに再生するファイルを変える」などです。
私は「実行環境ごとに再生するファイルを変える」方法を選びました。
mp3よりもoggの方が音質が良い(という説が多い)ことなどがあり、できる限りoggで聞いてほしいと思ったためです。
実行環境ごとに再生ファイルを変える方法
環境ごとに再生するファイルを変える方法は、簡単にまとめると以下のようになります。
- 実行環境を判別するタグを作る
- タグを使う
- タグに基づいて再生する音声形式を決める
- 3で決めた音声形式に基づいて音声を再生する
タグ作成方法についてここでは詳しく説明しません。
以下の記事が参考になります。
まず実行環境を判別するタグを作ります。
TYRANO.kag.tag.oct_is_electron = {
pm: {
is_nextorder: "true",
},
start: function (pm) {
TYRANO.kag.variable.sf.is_electron = "false"
if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {
TYRANO.kag.variable.sf.is_electron = "true"
}
if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {
TYRANO.kag.variable.sf.is_electron = "true"
}
if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {
TYRANO.kag.variable.sf.is_electron = "true"
}
TYRANO.kag.saveSystemVariable()
if (pm.is_nextorder === "true") {
this.kag.ftag.nextOrder();
}
},
};
TYRANO.kag.ftag.master_tag.oct_is_electron = TYRANO.kag.tag.oct_is_electron
TYRANO.kag.ftag.master_tag.oct_is_electron.kag = TYRANO.kag
このタグでは簡単に言うと以下のような処理をしています。
- 基本の実行環境を「ブラウザ版である」に設定する。
- 「スタンドアロン版である」条件を満たしたら、「スタンドアロン版である」設定にする。
- 設定を保存する。
2のプログラムは以下のページを参考にしました。
ティラノスクリプト(electron)がスタンドアロンで動いているかを判定する方法は複数あります。
そしてどの方法も完全な判別方法ではなく、判定が漏れるということが起きえます。
そのためすべての方法を試すことで、なるべく判定漏れが無いようにしています。
実際にタグを実行します。
[oct_is_electron]
[if exp="sf.is_electron === ture"]
[eval exp="sf.audio_ext = '.ogg'" ]
[else]
[eval exp="sf.audio_ext = '.mp3'" ]
[endif]
sf.is_electronに実行環境の判定結果が入っています。
実行環境によって「sf.audio_ext」に代入する拡張子を変えています。
音声を再生するマクロです。
[macro name="oct_mc_pbgm"]
[eval exp="mp.exp = sf.audio_ext" ]
[eval exp="mp.name = 'bgm__' + mp.name + mp.exp" ]
[playbgm storage="&mp.name" loop="true" restart="false"]
[endmacro]
音声ファイル名と共にsf.audio_ext(環境ごとに最適な拡張子)を指定することで、環境ごとに再生するファイルを変えています。
おそらくこのプログラムはもっと最適化することが可能だと思います。
次回ティラノスクリプトでゲームを作るときに洗練させたいです。
mp3形式なのにブラウザ環境で鳴らない
iOSでoggが鳴らないことは前述しました。
しかし愛まほではmp3がiOSのブラウザで鳴らない、というバグが発生しました。
ノベルゲームコレクションやローカル環境でも確認しましたが、ファイルは存在するのになぜか再生されないのです。
おそらく原因は「mp3の音質が良すぎること」です。
以下のページによると、iOSで再生できるmp3ファイルは、ビットレートが8~320Kbpsのものに限るようです。
ビットレートはすごくざっくり言うと音質です。数値が高いほど高音質になります。
今回使用したmp3ファイルは320Kbpsでした。
これを128Kbpsに下げたところ、無事再生されました。
詳細な原因は判然としませんが、とりあえず「ブラウザ版で使う音声はほどほどの音質にする」ようにすれば、バグは回避できそうです。
ブラウザ版スタート時音声が鳴らない
他のバグと同時期に修正したバグではないのですが、よくある事例だと思うので紹介します。
ノベコレでゲームを遊ぶ方にとって、最初に表示される「タップしてスタート」の黒画面はおなじみかと存じます。
あの画面はなんのためにあるのかというと、「プレイヤーの操作無く再生される音声はブラウザ側でブロックされる場合があるので、それの対策のため」です。
以下のサイトはティラノスクリプト開発者のシケモクMK様ご本人のブログですが、公開時期の関係上ティラノスクリプトの情報が古いためご注意ください。
愛まほでも、ゲームを起動するとクリック待ち画面が挟まります。
ただ以前はクリックをせずとも時間経過でタイトル画面に遷移していました。
それが原因でOP曲が鳴らないバグが発生したことがあります。
ノベルゲームコレクションにアップロードする場合、タイトルのクリック待ちがなければノベコレ側で追加されるようです。
ただ自作のクリック待ち画面を作る人にとっては、つまづきやすい部分かと思い、紹介しました。
ブラウザ版を公開するときは、音声再生の前にクリック待ちがあるかどうか確認するのが望ましいです。
今後について
引き続きティラノスクリプト版のデバッグをします。
プレイできないほどの重大なバグは修正済みなのですが、細かいバグがまだあります。
技術力の都合上、修正できないバグ(仕様)もありますが、できる限り修正を試みます。
Renpy版・ティラノスクリプト版共に、新機能追加を検討しております。
以下の候補があります。
- バッチ機能(いわゆる実績機能)
- スチル閲覧機能
- エンディング後のストーリー
実装期間などを考慮すると、すべてを追加することは難しいでしょう。
まずはバッチ機能を優先して実装します。
後者二つはゲーム外のコンテンツでカバーすることも検討しております。
スチル閲覧機能は配布予定のデジタルアートブックで、エンディング後のストーリーは小説で、対応が可能と考えております。
まだ作業が残っているとは言え、ゲームが公開できたことで愛まほ制作に一区切りがつきました。
ほっとする気持ちもありますし、プレイヤーに遊んでいただくここからのフェーズが本番だと奮起する気持ちもあります。
ゲームの完成・公開を喜びつつ、気を引き締めて残りの作業に取り組みたいです。