主にMSX関係のコンテンツが置いてあります。

百鬼夜行

数年くらい前に即興で作ったBASICゲームです。

最初はノープランだったのですが、turboRでBASICゲームを作ったことが無いことに気付き、どのくらいの速度で動くのか気になりました。そこで速度確認のためにアクションゲームという形で作った作品です。

なのでこんな画面ながらturboR用というプログラムです(一部修正すればZ80でも動くには動きますが…)。

まぁ実際作ってみて、BASICでこれだけの処理をこのスピードで動くのは速いとは思いましたが、やっぱりR800といえどもBASICでアクションゲームはキツイですね。

ゲーム説明

夜な夜なモンスターが出現するので妖怪ハンターが退治する、そんな感じのアクションゲームとなっています。モンスターなのか妖怪なのか、世界観がブレブレです。

プレイヤーが操作する妖怪ハンター。忍者っぽいイメージ。操作キャラすらイメージが固まっていません。カーソルキーで左右に移動。しかし半人前なので左に向くことは出来ません。手抜きではなくこういうゲーム性なのです。

妖怪ハンターの武器ブーメラン。スペースキーで向いている方向に発射しますが、半人前なので画面中に1発しか発射出来ません。手抜きではなくこういうゲーム性なのです。

カーソルキーを上方向に入れるとジャンプします。2段ジャンプ可。

シュッと移動。カーソルキーの下と進みたい方向の同時押し。空中でも可。押しっぱなし不可。

このシュッと移動はこのゲームのキモとなるアクションで、移動中は無敵なので敵をすり抜けられます。ただし、モーション終わりにスキがあるのでずっと無敵のままでの移動は無理です。

これで上手く敵をすり抜けるのがこのゲームのコツになります。

ダメージ時のノックバックから立ち直った瞬間、(確か)1フレームだけ黄色に光ります。この時シュッと移動入力を受け付けているので、ノックバック復帰後にシュッと移動を繋げて無敵のまま移動することが出来ます。まぁ、BASIC処理での1フレームなので安定せずキー入力ももたつくので狙うのは難しいですが。

エンドレスのゲームですが、討伐数30で一応区切りとしてのクリアはあります(ボスなんかは出てこないけども)。一周するのは結構難しいかもしれません。

ブーメランは出ている間中攻撃判定があり、上手く操作すれば連続で敵を倒せます。連続で倒すほど高得点になる仕組みになっています。

敵紹介

生首。ジリジリプレイヤーに寄って来ます。ブーメランを当てると切ない顔をします。

ひとつ目。ひらひら落ちてきたり急降下したり。

ひよこ。猪突猛進だけどひよこ。歩いているときや停止中はブーメランをよく見ています。

コウモリ。単なる動物のような気もしますが。上下移動しながら左右移動しブーメランを当てるとワープするのでやっぱりモンスターです。

スライム。ボールのようにただ跳ねているだけかと思いきや、攻撃するとプレイヤーを狙ってきます。根に持つタイプ。攻撃しなくても狙ってきますが。

プログラムのポイント

BASICゲームながらBGMを鳴らすことを考えました。

どうやったら鳴らせるのか、テクニカルハンドブックを眺めていたら"&HFB40:キューに格納されているPLAY文の数"という何か使えそうなワークエリアを発見。

もともとBASICのPLAY文はプログラムの実行時に同時に鳴らせるような仕組みになっています。

例えばPLAY"v15cde"と入力すると、すぐにカーソルがでてOKと表示されて他のことができるようになります。演奏はちゃんと割り込み処理で実行されて並列動作します。

ただし長いMMLやPLAY"v15cde"を何度も実行すると、すぐに処理が終わらなくなり、ある程度演奏が進んでから処理が戻ってきます。

このことからPLAY文はバッファにMMLを溜め込み順次演奏していく処理で、一定以上溜まったらそれ以上バッファに入力できないようにPLAY文で処理が止まるようになっているということが分かります。で、バッファに溜まったMMLが一定以下になったら処理が戻ってくるわけです。

&HFB40を見ると、PLAY文の溜まっている数が確認できるので、一回のPLAY文での演奏をバッファが溢れないような短さにして、インターバル割り込みで定期的に&HFB40を確認、0になっていたら次のPLAY文を演奏させるという処理にしたところ、良い感じにBGMを鳴らすことができました。

効果音は上手く組み合わせられないので、演奏用に2ch使い、効果音用に1chとキッチリ分けた使い方になっています。既に演奏で使用中な為、PLAY文で効果音を発生させるわけにはいかないので、SOUND文を使いハードウェアエンベロープの力で消音できるような効果音を鳴らしています。

この方法の欠点はPLAY文が終了する時に(次のPLAY文があっても)全チャンネルが消音になってしまうことです。演奏は音符が揃って終了後すぐに演奏開始されるので問題ありませんが、効果音は演奏とは同期しないで鳴るので、丁度PLAY文を跨ぐ時に効果音が鳴っていると効果音まで消されてしまいます。また、効果音にハードウェアエンベロープを使うので、演奏でハードウェアエンベロープは使用できません。

こんな方法でBGM処理を実装できるとは当時は知らなかったのですが、後で調べたところネット上で同じように&HFB40を使って演奏しているプログラムを見かけたので、もしかすると割と知られた処理方法なのかも知れないです。

ダウンロード

BASICファイル

おまけ

同時出現数を増やした実験的ハード版です。これはR800でも重すぎです。スプライトは消えるし重いしでゲームにはなりません。これくらいなら素直にZ80でマシン語コースですね。

BASICファイル