[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
  • Страница 54 из 54
  • «
  • 1
  • 2
  • 52
  • 53
  • 54
Результаты поиска
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
firsacho, хочу и кости уже вставил, можно двигать модели как угодно, но натыкаюсь постоянно на проблемы Блендера...
Тут у костей не может быть детей объектов, а многие модели, Лось из WF (глаза), старуха (трость и сумка) используют такую связь.
Очень тупая программа, чтобы реализовать простой импорт, нужно плясать с бубном. Причем он все равно не будет работать полноценно...
Да и опять же косяк с joint объектами.

Но с помощью плагина можно использовать модельки и делать анимации для сторонних игр например, тот же Гарис Мод

Еще помучаю и возьмусь за Майю видимо...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Что-то это все мне уже напоминает...



 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Эххх ностальгия...



 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
WADView работает только с офф версией игры



Что касается папки, ты издеваешься? Она у меня почти гигабайт весит и там постоянно идет синхронизация и карты грузятся в основном во время запуска матча. А WorkshopLevels вообще 20 Гигов... Team 17 любят несжатые данные....

Вот скинул одну карту Day of the Tentacle

по пути SteamApps\workshop\content\327030\ https://yadi.sk/d/aSi0dy_X3L8zk7
по пути SteamApps\common\WormsWMD\WorkshopLevels\ https://yadi.sk/d/naBJTShX3L9PJ7

ссылка на оригинал http://steamcommunity.com/sharedfiles/filedetails/?id=769399301


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
А что это ссылки на w3d wiki убрали или ее не было? http://w3d.wiki-site.com/ все таки там туториал к редактору и ссылки на инструменты

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Обновил версию WADView до 2.0 , они поменяли формат, добавив еще 16 байт мусора в блок....

http://worms.pro/load/66-1-0-2019


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Как же происходит декодирование XOM?

Инструменты
Для работы нам нужен дизассемблер IDA желательно от 7.5 версии.

Теория
Все основные классы Xom создаются функцией XContainerClass::XContainerClass
Выглядит это примерно так:
Код
XContainerClass::XContainerClass(
      &XResourceDetails::c_class,
      &XResourceDetails::c_typeinfodata,
      &XContainer::c_class,
      XResourceDetails::CreateInstance_,
      2,
      XResourceDetails::InitClass);
Что нам дает эта функция? Она присутствует почти во всех играх Worms серии 3D начиная от Worms Blast и заканчивая WUM, а часть осталась и в WMD.

В эту функцию передаются параметры:
- создаваемый XClass
- структура XBase::TypeInfo::TypeInfoData
- XClass родитель
- функция CreateInstance
- тип класса 2
- функция InitClass

Тут нам нужна структура XBase::TypeInfo::TypeInfoData.
В структуре TypeInfoData содержится ссылка на название класса, ссылка на GUID, номер версии, и тип класса.

Код
XResourceDetails__c_typeinfodata
XBase::TypeInfo::TypeInfoData
<offset aXresourcedetai, \\ XName "XResourceDetails"
1C0000h,
offset XResourceDetails__GUID, \\ XGuid
offset g_XrmUnit, \\ Type
0,
0, \\ Xver
0>
Нам важно название XName, XGuid и версия XVer.
XGuid используется в начале всех Xom файлов для определения типа контейнеров.

Код
XResourceDetails__GUID XGuid <0E77556F2h, 491AA495h, 6C006385h, 447257E2h>
в xml он выглядит так:
Код
guid="{E77556F2-A495-491A-8563-006CE2577244}"

Версия Xver нужна для совместимости, некоторые поля игнорируются в зависимости от версии.

Дальше нам важна функция InitClass. Она есть не во всех классах, но в ней содержатся все поля для контейнера.
Внутри этой функции инициализируются поля
Код
XResourceDetails::InitClass(void *this) {
XSFStringDescriptor::Initialize(this, &XResourceDetails::FieldInfo_Name);
XSFUint32Descriptor::Initialize(this, &XResourceDetails::FieldInfo_Flags);
}
FieldInfo это описание полей, оно обычно динамической длины, но основа всегда общая

Код
XResourceDetails::FieldInfo_Name FieldInfo <
offset aName, \\ FieldName "Name"
14h, \\ FieldOffset
0, \\ FieldID
8, \\ FieldМask
offset XBase::StringTypeInfo::c_class, \\ FieldClass XString
0, \\ SubType
0 \\ Xcomment
>
Из этой структуры нам важно FieldName , FieldClass, FieldМask и Xcomment
FieldМask работает следующем образом:
- FieldМask = 8, поле присутствует всегда
- FieldМask = 9, поле присутствует с данной версией
- FieldМask > 9, поле отсутствует в данной версии или вообще

Кроме информации по полю важно еще функция Initialize.
Есть два вида функций:
- XSFTypeDescriptor::Initialize
- XMFTypeDescriptor::Initialize

Первая XSF для одного значения, вторая XMF для коллекции XCollection
Каждый XClass имеет в себе все поля своих родителей.
Прикрепления: XomClassFound.idc (2.0 Kb) · xomreadtypewum_xml.idc (15.4 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Практика

Как же распознать названия всех этих функций и полей?
Тут нам пригодится встроенный скриптовой язык idc для автоматизации процесса.
И необходимо вручную назвать базовые типы XInt, XUInt, XInt8, XUInt8, XInt16, XUInt16, XString, XFloat, XBool, XEnum, XColor4ub, XVector2f, XVector3f, XVector4f, XMatrix34, XMatrix, XBoundBox. Это можно легко сделать ориентируясь по классу XResourceDetails.

Итак мы открыли WormsMayhem.exe в IDA  и прошли первое сканирование, переключаемся в окне IDA View-A на Text view.
Теперь нам нужно найти XContainerClass::XContainerClass и назвать ее для простоты XContainerClass
Вбиваем в поиск (Alt +T) "XResourceDetails"
и получаем вот такой вид:

Эта и есть функция которую мы рассматривали в теории, она создает класс XResourceDetails::c_class
Переименовываем sub_6C3C99 в XContainerClass.
Далее нам нужно создать упрощенные структуры. Переходим в окно Local Types (Shift+F1) и нажимаем "Insert..." .
Создаем XGuid

Код
struct XGuid
{
  int d1;
  int d2;
  int d3;
  int d4;
};
и XClass для структуры XBase::TypeInfo::TypeInfoData. Синхронизируем их кликая на каждую после создания

Код
struct XClass
{
  void *XName;
  int Xflag;
  void *PXGuid;
  void *XType;
  int unk;
  int Xver;
  void *Xcomm;
};

Все наша основа для работы скрипта готова!

Запускаем скрипт XomClassFound.idc (Alt+F7)
Итог работы скрипта:

Теперь выбрав XContainerClass и нажав X мы получим список всех функций для инициализации контейнеров
Прикрепления: 2778408.png (23.0 Kb) · 2047360.png (11.6 Kb) · 8427248.png (29.2 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Далее нужно создать еще две структуры, для работы второго скрипта:
XComment

Код
struct XComment
{
  void *name;
  void *comment;
  void *used;
  void *version;
};

XValue он же ::FieldInfo
Код
struct XValue
{
char *FieldName;
__int16 FieldOffset;
char FieldID;
char FieldMask;
void *FieldClass;
void *SubType;
XComment *Xcomment;
};

Запускаем скрипт XomReadTypeWUM_XML.idc (Alt+F7)
Получаем в Output window следующее

Код
<XResourceDetails guid="{E77556F2-A495-491A-8563-006CE2577244}" Xver="0" id="XRef">
   <Name>dword_967698</Name>
   <Flags>dword_967650</Flags>
</XResourceDetails>
<XIntResourceDetails guid="{7D889B8D-2C14-445E-961F-5E0E5520416A}" Xver="0" id="XRef">
   <Value>dword_96765C</Value>
</XIntResourceDetails>
<XUintResourceDetails guid="{93E5117C-8ADA-4AFB-B17A-668D0BDD15E6}" Xver="0" id="XRef">
   <Value>dword_967650</Value>
</XUintResourceDetails>
<XStringResourceDetails guid="{7CDC5872-2CA3-4FCC-AE66-431071E5CE67}" Xver="0" id="XRef">
   <Value>dword_967698</Value>
</XStringResourceDetails>
<XFloatResourceDetails guid="{08889D5F-8039-4CEA-BA5B-9C059AC0570E}" Xver="0" id="XRef">
   <Value>dword_967680</Value>
</XFloatResourceDetails>
<XVectorResourceDetails guid="{071F4563-8CB3-4996-B79F-B0F5CAEC9D99}" Xver="0" id="XRef">
   <Value>unk_96EBE0</Value>
</XVectorResourceDetails>
<XContainerResourceDetails guid="{E0B6BF20-F80B-4329-B6EB-1998ED8AEC1F}" Xver="0" id="XRef">
   <Value>dword_970B94</Value>
</XContainerResourceDetails>
<XColorResourceDetails guid="{7804BA7B-C6FD-4E8E-AFFF-8E266B6A5544}" Xver="0" id="XRef">
   <Value>unk_96E988</Value>
</XColorResourceDetails>
<XDataBank guid="{93E661AC-D941-442A-A18E-E99B795879DC}" Xver="0" id="XRef">
   <Section>dword_967620</Section>
   <IntResources>dword_970B94</IntResources>
   <UintResources>dword_970B94</UintResources>
   <StringResources>dword_970B94</StringResources>
   <FloatResources>dword_970B94</FloatResources>
   <VectorResources>dword_970B94</VectorResources>
   <ContainerResources>dword_970B94</ContainerResources>
   <StringTableResources>dword_970B94</StringTableResources>
   <ColorResources>dword_970B94</ColorResources>
</XDataBank>

Как видно у нас много не известных типов dword_970B94, dword_967620 , unk_96E988 их нужно в ручном режиме назвать соответственно ресурсам.
У нас должен получится такой вывод:

Код
<XResourceDetails guid="{E77556F2-A495-491A-8563-006CE2577244}" Xver="0" id="XRef">
   <Name>XString</Name>
   <Flags>XUInt</Flags>
</XResourceDetails>
<XIntResourceDetails guid="{7D889B8D-2C14-445E-961F-5E0E5520416A}" Xver="0" id="XRef">
   <Value>XInt</Value>
</XIntResourceDetails>
<XUintResourceDetails guid="{93E5117C-8ADA-4AFB-B17A-668D0BDD15E6}" Xver="0" id="XRef">
   <Value>XUInt</Value>
</XUintResourceDetails>
<XStringResourceDetails guid="{7CDC5872-2CA3-4FCC-AE66-431071E5CE67}" Xver="0" id="XRef">
   <Value>XString</Value>
</XStringResourceDetails>
<XFloatResourceDetails guid="{08889D5F-8039-4CEA-BA5B-9C059AC0570E}" Xver="0" id="XRef">
   <Value>XFloat</Value>
</XFloatResourceDetails>

За вывод в формате XML отвечает функция скрипта XMLPrint. Она закомментирована для остальных типов, с помощью ее можно узнать структуру любого контейнера.

Структура этих общих функций EXE отличается в разных играх, поэтом скрипт не универсален и его необходимо переписывать, но суть работы не меняется.

При должном желании можете глубже разобраться.


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Сглаживание вокселей работает у меня в редакторе не идеально.
Где-то на 90% как в игре, но есть косяки, при некоторых комбинациях вершины соседних треугольников не соединяются, похожие же косяки есть и в оригинальной игре.
Я делал тупо через набор сетов на каждую сторону пространства и обработкой через громадный case.
Код от этого выглядит страшно.
Плюс там ещё система искажений по слоям.
Ещё есть зашумление, вот его я так и не реализовал в редакторе, но игра мало где этот шум использует.
То что ты взялся за такое, конечно похвально, но правообладатели рады не будут, так что удачи не попасть им на глаза.
Исходники редактора выкладывать не буду, могу поделиться лишь частью генерации меша, если сможешь, разберёшься.


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Я вырезал главную часть генерации (прикрепил файл), если что-то не будет хватать, пиши.
Вообще я этот код писал в 2007 году, так что удачи разобраться как он работает )))
Но я бы на твоем месте через IDA искал их алгоритм, я его даже как-то в том году находил, когда искал алгоритм зашумления поверхности при использовании EdgeCrinkle, возможно надо копать где-то тут GenerateLandGeometry::CombineGeometry_PC и BitArray3D.
Прикрепления: poxel_lite.pas (68.5 Kb)


 
  • Страница 54 из 54
  • «
  • 1
  • 2
  • 52
  • 53
  • 54
Поиск: