2024/10/16

XEVIOUS 20

 XEVIOUSは当時のメジャーなパソコンにはほぼ移植された。
その中でPC88用のXEVIOUSはあまり評判がよろしくなかったのだけれど、そもそもPC88はシューティングゲームの実現には向いていないので仕方がないし、よくここまで頑張ったなと言えるものではあった。遊べるかというのは置いといて。
(その意味でもアルフォスはやっぱり凄い)


そんなPC88のXEVIOUSであるが、隠しエリアの17面があるという(ゼビウス AREA17への道)。

こういうのは一体どうやって見つけるのか。普通に遊んでたら絶対に見つからないと思うのだけれど。プログラムを解析した強者がいるのか、内部リークなのか。

それはさておき、隠しエリアというのはワクワクするものである。
なので、自分のでも隠しエリアを追加することにした。隠しエリアならボツキャラのギャラクシアンやギャラガのキャラが出せるし、以前に付けたボツキャラの橋(XEVIOUS 16 (戦場に架ける橋))なんかはオリジナルに戻して、隠しエリアで実装するのが良いようにも思える。

隠しエリアへの入り方や隠しエリアのマップはPC88版とは違うものにするつもり。





2024/09/16

ゲームパッドに対応する5

 また面倒なことを発見。

FireFoxではゲームパッドはセキュアな状況でないと動かない。具体的には navigator.getGamepads がエラーになる。

調べたところ、FireFoxではURLがhttpsでないとダメらしい。

幸いにもFC2では無料でhttpsに変更でき、これまでのhttpでのURLアクセスはhttpsのアドレスにリダイレクトされるので、単にFC2での設定で「httpsに変更」にチェックを入れるだけで良かった。

2024/09/08

ゲームパッドに対応する4

 ゲームパッドに対応できたことが嬉しくて、結局スティック付きも買ってしまった。

さすがにこっちは高かったけれど、型落ちなのか定価6380円のところAmazonで2000円(送料別)だった。
振動用モーターは付いていないけれど不要だしその分軽いのがいい。

というわけで疾走者たちへ、インベーダー、バトルゾーン、アステロイド、ゼビウスをスティック対応にした。

とりわけバトルゾーンは2スティックで実機と同じ用に操作できるようになったのは嬉しい、というかこれがやりたくて買ったんだけどね。


2024/09/06

ゲームパッドに対応する3

スタートボタンの問題は置いておいて、バトルゾーンと疾走者たちへもゲームパッドに対応した。

バトルゾーンは本来はこんな風にスティック2本で操作するゲームだけど

今の750円パッドにはスティックが無いので、スティックのついたゲームパッドを入手したときには改めて対応したい。

疾走者たちへはまだrequestAnimationFrameが無かった時代のコードなのでちょっと悩んだ。しばらくして、使ってないならゲームパッド専用にrequestAnimationFrame使えばいいやんと思い付いて解決。


2024/09/05

ゲームパッドに対応する2

残念!!

ゲームパッドの対応はすんなりできたわけだが、残念なことが起きた。

スタートボタンで開始すると効果音やBGMが鳴らない

javascriptでのサウンドオブジェクトは単にPlayしただけでは鳴らない。
これはページを開いた途端に音が鳴るのを防ぐためのもので、必ずユーザーのアクション、すなわちクリックやキーボード操作を行った後でないと鳴らない仕様なんである。

ところがゲームパッドでの入力はサウンドオブジェクトにとってユーザー操作とみなされないらしく、スタートボタンを押してゲームが始まっても無音。
先に画面をクリックとかしておいてからスタートボタンを押せば鳴るんだけどね。

というわけで残念ながらゲーム開始は今まで通り S キーを押すことにした。
Sキーを押してゲームが始まったらもちろんゲームパッドで操作できるんだけど、せっかくスタートボタンがあるのに変な感じである。

なんとかならんもんかねえ。


2024/09/04

ゲームパッドに対応する

自分にとってゲームとは
  1. ゲーセンでやるもの
  2. パソコンでやるもの
なのでゲーム機は範疇に入っておらず、従って作るゲームもパソコンで動かすものなのでマウスやキーボードでの操作しか考えていなかったのだが、インベーダーやゼビウスなんかはやっぱりジョイスティックがないと遊びにくいとは感じていた。

で、調べてみたらjavascriptでもゲームパッド用のオブジェクトがあることが分かった。
(もう「ジョイスティック」という言葉はほぼ死語なのね…)

ゲームパッドというのはファミコンを始め様々な家庭用ゲーム機についてくるアレであるが、でもアレって操作しにくいよね。

こういうアレとか

こういうアレ

そういえばアレってコントローラーとか言わなかったっけ。

自分としてはこういうのが良いんだけど。
往年の名機、アスキースティック
もう売ってないのね。

ともかくゲームパッドの実物が無ければ話にならないのだけれど、どれもこれも高いんじゃああ。それにでかくて邪魔。

別にそれでゲームしたいわけじゃなくてプログラム組みたいだけなので、邪魔にならなくてかつ安いのが欲しいのだけれど。

というわけで探しまくってたらあった!750円だ!しかも送料無料だ!
なにこれ、素敵!
で、ポチったらなんと翌日に届いた。
大丈夫か、たった750円のものを送るのにそんなに頑張って。送料も取らずに。
予想はしてたけど、かなり安っぽい。ボタンを押した感触も微妙ですぐに壊れそうではある。

1つ不安だったのは、ボタンのマッピングが標準仕様ではなくメーカー独自かもしれないこと。結構メーカー独自のものがあるらしいのだ。
これに750円パッドが準拠しているかは出たとこ勝負。ダメなら他のパッドをまた買わないといけない。
はてさて…





おっけーだった \(^o^)/
ボタンの数が少ないので当然すべてのボタンはマッピングされないけれど、存在するボタンの番号は全部一致した。

ひとまずインベーダーとゼビウスはゲームパッドに対応させた。
これまでは「PRESS "S" KEY TO START」と表示されていたが、
ゲームパッドを繋いでいると「PUSH START BUTTON」と表示される

で、遊んでみる…

使いにくいんじゃああああ!!
キーボードでやった方がずっと得点するわ!






2024/09/02

XEVIOUS 19

 全く持って蛇足だが、実機のバグを敢えて再現した。

アンドア・ジェネシスのコアを破壊すると4000点だが実機ではそれ以上に点が入る。
これは参照するテーブルの初期化忘れにより直前の地上キャラの点数も加算されるためらしい。

こっちの実装ではそんなテーブルはそもそも持っていないが、加算される点数は毎回決まっているのでそのようにした。
具体的には4面:+800点、9面:+200点、14面:+400点である。
ただしその面でミスをして再出撃した場合は+10点

その他にも実機には不具合があるので整理してみる。

不具合 原因 実装状況
ギドスパリオの爆発時に赤い板がチラチラする 未定義の領域も表示しているためらしい 実装したくない
ミスする場所によってはエリアが2つ進む メインCPUとサブCPUで進行が重複するためらしい 実装したくない
スコアが 1,000 万点弱になると何か得点する度に常にエクステンドする 次のエクステンド点数がオーバーフローするため オーバーフローしない
ミス後のリスタート時、森の中に地上物が出現することがある メインCPUとサブCPUの処理の行き違いが原因らしい 実装したくない
データ上は46本目のソルがあるが出現しない スプライト番号の同じボザログラムが消える直前に出そうとしているため無効化されているそうだ 46本目のソルが出る
ボザログラムは下部分が突然7ドット現れる 上部は画面外に32ドットあるが、ボザログラムは少し大きいため 実装してもいいけどあまり意味がないので保留
14面最後に空中物停止コマンドがあるが機能していない Y座標が間違っているため どういうものか全く不明。機能していたらどんな風だったのか興味ある
タイトルロゴのVの字の左上が欠けている デザインのミス? ドッターのミス? ちゃんと欠けてる。見映えを実機に合わせることにはこだわってる^^
出撃時の残機数が9を超えるとアルファベットになり、Zを超えるといろいろなキャラクタ(ゴミ)の表示になる 残機数表示に1文字分しか確保していない。10機以上の残機を想定していないというのはちょっとお粗末 255まで数字で表示する
残機が255を超えると0に戻る 残機数に1バイトしか確保していない上にオーバーフローを考慮していないため 255でカンストする
条件によっては想定外の空中キャラが大量に発生する 空中キャラテーブルの最大値127を超えて参照することがあるため。超えたら何が起こるかは不明 0~127の範囲に収まるようにしている
ミスしてソルバルウが消えた後、敵が画面右上に向かって攻撃する 画面右上が恐らくVRAMの原点で、ソルバルウが消えた後はそこがソルバルウの位置になっている 実装済み。見た目は大事
エリア12の最後のグロブダは動かないのに200点ではなく1500点 ブラスター着弾点を感知して後退・停止するグロブダなのだが、画面右上にブラスター着弾点があるものとして感知して画面外で後退し、停止してから画面に現れている 停止しているが点数は1500点のグロブダとして実装


2024/08/20

スペースインベーダー 6

 なんてこった。また資料を見つけてしまった。

FSマイクロ株式会社>インベーダーゲームのソースの研究によると(正確にはここのブログで引用されているBSV (Bluespec SystemVerilog)によるスペースインベーダーの再設計およびComputerArcheology/Space Invaders)、敵弾の移動速度は1フレーム毎に1ピクセルではなく3フレームで4ピクセルなのだとか。さらに敵エイリアンの数が7匹以下になると3フレームで5ピクセルになるのだとか。
道理で動画を見たときに何か違和感があったわけだ。

早速修正。

それからエイリアン移動時の効果音(行進サウンド)の発音タイミングも違っていた。
ずっとエイリアン隊が1歩移動したときに1音鳴らすものと思い込んでいた。
なのでエイリアンの数が減ると移動速度が早くなるので効果音の発音間隔が短くなるのだと。
しかしそうではなく、歩行音の別タイマーがありエイリアンの残数に応じて発音しているのだとか。

表が長いので一部だけ載せるが、こんな感じ。


確かにエイリアンの1歩で1音だと最後の数匹の状態では音の間隔が短すぎてノイズになってしまう。
そこで5匹残った時点でそれ以上音の間隔を小さくしない処理を入れていた。つまり5フレームで1音を最小間隔としていた。
この表を見ると最後の1匹のときの発音間隔が5フレーム毎なので最小は5フレームで1音というのは間違ってはいなかったようだ。
とは言え、だんだん早くなる度合いが全く異なるので、この表に従って発音するように修正した。

エイリアンの移動は1フレームに2pixelだが、最後の1匹になったときに左から右への移動だけ1フレームに3ピクセルになる(だからレインボーと呼ばれる現象が起こる)、というのは動画を見てそうだろうなと思って実装していたのだけれど、今回の資料で正しいことが分かってちょっと嬉しかった。
レインボーは起こらないんだけど。

ところで前の記事で紹介した ししおどし>スペースインベーダーの謎 にはこうも書いてあった。

しかしこれは FSマイクロ株式会社>インベーダーゲームのソースの研究 の方が正しいようだ。
というのは、自分でもいくつかの動画を見てみたのだが、ジグザグ弾(ギザギザ弾)は必ずトーチカに半分(4ピクセル)しかめり込んでいない。
逆に言うとT字弾は必ず全部(8ピクセル)めり込む。
どちらも必ず起こっているので処理タイミングの問題とは思えない。

推測だがこれは貫通度というよりはジグザグ弾(ギザギザ弾)の爆発パターンの描画場所が上に4ピクセルずれてしまっている、もしくはジグザグ弾(ギザギザ弾)の爆発パターン位置は正しく、T字弾の爆発パターン位置が下に4ピクセルずれているのではないだろうか。
意図的か誤りかはともかく。
位置がずれているだけであればソースコードを見ても「貫通度」を示すようなものは見当たらないのは当然と思える。

爆発パターンの位置ではなくトーチカとの当たり判定の位置かもしれないが、何にせよ自分としてはT字弾の方が間違って4ピクセル下になってしまっているのかな、と考える。

そして、トーチカの幅が2ピクセル足りてないことに今頃気付いて修正。


左右対象でないのが気持ち悪いけど、実機の通り。





2024/08/16

スペースインベーダー 5

 今頃になってこんなブログを見つけた(ししおどし/スペースインベーダーの謎)。

そして驚愕の事実が。

えー、信じてた仕様は嘘だったんかい。


なんちゅーこっちゃ。

上記を踏まえ、ソースコードから読み取った敵弾の以下の振る舞いを実装した
  • 敵弾と自弾は必ず相殺
    (実機のバグ再現のために確率ですり抜けることも考えたがとりあえずやめた)
  • ギザギザ弾とT字弾(ピストン弾)は発射する列をテーブルから取得する
  • UFO出現中はギザギザ弾は発射しない
  • T字弾(ピストン弾)はエイリアンが最後の1匹のときは発射しない
  • T字弾(ピストン弾)は他の弾が画面にあるときは発射しない
  • 回転弾は自機の真上近くのエイリアンが発射する
  • 弾を撃つ頻度はスコアに連動して高くなり、高得点になるほど連射する
なるほど、実機の挙動に近くなったように思える。

ちなみにギザギザ弾、T字弾(ピストン弾)、回転弾というのはそれぞれこう。

       
ギザギザ弾    T字弾(ピストン弾)    回転弾

名前は誰かが勝手に付けたもので公式な名称ではない(たぶん)。
ギザギザ弾とT字弾(ピストン弾)はパターンをビットローテートして表現してる(たぶん)のが美しい。

もう一つ別のところで知った話だが、スペースインベーダーには隠しメッセージのあることが分かった。
そんな面白いフィーチャーを実装しない手はないよね。


2024/08/14

スペースインベーダー 4

久々にプレイ動画を見てみたら、色々違っていた。トーチカの間隔が狭かったのと、自機のY位置が1行低かったのを修正。

修正前

修正後

他にもエイリアンが行進する時の効果音の発声タイミングを見直したりもした。
また、自機の移動範囲は画面の両端までではなく、約エイリアン1列分の幅だけ内側になっているようだったので、これも修正した。



2024/08/13

XEVIOUS 18

連休だというのにずっとXEVIOUSのデバッグやっとる。
暑いし行きたいところもないのでいいけど。

さて今度はボザ・ログラムである。
周りに4つの砲台(ログラム)が接続された砲台。

こいつの得点計算がややこしかった。

中央を狙って爆撃すると周りの砲台も誘爆し、2000点が入る。

 中央を爆撃すると2000点

周りの砲台だけ爆撃すると1つにつき300点。

周りの砲台は1つ300点

そして、周りの砲台が1つでも欠けた状態での中央爆撃は600点。

砲台が欠けていたら中央爆破は600点

なので周りの砲台を全部潰してから中央爆撃すると 300x4 + 600 = 1800点となり、単に中央爆撃する方がお得という仕様。
周りの砲台を潰してから中央爆撃した方がお得というアンドア・ジェネシスとは正反対である。

ここまででもややこしいが、さらにややこしい事が起こる。
キャラが近接している場合は1発で複数を爆撃することができるわけだが、


複数キャラにまたがる爆撃

ボザ・ログラムでもそれが起こる。こんな状況。


この爆撃は中央のみならず左と下の砲台も破壊する。
この場合に何が起こるかと言うと、
中央爆破2000 + 砲台爆破300 x 2 = 2600点
になるんである。
ややこしい!面倒臭い!

面倒臭いけど実装した。多分実機のロジックはたまたまそうなるってだけなんだと思う。









XEVIOUS 17

 自機の前に飛んできてしばらくクルクル回った後に去っていく、ただの演出キャラであるシオナイト。

赤い部分は敵キャラと同じく明滅するのかなあ、でも自機(ソルバルウ)の赤い部分は明滅しないしなあ、シオナイトも味方だし明滅しなくてもいいか、と思ってたのだけど、改めて動画見たら明滅してた。
面倒臭いが明滅させるためにマスク画像を作る。
というわけで対応完了。










XEVIOUS 16 (戦場に架ける橋)

 XEVIOUSのキャラクタ画像は恐らくROMから吸い出したものがここにあって、こういうものである。


これを見るとゲームに登場しないキャラのあることが分かる。
戦車、戦闘機、ヘリコプター、ミサイル、爆弾なんかがあるが、これは元々現代兵器のキャラで空中+地上の敵を撃つゲームが企画されていて(そのゲームは結局没)、その名残らしい。
その他にもギャラクシアンのキャラ(ボス)やギャラガのキャラ(サソリ。別名オガワムシ)がいたり、橋が2種類あったりする。
このうちギャラクシアンのボスと橋は使う予定だったそうだ。

今まで読んでいなかったのだけれど、Wikipediaを読むと「スーパーゼビウス」の項に戦車、ヘリ、戦闘機、ギャラクシアンのボスが登場するとあった。

スーパーゼビウスとはファミコン版(のちにアーケードにも登場)の「ガンプの謎」ではなく、マップはそのままにキャラ配置を変えて難易度を鬼にしたやつである。
遠い昔に1回くらいはプレイした記憶がある。
やってられるか! ってくらい難しかったように思う。

で、どんな風に未使用キャラを使ってるのかといくつか動画を見てみたのだが、ゼビウスの世界観に現代兵器は違和感あり過ぎた。
戦車、ヘリ、戦闘機はいない方が良かった。
ギャラクシアンのボスはオリジナルの色ではなくグレー系にしていたのでそこまで違和感はなかったが。
オリジナルのボス

スーパーゼビウスに登場するボス

しかし、一方で目を見張るものがあった。橋である。
XEVIOUSには地上を動き回って時折弾を撃ってくるドモグラムというキャラがいるが、こいつが川を渡ってくることがある。
渡河できる車両なのだとかホバリングしてるから下が川でも関係ないのだ、と言うこともできるけれど、別の場面では川に行き当たったら引き返すという動きもしてるんである。
なので以前からなんとなく気になっていたのだけれど、このスーパーゼビウスでは橋が架かっていてドモグラムはそれを渡ってくる。
こちら側の岸までちゃんと架かっておらず浮いているのがちょっと気になる。

というわけで、これを採用することにした。オリジナルとは違ってしまうけれど、自己満足できればそれで良し。

こうだったのを →      こうした      
橋がちゃんと架かっていない所も同じ。

これはArea15なのだが、もう一箇所Area6でもドモグラムが川を超えてくる。
ところがスーパーゼビウスではこっちには橋が架かっていない。

気に入らないのでArea6も橋を架けた。どうせオリジナルとは異なってしまうのだからと別の方の橋を架けてみた。

こうだったのを →      こうした      







2024/08/10

XEVIOUS 15

 まだまだ不具合があった。
今回は2点修正。

1つ目。アンドア・ジェネシスの砲台を残したまま中央を爆撃した場合に残った砲台も爆発しなければならないのにそうなってなかった。

修正したのがこれ。

中央爆撃時に残った砲台も爆発する

2つ目。ブラグ・ザカートが扇形に放出する5個のスパリオの広がり方が足りなかった。
改めて動画を見たら90度の開きで放出しているようだったが、それが45度になってた。
どうりで避けにくいはずである。

修正したのがこれ。
広がりを90度に

(2024/08/12 追記)
得点もおかしく、1つ1000点のはずの砲台爆破に4000点も入っていた上に中央爆破時に残りの砲台の点数も入っていた。
上の動画だと残り砲台が2つなので中央爆破で中央4000+砲台4000x2=12000点も入っている。
修正した。




2024/08/02

Dragon's eyeのミニゲーム

 Dragon's eyeのミニゲームであるが、今更ながら改良した。


カゴの縁の部分でのボールの跳ね返りの判定がおかしくて、入るはずのボールが入らずに跳ね返っていたんである。

それでもやってみたら3分間で50個というのはやれないノルマではなかったので、ずっと放置してた。

とはいえ作った当初からずっと気になってはいたので直すことにした。
めっちゃ今更だけど。


そんなわけでサクサク入る。

適当にやっても79個入った。
もうノルマ50個なんて怖くないね! 誰もやらんと思うけど。

2024/08/01

XEVIOUS 14

 まだミスがあった。

スペシャルフラッグを出現させた時に得点してなかった。
さらに、ゾシー(歯車みたいな敵キャラ)を撃ったときも得点してなかった。

画像を見ても分からんけど、修正済み。