D’s Production 2019/09/22 06:51

《虐殺大陸の明けぬ夜3》 制作開始、そしてアルゴリズムを思いつかなかった話

今回の記事はややマニアックというか、多分プレイヤーの大半が興味のないゲームプログラミングに関する話を書いている。当然、興味のない箇所、あるいはこの記事自体飛ばしてもらって構わないのだが、私自身他の制作者の製作日記などを見て、その裏側の事情(プログラミングなどの苦労話)のことが一切書かれておらず内心物足りなく感じることがたまにあるので、同じように感じている人もいるかもしれないと思い、あえて実験的に書いてみたというところがある・・・という言い訳を最初にさせていただきたい。

制作開始

《虐殺大陸》の制作を開始したのは《サキュバス探訪譚》の制作が終わった2017年12月のことである。
制作に関する最初のツイートは12月21日になっている。
https://twitter.com/DsProduction2/status/943596255900340224?s=20

《リョナラーの野望》では41あった城の数を22に削減し、1マップの大陸図をこの時点で既に作成している。
完成品しか見たことがない方には逆に新鮮かもしれないが、当時の大陸地図は自作の絵ではなく、マップチップである。
まだ名前はない。

余談ながら《サキュバス・レ○プ残酷物語》が完成した7月頃には下のようなゲームを作ろうと考えていたらしいが、企画倒れどころか企画すらされず頓挫している。それでよかったと思っている。
https://twitter.com/DsProduction2/status/944216300594782208?s=20

制作ツール「ウディタ」

制作ツールはWOLF RPGエディター(通称、ウディタ)である。
https://www.silversecond.com/WolfRPGEditor/
文字通りRPGを作るためのツールでマップ上のキャラクターなどのオブジェクトの挙動を制御するシステムを最初から持っている。これを使えば簡単にマップ上でキャラクターを動かすことができる。
しかし欠点もある。あらかじめ規定されたマス目単位でしか動かせないということである。
1マス40ピクセルとして(これは変更可)、ウディタは半マス移動ができるから、最低でも20ピクセルである。1つ動かすと、最低でも20ピクセル動いてしまう。
《リョナラーの野望》ではそれを使っていたのだが、全マップを1画面に収めてしまった《虐殺大陸》ではより精密な制御を行いたい。1ピクセル単位で動かしたかったのである。
自作のシステムを組むことにした。
そう言うと大層なことをしているように聞こえるが、ウディタでは珍しくもないことだ(多分)。
プレイヤーが直接操作する矢印カーソル、そしてマップの道路上を移動する師団キャラクターなどは、ウディタの基本システムではなく、自作のシステムでピクチャ(画面上に貼り付ける画像)を動かしている。
それゆえ上(奥)のキャラが下(手前)のキャラの“頭を踏みつける”といった不具合も生じているが、これは一貫して無視することにした。完成版に至ってもこれはそのままになっている。

経路検索を巡る死闘──それは勝利か敗北か・・・?

《リョナラーの野望》にしても《虐殺大陸》にしても、そのシステムを構築する上で最初の難関となったのが経路検索問題である。
これらのゲームでは拠点から拠点へと、交差したり曲折したりしながら縦横無尽に街道が伸びている。その街道上を師団がリアルタイムで目的地に向かって自動的に移動する。
実際のゲーム画面ではないが、簡略化した図を示したので見てもらいたい。

例えば地点0から地点1に向かって移動するものとする。
人間ならば一見しただけでどのようなルートを通るのがよいか判断できる。しかしコンピューターはそうはいかない。手順が必要だ。
まず各地点の情報を入力してやる必要がある。データベースの作成である。
拠点が0から14存在すること。そして0の左には2が、2の上には3が、3の上に4・左に6が接続している・・・
必要によっては各地点の座標と地点間の距離を入れてもよい。
最も簡単な方法は総ざらいである。
地点0から出発し、2→3と進む。分岐して4へ進む場合と6へ進む場合、6に進む場合はさらに次に7に進む場合、11に進む場合、5に進む場合と分岐する。さらに11に進めば12に、10に進む場合で分岐して・・・という風に進めていき、最終的に最も少ない地点数か距離で1にたどり着いたものを採用する。
不可能ではない。
しかしこの程度のマップならばともかく、実際のマップはもっと広大だ。《虐殺大陸》で38地点、《リョナラーの野望》で確か100近くの地点がある。
ウディタでは1フレーム間の処理数は最大50万回までと決まっている(これを超えると緑帯のエラーが出る)。


あくまで最大数がそれであって、当然1フレーム間に何万回もの処理をするようには想定されておらず、もしそんなことをすれば動作が重くなる。
ひとたび目的地を選択するたびに毎回そんな膨大な計算をしていては、そのたびに一瞬ゲームが止まったようになり、ユーザーのストレスは大変なものになるだろう。しかもこのゲームはプレイヤーだけでなく、敵AIも師団を任意の目的地に派遣してくる。動作がカクカクになること請け合いだ。
よって、そのたびごとに総当りで経路を算出するという方法はとれない。
ではどうするか?
それがわからなかった。
わからなかったので、最も原始的で、プログラマーとしては敗北宣言にも等しい方法を採用することにした。
すべて手入力であらかじめ経路を設定しておく」──これが私の導き出した答えだった。
たとえば地点1から2に移動するとき、1から3に移動するとき、1から4に移動するとき・・・
すべてその経路をデータベースに登録しておくことにした。
《虐殺大陸》では38の地点がある。そのすべての地点から、他のすべての地点への経路を、すべてエクセルで手動で入力した。その総数は38×37で1406個。いや、1から2に行くのと、2から1に行くのでは順序を逆にすればいいだけだから、半分で済む。それでも703個である。

データベースを読み込むのにも処理は必要だが、いちいち計算することを思えば屁みたいなものである。
これを読んでいる読者の中には、今の話を聞いて憐れみと侮蔑の笑みを顔に浮かべている方もいるかもしれないが・・・それは甘んじて受け入れることにしよう。もしその中に親切な人がいれば、他のよい方法を教えていただきたい・・・ただし、リアルタイムで進行するゲームの処理として適切な方法を、である。

最善の解であるとは到底思えないが、ともかくそのようにして《虐殺大陸》の根幹である師団移動の方法は出来上がった。
既にプレイされた方は、師団がやや不自然な迂回路を通るのを不可解に思ったことがあるかもしれない。「ゴス」から「ナリサ」へ行くときに「ガンドヴァール城」を迂回する時などである。


これはもちろん無関係の拠点を迂闊に通らないためなのだが(そこが敵国の支配領域である可能性もある)、それは私自身があえてそのような経路を入力したのである。コンピューターが自動で計算しているわけではない。

私は今新しい《虐殺大陸》(二章以降)の構想を練っており、けれどもただの一ミリも制作には着手していないのだが、経路計算のアルゴリズムを作り出せなかったことが“逆・取らぬ狸の皮算用”的に重く頭にのしかかっている。それすらできなかった自分に、今考えていることが実現できるのだろうか・・・?と・・・

その後この力技による解法は、手入力であるがゆえの問題──つまり見間違いや打ち間違いによるエラーを大量に吐き出し、そのたびにエクセルと地図を見比べて間違い箇所を修正するという苦行を経て、しかしながら着実に完成されていった。
完成品において経路のエラーが出たという報告はまだ受け取っていない。単に放置されているだけかもしれないが、ほとんどの人が遭遇しない程度にはエラーは潰せたのではないかと思っている。

これは自分のアルゴリズムを考え出す知性の問題でもあるが、同時にウディタの処理能力の問題でもある。それらは次なる問題、「師団の移動・師団同士の接触」処理でも悩みの種となり、実はこれに至っては今に至るまで解決されていないのだが、その話はまた次回以降に譲りたい。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索