【ウディタ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)を除外した処理の設計になっている。




処理構造

戦闘の流れについてもう少し踏み込んだ解説をするとこんな感じ。


SRPG戦闘システムの起動
 コモン[007]◆起動時イベント - 自動実行  ※ゲーム起動時のみ実行
  (006行目)変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット
  (007行目)主人公を透明にして、すり抜け可能にする

カーソルの表示
 コモン[008]☆カーソル表示 - 並列実行  ※変数V1[戦闘ステート(1/2/3/4/5・・・]が1以上の時、常に実行
  (003行目)主人公の位置にピクチャでカーソルを表示

ステート1:味方ユニットの選択
 コモン[018]☆計算のトリガー - 並列実行  ※変数V1[戦闘ステート(1/2/3/4/5・・・]が1の時、常に実行
  (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をセット

ステート2:移動位置の選択
 コモン[019]┣移動位置の選択 - 並列実行  ※変数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をセット

ステート3:移動処理、その後コマンドの選択
 コモン[020]┣攻撃の選択 - 並列実行  ※変数V1[戦闘ステート(1/2/3/4/5・・・]が3の時、常に実行
  (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をセット

ステート4:攻撃位置の選択
 コモン[021]┣攻撃位置の選択 - 並列実行  ※変数V1[戦闘ステート(1/2/3/4/5・・・]が4の時、常に実行
  (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を確保)

ステート5:攻撃処理
 コモン[022]┣攻撃処理 - 並列実行  ※変数V1[戦闘ステート(1/2/3/4/5・・・]が5の時、常に実行
  (004行目)コモン[031]■スキル使用時
  (005行目)コモン[043]■まだ行動可能か?
  (008行目)コモン[053]■勝敗判定、勝敗が決したのならゲーム終了
  (027行目)変数V1[戦闘ステート(1/2/3/4/5・・・]に1をセット

ステート6:敵のターンの処理
 コモン[023]┗相手ターン - 並列実行  ※変数V1[戦闘ステート(1/2/3/4/5・・・]が6の時、常に実行
  (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
私みたいな初心者にはありがたいことに、ウディタに関する初心者向け情報が満載です。



使用ピクチャ番号一覧

それと一応、占有しているピクチャ番号もメモしておきます。
たぶんこういうのって、後で被らないようにするために必要になるので...