Смарттерейны и гулаги. Смарттеррейн
Смарттеррейн.
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.
Как поставить 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
Схема следующая:
- Персонаж ходит по точкам, смотрит по сторонам
- В определенных точках останавливается и что-то высматривает (caution, search, hide)
- При этом говорит определенные реплики (…)
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). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.