【目次】
コンバータの中にある「レベルスクリプト」のファイルを開く
制限時間を設ける
プレイヤーキルに対するスコア加算を加える
ファイルを上書き保存する
コンバータの中にある「レベルスクリプト」のファイルを開く▲
ここまでで一通りのゲームの流れは作成できましたが、まだ「ゲームルール」がないため、このゲームは半永久的に終わりません。
そこで、「ゲームルール」を組み込んでみましょう。
※ ここで言う「ゲームルール」とは、ゲームの勝敗判定を決定するもの、と思ってください。
■ レベルスクリプトファイルをメモ帳などで開く
ゲームルールなどの設定は「レベルスクリプト」で行ないます。
モノビットMOエンジン v1.1 の段階ではまだこのエディタが無いため、手入力によるスクリプト改変を行ないます。
まずはその「レベルスクリプト」のファイルを開きましょう。
tools/MOScriptConverter 内の以下のファイルをメモ帳などで開いてください。
tools/MOScriptConverter/SimpleStage.mos

制限時間を設ける▲
では早速ゲームルールを設けていきましょう。
まずは制限時間の設定からです。
■ 制限時間の設定を行なう
まずは制限時間の設定を行ないます。今回は2分(120秒)としましょう。
SimpleStage.mos 内の [initialize] ラベルに以下の命令を追加してください。
// 制限時間を設定
lvl_timeLimit(120);

■ 割り込み制御のプロセスを設定する
続けて、タイムリミットになったらゲームを終了する処理を段階的に組み込みます。
まずは「割り込み」のプロセスを設定するところからです。
SimpleStage.mos 内の [initialize] ラベルに以下の命令を追加してください。
// 割り込み処理ラベルを設定
setmiv( interrupt );

■ 割り込み制御の記述
上記で宣言したプロセス [interrupt]を、レベルスクリプトの文末に加えましょう。
SimpleStage.mos 内の末尾に以下の命令を追加してください。
※ タイムアップしたら set_battle_timeup をコールします。
[interrupt]
// 割り込みタイプ取得
ldi( r(10), r(0) );
// タイムアップ処理へ
cmpbeq( r(10), lvl_TIME_UP, set_battle_timeup );
// 割り込み終了
reti();

■ タイムアップ後の処理の記述
上記で宣言したプロセス [interrupt]を、レベルスクリプトの文末に加えましょう。
SimpleStage.mos 内の末尾に以下の命令を追加してください。
※ スコアレジスタ( r(40), r(41) ) の値を元に勝敗判定を組み込みます。
スコアレジスタに入る値については後述します。
// タイムアップ設定
[set_battle_timeup]
// 結果を設定します
gmemset( GMEM_RESULT_TYPE, RESULT_TYPE_TIMEUP );
gmemset( GMEM_SCORE_TEAM_A, r(40) );
gmemset( GMEM_SCORE_TEAM_B, r(41) );
// バトルを終了します
lvl_battle_end();
// スクリプト終了
exit();

プレイヤーキルに対するスコア加算を加える▲
制限時間の設定を行なったところで、後はスコアの加算処理を加えれば簡単なゲームルールは完成します。
今回は「より多くのプレイヤーキャラクタを倒したチームの勝利」というルールで実装を加えてみようと思います。
■ プレイヤーキル(リスポーン)時の割り込みプロセスを設定する
まずは、プレイヤーキル(リスポーン)した時の割り込みプロセスの設定を行ないます。
SimpleStage.mos 内の [interrupt] ラベルに以下の命令を追加してください。
// 相手チーム討伐処理へ
cmpbeq( r(10), lvl_UNIT_DELETE, player_dead );

■ [player_dead] のステートラベルを作成する
上記引数値としている player_dead はステートラベルになりますので、この割り込みプロセスの中身を作成していきます。
SimpleStage.mos 内の末尾に以下の命令を追加してください。
// 相手プレイヤー討伐処理
[player_dead]
// 討伐されたユニットIDを取得
ldi( r(11), sys(lvl_sys_MyUnitId) );
// 討伐されたチームを取得
cmn_get_influence( r(11) );
ldi( r(43), rRet );
// 討伐されたチームが赤だったら、青チームに加算
cmpbeq( _i(1), r(43), update_score_team_b );
// 討伐されたチームが青だったら、赤チームに加算
cmpbeq( _i(2), r(43), update_score_team_a );
// 割り込み終了
reti();

■ 赤チーム or 青チームの得点加算
上記の cmpbeq で分岐処理を実行している update_score_team_b および update_score_team_a を作成します。
SimpleStage.mos 内の末尾に以下の命令を追加してください。
// 赤チームにスコア加算
[update_score_team_a]
// スコアを1点加算
addi( r(40), _i(1) );
// 割り込み終了
reti();
// 青チームにスコア加算
[update_score_team_b]
// スコアを1点加算
addi( r(41), _i(1) );
// 割り込み終了
reti();

ファイルを上書き保存する▲
組み込み終わったら、編集した SimpleStage.mos を上書き保存してください。
※ 上書き保存する方法はエディタによって異なります。
