【mGBA】FF4アドバンス向けステータス吟味用のLuaスクリプト

mGBA エミュレータ

初めに

最近はGBAのファイナルファンタジーIVアドバンスを再プレイしています。
有名な話であるとおり、この作品では各キャラクターのステータスについてLv71以降はランダム成長です。
しかも、パーティにいないキャラクターも成長するパーティー外成長のシステムが採用されています。

つまり最強ステータスの育成を目指す場合は、パーティ外のキャラクターのステータスも常に監視しないといけなくなり、パーティチェンジのできる場所がミシディアのみであることも相まって、非常に辛い作業が待っています。
そのため、mGBAで各キャラクターのステータスを確認できるLuaスクリプトを作成したため、下記にて紹介します。

FF4アドバンス向けステータス吟味用のLuaスクリプト

前提

mGBAのバージョンは「0.11-8693-92e10f31e」で動作確認しています。
ファイナルファンタジーIVアドバンスは「E4」版前提のアドレス指定です。

スクリプト

-- 各キャラクターのステータス情報表示
statusInfo = console:createBuffer("ステータス情報")

local baseAddress = 0x0200636B  -- 最初のキャラクターのアドレス
local characterNames = {
    "セシル", "カイン", "ローザ", "リディア", "シド",
    "テラ", "ギルバート", "ヤン", "パロム", "ポロム", "エッジ", "フースーヤ"
} -- キャラクター名のリスト
local characterCount = #characterNames

-- 前回のステータスを保持するテーブル
local previousStatuses = {}

-- フレームコールバックで呼び出す関数
function updateBuffer()
    local hasChanges = false
    local currentStatuses = {}

    -- 各キャラクターのステータスをチェック
    for i = 0, characterCount - 1 do
        local characterAddress = baseAddress + (i * 0x48) -- 各キャラクターのアドレスを計算
        local status = {
            level     = emu.memory.wram:read8(characterAddress),
            strength  = emu.memory.wram:read8(characterAddress + 9),
            agility   = emu.memory.wram:read8(characterAddress + 10),
            stamina   = emu.memory.wram:read8(characterAddress + 11),
            intellect = emu.memory.wram:read8(characterAddress + 12),
            spirit    = emu.memory.wram:read8(characterAddress + 13),
            exp       = emu.memory.wram:read32(characterAddress + 53),
        }
        currentStatuses[i] = status

        -- 前回のステータスと比較して変更があればフラグを立てる
        if not previousStatuses[i] or
            status.level     ~= previousStatuses[i].level     or
            status.strength  ~= previousStatuses[i].strength  or
            status.agility   ~= previousStatuses[i].agility   or
            status.stamina   ~= previousStatuses[i].stamina   or
            status.intellect ~= previousStatuses[i].intellect or
            status.spirit    ~= previousStatuses[i].spirit    then
            hasChanges = true
        end
    end

    -- ステータスに変更があった場合のみバッファを更新
    if hasChanges then
        statusInfo:clear()
        for i = 0, characterCount - 1 do
            local status = currentStatuses[i]
            local prevStatus = previousStatuses[i] or {}
            local function formatStat(statName, currentValue, previousValue)
                if previousValue == nil then
                    return tostring(currentValue)
                else
                    local diff = currentValue - previousValue
                    if diff ~= 0 then
                        return tostring(currentValue) .. (diff > 0 and " (+" or " (") .. tostring(diff) .. ")"
                    else
                        return tostring(currentValue)
                    end
                end
            end

            statusInfo:print(characterNames[i + 1])
            statusInfo:print(" Lv: " .. formatStat("level", status.level, prevStatus.level))
            statusInfo:print(" 力: " .. formatStat("strength", status.strength, prevStatus.strength))
            statusInfo:print(" 素早さ: " .. formatStat("agility", status.agility, prevStatus.agility))
            statusInfo:print(" 体力: " .. formatStat("stamina", status.stamina, prevStatus.stamina))
            statusInfo:print(" 知性: " .. formatStat("intellect", status.intellect, prevStatus.intellect))
            statusInfo:print(" 精神: " .. formatStat("spirit", status.spirit, prevStatus.spirit))
            statusInfo:print(" EXP: " .. tostring(status.exp))
            statusInfo:moveCursor(0, i + 1)
        end

        -- ステータスを更新
        previousStatuses = currentStatuses
    end
end

-- フレームが終了した時にupdateBufferを実行
callbacks:add("frame", updateBuffer)

動作仕様

最終パーティに含めることはできませんが、テラやフースーヤを含めた12人のステータスを表示します。
描写負荷を抑えるため、ステータスの情報を監視し、前回から差分があったときのみ、再描写するようにしています。
その際、差分があったステータスについては括弧書きでどのくらいの差分があったかわかるようにしています。
FF4アドバンス向けLuaスクリプト

最後に

Luaは今回初めて触ったため、コーディングに不慣れな部分が多々見られると思います。
今更FF4アドバンスをプレイしてステータス吟味する人間がいるとは思えませんが、参考情報の1つになれば幸いです。

コメント