【ウディタ講座】SRPGをつくろう! ターン開始時に「地形ダメージ&回復」演出を加える

まだ敵が動いたりはしませんが、今回扱う「地形によるHP変動」まで作っていけば「ターン切り替え」もほとんど出来上がりといえるでしょう。

ではやっていきます。

データベースの整備

UDBで地形データを用意する

ダメージor回復も一種の「地形効果」ですから、地形の名称や消費移動力のUDBがそのまま使えそうです。

「HP変動量%」という項目を増やしましょう。たとえばこれが0%ならHP変動なし、10%ならMHPの10%回復、-20%ならMHPの20%のダメージです。

妙な隙間があいていますね。これは上の方の移動タイプがまだ増えるはずなので余裕を残すためのものです。

増やした「回復床」と「ダメージ床」に対応するタグ番号を持った地形を増やしましょう。仮にマルが回復、バツがダメージです。

実際には「砦」や「城」、「毒の沼地」になっていくはず。

MEMO

地形の回避率補正も同じ要領でUDBに設定できます

ユニット管理のCDBに座標データの項目を増やす

こんなふうに。

ここに、そのユニットがいまいる座標を記憶させます。ユニット操作関係のコモンに手を加えて、この座標が随時更新されるようにしましょう。

初期配置のイベントでも登録を忘れずに(現状の仮データでは、前回記事の「敵」イベント内部の登録)。

マスCDBでマスごとに存在するユニット番号をチェックしているので、ユニットCDBでも座標を持つのはあきらかに二度手間です。

なぜこんなことをするのか、説明していきます。

MEMO

後々扱うAI処理でも、なんだかんだユニットのCDBからの座標取得が便利に使われます

地形ダメージ&回復の実際の動作

「素直に考えた処理」と「理想の挙動」

ぱっと思いつく処理の流れはこんな感じです。

  • 二重の回数ループをつかって、マップ座標(0,0)から(49,49)までのマスをチェック
  • そのマスの「ユニットがいるかどうか」、「HP変動設定が0%以外の地形かどうか」をチェック
  • ユニットがいて変動設定のある地形ならば、ダメージor回復を実行

この方式だと、勢力に関係なくマップの左上の方から見つけたユニット順に処理をします。

敵軍ユニット、敵軍ユニット、自軍ユニット、友軍ユニット、自軍ユニット……という具合に、勢力がとびとびになってしまうのです。

理想の挙動は「勢力ごとにまとめて」、「リーダーから順番に」という流れのはず。

また、マップの全マスのチェックも非常に処理数の多い方法です。30×30サイズのマップでもマス数は900個に及びます。

そこでユニットCDBに存在座標を覚えさせ、そこからチェックする方法をとることで処理数をおさえつつ、HP変動を行うユニットの順番も制御できるのです。

ユニットCDBの座標からたどる方式

勢力別に指定ができて、ユニットのCDBをリーダーからチェック。生存かつ出撃のユニットがいたら、そのCDBにある存在座標から今立っている地形のHP変動を確認します。

……こういう仕組みを作ればよいですね。

前に扱った生存者カウントのコモンと途中まではまったく同じことがわかります。

 

「┃┗地形ダメージ&回復」コモン

■DB読込(可変): CSelf10[データ数] = 可変DB[タイプCSelf0[対象](-)のデータ数] ■変数操作: CSelf11[読み位置] = -1 + 0
■回数付きループ [ CSelf10[データ数] ]回
|■変数操作: CSelf11[読み位置] += 1 + 0
|■DB読込(可変): CSelf12[HP] = 可変DB[ CSelf0[対象] : CSelf11[読み位置] : HP ] (- : – : ? )
|■DB読込(可変): CSelf13[出撃フラグ] = 可変DB[ CSelf0[対象] : CSelf11[読み位置] : 出撃フラグ ] (- : – : ? )
|■条件分岐(変数): 【1】 CSelf12[HP] が 1 以上
|-◇分岐: 【1】 [ CSelf12[HP] が 1 以上 ]の場合↓
| |■条件分岐(変数): 【1】 CSelf13[出撃フラグ] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf13[出撃フラグ] が 1 と同じ ]の場合↓
| | |▼ 出撃かつ生存ユニットを発見
| | |■DB読込(可変): CSelf14[X] = 可変DB[ CSelf0[対象] : CSelf11[読み位置] : 存在X ] (- : – : ? )
| | |■DB読込(可変): CSelf15[Y] = 可変DB[ CSelf0[対象] : CSelf11[読み位置] : 存在Y ] (- : – : ? )
| | |■変数操作+: CSelf16[地形タグNo] = X:CSelf14[X] Y:CSelf15[Y]の最も上にあるタイルのタグ番号
| | |■DB読込(ユーザ): CSelf17[HP変動] = ユーザDB[ 地形リスト : CSelf16[地形タグNo] : HP変動% ] (0 : – : 10)
| | |■条件分岐(変数): 【1】 CSelf17[HP変動] が 0 以外
| | |-◇分岐: 【1】 [ CSelf17[HP変動] が 0 以外 ]の場合↓
| | | |▼ HP変動設定のある地形だったので、ダメージor回復
| | | |■文章:\ECDB所属番号\cself[0]の番号【\cself[11]】に\nHP変動 \cself[17]%
| | | |▼ 今は仮にテキスト表示のみ。
| | | |▼ 所持アイテムやアビリティ、クラスによっては地形のHP変動を無視するかも
| | | |■
| | |◇分岐終了◇
| | |■
| |◇分岐終了◇
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇

あとはこのコモンを「┣■メニューコマンド:ターン終了」コモンでの各フェイズ開始宣言の前か後ろで呼び出せばOKです。「エネミーフェイズ開始!」→「敵リーダーが毒地形ダメージ!」のように演出が続きます。

 

 

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