Речь пойдёт про ностальгию и первые игры. Те самые первые игры, которые навсегда остаются в памяти, как огромные сугробы чистейшего белого снега (а не коричневого с желтым), про те игры, которые живы и спустя десятки лет и про то, какое место они могут занимать в нашей жизни.
Краткий список, наиболее важных игр на ПК, которые несомненно повлияли на мою жизнь больше, чем какие либо ещё явления или события может выглядеть так: 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 байта».
Во имя богов
![Командиры в WOG Командиры в WOG](https://habrastorage.org/getpro/habr/upload_files/9f4/e2f/004/9f4e2f0048358c75020fd68aff1e48b8.jpg)
Если варкрафт 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
Комментарии (8)
ch1971
12.02.2025 05:51по моему если и есть игра которая учит думать как программист то это факторио. если человек создал там замкнутый процесс имени Коварекса то его смело можно учить программировать даже если он в программирование ноль.
wilelf
12.02.2025 05:51Эти игры, конечно, умели учить программрованию.
Но мы начали программировать гораздо раньше. Когда и игр-то было раз-два-обчелся. Приходилось писать свои, т.к. даже магнитофона для загрузки не было. Вся зарплата ушла на Спектрум.
А сейчас придет кто-то ещё, и напишет, что впервые играл в перфокарты... И уже тогда научился мухлевать.
aboutmurena
12.02.2025 05:51Музыкальные инструменты и механические музыкальные инструменты: История автоматических музыкальных инструментов начинается с 9 века, когда персидские изобретатели братья Бану Муса изобрели гидроприводный орган с взаимозаменяемыми цилиндрами с шипами и автоматическую флейту на паровой тяге. Это были самые ранние механические музыкальные инструменты и первые программируемые музыкальные секвенсоры.
sbw
12.02.2025 05:51Была какая-то игра, то ли покер, то ли тетрис, где по мере прохождения постепенно открывалась эротическая картинка (качество конечно так себе, поскольку в палитре было что-то вроде 16 цветов). Я тогда не поленился написать программку на Бейсике, чтобы вытащить из файлов игры все имеющиеся картинки и посмотреть их ))
freylis
<зануда>А что такое Morrowind 2 ? Morrowind единственный и неповторимый :)</зануда>
Смутно помнится какой-то такой разговор с пацанами во дворе:
-- слышал про программу Artmoney? С ней можно получить бесконечное золото в ...
-- неа. расскажи.
-- ну ты несколько раз меняешь количество золота, запоминая его в программу. а потом, когда она найдет где лежит именно это количество, можешь поменять значение на нужное тебе
-- круто! а как это делает? все игры ведь разные
-- а хз. я в Игромании читал
artptr86
Давным давно мне вещали, что есть игры Morrowind 3: The Elder Scrolls и Morrowind 4: Oblivion :)