Module GS はHSP3用のスクリプト実行モジュールです。
ゲームのシナリオ処理やオブジェクトの配置などで使用することを想定して設計されています。
実装されている命令は基本的な制御系のみであるため、用途に合わせて命令を追加する必要があります。
主な機能は次の通りです。
ゲームのシナリオ処理やオブジェクトの配置などで使用することを想定して設計されています。
実装されている命令は基本的な制御系のみであるため、用途に合わせて命令を追加する必要があります。
主な機能は次の通りです。
・HSP互換の文法のスクリプトを読み込んで実行
・スクリプトをeval風に実行
・文字列化された数式の計算
・スクリプトを専用のGSCC形式に変換
・GSCC形式のデータを読み込んで実行
・変数は整数、実数、文字列、ラベル型で4次元配列まで利用可能
・複数のスクリプトをまとめて実行する直列のスレッド機能
・スクリプトの実行ログ管理
・簡単な定数置換え(特殊展開未対応の#define)
・名前空間による衝突低減(#name ~ #endname)
・ファイル結合(#include)
・スクリプトをeval風に実行
・文字列化された数式の計算
・スクリプトを専用のGSCC形式に変換
・GSCC形式のデータを読み込んで実行
・変数は整数、実数、文字列、ラベル型で4次元配列まで利用可能
・複数のスクリプトをまとめて実行する直列のスレッド機能
・スクリプトの実行ログ管理
・簡単な定数置換え(特殊展開未対応の#define)
・名前空間による衝突低減(#name ~ #endname)
・ファイル結合(#include)
動作環境
HSP3.1以降(必須:モジュール変数)
3.32以降を推奨(要:strrep、無い場合は代替関数を使用)
HSPDishは動作確認ができないため動作保障外です。
HSPの基本命令とモジュール変数で構成されています。
メモリノートパッド系命令は使用していません。
マシン語埋め込みやWINAPI、COM関連も使用しません。
(オプション指定によっては一部の機能でWINAPIを使用します)
3.32以降を推奨(要:strrep、無い場合は代替関数を使用)
HSPDishは動作確認ができないため動作保障外です。
HSPの基本命令とモジュール変数で構成されています。
メモリノートパッド系命令は使用していません。
マシン語埋め込みやWINAPI、COM関連も使用しません。
(オプション指定によっては一部の機能でWINAPIを使用します)
使用方法 – 基本
インストール方法などは同梱されているドキュメントを参照してください。
Module GS(以下GS) は、例えば
といった感じで新規命令を定義して、
このようなHSP互換の文法のスクリプトを解釈して実行する、というものです。
標準では CreateEnemy という命令は存在しないので、gsc_Func で定義して解釈できるようにしています。
基本的な文法はHSP互換ですが、いくつかの命令はHSPと異なる動作になります。
HSP互換のevalとして使用する場合はその点に注意してください。
新規命令は gsc_Func で指定したラベルに対するサブルーチンジャンプという形になります。
引数は次の例のように _gsc_p1 や _gsc_p2 で参照できます。
引数は最大で8個まで、型は整数、実数、文字列、変数、ラベルが指定できます。
型によって _gsc_p1 などの型も変わります。
整数、実数、文字列はそれぞれの型ですが、変数は変数構造体を表す整数配列、ラベルはラベルIDを表す整数値になります。
スクリプトの実行には読み込み、スレッド作成、割り当て、実行の4ステップが必要になります。
gsc_Load() でテキスト形式のスクリプトをコンパイルしてコードIDを取得します。
スレッドはコードを実際に実行し、その状態を保持するためのものです。
内部管理における便宜上の呼び方であり、マルチスレッド等とは異なります。
基本は一つのコードを一つのスレッドに割り当てますが、
一つのコードを複数のスレッドで共有することも可能です。
複数のスレッドを使えばメインのシナリオ処理を行いつつ、別のキャラクタを動かす等の処理が可能です。
gsc_Main は存在するスレッド全てを『直列』、『登録順』で実行します。
よって実行結果は常に一定になります。
Module GS(以下GS) は、例えば
gsc_Func "CreateEnemy", *CREATEENEMY, GSMD_INT, GSMD_INT, GSMD_INT
といった感じで新規命令を定義して、
x = 0 : y = 0
repeat 8
CreateEnemy 1, x, y
x+10
loop
stop
このようなHSP互換の文法のスクリプトを解釈して実行する、というものです。
標準では CreateEnemy という命令は存在しないので、gsc_Func で定義して解釈できるようにしています。
基本的な文法はHSP互換ですが、いくつかの命令はHSPと異なる動作になります。
HSP互換のevalとして使用する場合はその点に注意してください。
新規命令は gsc_Func で指定したラベルに対するサブルーチンジャンプという形になります。
引数は次の例のように _gsc_p1 や _gsc_p2 で参照できます。
*CREATEENEMY
type = _gsc_p1
x = _gsc_p2
y = _gsc_p3
// 実際の生成処理など
return
引数は最大で8個まで、型は整数、実数、文字列、変数、ラベルが指定できます。
型によって _gsc_p1 などの型も変わります。
整数、実数、文字列はそれぞれの型ですが、変数は変数構造体を表す整数配列、ラベルはラベルIDを表す整数値になります。
スクリプトの実行には読み込み、スレッド作成、割り当て、実行の4ステップが必要になります。
bload "script.txt", buf
code = gsc_Load(buf) // 読み込み
thread = gsc_thread_Create() // スレッド作成
gsc_thread_SetCode thread, code // スレッドにコード割り当て
gsc_Main // 実行
stop
gsc_Load() でテキスト形式のスクリプトをコンパイルしてコードIDを取得します。
スレッドはコードを実際に実行し、その状態を保持するためのものです。
内部管理における便宜上の呼び方であり、マルチスレッド等とは異なります。
基本は一つのコードを一つのスレッドに割り当てますが、
一つのコードを複数のスレッドで共有することも可能です。
複数のスレッドを使えばメインのシナリオ処理を行いつつ、別のキャラクタを動かす等の処理が可能です。
gsc_Main は存在するスレッド全てを『直列』、『登録順』で実行します。
よって実行結果は常に一定になります。
使用方法 – Eval
gsc_Eval() でスクリプトを即実行できます。
これは読み込み、スレッド作成、割り当て、実行とそれらの破棄を全てまとめたような動作になります。
特殊な仕様として、wait や stop のような実行を停止する命令が実行されるとその時点でこの関数は終了します。
また、スタックレベル0での return がスクリプトの終了を意味するようになり、
その return で返した値が gsc_Eval() の返り値になります。
mes gsc_Eval("a=0:repeat 5:a+=cnt:loop:return a")
これは読み込み、スレッド作成、割り当て、実行とそれらの破棄を全てまとめたような動作になります。
特殊な仕様として、wait や stop のような実行を停止する命令が実行されるとその時点でこの関数は終了します。
また、スタックレベル0での return がスクリプトの終了を意味するようになり、
その return で返した値が gsc_Eval() の返り値になります。
使用方法 – 数式処理
スクリプト関連の機能を使わずに数式処理だけを使う事もできます。
単純な数式計算ならば gsc_Main や gsc_Eval より少しだけ速く実行できます。
また、次のような少し特殊な使い方もできます。
数式をコンパイルして変数に格納し、後でそのコードを実行して計算処理を行っています。
変換済みコードとサイズを得られるので独自のスクリプト処理などにこの数式処理を組み込めます。
mes gsc_SetVar("a=3")
mes gsc_SetVar("b=4")
mes gsc_Calc("a*b")
単純な数式計算ならば gsc_Main や gsc_Eval より少しだけ速く実行できます。
また、次のような少し特殊な使い方もできます。
gsc_calculate_CompileExpr "1+2*3" // 数式をコンパイル
code_size = stat // コードサイズ
gsc_calculate_GetCode code_bin // コードを変数に代入
mes gsc_calculate_Main(code_bin) // コードを実行
数式をコンパイルして変数に格納し、後でそのコードを実行して計算処理を行っています。
変換済みコードとサイズを得られるので独自のスクリプト処理などにこの数式処理を組み込めます。