初めに
最近は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人のステータスを表示します。
描写負荷を抑えるため、ステータスの情報を監視し、前回から差分があったときのみ、再描写するようにしています。
その際、差分があったステータスについては括弧書きでどのくらいの差分があったかわかるようにしています。
最後に
Luaは今回初めて触ったため、コーディングに不慣れな部分が多々見られると思います。
今更FF4アドバンスをプレイしてステータス吟味する人間がいるとは思えませんが、参考情報の1つになれば幸いです。
コメント