どうも、オーキドせんせい撃破RTA研究者です。
今回は、【初代ポケモン】好きなイラストをゲーム内に召喚してみた【バグ技 任意コード実行】https://youtu.be/VVbQEzKKJPs
上記の動画で使用している任意コードと、ExcelVBAのソースコードを紹介します。
実際にやってみた例はこちら。
手順の通り進めることで、上の画像のような感じで
初代ポケモンのゲーム画面に好きなイラストを召喚することができます。
(https://mobile.twitter.com/ookidobakuha/status/1611335660975296512)
※任意コード実行なので、実際にゲームボーイや3DSで出来るようになってます。
では、イラスト召喚までの手順を解説します。
①表示させたいイラスト(縦96ピクセル、横160ピクセル)を用意。
②カラーのイラストをゲームボーイ表示用のモノクロ4色に変更する必要があるため、下記のマクロを実行。
Sub モノクロ4色変換()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject")
pf = Application.GetOpenFilename
Dim WI As Object: Set WI = CreateObject("WIA.ImageFile")
Call WI.LoadFile(pf)
Dim WIA As Object: Set WIA = WI
Dim ARGB As Object: Set ARGB = WIA.ARGBData
Dim IWd As Long: IWd = WIA.Width
Dim IHt As Long: IHt = WIA.Height
Dim i As Long, j As Long, ColorValue, Red As Long, Green As Long, Blue As Long
For i = 0 To IWd - 1
For j = 0 To IHt - 1
ColorValue = &HFFFFFF And ARGB((i + 1) + j * IWd)
Red = Fix(ColorValue / 65536)
Green = Fix(ColorValue / 256) Mod 256
Blue = ColorValue Mod 256
KS = WorksheetFunction.Round(Red * 0.3 + Green * 0.59 + Blue * 0.11, 0)
KS = WorksheetFunction.Round(KS / 85, 0) * 85
Cells(j + 1, i + 1).Interior.color = RGB(KS, KS, KS)
Next j
Next i
MsgBox "end"
End Sub
これでエクセル上のセルに4色データが転写されます。
セル幅はあらかじめ縦横6ピクセルくらいにしておいてください。
③転写したセルの色に応じてバイナリを計算・表示させるために、下記のマクロを実行。
Sub byte変換DAI()
W_row = 97
For a = 0 To 11
For b = 0 To 19
For c = 1 To 8
For d = 1 To 8
CI = 255 - Cells(8 * a + c, 8 * b + d).Interior.color / RGB(1, 1, 1)
Select Case CI
Case 0
r1 = r1 & "0": r2 = r2 & "0"
Case 85
r1 = r1 & "1": r2 = r2 & "0"
Case 170
r1 = r1 & "0": r2 = r2 & "1"
Case 255
r1 = r1 & "1": r2 = r2 & "1"
End Select
Next d
CD = CD & WorksheetFunction.Bin2Hex(r1, 2) & WorksheetFunction.Bin2Hex(r2, 2)
r1 = "": r2 = ""
Next c
Cells(W_row, 2) = CD
W_row = W_row + 1
Select Case W_row
Case 225
Cells(W_row, 2) = "00000000000000000000000000000000"
W_row = W_row + 1
Case 228
Cells(W_row, 2) = "00000000000000000000000000000000"
W_row = W_row + 1
Case 245
Cells(W_row, 2) = "00000000000000000000000000000000"
W_row = W_row + 1
End Select
CD = ""
Next b
Next a
Range("B97:B339").Select
End Sub
※花や水面などの動くタイルを使用しないように特定の3行にswitch分岐を入れてます。
これで、表示させたい画像の「バイナリデータ」が準備できました。
3840byteあります。
以上①~③により、下準備は完了です。
以降がゲーム上での操作となります。
なお、セレクトバグを利用して作成する「バイナリエディタ」というバグアイテムが必要です。
ゲーム内にバイナリエディタを導入していない場合は、
導入する方法を紹介しているのでこちらのお手軽20分チャート
(https://youtu.be/qV1EJU6howc)を参考に作成してください。
④ゲーム内でバイナリエディタを使ってアドレスDA00から以下の任意コードを入力。
(動画で紹介されているD9B2~D9F8のバイナリ入力用コードは、
⑤でバイナリエディタを使って直接バイナリ入力するため不要)
DA00~DA0E:SRAM0のロック解除コード
3E/01/EA/E3/7F/AF/EA/E2/40/3E/0A/EA/E1/00/C9
DA10~DA1B:SRAM0の初期化コード
21/00/A0/3E/C0/36/00/23/BC/20/FA/C9
DA20~DA2E:SRAM0→VRAMへのデータ転送コード
21/00/A6/11/00/88/2A/12/13/3E/B8/BC/20/F8/C9
DA30~DA4B:タイル配置コード
21/DC/C3/3E/80/16/80/1E/14/BB/28/0B/1E/03/BB/28
06/1E/00/BB/28/01/22/3C/BA/20/EC/C9
DA50~DA67:タイル調整コード
21/A0/C3/3E/DC/36/00/23/BD/20/FA/00/21/CC/C4/3E
08/36/00/23/BD/20/FA/C9
DA70~:全体管理
CD/00/DA/CD/10/DA/CD/20/DA/CD/30/DA/CD/50/DA/C9
⑤ゲーム内のバイナリエディタを使用して、
メモリA600~B52Fにひたすら③により算出したバイナリデータを打ち込んでいく。
ただし、SRAM0のロックを解除してからじゃないと入力が出来ないので、
DA00とDA10の任意コードを実行してロックを解除してからとなります。
3840byteをひたすら手入力します。召喚したい画像の複雑さにもよりますが、
だいたい1時間半くらいかかります(何回かやりましたが1~1.5時間くらいでした)
入力が終わったら、いったんセーブしましょう。
⑥最後に、実行用の任意コード
CD/00/DA/CD/76/DA/CD/67(※)/38/F0/B1/CB/77/28/F4/C9
を実行。
※バージョンによって異なります。
後期赤緑版(VC含む)→67。
初期赤緑版→79
青版(VC含む)→8F
ピカ版v1.0→3F
ピカ版v1.1~1.3およびVC→40
(動画ではこの任意コードをアドレスD04Aに入力することで、「いしはら」により実行できるようにしています。)
すると入力したバイナリデータが画面上に表示されます。
上ボタンを押すまでは表示されたままになります。
人に見せるもよし、記念写真を撮るもよしです。
解説は以上となります。
それではみなさん、よいバグポケライフを!!