Тема: Stellaris
Показать сообщение отдельно
Старый 06.09.2021, 02:12   #1575
ВЛАДЫКА АССИМИЛЯЦИИ
 
Аватар для Сулариус
 
Регистрация: 08.12.2006
Сообщений: 7,059
Репутация: 3262 [+/-]
Дневник разработчиков Stellaris №222 — Обновление возможностей для модификации в «Лем»
Скрытый текст:
Добро пожаловать в очередной дневник разработчиков по моддингу Stellaris! Сегодня я расскажу о новинках языка скриптов, которые появятся в обновлении 3.1.

Мы уже упоминали, что традиции теперь гораздо лучше поддаются модификации, а с файлами интерфейса и локализации будет гораздо меньше мороки. Также могу подтвердить, что теперь, например, можно будет создать дерево традиций, которое становится доступно после принятия какого-либо решения по ходу игры. Но сегодня мы сосредоточимcя на переменных.

Переменные

В прошлый раз я говорил, что мы хотим чаще задействовать переменные. В прошлом обновлении появился ряд новых возможностей сохранить кусочки информации из игры, но самым большим упущением была невозможность легко получить значения триггера, например количество поселений на планете. Кроме того, переменные тоже можно было использовать далеко не везде, особенно в сравнении с остальными играми PDS, вроде CK3. Ещё и синтаксис во многих случаях оставлял желать лучшего.

В 3.1 мы значительно расширили возможности переменных. Раньше, чтобы получить значение из переменной, приходилось ссылаться на... эту переменную, и больше никак. Теперь можно сделать чуть больше:

value = my_var #получает значение my_var, объявленной в текущем скоупе
value = from.capital_scope.my_var #получает значение my_var, объявленной в столице from
value = trigger:num_pops #получает количество поселений в текущем скоупе
value = from.capital_scope.trigger:num_pops #получает количество поселений в столице from

То есть можно указывать скоуп через точку, в результате чего запись получается более опрятной, и это само по себе большое улучшение. Кроме того, как вы заметили, можно ссылаться на триггеры с помощью trigger:<триггер>. Поддерживаются любые триггеры, которые проверяют число и только число, без фигурных скобок.

(Обратите внимание, что предыдущий формат копирования переменных из разных скоупов удалён. Это когда вы писали value = { scope = x variable = y } )

В 3.0 уже был эффект export_trigger_to_variable, но он работал только с fleet_power. Это был прототип, теперь его функционал расширен на все подобные триггеры. Важно, что этот эффект с помощью фигурных скобок позволяет получать значения из более сложных триггеров, если они всё ещё проверяют одно число:

export_trigger_value_to_variable = {
trigger = num_assigned_jobs
parameters = {
job = miner
}
variable = num_miner_jobs
}

Хотелось бы повторить, что в 3.0 также появился ряд возможностей заносить игровые значения, вроде чисел из модификаторов и хранилища ресурсов, в переменные. И расширился список мест, где их можно использовать: множители в add_resource и add_modifier, к примеру. В 3.1 мы добавили мы расширили этот список ещё сильнее, новые варианты использования перечислены ниже.

В качестве значений в триггерах, проверяющих одно число, например num_pops > my_variable или intel = { who = from value < trigger:num_pops }
В качестве значений в эффектах, использующих одно число, например add_experience = my_variable.
В качестве параметра множителя в условной таблице ресурсов (например, у сооружения):

resources = {
category = planet_buildings
cost = {
trigger = { <триггеры> }
minerals = 100
}
multiplier = my_var/owner.trigger:num_pops
}

В модификаторах вероятностей MTTH или ИИ:

ai_chance = {
factor = 1
modifier = {
add/factor = my_var/trigger:num_pops
is_variable_set = my_var
}
}

add_modifier теперь имеет и time_multiplier, и параметр множителя, тут тоже можно использовать. Например, в культов смерти таким образом применяется модификатор на 10 лет * edict_length_mult.
В ordered_script_lists: возможность перекочевалаиз более новых игр. В качестве объяснения документация по триггерам:

ordered_owned_fleet проверяет каждую флотилию, которой владеет country; выполняет вложенные эффекты на одном из них, для которого ограничивающие триггеры возвращают true. Выбирает объект согласно обозначенной последовательности (position 0, order_by = trigger:num_pops выполнит эффекты для X с наибольшим числом поселений).
ordered_owned_fleet = {
limit = { <триггеры> }
position = <целое, начинается с 0>
order_by = <переменная>/trigger:<триггер>
inverse = yes/no (по умолчанию: no; если yes, то 0 — это наименьшее, а не
наибольшее)
<эффекты>
}
Поддерживаемые скоупы: country

Если переменная тоже является числом, теперь можно использовать round_variable_to_nearest, чтобы округлить её значение, скажем, до ближайшего кратного 10.

Общие сведения по этим возможностям были добавлены в файл с инструкциями в папке events (который также прикреплён к посту с дневником). Кроме того, логичным шагом будет дальнейшее расширение возможностей работы с переменными, так что в будущем вполне могут появится дополнительные. Текущие же изменения уже оказались крайне полезны для нас.

Мы улучшили награды культов смерти. Убрали около тысячи строк из скрипта, а новая версия учитывает больше факторов для определения подходящей награды.
Исправили выплаты по золотому правилу. Раньше приходилось выдумывать числа и выдавать количество, которое слабо соотносилось с реальными вложениями. Теперь в этом нет необходимости.
Улучшили выборы лидера научной федерации. Теперь учитывается реальное количество обычных и повторяемых технологий.
И многое другое.

Изменения таблиц спрайтов

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

Мы придумали способ ссылаться на иконки в таблицах спрайтов с помощью обычных ключей, то есть эти элементы смогут использоваться обычной системой (и новым значкам не обязательно находиться в таблицах спрайтов). Это изменения удалось распространить на типы армий, автоматизации колоний, бомбардировки и (с особой сложностью!) размеры кораблей.

Пример:

spriteType = {
name = "GFX_ship_size_military_1"
sprite_sheet_sprite_type = "GFX_ship_sizes"
default_frame = 2
}

В случае с кораблями пришлось попотеть, ведь значение icon_frame указывало, какой значок использовать сразу в нескольких таблицах спрайтов. В итоге мы оставили всё без изменений у космических баз (потому что мало кто добавляет новые типы баз), и сделали так, чтобы строка icon = ship_size_military_1 сообщала игре ссылаться на несколько ключей спрайтов: GFX_text_ship_size_military_1, GFX_ship_size_military_1, GFX_ship_size_military_1_top, GFX_ship_size_military_1_top_damaged.

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

Случайность

Некоторые из вас замечали, что иногда случайность функций, вроде random_list, не так уж случайна. В частности эта проблема наблюдалась у событий, срабатывающих через on_game_start (а также у ряда других on_action, но эти пострадали больше всего). Весьма досадное стечение обстоятельств, ведь из-за этого ряд событий, которые по замыслу должны быть всегда разными... не были таковыми. Мы также обратили внимание на ряд схожих ошибок, вроде той, что при использовании цепей while или цепей every_x при каждом срабатывании события в цепи случайный результат получался одним и тем же. Например, 25-кратныйrandom_list выдавал 25 одинаковых результатов вместо 25 случайных.

Мы внесли в эту систему множество исправлений.

Исправлено отсутствие случайности в on_action, вроде on_game_start. Если в будущем мы ошибёмся и вернём эту проблему, игра должна предупредить нас. Надеемся, с этой проблемой мы покончили насовсем.
Улучшена случайность цепей while и every_x.
И в довесок мы добавили эффект reroll_random.

Другие классные штуки

Также стоит отметить, что мы добавили признакам условные модификаторы поселений. Например, теперь вы сможете добавить признак, который даёт бонус на одном типе планет и накладывает штраф на другом. Это открывает перед нами массу возможностей. Например, мы больше не используем неинтуитивное (и подверженное экплойтам) решение с двумя признаками у жителей пустоты. Теперь у них всего один признак, применяющийся по-разному в зависимости от класса планеты.

Как некоторые из вас заметили, происхождение «Армия клонов» добавляет несколько новых классных особенностей, ранее отсутствовавших в игре. Многое из добавленного в этом происхождении можно использовать и для иных целей.

Можно закрепить половую принадлежность расы.
Можно ограничить количество сооружений одного типа в империи (и менять это значение по ходу игры).
Появилось игровое правило should_force_decline_species. В случае срабатывания оно приведёт к снижению численности представителей расы на планете и вызовет оповещение, привязанное к данному правилу. Оно также запрещает поселениям мигрировать, переселяться и т. д. в такие места, где они немедленно начнут вымирать.

И наконец, мы добавили ряд новых эффектов, триггеров и модификаторов. Всё как всегда. Вот несколько примеров:

set_visited = <система> — открывает систему без необходимоси исследовать её.
set_saved_date — позволяет сохранить определённую дату (даже в будущем) и затем использовать её в локализации в переменных типа [This.my_saved_date].
Технически последний эффект добавляет <скоуп>_flag, поэтому стандартные эффекты флагов и триггеры перенесены во все скоупы.
Вы можете использовать переменные [loc] на кнопках, что будет весьма полезно для динамических интерфейсов.
Теперь вы можете задавать описание районов, сооружений, должностей и особых проектов через desc = { text = X trigger = { Y } }. Они теперь также принимают переменные локализации.
Мы удалили has_non_swapped_tradition и has_tradition_swap и объединили их в has_active_tradition. Совет мододелам: используйте «Найти и заменить»!
Все скоупы, у которых не было флагов скриптов (например, country_flag), обзавелись ими. А ещё переменные теперь работают во всех скоупах.
При обновлении модов стоит учесть: count_diplo_ties теперь count_relation, count_armies теперь count_owned_army или count_planet_army (в зависимости от обстоятельств). any/every/random_mining_station/research_station были удалены, поскольку не несли смысловой нагрузки. Просто используйте скоупы mining_station/research_station/orbital_station. А ещё у observation_outpost больше нет «лимита», но вы можете написать exists = observation_outpost, чтобы компенсировать это.

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

И последнее: старый trigger_docs.log официально устарел, и теперь мы используем более обширную и общую папку script_documentation, содержимое которой прикреплено к посту с дневником.

Некоторые из вас, возможно, знают, что перед выходом дополнения Nemesis мы предоставили ранний доступ ряду мододелов. В день выхода обновилось порядка 10 модов с 1,6 миллионами подписчиков. В целом нам понравились достигнутые результаты и реакция сообщества, и если этот эксперимент и впредь будет столь же успешным, мы постепенно начнём включать в него больше мододелов. В рамках обновления «Лем» мы хотим добавить ещё десяток мододелов к нашему эксперименту с ранним доступом.
__________________
Иисус умер не за меня
Глупая жертва тупому народу
Моя жизнь - это вечная война
Я сам сдохну за свою свободу
Я опухоль мозга планеты Земля
Я железная палка в ваших колесах
Я сам по себе
Я сам за себя
Сулариус вне форума  
Отправить сообщение для Сулариус с помощью ICQ Ответить с цитированием