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

Смарттеррейн.

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

Как поставить smart terrain?

Для всех smart terrain нужно:

1) Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).

2) В его custom data прописать настройки.

3) Расставить пути для соответствующих схем поведения.

Параметры custom data:

[gulag1]

type = тип гулага

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 логикой.

Указывать тип гулага нужно без кавычек.

Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.

Все времена задаются в часах игрового времени и могут быть дробными.

Пути:

Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.

Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2)

Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.

Стандартные типы смарттеррейнов.

Если нужно, чтоб сталкер не захватывался, допишите ему в custom data следующую строку:

[smart_terrains]

none = true

Если сталкер уже под каким-то smart terrain, то остальные smart terrain он будет игнорировать.

Campers

Кемперы. custom data:

[gulag1]

type = campers

capacity = от 1 до 3

Пути:

camper_walk1, camper_look1

camper_walk2, camper_look2

camper_walk3, camper_look3

Walkers

Ходячие. На базе этого можна сделать поиск, обыск и куча всего.

custom data:

[gulag1]

type = walkers

capacity = от 1 до 3

Пути:

walker_walk1, walker_look1

walker_walk2, walker_look2

walker_walk3, walker_look3

Search

Ходячие. На базе этого можна сделать поиск, обыск и куча всего.

custom data:

[gulag1]

type = search

capacity = 1

Пути:

search_walk, search_look

Схема следующая:

  1. Персонаж ходит по точкам, смотрит по сторонам
  2. В определенных точках останавливается и что-то высматривает (caution, search, hide)
  3. При этом говорит определенные реплики (…)

Rest

Отдых. Сталкер по очереди то sleeper, то walker, то rest(ест еду, пьёт водку).

custom data:

[gulag1]

type = rest

capacity = 1

Пути:

rest – путь из двух вершинок (возможно из 1). В одной сидит, в другую смотрит.

sleep - путь из двух вершинок (возможно из 1). В одной спит, в другую смотрит.

rest_walk, rest_look

Гулаги.

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

А) Есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем поведения);

Б) Работы имеют приоритеты;

В) Гулаг назначает на работы сталкеров входящих в гулаг, начиная с работ с наивысшим приоритетом;

Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.

Гулаг создается следующим образом:

1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.

2. Определяем максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.

3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.

4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.

[gulag1]

type = тип гулага

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 логикой.

*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)

Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.

Указывать тип гулага нужно без кавычек.

Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.

Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.

Все времена задаются в часах игрового времени и могут быть дробными.

5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:

if gulag_type == "gar_dolg" then

return npc_community == "dolg"

end

В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.

6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага.

function loadStates(gname, type)

в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:

if type == "gar_maniac" 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 часов, то гулаг находится в дневном состоянии, иначе в ночном.

8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:

function loadJob(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

Описание полей:

Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.

Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.

In_rest, out_rest - рестрикторы, которые устанавливаются персонажу на данное задание.

Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx, где указываются реальные настройки схемы поведения, которая соответствует текущей работе.

Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.

Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе

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

predicate = function(obj)

return obj:profile_name() == "soldier_commander”

end

то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.

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

;----------------------------

;-- GARBAGE MANIAC

;----------------------------

[logic@gar_maniac_camper]

active = camper@gar_maniac_camper

[camper@gar_maniac_camper]

path_walk = walk1

path_look = look1

[logic@gar_maniac_sleeper]

active = sleeper@gar_maniac_sleeper

[sleeper@gar_maniac_sleeper]

path_main = sleep

wakeable = true

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

1) пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.

2) в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)

3) в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).

В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.

Наши рекомендации