シリーズを重ねるごとにポケモンや技、特性などが増え、複雑化していくバトル。その処理を担うバトルシステムを構造化し、柔軟な拡張性を持たせることで新たな仕様にも対応できるロジックを実現。その設計論が語られた。
従来のターン制バトルではなくアクションバトルとなった『Pokémon LEGENDS Z-A』(以下、『ポケモンレジェンズ Z-A』)でもターン制と同じゲームロジックを使用している、という驚きのエピソードもあるので、ぜひ最後まで目を通してほしい。
- 複雑化するバトルを再構築したポケモンバトルシステムチーム
- システムの構造化と拡張性
- バトルがアクションになった『ポケモンレジェンズ Z-A』でも同じロジックを使用!?
- ロジックの構造化、メインフローと個別処理の分離は思考面でも役立つかも?
複雑化するバトルを再構築したポケモンバトルシステムチーム
バトル内で自動的に効果を発揮する、いわゆるパッシブスキル的な要素である特性は、相手ポケモンの能力を下げるもの、あるいは技を撃つ際に自身のタイプを変化させるものなど、その効果も多彩。上に挙げた各要素はそれぞれ単純に数も多いが、何より互いに影響し合うため、組み合わせの膨大さを考えればバトル品質の維持が容易でないことは明白だ。

そんなバトルの設計を、シリーズごとに開発しては品質を担保するのは難しい。そこで結成されたのが、ポケモンバトルシステムチームだ。本チームはポケモンの全プロジェクトに参加し、バトルなどの品質を高めるべく力を尽くしているという。今回講演を行った宗像氏、小幡氏も同チームに所属している。
本講演の肝であるバトルシステムとは、バトルにおいて発生する事象を計算するシステム。“誰が何をするか”という入力を受け、その結果“何が起きるか”を出力する仕組みを指す。

講演内では、リザードンがピカチュウにほのおのパンチを撃つ場面が例に挙げられた。ほのおのパンチの効果だけを見れば、相手にダメージとやけどの状態異常を与える、比較的シンプルな内容だ。
しかしここに、天気(あるいは天候)や特性、持ち物が加わると、同じ技でも展開は大きく変化。天気が晴れならほのおタイプの技は威力が上昇し、技を受けるピカチュウが“せいでんき”の特性を持っていれば、攻撃したリザードンにまひが付与される。
さらにリザードンが“クラボのみ”を持っていた場合、自動でまひを回復する処理も行われる。このように、技の効果自体がシンプルでも周辺の要素によっていくらでも処理は複雑になっていく。

『ポケットモンスター サン・ムーン』以降、従来の枠組みでは対応しきれない多様なバトルルールが登場したこともあり、プログラムはより複雑化。ファイルの肥大化や関数の巨大化なども進み、新しい仕様を安全に追加するのが困難になっていったという。
そんな状況を受け、『ポケットモンスター サン・ムーン』の開発終了後、バトルをより明快で柔軟な構造に作り替えるべくポケモンバトルシステムチームが結成。システムの再構築に踏み切ったわけだ。


システムの構造化と拡張性

まず着手したのは構造化だ。構造化において大事なのは、複数人による作業を想定し、誰が何回設計しても同じ構造になるようにすること。前述のように、『ポケットモンスター』のバトルでは非常に多くの要素が影響し合うため、技ごと、特性ごとの処理をそのまま組み込んでいくとシステムが複雑化してしまう。
そこで処理の種類に着目し、攻撃力の決定やダメージの算出など、“何をどの順番で処理するか”という枠組みの部分をゲームロジック、技・道具・特性などによって発生する個別の処理を個別仕様に分類。さらに、ゲームロジックの最小単位をセクションと名付け、各セクションの役割とルールを明確にした。

技が発動した際の“ダメージ付与”の処理には“ダメージ計算”と“HP減少”の処理が含まれ、ダメージ計算には“攻撃力決定”・“防御力決定”・“ダメージ算出”の処理が含まれている、といった具合に、ロジックがまさに構造化され、どの段階で何をどう処理しているかが明快になっている。
ゲームロジックの本質を理解しやすい形に整理したことで、セクションの複雑化や、異なる作業者による実装方法のブレを防ぐことができたという。

イベントハンドラーの活用で柔軟な拡張・オミットが可能に

イベントはロジック内のセクションから発火される(呼び出される)もので、ロジックから切り離された個別仕様が介入するためのポイントとなる。このイベントにイベントハンドラーが反応し、天気や特性といった要素がセクションに効果を与えることができる、という仕組みだ。
講演の冒頭で挙げられたリザードンのほのおのパンチを例にすれば、攻撃力決定のセクションで攻撃力補正のイベントが発火され、それに応じて晴れや特性、道具などのイベントハンドラーが必要に応じて反応し、最終的な攻撃力が決定される。

たとえば天気の晴れは炎タイプの技のダメージを高める効果とともに、水タイプの技で受けるダメージを半減する効果も持っている。ロジック内で処理しようとすると、晴れに関する処理が攻撃力決定、防御力決定のセクションで別々に実装されることになってしまう。

個別仕様をロジックから切り離したことで、処理を整理しやすくなるほか、ロジックを変更することなく個別仕様を追加できるようになったのもポイント。逆に、技や特性が登場しなくなり不要になった処理については、イベントハンドラーを登録しないことでゲームから簡単に除外できるようになったという。
メガシンカやテラスタルなどタイトル固有の仕様についても、イベントハンドラーを活用することでメインのバトルロジックから分離できており、仕様の複雑化を防ぐことにつながっている。
構造化と拡張性によって、割り込みと連鎖の複雑な処理も簡潔に
これらについても、そのまま実装しようとすると、ほのおのパンチによる状態異常付与の後に、再びせいでんきによる状態異常付与のセクションを追加する形になる。こうなるとゲームロジック事体の拡張が必要となり、ロジックの複雑化にもつながってしまう。

そこで、イベントハンドラーに任意のセクションを呼び出せる機能が追加された。技効果の最終処理として“技効果後処理”のセクションが追加され、そこからリアクションイベントが発火、これにせいでんきのイベントハンドラーが反応し、新たに状態異常付与のセクションを呼び出すことで割り込みが処理される。
さらに、せいでんきによる状態異常付与のセクションが状態異常のイベントを発火し、今度はここでクラボのみのイベントハンドラーが呼び出される。連鎖反応はこのように処理されている。

イベントハンドラーが再帰的にセクションを呼び出せるようにしたことで、複雑な処理も整理された形で実現されている。これならばメインのロジックを変更する必要がなく、かつカスタマイズ性、拡張性も担保される形だ。
このように、ゲームロジックの構造化によって処理の見通しがよくなり、個別仕様をメインのロジックから切り離したことで、より柔軟な仕様の追加や変更、オミットが可能となった。
『ポケットモンスター』のように長期的に発展していくシリーズはもちろん、個別のタイトルを開発するうえでも、処理のフローそのものを構成する要素と、処理結果に影響を与える個別の要素とを切り分ける考えかたは役立ちそうだ。

バトルがアクションになった『ポケモンレジェンズ Z-A』でも同じロジックを使用!?
ここでも、システムの構造化が役に立ったという。ターン制バトルにおいては、1ターンのあいだに何が起きるかを出力する“行動実行”の処理があり、その内部に“技効果”、さらにその内部に“発動判定”や“命中判定”、“ダメージ付与”といったセクションが含まれている。
もちろん、これらがすべてそのままリアルタイム制にも用いられたわけではない。時間とともに状況が変化するため、行動実行と技効果に関しては処理の粒度が大きくなるので不要となり、また命中判定に関しては命中率や回避率ではなく、コリジョンを使った判定に変わるため不要となった。ただし、状態異常により技を発動できない、などの処理に使う発動判定、およびダメージ付与のセクションに関しては、そのまま使用しているという。

『ポケモンレジェンズ Z-A』では技のボタンを押すことで発動判定のセクションが発生し、そこからコリジョン同士の接触による命中判定が行われ、命中後にはダメージ付与のセクションが発生、といった流れで処理が進む。このように、仕様に合わせてセクションを取捨選択し、その呼び出し順や中身の処理を変えられたのは、構造化のおかげというわけだ。

拡張性に関しては、ターン制バトルでのターン処理を前提とした技効果の変更が例として挙げられた。
技の“まもる”は、ターン制バトルにおいては使用ターン中はまもる状態になり、受ける技を無効化するものだった。処理的には、まもるのイベントハンドラーが発動判定のセクションに作用し、技の発動そのものを失敗させるという仕組みだ。
一方でリアルタイム制のバトルでは、一定時間まもる状態になれる技に変化。処理においても、発動判定のセクションではなく、ダメージ付与のセクションに作用するイベントハンドラーに変更され、技を失敗させるのではなくダメージをゼロにする仕様になっている。

この変更にロジック事体の調整は必要なく、発動判定用のイベントハンドラーを登録せず、代わりにダメージ付与用のイベントハンドラーとして登録するだけで対応できる。一度作ったイベントハンドラーを後から再利用できるのも、この仕組みの利点だという。
ターン制バトルのロジックをリアルタイム制バトルにも流用できたというこの事例は、バトルシステム再構築において重要な点として挙げられていた“柔軟性”をこれ以上なく発揮したものと言えるだろう。こうなると、今後さらに予想外なジャンルや展開もあり得るのでは、と期待が高まってくる。
ロジックの構造化、メインフローと個別処理の分離は思考面でも役立つかも?
最後のまとめで挙げられたポイントは、ゲームロジックを“再利用可能な単位”で分割しすること、個別仕様を“メインロジックから分離”することの2点。これらの考えは『ポケットモンスター』に限らず、複雑化し続けるゲームロジック全般において利用できるものだ。
全体を細かく分割し、ひとつひとつの役割を明確にする、全体的な流れと個別の事象とを分けるという考えかたは、ゲーム処理だけでなく、思考法的な意味のロジックにおいても役立つだろう。勉強や作業などで行き詰ったときには、『ポケットモンスター』のロジック作りを振り返ると何かヒントが得られるかもしれない。











