緑色異星人年代記

同人サークルPlatineDispositifの日々の欠片

家庭用電子計算機風

イヤッフー。あけましておめでとうございます、と書きそびれてもう3月であり、桜の季節なこの頃、皆さまいかがお過ごしでしょうか!

そんなわけでボンヤリしながら、年明け一月ぐらいまで他所様の案件で「この世の果てで恋を唄う少女YU-NO」というギャルゲーの、元はタイムリープ物の始祖的存在なPC98のゲームのリメイクですね、スイッチ版についてくるファミコン風おまけゲーム「ファミコレACT ユーノの大冒険」の開発をゴリゴリと詰めていたわけです。

f:id:uboahh:20190331182231p:plain
というわけで今日は何故かファミコンの話です。

ファミコンの仕様

そう、ファミコン風、なのです。8ビット風とか誤魔化しているのとは違い、ファミコンの仕様に沿った画面をつくっています(見栄えの都合であえて実機とは違うところが若干あります、色合いとか…)。ファミコン実機で動く形までもっていけたなら堂々ファミコンと言えたんですけどね、それやると開発期間が3倍になるんで仕方ないっすね!ハッハー。

スイッチ版の開発は完了したものの、そこらへんちーと心残りだったのでとりあえず的に許可はいただいて、答え合わせとしてファミコン実機で動かすのをプライベートでやってるんですが、いやー大変だなこれはっていう。そもそもちゃんとした仕様がないっぽいんですよね、実機で動けばオッケーとしか言いようがない(笑

ファミコンのパレット事情とスプライト

皆さまご存知の通り、ファミコンは背景(以下BG)3色x4パレット+スプライト(以下SP)3色x4パレット+背景色(BGとは別にベースに使える色)1色で合計最大25色が使用できます。実際の運用としては全部違う色を割り当てることはありえないのでだいたい6色~10色ぐらいの範囲に落ち着いて、ああファミコンだねって画面になります。

そういうわけで絵自体は基本BGの3~4色で描いていく感じになるんですが、左下のユーノの顔の目等ここぞ!というところにはSPを使って色を増やせます。やったネ。

スプライトは大きさに制限があるけど(ファミコンの場合は 8x8 or 8x16 )自由に重ね合わせができるレイヤーパーツで、本来はアクションゲーム等で動くキャラに使うものなのですが、こういう使い方で色々な表現ができるようになります。ファミコンの仕様では、横方向に8キャラを越える分は表示されなかったり、画面全体で64個までしか使えないという制限がありますが、独立パレットで3色使えたり、当時としてはかなり凄い機能です。

ユーノの大冒険では左下のユーノの顔にBG2パレットとSP1パレット、ユーノのキャラチップにSP1パレットを固定(お供のクンクンやアイテムなどのシステム周りも固定パレット内で描くことで他のパレットをフリーにしている)、残り2パレットずつで頑張る感じで15色ぐらい出せてるので割とカラフルな感じに仕上がっています。

こんな制限ゴリゴリの中、可愛くキャラチップと背景を仕上げていただいた、ドット担当の大空さまに大変感謝感謝。

ファミコンのラスター処理とバンク処理

ラスター処理というと、ラスタースクロールのようなうねった画面が有名ですが、本来は、特定のラインで横スクロールのオフセット座標を変更することで画面をスライドさせたり、表示方式を弄って本来の表示能力を超える表現を実現する手法を指します。

ファミコンの背景(BG)は8x8ドットの四角いパーツを256種類まで定義でき、これを並べて背景を作るのですが、軽く計算してみればすぐわかるとおり、全パターン並べても画面4分の1しか埋めることができません。大きな絵を描くのには向かないわけですねー。そこで同じパーツを使いまわしたりするわけですが、一枚絵が欲しいときは足りなかったりします。そこで画面を描画している最中にこのパーツのセットを切り替える(バンク切り替え)ことで、別のパーツを使えるようにするテクニックがあります。タイミングを間違えると絵がグチャグチャになってしまうので、実機では丁寧に実装しなければならない高等テクニックなのですが、ファミコン風では出来たことにして実装するので全く問題ありません(ぉ。実機での処理は面倒くさいだけで、出来ること自体は確かなので。

大雑把なところでは、タイトル画面でロゴとユーノのキャラクタの間とか、ゲーム中で上のメインフィールドと下のユーノの顔が描かれているステータスエリアの間とか、ボス戦の背景とかがこれを切り替える前提で構成されます。

スプライトはBGとは別に256種類(あるいは512種類)を定義することができ、これはこれで色々とあやしいことができたりします。

ボスはBGを使って大きなキャラクタを動かしています。これはラスタースクロールを使って動かすテクニックなのですが、本来は横スクロールしかラスターでいじれないところをなんかバグみたいな縦にも弄れる方法があって、実機で実装すると大変超面倒くさい処理になるのですが、一応可能なので、それを使って動かしています。背景がボスが移動する範囲でベタぬりなのは、この理由に由来します。ファミコンで大きなキャラを動かすときは背景ベタにするんだぞ、というお約束です。いやスプライトでも出来なくはないですけどね、めっちゃチラつくことになりますが。

 ・ファミコンサウンド

サウンド周りはエミュレーション的なことをイチからやるとめちゃくちゃ大変なので、基本的にはストリーミングでやっております。

古いレトロハードではBGMでサウンドチャンネルを一杯に使ってたりするので、効果音が鳴るときだけBGMが鳴るチャンネルがいくらか削られて効果音に回ります。これを再現するために、BGMデータもパート別に収録したものを多重再生し、効果音がなった時に使うパートをミュートしてこれを再現するという回りくどいことをやっています。かなりそれっぽい雰囲気にできたので、こんな仕様に付き合っていただいたサウンドコンポーザの阿保さまに大変感謝感謝。

BGMデータはディスクシステム源仕様(矩形波2ch三角波1ch+ノイズ1ch+DPCM1ch+波形メモリ1ch)で作っていただいたので、うおーという感じにしていただき大興奮。…なのですが、お願いしたときは実機で動かすこと考えてなくて後ほど土下座案件になってしまい、最初から実機で動かすことを考えて本体音源だけでお願いすべきだったなあというのが今回の学びでしたまる。

また、効果音も複数鳴ったときに重ねるのはハード的に無理な時代なので、当時のお作法同様に、音ごとに優先順位を設定して鳴らないと困る音が優先して鳴るような感じになっています。効果音優先順位の設定なんてワンダースワンを弄ってた頃以来なので、いまどきこんなことをやることになるとは…とゲラゲラ笑いながらの作業。

・その他の細かいところ

ゲーム中に左8ドット分がマスクされているのは、スプライト表示のX座標指定がマイナス値にできないためで、これがないとx=0より1ドット左に動いたとき、まだ7ドット分あるのに消えちゃう(正確な表現をするとx=255→右端に移動する)ので、左端の見た目をx=8にするという手法が使われているからなのです。画面が半端に寄ってしまうので右端もマスクしてくれればなあ…とは思うのですが、当時は1ドットでも画面を広くしたかったので、このような仕様になっているのでしょうねえ。

f:id:uboahh:20190331220326p:plain

 …とまあとりとめもなく綴ってみましたが。 こんな感じのことをやっておりました。パッケ版には初回出荷分のみの付属のようですが、ダウンロード版には来年の3月ぐらいまで付属するようなので、ご興味ありましたらお手にとっていただければと思いマッスルー。