Half life 2 исходный код
Несколько дней назад в сети появилась одна из наиболее ранних на сегодняшний день версий Half-Life для прессы. О степени незавершенности того билда можно судить хотя бы по тому, что в игре центральным персонажем является не известный всему играющему миру очкастый физик-теоретик с защитным костюмом и монтировкой, а гномообразный бородач Иван, космический байкер, противоборствующий персоналу научно-исследовательского центра. 15 лет назад содержимое диска предназначалось исключительно для представителей регулярных печатных изданий.
Но куда более интересной остается история наиболее ранней, так сказать, демо-версии сиквела игры и путь её попадания в руки геймеров. Для того, чтобы понять, как это всё началось, вернемся на десять лет назад.
Half-Life 2 была лишь мимолетным слухом, будоражившим умы геймеров, но на выставке E3 в мае 2003 года демонстрация продукта произвела на публику настолько сильное впечатление, что ещё невышедшая видеоигра получила несколько наград. В Сиэттле говорили о дате релиза в сентябре 2003 года, и якобы незаскриптованные сцены геймплея на E3 заставляли в это верить.
В то же время на другом конце света, в крошечном (чуть больше двух тысяч человек населения) городке Шёнау в Германии проживал со своим отцом 22-летний Аксель Джембе, хакер, которому было уготовано сыграть в этой пьесе главную роль. Мир взлома затянул геймера случайно — однажды он скачал и установил программу-вирус sdbot, маскировавшийся под генератор ключей Warcraft III, но вместо того, чтобы почистить систему и забыть о трояне, Джембе подверг продукт обратному инжинирингу и изучил принципы её работы.
Программа управлялась посредством IRC-сервера, и Аксель выследил его оператора. Опять же, вместо того, чтобы сдать его правоохранительным структурам, Джембе начал задавать вопросы о вредоносном программном обеспечении. Сегодня он является обладателем аккаунта Steam с играми на 2 тыс. евро, но в то время он не был настолько финансово независим. Поэтому начинающий взломщик создал свой зловред, ворующий CD-ключи, чтобы получать доступ к играм, в которые Джембе жаждал сыграть. Со временем его Agobot стал одним из самых опасных троянов той эпохи, в основном благодаря грамотному выбору незакрытых уязвимостей Windows.
Преступная деятельность Джембе подогревалась не желанием получить прибыль или нанести убытки, а лишь его страстью к видеоиграм. Среди любимых была и Half-Life. Как и все остальные её поклонники, в 2002 году Аксель страдал от отсутствия любых намеков на сиквел, что натолкнуло его на мысль о взломе корпоративной сети Valve.
В логах сканов портов Аксель нашел не фильтруемый файерволлом сервер вне сети Valve, который принадлежал компании Tangis, занимавшейся носимыми компьютерными устройствами. На нем был общедоступый для записи корень сайта, в который взломщик выгрузил ASP-скрипты. Таким образом, Джембе получил доступ в нутро корпоративной сети с первой попытки. Аксель выгрузил дамп хэшированных паролей пользователей системы, а благодаря технической базе Швейцарской высшей технической школы Цюриха по нему были быстро восстановлены пароли.
Осматривая окружение, Джембе натыкался на документы, проектные требования, заметки о создании игры — именно то, за чем он и пришел. С другой стороны, даже спустя недели о факте проникновения в Valve так никто и не подозревал, поэтому хакер осмелел. На одной из машин он обнаружил исходные коды игры, в которую ему не терпелось поиграть. Благодаря производительности системы управления версиями Perforce выгрузка не доставила особых хлопот.
Игра, однако, так и не запускалась на компьютере Акселя. Он отключил шейдеры, что сделало её куда скучней. Взломщик вспомнил, что у кода было несколько форков, которые Джембе стал проверять подряд.
Аксель уверяет, что в публичный доступ код не выкладывал, а лишь дал одному знакомому хвастовства ради, слабо задумываясь о последствиях. Знакомый же обещал не допускать утечки, но своего слова не сдержал. Остановить распространение после попадания в сети битторрент было невозможным, и 2 октября 2003 года исходники незаконченной игры стали доступны любому желающему.
Сообщество игроков отреагировало неоднозначно. На тот момент выход Half-Life 2 уже задерживался, и из утекшего материала становилось очевидным, что игра абсолютно точно не была бы выпущена к концу 2003 года. На самом деле утечка включала в себя карты, разрабатывавшиеся в неустановленные временные промежутки, но сам факт того, что все показанные на E3 сценки были жестко заскриптованы, хотя утверждалось обратное, вызвал гнев поклонников. Так или иначе, но сообщество не смогло ничем помочь.
Внутри Valve происходили неприятные процессы: настроение разработчиков после утечки продукта, месяц работы над которым обходился в 1 млн. долларов, упало, а релиз игры трудно было представить в обозримом будущем. Один из молодых дизайнеров однажды спросил Ньюэлла: «Не убьет ли это компанию?»
15 февраля 2004 года хакер вышел на связь с Valve и объяснил непреднамеренную природу совершенных им действий. Джембе рассказал, что никогда не желал нанести подобный ущерб, и сожалел о том, как события получили развитие. Во втором письме наивный молодой человек, мечтавший работать на какого-нибудь игроразработчика, попросил Гейба трудоустроить его в компании.
Неожиданно, Ньюэлл ответил утвердительно, и предложил провести интервью по телефону. Понятно, что от Джембе им требовалось лишь признание совершения противоправных действий, записанное на пленку, — типичный трюк ФБР, основанный на чувстве гордости, присущем любому человеку и особенно взломщику компьютерных систем безопасности. Интервью с хакером провел Альфред Рейнольдс, разработчик Counter Strike и Steam и будущий автор сценария Portal Эрик Уолпо, хотя последний сомневается в рассказе Акселя, поскольку на тот момент в Valve он ещё не работал.
За сорок минут хакера детально расспросили о деталях взлома, проникновения в сеть, навыках и опыте, и Джембе, потеряв всякое чувство вины в присутствии своих кумиров, рассказал всё. Аксель получил приглашение на второе интервью, на этот раз на американской земле, в Сиэттле, в офисе Valve. Однако, из-за вопросов доступа к серверам Valve в ФБР решили брать Джембе прямо в Германии и не использовать эту ловушку.
Утро 7 мая 2004 года было не очень приятным для Акселя: в его собственной постели его разбудили вооруженные люди, предъявили обвинения в проникновении в сеть американской корпорации и нанесении ущерба на сумму свыше 250 млн. долларов и довезли до полицейского участка. С того дня для молодого взломщика начались разнообразные разбирательства: поначалу его подозревали в причастности к червю Sasser, поскольку тот подобно зловредам Джембе использовал уязвимость сервера проверки подлинности локальной системы безопасности Windows.
Затем вопросы сместились в русло взлома сети Valve. Аксель пошел на сотрудничество и честно и откровенно рассказал всё, не требуя адвоката. Джембе вспоминает, что мотивы взлома вызывали у допрашивающего лишь симпатии. Взломщик провел две недели в тюрьме, и лишь убедившись, что Аксель не скроется, полицейские решили отпустить его.
Не следует думать, что взломщику не повезло: обращение с ним в США могло быть куда строже. Ожидая суда, Джембе старался изменить свою жизнь к лучшему. Он закончил свое профессиональное образование и устроился на работу в область компьютерной безопасности. Теперь его работа заключалась в настройке систем и закрытии «дыр», а не использовании их в своих целях.
Наконец, в ноябре 2006 года состоялся суд, который длился семь часов, но ни один из представителей Valve на нем не присутствовал. Отсутствие доказательств публикации исходников говорило в пользу Акселя, хотя признание проникновения в частную сеть корпорации было уже зафиксировано. Суд принял в расчет трудное детство хакера, и единственное наказание, которое он получил, — это два года условного срока.
К моменту суда было продано уже 8,6 млн. копий наконец вышедшей Half-Life 2, что било все мыслимые рекорды. Выпущенная 16 ноября 2004 года игра является третьей по продажам неконсольной видеоигрой в истории. Трудно сказать, ухудшила или улучшила продажи эта утечка кода. Сегодня в Valve предпочитают не говорить на эту тему, а модификациям, использующим украденные исходники, присваивается статус нелегальных, и за почти десять лет так и не было выпущено ни одного официального заявления на тему утечки.
В мире существует множество игровых движков, но нет ни одного движка, похожего на Source своей историей и особенностями.
В этом (пилотном) уроке мы разберем простейшие действия с исходными кодами SDK, а также внесем наше первое изменение в код Half-Life 2.
Введение в сурс дела
Репозиторий
Исходный код SDK находится в репозитории на GitHub. Склонируйте его в любое удобное для вас место:
Выбор ветки
Если вы хотите написать свой первый мод для Half-Life 2/Episode 1/2, то используйте директорию sp/ и Source SDK Base 2013 Singleplayer.
Если же вы извращенец и хотите написать свой первый мод для Half-Life 2: Deathmatch, то используйте директорию mp/ и Source SDK Base 2013 Multiplayer.
ВАЖНО: Туториал будет рассматривать программирование под ветку SP, поэтому пути, содержащие hl2 в пересчете на MP могут содержать hl2mp вместо hl2 .
Стиль кода
Клиентские (client.dll) классы именуются с префиксом C_ , а серверные (server.dll) — с префиксом C :
Поля класса именуются с префиксом m_, использование венгерской нотации рекомендуется (на то есть свои причины, которые здесь обсуждать нет смысла):
Структура кода
SDK, так же как и движок, разделён на несколько частей.
Список проектов сгенерированных проектов- client.dll
Клиентская часть игры.
Отвечает за рендеринг, предсказания и ввод.
Расположена: src/game/client/ - server.dll
Серверная часть игры.
Отвечает за игровую логику, ИИ и т.д.
Расположена: src/game/server/ - tier1.lib
Библиотека, содержащая в себе множество полезных фич, например UTL ("валвовская" версия STL), interface convention и т.д.
Расположена: src/tier1/ - raytrace.lib
Библиотека, внезапно содержащая в себе функции и типы, предназначенные для рейтрейсинга. Честно говоря, я так и не понял, что библиотека для компиляторов делает здесь.
Используется компилятором vrad и, судя по утечкам исходных кодов, редактором уровней Valve Hammer Editor.
Расположена: src/raytrace/ - mathlib.lib
Библиотека, содержащая в себе множество типов и функций, используемых в "повседневной" математике Source.
Расположена: src/mathlib/ - vgui_controls.lib
Библиотека, содержащая в себе реализации разных элементов (кнопки, панели) VGUI2.
Используется почти повсеместно.
Расположена: src/vgui2/vgui_controls/
Source SDK имеет свой генератор проектов (sln, Makefile, etc.) с блэкджеком и… кхм…
Называется он Valve Project Creator и находится в src/devtools/bin .
Проекты генерируются автоматически с использованием специальных .VPC файлов. Синтаксис этих файлов прост до безобразия — простой набор пар ключ-значение.
Вот пути до некоторых таких файлов:
ВАЖНО: При внесении ЛЮБЫХ изменений в VPC файл решение должно быть заново перегенерировано!
Генерация проектов
Проекты генерируются вызовом скрипта, расположенного в директории src/ .
В самом простом случае — достаточно просто открыть src/creategameprojects.bat .
После генерации в src/ будет находиться games.sln.
Исключение HL2
SDK имеет внутри себя также разделение на HL2 и Episodic. Использование второго позволит нам иметь некоторые фичи, например отдельную от стамины шкалу заряда фонарика.
И поэтому, чтобы не компилировать лишний код, мы можем просто исключить HL2 из скриптов:
- Откройте src/creategameprojects.bat в любом текстовом редакторе.
- Удалите из командной строки часть /hl2
- Сохраните файл и сгенерируйте проект.
Другие скрипты
Рядом с creategameprojects.bat также лежит его клон для bash а также два интересных файла — createallprojects.bat и его клон для bash.
Эти два скрипта заставляют VPC создавать проекты не только для чистых библиотек мода, но и для различных утилит, таких как vrad (Radiosity!) или height2normal.
Сейчас использовать я его вам настоятельно не рекомендую, так как свои собственные компиляторы карт нам пока не нужны.
Первичная сборка и запуск
Сборка
Чтобы удостовериться, что вы всё сделали правильно, необходимо собрать всё сгенерированное решение. Итак, собираем (вы же ведь открыли решение в IDE?):
- Переключите конфигурацию в Release.
ВАЖНО: При сборке в Debug мод крайне нестабилен. - Соберите ВСЁ решение (F6)
- Если сборка закончилась с ошибками, повторите шаг 2.
- Если ошибки повторяются, пересоздайте проекты (creategameprojects) и повторите все шаги начиная с 1.
После сборки в папке game/mod_hl2/bin/ или game/mod_episodic/bin/ должны появится наши клиентская и серверная библиотеки!
Запуск — Способ 1 — Steam
- Копируем нашу папку mod_xxx в путь/до/Steam/steamapps/sourcemods/
- Перезапускаем Steam (либо запускаем, если еще этого не сделали. )
- Ищем в библиотеке "My First Episodic Mod" или "My First HL2 Mod"
- В свойствах устанавливаем дополнительные параметры командной строки:
- Запускаем, в консоли запускаем карту sdk_vehicles (SP) или dm_lockdown (MP)
Запуск — Способ 2 — Visual Studio
Я рекомендую использовать именно этот способ — не копировать же бинарники мода каждый раз после сборки!
- Заходим в свойства проекта (не решения. ) во вкладку Debugging
- В поле Command вписываем:
- В поле Working Directory вписываем:
- В поле Command Arguments вписываем:
- Сохраняем, запускаем (F5)!
- Запускаем, в консоли запускаем карту sdk_vehicles (SP) или dm_lockdown (MP)
Если карта загрузилась и вы можете передвигаться и двигать камеру мышью — сборка успешна!
Первая модификация в коде
Функции семейства Msg()
Функции Msg() , DevMsg() , Warning() , DevWarning() и ConColorMsg() являются чем-то вроде классического printf() , но в мире программирования под Source SDK. Эти функции так или иначе выводят какой-то текст в консоль разработчика и debug output.
Говорящий пистолет!
Вступление
Немножко терминов
Сам по себе Source SDK — набор утилит и программ, помогающих в разработке собственных уровней и модификаций для игры, а также исходные коды Half-Life 2 и эпизодов.
Игра/Мод (Для сурса нет никакой разницы, игра это или мод :p) — скомпилированные исходные коды SDK.
Так почему же именно Source?!
- Модульность. Это может показаться минусом для некоторых, но почти все подсистемы движка вынесены в отдельные модули, каждый из которых может быть заменен без пересборки всего движка.
- Чрезвычайная гибкость. При достаточном количестве усилий вы можете сделать на Source игру абсолютно любого жанра.
- Движок и SDK разрабатывались огромным количеством людей, поэтому код SDK (а также утекший в сеть три раза код движка разных версий, но об этом позже ( ͡° ͜ʖ ͡°) ) состоит из множества разных стилей программирования! Я почти уверен, что именно работа с Source SDK подарила мне умение (но не желание. ) читать чужой код.
- Порог вхождения. Он не слишком низок и не слишком высок. Достаточно знать C++ и уметь вчитываться в документацию!
- К моменту появления идеи о написании туториала у автора попросту не было новой версии юнити.
Что нам необходимо?
- Ну прежде всего хотя бы базовые знания C++ (Достаточно знать его на уровне Си с классами).
- Любая Microsoft Visual Studio с Multibyte MFC Library и Microsoft Build Tools 2013 (v120/v120_xp). Чтобы не морочить себе голову, можно просто установить VS2013. или любой другой.
- Steam с установленным Source SDK Base 2013 [Single|Multi]player (также необходимо в свойствах "игры" установить бета-версию upstream, иначе мод будет падать)
- В будущем также знание HLSL, но не сейчас :)
Читайте также: