Lua 脚本 API

mGBA 包含完整的 Lua 5.4 脚本支持,允许您创建自定义工具、训练器、自动化脚本和游戏修改。本文档提供了 Lua 脚本 API 的完整参考。

Lua 脚本入门

加载脚本

在 mGBA 中加载 Lua 脚本:

  1. 转到 工具 → 脚本 → 加载脚本
  2. 导航到您的 Lua 脚本文件(.lua 格式)
  3. 选择脚本文件并点击打开
  4. 脚本将自动加载并执行
脚本位置: Lua 脚本通常存储在 mGBA 配置文件夹内的 scripts 目录中。您也可以从系统上的任何位置加载脚本。

内存访问函数

read8(address)

从内存读取 8 位值。

参数:

  • address (number): 内存地址(0x00000000 到 0xFFFFFFFF)

返回: 8 位值(0-255)

-- 示例:从内存读取 8 位值
value = mGBA:read8(0x02000000)
print("地址 0x02000000 的值: " .. value)

read16(address)

从内存读取 16 位值。

参数:

  • address (number): 内存地址

返回: 16 位值(0-65535)

-- 示例:读取 16 位值
value = mGBA:read16(0x02000000)
print("16 位值: " .. value)

read32(address)

从内存读取 32 位值。

参数:

  • address (number): 内存地址

返回: 32 位值

-- 示例:读取 32 位值
value = mGBA:read32(0x02000000)
print("32 位值: " .. value)

write8(address, value)

向内存写入 8 位值。

参数:

  • address (number): 内存地址
  • value (number): 8 位值(0-255)
-- 示例:写入 8 位值
mGBA:write8(0x02000000, 0xFF)

write16(address, value)

向内存写入 16 位值。

参数:

  • address (number): 内存地址
  • value (number): 16 位值(0-65535)

write32(address, value)

向内存写入 32 位值。

参数:

  • address (number): 内存地址
  • value (number): 32 位值

CPU 和寄存器函数

getRegister(registerName)

获取 CPU 寄存器值。

参数:

  • registerName (string): 寄存器名称(例如:"r0"、"r1"、"pc"、"sp")

返回: 寄存器值(32 位)

-- 示例:获取 PC(程序计数器)值
pc = mGBA:getRegister("pc")
print("程序计数器: " .. string.format("0x%08X", pc))

setRegister(registerName, value)

设置 CPU 寄存器值。

参数:

  • registerName (string): 寄存器名称
  • value (number): 32 位值

帧和计时函数

frame()

获取当前帧号。

返回: 当前帧号

-- 示例:获取当前帧
currentFrame = mGBA:frame()
print("当前帧: " .. currentFrame)

reset()

重置模拟器。

-- 示例:重置模拟器
mGBA:reset()

存档状态函数

saveState(slot)

将状态保存到插槽。

参数:

  • slot (number): 存档插槽号(1-10)

loadState(slot)

从插槽加载状态。

参数:

  • slot (number): 存档插槽号(1-10)

输入函数

pressButton(button)

以编程方式按下按钮。

参数:

  • button (string): 按钮名称("A"、"B"、"L"、"R"、"Start"、"Select"、"Up"、 "Down"、"Left"、"Right")
-- 示例:按下 A 按钮
mGBA:pressButton("A")

事件回调

mGBA Lua API 支持游戏状态变化的事件回调:

-- 示例:帧回调
function onFrame()
    -- 此函数每帧调用
    local frame = mGBA:frame()
    if frame % 60 == 0 then
        print("帧: " .. frame)
    end
end

-- 注册回调
mGBA:onFrame(onFrame)

常见脚本示例

生命值训练器

-- 生命值训练器示例
local healthAddress = 0x02000000  -- 替换为实际地址

function infiniteHealth()
    mGBA:write16(healthAddress, 999)
end

-- 每帧运行
mGBA:onFrame(infiniteHealth)

帧计数器

-- 帧计数器脚本
local startFrame = mGBA:frame()

function countFrames()
    local current = mGBA:frame()
    local elapsed = current - startFrame
    print("已过帧数: " .. elapsed)
end

mGBA:onFrame(countFrames)

内存地址

Game Boy Advance 游戏的常见内存地址:

  • 内部 WRAM: 0x03000000 - 0x03007FFF (32KB)
  • 外部 WRAM: 0x02000000 - 0x0203FFFF (256KB)
  • 视频 RAM: 0x06000000 - 0x06017FFF (96KB)
  • 游戏卡 ROM: 0x08000000 - 0x0DFFFFFF(因游戏而异)
  • 游戏卡 SRAM: 0x0E000000 - 0x0E00FFFF(因游戏而异)
注意: 内存地址因游戏而异。使用内存扫描器或调试器查找您游戏的具体地址。

最佳实践

  • 在读取/写入之前始终验证内存地址
  • 对内存操作使用适当的数据类型(8 位、16 位、32 位)
  • 小心使用帧回调以避免性能问题
  • 在重要游戏中使用之前彻底测试脚本
  • 在使用修改游戏状态的脚本之前备份存档文件

限制

  • Lua 脚本在模拟器的主线程中运行(可能影响性能)
  • 某些操作可能根据模拟器状态而不可用
  • 内存地址可能因游戏版本或地区而异

相关文章

有关 mGBA 配置和开发的更多信息: