Разработка для Dendy/NES/Famicom
Аноним05/10/16 Срд 01:49:59№24381
2Кб, 311x62
Ни для кого не нужный, кроме меня, тред о разработке игр для Dendy/NES/Famicom.
Есть ли здесь разработчики, которые могут пояснить, что лучше приобрести в плане качества и приближения к работе оригинальной приставки: какой лучше клон Денди, или придется покупать Фамиком? (на аутентичную НЕС нет денег.)
>>2442 Крутые игры. Разработку освоил, на эмуляторе запускал. Что, если хочу запилить собственный маппер? Его нужно прототипировать и делать это примерно параллельно с разработкой игры, чтобы понять, каким может быть маппер и как с ним интерфейсить
>>2449 Звучит неплохо. А как у тебя вообще с электроникой? Плату картриджа развести сможешь? И почему не хочешь вбрасывать? Собираешься сразу выпускать на физическом носителе?
>>2441 Посоветуй, что почитать начинающему? Пока изучаю дебаггер FCEUX и ассемблер 6502. До этого приходилось писать на асме под DOS и ZX Spectrum, но это было давно, в далеком детстве, сейчас многое уже забыл.
Хочу сделать хак Mario Bros с разными персонажами (в оригинале Луиджи - спрайт Марио с другой палитрой), реально ли это?
Репост с загнивающего петухленда. Это больше про взлом, модификацию уже существующего кода.
[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, вы получите:
>>2479 Как видите, количество переменных резко уменьшилось. Нажимаем ещё раз, чтобы отсеять те, которые меняются в данный момент игры. Теперь их стало ещё меньше, верно? Чтобы знать наверняка, что изменится после потери жизни - выставляем условие поиска: Less than - Previous value. Это позволит выделить те переменные, что изменились после потери жизни. Теперь идём и напарываемся на гумбу. Смотрим внимательно на результаты в RAM Search. Даже без повторного поиска видим, что переменная 075A стала 1, была 2, а количество изменений равно 1. Чтобы убедиться в этом - нажмите правой кнопкой мыши на этой переменной. Вы попадёте в HEX Editor - шестнадцатиричный редактор - где курсор будет стоять на этой переменной (как на этом скрине). И вводите, к примеру, 08 вместо текущего значения. После потери жизни их станет 8 (нумерацию жизней в этой игре я уже написал). Если произошло так, как я написал - значит, вы нашли значение жизней. Теперь осталось лишь ввести нужное вам значение в ROM и сохранить результат для дальнешего использования. Для этого жмём на самом значении правой кнопкой мыши и выбираем Add Write Breakpoint For Address 075A:
>>2480 Тут же откроется отладчик. Сворачивайте его. Если закроете - придётся залезать в Debug->Debugger и включать его заново. Жмём Reset (или Power, роли не играет). И тут же наш брейкпоинт срабатывает. В данный момент значение А переменной равно нулю, так что пропускаем это, нажав Run в отладчике. И в этот раз значение А переменной равна нулю, снова жмём Run. Теперь мы видим, что значение стало равно 02. Это - то. что мы искали:
>>2481 К слову, при наведении на нужную нам строку в самом низу отладчика отображается местонахождение этого выражения в ROM. Запоминаем эту строку, заходим в HEX-editor, View-ROM File, и находим это место. Меняем 02 на какое хотите (желательно не выше 63 (62) - в хексе это 99). Да, если хотите сделать конкретное значение - вам понадобится Калькулятор, а точнее - инженерный Калькулятор. В поле вводите любое число в десятичной (DEC) системе (например, 20), переключаетесь в HEX - получаете 14. Именно HEX значения вам понадобятся в ромхакинге. :) Второй способ: нам известно значение в RAM - тогда включаем HEX Editor и переходим к этому адресу. Для прокрутки я использую кнопки PgUp и PgDn. Можно также перейти напрямую по адресу, зайдя в хексе File->Goto address и вписав туда полученный адрес. Делаем, как на этом скриншоте:
>>2482 Дальше - также меняете значение и жмёте Save ROM, чтобы сохранить изменения в текущем роме, или Save ROM As, чтобы сохранить изменения в новом роме, не меняя текущий:
>>2483 Собственно, подобным образом можно не только накручивать жизни и сердечки в играх, но ещё и увеличить время, скорость персонажей и многое-многое другое. ;) P. S.: также рекомендую вам скачать и установить утилиту Insectduel_s SMB Utility Rus.exe, с помощью которой вы сможете в Супер Марио задать количество жизней одним кликом, указать количество миров, изменить время, свойства уровней, превращения Боузера после смерти, переделать все уровни, задать их тип и погодные условия, а также переписать интро игры. Для изменения заставки игры я рекомендую использовать smbte10b.zip. Правда, нужно учесть, что место на заставке не резиновое, за поля залезать нежелательно, иначе изменения не сохранятся.
Первый урок вышел достаточно длинным, чтобы вписывать в него что-то ещё. Поэтому выкладываю дополнение отдельной темой - "Как сделать бесконечные жизни и пр.." Если вы уже прочли предыдущую статью - значит, вы уже знаете, что нужно делать. Открываете ром, заходите в Debug->Debugger, вводите в появившееся окно 075A, ставите галочку на Write и нажимаете ОК. Затем традиционно идёте на гумбу и сливаете жизнь. В этот момент сработает брейкпоинт:
>>2485 То, что выделено на скриншоте (на что указывает стрелка сбоку) - это и есть код уменьшения жизни (сокр. англ. DEC - DECREASE | Уменьшение). Его необходимо затереть. Для этого переходим по указанному адресу в ROM к данным трём байтам и делаем вот это:
>>2486 Теперь значение будет записываться в 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.
>>2477 Читать wiki.nesdev.com, я почти все там нашел.
>Хочу сделать хак Mario Bros с разными персонажами (в оригинале Луиджи - спрайт Марио с другой палитрой), реально ли это? Да, но, если не менять маппер, придется выкинуть пару квадратиков графической информации, так как там пространство забито.
>>2492 Mario Bros, а не Super Mario Bros, братюнь. Игра, где двое братишек пытаются съебаться из замкнутого темного помещения через трубу, отвинтив вон ту хуйню.
>>2489 Думаю, можно выкинуть нахуй раков, оставив из врагов только купа черепах (их планирую перерисовать в зеленых слоников) и мух, которые мешают спать. За вики спасибо, уже нагуглил.
>>2505 Было бы убергодно, конечно, реализовать зеленого слоника в Марио. Но вместо того чтобы что-то вырезать, можешь покопаться в улучшенных версиях, где есть маппер.
Mario Bros. Classic. Выходил в Европе, более точно повторяет аркадный оригинал. Есть катсцены, и можно менять направление в прыжке. https://youtu.be/zll16wdrnsM[РАСКРЫТЬ] Kaettekita Mario Bros. Версия для FDS. Добавлена реклама и новый игровой режим, плюс, можно сохраняться. https://youtu.be/SsjPIgE-smI[РАСКРЫТЬ]
О, какой интересный тред. Я тоже хочу вкатиться в несдев, пробовал курить техдоки, пока что ничего толком не понятно. С ассемблером, думаю, проблем не будет (владею несколькими).
Возможно то и другое, как по отдельности так и совмещение. Си (сс65) + neslib + famitone2 - очень хоршая база, чтобы вкатиться, освоиться и развиваться. Этих сей вполне хватает на игру уровня супермарио, ну и прототипировать на сях удобно. Сам пока что пишу на сс65, постепенно углубляясь под капот в ассемблер.
Нужно написать какую нибудь инструкцию, как выводить графен, опрашивать джойстик, загружать уровень, и двигать объекты. Пусть погромируют, кому не лень. Это же очень простое железо, главное понять.
Я вобще руководствовался книжками: GameDevNES.chm Архитектура и программирование Dendy.doc Язык Ассемблера для персонального компьютера ЭПЛ У.Моррер 1987.djvu
Через месяц, после возникновения желания разобраться в программировании под NES, уже был была сделана загрузка одноэкранного уровня, со спрайтом, который даже умел прыгать и взаимодействовать с окружением. Потом я всё забросил.
Сейчас решил доделать начатое.
Не рекомендую ковырять чужие исходники, кто не умеет программировать, потому что желание отпадёт этим заниматься. Я до сих пор в ахуе от чужих исходников, нихуя не понимаю, что там хотели сказать такой кашей.
Если пишем на Си, то все инструкции есть в neslib.h. Там весь базис собран в виде библиотеки, нужно только настроить ROM под нужный маппер и вперёд. С асмами всякими знаком, но 6502 кажется уберущербным с его аккумулятором и двумя индексными регистрами. Новичкам (особенно тем, кто вообще не знает никакого асма) вкатываться в такой асм будет довольно болезненно. Но ничего нет невозможного, конечно.
lda #$00 ;записать мусор для спрайта sta $2006 lda #$00 sta $2006 lda #$FF sta $2007
jsr video_init_1 game: ;цикл jsr sprite_
jsr delay_wait jsr delay
lda #$02 ;загрузка спрайтов из $0200 sta $4014
lda #$00 ;сбросить скроллинг sta $2005 sta $2005 jmp game ;* sprite_: inc <$00 inc <$01 lda <$00 sta $0200 lda #$00 sta $0201 lda #%00000000 sta $0202 lda <$01 sta $0203 rts ;*** memory: ;чистим мемори ldx #$00 memory_: lda #$00 sta <$00, X sta $0200,X sta $0300,X sta $0400,X sta $0500,X sta $0600,X sta $0700,X inx bne memory_ rts ;*** delay: lda $2002 bpl delay rts
delay_wait: lda $2002 bmi delay_wait rts ;*** video_init_1: ;увеличение адреса +1 по горизонтали lda #%00101100 sta $2000 lda #%00011000 sta $2001 rts video_init_0: ;видео lda #%00000000 sta $2000 lda #%00000000 sta $2001 rts ;*** palette_load: lda #$3F ;палитра BG sta $2006 lda #$00 sta $2006
ldx #$00 ldy #$00 palette_load_bg: lda pal, X sta $2007 inx iny cpy #$10 bne palette_load_bg ; rts ;*** lda #$3F ;палитра sprite sta $2006 lda #$10 sta $2006
ldx #$00 ldy #$10 palette_load_spr: lda pal, X sta $2007 inx iny cpy #$20 bne palette_load_spr rts ;*** video_memory: ;чистка видео lda #$20 sta $2006 lda #$00 sta $2006
> ... чтобы издавать игру в железе... Это будет коммерческий провал, ты ведь понимаешь? Никто не будет покупать эти игры в "железе"/ физ.носителе. Тебе надо всеми силами пытаться залезть со всем этим своим творчеством на плеймаркет.
Эмуляторы и всякие официальные отладчики для nes игр, я бы тоже не советовал задрачивать. Делай всё под исполняемый файл. (APK, EXE..) Напиши движок для графики и скриптов. Начни всё абсолютно с нуля, но обязательно сохранив исконные NES ограничения!! . Чтобы сохранить весь колорит игр той эпохи. Что я именно имею ввиду: - Звук 8 битный. - Ограничения в графике проработай. Чтобы тайлы были с такой же палитровой спецификой. (Не лепи все 65536 цветов туда.
Пустой движок напиши хотя ты для игр. Проработай горизонтальный и вертикальный scroll . Анимацию сменой тайлов. Проработай клавиши/жесты управления. Должно получиться пустое, но логически законченное приложение, весом не более 150-200 КБ (я предполагаю).
Это по идее будет некий каркас универсальный, который уже можно будет потом наполнять контентом (Тайлы, мелодии) и фантазией (скрипты).
Замути какой-нибудь свой простенький скриптовый яз. Типо
? A+2=10 ! >> A++ <<
(пример)
Когда будешь движок писать, не тули все в один exe. Делай грамотно, раскидывай все uses'ы в разные DLL. Или не uses'ы, а include если на сишной среде работаешь. Всё в разных библиотеках реализуй. Чтобы можно было с лёгкостью под андроид портировать в дальнейшем. (Собственно это наверное и есть на сегодняшний день основная целевая платформа)
В картриджи вшивать (или же в NES формат) сегодня, это утопия полнейшая. Делай для современных платформ. Главное соблюдай техническую и визуальную стилистику игр. И найдется на них свой фанат.
У меня были идеи подобные пару лет назад. И даже царапал там что-то помню на Delphi. Я на DirectX графику почему-то ударение ставил тогда. Это и скорость, и кроссплатформенность как никак.
>>4281 >Никто не будет покупать эти игры в "железе"/ физ.носителе. Да ты что? Как раз таки на реальных картриджах NES, Sega и прочую ретропродукцию и покупают. Только не в этой стране.
>>4285 Задавай ответы, если не забуду заглянуть в этот мертвый тред.
Мимо ретродевелопер, около десятка законченных проектов для ретроплатформ.