そんなものまでローテーション

2021/4/24 | 投稿者: ghost

スペインはMATRAより好評発売中オンラインでも遊べる拙最新作 CONCLAVE of Darklord の一見してわからないちょっとした実装上の工夫について問わず語りに書く。

クリックすると元のサイズで表示します

ちょっとクドい前置きから。

ゲームに限らずプログラミングに馴染みのない人にはピンと来ない話かも知れないが、ゲーム画面上でわらわらとたくさんの何かが動いていたとしても、本質的にコンピュータは、ある瞬間を取り出すと一つのことしかしていない。

アニメーションが秒間何コマのセル画から出来ていてこれをパラパラと流すから絵が動いて見えるのだ、というアナロジーを思い浮かべる人もいるかも知れないが、ここで言っているのはそれとは次元の異なる話になる。アニメの場合、同じセル画に載っている複数のキャラクタは、少なくとも1コマと1コマの間では同時に移動することがあり得るのに対し、コンピュータゲームの動作は、強いてこのアナロジーに乗るとすれば、それぞれのセル画を一人の人が描き続けている様に近い。

それが人間の視覚に比してあまりに高速なので、すべてが同時に動き続けているように見える。が、これを超スローモーションで観察すれば、ある瞬間には一つのことしか起こっておらず、その出来事の間には厳密な順序性がある。

クリックすると元のサイズで表示します

さて、CONCLAVE of Darklordは繰り返し言っているように6人同時対戦がウリのゲームなのだが、上に書いたようなコンピュータゲームの特性は、実は6人同時対戦と相性がよろしくない。具体的には当たり判定が問題になる。

話を単純化して光子剣で敵枢機卿を斬る判定に限定して考えてみよう。6人の枢機卿それぞれの光子剣が、自分以外の5人の枢機卿を斬ったかどうかの判定は、1フレーム毎に計30組み合わせでおこなわれることになる。そして、この判定も冒頭に書いたように、1つ1つ順番におこなわれる。本作では、すべての枢機卿はまったく同じ性能を与えられており、武器のリーチ範囲も台頭なので、先に当たり判定の順番が回ってくる側が一方的に有利になってしまう。これでは、対戦ゲームとしてフェアではない。

このような場合、ボードゲームに詳しい人であれば思い当たる節もあろうかと思うが、一般論としては「判定」フェーズと「結果反映」フェーズを分ける、ということをする。つまり、6人vs5人=30回の当たり判定を黙々とおこなってその結果を記録した後、その結果を組み合わせて「斬った」「斬られた」「相打ち」の状態変化を起こす。こうすると、判定順序による不公正はおこらない。ただ、この方法にもデメリットがあって、まぁ、考えればわかることだが、単純に手間=時間が倍かかることになる。

本作では、時間は十二分に処理に余裕があるので問題にはならなかったが、その処理をおこなうプログラムも当然のことながらメモリ資源を消費するのでそれを嫌ったのと、それ以上に、本作は「最後に生き残った枢機卿が勝者」というのが大前提の枠組みになっているので、「相打ち」を許容する処理系を採用する気になれず、別の解決策を採った。これが本稿本題になる。


と、大袈裟な前振りで始まったのだが、書いてしまえばつまらない話なのである。

一般論として、多対多の当たり判定処理は、メモリ上に順に並んでいるオブジェクトの位置情報をアドレス順に舐める構造の入れ子でおこなわれる。本作では、一番若いアドレスに格納されているのは青い枢機卿の情報なので、単純にアドレス順に当たり判定をおこなうと、彼が一方的に有利になる。

そこで本作では、フレーム毎にこの当たり判定の順序をローテーションさせている。つまり、あるフレームでは青→赤→緑→黄→紫→水の順におこなわれた当たり判定が、次のフレームでは赤→緑→黄→紫→水→青になり、さらに次のフレームでは緑→黄→……というようになる。

するとどうなるか。

クリックすると元のサイズで表示します

ある瞬間に二人の枢機卿が互いを光子剣の射程に捉え、かつ、互いに最も合理的な行動を選択したとして、一方の剣が相手を切り裂いたと先に判定される確率は、ぴたり2分の1になる。フェアでしょ?

この処理系がもっとも複雑なロジックになっている部分で、文字通り本作の心臓部と呼べるのだが、ゲームをプレイする分にはまったく気づかれないだろう、と思ったので、なんとなく書き出してみた。いや、こういう言い方をすると「オマエは気づかないだろう」と嫌味をやっているようでアレなのだが、まぁ、そういう気分がまったくないか、と問われるとウソになるが(ぉぃ)本稿を書いた直接の理由はソレではなくて、この手間をかけた「フェアさ」はこうして説明でもされない限りまったく実感されないだろう、と思ったからである。

というのも、まず、ある瞬間に互いに斬り合う二人の枢機卿の一方があなた、一方がAIだとして、特に旋回しながら斬るケースが顕著になるが「互いに最も合理的な行動を選択」をすることなどあり得ないのであって、肉眼で画面を見ながらコントロールしているプレイヤーに対し、メモリ上の数値から直接判断を導いているAIの方が、たとえ最大3フレームの操作遅延があろうとも、より合理的な判断をしているのは疑いなく、結果、互いに斬り合える間合いで打ち合えば、十中八九あなたが斬られて終わるのである、2分の1じゃねーじゃん。

クリックすると元のサイズで表示します

さらに言えば、人間プレイヤー同士の対戦であったとしても、本作はNTSCベースで 12 fps. で動作しており、Quick turnを最大装備した場合の枢機卿の旋回角速度は 540°毎秒であって、この速度で振り回される光子剣が仮に同時に互いに相手に有効打を与え得る位置にあったとして、その判定順位なんてプレイヤー自身の意識には昇らないし、そもそも同時だったかどうかなんてわかるはずもない。ただ、斬った方が「やったー!!」と喜び、斬られた方は「ズルい!!」とムカつくだけであろう。

つまるところ、斬られる側にすれば常に「フェアな判定」などというものはないのであるが、それを百も承知の上でこういう作り込みをするのが作っている側としては楽しいのである。
タグ: MSX Z80



コメントを書く

名前
メールアドレス
コメント本文(1000文字まで)
URL





AutoPage最新お知らせ