Моделі (або схеми) поведінки у Сталкері
У наборі скриптів Сталкера передбачена можливість об'єднувати оператори та умови моделі поведінки. Модель поведінки – це набір логічно пов'язаних операторів та умов, службовців до виконання певної завдання. Так скрипт xr_kamp є модель поведінки, що складається з двох операторів і двох умов.
Реєстрація моделі поведінки
Для включення нової моделі поведінки до набору моделей, доступних NPC, спочатку необхідно зареєструвати її. Припустимо, нам потрібно зареєструвати модель поведінки, описану у скрипті actor_need_help.script . Реєстрація моделей здійснюється у скрипті modules.script . Додамо туди наступні рядки:
if actor_need_help then --- у цьому рядку ми перевіряємо що наш скрипт дійсно існує load_scheme ( "actor_need_help" , "actor_need_help" , stype_stalker ) end
Перший параметр функції load_scheme задає ім'я файлу скрипта, другий параметр – це назва моделі поведінки, третій параметр – тип моделі поведінки (можливі такі значення: stype_stalker – модель поведінки NPC, stype_mobile – модель поведінки монстра, stype_item – модель поведінки фізичного об'єкта, stype_heli - Модель поведінки вертольота, stype_restrictor - "модель поведінки" області простору). Скрипти для моделей поведінки різних типів пишуться по-різному. Ми розглядатимемо лише моделі поведінки NPC.
Увага! Для успішної роботи моделі поведінки її скрипт повинен містити функцію add_to_binder , яка виконує налаштування планувальника.
Активація/деактивація моделі поведінки
Деякі моделі поведінки застосовуються в будь-яких ситуаціях (наприклад, реакція на потрапляння кулі в NPC або реакція на появу ворога). Такі моделі повинні активуватись/деактивуватись у функціях enable_generic_schemes()/disable_generic_schemes() скрипта xr_logic . У випадку з моделлю поведінки actor_need_help це виглядатиме так:
1. Створюємо функції set_actor_need_help та disable_scheme у нашому скрипті actor_need_help . Ці функції відповідатимуть за активацію та деактивацію нашої моделі поведінки.
function set_actor_need_help ( npc , ini,scheme ) local st = xr_logic.assign_storage_and_bind ( npc , ini, scheme, “actor_need_help” ) st.enabled= true end function disable_scheme ( npc , s ) ] [ scheme ] if st then st.enabled = false end end
' 2. Додаємо наступний рядок до скрипту xr_logic.script після рядка if stype == modules.stype_stalker then у функції enable_generic_schemes() :
actor_need_help.set_actor_need_help ( npc,ini,”actor_need_help” )
3. Додаємо наступний рядок до скрипту xr_logic.script після рядка if stype == modules.stype_stalker then у функції disable_generic_schemes() :
actor_need_help.disable_scheme ( npc,”actor_need_help” )
Якщо модель поведінки призначена лише для використання в певних ситуаціях, то достатньо виконати крок 1 і використовувати створені функції при необхідності. Наприклад, активуючи цю схему через діалог з NPC (як і зробимо у нашому моді).
Увага! Я максимально спростив функції активації/деактивації моделі поведінки. Щоб повністю розібратися з ними, перегляньте скрипти xr_combat , xr_kamp та інші.
Пріоритети моделей поведінки
Деякі моделі поведінки настільки важливі, що мають спрацьовувати у будь-якій ситуації (наприклад, реакція на потрапляння кулі). Для цього в скрипті xr_motivator передбачена функція addCommonPrecondition(action) , до цієї функції можна додати одну з умов нашої моделі поведінки, щоб інші моделі поведінки не могли спрацювати при виконанні цієї умови (тут є свої тонкощі, але ми розглянемо їх пізніше). Припустимо, що ми маємо модель поведінки actor_need_help , що змушує NPC підбігти до ГГ і вилікувати його. Нехай за перевірку здоров'я ГГ відповідає умова з ідентифікатором actor_need_help.property_actor_is_wounded . Отже, якщо ми хочемо, щоб NPC підбігав до РР, не звертаючи уваги ні на що інше, то потрібно додати наступний рядок у функцію addCommonPrecondition(action) :
action:add_precondition ( world_property ( actor_need_help.property_actor_is_wounded, false ) )
Цей рядок заборонить виконання всіх інших дій, якщо умова з ідентифікатором actor_need_help.property_actor_is_wounded стане істинною (у нашому випадку це означатиме, що РР сильно поранений).
Конкретне значення здоров'я ГГ, коли він вважається сильно пораненим, визначатиме евалуатор цієї умови.