1991年2月 開発スタート。ivとgnu(下)

前回は iv を作る寸前まで終わってしまっていたので、今回がその続き。
ivを作っていたのはイースが最終デバッグに入り始めたあたりから、1990年の頭ぐらいまで。
そしてivが初めて実用に供されたのが『うる星やつら STAY WITH YOU』(1990.6/ハドソン)から。
確かメインプログラマが三上君だったはず。彼は飛田さんのサブプログラマをやったことがあり、結構ツーカーだったので、ivの開発には関わっていないけれど、飛田さん的にはやりやすかったのではなかろうか。
シナリオライターは当時企画にいた高津君。
映画&アニメマニアだったので、シナリオライターに抜擢されたのだろうと思う。
ただ、彼は「うる星やつら」は実は全然知らず、勉強してシナリオを書いたので、最初のシナリオではエンディングが「うる星」風になっていなかった(普通の恋愛映画のようなエンディングになっていた)。
で、僕は当時「うる星」の大ファンだったので「これはマズいよ」といって、オチだけは変えてもらったのを良く覚えている。いや、グラフィックの発注とかする前に教えてもらってよかったとw
なんかこれはイースのときにも書いた気はするけど…と思って検索したらなかった…

当時、僕はハドソンの2階でJohnと一緒にイース1・2の海外版を作りながら、4階の開発ルームにフラフラといっては、デバッグやらivやらやるという感じだった。
なんせイースの海外版は待ち時間が長かったので、ヒマだったのだよ。


ではivの言語設計の方針はどのようなものだったのかというと、当時、SmallTalkのオブジェクト指向に強く心酔していたのと(もうね、カッコエエエ! 世界一カッコエエ言語だと思ってましたよ!w)、Macintoshのイベント駆動型のプログラムモデルに感動していたのの2つで「独立したオブジェクトが多数あり、オブジェクト同士が(イベント)メッセージを送り合うことで、プログラムが実行される」基本設計を提案した。
具体的なソースはこんな風に記述される代物だった。

村人1(引数)
{
初期化:
 村人X=0;
 村人Y=0;
歩く:
// 未実装
話す:
if (フラグ) {
“ここはいわさきの村です\n”;
} else {
  村人99(呼び出す);
“殺すぞ\n”;
}
}

「初期化」だの「話す」だのはシステム側で定義するメッセージ。
ただし初期化はどんなオブジェクトも持っている特別なメッセージで、オブジェクト初期化には必ず呼び出される。今で言うコンストラクタみたいなモノ。ちなみにデストラクタもあって「終了」。つーてもリンクが消えるだけで、メモリ管理とかは全部自分でやらないとダメだった。
「話す」はプレイヤーがそのオブジェクトの前に立ってIボタン(ファミコンで言うAボタン、PSで言う◎ボタン)が押されたときに送られてくるメッセージ(もちろんこのイベントはそれぞれのプロジェクトでカスタマイズできる)。
これは天外2で良くあったタイプのソースで、まあありがちな村人だったりするわけだけど、ちょっといじればアドベンチャゲームのソースになるのも想像はつくだろう。
完全なイベントドリブン+手続き型で「どこにスモールトークがあるんじゃい!?」と突っ込まれる方も世の中には沢山いるだろうが、世の中には常に理想と現実の間には違いがあるのだ、ウム。
当時のPC-9801はメモリ640キロバイト以内で動かなければならないうえに、ivが走るマシンは8ビット、汎用レジスタ3つ、スタック256バイト、しかも初期はメインメモリ64キロバイトなんて代物だ。
これで華麗な言語を作れといわれても、ムリというものだ。いや、まあ今からPCエンジンで動くこれを超える言語を設計してやるって人がいるなら止めませんがw

追記すると、汎用言語といっても、変数宣言などは、なんせPCエンジンのメモリで実行することを前提としていたので厳しい制限があり、システム側で用意されたものを使う以外はまったくできなかった。
正確にはシステム上のワークエリアやフラグを別名定義して変数として割り当てる機能があった。だから上の変数名は実はワークエリアの別名宣言。で、ローカル変数は、ひとつのオブジェクトに対して、例えば天外2では最大16個まで持つことが出来た。
また、それらの変数は「プログラムに慣れていない人」でも可読性が高いように、日本語が使えるようになっていた。
ただ、どうしてもグローバルな操作が必要になるうえに、形的には擬似マルチタスク(今でいうスレッドに近い)で、ワークエリアの保存が保障されないので、それに影響が出ないコーディングルールを作るのに結構苦労した。

では、実際のivの開発はどんな風に進んだのかというと、yacc / lex を使ってivは作られた。
というのも、一時、僕がUNIX(およびOS-9/6809 & OS-9/68000)の世界に身を置いて仕事をしていたのもあって、飛田さんに yacc / lex を紹介して(正確にはlexは当時MS-DOS用のまともな実装がなかったので、gnu flexを紹介した。bisonもあったんだけどメモリの都合などからyaccを使った)使い方を簡単に教えられたから。
いや yacc と lex あるとマジで簡単に言語書けますから。これは今でも変わらない。
で、あとは僕が iv のBNFと基礎設計をして、飛田さんがその実装をした。
ぶっちゃけた書き方をするなら、基本コンセプトと言語設計が僕、実装は90%が飛田さんだったわけ。
結構短い期間(確か2ヶ月ちょい)で出来て、実際にivが吐き出すコードを解釈するインタープリタ(というか仮想マシン)を書けばivは動くようになり、しかもそれはPCエンジンで実際に問題なく動いた。
かくして「アドベンチャ」を量産できる仕掛けを作ることに成功したわけだ。
ただ、確かに僕はivを設計をしたけれど、さすがにアクションやRPGはムリだろうと思っていた。
なぜならivは構造的に軽い言語として設計はされていたけれど、それでも「解釈の手間」を考えたとき、リアルタイム性の高いモノは厳しい…つまり、ジャンルとして言い換えるなら、アドベンチャやパズルなら記述できるだろうけれど、RPGやアクションみたいな、比較的リアルタイム性のあるものになると、もう使えないだろうと、僕は思っていた。

RPGはプレイヤーキャラクタが話しかけると、いろんなものが出たり、さらに村人が歩き回ったりと画面的にはリアルタイム性が結構高い。

だから長谷川君から「RPGなら十分に使えることがもうわかっている」といわれたときは、全く衝撃的だったのだけど、彼がそういったのも当たり前だった。
実はアルファシステムはスーパーCDROMのRPGとして移植が進められていたファルコムの『ドラゴンスレイヤー英雄伝説』の仕事を請け負っており、これをivで制作していた…つまり、もう実績が出来つつあったのだ。
そして長谷川君は言った。
「戦闘も会話も全部ivで書けるよ。だからシステム作ったら、あとは全部ivよ」
天外2は、実際、まさにそのとおりで一部の特殊なビジュアルを除いて、何もかもivで書かれていくことになるのだった。

LinkedIn にシェア
Pocket