Skip to content

Structure of Files

AziatkaVictor edited this page Mar 10, 2023 · 2 revisions

Файлы могут различаться между собой, в зависимости от назначения, но у них всех есть общие свойства.

Определение секции

Для начала, любая информация храниться в "секциях". Это своего рода объекты с набором параметров, которые обычно предопределённы либо движком игры, если это какой-то конфиг, либо скриптами, если это файл, отвечающий за игровую логику.

Рассмотрим для примера секцию stalker_sim_squad_novice из файла конфигурации squad_desct.ltx:

[stalker_sim_squad_novice]:online_offline_group
faction = stalker
npc_random = sim_default_stalker_0, sim_default_stalker_1, sim_default_stalker_2
npc_in_squad = 2, 3

В данном случае мы можем подметить следующее:

  • Объявление секции stalker_sim_squad_novice. Работает как обычная переменная со схожими свойствами:
    • Название не может повторяться в области видимости.
    • Может обладать разными областями видимости, в зависимости от контекста.
    • Можно ссылаться, если необходимо сменить секцию или просто вынести информацию в отдельную секцию (например секция meet).
  • Объявление параметров faction, npc_random и npc_in_squad
  • Наследование online_offline_group. Как и любое другое наследование, перенимает в себе информацию родителя, которую можно перезаписать при желании. В данном случае идет наследование из файла m_online_offline_group.ltx:
[online_offline_group]
GroupControlSection   = spawn_group
class         		= ON_OFF_S
;$spawn          = "scripts\online_offline_group" 

Определение параметра

Как мы уже рассмотрели выше, у любой секции могут быть параметры. Однако до этого это были лишь статичные, простые параметры файла конфига. Предлагаю теперь разобрать слегка более структурно сложный параметр из файла игровой логики:

on_info = {-dont_have_info} %+add_info =play_sound(sound_name)% sr_idle@end

Структура может по началу сбить с толку, но она достаточно закономерна и проста. Для начала разобьем её на части:

  • Название параметра on_info
  • Разделитель =
  • Так называемый "Condlist", о котором будет рассказано позже, {-dont_have_info} %+add_info =play_sound(sound_name)% sr_idle@end

Определение Condlist

Как уже писалось выше, разработчики сделали такую вещь, как "Condlist". Что это такое? По сути это некий блок, в котором может быть 3 вещи:

  • Условие
  • Действие
  • Значение или ссылка

Пример:

{Условие} %Действие% Ссылка

Условие

Пишется в {} скобка и нужен для создания проверки выполнения условия, чтобы действия происходили только по его выполнению. То есть, действия будут выполнять только когда условие возвращает True при логически операторе "И". В нём можно указывать такие вещи как:

  • Проверка наличия инфопоршня +info_name
  • Проверка отсутствия инфопоршня -info_name
  • Проверка на шанс до 100 в процентах ~20
  • Вызов функции из xr_conditions.sctript.
    • Если перед названием функции стоит =, то ожидается, что она вернет True. Это ровно тоже самое, что и function() == True.
    • Если перед названием функции стоит !, то ожидается, что она вернет False. Это ровно тоже самое, что и function() == False.

Пример записи, в данном случае у нас такое условие:

  • Отсутствие инфо под названием info1
  • Наличие инфо под названием info2
  • У игрока есть предмет под названием item_name
  • Проверка, что сейчас не день
{-info1 +info2 =actor_has_item(item_name) !is_day}

Действие

Пишется в %% скобка и может хранить в себе такие вещи как:

  • Добавление инфопоршня +info_name
  • Удаление инфопоршня -info_name
  • Вызов функции из xr_effects.sctript, в отличии от условия, вызывать можно только через =

Пример записи, в данном случае у нас такое действия:

  • Удаляем инфо под названием info1
  • Добавляем инфо под названием info2
  • Выдаем задание task_name
  • Забираем предмет item_name
%-info1 +info2 =give_task(task_name) =remove_item(item_name)%

Ссылка или значение

Ну и под конец, ссылка или значение. Никаких особенностей тут нету. Могут указываться такие вещи как:

  • Ccылка на секцию sr_idle@test. Необходимо для некоторых конфигов и логики. О том как это работает будет описано ниже.
  • Значение st_text, true, 10 и так далее. Можно использовать в некоторых конфигах, когда нужно динамически менять значение параметров. Например как это сделано с заданиями в task_manager.ltx
  • Ключевое слово nil. Означает "ничего", аналог null из языков программирования. Можно использовать для указания значения или для окончания логики.

Особенность использования

Главная особенность Condlist в том, что в одном параметре можно указывать сразу несколько Condlist-ов. Например:

[hit]
on_info = {=hit_by_actor =hitted_on_bone(head_boss:boss_jaw:brow:ear_r:eye_l:eye_r:) -zat_b106_one_shot} %+zat_b106_one_shot +zat_b108_actor_damaged_chimera +zat_b106_ahtung%, {=hit_by_actor !hitted_on_bone(head_boss:boss_jaw:brow:ear_r:eye_l:eye_r:) -zat_b108_actor_damaged_chimera} %+zat_b108_actor_damaged_chimera%

Это секция из файла zat_b106_chimera.ltx. Как мы можем увидеть, в параметре on_info есть сразу 2 Condlist. Они разделены запятой и делают следующее:

  • Первый Condlist:
    • Условие
      • =hit_by_actor - урон нанёс игрок?
      • =hitted_on_bone(head_boss:boss_jaw:brow:ear_r:eye_l:eye_r:) - урон нанесён по этим костям?
      • -zat_b106_one_shot - инфо с таким именем отсутствует?
    • Действие
      • +zat_b106_one_shot - выдаем инфо с таким названием
      • +zat_b108_actor_damaged_chimera - выдаем инфо с таким названием
      • +zat_b106_ahtung - выдаем инфо с таким названием
  • Второй Condlist:
    • Условие
      • =hit_by_actor - урон нанёс игрок?
      • =hitted_on_bone(head_boss:boss_jaw:brow:ear_r:eye_l:eye_r:) - урон нанесён НЕ по этим костям?
      • -zat_b108_actor_damaged_chimera - инфо с таким именем отсутствует?
    • Действие
      • +zat_b108_actor_damaged_chimera - выдаем инфо с таким названием

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