mbases.ini
📱
mbases.ini

⚡ Оглавление

💢 Обзор

Этот довольно монолитный файл определяет внутреннее устройство баз, присутствующих на них 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 — фракция, к которой принесёт дружелюбие; %Fnv1n от 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 — продавец кораблей).