⚡ Оглавление
💢 Обзор
Этот довольно монолитный файл определяет внутреннее устройство баз, присутствующих на них NPC и предлагаемые случайные миссии. Некоторые атрибуты базы связаны с поведением NPC в космосе. В частности, вам необходимо убедиться, что принадлежность вашей базы к определённым организациям и маршруты патрулирования корректно согласованы.
💢 Синтаксис
Блоки следует определять в следующем порядке для каждой базы. Некоторые блоки могут быть определены несколько раз.
🔭 [Mbase]
Этот блок может быть определен только один раз для каждой базы.
[Mbase]
nickname = STRING
local_faction = STRING
diff = INT
msg_id_prefix = STRING
Параметр | Описание |
---|---|
nickname | Ник базы, используемый в других местах, например в mBases и других файлах, особенно в системных ini. |
local_faction | Ссылка на фракцию, как определено в faction_prop.ini. Должна совпадать с принадлежностью базы, указанной в системном ini файле. |
diff | Возможно, уровень сложности миссий, предлагаемых базой. Требуется дополнительное исследование. Возможно, это значение не используется. |
msg_id_prefix | ID сообщения GCS для голосовых профилей, фактически определяет, как НПС называют базу при вызове игроком/базы/других НПС. |
💨 [MVendor]
Этот блок может быть определен только один раз для каждой базы.
[MVendor]
num_offers = INT, INT
Параметр | Описание |
---|---|
num_offers | Целые числа — это МИНИМАЛЬНОЕ и МАКСИМАЛЬНОЕ количество миссий, предлагаемых торговцем миссий в любой момент времени. Следует отметить, что максимальное количество миссий не жёстко ограничено. В конечном итоге количество доступных миссий будет определять лимит. |
💢 [BaseFaction]
Можно определить несколько блоков. Как минимум один должен быть определён для фракции, которой принадлежит база.
[BaseFaction]
faction = STRING
weight = INT
mission_type = STRING, INT, FLOAT, INT
npc = STRING
Параметр | Описание |
---|---|
faction | Ссылка на фракцию, как определено в faction_prop.ini . |
weight | Значение веса для миссий, предлагаемых этой фракцией на доске заданий, а также для распределения НПС, не привязанных к конкретным объектам, появляющихся на станции. В идеале эти значения в сумме по всем блокам [BaseFaction] должны давать 100. |
mission_type | Здесь указаны: тип миссии, минимальная сложность, максимальная сложность и вес соответственно. Единственный доступный тип миссии, по-видимому, DestroyMission . См. ниже для подробного объяснения работы минимальных и максимальных значений сложности. |
npc | Позволяет НПС из блока [GF_NPC] появляться в баре. Принадлежность НПС должна совпадать с фракцией. |
⚡ Расчет сложности предложений о работе
Это взято из превосходного поста Скотти здесь.
Число сложности, отображаемое в игре при чтении предложения миссии, имеет прямую связь с выбранной технической сложностью. По-видимому, эти числа в игре где-то жёстко закодированы для определённых значений сложности.
Обычно параметр mission_type можно интерпретировать как: mission_type = DestroyMission, <minDiff>, <maxDiff>, <weight>
Вес — это произвольное значение, используемое относительно суммы заданных весов. Например, если одна фракция предлагает миссии с весом 1, а другая — с весом 2, миссии второй фракции будут появляться в 2 случаях из 3.
minDiff и maxDiff важны для расчёта реального уровня сложности, доступного игроку. Важно отметить, что maxDiff не обязательно соответствует максимальному значению. Расчёты производятся следующим образом:
🔭 Одиночная игра
rank_diff = определяется на основе внутреннего MissionNum и файла DATA\MISSIONS\rankdiff.ini
factor = 1.3689^3 = 2.565164201769
diff = rank_diff * factor, где diff находится в диапазоне [0, 100]
Если diff <= minDiff, то игрок получает сообщение на доске заданий с рекомендацией стать лучше как пилот.
Если diff >= maxDiff:
d = maxDiff / factor, где d становится >= minDiff
finalDifficulty = maxDiff - cos(rnd * pi/2) * (maxDiff - d), где rnd — случайное значение в диапазоне [0, 1)
иначе
diff = rank_diff / factor, где diff1 находится в диапазоне [minDiff, 100]
finalDifficulty = maxDiff - cos(rnd * pi/2) * (maxDiff - diff), где rnd — случайное значение в диапазоне [0, 1)
💥 Мультиплеер
rnd — случайное значение в диапазоне [0, 3)
Если rnd == 0:
diff = maxDiff
иначе
diff = maxDiff * 1.3689^(rnd * 2 + 2)
diff ограничен диапазоном [0, 100]
finalDifficulty = diff - cos(rnd * pi/2) * (diff - minDiff), где rnd — случайное значение в диапазоне [0, 1)
Если внимательно присмотреться к первой части расчёта, специфичного для многопользовательской игры, то становится ясно, что maxDiff — не константа, а умножается на случайный коэффициент. Это может привести к тому, что многопользовательские миссии будут выходить за рамки изначально задуманных уровней.
💥 [GF_NPC]
Для одной базы можно определить несколько блоков.
[GF_NPC]
nickname = STRING
body = STRING
head = STRING
lefthand = STRING
righthand = STRING
individual_name = INT
affiliation = STRING
voice = STRING
room = STRING
bribe = STRING, INT, INT ;repeatable
rumor = STRING, STRING, INT, INT ;repeatable
rumorknowdb = STRING ;repeatable
rumor_type2 = STRING, STRING, INT, INT ;repeatable
know = INT, INT, INT, INT ;repeatable
knowdb = STRING ;repeatable
Параметр | Описание |
---|---|
nickname | Внутреннее имя НПС. Используется в блоке [BaseFaction] . |
body | Тело НПС, как определено в bodyparts. |
head | Голова НПС, как определено в bodyparts. |
lefthand | Левая рука НПС, как определено в bodyparts. |
righthand | Правая рука НПС, как определено в bodyparts. |
individual_name | Имя НПС для отображения при наведении мыши. |
affiliation | Принадлежность к фракции, как определено в faction_prop.ini. |
voice | Голос НПС, как определено в блоке [Voice] файла voices. |
room | Комната, в которой будет появляться НПС, как определено в блоке [MRoom] в mBases.ini . |
bribe | Позволяет НПС предлагать взятку. Первый параметр — фракция, второй — цена за 0.1 очка репутации, третий — IDS-ссылка на текст взятки. В тексте взятки можно использовать следующие плейсхолдеры: %d0 — цена; %F0v1 — фракция, к которой принесёт дружелюбие; %Fnv1 — n от 1 до 3, фракции, которые станут недружелюбными при покупке взятки. v1 в плейсхолдерах — грамматические варианты названия фракции. |
rumor | Ссылается на два ранга из [rankdiff.ini](rankdiff.ini.md) , затем на целое число от 1 до 3, и наконец на IDS-ссылку на текст слуха. Значения рангов определяют диапазон рангов, в которых могут появляться эти слухи. Первое целое число задаёт минимальную репутацию с фракцией для предложения слуха: 1 = 0.2, 2 = 0.4, 3 = 0.6. 4 по умолчанию = 0.0. Эти значения можно менять через смещения в content.dll. Неизвестно, принимаются ли другие числа или влияют ли они на что-то ещё. |
rumorknowdb | Не используется. Ссылка на объект слуха задаётся через knowledgemap.ini. |
rumor_type2 | Та же синтаксис, что и у rumor . Первые два параметра, судя по всему, задают условия доступности слуха. Обычно используется в кампании. |
know | Используется вместе с knowledgemap.ini. Первый параметр — IDS-ссылка на текст предложения (без " за xxx Credits.", это добавляется автоматически другой IDS-ссылкой). Второй — IDS-ссылка на текст после покупки информации. Третий — цена информации в кредитах. Четвёртый — целое число, задающее минимальную репутацию для предложения: 1 = 0.2, 2 = 0.4, 3 = 0.6, 4 = 0.0 по умолчанию. Эти значения можно менять через смещения в content.dll. Неизвестно, принимаются ли другие числа или влияют ли они на что-то ещё. |
knowdb | Не используется. Ссылка на объект предложения задаётся через knowledgemap.ini. |
💢 [MRoom]
Для одной базы можно определить несколько блоков.
[MRoom]
nickname = STRING
character_density = INT
fixture = STRING, PATH, PATH, STRING ;repeatable
Параметр | Описание |
---|---|
nickname | Внутреннее имя комнаты, на которое ссылаются в других местах mBases.ini . |
character_density | Максимальное количество НПС, которое может находиться в комнате одновременно (не включает игрока). |
fixture | Используется для комнат, где НПС всегда присутствует, например, торговцы снаряжением. Ссылается на НПС, hardpoint в сцене (обычно определён в скрипте .thn ), анимацию, которую должен воспроизвести НПС, и тип НПС (варианты: bartender — бармен, trader — торговец, Equipment — торговец снаряжением, ShipDealer — продавец кораблей). |