Гордон Фримен

Half-Life Inside: всё о вселенной Half-Life

По рельсам: почему всё то, что вам нравилось в Half‑Life, на самом деле было тайным поездом

В февральском номере журнала PC Gamer за 2014 год была опубликована очень интересная статья. На самом деле это даже не статья, а отрывок из грядущей книги Роберта Янга про устройство Half‑Life.

Автор рассказывает, как простые нововведения в игровом движке позволили Valve создать невиданные на то время игровые ситуации. В приведённом отрывке детально объяснено, как игра использует поезда для дизайна самых интересных моментов.

Трейнспоттинг*

Более чем 15 лет тому назад увидел свет Half‑Life, получив оглушительный коммерческий успех и общественное признание. Это игра про... на самом деле ответ зависит от того, кому вы задаёте этот вопрос. Для кого-то это игра про Гордона Фримена, рядового физика, вынужденного выживать в секретном правительственном исследовательском центре после инопланетного вторжения. Для кого-то это игра про немого социопата, убивающего всё что движется и перемещающегося при помощи прыжков в припадке ярости. Если говорить цинично, то Half‑Life это просто ещё одна игра про прыжки и стрельбу для перехода на следующий уровень.

Но, как опытный автор модификаций для Half‑Life и разработчик игр, я также знаю, что Half‑Life сильно отличается от подобных игр. Отличается cкриптами карт, кодом исходников SDK, трёхмерными моделями и анимациями, скинами и текстурами. Я даже исследовал как Valve дают имена файлам и папкам в ресурсах игры. Разработчики игр постоянно должны принимать миллионы мелких решений, каждое из которых связанно друг с другом. Насколько большим может быть уровень в Half‑Life, сколько в нём может использоваться цветов и форм, на что он вообще похож? Это всё зависит от размера выделенной памяти под текстуры и трехмерную геометрию в движке игры. От внутреннего устройства Half‑Life зависит то, что Half‑Life может показать вам и что вообще может Half‑Life.

И внутренности Half‑Life говорят, что все заблуждаются. Half‑Life это не игра про Чёрную месу, Гордона Фримена, выстрелы в голову и головоломки. Half‑Life, по сути своей, игра про... поезда.

Прибытие в Чёрную меcу

Half‑Life начинается с семиминутной рутинной поездки на работу. Водоворот жизни Чёрной месы вращается вокруг монорельса: сослуживцы торопятся успеть на работу, электропогрузчики снуют по техническим туннелям, вертолёт на холостом ходу ожидает пассажиров. Это каноническая и часто повторяемая сцена.

Эта глава изначально была больше технической демонстрацией, чем искусной подачей атмосферы. По словам сценариста Valve Марка Лэйдлоу, начало этому положил новый игровой объект, добавленный программистами, названный func_tracktrain. В отличие от своего простенького предшественника func_train, пришедшего вместе с исходниками Quake, func_tracktrain может быть запущен на большом количестве path_track, ветвиться на несколько разных путей, поворачивать и разворачиваться. Чтобы продемонстрировать все эти возможности программист попросил Лэйдлоу внести где-то в сценарий использование func_tracktrain. Марк по своему истолковал эту просьбу и задался вопросом: какие возможности могут открыться, используя поезд?

1. Переходы по уровням

Первая глава Half‑Life состоит из шести разных карт, загружающихся как только вы пересекаете определённую точку на маршруте. На то время Half‑Life была первой игрой, представившей бесшовную технологию загрузки уровней, без промежуточных экранов. Игрок мог возвращаться назад по картам и даже компьютерные персонажи могли вместе с игроком переходить с карты на карту. Сегодня многие игры используют что-то типа предварительной загрузки, когда движок в фоне начинает готовить данные следующей карты по мере приближения игрока к точке перехода, что позволяет значительно уменьшить время загрузки уровней. В Half‑Life такого нет, но и его технологии весьма хороши.

2. Проблемы с родителями

Дверь вагончика транспортной сети — фальшивка, являющаяся частью стены вагона и не может быть открыта. Движок Half‑Life не поддерживает назначение родительского объекта, поэтому дизайнеры не могут привязать работающую дверь к функциям поезда (func_tracktrain). Точно также нельзя сделать стеклянные окна, других пассажиров или даже просто разбросать какой-то мусор. Единственный обходной приём — сразу поместить игрока в вагон, тогда работающая дверь и не будет нужна.

3. Перемещение

Чтобы сообщить функции func_tracktrain, куда нужно перемещаться, дизайнеры уровня размещают сеть последовательно соединённых узлов (path_track). У каждого узла задано собственное уникальное имя и указано имя следующего узла. Когда работает func_tracktrain, вагончик двигается по этим узлам в заданном порядке. Если внезапно что-то шло не так, то скорее всего была ошибка в настройках одного из сотен path_track узлов. Это была нуднейшая работа.

4. Близнецы

Чтобы создать иллюзию бесшовного перехода по уровням, оба файла с картами должны были содержать одну и туже часть пространства. Если карта заканчивалась тёмной частью бетонного туннеля, то следующая карта должна была начинаться с полной копии этого туннеля. Это значило, что если дизайнер что-то поменяет в этом туннеле, то он должен будет обновить его близнеца во второй карте. Запутанно и долго. Именно поэтому места перехода между уровнями обычно выглядят как невыразительные длинные коридоры с небольшим количеством деталей.

5. Память

Сколько мегабайт памяти в вашей видеокарте? Может быть 512 мегабайт, а может и несколько гигабайт. В 1998 году у разработчиков игр каждый мегабайт был на счету: каждая карта Half‑Life была ограничена двумя мегабайтами памяти под текстуры. Сейчас наверняка какой-то кустик в новом Call of Duty использует эти же два мегабайта — целый уровень из Half‑Life во всей своей красе. Возможно, мы стали более расточительными.

6. Vis-a-Vis

Змеевидные изгибы и структура «проход-комната-проход», служили прекрасным способом для сокрытия большого количества объектов, когда игровой движок старается избегать расточительной прорисовки невидимой взгляду окружающей обстановки. Зачем тратить ресурсы на просчёт того, что спрятано за стеной? Дизайнеры Valve заранее высчитывали зону видимости (потенциально видимый набор, PVS), отвечавшую за то, что можно увидеть из одной комнаты в другой. Если можно было разрушить какую-то из стен, то вы увидели бы странную картину. Именно поэтому только в нескольких играх есть настоящий разрушаемый мир.

7. Конец пути

Итак, дверь в вагончике была фальшивкой, которая не открывалась, но в конце главы охранник магическим образом открывает её. Как? Уловка Valve была гениальной: когда вагон прибывает в конечную точку, игра бесшовно загружает новую карту с этим же помещением, но с подменённым вагоном, у которого в стене проделана дырка в форме двери, а движущаяся дверь это ещё один func_tracktrain. Кто сказал, что вагоны всегда должны быть в форме вагонов? Это легендарный трюк среди создателей модов для Half‑Life: он показывает как разработчики из Valve использовали одну несвязанную систему для исправления другой.

Акулья клетка

Летом 1997 года Half‑Life представлял собой всего-лишь горстку хаотических моментов и боёв. Марк Лэйдлоу был нанят сценаристом, чтобы привести в порядок эту кучу игрового контента и придать ему связанную форму, хотя большая часть событий уже была прототипирована. История разработки Half‑Life подсказывает, что Valve мало волновал сюжет, игра больше была похожа на простое перемещение игрока от одного боевого действия к другому, для поддержания ощущения постоянного движения и развития. Half‑Life, собственно, и есть поезд.

Глава Задержание (Apprehension) — полпути на американских горках Half‑Life. В середине этого мрачного «водного» уровня присутствует сцена с акульей клеткой, взятой из какого-то фильма ужастика. Когда игрок входит в клетку, чтобы подобрать арбалет, она стремительно падает в воду бассейна, где нарезает круги смерти ихтиозавр. Поезда, внезапно, и здесь оставили свой след, вспоминайте, поезда не обязательно похожи на себя.

1. Направляющая

Когда игрок впервые входит в комнату, разработчики инициализируют trigger_once, который заставляет monster_ichthyosaur выполнять scripted_sequence: выпрыгнуть из воды и сожрать кричащего monster_scientist. Анимация движения прыжка вынуждает игрока поднять взгляд к подвешенной клетке и площадке. Игрок должен пройти дальше по платформе вокруг клетки, тем самым осматривая её со всех сторон и, скорее всего, замечая лежащее внутри оружие.

2. Граф с узлами

NPC в Half‑Life очень похожи на поезда, в основном они передвигаются по заранее определённому пути. Но вместо path_track дизайнер должен использовать точки info_node, которые автоматически связываются с ближайшими узлами в паутиноподобный «граф с узлами». Чтобы найти дорогу куда-то, искусственный интеллект рассматривает все возможные связи между узлами и строит маршрут. В описанной сцене Valve расположила большое количество точек маршрута ихтиозавра так, чтобы он находился под прикрытием мостика, с которого игрок мог вести прицельный огонь не спускаясь в воду. Хорошо спланированные графы позволяют искусственному интеллекту не выглядеть глупым в любой игре.

3. Поднять приманку

В арбалете находится всего пять стрел. Чтобы убить ихтиозавра на лёгком или среднем уровне сложности, необходимо четыре стрелы. На трудном — восемь. Это значит, что игрок может себе позволить промахнуться всего один раз из оружия, которым никогда не пользовался, по монстру, с которым никогда не сталкивался. Чтобы облегчить эту задачу, игрок немногим ранее разгадывает загадку с добычей важных боеприпасов — гранат для подствольника MP5, которые бесполезны против ихтиозавра, но работают как приманка, для получения игроком 20-ти дополнительных стрел к ещё неизвестному оружию.

4. Клетка

Ключевым объектом в этой комнате является акулья клетка с арбалетом, подвешенная на платформе. Когда игрок проходит по балке и спрыгивает в клетку, она ломается и падает в воду. Клетка это, на самом деле, func_tracktrain, перемещающийся по полосе узлов path_track, которые направляют «поезд-клетку» вниз со скоростью приблизительно 6,5 метров в секунду.

5. Ворота

Попав в воду, первостепенной задачей игрока становится открытие ржавых ворот, закрывающих проход в соседнюю комнату. Однако, проржавевшее колесо поворачивается очень медленно и игрок должен постоянно удерживать кнопку использования, в противном случае ворота сами по себе закроются. Полностью ворота открываются за 12 секунд — ровно то время, на которое Гордон Фримен может задерживать дыхание. Всё это достаточно трудно, особенно отбиваясь от ихтиозавра, именно поэтому игра принуждает вас сначала убить его.

... ну по крайней мере так было задумано. Скорее всего тестировщики пытались открыть дверь за 6-8 секунд, а затем быстро проскользнуть в открывшуюся щель, не обращая внимания на рыскающего монстра, пытающегося убить их. Чтобы не допустить такую ситуацию, Valve добавили невидимый триггер перед колесом, оповещающий ихтиозавра, что игрок пытается сбежать и переводящий монстра в боевой режим.

Технически это обман со стороны разработчиков, но обман считается таковым, только если вас поймали за ним.

6. Летающая акула

Код monster_ichthyosaur на самом деле основан на коде, который используется для летающих монстров. И правда, что такое плавание, как не полёт, но под водой? Поэтому, если считать, что NPC в действительности поезда (см. Граф с узлами), то мы можем считать ихтиозавра безмозглым смертоносным летающим поездом-акулой.

7. Веселье с пузырями

Учитывая великолепную способность тонуть в воде в Half‑Life, на счету каждая секунда проведённая под её поверхностью. Чтобы помочь игроку найти путь, даже в грязной и мутной воде, Valve используют столбы ярких пузырей воздуха, всплывающих вверх, т.к. человеческий глаз легко отслеживает такое движение. Они часто использовали пузырьки в подводных частях для привлечения внимания к туннелям, проходам или карманам, в которых игрок мог выбраться на воздух.

Опрос

Понравилась ли вам механика улучшения оружия в HL: Alyx?

Система Orphus