Angry Birds. В поисках встроенного редактора уровней

в 9:13, , рубрики: angry birds, game development, Lua, игры, реверс-инжиниринг, метки: , , ,

Angry Birds. В поисках встроенного редактора уровней

Часть 0. С которой всё началось

Захотелось мне однажды покопаться в скриптах Angry Birds с одному мне известными целями. Я, конечно, ожидал наткнуться внутри на какие-нибудь интересности, но даже и подумать не мог, что среди них будет вполне рабочий редактор уровней. Сначала я объясню, как я получил такой результат, а в конце статьи приведу описание и скриншоты редактора, опишу простой путь включения редактора.

Часть 1. Процесс

Приготовления

Для последующей работы нам понадобятся следующие инструменты:

  • LUA Compiler
  • OpenSSL
  • HEX-редактор

Работать будем с Angry Birds Rio или Angry Birds Space, т.к. в них присутствуют почти все необходимые для редактора файлы.

Если всё это в наличии, тогда в путь. Если вам будет скучно читать первую часть статьи, пролистайте до второй, она вам понравится больше.

Своей целью мы выберем файл datascriptsoptions.lua, т.к. его содержимое представляет из себя просто список переменных, которые мы сможем беспрепятственно поменять. Заглянем в файлик и ничего не поймём. Вероятно, файл зашифрован.

Расшифровать

С определённой версии игры все файлы шифруются алгоритмом 256-битным AES CBC с пустым initial vector и вшитыми в код ключами. Если кто хочет повозиться с дебагером, подробное описание процесса есть по этой ссылке.

Для расшифрования я использовал OpenSSL.

Примеры batch-файлов для расшифрования

Angry Birds Rio:

openssl enc -K 55534361505170413454534E56784D49317639534B39554330795A75416E6232 -iv 00 -d -aes-256-cbc -in %1 -out %1dec.lua

Angry Birds Space:

openssl enc -K 526D67645A304A656E4C466757776B5976434C326C5361684662456846656334 -iv 00 -d -aes-256-cbc -in %1 -out %1dec.lua

Angry Birds Seasons:

openssl enc -K 7A65506865737435666151755832533241707265403472654368417445765574 -iv 00 -d -aes-256-cbc -in %1 -out %1dec.lua

Для зашифрования, соответственно, убираем ключик -d.

После этой процедуры у нас получится вполне читаемый lua-скрипт, жаль, что скомпилированный. Заглянем в заголовок, видим LuaQ, следовательно, это Lua 5.1.

Декомпилировать

Казалось бы, что проще. Скачать один из декомпиляторов и натравить его на получившийся файл. Ан-нет. Попробуем получить листинг скомпилированного options.lua с помощью luac -l.

luac: options.luadec.lua: bad header in precompiled chunk

Как видим, заголовок повреждён. Возможно, требуется другая версия компилятора, возможно ещё что-то, чего я не учёл, т.к. под lua почти не кодил. Факт остаётся фактом. Сравниваем заголовок нашего файла с заголовком любого другого скомпилированного lua:

Angry Birds. В поисках встроенного редактора уровней

Не вдаваясь в детали, что значит эта 08, меняем её на 04 и пробуем получить листинг. Вуаля:

main <?:0,0> (31 instructions, 124 bytes at 00346070)
0+ params, 2 slots, 0 upvalues, 0 locals, 22 constants, 0 functions
        1       [-]     GETGLOBAL       0 -1    ; gamelua
        2       [-]     SETTABLE        0 -2 -3 ; "releaseBuild" true
        3       [-]     GETGLOBAL       0 -1    ; gamelua
        4       [-]     SETTABLE        0 -4 -5 ; "showEditor" false
...

Привожу тот же самый файл в более читаемом виде:

gamelua.releaseBuild = true
gamelua.showEditor = false
gamelua.cheatsEnabled = false
gamelua.useDynamicAssets = false
gamelua.isPremium = false
gamelua.isKorea = false
gamelua.applyChinaRestictions = false
gamelua.gameVersionNumber = "1.4.4"
gamelua.customerString = "rovio"
gamelua.svnRevisionNumber = "93049"
gamelua.isSeasonsAvailable = true
gamelua.g_registrationEnabled = true
gamelua.g_updateCheckEnabled = true
gamelua.loadMightyEagle = true
filename = "options.lua"

Здесь мы уже видим несколько интересных переменных, а именно: releaseBuild, showEditor и cheatsEnabled. Меняем их и собираем всё обратно.

Собрать как было

Первоначально я хотел просто скомпилировать свой собственный скрипт с таким содержанием, подправить заголовок и зашифровать. Но как-то это не заладилось, игра ни в какую не хотела принимать мой файлик за options.lua. Решение было найдено простое — исправить оригинальный файлик hex-редактором. Не ахти какой метод, но для наших целей сгодится. Итак, исправляем, проверяем листинг, возвращаем заголовок, шифруем, закидываем назад в игру.

Часть 2. Результат

Заходим в игру и сразу видим некоторые изменения в главном меню:
Angry Birds. В поисках встроенного редактора уровней

Кликаем по «Editor» и видим список уровней, которые можно изменять. Стрелки снизу пролистывают пакеты уровней, так что вы вполне можете создавать свои уровни в одном из незанятых пакетов:
Angry Birds. В поисках встроенного редактора уровней

Теперь кликнем на один из уровней и попадём непосредственно в редактор:
Angry Birds. В поисках встроенного редактора уровней

Негусто, надо сказать. Из интерфейса лишь несколько надписей и обозначений. Основная работа производится с помощью горячих клавиш. Потыкав всевозможные клавиши с полчасика, я составил их краткое описание:

Работа с объектами
12 разместить каменные конструкции
QW разместить деревянные конструкции
AS разместить стеклянные конструкции
NM разместить песчаные блоки
ZX,JK разместить декорации
34 разместить птичек
TY разместить врагов и запертых птиц (для игровой механики одно и то же)
UI разместить активные объекты
OP разместить награды
delete удалить объект
shift+r повернуть объект
Камера
ctrl+shift+c центрировать камеру
ctrl+shift+b показать весь уровень
Другое
tab включить/отключить физику
shift+t сменить фон
shift+s заморозка (???)
ctrl+s сохранить уровень
end quick end (???)

Скорее всего это не все горячие клавиши, можете поискать другие.

Подводные камни

Редактор работает далеко не идеально. Часть ресурсов редактора отсутствует, поэтому при нажатии определённых клавиш работа игры может внезапно завершиться. Как минимум в версии Rio редактор сохраняет уровни в нескомпилированном виде, поэтому, чтобы увидеть уровень в игре, необходимо его предварительно скомпилировать нужной версией компилятора и зашифровать. При должном усердии можно попробовать подправить игру так, чтобы она использовала уровни в нескомпилированном виде, но это выходит далеко за рамки данной статьи. Также я не нашёл способа передвинуть рогатку внутри редактора. Вероятно, сделать это можно только прямым редактированием файла уровня.

Angry Birds Space

В этой версии редактор значительно доработан, теперь работает меню свойств объектов, появились сенсоры, работать с редактором стало удобнее, появился специальный редактор объектов. Тем не менее, редакторы регулярно подглючивают. Я не проверял, починили ли сохранение уровней в этой версии, оставляю это читателю.

Несколько скриншотов версии Space:
Angry Birds. В поисках встроенного редактора уровней

Angry Birds. В поисках встроенного редактора уровней

Бархатный путь

Я не предлагаю читателю самостоятельно повторять мою работу. Для включения редактора достаточно скачать этот архив и заменить файл options.lua соответствующим файлом из архива. Версии игры, на которых проверены эти файлы: Angry Birds Space 1.2.0 и Angry Birds Rio 1.4.4

ВНИМАНИЕ
Перед проведением любых операций настоятельно рекомендуется сохранить резервные копии файлов игры, включая сохранения. Во-первых вы можете испортить оригинальные уровни игры, а во-вторых данная замена также включает читы. Для использования читов нажимайте цифровые клавиши. Среди читов есть, например, такие, которые сразу проходят всю игру или дают все награды. Если вы не хотите потерять всё своё прохождение, делайте резервные копии.

Автор: Sadler

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js