Что внутри у однорукого бандита? Разборка, моддинг, и написание кейгена. [Part 2]

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Дисклеймер: азартные игры опасны для вашего кошелька и психического здоровья.

image

В предыдущей статье мы посмотрели на внутренности однорукого бандита «Мадока Магика А». Сегодня же давайте посмотрим, что внутри у его предшественника из 2013 года, а также разберёмся, как работают на нём сохранения в игре.

❯ Внешние отличия


Этот автомат мне понравился по дизайну гораздо больше, сугубо за счёт того, что в него завезли побольше фокусов, в основном оптических.

Например, кнопка ставки меняет надпись в зависимости от контекста в игре:

image

image

Или же хромированный щит слева от экрана, у которого внезапно исчезает фрагмент, а внутри начинают вращаться шестерёнки:

❯ Заглянем внутрь


Геймплей здесь практически не отличается — смотрим на экран, ловим намёки, крутим рулетку и надеемся на лучшее. Поэтому сразу залезем в техническую сторону вопроса.

image

Прежде всего в глаза бросается дисплей — да, в игровых автоматах делали экраны с вырезами ещё до того, как это стало мейнстримом!

image

На передней двери компоновка примерно такая же, как и в прошлый раз — динамики, кнопки, приёмник жетонов, а также вторичный компьютер, отрисовывающий графику на экране.

Внутри него — внезапный PowerPC e800:

image

В паре с чем-то неопознанным, опять же, от Nvidia:

image

ПЗУ тоже не запаяно, а находится на картридже неизвестного форм-фактора и интерфейса:

image

В остальном, внутрянка практически вся такая же, разве что скомпонована иначе. Тот же защищённый микроконтроллер в отдельном блоке управления барабанами:

image

Отдельные приветы тем, кто отвечает за названия игр — эта версия для игрока называется просто «Мадока Магика», а по внутренней номенклатуре «Мадока Магика А». Та версия, которая была в прошлом обзоре, для игрока называлась «Мадока Магика А», а по номенклатуре — «Мадока Магика АМА». Искать документацию при таком шикарном подходе — особый вид развлечения.

Кстати говоря про документацию — с этим автоматом мне сильно повезло, ведь к нему прилагалась и инструкция по эксплуатации, которые встречаются чуть ли не реже, чем сами автоматы!

image

Внутри — максимально подробные чертежи с указанием размеров, разводка кабелей между модулями, а также описание самой игры, написанное лютейшим японским канцеляритом.

image

❯ Моддинг — добавляем HDMI


При разборке я заметил, что к матрице идёт обыкновенный LVDS-шлейф, и мне подумалось — а нельзя ли в него врезаться и перехватить видеосигнал, чтобы выводить на стримах видео прямо с автомата?

И как известно, любая бешеная электронная идея уже давно реализована кем-нибудь на алиэкспрессе — там нашлась вот такая плата конвертации LVDS в HDMI.

image

В автомат встала как родная, пришлось лишь обтесать коннектор HDMI на кабеле, чтобы его протиснуть в раму, а затем закрепить всё двусторонним скотчем:

image

Звук, правда, вывести не удалось — линейного уровня сигнала внутри автомата нет, а динамики подключены к каким-то интересным чипам, сочетающим I2S-ЦАП и усилитель в одном корпусе. Но вот картинка с матрицы вполне себе выводится!

❯ Пишем кейген


У этого автомата тоже есть интерактивная функция — через приложение можно выбирать персонажа, сопровождающего во время игры, а также фон за ним, голос системных объявлений, и прочее:

image

После выставления настроек, программа выдаёт пароль, который нужно ввести на автомате для загрузки игры:

image

Эта версия мне не понравилась тем, что на самом автомате менять настройки и персонажа нельзя — то есть, если когда-то официальный сервер игры уйдёт в офлайн, то доступны будут лишь стандартные настройки.

После нескольких игр, я понял, что эти пароли мне что-то напоминают… Например, если посмотреть на некоторые, выложенные кем-то по доброте душевной на Yahoo Answers:

4358EE87A875

435A9687286D

435BCA87C8CD

Да это же просто шестнадцатеричное число! Поэтому берём эксельку и, как в старые добрые времена с Cheat Engine и иже с ними, начинаем записывать, когда что меняется:

image


Но увы, порой из-за смены одного параметра меняются несколько букв, а иногда наоборот — одна и та же буква меняется при изменении совершенно не связанных параметров.

Это означает, что значения упакованы с плотностью до бита, и нам нужно смотреть уже на уровне битов, а не шестнадцатеричных букв. В какой-то момент я пришёл к тому, что формат кода следующий:

image

  • 3 бита — выбранный персонаж
  • 7 битов — текущий уровень персонажа
  • 4 бита — уровень реинкарнации персонажа (влияет на цвет рамки вокруг экрана)
  • 2 бита — костюм персонажа
  • 4 бита — аксессуар персонажа
  • 2 бита — питомец персонажа
  • 11 бит — неизвестное значение. Возможно, это идентификатор игрока, чтобы нельзя было сохраняться не своим паролем. Для безопасности я содрал эти биты у ответившего на Yahoo по ссылке выше :-)
  • 4 бита — изображение на фоне экрана
  • 3 бита — голос озвучки событий в игре
  • 8 бит — некая контрольная сумма, т.к. они меняются при изменении любого параметра

Разумеется, всё это использует нестандартную нумерацию, чтобы избежать слишком очевидных паттернов. Больше всего пришлось поломать голову над уровнями, т.к. преобразование было ни разу не очевидным. Если подразумевать, что первый уровень на самом деле кодируется как 0:

image

Со временем, при помощи друзей я таки нашёл формулу, по которой происходит преобразование, но по очевидным причинам в рамках данной статьи оставим это как домашнее упражнение для читателя. :-)

Последним фактором осталась контрольная сумма. Над ней тоже пришлось колдовать долго, но в итоге я наткнулся на такой полезный инструмент, как CRC RevEng. Засовываем в него все имеющиеся образцы кодов, указываем ширину контрольной суммы в 8 бит, и вуаля — действительно, это кастомная реализация CRC8, и теперь мы знаем все её детали, а значит, можем попробовать написать кейген в том же экселе:

image

Контрольная сумма сходится! Раскидываем на HTML1.0:

И вуаля! Теперь, даже если сервера оригинальной игры уйдут в офлайн, нам это не страшно — с кейгеном весь контент по-прежнему доступен для игрока. А меня после этой публикации, скорее всего, в игорные заведения больше пускать не будут. :-)

Узнать об этом, конечно же, вы сможете в моём дневнике инженерных (и не очень) похождений лунного скитальца в Телеграме. :-)



Возможно, захочется почитать и это:

  • ➤ Коробочка, которая поёт
  • ➤ Самый суровый магнитный ключ
  • ➤ Сам написал, сам поиграл: как я написал 2D-игру для Android полностью с нуля, весом менее 1мб?
  • ➤ Немного о производстве пива
  • ➤ Как создавали Sid Meier's Civilization


Источник: https://habr.com/ru/companies/timeweb/articles/761082/


Интересные статьи

Интересные статьи

Привет! Мы продолжаем цикл статей по базовым принципам работы с canvas. Сегодня мы рассмотрим L-системы в качестве примера для создания различных интересных визуализаций.Так что же такое L-ситемы? L-...
Создание чатов — простая и одновременно сложная задача. В этой статье представлен пошаговый туториал по реализации бэкенда для простого многоканального чата. Сервис будет реализован как комбинаци...
При разработке игр про лодки, да и любых других игр с обширными водными поверхностями, существует проблема сокрытия поверхности воды, когда на ней что-то плавает. Я расскажу о решении, ис...
История о том, как сложный формат работы в непростых условиях может подтолкнуть к идее для стартапа. В прошлом году я работал в одном стартапе, в роли фулстек-разработчи...
Святослав Зборовский из BI-команды DataArt изучил, кого из коллег чаще всего благодарят с помощью корпоративной системы. В статье для Хабр он рассказал, как быстро построить и оптимиз...