初代ポケモンでお絵描きするやつ

どうも、オーキドせんせい撃破RTA研究者です。

 

今回は、【初代ポケモン】好きなイラストをゲーム内に召喚してみた【バグ技 任意コード実行】https://youtu.be/VVbQEzKKJPs

 

上記の動画で使用している任意コードと、ExcelVBAのソースコードを紹介します。

実際にやってみた例はこちら。

SSRよしのん

手順の通り進めることで、上の画像のような感じで

初代ポケモンのゲーム画面に好きなイラストを召喚することができます。

(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に入力することで、「いしはら」により実行できるようにしています。)

 

すると入力したバイナリデータが画面上に表示されます。

上ボタンを押すまでは表示されたままになります。

人に見せるもよし、記念写真を撮るもよしです。

 

解説は以上となります。

それではみなさん、よいバグポケライフを!!