Оглавление | Сообщение об ошибках | Ваше мнение о проекте | E-Mail автору |
*статья приведена в оригинальном тексте автора.
Моддинг: связь TShips и моделей кораблей
Эта инфа может быть полезна тем кто собирается заниматся конкретно моддингом кораблей, и не хочет идти по бескрайней пустыне чисел используя лишь УМНТ, высасывая по пути жалкие капли данных из скудных официальных источников информации :D . Поэтому я накидал тут парочку описаний - в первой части поверхостно описал формат модели корабля, а во второй формат файла TShips.
Для комфортной работы нужны(желательны):
1) Что-нибудь типа Windows Commander, Volkov commander :) или короче любую удобную вам оболочку.
2) 3DSMAX 5/6 + экспортный плюгин от Egosoft (в комлекте с ModderKit)
3) Сам ModderKit (в нём помимо плюгина для макса, утилит для распаковки/упаковки dat/pck/pbd есть ещё документация, реально полезная для создания своих собственных моделей в МАX'е)
4) Желательно иметь X2 Object Modder (замечательная программа, спасибо Dimaxx'у за неё)
5) Неофициальные утилиты распаковки/упаковки (есть версии опять же made by Dimaxx, и другие не менее полезные утилиты от Пилотов)
6) Просто необходимо иметь X2 BOD viewer - made by UrQuan & Dimaxx - программу, позволяющую со всеми удобствами просматривать модели кораблей!
7) Cкрипт конвертации bod->max для 3DSMAX - made by altor
ЧАСТЬ 1 - формат игровой модели корабля.
Всё связанное с моделями в игре лежит в двух папках - V и CUT.
Папка V - это как бы "склад запчастей" - руки, ноги, головы, хвосты и т.д..
Папка CUT - в ней лежит набор "схем-чертежей" по которым собираются запчасти, которые можно взять из папки V.
Модели поделены на три типа - body,scene,combined.
Body - это тот тип файлов, что лежат в папке V. Проектируя body-модель мы проектируем запчасть, имеющую геометрические размеры, на неё можно накладывать текстуры, короче говоря все свойства модели-мэша экспортируемые из МАХ'а в игру можно узнать почитав X2_GFX_Modding.pdf идущий в комплекте с ModderKit'ом.
scene - это те файлы, что находятся в папке CUT. Создавая scene-модель мы создаём полноценный игровой объект, именно scene-файлами и представлены все корабли, станции, короче всё что мы видим в игре. В scene-модели выставляются координаты для body-запчастей и их направленность, и ещё анимация(просто изменение направленности). Ниже на примерах объясню подробнее.
combined - комбинированный тип scene+bodies. Этот тип моделей используется в основном для скриптовых сцен-мультиков, разработчики не советуют использовать его ни для чего больше. (хотя ничто не мешает :))
Процесс экспорта. В английском варианте он отлично описан в X2_GFX_Modding.pdf в части 3 - Exporter usage. Здесь же я кратко опишу процесс экспорта. При экспортировании модели появляется окошко, в котором мы можем видеть три кнопки Body, Scene, Combined и три опции Verbose, Binary, Debug Log.
Нажимая на Body, Scene или Combined мы создаём модель соответствующего типа. Опции Verbose, Debug Log использовались разработчиками для отладки, так что для нас они пользы не представляют. Опция Binary позволяет сохранить модель в сжатом виде так что она занимает меньше места и самое главное быстрее грузится, однако наглядность информации внутри файла естественно снижается. При экспортировании модели с помеченной опцией "Binary" вместо .bod (body) файла создаётся .bob(binary body) файл. Единственно что ещё важно знать - при создании наших моделей крайне желательно именовать их начиная с номеров выше 10500, иначе могут возникнуть проблемы использования их в качестве мода.
Рассмотрим идеологию названия моделей.
Body-модели внутри их самих можно называть как угодно, желательно добавлять в начале каждого имени "B_". Например: разместим три шарика и обзовём каждый из них B_sharik1,B_sharik2,B_sharik3, присвоим им цвет, текстуры и т.п. (все экспортируемые свойства описаны в X2_GFX_Modding.pdf - там необходимая инфа для 3D-моделлеров). Для того, чтобы такая модель стала игровой body-моделью, необходимо экспортировать её, и назвать числом (не используя никаких букв), типа 10525,11100, главное чтобы число было больше 10500. Эти числа будут позже использованы в scene-модели. Не забудьте отцентрировать модель как об этом пишут в X2_GFX_Modding.pdf.
Body-модели можно просматривать, и конвертировать в max-формат с помощью программ и скрипта, описанных выше.
Scene-модели устроены как чертёж. Внутри них по сути расположены метки, в позиции которых в игре вставляются body-модели. В принципе как метку мы можем использовать всё что угодно, лишь бы были определены координаты и направление (и ещё возможно вращение), - например кубик :). Хотя удобнее конечно поставить туда ту запчасть, которая там будет реально использоваться (тогда будут видны её направленность и геом. размеры) - но в случае если мы собираем scene-модель в основном из стандартных запчастей из игры, то их МАХ'овских моделей у нас нет, и поэтому приходится вместо них использовать кубики :). Каждая метка имеет своё имя - по нему определяется запчасть, и в некоторых случаях определяются её функциональные параметры. Приведу здесь желательный формат (рекомендуемый разработчиками) для именования меток.
0) для центра модели - имя метки [940(/буквы)] - например 940Mainbody - каждая модель корабля должна иметь такую метку! (виртуальный центр) иначе она не будет экспортирована.
1) для декораций - крыльев/навигационных огней/кабин/двигателей/антенн/... - имя метки должно быть в виде [число(/буквы)] - вместо числа подставляется body-модель. Например 930wing, 930wing02, 931booster, 10318 и т.д
2) для хвостов от двигателей - [число/(_номер)(/буквы)] например 905_1, 770_1bb, 770_1abcd1 и т.д.
3) для выхлопов маневровых движков - [число(/буквы)/_номер] - (это небольшие струйки пара появляющиеся при разворотах корабля) - как получить значение _номера описано на странице 5 X2_GFX_Modding.pdf
4) для кокпитов(кабин изнутри) - [число/_номер(/буквы)] например 928_1cp, 939_2 и т.д. Внимание! Эти _1, _2, _4 и т.д. играют важную роль как идентификаторы кокпитов, дальше объясню почему.
5) для лазеров/турелей - [число/_номер(/буквы)] например 106_1, 106_1b01, 939_4b и т.д. Параметр _номер логически привязывает этот лазер/турель к номеру кокпита. Например у нас есть кокпит турели 939_2, тогда лазеры этой турели будут выглядеть например как 944_2b1, 944_2b01, 944_2b02 и т.п. Смысл: при стрельбе из этого кокпита(основной кабины, или кабины турели) будут стрелять именно эти лазеры расположенные около этой кабины.
Итак, мы разместили все необходимые запчасти в нужных координатах, повернули каждую из них в нужное направление, и теперь осталось лишь экспортировать scene-модель и внести коррективы в файл TShips. Но перед экспортом scene-модели в bod или bob формат экспортируйте её сначала просто в bod формат (без включенной галочки "Binary"), и посмотрите внутри неё (Windows commander тут как раз пригодится) на строчки типа:
P 0; B 940; N 940Mainbody;
P 1; B 885; C 1; N 885_1Cockpit;
P 2; B 106; C 1; N 106_1laser1;
P 3; B 106; C 1; N 106_1laser2;
и т.д.
Видите параметр "P"(Part) в начале каждой строчки? Он будет необходим нам для прописывания некоторых частей в TShips файле так что запишите где-нибудь на листике какой номер к какой части принадлежит. например "106_1laser1 - 2, 106_1laser2 - 3" и т.д.
Если будете использовать в своей модели стандартные запчасти, некоторые из них описаны всё в том же X2_GFX_Modding.pdf, но там описано далеко не всё. Поэтому советую просмотреть bob файлы из папки cut - там можно, хоть и с трудом, прочитать из каких частей составлялись модели кораблей, и эти данные определённо могут быть полезны :).
Ещё не забудьте глянуть в GFX_Modding насчёт упрощенных моделей, используемых при рендеринге на разных дистанциях (но это в общем-то не обязательно :))
Короче,
дальше дело только за 3D художниками :)
ЧАСТЬ 2 - файл TShips и формат кораблей в нём.
Файл TShips.pck (реально TShips.txt в распакованном варианте) лежит в папке types.
В самом начале файла есть строка из двух цифр - это версия файла (изменится если изменится формат описания кораблей) и количество строк в файле. Каждый корабль в этом файле описан одной строкой (довольно длинной :)), в конце каждой строки находится строковый идентификатор корабля (который похоже ни на что не влияет.
Добавление кораблей
Внимание! благодаря Пилоту CheckerTwo получена сл. информация:
"Маленькое уточнение.
В редакторе скриптов можно криэйтить следующие шипы,
прописанные в tships по номерам (начиная с 0 - SS_SH_A_TL):
0-8, 10-43, 49-50, 52, 61-95, 99-100, 103-107.
Всего 86 кораблей. Все остальные как бы недоступны.
Т.е. в редакторе скриптов они отсутствуют для выбора.
В список "недоступных" попадают:
SS_SH_X_M0;
SS_SH_X_TS_P,SS_SH_S_TS_P,SS_SH_P_TS_P,SS_SH_B_TS_P,SS_SH_T_TS_P;
SS_SH_ROBOT;
SS_SH_LOGBOOK;
SS_SH_E_TS,SS_SH_E_M1,SS_SH_E_DRONE,SS_SH_E_SPACESHUTTLE,SS_SH_E_CARRIER;
SS_SH_GATE,SS_SH_M0_GUN,SS_SH_PULLER,SS_SH_R1,SS_SH_R2;
SS_SH_APGUNNER;
SS_SH_COMET;
SS_SH_TAXI,SS_SH_MOD_TL,SS_SH_DUMMY;
SS_SH_K_M0;
SS_SH_K_M0GEN;
SS_SH_REPAIRDRONE;
Убил бы разработчиков
Из этих 86 игра не использует 11, в их описании значение 3dbody = -1, но их можно создавать и вообще это то что нужно для моддинга!:
SS_SH_A_M3;
SS_SH_A_TSA;
SS_SH_B_M3;
SS_SH_B_M4;
SS_SH_S_TS;
SS_SH_S_M5;
SS_SH_T_M4;
SS_SH_T_M5;
SS_SH_P_M3_2;
SS_SH_P_M4;
SS_SH_P_M5A;
Нужно заметить,
что номер строки
корабля в
tships однозначно
соответствует подтипу корабля
(параметр
s) в
xml описания
объектов галактики.
(Спасибо Dimaxx
за редактор карт и хелп к нему.)
Например, пиратский шип
<o id="0"
t="7" x="0" y="0" z="0" s="43" r="0">
соответствует описанию 43 корабля в tships (SS_SH_A_TS_P).
В редакторе скриптов при присвоении значения типа корабля
переменной генерится такой код,
<sval type="array" size="7">
<sval type="int" val="104"/>
<sval type="int" val="0"/>
<sval type="int" val="1"/>
<sval type="int" val="9"/>
<sval type="int" val="458795"/>
<sval type="int" val="1"/>
<sval type="int" val="-1"/>
</sval>
где 458795 = $0007002B и младшее слово опять же
соответствует номеру корабля.
Что из этого всего следует? Скорее всего все прошито в exe
намертво. В конфигах можно менять только кое-какие свойства.
Да, это не фрилансер.
PS: С АП-Ганером что-то непонятно. А мне казалось что я его того,
создавал-летал. Может эгософты в 1.3 поменяли чего? Проверьте, pls.
Че не так."
CheckerTwo©
Т.к. файл TShips наполовину заполнен "мусором", то простой способ как найти нужный корабль - просмотрите bob файлы из папки cut - там в начале есть текстовая строка в которой содержится намёк на корабль, например "SRC: F:\SRC\3DSMAX-Work\X2_The-Threat\Scenen-Ships\revised\4098_Par_M1-Carrier_new.max" - Паранидский М1. Так ищем до тех пор пока не найдём то что нам нужно, и когда находим записываем номер .bob файла и ищем по этому номеру строку в TShips.
Правда есть способ гораздо проще - запустить X2 Object Modder - и там просто пролистать в списке кораблей, найти нужный нам и посмотреть какой у него идентификатор :).
Формат строки описания корабля
На английском частично описан в X2_GFX_Modding.pdf. Для примера разберём здесь
корабль Teladi Osprey - идентификатор SS_SH_T_M6.
940;0;0.04500;0.04500;0.09999;11;4511;19000;3450;101;1;4;217;1000;
112;247;4167;4508;2020;6;3;3;4;9;10;10;500;1500;61;5;61;6;60;2;0;0;
0;0;0;0;-1;4;5;45000;40;41;3;4;1;0;928;3;2;1;939;9;3;2;939;10;4;3;
939;14;4;1;2;1;2;1;1;887;1;-1;-1;2;1;887;2;-1;-1;3;1;2;1;3;1;944;
11;-1;-1;4;1;3;1;4;1;944;12;-1;-1;5;2;4;2;5;1;944;15;-1;-1;6;1;944;16;-1;
-1;1;100000;25;1;0;SS_SH_T_M6;
из .bob файла под номером 04167 выписал названия:
887_1b - это пушка
887_1bb - ещё одна пушка
928_1co - кокпит
906b - закорючка радара
930wing - крылья
931boost - движок
931boost01 - второй движок
940mainbody - виртуальный центр модели корабля
939_2b - кокпит
939_3b - кокпит
944_2b - пушка турели
944_3b - пушка турели
53docking - место стыковки
939_4b - кокпит
944_4b - пушка турели
944_4b01 - пушка турели
905_b - выхлоп от двигателя
905_b01 - выхлоп от второго двигателя
(дальше идут навигационные огоньки 10ххх и десяток выхлопов маневровых движков)
Для удобства описания разобью строку на части:
940; - номер центрального тела (body) для объекта (если там что-то
отличное от 940 значит это не корабль (в обычном смысле этого слова))
0; - body,
используемое для показа объекта в различных меню (там всегда 0, т.е. то же самое
что и в космосе)
0.04500;0.04500;0.09999; - скорости поворота по осям - определяют маневренность
11; - тип
корабля - 0-TL 1-TS 2-M0 3-M1 4-M2 5-M3 6-M4 7-M5 8-TL_P 9-TS_P 10-G0 11-M6
12-TP.
4511; -
номер в xml-файле со всем текстом игры, по которому прописано инфо о корабле.
номер+1 = длинное описание к кораблю.
19000; -
скорость в юнитах в сек.
3450; -
ускорение в юнитах в сек.
101; - как
звучит двигатель в движении
1; -
средняя задержка реактора(реакции) (?) (всегда равно 1)
4; - как
выглядит выхлоп от двигателей
217; - как
светится огонёк двигателя (скорее всего, не уверен полностью)
1000; -
количество энергии (мощность реактора МегаВатт), регенерируемое в секунду
112; -
минимальная громкость звуков издаваемых кораблём
247; -
максимальная громкость звуков издаваемых кораблём на максимальной скорости
4167;
- номер .bod или .bob файла, представляющего из себя scene-модель корабля
4508; -
номер .bod или .bob файла, представляющего из себя внутренний вид главной кабины
корабля
2020; -
бит-маска, определяющая какие пушки можно поставить на корабль (расшифровку см.
ниже)
6; - макс.
количество лазеров устанавливаемых на корабль (в нашем случае 2 пушки +1+1+2
турели = 6)
3; -
максимально возможный тип щита (0 один мегаватт, 1 пять мегаватт, 2 двадцать
пять мегаватт, 3 сто двадцать пять мегаватт)
3; -
максимально возможное количество щитов
4; -
максимально возможный тип ракет (-1 нет, 0 mosquito, 1 wasp, 2 dragonfly, 3
silkworm, 4 hornet. p.s. не забывайте что ракеты класса М например не влезут ни
в один М5 :))
9; - это
число показывает, скока ракет будет в трюме в стандартной поставке при заказе
корабля для НПЦ. Для игрока не имеет смысла - thanks to Dimaxx
10; -
количество возможных апгрэйдов скорости (1 штука = 10% прибавки)
10; -
количество возможных апгрэйдов маневренности (1 штука = 10% прибавки)
500; -
стартовая вместимость трюма
1500; -
максимальная вместимость трюма (1500-500=1000=кол-во возможных апгрейдов трюма)
61; - тип для дополнительного кокпита 1 (номер строки в файле TCockpits, описывающий макс. возможное оружие. Помните, что строки нумеруются с 0 (не считая первой 13;103;, она как бы под номером -1), так что если тут написано 61, то строка эта будет
62 (если
начинать считать строки с 1))
5; -
текст. ID для доп. кокпита 1 (0 главный кокпит, 1 передний, 2 задний, 3 левый, 4
правый, 5 верхний, 6 нижний)
61; - тип
для доп. кокпита 2
6; -
текст. ID для доп. кокпита 2
60; - тип
для доп. кокпита 3
2; -
текст. ID для доп. кокпита 3
0; - тип
для доп. кокпита 4
0; -
текст. ID для доп. кокпита 4
0; - тип
для доп. кокпита 5
0; -
текст. ID для доп. кокпита 5
0; - тип
для доп. кокпита 6
0; -
текст. ID для доп. кокпита 6
-1; - количество кораблей которые могут стыковатся к этому (минус перед числом означает что стыковка внешняя, т.е. снаружи корабля)
4; - макс. тип груза который вмещает корабль
5; - раса, обычно использующая этот корабль
45000; - количество(крепость) единиц хулла(корпуса)
40; - эффект взрыва корабля (разваливание на части)
41; - эффект взрыва деталек корабля (после разваливания на части)
3; - тип хвоста выхлопа от двигателя
...
после этого параметра идут характеристики вооружения корабля, опишу их подробно.
4; - количество кокпитов (основной кокпит + кокпиты турелей)
1;0;928;3; (для каждого кокпита)
2;1;939;9; (для каждого кокпита)
3;2;939;10; (для каждого кокпита)
4;3;939;14; (для каждого кокпита)
4; - количество турелей (пушки основного кокпита, верхнего, нижнего, заднего кокпитов)
1;2;1;2; (для каждой турели)
* * 1;1;887;1;-1;-1; (для каждого лазера)
* * 2;1;887;2;-1;-1; (для каждого лазера)
3;1;2;1; (для каждой турели)
* * 3;1;944;11;-1;-1; (для каждого лазера)
4;1;3;1; (для каждой турели)
* * 4;1;944;12;-1;-1; (для каждого лазера)
5;2;4;2; (для каждой турели)
* * 5;1;944;15;-1;-1; (для каждого лазера)
* * 6;1;944;16;-1;-1; (для каждого лазера)
Теперь распишу какой параметр за что отвечает
Для каждого кокпита:
1) номер кокпита, прописанный в scene-модели (928_1co, 939_2b, 939_3b, 939_4b)
2) расположение турели (просто перечисление от 0 до ...)
3) модель кокпита (928_1co, 939_2b, 939_3b, 939_4b)
4) номер "P"(Part) прописанный в scene-файле (вы не забыли их записать? :) что-нибудь типа P 10; B xxx; C x; N xxxxxx (если смотреть файл в binary формате, то можно лишь только догадыватся какой номер имеет запчасть... но нам всегда нужна эта информация только из наших собственных .bod файлов, так что это не страшно))
Для каждой турели:
1) порядковый номер первого лазера в турели (минимум 1 максимум 18, важен порядок т.к. это будет отображатся в меню оружия корабля, см. ниже параметр №1 для каждого лазера)
2) количество лазеров в пушке (6 пушек, каждая из них одинарная, поэтому количество лазеров совпадает с кол-вом турелей в параметре №4)
3) какой кокпит контроллирует эти пушки (944_4b, 944_4b01, 887_1b, 887_1bb, 944_3b, 944_2b)
4) количество пушек в турели (у нас 4 турели, в них 2 пушки спереди, 1 вверху, 1 внизу, 2 сзади)
Для каждого лазера:
1) порядковый номер пушки (от 1 до 18)
2) лазеры в пушке (всегда 1. Т.е. даже например лазеры в двойной пушке 107 будут описыватся к примеру так: 1;1;107;1;(111;1;) ** 2;1;107;1;(375;2;))
3) номер модели лазера (944_4b, 944_4b01, 887_1b, 887_1bb, 944_3b, 944_2b)
4) номер "P"(Part) прописанный в scene-файле к (что-нибудь типа P 11; B 944 N 944_2b, или P 16; B 887; C 2; N 887_6xyz и т.п.)
5) модель ствола пушки - если пушка "дёргается" при выстреле, то для одинарной (к примеру модель 106) тут 111, для двойной (к примеру модель 107) 375, иначе -1
6) путь к модели ствола пушки - если пушка "дёргается" при выстреле, то одинарной тут 1, для двойной (модель 107) 2, иначе -1
... после описания пушек идут ещё несколько параметров (были бы важны если бы корабль был как товар на станции)
1; - вес единицы товара(корабля)
100000; - коэффициент (коэффициент * некую константу стоимости = цена корабля)
25; - вариация цены, если товар - первичный ресурс
1; - вариация цены, если товар - вторичный ресурс
0; - класс груза (как товара)
SS_SH_T_M6; - текстовый идентификатор корабля (менять его бесполезно).
возможные типы устанавливаемых пушек для кокпитов
Простой спобоб зашифровки –
1,2,4, - 1) GIRE A, 2)GIRE B, 3)GIRE G
8,16,32, - 4)PAC A, 5)PAC B, 6)PAC G
64,128,256, - 7)HEPT A, 8)HEPT B, 9)HEPT G
512,1024,2048, - 10)PSG A, 11)PSG B, 12)PSG G
4096,8192,16384, - 13)Mining, 14)Kyon A, 15)Kyon B
32768,65536,131072, - 16)Kyon G, 17)MassDriver, 18)Ion Disruptor
262144,524288,1048576, - 19)PPC A, 20)PPC B, 21)PPC G
2097152,4194304,8388608 - 22)OrbitalLaser, 23)Khaak_Endfight, 24)Repair
То, какие пушки держит кокпит, определяется суммой вот этих вот чисел. (1, 2, 2*2, 2*2*2...)
Например AGIRE, BGIRE, APAC, BPAC, AHEPT, BHEPT, GHEPT, ID = 1+2+8+16+64+128+256+131072.
Простой способ расшифровки –
например так: берём бит-маску (в нашем случае "2020")
1) запускаем калькулятор (пуск->программы->стандартные->калькулятор :)), щёлкаем на опции вид->инженерный, далее пишем цифры 2020 и жмём на опцию bin(binary) (это или в меню "вид", или там где опции hex-шестнадцатиричная, dec-десятичная, oct-восьмиричная системы счисления)
2) полученное число (из "2020" получаем "11111100100") разделяем на группы после каждого третьего знака, начиная с конца, к примеру точками .11.111.100.100
3) пишем части полученной строки в обратном порядке - 100.100.111.11
4) если в последней части не хватает второго или третьего знаков, добавляем недостающие нули в начало .11-.011
5) инвертируем числа в полученных группах 100.100.111.011 - 001.001.111.110
6) теперь видно (посмотрите на таблицу выше), что можно поставить в этот кокпит –
3:GIRE G, 6:PAC G, 7:HEPT A, 8:HEPT B, 9:HEPT G, 10:PSG A, 11:PSG B.
Вот ещё пример: возьмём например телади-М5, бит-маска = "15".
1) 15-1111
2) 1.111
3) 111.1
4) 111.001
5) 111.100 - 1:GIRE A, 2:GIRE B, 3:GIRE G, 4:PAC A.
или из
девятого параметра строки 62(61 по программистски :)) файла TCockpits:
438->110110110->110.110.110->011.011.011 - это в точности пушки верхней и нижней
турелей Оспрея.
(короче принцип думаю понятен, способ расшифровки можете свой придумать, такой
какой вам будет удобнее использовать :))
(кстати, под кораблями может подразумеваться всё - и то что летает, и то что не летает, всё - станции, корабли, космомухи :), всякие там ворота, навигационные буи... фактически кораблями являются даже заряды плазмы выпущенные из пушек :) (хотя они описываются в другом файле и немного не так) но это уже другая история ;))
Оглавление | Сообщение об ошибках | Ваше мнение о проекте | E-Mail автору |