Half life sdk что это

Обновлено: 07.07.2024

The Half-Life SDK contains many programs useful for editing GoldSrc-based games, such as Half-Life. It also contains the source code for Half-Life, Deathmatch Classic and Ricochet, which can be edited to introduce new entities, monsters or left as is and used as a base. It also contains 3DS Max and .smd source files for models, and sources of two Half-Life storyline maps and one map used as beam demonstration.

Введение в сурс дела

Репозиторий

Исходный код 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 из скриптов:

  1. Откройте src/creategameprojects.bat в любом текстовом редакторе.
  2. Удалите из командной строки часть /hl2
  3. Сохраните файл и сгенерируйте проект.
Другие скрипты

Рядом с creategameprojects.bat также лежит его клон для bash а также два интересных файла — createallprojects.bat и его клон для bash.

Эти два скрипта заставляют VPC создавать проекты не только для чистых библиотек мода, но и для различных утилит, таких как vrad (Radiosity!) или height2normal.

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

Первичная сборка и запуск

Сборка

Чтобы удостовериться, что вы всё сделали правильно, необходимо собрать всё сгенерированное решение. Итак, собираем (вы же ведь открыли решение в IDE?):

  1. Переключите конфигурацию в Release.
    ВАЖНО: При сборке в Debug мод крайне нестабилен.
  2. Соберите ВСЁ решение (F6)
  3. Если сборка закончилась с ошибками, повторите шаг 2.
  4. Если ошибки повторяются, пересоздайте проекты (creategameprojects) и повторите все шаги начиная с 1.

После сборки в папке game/mod_hl2/bin/ или game/mod_episodic/bin/ должны появится наши клиентская и серверная библиотеки!

Запуск — Способ 1 — Steam
  1. Копируем нашу папку mod_xxx в путь/до/Steam/steamapps/sourcemods/
  2. Перезапускаем Steam (либо запускаем, если еще этого не сделали. )
  3. Ищем в библиотеке "My First Episodic Mod" или "My First HL2 Mod"
  4. В свойствах устанавливаем дополнительные параметры командной строки:
  5. Запускаем, в консоли запускаем карту sdk_vehicles (SP) или dm_lockdown (MP)
Запуск — Способ 2 — Visual Studio

Я рекомендую использовать именно этот способ — не копировать же бинарники мода каждый раз после сборки!

  1. Заходим в свойства проекта (не решения. ) во вкладку Debugging
  2. В поле Command вписываем:
  3. В поле Working Directory вписываем:
  4. В поле Command Arguments вписываем:
  5. Сохраняем, запускаем (F5)!
  6. Запускаем, в консоли запускаем карту sdk_vehicles (SP) или dm_lockdown (MP)

Если карта загрузилась и вы можете передвигаться и двигать камеру мышью — сборка успешна!


Первая модификация в коде

Функции семейства Msg()

Функции Msg() , DevMsg() , Warning() , DevWarning() и ConColorMsg() являются чем-то вроде классического printf() , но в мире программирования под Source SDK. Эти функции так или иначе выводят какой-то текст в консоль разработчика и debug output.

Говорящий пистолет!

Искусственный интеллект Half-Life SDK: ретроспектива

image

На момент выпуска в 1998 году Half-life получил тёплый приём за свой гейм-дизайн, который стал возможным благодаря искусственному интеллекту. Это влияние AI привело к тому. что HL назвали одной из самых важных игр в истории.

И даже двадцать лет спустя, изучив её код, можно многое узнать о создании простых, но эффективных систем AI. Вся логика AI жёстко закодирована на C++ и не слишком объектоориентирована, поэтому в ней гораздо легче разобраться, чем в более свежих движках (хотя и расширять её не так просто).

Cooperative AI and Monsters

В этой статье мы рассмотрим открытый SDK для Half-Life 1, проанализируем различные аспекты AI, такие как система планировщика задач, её реализация, похожая на конечные автоматы, и сенсорная система. Прочитав статью, вы глубже поймёте принцип использования этих концепций и их реализации в играх.


Скриншот 1: охранник Барни сражается с одним из монстров

Загрузка Half-Life SDK

Установить SDK Valve для Half-Life очень просто (с отличие от инструментов F.E.A.R.) и если вы хотите разрабатывать моды, то для него требуется только оригинальная игра. Вот, что вам будет нужно:

  1. Скачайте версию 2.3 SDK Half-Life, или только исходники без ресурсов, или копию полного SDK с моделями.
  2. Распакуйте файл в любой каталог, лучше в папку с игрой, если вы хотите разрабатывать с помощью SDK моды. Это займёт несколько секунд, в результате у вас будет пачка каталогов с моделями и исходным кодом.

Разбираемся с кодом

Кодовая база не так хорошо структурирована, как в F.E.A.R. или даже в Quake 3. В ней есть несколько подкаталогов, но файлы имеют не очень понятные названия, а реализация классов C++ разбросана по нескольким файлам, из названий которых почти ничего нельзя понять.

  • В полном SDK есть две папки, в которых содержится код: Single-Player Source и Multiplayer Source . Обе они имеют схожую структуру каталогов.
  • Бо́льшая часть игровой логики находится в подкаталоге /dll/ , в котором содержатся все файлы, необходимые для сборки hl.dll, который также является фреймворком для модов. Кроме того, в этом каталоге содержится код ИИ, разбросанный по множеству файлов, с названиями типа *monster*.[h,cpp] , *ai*.[h,cpp] и других файлах
  • В каталоге с исходным кодом есть и другие каталоги, например engine , в котором содержатся файлы заголовков, взаимодействующие с основным исполняемым файлом (как базовые сущности). В каталоге common также содержатся похожие низкоуровневые файлы, используемые движком и кодом игры.

Scientist AI


Скриншот 3: катсцена из игры с учёным.

Планировщик и система целей

В файлах schedule.[h,cpp] находится очень простая система, управляемая целями. Она состоит из нескольких уровней задач, которые можно процедурно объединять.

Задачи

Задачи — это короткие атомизированные поведения, имеющие конкретное назначение. Например, большинство акторов Half-Life поддерживает следующие задачи: TASK_WALK_PATH , TASK_CROUCH , TASK_STAND , TASK_GUARD , TASK_STEP_FORWARD , TASK_DODGE_RIGHT , TASK_FIND_COVER_FROM_ENEMY , TASK_EAT , TASK_STOP_MOVING , TASK_TURN_LEFT , TASK_REMEMBER . Они определяются как перечисления в файле заголовка и реализуются как методы C++.

Условия

Условия используются для выражения ситуации актора в мире. Поскольку логика задана жёстко, условия можно выразить очень компактно, как битовые поля, но в таком случае условий может быть не больше 32. Например, условиями являются COND_NO_AMMO_LOADED , COND_SEE_HATE , COND_SEE_FEAR , COND_SEE_DISLIKE , COND_ENEMY_OCCLUDED , COND_ENEMY_TOOFAR , COND_HEAVY_DAMAGE , COND_CAN_MELEE_ATTACK2 , COND_ENEMY_FACING_ME .

Планы

План состоит из серии задач (с произвольными параметрами) и учитывает битовое поле условий, чтобы определить, когда план неприменим. Для удобства отладки объекты планов имеют имена.

Цели находятся на более высоком уровне и состоят из планов. Логика цели может при необходимости выбирать план на основании проваленной задачи и текущего контекста. Примеры целей из Half-Life: GOAL_ATTACK_ENEMY , GOAL_MOVE , GOAL_TAKE_COVER , GOAL_MOVE_TARGET и GOAL_EAT .

Использованный Valve код извлечён из движка Quake, и до сих пор достаточно очевиден, несмотря на то, что был преобразован в C++; файлы и struct имеют похожие названия.



Скриншот 4: десантники подняли тревогу в исследовательском центре.

Конечный автомат

На практике все эти планы и задачи соединены вместе в структуру, похожую на конечный автомат. На верхнем уровне для обновления ИИ вызывается функция в monsterstate.cpp :


Она, в свою очередь, вызывает перегруженные функции, отвечающие за проверку с помощью MaintainSchedule() применимости текущего плана и выбор новых с помощью GetSchedule() . Их можно изменять в зависимости от потребностей с помощью порождённых классов, см., например, barney.cpp или scientist.cpp .

На нижнем уровне функции StartTask() и RunTask() реализуют логику для каждого из идентификаторов задач, определённых в конструкции enum . Они реализованы в классах, тоже унаследованных из CBaseMonster . В результате это во многом выглядит как конечный автомат, реализованный как конструкция switch .


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

Интересно также заметить, что AI хранит два состояния: одно идеальное и одно текущее. Таким образом коду игры проще создавать для акторов цели, и заставлять их находить наилучшие способы их достижения. Это интересное сочетание конечного автомата и целенаправленной системы.



Скриншот 5: игровая катсцена с учёным.

Реализация сенсорной системы

В базовом monster.[h,cpp] есть код, дающий всем акторам зрение, обоняние и слух.


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


Код слуха и обоняния работает похожим образом, только использует события звука. Хранится список объектов, требующих внимания монстров, а сенсорная система выбирает для фокусировки лучший из них.

Итоги и дополнительное чтение

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



Скриншот 6: стихийное поведение отрядов в Half-Life.

Editions

Standard SDK

The Standard SDK contains source code, launcher graphics toolkit and several help files along with all content from Model and Map SDK, Texture SDK and Sprite SDK.

Full SDK

The Full SDK contains everything that Standard SDK includes and also sources for certain monster models and all weapon models. Before SDK version 2.1 it was given only to modders who have signed a non-disclosure agreement with Valve and was known as Professional SDK.

Source code only

A special edition of SDK, containing only source code, exists for version 2.3, which does not exist in Standard edition.

Model and Map SDK

The Model and Map SDK, commonly known as Mini SDK, contains player model sources, sources for Gluon Gun and MP5 models, Valve Hammer Editor, sources for two storyline maps and one beam system demonstration map and networking code help file. Its content is included in Standard and Full editions.

Texture SDK

The Texture SDK contains only parts necessary for texture creation. Its content is included in Standard and Full editions.

Sprite SDK

The Sprite SDK contains only parts necessary for sprite creation. Its content is included in Standard and Full editions.

Commercial SDK

Commercial licensees of GoldSrc, such as Gearbox Software, receive special and extended edition of the SDK. Its content is unknown.

Искусственный интеллект Half-Life SDK: ретроспектива

image

На момент выпуска в 1998 году Half-life получил тёплый приём за свой гейм-дизайн, который стал возможным благодаря искусственному интеллекту. Это влияние AI привело к тому. что HL назвали одной из самых важных игр в истории.

И даже двадцать лет спустя, изучив её код, можно многое узнать о создании простых, но эффективных систем AI. Вся логика AI жёстко закодирована на C++ и не слишком объектоориентирована, поэтому в ней гораздо легче разобраться, чем в более свежих движках (хотя и расширять её не так просто).

Cooperative AI and Monsters

В этой статье мы рассмотрим открытый SDK для Half-Life 1, проанализируем различные аспекты AI, такие как система планировщика задач, её реализация, похожая на конечные автоматы, и сенсорная система. Прочитав статью, вы глубже поймёте принцип использования этих концепций и их реализации в играх.


Скриншот 1: охранник Барни сражается с одним из монстров

Загрузка Half-Life SDK

Установить SDK Valve для Half-Life очень просто (с отличие от инструментов F.E.A.R.) и если вы хотите разрабатывать моды, то для него требуется только оригинальная игра. Вот, что вам будет нужно:

  1. Скачайте версию 2.3 SDK Half-Life, или только исходники без ресурсов, или копию полного SDK с моделями.
  2. Распакуйте файл в любой каталог, лучше в папку с игрой, если вы хотите разрабатывать с помощью SDK моды. Это займёт несколько секунд, в результате у вас будет пачка каталогов с моделями и исходным кодом.

Разбираемся с кодом

Кодовая база не так хорошо структурирована, как в F.E.A.R. или даже в Quake 3. В ней есть несколько подкаталогов, но файлы имеют не очень понятные названия, а реализация классов C++ разбросана по нескольким файлам, из названий которых почти ничего нельзя понять.

  • В полном SDK есть две папки, в которых содержится код: Single-Player Source и Multiplayer Source . Обе они имеют схожую структуру каталогов.
  • Бо́льшая часть игровой логики находится в подкаталоге /dll/ , в котором содержатся все файлы, необходимые для сборки hl.dll, который также является фреймворком для модов. Кроме того, в этом каталоге содержится код ИИ, разбросанный по множеству файлов, с названиями типа *monster*.[h,cpp] , *ai*.[h,cpp] и других файлах
  • В каталоге с исходным кодом есть и другие каталоги, например engine , в котором содержатся файлы заголовков, взаимодействующие с основным исполняемым файлом (как базовые сущности). В каталоге common также содержатся похожие низкоуровневые файлы, используемые движком и кодом игры.

Scientist AI


Скриншот 3: катсцена из игры с учёным.

Планировщик и система целей

В файлах schedule.[h,cpp] находится очень простая система, управляемая целями. Она состоит из нескольких уровней задач, которые можно процедурно объединять.

Задачи

Задачи — это короткие атомизированные поведения, имеющие конкретное назначение. Например, большинство акторов Half-Life поддерживает следующие задачи: TASK_WALK_PATH , TASK_CROUCH , TASK_STAND , TASK_GUARD , TASK_STEP_FORWARD , TASK_DODGE_RIGHT , TASK_FIND_COVER_FROM_ENEMY , TASK_EAT , TASK_STOP_MOVING , TASK_TURN_LEFT , TASK_REMEMBER . Они определяются как перечисления в файле заголовка и реализуются как методы C++.

Условия

Условия используются для выражения ситуации актора в мире. Поскольку логика задана жёстко, условия можно выразить очень компактно, как битовые поля, но в таком случае условий может быть не больше 32. Например, условиями являются COND_NO_AMMO_LOADED , COND_SEE_HATE , COND_SEE_FEAR , COND_SEE_DISLIKE , COND_ENEMY_OCCLUDED , COND_ENEMY_TOOFAR , COND_HEAVY_DAMAGE , COND_CAN_MELEE_ATTACK2 , COND_ENEMY_FACING_ME .

Планы

План состоит из серии задач (с произвольными параметрами) и учитывает битовое поле условий, чтобы определить, когда план неприменим. Для удобства отладки объекты планов имеют имена.

Цели находятся на более высоком уровне и состоят из планов. Логика цели может при необходимости выбирать план на основании проваленной задачи и текущего контекста. Примеры целей из Half-Life: GOAL_ATTACK_ENEMY , GOAL_MOVE , GOAL_TAKE_COVER , GOAL_MOVE_TARGET и GOAL_EAT .

Использованный Valve код извлечён из движка Quake, и до сих пор достаточно очевиден, несмотря на то, что был преобразован в C++; файлы и struct имеют похожие названия.



Скриншот 4: десантники подняли тревогу в исследовательском центре.

Конечный автомат

На практике все эти планы и задачи соединены вместе в структуру, похожую на конечный автомат. На верхнем уровне для обновления ИИ вызывается функция в monsterstate.cpp :


Она, в свою очередь, вызывает перегруженные функции, отвечающие за проверку с помощью MaintainSchedule() применимости текущего плана и выбор новых с помощью GetSchedule() . Их можно изменять в зависимости от потребностей с помощью порождённых классов, см., например, barney.cpp или scientist.cpp .

На нижнем уровне функции StartTask() и RunTask() реализуют логику для каждого из идентификаторов задач, определённых в конструкции enum . Они реализованы в классах, тоже унаследованных из CBaseMonster . В результате это во многом выглядит как конечный автомат, реализованный как конструкция switch .


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

Интересно также заметить, что AI хранит два состояния: одно идеальное и одно текущее. Таким образом коду игры проще создавать для акторов цели, и заставлять их находить наилучшие способы их достижения. Это интересное сочетание конечного автомата и целенаправленной системы.



Скриншот 5: игровая катсцена с учёным.

Реализация сенсорной системы

В базовом monster.[h,cpp] есть код, дающий всем акторам зрение, обоняние и слух.


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


Код слуха и обоняния работает похожим образом, только использует события звука. Хранится список объектов, требующих внимания монстров, а сенсорная система выбирает для фокусировки лучший из них.

Итоги и дополнительное чтение

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



Скриншот 6: стихийное поведение отрядов в Half-Life.

Вступление

Немножко терминов

Сам по себе Source SDK — набор утилит и программ, помогающих в разработке собственных уровней и модификаций для игры, а также исходные коды Half-Life 2 и эпизодов.

Игра/Мод (Для сурса нет никакой разницы, игра это или мод :p) — скомпилированные исходные коды SDK.

Так почему же именно Source?!

  1. Модульность. Это может показаться минусом для некоторых, но почти все подсистемы движка вынесены в отдельные модули, каждый из которых может быть заменен без пересборки всего движка.
  2. Чрезвычайная гибкость. При достаточном количестве усилий вы можете сделать на Source игру абсолютно любого жанра.
  3. Движок и SDK разрабатывались огромным количеством людей, поэтому код SDK (а также утекший в сеть три раза код движка разных версий, но об этом позже ( ͡° ͜ʖ ͡°) ) состоит из множества разных стилей программирования! Я почти уверен, что именно работа с Source SDK подарила мне умение (но не желание. ) читать чужой код.
  4. Порог вхождения. Он не слишком низок и не слишком высок. Достаточно знать C++ и уметь вчитываться в документацию!
  5. К моменту появления идеи о написании туториала у автора попросту не было новой версии юнити.

Что нам необходимо?

  1. Ну прежде всего хотя бы базовые знания C++ (Достаточно знать его на уровне Си с классами).
  2. Любая Microsoft Visual Studio с Multibyte MFC Library и Microsoft Build Tools 2013 (v120/v120_xp). Чтобы не морочить себе голову, можно просто установить VS2013. или любой другой.
  3. Steam с установленным Source SDK Base 2013 [Single|Multi]player (также необходимо в свойствах "игры" установить бета-версию upstream, иначе мод будет падать)
  4. В будущем также знание HLSL, но не сейчас :)

Source Modding — Часть 1 — Основы основ

В мире существует множество игровых движков, но нет ни одного движка, похожего на Source своей историей и особенностями.

В этом (пилотном) уроке мы разберем простейшие действия с исходными кодами SDK, а также внесем наше первое изменение в код Half-Life 2.


Читайте также: