Программа редактирует ром особым образом и пользователь проверяет, появилось ли нужное ему изменение. Если не появилось, то ром восстанавливается и изменяется в другом месте. Если нужное находится, то начинается удаление лишних изменений.
Сейчас программа ищет только логику типа "включилось/выключилось", "есть/нет", "случилось/не случилось", "равно/не равно" (инструкции BEQ и BNE) и переключает их в друг друга. Т.е. вряд ли найдёт скорость, цвет, параметры, координаты и т.д. Не ищет и логику "больше/меньше".
Примеры того, что удалось сделать таким способом (в скобках - количество попыток):
Ultimate Mortal Kombat 3 (USA)
Чтобы секретные меню были изначально, без ввода комбинации. Оказалось, что инструкций понадобится две - одна отображает эти меню (56), другая даёт по ним ходить (34). Потом обнаружилась ещё одна альтернативная, активирующая эти меню при нажатии "вниз" (127), будто была набрана полная комбинация
Streets of Rage (W) (REV00) [!]
Секретное меню выбора уровня (19)
Возможность выбрать одинаковых персонажей (48)
Streets of Rage 2 (USA)
Секретное меню выбора уровня, на этот раз понадобились три инструкции: отображение пункта меню (83), доступ к нему сверху (156) и доступ снизу (45). Можно было ограничиться только одной стороной или вообще без отображения, но хотелось сделать красиво
Streets of Rage 3 (USA)
На этот раз аж 5 инструкций: доступ сверху (60), доступ снизу (43), а отображение - уже комбинация инструкций: нет номера уровня и пункта Exit (18) + есть номер и Exit (46) + ещё одна инструкция. Последнюю нашёл только предварительно изменив первые 2 инструкции в роме, т.к. она сама по себе, без сочетания с остальными, не находима - визуально ничего не меняет в игре
Contra - Hard Corps (USA, Korea) (En)
Выбор одинаковых персонажей - 2 инструкции: для нажатия "вверх" или "влево" (114) и "вниз" или "вправо" (217)
Что не удалось:
Contra - Hard Corps (USA, Korea) (En)
Бесконечные прыжки у Брауни. Ожидал инвертировать логику типа "если персонаж прыгнул в первый раз, то прыгнуть снова" в "если персонаж прыгнул не в первый раз, то прыгнуть снова", но там что-то другое. Наверно, надо изменить две инструкции. Например, стереть инструкцию установки флага второго прыжка.
Зато неожиданно нашёл неуязвимость для первого игрока, хотя всегда думал, что там только логика "если получен урон, то игрок умирает", которая инвертируется в "если не получен урон, то игрок умирает", что обычно и происходило - игрок моментально умирал
RoboCop Versus The Terminator (USA)
Не показывать количество очков во время игры. Удалось только отключить весь интерфейс и сломать счётчик, чтобы всегда оставались нули
Battletoads (World)
Тоже не показывать количество очков во время игры. Однажды эти нули выровнялись по левой стороне
В случае с последними двумя играми позже дошло, что в них отображение очков никогда не включается/отключается отдельно от остального интерфейса, поэтому шанс найти такое в коде был близок к нулю. Тут нужен другой подход и Глитчер для этого пока не подходит.
Можете предложить мне свои идеи хаков для проверки.
Как видно, поиск требует не так много времени - не более 300 попыток, каждая занимает секунд 5 или меньше.
За всё время разработки я ни разу не заглянул в отладчик, т.к. мне было интересно попробовать добиться нужного принципиально только таким способом.
Как пользоваться—сохраняетесь перед условием, которое хотите изменить. В моём случае с секретными меню
UMK3 и пунктами в опциях
SoR я сохранился на предыдущем экране, чтобы код рисовал-обновлял нужный экран. Если сохраниться прямо на нужном экране, то каждый раз будет загружаться только этот сохранённый экран, без нужных дополнительных пунктов.
Если же нужное вам может появляться на экране в любой момент при определённом условии, тогда можно и сохраняться в любой момент - как только Глитчер переключит это условие, нужное появится сразу после загрузки сохранения.
—закидываете ром на иконку программы и открываете его в эмуляторе, загружаете сохранение, смотрите результат и выбираете подходящий пункт меню в Глитчере. Перезагружаете ром, перезагружаете сохранение, смотрите, выбираете пункт меню и так повторяете.
—при закрытии Глитчера ром восстанавливается до первоначального состояния, а поиск сохраняется, чтобы можно было продолжить потом. При этом отменяется последний выбранный пункт - это аналог Ctrl+Z для случая, если ошибочно нажали не ту клавишу. Т.е. достаточно перезапустить программу.
—если при поиске нашли что-то интересное, не связанное с основной целью, то есть два варианта:
1) сделать бэкап файла
[поиск на паузе], чтобы искать потом;
2) выбрать пункт 3 и искать нужную инструкцию сейчас - этот пункт создаёт
[поиск на паузе] сразу и даст вернуться к основному поиску,
если в конце ничего не нажмёте и выйдете из программы.
Подробнее про пункты интерфейса1 баги мешают увидеть есть ли нужное изменение
2 баги не мешают увидеть, что нужного изменения нет
3 баги не мешают увидеть, что нужное изменение есть. Далее начинается удаление багов
Как можно ускорить поиск—эмуляторы реагируют по разному на сломанный ром: какие-то что-что да покажут или зависнут, другие же вылетят сразу или ещё и вылезет окно ошибки (BlastEm). Последние замедляют поиск, т.к. требуют дополнительных лишних действий.
Получается, что лучше использовать неточные эмуляторы типа Gens, т.к. они покажут меньше багов, что сильно поможет в поиске.
—важно настроить всё так, чтобы свести все лишние действия к минимуму. Не перетаскивайте каждый раз ром на эмулятор - лучше найдите тот, который переоткрывает ром одним нажатием (а лучше сразу грузит и сохранение). Например, в Fusion такой функции не нашёл, а BlastEm по умолчанию делает это на F5. В Gens RR нет переоткрытия, но есть Open Most Recent ROM. Не перепутайте жёсткий/мягкий перезапуск игры с перезагрузкой рома в память. Рядом с клавишей перезагрузки поставьте и загрузку сохранения, чтобы далеко не ходить. Уберите подальше "опасные" функции сохранения и смены слота.
—если эмулятор часто вылетает не выдержав издевательств над ромом, то всё равно не перетаскивайте ром на него - лучше ассоциируйте ромы с эмулятором.
—эмуляторы часто имеют возможность ускорить эмуляцию - пользуйтесь этим.
Програмка создана в Win11, VS2022 и запакована в zip без сторонних программ самой же ОС. Но, при попытке скачивания архива из интернета, Винда ругается на вирусы и удаляет файл - приходится выключать антивирус
Как назвать такое позорище Мелкомягких приличными словами - у меня не хватает фантазии
Если кто-то боится, то исходный код могу дать в личку