Barabus
GameDev.ru / Страницы / Barabus [Форум / Инфо]

Barabus

Таки написал статью, освещающую большинство вопросов, связанных с реинжинирингом закрытых форматов XNA и XACT, а также общих подходах к портированию XNA-игр с Xbox 360 на PC. Статью читайте в августовском номере журнала "Хакер" № 8/13 (175).

Если после прочтения статьи останутся вопросы, то обращайтесь. При наличии свободного времени окажу содействие в парсинге контейнеров и адаптации кода игр для Windows.

Ссылка | Комментарии [3]
28 июля 2013

Ознакомился с кодом так называемого эмулятора Ex360E. Не-не-не. В том виде, в котором представлен сейчас, он неработоспособен.

При планировании допущена главная ошибка - не оценен объем предстоящей работы. Они пошли по самому простому пути - реализации документированной функциональности. Это порядка 10% от предстоящего объема работы. Боюсь, что энтузиазм разработчиков иссякнет раньше, чем они хотя бы приблизятся к работоспособной альфе. Поясню, в чем причина.

Система времени выполнения XNA, реализованная в машинном коде, для Xbox 360 состоит из следующих подсистем, к которым разработчики Ex360E даже не подступились:

  • D3D - графическая подсистема, использующая модель шейдеров xvs/xps 3.0.
  • Аудиосистема XNA, включающая в себя декодорование XMA.
  • XACT - система управления аудиоконтентом, отличающаяся от реализации для Windows Endianity, то есть порядком паковки байтов.
  • Контент провайдеры, использующие контейнеры XNB, также отличающиеся от реализации для Windows Endianity.

Все эти подсистемы по большей части не документированы и реализовать их "в лоб", пытаясь прикрутить в реализации XNA для Windows, весьма затруднительно. Именно с их реализации и нужно начинать, а не пытаться закрыть дырки в таблицах импорта Xbox 360 XNA Runtime, как поступили разработчики Ex360E.

Я бы мог посодействовать этим ребятам, но боюсь, что будет куда проще все сделать самому. Их наработки не выдерживают критики и совершенно бесполезны. Возможно в будущем, если найду время, я напишу свой мост или конвертер XNA-игр c Xbox 360 на Windows. Однако, ничего не обещаю.

Ссылка | Комментарии [0]
17 июля 2013

Закончено портирование игры Dishwasher: Vampire Smile с Xbox 360 на ПК. Это была интересная работа. Очень жаль, что приличных игр с использованием XNA на ящике так мало.

Разработчики игры анонсировали ее официальный выход на ПК. В связи с этим я не стал заканчивать багофикс. Ждем официальный релиз.

Ссылка | Комментарии [0]
4 июня 2013

Сегодня таки решил снова приступить к исследованию форматов XACT3, без знания которых невозможно портирование XNA игр с Xbox 360. Собственно, к XACT3 я подступался не раз. В последний раз я запоролся на сопоставлении SimpleCue и ComplexCue со звуками. Сегодня же на меня снизошло просветление и все проприетарные внутренности XACT обрели форму и внутренний смысл. Больше нет ни одного неясного байта, слова или двойного слова. Все битовые поля раскрыли свое значение.

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

Обычно я имею склонность складировать всю нарытую информацию на винте, а после забывать о ней и удалять оную по неосторожности. И вот я подумал, а почему бы не выложить свои наработки в сеть? Возможно кому-то мои знания очень пригодятся.

Итак, XACT 3. Начнем с описания формата XGS.

XGS - это контейнер для XACT Global Settings, содержащий базовые настройки проекта XACT, категории, переменные, настройки RPC и DSP. Заголовок контейнера описывается следующей структурой:

struct XACTGlobalSettingsHeader
{
    DWORD dwSignature;
    WORD wContentVersion;
    WORD wHeaderVersion;
    WORD wCrc;
    DWORD LastModifiedLow;
    DWORD LastModifiedHigh;

    BYTE bCategoryFriendlyNames:1;
    BYTE bVariableFriendlyNames:1;
    BYTE bBigEndian:1;
    BYTE bReserved:5;

    WORD nNumCategories;
    WORD nNumVariables;
    WORD nNumCategoryHashEntries;
    WORD nNumVariableHashEntries;
    WORD nNumRPCs;
    WORD nNumDSPPresets;
    WORD nNumDSPParams;
    DWORD nCategoryOffset;
    DWORD nVariableOffset;
    DWORD nCategoryHashTableOffset;
    DWORD nCategoryHashTableEntryOffset;
    DWORD nVariableHashTableOffset;
    DWORD nVariableHashTableEntryOffset;
    DWORD nCategoryFriendlyNameOffset;
    DWORD nVariableFriendlyNameOffset;
    DWORD nRPCTableOffset;
    DWORD nDSPPresetTableOffset;
    DWORD nDSPParamTableOffset;
};

Назначение параметров понятно из их названий. Если вы работали с XACT 3, то у вас не должно возникнуть вопросов. На что следует обратить внимание? Первое - данные выровнены по границе байта, при объявлении не забываем применить директиву pragma pack. Это отностится ко всем структурам всех контейнеров XACT. Второе - недействительные ссылки на таблицы имеют значение 0xFFFFFFFF (-1). В прочем, при парсинге вы все равно будете проверять счетчики элементов таблиц, так что до невалидных ссылок вы скорее всего не доберетесь. Ну и не забываем, что формат упаковки данных на Xbox 360 - Big Endian. При чтении консольных контейнеров с ПК переставляем байты.

После заголовка следуют собственно таблицы данных. Они описываются следующими структурами.

Элементы таблицы Categories и связанные типы:

struct XACTCrossfade
{
    WORD nFadeInTime;
    WORD nFadeOutTime;
};

struct XACTInstanceLimit
{
    BYTE nLimit;
    XACTCrossfade crossfade;
    BYTE bCrossfadeType:2;
    BYTE bTransitionType:1;
    BYTE bBehavior:3;
    BYTE bReserved:2;
};

struct XACTGlobalSettingsCategory
{
    XACTInstanceLimit instanceLimit;
    WORD nParent;
    BYTE nVolume;
    BYTE bBackgroundMusic:1;
    BYTE bPublic:1;
    BYTE bReserved:6;
};

Таблица Variables.

struct XACTVariable
{
    BYTE bPublic:1;
    BYTE bReadOnly:1;
    BYTE bLocal:1;
    BYTE bReserved:5;
    float nValue;
    float nMin;
    float nMax;
};

Category Hash Table и Variable Hash Table - это просто массивы DWORD, содержащие индексы. Применения этим индексам я пока не нашел, в перспективе буду ковырять код библиотек и разбираться. Для доступа к существенным данным сборки XACT эти индексы не нужны.

Элементы Category Hash Table Entry и Variable Hash Table Entry описываются структурой:

struct XACTHashTableEntry
{
    DWORD nFriendlyNameOffset;
    WORD nNextIndex;
};

nFriendlyNameOffset - ссылается на строку с именем категории или переменной, как и ясно из названия, а вот nNextIndex - это очень интересно. При добавлении первой категории XACT назначает полю значение 1. После добавления второй категории полю первой категории присваивается значение 0xFFFF (-1), а для второй добавленной - 2. И так далее. С переменными аналогично. Я теряюсь в догадках, нафига так сделано, когда значение следующего индекса можно всегда получить из счетчика категорий или переменных. И пусть после этого говорят, что индусы в Майкрософт не работают :)

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

С описателями настроек RPC и DSP я пока не сталкивался. Думаю, что поэкспериментирую и добавлю эти типы позже.

Собственно, пока все. В следующий раз рассмотрим внутренности XWB и XSB, контейнеры WaveBank и SoundBank, соответственно.

Ссылка | Комментарии [3]
27 мая 2013

http://www.documentoved.ru/documents/14001 форма 14001: скачать бланк форма.
2001—2018 © GameDev.ru — Разработка игр