見出し画像

【ティラノスクリプト】Numeric separators エラー対応覚書

そこそこ長らく悩まされていたエラーを潰した記録です。


事象

① ゲーム進行中に下記のダイアログが表示される。

SyntaxError: Numeric separators are not allowed at the end of numeric literals

※このダイアログが表示される条件下では、skipができない。
→ctrlキーを押下してもメッセージがスキップされず、通常のメッセージ送りになる。

再現手順

  1. タイトル画面→コンフィグ画面に遷移する

  2. ゲームを開始する(New Game)

  3. 事象発生

つまり「ゲーム開始前にコンフィグ画面を開くと、進行中にふんわりしたメッセージのダイアログが表示される」という事象です。
ダイアログを閉じればゲームは続行可能ですが、放置するわけにもいきません。

ティラノスクリプト バージョン

v521f

発生箇所のスクリプト

@free layer="0" name="sky" time="1000" wait="true"

*scenario1-1-1

[free]で画像を消した際に発生。
他にも発生した箇所はあるのですが、共通点があるような……そうでもないような……という状態でした。

そもそも「Numeric separators」とは?

エラーが発生したらエラーメッセージから読み解くべきかと思いましたが、正直よく分からんかったです。

Numeric separatorそのものは、こちらの記事を参考にさせていただきました。
JavaScriptで数値の区切り文字を使いたい物語

ただし、_が使用可能なのは数字と数字の間です。端に使うことはできません。また、_を複数連続させることもできません。

JavaScriptで数値の区切り文字を使いたい物語

エラーの発生原因として、このあたりなんだろうな……という何となくの目星がつけられただけでも良しとします。

調査

  1. エラー発生が「ゲーム開始前、タイトル画面でコンフィグを開いた」時に限定されていたため「config.ks」で何か起きたんだろうな! というあたりを付ける。

  2. 「make.ks」に原因がある可能性を潰すべく、「タイトル画面→セーブデータをロード」という手順を踏んで、上記のエラー発生箇所を通過する。

  3. ↑で再現なし。解凍直後のプロジェクトフォルダで「タイトル画面→コンフィグ画面→サンプルシナリオ」の順で実行。

  4. ↑で再現なし。サンプルシナリオで[free]を実行。

  5. ↑で再現なし。「自分、またなんかやっちゃいましたか…?」と思いながら「config.ks」を調査。

続・調査:config.ks

  1. 調査手順4で「[free]が原因ではない」という気がしたので、ラベル関係(「_」は使っていないけど「-」は使っている)なのかな……と考える。

  2. config.ksの中で、ラベル関係の処理を行っている箇所を探す(※)

で、怪しいなと思ったのがこちら。

TG.config.autoRecordLabel = "true"; // ラベル通過記録を有効に

TG.config.autoRecordLabel

Config.tjsから、説明を引用します。

// ◆ ラベル記録
// 重要:既読管理を有効にしたい場合は必ずtrueを指定して下さい
// 自動的に「読んだ」ラベルを記録するかどうかを指定します。
// この設定が false でなく true になっていると、ラベルを読むごとにシステム
// 変数 (sf.record) に
// trail_シナリオファイル名_ラベル名
// という変数名の変数に 1 が加算されます。
// たとえば first.ks の *start というラベルであれば sf.record.trail_first_start とい
// う変数名になります。まだ通過していないカ所では 未定義 ( undefined として見なされ
// ます ) になっています。
//
// 次のラベルに到達した時に ラベルの終了と見なされます。
// 吉里吉里/KAGとは仕様が異なりますのでご注意下さい。
// つまり、jump で他のシナリオファイルにジャンプしただけでは、記録されません。
// シナリオファイルの最初にラベルを配置しておくと記録されます

ティラノスクリプト Config.tjs
  1. デフォルト(Config.tjsでの設定)では TG.config.autoRecordLabel = false;

  2. コンフィグ画面に遷移すると、ラベル通過記録が有効(true)になる。

  3. コンフィグ画面を抜ける前([awakegame]到達前)に、元々の値(false)に戻していない。

スクリプトのソースを読み込んだわけではないので断言はできませんが、ゲーム開始後も「TG.config.autoRecordLabel = true;」になっているのでは?
→エラーが発生したのは「scenario1-1.ks」の「*scenario1-1-1」。
ラベル記録の変数は「sf.record.trail_scenario1-1_scenario1-1-1」になる。

この変数名、駄目そう!!

対応

config.ksに追記します。

[iscript]
tf.tmpMode = TG.config.autoRecordLabel; - 対応1
TG.config.autoRecordLabel = "true"; // ラベル通過記録を有効に

(中略)

*backtitle
[cm]
[iscript]
	TG.config.autoRecordLabel = tf.tmpMode; - 対応2
[endscript]
[layopt layer="message1" visible="false"]
[clearfix]
[start_keyconfig]
[clearstack]

[awakegame]
  1. ラベル通過記録が有効になる前に「元々の設定」を一時変数「tmpMode」に入れる

  2. [awakegame]でゲーム復帰する前に「元々の設定」に戻す

こうしてめでたく、無事にエラーを解消することができたのでした……

正直原因と対応に釈然としない部分はあるのですが、直ったから……一旦良しとします。

この記事が気に入ったらサポートをしてみませんか?