Gildor's Forums

Author Topic: Mortal Kombat X  (Read 4318 times)
prj20424
Newbie
*
Posts: 11


View Profile
Mortal Kombat X
« on: April 30, 2015, 15:11 »

Все исходники доступны на GitHub - можете там поковыряться, и если будут конкретные вопросы - задать их на форуме "Unreal coding" - http://www.gildor.org/smf/index.php/board,26.0.html.
У меня вопросы касаемо формата MKX. XXX это не unreal пакеты, а нечто гибридное.
Вы добавили поддержку MKX в umodel, поэтому и спрашиваю здесь.
(ибо знатоки Unreal пишут как оно "обычно должно быть в Unreal", не глядя в пакет от МКХ).
Исходники пытался ковырять, но в С не силен, так что не понимаю 98%.

Повторюсь,
как найти ID имени(nameID) ?
как связать ID класса(classID) с именем класса(Cname)?
как связать ID имени(nameID) с именем(name)?
именно в МКХ!
Logged
Gildor
Administrator
Hero Member
*****
Posts: 7971



View Profile WWW
Re: Mortal Kombat X
« Reply #1 on: April 30, 2015, 15:21 »

Небольшой путеводитель по коду UModel. Весь нужный код, связанный именно с пакетами, находится в UnPackage.h и UnPackage.cpp.
Загрузка пакета "с нуля" - UnPackage::UnPackage
Элемент таблицы экспорта - SerializeObjectExport3
Элемент таблицы импорта - FArchive& operator<<(FArchive &Ar, FObjectImport &I)
Перекодирование целого числа в экспорт или импорт - в UnPackage.h, класс UnPackage, методы GetImport и GetExport.

Код для Unreal Engine 3 лежит внутри "#if UNREAL3 .... #endif". Все игры на UE3 имеют Ar.Game >= GAME_UE3. Конкретно MK - это Ar.Game == GAME_MK. В UModel делается проверка на "MK X" через "Ar.Game == GAME_MK && Ar.ArVer >= 677".
« Last Edit: June 27, 2015, 00:41 by Gildor » Logged
prj20424
Newbie
*
Posts: 11


View Profile
Re: Mortal Kombat X
« Reply #2 on: April 30, 2015, 16:10 »


Спасибо за конструктивный ответ.
Это понятно:
Код для Unreal Engine 3 лежит внутри "#if UNREAL3 .... #endif". Все игры на UE3 имеют Ar.Game >= GAME_UE3. Конкретно MK - это Ar.Game == GAME_MK. В UModel делается проверка на "MK X" через "Ar.Game == GAME_MK && Ar.ArVer >= 677".
Ar.ArVer и Ar.Game значение в шапке пакета. Если Ar.Game = МК и Ar.ArVer >= 677, Значит это МКХ

В С я практически ноль. Код мне не поможет. Мне нужно объяснение, как оно устроено.
Это не понятно:
Загрузка пакета "с нуля" - UnPackage::UnPackage
Элемент таблицы экспорта - SerializeObjectExport3
Элемент таблицы импорта - FArchive& operator<<(FArchive &Ar, FObjectImport &I)
Перекодирование целого числа в экспорт или импорт - в UnPackage.h, класс UnPackage, методы GetImport и GetExport.
Элемент таблицы экспорта для меня выглядит так
Code:
[classID][somedata][fsize][foffset][anotherdata]
somedata и anotherdata это неизвестные мне данные

таблицу импорта еще не разобрал.


на пример, как оно устроено в mk9:

Элемент таблицы импорта:
Code:
[classID]
Элемент таблицы экспорта:
Code:
[class][nameID][fsize][foffse]
classID и nameID соответствуют строке в таблице Имен.
class соответствует элементу в таблице импорта.
в итоге получаем класс файла, имя файла и смещение с размером("тушку" файла)



Logged
Gildor
Administrator
Hero Member
*****
Posts: 7971



View Profile WWW
Re: Mortal Kombat X
« Reply #3 on: April 30, 2015, 16:21 »

В C++ придётся поковыряться. Пример:

Code:
FArchive& operator<<(FArchive &Ar, FObjectImport &I)
{
Ar << I.ClassPackage << I.ClassName << I.PackageIndex << I.ObjectName;

#if MKVSDC
if (Ar.Game == GAME_MK && Ar.ArVer >= 677)
{
// MK X
FGuid unk;
Ar << unk;
}
#endif // MKVSDC

return Ar;
}

(я вырезал всё, что не касается MK)

Через operator<< идёт сериализация ClassPackage, ClassName, и т.д.
Конкретно надо смотреть, какие типы данных сериализуются - это можно посмотреть в описании FObjectImport,
Видно также, что для MK X добавлено поле типа Guid. Его сериализация описана в UnCore.h:

Code:
class FGuid
{
public:
unsigned A, B, C, D;

friend FArchive& operator<<(FArchive &Ar, FGuid &G)
{
Ar << G.A << G.B << G.C << G.D;
return Ar;
}
};
т.е. сериализуются 4 32-битных int, A B C и D.

Ну и так далее. Переводить все исходники в "человеческий вид" не хочется, поэтому просто даю "вводную" как всё сделано в Unreal (я в UModel использовал метод кодирования схожий с тем, что используется в самом Unreal Engine).
Logged
prj20424
Newbie
*
Posts: 11


View Profile
Re: Mortal Kombat X
« Reply #4 on: April 30, 2015, 16:34 »

Вы говорите/пишите не языке, которого я не знаю  Sad.

Спасибо за помощь.
Попробую разобраться в коде или в самом XXX.
Не знаю даже, что будет быстрее
Logged
prj20424
Newbie
*
Posts: 11


View Profile
Re: Mortal Kombat X
« Reply #5 on: May 01, 2015, 01:14 »

как найти ID имени(nameID) ?
как связать ID класса(classID) с именем класса(Cname)?
как связать ID имени(nameID) с именем(name)?
именно в МКХ!
Отвечаю себе, на свои же вопросы:
1. В элементе таблицы экспорта.
Code:
[class32][64][nameID32][32][hash128][128][fsize32][foffset32][224]
class - отрицательное значение.
пример 0xfffffffa(-6) значит шестой класс.

2. Отдельной таблицы для имен классов нет. Имя класса берется из той же таблицы имен.
classnameID в таблице импорта:
 
Code:
[160][classnameID32][160]
3. Так же как и в мк9. nameID(как и classnameID) соответствует номеру записи в таблице имен
« Last Edit: May 01, 2015, 01:26 by prj20424 » Logged
Gildor
Administrator
Hero Member
*****
Posts: 7971



View Profile WWW
Re: Mortal Kombat X
« Reply #6 on: May 01, 2015, 01:53 »

В MK X все смещения в файлах - 64 бита. Это основное отличие от предыдущих версий игры, да и от самого UE3. Это касается и смещений для таблиц имён/экспорта/импорта, и смещений в таблицах компрессии, и смещений в таблицах экспорта ...
Logged
prj20424
Newbie
*
Posts: 11


View Profile
Re: Mortal Kombat X
« Reply #7 on: May 01, 2015, 02:08 »

MKX теперь 64 битный, так что многие переменные занимают 64 бита вместо привычных 32.

Из-за этого ошибся в смещениях в таблице импорта и долго не мог понять, что происходит.

Структура пакета:
magik32 - 0х9E2A83C1
pkVer16 - 0x02A5
LcVer16 - 0x9d
DATAoffset32 - начало данных
magik32 -"MK10"
unk32 - ?
unk32 - ?
hash128 - ?
Ssize32 - длинна строки
string - "None "

unkB8
unkB8
unkB8
compressFlag8 - флаг компрессии 0-decompressed 2-compressed

Ncount32 - количество элементов в таблице
NToffset64 - смещение таблицы имен

Ecount32 - количество элементов в таблице
EToffset64  - смещение таблицы экспорта

IMcount32 - количество элементов в таблице
IMToffset64  - смещение таблицы импорта

unk332
ENDoffset64   - конец таблиц?

EXToffset32 - смещение "внешних данных"

DATAoffset32 - почти соответствует DATAoffset.
unk64 - ? обычно ноль

unkcount32 - ?
unk64 - ?
hash128
unk32
Engine32 - ?
compressFlag32 - флаг компрессии ?
unk32

Inputs_count32 - количество внешних пакетов?
if Inputs_count32 > 0
   for i < Imputs_count
      get Nsize long
      getdstring Iname Nsize
   next
endif

crapsize32 - размер того, что идет дальше(crap)
unk32 - ? crapsize уменьшенный на порядок (например для 0x9754 0х0975)
crap - ? большой хэш. Похоже на зашифрованные данные

Дальше идет, как я думал, таблица имен классов. Но это не она.
Code:
[Ncount]
[size32][string][null32][size32][string][null32]...
Продолжается сразу таблицей имен (смещение в хэдере)
дальше остальные таблицы, пустота, данные...



Logged
prj20424
Newbie
*
Posts: 11


View Profile
Re: Mortal Kombat X
« Reply #8 on: May 01, 2015, 02:14 »

В MK X все смещения в файлах - 64 бита. Это основное отличие от предыдущих версий игры, да и от самого UE3. Это касается и смещений для таблиц имён/экспорта/импорта, и смещений в таблицах компрессии, и смещений в таблицах экспорта ...
Опередили меня Smiley

Интересно, что за хэши в элементах таблиц, в заголовке(особенно большой кусок).
И что за таблица со строками перед таблицей имен. Зачем она?
Logged
Gildor
Administrator
Hero Member
*****
Posts: 7971



View Profile WWW
Re: Mortal Kombat X
« Reply #9 on: May 01, 2015, 02:17 »

MKX теперь 64 битный, так что многие переменные занимают 64 бита вместо привычных 32.
Тут дело не в 64 битах, а в дозволении движку использовать файлы размером более 4Gb.

Насчёт остального - Вам было бы намного проще, если бы вы посмотрели исходники UModel. Например, то что у вас в начале сообщения, сериализуется здесь:
https://github.com/gildor2/UModel/blob/master/Unreal/UnPackage.cpp#L115
(можете смело игнорировать блоки кода, которые созданы для других игр - вроде #if BIOSHOCK...#endif, или #if TRANSFORMERS...#endif)

Интересно, что за хэши в элементах таблиц, в заголовке(особенно большой кусок).
Не знаю. Guid-ы какие-то. Мода такая Smiley
Quote
И что за таблица со строками перед таблицей имен. Зачем она?
Тоже заметил, но разбираться не стал - для UModel она оказалась не нужна (по крайней мере пока не нужна).
Logged
Jump to:  

Powered by SMF | SMF © 2006-2009, Simple Machines LLC
Leviathan design by Bloc | XHTML | CSS