← [ FRONT / 辺境部 ] に戻る
OBSERVATION · 其の9713 · 2026.09.22

【スーパーマリオ256W】敵に当たるか、踏めるか — 当たり箱は ROM に表があった

◉ REC COVER · 圖版 FRM·3055

技術部の御供餅です。前回は「空中では B が効かない」でした。今日は敵に当たるか、踏めるかの話です。

この連載でいちばん長く間違えていたのが、ここでした。当たり判定は、目で見て決めてはいけません。

本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作・公開することを目指しています。

パレイド番外編 続 (1/2): マリオを好きな面から始めて、8-4の先へ技術部の御供餅(おそなえ)です。 この 256W の“おまけ”、もともとは辺境部の企画でしたが、少し技術的な掘り下げをしたいと思います。 本記事は LL…

① どこに出るか

敵に触れる場面は、どのステージにもあります。今日の図は 8-1 です。緑のパタパタ(ノコノコに翼が生えた相手)が、レンガの上を跳ねながら近づいてきます。

8-1 の判断(フレーム2119)
8-1 のフレーム2119。左=実機/右=式。緑=マリオの当たり箱、黄=踏める敵、茶橙=手が終わる時点の敵、水色=選んだ手の軌跡。

右の絵で、マリオの緑の枠は x125〜138・y192〜206、つまり幅14px・高さ15pxです。この数字は目分量ではなく、絵を復号して数えたものです。図の印は毎回そうやって確かめています。

② 実機で測る ── 当たり箱は ROM に表がある

以前の回では「敵ごとに、当たる横の幅を実測して持つ」と書きました。クリボーなら横 ±10px、というふうにです。

それは遠回りでした。実機は、物ごとの当たり箱を表から引いています。

  • RAM $049a + スロット に、その物が使う表の行番号が入っている
  • ROM $e1fd から 4バイトずつ並んでいて、左・上・右・下のずれ(体の左上から)

実際の値を並べるとこうです。

行 左 上 右 下
0 2 8 14 32
1 3 20 13 32
2 2 20 14 32
3 2 9 14 21

行0 と行1 はマリオ自身です。大きいマリオが行0、小さいマリオが行1。違いは「上」だけで、8 と 20 の差 12px がそのまま背の差になります。

つまり、当たりの範囲は測るものではなく、読むものでした。いまの式は、マリオも敵も同じ表から箱を引いています。

③ 式にする ── 当たりは「偶数フレームの、重なり始めの1回」

ROM の当たりの処理($d853)は、3つの条件を順に見ています。

  1. 偶数フレームだけ見る。フレームの数え($09)の下位ビットが立っているフレームは、そもそも当たりを見ません。
  2. 箱が重なっているか。マリオの箱は $04ac、敵の箱は $04b0 から。
  3. 重なり始めた最初の1回だけ当たる($0491 のビット)。重なったまま並走している間は、何も起きません。

そのうえで、踏みか傷かが分かれます($d8f9)。

  • マリオの縦速度の整数部が正(=落ちている最中)なら踏み
  • または、id が 7 以上の相手で「マリオの生y + 12 < 敵の生y」なら踏み
  • どちらでもなければ傷

「落ちていれば踏み」という乱暴な形ですが、実機がそう書いてあるので、式もそう書きます。ここで大事なのは比べる敵の位置で、その敵を動かす前の値を使います。実機は「当たりを見てから敵を動かす」順だからです。逆にすると、同じ1フレームが踏みにも傷にもなります。

④ 外した話 ── 1px 足りなかった

ここからが本題です。2026-09-15 に、8-1 で自動プレイが死にました。予測と実機の位置は合っているのに、死んだのです。

死んだフレームを RAM と並べると、こうでした。

実機  マリオの箱 169〜181 / パタパタの箱 157〜169  → 169 で1px 重なる → 傷
式    マリオの箱 169〜181 / パタパタの箱 156〜168  → 重ならない       → 安全

敵の箱が1px だけ高い。 それだけで「安全な手」に見えていました。

原因は当たりの側ではなく、敵の作り方でした。緑のパタパタは、跳ねて上がり、落ちて、また跳ねます。その縦の動きを、式は整数の速度だけで持っていて、小数を捨てていたのです。実機は3つの数で持っています。

  • $a0 … 縦の速さの整数部
  • $0434 … 縦の速さの小数
  • $0417 … 位置の小数

さらに、着地して跳ね返るときの処理($e163)が書き込むのは $a0 だけで、小数2つはそのまま残ります。式は跳ねるたびに小数を0に戻していたので、跳ねが重なるほど実機からずれていきました。

直したあとの、予測と実機のずれ(1px より大きかった件数)です。

ステージ 直す前 直した後
8-1 301件 33件
5-2 62件 15件
2-1 25件 11件
8-1 の判断(フレーム2144)
同じ場面の25フレーム後。黄の枠がパタパタ、茶橙が「この手が終わる時点」のパタパタ。跳ねの上下も予測に乗っている。

残っているずれは、ほとんどが床に着いたフレームの2〜4px です。そこはまだ直していません。

⑤ 走行で確かめる

当たりの判定は、直したかどうかを走行で確かめられます。触れれば死ぬので、間違っていれば必ず出ます。

  • ブラウザのベンチ(人が見るのと同じ画面で計測):本編32面を1面ずつ、全部クリア=100点
  • 通し(1-1 から続けて):5-1 まで到達(51.6点)。1-2 と 2-2 でミスし、5-1 で残機切れ
  • ヘッドレスの32面:無敵なしで 32/32(うち30面はミス0)、無敵ありで 32/32(全面ミス0)

第1回の時点は 9/32=28.1点、通しは 1-4 まででした。半分以上は、この「当たりの読み違い」を1つずつ潰した結果です。

次回は、ファイアバー・リフト・水中を予定しています。回る棒をどう当てるか、動く床の上でどう位置を決めるか、水の中では何が別物になるか。


原典:スーパーマリオブラザーズ(ファミリーコンピュータ/1985年)© 1985 NINTENDO ── 掲載した画面写真は、上記作品の画面をそのまま記録したものです。図の右半分は、当社の自動プレイが持っている値だけで描いたものです。

パレイド番外編 続々: 動画で回す“面白い256面”97選技術部の御供餅です。前の2本で、256 面を全部測って、どれが本物の面のコピーで、どれが型違いの変種かを数えました。今回はその総仕上げ——「実際に…
▶ 関連動画 · YOUTUBE
━━ 観るのを再開 ━━
←
前の記事を読む
辺境部 · 【スーパーマリオ256W】空中では B が効かない — 地面を離れた瞬間に決まる段と、頭を打っても消えない横速度
▶
動画を観る
YouTube
→
次の記事を読む
辺境部 · 【スーパーマリオ256W】回る棒と、動く床と、水の中 — 実機の持ち方を写すまで合わなかった3つ
━━ 他の観測領域 ━━
TECH · 技術部
ファミリーベーシックは、AIの夢を見るか?(9)|結局VSCodeが一番良い? — Claude CodeでBASICを書く
PHIL · 思想部
AI自動化ピラミッドの可視化(10)|反転したのは、連載ではなかった――月次レビュー第3回
FRONT · 辺境部
【スーパーマリオ256W】992面を歩き続ける — 終わらない面を、どう見切るか