Фокусы
Создание и работа с деревьями фокусов. Универсальные области действия ROOT и FROM
Содержание: 1. Основа фокусов. Понятие Блока. Список блоков и их назначение 2. Создание дерева фокусов. Привязка дерева к стране. 3. Взаимосвязь между фокусами. Абсолютная и относительная позиция. Предпосылки. 4. Условия. Блок available. Блок allow_branch 5. Примеры фокусов с Относительной и Абсолютной позицией. Примеры взаимоисключающих фокусов. 6. Области действия. Условные (динамические) области действия. 7. Блок limit. Условный оператор. Блок random_list. 8. Работа с Shared фокусами 9. Работа с непрерывными фокусами 10. 8 советов новичкам, к которым стоит прислушаться
Фокусы являются основной игры. Основной принцип их действия таков: вы ставите себе задачу, к примеру, привести новую партию к власти.
Следовательно, ваша цепь фокусов должна приводить к власти новую партию. Разумеется, никто не запрещает вам сделать мега-ультимативный фокус, но это считается правилом плохого тона. В этом гайде мы на примере простейшей ветки фокусов разберем их создание и работу с ними.
Каков основной синтаксис создания фокусов?
{ }
- Блок. Каждый блок открывается и закрывается, и несет в себе какую-то часть скрипта Основные блоки:
focus
и shared_focus
- собственно, блок- указатель для движка
available
- блок, проверяющий при каких условиях фокус доступен для изучения
allow_branch
- блок, отвечающий за видимость конкретного фокуса и его "потомков". Об allow_branch будет рассказано далее
prerequisite
- предпосылки. Какие фокусы должны быть выполнены, чтобы этот фокус был доступен для изучения
mutually_exclusive
- Взаимоисключающие. Если должен быть выбор из нескольких фокусов, они должны быть взаимоисключающими друг с другом.
select_effect
- Эффект при выборе фокуса. Не отображается в наградах.
completion_reward
- Эффект при выполнении фокуса
offset
- Смещение shared фокусов при определенных условиях
ai_will_do
- Вероятность того, что фокус возьмет ИИ. Подробнее читайте в статье об искуственном интеллекте
bypass
- Условие, при котором фокус может быть пропущен
В этой статье будут использованы следующие элементы:
[]
- Переменная/выбираемое значение. Например, скоупы или локализуемые строки. То есть то, что указано в квадратных скобках, вы придумываете сами. Исключение - скоупы. Они задаются исходя из таблицы. Впрочем, обо всем по порядку
Начнем с основы каждого дерева:
Что нам делать, если мы хотим, чтобы страна случайным образом получала одно из двух деревьев? Все очень просто: делаем два дерева с фактором 5
Итак, мы создали ветку фокусов. До тех пор, пока в ней ни одного фокуса, в игра вы будете видеть лишь пустую ветку
Что нам делать дальше? Самое главное - не забыть следующие строки:
Итак, с формальностями покончено. Перейдем к способам работы с деревом
Фокусы бывают двух видов: Стандартные и Shared.
Для начала разберемся со стандартными:
Каждый стандартный фокус (в отличие от Shared) принадлежит какому-либо дереву, т.е находится ВНУТРИ блока focus_tree
ВНИМАНИЕ: Текст ниже лишь является описанием. Подробнее о некоторых функциях будет написано непосредственно в фокусах
На этом моменте мы остановимся поподробнее, и сейчас я расскажу вам, как работает система координат в дереве фокусов
Расстояние между двумя фокусами по оси X, если у них одинаковый Y, всегда должно быть не меньше чем 2
В противном случае фокусы будут "налезать" друг на друга
Взаимосвязь между фокусами
А сейчас я расскажу вам о relative_position_id
У позиции фокуса есть два вида: Абсолютная и Относительная. В каждом дереве должен быть как минимум ОДИН фокус с Абсолютной позицией
Абсолютная позиция задается через x и y. В этом случае они показывают позицию фокуса в дереве
Однако, если мы вставим строку relative_position_id = [айди фокуса] - они будут обозначать не КООРДИНАТЫ, а СМЕЩЕНИЕ по осям
Смещение относительно фокуса, айди которого мы указали. Об этом - далее
У фокуса может быть несколько предпосылок, или же выбор между ними. Как прописать их?
Все триггеры, применяемые здесь, есть на вики. Как это работает? Узнаете ниже
Казалось бы, все просто: выполняешь условия и открывается ветка фокусов. Но есть одна проблема: Игра проверяет доступность при запуске. У этого есть решение, оно будет расписано ниже, однако без него ваша ветка не появится.
Итак, с основой разобрались. Пора переходить к примерам
Итак, фокус который длится 70 дней и дает 1 политической власти
А это фокус, предпосылкой к которому является предыдущий созданный нами фокус. Так же он смещен на 1 ед. по Осям X и Y
А вот тот же фокус, но с Абсолютными, а не Относительными координатами
С предпосылками и относительной позицией разобрались. Переходим к Взаимоисключающим
Эти два фокуса Взаимоисключающие. А если три?
Каждому фокусу каждые Взаимоисключающие.
Итак, что теперь? Теперь мы разберемся с эффектами фокусов. А именно - мы поговорим про Области Действия, они же Скоупы
Области действия (Scopes)
Все скоупы условно делятся на 4 типа: Скоуп страны, Скоуп Региона, Скоуп Командующего и Условные, они же переменные, скоупы
Скоуп страны - Тег этой самой страны. Все эффекты по умолчанию выполняются в этом скоупе
То есть если вы не пропишите конкретный скоуп, по умолчанию будет выбран скоуп страны.
В качестве цели можно выбрать любую существующую страну.
Скоуп Региона - айди стейта.
Скоуп Командующего - сложный в освоении. Для того, чтобы лучше его понять, прочтите гайд о создании страны и новых командующих Если в кратце - в то время как остальные скоупы (коме Условных) указывают на конкретный объект, этот ВЫБИРАЕТ по условию
Условные скоупы
Что же такое условные скоупы? Их четыре:
ROOT
FROM
PREV
THIS
Как они работают?
ROOT Обращается к самому первому возможному скоупу. То есть, в случае с фокусами, к стране-обладателю фокуса
FROM обращается к инициатору действия, например в ивентах:
Одну политвласть потеряет страна, которая выполнила фокус
PREV ссылается на Предыдущий скоуп
Германия получит цель войны против случайной страны.
THIS ссылается на текущий скоуп
По опыту - один из наиболее редко встречающихся. Наиболее распространенное применение - скриптовая локализация
Казалось бы, вот оно, использование THIS... Проблема в том, что если убрать THIS, то ничего не изменится
Дополнительные функции награды
Последнее, но не маловажное - ограничение, или по-просту лимит. Лимит необходим для ограничения области действия по заданным параметрам
К примеру:
Что мы видим? Область действия эффекта - Каждая страна. Однако, мы ограничиваем область действия только для тех стран, у которых правящая партия - коммунизм (они получают 1 политвласть) и фашизм (соответственно, -1 политвласть)
Лимит используется не только в области действия, но и при работе с Условным оператором - конструкция if - else_if - else
Как работает Условный оператор? Лимит!
возьмем пример:
Что произойдет при выполнении фокуса? А все очень просто:
Игра проверяет выполнение условий
Можно ли было написать не if - else_if - else, а, к примеру, два if? И да, и нет
ТАК ДЕЛАТЬ МОЖНО!
У нас разные условия для эффекта, причем в данном примере диаметрально противоположные
ТАК ДЕЛАТЬ МОЖНО, ПРИ УСЛОВИИ ЧТО ЕСЛИ ОБА ЭФФЕКТА ВОЗМОЖНЫ ОДНОВРЕМЕННО.
Если вам нужно в несколько регионов добавить фабрики, но есть вероятность что игрок ими не владеет, вы пишете конструкцию с if - if и игра будет выполнять те, условие которых выполнено
ТАК ДЕЛАТЬ НЕЛЬЗЯ!
Если вы хотите получить разный эффект в зависимости от того, больше 50% стабильности у страны или меньше, вы должны ОБЯЗАТЕЛЬНО использовать конструкцию if - else_if, иначе у вас будут выполнены ОБА эффекта.
А как вы относитесь к азарту? Верите ли в удачу? Если да, кидайте кубик, потому что мы переходим к Рандому!
Итак, random_list
. Тут все до безумия просто
С вероятностью 50% мы получим 1 политвласть, с вероятностью 50% мы потеряем 1 политвласть
А можно ли "подкрутить" результаты? Можно! Если вы хотите повысить шанс, вы должны указать условие для этого К примеру, "Счастливчик" с высокой стабильностью:
Если у нас больше 70% стабильности, шанс успеха вырастает в два раза и теперь составляет 100%!
А если мы хотим скрыть эффект, или притвориться что он есть? На помощь придут скрытые эффекты и тултипы
Игрок будет думать, что потеряет 1 политвласть, но на самом деле он ее получит
Переходим к Shared фокусам!
Как было сказано ранее, Shared фокусы не привязаны к конкретному дереву, поэтому могут быть отображены в нескольких деревьях сразу
Как работают Shared фокусы? Вот пример:
Первый фокус ЗАДАЕТ ВЕТКУ. То есть в дерево вписывается именно он, а за ним размещаются и устанавиливаются наследники (вы же помните prerequisite?)
Соответственно, второй фокус идет за первым, однако обратите внимание на координаты. Вы же помните про Абсолютную и относительную позицию? Так вот, у Shared фокусов, кроме прочего, есть параметр СМЕЩЕНИЯ ПО ОСИ. Что это значит?
Поскольку Shared фокусы могут быть отданы различным деревьям, нам выгодно сделать возможность переместить их для конкретной страны. Для этого существует параметр Offset
Что означает эта запись? А то, что этот фокус будет расположен по координатам X = 1, Y = 1 для всех стран, однако для страны с тегом GEM эти координаты будут равны 2 - как видно на картинке. у Германии фокусы расположены иначе
В остальном синтаксис Shared фокусов абсолютно идентичен простым.
Осталось самое простое, и в то же время самое сложное: Непрерывные фокусы
Continuous Фокусы
В отличие от национальных фокусов, Непрерывные фокусы расположены в отдельной папке
Итак, это - дерево непрерывных фокусов. Что мы видим?
Практически все здесь идентично заданию стандартного дерева фокусов. Отличие - строка reset_on_civil_war
, которая указывает будет ли отменен фокус при начале Гражданской войны, и position
вместо continuous_focus_position
- поскольку здесь задаются изначальные координаты этого дерева непрерывных фокусов
Рассмотрим простой пример ванильного contionuous-фокуса
А теперь, чтобы нам было проще, мы немного приостановимся, и рассмотрим два вида влияния на страну - Эффекты и Модификаторы.
В чем их отличие, спросите вы? Эффект - МГНОВЕННЫЙ и ЕДИНОРАЗОВЫЙ. Модификатор - ВРЕМЕННЫЙ и ПОСТОЯННЫЙ
Эффект срабатывает один раз, и отменить его действие может только другой эффект. Модификатор дает свой бонус, пока активен.
Поэтому вы не можете выдать модификатор через фокус. И поэтому вы не можете дать эффект нацдуху - только эффект при выдаче и удалении ОВ непрерывных фокусах есть три способа взаимодействия со страной: либо прописать идею, которая будет действовать пока фокус активен, либо выдать модификатор, либо выдать эффект при выборе и отмене фокуса.
Рассмотрим все три примера:
Проблемы и сложности создания фокусов
В последней "Главе" нашего гайда мы разберем несколько подводных камней, которые встречаются при работе с фокусами. Кроме того, вас ждет "совет бывалого"
Абсолютная позиция - зло. Даже не так. Это ЗЛО. Доказать это очень просто: если вы захотите сместить какую-то ветку в 10 фокусов влево, а седующие за ними - вправо на 1 по оси X, при абсолютной позиции вам придется менять все 20 фокусов. В относительной (если она сделана по-умному, а не через жопу) вам нужно поменять координаты 2х фокусов
Относительную позицию нужно уметь делать. НИ В КОЕМ СЛУЧАЕ не привязывайте все фокусы к одному.
Вот пример, как делать ХОРОШО
Видите? Каждый фокус смещен относительно своей предпосылки
Вот пример как делать ПЛОХО
Нет, код, разумеется, рабочий, и фокусы будут расположены как надо, но вы теряете два главных преимущества Относительной позиции Первое - Вы не сможете сдвинуть часть фокусов, изменив координаты одного-двух Второе - вам придется ставить большие числа. Намного проще сместить на 1 вниз от предыдущего фокуса, чем на 10 вниз и 15 вправо от первого, согласны?
Allow_branch не сломан. Просто он проверяется на старте. Если вам нужно, чтобы ветка открывалась после события (решение/ивент/другой фокус), то в Эффекте, после выполнения которого должна открываться ветка, необходимо вставить следующую строку:
mark_focus_tree_layout_dirty = yes
На вики этого нету, но теперь вы это знаете
Табуляция и комментарии - не обязательны. Но они ОЧЕНЬ ВАЖНЫ
Ваш фокус не сломается от того, что строки враскоряку, но если вы работаете в команде, вам будет проще кооперироваться, если ваш код хорошо читается.
Хороший код читается сверху вниз слева направо.
ТАК ДЕЛАЙТЕ:
Код взят для примера из моего мода (сабмод на Equestria at War). Красиво, правда? Сразу видно, что скобки на месте.
А ВОТ ТАК НЕ ДЕЛАЙТЕ
Попробуйте не глядя на предыдущий пример прочесть этот код. А скобки? Вот то-то
А комментарии? Комментарии важны дабы вы указали другим, что здесь нужно
Если вы работает в команде, Комментарии ОБЯЗАТЕЛЬНЫ
Скриптовые эффекты и триггеры - это полезно.
Вы можете пользоваться ими. Никаких проблем в этом нету.
Для использования скриптового эффекта вы пишете следующее:
effect_name - Код скриптового эффекта
Для использования скриптового триггера вы пишете следующее:
trigger_name - Код скриптового триггера
Отладка фокусов - четыре команды, масса пользы
Режим отладки, или Debug-Режим, очень полезен при создании фокусов, однако и без него вам доступны 4 консольные команды, которые сильно облегчат работу
Focus.Autocomplete
- Команда активирует авто-выполнение фокусов для ВСЕХ стран (учитывайте это). Нужно проверить эффект? Авто-выполнение - ваш друг
Focus.IgnorePrerequisites
- Отключение предпосылок. Все фокусы доступны для изучения, если у них нет особых требований. Если они есть...
Focus.NoChecks
- Команда, отключающаяя проверку условий. То есть игра будет игнорировать блок available
А что делать если две взаимоисключающих раскрываемых ветки? Как проверить обе? Здесь вам поможет команда
reload focus
- Команда, при активации которой игра заново загрузит файл фокусов. То есть она сбросит все выполненные фокусы.
Айди фокусов могут быть любыми, но Порядок важен.
Любой уникальный Айди фокуса игра примет, но не проще ли будет давать им айди, как-то связанные с сутью? Простой пример:
Сравните фокусы
Не правда ли, вторая надпись лучше отображает суть фокуса? Теперь, если вы будете делать только скрипт, и отдадите его на локализацию кому-то другому, ему будет проще определить, что название этого фокуса связано с аррестом коммунистов
Логификация - залог поиска
Логи - неотъемлемая часть игры, которые помогают находить ошибки. Однако, по умолчанию выполнение фокусов не заносится в логи. Как это исправить? Да очень просто! Для этого необходимо в эффекте записать следующую строку
Что мы сделали? Мы указали игре, что при выполнении эффекта в logs/game.log
будет занесена строка "Дата: Название страны: фокус АЙДИ_ФОКУСА" То есть если игра сломается, вы увидите когда это произошло, после какого события
На этом наш урок подходит к концу. Помните главное: делать скрипт фокусов - не сложно. Сложно понять, как это работает, особенно если у вас нету знаний в области программирования. Но если вы поймете, как это работает, вы не остановитесь перед самой сложной задачей
Last updated