Разработка и ромхакинг > Ромхакинг
[NES] Учебник по ромхакингу
<< < (2/13) > >>
lancuster:

--- Цитата: MetalliC от 20 Сентябрь 2016, 21:09:10 ---лучше бы и ты его выучил, вместо того чтоб строчить тыщи бестолковых мессаг, может таки (ром)хакером стал бы, полноценным ))

--- Конец цитаты ---
Для меня это типа хобби, так что пока нет... Времени нет на изучение. :-\
Skay:
еслиб было голосование за формат, я бы голосовал за гитбук.
вот пример https://www.gitbook.com/book/andreyakinshin/problembookdotnet/details/ru
о том, что за зверь такой https://sohabr.net/habr/post/218433/  в коментах еще есть варианты, но chm точно ненадо.
lancuster:
К слову. Первый урок от меня, для новичков. Если "многобукав" - проходите мимо. :lol:
В статье всё расписано пошагово, скрины прилагаются:
[NES Ромхакинг] Первый урок. Введение
Чуть позже, возможно, выложу ещё дополнение, как делать бесконечные жизни, сердечки, оружие и прочее.  ;)
Zetper:

--- Цитата: lancuster от 20 Сентябрь 2016, 23:27:30 ---К слову. Первый урок от меня, для новичков. Если "многобукав" - проходите мимо. :lol:
В статье всё расписано пошагово, скрины прилагаются:
[NES Ромхакинг] Первый урок. Введение
Чуть позже, возможно, выложу ещё дополнение, как делать бесконечные жизни, сердечки, оружие и прочее.  ;)

--- Конец цитаты ---
Ошибка
Тема форума доступна только для участников сообщества
lancuster:
Тогда вот:
[NES Ромхакинг] Первый урок. Введение
    Многие из вас, желавшие поиграть в игры Денди, Сеги и других платформ, дабы поностальгировать и вспомнить "детство золотое", задавались вопросом - как воплотить это в жизнь, как можно поиграть в эти игры на мобильном телефоне/смартфоне/планшете/ПК и пр.? Попробовав самые разные эмуляторы консолей, вы выбираете один из них (или сразу несколько, как я) в качестве оптимального варианта на все случаи. И, естественно, начинаете воплощать мечту детства - играете во все игры, которые раньше были вам недоступны или неизвестны.
Но со временем просто играть вам, разумеется, надоедает, и поэтому вы начинаете задаваться вопросом: как можно видоизменить/улучшить/переделать эти игры? Ведь, как известно, и разработчики оригинальных игр, и пираты, не брезговали ромхакингом. Действительно, зачем тратить на разработку новую игру (читай - сиквел того же Мегамена) много денег и времени, когда можно использовать уже готовый движок, готовую музыку и звуковые эффекты, готовые спрайты, и переделать их с тем, чтобы выпустить сиквел как можно скорее. Удобно, не так ли? И геймеры довольны, и разрабы озолотились. ;) Увы, этим также пользовались и пираты, выпуская псевдо-сиквелы, годами обманывая геймеров Европы, Азии и стран СНГ... :(
... Но мы с вами не будем брать пример с пиратов и намеренно затирать копирайты разработчиков, верно? Если так - давайте же приступим к изучению ромхакинга! :)
    Для первого урока по ромхакингу NES игр вам понадобится:
A) эмулятор, имеющий в себе кучу встроенных утилит - в данном случае это FCEUX 2.2.3. Его можно найти на сайте emu-russia.net . Если у вас более старая версия этого эмуля - ничего страшного, на ромхакинг это никак не повлияет. Просто в новой версии добавлены новые мапперы (включая CoolBoy).
Б) ром Super Mario Bros. (JU) [!]. Если его нет - можете скачать его на том же сайте. Или найти на сайте romfind.com
Итак, перейдём, непосредственно, к делу. Открываем Супер Марио с помощью указанного эмуля и нажимаем "старт". Для начала научимся менять количество жизней этого героя. Заходим в Tools->RAM Search. В появившемся окне выставляем Equal to - Specific Value - в форме рядом с этой фразой вбиваем цифру 2 и жмём на Search:

"Почему 2, если у героя на самом деле 3 жизни?" - спросите вы. Отвечаю: в некоторых играх есть такая особенность - когда отображаемая цифра или количество палочек-сердечек не совпадают с тем значением, что указано в ram. Например, когда вы ищете лайфбар, состоящий из 10 палочек/сердечек, и не находите - вам придётся выставить условие поиска Less than - Previous value, чтобы найти количество сердец по значению, которое уменьшается на определённое число каждый раз при получении урона. Конкретно в Супер Марио герою присваивают 2 жизни, хотя отображается 3. Из этого следует, что жизни у Марио уменьшаются вот так: 2, 1, 0 (то есть, ноль тоже используется как значение, и game over происходит после того, как значение "уходит в минус", а точнее - становится равно FF).
После того, как вы нажмёте на Search, вы получите:

Как видите, количество переменных резко уменьшилось. Нажимаем ещё раз, чтобы отсеять те, которые меняются в данный момент игры. Теперь их стало ещё меньше, верно? Чтобы знать наверняка, что изменится после потери жизни - выставляем условие поиска: Less than - Previous value. Это позволит выделить те переменные, что изменились после потери жизни. Теперь идём и напарываемся на гумбу. Смотрим внимательно на результаты в RAM Search. Даже без повторного поиска видим, что переменная 075A стала 1, была 2, а количество изменений равно 1.
Чтобы убедиться в этом - нажмите правой кнопкой мыши на этой переменной. Вы попадёте в HEX Editor - шестнадцатиричный редактор - где курсор будет стоять на этой переменной (как на этом скрине). И вводите, к примеру, 08 вместо текущего значения. После потери жизни их станет 8 (нумерацию жизней в этой игре я уже написал). Если произошло так, как я написал - значит, вы нашли значение жизней. Теперь осталось лишь ввести нужное вам значение в ROM и сохранить результат для дальнешего использования.
Для этого жмём на самом значении правой кнопкой мыши и выбираем Add Write Breakpoint For Address 075A:

Тут же откроется отладчик. Сворачивайте его. Если закроете - придётся залезать в Debug->Debugger и включать его заново. Жмём Reset (или Power, роли не играет). И тут же наш брейкпоинт срабатывает. В данный момент значение А переменной равно нулю, так что пропускаем это, нажав Run в отладчике. И в этот раз значение А переменной равна нулю, снова жмём Run. Теперь мы видим, что значение стало равно 02. Это - то. что мы искали:

К слову, при наведении на нужную нам строку в самом низу отладчика отображается местонахождение этого выражения в ROM. Запоминаем эту строку, заходим в HEX-editor, View-ROM File, и находим это место. Меняем 02 на какое хотите (желательно не выше 63 (62) - в хексе это 99). Да, если хотите сделать конкретное значение - вам понадобится Калькулятор, а точнее - инженерный Калькулятор. В поле вводите любое число в десятичной (DEC) системе (например, 20), переключаетесь в HEX - получаете 14. Именно HEX значения вам понадобятся в ромхакинге. :)
Второй способ: нам известно значение в RAM - тогда включаем HEX Editor и переходим к этому адресу. Для прокрутки я использую кнопки PgUp и PgDn. Можно также перейти напрямую по адресу, зайдя в хексе File->Goto address и вписав туда полученный адрес. Делаем, как на этом скриншоте:

Дальше - также меняете значение и жмёте Save ROM, чтобы сохранить изменения в текущем роме, или Save ROM As, чтобы сохранить изменения в новом роме, не меняя текущий:

   Собственно, подобным образом можно не только накручивать жизни и сердечки в играх, но ещё и увеличить время, скорость персонажей и многое-многое другое. ;)
P. S.: также рекомендую вам скачать и установить утилиту Insectduel_s SMB Utility Rus.exe, с помощью которой вы сможете в Супер Марио задать количество жизней одним кликом, указать количество миров, изменить время, свойства уровней, превращения Боузера после смерти, переделать все уровни, задать их тип и погодные условия, а также переписать интро игры.
Для изменения заставки игры я рекомендую использовать smbte10b.zip. Правда, нужно учесть, что место на заставке не резиновое, за поля залезать нежелательно, иначе изменения не сохранятся.
Благодарю за внимание. ;)
neoborg:
lancuster, спасибо, почитал)
DendyJunior3:

--- Цитата: lancuster от 20 Сентябрь 2016, 23:27:30 ---Чуть позже, возможно, выложу ещё дополнение, как делать бесконечные жизни, сердечки, оружие и прочее
--- Конец цитаты ---
лучше напиши как менять кнопки А и В местами, это пока единственное что мне нужно от хакинга
lancuster:

--- Цитата: DendyJunior3 от 21 Сентябрь 2016, 00:18:20 ---лучше напиши как менять кнопки А и В местами, это пока единственное что мне нужно от хакинга

--- Конец цитаты ---
Ты удивишься, но я тоже хочу это узнать.  :)

Добавлено позже:
Да, и лучше бы ты первый урок прочитал, чтобы в дальнейшем знать, что и как делать, чтоб не переспрашивать по тыщу раз. ;)
neoborg:

--- Цитата: lancuster от 21 Сентябрь 2016, 00:19:48 ---напиши как менять кнопки А и В местами
--- Конец цитаты ---
первый вопрос по делу) класс
lancuster:
Ну, а я пока продолжу:
     Первый урок вышел достаточно длинным, чтобы вписывать в него что-то ещё. Поэтому выкладываю дополнение отдельной темой - "Как сделать бесконечные жизни и пр.."
    Если вы уже прочли предыдущую статью - значит, вы уже знаете, что нужно делать.
    Открываете ром, заходите в Debug->Debugger, вводите в появившееся окно 075A, ставите галочку на Write и нажимаете ОК. Затем традиционно идёте на гумбу и сливаете жизнь. В этот момент сработает брейкпоинт:

    То, что выделено на скриншоте (на что указывает стрелка сбоку) - это и есть код уменьшения жизни (сокр. англ. DEC - DECREASE | Уменьшение). Его необходимо затереть. Для этого переходим по указанному адресу в ROM к данным трём байтам и делаем вот это:

Теперь значение будет записываться в LDA, а не будет уменьшаться, как было изначально.
Можно было затереть все три байта вот так: EA EA EA. Но к Супер Марио это неприменимо, так как после потери жизни вы получите game over.
Так что - да, в некоторых играх тупое затирание байтов типа этого:

--- Цитата ---EA - NOP
EA - NOP
EA - NOP

--- Конец цитаты ---
не прокатит. В таких играх нужно заменять только один байт, но (!) на специальные значения. Вот так:

--- Цитата ---85 - A5
C6 - A5
CE - AD
8D - AD
9D - AD

--- Конец цитаты ---
Если будут выражения типа 99 ХХ ХХ - тогда, конечно, прокатит затирание байтов EA-шками.
... Ну, и, разумеется, делаем Save ROM или Save ROM As.
Спасибо за внимание! ;)
krocki:

--- Цитата: DendyJunior3 от 21 Сентябрь 2016, 00:18:20 ---лучше напиши как менять кнопки А и В местами, это пока единственное что мне нужно от хакинга
--- Конец цитаты ---
Да это вроде как не сложно сделать...хотя с некоторыми ромами приходится иногда мудохаться.
К примеру ищем адрес зажатой кнопки "А", дальше дебажим и ищем инструкцию которая отвечает за нажатие ну или по коду делаем анализ дальше если сразу путного ничего не нашли...находим инструкцию типа сравнения ну и меняем дальше её сравнение на значение "В"...ну так же находим "В" и меняем на "А" вроде усё. ;)
lancuster:
Так "подробно" всё объяснил. Прям не придерёсси... :lol:
lancuster:
Урок № 2: Редактирование титульника
Итак, мы с вами научились находить переменные, отвечающие за жизни, менять их количество, а также делать бесконечными жизни и энергию. В данном уроке мы рассмотрим титульный экран ещё одной, не менее известной игры на NES - Ghosts'n Goblins.
Но перед тем, как приступить непосредственно к редактированию самого титульника, скажу пару слов о строении титульников в NES играх. Титульные экраны могу составляться либо микроблоками (тайлами 8х8 пикселей), так и макроблоками размерами 2х2 тайла. В некоторых играх используется оптимизация кода засчёт упрощения оформления повторяющихся строк (для примера: чтобы не писать "48 48 48 48 48 48 48 48 48 48", некоторые разработчики оформляют данную строку более кратко: "0A 48", что означает 10 байт одним тайлом). Подобные ухищрения проводятся в основном для экономии места в коде.
В данной же игре нам не придётся расшифровывать код титульника, ибо в ней титульник полностью открыт. Более того - он оформлен микротайлами, что удобно для его редактирования.
Открываем ром Ghosts'n Goblins (U) [!].nes на эмуляторе FCEUX 2.2.3, дожидаемся загрузки титульника, затем нажимаем на клавишу "\" (чуть выше Enter). Эмулятор перейдёт в режим паузы (будет виден значок в правом нижнем углу). Делается это для того, чтобы в процессе редактирования игра не проигрывалась сама собой и не отвлекала вас, а сам титульник был перед глазами. Отключить паузу эмулятора можно, зайдя в Debugger и нажав Run.
Теперь, когда титульник перед вами, вам нужно выяснить, как же он устроен. Для этого заходите в Debug->Name Table Viewer. Появится окно, в котором вы можете изучить строение титульника, наводя курсор на определённый тайл и узнавая его значение:

Также будет отображаться его положение на экране и адрес в PPU, но это нам не нужно, так как мы хотим постоянный результат. Так что снова лезем в Debug->Hex Editor и снова переключаемся в ROM File. Теперь разворачиваем окно Name Table Viewer и смотрим значение первого тайла титульника. Хекс редактор также должен быть включён (как на скрине). В хекс редакторе заходим в Edit->Find... и вписываем все значения с первого тайла в окно поиска:

Желательно написать больше значений, чтобы сразу найти нужное нам место. Только смотрите, пишите внимательно, не ошибайтесь - в Name Table Viewer нет сетки, показывающей границы тайлов, а потому съехать вниз или вверх и ввести значение с другой строки запросто можно.
Итак, вы ввели первую строку титульника и тут же её нашли. Жмём повторно на кнопку и убеждаемся, что больше совпадений нет. Это то, что мы искали. На скрине для удобства выделена вся первая строка. Теперь для наглядности мы попробуем затереть эту строку. Смотрим в Name Table Viewer, какое значение отвечает за пустоту. Это значение FF. Смело вводим это значение на всю строку.
Нажимаем Reset или Power, зажимаем "\" и дожидаемся титульника (можно ускорить это дело, зажав также кнопку Tab).
Мы видим, что у нас получилось затереть первую строку:

Таким образом мы может переделать весь титульник. Чтобы точно знать, на что будете заменять существующие значения, сверните или закройте Name Table, и откройте параллельно с хекс-редактором PPU Viewer (Debug->PPU Viewer):

И точно так же глядите значения тайлов и вбивайте их в хекс.
Но чтобы результат был более приемлемым - вам придётся придумать, как вам оформить новый титульник, а также предварительно перерисовать графику в тайловом редакторе типа YY-CHR или Tile Layer Pro. Но об этом мы узнаем в следующем уроке.
Благодарю за внимание! :)
Крылатый Кот:
http://pscd.ru/forum/index.php?/forum/27-uroki-dokumentatciia/ - сюда ещё можно продублировать эту тему, может там найдутся помощники
neoborg:
Крылатый Кот, там уже паутиной все покрылось, ну их нафиг.
lancuster:
Я бы так не сказал. Просто там людей толковых мало. Как и здесь, впрочем. :)
krocki:

--- Цитата: lancuster от 21 Сентябрь 2016, 06:00:45 ---Так "подробно" всё объяснил. Прям не придерёсси... :lol:
--- Конец цитаты ---
Ну не буду же я подробно всё описывать...много времени уйдёт...да и грамотно надо описывать, что бы понятно было. <_<
Будет много времени...возможно свой учебник накалякую по гейхакингу...хотя ща много видео обзоров есть по этому делу! ^_^
lancuster:
Например? По перемене кнопок есть?
neoborg:
уровень ромхакинга "новичок" уже готов примерно на 20%
lancuster:
neoborg, про граф.редактор статью выкладывать?
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии