RTA in Japanにて
先日、RTA in Japanで『ディスガイア2』というゲームのプレイを見た。
ディスガイアは戦略シミュレーションというジャンルのゲームであり、
格子状のマップのなかで自軍と敵軍の駒(ユニット)を戦わせ勝つことが目的だ。
同じジャンルだと、ファイアーエムブレムシリーズや信長の野望シリーズが挙げられる。
プレイのなかで走者の方がディスガイア2のある仕様について次のように述べていた。
敵に後ろから攻撃するとダメージアップするんですけど、このゲームけっこうガバガバで本当に敵の後ろのマスから攻撃しなくても、敵と同じ方向を向いて攻撃すると後ろから攻撃した判定になるんですよね。
個人的に気になったので考えてみた。
これは単なる実装ミスやバグの挙動なのだろうか。
具体的な実装方法
実装の方法として、パッと思い付くのは走者の方も言及しているように『後ろのマスから攻撃しているかどうか』を判定するやり方だ。
敵味方問わずユニットは色々な変数を持っている。
位置はもちろん、立ち絵を正しく描画するためにユニットの向きも持っているだろう。
現在位置と向きがあれば、後ろのマスの座標を計算することができる。
例えば自軍のユニットが敵に攻撃する場合、以下のようなプログラミングをすることで判定が可能だ。
if 敵の向きがx軸正の方向 :
if 自分の座標が(敵のx座標-1, 敵のy座標)と等しい :
ダメージ増加
else if 敵の向きがy軸正の方向 :
if 自分の座標が(敵のx座標, 敵のy座標-1)と等しい :
ダメージ増加
else if 敵の向きがx軸負の方向 :
if 自分の座標が(敵のx座標+1, 敵のy座標)と等しい :
ダメージ増加
else if 敵の向きがy軸負の方向 :
if 自分の座標が(敵のx座標, 敵のy座標+1)と等しい :
ダメージ増加
また、敵の向きをπを用いて定義すると、もう少しコード量を短く書ける。
# x軸正の方向=0
# y軸正の方向=π/2
# x軸負の方向=π
# y軸負の方向=3π/2
if 自分の座標が
( 敵のx座標-cos(敵の向き),
敵のy座標-sin(敵の向き) )
と等しい :
ダメージ増加
攻撃のたびに上記計算を行うことが処理速度に影響するのであれば、ユニットの変数に「後ろのマスの座標」を追加しておくことで計算回数を減らせるかもしれない。
ただ全キャラに変数を追加する分、メモリを消費するし、攻撃されないユニットに対しても毎ターン計算が必要なので、計算回数はユニット数によってはトントンかもしれないという懸念もある。
あとは拡張性についても問題がある。
例えば、ユニットの中には直接殴るだけでなく、弓兵や魔法使いなど遠距離から攻撃が可能なものがいる。
そのため「背面攻撃」の判定範囲を真後ろだけでなく、後ろ側に放射状に設定したい、ということになれば、上記コードがそれだけ長く複雑になってしまう。
こういった諸々の懸念から、もともとユニットが持っている向きの情報だけを使って、以下のような判定条件にしたのではないだろうか。
if 自分の向きが敵の向きと等しい :
ダメージ増加
座標の考慮が不要なため、遠距離攻撃ユニットのカバーもでき、新たに変数を追加する必要もない。
確かに厳密な判定条件ではないので、悪用すれば敵の後ろに回らなくても背面攻撃が可能だ。
(RTAで走者の方が実践されていたように、敵の隣に移動→敵と同じ方向を向く→攻撃)
ただ、チュートリアルなんかで「敵の後ろから攻撃するとダメージがアップする」と説明されれば、プレイヤーは基本回り込んで攻撃をするだろうし、気づくことも少ないのではないだろうか。
事実、私も当時プレイしていた際、この抜け穴には気が付かなかった。
ゲームを作る上でのごまかしとしてはとてもうまいやり方だなと感じた。
もちろんすべて私の想像なので確かなところは分からないが。