LINUX.ORG.RU
ФорумGames

Добавить попыток в NES ROM. Ресурсы по теме?

 , ,


0

2

Есть у нас вечериночная развлекуха: включаем дендевский mario bros. ( это где черепахи, раки и мухи из труб лезут ) «на двоих» и стараемся друг друга подставлять, всячески толкать и прочее подобное. В игре на удивление прикольная физика для подобного – весело. Одна печаль – в оригинальной игре всего две попытки и не успеваешь начать как все кончается. Раньше, еще в школьные времена мы это решали ArtMoney-ем: накручивали попыток и развлекались. Но это было давно и под виндой.

А тут подарили мне hdmi-стик с эмуляторами, в том числе и фамиком, в него воткнута флешка на которой был незамедлительно найден ром с интересующей игрой. Я рассудил что изначальное количество попыток наверняка где-то записано константой в файле, поэтому написал сищную программку, которая нашла адреса всех мест в роме, где лежит двойка: их оказалось порядка 400 штук всего. Ну я располовинил адреса, сгенерировал два рома, в одном двойки заменены на тройки в первой половине адресов, во втором – во втрой половине. Попробовал запустить, первая вообще не стартанула, вторая коряво, но стартонула и там было видно что количество попыток не изменилось – отбарсываем. Повторил несколько раз – сократил до 40 адресов, а потом просто нагенерил 40 ромов в которых изменен тока один байт и нашел тот, который мне нужен. Муторно, но зато я сам придумал :)

Рассказал друзьям, теперь просят проделать еще подобное для пары ромов. А мне лень: я полдня возился. Наверняка где-то есть ресурсы, форумы, где эти адреса уже 30 лет как вычислены и все про них знают. Игры популярные.

Внимание вопрос, где взять инфу?

★★★★★

Забыл как это называется, но были hex-коды или как-то так в аддоне для приставки. Можно найти эти коды и разобраться как закодирован в них нужный адрес. Вот тебе один известен, можно найти код для этой игры на попытки.

Xenius ★★★★★
()
Ответ на: комментарий от pihter

получить новую игру по мотивам

Звучит как читерство. Ну окей, окей. Есть ещё пиратские ромы типа «99 in 1», где содержатся именно варианты хаков с бесконечными жизнями, бессмертием, патронами, дополнительными жизнями/попытками и т.д. Если нужно совсем готовое, то стоит посмотреть.

anonymous
()
Ответ на: комментарий от anonymous

Если нужно совсем готовое, то стоит посмотреть.

да на это поди больше времени уйдет чем самому сделать, но спасибо за совет в копилку )

pihter ★★★★★
() автор топика

В эмуляторах (fceux) есть отладчики. Может там есть какие функции/макросы для такого. Как вариант, можно сделать слепок памяти при разном количестве жизней и парустрочником на Питоне найти нужное место.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Это была первая мысль (учитывая что раньше я пользовался Artmoney-ем) я тока не соображу как найденный адрес в памяти эмулятора превратить в адрес в роме (конечно, можно код эмулятора смотреть, но это явно побольше, чем полдня внимания потребует)

pihter ★★★★★
() автор топика

Возьми эмуль, где уже есть встроенный отладчик и поиск по адресам, там принцип поиска тот же, что и у Артамона.

Принцип такой - запускаешь игру, ищешь количество жизней, тратишь одну, отсеиваешь адреса по новому числу. И так до тех пор пока не найдешь нужный. Редактируешь значение, либо нужные оп. коды (в инете найдёшь 6502 assembly opcodes).

Там же в эмуле насколько я помню он должен показывать смещение к нужному адресу в файле, вроде достаточно скопировать rom и отредактировать через hex редактор.

Dr64h ★★
()

У меня лишь одна идея - все эти константы инициализируются где-то рядом типа:

char lives = 2; int score = 0;

Другое дело, что по таким вводным сложно найти: игры те были примитивны, а не какие-то рпг со 100500 параметрами

А так же можно искать опкод, который объявляет переменную (ну что-то типа того)

https://www.middle-engine.com/blog/posts/2020/06/23/programming-the-nes-the-6502-in-detail

Ну и все эти счетчики в начале рома должны быть.

Опкод … Значение Искать в первых не знаю 8 килобайтах Так можно, наверное, везде эти значения сразу найти Но я ничего не знаю о формате рома, но смысл я думаю понятен

rtxtxtrx
()
Последнее исправление: rtxtxtrx (всего исправлений: 3)
Ответ на: комментарий от pihter

В общем довольно элементарно гуглятся коды для читов в game geanie. Я так понимаю что в кодах закодированы оффсеты и значения. Можно в инете найти кодировку, а можно догадаться, зная нужные оффсеты из отладчика.

 Super Mario Bros.

AATOZA          Start players 1 & 2 with 1 life
IATOZA          Start players 1 & 2 with 6 lives
AATOZE          Start players 1 & 2 with 9 lives
VATOLE          Start player 1 with 8 lives and player 2 with 3 lives
SXIOPO          Infinite lives for both players
APZLGK          Super jump from a standing start only
TPZLTG          Super jump from running only
GPZUAG          Super jump from turbo running only
APZLGG          Mega-jump from a standing start only
APZLTG          Mega-jump from running only
GAZUAG          Mega-jump from turbo running only
YAZULG          Moon Gravity from a standing start
YAZUIG          Moon Gravity from a running start
YAZUYG          Moon Gravity from turbo running only
OZTLLX + AATLGZ + SZLIVO        Always stay big
YSAOPE + YEAOZA + PEAPYA        Start on World 2
YSAOPE + YEAOZA + ZEAPYA        Start on World 3
YSAOPE + YEAOZA + LEAPYA        Start on World 4
YSAOPE + YEAOZA + GEAPYA        Start on World 5
YSAOPE + YEAOZA + IEAPYA        Start on World 6
YSAOPE + YEAOZA + TEAPYA        Start on World 7
YSAOPE + YEAOZA + YEAPYA        Start on World 8

Ну и бинарный поиск оффсета никто не отменял. Просто нужно его модифицировать. Скажем в 50 случаев нет результата, в других 50 падает — делим на два набора по 25, модифицируем только их, если оба падают, то четыре набора и тд, если только один падает, а второй не работает, то его исключаем. И как только найдётся набор оффсетов где чит есть и игра стартует, можно уже продолжить обычный бинарный поиск.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

Вот кстати декодер/энкодер на яваскрипте. Так что можно извлечь адреса: https://games.technoplaza.net/ggencoder/js/ggencoder.js

https://github.com/Fordi/nes-gg

Вот тут текстовое описание кодов.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от pihter

Имеется в виду железная приставка? Аддон в виде специального картриджа?

Вроде да. В общем там суть в том как раз, что в коде кодируется оффсет, значение переменной, которую надо менять и значение на которое надо менять. Как именно кодируется я тебе даже нагуглил. Так что ты можешь раскодировать обратно и узнать нужный тебе оффсет из опубликованных Game Geanie кодов например. Может где-то выписаны и конкретные оффсеты. Кроме того, во многих эмуляторах эти коды поддерживаются.

Xenius ★★★★★
()

Номер текущей попытки хранится в переменной. Тебе нужно смотреть память (благо, её не много), вычислить, где меняется значение, когда увеличиваеся счётчик попыток, потом смотреть, с чем это значение сравнивается. Это и есть то значение, которое нужно увеличить (если, конечно, речь о счётчике с инкрементом).

CYB3R ★★★★★
()
Ответ на: комментарий от pihter

А если поставить точку останова на запись в эту ячейку и словить какой код туда пишет? Я так понимаю, там должен быть MOV, который записывает изначальное значение в память. Ну и уже отредактировать этот MOV в ROM'е.

urxvt ★★★★★
()