Настройка логики. Часть 4 — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Настройка логики. Часть 4 — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(3.15. Передача параметров в функции.)
(ПНС -> НПС)
 
(не показаны 40 промежуточные версии 11 участников)
Строка 1: Строка 1:
 
{{Шаблон:Настройка логики}}
 
{{Шаблон:Настройка логики}}
  
==3.10.3. Схема работы прожектора:==
+
=Набор дополнительных настроек логики у разных объектов=
 +
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.
  
В точках look пути, в которые смотрит прожекторщик, нужно прописать
+
==Схема ph_idle==
sl=имя_прожектора
+
Схема по сути ничего не делает, представляет некое промежуточное состояние объекта. Аналог схемы '''''sr_idle''''', только для физического объекта.<br>
  
Например<br>
+
'''[ph_idle]'''<br>
wp00|sl=esc_sl1<br>
+
'''''hit_on_bone = <number>|{+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - определяет, что произойдёт,
 +
:если объект получит хит по кости '''''number'''''.<br>
 +
'''''on_use = {+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - определяет, что произойдёт, если актор взаимодействует с объектом.<br>
 +
'''''tips = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.<br>
 +
'''''nonscript_usable = true/false''''' - возможность стандартных (нескриптовых) действий над объектом: взять объект в интерфейс, открыть инвентарь.
 +
:В игре используется в одном случае - для объектов с именем секции '''''inventory_box''''', то беж тайников.<br>
  
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.
+
''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_idle
 +
 
 +
[ph_idle]
 +
hit_on_bone = 1|%+agroprom_u_light_4%|2|%+agroprom_u_light_4%|3|%+agroprom_u_light_4%|4|%+agroprom_u_light_4%
 +
on_info = {+agroprom_u_light_4} nil %=turn_off_object%</ini>
 +
 
 +
Файл: ''gamedata\scripts\ph_idle.script''
 +
 
 +
 
 +
==Схема ph_door==
 +
Схема для работы двери.<br>
 +
'''''Примечание''''': для двустворчатых ворот задается все аналогично.<br>
 +
 
 +
'''[ph_door]'''<br>
 +
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.<br>
 +
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.<br>
 +
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.<br>
 +
'''''tip_open = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.
 +
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.<br>
 +
'''''tip_close = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.
 +
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.<br>
 +
'''''snd_open_start = <название_звуковой_темы>''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.<br>
 +
'''''snd_close_start = <название_звуковой_темы>''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.<br>
 +
'''''snd_close_stop = <название_звуковой_темы>''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.<br>
 +
'''''on_use = {+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - определяет, что произойдёт, если актор взаимодействует с дверью.
 +
:Обычно используется для переключения схемы.<br>
 +
'''''hit_on_bone = <number>|{+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - определяет, что произойдёт,
 +
:если дверь получит хит по кости '''''number'''''.<br>
 +
'''''no_force = true/false''''' - по умолчанию '''''false'''''.<br>
 +
 
 +
'''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_door@locked
 +
 
 +
[ph_door@locked]
 +
locked = true
 +
snd_open_start = trader_door_unlock
 +
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%
 +
 
 +
[ph_door@closed]
 +
closed = true
 +
locked = false
 +
on_use = ph_door@open %-esc_close_door%
 +
snd_open_start = trader_door_open_start
 +
snd_close_start = trader_door_close_start
 +
snd_close_stop = trader_door_close_stop
 +
 
 +
[ph_door@open]
 +
closed = false
 +
locked = false
 +
on_use = ph_door@closed
 +
on_info = {+esc_close_door} ph_door@closed
 +
snd_open_start = trader_door_open_start
 +
snd_close_start = trader_door_close_start
 +
snd_close_stop = trader_door_close_stop</ini>
 +
 
 +
Файл: ''gamedata\scripts\ph_door.script''
 +
 
 +
==Схема ph_button==
 +
 
 +
Схема работы кнопки.<br>
 +
При нажатии на кнопку переключает секции и выдает инфопоршн.<br>
 +
 
 +
'''[ph_button]'''<br>
 +
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.<br>
 +
'''''anim = <название_анимации>''''' – анимация, которая отыгрывается при нажатии на кнопку.<br>
 +
'''''on_press = {+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - что произойдёт при нажатии на кнопку.<br>
 +
'''''tooltip = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.<br>
  
==3.10.4. Кодовые замки:==
+
'''''Пример использования схемы:'''''<ini>[logic]
 +
active = ph_button@rad_on
  
При введении указанного кода выдает инфопоршн
+
[ph_button@rad_on]
 +
anim_blend  = true
 +
anim        = lab_primary_switcher_idle
 +
tooltip    = tips_rad_switcher_press
 +
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%</ini>
  
[logic]<br>
+
Файл: ''gamedata\scripts\ph_button.script''
active = ph_code@lock<br>
+
  
[ph_code@lock]<br>
+
==Схема ph_code==
code = 1243<br>
+
Схема для осуществления ввода цифрового пароля.
on_code = %+infoportion%<br>
+
При введении указанного кода выдает инфопоршн.
  
Файл: \gamedata\scripts\ph_code.script
+
'''[ph_code]'''
 +
'''''code = <код>''''' - установка кода.<br>
 +
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.<br>
 +
'''''on_check_code = <код> | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.<br>
 +
'''''tips = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.<br>
  
==3.10.5. Ph_gate:==
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_code
  
То же самое, что и ph_door, но для ворот, состоящих из двух дверей:
+
[ph_code]
Вместо параметров closed и locked сейчас используются параметры:<br>
+
code = 1287975
state: состояние, в котором дверь находится при инициализации (по умолчанию none)<br>
+
on_code = nil %+rad_code_door_unlocked%</ini>
open - в открытом<br>
+
<ini>[logic]
closed - в закрытом<br>
+
active = ph_code@lock
none - в текущем (дефолтном или оставшемся от предыдущей схемы)<br>
+
  
locking: блокировка дверей (по умолчанию none)<br>
+
[ph_code@lock]
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)<br>
+
on_check_code1 = 2011533 | %+bun_codelock_open%
 +
on_check_code2 = 342089 | %+bun_codelock_open%</ini>
  
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной
+
Файл: ''gamedata\scripts\ph_code.script''
Состояния в этом положении:<br>
+
open - блокировать в открытом состоянии<br>
+
closed - в закрытом<br>
+
none - не используется (мягкая блокировка возможна только в крайних положениях) <br>
+
  
hard - блокировка двери с помощью границ. Ворота можно только сломать
+
==Схема ph_gate==
Состояния в этом положении:<br>
+
open - блокировать в открытом состоянии<br>
+
closed - в закрытом<br>
+
none - в текущем<br>
+
   
+
none - дверь не заблокирована
+
  
Общие параметры:
+
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. <br>
+
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.<br>
+
  
Звуковые параметры аналогичны ph_door<br>
+
'''[ph_gate]'''<br>
 +
'''''state - <параметр>''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:<br>
 +
:*'''''open''''' - в открытом состоянии;<br>
 +
:*'''''closed''''' - в закрытом состоянии;<br>
 +
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).<br>
 +
'''''locking - <параметр>''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:<br>
 +
:*'''''stick''''' - прилипание дверей к крайним состояниям.<br>
 +
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:<br>
 +
::*'''''open''''' - блокировать в открытом состоянии;<br>
 +
::*'''''closed''''' - в закрытом;<br>
 +
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);<br>
 +
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:<br>
 +
::*'''''open''''' - блокировать в открытом состоянии;<br>
 +
::*'''''closed''''' - в закрытом;<br>
 +
::*'''''none''''' - в текущем.<br>
 +
:*'''''none''''' - дверь не заблокирована<br>
 +
'''''left_limit/right_limit = <number>''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.<br>
 +
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.<br>
 +
'''''Звуковые параметры аналогичны ph_door'''''.<br>
 
      
 
      
Примеры:<br>
+
'''''Пример использования схемы''''':<ini>[logic]
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.<br>
+
active = ph_gate@locked
state = opened<br>
+
locking = soft<br>
+
left_limit = 130<br>
+
rigt_limit = 60<br>
+
breakable = false<br>
+
  
[ph_gate@opened]<br>
+
[ph_gate@locked]
state = opened<br>
+
state = closed
locking = stick<br>
+
locking = hard
 +
on_info = {+val_chase_start} ph_gate@unlocked
  
[ph_gate@closed]<br>
+
[ph_gate@unlocked]
state = closeded<br>
+
state = closed
 +
locking = stick</ini>
  
Файл: \gamedata\scripts\ph_gate.script<br>
+
Файл: ''gamedata\scripts\ph_gate.script''
  
==3.10.6. Ph_sound==
+
==Схема ph_sound==
  
 
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).<br>
 
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).<br>
  
[ph_sound]<br>
+
'''[ph_sound]'''<br>
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes<br>
+
'''''snd = <название_звуковой_темы>''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.<br>
*looped = true/false зацикленое воспроизведение звука (default - false)<br>
+
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.<br>
*min_idle = минимальное время простоя перед включением звука (мс)<br>
+
'''''min_idle = <number>''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.<br>
*max_idle = максимальное время простоя перед включением звука (мс)<br>
+
'''''max_idle = <number>''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.<br>
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения<br>
+
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.<br>
 +
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.<br>
  
NB! Если мы задаем random = true и looped = true, то версия сыпется<br>
+
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.<br>
  
Также поддерждивается кондлист.<br>
+
Поддерживается сигнал '''''sound_end'''''.
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil<br>
+
  
Пример подобной извращенной логики:<br>
+
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.<br>
[logic]<br>
+
active = ph_sound<br>
+
  
[ph_sound]<br>
+
Специфическим образом создается звуковая схема.<br>
snd = gar_seryi_shooting<br>
+
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.<br>
looped = true<br>
+
Например:<lua>ph_snd_themes["gar_seryi_shooting"] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}</lua>
max_idle = 5000<br>
+
on_actor_in_zone = gar_seryi_factory| ph_sound@end<br>
+
  
[ph_sound@end]<br>
+
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.<br>
snd = gar_seryi_shooting_2<br>
+
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.<br>
looped = false<br>
+
on_signal = sound_end| nil<br>
+
  
 +
'''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_sound
  
Кроме того специфическим образом создается звуковая схема.<br>
+
[ph_sound]
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. <br>
+
snd = gar_bandits_seryi
Например:<br>
+
min_idle = 1000
ph_snd_themes["gar_seryi_shooting"] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}<br>
+
max_idle = 5000</ini>
  
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.<br> Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.<br>
+
Файл: ''gamedata\scripts\ph_sound.script''
  
Файл: \gamedata\scripts\ph_sound.script<br>
+
==Схема ph_force==
  
==3.10.7. Ph_force==
+
Схема позволяет пнуть предмет в указанную сторону.<br>
  
Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.<br>
+
'''[ph_force]'''<br>
 +
'''''force = <number>''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.<br>
 +
'''''time = <number>''''' - время прикладывания силы к предмету (в миллисекундах).<br>
 +
'''''delay = <number>''''' - задержка (в секундах) перед применением силы.<br>
 +
'''''point = <имя_пути>''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).<br>
 +
'''''point_index = <number>''''' - индекс точки патрульного пути, в стону которого полетит предмет.<br>
  
force = сила, которая прикладывается к объекту. Измеряется в убитых енотах<br>
+
'''''Пример использования схемы''''':<ini>[logic]
time = время прикладывания силы к предмету (в секундах)<br>
+
active = ph_idle
*delay = задержка (в секундах) перед применением силы<br>
+
point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)<br>
+
point_index = индекс точки патрульного пути, в стону которого полетит предмет.<br>
+
  
==3.10.8. Ph_on_death==
+
[ph_idle]
 +
on_info = {+rad_here_i_come} ph_force
  
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов<br>
+
[ph_force]
Пример:<br>
+
force = 1500
 +
time = 500
 +
delay = 0
 +
point = rad_barrel_drop
 +
point_index = 0</ini>
  
[logic]<br>
+
Файл: ''gamedata\scripts\ph_appforce.script''
active = ph_on_death<br>
+
  
[ph_on_death]<br>
+
==Схема ph_on_death==
on_info = %эффекты%<br>
+
  
Юзать исключительно с разрушаемыми физ. Объектами<br>
+
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.<br>
  
==3.10.9. Ph_car==
+
'''[ph_on_death]'''<br>
 +
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.<br>
  
Настройка возможности игроку управлять машиной.<br>
+
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').<br>
секция: [ph_car]<br>
+
поле:  usable = <condlist> <br>
+
  
usable - кондлист возвращающий true (по умолчанию) или false. <br>
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_on_death
  
Пример:<br>
+
[ph_on_death]
[logic]<br>
+
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%</ini>
active = ph_car<br>
+
  
[ph_car]<br>
+
Файл: ''gamedata\scripts\ph_death.script''
usable = {+val_actor_has_car_key}<br>
+
  
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.
+
==Схема ph_car==
  
==3.10.10. Ph_heavy==
+
Настройка управления наземным транспортом.<br>
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.
+
В кастом дате пишем:
+
  
[ph_heavy]
+
'''[ph_car]'''<br>
 +
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта.<br>
 +
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.<br>
 +
'''''tip_use = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.
 +
:По умолчанию - '''''tip_car_use'''''.<br>
 +
'''''tip_locked = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.<br>
  
 +
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта, а именно БТР.<br>
  
==3.10.11. Ph_oscillate==
+
'''''path_walk = <имя_пути>''''' - путь движения транспорта.<br>
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)
+
'''''path_fire = <имя_пути>''''' - вероятно, точки пути по которым возможна стрельба.<br>
Пример логики<br>
+
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.<br>
 +
'''''fire_time = <number>''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.<br>
 +
'''''fire_repeat = inf/<number>''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.<br>
 +
'''''fire_range = <number>''''' - дальность стрельбы. По умолчанию - 50 метров.<br>
 +
'''''target = <параметр>''''' - цель для стрельбы. Возможны следующие параметры:
 +
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;<br>
 +
:*'''''actor''''' - без комментариев;<br>
 +
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.<br>
 +
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.<br>
 +
'''''on_target_vis = <параметр>|{+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - что произойдёт, если цель будет в прямой видимости.
 +
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.<br>
 +
'''''on_target_nvis = <параметр>|{+info -info =func !func ~number} %+info -info =func% <название_схемы>''''' - что произойдёт, если цель пропадёт из
 +
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.<br>
 +
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', транспорт игнорирует все хиты. По умолчанию '''''false'''''.<br>
 +
'''''headlights = on/off''''' - вкл./выкл. свет от фар.<br>
 +
'''''on_death_info = info''''' - выдача инфопоршня при уничтожении транспорта.<br>
  
[ph_oscillate]<br>
+
Поддерживается сигнал '''''arrived'''''.
joint = provod  - имя кости к которой будет применена сила<br>
+
force = 5        - собственно сила (в ньютонах)<br>
+
period = 1000    - время прикладывания силы.<br>
+
  
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_car@fire
  
==3.11. Смарттерейны и гулаги.==
+
[ph_car@fire]
==3.11.1. Смарттеррейн.==
+
path_walk = pri_wave3_btr_walk
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.<br>
+
path_fire = pri_wave3_btr_look
 +
fire_repeat = inf
 +
auto_fire = true
 +
on_target_vis = actor | ph_car@fight_actor2
 +
on_death_info = pri_wave3_btr_dead
 +
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%</ini>
  
Как поставить smart terrain?<br>
+
Файл: ''gamedata\scripts\ph_car.script''
Для всех smart terrain нужно:<br>
+
1) Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).<br>
+
2) В его custom data прописать настройки.<br>
+
3) Расставить пути для соответствующих схем поведения. <br>
+
  
Параметры custom data:<br>
+
==Схема ph_oscillate==
[gulag1] <br>
+
type = тип гулага<br>
+
capacity = макс. вместимость в людях
+
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)
+
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)
+
*groups = набор group через запятые
+
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)
+
*idle = min, max время бездействия smart_terrain после ухода последнего npc
+
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.
+
  
Указывать тип гулага нужно без кавычек.<br>
+
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)<br>
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.
+
Все времена задаются в часах игрового времени и могут быть дробными.<br>
+
  
Пути:<br>
+
'''[ph_oscillate]'''<br>
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.<br>
+
'''''joint = <имя_кости>''''' - имя кости объекта к которой будет применена сила.<br>
 +
'''''period = <number>''''' - время прикладывания силы в миллисекундах.<br>
 +
'''''force = <number>''''' - собственно сила прикладывания в ньютонах.<br>
 +
'''''correct_angle = <number>''''' - угол относительно оси Y.<br>
  
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) <br>
+
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.<br>
  
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.<br>
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = ph_oscillate
  
==3.11.1.1. Стандартные типы смарттеррейнов.==
+
[ph_oscillate]
 +
joint = bone05
 +
period = 3000
 +
force = 500
 +
correct_angle = 5</ini>
  
Если нужно, чтоб сталкер не захватывался, допишите ему в custom data следующую строку:<br>
+
Файл: ''gamedata\scripts\ph_oscillate.script''
[smart_terrains]<br>
+
none = true<br>
+
  
Если сталкер уже под каким-то smart terrain, то остальные smart terrain он будет игнорировать.<br>
+
==Секция ph_heavy==
 +
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.
 +
В кастом дате пишем:
 +
'''[ph_heavy]'''.
  
===campers===
+
==Принцип работы прожектора:==
Кемперы. custom data:<br>
+
[gulag1]<br>
+
type = campers<br>
+
capacity = от 1 до 3<br>
+
  
Пути:<br>
+
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:
camper_walk1, camper_look1<br>
+
'''''sl=<имя_прожектора>'''''
camper_walk2, camper_look2<br>
+
camper_walk3, camper_look3<br>
+
  
 +
Например:<br>
 +
<ini>wp00|sl=esc_sl1</ini>
 +
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.
  
===walkers===
 
Ходячие. На базе этого можна сделать поиск, обыск и куча всего.<br>
 
custom data:<br>
 
[gulag1]<br>
 
type = walkers<br>
 
capacity = от 1 до 3<br>
 
  
Пути:<br>
+
==Логика вертолёта==
walker_walk1, walker_look1<br>
+
Общие сведения:<br>
walker_walk2, walker_look2<br>
+
*Вертолёт работает на «логике».<br>
walker_walk3, walker_look3<br>
+
*На вертолёт реагируют аномалии.<br>
 +
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.<br>
 +
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.<br>
 +
*У вертолёта есть универсальная боевая схема на манер сталкеров.<br>
 +
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.<br>
  
 +
===Схема heli_move===
  
===search===
+
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.<br>
Ходячие. На базе этого можна сделать поиск, обыск и куча всего.<br>
+
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.<br>
custom data:<br>
+
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.<br>
[gulag1]<br>
+
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.<br>
type = search<br>
+
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).<br>
capacity = 1<br>
+
  
Пути:<br>
+
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.<br>
search_walk, search_look<br>
+
  
Схема следующая:<br>
+
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.<br>
1. Персонаж ходит по точкам, смотрит по сторонам<br>
+
2. В определенных точках останавливается и что-то высматривает (caution, search, hide)<br>
+
3. При этом говорит определенные реплики (…)<br>
+
  
===rest===
+
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.<br>
Отдых. Сталкер по очереди то sleeper, то walker, то rest(ест еду, пьёт водку).
+
custom data:<br>
+
[gulag1]<br>
+
type = rest<br>
+
capacity = 1<br>
+
  
Пути:<br>
+
'''[heli_move]'''<br>
rest – путь из двух вершинок (возможно из 1). В одной сидит, в другую смотрит.<br>
+
'''''path_move = <имя_пути>''''' - путь полёта.<br>
sleep - путь из двух вершинок (возможно из 1). В одной спит, в другую смотрит.<br>
+
'''''path_look = <имя_пути>''''' - точки в которые будет смотреть вертолёт.<br>
rest_walk, rest_look<br>
+
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.<br>
 +
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.<br>
 +
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.<br>
 +
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.<br>
 +
'''''rocket_delay = <number>''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).<br>
 +
'''''default_velocity = <number>''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.<br>
  
==3.11.2. Гулаги.==
+
Параметры, задаваемые в именах вершин пути '''''path_move''''':<br>
Гулаг - средство объединения нескольких сталкеров под централизованным управлением. Основные особенности: <br>
+
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.<br>
А) Есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем поведения);
+
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.<br>
Б) Работы имеют приоритеты; <br>
+
::Возможные значения:<br>
В) Гулаг назначает на работы сталкеров входящих в гулаг, начиная с работ с наивысшим приоритетом;
+
:::*'''''w=1''''' – стрелять только пулемётом;<br>
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.<br>
+
:::*'''''w=2''''' – стрелять только ракетами.<br>
 +
::По умолчанию стреляет всем.<br>
 +
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.<br>
 +
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.<br>
 +
:*'''''die''''' - убить вертолёт.<br>
 +
:*'''''flame''''' - начать дымить (как будто подбили).<br>
  
 +
Параметры, задаваемые в именах вершин пути path_look:<br>
 +
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.<br>
 +
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.<br>
 +
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.<br>
  
 +
Файл: ''gamedata\scripts\heli_move.script''
  
Гулаг создается следующим образом:<br>
+
===Универсальная боевая схема: heli_combat===
 +
Общие сведения:<br>
 +
В универсальной боевой схеме вертолёт не привязан к путям.<br>
 +
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.<br>
 +
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.<br>
  
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.<br>
+
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:<br>
  
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.<br>
+
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться "отомстить" тому, от кого он получил хит.<br>
 +
'''''combat_enemy = <параметр>''''' - враг. Возможны следующие значения:<br>
 +
:*'''''nil''''' - враг отсутствует;<br>
 +
:*'''''actor''''' - без комментариев;<br>
 +
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.<br>
 +
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.<br>
 +
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.<br>
 +
'''''combat_velocity = <number>''''' - скорость, с которой вертолет будет делать боевые заходы.<br>
 +
'''''combat_safe_altitude = <number>''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).<br>
  
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.<br>
+
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':<br>
 +
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;<br>
 +
'''''heli_start_flame''''' - поджечь вертолёт;<br>
 +
'''''heli_die''''' - убить вертолёт.<br>
  
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.<br>
+
Файл: ''gamedata\scripts\heli_combat.script''
[gulag1] <br>
+
type = тип гулага<br>
+
capacity = макс. вместимость в людях<br>
+
*offline = может ли гулаг образоваться в offline (true/false)
+
*squad = squad, который будет проставлен всем сталкерам под гулагом
+
*groups = набор group через запятые
+
*stay = min, max время пребывания npc под smart_terrain
+
*idle = min, max время бездействия smart_terrain после ухода последнего npc
+
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.
+
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)
+
  
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.<br>
+
=Смарттерейны и гулаги.=
Указывать тип гулага нужно без кавычек.<br>
+
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.<br>
+
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.<br>
+
Все времена задаются в часах игрового времени и могут быть дробными.<br>
+
  
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:
+
==Smart Terrain==
<code>
+
Под смарттеррейном понимается шейп или зона, которая обеспечивает "захват" НПС под гулаг, после чего, они начинают выполнять работы предусмотренные этим гулагом. Не нужно ставить большой радиус шейпа для смарта, максимум - один метр.<br>
if gulag_type == "gar_dolg" then
+
  return npc_community == "dolg"
+
end
+
</code>
+
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.<br>
+
  
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. <br>
+
Как поставить '''''smart terrain'''''?<br>
 +
Для всех '''''smart terrain''''' нужно:<br>
 +
#Поставить '''''smart_terrain''''' с необходимым '''''shape''''';<br>
 +
#В его '''''custom_data''''' прописать настройки;<br>
 +
#Расставить пути для соответствующих схем поведения.<br>
  
function loadStates(gname, type)<br>
+
Параметры '''''custom_data''''':<br>
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:<br>
+
'''[smart_terrain]'''<br>
<code>
+
'''''type = <имя_гулага>''''' - название <u>'''гулага'''</u>. Не смарта - а именно гулага!
if type == "gar_maniac" then
+
:Имя смарта смотрим в параметре '''''name''''' спавн секции.<br>
return function(gulag)
+
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых, гулаг может существовать.
  if level.get_time_hours() >= 7 and level.get_time_hours() <= 22 then
+
:Если условия перестали выполняться - то "подчинённые" распускаются и попадают под управление их '''''custom_data'''''.<br>
return 0  -- день
+
'''''capacity = <number>''''' - численность "жителей" гулага. Должно быть меньше либо равно количеству работ, но никак не больше!<br>
else
+
'''''respawn = <имя_респавна>''''' - респавн для гулага. Указывать только один! Вызывает каждый раз, когда кто-то из НПС заступает на работу.<br>
return 1  -- ночь
+
'''''preset = <название_предустановки>''''' - указывается имя одной из секций в файле ''config\misc\smart_terrain_presets.ltx''.
end
+
:Служит для условия того, какой группировки и какого ранго НПС могут заполнять гулаг.
end
+
:Если не указывать, то будет взято имя секции из этого же файла исходя из названия уровня, на котором находится гулаг.<br>
end
+
'''''idle = <min_time>, <max_time>''''' - минимальное и максимальное время (в игровых часах) бездействия гулага,
</code>
+
:после того, как гулаг покинул (по разным причинам) последний НПС. Будет взято случайное число из этого промежутка.
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.<br>
+
:Если указать одно число, то будет взято в промежутке от ноля, до этого числа.(?)<br>
 +
'''''stay = <min_time>, <max_time>'''''
 +
'''''stay = quick/medium/long/default''''' - минимальное и максимальное время (в игровых часах) пребывания всех НПС под гулагом.
 +
:Конкретные значения можно посмотреть в файле ''config\misc\smart_terrain.ltx'' в секции '''''smart_terrain_stay_time'''''.(?)<br>
 +
'''''squad = <number>''''' - сквад, который будет прописываться всем сталкерам под гулагом. Если не указано, то будет взят '''''squad''''' из профиля НПС.<br>
 +
'''''group = <number>, <number>, ...''''' - набор group через запятые. Если не указано, то будет взят '''''gruop''''' из профиля НПС.<br>
  
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:<br>
+
==Гулаги==
function loadJob(sj, gname, type, squad, groups)<br>
+
''Гулаг'' - средство объединения нескольких сталкеров под централизованным управлением.<br>
sj – сама табличка работ гулагов,<br>
+
Основные особенности:<br>
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.<br>
+
* Есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем поведения);<br>
Type – тип гулага<br>
+
* Работы имеют приоритеты;<br>
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.<br>
+
* Гулаг назначает на работы сталкеров входящих в гулаг, начиная с работ с наивысшим приоритетом;<br>
 +
* Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.<br>
  
Примерное описание работ гулага:<br>
+
Рекомендации по планированию гулага:<br>
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.<br>
+
# Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.<br>
<code>
+
# Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.<br>
--' Garbage maniac
+
# Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.<br>
if type == "gar_maniac" then
+
# В редакторе ставиться объект '''''smart_terrain''''' (источник ошибок – иногда ставят '''''space_restictor'''''). Гулагу смарта нужно давать осмысленное название. <u>Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу</u>. Например если вы назвали гулаг '''''esc_blockpost''''', то все патрульные пути должны начинаться с этого префикса, например '''''esc_blockpost'''_guard_walk''.<br>
t = { section = "logic@gar_maniac_camper",
+
 
idle = 0,
+
Создание гулага:<br>
prior = 5, state = {0},
+
1. Создать '''''smart_terrain''''' и настроить его '''''custom_data''''' согласно описанию выше.
squad = squad, groups = groups[1],
+
 
in_rest = "", out_rest = "",
+
 
info_rest =  ""
+
2. В скрипте ''scripts\gulag_название_уровня.script'' необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:<lua>if gulag_type == "имя_гулага" then
}
+
return npc_community == "имя_группировки"
table.insert(sj, t)
+
end</lua>
t = { section = "logic@gar_maniac_sleeper",
+
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. Приниматься под гулаг будет <u>только</u> НПС с указанной группировкой.<br>
idle = 0,
+
 
prior = 5, state = {1},
+
 
squad = squad, groups = groups[1],
+
3. В файле ''scripts\gulag_название_уровня.script'' необходимо описать переключение состояний гулага в функции '''''function loadStates(gname, type)'''''. В нее передается имя смарта и имя гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:<lua>if type == "имя_гулага" then
in_rest = "", out_rest = "",
+
return function(gulag)
info_rest = ""
+
if level.get_time_hours() >= 7 and level.get_time_hours() <= 22 then
}
+
return 0 -- день
table.insert(sj, t)
+
else
 +
return 1 -- ночь
 +
end
 
end
 
end
</code>
+
end</lua>В данном случае, если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии (0), иначе в ночном(1).<br>
Описание полей:<br>
+
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.<br>
+
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.<br>
+
In_rest, out_rest  -  рестрикторы, которые устанавливаются персонажу на данное задание.<br>
+
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.<br>
+
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.<br>
+
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе<br>
+
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: <br>
+
<code>
+
predicate = function(obj)  
+
        return obj:profile_name() == "soldier_commander”          
+
end
+
</code>
+
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.<br>
+
  
  
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:<br>
+
4. В файле ''scripts\gulag_название_уровня.script'' необходимо описать работы гулага. В функции '''''load_job(sj, gname, type, squad, groups)''''' загружаются все допустимые работы. В саму функцию передаются следующие параметры:<br>
<code>
+
* sj – сама табличка работ гулагов.<br>
;----------------------------
+
* gname – имя нашего смар-тиррейна. Оно используется как префикс.<br>
;-- GARBAGE MANIAC
+
* type – имя гулага.<br>
;----------------------------
+
* squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие.<br>
[logic@gar_maniac_camper]
+
:В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.<br>
active = camper@gar_maniac_camper
+
  
[camper@gar_maniac_camper]
+
Примерное описание работ гулага:<br>
path_walk = walk1
+
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.<lua>--' Garbage maniac
path_look = look1
+
if type == "gar_maniac" then
 +
t = { section  = "logic@gar_maniac_camper",
 +
      idle      = 0,
 +
      prior    = 5,
 +
      state    = {0},
 +
      squad    = squad,
 +
      groups    = groups[1],
 +
      in_rest  = "",
 +
      out_rest  = "",
 +
      info_rest = ""
 +
    }
 +
table.insert(sj, t)
 +
t = { section  = "logic@gar_maniac_sleeper",
 +
      idle      = 0,
 +
      prior    = 5,
 +
      state    = {1},
 +
      squad    = squad,
 +
      groups    = groups[1],
 +
      in_rest  = "",
 +
      out_rest  = "",
 +
      info_rest = ""
 +
    }
 +
table.insert(sj, t)
 +
end</lua>
  
  
[logic@gar_maniac_sleeper]
+
Описание возможных полей для описания работы:<br>
active = sleeper@gar_maniac_sleeper
+
'''''section''''' – секция в ''config\misc\gulag_название_уровня.ltx'', где указываются реальные настройки схемы поведения, которая соответствует текущей работе.<br>
 +
'''''idle''''' – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.<br>
 +
'''''prior''''' – приоритет задания. Сначала НПС занимают более приоритетные задания. Чем больше число, тем выше приоритет.<br>
 +
'''''in_rest, out_rest''''' - рестрикторы, которые устанавливаются персонажу на данное задание. Из '''''in_rest''''' НПС запрещено выходить , в '''''out_rest''''' - запрещено входить.<br>
 +
'''''state''''' - cостояние гулага. Необходимо для функции '''''load_states''''', где определяется это состояние, т.е. в каких состояниях данная работа будет доступна.<br>
 +
'''''squad''''' - таблички сквадов, если нам нужно переопределять родные группы сталкеров на какие либо другие.<br>
 +
'''''group''''' - будет выбран из массива '''''groups''''', который задан в '''''custom_data'''''.<br>
 +
'''''info_rest''''' - если на текущей работе что-то раздражает НПС, то будучи в зоны установленного инфо-рестриктора - раздражитель будет проигнорирован.<br>
 +
'''''predicate''''' - условие приема на работу. Указывать нужно функцию, возвращающую '''''true''''' или '''''false'''''.<br>
 +
'''''position_threshold''''' - расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.<br>
 +
'''''timeout''''' - это время, которым задается длительность работы. Если ее задать, то НПС будет выполнять работу именно заданное время,
 +
:после чего будет освобожден от работы (если уже ранее не был от нее освобожден). После освобождения работа может быть доступна для повторной выдачи.<br>
 +
'''''online''''' - если '''''true''''' - НПС на данной работе всегда в онлайне.<br>
 +
'''''idle_after_death''''' - в течении этого времени после смерти предыдущего "работника" данная работа будет недоступна.<br>
  
[sleeper@gar_maniac_sleeper]
 
path_main = sleep
 
wakeable = true
 
</code>
 
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:<br>
 
1) пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.<br>
 
2) в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)<br>
 
3) в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).<br>
 
  
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.<br>
+
5. В ''config\misc\gulag_название_уровня.ltx'' необходимо указать, какие схемы поведения соответствуют той или иной работе.<br>
 +
Настройка здесь соответствует настройке в обычной '''''custom_data''''' сталкера, с разницей:<br>
 +
# Пути следует указывать <u>без префикса</u>. То есть, если гулаг носит имя, например, '''''gar_maniac''''', то пути следует на уровне ставить с названием '''''gar_maniac'''_walk1'', однако в ''config\misc\gulag_название_уровня.ltx'' следует указывать только '''''walk1'''''.<br>
 +
# В именах секций '''''logic''''' для каждой работы добавлять после '''''@''''' имя гулага, дополнительные сведения и имя секции активной схемы поведения. Например: '''''logic@gar_maniac_walker_gate'''''.<br>
  
 
==3.11.3. Новые особенности смарттеррейнов==
 
==3.11.3. Новые особенности смарттеррейнов==
Строка 486: Строка 611:
  
  
==3.12. Логика вертолёта==
+
=Передача параметров в функции=
Общие сведения:<br>
+
 
+
Вертолёт работает на «логике».<br>
+
На вертолёт реагируют аномалии.<br>
+
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.<br>
+
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.<br>
+
У вертолёта есть универсальная боевая схема на манер сталкеров.<br>
+
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.<br>
+
 
+
==3.12.1. Схема heli_move:==
+
Общие сведения:
+
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.
+
 
+
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.
+
 
+
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.
+
 
+
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.
+
 
+
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).
+
 
+
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.
+
 
+
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.
+
+
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look
+
 
+
Настройки:
+
 
+
*engine_sound = true/false (по умолчанию true)
+
Вкл/выкл звук двигателя вертолёта.
+
 
+
*invulnerable = true/false (по умолчанию false)
+
Неуязвимость. Если true, вертолёт игнорирует все хиты.
+
 
+
*immortal = true/false (по умолчанию false)
+
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.
+
 
+
*mute = true/false (по умолчанию false)
+
Отключает универсальные реплики пилотов вертолета.
+
 
+
*rocket_delay = msec (время в миллисекундах реального времени)
+
Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)
+
 
+
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)
+
 
+
Параметры, задаваемые в именах вершин пути path_move:
+
 
+
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.
+
 
+
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.
+
 
+
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.
+
 
+
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.
+
 
+
«die» - убить вертолёт.
+
 
+
«flame» - начать дымить (как будто подбили).
+
 
+
Параметры, задаваемые в именах вершин пути path_look:
+
 
+
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.
+
 
+
«w» – см. такой же параметр для пути path_move.
+
 
+
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.
+
 
+
==3.12.2. Универсальная боевая схема:==
+
Общие сведения:
+
 
+
В универсальной боевой схеме вертолёт не привязан к путям.
+
 
+
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.
+
 
+
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.
+
 
+
Настройки:
+
 
+
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:
+
 
+
combat_ignore = true/false
+
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.
+
 
+
combat_enemy = nil/actor/StoryID
+
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.
+
 
+
combat_use_rocket = true/false
+
Можно ли вертолёту пользоваться рокетами.
+
 
+
combat_use_mgun = true/false
+
Можно ли вертолёту пользоваться пулемётом.
+
 
+
combat_velocity = <число>
+
Скорсть, с которой вертолет будет делать боевые заходы
+
 
+
combat_safe_altitude = <число>
+
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)
+
 
+
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:
+
 
+
heli_set_enemy_actor - сделать актёра врагом вертолёту
+
heli_start_flame - поджечь вертолёт
+
heli_die - убить вертолёт
+
 
+
combat_velocity = - боевая скорость в этой секции указывается в м/с
+
combat_safe_altitude = - высота боевая в метрах, может принимать отрицательные значения
+
combat_use_rocket = - true/false использовать ли ракеты в этой секции
+
combat_use_mgun = - true/false использовать ли пулемет в этой секции
+
 
+
==3.13. Meet_manager==
+
 
+
Синтаксис:
+
 
+
[logic]<br>
+
meet = meet<br>
+
 
+
[walker]<br>
+
meet = meet<br>
+
 
+
[meet]<br>
+
meet_state = 30| state@sound| 20| state@sound| 10| state@sound<br>
+
meet_state_wpn = 30| state@sound| 20| state@sound| 10| state@sound<br>
+
victim = 30| nil| 20| actor<br>
+
victim_wpn = 30| nil| 20| actor<br>
+
use = self<br>
+
use_wpn = false<br>
+
zone = name| state@sound<br>
+
meet_dialog = dialog_id<br>
+
synpairs = state@sound|state@sound<br>
+
abuse = true/false<br>
+
 
+
 
+
Вся настройка встречи отныне будет производится в отдельной секции. В секции logic или в текущей схеме можно будет указать, какую именно секцию с настройкой нужно использовать. Секция, которая указана в секции logic будет влиять на обработку встречи свободногулящим сталкером.
+
 
+
Перечень полей:<br>
+
meet_state, meet_state_wpn – задает анимацию и озвучку персонажа, в зависимости от расстояния до актера. Для случая если актер безоружен либо вооружен соответственно.<br>
+
victim, victim_wpn – задает объект, на который должен будет смотреть персонаж. Возможные параметры: nil – никуда не смотрит, actor – смотрит на игрока, story_id – номер стори айди персонажа, на которого нужно будет смотреть.<br>
+
use, use_wpn – настройки юзабельности персонажа. Возможны три варианта: true, false, self. При self НПС сам юзнет игрока, как только сможет дотянуться <br>
+
zone – Содержит набор имен рестрикторов, а также анимаций и озвучки, которую НПС будет отыгрывать, если игрок будет замечен в рестрикторе<br>
+
meet_dialog – стартовый диалог НПС.<br>
+
synpairs – cодержит набор пар состояние_тела@звуковая_тема. Если при каком то наборе условий встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.<br>
+
аbuse – по умолчанию true, если false, то неюзающийся противник не будет обижаться.<br>
+
Любую строку(в общей схеме они написаны строчными буквами) можно задавать кондлистом. ( {+info1 –info2} ward %+info%  )<br>
+
 
+
Для облегчения настройки встречи сделана возможность упрощенного  задания дефолта:
+
 
+
[walker]<br>
+
meet = default_meet
+
 
+
Саму секцию [default_meet] задавать не надо. Все настройки и так  возьмутся из дефолта.
+
 
+
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна (Во всех примерах зеленым цветом выделены состояния state_manager, синим – звуковые темы):
+
 
+
===Ситуация 1===
+
Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.
+
 
+
[meet]<br>
+
meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait<br>
+
meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap<br>
+
victim = 50| actor<br>
+
victim_wpn = 50| actor<br>
+
use = true<br>
+
use_wpn = false<br>
+
 
+
===Ситуация 2===
+
Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.
+
 
+
[meet]<br>
+
meet_state = 50| {+info} threat_fire %=killactor%, walk@ {+info} talk_abuse, wait | 10 | walk %+info%; wait | 2 | threat;state<br>
+
meet_state_wpn = 50| {+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait<br>
+
victim = 50| actor<br>
+
victim_wpn = 50| actor<br>
+
use = {-info2} self, false<br>
+
use_wpn = false
+
 
+
Здесь: info – инфоропшн, который указывает что мы уже опустили оружие и были достаточно близко к НПС<br>
+
Info2 – инфопоршн, который устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел.<br>
+
Killactor – функция в xr_effects которая обижает НПС на игрока.
+
 
+
===Ситуация 3===
+
Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.
+
 
+
[camper]<br>
+
path_walk = path_walk<br>
+
path_look = path_look<br>
+
meet = meet<br>
+
 
+
[meet]<br>
+
meet_state = 30| {+info} wait, threat@ {+info} talk_hello, threat_back<br>
+
meet_state_wpn = 30| {+info} wait, threat@ {+info} talk_hello, threat_back <br>
+
victim = 30| actor<br>
+
victim_wpn = 30| actor<br>
+
use = true<br>
+
use_wpn = true<br>
+
zone = warnzone| {-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse<br>
+
meet_dialog = {+info} dialog1, dialog2<br>
+
 
+
Здесь:<br>
+
True – вместо анимации, атаковать игрока.<br>
+
Info – Инфопоршн, который говорит что мы имеем допуск к лагерю<br>
+
Warnzone – рестриктор, в котором нас предупреждают<br>
+
Kampzone – рестриктор, в котором нас убивают<br>
+
Dialog1 – стартовый диалог НПС, если мы имеем допуск в лагерь<br>
+
Dialog2 – стартовый диалог НПС, если мы не имеем допуск в лагерь.<br>
+
Дефолтные настройки:<br>
+
По дефолту встреча настроена со следующими параметрами:<br>
+
 
+
meet_state = 30|hello@hail|20|wait@wait<br>
+
meet_state_wpn = 30|backoff@threat_weap<br>
+
victim = 30|actor<br>
+
victim_wpn = 30|actor<br>
+
use = true<br>
+
use_wpn = false<br>
+
syndata = hello@hail|backoff@threat_weap<br>
+
 
+
 
+
NB: Если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему meet = no_meet
+
 
+
==3.14. Отметки на минимапе==
+
Появилась возможность не показывать сталкеров на минимапе и на карте (прятать синие и красные точки). Для этого в секции логики или в текущей схеме указываем параметр:
+
 
+
[camper]<br>
+
show_spot = false (будучи в этой секции сталкер не показывается на карте)
+
 
+
[walker]<br>
+
show_spot = {+info1} false
+
 
+
Сталкер не будет показываться, если у игрока есть инфопоршн info1 и т.д.
+
 
+
==3.15. Передача параметров в функции.==
+
 
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.
 
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.
  
 
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.
 
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.
  
Описание функций с параметрами присутствующих в xr_conditions и xr_effects.
+
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.
 +
 
 
{| class="standard" width="100%"
 
{| class="standard" width="100%"
! colspan="2" class="bright" | <big>'''xr_conditions.script'''</big>
+
!colspan="2" style="background-color:#dbe5f1;" | <big>xr_conditions.script</big>
 +
|-
 +
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr
 +
|-
 +
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr
 
|-  
 
|-  
 
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает "если актёр враг"
 
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает "если актёр враг"
 +
|-
 +
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору
 
|-  
 
|-  
 
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).
 
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).
Строка 757: Строка 658:
 
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.
 
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.
 
|-
 
|-
|gulag_population_le(gulag_name, num)||Проверка того, что количество народу в гулаге <= num.
+
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге <= num.
 
|-
 
|-
 
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери => num.
 
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери => num.
Строка 764: Строка 665:
 
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.
 
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.
 
|-
 
|-
! colspan="2" class="bright" | <big>'''xr_effects.script'''</big>
+
!colspan="2" style="background-color:#dbe5f1;" | <big>xr_effects.script</big>
 
|-  
 
|-  
 
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.
 
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.
Строка 770: Строка 671:
 
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага
 
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага
 
|-  
 
|-  
|hit_npc(direction:bone:power:impulse:reverse=false)||Нанести хит по npc.
+
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.
 
Параметры:
 
Параметры:
 
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится <br>толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен <br>поступить хит.
 
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится <br>толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен <br>поступить хит.
Строка 801: Строка 702:
 
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.
 
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.
 
|-  
 
|-  
! colspan="2" | '''Функции для работы с HUD'ом.'''
+
!colspan="2" style="background-color:#dbe5f1;" | '''Функции для работы с HUD'ом.'''
 
|-  
 
|-  
 
|disable_ui_elements(...)<br\>enable_ui_elements(...)||Отключение/включение элементов HUD'а.
 
|disable_ui_elements(...)<br\>enable_ui_elements(...)||Отключение/включение элементов HUD'а.
Строка 853: Строка 754:
 
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])
 
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])
  
[[Категория:Скрипты]]
+
[[Категория:A-Life]][[Категория:Скрипты]]

Текущая версия на 18:08, 13 августа 2015

Содержание

Настройка логики. Часть 0
Настройка логики. Часть 1
Настройка логики. Часть 2
Настройка логики. Часть 3
Настройка логики. Часть 4

Набор дополнительных настроек логики у разных объектов

Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.

Схема ph_idle

Схема по сути ничего не делает, представляет некое промежуточное состояние объекта. Аналог схемы sr_idle, только для физического объекта.

[ph_idle]
hit_on_bone = <number>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт,

если объект получит хит по кости number.

on_use = {+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт, если актор взаимодействует с объектом.
tips = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка при наведении.
nonscript_usable = true/false - возможность стандартных (нескриптовых) действий над объектом: взять объект в интерфейс, открыть инвентарь.

В игре используется в одном случае - для объектов с именем секции inventory_box, то беж тайников.
'Пример использования схемы:
[logic]
active = ph_idle
 
[ph_idle]
hit_on_bone = 1|%+agroprom_u_light_4%|2|%+agroprom_u_light_4%|3|%+agroprom_u_light_4%|4|%+agroprom_u_light_4%
on_info = {+agroprom_u_light_4} nil %=turn_off_object%

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


Схема ph_door

Схема для работы двери.
Примечание: для двустворчатых ворот задается все аналогично.

[ph_door]
locked = true/false - заперта ли дверь. По умолчанию false.
closed = true/false - закрыта ли дверь. По умолчанию true.
show_tips = true/false - нужно ли показывать подсказку при наведении на дверь. По умолчанию true.
tip_open = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.

Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если locked равен false, то по умолчанию tip_door_open, иначе tip_door_locked.

tip_close = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.

Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если locked равен false, то по умолчанию tip_door_close, иначе пустое значение.

snd_open_start = <название_звуковой_темы> - имя темы из файла sound_theme.script. Звук, который будет отыгран при попытке открыть дверь.
snd_close_start = <название_звуковой_темы> - имя темы из файла sound_theme.script. Звук, который будет отыгран при попытке закрыть дверь.
snd_close_stop = <название_звуковой_темы> - имя темы из файла sound_theme.script. Звук, который будет отыгран, когда дверь захлопнется до конца.
on_use = {+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт, если актор взаимодействует с дверью.

Обычно используется для переключения схемы.

hit_on_bone = <number>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт,

если дверь получит хит по кости number.

no_force = true/false - по умолчанию false.

Пример использования схемы:
[logic]
active = ph_door@locked
 
[ph_door@locked]
locked = true
snd_open_start = trader_door_unlock
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%
 
[ph_door@closed]
closed = true
locked = false
on_use = ph_door@open %-esc_close_door%
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop
 
[ph_door@open]
closed = false
locked = false
on_use = ph_door@closed
on_info = {+esc_close_door} ph_door@closed
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

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

Схема ph_button

Схема работы кнопки.
При нажатии на кнопку переключает секции и выдает инфопоршн.

[ph_button]
anim_blend = true/false – плаваня, сглаженная анимация.
anim = <название_анимации> – анимация, которая отыгрывается при нажатии на кнопку.
on_press = {+info -info =func !func ~number} %+info -info =func% <название_схемы> - что произойдёт при нажатии на кнопку.
tooltip = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка при наведении.

Пример использования схемы:
[logic]
active = ph_button@rad_on
 
[ph_button@rad_on]
anim_blend  = true
anim        = lab_primary_switcher_idle
tooltip     = tips_rad_switcher_press
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%

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

Схема ph_code

Схема для осуществления ввода цифрового пароля. При введении указанного кода выдает инфопоршн.

[ph_code] code = <код> - установка кода.
on_code = {+info -info =func !func ~number}%+info -info =func% - что произойдёт при вводе правильного пароля.
on_check_code = <код> | {+info -info =func !func ~number}%+info -info =func% - что произойдёт при вводе установленного пароля.
tips = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка при наведении.

Пример использования схемы:
[logic]
active = ph_code
 
[ph_code]
code = 1287975
on_code = nil %+rad_code_door_unlocked%
[logic]
active = ph_code@lock
 
[ph_code@lock]
on_check_code1 = 2011533 | %+bun_codelock_open%
on_check_code2 = 342089 | %+bun_codelock_open%

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

Схема ph_gate

То же самое, что и ph_door, но для ворот, состоящих из двух дверей:

[ph_gate]
state - <параметр> - состояние, в котором дверь находится при инициализации (по умолчанию none). Возможны следующие значения:

  • open - в открытом состоянии;
  • closed - в закрытом состоянии;
  • none - в текущем (дефолтном или оставшемся от предыдущей схемы).

locking - <параметр> - блокировка дверей (по умолчанию none). Возможны следующие значения:

  • stick - прилипание дверей к крайним состояниям.
  • soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:
  • open - блокировать в открытом состоянии;
  • closed - в закрытом;
  • none - не используется (мягкая блокировка возможна только в крайних положениях);
  • hard - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:
  • open - блокировать в открытом состоянии;
  • closed - в закрытом;
  • none - в текущем.
  • none - дверь не заблокирована

left_limit/right_limit = <number> - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.
breakable = true/false - определяет можно ли сломать ворота. По умолчанию true.
Звуковые параметры аналогичны ph_door.

Пример использования схемы:
[logic]
active = ph_gate@locked
 
[ph_gate@locked]
state = closed
locking = hard
on_info = {+val_chase_start} ph_gate@unlocked
 
[ph_gate@unlocked]
state = closed
locking = stick

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

Схема ph_sound

Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).

[ph_sound]
snd = <название_звуковой_темы> - имя темы из файла sound_theme.script из таблицы ph_snd_themes.
looped = true/false - зацикленное воспроизведение звука. По умолчанию - false.
min_idle = <number> - минимальное время простоя перед включением звука (мс). По умолчанию - 0.
max_idle = <number> - максимальное время простоя перед включением звука (мс). По умолчанию - 0.
random = true/false - если true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - false.
no_hit = true/false - будет ли схема реагировать на нанесённый хит. По умолчанию - true.

Примечание: если задать random = true и looped = true, то схема сыпется.

Поддерживается сигнал sound_end.

Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil.

Специфическим образом создается звуковая схема.
В sound_theme.script в начале файла есть секция ph_themes, в которой и описываются темы для физ объектов.

Например:
ph_snd_themes["gar_seryi_shooting"] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}

Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.

Пример использования схемы:
[logic]
active = ph_sound
 
[ph_sound]
snd = gar_bandits_seryi
min_idle = 1000
max_idle = 5000

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

Схема ph_force

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

[ph_force]
force = <number> - сила, которая прикладывается к объекту. Измеряется в убитых енотах.
time = <number> - время прикладывания силы к предмету (в миллисекундах).
delay = <number> - задержка (в секундах) перед применением силы.
point = <имя_пути> - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).
point_index = <number> - индекс точки патрульного пути, в стону которого полетит предмет.

Пример использования схемы:
[logic]
active = ph_idle
 
[ph_idle]
on_info = {+rad_here_i_come} ph_force 
 
[ph_force]
force = 1500
time = 500
delay = 0
point = rad_barrel_drop
point_index = 0

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

Схема ph_on_death

Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.

[ph_on_death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты при разрушении.

Примечание: использовать исключительно с разрушаемыми физическими объектами (physic_destroyable_object).

Пример использования схемы:
[logic]
active = ph_on_death
 
[ph_on_death]
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%

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

Схема ph_car

Настройка управления наземным транспортом.

[ph_car]
usable = {+info -info =func !func ~number} - условия для юзабелености объекта.
show_tips = true/false - отображать ли подсказку. По умолчанию - true.
tip_use = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка, в случае, если условия для usable выполнились.

По умолчанию - tip_car_use.

tip_locked = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка, в случае, если условия для usable не выполнились. По умолчанию - tip_car_locked.

В случае, если параметр usable не установлен, то возможна настройка самостоятельного поведения транспорта, а именно БТР.

path_walk = <имя_пути> - путь движения транспорта.
path_fire = <имя_пути> - вероятно, точки пути по которым возможна стрельба.
auto_fire = true/false - разрешить стрелять на ходу. По умолчанию - false.
fire_time = <number> - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.
fire_repeat = inf/<number> - вероятно, время через которое возможна повторная стрельба. inf = -1.
fire_range = <number> - дальность стрельбы. По умолчанию - 50 метров.
target = <параметр> - цель для стрельбы. Возможны следующие параметры:

  • points - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;
  • actor - без комментариев;
  • story_id - персонаж с указанным story_id.

track_target = true/false - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - false.
on_target_vis = <параметр>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - что произойдёт, если цель будет в прямой видимости.

В качестве параметра возможны два значения: actor, story_id персонажа.

on_target_nvis = <параметр>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - что произойдёт, если цель пропадёт из

области прямой видимости. В качестве параметра возможны два значения: actor, story_id персонажа.

invulnerable = true/false - неуязвимость. Если true, транспорт игнорирует все хиты. По умолчанию false.
headlights = on/off - вкл./выкл. свет от фар.
on_death_info = info - выдача инфопоршня при уничтожении транспорта.

Поддерживается сигнал arrived.

Пример использования схемы:
[logic]
active = ph_car@fire
 
[ph_car@fire]
path_walk = pri_wave3_btr_walk
path_fire = pri_wave3_btr_look
fire_repeat = inf
auto_fire = true
on_target_vis = actor | ph_car@fight_actor2
on_death_info = pri_wave3_btr_dead
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%

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

Схема ph_oscillate

Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)

[ph_oscillate]
joint = <имя_кости> - имя кости объекта к которой будет применена сила.
period = <number> - время прикладывания силы в миллисекундах.
force = <number> - собственно сила прикладывания в ньютонах.
correct_angle = <number> - угол относительно оси Y.

Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.

Пример использования схемы:
[logic]
active = ph_oscillate
 
[ph_oscillate]
joint = bone05
period = 3000
force = 500
correct_angle = 5

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

Секция ph_heavy

Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать. В кастом дате пишем: [ph_heavy].

Принцип работы прожектора:

В точках look пути, в которые смотрит прожекторщик, нужно прописать: sl=<имя_прожектора>

Например:

wp00|sl=esc_sl1

Тогда при повороте в эту точку персонаж повернет в нее и прожектор.


Логика вертолёта

Общие сведения:

  • Вертолёт работает на «логике».
  • На вертолёт реагируют аномалии.
  • Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.
  • Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.
  • У вертолёта есть универсальная боевая схема на манер сталкеров.
  • Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.

Схема heli_move

Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).

Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.

Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.

Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look.

[heli_move]
path_move = <имя_пути> - путь полёта.
path_look = <имя_пути> - точки в которые будет смотреть вертолёт.
engine_sound = true/false - вкл/выкл звук двигателя вертолёта. По умолчанию true.
invulnerable = true/false - неуязвимость. Если true, вертолёт игнорирует все хиты. По умолчанию false.
immortal = true/false - бессмертие. Если true, вертолёт получает повреждения, но не умирает. По умолчанию false.
mute = true/false - отключает универсальные реплики пилотов вертолета. По умолчанию false.
rocket_delay = <number> - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).
default_velocity = <number> - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.

Параметры, задаваемые в именах вершин пути path_move:

  • e – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано e=actor (можно сокращённо e=a), то огонь будет вестись по актору. Если задано e=число, стрелять будет по объекту со story_id равным числу.
  • w – (сокр. от weapon) каким оружием стрелять.
Возможные значения:
  • w=1 – стрелять только пулемётом;
  • w=2 – стрелять только ракетами.
По умолчанию стреляет всем.
  • v - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.
  • dv - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.
  • die - убить вертолёт.
  • flame - начать дымить (как будто подбили).

Параметры, задаваемые в именах вершин пути path_look:

  • e - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.
  • w – см. такой же параметр для пути path_move.
  • t - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.

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

Универсальная боевая схема: heli_combat

Общие сведения:
В универсальной боевой схеме вертолёт не привязан к путям.
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.

Примечание: отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:

combat_ignore = true/false - true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться "отомстить" тому, от кого он получил хит.
combat_enemy = <параметр> - враг. Возможны следующие значения:

  • nil - враг отсутствует;
  • actor - без комментариев;
  • story_id - персонаж с указанным story_id.

combat_use_rocket = true/false - можно ли вертолёту пользоваться ракетами.
combat_use_mgun = true/false - можно ли вертолёту пользоваться пулемётом.
combat_velocity = <number> - скорость, с которой вертолет будет делать боевые заходы.
combat_safe_altitude = <number> - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).

К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects.script есть группа функций для работы с вертолётом из его custom data:
heli_set_enemy_actor - сделать актёра врагом вертолёту;
heli_start_flame - поджечь вертолёт;
heli_die - убить вертолёт.

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

Смарттерейны и гулаги.

Smart Terrain

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

Как поставить smart terrain?
Для всех smart terrain нужно:

  1. Поставить smart_terrain с необходимым shape;
  2. В его custom_data прописать настройки;
  3. Расставить пути для соответствующих схем поведения.

Параметры custom_data:
[smart_terrain]
type = <имя_гулага> - название гулага. Не смарта - а именно гулага!

Имя смарта смотрим в параметре name спавн секции.

cond = {+info -info =func !func ~number} - условия, при выполнении которых, гулаг может существовать.

Если условия перестали выполняться - то "подчинённые" распускаются и попадают под управление их custom_data.

capacity = <number> - численность "жителей" гулага. Должно быть меньше либо равно количеству работ, но никак не больше!
respawn = <имя_респавна> - респавн для гулага. Указывать только один! Вызывает каждый раз, когда кто-то из НПС заступает на работу.
preset = <название_предустановки> - указывается имя одной из секций в файле config\misc\smart_terrain_presets.ltx.

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

idle = <min_time>, <max_time> - минимальное и максимальное время (в игровых часах) бездействия гулага,

после того, как гулаг покинул (по разным причинам) последний НПС. Будет взято случайное число из этого промежутка.
Если указать одно число, то будет взято в промежутке от ноля, до этого числа.(?)

stay = <min_time>, <max_time> stay = quick/medium/long/default - минимальное и максимальное время (в игровых часах) пребывания всех НПС под гулагом.

Конкретные значения можно посмотреть в файле config\misc\smart_terrain.ltx в секции smart_terrain_stay_time.(?)

squad = <number> - сквад, который будет прописываться всем сталкерам под гулагом. Если не указано, то будет взят squad из профиля НПС.
group = <number>, <number>, ... - набор group через запятые. Если не указано, то будет взят gruop из профиля НПС.

Гулаги

Гулаг - средство объединения нескольких сталкеров под централизованным управлением.
Основные особенности:

  • Есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем поведения);
  • Работы имеют приоритеты;
  • Гулаг назначает на работы сталкеров входящих в гулаг, начиная с работ с наивысшим приоритетом;
  • Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.

Рекомендации по планированию гулага:

  1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.
  2. Определяем максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.
  3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.
  4. В редакторе ставиться объект smart_terrain (источник ошибок – иногда ставят space_restictor). Гулагу смарта нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали гулаг esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk.

Создание гулага:
1. Создать smart_terrain и настроить его custom_data согласно описанию выше.


2. В скрипте scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:
if gulag_type == "имя_гулага" then
	return npc_community == "имя_группировки"
end

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


3. В файле scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага в функции function loadStates(gname, type). В нее передается имя смарта и имя гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:
if type == "имя_гулага" then
	return function(gulag)
		if level.get_time_hours() >= 7 and level.get_time_hours() <= 22 then
			return 0  -- день
		else
			return 1  -- ночь
		end
	end
end
В данном случае, если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии (0), иначе в ночном(1).


4. В файле scripts\gulag_название_уровня.script необходимо описать работы гулага. В функции load_job(sj, gname, type, squad, groups) загружаются все допустимые работы. В саму функцию передаются следующие параметры:

  • sj – сама табличка работ гулагов.
  • gname – имя нашего смар-тиррейна. Оно используется как префикс.
  • type – имя гулага.
  • squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие.
В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.

Примерное описание работ гулага:

Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.
--' Garbage maniac
if type == "gar_maniac" then
	t = { section   = "logic@gar_maniac_camper",
	      idle      = 0,
	      prior     = 5,
	      state     = {0},
	      squad     = squad,
	      groups    = groups[1],
	      in_rest   = "", 
	      out_rest  = "",
	      info_rest = ""
	    }
	table.insert(sj, t)
	t = { section   = "logic@gar_maniac_sleeper",
	      idle      = 0,
	      prior     = 5,
	      state     = {1},
	      squad     = squad,
	      groups    = groups[1],
	      in_rest   = "",
	      out_rest  = "",
	      info_rest = ""
	    }
	table.insert(sj, t)		
end


Описание возможных полей для описания работы:
section – секция в config\misc\gulag_название_уровня.ltx, где указываются реальные настройки схемы поведения, которая соответствует текущей работе.
idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.
prior – приоритет задания. Сначала НПС занимают более приоритетные задания. Чем больше число, тем выше приоритет.
in_rest, out_rest - рестрикторы, которые устанавливаются персонажу на данное задание. Из in_rest НПС запрещено выходить , в out_rest - запрещено входить.
state - cостояние гулага. Необходимо для функции load_states, где определяется это состояние, т.е. в каких состояниях данная работа будет доступна.
squad - таблички сквадов, если нам нужно переопределять родные группы сталкеров на какие либо другие.
group - будет выбран из массива groups, который задан в custom_data.
info_rest - если на текущей работе что-то раздражает НПС, то будучи в зоны установленного инфо-рестриктора - раздражитель будет проигнорирован.
predicate - условие приема на работу. Указывать нужно функцию, возвращающую true или false.
position_threshold - расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.
timeout - это время, которым задается длительность работы. Если ее задать, то НПС будет выполнять работу именно заданное время,

после чего будет освобожден от работы (если уже ранее не был от нее освобожден). После освобождения работа может быть доступна для повторной выдачи.

online - если true - НПС на данной работе всегда в онлайне.
idle_after_death - в течении этого времени после смерти предыдущего "работника" данная работа будет недоступна.


5. В config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответствуют той или иной работе.
Настройка здесь соответствует настройке в обычной custom_data сталкера, с разницей:

  1. Пути следует указывать без префикса. То есть, если гулаг носит имя, например, gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в config\misc\gulag_название_уровня.ltx следует указывать только walk1.
  2. В именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения. Например: logic@gar_maniac_walker_gate.

3.11.3. Новые особенности смарттеррейнов

Возможности нового смарттеррейна (СТ):

1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.
2) Сталкеры идут на ближайшие работы.
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.
6) Работы могут находиться на разных уровнях.
7) Скриптовая зона СТ теперь не используется для захвата персонажей.
8) Симуляция заключается в миграции персонажей между разными СТ.

Что нужно переделать:

1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже) 5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли. 6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].


Настройки: -------------
Разрешения персонажам идти в определённые СТ ----

Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары "имя_СТ = condlist". Пример:

[smart_terrains]
strn_1 = условие1
strn_2 = условие2

Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него. Если не появилось ни одного эксклюзивного, то он согласен идти в любой.

Есть зарезервированное сочетание "none=true". Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.

Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:

communities = группирвка1, группировка2, ...

Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).


Изменение функций predicate() ----

В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:
name
community
class_id
story_id
profile_name

Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:

predicate = function(npc_info)
return npc_info.is_sniper == true
end

Изменение функций переключения состояния СТ ----

Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.


Состояния работ online/offline
t = { section = "logic@ЧЧЧЧЧЧЧЧ", 
idle = 0,
prior = 5, state = {0}, squad = squad, group = groups[1],
online = true,
in_rest = "", out_rest = ""
}
table.insert(sj, t)

Варианты задания этого поля
online = true - на этой работе персонаж всегда в онлайне,
online = false - на этой работе персонаж всегда в офлайне,
online не задано - на этой работе персонаж может прыгать онлайн<->офлайн по своему усмотрению.
3.11.3.1. Более доступное описание новых смарттеррейнов
Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:
1. Пишем в кастом дате где [gulag1] -> [smart_terrain]
2. В кастом дате товарищей по смарттеррейну пишем
[smart_terrains]
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.
[smart_terrains]
none = true


Передача параметров в функции

Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.

NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.

Описание функций с параметрами присутствующих в xr_conditions и xr_effects.

xr_conditions.script
actor_in_zone(restr) Функция проверки, что актёр в рестрикторе restr
actor_out_zone(restr) Функция проверки, что актёр не в рестрикторе restr
actor_enemy Функция проверки что актор - враг. Например: {=actor_enemy} означает "если актёр враг"
killactor Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору
fighting_dist_ge(p) Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).
distance_to_obj_le(sid:dist) Проверка дистанции до обьекта заданного story_id.

Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру
и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо
подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить
большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.

health_le(health) Проверка того, что здоровье npc <= health.
heli_health_le(health) Аналогично предыдущему, только для вертолета.
enemy_group(group1:group2:...) Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).
health_le(health) Проверка того, что здоровье npc <= health.
hitted_by(sid1:sid2:...) Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.

Пример:

  [hit]
  on_info = {=hitted_by(407:408)} %+val_escort_combat%.
killed_by(sid1:sid2:...) Аналогично предыдущему, но для случая смерти npc. Используется в секции death..
is_alive(sid)<br\>is_alive_one(sid1:sid2:...)<br\>is_alive_all(sid1:sid2:...) Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.
is_dead(sid)
is_dead_one(sid1:sid2:...)
is_dead_all(sid1:sid2:...)
Аналогично предыдущему, только проверка на "мертвость".
check_fighting(sid1:sid2:...) Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.
gulag_empty(gulag_name) Проверка того, что гулаг пуст или вообще не существует.
gulag_population_le(gulag_name:num) Проверка того, что количество народу в гулаге <= num.
gulag_casualities_ge(gulag_name:num) Проверка того, что гулаг понес потери => num.

NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.

signal(строка) Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.
xr_effects.script
heli_set_enemy(story_id) Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.
set_gulag_enemy_actor(gulag_name) Сделать актера врагом для данного гулага
hit_npc(direction:bone:power:impulse:reverse) Нанести хит по npc.

Параметры:

  direction - если строка, то считается, что это имя пути и в сторону первой точки производится 
толчек. Если же это число, то оно рассматривается как story_id персонажа от которого должен
поступить хит. bone - строка. Имя кости, по которой наносится удар. power - сила удара impulse - импульс reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.

Пример:

  [death]
  on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%
set_friends(sid1:sid2:...)
set_enemies(sid1:sid2:...)
Установить друзьями/врагами данного npc и указанных в списке по story_id.
play_snd(snd_name:delay=0) Играть звук в голове актёра.

snd_name - путь к звуку относительно папки sounds delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.

play_snd_now (sid:snd_name) Играть звук от указанного объекта.
  • звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.
hit_obj(sid, bone, power, impulse, hit_src=npc:position()) Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате.

Параметры: actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]

  sid - story_id обьекта, по которому наносится хит.
  bone - строка. Имя кости, по которой наносится удар.
  power - сила удара.
  impulse - импульс.
  hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. 
Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.
actor_has_item(section) Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.
Функции для работы с HUD'ом.
disable_ui_elements(...)<br\>enable_ui_elements(...) Отключение/включение элементов HUD'а.

Параметры:

  weapon - спрятать/показать руки с оружием.
  input - отключить/включить клавиатуру.
  hud - спрятать/показать индикаторы на экране.
  all - отключить/включить все элементы.

Пример:

  on_info = %=disable_ui_elements(weapon:input)%
disable_ui<br\>enable_ui Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.

Пример:

  on_info = %=enable_ui%
run_cam_effector(file_name) Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.

Пример:

  on_info = %=run_cam_effector(prison_0)%
run_postprocess(file_name:id:loop) Запуск постпроцесса.

Параметры:

  file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.
  id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.
  loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.
stop_postprocess(id) Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.
drop_actor_inventory(имя_пути) Выбрасываем все предметы из инвентаря актера в первую точку заданного

пути. Пример:

  on_info = %=drop_actor_inventory(drop_point)%

3.16. Настройка звуковых групп.

Новый принцип создания звуковых групп:
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = <текстовая строка>
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:
soundgroup = bar_dolg_kampfire1
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях.
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group

Пример:
[kamp@esc_bridge_post1]
center_point = kamp_point
soundgroup = esc_bridge_soldiers

Ссылки

Оригинальный doc (Ссылка)

Доки скриптеров 1935(Ссылка)

Другие места
LANGUAGE