Сповіщення
Очистити все

SoC. Логіка NPC. Частина 2


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Моделі (або схеми) поведінки у Сталкері

У наборі скриптів Сталкера передбачена можливість об'єднувати оператори та умови моделі поведінки. Модель поведінки – це набір логічно пов'язаних операторів та умов, службовців до виконання певної завдання. Так скрипт 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 стане істинною (у нашому випадку це означатиме, що РР сильно поранений).

Конкретне значення здоров'я ГГ, коли він вважається сильно пораненим, визначатиме евалуатор цієї умови.


   
Цитата