API скриптинга Lua

mGBA включает полную поддержку скриптов Lua 5.4, позволяя создавать пользовательские инструменты, тренеры, скрипты автоматизации и модификации игр. Эта документация предоставляет полный справочник по API скриптинга Lua.

Начало работы со скриптами Lua

Загрузка скриптов

Чтобы загрузить скрипт Lua в mGBA:

  1. Перейдите в Инструменты → Скрипты → Загрузить скрипт
  2. Перейдите к файлу скрипта Lua (формат .lua)
  3. Выберите файл скрипта и нажмите Открыть
  4. Скрипт будет загружен и выполнен автоматически
Расположение скриптов: Скрипты Lua обычно хранятся в директории scripts в папке конфигурации mGBA. Вы также можете загружать скрипты из любого места в вашей системе.

Функции доступа к памяти

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")

Обратные вызовы событий

API Lua mGBA поддерживает обратные вызовы событий для изменений состояния игры:

-- Пример: Обратный вызов кадра
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: