Давно в голове крутилась такая идея - взять эмулятор одной из старых консолей с поддержкой скриптов, добавить в его систему парсинга команд специальный опкод, по которому будет срабатывать передача управления в скрипт. Дальше вместо стандартного процесса хака делать следующее - дизассемблированную функцию переписать на скриптовом языке и стереть её из ROM, заменив тело на опкод вызова скриптовой функции (для этого хватит пары байт), оставшееся место использовать для своих нужд. Из скрипта есть доступ к любым функциям эмулятора (а если и нет, можно прокинуть нехватающие).
Так можно переписать все основные системы игры - управление, интеллект врагов, форматы описания уровней, тексты etc. Всё необходимое для модификации. На выходе получится практически чистый ROM с частью технических неинтересных для модификации функций в нём, и движок игры в читабельном виде на языке высокого уровня.
Сложность переписывания кода на скриптовом языке намного меньше, чем переписывания алгоритма на ассемблере, но главные плюсы в том, что снимаются ограничения на размеры данных и кода, которых всегда не хватает, а также в том, что можно удобно тестировать переписанный код, модифицируя его без перезапуска игры и работать над скриптом совместно.
Так еще никто не делал :)
Решил попробовать реализовать такое для FCEUltra, так как у него открытые исходники и есть поддержка lua-скриптов, используемых для читерства и тассинга. Ее можно расширить и для программирования.
В конце функции эмуляции выполнения команд процессора X6502_Run можно дописать что-то вроде:
... |
Еще очень удобно добавить в lua возможность выполнить нативный код, чтобы свободно смешивать уже написанную игровую логику на ассемблере со скриптовым кодом:
void X6502_CallFunc(uint16 funcAddr) |
Дальше для теста переписал небольшую часть логики прыжков Черного Плаща под новую версию эмулятора. Получился такой скрипт:
https://gist.github.com/4145710
Ничего интересного он не делает, только демонстрирует потенциал для ромхакинга.
Целиком эмулятор, ром и скрипт выложил в теме тут http://www.emu-land.net/forum/index.php/topic,64174.0.html