スターソルジャー30周年記念(5)/終

twitterで「スターソルジャー30周年ですね」と言われ「あっ」と思って、せっかくだから30周年を記念して、イロイロ野沢さんに聞いてみたら、まったく聞いたことがない話がいっぱい出てきたので、メモ書きとして残しておくシリーズ。
以下はリンク。

このブログに来る人で、知らない人はいない気がするけれど、お約束的に『スターソルジャー』について書いておく。
『スターソルジャー』はハドソンから1986/6/13にリリースされたファミコン用の縦スクロールシューティングゲームだ。販売本数は約100万本。
第二回の全国キャラバンに使われたソフトで、高橋名人の16連射を印象付けたソフトでもある(第二回の全国キャラバンで人気が爆発することになる)。
あと、この話に加筆して修正した内容を冬コミに新刊として出す予定ですが、なんつーか書きたいこと二つをひっつけた、とんでもない本で、もう一本、ペルソナ5のレビューつーか評論つーか、P4GとP5をプレイして思ったコトのテキストが入る予定っす。
ブログでなくて、同人誌なのは、本当にP5について書こうとすると、どうしてもストーリー的にネタバレな内容に踏み込まざるを得なくて(P4/P4Gと比較してそこがスゴく大きな違い)、そんなもんをこのブログに載せたくなかったのです。
今回もまたプログラムの話。今回は有名(?)な高橋名人バグの話がメイン。

ちょっと書いておくと、当時、僕がつきあっていたのは当然作っている側が中心なので、北海道および東京の開発の話ばかりで、キャラバンの話とか(まあ聞いてはいるけれど)そういう話は基本あんま出てこない。
ついでに書くと、ゲーム開発なんてメディアのインタビューを除けば、毎日地味なものだ。
ファンタジーとしてなら笑って許すが「痛みを知るために俺を殴れ!」とか「これによって一気に面白くなるぜ!」なんてないし(あってたまるか)、マスター3日前に「仕様を一部変更する」なんてディレクターが言ったら速攻ぶん殴って、その場でディレクターから下ろす(そもそも完成しなくなる典型パターン)。
フィクションとしての面白さと現実は違うのだ。

■野沢さん
トドメの一発。
多分、そこそこ有名な話として高橋氏がテストプレイで、大バグ発見して直した話。早く打ちすぎて、表示が追いついてない件。
まあ、プログラマーとしては情けない話なんだけど、一応記録用に書いておく。
前提としてファミコンはスプライトの横表示数の制限があり、多く出したいのであれば「スプライトローテーション」を行わなければなりません。
それと、BGの書き換えはV-blank中に書き換えないといけない。
スタソルの場合更に表示すべきスプライトがスプライトのバッファーに収まりきない。
なんせ5方向の玉、敵キャラの数も多いし、ヒットしたら爆発するし、地上のボーナスポイントは画面書き換えが必要で、スプライトで爆発パターン。
あの頃は自分でプレーしてこのぐらいあれば大丈夫だろうという数の管理テーブルを用意して実装を決めていたし、自分で全力プレイもしていた。
これをテストプレーをした高橋氏が「なんかへんだよ」てきな発言だったと思うが、見に行って愕然とした。
地上物の爆発パターンが出てない!地面の書き換えが間に合ってない。なんじゃこりゃ。一瞬パニックでしばらく呆然、考えた挙句「多分テーブル溢れてる」だった。なんて言ったか忘れたが、アバウトな説明というか憶測をいって、変更に取り掛かった。
V-blankのBG書き換え用Queテーブル追加、爆発表示テーブル追加、ローテーションの追加変更、ただし自機は一番トップで、テーブルベースのローテーションの機能の最適化。まあ、派手に直したが割と早く対応できたかな?
1番キツかったのは、カウンターでテーブル回してふつうにエントリーしてた事、まだ処理できてないのにね。 恥ずかしー。
まあ、自分の想定よりはでに打てる人が世の中にはいるって事を思い知ったよ。

ファミコンのスプライトは8×8ドットで64個まで。自機・敵・自機の弾・敵の弾・爆発パターン・点数 etc…と、何をどうやっても64個の中に納まるわけがない。というわけで、必要になるのがスプライトローテーション。「スプライトローテーション」については、ここの記事を読んでほしい(しかし…これを同人誌版では再収録することになるのか…)。

で、一つずつ説明していくと
「地上物の爆発パターンが出てない!」
爆発パターンはスプライトで、普通に考えて、表示の優先度を一番下げていたら、名人の連射が速すぎて「いつでも64個のスプライトが(ほぼ)いっぱいになる状態」になってしまったので(5方向だと自機の弾だけでスプライトを15個使う)爆発パターンが表示されなくなった、という話だ。
これを解決するためには、スプライトローテーション(3)で説明した表示できる最大数より多いスプライトを表示するためのスプライトローテーションが必要になる。
で、そのために爆発表示テーブル追加、ローテーションの追加変更が必要だったわけだ。
「地面の書き換えが間に合ってない」
これはファミコンの非常に大きな制限の一つだったBG書き換えの話になる。
スターソルジャー(3)を再度読んでもらいたいが、地面にある顔だの目玉だのは当然BGTの上に書かれていることになる。
では、これを爆発したあとに、穴にするためにはどうすればいいのか?
下図のようにBGTを書き換える必要が出てくる。

ところがファミコンにはBGTの書き換えには非常に厳しい制限があった。
それが以下の話。

■僕
それはそうと、やっぱスタソルの地形はBG書き換えだったんね。FCはBG書き換えに厳しい制限があったから、あれどーやってんのかなとは気になってた。
■野沢さん
BGをリアルタイムには書き換えられないので、書くべきアドレスとバイトをQueに登録。 V-Blankの処理を行い、Queを見ながら、時間切れになるまで書き込む。
問題は時間切れを知る方法が無いので、アドレスセットでNサイクル、1バイトにつきMサイクル、Queの処理ベースのサイクルも足して累積でMAXサイクル超えたら、処理は次回のV-Blankに譲る感じです。まあ、サイクル数とトータルサイクル決定するのに力技でテストしまくったけどね。
■飛田さん
表示期間に入ったかどうか確認できないし、表示期間中にアクセスすると暴走してしまうハードだったからな。ギリギリまで頑張るとレアケースで暴走してしまう。
■僕
時間切れを知るのは力業しかないかw
■野沢さん
まあ、昔のCPUは固定的なスピードで動作するので対処しやすかったが、今時のCPUはキャッシュやpipelineで計算合わないから、クロック数えて時間計算は無理だね。

アナログテレビ(これのせいでデジタルでも相変わらず垂直帰線期間があるし、HSyncも残っているわけだが…)には、下図のように「垂直帰線期間」と呼ばれる、描画が行われない期間がある。そしてファミコンではBGを操作することが許されるのは(実質的に)、この垂直帰線期間だけだった。

なので、この間に書き込みをするために、書き換えなければいけないBGTを登録しておいて(これがQue)、垂直帰線期間に書き換えていたわけだ。
また表示期間に入ったかはゲームマシン側では判断できない(PCエンジンあたりだと判断可能になるが、ファミコンではできない)、そしてうっかり表示期間に入った状態で書き込んでしまうと暴走してしまうので、余裕を持ちつつ、目いっぱい書き込むためにCPUの命令のクロック数を数えて、出来るだけ高速に書き込むようにしていたわけだ。
このクロックを数えるのは、当時のゲームマシンやアーケードでお仕事をしていた人の嗜みのようなものだった。
と、当時のゲームマシンでは、こんな風にして四苦八苦してゲームを作っていたわけである。
ところで、最初にも書いたけれど、このテキストにいろいろ付け加えて、冬コミで同人誌を出す予定でげす。
興味がある人はヨロシクです。

LinkedIn にシェア
Pocket

2件のコメント

  • AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
    >痛みを知るために俺を殴れ!
    あれは少年誌の読み物としてのカリカチュアライズですからw
    個人的には活力ある文化ってのは実録もファンタジーも内包してこそだと思ってます
    岩崎さんの読み物を見てると故中野豪氏の挿絵がもの凄く合ってると感じた
    あの人の絶妙な挿絵は実録物を読むにはアクセントとして最適だった。敵わぬ夢ではありますが・・・

  • AGENT: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36
    中野さんが亡くなられた時、非常にショックだったのを思い出します。
    中野さんのイラストは何を書いても、絶妙に似ていて、いい意味で妙に貧乏くさくて、親近感があったんですよね。

コメントは現在停止中です。