ROM はそのまま、『汴河煙雨』を HD に:AI が高画質素材パックを自分で作った
前回の記事では、AI がひとことで 2.5D 五目並べ『汴河煙雨』を作りました。スーパーファミコンの画面は 256×224。清明上河図は高さ 104 ピクセルに縮められ、題字は 12 ピクセルのドットフォントです。
プレイヤーは HD 素材パック に対応しました。ROM は 1 バイトも変えず、画面上で見分けられたタイルと文字を、パックの高解像度画像で描き直します。今回知りたかったのは、ゲームの ROM だけを渡して、AI がパックを自分で作れるかどうかです。


3 つのステップ
1. 空のフォルダを作り、自分の ROM を入れて、skill をインストール:
mkdir bianhe-hd && cd bianhe-hd
cp ~/games/bianhe.sfc .
npx https://aixsfc.app/skill/aixsfc.tgz
インストーラーは Claude Code の skill を 3 つ(HD 素材パックを作るのは sfc-hd)と、MCP ツール(エミュレーター、メモリの読み書き、スクリーンショット)を入れます。
2. claude を起動して、ひと段落伝える(実際は中国語で書きました。以下は訳です):
bianhe.sfc は自分で作った五目並べのゲームです。sfc-hd で HD 素材パックを作ってください。 上部を流れる清明上河図は、Wikimedia Commons にある高解像度の原画(パブリックドメイン)からリサンプルし、 画面の漢字はオープンライセンスのフォント(例:Noto Serif TC)で描き直してください。 途中で質問はしないで、倍率は任せます。できたら zip にまとめ、制作過程のレポートも残してください。
その後は何も追加していません。ふだんの sfc-hd は、まず絵の高画質化の方法(手元の AI アップスケーラー、AI による描き直し、自分で描く)と、文字に使うフォントを尋ねます。今回は最初に全部伝えたので、一度も止まりませんでした。
3. 遊ぶ: 14 分後、bianhe-hd-pack.zip(7.8 MB)が届きました。aixsfc.app/player を開いてゲームを読み込み、ツールバーの HD メニューから「HD パック(.zip)を読み込む…」を選ぶと、上の右側の画面になります。
AI がしたこと
まず画面を理解する
エミュレーターでゲームを動かしてステートを保存し、そこからビデオメモリ、パレット、PPU レジスタを読み出して、3 つのことを突き止めました。
- 画面は 105 本目の走査線で分かれている:上は通常の背景(Mode 1)、下は遠近法の碁盤(Mode 7)。
- 絵巻は背景レイヤーで、64 列のリング領域に 1 列ずつビデオメモリへ流し込まれている。
- 題字や「あなたの番」は背景の文字ではなく、16×16 のスプライト。
素材パックの「文字認識」は、背景レイヤー上で 8×8 グリッドにそろった文字しか見つけられません。そこで AI は、1 文字ずつ普通のタイルとして置き換えることにしました。結果は同じで、この判断も自分で下しています。
絵巻:ROM から元絵を見つけ、美術館のスキャンに合わせる
- ROM の中で絵巻全体を見つける。 タイルは
$40000から、1 列 13 枚で 263 列、つまり 2104×104 ピクセル。取り出した絵を画面上の 429 枚のタイルと照合し、429 枚すべて一致。 - 原画をダウンロード。 Wikimedia Commons の全巻スキャンは 38414×1800 ピクセル、19 MB の JPEG。
- 位置合わせ。 ゲームの絵巻は原画を切り抜き、縮小し、色を調整したものなので、まず両者の対応を求めます。低解像度で相関を探索してから微調整し、「ゲームの x → 原画の X = 1913 + 16.94x」という 1 本の線形対応を得ました。64 ピクセルごとに区切って個別に探索してもずれはすべて 0 で、全体を同じ対応で扱えます。
- リサンプル。 HD の各ピクセルは、対応する原画の約 4.2×4.2 ピクセルの平均。8416×416 の絵巻になります。
- 色合わせ。 スキャンは美術館らしい冷たい灰色、ゲームは暖かい絹の色。最小二乗法で色変換を求め、HD の絵巻をゲームの色調にそろえました。H キーで切り替えても色が急に変わりません。
- タイルに切る。 3419 枚。それぞれのキーは「元タイルのドット+パレット」のハッシュで、HD 絵巻の同じ位置の 32×32 ブロックを指します。

文字:明朝体に
- Google Fonts から、ゲームで使う 29 文字だけ(Noto Serif TC、SIL OFL)と、赤い落款の「勝」「和」をダウンロード。
- このコンピューターにはすぐ使えるフォント描画ツールがなかったので、TrueType の解析器とアンチエイリアス付きのラスタライザーを自分で書きました。
- 1 文字ずつ元のドット文字のインクの範囲に合わせ、0.86〜1.06 倍の拡大率と ±1 ピクセルのずれの中から、重なりが最も大きい組み合わせを探しました。
- ウェイト 500、600、700、900 を試し、元の線の太さに最も近い 600 を選択。
- パネルの枠と地の色は元のピクセルのまま、文字だけを差し替え。スプライトのタイルは全部で 124 枚。

権限が限られた中での工夫
今回の Claude Code に許したのは、ファイルの読み書き、Web へのアクセス、node・python3・curl の実行だけです。JPEG のデコードには macOS の sips や npm install を使おうとしましたが、どちらもユーザーの確認が必要で、指示には「質問しないで」とありました。
そこで npm registry から curl で jpeg-js のパッケージを直接ダウンロードし、registry が公開している SHA-1 と照合してから、自作の小さなプログラムで展開しました。フォントの描画プログラムを自分で書いたのも同じ理由です。
プレイヤーで遊ぶ
- ツールバーの HD メニューには 5 つの項目があります:オフ、オン、フォルダを読み込む、.zip を読み込む、削除。スマホでは .zip がいちばん簡単です。
- 一度読み込んだパックは、その ROM 用としてブラウザーに保存されます。次に同じゲームを開くと自動で適用され、オン/オフも記憶されます。
- H キーでいつでも切り替えて、前後を見比べられます。
- 絵巻が流れると、新しく現れる列も HD になります。パックが照合するのは「画面上のタイル」で ROM のアドレスではないので、流し込まれたタイルもそのまま見分けられます。

試遊で見つかった問題
プレイヤーで初めて適用したとき、下半分の碁盤に縦の縞が出ました。原因はプレイヤー側です。このゲームは同じフレームの途中で Mode 1 から Mode 7 に切り替わりますが、Mode 7 の走査線が、上の走査線の「このピクセルはどのタイルが描いたか」という記録を消していませんでした。そのため碁盤が絵巻のタイルで置き換えられていたのです。
修正は 1 行で、テストも追加し、いまのプレイヤーではもう起きません。画面の途中で本当にモードを切り替えるゲームで試したからこそ見つかった問題で、これだけでも今回のデモをやった価値がありました。
まだできていないこと
- 右端の約 64 ピクセル: この部分は Commons のスキャンとうまく合いません。AI はレポートで、別のスキャンを使ったか、継ぎ目に手を加えたのだろうと推測しています。前回の制作過程から考えると、より可能性が高いのは、無限にループさせるために絵巻の両端をクロスフェードしたことです。この部分には冒頭の絵が混ざっています。HD 版でもつながってはいますが、細部は元のピクセルと完全には同じではありません。
- 碁盤、碁石、雨、カーソルは元のピクセルのまま。碁盤は形式が対応していない Mode 7 で、ほかのスプライトは今回の対象外です。
数字
| AI への指示 | ひと段落(4 文) |
| 所要時間 | 約 14 分 |
| ツール呼び出し | 104 回(Claude Opus 5.5、返信 94 件) |
| AI の出力トークン | 69,082 |
| 処理したトークンの合計 | 約 800 万(ほとんどがキャッシュ読み込み) |
| 推定費用 | 約 4 米ドル(2026 年 11 月の Anthropic API の定価で換算。サブスクリプションは課金方法が異なります) |
| 素材パック | 4 倍、タイル 3543 枚(絵巻 3419、文字 124)、zip で 7.8 MB |
素材パックの中身
素材パックは、manifest.json と数枚の PNG が入ったフォルダ(または zip)です。manifest.json には「どのハッシュが、どの画像のどのブロックに対応するか」しか書かれていません。つまり:
- パックには ROM の内容は一切含まれません。元のドットはハッシュ値としてしか現れません。
- プレイヤーはパックの中のプログラムを実行しません。パックはデータだけです。
- 照合するのは画面上のタイルなので、プレイヤーはどのゲームかを知る必要がありません。
このパックの絵巻はパブリックドメインの絵画から、フォントは SIL OFL、ゲームも私たち自身のものなので、共有できます。市販のゲームから作ったパックは原作の二次的著作物です。自分だけで使い、ROM とパックを同じ zip に入れて配布しないでください。
自分で試すには、空のフォルダで npx https://aixsfc.app/skill/aixsfc.tgz を実行してから claude を起動します。説明はトップページにあります。
出典とライセンス
- 絵画:張択端『清明上河図』、12 世紀、パブリックドメイン。スキャン画像:Wikimedia Commons、
File:Alongtheriver QingMing.jpg。 - フォント:Noto Serif TC、Google/Adobe、SIL Open Font License 1.1。
- ゲーム『汴河煙雨』:前回の記事を参照。本作は任天堂とは無関係で、同社の承認を受けたものではありません。