Как создать свою игру про соника на телефон
Внимание! Nintendo Россия анонсировала расширение гарантии до двух лет. Решение ретроактивно!
МВД проверит Netflix на соблюдение закона о запрете пропаганды ЛГБТ среди несовершеннолетних
Universal призвала Николаса Кейджа на роль графа Дракулы
Во что вы сейчас играете?
Resident Evil 2 Remake
Абсолютно все про Resident Evil
UHD телевизоры для игр и кино (4K)
Кто какую музыку слушает?
Из-за нехватки хороших игр фанаты Соника не оставляют попыток создать по-настоящему крепкий проект по легендарной франшизе SEGA своими силами. Одной из таких последних "самоделок" стала Sonic: Project Hero - новая 3D-игра про синего ежа, создаваемая энтузиастом-одиночкой Hero на движке Unity.
После длительного периода разработки автор сумел подготовить играбельную демку игры для неофициальной выставки Sonic Amateur Games Expo 2019, которая теперь также доступна для бесплатной загрузки всем желающим. К сожалению, игра еще далека от своего завершения, поэтому пробник содержит лишь черновой вариант локации без текстур и прочих деталей.
Тем не менее, даже в нынешнем состоянии проект выглядит весьма неплохо, особенно это касается плавности анимации, выполненной на высоком уровне. Кроме самого Соника, в демо-версии также представлены его друзья, в том числе Тэйлз и Наклз. Камера, как уточнил разработчик, пока немного шаткая, но ситуацию можно улучшить простой активации инверсии по оси Y в настройках.
Учитывая последние тенденции, владельцы прав на Соника могут легко вмешаться в производство и прикрыть разработку Sonic: Project Hero, однако в этом плане SEGA обычно придерживается более мягкой позиции - в свое время компания и вовсе превратила фанатскую Sonic Mania в официальную игру.
Добавляйтесь в наш Telegram-канал по ссылке или ищите его вручную в поиске по названию gmradost. Там мы публикуем в том числе и то, что не попадает в новостную ленту.
Подписывайтесь на наш Telegram канал, там мы публикуем то, что не попадает в новостную ленту, и следите за нами в сети:
Для создания фан-игр по сонику, нам понадобятся следующие файлы:
Как только вы все скачаете и установите, откройте ClickTeam Fusion 2.5.
Разбираемся с движком.
В нем откройте файл движка соника Not So Simple Sonic Worlds Plus.
Далее, откройте фрейм нашего уровня, в нем мы будет создавать уровень.
Автор движка, советует поставить привязку по сетке. Что мы и сделаем.
Сначала, нажмите на кнопку Grid Setup.
И укажите привязку по сетке, как на картинке.
Можете удалять объекты в серой области, но, если появится следующее окно.
И вставляете элементы, в нужных вам, позициях. Таким образом, и создается уровень.
Поговорим об объектах.
Указывает место, в котором появляется игрок (по умолчанию, это соник).
Теперь, научимся создавать мертвые петли.
У синей трубы и красной трубы, можно убрать коллизию. Например, при соприкосновении с этим объектом:
У красной трубы появляется коллизия, а у синей исчезает (через неё можно пройти). Тогда как, если столкнуться вот с этим объектом:
С мертвой петлей разобрались. Перейдем к мотобагам.
С помощью красного и синего объекта, мотобаг, можно повернуть в обратном направлении,
При соприкосновении с синим объектом, мотобаг поворачивается влево.
Вот эти объекты:
Блокируют путь крабам. Кстати, крабов лучше ставить на земле, так как у них, почему-то, нет гравитации.
Чтобы поставить чекпоинт, используйте Lamp Post Spawner.
Окончание уровня задается через GoalMaker. С этим объектом нужно быть осторожным.
Дело в том, что если ты находишься в Finish Zone, то ты уже прошел уровень.
Таким образом, если ты поставишь GoalMaker левее соника, то уровень закончится, не успев начаться.
Основное разобрали, теперь вы можете запустить свой уровень. Кстати говоря, мой уровень выглядит так:
Далее я расскажу:
- Как добавить следующий уровень.
- Как поменять музыку на уровне.
- Как, cкомпилировать игру
Меняем музыку на уровне.
Видим еще одну рекомендацию автора движка. Использовать Event List Editor, вместо Event Editor.
Автору виднее, используем!
В блоке [Music], найдите эвент проигрывания музыки, и измените его.
Нажмите на нижнюю кнопку Browse, чтобы добавить свою музыку.
Музыка добавлена, теперь разберем, как добавлять новые уровни.
Добавляем новый уровень.
Для начала, создайте дубликат своего уровня (Ctrl+C/ Ctrl+V).
Выберите Event List Editor, и убедитесь, что выбран нужный вам уровень.
Далее, измените следующий уровень. Ниже я объяснил, как это делается.
Меняем начальный уровень.
И меняем начальный уровень.
Компилируем
Чтобы собрать нашу игру в exe файл нужно,выбрать File -> Build -> Aplication.
Заключение
Фух, дописал. Разумеется в этом гайде, я не рассмотрел как делать фон, добавлять врагов и боссов. Но, для первого урока, думаю этого достаточно. В любом случае, теперь вы можете создавать свои fan-made игры по сонику. Надеюсь данный гайд, оказался вам полезен.
Новые невероятные приключения знаменитого ежика Соника с его новыми друзьями.
v3.1.0 Premium + Мод: много денег
Интересный раннер от студии SEGA про знаменитиго ёжика Соника.
v4.28.0 Premium + Мод: много денег
Возвращение хита игровых приставок 90х годов о приключениях быстрого и прыткого ежика Соника
Официальная Андроид версия популярного платформера от SEGA.
Отличный платфоремер где вы будете помогать Сонику спасти Эми Роз.
Продолжение культового платформера от студии SEGA.
Отличный раннер на андроид, где вы будете бегать в режиме реального времени с игроками со всего мира.
Замечательный джампер от Сега с знакомым всем героем – Соником.
v1.6.1 + Мод: много денег
Продолжение знаментиых приключений ежика Соника. Теперь в ваших рядах появился союзник в лице доктора Эггмана, и как всегда, с вами - друг Тейлз.
Sega выпустила новую игру про знаменитого ежа. Прыгаем собираем золотые кольца, сражаемся с Боссами и главное не падаем в пропасть.
Предложенные в подборку
Увеличьте свою армию и уничтожьте своих врагов.
Отличная музыкальная игра с захватывающим игровым процессом.
Новая ролевая игра от студии SEGA.
Гоняйте по ночному городу на футуристическом мотоцикле и преодолевайте препятствия.
v3.53 + Мод: много денег
Помогите главному герою Скетчу Тернеру одолеть врагов в своем нарисованном мире.
Управляйте грузовиком-монстром и проходите опасные трассы игры.
Увлекательные гонки на байках по пересеченной местности.
Управляйте огромным грузовиком-монстром и проведите его по опасным трассам города.
Гоняйте и давите все на своем пути от транспортных средств до различных препятствий.
Когда разработчик-любитель создал то, чего не смогла добиться Sega.
Пару лет назад некий разработчик из Японии под ником Oban в свободное время решил создать на основе Unreal Engine свой движок для создания игр про Соника. Сам Oban никогда не был фанатом Соника, и сделал его чисто ради эксперимента. Он работал над движком в течение года и в итоге он фактически создал концепцию того, как должна выглядеть хорошая игра про Соника. В конце концов Oban открыл исходный код игры всем желающим, благодаря чему фанаты-энтузиасты начали создавать свои собственные уровни.
Если вы хотите посмотреть на то, как фанаты делают уровни в Sonic Infinity Engine, советую посмотреть канал Blue Vivacity (, в котором также есть ролики по модам к другим сониковским играм. Также есть и другой канал на данную тематику под названием Sonic Overtime.
А теперь я, собственно, расскажу о самом движке.
Когда я запустил игру, я сразу же оказался на обучающем уровне, который выполнен очень красиво. Несмотря на отсутствие меню настроек, я не испытывал технических проблем с игрой, благо что мой компьютер не является допотопным ведром. Игра запускается в большом окне, но можно переключиться на полноэкранный режим нажатием F11. Информация о том, на какие кнопки надо нажимать прилагается в файле README. К слову, режим обучения включается с каждым запуском игры, но можно его пропустить прыгнув на пружину. А потом сыграть в этот же уровень снова, но без обучающих подсказок. В целом игралось без просадок FPS.
Перехожу к геймплею. Первым делом я осваивался с управлением. К слову, управление в этой игре просто идеальное и крайне удобное. Главная беда всех 3D-игр про Соника как раз было управление персонажем. Даже в Generations разработчики из Sonic Team не смогли решить данную проблему. Но в этой игре наконец-то я могу контролировать ежа без особых трудностей. Что самое интересное, в этой игре я наконец могу управлять персонажем не только клавиатурой, но и мышью.
Sonic Infinity Engine развивает идею Boost-геймплея ещё дальше, добавляя такие новые функции, как возможность прыгать мячиком (фича из Sonic Adventure 2) и спиндешить. Особенно мне понравилась в игре одна фича: если спрыгнуть с большой высоты на высоком скорости, то Соник не будет тупо падать как наковальня, а парить какое-то время над землёй, медленно падая. Это придаёт игре ощущение полёта, и что самое приятное, благодаря данной фиче можно преодолеть огромные расстояния, любуясь прекрасными видами с высоты.
Уже на первом уровне я начинаю понимать, что тупо нажимая на кнопку буста я не могу пройти многие препятствия. Причём во многих случаях лучше вообще не пользоваться бустом и предпочтительнее пользоваться нормальным бегом. Причём самый первый уровень помимо приятного дизайна обладает отличным левел-дизайном, который демонстрирует все возможности движка.
В Adventure Pack всего 4 уровня. Они все состоят из готовых ассетов, собранных из Unreal Marketplace. Но тем не менее, они поражают качественным левел-дизайном и визуалкой, и они точно смогут заменить уровни Sonic Generations. При этом Обан подобрал для уровней красивую музыку, которая добавляет игре атмосферы.
В игре есть хаб, который представляет собой огромную пустыню с горами. И выглядит хаб просто божественно:
Следующий уровень оказался довольно спорным, поскольку автор явно переиграл в Зельду. И он спорный по той причине, что в ней невозможно применять сверхскоростные способности Соника, и больше напоминает на лабиринт. Я так данный уровень и не прошёл, но в целом он выглядит прекрасно:
И наконец, последний уровень оказался для меня самым любимым. Начну с того, что это не сюрреалистичная полоса препятствий и он выполнен в более реалистичном ключе. И тут бег напролом не поможет, и мне придётся применять свои способности на реалистичном окружении. Для этого мне нужно тщательно продумывать свой маршрут, поскольку Обан не даёт мне подсказок, куда мне дальше идти. Посмотрите на эти живописные пейзажи!
Есть у данного движка недостатки? Да. Во-первых, игра вряд ли запустится на слабом железе, и для этого потребуется мощный компьютер. Во-вторых, способность Соника перемещаться с помощью колец реализован криво. И в третьих, это знаменитые петли. В этой игре Соник не может бежать по петлям, поскольку он начинает падать с потолка. Видимо, в официальных 3D играх бег по петлям заранее заскриптован для зрелищности. И в итоге мне пришлось в буквальном смысле перепрыгивать со стенки петли на другую сторону, полностью игнорируя потолок.
Но несмотря на вышеперечисленные недостатки, Обан смог превзойти разработчиков Sonic Team. Я играл в бету-версию Adventure Pack, в которой не завезли даже меню паузы и настроек. Поэтому мне пришлось играть в окне. Повезло, что окно огромное. В полноэкранном режиме игра неправильно отображается. К счастью, сейчас разрабатывается новая версия Adventure Pack с новыми и впечатляющими уровнями. Так что я пожелаю Обану удачи.
И теперь я решил опробовать другую игру, основанную на данном движке. Речь пойдёт о Grand Metropolis, который к слову был разработан нашим соотечественником. Данная игра представляет собой порт одноимённого уровня из Sonic Heroes, но переделанный в некоторых моментах.
Ах, Sonic Heroes – игра моего детства, и я с удовольствием решил переиграть в данный уровень, но уже с новой механикой. И тут я заметил огромную проблему в движке и самой игре – оптимизация. При высоких настройках у меня игра начинает просиживать где-то до 45 FPS. Но к счастью, в ней наконец завезли меню паузы и возможность поменять разрешение экрана.
Подвожу итоги. Sonic Infinity Engine – прекрасный движок для создания игр про сверхскоростного ежа. Если иметь прямые руки, мозги и, конечно же, Unreal Engine, то можно сварганить отличную игру про Соника. Если Sega никак не сможет сделать хорошую 3D игру про Соника, то пусть им займутся фанаты.
В этой статье я хочу разобрать внутреннее устройство легендарной игры Sonic the Hedgehog для приставки Sega Mega Drive, а также способы ее модификации или, как еще говорят, хакинга. Эта игра насчитывает порядка сотни хаков, включающих как действительно достойные работы (такие как Pana Der Hejhog или Sonic Remastered), так и странные и даже жутковатые (вроде An Ordinary Sonic ROM Hack). Чтобы понять, как их создавать, нужно разобраться, как писать на языке ассемеблера Motorola 68K (обычно игры для приставок тех времен писались именно на ассемблере), откуда взять дизассемблированный вариант игры и какую архитектуру имеет ее движок.
Дизассемблирование ROM-файлов для Sega осуществляется при помощи коммерческого дизассемблера и дебаггера IDA Pro. Затем происходит кропотливый процесс разметки, структурирования и причесывания сырого ассемблерного кода с использованием дебаггера (и смекалки). Этот процесс требует хорошего понимания технических особенностей платформы Sega Mega Drive и игр для нее.
К счастью, на GitHub уже есть дизассемблированные и размеченные версии всех игр серии Sonic the Hedgehog, созданные энтузиастами при поддержке сайта Sonic Retro. Лучше всего размечен и структурирован исходный код именно первой игры серии. Эта версия кода находится в репозитории sonicretro / s1disasm и именно она будет разобрана в статье.
Погружение в внутреннее устройство игрушки начнем с теории.
Технический обзор приставки
Sega Mega Drive (известная в США как Sega Genesis) оснащена 32-битным центральным процессором Motorola MC68000 (сокращенно Motorola 68K) и дополнительным звуковым сопроцессором Zilog Z80 (взамодействие с Z80 происходит через общую память). Объем оперативной памяти (RAM) – 64K. Разрешение экрана в основном режиме (в американской версии) – 320x224 пикселей.
Использованный процессор Motorola 68K в свое время был достаточно распространен. Этот чип применялся в самых разных системах, от популярных домашних компьютеров и игровых приставок до космических шаттлов. Одна из модификаций Motorola 68K даже была установлена в легендарном Apple Macintosh.
Графическая подсистема Mega Drive основана на видеоконтроллере Yamaha YM7101 и поддерживает аппаратную работу с двумя слоями фона и отрисовку до 80 спрайтов поверх них. Подробнее графика в игре будет разобрана далее; прочитать о графике в Sega Mega Drive отдельно можно в статье "Как работала графическая система Sega Mega Drive: Video Display Processor".
Для сборки игры используется макроассемблер AS. Набор инструкций этой платформы совершенно не сложный и содержит всего 82 инструкции. Для сравнения: по подсчетам пользователя ResearchGate современный Intel Core i7 имеет 338 инструкций.
Процессор имеет восемь 32-битных регистров общего назначения: D0 – D7 . Все эти регистры активно используются в играх для хранения промежуточных данных и в качестве операндов арифметических операций. Также существует восемь специальных адресных регистров A0 – A7 . Адресные регистры оптимизированы для хранения указателей на какие-либо объекты в памяти и их использование в некоторых операциях невозможно. Последний адресный регистр A7 по совместительству работает указателем стека и имеет алиас SP .
Разберем основные инструкции Motorola 68K.
Операция копирования
move – скопировать данные из источника в приемник.
При записи операнда в скобках вычисление происходит со значением по такому адресу в памяти:
Такой режим адресации возможен только для адресных регистров ( a* ).
Арифметические операции
- add – прибавить значения источника к значению приемника.
- sub – отнять значение источника от значения приемника.
- mulu – беззнаковое умножение; muls – знаковое умножение.
- divu – беззнаковое деление; divs – знаковое деление.
Операции управления потоком выполнения
- jmp , bra – безусловный переход.
- jsr , bsr – вызов подпрограммы, rts – возврат из подпрограммы (аналоги call и ret в x86).
Операции ветвления
Для выполнения условных переходов в процессоре 68K используется регистр CCR (Condition Code Register). Инструкции cmp , tst и btst позволяют выставить биты (флаги) этого регистра, которые затем используются в операциях условного перехода beq , bne , bge , ble и других.
- cmp – сравнить значения.
- tst – сравнить значение с нулем.
- btst – сравнить заданный бит с нулем.
- beq / bne – перейти, если сравниваемые значения были равны/не равны.
- bge / ble – перейти, если второе сравниваемое значение было больше/меньше первого.
Более подробно изучить команды Motorola 68K вам поможет отличный мануал (с ужасным фоном и шрифтами) автора Марки Джестера, где каждая из команд разобрана максимально подробно.
Сборка игры
Репозиторий s1disasm содержит Python-скрипт, автоматически запускающий нужную версию ассемблера для текущей операционной системы со всеми необходимыми флагами. Также этот скрипт выполняет специфическую для игры Sonic the Hedgehog операцию "Kosinski compression", которая сжимает карты уровней и другие бинарные данные (чтобы они поместились в память картриджа).
Все, что нужно сделать пользователю, это перейти в git-ветку AS ( git checkout AS ) и выполнить команду:
Результатом выполнения скрипта должен стать готовый ROM-файл игры с названием s1built.bin . Этот файл можно запустить в вашем любимом эмуляторе Sega Mega Drive. Для macOS, например, рекомендуется использовать замечательный OpenEmu.
Архитектура движка игры
Начнем обзор с основной точки входа для сборки игры – файла sonic.asm . В нем находятся процедуры инициализации: ожидание готовности сопроцессора Zilog Z80 ( WaitForZ80 ), установки параметров видеопроцессора ( VDPSetupGame ) и проверка контрольной суммы. После инициализации игра выполняет подпрограмму GameInit и переходит в главный цикл MainGameLoop , задачей которого является считывание переменной глобального игрового режима и запуск соответствующему ему кода.
Полный список глобальных переменных, используемых игрой вынесен в файл Variables.asm . Каждая переменная представляет собой константу со ссылкой на адрес в RAM, где должно храниться значение переменной.
Глобальный игровой режим хранится в переменной v_gamemode . Список глобальных игровых режимов включает в себя:
- 00 – экран "Sega",
- 01 – титульный экран с Соником,
- 08 – демо,
- 0C – уровень,
- 10 – special stage,
- 14 – экран "Continue",
- 18 – финальная заставка,
- 1C – финальные титры,
- 8C – титр уровня.
Переменная v_gamemode определяет подпрограмму для главного цикла, которая должна исполняться в данный момент. Например, в режиме id_Title приставка будет исполнять подпрограмму GM_Title , а в режиме id_Level – GM_Level .
Игровые параметры
Многие переменные, объявленные в файле Variables.asm представляют интерес для хакинга. Рассмотрим для примера v_sonspeedmax , v_sonspeedacc и v_sonspeeddec .
Изменяя значения, помещаемые в эти переменные в подпрограмме Sonic_Main , можно изменять динамические характеристики перемещения Соника: максимальная скорость, значение ускорения и торможения соответственно, получая интересные результаты:
Дробные переменные хранятся в формате с фиксированной точкой, поэтому для получения реальных значений их необходимо разделить на 256. Так, ускорение Соника составит 0xC / 256 = 0.046875, а торможение – 0x80 / 256 = 0.5 (пикселей на игровой цикл в квадрате).
Графика
Графикой в Mega Drive занимается тайловый графический процессор Sega 315‑5313 (Video Display Processor, VDP). Конфигурирование VDP производится с помощью регистров, запись в которые производится через специальные адеса в памяти vdp_data_port и vdp_control_port . Изначальная конфигурация процессора устанавливается в подпрограмме VDPSetupGame , которая берет параметры по адресу VDPSetupArray . Однако, в каждом из глобальных игровых режимов, некоторые регистры выставляются повторно. Например, на игровых уровнях это делает подпрограмма GM_Level . Подробное описание функций всех регистров VDP приведено в вики Sega Retro.
Для примера приведем скриншот игры с включенным режимом Low Color (нулевой бит регистра Mode Register 1 выставлен в ноль):
Video Display Processor позволяет аппаратно работать с двумя фоновыми слоями – background (слой B) и foreground (слой A), а также со слоем спрайтов, которые отображаются поверх фона. Фоновые слои собираются из тайлов 8x8 пикселей с помощью карт тайлов. Спрайты также собираются из тайлов; максимальный размер спрайта – 4x4 тайла. Таким образом, максимальный размер аппаратного спрайта составляет 32x32 пикселя.
Удаление кода из подпрограмм работы с фоновыми слоями ( LoadTilesAsYouMove , DrawChunks ) и спрайтами ( BuildSprites ) позволяет понять, какие из игровых объектов к какому слою относятся:
Как видно из названия, подпрограмма LoadTilesAsYouMove занимается подгрузкой тайлов на фоновые слои по мере продвижения игрока по уровню. В игре Sonic the Hedgehog размер обоих тайловых плоскостей составляет 64x32 тайла или 512x256 пикселей.
Так выглядит изменяющийся foreground-слой на уровне Green Hill Zone, GIF-анимация, 5 Мб:Графический процессор также позволяет устанавливать не только общее смещение фонового слоя, но и смещение его отдельных горизонтальных рядов тайлов, используя так называемую таблицу скроллинга. Эта возможность позволяет перемещать удаленные элементы фона медленнее, чем близкие. Таким образом создается эффект параллакса, который имитирует 3D-графику и придает сцене объем. Этот эффект используется почти во всех уровнях Sonic the Hedgehog.
Эффект параллакса в фоновом слое уровня Marble Zone:
Игровые объекты
Движок игры выделяет 8192 байта в RAM на хранение состояния динамических объектов сцены. Вся эта информация хранится по смещению v_objspace . К динамическим объектам относится все объекты на уровне, кроме стен и пола. Примеры: Соник, враги Соника, мониторы с бонусами, кольца, пружины, Босс и так далее. При необходимости объекты отрисовывают себя в слое спрайтов при помощи подпрограммы DisplaySprite .
Размер данных состояния игрового объекта статичен и составляет 64 байта. Эта информация формирует структуру, поля которой могут быть получены с использованием макросов, объявленных в файле Constants.asm . Адрес структуры данных текущего обрабатываемого игрового объекта обычно заносится в регистр a0 . Таким образом, данные игрового объекта могут быть считаны так:
- ObX(a0) , ObY(a0) – текущие координаты объекта в пикселях.
- ObVelX(a0) , ObVelX(a1) – текущая скорость объекта в 1/256 пикселя за шаг.
- obHeight(a0) , obWidth(a0) – высота и ширина объекта.
- obSubtype(a0) – подтип объекта (пример: тип бонусного монитора).
- obStatus(a0) – байт с флагами состояния объекта.
- obRoutine(a0) – номер текущей подпрограммы объекта.
Отметим, что система координат в игре типична для экранной графики и имеет ось X направленную вправо, и ось Y, направленную вниз.
Подпрограмма ExecuteObjects вызывается на каждом шаге главного цикла уровня. Она последовательно вызывает программный код каждого из игровых объектов, присутствующих на сцене. Список указателей на программный код каждого из объектов задан в таблице в файле Object Pointers.asm . Программный код большей части объектов вынесен в отдельный файл в каталоге _incObj .
Многие из объектов имеют по несколько подпрограмм, которые соответствуют разным этапам жизни объекта (например, только что созданный объект, объект в рабочем состоянии, "предсмертное" состояние). В этом случае номер подпрограммы, которую необходимо выполнять сейчас, хранится в поле obRoutine .
При необходимости передвижения объекта с заданной скоростью вызывается специальная подпрограмма SpeedToPos . Она интегрирует скорость текущего объекта, прибавляя ее значение к его координатам.
Хак: no-ring challenge
В качестве примера реализуем довольно простой хак, который может понравиться самым ярым фанатам игры: no-ring challenge. Этот хак предлагает пройти игру без золотых колец. В результате, каждая атака Соника будет сразу убивать его и заставлять игрока проходить уровень заново (либо с точки сохранения).
Перейдем в главную подпрограмму объекта "Кольцо" – Ring_Main и добавим в самое ее начало простейшую инструкцию прыжка ( bra ) на процедуру удаления кольца:
С бонусными мониторами поступим так же. Главная подпрограмма объекта "Монитор" находится в файле 26 Monitor.asm . Тип монитора хранится в поле obSubtype размером 1 байт. Экспериментальным методом выяснено, что значение для монитора с кольцами равно 6. Добавим простую проверку типа монитора с помощью инструкции cmp и условный прыжок beq на процедуру его удаления в случае, если его тип равен шести:
Можно убедиться, что в получившемся ROM'е кольца и бонусные мониторы с кольцами на уровнях будут отсутствовать, что усложнит прохождение. Патч целиком можно посмотреть на GitHub. Туда же выложен готовый бинарник на случай, если кто-то захочет поиграть в такую версию игры, не разбираясь со сборкой.
Хак: притягивание колец
В первой и второй играх серии бонусный щит только защищает игрока, но при этом не имеет никаких дополнительных функций. Попробуем его улучшить и добавить к нему возможность электрического щита из Sonic the Hedgehog 3 – притягивание колец.
GIF-анимация, иллюстрирующая действие электрического щита, 1 Мб:Алгоритм Sonic the Hedgehog 3
Алгоритм, использующийся для этого эффекта, подробно описан в вики Sonic Retro. Если персонаж, обладающий электрическим щитом, находится ближе, чем в 64 пикселях от кольца по каждой из осей, кольцо переходит в режим намагниченности и начинает движение. В дальнейшем этот флаг больше не снимается с кольца. В режиме намагниченности кольцо ускоряется на 0.1875 за каждый шаг в сторону игрока, если оно уже движется в нужную сторону по данной оси. Если же кольцо движется от игрока, ускорение составляет 0.75.
Разница в значениях предусмотрена для того, чтобы кольца с одной стороны не слишком перестреливали, но, с другой стороны, если перестрел уже случился либо если игрок движется быстро и резко оказывается с противоположной стороны, быстро "исправлялись" и меняли свое направление движения.
Реализация алгоритма
Изучим подробнее исполняемый код объекта "Кольцо", который находится в файле 25 & 37 Rings.asm . Список подпрограмм объекта:
Кольцо имеет несколько жизненных этапов: Main – инициализация; Animate – обычное висение с анимацией вращения; Collect – момент сбора Соником; Sparkle – анимация искр при сборе Соником; Delete – удаление кольца. Для того, чтобы изменить поведение кольца в обычном его состоянии, смотрим в сторону подпрограммы ptr_Ring_Animate .
Для хранения состояния намагниченности кольца отлично подойдет однобайтное поле obStatus . Анализ кода кольца показывает, что в этой версии игры флаги состояния для этого объекта не используются. Назначим нулевой бит obStatus (наиболее младший) ответственным за хранение флага намагниченности. Установка отдельного бита ячейки памяти будет возможна с помощью инструкции bset , а проверка, установлен ли он – с помощью инструкции btst .
Добавим в начало подпрограммы Ring_Animate код, устанавливающий флаг намагниченности в случае, если игрок ближе к кольцу, чем на 64 пикселя по каждой оси:
Реализация алгоритма предполагает разное ускорение в зависимости от того, летит кольцо в сторону игрока или нет, что по сути может быть представлено как сравнение знаков значений скорости кольца и разницы положений кольца и игрока. В псевдокоде такое сравнение может иметь примерно такой вид:
Для простой реализации такого сравнения вспомним, что способ хранения знаковых целых чисел в большинстве процессоров (включая Motorola 68K) подразумевает возможность определить знак числа простым считыванием самого старшего бита, причем 0 будет обозначать положительное число, а 1 – отрицательное. Проверить равенство битов в байте можно с помощью операции исключающего "или" – XOR ( eor на Motorola 68K).
Как уже было отмечено выше, дробные значения (включая скорость игровых объектов) хранятся в формате с фиксированной точкой, поэтому необходимые значения ускорения (0.1875 и 0.75) необходимо домножить на 256 (получив 48 и 192 соответственно).
Реализуем процедуру притягивания колец:
Для того, чтобы кольцо действительно осуществляло движение согласно установленным скоростям, необходимо добавить вызов упомянутой выше подпрограммы SpeedToPos :
Собираем итоговый ROM игры, запускаем и — вуаля — фича из Sonic 3 доступна в Sonic 1!
На GitHub можно просмотреть патч целиком, а также скачать получившийся бинарник.
Заключение
Эта статья является лишь базовым разбором методов модификации игры. Статья не рассматривает инструменты для редактирования уровней (SonED2, Chaos), создание новых персонажей, игровых объектов и механик. Также не рассмотрен симулятор/отладчик Motorola 68K EASy68K, который может помочь более пристально разобраться, как работает процессор Sega.
Тем не менее, я получил большое удовольствие, покопавшись в кишках любимой игры детства. Надеюсь, этой статьей мне удастся разбудить в ком-то такую же ностальгию, к тому же черпать вдохновение для работы можно и из сотен уже реализованных хаков, и из последующих игр серии.
Читайте также: