【ウディタ講座】SRPGをつくろう! ユニット番号の管理&ユニット操作を洗練

これまでで移動や攻撃処理の素地ができてきました。

よりゲームらしくするには、主人公以外の敵ユニットが必要ですね。敵ユニットこそが「移動時の障害」だとか「攻撃の対象」となり、SRPGの戦略性を生み出すのです。

ユニットの登録に関する処理を作っていくことで、その他のシステムもドミノ倒しで整っていくでしょう。

ユニット番号の規則とその記憶用CDBの用意

専用CDBを用意する

設定そのものは、実は「移動力計算用」とまったく同じです。

マップのマスひとつひとつに対応させるので、データ数・項目数ともに50にしておけば困ることはないかと思います。

初期値は0でも-1でも、どちらでもよいでしょう。

 

座標(x,y)=(5,9)に主人公が移動したら、ユニット記憶用CDBの対応位置に主人公のユニット番号を登録しなおす……というイメージです。

ユニット番号の規則を決める

仮動作のうちは「1番が主人公」、「2番が敵」で困ることはないかと思います。

とはいえSRPGは1勢力あたり数十体のユニットが登場し、3勢力の三つ巴をやったりするような乱戦ジャンルです。

ユニット番号はしっかり規則性を持たせて、番号を見るだけで所属勢力なんかがつかめるとよいですね。

  • 1勢力100体未満
  • 勢力は3つまで
  • 各勢力にリーダーの設定をする

たとえば上のように考えるとすれば、「100番台=自軍」、「200番台=敵軍」、「300番台=友軍」と整理できそうです。

111番なら自軍の11番めのユニット、205番なら敵軍の5番めのユニット……と。

また、「リーダーはかならず1番」(101、201、301)と決めてしまえば、勝敗条件(敵リーダーを倒せ!)やAI挙動(主人公=自軍リーダーだけを狙ってくる強敵)での設定もなにかとラクになりそうです。

これまで作ってきた処理をユニット番号に対応させる

マップイベントをおく

以下のことが必要なので、今は仮にひとつのイベントでまとめて行っています。

  • 敵ユニットの画像(キャライベント)を置く
  • ゲーム開始時にマスCDBにユニット番号を入れる

101が主人公のウルファールさん(自軍リーダー)、201が敵軍リーダーのスライムです。

「┣指定座標の地形情報表示」コモンを改造

■変数操作: CSelf11[使用ピクチャ番号] = 5 + 0
■条件分岐(変数): 【1】 CSelf0[座標X] が -1 と同じ
-◇分岐: 【1】 [ CSelf0[座標X] が -1 と同じ ]の場合↓
|■ピクチャ消去:CSelf11[使用ピクチャ番号] / 0(0)フレーム
|■イベント処理中断
|■
◇分岐終了◇
■変数操作+: CSelf10[タグNo] = X:CSelf0[座標X] Y:CSelf1[座標Y]の最も上にあるタイルのタグ番号
■DB読込(ユーザ): CSelf9[地形名称] = ユーザDB[ 地形リスト : CSelf10[タグNo] : 名前 ] (0 : – : 0)

■DB読込(可変): CSelf12[ユニット番号] = 可変DB[ ユニット記憶用 : CSelf1[座標Y] : CSelf0[座標X] ] (1 : – : -)

■文字列操作:CSelf8[表示文] = “座標:(\cself[0],\cself[1])\n地形:\cself[9]\nユニット:\cself[12]”
■ピクチャ表示:CSelf11[使用ピクチャ番号] [右上]文字列[\E\f[10]\cself[8]] X:317 Y:3 / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]

そのマスに登録されているユニット番号も拾えるようにしました。

しばらくの間、このコモンにはデバッグ用の情報表示も兼ねてもらう方が便利でしょう。

 

「┃┣ユニットの所属を取得」コモンを新設

文字列変数の方に、101や302といったユニット番号(数列)を入力しています(文字列を入力する部分に、\cself[n] を入力)。

コモンのなかでその文字列の1文字めだけを切り出して返り値に入れており、こうすることで3桁のナンバーの先頭の数字だけが取得できます。

先頭の数字が1なら自軍、2なら敵軍。ユニットAとユニットBの先頭の数字(所属勢力ナンバー)が一致すればAとBは味方同士……というふうに条件分岐をかけていけますね。

また、「そのユニットが自軍かどうか知りたいだけ」なら、ユニット番号が200未満なら自軍というシンプルな分岐でもまかなえます。

 

ちなみに、所属ナンバーを抜いた番号(102なら2、315なら15にあたる部分。どう呼べばいいのか……)を計算したい場合は、素直に数列に数列を入力して、普通にこんな感じでよいかなと。

■条件分岐(変数): 【1】 CSelf0[ユニット番号] が 300 以上 【2】 CSelf0[ユニット番号] が 200 以上 【3】 CSelf0[ユニット番号] が 100 以上
-◇分岐: 【1】 [ CSelf0[ユニット番号] が 300 以上 ]の場合↓
|■変数操作: CSelf4[結果] = CSelf0[ユニット番号] – 300
|■
-◇分岐: 【2】 [ CSelf0[ユニット番号] が 200 以上 ]の場合↓
|■変数操作: CSelf4[結果] = CSelf0[ユニット番号] – 200
|■
-◇分岐: 【3】 [ CSelf0[ユニット番号] が 100 以上 ]の場合↓
|■変数操作: CSelf4[結果] = CSelf0[ユニット番号] – 100
|■
◇分岐終了◇

 

「┣選択中のマスに居るユニット」コモンを改造

■条件分岐(変数): 【1】 CSelf0[座標X] が -1 と同じ
-◇分岐: 【1】 [ CSelf0[座標X] が -1 と同じ ]の場合↓
|▼ マウス画面外ならCDBを読みに行かない(-1指定でエラーを吐くため)
|■変数操作: CSelf4[結果] = 0 – 0
|■
-◇上記以外
|■DB読込(可変): CSelf4[結果] = 可変DB[ ユニット記憶用 : CSelf1[座標Y] : CSelf0[座標X] ] (1 : – : -)
|■
◇分岐終了◇
■条件分岐(変数): 【1】 CSelf4[結果] が 100 未満
-◇分岐: 【1】 [ CSelf4[結果] が 100 未満 ]の場合↓
|■イベント処理中断
|■
◇分岐終了◇
▼ ユニットがいるなら、その情報の簡易ウィンドウを表示する処理が続く

ここまで作ると、こんなふうに動作してくれます。

主人公以外のユニットにも反応がありますね。がぜんSRPGらしくなってきました。

(ここまで進めると一時的に主人公の移動がうまくいかなくなりますが、このさきに修正方法が出てきます)

 

また、「┣■ユニット操作」も先頭にこんな処理をおくと「自軍しか操作できない」(敵軍・友軍ユニットを左クリックしても反応がない)ようにできます。

■条件分岐(変数): 【1】 CSelf0[対象ユニット] が 200 以上
-◇分岐: 【1】 [ CSelf0[対象ユニット] が 200 以上 ]の場合↓
|■イベント処理中断
|■
◇分岐終了◇

ユニット操作時の処理を洗練

移動する

移動処理はすでに完成したような雰囲気でしたが、やり残しがあります。

  1. 他のユニットがいる場所には移動できない
  2. 別勢力ユニットがいる場所はすり抜け移動ができない(通行不可扱い)
  3. 移動したらマスCDBのユニット番号登録位置を更新する

対応していきましょう。

 

「1.他のユニットがいる場所には移動できない」はシンプル。

「┣■ユニット操作」コモン内で呼び出す「┃┣移動先選択」コモンに次の分岐を足すだけ。

| | |■DB読込(可変): CSelf15[ユニット受け] = 可変DB[ ユニット記憶用 : CSelf13[決定座標Y] : CSelf12[決定座標X] ] (1 : – : -)
| | |■条件分岐(変数): 【1】 CSelf15[ユニット受け] が 100 未満
| | |-◇分岐: 【1】 [ CSelf15[ユニット受け] が 100 未満 ]の場合↓
| | | |■
| | |◇分岐終了◇

移動先に選んだマスに残移動力があるときだけ、ルート検索処理に進んでいましたが、「そのマスの登録ユニット番号が100未満(誰もいない)」ことも条件に追加しています。

 

「2.別勢力ユニットがいる場所はすり抜け移動ができない」の対応では「┣■移動力計算」コモンからいじります。

  • コモンの最初に、先の所属番号チェックコモンを呼び出して、移動しようとしているユニットの所属を記憶しておきます。
  • 「┃┣消費移動力チェック」コモンの入力値を増やして、ここに所属番号を渡してあげましょう。
  • 「┃┣消費移動力チェック」のなかで、チェック先のマスに他のユニットがいるかどうかの処理を足します

 

「┃┣消費移動力チェック」コモン中身

■変数操作+: CSelf10[最も上のチップのタグ番号] = X:CSelf0[座標X] Y:CSelf1[座標Y]の最も上にあるタイルのタグ番号
■DB読込(ユーザ): CSelf4[結果] = ユーザDB[ 地形リスト : CSelf10[最も上のチップのタグ番号] : CSelf2[対象ユニット歩行タイプ] ] (0 : – : -)

■DB読込(可変): CSelf11[存在ユニット] = 可変DB[ ユニット記憶用 : CSelf1[座標Y] : CSelf0[座標X] ] (1 : – : -)
■条件分岐(変数): 【1】 CSelf11[存在ユニット] が 100 以上
-◇分岐: 【1】 [ CSelf11[存在ユニット] が 100 以上 ]の場合↓
|■イベントの挿入[名]: CSelf12[存在ユニット所属] = [“┃┣ユニットの所属を取得”] <コモンEv 24> / \cself[11] |■条件分岐(変数): 【1】 CSelf12[存在ユニット所属] が CSelf3[ユニット所属] 以外
|-◇分岐: 【1】 [ CSelf12[存在ユニット所属] が CSelf3[ユニット所属] 以外 ]の場合↓
| |■変数操作: CSelf4[結果] = 99 + 0
| |■
|◇分岐終了◇
|■
◇分岐終了◇

いい感じですね。

 

「3.移動したらマスCDBのユニット番号登録位置を更新する」の対応はちょっと迷いますね。

SRPGでは「試しに移動してみて、思ったのと違ったからキャンセル」なんてのは日常茶飯事。移動キャンセルができたほうがよいので、どのタイミングでCDBのユニット登録情報を書き換えるかは悩みどころです。

しかし今は仮組みですから、シンプルに考えます。

「┃┗リスト通りにユニットを移動」コモンの入力値を増やして、文字列2(セルフ6)に「出発地&目的地」を入れるようにしましょう(「┃┣移動先選択」からの呼び出し時)。

ここに「出発地X/出発地Y/目的地X/目的地Y」の4行(4変数)が入るので、移動終了後に文字列を座標に整理し直して、マスCDBを操作します。

これでまた主人公を好きに動かしていけるようになりました。

攻撃する

必要な流れを整理しましょう。

  1. ユニット操作で「攻撃」コマンドを決定
  2. ユニットの射程に応じた位置にパネルが表示
  3. パネル(攻撃先)の決定か、キャンセルの操作を待つ
  4. 決定可能なパネルは「射程範囲内(パネルがある場所)」かつ「自軍以外のユニットがいる」

こんな感じですね。

1~2は前回の記事で行いました。

4については、作りたい方向性によって微妙に違ってきそうですね。TO(タクティクスオウガ)系のSRPGなら、無人のマスだろうと味方だろうとブンブンぶん殴っていけました。

 

さておき、今回は上記の「4.」の条件にのっとって「3.」のパネル決定待ち処理を作ってみます。

イメージとしては「┃┣移動先選択」のアレンジです。

ちょっと力業の感もありますが、こんなものではないでしょうか。「杖による味方の回復」なんかをしたいなら、パネルを青色にして、対象ユニットの所属を操作中ユニットの所属と同じにする……というアレンジですね。

 

上記の攻撃処理の呼び出し元コモンは今こんな感じ。

「道具」システムがあって、攻撃時に武器を選べるタイプなら、「攻撃」コマンド決定直後に、「使用武器選択」(選んだ武器の射程を表示)という工程が付け加えられるはず。

 

だいぶそれらしくなりました。

 

 

【ウディタ講座】SRPGをつくろう! まとめ