スクリプト仕様の再設計4

# ひたすらチラシの裏
# リファクタリングするにあたって,まず現行スクリプト仕様を書きなぐって,
# で,おかしいなと思った所を修正してみる.


# コマンドについて


# 基本的にはリファクタリングが大目的なので,スクリプト仕様はそこまで変化してません.
# ので,「シューティング用スクリプト2」で晒しているスクリプトが多少参考になるかもしれません.

■ コマンドの種類

スクリプトのコマンドは,大きく分けると6つの動作を行う.
1. 実行時間の制御.「ここで何フレーム待つ」コマンドなど.地味に一番重要.
2. 実行ポインタの制御.ループ,分岐,サブルーチンなど.
3. リソース読込/操作.Bitmap/Model/Sound などをFile→Memory→Device転送(再生)
4. 対象オブジェクトのメンバ変数の書き換え(id:keim_at_Si:20050520参照).
5. 子オブジェクトの生成.例えば「敵」が「弾」を生成.
6. 子ファイバの生成.一つのオブジェクトを複数ファイバで動かす場合.

■ 実行時間の制御コマンド

「wait, waitif, end」 のどれかのコマンドが現れるまで,
連続したコマンドは,1Frame の間に連続して実行される.
これらのコマンドが表れない限り,延々と処理を続ける事になる.って事は,
無限ループの中にこれらのコマンドが存在していない場合,フリーズする.
1Frame だけ進める場合は,「wait 1」と書く.

wait    [term]          // term フレームの間待機.term = 0 で無限待機.
waitif  [Form], [term]  // Form != 0 になったら次へ.それ以外は wait と同じ.
end                     // ファイバを破棄する.

■ 実行ポインタの制御コマンド

ループ.BASICっぽい FOR 文.
[Value_ID] に,ループ制御に用いるレジスタを指定する.
[start], [end], [step] は,浮動小数点値.
最初に [Value_ID] = [start] が代入されて,1回し毎に [Value_ID] += [step] される.
[Value_ID] が [end] を超えたら,"next"コマンドの次に進む.
※ [Value_ID] == [end]の場合は,1回し実行される.
例えば5ループさせたい場合,「for a, 0, 4, 1」と書く.
[start] == [end] なら無限ループとなる.
"continue" コマンドなら for 位置に,"break" コマンドなら next の次の位置に飛ぶ.
for のネストは,レジスタが許す限り無限に可能.

for         [Value_ID], [start], [end], [step]
continue
break
next


サブルーチンコールと復帰.BASICっぽい GOSUB〜RETURN 文.
現在の実行位置をスタックに記録して,sub [SubRoutine_ID] でマークした位置まで飛ぶ.
return が現れたら,スタックに記録した位置に戻る.スタック容量の関係でネストは8回まで.

gosub    [SubRoutine_ID]  // "sub  [SubRoutine_ID]" の位置まで飛ぶ.
return                    // 戻る.スタックが空なら"end"として振る舞う.
sub      [SubRoutine_ID]  // ジャンプ先


選択.BASIC の select を拡張?select〜selend までで,条件分岐.
level コマンドは,小さい順に書いていくと,その間の値のスクリプトを実行する.
level コマンドで条件分岐する場合は,case,range の混在は不可.
"break" は必要無し.次の条件文が表れたらselend の次の位置に飛ぶ.
select文のネストは無限に可能.

select      [From]
case        [value]         // [From]が,指定値と同値なら実行.
level       [value]         // [From]が,指定値以上,次指定値未満なら実行.
range       [min], [max]    // [From]が,[min]以上[max]以下なら実行.
default                     // 条件に当てはまらなかったら実行.
selend


分岐.BASICっぽい IF 文.[Form]!=0 なら,if 以下を実行.
[Form]==0 なら else 以下を実行.無ければ,endif の次にジャンプ.
if のネストは無限に可能.

if     [Form]
else
endif


エラージャンプ.0除算,索敵失敗などが有った場合,エラーフラグが立つ.
エラーフラグが立っていた場合,error 〜 enderror を実行.エラーフラグは消える.
エラーフラグが立っていなければ,enderror の次の位置まで飛ぶ.

error
enderror


外部スクリプトを挿入する.

include  "file_path"

■ リソース読込/操作コマンド

ビットマップ管理.
LoadBitmap で,"file_name" をシステムメモリに展開→テクスチャマップに転送.
[BitmapID]で指定した名前でスクリプト内から呼び出せるようにする.
bTransPurple = 1 なら,真紫色[RGB(255,255,0)]を透過する.
LoadRGBA; アルファ値情報を含む "*.rgba" データを読み込む.
RegBitmap, UnregBitmap; テクスチャマップに登録/抹消を手動で行う.
UnloadBitmap; システムメモリ上から手動で削除する(アプリケーションの終了で自動解放).

LoadBitmap     [BitmapID], "file_name", bTransPurple
LoadRGBA       [BitmapID], "file_name"
UnloadBitmap   [BitmapID]
RegBitmap      [BitmapID]
UnregBitmap    [BitmapID] 


3DModel管理.
LoadModel で,"file_name" をシステムメモリに展開→スケーリング→Display List 生成.
[ModelID]で指定した名前でスクリプト内から呼び出せるようにする.
bDivide = 1 なら,パーツ単位で別々の Display List として生成.
CompModel, UncompModel; Display List 生成/破棄を手動で行う.
UnloadModel; システムメモリ上から手動で削除する(アプリケーションの終了で自動解放).

LoadModel      [ModelID], "file_name", scale_x, scale_y, scale_z, bDivide
UnloadModel    [ModelID]
CompModel      [ModelID], bDivide
UncompModel    [ModelID]


Sound管理.命名則が上と同じなので,略.

LoadSound      [SoundID], "file_name"
UnloadSound    [SoundID]
LoadMusic      [MusicID], "file_name"
UnloadMusic    [MusicID]


# 仕様の走り書きだけ書いても,何か意味分かりにくくて,微妙.
# かといって,真面目な仕様書は,多分,書けないし.アマチュアクオリティ.
# ...ソースも公開するともうちょっとマシなんだろうな...
# ゲーム完成したらソースも公開するつもりです.


(つづく)