Речь пойдёт про ностальгию и первые игры. Те самые первые игры, которые навсегда остаются в памяти, как огромные сугробы чистейшего белого снега (а не коричневого с желтым), про те игры, которые живы и спустя десятки лет и про то, какое место они могут занимать в нашей жизни.
Краткий список, наиболее важных игр на ПК, которые несомненно повлияли на мою жизнь больше, чем какие либо ещё явления или события может выглядеть так: Heroes 3, Warcraft 3, Half-Life / CS 1.5, Diablo 2, Morrowind 2, Serious Sam. Мне кажется, именно эти игры причины того, что я смог стать программистом (и наверняка они повлияли не только на меня). Вы могли бы спросить, где тут связь и что общего между этими играми, кроме того, что они примерно из одной эпохи? Все эти игры имели потрясающую поддержку комьюнити, где то благодаря, а где то и вопреки воле разработчиков. Мощнейшие редакторы карт (и миров! чего только стоит название Warcraft 3 World Editor) в комплекте с игрой или фанатская любовь, которая выражалась в потрошение ресурсов и кода игр до последнего байта. Я помню, что мой первый диск (или один из) был с игрой CS1.5. Я тогда был несколько удивлён, что в комплекте с контрой зачем то засунули какое то недоразумение с нудной покатушкой на вагонетке. То, что игра Counter-Strike 1.5 это всего лишь фанатское дополнение к Half-Life ещё предстояло узнать.
Дисклеймер: время описываемых в тексте событи�� - половина и более жизни назад, или примерно 2005-2010 гг, что могло привести к ряду неточностей и ложной памяти.
Навигатор прокладывает путь
В те года в провинции интернета либо ещё не было, либо он был очень дорогой. На момент его появления, кажется, было доступно порядка 300МБ внешнего трафика в месяц. Жажда чего то нового гнала к газетным ларькам, продающим журналы. Я крутился возле них высматривая обложки игровых журналов. Я мог себе позволить пару-тройку таких журналов в год. И это был целый мир! Но в какой то момент, самое главное в этих журналах стала не бумажная составляющая, а диски. Я брал журнал Навигатор Игрового мира, два диска. На одном диске, кажется, были демки игр. А вот второй обычно наполнялся настоящим сокровищем: разные утилиты и моды на игры! На одном из дисков на меня свалилось сразу несколько десятков моделей для варкрафт 3. Редактор варкрафта 3 это причина, по которой я выучил значение слов импорт и экспорт. Импорт - вопреки определению школьных учебников, это не ввоз товаров, а добавление на карту варкрафта новой модельки, текстуры или других ресурсов. Что ещё можно вспомнить про варкрафт 3? Карты для варкрафта были щедро рассыпаны в разных пиратских сборках и на тех же журнальных дисках. Не лишним будет упомянуть в этом контексте самый известный факт про варкрафт: жанры tower defense и MOBA оформились из карт для варкрафта.
Ещё пару значимых утилит с дисков: Dragon UnPACKer и ArtMoney. Дракончик — берёшь практически любую популярную игру на своём ПК и смотришь на неё как на киндер сюрприз — что же можно оттуда выковырять. Бесполезный, но интересный процесс. А вот ArtMoney это уже более серьезная программа, которая требовала определенных навыков. Во время взлома игр на бесконечные ресурсы, пытливые пользователи знакомились с терминами вроде «процесс», «память процесса», «целое 4 байта».
Во имя богов

Если варкрафт 3 это пример игры, где разработчики дали максимум возможных инструментов для творчества, то герои 3 являются примером, где фанатов не остановили достаточно скромные возможности редактора карт. Не остановили от того, что разобрать игру на мельчайшие части, собрать её снова и переписать движок игры с нуля (vcmi.eu). Речь конечно же в первую очередь про знаковое дополнение для героев «Heroes 3.5 WOG» (вики). Что же это дополнение представляло собой для игрока и для человека, только погружающегося в мир программирования? Огромное меню с несколькими вкладками и десятками настроек скриптов (отдельных модификаций), которые могли полностью менять игру! Разрушение городов, опыт существ, постройка произвольных зданий прямо на карте, новые уникальные монстры с уникальным поведением и даже рыбалка в колодце, которая запускала отдельные текстовые квесты. Сидеть и долго настраивать набор скриптов под очередную партию ��ыло отдельным удовольствием, неотделимым от самой игры. Естественным было желание самому попробовать написать какой нибудь скрипт. Благо, достаточно подробная документация по скриптовому языку ERM была приложена к игре. И что с того, что скрипты на ERM были больше похожи на листинг ассемблерного кода? Мне предстояли долгие недели чтения документации на английском языке (который я до сих пор не выучил) и скромные попытки в скриптинг.
Скрытый текст
Пример кода из стандартного модуля script079.erm
********************************************************************************
*!* Mithril Forge visiting *!*
********************************************************************************
!?OB53/6&22;
!!VRy1:S0;
!!MN998:O?v4069; [check owner of mine]
!!PO998:O?y1; [check owner of place]
!!FU4064|y1=-2/y1>0:Pv998/v999/v1000; [call needed function if it is a Mithril Forge]
!?FU4064
!!VRv1:Sx1; [v1 = x]
!!VRv2:Sx2; [v2 = y]
!!VRv3:Sx3; [v3 = z (ground/underground)]
!!MN1:O?y1; [y1 = mine owner]
!!HE-1:O?y2; [y2 = hero owner]
!!VRy3:S-1;
!!VRy4:S-1;
!!OW&y1<>-1: Ty1/?y3;
!!OW&y2<>-1: Ty2/?y4;
!!FU&y3=y4:E; [exit if the same team]Пожалуй, изучение ERM было увлекательным опытом, который мне ещё несомненно пригодился не один раз. Самое интересное в WOG, конечно, это то, как он работает и как был создан. В какой то мере WOG можно назвать полезным вирусом — инъекция своего кода в чужой бинарный файл. Понимание того, как работают подобные WOG моды, стали очень важным подспорьем для моего дальнейшего пути. И я знаю, что многие игроки в героев 3 не любят WOG, но были ли возможны современные герои 3 (которые HotA), если бы не было WOG?
Монстры из ада
Где то параллельно с партиями в Герои 3, я знакомился с наследием ещё более давнего прошлого. На начало 2000х годов многие игры под dos уже бесконечно устарели и запускались только под DOSBox. Я достаточно прохладно отношусь к шутерам, но конечно же не мог пройти мимо Doom 2. Естественно мной были найдены разные моды (не исключено, что на дисках навигатора), которые как улучшали графику, так и включали разные изменения геймплея. Дум 2 меня не особо увлек, да и моддинг дума кажется был и остаётся гораздо более сложной задачей, чем просто открыть редактор карт. В какой то момент я узнал, что кроме doom 2, существует и его ещё более плоская версия под названием doom2d. С классическим аркадным геймплеем и конечно же со встроенным редактором карт. На самом деле освоить тот редактор было тоже не самой тривиальной задачей. Рисуешь вроде бы платформу, а персонаж почему то проваливается сквозь неё. Добавляешь лестницу — а персонаж проходит сквозь неё. Пришлось выучить понятия «слои»: задний фон, физические стены, передний фон, лестница, лифт. И его могущество триггер. В этом случае триггеры были вполне себе простейшим визуальным программированием. Так как где то в это же время я учился программировать на pascal (и delphi), у меня в голове вполне себе начинала складываться картинка, как работает дум2д в программном коде. Что в игровом движке существуют отдельные массивы объектов по типам и циклы, которые последовательно рисуют задний фон, стены, текстуры, воду и передний фон. А триггеры по набору условий (игрок близко, игрок нажал, есть такой то ключ) запускают нужную процедуру — открыть дверь или телепортировать объекты. Постепенно дум2д вывел меня на ремейк под названием doom2d:forever. Ремейк был написан на delphi и была открыта часть исходников, которые описывали формат хранения ресурсов.
Копировать и вставить
Знакомство с делфи стоит описать отдельно. Но само собой это тоже продолжение гейминга. К делфи я пришёлкак к современному (на тот момент) развитию языка turbo pascal. А паскаль у нас преподавали в качестве кружка информатики, куда мы ходили с одноклассниками пострелять в контру и порубиться в варкрафт 3. Халявный игровой зал быстро прикрыли, но дело было положено — я заинтересовался программированием. Родители купили мне учебник по turbo pascal, в надежде, что я буду меньше играть за компьютером. После учебника по турбо паскалю у меня появился учебник и по delphi 7, которым я пользовался как отличным справочником по классам и визуальным компонентам минимум несколько лет. А на один из дней рождения я получил книгу «DirectX и Delphi. Искусство программирования». Я вряд ли понимал хотя бы 10% из всего материала моих книг, но овладел мощнейшим методом программирования под название «copy‑paste», что позволило мне даже написать простейший 2д движок на DirectDraw. Но как и для многих, мечта написать свою полноценную игру на этом и остановилась.
Как стать оператором матрицы
Теперь снова вернёмся к ретро играм и на этот раз к приставкам. Те, у кого в детстве была приставка денди наверно помнят все эти многоигровки, перерисовки марио и прочие шедевры китайцев программистов. Воды всемогущего интернета выкинули меня на просторы ресурса emu‑land и его форум. На форуме был (и есть) раздел «ромхакинг и программирование». Одной из первых прикрепленных тем была была посвящена хаку Mortal Kombat 3 на sega от некого KABAL. Хак совмещал в себе всех бойцов из всех частей MK! Меня поразило, что это не просто перерисовка бойцов, а полноценная отдельная игра. Я просто не могу не привести тут байку (или правдивую историю?), о том, как был создан этот хак. Мне по памяти удалось с первой попытки нагуглить этот пост (тема на форме)
Настоящий оператор матрицы
Насколько я понял из сообщений KABAL_MK, он имеет весьма смутное представление о железе Sega Megadrive, в частности об ограничениях режимов адресации процессора M68000.
<...>
Машинный код этот парень редактирует прямо в шестнадцатиричном редакторе, при этом, ясное дело, не столько создаёт новый код, сколько копирует куски имеющегося кода из других сегментов/других игр (хотя за эти годы уже научился и свой писать, вроде).
<...>
Но писать AI прямо в машинных кодах??? - это тянет на кингу рекордов. КСТАТИ! Если Кабал появится здесь - пусть обязательно напишет мне в личку, гарантируется не пиво, но его софтверный аналог. :)
Что ещё замечено интересного.. Прямо в хекс‑р��дакторе Кабал пишет «заметки на полях» в виде ASCII‑комментариев вперемешку с кодом.
<...>
Сейчас хак MK всё ещё доступен по ссылке
Вдохновившись этой историей я часами сидел в отладчике nes эмулятора и изучал память любимых игр попутно выписывая интересные адреса в бумажный блокнотик. Но кроме с десятка практически однобайтовых ромхаков мне похвастаться было нечем. Хотя и хочется верить, что последний и крайне глючный хак «охотников за привидениями 2» был кем то замечен и послужил идей для полноценного хака на двоих игроков.
Во имя луны
Ещё одна из хороших аркад, которая в том числе игралась вдвоём за одним компьютером (как и дум2д), сильно продвинутый вариант battle city — «Танк: Зона смерти» (zod.borda.ru). Я не слишком много времени провёл в этой игре, но она достойна упоминания. Кто то знакомился с языком программирование lua через моды на World of Warcraft, но я же наткнулся на танчики с редактором карт и встроенным языком программирования. Да, конечно, я уже был знаком с редакторами из Warcraft 3 и Heroes 4, где можно было внедрять в карты свои скрипты. Но танчики оказались проще и не такими монструозными. Я уже достаточно уверенно чувствовал себя в программировании и склепал несколько карт с кастомными скриптами и какой то скрипт мод под классический battle city (и с простеньким генератором случайных карт). Новый для меня язык (тем более скриптовый) конечно ломал мне шаблоны мышления тем, что в редакторе карт можно было заниматься мета программированием (задавать имя функция как строка плюс переменная).
Тем временем я продолжал сидеть на форуме doom2d:forever. Был не слишком хорош в картоделании, но в какой то момент увидел возможность, где мог бы показать себя. Всё началось с движущихся платформ. В редакторе карт были вертикальные лифты, разные двери, но не было горизонтального лифта и простого способа (кроме длинной цепочки триггеров на открытие и закрытие дверей) сделать какое то подобие перемещение платформы. Помня мои опыты ромхакинга, я расчехлил старый добрый ArtMoney и достаточно быстро "взломал" игру на координаты платформ. Как почувствовать себя никак не меньше, чем магом или хакером из матрицы? Лёгким движением руки вбить в ArtMoney нужные значения и убрать вот эту стеночку куда подальше.
Теперь надо было как то оптимизировать процесс изменения памяти игры и желательно запрограммировать что то полезное. Процесс начался с написания простейшего «трейнера» на делфи, когда сторонняя программа получала доступ к памяти процесса и творила с ней что угодно. Постепенно я вышел на отладчик OllyDbg и даже на IDA Pro. Используя очень тёмное колдунство я примерно повторил путь heroes 3 WOG — добавил в exe файл загрузку своего dll файла и точечно модифицировал ассемблерный код, чтобы при разных событиях игры вызывался прыжок в dll. В коде dll было буквально несколько ассемблерных вставок чтобы не испортить стэк игры, а далее управление передавалось lua скриптам. И вот тут в исследовании дизассемблированного кода мне очень помог тот факт, что doom2d:f был написан на делфи. Я мог примерно сопоставлять ассемблерные инструкции с тем, как это могло выглядеть в исходном коде на дельфи.
Как и прочие мои поделки, такой хак остался не востребован и практически все исходники благополучно канули в лету. Часть файлов я случайно нашёл в dropbox, которым давно уже не пользуюсь (файлы датируются 2009 годом). Впрочем, в скором времени были выложены исходники игры, но мой интерес к игре уже прошёл.
Врезка моего lua мода в игру
function mods(nmod:integer):integer; stdcall;
var reax,recx,redx,rebx,redi,resi:integer;
begin
asm
mov reax, eax
mov recx, ecx
mov redx, edx
mov rebx, ebx
mov redi, edi
mov resi, esi
end;
case nmod of
MOD_TIME:
if LoadedScript then
begin
Time();
end;
MOD_EXIT:ExitAndFree;
MOD_STARTMAP:StartMap(reax);
MOD_FIRE_WEAPON:
asm
mov eax, rebx
call FireWeapon
end;
MOD_TRIGGER:if LoadedScript then //$00459DB0
asm
mov eax, resi
call Trigger
//mov eax, reax
//mov esi, resi
//mov edi, redi
//call Trigger_
//mov reax, eax
end;
MOD_DRAWHUD:
begin
if LoadedScript then DrawHUD;
asm
push reax
xor ecx, ecx
xor edx, edx
mov al, 0FFh
CALL sub_004219E0
mov reax, eax
end;
end;
end;
result:=reax;
end;Верните меня в матрицу
Несмотря на моё увлечение играми, в геймдев я не попал: не хватило таланта, в городе не было геймдев студий, в общем, не сложилось. Но начальные знания программирования и полусвободный график последних курсов универа (даже не на ИТ специальности) позволили мне устроиться в веб-студию. Там по по накатанной схеме я практически с нуля учил php и javascript. Что самое удивительное, в веб-студии мне даже платили зарплату. Это в сравнении с тем, что сегодня многим приходиться выложить круглую сумму за какие то там курсы по вкатыванию в ИТ.
Как я и мечтал, хоть какой то программист из меня да и вышел (не программист 1С и на том спасибо). Время от времени у меня случаются приступы ностальгии по былым временам, но когда я смотрю на современные достижения в ромхакинге, эмусцене или модов к героям 3, я понимаю, что безнадёжно отстал от жизни и погряз в болоте перекладывания формочек в базу данных и обратно. Поэтому остаётся только сказать спасибо старым добрым видеоиграм и отправляться в путь за новыми приключениями.
Интересные ссылки
Скрытый текст
Heroes 3
Ретро гейминг и творчество фанатов
Танки http://zod.borda.ru/
Doom2D:Forever https://doom2d.org/landing/index.html (старый основной сайт https://www.doom2d.org/download/df/)
Хак Ultimate Mortal Kombat Trilogy http://umk3.hacking-cult.org/rus/index.htm (не поддерживается, больше для истории).
Форум emu-land про ромхакинг и хаки игр https://www.emu-land.net/forum/index.php/board,34.0.html
