Настройка логики (часть 1)

Материал из Mod Wiki.

(Различия между версиями)
Перейти к: навигация, поиск
Версия 12:51, 9 декабря 2007 (править)
BAC9-FLCL (Обсуждение | вклад)
(3.2.3. Схема sleeper)
← К предыдущему изменению
Текущая версия (21:57, 19 июля 2008) (править) (отменить)
Don Reba (Обсуждение | вклад)
(добавил ссылку на перевод)
 
(37 промежуточных версий не показаны.)
Строка 1: Строка 1:
{{Шаблон:Переход}} {{Шаблон:Переход}}
-=Настройки логики=+=3. Настройки логики=
==3.1. Система флагов (path_walk, path_look)== ==3.1. Система флагов (path_walk, path_look)==
Строка 145: Строка 145:
* snd - звук ремарка, по умолчанию nil * snd - звук ремарка, по умолчанию nil
* anim - анимация ремарка, по умолчанию wait * anim - анимация ремарка, по умолчанию wait
-* target - Куда смотрит сталкер. Есть следующие варианты+* target - куда смотрит сталкер. Есть следующие варианты
** story_id – числовое значение ** story_id – числовое значение
** actor – без комментариев ** actor – без комментариев
Строка 186: Строка 186:
Файл: '''\gamedata\scripts\xr_sleeper.script''' Файл: '''\gamedata\scripts\xr_sleeper.script'''
-==3.2.4. Схема kamp==+===3.2.4. Схема kamp===
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке. Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.
- [kamp]+''[kamp]''
-center_point = kamp_center – имя точки вокруг которой NPC будет устраиваться.+
-*radius = 2 (насколько далеко сталкер будет сидеть от центра лагеря, 2- по умолчанию)+
-*def_state_moving = run (дефолтное состояние, в котором сталкер будет идети к точке кампа)+
-Файл: \gamedata\scripts\xr_kamp.script+* ''center_point = kamp_center'' – имя точки вокруг которой NPC будет устраиваться.
 +* ''radius = 2'' - насколько далеко сталкер будет сидеть от центра лагеря, 2 - по умолчанию.
 +* ''def_state_moving = run'' - дефолтное состояние, в котором сталкер будет идети к точке кампа.
-NB! Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит. Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой = <path_kamp_name>_task+Файл: '''\gamedata\scripts\xr_kamp.script'''
-*path_walk = <path_kamp_name>_task+Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит. Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой равно:
 + 
 +<path_kamp_name>_task
 +* path_walk = <path_kamp_name>_task
Если точка кемпа расположена в чистом поле то, path_walk прописывать не надо. Если точка кемпа расположена в чистом поле то, path_walk прописывать не надо.
-==3.2.5. Схема camper==+===3.2.5. Схема camper===
 + 
Свойства кемперов: Свойства кемперов:
-- кемпер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передигается по патрульным путям  
-- кемперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возращается в состояние кемпера.  
-- В любых других случаях действуют по собственной скриптовой схеме. Если видим врага -стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага.  
-- кемперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение. 
-[camper]+* Кемпер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передигается по патрульным путям
-path_walk = patrol_path+* Кемперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возращается в состояние кемпера.
-path_look = patrol_path+* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим danger - то смотрим в направление в danger. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага.
-*radius = number – расстояние в метрах, если расстояние между кэмпером и противником меньше указанного, кэмпер уходит в универсальный комбат. По умолчанию этот радиус равен 20 метрам.+* Кемперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.
-*no_retreat = true - персонаж при виде врага не будет ломиться на ближайшую точку path_walk, а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите кемперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.+ 
-*def_state_moving = состояние из стейт менеджера+''[camper]''
- Состояние, в котором мы движемся на ближайшую точку пути при враге+ 
-*def_state_moving_fire = состояние из стейт менеджера (sneak_fire)+* ''path_walk = patrol_path''
- Состояние, в котором мы отстреливаемся от врага, во время движения на ближайшую точку пути.+* ''path_look = patrol_path''
-*def_state_campering = состояние из стейт менеджера (hide)+* ''radius = ...'' – расстояние в метрах, если расстояние между кэмпером и противником меньше указанного, кэмпер уходит в универсальный комбат. По умолчанию этот радиус равен 20 метрам.
- Состояние, в котором мы ожидаем врага, находясь на пути+* ''no_retreat = true'' - персонаж при виде врага не будет ломиться на ближайшую точку path_walk, а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите кемперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.
-*def_state_campering_fire = состояние из стейт менеджера (hide_fire)+* ''def_state_moving = ...'' - (состояние из стейт менеджера), в котором мы движемся на ближайшую точку пути при враге.
- Состояние, в котором мы отстреливаемся от врага, находясь на пути+* ''def_state_moving_fire = ...'' - (состояние из стейт менеджера (sneak_fire)), в котором мы отстреливаемся от врага, во время движения на ближайшую точку пути.
-*attack_sound = имя_звуковой_темы+* ''def_state_campering = ...'' - (состояние из стейт менеджера (hide)), в котором мы ожидаем врага, находясь на пути.
-Возможность переопределять снайперам/кемперам звук атаки. По дефолту он равен звуковой теме "fight_attack". Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав в секции кемпера: attack_sound =+* ''def_state_campering_fire = ...'' (состояние из стейт менеджера (hide_fire)), в котором мы отстреливаемся от врага, находясь на пути.
-*shoot = тип.+* ''attack_sound = имя_звуковой_темы'' - возможность переопределять снайперам/кемперам звук атаки. По дефолту он равен звуковой теме "fight_attack". Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав в секции кемпера пустой атрибут.
-Задаем тип стрельбы. Возможные значения - always|none|terminal+* ''shoot = ...'' - Задаем тип стрельбы. Возможные значения:
-always - значение по умолчанию, стреляет всегда, когда можно+** always - значение по умолчанию, стреляет всегда, когда можно
-none - не стреляет вообще.+** none - не стреляет вообще.
-terminal - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.+** terminal - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.
-NB! У кемпера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела), то он тупо продолжает стоять на старом месте и ждать следующей пули.+У кемпера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела), то он тупо продолжает стоять на старом месте и ждать следующей пули.
Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кемпера. Используйте walkerов в таких случаях, а кемперов стоить ставить для атак по путям и как снайперов. Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кемпера. Используйте walkerов в таких случаях, а кемперов стоить ставить для атак по путям и как снайперов.
-==3.2.5.1. Схема sniper==+===3.2.5.1. Схема sniper===
- Разновидность кемпера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20сек.+ 
- NB! Ставить снайперу только 2 точки look+Разновидность кемпера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20сек. Внимание! Ставить снайперу только 2 точки look.
 + 
 +В кастом дате кемпера прописать:<br>
 +''sniper = true''
 + 
 +Файл: '''\gamedata\scripts\xr_camper.script'''
 + 
 +===3.2.6. Схема follower===
- В кастом дате кемпера прописать:+В custom_data прописан как follower. NPC идет за NPC лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме run, если свыше 20 – догоняет в режиме sprint. Пути не задаются.
- sniper = true+
 +''[follower]''
-Файл: \gamedata\scripts\xr_camper.script+* ''leader = ...'' - story_id лидера из game.ltx (число!).
 +* ''formation_line = true'' - постарается идти сбоку от лидера, в противном случае будет идти сзади.
 +* ''distance = ...'' - расстояние в метрах, на котором будет идти от лидера attendant. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.
 +* ''state_if_leader_in_meet'' - это есть строка с именем состояния из state_manager, которое будет назначено follower'ам, если командир пребывает в состоянии meet.
 +* ''anim_walk = state'' - состояние, в котором фолловер идет за лидером.
 +* ''anim_run = state'' - состояние, в котором фолловер бежит за лидером.
 +* ''anim_sprint = state'' - состояние, в котором фолловер спринтует за лидером.
-==3.2.6. Схема follower==  
-В custom_data прописан как follower 
-NPC идет за NPC лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме run, если свыше 20 – догоняет в режиме sprint. Пути не задаются. 
-[follower]+Файл: '''\gamedata\scripts\xr_ attendant.script'''
-leader = story id лидера из game.ltx (число!)+
-*formation_line = true (постарается идти сбоку от лидера, в противном случае будет идти сзади+
-*distance = расстояние в метрах, на котором будет идти от лидера attendant. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.+
-*state_if_leader_in_meet. Это есть строка с именем состояния из state_manager, которое будет назначено follower-ам, если командир пребывает в состоянии meet.+
-*anim_walk = state (состояние, в котором фолловер идет за лидером)+
-*anim_run = state (состояние, в котором фолловер бежит за лидером)+
-*anim_sprint = state (состояние, в котором фолловер спринтует за лидером)+
-Файл: \gamedata\scripts\xr_ attendant.script+
-Если все это происходит под гулагом, то вместо story_id лидера, мы прописываем его секцию логики в файле скрипта. Пример:+Если все это происходит под гулагом, то вместо story_id лидера, мы прописываем его секцию логики в файле скрипта. Пример:
-t = { section = "logic@bar_arena_follower_2", +<pre>t = { section = "logic@bar_arena_follower_2",
idle = 0, idle = 0,
prior = 7, state = {0}, squad = squad, group = groups[0], prior = 7, state = {0}, squad = squad, group = groups[0],
Строка 267: Строка 268:
return obj:character_community() == "dolg" return obj:character_community() == "dolg"
end end
-}+}</pre>
 + 
 +===3.2.7. Схема zoneguard===
-==3.2.7. Схема zoneguard== 
NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока
-[zoneguard]+''[zoneguard]''
-path_walk = путь перемещения+ 
-*path_look = путь обзора+* ''path_walk = ...'' - путь перемещения
-team = имя команды синхронизированных zoneguard-ов (из всей команды только 1 будет реагировать на игрока)+* ''path_look = ...'' - путь обзора
-*zone_guard = имя зоны, в пределах которой игрок будет атакован+* ''team = ...'' - имя команды синхронизированных zoneguard-ов (из всей команды только 1 будет реагировать на игрока)
-zone_warn = имя зоны, в пределах которой начинать разговор с игроком+* ''zone_guard = ...'' - имя зоны, в пределах которой игрок будет атакован
-*walker_team = team для схемы перемещения его в состоянии walker (если не задан, используется значение из поля team)+* ''zone_warn = ...'' - имя зоны, в пределах которой начинать разговор с игроком
-*no_move = если true, персонаж окликнет игрока с места и не будет подбегать к нему+* ''walker_team = ...'' - team для схемы перемещения его в состоянии walker (если не задан, используется значение из поля team)
-*snd_greet = имя звуковой схемы, из которой будет проигран звук при обнаружении персонажа+* ''no_move = ...'' - если true, персонаж окликнет игрока с места и не будет подбегать к нему
-*ignore_friends = true, будет игнорировать дружественных ему персонажей.+* ''snd_greet = ...'' - имя звуковой схемы, из которой будет проигран звук при обнаружении персонажа
-*ignore_cond = {+info -info =func !func} условия, при которых NPC игнорирует игрока+* ''ignore_friends = ...'' - true - будет игнорировать дружественных ему персонажей.
-*no_danger = если true, то не отыгрывает угрожающую анимацию, нейтралам.+* ''ignore_cond = {+info -info =func !func}'' - условия, при которых NPC игнорирует игрока
-*anim = какую отыгрывает анимацию, если игрок ему не враждебен.+* ''no_danger = ...'' - если true, то не отыгрывает угрожающую анимацию, нейтралам.
-*snd_anim_sync = если true, то npc будет синхронизировать звук с анимацией+* ''anim = ...'' - какую отыгрывает анимацию, если игрок ему не враждебен.
-Файл: \gamedata\scripts\xr_zoneguard.script+* ''snd_anim_sync = ...'' - если true, то npc будет синхронизировать звук с анимацией
 + 
 + 
 +Файл: '''\gamedata\scripts\xr_zoneguard.script'''
-==3.2.8. Схема wounded (раненый)==+===3.2.8. Схема wounded (раненый)===
-[logic]+<pre>[logic]
wounded = wounded wounded = wounded
Строка 303: Строка 308:
hp_cover = HP|condbool|HP|condbool hp_cover = HP|condbool|HP|condbool
hp_fight = HP|condbool|HP|condbool hp_fight = HP|condbool|HP|condbool
-*syndata = state@sound|state@sound+syndata = state@sound|state@sound
-*help_dialog = story_id +help_dialog = story_id
-*help_start_dialog = story_id+help_start_dialog = story_id</pre>
Где: Где:
-Condstate – кондлист, возвращающий состояние персонажа, либо true. Если он возвращает true – нпс обидится на игрока+ 
-Condsound – кондлист, возвращающий саунд тему.+* ''condstate'' – кондлист, возвращающий состояние персонажа, либо true. Если он возвращает true – нпс обидится на игрока
-HP – пороговые значение здоровья персонажа+* ''condsound'' – кондлист, возвращающий саунд тему.
-PSY – пороговые значения пси здоровья персонажа+* ''HP'' – пороговые значение здоровья персонажа
-Condvictim – кондлист, возвращающий направление куда смотреть. Возможные значения: nil, actor, number. В случае числа – будет смотреть на персонажа с указанными стори айди.+* ''PSY'' – пороговые значения пси здоровья персонажа
-Condbool – кондлист, возвращаюзий true либо false.+* ''condvictim'' – кондлист, возвращающий направление куда смотреть. Возможные значения: nil, actor, number. В случае числа – будет смотреть на персонажа с указанными стори айди.
 +* ''condbool'' – кондлист, возвращаюзий true либо false.
Значения полей: Значения полей:
-hp_state – поведение персонажа когда он не видит игрока+ 
-hp_state_see – поведение персонажа, когда он видит игрока+* ''hp_state'' – поведение персонажа когда он не видит игрока
-psy_state – поведение персонажа при псиатаках+* ''hp_state_see'' – поведение персонажа, когда он видит игрока
-hp_victim – куда смотреть, в зависимости от ХП+* ''psy_state'' – поведение персонажа при псиатаках
-hp_cover – идти в укрытие или нет, в зависимости от ХП+* ''hp_victim'' – куда смотреть, в зависимости от ХП
-hp_fight – разрешено воевать или нет, в зависимости от ХП+* ''hp_cover'' – идти в укрытие или нет, в зависимости от ХП
-syndata – синхропары для красоты.+* ''hp_fight'' – разрешено воевать или нет, в зависимости от ХП
-help_dialog – story_id диалога вместо дефолтного actor_help_wounded. Если вам по сюжету необходимо заменить диалог другим, то вы в этом поле прописываете id другого диалога.+* ''syndata'' – синхропары для красоты.
-Также мы вставляем стартовый диалог раненого. Если мы его прописываем, то все актёрские диалоги для раненых должны иметь такой precondition: dialogs.allow_wounded_dialog.+* ''help_dialog'' – story_id диалога вместо дефолтного actor_help_wounded. Если вам по сюжету необходимо заменить диалог другим, то вы в этом поле прописываете id другого диалога.
 + 
 +Также мы вставляем стартовый диалог раненого. Если мы его прописываем, то все актёрские диалоги для раненых должны иметь такой precondition: ''dialogs.allow_wounded_dialog''.
Пример. В качестве примера взята дефолтная настройка. Пример. В качестве примера взята дефолтная настройка.
-hp_state = 30|help_me@help|10|wounded_heavy@help_heavy+<pre>hp_state = 30|help_me@help|10|wounded_heavy@help_heavy
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy
-psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20| {=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy+psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|
 +{=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy
hp_victim = 30|actor|10|nil hp_victim = 30|actor|10|nil
hp_cover = 30|true|10|false hp_cover = 30|true|10|false
hp_fight = 30|true|10|false hp_fight = 30|true|10|false
-syndata = wounded@help+syndata = wounded@help</pre>
Где: Где:
-Best_pistol – проверка на то, что лучшее оружие НПС является пистолетом. 
-Файл: \gamedata\scripts\xr_wounded.script+* ''best_pistol'' – проверка на то, что лучшее оружие НПС является пистолетом.
 + 
 + 
 +Файл: '''\gamedata\scripts\xr_wounded.script'''
 + 
 +===3.2.9. Схема rest===
-==3.2.9. Схема rest== 
Чувак гуляет, хавает, спит. Чувак гуляет, хавает, спит.
Пока нормально не работает. Пока нормально не работает.
-Файл: \gamedata\scripts\xr_rest.script 
-==3.2.10. Схема heli_hunter==+Файл: '''\gamedata\scripts\xr_rest.script'''
-Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:+ 
 +===3.2.10. Схема heli_hunter===
 + 
 +Может стрелять, либо не стрелять по вертолету в зависимости от условий. Делается это так:
 + 
 +<pre>[camper@bar_freedom_attack_sniper_1]
-[camper@bar_freedom_attack_sniper_1] 
path_walk = camper_1_walk path_walk = camper_1_walk
path_look = camper_1_look path_look = camper_1_look
Строка 355: Строка 370:
meet_talk_enabled = true meet_talk_enabled = true
meet_dialog = bar_svoboda_dialog meet_dialog = bar_svoboda_dialog
-heli_hunter = {-bar_ecolog_crush_heli_down} true, false+heli_hunter = {-bar_ecolog_crush_heli_down} true, false</pre>
Если раньше оверрайд хелихантера понимал только значения true либо false, то сейчас он понимает кондлист, который если возвращает true - то стрельба по вертолету в данной схеме разрешена. Если раньше оверрайд хелихантера понимал только значения true либо false, то сейчас он понимает кондлист, который если возвращает true - то стрельба по вертолету в данной схеме разрешена.
-==3.2.11. Patrol==+===3.2.11. Patrol===
- Итак, есть предварительная система патруля. Представляет собой вариацию kamp только в состоянии ходьбы. Для ее работы прописываем в кустовой дате следующее:+Итак, есть предварительная система патруля. Представляет собой вариацию kamp только в состоянии ходьбы. Для ее работы прописываем в кустовой дате следующее:
- [patrol]+<pre>[patrol]
- path_walk = path_walk+ 
- path_look = path_look+path_walk = path_walk
- *formation = back+path_look = path_look
- *commander = true (типа назначат командиром, желательно, чтобы такой красивый он был один)+formation = back
- *move_type = задает изначальный режим перемещения, по умолчанию patrol. Вообще, значение этого поля есть название ходячей анимации из state_mgr_lib+commander = true
 +move_type = ...</pre>
- formation - описывет способ построения и не является обязательным. Возможны следующие варианты:+* ''formation'' - описывет способ построения и не является обязательным. Возможны следующие варианты:
- back - мужики идут чуть позади командира в два ряда (по умолчанию)+** ''back'' - мужики идут чуть позади командира в два ряда (по умолчанию)
- line - шеренга+** ''line'' - шеренга
- around - вокруг командира+** ''around'' - вокруг командира
 +* ''commander = true'' - типа назначат командиром, желательно, чтобы такой красивый он был один.
 +* ''move_type = ...'' - задает изначальный режим перемещения, по умолчанию patrol. Вообще, значение этого поля есть название ходячей анимации из state_mgr_lib.
При остановке командора в meet мужики останавливаются. При остановке командора в meet мужики останавливаются.
- Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:+Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:
- ret=0...2+
- 0 - линия+
- 1 – вокруг старшего+
- 2 – по бокам+
-При движении командор работает как обычный walker и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано a=assault, то командор помчится с орудием убийства на перевес, а остальные его откопируют.+''ret=0...2''
- Что еще не сделано или глючит:+* 0 - линия
- - нет возможности автоматически перестроить команду (нужно от Шурика то, что записано в todo листе)+* 1 – вокруг старшего
- - все идут молча (когда будет манагер баек, то сделаем)+* 2 – по бокам
- - командор пока не отдает команд (нет озвучки)+ 
- - не рекомендуется включать спринт (глючит)+При движении командор работает как обычный walker и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано ''a = assault'', то командор помчится с орудием убийства на перевес, а остальные его откопируют.
 + 
 +Что еще не сделано или глючит:
 + 
 +* нет возможности автоматически перестроить команду (нужно от Шурика то, что записано в todo листе)
 +* все идут молча (когда будет манагер баек, то сделаем)
 +* командор пока не отдает команд (нет озвучки)
 +* не рекомендуется включать спринт (глючит)
==3.3. Секции.== ==3.3. Секции.==
-==3.3.1. Секция combat==+===3.3.1. Секция combat===
Показывает, что происходит, когда NPC срывается в бой. Показывает, что происходит, когда NPC срывается в бой.
-on_combat = combat 
-[combat]+''on_combat = combat''
-on_info = %+info -info =func% эффекты, которые вызываются на каждом раунде боя.+ 
 +''[combat]''
 + 
 +* ''on_info = %+info -info =func%'' - эффекты, которые вызываются на каждом раунде боя.
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type. Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type.
В следующем примере сталкер сражается: В следующем примере сталкер сражается:
- * по-кемперски, если враг=актёр и он дальше Х метров 
- * по-монолитовски, если любой враг дальше Y метров 
- * иначе - движковый бой 
-[logic]+* по-кемперски, если враг = актёр и он дальше Х метров
 +* по-монолитовски, если любой враг дальше Y метров
 +* иначе - движковый бой
 + 
 +<pre>[logic]
active = walker active = walker
on_combat = combat on_combat = combat
Строка 413: Строка 437:
[combat] [combat]
-combat_type = {=fighting_actor =fighting_ge_X_meters} camper, {=fighting_ge_Y_meters} monolith+combat_type = {=fighting_actor =fighting_ge_X_meters} camper, {=fighting_ge_Y_meters} monolith</pre>
-Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.+Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров NPC переходил бы в кемперский комбат.
-function fighting_dist_ge_20(actor, npc)+ 
 +<pre>function fighting_dist_ge_20(actor, npc)
return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400 return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400
-end+end</pre>
-400 – это 202 . Примечание – мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.+
 +Примечание – мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый: Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:
-[logic]+<pre>[logic]
active = nil active = nil
on_combat = combat on_combat = combat
[combat] [combat]
-combat_type = zombied+combat_type = zombied</pre>
-Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type.+Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type. Помните: оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на 5 секций и в четырёх нужен кемперский комбат, а в пятой монолитовский, то можно задать так:
-Помните: оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на 5 секций и в четырёх нужен кемперский комбат, а в пятой монолитовский, то можно задать так:+
-[logic]+<pre>[logic]
active = walker1 active = walker1
on_combat = combat on_combat = combat
Строка 451: Строка 475:
[combat] [combat]
-combat_type = camper+combat_type = camper</pre>
- (scheme - задает тип боя (monolith, camper, zombied), иначе - универсальный бой)+
 +* ''scheme'' - задает тип боя (monolith, camper, zombied), иначе - универсальный бой)
 +* ''disable_combat_handler'' – функция отключающая секцию combat.
-disable_combat_handler – функция отключающая секцию combat.+Файл: '''\gamedata\scripts\xr_combat.script'''
-Файл: \gamedata\scripts\xr_combat.script+
-==3.3.2 Секция death==+===3.3.2 Секция death===
Схема показывает, что происходит при смерти NPC. Схема показывает, что происходит при смерти NPC.
-on_death = death 
-[death]+''on_death = death''
-on_info = %+info -info =func%+
-Файл: \gamedata\scripts\xr_death.script+
-==3.3.3. Cекция hit==+<pre>[death]
-Схема показывает, что происходит при, нанесении повреждения NPC. on_hit НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как аггрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).+on_info = %+info -info =func%</pre>
-on_hit = hit+
-[hit] 
-on_info = %+info -info =func% 
-Файл: \gamedata\scripts\xr_hit.script+Файл: '''\gamedata\scripts\xr_death.script'''
 +===3.3.3. Cекция hit===
 +Схема показывает, что происходит при нанесении повреждения NPC.
 +Причем on_hit '''не срабатывает''' на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).
-==3.3.4. Секция actor_dialogs==+''on_hit = hit''
 + 
 +<pre>[hit]
 +on_info = %+info -info =func%</pre>
 + 
 + 
 +Файл: '''\gamedata\scripts\xr_hit.script'''
 + 
 +===3.3.4. Секция actor_dialogs===
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме. Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.
-actor_dialogs = actor_dialogs 
-[actor_dialogs]+''actor_dialogs = actor_dialogs''
-id = доступные диалоги через запятую.+
-disable = запрещенные диалоги, тоже через запятую.+
-Файл: \gamedata\scripts\xr_meet.script+
 +''[actor_dialogs]''
-==3.3.5. Секция use==+* ''id = ...'' - доступные диалоги через запятую.
 +* ''disable = ...'' - запрещенные диалоги, тоже через запятую.
 + 
 + 
 +Файл: '''\gamedata\scripts\xr_meet.script'''
 + 
 +===3.3.5. Секция use===
Схема показывает, что произойдет, если игрок юзнет NPC. Схема показывает, что произойдет, если игрок юзнет NPC.
-on_use = use+''on_use = use''
-[use]+<pre>[use]
-on_info = %+info -info =func%+on_info = %+info -info =func%</pre>
-Файл: \gamedata\scripts\xr_use.script 
 +Файл: '''\gamedata\scripts\xr_use.script'''
-==3.3.6. Секция combat_ignore==+===3.3.6. Секция combat_ignore===
-Если NPC в этой схеме то он, не переходит в боевой режим. В любой другой схеме:+
-[walker]+Если NPC в этой схеме то он не переходит в боевой режим. В любой другой схеме:
-combat_ignore_cond = {+info –info =func !func} – условия для игнорирования боя (если написать always, то в данной схеме игрок будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется).+
-В схеме нет дополнительных полей+''[walker]''
-[walker]+ 
 +* ''combat_ignore_cond = {+info –info =func !func}'' – условия для игнорирования боя (если написать always, то в данной схеме игрок будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется).
 + 
 +В схеме нет дополнительных полей.
 + 
 +<pre>[walker]
combat_ignore = combat_ignore combat_ignore = combat_ignore
-[combat_ignore]+[combat_ignore]</pre>
Функции, используемые для работы с кондлистом комбат игнора: Функции, используемые для работы с кондлистом комбат игнора:
-fighting_dist_ge_20 -- текущий враг на расстоянии больше или равном 20м 
-fighting_dist_ge(pасстояние в метрах) – универсальная функция для combat_ignore, проверка расстояния для игрока 
 +* ''fighting_dist_ge_20'' - текущий враг на расстоянии больше или равном 20 м.
 +* ''fighting_dist_ge (х)'' – (х - расстояние в метрах)универсальная функция для combat_ignore, проверка расстояния для игрока.
 +* ''fighting_actor'' - текущий враг - актёр?
 +* ''check_fighting'' - проверка (по story_id) того, что нашим врагом есть хотя бы кото-то один из списка.
-fighting_actor -- текущий враг актёр? 
-check_fighting -- проверка (по story_id) того, что нашим врагом есть хотя бы кото-то один из списка 
-Файл: \gamedata\scripts\xr_combat_ignore.script+Файл: '''\gamedata\scripts\xr_combat_ignore.script'''
==Авторы== ==Авторы==
Строка 525: Строка 560:
Статья создана: Статья создана:
-* '''GSC Game World'''+* '''GSC Game World''' ([http://www.stalkerin.gameru.net/wiki/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8 оригинал])
 +[[en:Logic]]
[[Категория:Статьи участников]] [[Категория:Статьи участников]]

Текущая версия

Переход к другим частям

Настройка логики (часть 1)
Настройка логики (часть 2)
Настройка логики (часть 3)
Настройка логики (часть 4)

Содержание

3. Настройки логики

3.1. Система флагов (path_walk, path_look)

В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени waypoint-а, например, для точки с именем "wp00": wp00|flag1|flag2.

  • Флаги точек пути path_walk:

a=state

Выбирает состояние тела при перемещении (Только из раздела – Ходячие состояния). Список состояний можно взять в gamedata\scripts\state_lib.script.

p=percent

Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.

sig=name

Установить сигнал с именем name сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля on_signal логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути path_look.

  • Флаги точек пути path_look:

a=state

Выбирает состояние тела при стоянии (или сидении) на месте. (Из разделов Стоячие и Сидячие состояния) Список состояний можно взять в gamedata\scripts\state_lib.script

t=msec

Время в миллисекундах, которое персонаж должен смотреть в заданную точку. ‘*’ – бесконечное время. Допустимы значения в диапазоне [1000, 30000], по умолчанию – 5000. Для конечных (терминальных) вершин пути path_walk, у которых не более 1-й соответствующей точки path_look, значение t всегда считается бесконечным и его явно задавать не нужно.

sig=name

После поворота в точку path_look, установить сигнал с именем name.

syn

Наличие флажка задержит установку сигнала до тех пор, пока в точку с флажком syn не прибудут все персонажи с данным team-ом (team задается в виде текстовой строки в customdata). До тех пор, пока остальные персонажи не прибудут, ожидающей персонаж будет отыгрывать свою idle анимацию.

sigtm=signal

Устанавливает сигнал при вызове time_callback-а state manager-ом. Соответственно, если t=0, то сигнал будет установлен после отыгрывания init анимации. Это используется, например, с анимацией press, которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.

В пути path_look можно сделать: wp00 | a=press | t=0 | sigtm=pressed
А затем переключить схему: on_signal = pressed | другая_схема

3.1.1. Более подробное описание путей (walker)

Настройка:

На карту для каждого walker'а нужно поставить:

  • Путь path_walk, по которому walker ходит.
  • Путь path_look, состоящий из точек, в которые walker смотрит.

Walker'ов может быть от одного или больше. Они могут действовать независимо, или взаимодействовать друг с другом.

[walker]

  • team = ... - имя команды, произвольная текстовая строка. Все walker'ы в одной команде должны иметь один и тот же team. Желательно в team задавать имя уровня и имя места, где стоят walker'ы, например: escape_bridge, escape_factory, это уменьшит шанс ошибиться и дать разным командам общее имя.
  • path_walk = ... - имя пути, описанного в п. 1
  • path_look = ... - (не обязательно) имя пути, описанного в п. 2. Если персонаж должен только ходить по маршруту, path_look можно не задавать. Если персонаж должен стоять на месте, то ему задается одна точка пути path_walk и как минимум одна точка пути path_look.

Правила расстановки флажков в путях рассмотрим на нескольких примерах.


  • Пример 1:

Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом:

Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути path_walk существуют флажки. У каждого вейпоинта есть имя: wp00, wp01 и т.д. Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘|’. Пишется a = anim, где anim – название анимации из пункта 2.4.4. настоящей документации. Если мы напишем a = threat, то персонаж пойдет в состоянии danger, если a = raid - то побежит с оружием наизготовку, и т.д.

В точках пути path_walk используются анимации только из раздела «Ходячие состояния»!


  • Пример 2:

Разговор персонажа.

Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существует поле: s = имя_звуковой_схемы (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.


  • Пример 3:

В примере 3 используется только поле s, чтобы задать тему разговора, и флажок sc, чтобы показать, что звук проигрывается не разово, а периодически. Остальные параметры (sp, sf, st) задавать не рекомендуется, значения по умолчанию приемлемы для большинства скриптов. Параметр sa также использовать не рекомендуется. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути path_look, о котором будет написано ниже в этом документе. Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь path_look.


  • Пример 4:

Усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него. Что добавилось в этом примере? Путь path_look с двумя точками. Связь между точками этого пути рекомендуется сразу же удалить в редакторе, поскольку она все равно не используется.

Далее, в точках путей path_walk и path_look, которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки. Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1. Теперь персонаж будет останавливаться в точках path_walk, помеченных флажком, и смотреть в точку path_look, помеченную тем же самым флажком.

Если точка path_walk не помечена флажком, персонаж проходит ее не останавливаясь. Одной точке path_walk может соответствовать несколько точек path_look. Тогда персонаж выберем случайно одну из подходящих точек.

По аналогии с path_walk, в точках пути path_look можно использовать различные флажки, меняющие поведение:

  • p = 100 – вероятность, с которой персонаж посмотрит именно в эту точку. Значения p всех подходящих точек суммируются, т.е. если у одной точки p = 100, а у другой 300, то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400). Во избежание путаницы, рекомендуется задавать p так, чтобы их сумма составляла 100. По умолчанию у всех точек p = 100.
  • t = ... время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)


  • Пример 5:

В этом примере, проходя через точку wp00, персонаж с вероятностью 30% посмотрит в точку wp00 в течение 5 секунд, но с вероятностью 70% посмотрит в точку wp01 в течении 10 секунд.

По умолчанию при остановках персонаж играет анимацию idle, если он не в состоянии crouch, либо анимацию hide, если он в состоянии crouch. Если требуется другая анимация, можно ее указать с помощью флажка:

  • a = имя_анимации (по умолчанию idle). Пишется a = anim, где anim – название анимации из пункта 2.4.4. настоящей документации. Если мы напишем a = hide, то персонаж сядет в состоянии danger, если a = guard, то встанет с оружием наизготовку и т.д.

В точках пути path_look используются анимации только из раздела «Ходячие состояния»!

3.2. Схемы поведения сталкеров

Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.

В файле \gamedata\scripts\modules.script указаны все загружаемые схемы.

3.2.1. Схема walker

Это базовая схема, в которой персонаж перемещается по патрульному пути (path_walk) и останавливается в определенных точках и выполняет соответствующие действия.

[walker]

  • path_walk = имя пути - основной путь, по которому ходит NPC
  • path_look = имя пути - путь, куда смотрит NPC
  • team - команда для синхронизации

В точках path_walk, которым соответствуют точки пути path_look (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.

  • def_state_moving1 - состояние, в котором сталкер движется к первой точке пути, если она близко (patrol по умолчанию)
  • def_state_moving2 - состояние, в котором сталкер движется к первой точке пути, если она не слишком далеко (rush по умолчанию)
  • def_state_moving3 - состояние, в котором сталкер движется к первой точке пути, если она далеко (sprint по умолчанию)
  • def_state_standing - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.

Файл: \gamedata\scripts\xr_walker.script

3.2.2. Схема remark

Схема используется для синхронизации\связки других схем.

[remark]

  • snd_anim_synс = true/false - Указывает на то необходимо ли синхронизировать звук с анимацией либо нет
  • snd - звук ремарка, по умолчанию nil
  • anim - анимация ремарка, по умолчанию wait
  • target - куда смотрит сталкер. Есть следующие варианты
    • story_id – числовое значение
    • actor – без комментариев
    • nil – позиция вычисленная АИ автоматически
    • <имя работы>,<имя гулага> смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг сталкера, для которого задана данная секция ремарка).

Пример:

target = logic@cit_killers_base_guard, cit_killers <path_name>, <point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>, <имя точки>).

Внимание, теперь если значение не задано, то оно равно nil а не actor, как было раньше. То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение nil, то персонаж развернется в позицию, которую посчитает AI.

Стандартные сигналы для remark:

  • sound_end – по окончании проигрывания звуковой схемы
  • anim_end – по окончании проигрывания анимации
  • action_end – по окончании проигрывания и того и другого, если они синхронизированы

Пример синхронизации анимации и звука в схеме remark:

[remark]

  • anim - анимация
  • snd - звук
  • snd_anim_sync = true - синхронизация
  • on_signal = action_end | следующая схема

3.2.3. Схема sleeper

Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из одного поинта. Спящий будет садиться спать в нулевой точке пути, и разворачиваться при этом в сторону первой точки.

[sleeper]

  • path_main = ... - имя пути
  • wakeable = true – может ли проснуться быстро (если true, то спит на корточках и во сне бормочет)


Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).

Файл: \gamedata\scripts\xr_sleeper.script

3.2.4. Схема kamp

Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.

[kamp]

  • center_point = kamp_center – имя точки вокруг которой NPC будет устраиваться.
  • radius = 2 - насколько далеко сталкер будет сидеть от центра лагеря, 2 - по умолчанию.
  • def_state_moving = run - дефолтное состояние, в котором сталкер будет идети к точке кампа.

Файл: \gamedata\scripts\xr_kamp.script

Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит. Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой равно:

<path_kamp_name>_task

  • path_walk = <path_kamp_name>_task

Если точка кемпа расположена в чистом поле то, path_walk прописывать не надо.

3.2.5. Схема camper

Свойства кемперов:

  • Кемпер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передигается по патрульным путям
  • Кемперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возращается в состояние кемпера.
  • В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим danger - то смотрим в направление в danger. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага.
  • Кемперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.

[camper]

  • path_walk = patrol_path
  • path_look = patrol_path
  • radius = ... – расстояние в метрах, если расстояние между кэмпером и противником меньше указанного, кэмпер уходит в универсальный комбат. По умолчанию этот радиус равен 20 метрам.
  • no_retreat = true - персонаж при виде врага не будет ломиться на ближайшую точку path_walk, а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите кемперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.
  • def_state_moving = ... - (состояние из стейт менеджера), в котором мы движемся на ближайшую точку пути при враге.
  • def_state_moving_fire = ... - (состояние из стейт менеджера (sneak_fire)), в котором мы отстреливаемся от врага, во время движения на ближайшую точку пути.
  • def_state_campering = ... - (состояние из стейт менеджера (hide)), в котором мы ожидаем врага, находясь на пути.
  • def_state_campering_fire = ... (состояние из стейт менеджера (hide_fire)), в котором мы отстреливаемся от врага, находясь на пути.
  • attack_sound = имя_звуковой_темы - возможность переопределять снайперам/кемперам звук атаки. По дефолту он равен звуковой теме "fight_attack". Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав в секции кемпера пустой атрибут.
  • shoot = ... - Задаем тип стрельбы. Возможные значения:
    • always - значение по умолчанию, стреляет всегда, когда можно
    • none - не стреляет вообще.
    • terminal - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.

У кемпера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела), то он тупо продолжает стоять на старом месте и ждать следующей пули. Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кемпера. Используйте walkerов в таких случаях, а кемперов стоить ставить для атак по путям и как снайперов.

3.2.5.1. Схема sniper

Разновидность кемпера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20сек. Внимание! Ставить снайперу только 2 точки look.

В кастом дате кемпера прописать:
sniper = true

Файл: \gamedata\scripts\xr_camper.script

3.2.6. Схема follower

В custom_data прописан как follower. NPC идет за NPC лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме run, если свыше 20 – догоняет в режиме sprint. Пути не задаются.

[follower]

  • leader = ... - story_id лидера из game.ltx (число!).
  • formation_line = true - постарается идти сбоку от лидера, в противном случае будет идти сзади.
  • distance = ... - расстояние в метрах, на котором будет идти от лидера attendant. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.
  • state_if_leader_in_meet - это есть строка с именем состояния из state_manager, которое будет назначено follower'ам, если командир пребывает в состоянии meet.
  • anim_walk = state - состояние, в котором фолловер идет за лидером.
  • anim_run = state - состояние, в котором фолловер бежит за лидером.
  • anim_sprint = state - состояние, в котором фолловер спринтует за лидером.


Файл: \gamedata\scripts\xr_ attendant.script

Если все это происходит под гулагом, то вместо story_id лидера, мы прописываем его секцию логики в файле скрипта. Пример:

t = { section = "logic@bar_arena_follower_2", 
			idle = 0,
			prior = 7, state = {0}, squad = squad, group = groups[0],
			in_rest = "", out_rest = "",
			dependent = "logic@bar_arena_leader",
			predicate = function(obj)
				         	return obj:character_community() == "dolg"
			            end
}

3.2.7. Схема zoneguard

NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока

[zoneguard]

  • path_walk = ... - путь перемещения
  • path_look = ... - путь обзора
  • team = ... - имя команды синхронизированных zoneguard-ов (из всей команды только 1 будет реагировать на игрока)
  • zone_guard = ... - имя зоны, в пределах которой игрок будет атакован
  • zone_warn = ... - имя зоны, в пределах которой начинать разговор с игроком
  • walker_team = ... - team для схемы перемещения его в состоянии walker (если не задан, используется значение из поля team)
  • no_move = ... - если true, персонаж окликнет игрока с места и не будет подбегать к нему
  • snd_greet = ... - имя звуковой схемы, из которой будет проигран звук при обнаружении персонажа
  • ignore_friends = ... - true - будет игнорировать дружественных ему персонажей.
  • ignore_cond = {+info -info =func !func} - условия, при которых NPC игнорирует игрока
  • no_danger = ... - если true, то не отыгрывает угрожающую анимацию, нейтралам.
  • anim = ... - какую отыгрывает анимацию, если игрок ему не враждебен.
  • snd_anim_sync = ... - если true, то npc будет синхронизировать звук с анимацией


Файл: \gamedata\scripts\xr_zoneguard.script

3.2.8. Схема wounded (раненый)

[logic]
wounded = wounded

[walker]
wounded = wounded

[wounded]
hp_state 		= HP|condstate@condsound|HP|condstate@condsound
hp_state_see	= HP|condstate@condsound|HP|condstate@condsound
psy_state 		= PSY|condstate@condsound|PSY|condstate@condsound
hp_victim		= HP|condvictim|HP|condvictim
hp_cover		= HP|condbool|HP|condbool
hp_fight		= HP|condbool|HP|condbool
syndata		= state@sound|state@sound
help_dialog	= story_id 
help_start_dialog = story_id

Где:

  • condstate – кондлист, возвращающий состояние персонажа, либо true. Если он возвращает true – нпс обидится на игрока
  • condsound – кондлист, возвращающий саунд тему.
  • HP – пороговые значение здоровья персонажа
  • PSY – пороговые значения пси здоровья персонажа
  • condvictim – кондлист, возвращающий направление куда смотреть. Возможные значения: nil, actor, number. В случае числа – будет смотреть на персонажа с указанными стори айди.
  • condbool – кондлист, возвращаюзий true либо false.

Значения полей:

  • hp_state – поведение персонажа когда он не видит игрока
  • hp_state_see – поведение персонажа, когда он видит игрока
  • psy_state – поведение персонажа при псиатаках
  • hp_victim – куда смотреть, в зависимости от ХП
  • hp_cover – идти в укрытие или нет, в зависимости от ХП
  • hp_fight – разрешено воевать или нет, в зависимости от ХП
  • syndata – синхропары для красоты.
  • help_dialog – story_id диалога вместо дефолтного actor_help_wounded. Если вам по сюжету необходимо заменить диалог другим, то вы в этом поле прописываете id другого диалога.

Также мы вставляем стартовый диалог раненого. Если мы его прописываем, то все актёрские диалоги для раненых должны иметь такой precondition: dialogs.allow_wounded_dialog.

Пример. В качестве примера взята дефолтная настройка.

hp_state = 30|help_me@help|10|wounded_heavy@help_heavy
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|
{=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy
hp_victim = 30|actor|10|nil
hp_cover = 30|true|10|false
hp_fight = 30|true|10|false
syndata = wounded@help

Где:

  • best_pistol – проверка на то, что лучшее оружие НПС является пистолетом.


Файл: \gamedata\scripts\xr_wounded.script

3.2.9. Схема rest

Чувак гуляет, хавает, спит. Пока нормально не работает.

Файл: \gamedata\scripts\xr_rest.script

3.2.10. Схема heli_hunter

Может стрелять, либо не стрелять по вертолету в зависимости от условий. Делается это так:

[camper@bar_freedom_attack_sniper_1]

path_walk = camper_1_walk
path_look = camper_1_look
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 %=bar_freedom_angry_actor%
meet_talk_enabled = true
meet_dialog = bar_svoboda_dialog
heli_hunter = {-bar_ecolog_crush_heli_down} true, false

Если раньше оверрайд хелихантера понимал только значения true либо false, то сейчас он понимает кондлист, который если возвращает true - то стрельба по вертолету в данной схеме разрешена.

3.2.11. Patrol

Итак, есть предварительная система патруля. Представляет собой вариацию kamp только в состоянии ходьбы. Для ее работы прописываем в кустовой дате следующее:

[patrol]

path_walk = path_walk
path_look = path_look
formation = back
commander = true
move_type = ...
  • formation - описывет способ построения и не является обязательным. Возможны следующие варианты:
    • back - мужики идут чуть позади командира в два ряда (по умолчанию)
    • line - шеренга
    • around - вокруг командира
  • commander = true - типа назначат командиром, желательно, чтобы такой красивый он был один.
  • move_type = ... - задает изначальный режим перемещения, по умолчанию patrol. Вообще, значение этого поля есть название ходячей анимации из state_mgr_lib.

При остановке командора в meet мужики останавливаются.

Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:

ret=0...2

  • 0 - линия
  • 1 – вокруг старшего
  • 2 – по бокам

При движении командор работает как обычный walker и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано a = assault, то командор помчится с орудием убийства на перевес, а остальные его откопируют.

Что еще не сделано или глючит:

  • нет возможности автоматически перестроить команду (нужно от Шурика то, что записано в todo листе)
  • все идут молча (когда будет манагер баек, то сделаем)
  • командор пока не отдает команд (нет озвучки)
  • не рекомендуется включать спринт (глючит)

3.3. Секции.

3.3.1. Секция combat

Показывает, что происходит, когда NPC срывается в бой.

on_combat = combat

[combat]

  • on_info = %+info -info =func% - эффекты, которые вызываются на каждом раунде боя.

Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type.

В следующем примере сталкер сражается:

  • по-кемперски, если враг = актёр и он дальше Х метров
  • по-монолитовски, если любой враг дальше Y метров
  • иначе - движковый бой
[logic]
active = walker
on_combat = combat

[walker]
path_walk = ...

[combat]
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, {=fighting_ge_Y_meters} monolith

Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров NPC переходил бы в кемперский комбат.

function fighting_dist_ge_20(actor, npc)
	return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400 
end

Примечание – мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.

Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:

[logic]
active = nil
on_combat = combat

[combat]
combat_type = zombied

Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type. Помните: оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на 5 секций и в четырёх нужен кемперский комбат, а в пятой монолитовский, то можно задать так:

[logic]
active = walker1
on_combat = combat

[walker1]
...
[walker2]
...
[walker3]
...
[walker4]
...
[walker5]
...
combat_type = monolith

[combat]
combat_type = camper
  • scheme - задает тип боя (monolith, camper, zombied), иначе - универсальный бой)
  • disable_combat_handler – функция отключающая секцию combat.


Файл: \gamedata\scripts\xr_combat.script

3.3.2 Секция death

Схема показывает, что происходит при смерти NPC.

on_death = death

[death]
on_info = %+info -info =func%


Файл: \gamedata\scripts\xr_death.script

3.3.3. Cекция hit

Схема показывает, что происходит при нанесении повреждения NPC.

Причем on_hit не срабатывает на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).

on_hit = hit

[hit]
on_info = %+info -info =func%


Файл: \gamedata\scripts\xr_hit.script

3.3.4. Секция actor_dialogs

Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.

actor_dialogs = actor_dialogs

[actor_dialogs]

  • id = ... - доступные диалоги через запятую.
  • disable = ... - запрещенные диалоги, тоже через запятую.


Файл: \gamedata\scripts\xr_meet.script

3.3.5. Секция use

Схема показывает, что произойдет, если игрок юзнет NPC.

on_use = use

[use]
on_info = %+info -info =func%


Файл: \gamedata\scripts\xr_use.script

3.3.6. Секция combat_ignore

Если NPC в этой схеме то он не переходит в боевой режим. В любой другой схеме:

[walker]

  • combat_ignore_cond = {+info –info =func !func} – условия для игнорирования боя (если написать always, то в данной схеме игрок будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется).

В схеме нет дополнительных полей.

[walker]
combat_ignore = combat_ignore 

[combat_ignore]

Функции, используемые для работы с кондлистом комбат игнора:

  • fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20 м.
  • fighting_dist_ge (х) – (х - расстояние в метрах)универсальная функция для combat_ignore, проверка расстояния для игрока.
  • fighting_actor - текущий враг - актёр?
  • check_fighting - проверка (по story_id) того, что нашим врагом есть хотя бы кото-то один из списка.


Файл: \gamedata\scripts\xr_combat_ignore.script

Авторы

Статья создана:

Личные инструменты
На других языках