【ウディタSRPG】銀日記さんのSRPGシステム
銀日記さんのSRPG講座での勉強が一通り完了しました!
いやー難しいですね。
今日は勉強した内容をまとめてみます。
システムの概要
ざっくりシステムの概要と仕様を説明すると、こんな感じ↓
主人公をカーソルにしている
主人公を透明化して、すり抜けONにすることでカーソルとして利用している。
カーソル自体はピクチャで表示。
戦闘ステート
変数V1[戦闘ステート(1/2/3/4/5・・・]が1~6の間はそれぞれ常に以下の処理が行われる。
・ステート1:味方ユニットの選択 変数V1[戦闘ステート(1/2/3/4/5・・・]=1 の時 ・ステート2:移動位置の選択 変数V1[戦闘ステート(1/2/3/4/5・・・]=2 の時 ・ステート3:移動処理、その後コマンドの選択 変数V1[戦闘ステート(1/2/3/4/5・・・]=3 の時 ・ステート4:攻撃位置の選択 変数V1[戦闘ステート(1/2/3/4/5・・・]=4 の時 ・ステート5:攻撃処理 変数V1[戦闘ステート(1/2/3/4/5・・・]=5 の時 ・ステート6:敵のターンの処理 変数V1[戦闘ステート(1/2/3/4/5・・・]=6 の時
ステートそれぞれの処理中に変数V1[戦闘ステート(1/2/3/4/5・・・]に数値をセットする事で、他のステートの処理が始まる、という構造らしいです。
基本的にはステート1から5を繰り返して、自分のターンが終了するとステート6の処理が始まるのですが、プレイヤーがコマンドをキャンセルしたりするとひとつ前のステートに戻ったりしてるようですね。
詳しくは下の処理構造にて。
ユニットの管理
ユニットはマップEvとして表示させ、そのEvIDと可変DB[キャラデータ]のデータ番号(ID)を一致させて各ステータスを管理。
ステータスというのは例えば、HPとか攻撃力とか、移動できるマスの数など。
味方ユニットはEvID0~3の合計4機、敵ユニットはEvID4~9の合計(最大)6機を前提として設計されている。
移動コストの設定
タイルセット設定のタグ番号で事前に設定できる。
マップ情報の管理と計算
マップ上のマスを、縦軸(y軸)は可変DBのデータ番号、横軸(x軸)は同じく可変DBの項目番号として管理し、計算などに利用している。
例:可変DB[マップ情報]は各マスの移動コストを管理(ただし、ユニットが存在するマスは移動不可マスとして管理)
ユニットの墓場
ユニット撃破時はそのユニット(マップEv)が座標(0,0)に移動される。
従って、マップ情報の読み込みや管理は原則、座標(0,0)を除外した処理の設計になっている。
処理構造
戦闘の流れについてもう少し踏み込んだ解説をするとこんな感じ。(006行目)⇒変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット
(007行目)⇒主人公を透明にして、すり抜け可能にする
(003行目)⇒主人公の位置にピクチャでカーソルを表示
(001行目)⇒コモン[044]■自動ターン終了、味方ターン終了なら、変数V1[戦闘ステート(1/2/3/4/5・・・]に6をセット
(010行目)⇒カーソルの位置がユニットと一致しているなら、⇒コモン[027]■キャラデータ表示
(032行目)⇒決定キーが押下されたなら、変数V1-0[[通常]処理中ID]に上記ユニットのマップEvIDをセット
(034行目)⇒コモン[010]■マップ情報読込
(042行目)⇒選択中ユニットが味方ユニットで、且つまだ行動可能なら、⇒コモン[000]■移動範囲計算
(043行目)⇒コモン[004]■移動パネル表示
(045行目)⇒変数V1[戦闘ステート(1/2/3/4/5・・・]に2をセット
(006行目)⇒決定キーが押下されたなら、カーソル位置の座標が移動可能か判定し、可能なら⇒コモン[012]■移動処理
(019行目)⇒変数V1[戦闘ステート(1/2/3/4/5・・・]に3をセット
(027行目)⇒キャンセルキーが押下されたなら、変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット
(019行目)⇒ユニットの持つスキル(最大2)と、待機、キャンセルの選択肢を表示する
(036行目)⇒スキル1が選択されたなら、変数V1-2[使用コマンド]にスキルIDをセットし、変数V1[戦闘ステート(1/2/3/4/5・・・]に4をセット
(044行目)⇒スキル2が選択されたなら、変数V1-2[使用コマンド]にスキルIDをセットし、変数V1[戦闘ステート(1/2/3/4/5・・・]に4をセット
(052行目)⇒待機が選択されたなら、⇒コモン[026]■方向指定、変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット
(066行目)⇒キャンセルが選択されたなら、⇒コモン[025]■UNDO、変数V1[戦闘ステート(1/2/3/4/5・・・]に2をセット
(003行目)⇒コモン[000]■移動範囲計算(←射程範囲を計算)
(081行目)⇒コモン[004]■移動パネル表示(←射程範囲を表示)
(083行目)⇒変数V1-3「攻撃範囲表示」に1をセット
(111行目)⇒決定キーが押下されたなら、カーソル位置の座標が攻撃可能か判定し、可能なら、変数V1-3[攻撃範囲表示]に0をセットし、変数V1[戦闘ステート(1/2/3/4/5・・・]に5をセット
(122行目)⇒キャンセルキーが押下されたなら、変数V1-3[攻撃範囲表示]に0をセットし、変数V1[戦闘ステート(1/2/3/4/5・・・]に3をセット
コモン[030]☆範囲表示 - 並列実行 ※変数V1-3[攻撃範囲表示]が1の時、常に実行
使用スキルの攻撃範囲に応じて、パネルを表示
※攻撃範囲の上限は最大5
※ピクチャ番号1~41を使用(コード上ではピクチャ番号1~149を確保)
(004行目)⇒コモン[031]■スキル使用時
(005行目)⇒コモン[043]■まだ行動可能か?
(008行目)⇒コモン[053]■勝敗判定、勝敗が決したのならゲーム終了
(027行目)⇒変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット
(023行目)⇒マップEvIDが大きい敵ユニットから順番に、生存していて、且つまだ行動可能なら以下の処理を続ける
(039行目)⇒カーソル位置をユニットの座標に合わせる
(040行目)⇒コモン[027]■キャラデータ表示
(042行目)⇒コモン[010]■マップ情報読込
(043行目)⇒コモン[045]■敵AI処理(→戻り値でユニットの移動先座標、攻撃座標、使用スキルIDを取得)
(068行目)⇒コモン[000]■移動範囲計算
(069行目)⇒コモン[004]■移動パネル表示
(072行目)⇒カーソル位置をユニットの移動先座標に移動
(075行目)⇒125行目まで、コモン[045]■敵AI処理の戻り値で取得した値を元に、移動、スキル使用の処理をして、勝敗判定を行う(ステート2~5と同じような処理)
(145行目)⇒(敵ユニットの処理が全て終了したら、)以降、敵ターン終了処理
(186行目)⇒変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット
最後の方雑になりましたがw
分岐やループといった細かい説明も省きました。あくまで全体の流れなので悪しからず。
この戦闘ステートの仕組みは素晴らしいなと思いました、素人なりにw
いやもっと効率的な方法あるからな!?なんてご意見もあるかもしれませんが、今回はこのままこのシステムを利用させていただこうと思います。
ブログのサイドバーに銀日記さんのリンク追加しておきますね→
お世話になりますm(__)m
※上記の処理構造のデザインはYADOT-WOLFさんのものを少し参考にしてみました。
yado.tk
僕みたいな初心者にはありがたいことに、ウディタに関する初心者向け情報が満載です。
使用ピクチャ番号一覧
それと一応、占有しているピクチャ番号もメモしておきます。
たぶんこういうのって、後で被らないようにするために必要になるので...