HSP3になってモジュールは大幅に機能追加されたが、これはHSPでオブジェクト指向っぽいプログラミングをするための改良と言っていいと思う。実際作者のおにたまさんはマニュアルの中で「コンストラクタ」という単語も使っている。この改良によってモジュールをクラス的な物としても使えるようになった。(継承やらなんやらできないこともありますが)
具体的な機能変更・追加点としては、まず#module命令の引数にモジュール名に加え任意の数の変数を指定できるようになった。
/* #module命令記述例 */
#module modname x,y,z
ここにはオブジェクト指向で言うところの「インスタンス」ごとに個別の物として扱いたいデータ名を指定する。モジュール内ではこの名前で扱う。さらにこの変数は通常のモジュール内の変数とは異なり、HSP3で新しく追加された#modinit命令または#modfunc命令で定義したユーザ定義命令を経由してしかアクセスできない。
モジュール外のスクリプトで「インスタンス」を作成する際、同時にその「インスタンス」を初期化することもでき、モジュール内にそれ専用の命令を記述するための命令が#modinit。#modinitで定義された命令は「インスタンス」作成時に自動的に一度だけ呼び出される。スクリプトから明示的に呼びだすことはできない。
あとモジュールの使用にからむ変更点として、ユーザ定義命令(#deffunc、#modfunc、#modinit命令で定義される命令)の引数の指定方法とreturn命令の仕様、そしてローカル変数の追加がある。
ユーザ定義命令の引数は以下のようにデータタイプだけでなくユーザ定義命令内での名前も同時に指定するようになった。HSP2.xでのmref命令を使ってユーザ定義命令内で指定する方法はHSP3では非推奨となった。引数に指定できるデータタイプの数も増えている。
/* ユーザ定義命令の引数指定例 */
#deffunc afunc int p1,val p2
この方がスクリプトもすっきりしていいと思う。
return命令は、引数に変数を一つ指定するとその内容がシステム変数のstatあるいはrefstrに自動で代入されるようになった。どちらのシステム変数に代入されるかは引数に指定した変数のタイプによって決められる。これもスクリプトの簡略化に役立つ。
/* return命令の引数指定例 */
return x
ローカル変数は、ユーザ定義命令の定義で引数と併記する形で指定した変数について、ユーザ定義命令を実行するごとに生成・初期化・破棄が行われる機能。引数では通常データタイプを指定するところに"local"と記述するとローカル変数として扱われる。
/* ローカル変数の指定例 */
#deffunc afunc int p1,val p2,local tmp