【ウディタ講座】SRPGをつくろう! 移動範囲に「攻撃可能範囲」を付け加える

前回お話した通り、今度は上図のような処理をやっていきましょう。

ユニットにポインターを合わせたとき「移動可能範囲の白パネルに加えて、攻撃可能範囲の赤パネルも表示する」仕組みです。

攻撃可能範囲の考え方

ずいぶん複雑そうですが、シンプルに考えるならこんな感じでしょうか。

  • 移動力と武器射程を合算したものをユニットの足元に入れて、残移動力を周囲に登録していく
  • 移動力(白パネル)の範囲を超えた遠くのパネルは赤く表示する

移動力が4、射程が1あるとき、4+1=5の値をもって移動力計算をはじめていき、4の移動力では届かない場所を攻撃範囲として赤パネルで表示するのです。

また、山など移動タイプによっては進入できない地形であっても、そこに別ユニットがいれば攻撃は可能になりますね。つまり、「隣接マスまで行けるなら進入不可の地形であっても攻撃範囲(赤パネル)になりえる」はず。

既存のコモンを作り変えていく

まずは思いついた通りをそのまま実行

  • 「┣■移動力計算」でユニットの射程も取得し、初期位置への代入値を「移動力+射程」に変更
  • 「┃┗移動可範囲にパネル」に入力値を追加。残移動力がその入力値未満なら赤パネルになるよう分岐
  • 「┣■移動力計算」からの「┃┗移動可範囲にパネル」で追加入力値に「射程」を入れる

移動力の計算時に射程を足した結果、残移動力が0のマスは武器射程(移動力の範囲は残移動力5~1)になります。なので、「残移動力が射程の値(1)未満のマスを赤くする」ことで目的は果たせそうです。

どうでしょうか。

惜しい。なんか違う。

なにを見落としているのか

山と水場、それに主人公(他軍ユニット)も攻撃可能な範囲です。そこも赤いパネルが出ていて欲しいですね。

そしてまた、山や他ユニットの「絶対に進入できないマス」と、森や水場など「ちょっと消費移動力が高めのマス」では若干、望ましい挙動が変わってきます。

射程を2にしてみるとわかりやすいですね。

「青丸の進入不可地形は単に赤パネルにしてくれればいい」のに対して、「紫丸の範囲は、武器射程範囲がもう1マス延びていてほしい」のです(紫丸を打つべき場所は他にもありますね。上の方の森とか)。

「武器射程範囲がもう1マス延びていてほしい」というのを今の仕組みに即して言い換えると、「武器射程に切り替わった先は、どの地形も消費移動力を”-1″として扱ってほしい」ということになります。

消費移動力の計算部分に手を入れる

まずは青丸の進入不可地形について。

移動力計算中に、進入不可を意味する「消費移動力99」が出た際に、次のような条件分岐を足せば良さそうです。

| |▼ 4方向チェック先の地形の消費移動力をチェック。コモン化するとラク。
| |■イベントの挿入[名]: CSelf26[4方チェック先消費移動力] = [“┃┣消費移動力チェック”] <コモンEv 13> / CSelf23[4方チェックX] / CSelf24[4方チェックY] / CSelf13[移動タイプ] / CSelf14[ユニット所属] | |■変数操作: CSelf27[新残移動力] = CSelf25[チェックマス残移動力] – CSelf26[4方チェック先消費移動力] | |■条件分岐(変数): 【1】 CSelf26[4方チェック先消費移動力] が 99 と同じ
| |-◇分岐: 【1】 [ CSelf26[4方チェック先消費移動力] が 99 と同じ ]の場合↓
| | |■条件分岐(変数): 【1】 CSelf25[チェックマス残移動力] が 0 超
| | |-◇分岐: 【1】 [ CSelf25[チェックマス残移動力] が 0 超 ]の場合↓
| | | |■条件分岐(変数): 【1】 CSelf15[ユニット射程] が 1 以上
| | | |-◇分岐: 【1】 [ CSelf15[ユニット射程] が 1 以上 ]の場合↓
| | | | |▼ 「絶対進入できない地形」、「移動処理中のユニットの射程が1以上」、「元の残移動力が0より大きい」なら、
| | | | |▼ この地点に入れる残移動力はゼロに(攻撃対象のパネルに)
| | | | |■変数操作: CSelf27[新残移動力] = 0 + 0
| | | | |■
| | | |◇分岐終了◇
| | | |■
| | |◇分岐終了◇
| | |■
| |◇分岐終了◇

ユニットの設定によっては「射程0」も十分にありえることにご注意ください。

 

そして紫丸の部分、武器射程のみの範囲になってからは消費移動力を一律”-1”とするケース。

これも消費移動力の調整ですから、いじるべき個所は同じ場所です。上記の「99と同じ」の条件分岐に「それ以外の場合」を足し、その中にこんな処理をかけましょう。

 | | | |■条件分岐(変数): 【1】 CSelf27[新残移動力] が CSelf15[ユニット射程] 未満
| | | |-◇分岐: 【1】 [ CSelf27[新残移動力] が CSelf15[ユニット射程] 未満 ]の場合↓
| | | | |■条件分岐(変数): 【1】 CSelf15[ユニット射程] が 1 以上
| | | | |-◇分岐: 【1】 [ CSelf15[ユニット射程] が 1 以上 ]の場合↓
| | | | | |■変数操作: CSelf27[新残移動力] = CSelf25[チェックマス残移動力] – 1
| | | | | |■
| | | | |◇分岐終了◇
| | | | |■
| | | |◇分岐終了◇

上に書いてきた理屈をウディタのコマンドにするとこうなるわけですね。

 

さて、いくつかパターンを試してみましたが、思い通りに動いているようです。

 

 

 

今の「┣■移動力計算」コモンはこんな感じ(長いので2分割)。

青丸と紫丸でともに「射程が1以上あること」という分岐をつけていたので、ここはまとめてしまっています。

そして、「┃┗移動可範囲にパネル」コモンにも射程を入力値として送り、残移動力が0以上かつ、射程未満のパネルは赤く表示するように書き換えておきましょう。

最後の仕上げに「┣■ユニット操作」と「┃┣移動先選択」に手を入れる

赤パネルは「武器なら届くけれど、歩いてはいけない範囲」です。

ユニット移動関係の処理は今のままだと「残移動力が0以上なら歩いていける場所」とみなしてしまうため、ここにも改修が必要ですね。

  • 「┣■ユニット操作」コモンでもユニットの射程と移動力を取得し、「移動」コマンド決定時の処理(パネル再表示等)でもこの射程の値を入力
  • 「┃┣移動先選択」コモンでは、その決定したマスの残移動力や他ユニットの不在をチェックしていましたが、「出発地とクリック先座標の距離」を「┣2点間の距離を取得」コモンで調べ、距離がユニットの移動力以下なら、移動を許可するという分岐を足します

 

注意すべきこと・この方式の弱点

この攻撃可能範囲の表示は、非常にシンプルに考えて「それらしいもの」を実装した結果です。下記のような弱点もあることにご留意ください。

コンシューマーなどではもっと違う方法でスマートに処理しているものと思われます。

長射程ユニット

FE(ファイアーエムブレム)の弓兵のような挙動・能力のユニットを作った場合は、今回のシンプルな攻撃可能範囲の処理では不具合が出てきます。

FEでいう射程2とは、「2マス離れたマスにのみ攻撃できる」という意味だからです。「2マス先とそれ以下のマスに攻撃できる」ではありません。

なので、FEの弓兵は周囲を敵軍ユニットで囲まれて、2マス距離のマスにさえユニットをおかなければ完璧に無力化できます。

理想の挙動を図示するとこう。

 

 

しかし、今回作った処理で同じ状況を作ると……こうなってしまいます。

シンプルに考えたが故の欠点ですね。

「┣■移動力計算」コモンをいじくりまわすより、コモンの頭で、こういう状況になっているかどうかを事前にチェックし、もしそうなら専用の別コモンでCDBに値を直接入力する……といった対処の方がラクかもしれません。

杖など回復効果の範囲の表示

回復など、味方への効果の場合は、たとえば青パネルなんかを出すことになるでしょうか。

FEだと魔法系の上級クラスは「射程1-2の魔法」と「杖」を両方つかえたりするので複雑なことになってきそうです。

移動力範囲内の味方(所属ナンバーがおなじユニット)に青パネルを置くだけなら難しくなさそうですが、隣接していない遠くの味方にも使える杖なんかがあるとさらに厄介ですね。

こういうケースでも、別の専用コモンを呼んでしまうほうがいいのかも。

MEMO

この他にも仕様等との兼ね合いで意図通りの表示にならないことがあるかもしれません。各々でアレンジしてください。

 

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