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

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

(Различия между версиями)
Перейти к: навигация, поиск
Версия 09:56, 9 декабря 2007 (править)
BAC9-FLCL (Обсуждение | вклад)
(3.3.11. Байки из склепа (Истории у костра))
← К предыдущему изменению
Версия 09:58, 9 декабря 2007 (править) (отменить)
BAC9-FLCL (Обсуждение | вклад)
(3.5.2. Схема mob_eluder)
К следующему изменению →
Строка 144: Строка 144:
==3.5.2. Схема mob_eluder== ==3.5.2. Схема mob_eluder==
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться. Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.
-path = … работает как обычно path_walk. Набор точек патрульного пути. 
-*Time_capture = …. (время в секундах) время, которое монстр находится под этой схемой. Default – 10. 
-*Time_release = …. (время в секундах) время, которое монстр находится под универсальной схемой. Default – 10. 
-*Min_dist = …. (расстояние в метрах, если расстояние до врага меньше этого, то он переходит под универсальную схему). Default – 5. 
-*Max_dist = …. (расстояние в метрах, если расстояние до врага больше этого, то он переходит под eluder). Default - 10 
-Замечание – работает нестабильно. 
-Файл: \gamedata\scripts\mob_eluder.script 
 +* ''path'' = ... - работает как обычно path_walk. Набор точек патрульного пути.
 +* ''Time_capture'' = ... (время в секундах) время, которое монстр находится под этой схемой. Default – 10.
 +* ''Time_release'' = ... (время в секундах) время, которое монстр находится под универсальной схемой. Default – 10.
 +* ''Min_dist'' = ... (расстояние в метрах, если расстояние до врага меньше этого, то он переходит под универсальную схему). Default – 5.
 +* ''Max_dist'' = ... (расстояние в метрах, если расстояние до врага больше этого, то он переходит под eluder). Default - 10.
 +
 +Замечание – работает нестабильно.
 +Файл: ''\gamedata\scripts\mob_eluder.script''
==3.5.3. Схема mob_remark== ==3.5.3. Схема mob_remark==

Версия 09:58, 9 декабря 2007

Содержание

3.3.7. Секция dont_spawn_character_supplies

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

[dont_spawn_character_supplies]

3.3.8. Секция no_smart

Если прописана эта секция, то npc не берется под смарттеррейн даже если он походит по всем параметрам. [no_smart]


3.3.9. Секция treshhold

Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров. Этих параметра два:

       max_ignore_monster_distance (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.
       ignore_monstre_threshold (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.

В секции логики либо в текущей схеме указываете:

threshold = threshold@tratata

[threshold@tratata] max_ignore_distance = <number> ignore_monster = <number>

Второй параметр следует менять ОЧЕНЬ осторожно.

3.3.10. Danger

Настройка может задаваться только в какой-то схеме, например:

[walker] danger = danger_condition

[danger_condition] ignore_distance = 50 (расстояние указывается в метрах) ignore_ distance_grenade = ignore_ distance_corpse = ignore_ distance_hit = ignore_ distance_sound =

Можно также указывать время ожидания для денжера в зависимости от типа:

danger_inertion_time_grenade = danger_inertion_time_corpse = danger_inertion_time_hit = danger_inertion_time_sound =

Дефолтовые настройки: danger_inertion_time_grenade = 20000 danger_inertion_time_corpse = 10000 danger_inertion_time_hit = 60000 danger_inertion_time_sound = 15000

NB!!Также эти настройки теперь распространяются и на схему кемпера. То есть в настройках кемпера перестало работать поле danger_radius. Теперь данные берутся из секции денжера согласно общих правил.

Алгоритм работы такой: Сперва проверяется, что расстояние до опасности не отсекается по ignore_danger. Если опасность ближе, то тогда анализируется ее тип, и проверяется по соотвествующему данному типу расстоянию. Если опасность ближе - тогда разрешается реакция на нее.

 В данный момент установлены следующие дефолты:
 ignore_distance = 50
 ignore_distance_grenade = 15
 ignore_distance_corpse = 10
 ignore_distance_hit = 50
 ignore_distance_sound = 50

NB: если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера danger_condition@1, danger_condition@2 и так далее.

  • danger_expiration_time = Через сколько времени денжер перестанет быть акутальным. Дефолт 5000 мс.
  • danger_inertion_time = Через сколько времени персонаж забудет про денжер, на который он отреагировал. Дефолт 10000 мс.

3.3.11. Байки из склепа (Истории у костра)

Из нового: теперь лагеря автоматически рассказывать истории не будут. Для этого вы должны того или иного сталкера "научить" истории. Делается это так: в кастом дате пишется секция:

[game_info]
stories = "story_01, legend_01"

В кавычках список историй и легенд через запятую. Пока что существуют следующие истории и легенды:

story_01 - Граница зоны и граната за 1 действие.
story_02 - Про трамплин и про камешки.
story_03 - Про то как группа Вильнова вернулась.
story_04 - Про то как Костя Федорин наткнулся на артефакт и пропал на радаре.
story_05 - Про то как духманам с контролером стражаться.
story_06 - Про дверцу, водку и избушку.
legend_01 - Про эксперимент в Зоне, который производят инопланетяне.
legend_02 - Об особо засекреченных лабораториях в зоне.
legend_03 - Легенда о проводнике.
legend_04 - Легенда о темном сталкере.
legend_05 - Легенда о том что глубоко в Зоне спать нельзя.

О, том какие истории и легенды в каком лагере на каком уровня можно и нельзя юзать, узнавать о Профа.

3.3.12. dont_spawn_loot

Всякого рода сюжетные персонажи которые должны быть пустыми после смерти (например раненные или пленные) оказываются не пустыми. Чтобы это исправить необходимо в кастом дате персонажа прописать секцию [dont_spawn_loot]

3.4. Оверрайды

Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны):

  • meet_enabled = true (запускает схему встречи).
    • meet_talk_enabled = true (в действующую схему поведения добавляет возможность диалога).
    • meet_dialog = <название диалога>, который будет запущен при юзе.
    • meet_state = <название состояния> он определяет, в каком состоянии будет находиться персонаж, если открылось диалоговое окно общения и торговли.
    • wounded_enabled = true (включает NPC возможность использовать схему раненого).
    • combat_ignore_cond = см. выше.
    • combat_ignore_keep_when_attacked = true (игрок продолжает игнорировать бой, даже если в него стреляют – только в случае стрельбы со стороны игрока!)
    • combat_type = {условие} scheme - тип боя, которым будет пользоваться NPC из данной схемы.
    • on_combat = см. выше.
  • companion_enabled = true (cвободноходящие сталкеры могут наниматься как компаньоны (в будущем они будут брать за это деньги)).

3.5. Схемы для монстров

3.5.1. Схема mob_walker.

Работает аналогично схеме обычного walker. Но есть некоторые отличия

Флаги пути движения s=звуковая_схема (idle, eat, attack, attack_hit, take_damage, die, threaten, steal, panic, growling) с - идти дальше в присяде r - дальше бежать sig=signal_name - установить заданный сигнал для xr_logic Флаги пути обзора: t=время_мсек - время в миллисекундах, которое нужно ждать, смотря в точку a=anim_set - анимация (stand_idle, sit_idle, lie_idle, eat, sleep, rest, attack, look_around, turn) В customdata персонажа задайте (* отмечены обязательные поля): [walker] path_walk = путь перемещения path_look = путь обзора

  • no_reset = true/false - не сбрасывать action предыдущей схемы (если нужно сохранить, например, звук). По умолчанию false.
  • actor_friendly = true/false - монстр никогда первым не нападает на игрока, но если игрок хоть раз атакует монстра - этот режим навсегда отключится. По умолчанию false.
  • npc_friendly = true/false - монстр никогда первым не нападет на другого монстра (даже враждебного).
  • friendly = true/false - монстр не нападает ни на игрока, ни на монстров. В случае агрессии с их стороны, не запоминает их как врагов и остается дружественным ко всем. По умолчанию false.

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

У кровосососов можно управлять невидимостью: [mob_walker]

 ...
 state = vis
 или
 state = invis
 Задает значение по умолчанию.
 Также в флагах walk пути mob_walker-а можно использовать флажок b
 (behaviour) с теми же параметрами:
 wp00|b=vis
 wp00|b=invis
 

3.5.2. Схема mob_eluder

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

  • path = ... - работает как обычно path_walk. Набор точек патрульного пути.
  • Time_capture = ... (время в секундах) время, которое монстр находится под этой схемой. Default – 10.
  • Time_release = ... (время в секундах) время, которое монстр находится под универсальной схемой. Default – 10.
  • Min_dist = ... (расстояние в метрах, если расстояние до врага меньше этого, то он переходит под универсальную схему). Default – 5.
  • Max_dist = ... (расстояние в метрах, если расстояние до врага больше этого, то он переходит под eluder). Default - 10.

Замечание – работает нестабильно. Файл: \gamedata\scripts\mob_eluder.script

3.5.3. Схема mob_remark

Ремарковая схема, только не для сталкеров, а для монстров.

  • state = специфическое состояние данного конкретного монстра (для кровососов - невидимость)
  • dialog_cond = {+info, =func, -info, !func} условия для открытия окна диалога
  • anim = анимации монстра, перечисляются через запятую.
  • anim.head = анимации головы монстра, через запятую перечисляются
  • tip = какой значок подсветится, при наведении на него курсора
  • snd = какой звук издает
  • time = время проигрывания анимаций, используется только для отладки.

Файл \gamedata\scripts\mob_remark.script На этой схеме сделан торговец.


3.5.4. Схема mob_combat, mob_death

Работают точно также как и у сталкеров соответствующие схемы. Файлы: \gamedata\scripts\mob_combat.script, \gamedata\scripts\mob_death.script

3.5.6 Схема mob_jump (монстр-пружинка)

Схема mob_jump. Теперь mob_jump служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.

Пример:

[logic] active = mob_jump

[mob_jump] path_jump = path ph_jump_factor =2.8 offset = 0,10,0 on_signal = jumped | nil

path_jump – путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом). Реальная точка учитывает позицию path_jump[0] + смещение, заданное с помощью offset. offset – смещение по осям x,y,z соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). ph_jump_factor - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта. Чем он больше, тем прыжок более острый, быстрый (меньше дуга). С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др. Дефолтное значение = 1,8

Примечание: Фактически mob_jump - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал jumped. Т.е. "on_signal = jumped | имя_схемы_или_nil" – является обязательным параметром в схеме, чтобы знать куда переходить дальше. При выборе позиции используется первая точка патрульного пути (0-вой индекс)

3.5.7. Mob_camp

Механика:

 1. Сидит на позиции, смотрит в точку 
 2. Можно задать несколько позиций и время смены позиции.
 3. Перемещается между позициями бегом
 4. При виде врага переходит под универсальную схему (комбат/паника и т.д)
 5. Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции
 6. Если враг уходит далеко - монстр возвращается на позицию

Использование:

[logic] active = mob_camp

[mob_camp] path_look = way_look path_home = way_home time_change_point = 30000 home_min_radius = 20 home_max_radius = 50 skip_transfer_enemy – если прописать в кастом дату, то монстр не будет принимать врага от друших монстров, если его увидит (для этого нужно всех монстров в разные group разнести)

Описание параметров:

  • path_home - путь, состоящий из точек, в которых будет находиться монстр

path_look - путь, состоящий из точек, в которые будет смотреть монстр

  • time_change_point - время изменения текущей camp-точки (по-умолчанию10000), мс
  • home_min_radius - минимальный радиус от врага до camp-точки (по-умолчанию 30), м
  • home_max_radius - максимальный радиус от врага до camp-точки (по-умолчанию 40), м

Особенности:

Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше home_min_radius - атакуем врага, пока враг не исчезнет или дистанция не будет больше home_max_radius.

Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.

 Выбор текущей позиции производится случайным образом
 Индексы точек пути для path_home и path_look должны совпадать (т.е. монстр сидит во второй точке path_home и смотрит во вторую точку path_look)

Единственным необходимым параметром является path_look Если не установлен path_home, в качестве кемперской точки учитывается позиция и нода объекта на спауне.

Для того чтобы монстр смотрел в разные точки на кемпер-позиции, path_look может состоять из нескольких точек.

Обязательные требования: home_min_radius < home_max_radius Количество точек путей path_look и path_home должно быть равным P.S. Mob_Camp можно использовать как альтернативу к монстрам под рестрикторами

3.5.8. Mob_home

Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на mob_home, а старые гулаги постепенно переводить на mob_home. У кого рестрикторы работают хорошо и красиво, их можно не трогать.

Пример: [mob_home] path_home = path1 home_min_radius = 10 home_max_radius = 30 aggressive_home - в назначенную точку path_home монстры бегут а не идут.

Описание: Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри home_min радиуса, иначе прячутся в укрытия. Отсюда следует, что home_min -радиус желательно делать таким, чтобы внитри было достаточно каверов. В айдле тоже обычно расходятся по каверам. Home_max радиус сделан по принципу большого рестриктера в схеме «гнездо».

Добавлена возможность задания минимального и максимального радиусов для схемы mob_home в флагах первой точки пути (path_home). Для этого введены флаги minr и maxr. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из секции. Если не задано ни там, ни там, то берутся дефолтные значения 20 и 40 соответственно.

3.5.9. Mob_fake_death

Появилась схема mob_fake_death для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби... Использование:

[logic] active = mob_fake_death

[mob_fake_death] on_actor_dist_le = 5 | nil

При входе в схему зомби падает, при выходе из схемы встает.


3.6. Оверрайды для монстров:

actor_friendly = если true, то монстр не атакует актера, до первой атаки на него npc_friendly = если true, то монстр не атакует сталкеров и монстров, до первой атаки на него friendly = если true, то монстр не атакует никого до первой атаки на него braindead = если true, то монстр игнорирует любые атаки.

Секции для монстров [mob_death], [mob_hit]

3.7. Секция spawner

Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в Level editor флажок no_move_in_offline и отключен can_switch_offline. Спавнер прописывается в кастом дату объекта перед секцией logic Работает spawner следующим образом:

[spawner] cond = {+info -info =func  !func}

Примечание. Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн. Пример: [spawner] cond = {=is_day} (объект заспавниться днем и уйдет в оффлайн ночью)

После того, как объект заспавнился, его берет под управление скрипт Logic

3.7.1. Спавн монстров дневных и ночных.

[spawner] cond = {=is_day} – спавнить монстра только днем (если надо ночью, то пишем {!is_day}) check_distance = true – проверка на наличие персонажа рядом. min_distance = 100 – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).

3.8. Скрипт logic

NB: если хотите заспавнить у npc что-то из вещей из custom data, то описание того, как это делается находится в Общей части в настройке профилей персонажей (только тег supplies писать не надо!)

Скрипт logic управляет переключением схем. В customdata любого персонажа (кроме свободных) должна присутствовать секция [logic].

Функции, на которые ссылается секция [logic] должны находится в файлах \gamedata\scripts\xr_effects.script или \gamedata\scripts\xr_conditions.script.

В секции должно присутствовать одно из полей: active = активная схема, запускающаяся первой. cfg = имя_ltx_файла_с_настройками

Если задано поле cfg, то в качестве настроек персонажа будет использовано содержимое указанного файла. Пример. Настройки простого walker-а:

[logic] active = walker

[walker] path_walk = walk1 path_look = look1

Переключение схем выполняется с помощью дополнительных условий схемы logic, которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения: Список доступных схем перечислен в главе схемы. Примечание: если logic переключает между несколькими одноименными схемами (например несколькими walker), то их можно нумеровать (walker1, walker2) или через @ давать более информативные названия walker@day, walker@alarm и т.д.

on_actor_dist_le = number | scheme - дистанция до игрока <= number on_actor_dist_le_nvis = number | scheme - дистанция до игрока <= number без проверки на видимость on_actor_dist_ge = number | scheme - если дистанция до игрока > number on_actor_dist_ge_nvis = number | scheme - если дистанция до игрока > number без проверки на видимость on_signal = signal | scheme - срабатывает по приходу сигнала signal от текущей активной схемы on_info = scheme - срабатывает всегда on_timer = msec | scheme - срабатывает через msec мс после включения схемы on_game_timer = sec| scheme – срабатывает через sec секунд игрового времени, после включения схемы on_actor_in_zone = restrictor_name | scheme – если актер в зоне, (указывается имя рестриктора) on_actor_not_in_zone = restrictor_name | scheme – если актер не в зоне, (указывается имя рестриктора) on_npc_in_zone = npc_story_id | restrictor_name | scheme – если NPC в зоне, указывается story_id NPC, и имя рестриктора on_npc_not_in_zone = npc_story_id | restrictor_name | scheme - если NPC не в зоне, указывается story_id NPC, и имя рестриктора on_actor_inside = scheme - зона проверяет, находится ли игрок внутри нее on_actor_outside = scheme - зона проверяет, находится ли игрок за ее пределами

NB: с любыми из вышеперечисленных параметров можно работать следующим образом: on_info = {….} %...% on_info2 = {….} %...% on_info3 = {…} %...% и так далее до посинения


а также условия для переключения на описанные выше секции. combat_ignore_cond = on_hit = on_death = on_combat = on_use =

Личные инструменты