Комната с диском (Portal 2)

From Valve Developer Community
Jump to: navigation, search
English
"Иногда испытания должны проходить за пределами лаборатории."
- ГЛэДОС

[Portal 2] Комната с диском - последнее испытание в конце каждой серии тестов в кооперативном режиме. Она находится в части комплекса, которой ГЛэДОС управлять не может, и которая служила людям последним защитным рубежом от разрастающейся власти ГЛэДОС над комплексом.

Источник дисков

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

Шаг 1 - настройка

Привязка к сетке: 2

Создайте prop_static и выберите для неё модель models/props_gameplay/laser_disc_player.mdl и поместите её где-нибудь в комнате. Отсюда игроки будут брать диск.

Теперь создайте диск, это энтити prop_dynamic_override. Настройте её свойства так:

Свойство Значение
Name start_disc
Parent spawner_door
World Model laser_disc.mdl
Disable Shadows Yes

Поместите диск внутри модели устройства, как показано на иллюстрации справа.

Теперь создайте браш размером 8x20x1 с текстурой tools/toolsinvisible. Поместите его сверху модели диска, снова, как на иллюстрации справа. Преобразуйте браш в энтити (нажатием Ctrl+T) и сделайте её func_door. И задайте её свойства следующим образом:

Свойство Значение
Name spawner_door
Speed 26
Start Sound World.LaserDiskLoad
Delay Before Reset (-1 stay) -1
Loop Moving Sound Yes
Move Direction 0 0 0
Примечание:Свойство Move Direction нужно задать на Pitch Yaw Roll, указанные в laser_disc_player.mdl.

Создайте ещё одну энтити, prop_physics_override, она будет диском, переносимым игроками. Нажмите Shift и перетащите start_disc так, чтобы диск находился вне устройства, и чтобы только его 'край' касался щели устройства. Измените "Class" на prop_physics_override и назовите "disc".

Шаг 2 - воссоздание диска

Создадим шаблон, по которому диск будет восстановлен в случае его утери игроками.

Примечание:Этот шаг не является обязательным условием работы источника дисков, перейдите к шагу 3, если в вашей карте диск нигде не потеряется.

Создайте point_template со следующими свойствами:

Свойство Значение
Name template_disc_spawn
Template 1 start_disc
Template 2 spawner_door

Создайте ещё одну point_template с этими свойствами:

Свойство Значение
Name template_disc
Template 1 disc

Шаг 3 - система выходов

Теперь включено всё.
Привязка к сетке: 8

После создания всех энтитей нужно заставить источник работать, осталось подключить действия энтитей для создания диска; свяжем несколько входов и выходов!
Сначала создайте logic_auto со следующим выходом:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn template_disk_spawn ForceSpawn   0.00 No
Совет:
Эта энтити будет использоваться в дальнейшем, не забудьте про неё.


В свойствах spawner_door откройте вкладку 'Output' и добавьте следующие свойства:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnFullyOpen start_disc ClearParent   0.00 No
Io11.png OnFullyOpen start_disc TurnOff   0.00 No
Io11.png OnFullyOpen template_disc ForceSpawn   0.00 No
Io11.png OnFullyOpen start_disc Kill   0.10 No
Io11.png OnFullyOpen spawner_door Kill   0.10 No


Теперь добавьте выход в template_disc_spawn:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnEntitySpawned spawner_door Open   0.00 No

Энтити, определяющая, когда диск теряется или уничтожается, должна иметь следующий выход:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger template_disk_spawn ForceSpawn   0.00 No
Совет:
Как правило, рекомендуется, чтобы уничтожаемая энтити сообщала диску, чтобы он вызвал выход. Например, когда диск растворяется полем антиэкспроприации, он вызывает выход OnDissolve. Поэтому проверьте, чтобы не было других физических объектов, которые можно растворить полем.

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

Получатель диска

Получатель диска (или проигрыватель диска) - устройство, для которого предназначается диск; при вставке диска в получатель проигрывается видео с информацией, которую искала ГЛэДОС.

Шаг 1 - установка

Привязка к сетке: 2

Поместите prop_static в комнату и выберите модель models/props_gameplay/laser_disc_player.mdl. Здесь, в конце уровня, игроки вставят диск.

Когда игрок помещает диск возле приёмника, диск, который игрок носил ранее, будет удалён, и загрузится другой, невидимый диск. Мы сделаем именно так, чтобы лучше контролировать, как диск войдет в приёмник, и чтобы просто избежать многих проблем. Потребуется ещё одна prop_dynamic_override, она будет загружена в устройство, будучи прикреплённой к func_door.

Свойство Значение
Parent loader_door
Disable Shadows Yes
World Model laser_disc.mdl
Name hidden_disc

Диск нужно разместить так, как показано на иллюстрации справа.

Теперь создайте браш func_door с текстурой tools/toolsinvisible. Поместите его сверху на модель диска как на иллюстрации справа. Добавьте следующие свойства:

Свойство Значение
Name loader_door
Speed 8
Start Sound World.LaserDiskLoad
Delay Before Reset (-1 stay) -1
Loop Moving Sound Yes
Move Direction 0 180 0
Примечание:Свойство Move Direction нужно задать на Pitch Yaw Roll, противоположные тем, что были заданы для laser_disc_player.mdl.
Примечание:Длина браша func_door зависит от того, насколько вы хотите, чтобы диск ушёл внутрь; радиус диска - 25 единиц, исходите из этого. На иллюстрации выше браш имеет длину 26 единиц, что позволяет всему диску уйти внутрь.

Шаг 2 - загрузка

На первом шаге создавались видимые энтити получателя, в этом шаге - невидимые энтити.
Первая - браш trigger_once, а вторая - filter_activator_name. И добавьте следующие свойства:

1. В trigger_once:

Свойство Значение
Name  
Filter Name disc_filter

Установите флаг Physics Objects.

2. В filter_activator_name:

Свойство Значение
Name disc_filter
Filter Name disc

Шаг 3 - система выходов

Чтобы всё взаимодействовало, используем систему входов/выходов. Помните ту logic_auto, что мы использовали ранее? В её свойствах откройте вкладку "Outputs" и добавьте следующие свойства:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn hidden_disc TurnOff   0.00 No

Добавьте следующий вход в trigger_once:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnStartTouch hidden_disc TurnOn   0.00 No
Io13.png OnStartTouch  !activator Kill   0.00 No
Io11.png OnStartTouch loader_door Open   0.00 No
Примечание:Hammer может выделить команду !activator как ошибочную. Игнорируйте ошибку, в игре всё работает нормально.

Добавьте один выход в энтити loader_door:

My Output > Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyOpen disc_loaded_relay Trigger   0.00 No
Примечание:Мы пока ещё не создали энтити disc_loaded_relay, поэтому в данный момент этот выход будет показываться как ошибочный.

Теперь получатель должен работать и принимать вставляемый диск. До завершения создания комнаты с диском ещё далеко.

Проецирование видеоролика

В этой части начинается магия.

Проецируемый ролик - это показ фильма, включающий взрыв роботов в конце.

Шаг 1 - настройка видеоролика

Создайте prop_static с моделью projector_screen.mdl (Легче найти, введя "projector" в поле фильтрации моделей). В её нижнем левом углу поместите vgui_movie_display со следующими свойствами:

Свойство Значение
Name insert_disc_movie
Movie Filename media/insert_disk.bik
Loop Movie Yes
Stretch to Fill Yes
Force precache Yes
Panel width 156
Panel height 112

Снова откройте свойства logic_auto и добавьте следующие выходы:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn insert_disc_movie Enable   0.00 No

Создайте ещё одну энтити vgui_movie_display в том же самом месте, что и предыдущая (Просто протащите уже созданную с нажатой Shift в сторону, а затем верните на место). Единственным отличием будет имя и видео, отображаемое ей:

Свойство Значение
Name aperture_movie
Movie Filename media/coop_bts_blueprints.bik
Loop Movie Yes
Stretch to Fill Yes
Force precache Yes
Panel width 156
Panel height 112

Шаг 2 - поднимаем железный занавес

Примерно так всё это должно выглядеть.

Помните ту энтити disc_loaded_relay, которую мы использовали, ещё не создав? Теперь пришла и её очередь. Сперва создайте logic_relay и назовите её disc_loaded_relay. Откройте вкладку "Outputs" и добавьте следующие свойства:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger insert_disc_movie Disable   2.00 No
Io11.png OnTrigger aperture_movie Enable   2.00 No

Создайте ambient_generic с этими свойствами:

Свойство Значение
Name disc_windup_sound
Sound Name World.LaserDiskPowerUp

И добавьте в disc_loaded_relay ещё один выход:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger disc_windup_sound PlaySound   0.00 No

И наконец-таки всё должно работать!

Завершение

  • Добавьте экземпляр и в качестве VMF Filename укажите coop_lighting_ents.vmf. Отсюда вы можете выбрать варианты тумана в вашей карте (его плотность, цвет и т.д.). Однако, в этом экземпляре более важны четыре env_global, каждая может разрешать или запрещать использование сигнального и указывающего устройства роботов. При загрузке диска должна активироваться logic_relay с четыремя выходами:
My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger @global_no_taunting_blue TurnOn   0.00 No
Io11.png OnTrigger @global_no_pinging_blue TurnOn   0.00 No
Io11.png OnTrigger @global_no_taunting_orange TurnOn   0.00 No
Io11.png OnTrigger @global_no_pinging_orange TurnOn   0.00 No
  • Создайте trigger_hurt со значением Damage равным 10000. Эта энтити должна охватывать всю комнату, но не забудьте выключить её. В подходящий момент, например, когда ГЛэДОС говорит последнюю фразу, активируйте браш trigger_hurt, чтобы роботы взорвались.
  • Поместите в комнату point_clientcommand со следующими настройками:
Свойство Значение
Name levelchange

Добавьте в trigger_hurt этот выход:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnHurt levelchange command changelevel {распределитель или следующая камера} 0.00 No
  • Поместите статическую модель лицом к экрану с моделью models/props_underground/projector.mdl. В проекторе создайте три point_spotlight в соответствующих местах.
  • Обычно в комнатах с диском имеется доска (models/props_office/whiteboard_coop.mdl) с требованием не вставлять диск. Для соответствия картам Valve рекомендуется создать и её. Есть 6 различных вариантов.