Ром редактируется особым образом и пользователь проверяет в эмуляторе на нужное ему изменение. Если оно не появилось, то ром восстанавливается и изменяется в другом месте. Если нужное находится, то начинается удаление лишних изменений.
Два инструмента для разных задач:
ИНВЕРТЕР логики
Ищет логику типа "есть/нет", "включилось/выключилось", "случилось/не случилось", "равно/не равно" (инструкции BEQ и BNE) и инвертирует её. Т.е. не ищет скорость, цвет, параметры, координаты и т.д. Не ищет и логику "больше/меньше".
Примеры того, что можно сделать таким способом (в скобках количество требуемых шагов/нажатий):
Ultimate Mortal Kombat 3 (USA)
Чтобы секретные меню были изначально, без ввода комбинации. Оказалось, что инструкций понадобится две - одна отображает эти пункты меню (56), другая даёт по ним ходить (34). Обнаружилась ещё одна альтернативная, активирующая эти меню при нажатии "вниз" (127), будто набрана полная комбинация AC↑B↑BA↓
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 или меньше.
За всё время разработки я ни разу не заглянул в отладчик, т.к. мне было интересно попробовать добиться нужного принципиально только таким способом.
ПЕРЕСТАВЛЯТЕЛЬ ресурсов
Ищет массивы указателей, которые могут указывать на что угодно: изображения, звуки, состояния анимаций, уровни, порядок объектов, код поведения и т.д.
В отличие от предыдущего инструмента, при поиске надо искать не конечный желаемый результат, а изменение нужного элемента.
Например, в Cannon Fodder надо, чтобы при выстреле вылетали не пули, а ракеты. При поиске можно увидеть, как вместо пуль начали вылетать вертолёты - нужный элемент (пули) затронут и найдены указатели на пулю и вертолёты. Скорее всего, рядом с ними в массиве есть и указатели на другие объекты, среди которых могут быть ракеты. Далее Переставлятель начинает подставлять все эти соседние указатели вместо указателя пули, чтобы вы могли видеть что происходит в игре при вылете пули и дать этому название. В таком массиве именованных указателей будет легко ориентироваться и переставлять объекты местами.
Примеры того, что я нашёл не выискивая что-то конкретное, просто по пути:
Ultimate Mortal Kombat 3 (USA)спрайты имён бойцов внутри полоски здоровья:
(позиция в массиве, указатель, количество его копий, название)
1 270000 42 A
2 10002 25 B
3 30004 18 C
4 50006 8 E
5 70008 50 G
6 9000a 9 H
7 b000c 8 I
8 d000e 9 M
9 f0010 8 L
10 110012 9 часть буквы
11 130014 8 пробел
12 150016 4 пробел, вариант 2
13 170018 8 O
14 19001a 6 R
15 1b001c 9 T
16 1d001e 7 часть буквы или кавычки
17 1f0020 8 середина M?
18 210022 7 часть буквы
19 230024 5 Y
фоны и арены:
1 4f1c2 витраж
2 4f80c портал
3 4f312 мост
4 4f49c космос
5 4f58c картинка - башня Шао Кана
6 4f614 картинка - крыши
7 4f66e серый одноцветный фон
8 4f758 логотип
9 4f866 пустыня
10 4f974 трон Шао Кана
11 4f9f2 ад
12 4fa70 арена у реки (MK3?)
13 4f6c8 экран выбора столбца
14 4f722 экран выбора столбца 2
15 4f7b2 логотип копия
некоторые персонажи:
1 346c2 Кано
2 3594e Соня
3 36b9a Джакс
4 37e30 Ночной Волк
5 39268 Саб зиро старший
6 3a488 Страйкер
7 3b6c4 2 Синдел
8 3cabc 3 Сектор
9 3cabc 3 Сектор
10 3e310 Кун Лао
11 3f4c8 Кабал
приёмы, заканчивающиеся на:
1 1a840 2 ?
2 1caf4 X
3 1cb64 A
4 1cbd4 B
5 1cc44 Z
6 1ccb4 C
7 1ca84 Y
8 1cd24 вверх
9 1cd94 ?
10 1ce04 ?
(неизвестные надо бы проверить на превращениях Шан Цуна)
?:
1 e0482 Кано - подножка
2 10c0aa Соня - удары
3 13d6f2 Джакс - удары
4 16e700 Ночной Волк
5 19a864 Саб Зиро старший
6 1be08a Страйкер - бег
7 1ec624 Синдел - прыжок
8 226da4 Сектор - падение на спину
9 252ba2 Кун Лао - пинок с разворота
10 286dc2 Кабал - пинок с разворота
Соня:
1 367fa бег
2 36a86 падение на спину
3 36a7e испуг
4 367a6 захват ногами
5 369fe велосипед
6 36a9e Фаталити с огненным шаром
7 36b52 полёт вперёд
8 36af6 плазменный шар от Фаталити
9 36b4a остатки противника после Фаталити?
Contra - Hard Corps (USA, Korea) (En)массив 81: диалоги и уровни
массив 48: элементы экрана выбора персонажа: кадры анимации морфинга портретов и символы дисплея
состояние спрайтов персонажей, только часть: нет ходьбы, направлений оружия, подката, висения:
1 146ba Рэй кручение в прыжке
2 14ace 2 Шина (стр.2)
3 15426 Фэнг
4 14e86 2 Брауни джетпак (стр.4)
5 147de 3 Рэй ожидание (стр.5)
6 14bf2 3 Шина (стр.6)
7 15540 3 Фэнг (стр.7)
8 14f7a Брауни ожидает, пушка вперёд
9 147de 3 Рэй ожидание (стр.5)
10 14bf2 3 Шина (стр.6)
11 15540 3 Фэнг (стр.7)
12 14f94 2 Брауни ожидает, пушка вверх
13 146b6 Рэй кручение в прыжке (копия?)
14 14aca Шина
15 15422 Фэнг
16 14e7e Брауни
17 146d0 Рэй получает урон в спину перед падением вперёд
18 14ae4 Шина
19 1543c Фэнг
20 14e94 3 Брауни взрывается (стр.20)
21 148e6 Рэй получает урон спереди перед падением на спину
22 14cfa Шина
23 15648 Фэнг
24 14e94 3 Брауни взрывается (стр.20)
25 147a8 Рэй карабкается вверх
26 14bbc 2 Шина
27 1550a 2 Фэнг
28 14f44 2 Брауни
29 146dc Рэй смерть
30 14af0 Шина
31 15444 Фэнг
32 14e9c 3 Брауни электро (стр.32)
33 146f4 Рэй откинулся волчком
34 14b08 Шина
35 1545c Фэнг
36 14e94 3 Брауни взрывается (стр.20)
37 14712 Рэй лежит
38 14b26 Шина
39 15474 Фэнг
40 14e9c 3 Брауни электро (стр.32)
другие массивы:
25 - состояние игры: демонстрация, экран выбора, брифинг, экран после смерти...
16 - спрайты боссов
Вообще не удалось найти музыку и звуки
Streets of Rage 2 (USA)116 - тайлы надписи Stage _ Start, появляющаяся перед каждым уровнем
82 - некоторые персонажи:
1 fa4b4 Макс
2 fad02 Аксель
3 fb6ce Блейз
4 fbf92 Скейт
5 1eb2c0 3
6 1eb306
7 1eb86a Джек
8 1ebdce Барбон
9 1ec11e
10 1ec340
11 1ee456
12 1ee138 2
13 1ec5c6
14 1ece7e
15 1f0db4 5
16 1ed4f8
17 1ed782
18 1ecbf6 Росомаха
19 1ed2a2 Боксёр
20 1edce2 Рестлер
21 1f0db4 5
22 1f0db4 5
23 1ee778
24 1f0db4 5
25 1eede2 Мистер Икс
26 1ef454 Шива
...
Можно менять их местами, играть за врагов, но есть глюки
другие массивы:
55 - звуки, порядок совпадает со звуковым тестом в опциях
45 - поведение активных и разрушаемых объектов (+мусорки и столы застывают на последнем кадре: не происходит удаление предмета, предметы вертятся, света в баре нет)
45 - поведение активных предметов: люк взрывается как граната, одежда босса не исчезает. Количество совпадает с предыдущим пунктом
32 - силы/траектории перекидываний
персонаж Сигнал, поведение:
1 165b2 действие обычное
2 e908 13 после получения удара
3 e7e0 17 умирает
4 e692 15 мерцает
5 e964 14 встаёт с земли
6 ebb0 14 если схвачен спереди
7 ec54 12 если схвачен сзади
8 ec9e 17 падает налево
9 ed46 17 падает направо
10 1639c вбегает справа
11 16958 выпрыгивает
12 f03a 37 удар локтём серия
13 169f2 2 анимация перекидывания
14 169f2 2 анимация перекидывания
15 16a9c удар локтём сильный
16 16a4c после перекидывания
17 169b0 ?
18 e63e 14 ?
19 16b20 2 ?
(массив 15-ый слева)
направление ножа в руке персонажа игрока:
2 1401f8 вверх
4 140204 неподвижно - вперёд вверх
6 140210 неподвижно - назад
8 14021c назад вниз
10 140228 вниз
12 140234 назад
14 140240 вперёд
16 14024c вперёд верх
(массив 15-ый слева)
массив 9: персонаж Скейт - кадры стояния
палитры уровня 1:
1 10a100 2 "осень"
2 10fc10 2
3 11ad68 2 "темно"
4 1218a0 2
5 125630
6 128f78
7 12fb78
8 131e68 2 "монохром"
9 12001e изначальная палитра ур1
X-Men 2 - Clone Wars (UE) [!]первый массив:
1 5466 2 создание уровня
7 6242 создание игрока 1
8 62e4 создание игрока 2 (при нажатии start. Если записать игрока 1, то он будет пересоздаваться)
10 6584 запуск следующего уровня? (Если вставить элемент 11, то всегда переход на следующий уровень после смерти)
11 6636
Зверь
2118 182932 обычное состояние
2119 182954 атака рукой
2120 18299c напрыг сверху
2121 1829a6 отпрыг от поверхности
2122 1829b2 вертушка
2123 1829be удар вися на стене
2124 1829d0 руки верх перед ударом об землю
2125 1829da промежуточная анимация
2126 1829e6 удар руками об землю
2127 1829f0 после удара об землю
1393 11339a Зверь
1394 113496 Ночной Змей
1395 11359a Псайлок
1396 11369a Росомаха
1397 11379a Магнето
1398 113894 Гамбит
1399 11398e Циклоп
другие массивы:
16 - тайлы логотипа Сега
12 - местоположение ДНК, танков, бомб, место уровня...
11 - спрайты героев, часть логотипа игры
10 - другая часть логотипа игры
7 - состояние танков и других вещей (раздолбанный вид...)
А ещё при просмотре рома в хекс-редакторе обнаружились строки: CAMERA, ACTOR, memcpy, memset. Похоже, в игре остался отладочный код.
RoboCop Versus The Terminator (USA)Удалось таки убрать счётчик очков с экрана, кроме левого нуля. Оказалось, что он как-то связан со слоем, на котором рисуются другие объекты.
Battletoads (World)Не удалось избавиться от счётчика.
Уточнение пунктов интерфейса1 глитчи мешают увидеть, что нужное изменение есть/отсутствует
2 глитчи не мешают увидеть, что нужного изменения нет
3 глитчи не мешают увидеть, что нужное изменение есть. Далее начинается удаление глитчей
Как пользоваться—сохраняетесь в месте, где хотите что-то изменить. В моём случае с меню
UMK3 и опциями
SoR я сохранился на предыдущем экране, чтобы далее игра рисовала нужный мне экран с будущими секретными пунктами. Если сохраниться прямо на нужном экране, то каждый раз будет загружаться экран в таком же виде, без нужных дополнительных пунктов. Ведь код игры, рисующий их, не был задействован.
Если же нужное вам может появляться в игре в любой момент при определённом условии, тогда можно и сохраняться в любой момент.
—закидываете ром на иконку программы и открываете его в эмуляторе, загружаете сохранение, смотрите результат и выбираете подходящий пункт в программе. Переоткрываете ром, перезагружаете сохранение, смотрите, выбираете пункт меню и так повторяете до конца.
—при закрытии программы поиск сохраняется.
Как можно ускорить поиск—эмуляторы реагируют по-разному на сломанный ром: какие-то что-то да покажут или зависнут, другие же вылетят сразу или ещё и вылезет окно ошибки (BlastEm). Последние замедляют поиск, т.к. требуют дополнительных лишних действий.
Получается, что лучше использовать неточные эмуляторы типа Gens, т.к. они меньше ломаются и покажут меньше глитчей.
—важно настроить всё так, чтобы свести все лишние действия к минимуму. Не перетаскивайте каждый раз ром на эмулятор, лучше найдите тот, который переоткрывает ром одним нажатием (а лучше сразу грузит и сохранение). Например, в Fusion такой функции не нашёл, а BlastEm по умолчанию делает это на F5. В Gens RR нет переоткрытия, но есть Open Most Recent ROM. Не перепутайте жёсткий/мягкий перезапуск игры с перезагрузкой рома в память. Рядом с клавишей перезагрузки поставьте и загрузку сохранения, чтобы далеко не ходить. Уберите подальше "опасные" функции сохранения и смены слота.
—если эмулятор часто вылетает не выдержав издевательств над ромом, то всё равно не перетаскивайте ром на него, а лучше ассоциируйте ромы с эмулятором.
—эмуляторы имеют возможность ускорить эмуляцию, пользуйтесь этим.
Переставлятель
Переключайтесь между ним и эмулятором нажимая Alt+Tab, а не мышкой.
Чтобы уменьшить шанс ошибочного нажатия в нём того, что было предназначено для эмулятора (например F5), лучше разверните его на весь экран или переместите окно эмулятора поверх него, чтобы всегда видеть на чём сейчас фокус.
Нажатие F1...F12 на клавиатуре в окне Переставлятеля во время поиска обычно полностью убивает этот поиск, поэтому можно перенастроить загрузку и сохранение в эмуляторе на другие клавиши.
Я не боюсь того, кто выучил сотню приёмов хакинга. Я боюсь того, кто выучился сотне нажатий в Глитчере
Антивирус Win10/Win11 сразу удаляет новые неизвестные ему исполнительные файлы, скачанные из интернета, поэтому перед скачиванием придётся его выключить.