Статьи по Spirit of Half-Life
Сценарии и монстры в Спирите
Для понимания этого материала желательно ознакомиться с работой сценариев в
игре Half-Life (статья "Создание сценариев").
Начнём с описания новых свойств уже
известной нам энтити scripted_sequence.
Как и любой другой объект в SoHL, эта entity может динамически перемещаться вслед за каким-либо другим
объектом — используется недавно рассмотренное в статье Совместное перемещение объектов в SoHL свойство MoveWith, про
которое я не буду повторяться.
Одно из реально полезных свойств
scripted_sequence, которое добавил Laurie Cheers в свой Спирит —
- Fire after Moving. Здесь мы указываем имя энтити, которая должна активироваться во
время начала анимации сценария. "Зачем это нужно?" — спросите вы: "Если
можно активировать в одно и то же время scripted_sequence и дополнительную
последовательность нужных действий через рассчитанное число секунд?" Тогда
дополнительная последовательность будет выполнена вне зависимости от того,
началось ли проигрывание движения или нет, что может вызвать недоумение у игрока:
допустим, учёный подбегает к точке X, танцует там сальто, от чего всё вокруг
взрывается . А если игрок преградит путь учёному?
Тогда всё равно всё взорвётся, а учёный станцевать так и не успеет.
Чтобы этого избежать, в обычном Халф-Лайфе пришлось бы потрудиться...
Другие параметры:
- Repeat action X more times — проигрывает Action анимацию
дополнительное заданное количество раз. Если поставить здесь цифру 1, к
примеру, то анимация будет выполнена два раза. Вам это зачем-то нужно?
- Priority
— устанавливает приоритет выполнения сценария: Обычный
(Normal) или Абсолютный (Override other sequences), когда другие сценарии
игнорируются. Ну, это пригодится тем, у кого много сценариев на карте
.
- Repeat from Frame
— из названия видно, что анимация должна начинаться
не с начала, а прямо с указанного здесь кадра. Но, руки чтоль у меня такие
непрямые, никакого эффекта от изменения этого значения я не заметил.
- Move Target [LE]
— задаёт имя энтити, к которой должен переместиться
монстр перед выполнением анимации.
- Turn target [LE]
— задаёт энтить (например, какой-нибудь info_target),
которая может определять, в какую сторону монстр будет направлен во время
выполнения анимации. Как же это определяется? Для этого существуют три
механизма, для переключения которых используется менюшка Turn Mode. Вот
её значения:
- Match Angle значит, что монстр будет повёрнут в ту же сторону,
что и направляющая энтить (Turn Target). Срабатывает, если способ перемещения (Move
to Position) установлен как Instant move + turn или No - instant turn.
- Turn to face означает, что монстр будет смотреть на направляющую энтить.
- Don't turn означает, что поворота не будет происходить.
Как мы можем догадаться по подсказкам blank = this в параметрах Move Target и Turn Target, по
умолчанию направляющей энтитью является сама scripted_sequence.
- В выпадающей менюшке Move to Position добавлен один пункт —
No - instant turn. Этот способ движения похож на ранее известный способ
No - only turn за исключением того, что в первом случае монстр обращается
в нужном направлении мгновенно, а во втором — постепенно.
Теперь перейдём к флагам.
Добавлен один флаг
- Monster Dies — это значит, что анимация
будет остановлена, как только будет проигран последний кадр. При проигрывании
некоторых анимаций "смерти" у некоторых моделей наблюдается один очень нехороший
эффект — после проигрывания сценария тело не остается лежать на земле, а встает
и снова функционирует как обычный монстр. Пример — barney.mdl,
последовательность diesimple [для этого в Half-Life у scripted_sequence можно попытаться использовать недокументированный флаг Loop Post Idle — прим. ОбаГлаза].
Теперь с приходом Спирита у нас появилась
возможность зафиксировать монстра в мёртвом состоянии, и он больше не поднимется.
У гаргантюа к тому же будут проиграны дополнительные эффекты смерти (взрывы,
дым).
Ещё есть энтить aiscripted_sequence, но она не рассматривается, так
как scripted_sequence совершенно аналогична по действию, но обладает
дополнительными возможностями.
Монстры
Новых монстров в
Спирите нема, зато есть много новых интересных свойств у наших старых знакомых
(особенно у monster_generic). Итак, вставляем на карту какого-нибудь monster_xxx и смотрим,
что у него нового:
- Initial Health — явно указываем, сколько у монстра будет здоровья, тем
самым перекрывая информацию из пресловутого skill.cfg.
- Model — заменяем монстру модель на другую, например models/can.mdl. Стоит
иметь в виду, что в новой модели может не оказаться свойственных монстру
названий движений, из-за чего возможны косяки. Настройка может пригодиться, если вы хотите
разнообразить мир HL, помещая монстров стандартной модели наряду с монстрами
видоизмененной модели.
Использование monster_generic без определения этого
параметра вообще не имеет смысла.
- Skin — № сменной текстуры (или группы текстур) модели. Выражается целым числом.
- Scale — масштаб модели. По умолчанию стоит значение 1 (монстр в
натуральную величину). Например, установка значения 2 увеличивает монстра в
дра раза, установка 0,5 — уменьшает во столько же раз. Выглядит прикольно, но
не слишком удобно для использования. Этот параметр влияет только на масштаб модели,
истинный размер монстра остаётся тот же (hit-boxes тоже остаются на месте,
поэтому целиться в башку увеличенному вдвое монстру не имеет смысла — верхняя
его половина будет нематериальной).
- Behave as — Изменяет принадлежность монстра к какой-либо группировке.
Например, если для "Аслейва" поставить параметр Behave As = Human Military, то
слейв будет сражаться бок о бок с солдатами против игрока или других иноплов,
то есть вести себя как типичный солдат. Можно сделать злого охранника
(monster_barney) двумя способами: выстрелить в него или сделать Behave As
= Alien Military. Тогда он будет мочить игрока, учёных и десантников, но не
будет трогать пришельцев. К слову сказать, пришельцы тоже будут принимать его
за своего.
Допустимые классы
Scientist — ведёт себя как учёный
Barney — охранники (мочат инопланетную живность, Human
Military, игрока, выстрелившего в них).
Human Military — десантники и
ассассины, стреляют во всех без разбора.
Machine — автономные пулемёты. Ведут себя аналогично предыдущему пункту. Не
являются целью для био-оружия (мух и снарков).
Alien Military — Алиен Гранты. Стреляют во всё человекообразное
Other alien — Типа обычного монстра :)
Headcrab — отличается от Other Alien тем, что является целью
для Буллсквидов
Bullsquid — отличается от Other Alien тем, что
стремиться убить Хедкрабов (логично, не правда ли?=)).
Faction A,B,C — гасят всех, кто не относится к их собственной группе
(Faction).
Есть одно НО: этим определяется лишь отношение персонажей друг к
другу, полностью передать ИИ одного монстра другому не удастся. То есть, если мы
сделаем алиенгранта охранником, то он не пойдёт за нами после нажатия кнопки
USE, как это сделал бы настоящий monster_barney.
Ещё, конечно, есть класс Barnacle и разнообразные мелкие недеятельные монстры типа крыс и тараканов, но
не о них разговор.
- Skill setting — определяет, на каких уровнях сложности нам явится
данный монстр. Чем интересна чистая Халфа — тем, что там не запрограммирован
вообще нормальный способ изменять расположение энтитей в зависимости от уровня
сложности (по крайней мере, со стандартным набором энтитей). В SoHL у нас есть
возможность изменять количество монстров в зависимости от уровня
сложности. Если помните, так было и в Doom и в Quake. Допустимые значения параметра:
- All Skills — монстр присутствует на всех уровнях сложности.
- Not in easy,Not in Medium,Not in hard — монстр
отсутствует соответственно на лёгком, нормальном и сложных
скиллах.
- only in easy,Only in medium,Only in hard — монстр
присутствует только на аналогичных уровнях сложности.
Как видите, ничего заумного =).
- Reaction to player — реакция на игрока. По действию схоже с Behave As,
только здесь всего лишь определяется отношение монстра к игроку, когда Behave
As определяет ещё и взаимоотношения между монстрами. Reaction to Player имеет
более высокий приоритет, чем Behave As.
варианты:
- Normal — поведение по умолчанию,
- Ignore — он не будет трогать игрока ни при каких обстоятельствах,
- Friendly until hurt — не будет вас атаковать,
пока не получит повреждений (как учёный),
- Friendly unless provoked — не будет вас атаковать, пока вы его явно не заденете своим
оружием (как Барни),
- Enemy — без лишнего базара попытается
отправить вас на тот свет
Парочка примеров. Если я сделаю любого монстра, класс ему
назначу Other ALien, а reaction to player — friendly unless provoked, то он без
промедления будет атаковать всех людей кроме меня (до тех пор, пока я в него не
стрельну, после чего и за мной погонится).
Если я сделаю монстра типа Scientist, а реакцию на игрока сделаю Enemy, то
своей единственной целью монстр выберет игрока, других же не тронет.
Флаги:
- No Yellow Blobs — использутся для монстров, которых маппер засадил в
стенку. В норме вокруг таких монстров летают противные желтые частицы, теперь
они могут быть убраны. Но вопрос есть — не лучше ли просто сделать нормального
монстра, не вросшего в стенку?
- Don't Drop Gun — эта особенность появилась у monster_barney и
monster_human_grunt. Если флаг отмечен, то монстр не бросает свою пушку
после смерти (то есть, патронами они не поделятся).
- Drop Gun Этот флаг есть у monster_alien_grunt. Если флаг
отмечен, то алиен грант после смерти роняет свой hornetgun, который можно
подобрать. Зашибись, не правда ли?
- Not in Deathmatch — сообщает, что монстр не должен появляться в
мультиплеере (в Спирите по умолчанию монстры разрешены в мультиплеерных
играх).
Особые свойства учёных и охранников:
- Master (Prevents following) — здесь надо написать имя объекта (обычно
multisource), который определяет, будет ли персонаж следовать за вами. Если мастер
ВКЛЮЧЁН, то персонаж НЕ ПОСЛЕДУЕТ ЗА ВАМИ. Вместо этого он произнесёт речь
(sentence), которая указана в поле Refusal sentence. Если мастер
включен, то монстр весело за вами побежит. Эффекта "Отказа в сопровождении"
можно добиться, поставив флаг Pre Disaster, но тогда это нельзя будет
переключать.
- Refusal sentence — речь, которую произнесет учёный или охранник,
связанный по рукам и ногам включенным "мастером".
- Use sentence — определяет речь, которую произнесет персонаж, когда вы
его поведете за собой (нажатием USE).
- Un-Use sentence — определяет речь, которую произнесет персонаж, когда
вы откажитесь от сопровождения (еще раз нажав USE).
Откройте файл
sound\sentences.txt и посмотрите названия речей, которые может произносить
монстр. Затем впишите в поле *** sentence название речи (с учетом регистра,
без конечной цифры).
- Speech Group — заставляет говорить персонажа другим голосом. Если вы
заметили, имя каждой речи начинается двумя буквами, которые указывают на тип
монстра, который должен её произнести. например, BA значит Barney, SC значит
Scientist. В рассматриваемом поле должны быть введены две буквы, которые
указывают, голосом кого наш персонаж будет говорить. Правда, чтобы это сработало,
имена речей (без первых 2-х букв) двух монстров должны совпадать. Так, если в
поле Use Sentence вписать BA_MAD, а в поле Speech Group вписать XZ, то замена
голоса будет произведена только если определены речи XZ_MAD#. Если же с
определениями все в порядке, то персонаж будет говорить не своим голосом, а голосом
гипотетического монстра XZ. Зачем это нужно? Чтобы разнообразить голоса
персонажей одного типа, логично.
Вопрос к вам: кто-нибудь в этом моменте
что-нибудь понял?
- Weapon (у охранников) — определяет, какое оружие они носят. Это может быть
или обычный пистолет Глок-17, или револьвер (вышибает мозги не по-детски)
monster_generic
В отличие от monster_generic
из оригинальной Half-Life параметров стало больше:
- Model — модель монстра, это есть и в обычной Халве.
- Pitch Yaw Roll — поворот тела монстра по трём
углам — наклону, азимуту и крену,
- Initial Health — здоровье,
- Body — сюда вписывается целое число. Это свойство задаёт дополнительные
детали модели в зависимости от последней.
Неколько примеров:
scientist.mdl: 0..3 — обычный учёный, 4..7 — учёный со шприцом в
руке.
hgrunt.mdl: 0..3 — вооружен автоматом, 4..7 — вооружен дробовиком, 8..11
— безоружен.
barney.mdl: 0 — пистолет в кобуре, 1 — пистолет в руке, 2 —
пистолета нема (потерял, видать ).
player.mdl: 0 — Фримен без каски, 1 — в каске.
для учёного и для десантника здесь определены не конкретные значения, а диапазоны значений —
от конкретного значения из диапазона зависит модель головы. То есть, учёный с
Body=2 будет выглядеть как негр без иглы, а учёный с Body=5 будет смотреться как
Эйнштейн с иглой. Если вписать здесь –1, то грузится случайная модель по умолчанию (без шприца).
- Blood color — цвет крови монстра. Жёлтый
(инопланетный), красный (человеческий), либо вообще
никакой.
- Gib model — модель кусков мяса монстра. По умолчанию определяется
цветом декалей крови.
- Size (X Y Z) — размер монстра. Чем же Size тогда отличается от Scale?
Тем, что Scale определяет видимый размер модели, а Size — размер области,
занимаемой монстром.
Вот стандартные размеры некоторых монстров:
Headcrab: 24 24 24
Houndeye: 32 32 36
Человек: 32 32 72
Другие ксены: 64 64 64
Дополнительные флаги
- 8 = Player model — надо установить, если модель монстра взята из
каталога models\player.
- 32 =Invulnerable — делает монстра неуязвимым.
Monster_generic_dead
Ещё одна энтить,
добавленная в Спирит — monster_generic_dead — служит для помещения на
карту модели-трупа. Характерные её свойства такие:
- Sequence Name — Здесь можно вписать имя анимации. Труп будет лежать в
позе, соотвествующей последнему кадру этой анимации.
- Death Type — альтернатива первому способу задания
позы.
Scripted_action
Одна из самых полезных на мой
взгляд особенностей SoHL — это энтить scripted_action, которая
заставляет монстра атаковать. Она сильно похожа по способу использования на
scripted_sequence. По сути дела, scripted_action — это есть scripted_sequence с
двумя дополнительными параметрами, которые управляют атакой. Это:
- Entity to Attack (blank=this) [LE]
— обозначает энтить (монстра,
func_*** или т. п.), которую монстр попытается атаковать.
- Action to Perform — способ атаки.
Способы атаки:
- Ranged Attack — Дистанционная атака #1. Выстрел из оружия для
военных, барней и ассасинов, для собачек — атака звуковой волной, для мандовошек
— прыжок.
- Ranged Attack — Альтернативный способ дистанционной атаки монстра.
Например, для monster_human_grunt — бросок гранаты.
- Melee Attack — Ближний бой (есть у большей части монстров). Это битьё лапами, пинание
(monster_human_grunt) и т. д. Вариация ближней атаки — когда учёные
восстанавливают здоровье.
- Melee Attack 2 — Альтернативный способ ближней
атаки. Особые случаи — monster_bigmomma делает маленьких крабов,
monster_gargantua — атакует огнём.
- Special Attack — для десантников — заставляет
бросить гранату на пол (самая тупая атака, по-моему).
- Special Attack 2 — не используется.
- Reload — перезарядка оружия (для Барней и солдат).
- Jump — Подпрыгивание. Ассассины прыгают к цели
(Entity to Attack), буллсквиды и собачки просто прыгают на месте.
- No Action — никакой атаки не происходит (скучно ).
Monster_target
После описания scripted_action я не имею права не рассказать
про такую вещь, как monster_target.
Monster_target — это точечный
объект, который, будучи включённым, самостоятельно вызывает функции ИИ
монстров (читай, атаку).
Нас интересует параметр
- When Active, count As этой
энтити. Здесь указываем, "кем" будет выглядеть monster_target в глазах других
монстров (смотрите выше базар про монстрячье свойство Behave As).
monster_target можно рассматривать как сильно редуцированного монстра, у
которого не осталось ни тела, ни ИИ, осталось лишь свойство привлекать внимание
других монстров.
Флаг
- Start Inactive сообщает о том, что изначально
энтить неактивна (опять же, логично?=)).
Рассматриваемая энтить может быть полезна, когда перед ней расположить
func_breakable (или другой объект, которому можно нанести поврежедения).
Тогда монстр будет атаковать monster_target, в результате чего задевать func_breakable.
Помните российский мод Retribution, где Барни стреляет в замок на двери? Вот, такой
же сценарий можно сделать, используя monster_target.
В обозримом будущем напишу про специальные эффекты — поверьте, это интересно!
P.S. Сорри за возможный сумбур — я не Бойцовый Кот, чтобы поэмы писать=))).
|