ポケモン赤緑のメモリを表示するBizhawkのLuaスクリプト

ポケモン赤緑のメモリを表示するBizhawkのLuaスクリプトです。

f:id:fujidig:20220111223843p:plain

f:id:fujidig:20220111223804p:plain

ごちゃさん(id:GOCHA)にBizhawkというエミュレータなら画面に余白を作ってそこに情報を表示できることを教えてもらったので作りました。

client.SetGameExtraPadding(0, 430,1050, 0)

local fontsize = 12
local startAddr = 0xd100

local w = 35
local h = 12

function printhint(addr, hint)
    gui.drawText(50 + bit.band(addr - startAddr, 31) * w, bit.rshift(addr - startAddr, 5) * h * 2 + h, hint, "pink", nil, 10)
end

function main()
    for i=0,15 do
        local addr = 0xd100 + i * 32
        gui.drawText(0, i * h * 2, string.format("%04x ", addr), nil, nil, fontsize)
        for j=0,31 do
            local ad = addr + j
            gui.drawText(50 + j * w, i * h * 2, string.format("%02x ", memory.read_u8(ad)))
        end
    end
    printhint(0xd11d, "playerName")
    printhint(0xd123, "numPk")
    printhint(0xd124, "pkSpecies")
    for i=0, 5 do
        local ad = 0xd12b + 44 * i 
        printhint(ad, "pk" .. (i+1))
        printhint(ad+1, "hp")
        printhint(ad+3, "boxlv")
        printhint(ad+4, "stat")
        printhint(ad+5, "type1")
        printhint(ad+6, "type2")
        printhint(ad+7, "catch")
        printhint(ad+8, "move1")
        printhint(ad+9, "move2")
        printhint(ad+10, "move3")
        printhint(ad+11, "move4")
        printhint(ad+12, "otid")
        printhint(ad+13, "exp")
        printhint(ad+16, "efforts")
        printhint(ad+27, "dvs")
        printhint(ad+29, "pp")
        printhint(ad+33, "lv")
        printhint(ad+34, "maxhp")
        printhint(ad+36, "atk")
        printhint(ad+38, "def")
        printhint(ad+40, "spd")
        printhint(ad+42, "spe")
    end
    
    for i=0, 5 do
        printhint(0xd233 + i * 6, "pk" .. (i+1) .. ".otname")
    end
    for i=0, 5 do
        printhint(0xd257 + i * 6, "pk" .. (i+1) .. ".nickname")
    end
    printhint(0xd27b, "pokedexOwned")
    printhint(0xd28e, "pokedexSeen")
    printhint(0xd2a1, "items")
    printhint(0xd2cc, "money")
    printhint(0xd2ce, "rivalName")
    printhint(0xd2d4, "opts")
    printhint(0xd2d5, "badges")
    printhint(0xd2d8, "id")
    printhint(0xd2dd, "map")
    printhint(0xd2e0, "y")
    printhint(0xd2e1, "x")
end

while true do
    if emu.framecount() % 15 == 0 then
        main()
    end

    emu.frameadvance()
  end