Навигация по сайту
- Игры / Образы
- Игры на русском языке
- Коды / Советы / Секреты
- Наши переводы
- Наши проекты
- Игры на русском языке (OnLine)
- Эмуляторы
- Обзоры игр
- Информация
- Статьи
- Интервью
- Мануалы / Инструкции
Случайная игра
Вступай!!!
Облако тегов
Показать все теги
Все необходимое для работы
FCEUX - эмулятор, на котором ты будешь работать. В нем есть все что нужно для ромхакинга. Здесь я описывать его не буду, более подробно я расскажу о нем в ходе твоего обучения. В моей сборке 2 exe'шника с разными версиями, я в основном пользуюсь старой версией 2.2.2 по некоторым причинам, и в большинстве случаев примеры в учебнике будут с нее. Храни ромы в папке ROMS, чтобы не валялись где попало на диске.
HashTab - для вычисления контрольных сумм файлов. После установки в свойствах файла появится вкладка с хеш-суммами, откуда их легко скопировать и сравнить с другим файлом. Эта программа пригодится тебе при выкладывании хаков на romhacking.net для указания всей необходимой инфы про оригинальный ром.
HexCmp - для сравнения байтов двух ромов. Удобно искать баги, вызванные своим же кодом. Если у тебя в старой версии рома все стабильно, а в более свежей версии начались баги, сравниваешь оба рома и находишь причину.
HxD - отличный альтернативный Hex-редактор. Его я использую чтобы быстро выделить нужные мне байты рома для переноса их в мою многоигровку, потому что делать это через встроенный Hex-редактор эмулятора очень геморройно. Также с его помощью можно расширить ром. Для всего остального мне хватает эмуляторного.
Lunar IPS - для создания патча. Патч - это файл, который содержит в себе информацию о различии между двумя ромами. Например ты взял оригинальный ром, изменил в нем что-то, и сохранил отдельно. Теперь у тебя 2 разных рома, оригинал и твой хак. С помощью этой программы ты создаешь патч, который уже содержит в себе информацию о том, что ты изменил, и ты можешь наложить этот патч на оригинальный ром, чтобы из оригинального рома получился твой хак. Патчи считаются более-менее легальным способом выкладывания своих хаков, поскольку патч не содержит в себе игру, а только отличия одного рома от другого. То есть ты не нарушаешь закон выложив этот патч. Закон нарушит тот, кто им воспользуется. На сайтах вроде romhacking.net тебе потребуется выложить именно патч, поскольку выкладывать сам хак запрещено.
YY-CHR - для редактирования графики. Очень удобная программа, про работу с ней я расскажу в будущем.
Калькулятор - стандартный калькулятор Windows 7. В нем жмешь Вид - Программист. Этим калькулятором ты будешь пользоваться очень часто.
И последняя, но не менее важная вещь. Тебе нужна возможность быстро что-то записать в любой момент времени. У меня есть своя приватная группа Вконтакте. В ней созданы отдельные темы для тех игр, которыми я занимаюсь. Если я что-то придумаю, я сразу это записываю. Также помни, что твои хаки на вес золота. Рекомендую использовать бэкапы на облаке с регулярной синхронизацией, я сам пользуюсь облаком mail. Всегда храни все версии своих хаков, и старайся сохранять отдельные хаки как можно чаще, особенно пока ты еще учишься. Чем больше промежуточных сохранений, тем проще искать и исправлять свои ошибки.
Новичок
На этом уровне ты получишь всю необходимую предварительную информацию для базового ромхакинга.
Полагаю, ты уже знаешь что такое ROM-файл. Ром - это образ игры для эмулятора. Если точнее, это двоичный файл, содержащий копию данных из микросхемы картриджа. Чтобы поиграть в игру, тебе надо найти ром этой игры. Для эмулятора Денди (Nintendo Entertainment System, или коротко NES) нужен ром-файл с расширением .nes.
Для начала уточню, что отныне работать предстоит с шестнадцатеричной системой счисления (HEX). Отличия от привычной нам десятичной (DEC) в том, что в HEX, чтобы добраться от 00 до 10, нужно перебрать 16 чисел: 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, и только потом идет 10. 0A в HEX это 10 в DEC, 0B в HEX это 11 в DEC. 10 в HEX это 16 в DEC. Чтобы все это не запоминать, для удобства перевода из DEC в HEX и наоборот тебе нужен калькулятор. Также помни, что байт 00 тоже используется в HEX, поэтому если в игре отсчет идет например с 00 до 05, это 6 разных чисел, а не 5 (00, 01, 02, 03, 04, 05).
Байт - число в HEX.
0325 - адрес под номером 0325 (в некоторых документах можно встретить обозначение 0325h).
5E - байт 5E.
01011110b - разбор байта 5E на биты (двоичная система BIN). Буква b означает, что этот набор из 8 цифр является разбором байта на биты. Биты всегда указываются с седьмого по нулевой, слева направо. Разбор байта на биты тебе может понадобиться в будущем.
0 1 0 1 1 1 1 0 b
7 6 5 4 3 2 1 0 - порядковый номер, используется обозначение бит7, бит6... бит0
Настройка эмулятора
Чтобы освоить интерфейс, сначала открой ром. Для обучения я предлагаю тебе игру Battle City (танчики), который ты найдешь в папке ROMS. Запусти fceux.exe 2.2.2, нажми File - Open ROM, выбери Battle City (J) [!].nes. Смотри видео или читай инструкцию по настройке.
Первым делом настраиваешь управление под себя. Эмулятор у тебя уже запущен, и на экране танчики.
В эмуляторе жмешь Config - Input (1, 2). Там где Port 1 жмешь Configure (3), откроется окно (4). Кликаешь мышкой на кнопку, допустим Up, откроется маленькое окошко (5), после открытия 2 раза жмешь на желаемую клавишу, окно автоматически закроется. Переходишь к следующей кнопке, и так пока не настроишь все в графе Virtual Gamepad 1. Жмешь внизу Close. Затем там где Port 2 жмешь на
Теперь надо настроить горячие клавиши эмулятора для твоего удобства. Жмешь Config - Map Hotkeys, ищешь в списке выделенные команды с картинки. Если что-то хочешь поменять, кликаешь дважды по команде, при появлении маленького окна жмешь один раз на нужную клавишу или комбинацию клавиш, окно закроется. Если после настройки управления у тебя клавиши совпадают с горячими клавишами эмулятора, находишь команду в списке, два раза кликаешь на нее, в маленьком окне жмешь Clear. На скриншоте показаны мои настройки, остальными клавишами я не пользуюсь.
• Power - программный сброс эмулятора, аналогичен полному выключению эмулятора из розетки и последующему мгновенному включению.
• Reset - аппаратный сброс эмулятора, аналогичен нажатию кнопки Reset на оригинальной приставке.
• Pause - пауза в эмуляторе. Работа эмулятора полностью замораживается.
• Frame Advance - первое нажатие аналогично Pause, при повторном нажатии эмулятор сделает шаг в 1 кадр. Чтобы снять паузу, нужно нажать кнопку, назначенную на Pause.
• Speed Down - замедлить скорость работы эмулятора.
• Speed UP - увеличить скорость работы эмулятора.
• Turbo - очень быстрая скорость работы эмулятора, для длительного эффекта нужно удерживать кнопку.
• Save State - сохраниться.
• Load State - загрузиться.
Далее по желанию делаешь отображение FPS на экране (1). Затем заходишь в настройки видео (2). Если выставишь зеленые галочки как у меня, сможешь удобно менять размер окна эмулятора без изменения соотношения размера сторон, а красная - мне нравится соотношение сторон TV, тут уж кому как. По желанию выставь фильтр изображения на экране, если тебе не нравится оригинальная пиксельная графика.
На этом все. Можешь немного поиграть, проверить управление в эмуляторе и горячие клавиши. Выбор слота для сохранения/загрузки клавишами 1, 2... 0.
Окно Hex Editor
Сам эмулятор можно использовать просто для игры, но ты собираешься научиться ромхакингу, поэтому разберем вспомогательные инструменты. Перейдем к изучению двух важнейших дополнительных окон эмулятора - Hex Editor и Debugger (про него будет рассказано в разделе с командами процессора). Во время работы с обоими окнами тебе нужно переключить раскладку клавы на английскую, чтобы ты мог прописывать байты буквами. Начнем с Hex Editor, в дальнейшем буду называть его просто хекс.
В эмуляторе жми Debug - Hex Editor. Я предпочитаю чтобы окно было растянуто от 000000 до 0001F0 (32 строчки). Кстати говоря, дальше я не буду называть первые два нуля. Я буду говорить 0000 и 01F0.
Во вкладке View можно переключиться на 3 разных режима, все они нужны для ромхакинга. В будущем я буду называть их NES, PPU и ROM соответственно. Рассмотрим каждый в отдельности.
NES Memory
Итак, что ты тут видишь? Большая таблица, по 16 байтов в строчке. Некоторые байты постоянно меняются. Такие байты по умолчанию подсвечиваются разными цветами, чтобы проще было что-то найти. Местоположение каждого байта называется адрес. В данный момент мой курсор находится на строчке 0050, 2й байт по счету = адрес 0051. По адресам можно перемещаться стрелочками на клаве.
Все, что ты тут видишь - оперативная память (RAM, или по-русски ОЗУ). RAM - энергозависимая часть системы компьютерной памяти, в которой во время работы компьютера хранится выполняемый машинный код, а также входные, выходные и промежуточные данные, обрабатываемые процессором (википедия). В данном случае компьютер это эмулятор. Если проще, RAM - это книжная полка со множеством отделов (адресов), и в каждой полке хранится одна книга (байт). В оперативке хранятся байты, которые могут меняться редко, часто, или не меняться вообще, все зависит от кода игры. Адреса могут отвечать за координату объекта по горизонтали или по вертикали, это может быть счетчик жизней, это может быть таймер, а байт это соответственно некое количество.
Окно хекса разделено на 3 части - начальные адреса, адреса и перевод байтов в символы, как например фраза RYOUITI OOKUBO. Здесь можно писать только цифры и буквы A, B, C, D, E, F, а здесь цифры, буквы и некоторые символы.
Продемонстрирую тебе что можно делать с этими адресами. Начни игру 1 Player, выбери 1й уровень. Сохранись когда на экране появится первый вражеский танк. Количество твоих жизней находится по адресу 0051. Сейчас там записан байт 03, а на экране справа указано 2 жизни. Иногда байт в оперативке может превышать на 1 количество жизней на экране, как в случае с танчиками, это зависит от кода игры.
В танчиках игра регулярно проверяет этот адрес на количество жизней, и отображает это количество на экране. Попробуй заменить байт в адресе на 04, и на экране сразу отобразится 3 жизни. Если тебя убьют, байт автоматически уменьшится на 1. Также игра регулярно проверяет адрес на то, что твои жизни уже закончились. Поэтому если ты пропишешь 00, сразу же вылезет надпись Game Over. Примечательно то, что ты можешь продолжать двигаться своим танком во время этой надписи. Это можно было бы назвать багом, но разработчики в 1985 году не могли знать что ты сегодня будешь менять количество жизней напрямую через оперативку, так что тут все нормально. Мы их прощаем.
Загрузи сохранение. Найди 2 адреса - 007F и 0080.
Оба адреса отвечают за количество вражеских танков, но у каждого своя задача. 007F это счетчик танков, которые еще не появились, то есть которые остались в запасе. Они отображаются справа на экране. 0080 это общий счетчик танков на уровне. При загрузке туда пишется байт 14, это 20 в десятичной системе, то есть на каждом уровне 20 вражеских танков. Оба адреса по-своему важны, но адрес 0080 в приоритете для прохождения игры, поскольку именно его игра проверяет чтобы закончить раунд когда там будет написано 00. Адрес 007F второстепенный, ты можешь например обнулить его (прописать 00), танки больше появляться не будут, но раунд не закончится. Кстати, на экране, в отличии от счетчика жизней, счетчик танков будет некорректно отображать количество при изменении байта через оперативку. Это зависит от кода игры, опять же разработчики не видели в этом необходимости, оригинальная игра работает как часы. Можешь побаловаться с этими двумя адресами.
Еще один пример. Выбей бонус из танка, но не подбирай его, сохранись. Найди адрес 0088, этот адрес отвечает за тип бонуса. В игре всего 7 бонусов, это байты от 00 до 06. Попробуй поменять байт, увидишь что бонус также меняется. Остальные байты не предусмотрены, начнет меняться графика бонуса на всякий бред, а при взятии такого бонуса игра может повиснуть.
И последние несколько адресов в этом уроке. Обрати внимание на адреса 0006-0009. Это адреса, которые отображают нажатые кнопки.
Адрес 0006 и 0008 отвечают за кнопки первого джойстика. В адресе 0006 показано удержание кнопок, если их нажать и не отпускать, он нужен для передвижения танка. В 0008 показано одноразовое нажатие кнопки, даже при удержании, этот адрес служит для стрельбы. Адреса 0007 и 0009 имеют такое же значение, но для второго джойстика. Игра считывает эти адреса и заставляет твой танк двигаться и стрелять соответственно. Ручная запись байтов по этим адресам ни к чему не приведет, код чтения джойстиков регулярно что-то в них записывает. Работа с адресами джойстиков тебе понадобится для изменения управления в игре, или добавления нового действия на разные кнопки. Например тебе вдруг захотелось сделать так, чтобы при нажатии кнопки Select тебе добавлялась +1 жизнь. Ок, не проблема, научишься. И как среди всей этой кучи искать все эти адреса, на которых ты сегодня практиковался, ты тоже скоро научишься.
Как видишь, байты в оперативке можно менять вручную. Это не всегда работает, иногда байт сразу же меняется обратно, как в случае с джойстиками. Однако есть способ насильно скормить игре нужный байт. Ставишь эмулятор на паузу, прописываешь в адресе нужный тебе байт, затем на нем правой кнопкой мыши - Freeze - Toggle. Все, байт зафиксирован, теперь он отмечен синим цветом, можешь снять паузу. Приведу пример на джойстике. Делаешь паузу, по адресу 0006 пропиши 10 (это байт нажатой кнопки Вверх), и заморозь его. Кстати, я не в курсе чем отличается Toggleот Freeze. Помню только то, что в первые дни моего знакомства с хексом Freeze как-то хуже работал чем Toggle, по крайней мере мне так запомнилось, короче отныне я пользуюсь только Toggle. В общем, я буду говорить заморозить байт в адресе, подразумевая Toggle. Вернемся к примеру. Если заморозить байт 10 и снять паузу, твой танк будет самостоятельно двигаться вперед, а ты в это время сможешь только стрелять.
Аналогично можно делать и с другими адресами, только не обязательно ставить эмулятор на паузу если и без нее все прекрасно меняется. Если заморозить адрес с жизнями - жизни станут безлимитными, адрес с количеством врагов - враги никогда не закончатся, адрес с бонусом - бонус всегда будет появляться один и тот же. Чтобы отменить этот эффект, нужно нажать на нужном адресе и выбрать Unfreeze (чтобы разморозить конкретный адрес) либо Unfreeze all (это разморозит все замороженные адреса, и в этом случае можно предварительно кликать на любом адресе).
Теперь рассмотрим распределение памяти в оперативке.
0000-07FF - основная оперативка. Вот некоторое типичное распределение памяти в этом диапазоне с которым я чаще всего сталкиваюсь. Но в каждой игре может быть по-разному.
0000-00FF - адреса с нажатиями джойстика, таймеры, счетчик кадров, адреса для рандома в игре, и прочие адреса, используемые для загрузки экранов игры.
0100-01FF - стек (про него поговорим позже). Стек по этим адресам будет всегда.
0200-02FF - адреса с атрибутами спрайтов (про спрайты будет рассказано в разделах с графикой). Для спрайтов отведено 16 строчек, их ни с чем не спутаешь. В танчиках атрибуты спрайтов тоже по этим адресам, это хорошо видно во время игры когда на экране несколько танков.
0300-06FF - адреса с координатами объектов и их характеристики.
0700-07FF - адреса для музыки.
0800-1FFF - основная оперативка дублируется 3 раза подряд. Тебе предстоит работать только с оригинальной (основной).
2000-5FFF - адресные регистры. На самом деле в процессоре не так много регистров. Про них я расскажу на более высоких уровнях.
6000-7FFF - память батарейки, если она есть. Батарейка нужна чаще всего в тех играх, в которых можно сохраняться. Но ее также можно использовать для удобного ромхакинга, про это будет рассказано на более высоких уровнях.
8000-FFFF - здесь расположены байты, которые в данный момент загружены в память процессора. По этим адресам находится сам код игры, а также различные байты данных, которые могут использоваться в основной оперативке, например скорость объектов, высота прыжка, звуки мелодий, текст, и многое другое. Область 8000-FFFF размером всего 32кб. Поскольку процессор Денди умеет обращаться только к адресам в диапазоне 0000-FFFF, а большинству крупных игр для работы недостаточно 32кб памяти, игры используют так называемое переключение банков, а метод и возможность переключения зависят от маппера. Обо всем этом будет рассказано на более высоких уровнях.
PPU Memory
По адресам 0000-1FFF никогда не меняй байты вручную без предварительного сохранения, потому что изменения нельзя откатить комбинацией клавиш Ctrl+Z.
Здесь находится видеопамять - графика заднего фона и движущихся объектов (спрайтов), а также цветовая палитра.
Про все это будет рассказано в разделах с графикой. Если хочешь уже сейчас мельком взглянуть как выглядит графика, открой fceux 2.2.3, выбери Debug - PPU Viewer, и поставь галочку.
Правой кнопкой мыши на левом и правом окне ты изменишь цвет.
ROM File
Здесь ты увидишь то, из чего состоит ром. В окне эмулятора нажми Help - Message Log. Ты увидишь вот такую инфу:
Разберем что значит каждый пункт.
PRG ROM - размер памяти PRG, то есть код игры и различные байты данных.
CHR ROM - размер памяти CHR, то есть байты для графики - задний фон и спрайты (объекты на экране).
В обоих случаях число перед x означает количество банков, в данном случае всего 1 банк PRG и CHR. Это очень немного, но для танчиков вполне достаточно.
ROM CRC32 и ROM MD5 - контрольные суммы, которые эмулятор почему-то вычисляет неправильно.
Mapper # и Mapper name - номер и название маппера.
Mirroring - метод отображения фона в видеопамяти.
Battery-backed - наличие батарейки.
Trained - точно не знаю что это, тебе это не пригодится.
Эти данные, за исключением контрольной суммы, эмулятор считывает из рома по адресам 0000-000F. Эти 16 байтов называются iNES header, или заголовок, или хэдер. Они нужны чтобы эмулятор понимал как именно ему эмулировать данный ром. Первые 3 байта обязательно составляют слово NES. В картридже нету этой строчки, она там просто не нужна. Хэдер удобно редактировать через эмулятор Nestopia при помощи File - Edit iNes Header, или может есть какие-то другие специальные программы, не в курсе. Хекс редактор эмулятора fceux не позволяет его редактировать, однако любой другой сможет. Заранее скажу, что если просто изменить хэдер, ничего хорошего из этого не выйдет, игра скорее всего перестанет запускаться, нужны дополнительные манипуляции с ромом.
В ROM всегда сначала идут байты RPG, затем CHR. Из лога мы видим что размер рома состоит из 16кб PRG (адреса 0010-4000), а CHR 8кб (адреса 4010-6000). CHR очень легко отличается от PRG по внешнему виду, это придет с опытом. Можно просто кликнуть на интересующее место в ROM, и окно эмулятора скажет тебе где ты сейчас, в PRG или CHR.
Кстати, не во всех играх присутствует CHR, иногда игры загружают байты из PRG напрямую в видеопамять, в этом случае такие байты тоже легко можно найти на глаз.
Про CHR поговорим в разделах с графикой, в данный момент нас интересует PRG. Как я уже говорил, здесь находится код и данные игры, а ромхакинг заключается в том, чтобы заменять некоторые байты на свои, к примеру увеличить количество жизней, или прописать свой собственный код чтобы игра вела себя по-другому. Измененые байты будут подсвечиваться красным цветом, отменять изменения можно комбинацией клавиш CTRL+Z. Для того, чтобы знать что и как нужно менять в роме, тебе нужно понимать команды процессора, про которые ты узнаешь в следующем разделе. За исключением хэдера, любые другие байты можно редактировать.
Начнем с простого, освоим поиск (работает в любом из трех разделов View). Нажми комбинацию Ctrl+F, появится окошко.
Direction - в какую сторону искать, Up - вверх, Down - вниз. Теперь Type, это режим поиска. Hex - поиск по байтам, Text - поиск по тексту.
Для тренировки возьмем надпись RYOUITI OOKUBO. Окно с поиском можно не закрывать, просто отодвинь в сторону. Сначала выдели байты этих слов по адресам 0050-005F и нажми Ctrl+C.
Переключись на NES, вставь байты в поиск Ctrl+V, выбери режим Hex и нажми кнопку Find Next, тебя перекинет на местоположение результата поиска. Ты найдешь 6 результатов поиска, дальше поиск пойдет по кругу.
Теперь скопируй саму надпись RYOUITI OOKUBO, но уже справа, где буквы, и сделай те же действия поиска повторно, выбрав режим Text.
После поиска переключи назад на режим Hex. Поиск в неправильном режиме будет выдавать ошибку.
Затри эту фразу, прописав байты FF в левой части. Затем повторно пропиши FF поверх уже написанных FF.
Удерживай Ctrl+Z для отката изменений.
Теперь попробуй прописать любую фразу на английском справа, уложившись в эту строчку.
Откати изменения.
Учебник по ромхакингу NES
Автор учебника BZK
Автор учебника BZK