JavaScriptと変数

Ponkanでは、スクリプトで任意のJavaScriptを実行することができます。

また、ゲームの状態を保存しておく場合には、専用の変数を利用します。

JavaScriptの実行

JavaScriptを実行する方法には以下の3種類の書き方があります。

# JavaScript行 単純にJavaScriptを実行する
- console.log("JavaScript行です");

# JavaScript行 評価結果をメッセージレイヤーに出力する
100+200の計算結果は
= 100 + 200
です。

# JavaScript部 複数行にわたって記述できる
---
let a = 100;
let b = 200;
let sum = a + b;
console.log("a + b = " + sum);
---

行の先頭が-または=から始まっている行は、JavaScript行です。 -の場合はJavaScriptを実行し、結果は捨てます。 =の場合は、実行した結果(評価値)を文字列としてメッセージレイヤーに出力します。

---の行から---の行までの間は、JavaScript部です。 複数行にわたって記述することができるため、長いJavaScriptを書く場合はこちらを利用してください。

スクリプトから実行するJavaScriptの中では、この後に解説する各種変数に加えて、 ponkanという変数でPonkanのインスタンスにアクセスすることができます。

# 変数ponkanにはPonkanのインスタンスが入っています。
# 以下はレイヤーのデバッグ情報を表示する例です。
- ponkan.showLayerDebugInfo();

変数の種類

ゲームの状態を保存するための変数には、以下の3種類が用意されており、それぞれ役割が異なります。

  • 一時変数tv
  • ゲーム変数gv
  • システム変数sv

これらはすべてJavaScriptにおけるObjectになっていますので、利用するときは以下のように使用します。

- tv.a = 100;
- tv.b = 200;
- tv.sum = tv.a + tv.b;

一時変数tv

一時変数tvは、一時的な計算値などを格納しておく場所です。 あくまで一時的な場所なので、セーブデータに保存されることはありません。

# 計算結果を保持しておく
- tv.sum = 100 + 200;

一部のコマンドでは、指定の一時変数に値を格納するものがあります。 (例:forコマンドのインデックスなど)

JavaScript部での計算結果などをコマンドに渡したい場合などにも、一時変数を利用することがあります。

ゲーム変数gv

ゲーム変数gvは、セーブデータに保存される変数です。 セーブデータごとに異なる値を保存します。 シナリオのフラグを保存しておいたり、キャラクターのステータス(HPやレベルなど)を保存しておく用途に使用します。

# 花子シナリオをクリアしたフラグ。
# このフラグが立っていたら、美柑シナリオを解禁する。
- gv.isClearedHanakoScenario = true;

セーブする必要のない値については、一時変数を利用してください。そのほうがセーブデータ容量の節約になります。

ゲーム変数にJavaScriptのFunctionを格納しないようにしてください。復元できなくなります。

システム変数

システム変数はその名の通り、システム全体を通して使用される変数です。 ゲーム変数とは異なり、システム全体で一つだけの値を保持しています。 たとえば、ゲームを一度でもクリアしたかどうかのフラグなどを保存しておく用途に使用します。

# どれか一つでもシナリオをクリアしたかどうかのフラグ。
# このフラグが立っていたら、ギャラリーモードを解禁する。
sv.isClearedSomeScenario = true;

システム変数はゲーム終了時に自動的に保存され、次回以降のゲーム起動時に自動でロードされます。

変数の削除

一度作成した変数は、基本的にはそのまま残っています。

変数をクリアしたい場合は、以下のコマンドを使用してください。

特定の変数のみ削除したいときは、javascriptのdelete文を使ってください。

# ゲーム変数の isClearedHanakoScenario のみ削除する
- delete tv.isClearedHanakoScenario;

コマンドで変数の値を使う(エンティティ機能)

変数の値をコマンドで使いたいときは、エンティティ機能を使用します。

&tv.nameという風に、&に続けて変数名を書くと、パラメータに変数の値設定できます。

- tv.posx = 200;
;layopt lay: 1, x: "&tv.posx"

この例では、tv.posxの値をパラメータxに設定しています。この場合はレイヤー1のx座標が200になります。

正確にはエンティティ機能は、&に続いた文字列をJavaScriptとして評価して、その結果をパラメータとして使用します。 そのため、;ch text="&'100+200=' + (100+200)"のように簡単な式を書くこともできます。