ロボットでレベルあげをする3
ロボットを操作するシナリオの解説です。
先にお断りを。
このページには、プログラミング関係の用語がたくさん出てきます。
何かの言語のプログラムを書いた経験がない方
プログラムとか分からない人でも分かるように書こうとしたのですが、説明が膨大になってしまったのであきらめました。
プログラムが書ける友人を捕まえて聞くか、この機会にプログラミング言語をひとつ学んでみてください。
また、ドラクエの戦闘の操作手順が分かってないと、ここでAボタンを押すのに何の意味があるのか分からないと思います。
お手元にドラクエがありましたら、ぜひモンスターと遭遇して、実際の操作を見ながら読んでください。
では先にこのシステムで使う言語の解説から。
S("X",,)
これが最も基本的なコマンドです。「"X"ボタンを押せ」という指示になります。
このシステムは、ボタン名リストを持っています。ボタン名リストには、ボタンの名前と、そのボタンの三次元的な位置座標が書いてあります。
上のコマンドの場合、ロボットは指示をうけると、ボタン名リストからXという名前のボタンを探します。そこに三次元座標が書いてあるので、ロボットはつまんだパーツをその位置まで運んで置く・・とロボット本人は思ってます。実際はパーツを持たせてないので、単にアームが動いて指定位置まで下がる、ということになります。その「指定位置」にはDSのXボタンがあるので、アームが下がったらボタンが押されるという寸法です。
PIC(OFF,,0)
STILL("シナリオ1_4")
これはカメラでDSの画面を撮影して判定するコマンドです。PICで撮影します。
STILLで判定を行います。一緒に「シナリオ1_4.jpg」ファイルを用意しておくと、PICで撮った画像と見比べて、同じならOK、違うならNGと答えます。
なお、今回は上下画面をまとめて一個の画面として撮影してます。
SET(fight_end, 0)
これは、変数を扱うコマンドです。fight_endという名前の変数を作り、0を代入します。変数についてはRubyやtclと同じですのでここでの解説は略します。
CALL("主人公の行動.sce")
これは、他のシナリオを呼び出すコマンドです。この場合、呼び出されるのは「主人公の行動.sce」シナリオです。Cやjavaで言うところの関数ですが、引数と戻り値は使えません。
forやifといった制御構造のたぐいは、Cやjavaと同じですのでここでの解説は略します。
さて、実際に戦闘を行うシナリオです。
載せたのは戦闘一回分です。これをforループか、until(三時間)ループでまわします。
//---------------------------------------------------------------------------------------
//ドラクエ5レベル上げ
//戦闘一回分
//押下時間100ms以下、押下間隔800ms以上でないとタイミングがあわない
//フロアから開始
//メニュー
S("X",,)
//じゅもんを選択
S("→",100,)
S("A",,)
//呪文をかける人として、サンチョを選択
S("↓",100,)
S("A",,)
//「くちぶえ」を選択
S("→",100,)
S("A",,)
//サンチョは くちぶえをふいた
WAIT(2s) //2秒待つ
S("A",,)
//戦闘
SET(fight_end, 0)
for(30){
//メニュー待ち
SET(fight_menu, 0)
PIC(OFF,,0)
for(60){
if(STILL("シナリオ1_4")==OK){//「たたかう・じゅもん・どうぐ・まもる」メニュー(1)
SET(fight_menu, 1)
break
}
IF(STILL("シナリオ1_5")==OK){//「まもののむれを やっつけた」メッセージ(3)
SET(fight_end, 1)
break
}
WAIT(500ms) //500ミリ秒待つ
PIC(OFF,,0)
}
if( $fight_end == 1 ){
//戦闘終了なら繰り返しをぬける
break
}
if( $fight_menu == 0 ){
//タイムオーバー。なんかおかしい
PLAY(DTMF,2s,"0")//DTMF音0を2秒間ならして知らせる
EXIT(SCENARIO)//処理を抜けてシナリオを終了する
}
//たたかう (2)
S("A",,)
WAIT(1s) //1秒待つ
//主人公 //各自の行動を設定
CALL("主人公の行動.sce")
//グレイトドラゴン //各自の行動を設定
CALL("たたかう.sce")
//チロル //各自の行動を設定
CALL("たたかう.sce")
//ビアンカ //各自の行動を設定
CALL("けんじゃの石.sce")
//(2)ここまで
}
if( $fight_end != 1 ){
//30ターンでまだ戦闘が終了していない
PLAY(DTMF,2s,"1")//DTMF音1を2秒間ならして知らせる
EXIT(SCENARIO)//処理を抜けてシナリオを終了する
}
//まもののむれをやっつけた
PIC(OFF,,0)
WHILE(STILL("シナリオ1_6")==NG){ //フロア画面になっていないなら繰り返す
WAIT(1s) //1秒待つ
S("A",,) //(4)
PIC(OFF,,0)
}
//通常画面に戻った
//------------------------------------------------------------------
ドラクエの戦闘は、こんな順で進みます。
「たたかう・じゅもん・どうぐ・まもる」メニューが出たか確認(1)
↓
行動を指定(2)
↓
そのまま置いておくと勝手に戦闘が一ターン進行する
↓
一ターン終了するとまた「たたかう・じゅもん・どうぐ・まもる」メニューが出るので、それまで画面を確認し続ける(1)
↓
行動を指定(2)
↓
これを繰り返しているとそのうち戦闘が終わり、「たたかう・じゅもん・どうぐ・まもる」メニューの代わりに、「まもののむれを やっつけた」メッセージが出てくる(3)
↓
Aボタンを連打するとメッセージが次々すすむ(4)
↓
メッセージが全部済むとフロア画面にもどる
したがって、シナリオでは、
もし「たたかう・じゅもん・どうぐ・まもる」メニューが出ていたら、CALLで行動を指定するシナリオを実行します。
もし「まもののむれを やっつけた」が出ていたら、フロア画面じゃない物が表示されている間ずっと「Aボタンを押して一秒待つ」を繰り返します。そのうちフロア画面が出てきたら、戦闘終了です。
いずれの画面も出ていないなら、まだ戦闘が進行中なので、500ミリ秒待って、またはじめに戻って画面が出てないかチェックします。
という事を行っています。
ではCALLで行っている、行動の指定は?
はい、こんな感じです。
//------------------------------------------------------------------
//たたかう.sce
//各自の行動を設定
//たたかう
S("A",,)//こうげき
S("A",,)//対象はデフォルト
//------------------------------------------------------------------
ゲーム的には、「こうげき」を選んで、対象を選んでいるんですが、操作としては「Aボタンを二回押す」だけのことなんですね。
引用元 : ドラクエ5DS日記※ネタバレ注意※