MCL(57)

インデックスに戻る

前のMCLへ  次のMCLへ

▼ My Computer Life (57)

57. 地獄のエイリアン伝説

 X68kを買った1990年末より、RPGを作ろうとした件については、#0037あたりで書いた。DRAGONAUT(ドラゴニュート)という名前の、ドラクエ風ゲームだった。しかし、当初はX-BASICで製作しており、その処理速度の遅さに涙したものだった。
 しかしそれから3年余、X-BASICの扱いにも慣れたし、SHARP謹製CコンパイラによるBAStoCコンバートで高速化する目処も立ったので、再びRPGを作ろうという計画が自分の中で盛り上がってきた。
 前回の失敗は明らかで、とにかく処理速度が遅い事だった。それが取り除かれるだけでも、前回よりは先に進める!

 このプロジェクトに関しては、非常に詳細なメモが私の家の宝物庫から数年前に発見され、読んでみるとその時々の考え方からプログラムの実装まで細かく記述されており、非常に楽しく読めた。それに沿って、どんな物を作ったか紹介していこう。

 前回は、ドラクエ風の画面で、街の外から作り始めた。今回は、街の中から作ろう、と決めた。街の中を人が歩いていて、それに話しかけられる、と。プログラム的にはそこが一番難しいかな、と思ったからだ。

 また、前回背景をBG画面を利用して作っていたが、今度はグラフィックを利用して作る。背景の表現力も高くなるし、BGの定義数のような制限が無いので、表現の幅がずっと広がる。実際、X68kの市販ゲームでも、BG画面を普通に背景にする方法はあまり使っていないんじゃないかな、と思う。
 ただ、グラフィック画面を使用すると、別の問題が発生する。スプライト面は常にグラフィック面の上に表示されるので、マスクする事ができない。つまり、例えば「建物の裏にキャラクタが隠れる」というような表現ができない。建物自体がグラフィックで描かれていれば、スプライトは常にその上に表示されてしまう。グラフィックが256色モードであれば2面使えるので、上から順にグラフィック面A→スプライト面→グラフィック面Bという形に出来れば、理想である。キャラの上に来る背景チップをグラフィック面Aに置いて、地面などの下に来る背景はグラフィック面Bに置けばいい。しかし、残念ながらX68kのCRTCは、そこまで柔軟なプレーン構成になっていない。
 とりあえずの所、どうしても隠さなきゃいけないところだけ、BGを使う事にした。木の上の方とか、建物の屋根とか。
 ただ、マップのうち一部をグラフィックで、一部をBGで持つとなると、データにしろ絵素材にしろ、管理が大変になる。
 そしてまた、パレットの管理も難しい。元々15本しか使えないパレットの内、まず1本は主人公用に確実に抑えておきたい。残り14本の内、10本を街の住人等他のスプライト用に、4本をBGに割り当てる事にした。たったの4本で全BGを表示しなければいけないので、使えるパターンは限られる。そこに四苦八苦した。

 スプライトをマスクするBGの使い方においては、「透明ではない透過色」という裏技があり、それを使えばパレットの消費は避けられるのだが、このゲームを作り始めた時点では知らなかったようで、普通のBG定義で切り抜ける予定だったようだ。ただ、ノートを読んでみると、開発してる最中にはその方法に気づいており、もしかすると最終的には実装していたのかも知れない。そこは記憶に無いが、詳細についてはまた後日書く事にしよう。

 で、実際の開発の経緯を追いかけてみよう。
 まずは、おおまかな仕様、着手の順番を決め、上記のような「複数の手段の内、どれを選ぶか」という手法的な物を決め、まとめたあと、最初にチップエディタから手をつけたようだ。16x16の背景チップを作るためのエディタらしい。
 背景は256色、2画面のモードを使用していたが、256色というのは結構表現力が無い事に気づいたらしい。いったんチップエディタを作ったあと、カラー編集機能を組み込んだようだ。X68kの256色モードは、実際にはパレット形式になっていて、65536色の中から256色を選ぶ事ができる。そこで、そのうち「背景に使う128色」を自由に編集できるようにしたのだ。

 それが完成した後、次にマップエディタを作ったようだ。ノートを見ると、マウスとジョイスティック(そしてキーボードも)を併用する操作体系になっていたようだ。ジョイスティックの上下左右でスクロール、マウスの左クリックでチップ配置、右クリックでチップ選択。またジョイスティックのボタンを押すと、チップエディタとの行き来をするようになっている。
 実際これでどうやってたか、全く記憶に無いが、文章を見る限りなんかマップ編集しやすそうなインターフェイスではある。ジョイスティックでスクロールさせて、マウスで置いていくとかね。良く考えたね。

 さて、マップエディタを作った時点で、チップを読み込んで表示する、というゲームにも流用できるルーチンが出来上がった。というか、それを開発する目的もあって、マップエディタの作成に挑んだわけだ。
 ただ、マップエディタのスクロールルーチンと、ゲーム本編で使うスクロールルーチンは違っている。マップエディタの方は、スクロールさせるたびに、新しく生まれる一列分を裏画面に一気に書き込む。しかしゲーム本編でそれをすると、書き込むたびに動作が止まってしまうので、スクロールにあわせて1チップずつ書き込むようにして負荷を分散させる。そういうような処理を最初に行った。
 これで、ゲーム本編でも、キャラが画面を移動する所まで出来た。
 次に、マップチップの属性を作り、参照できるようにする。ここは進入可、ここは進入不可とかね。ここまでやって、大体マップ上の移動が可能になる。

 それから、今度は街の中から作ると決めたのだから、街の人達のルーチンも作った。
 こういうのも、一昔前の私なら、出来なかっただろう。多数のキャラが同時に動くプログラムとか。しかし、ここまで色々なプログラムに触れ、作ってきて、そういうのもどうやってやればいいか、わかってきていた。
 問題は、キャラのグラフィックだが、これは弟が解決してくれた。暇そうにしてたので、適当に方眼紙と色鉛筆を渡したところ、キャラパターンをちゃんと作ってくれた。上下左右、それぞれ2パターンずつ。ドラクエのドット絵などを参考にしたらしい。作ってみて、「俺天才じゃね?」とか言ってるので、とりあえず否定はせずにどんどん作らせる事にした。
 で、絵が出来たところで、動かしてみた。ランダムに配置し、ランダムに動き回るみたいな奴。うまく行った。感動! やっぱり、街の人が歩いている時点で、なんかこう、嬉しい。

 続いて、衝突判定を行う。これは結構難しかったね。町の人やマップは、全て16x16のチップ単位でいるいない、通れる通れないを管理している。ところが、実際には街の人の移動というのは16ドット分動く時間を作らなきゃいけない。この、チップ単位の当たり判定と、表示上のドット単位の動きの差というのが、結構ゲームを作っていてネックになるものだ。そういうのも、ここで勉強できたかな、と思う。

 ここまでで、とりあえず街の中を動きまわって、人が歩いてて、ぶつかったり出来るというなんとかゲームらしい見栄えのものが出来た。
 だが、ちょっと遅かった。BAStoCを使って、コンパイルしてはいるものの、それでも遅い。もちろん、一番最初に作ったRPGよりかは速いけども。

 そこでまず、当時の私は、一番時間がかかっているのはマップチップの転送だと考え、そこだけアセンブラで書く事にしたようだ。今考えると大胆なアイデアだ。BASICでプログラム書いているのに(それしか出来ないのに)、遅いところをアセンブラで書くなんて。極端と言うか。
 私はアセンブラについてはさほど詳しいわけでは無かったが、#0041にある通り一応の知識は仕入れていたので、Oh!Xにあった外部関数をアセンブラで作る方法を参考にして、VRAMへの転送部分のみマシン語で書いてみた。
 が、結果としては、目に見えるほどの高速化は残念ながらなされなかった。

 もう一つ、スプライトの定義に時間がかかっていたのて、Oh!Xの1992年11月号に掲載されていた、「SPRITE2.FNC」を使ってみた。これは、従来のX-BASIC付属のSPIRTE.FNCを置き換える事のできる外部関数群で、基本機能は変わらないが、スプライト定義の際にDMA転送を使い、また複数の定義をまとめて行う事で高速化している。
 これを使用してみると、明らかに速くなった。どうやら、元々のSPRITE.FNCはあまり速いものではなかったらしい。

 とりあえず、高速化についてはそんなものだろうが。もっとも、それ以外のプログラム上の工夫として、衝突判定を少なくしてみたり、こまごまとしたテクニックを用いてはいるけど。

 このあたりで、ゲームのタイトルを決めようという流れになった。弟と二人で考え、当時(というか今もだけど)の我々はB級映画を愛していたので、B級映画っぽい名前にしようという話になった。最初に、「地獄の」をつけようというのはあっさり決まった。大体「地獄の」をつけるとB級っぽくなる。それから、「エイリアン」も入れてみた。これを入れた時点でなんとなくファンタジーRPGじゃなくなる気はするんだが、これもB級っぽいかなと思って無理やりねじこんだ。最後に「伝説」をつけた。これは多分、当時の私が、「忍者武雷伝説」というマイナーゲームが好きだったからではないか、と思う…。
 というわけで、このゲームのタイトルは「地獄のエイリアン伝説」に決定した。

 その次に、じゃあ今度は街の外に出て、戦闘とかさせてみようかという話になった。
 で、戦闘システムや、それを実装するためのプログラムの仕様等を考え、ノートに書き留め…たところで実は開発が終了している。
 これは、ちょっと自分の学生生活の方が忙しくなった(上記の開発は全て、冬休みの間に行われていた)のもあるが、もう一つ重大な理由がある。マウスが壊れてしまったのだ。うちのX68kは、マウスの繋がらない体になってしまったのだ。それがどういう経緯でそうなったのか、次の次の回あたりで明らかにしよう。
 という事で、せっかく作ったチップエディタだのマップエディタだのも全く使えなくなり、開発はそこで頓挫してしまった。

 ところで、残念な事に今回は画像が無い。私のX68kエミュレータにこのプログラムが入っていないのだ。あれば、そこからキャプチャしたのに。
 昔、X68kの5インチディスクの資産を保存しようと思ったが、当時PROIIはすでに捨ててしまっていたので、K A M E さんの自宅にディスクを持っていってX68030を使ってMOに移すという作業をした事があった。その時、この「地獄のエイリアン伝説」の入ったディスクの中身を移すのを忘れてしまったらしい。ある意味、もっとも大事な思い出でもあるのに…。無念である。


前のMCLへ  次のMCLへ

戻る

TOM 2009