FC『平成天才バカボン』3面ボス戦

更新ポイントを見つけてはやり直すループにハマり続けてましたがようやく抜け出した感があります。現在3面ボス戦まで進んでいます。

3面ボス戦ですが

画像の高さ3のハードルをよじ登りなしで越える方法が見つかっていません。高さ3なので手前の高さ1のハードルの上からジャンプする必要がありますが、速度 1.875 以上でないとジャンプが届かず、そこまで速度を稼ぐ方法が見つかりません。多分不可能だと思うので上の振り子を使うルートにするつもりですが、もし下ルートでこのハードルを越える方法をご存知の方がいたらご一報いただけるとありがたいです。

# 3面ボス戦は多分どうやっても所要時間は一定になると思われるので、どっちのルートでも同じといえば同じかもしれませんが

## 最新のRTA動画だと3面ボス戦の所要時間が前回と違うみたいな表示になってますが、これは計測ポイントが変わっただけのようです。
## あとRTA動画でゴール後に床の色がおかしくなってるのもちょっと気になりますが、こちらでは再現できてません。

FC『平成天才バカボン』落下キャンセルバグ

以前まで「ハシゴバグ」と呼んでいたものですが、別にハシゴがなくてもできることが判明しました。

床も壁も1マス幅ならばこれで壁抜けができるようです。なお、床が2マス幅以上の場合、1マス歩いた時点で少しの間勝手にしゃがみ状態に切り替わり、その後歩き続けても壁は抜けられないようです。おそらくこの勝手にしゃがみ状態に切り替わる挙動が関係して壁抜けができるのでしょう。

とりあえず1-2-2はこれで速くなるようなので作り直しかな…(他にも結構ミスしてますし)。

上記動画のムービー3-2-1途中まで進めたtestrunを置いておきます。一応testrunのエンコードも↓

また、testrunの最後の方で下の穴に掴まる→即落ちる→即ジャンプ→ダッシュ→斜め弾に当たる→Dを1F押してしゃがみ加速、とするとなぜかDを離した後も少しの間しゃがみ移動になります。一応ムービーを置いておきます。

もし勝手にしゃがみ状態になる挙動が壁抜けに関係しているのなら、この挙動が起こる条件をもっと正確に把握できれば他にも壁抜けができるポイントが見つかるかもしれません。
どうも地上で被弾直後にしゃがみ加速した場合に起こりうるようですが、厳密な条件がよくわかりません。今のところ、直後に1マスの隙間がある場所でしかこの現象は確認できていないので、もしかしたら地形を誤って認識するバグなのかもしれません。

バカボンのRTAをやってる人がいた

普通のプレイ動画すらあまり見当たらないゲームだったんですが世界は広いですね。ゲームセンターCXでやったらしいので若干知名度が上がったのかも?

なおTAS(testrun)の方は3-1-2まで進んでいます。残念ながらハシゴバグの出番はなさそうです(一応2-1-2で壁抜けに使えるが、普通に上ルートを進む方が速い)。

メモリの読み込み処理は emu.registerafter() で登録する

gui.register() は1フレームに1回呼び出されるわけではないので、メモリ読み込みに使うと色々おかしなことになります。例えば以下のスクリプトをFCEUXで実行するとポーズ中でもXが増え続けます。

local x_prev = 0

function f()
    local x = x_prev
    x = x + 1
    gui.text(64, 64, string.format("X:%d", x))
    gui.text(64, 72, string.format("PrevX:%d", x_prev))
    x_prev = x
end

function main()
    --emu.registerafter(f)
    gui.register(f)
end

main()

単純に現在のフレームのメモリを読んで値を表示する程度なら問題にならないこともありますが、前フレームの値を記録しておいて後から参照したりする場合 gui.register() を使っているとうまくいきません。メモリ読み込みには emu.registerafter() を使うべきです。

物凄く今更な気がしますが私はずっと gui.register() を使っててハマったので一応。

FC『平成天才バカボン』調査メモ

$53 U8 画面内座標x
$59 U8 座標y
$5D U16 カメラx
$7E U16 スピードx
$0178 U8 座標xサブピクセル(ただし静止したりすると0にリセットされる)
$017D U16 スピードy
$0180 U8 ハシゴ登りや突っ張り登り時の移動カウント(意外と重要そう)
$0181 U8 座標yサブピクセル

※登りジャンプ中はy座標計算にバグがあるように思われます(サブピクセル込みで減算するところで一部加算が混ざって変な計算式になってます)。
※左に歩いているときのx座標計算にも同様のバグがあるようです。
※着地直前のx座標計算にもサブピクセルの繰り上がりが無視されるバグがあるようです。足場の端に着地するような場合はモロに影響が出るので割と重要。

  • しゃがみ移動開始時はスピードが一気に 0.5 まで上がる。停止状態からの加速はこれが最速
  • ダッシュ中に方向キーを離すと滑りモーションになり、スピードが0になるまでキャンセルできない
    • ダッシュ中に速度を微調整したければBを離すのがよさげ
  • 約 1.9 以上のスピードで壁に当たるとダメージを受ける
  • 空中では減速はできるが速度を反転させることはできない
  • 連続ジャンプ時は着地直後にジャンプすると着地硬直が短縮される
  • 中ボスにトドメを刺す際はなるべく自機を左寄りに置くと倒した後のスクロール時間が短くなって速い
  • コーナーブーストがある。ジャンプの降り際で尻を足場にかすらせるようにすると5ピクセルほどブーストできる
    • 登り時のブーストが可能かどうかは未確認
  • 地上で左右同時押しすると静止するが、その後進行方向キーを押せば静止前の速度で走り出せる
    • 敵配置などの関係で少し待つ必要がある場合に使える。1面中ボスの攻撃周期調整とか
    • 左右同時押し中のジャンプは元の進行方向へのジャンプとなる
    • 静止時は直前の姿勢(着地、よじ登りなど)が維持される(特に意味はなさそうだが)
    • 静止中はアイテム取得判定がない
  • 中ボス戦では左右同時押し中に被弾してもダメージを受けない(被弾音だけ発生する)が、同時押しを解除したときダメージを受ける
    • 左右同時押し中に複数回被弾しても受けるダメージは1回分のみ
    • 左右同時押し中にBを押すと攻撃音のみ発生するが攻撃判定は発生しない
      • 左右同時押し中に被弾してからB連打すると少しずつ被弾モーションが進み、モーションが終わるとダメージを受ける
      • 左右同時押し中に被弾してからAを押すと後方ジャンプしつつダメージを受ける
  • ハシゴに掴まっている状態からでもジャンプできる。ジャンプの向きはハシゴに掴まる前の自機の向き
    • これでハシゴ登りをよじ登りに変えられるが、普通はハシゴ登りの方が速い
      • ジャンプでよじ登りなしで足場に乗れるならそれが最速なはず
  • ハシゴに掴まっている状態からでもしゃがみ移動できる。これでハシゴの途中から降りられる
    • 落下ダメージ回避に使えることがある
    • しゃがみ移動後は立ち移動も可能
    • しゃがみ移動してハシゴから落ちる直前で切り返すモーションを行い、反対側へ移動すると壁をすり抜ける
  • 坂道でスピードが一定以下のとき左右同時押しするとフリーズする
  • 上下同時押しも左右同時押しと同じような効果があるが、坂道で上下同時押ししてもフリーズはしない
  • S,ST または T,ST,ST と入力するとソフトリセット
  • スピード 0.5 以上だとアイテム取得判定がない
  • たまにダッシュ中にジャンプできないタイミングがあるが条件不明
    • ジャンプ硬直解除直後しばらくはジャンプできないのかも

ハシゴを利用した壁めり込みと坂道での左右同時押しによるフリーズを収めたムービーを作ってみました。一応中ボスを倒すまではTASさんプレイですが、最速かどうかは非常に怪しいです。

minttyで全角記号を正しく表示

.minttyrc で以下のようにロケール/文字セットを設定しないと全角記号が正しく表示されないようです(GUIの Options→Text からも設定できます)。

Locale=ja_JP
Charset=UTF-8

これはロケールが設定されていないと wcwidth, wcswidth が1を返すのが原因のようです。シェルが起動する前の段階では環境変数 LANG は未設定なので、上記の設定が必要ということですね。