diff --git a/ParkanPlayground/MSH_FORMAT.md b/ParkanPlayground/MSH_FORMAT.md
new file mode 100644
index 0000000..0841fcd
--- /dev/null
+++ b/ParkanPlayground/MSH_FORMAT.md
@@ -0,0 +1,267 @@
+# Документация формата MSH
+
+Формат `.msh` используется игрой Parkan: Железная стратегия (1998) для хранения 3D-мешей.
+MSH файлы — это NRes архивы, содержащие несколько типизированных компонентов.
+
+## Обзор
+
+Существует **два варианта** формата MSH:
+
+| Вариант | Применение | Ключевые компоненты | Хранение треугольников |
+|---------|------------|---------------------|------------------------|
+| **Модель** | Роботы, здания, объекты | 06, 0D, 07 | Индексированные треугольники |
+| **Ландшафт** | Террейн | 0B, 15 | Прямые треугольники |
+
+### Автоопределение типа
+
+```
+Модель: Есть компонент 06 (индексы) И 0D (батчи)
+Ландшафт: Есть компонент 0B (материалы) И НЕТ компонента 06
+```
+
+---
+
+## Сводка компонентов
+
+| Тип | Название | Размер элемента | Описание |
+|:---:|----------|:---------------:|----------|
+| 01 | Pieces | 38 (0x26) | Части меша / тайлы с LOD-ссылками |
+| 02 | Submeshes | 68 (0x44) | Сабмеши с баундинг-боксами |
+| 03 | Vertices | 12 (0x0C) | Позиции вершин (Vector3) |
+| 04 | VertexData1 | 4 | Данные на вершину (неизвестно) |
+| 05 | VertexData2 | 4 | Данные на вершину (неизвестно) |
+| 06 | Indices | 2 | Индексы вершин треугольников (только Модель) |
+| 07 | TriangleData | 16 | Данные рендера на треугольник (только Модель) |
+| 08 | Animations | 4 | Кейфреймы анимации меша |
+| 0A | ExternalRefs | переменный | Внешние ссылки на меши (строки) |
+| 0B | MaterialData | 4 | Материалы на треугольник (только Ландшафт) |
+| 0D | DrawBatches | 20 (0x14) | Батчи отрисовки (только Модель) |
+| 0E | VertexData3 | 4 | Данные на вершину (только Ландшафт) |
+| 12 | MicrotextureMap | 4 | Микротекстурный маппинг на вершину |
+| 13 | ShortAnims | 2 | Короткие индексы анимаций |
+| 15 | Triangles | 28 (0x1C) | Прямые определения треугольников |
+
+---
+
+## Поток данных
+
+### Модель (роботы, здания)
+
+```
+Компонент 01 (Pieces - части)
+ │
+ └─► Lod[n] ──► Компонент 02 (индекс сабмеша)
+ │
+ ├─► StartIndexIn07 ──► Компонент 07 (данные на треугольник)
+ │
+ └─► StartOffsetIn0d:ByteLengthIn0D ──► Компонент 0D (батчи)
+ │
+ ├─► IndexInto06:CountOf06 ──► Компонент 06 (индексы)
+ │ │
+ │ └─► Компонент 03 (вершины)
+ │
+ └─► IndexInto03 (базовое смещение вершины)
+```
+
+### Ландшафт (террейн)
+
+```
+Компонент 01 (Тайлы, обычно 16×16 = 256)
+ │
+ └─► Lod[n] ──► Компонент 02 (индекс сабмеша)
+ │
+ └─► StartIndexIn07:CountIn07 ──► Компонент 15 (треугольники)
+ │
+ └─► Vertex1/2/3Index ──► Компонент 03 (вершины)
+
+ └─► StartIndexIn07:CountIn07 ──► Компонент 0B (материалы, параллельно 15)
+```
+
+**Важно:** В ландшафтных мешах поля `StartIndexIn07` и `CountIn07` в Компоненте 02
+используются для индексации в Компонент 15 (треугольники), а не в Компонент 07.
+
+---
+
+## Структуры компонентов
+
+### Компонент 01 - Pieces (0x26 = 38 байт)
+
+Определяет части меша (для моделей) или тайлы террейна (для ландшафтов).
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 1 | byte | Type1 | Флаги типа части |
+| 0x01 | 1 | byte | Type2 | Дополнительные флаги |
+| 0x02 | 2 | int16 | ParentIndex | Индекс родителя (-1 = корень) |
+| 0x04 | 2 | int16 | OffsetIntoFile13 | Смещение в короткие анимации |
+| 0x06 | 2 | int16 | IndexInFile08 | Индекс в анимации |
+| 0x08 | 30 | ushort[15] | Lod | Индексы сабмешей по LOD-уровням (0xFFFF = не используется) |
+
+**Ландшафт:** 256 тайлов в сетке 16×16. Каждый тайл имеет 2 LOD (индексы 0-255 и 256-511).
+
+---
+
+### Компонент 02 - Submeshes (Заголовок: 0x8C = 140 байт, Элемент: 0x44 = 68 байт)
+
+#### Заголовок (140 байт)
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 96 | Vector3[8] | BoundingBox | 8-точечный баундинг-бокс |
+| 0x60 | 12 | Vector3 | Center | Центральная точка |
+| 0x6C | 4 | float | CenterW | W-компонента |
+| 0x70 | 12 | Vector3 | Bottom | Нижняя точка |
+| 0x7C | 12 | Vector3 | Top | Верхняя точка |
+| 0x88 | 4 | float | XYRadius | Радиус в плоскости XY |
+
+#### Элемент (68 байт)
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 2 | ushort | StartIndexIn07 | **Модель:** Начальный индекс в Компоненте 07
**Ландшафт:** Начальный индекс треугольника в Компоненте 15 |
+| 0x02 | 2 | ushort | CountIn07 | **Модель:** Количество в Компоненте 07
**Ландшафт:** Количество треугольников |
+| 0x04 | 2 | ushort | StartOffsetIn0d | Начальное смещение в Компоненте 0D (только Модель) |
+| 0x06 | 2 | ushort | ByteLengthIn0D | Количество батчей в Компоненте 0D (только Модель) |
+| 0x08 | 12 | Vector3 | LocalMinimum | Минимум локального баундинг-бокса |
+| 0x14 | 12 | Vector3 | LocalMaximum | Максимум локального баундинг-бокса |
+| 0x20 | 12 | Vector3 | Center | Центр сабмеша |
+| 0x2C | 12 | Vector3 | Vector4 | Неизвестно |
+| 0x38 | 12 | Vector3 | Vector5 | Неизвестно |
+
+---
+
+### Компонент 03 - Vertices (0x0C = 12 байт)
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 4 | float | X | Координата X |
+| 0x04 | 4 | float | Y | Координата Y |
+| 0x08 | 4 | float | Z | Координата Z |
+
+---
+
+### Компонент 06 - Indices (2 байта) - Только Модель
+
+Массив `ushort` значений — индексы вершин треугольников.
+Используются группами по 3 для каждого треугольника. Ссылки через батчи Компонента 0D.
+
+---
+
+### Компонент 07 - Triangle Data (0x10 = 16 байт) - Только Модель
+
+Данные рендеринга на каждый треугольник.
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 2 | ushort | Flags | Флаги рендера |
+| 0x02 | 2 | ushort | Magic02 | Неизвестно |
+| 0x04 | 2 | ushort | Magic04 | Неизвестно |
+| 0x06 | 2 | ushort | Magic06 | Неизвестно |
+| 0x08 | 2 | int16 | OffsetX | Нормализованный X (÷32767 для -1..1) |
+| 0x0A | 2 | int16 | OffsetY | Нормализованный Y (÷32767 для -1..1) |
+| 0x0C | 2 | int16 | OffsetZ | Нормализованный Z (÷32767 для -1..1) |
+| 0x0E | 2 | ushort | Magic14 | Неизвестно |
+
+---
+
+### Компонент 0B - Material Data (4 байта) - Только Ландшафт
+
+Информация о материале/текстуре на каждый треугольник. Параллельный массив к Компоненту 15.
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 2 | ushort | HighWord | Индекс материала/текстуры |
+| 0x02 | 2 | ushort | LowWord | Индекс треугольника (последовательный) |
+
+---
+
+### Компонент 0D - Draw Batches (0x14 = 20 байт) - Только Модель
+
+Определяет батчи вызовов отрисовки.
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 2 | ushort | Flags | Флаги батча |
+| 0x02 | 2 | - | Padding | - |
+| 0x04 | 1 | byte | Magic04 | Неизвестно |
+| 0x05 | 1 | byte | Magic05 | Неизвестно |
+| 0x06 | 2 | ushort | Magic06 | Неизвестно |
+| 0x08 | 2 | ushort | CountOf06 | Количество индексов для отрисовки |
+| 0x0A | 4 | int32 | IndexInto06 | Начальный индекс в Компоненте 06 |
+| 0x0E | 2 | ushort | CountOf03 | Количество вершин |
+| 0x10 | 4 | int32 | IndexInto03 | Базовое смещение вершины в Компоненте 03 |
+
+---
+
+### Компонент 15 - Triangles (0x1C = 28 байт)
+
+Прямые определения треугольников. Используется и Моделью и Ландшафтом,
+но только Ландшафт использует их напрямую для рендеринга.
+
+| Смещение | Размер | Тип | Поле | Описание |
+|:--------:|:------:|:---:|------|----------|
+| 0x00 | 4 | uint32 | Flags | Флаги треугольника (0x20000 = коллизия) |
+| 0x04 | 4 | uint32 | Magic04 | Неизвестно (часто 0xFFFFFF01) |
+| 0x08 | 2 | ushort | Vertex1Index | Индекс первой вершины |
+| 0x0A | 2 | ushort | Vertex2Index | Индекс второй вершины |
+| 0x0C | 2 | ushort | Vertex3Index | Индекс третьей вершины |
+| 0x0E | 4 | uint32 | Magic0E | Неизвестно |
+| 0x12 | 4 | uint32 | Magic12 | Неизвестно |
+| 0x16 | 4 | uint32 | Magic16 | Неизвестно |
+| 0x1A | 2 | ushort | Magic1A | Неизвестно |
+
+---
+
+### Компонент 0A - External References (переменный размер)
+
+Таблица строк для внешних ссылок на части меша. Формат:
+
+```
+[4 байта: длина] [байты строки] [null-терминатор]
+...повтор...
+```
+
+Длина 0 означает пустую запись. Строки типа `"central"` имеют особое значение (flag |= 1).
+
+---
+
+## Пример: Ландшафт SC_1
+
+```
+Land.msh (SC_1):
+├── 01: 256 тайлов (сетка 16×16)
+├── 02: 512 сабмешей (256 LOD0 + 256 LOD1)
+├── 03: 10 530 вершин
+├── 04: 10 530 данных на вершину
+├── 05: 10 530 данных на вершину
+├── 0B: 7 882 записи материалов
+├── 0E: 10 530 данных на вершину
+├── 12: 10 530 микротекстурный маппинг
+└── 15: 7 882 треугольника
+ ├── LOD 0: 4 993 треугольника (тайлы 0-255 → сабмеши 0-255)
+ └── LOD 1: 2 889 треугольников (тайлы 0-255 → сабмеши 256-511)
+```
+
+---
+
+## Использование
+
+```csharp
+var converter = new MshConverter();
+
+// Автоопределение типа и конвертация в OBJ
+converter.Convert("Land.msh", "terrain.obj", lodLevel: 0);
+converter.Convert("robot.msh", "robot.obj", lodLevel: 0);
+
+// Ручное определение типа
+var archive = NResParser.ReadFile("mesh.msh").Archive;
+var type = MshConverter.DetectMeshType(archive);
+// Возвращает: MshType.Model или MshType.Landscape
+```
+
+---
+
+## Источники
+
+- Реверс-инжиниринг `Terrain.dll` (класс CLandscape)
+- Декомпиляция Ghidra: `CLandscape::ctor` и `IMesh2_of_CLandscape::Render`
diff --git a/ParkanPlayground/MshConverter.cs b/ParkanPlayground/MshConverter.cs
index 5d57b0f..943aa9f 100644
--- a/ParkanPlayground/MshConverter.cs
+++ b/ParkanPlayground/MshConverter.cs
@@ -4,123 +4,206 @@ using NResLib;
namespace ParkanPlayground;
+public enum MshType
+{
+ Unknown,
+ Model, // Has component 06 (indices), 0D (batches), 07
+ Landscape // Has component 0B (per-triangle material), uses 15 directly
+}
+
public class MshConverter
{
- public void Convert(string mshPath)
+ ///
+ /// Detects mesh type based on which components are present in the archive.
+ ///
+ public static MshType DetectMeshType(NResArchive archive)
+ {
+ bool hasComponent06 = archive.Files.Any(f => f.FileType == "06 00 00 00");
+ bool hasComponent0B = archive.Files.Any(f => f.FileType == "0B 00 00 00");
+ bool hasComponent0D = archive.Files.Any(f => f.FileType == "0D 00 00 00");
+
+ // Model: Uses indexed triangles via component 06 and batches via 0D
+ if (hasComponent06 && hasComponent0D)
+ return MshType.Model;
+
+ // Landscape: Uses direct triangles in component 15, with material data in 0B
+ if (hasComponent0B && !hasComponent06)
+ return MshType.Landscape;
+
+ return MshType.Unknown;
+ }
+
+ ///
+ /// Converts a .msh file to OBJ format, auto-detecting mesh type.
+ ///
+ /// Path to the .msh file
+ /// Output OBJ path (optional, defaults to input name + .obj)
+ /// LOD level to export (0 = highest detail)
+ public void Convert(string mshPath, string? outputPath = null, int lodLevel = 0)
{
var mshNresResult = NResParser.ReadFile(mshPath);
- var mshNres = mshNresResult.Archive!;
-
- using var mshFs = new FileStream(mshPath, FileMode.Open, FileAccess.Read, FileShare.Read);
-
- var component01 = Msh01.ReadComponent(mshFs, mshNres);
- var component02 = Msh02.ReadComponent(mshFs, mshNres);
- var component15 = Msh15.ReadComponent(mshFs, mshNres);
+ if (mshNresResult.Archive is null)
+ {
+ Console.WriteLine($"ERROR: Failed to read NRes archive: {mshNresResult.Error}");
+ return;
+ }
- var component0A = Msh0A.ReadComponent(mshFs, mshNres);
- var component07 = Msh07.ReadComponent(mshFs, mshNres);
- var component0D = Msh0D.ReadComponent(mshFs, mshNres);
+ var archive = mshNresResult.Archive;
+ var meshType = DetectMeshType(archive);
+
+ outputPath ??= Path.ChangeExtension(mshPath, ".obj");
+
+ Console.WriteLine($"Converting: {Path.GetFileName(mshPath)}");
+ Console.WriteLine($"Detected type: {meshType}");
+
+ using var fs = new FileStream(mshPath, FileMode.Open, FileAccess.Read, FileShare.Read);
+
+ switch (meshType)
+ {
+ case MshType.Model:
+ ConvertModel(fs, archive, outputPath, lodLevel);
+ break;
+ case MshType.Landscape:
+ ConvertLandscape(fs, archive, outputPath, lodLevel);
+ break;
+ default:
+ Console.WriteLine("ERROR: Unknown mesh type, cannot convert.");
+ break;
+ }
+ }
- // Triangle Vertex Indices
- var component06 = Msh06.ReadComponent(mshFs, mshNres);
+ ///
+ /// Converts a model mesh (robots, buildings, etc.) to OBJ.
+ /// Uses indexed triangles: 01 → 02 → 0D → 06 → 03
+ ///
+ private void ConvertModel(FileStream fs, NResArchive archive, string outputPath, int lodLevel)
+ {
+ var component01 = Msh01.ReadComponent(fs, archive);
+ var component02 = Msh02.ReadComponent(fs, archive);
+ var component03 = Msh03.ReadComponent(fs, archive);
+ var component06 = Msh06.ReadComponent(fs, archive);
+ var component07 = Msh07.ReadComponent(fs, archive);
+ var component0D = Msh0D.ReadComponent(fs, archive);
- // vertices
- var component03 = Msh03.ReadComponent(mshFs, mshNres);
-
- _ = 5;
-
- // --- Write OBJ ---
- using var sw = new StreamWriter("test.obj", false, new UTF8Encoding(false));
+ Console.WriteLine($"Vertices: {component03.Count}");
+ Console.WriteLine($"Pieces: {component01.Elements.Count}");
+ Console.WriteLine($"Submeshes: {component02.Elements.Count}");
+
+ using var sw = new StreamWriter(outputPath, false, new UTF8Encoding(false));
+ sw.WriteLine($"# Model mesh converted from {Path.GetFileName(outputPath)}");
+ sw.WriteLine($"# LOD level: {lodLevel}");
+ // Write all vertices
foreach (var v in component03)
- sw.WriteLine($"v {v.X:F8} {v.Y:F8} {v.Z:F8}");
+ sw.WriteLine($"v {v.X:F6} {v.Y:F6} {v.Z:F6}");
- var vertices = new List();
- var faces = new List<(int, int, int)>(); // store indices into vertices list
-
- // 01 - это части меша (Piece)
+ int exportedFaces = 0;
+
for (var pieceIndex = 0; pieceIndex < component01.Elements.Count; pieceIndex++)
{
- Console.WriteLine($"Piece {pieceIndex}");
- var piece01 = component01.Elements[pieceIndex];
- // var state = (piece.State00 == 0xffff) ? 0 : piece.State00;
+ var piece = component01.Elements[pieceIndex];
+
+ // Get submesh index for requested LOD
+ if (lodLevel >= piece.Lod.Length)
+ continue;
+
+ var submeshIdx = piece.Lod[lodLevel];
+ if (submeshIdx == 0xFFFF || submeshIdx >= component02.Elements.Count)
+ continue;
- for (var lodIndex = 0; lodIndex < piece01.Lod.Length; lodIndex++)
+ sw.WriteLine($"g piece_{pieceIndex}");
+
+ var submesh = component02.Elements[submeshIdx];
+ var batchStart = submesh.StartOffsetIn0d;
+ var batchCount = submesh.ByteLengthIn0D;
+
+ for (var batchIdx = 0; batchIdx < batchCount; batchIdx++)
{
- var lod = piece01.Lod[lodIndex];
- if (lod == 0xffff)
+ var batch = component0D[batchStart + batchIdx];
+ var baseVertex = batch.IndexInto03;
+ var indexStart = batch.IndexInto06;
+ var indexCount = batch.CountOf06;
+
+ for (int i = 0; i < indexCount; i += 3)
{
- // Console.WriteLine($"Piece {pieceIndex} has lod -1 at {lodIndex}. Skipping");
- continue;
- }
+ var i1 = baseVertex + component06[indexStart + i];
+ var i2 = baseVertex + component06[indexStart + i + 1];
+ var i3 = baseVertex + component06[indexStart + i + 2];
- sw.WriteLine($"o piece_{pieceIndex}_lod_{lodIndex}");
- // 02 - Submesh
- var part02 = component02.Elements[lod];
-
- int indexInto07 = part02.StartIndexIn07;
- var comp07 = component07[indexInto07];
- Console.WriteLine($"Lod {lodIndex}");
- Console.WriteLine($"Comp07: {comp07.OffsetX}, {comp07.OffsetY}, {comp07.OffsetZ}");
-
- var element0Dstart = part02.StartOffsetIn0d;
- var element0Dcount = part02.ByteLengthIn0D;
-
- // Console.WriteLine($"Started piece {pieceIndex}. LOD={lod}. 0D start={element0Dstart}, count={element0Dcount}");
-
- for (var comp0Dindex = 0; comp0Dindex < element0Dcount; comp0Dindex++)
- {
- var element0D = component0D[element0Dstart + comp0Dindex];
-
- var indexInto03 = element0D.IndexInto03;
- var indexInto06 = element0D.IndexInto06; // indices
-
- uint maxIndex = element0D.CountOf03;
- uint indicesCount = element0D.CountOf06;
-
-
- // Convert IndexInto06 to ushort array index (3 ushorts per triangle)
- // Console.WriteLine($"Processing 0D element[{element0Dstart + comp0Dindex}]. IndexInto03={indexInto03}, IndexInto06={indexInto06}. Number of triangles={indicesCount}");
-
- if (indicesCount != 0)
- {
- // sw.WriteLine($"o piece_{pieceIndex}_of_mesh_{comp0Dindex}");
-
- for (int ind = 0; ind < indicesCount; ind += 3)
- {
- // Each triangle uses 3 consecutive ushorts in component06
-
- // sw.WriteLine($"o piece_{pieceIndex}_of_mesh_{comp0Dindex}_tri_{ind}");
-
-
- var i1 = indexInto03 + component06[indexInto06];
- var i2 = indexInto03 + component06[indexInto06 + 1];
- var i3 = indexInto03 + component06[indexInto06 + 2];
-
- var v1 = component03[i1];
- var v2 = component03[i2];
- var v3 = component03[i3];
-
- sw.WriteLine($"f {i1 + 1} {i2 + 1} {i3 + 1}");
-
- // push vertices to global list
- vertices.Add(v1);
- vertices.Add(v2);
- vertices.Add(v3);
-
- int baseIndex = vertices.Count;
- // record face (OBJ is 1-based indexing!)
- faces.Add((baseIndex - 2, baseIndex - 1, baseIndex));
-
- indexInto07++;
- indexInto06 += 3; // step by 3 since each triangle uses 3 ushorts
- }
-
- _ = 5;
- }
+ sw.WriteLine($"f {i1 + 1} {i2 + 1} {i3 + 1}");
+ exportedFaces++;
}
}
}
+
+ Console.WriteLine($"Exported: {component03.Count} vertices, {exportedFaces} faces");
+ Console.WriteLine($"Output: {outputPath}");
+ }
+
+ ///
+ /// Converts a landscape mesh (terrain) to OBJ.
+ /// Uses direct triangles: 01 → 02 → 15 (via StartIndexIn07/CountIn07)
+ ///
+ private void ConvertLandscape(FileStream fs, NResArchive archive, string outputPath, int lodLevel)
+ {
+ var component01 = Msh01.ReadComponent(fs, archive);
+ var component02 = Msh02.ReadComponent(fs, archive);
+ var component03 = Msh03.ReadComponent(fs, archive);
+ var component15 = Msh15.ReadComponent(fs, archive);
+
+ Console.WriteLine($"Vertices: {component03.Count}");
+ Console.WriteLine($"Triangles: {component15.Count}");
+ Console.WriteLine($"Tiles: {component01.Elements.Count}");
+ Console.WriteLine($"Submeshes: {component02.Elements.Count}");
+
+ using var sw = new StreamWriter(outputPath, false, new UTF8Encoding(false));
+ sw.WriteLine($"# Landscape mesh converted from {Path.GetFileName(outputPath)}");
+ sw.WriteLine($"# LOD level: {lodLevel}");
+ sw.WriteLine($"# Tile grid: {(int)Math.Sqrt(component01.Elements.Count)}x{(int)Math.Sqrt(component01.Elements.Count)}");
+
+ // Write all vertices
+ foreach (var v in component03)
+ sw.WriteLine($"v {v.X:F6} {v.Y:F6} {v.Z:F6}");
+
+ int exportedFaces = 0;
+
+ for (var tileIdx = 0; tileIdx < component01.Elements.Count; tileIdx++)
+ {
+ var tile = component01.Elements[tileIdx];
+
+ // Get submesh index for requested LOD
+ if (lodLevel >= tile.Lod.Length)
+ continue;
+
+ var submeshIdx = tile.Lod[lodLevel];
+ if (submeshIdx == 0xFFFF || submeshIdx >= component02.Elements.Count)
+ continue;
+
+ sw.WriteLine($"g tile_{tileIdx}");
+
+ var submesh = component02.Elements[submeshIdx];
+
+ // For landscape, StartIndexIn07 = triangle start index, CountIn07 = triangle count
+ var triangleStart = submesh.StartIndexIn07;
+ var triangleCount = submesh.CountIn07;
+
+ for (var triOffset = 0; triOffset < triangleCount; triOffset++)
+ {
+ var triIdx = triangleStart + triOffset;
+ if (triIdx >= component15.Count)
+ {
+ Console.WriteLine($"WARNING: Triangle index {triIdx} out of range for tile {tileIdx}");
+ continue;
+ }
+
+ var tri = component15[triIdx];
+ sw.WriteLine($"f {tri.Vertex1Index + 1} {tri.Vertex2Index + 1} {tri.Vertex3Index + 1}");
+ exportedFaces++;
+ }
+ }
+
+ Console.WriteLine($"Exported: {component03.Count} vertices, {exportedFaces} faces");
+ Console.WriteLine($"Output: {outputPath}");
}
public record Face(Vector3 P1, Vector3 P2, Vector3 P3);
diff --git a/ParkanPlayground/Program.cs b/ParkanPlayground/Program.cs
new file mode 100644
index 0000000..c2ed923
--- /dev/null
+++ b/ParkanPlayground/Program.cs
@@ -0,0 +1,33 @@
+using ParkanPlayground;
+
+// ========== MSH CONVERTER TEST - AUTO-DETECTING MODEL VS LANDSCAPE ==========
+
+var converter = new MshConverter();
+
+// Test with landscape
+Console.WriteLine("=".PadRight(60, '='));
+converter.Convert(
+ @"C:\Program Files (x86)\Nikita\Iron Strategy\DATA\MAPS\SC_1\Land.msh",
+ "landscape_lod0.obj",
+ lodLevel: 0
+);
+
+Console.WriteLine();
+
+// Test with landscape LOD 1 (lower detail)
+Console.WriteLine("=".PadRight(60, '='));
+converter.Convert(
+ @"C:\Program Files (x86)\Nikita\Iron Strategy\DATA\MAPS\SC_1\Land.msh",
+ "landscape_lod1.obj",
+ lodLevel: 1
+);
+
+Console.WriteLine();
+
+// Test with model
+Console.WriteLine("=".PadRight(60, '='));
+converter.Convert(
+ @"E:\ParkanUnpacked\fortif.rlb\133_fr_m_bunker.msh",
+ "bunker_lod0.obj",
+ lodLevel: 0
+);
\ No newline at end of file
diff --git a/ParkanPlayground/from_ghidra/BoundingBox_typedef.c b/ParkanPlayground/from_ghidra/BoundingBox_typedef.c
new file mode 100644
index 0000000..69fc80f
--- /dev/null
+++ b/ParkanPlayground/from_ghidra/BoundingBox_typedef.c
@@ -0,0 +1,10 @@
+typedef struct BoundingBox {
+ Vector3 BottomFrontLeft;
+ Vector3 BottomFrontRight;
+ Vector3 BottomBackRight;
+ Vector3 BottomBackLeft;
+ Vector3 TopBackRight;
+ Vector3 TopFrontRight;
+ Vector3 TopBackLeft;
+ Vector3 TopFrontLeft;
+} BoundingBox;
\ No newline at end of file
diff --git a/ParkanPlayground/from_ghidra/CLandscape_ctor.c b/ParkanPlayground/from_ghidra/CLandscape_ctor.c
new file mode 100644
index 0000000..e7366c6
--- /dev/null
+++ b/ParkanPlayground/from_ghidra/CLandscape_ctor.c
@@ -0,0 +1,2481 @@
+// Decompiled C Code:
+
+/* WARNING: Enum "DRAW_PRIMITIVE_FLAGS": Some values do not have unique names */
+
+CLandscape * __thiscall
+CLandscape::ctor(CLandscape *this,LPCSTR materialConfigName,char *landscapeBaseName,
+ IComponent **owner)
+
+{
+ CGameObject *pCVar1;
+ BoundingBox *pBVar2;
+ char cVar3;
+ float fVar4;
+ float fVar5;
+ float fVar6;
+ ushort uVar7;
+ int (*paiVar8) [5];
+ undefined4 *puVar9;
+ char *mem;
+ ushort *mem_00;
+ I3DRender **ppIVar10;
+ I3DSound **ppIVar11;
+ ISoundPool **ppIVar12;
+ IMatManager **ppIVar13;
+ undefined4 uVar14;
+ ILightManager **ppIVar15;
+ IComponent **ppIVar16;
+ BOOL BVar17;
+ SystemArealMap *this_00;
+ INResFile **ppIVar18;
+ nres_metadata_item *pnVar19;
+ Vector3 *pVVar20;
+ MSH_15_element *pMVar21;
+ MSH_02_file *pMVar22;
+ MshMetaForLandscape *pMVar23;
+ MSH_15_element *puVar20;
+ int *piVar24;
+ int *piVar25;
+ undefined4 *puVar26;
+ CShade *pCVar27;
+ int iVar28;
+ uint uVar29;
+ uint uVar30;
+ Vector3 *pfVar29;
+ int iVar31;
+ byte (*data_ptr) [212];
+ char *pcVar32;
+ Vector3 *pVVar33;
+ BoundingBox *pfVar35;
+ Vector3 *pfVar34;
+ float fVar34;
+ char *pcVar35;
+ ushort *puVar36;
+ ushort *puVar37;
+ char *pcVar38;
+ BoundingBox *pBVar39;
+ Vector3 *pfVar40;
+ undefined4 *puVar40;
+ byte *pbVar41;
+ uint uStack_1ec;
+ int iStack_1e4;
+ BoundingBox fStack_1e0;
+ Vector3 VStack_178;
+ Vector3 VStack_16c;
+ Vector3 VStack_160;
+ Vector3 VStack_154;
+ Vector3 VStack_148;
+ Vector3 VStack_13c;
+ float fStack_130;
+ float fStack_12c;
+ float fStack_128;
+ float fStack_124;
+ float fStack_120;
+ float fStack_11c;
+ float fStack_118;
+ float fStack_114;
+ float fStack_110;
+ Vector3 fStack_10c;
+ Vector3 fStack_f4;
+ Vector3 fStack_e8;
+ Vector3 fStack_d8;
+ Vector3 VStack_78;
+ Vector3 VStack_6c;
+ Vector3 VStack_60;
+ Vector3 VStack_54;
+ Vector3 VStack_48;
+ Vector3 VStack_3c;
+ Vector3 VStack_30;
+ Vector3 VStack_24;
+ StackException exception2;
+ StackException exception;
+
+ exception.Offset = -1;
+ exception.Handler = (undefined4 *)&LAB_1006320e;
+ exception.ExceptionList = (undefined4 *)ExceptionList;
+ ExceptionList = &exception;
+ this->IComponent = (IComponent *)&PTR_pure_virtual_100655d0;
+ CGameObject::ctor(&this->game_object,owner);
+ this->ITerrain = (ITerrain *)&PTR_pure_virtual_100655a0;
+ this->IMesh2 = (IMesh2 *)&PTR_pure_virtual_10065560;
+ this->I0x1 = (I0x1 *)&PTR_pure_virtual_1006552c;
+ this->IControl = (IControl *)&PTR_pure_virtual_100654d8;
+ this->IUnknown_0x22 = (I0x22 *)&PTR_pure_virtual_100654c8;
+ exception.Offset = 0;
+ this->field104_0x1e8 = 0;
+ this->field105_0x1ec = -2;
+ paiVar8 = this->field115_0x214;
+ iVar28 = 3;
+ do {
+ (*paiVar8)[0] = 0;
+ (*paiVar8)[1] = -2;
+ (*paiVar8)[2] = -1;
+ (*paiVar8)[3] = -1;
+ (*paiVar8)[4] = -1;
+ paiVar8 = paiVar8 + 1;
+ iVar28 = iVar28 + -1;
+ } while (iVar28 != 0);
+ puVar9 = (undefined4 *)operator_new(8000);
+ (this->array_0x278).data = puVar9;
+ (this->array_0x278).capacity = 1000;
+ (this->array_0x278).count = 0;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,1);
+ data_ptr = this->unk_obj_array_elemsize_212;
+ uStack_1ec = 100;
+ do {
+ vector_initializer(data_ptr,0xc,8,move_to_eax_return);
+ data_ptr = data_ptr + 1;
+ uStack_1ec = uStack_1ec + -1;
+ } while (uStack_1ec != 0);
+ puVar9 = (undefined4 *)operator_new(400);
+ (this->array_0x7a40).data = puVar9;
+ (this->array_0x7a40).capacity = 100;
+ (this->array_0x7a40).count = 0;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,2);
+ puVar9 = (undefined4 *)operator_new(4000);
+ (this->array_0x7c00).data = puVar9;
+ (this->array_0x7c00).capacity = 1000;
+ (this->array_0x7c00).count = 0;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,3);
+ puVar9 = (undefined4 *)operator_new(400);
+ (this->array_0x7c0c).data = puVar9;
+ (this->array_0x7c0c).capacity = 100;
+ (this->array_0x7c0c).count = 0;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,4);
+ puVar9 = (undefined4 *)operator_new(400);
+ (this->array_0x7c2c).data = puVar9;
+ (this->array_0x7c2c).capacity = 100;
+ (this->array_0x7c2c).count = 0;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,5);
+ puVar9 = (undefined4 *)operator_new(0xa0);
+ (this->array_0x7c84).data = puVar9;
+ (this->array_0x7c84).capacity = 0x28;
+ (this->array_0x7c84).count = 0;
+ (this->m_CollisionContext).logicID = Landscape;
+ (this->m_CollisionContext).GameObjectID = 0;
+ (this->m_CollisionContext).field2_0x8 = 0;
+ (this->m_CollisionContext).field3_0xc = 0;
+ (this->m_CollisionContext).field4_0x10 = 0;
+ (this->m_CollisionContext).field5_0x14 = 0;
+ (this->m_CollisionContext).mSweptSphere.position.z = 0.0;
+ (this->m_CollisionContext).mSweptSphere.position.y = 0.0;
+ (this->m_CollisionContext).mSweptSphere.position.x = 0.0;
+ (this->m_CollisionContext).mSweptSphere.targetPosition.z = 0.0;
+ (this->m_CollisionContext).mSweptSphere.targetPosition.y = 0.0;
+ (this->m_CollisionContext).mSweptSphere.targetPosition.x = 0.0;
+ (this->m_CollisionContext).mSweptSphere.radius = -1.0;
+ (this->m_CollisionContext).pSweptSphere2 = (SweptSphere *)0x0;
+ (this->m_CollisionContext).ResolvedIMesh2 = (IMesh2 **)0x0;
+ (this->m_CollisionContext).I0x25 = (void **)0x0;
+ (this->m_CollisionContext).ResolvedICollManager = (ICollManager **)0x0;
+ this->IComponent = &IComponent_of_CLandscape;
+ (this->game_object).vptr = &IGameObject_of_CLandscape;
+ this->ITerrain = &ITerrain_of_CLandscape;
+ this->IMesh2 = &IMesh2_of_CLandscape;
+ this->I0x1 = &I0x1_of_CLandscape;
+ this->IControl = &IControl_1006536c;
+ this->IUnknown_0x22 = &I0x22_1006535c;
+ this->IComponent_owner = owner;
+ uVar29 = 0xffffffff;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,6);
+ pcVar32 = landscapeBaseName;
+ do {
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ } while (cVar3 != '\0');
+ pBVar2 = &this->bounding_box;
+ fStack_1e0.TopBackLeft.y = (float)operator_new(~uVar29 + 4);
+ uVar29 = 0xffffffff;
+ pcVar32 = landscapeBaseName;
+ do {
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ } while (cVar3 != '\0');
+ fStack_1e0.TopBackLeft.x = (float)operator_new(~uVar29 + 5);
+ uVar29 = 0xffffffff;
+ pcVar32 = landscapeBaseName;
+ do {
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ } while (cVar3 != '\0');
+ mem = (char *)operator_new(~uVar29 + 5);
+ uVar29 = 0xffffffff;
+ pcVar32 = landscapeBaseName;
+ do {
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ } while (cVar3 != '\0');
+ mem_00 = (ushort *)operator_new(~uVar29 + 4);
+ uVar29 = 0xffffffff;
+ pcVar32 = landscapeBaseName;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = (char *)fStack_1e0.TopBackLeft.y;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ uVar29 = 0xffffffff;
+ pcVar32 = s__msh_1006bfb4;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ iVar28 = -1;
+ pcVar32 = (char *)fStack_1e0.TopBackLeft.y;
+ do {
+ pcVar35 = pcVar32;
+ if (iVar28 == 0) break;
+ iVar28 = iVar28 + -1;
+ pcVar35 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar35;
+ } while (cVar3 != '\0');
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = pcVar35 + -1;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ uVar29 = 0xffffffff;
+ pcVar32 = landscapeBaseName;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = (char *)fStack_1e0.TopBackLeft.x;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ uVar29 = 0xffffffff;
+ pcVar32 = s_1_wea_1006bfac;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ iVar28 = -1;
+ pcVar32 = (char *)fStack_1e0.TopBackLeft.x;
+ do {
+ pcVar35 = pcVar32;
+ if (iVar28 == 0) break;
+ iVar28 = iVar28 + -1;
+ pcVar35 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar35;
+ } while (cVar3 != '\0');
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = pcVar35 + -1;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ uVar29 = 0xffffffff;
+ pcVar32 = landscapeBaseName;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = mem;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ uVar29 = 0xffffffff;
+ pcVar32 = s_2_wea_1006bfa4;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ iVar28 = -1;
+ pcVar32 = mem;
+ do {
+ pcVar35 = pcVar32;
+ if (iVar28 == 0) break;
+ iVar28 = iVar28 + -1;
+ pcVar35 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar35;
+ } while (cVar3 != '\0');
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = pcVar35 + -1;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ uVar29 = 0xffffffff;
+ do {
+ pcVar32 = landscapeBaseName;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar32 = landscapeBaseName + 1;
+ cVar3 = *landscapeBaseName;
+ landscapeBaseName = pcVar32;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ pcVar32 = pcVar32 + -uVar29;
+ puVar36 = mem_00;
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)puVar36 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ puVar36 = puVar36 + 2;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *(char *)puVar36 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ puVar36 = (ushort *)((int)puVar36 + 1);
+ }
+ uVar29 = 0xffffffff;
+ pcVar32 = s__map_1006bf9c;
+ do {
+ pcVar38 = pcVar32;
+ if (uVar29 == 0) break;
+ uVar29 = uVar29 - 1;
+ pcVar38 = pcVar32 + 1;
+ cVar3 = *pcVar32;
+ pcVar32 = pcVar38;
+ } while (cVar3 != '\0');
+ uVar29 = ~uVar29;
+ iVar28 = -1;
+ puVar36 = mem_00;
+ do {
+ puVar37 = puVar36;
+ if (iVar28 == 0) break;
+ iVar28 = iVar28 + -1;
+ puVar37 = (ushort *)((int)puVar36 + 1);
+ uVar7 = *puVar36;
+ puVar36 = puVar37;
+ } while ((char)uVar7 != '\0');
+ pcVar32 = pcVar38 + -uVar29;
+ pcVar38 = (char *)((int)puVar37 + -1);
+ for (uVar30 = uVar29 >> 2; uVar30 != 0; uVar30 = uVar30 - 1) {
+ *(undefined4 *)pcVar38 = *(undefined4 *)pcVar32;
+ pcVar32 = pcVar32 + 4;
+ pcVar38 = pcVar38 + 4;
+ }
+ for (uVar29 = uVar29 & 3; uVar29 != 0; uVar29 = uVar29 - 1) {
+ *pcVar38 = *pcVar32;
+ pcVar32 = pcVar32 + 1;
+ pcVar38 = pcVar38 + 1;
+ }
+ ppIVar10 = niGet3DRender();
+ this->I3DRender__ = ppIVar10;
+ if (ppIVar10 == (I3DRender **)0x0) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_3D_Render_was_not_initialized_1006bf7c);
+ }
+ ppIVar11 = niGet3DSound();
+ this->I3DSound = ppIVar11;
+ if (ppIVar11 == (I3DSound **)0x0) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_3D_Sound_was_not_initialized_1006bf40);
+ }
+ pCVar1 = &this->game_object;
+ ppIVar12 = (ISoundPool **)
+ (*(*this->I3DSound)->CreateSoundPool)
+ ((int *)this->I3DSound,0,0,-(uint)(this != (CLandscape *)0x0) & (uint)pCVar1)
+ ;
+ this->ISoundPool = ppIVar12;
+ if (this->I3DRender__ != 0) {
+ ppIVar13 = LoadMatManager(materialConfigName,(LPCSTR)fStack_1e0.TopBackLeft.x,
+ (IComponent **)(-(uint)(this != (CLandscape *)0x0) & (uint)pCVar1));
+ this->IMatManager = ppIVar13;
+ uVar14 = (*(code *)(*ppIVar13)->LoadWear)(ppIVar13,materialConfigName,mem);
+ this->wear_ptr = uVar14;
+ }
+ ppIVar15 = CreateLightManager(0,(undefined4 *)0x0,
+ (IComponent **)(-(uint)(this != (CLandscape *)0x0) & (uint)pCVar1));
+ this->ILightManager_owned = ppIVar15;
+ ppIVar16 = CreateCollManager((IComponent **)(-(uint)(this != (CLandscape *)0x0) & (uint)pCVar1));
+ BVar17 = (*(*ppIVar16)->QueryInterface)(ppIVar16,ICollManager,&this->ResolvedICollManager);
+ if (BVar17 == 0) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_obtain_ICollManager_in_1006bf18);
+ }
+ ppIVar16 = CreateFxManager(0,0,(IComponent **)(-(uint)(this != (CLandscape *)0x0) & (uint)pCVar1))
+ ;
+ BVar17 = (*(*ppIVar16)->QueryInterface)(ppIVar16,IEffectManager,&this->ResolvedIEffectManager);
+ if (BVar17 == 0) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_obtain_IEffectManager_i_1006beec);
+ }
+ this_00 = CreateSystemArealMap
+ (0,mem_00,(void *)(-(uint)(this != (CLandscape *)0x0) & (uint)pCVar1));
+ BVar17 = (*(this_00->ISystemArealMap->IComponent).QueryInterface)
+ (this_00,ISystemArealMap,&this->ResolvedISystemArealMap);
+ if (BVar17 == 0) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_obtain_ISystemArealMap_1006bec0);
+ }
+ ppIVar18 = niOpenResFile((LPCSTR)fStack_1e0.TopBackLeft.y);
+ this->INResFile = ppIVar18;
+ if (ppIVar18 == (INResFile **)0x0) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_library_1006bea8);
+ }
+ pnVar19 = (*(*this->INResFile)->get_metadata_ptr)(this->INResFile);
+ this->_count_unk_obj_array_elemsize_212 = 1;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,3);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ this->vertices_count = pnVar19[iVar28].element_count_or_version;
+ /* сначала читается тип файла, потом страйд */
+ pVVar20 = (Vector3 *)(*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_3_vertices_data_ptr = pVVar20;
+ this->_3_vertices_stride = 0xc;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,4);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ puVar9 = (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_4_data_ptr = puVar9;
+ this->_4_stride = 4;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,5);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ puVar9 = (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_5_data_ptr = puVar9;
+ this->_5_stride = 4;
+ this->_2_microtexture_mapping_data_ptr = 0;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,0x12);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_find_microtexture_mapp_1006be68);
+ }
+ puVar9 = (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_2_microtexture_mapping_data_ptr = puVar9;
+ this->_2_microtexture_mapping_stride = 4;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,0xe);
+ if (iVar28 == -1) {
+ this->_e_data_ptr = 0;
+ }
+ else {
+ puVar9 = (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_e_data_ptr = puVar9;
+ this->_e_stride = 4;
+ }
+ this->field138_0x2a4 = 0;
+ this->field143_0x2ac = 0;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,0x15);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ this->_5_element_count = pnVar19[iVar28].element_count_or_version;
+ pMVar21 = (MSH_15_element *)
+ (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_5_data_ptr = pMVar21;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,2);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ pMVar22 = (MSH_02_file *)
+ (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,0);
+ this->msh_02_data_ptr = pMVar22;
+ pMVar23 = (MshMetaForLandscape *)operator_new(0x28);
+ this->mshmeta_ptr = pMVar23;
+ pMVar22 = this->msh_02_data_ptr;
+ pBVar39 = &this->bounding_box_from_msh_02;
+ for (iVar28 = 0x18; iVar28 != 0; iVar28 = iVar28 + -1) {
+ (pBVar39->BottomFrontLeft).x = (pMVar22->header).bounding_box.BottomFrontLeft.x;
+ pMVar22 = (MSH_02_file *)&(pMVar22->header).bounding_box.BottomFrontLeft.y;
+ pBVar39 = (BoundingBox *)&(pBVar39->BottomFrontLeft).y;
+ }
+ this->mshmeta_ptr->min_x = (this->msh_02_data_ptr->header).bounding_box.BottomFrontLeft.x;
+ this->mshmeta_ptr->min_y = (this->msh_02_data_ptr->header).bounding_box.BottomFrontLeft.y;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,1);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ puVar9 = (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,0);
+ this->_1_data_ptr = puVar9;
+ this->mshmeta_ptr->_1_element_count = pnVar19[iVar28].element_count_or_version;
+ this->mshmeta_ptr->_1_magic1 = pnVar19[iVar28].magic1;
+ pMVar23 = this->mshmeta_ptr;
+ pMVar23->_1_element_count_magic1 = pMVar23->_1_element_count / pMVar23->_1_magic1;
+ pMVar22 = this->msh_02_data_ptr;
+ pVVar33 = &pMVar22->elements[0].local_minimum;
+ pVVar20 = Vector3::ctor(&VStack_148,pVVar33->x,pMVar22->elements[0].local_minimum.y,
+ pMVar22->elements[0].local_minimum.z);
+ fVar34 = pVVar20->x;
+ fVar4 = pVVar20->y;
+ Vector3::ctor(&VStack_13c,pMVar22->elements[0].local_maximum.x,
+ pMVar22->elements[0].local_minimum.y,pMVar22->elements[0].local_minimum.z);
+ Vector3::ctor(&VStack_154,pMVar22->elements[0].local_maximum.x,
+ pMVar22->elements[0].local_maximum.y,pMVar22->elements[0].local_minimum.z);
+ pVVar20 = Vector3::ctor(&VStack_16c,pMVar22->elements[0].local_maximum.x,
+ pMVar22->elements[0].local_maximum.y,pMVar22->elements[0].local_maximum.z)
+ ;
+ fVar5 = pVVar20->x;
+ fVar6 = pVVar20->y;
+ Vector3::ctor((Vector3 *)&fStack_1e0.TopFrontLeft.z,pVVar33->x,
+ pMVar22->elements[0].local_maximum.y,pMVar22->elements[0].local_maximum.z);
+ Vector3::ctor(&VStack_160,pVVar33->x,pMVar22->elements[0].local_minimum.y,
+ pMVar22->elements[0].local_maximum.z);
+ Vector3::ctor((Vector3 *)&fStack_1e0.TopBackLeft.z,pVVar33->x,pMVar22->elements[0].local_maximum.y
+ ,pMVar22->elements[0].local_minimum.z);
+ Vector3::ctor(&VStack_178,pMVar22->elements[0].local_maximum.x,
+ pMVar22->elements[0].local_minimum.y,pMVar22->elements[0].local_maximum.z);
+ this->mshmeta_ptr->width = fVar5 - fVar34;
+ this->mshmeta_ptr->height = fVar6 - fVar4;
+ this->mshmeta_ptr->inv_width = FLOAT_1006516c / this->mshmeta_ptr->width;
+ this->mshmeta_ptr->inv_height = FLOAT_1006516c / this->mshmeta_ptr->height;
+ iVar28 = (*(*this->INResFile)->find_index_of_type)(this->INResFile,0xb);
+ if (iVar28 == -1) {
+ /* WARNING: Subroutine does not return */
+ print_error_and_die(s_TERRAIN_DLL_1006b3f4,s_CLandscape__CLandscape___1006bf60,
+ s_Unable_to_open_file_1006be94);
+ }
+ puVar9 = (*(*this->INResFile)->get_item_data_ptr_by_index)(this->INResFile,iVar28,1);
+ this->_b_data_ptr = puVar9;
+ operator_delete((void *)fStack_1e0.TopBackLeft.y);
+ operator_delete((void *)fStack_1e0.TopBackLeft.x);
+ operator_delete(mem);
+ operator_delete(mem_00);
+ (this->m_CollisionContext).extraArg = (void **)0xbf800000;
+ uVar29 = 0;
+ if (this->_5_element_count != 0) {
+ pMVar21 = this->_5_data_ptr;
+ do {
+ if ((pMVar21->flags & 0x20000) != 0) {
+ (this->m_CollisionContext).extraArg =
+ *(void ***)
+ ((int)&this->_3_vertices_data_ptr->z +
+ (uint)pMVar21->vertex1_idx * this->_3_vertices_stride);
+ break;
+ }
+ uVar29 = uVar29 + 1;
+ pMVar21 = pMVar21 + 1;
+ } while (uVar29 < this->_5_element_count);
+ }
+ pfVar35 = &g_bounding_box;
+ pBVar39 = pBVar2;
+ for (iVar28 = 0x18; iVar28 != 0; iVar28 = iVar28 + -1) {
+ (pBVar39->BottomFrontLeft).x = (pfVar35->BottomFrontLeft).x;
+ pfVar35 = (BoundingBox *)&(pfVar35->BottomFrontLeft).y;
+ pBVar39 = (BoundingBox *)&(pBVar39->BottomFrontLeft).y;
+ }
+ uStack_1ec = 0;
+ if (this->_5_element_count != 0) {
+ iStack_1e4 = 0;
+ do {
+ puVar20 = (MSH_15_element *)((int)&this->_5_data_ptr->flags + iStack_1e4);
+ if ((puVar20->flags & 0x20000) != 0) {
+ iVar28 = this->_3_vertices_stride;
+ pfVar29 = (Vector3 *)
+ ((int)&this->_3_vertices_data_ptr->x + (uint)puVar20->vertex1_idx * iVar28);
+ pfVar34 = (Vector3 *)
+ ((int)&this->_3_vertices_data_ptr->x + (uint)puVar20->vertex2_idx * iVar28);
+ pfVar40 = (Vector3 *)
+ ((int)&this->_3_vertices_data_ptr->x + (uint)puVar20->vertex3_idx * iVar28);
+ fStack_1e0.BottomFrontLeft.x = (pBVar2->BottomFrontLeft).x;
+ fStack_1e0.BottomFrontLeft.y = (this->bounding_box).BottomFrontLeft.y;
+ fStack_1e0.BottomFrontLeft.z = (this->bounding_box).BottomFrontLeft.z;
+ fStack_1e0.BottomBackRight.x = (this->bounding_box).TopFrontLeft.x;
+ fStack_1e0.BottomBackRight.y = (this->bounding_box).TopFrontLeft.y;
+ fStack_1e0.BottomBackRight.z = (this->bounding_box).TopFrontLeft.z;
+ if (pfVar29->x < fStack_1e0.BottomFrontLeft.x) {
+ fStack_1e0.BottomFrontLeft.x = pfVar29->x;
+ }
+ if (pfVar29->y < fStack_1e0.BottomFrontLeft.y) {
+ fStack_1e0.BottomFrontLeft.y = pfVar29->y;
+ }
+ if (pfVar29->z < fStack_1e0.BottomFrontLeft.z) {
+ fStack_1e0.BottomFrontLeft.z = pfVar29->z;
+ }
+ if (fStack_1e0.BottomBackRight.x < pfVar29->x) {
+ fStack_1e0.BottomBackRight.x = pfVar29->x;
+ }
+ if (fStack_1e0.BottomBackRight.y < pfVar29->y) {
+ fStack_1e0.BottomBackRight.y = pfVar29->y;
+ }
+ if (fStack_1e0.BottomBackRight.z < pfVar29->z) {
+ fStack_1e0.BottomBackRight.z = pfVar29->z;
+ }
+ fStack_10c.x = fStack_1e0.BottomBackRight.x;
+ fStack_10c.y = fStack_1e0.BottomBackRight.y;
+ fStack_10c.z = fStack_1e0.BottomFrontLeft.z;
+ (pBVar2->BottomFrontLeft).x = fStack_1e0.BottomFrontLeft.x;
+ (this->bounding_box).BottomFrontLeft.y = fStack_1e0.BottomFrontLeft.y;
+ (this->bounding_box).BottomFrontLeft.z = fStack_1e0.BottomFrontLeft.z;
+ (this->bounding_box).BottomFrontRight.x = fStack_1e0.BottomBackRight.x;
+ (this->bounding_box).BottomFrontRight.y = fStack_1e0.BottomFrontLeft.y;
+ (this->bounding_box).BottomFrontRight.z = fStack_1e0.BottomFrontLeft.z;
+ (this->bounding_box).BottomBackRight.x = fStack_1e0.BottomBackRight.x;
+ (this->bounding_box).BottomBackRight.y = fStack_1e0.BottomBackRight.y;
+ fStack_124 = fStack_1e0.BottomFrontLeft.x;
+ (this->bounding_box).BottomBackRight.z = fStack_1e0.BottomFrontLeft.z;
+ (this->bounding_box).TopFrontLeft.x = fStack_1e0.BottomBackRight.x;
+ fStack_120 = fStack_1e0.BottomBackRight.y;
+ (this->bounding_box).TopFrontLeft.y = fStack_1e0.BottomBackRight.y;
+ (this->bounding_box).TopFrontLeft.z = fStack_1e0.BottomBackRight.z;
+ (this->bounding_box).TopBackRight.x = fStack_1e0.BottomFrontLeft.x;
+ fStack_11c = fStack_1e0.BottomBackRight.z;
+ (this->bounding_box).TopBackRight.y = fStack_1e0.BottomBackRight.y;
+ (this->bounding_box).TopBackRight.z = fStack_1e0.BottomBackRight.z;
+ fStack_118 = fStack_1e0.BottomFrontLeft.x;
+ fStack_114 = fStack_1e0.BottomFrontLeft.y;
+ (this->bounding_box).TopFrontRight.x = fStack_1e0.BottomFrontLeft.x;
+ fStack_110 = fStack_1e0.BottomBackRight.z;
+ (this->bounding_box).TopFrontRight.y = fStack_1e0.BottomFrontLeft.y;
+ (this->bounding_box).TopFrontRight.z = fStack_1e0.BottomBackRight.z;
+ pVVar20 = Vector3::ctor((Vector3 *)&exception2,fStack_1e0.BottomFrontLeft.x,
+ fStack_1e0.BottomBackRight.y,fStack_1e0.BottomFrontLeft.z);
+ (this->bounding_box).BottomBackLeft.x = pVVar20->x;
+ (this->bounding_box).BottomBackLeft.y = pVVar20->y;
+ (this->bounding_box).BottomBackLeft.z = pVVar20->z;
+ pVVar20 = Vector3::ctor(&VStack_78,fStack_1e0.BottomBackRight.x,fStack_1e0.BottomFrontLeft.y
+ ,fStack_1e0.BottomBackRight.z);
+ (this->bounding_box).TopBackLeft.x = pVVar20->x;
+ (this->bounding_box).TopBackLeft.y = pVVar20->y;
+ (this->bounding_box).TopBackLeft.z = pVVar20->z;
+ fStack_1e0.BottomFrontRight.x = (pBVar2->BottomFrontLeft).x;
+ fStack_1e0.BottomFrontRight.y = (this->bounding_box).BottomFrontLeft.y;
+ fStack_1e0.BottomFrontRight.z = (this->bounding_box).BottomFrontLeft.z;
+ pVVar20 = &(this->bounding_box).TopFrontLeft;
+ fStack_1e0.BottomBackLeft.x = pVVar20->x;
+ fStack_1e0.BottomBackLeft.y = (this->bounding_box).TopFrontLeft.y;
+ fStack_1e0.BottomBackLeft.z = (this->bounding_box).TopFrontLeft.z;
+ if (pfVar34->x < fStack_1e0.BottomFrontRight.x) {
+ fStack_1e0.BottomFrontRight.x = pfVar34->x;
+ }
+ if (pfVar34->y < fStack_1e0.BottomFrontRight.y) {
+ fStack_1e0.BottomFrontRight.y = pfVar34->y;
+ }
+ if (pfVar34->z < fStack_1e0.BottomFrontRight.z) {
+ fStack_1e0.BottomFrontRight.z = pfVar34->z;
+ }
+ if (fStack_1e0.BottomBackLeft.x < pfVar34->x) {
+ fStack_1e0.BottomBackLeft.x = pfVar34->x;
+ }
+ if (fStack_1e0.BottomBackLeft.y < pfVar34->y) {
+ fStack_1e0.BottomBackLeft.y = pfVar34->y;
+ }
+ if (fStack_1e0.BottomBackLeft.z < pfVar34->z) {
+ fStack_1e0.BottomBackLeft.z = pfVar34->z;
+ }
+ fVar34 = fStack_1e0.BottomBackLeft.z;
+ fStack_130 = fStack_1e0.BottomFrontRight.x;
+ fStack_12c = fStack_1e0.BottomFrontRight.y;
+ fStack_128 = fStack_1e0.BottomFrontRight.z;
+ VStack_178.x = fStack_1e0.BottomBackLeft.x;
+ VStack_178.y = fStack_1e0.BottomFrontRight.y;
+ VStack_178.z = fStack_1e0.BottomFrontRight.z;
+ fStack_1e0.TopBackLeft.z = fStack_1e0.BottomBackLeft.x;
+ (pBVar2->BottomFrontLeft).x = fStack_1e0.BottomFrontRight.x;
+ fStack_1e0.TopFrontLeft.x = fStack_1e0.BottomBackLeft.y;
+ (this->bounding_box).BottomFrontLeft.y = fStack_1e0.BottomFrontRight.y;
+ fStack_1e0.TopFrontLeft.y = fStack_1e0.BottomFrontRight.z;
+ (this->bounding_box).BottomFrontLeft.z = fStack_1e0.BottomFrontRight.z;
+ VStack_160.x = fStack_1e0.BottomBackLeft.x;
+ (this->bounding_box).BottomFrontRight.x = fStack_1e0.BottomBackLeft.x;
+ VStack_160.y = fStack_1e0.BottomBackLeft.y;
+ (this->bounding_box).BottomFrontRight.y = fStack_1e0.BottomFrontRight.y;
+ (this->bounding_box).BottomFrontRight.z = fStack_1e0.BottomFrontRight.z;
+ VStack_160.z = fStack_1e0.BottomBackLeft.z;
+ (this->bounding_box).BottomBackRight.x = fStack_1e0.BottomBackLeft.x;
+ fStack_1e0.TopFrontLeft.z = fStack_1e0.BottomFrontRight.x;
+ (this->bounding_box).BottomBackRight.y = fStack_1e0.BottomBackLeft.y;
+ (this->bounding_box).BottomBackRight.z = fStack_1e0.BottomFrontRight.z;
+ pVVar20->x = fStack_1e0.BottomBackLeft.x;
+ (this->bounding_box).TopFrontLeft.y = fStack_1e0.BottomBackLeft.y;
+ (this->bounding_box).TopFrontLeft.z = fStack_1e0.BottomBackLeft.z;
+ (this->bounding_box).TopBackRight.x = fStack_1e0.BottomFrontRight.x;
+ (this->bounding_box).TopBackRight.y = fStack_1e0.BottomBackLeft.y;
+ (this->bounding_box).TopBackRight.z = fStack_1e0.BottomBackLeft.z;
+ pVVar20 = Vector3::ctor(&VStack_3c,fStack_1e0.BottomFrontRight.x,
+ fStack_1e0.BottomFrontRight.y,fStack_1e0.BottomBackLeft.z);
+ (this->bounding_box).TopFrontRight.x = pVVar20->x;
+ (this->bounding_box).TopFrontRight.y = pVVar20->y;
+ (this->bounding_box).TopFrontRight.z = pVVar20->z;
+ pVVar20 = Vector3::ctor(&VStack_54,fStack_1e0.BottomFrontRight.x,fStack_1e0.BottomBackLeft.y
+ ,fStack_1e0.BottomFrontRight.z);
+ (this->bounding_box).BottomBackLeft.x = pVVar20->x;
+ (this->bounding_box).BottomBackLeft.y = pVVar20->y;
+ (this->bounding_box).BottomBackLeft.z = pVVar20->z;
+ pVVar20 = Vector3::ctor(&VStack_24,fStack_1e0.BottomBackLeft.x,fStack_1e0.BottomFrontRight.y
+ ,fVar34);
+ (this->bounding_box).TopBackLeft.x = pVVar20->x;
+ (this->bounding_box).TopBackLeft.y = pVVar20->y;
+ (this->bounding_box).TopBackLeft.z = pVVar20->z;
+ fStack_1e0.TopBackRight.x = (pBVar2->BottomFrontLeft).x;
+ fStack_1e0.TopBackRight.y = (this->bounding_box).BottomFrontLeft.y;
+ fStack_1e0.TopBackRight.z = (this->bounding_box).BottomFrontLeft.z;
+ pVVar20 = &(this->bounding_box).TopFrontLeft;
+ fStack_1e0.TopFrontRight.x = pVVar20->x;
+ fStack_1e0.TopFrontRight.y = (this->bounding_box).TopFrontLeft.y;
+ fVar34 = (this->bounding_box).TopFrontLeft.z;
+ if (pfVar40->x < fStack_1e0.TopBackRight.x) {
+ fStack_1e0.TopBackRight.x = pfVar40->x;
+ }
+ fVar4 = fStack_1e0.TopBackRight.x;
+ if (pfVar40->y < fStack_1e0.TopBackRight.y) {
+ fStack_1e0.TopBackRight.y = pfVar40->y;
+ }
+ if (pfVar40->z < fStack_1e0.TopBackRight.z) {
+ fStack_1e0.TopBackRight.z = pfVar40->z;
+ }
+ if (fStack_1e0.TopFrontRight.x < pfVar40->x) {
+ fStack_1e0.TopFrontRight.x = pfVar40->x;
+ }
+ if (fStack_1e0.TopFrontRight.y < pfVar40->y) {
+ fStack_1e0.TopFrontRight.y = pfVar40->y;
+ }
+ if (fVar34 < pfVar40->z) {
+ fVar34 = pfVar40->z;
+ }
+ VStack_16c.x = fStack_1e0.TopBackRight.x;
+ VStack_16c.y = fStack_1e0.TopBackRight.y;
+ VStack_16c.z = fStack_1e0.TopBackRight.z;
+ VStack_154.x = fStack_1e0.TopFrontRight.x;
+ VStack_154.y = fStack_1e0.TopBackRight.y;
+ VStack_154.z = fStack_1e0.TopBackRight.z;
+ (pBVar2->BottomFrontLeft).x = fStack_1e0.TopBackRight.x;
+ VStack_13c.x = fStack_1e0.TopFrontRight.x;
+ (this->bounding_box).BottomFrontLeft.y = fStack_1e0.TopBackRight.y;
+ VStack_13c.y = fStack_1e0.TopFrontRight.y;
+ (this->bounding_box).BottomFrontLeft.z = fStack_1e0.TopBackRight.z;
+ VStack_13c.z = fStack_1e0.TopBackRight.z;
+ (this->bounding_box).BottomFrontRight.x = fStack_1e0.TopFrontRight.x;
+ VStack_148.x = fStack_1e0.TopFrontRight.x;
+ (this->bounding_box).BottomFrontRight.y = fStack_1e0.TopBackRight.y;
+ (this->bounding_box).BottomFrontRight.z = fStack_1e0.TopBackRight.z;
+ VStack_148.y = fStack_1e0.TopFrontRight.y;
+ (this->bounding_box).BottomBackRight.x = fStack_1e0.TopFrontRight.x;
+ (this->bounding_box).BottomBackRight.y = fStack_1e0.TopFrontRight.y;
+ (this->bounding_box).BottomBackRight.z = fStack_1e0.TopBackRight.z;
+ pVVar20->x = fStack_1e0.TopFrontRight.x;
+ (this->bounding_box).TopFrontLeft.y = fStack_1e0.TopFrontRight.y;
+ (this->bounding_box).TopFrontLeft.z = fVar34;
+ fStack_1e0.TopFrontRight.z = fVar34;
+ VStack_148.z = fVar34;
+ pVVar20 = Vector3::ctor(&VStack_6c,fStack_1e0.TopBackRight.x,fStack_1e0.TopFrontRight.y,
+ fVar34);
+ (this->bounding_box).TopBackRight.x = pVVar20->x;
+ (this->bounding_box).TopBackRight.y = pVVar20->y;
+ (this->bounding_box).TopBackRight.z = pVVar20->z;
+ pVVar20 = Vector3::ctor(&VStack_60,fVar4,fStack_1e0.TopBackRight.y,fVar34);
+ (this->bounding_box).TopFrontRight.x = pVVar20->x;
+ (this->bounding_box).TopFrontRight.y = pVVar20->y;
+ (this->bounding_box).TopFrontRight.z = pVVar20->z;
+ pVVar20 = Vector3::ctor(&VStack_48,fVar4,fStack_1e0.TopFrontRight.y,
+ fStack_1e0.TopBackRight.z);
+ (this->bounding_box).BottomBackLeft.x = pVVar20->x;
+ (this->bounding_box).BottomBackLeft.y = pVVar20->y;
+ (this->bounding_box).BottomBackLeft.z = pVVar20->z;
+ pVVar20 = Vector3::ctor(&VStack_30,fStack_1e0.TopFrontRight.x,fStack_1e0.TopBackRight.y,
+ fVar34);
+ (this->bounding_box).TopBackLeft.x = pVVar20->x;
+ (this->bounding_box).TopBackLeft.y = pVVar20->y;
+ (this->bounding_box).TopBackLeft.z = pVVar20->z;
+ }
+ uStack_1ec = uStack_1ec + 1;
+ iStack_1e4 = iStack_1e4 + 0x1c;
+ } while (uStack_1ec < this->_5_element_count);
+ }
+ iVar28 = this->mshmeta_ptr->_1_element_count;
+ piVar24 = (int *)operator_new(iVar28 * 0xc + 4);
+ exception.Offset = CONCAT31(exception.Offset._1_3_,7);
+ if (piVar24 == (int *)0x0) {
+ piVar25 = (int *)0x0;
+ }
+ else {
+ piVar25 = piVar24 + 1;
+ *piVar24 = iVar28;
+ vector_constructor_iterator(piVar25,0xc,iVar28,KindaArray::ctor_capacity5_elemsize8);
+ }
+ this->field9815_0x7b64 = piVar25;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,6);
+ iVar28 = this->mshmeta_ptr->_1_element_count;
+ piVar24 = (int *)operator_new(iVar28 * 0xc + 4);
+ exception.Offset = CONCAT31(exception.Offset._1_3_,8);
+ if (piVar24 == (int *)0x0) {
+ piVar25 = (int *)0x0;
+ }
+ else {
+ piVar25 = piVar24 + 1;
+ *piVar24 = iVar28;
+ vector_constructor_iterator(piVar25,0xc,iVar28,KindaArray::ctor_capacity100_elemsize4);
+ }
+ this->field9818_0x7b70 = piVar25;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,6);
+ iVar28 = this->mshmeta_ptr->_1_element_count;
+ piVar24 = (int *)operator_new(iVar28 * 0xc + 4);
+ exception.Offset = CONCAT31(exception.Offset._1_3_,9);
+ if (piVar24 == (int *)0x0) {
+ piVar25 = (int *)0x0;
+ }
+ else {
+ piVar25 = piVar24 + 1;
+ *piVar24 = iVar28;
+ vector_constructor_iterator(piVar25,0xc,iVar28,KindaArray::ctor_capacity5_elemsize4);
+ }
+ this->field9816_0x7b68 = piVar25;
+ this->field62_0x194 = &this->field9784_0x7b3c;
+ this->field95_0x1c4 = this->wear_ptr;
+ this->field63_0x198 = &this->field9793_0x7b48;
+ this->field22_0x160 = &this->field_0x7c54;
+ this->field23_0x164 = &this->field_0x7c5c;
+ this->field64_0x19c = &this->field_0x7b54;
+ this->field96_0x1c8 = &this->field_0x7c6c;
+ this->field24_0x168 = &this->field_0x7c64;
+ this->field97_0x1cc = &this->field9885_0x7c74;
+ this->field65_0x1a0 = -1;
+ this->field70_0x1a8 = 0;
+ this->field98_0x1d0 = &this->field9890_0x7c7c;
+ this->field29_0x170 = &this->field_0x7c48;
+ this->field101_0x1dc = -1;
+ this->field103_0x1e4 = -1;
+ this->field107_0x1f4 = 0;
+ this->field104_0x1e8 = 0;
+ this->field105_0x1ec = -2;
+ this->field106_0x1f0 = 0;
+ this->field108_0x1f8 = 0;
+ this->field109_0x1fc = 0;
+ this->field110_0x200 = 0;
+ this->field111_0x204 = 0;
+ uVar29 = this->_5_element_count;
+ exception.Offset = CONCAT31(exception.Offset._1_3_,6);
+ if ((this->array_0x278).data == (undefined4 *)0x0) {
+ puVar9 = (undefined4 *)operator_new(8000);
+ (this->array_0x278).data = puVar9;
+ }
+ iVar28 = uVar29 + (this->array_0x278).count;
+ if ((this->array_0x278).capacity < iVar28) {
+ puVar26 = (undefined4 *)operator_new(iVar28 * 8 + 800);
+ puVar9 = (this->array_0x278).data;
+ puVar40 = puVar26;
+ for (uVar30 = (uint)((this->array_0x278).capacity << 3) >> 2; uVar30 != 0; uVar30 = uVar30 - 1)
+ {
+ *puVar40 = *puVar9;
+ puVar9 = puVar9 + 1;
+ puVar40 = puVar40 + 1;
+ }
+ for (iVar28 = 0; iVar28 != 0; iVar28 = iVar28 + -1) {
+ *(undefined1 *)puVar40 = *(undefined1 *)puVar9;
+ puVar9 = (undefined4 *)((int)puVar9 + 1);
+ puVar40 = (undefined4 *)((int)puVar40 + 1);
+ }
+ operator_delete((this->array_0x278).data);
+ iVar28 = (this->array_0x278).count + uVar29;
+ (this->array_0x278).data = puVar26;
+ (this->array_0x278).capacity = iVar28 + 100;
+ }
+ (this->array_0x278).count = iVar28;
+ uVar29 = 0;
+ if (this->_5_element_count != 0) {
+ iVar28 = 0;
+ do {
+ iVar31 = (int)&this->_5_data_ptr->flags + iVar28;
+ iVar28 = iVar28 + 0x1c;
+ (this->array_0x278).data[uVar29 * 2] = iVar31;
+ *(undefined1 *)((this->array_0x278).data + uVar29 * 2 + 1) = 0;
+ uVar29 = uVar29 + 1;
+ } while (uVar29 < this->_5_element_count);
+ }
+ pbVar41 = this->unk_obj_array_elemsize_212[99] + 0x60;
+ for (iVar28 = 0x19; iVar28 != 0; iVar28 = iVar28 + -1) {
+ pbVar41[0] = 0;
+ pbVar41[1] = 0;
+ pbVar41[2] = 0;
+ pbVar41[3] = 0;
+ pbVar41 = pbVar41 + 4;
+ }
+ this->field9896_0x7c90 = (undefined4 *)0x0;
+ pCVar27 = GetShade();
+ this->Shade = pCVar27;
+ this->field9833_0x7c20 = 0;
+ this->flags_of_mesh_part = 0x10;
+ this->_CheckMaxBasementAngleStep = 2;
+ ExceptionList = exception.ExceptionList;
+ return this;
+}
+
+
+
+---
+
+// Assembly:
+1000eba0 PUSH -0x1
+1000eba2 PUSH 0x1006320e
+1000eba7 MOV EAX,FS:[0x0]
+1000ebad PUSH EAX
+1000ebae MOV dword ptr FS:[0x0],ESP
+1000ebb5 SUB ESP,0x1e0
+1000ebbb MOV EAX,dword ptr [ESP + 0x1fc]
+1000ebc2 PUSH EBX
+1000ebc3 PUSH EBP
+1000ebc4 PUSH ESI
+1000ebc5 PUSH EDI
+1000ebc6 MOV EDI,dword ptr [ESP + 0x208]
+1000ebcd MOV EBP,ECX
+1000ebcf PUSH EAX
+1000ebd0 PUSH EDI
+1000ebd1 MOV dword ptr [ESP + 0x128],EBP
+1000ebd8 LEA ECX,[EBP + 0x4]
+1000ebdb MOV dword ptr [EBP],0x100655d0
+1000ebe2 CALL 0x100565d0
+1000ebe7 MOV dword ptr [EBP + 0x134],0x100655a0
+1000ebf1 MOV dword ptr [EBP + 0x138],0x10065560
+1000ebfb MOV dword ptr [EBP + 0x13c],0x1006552c
+1000ec05 XOR ESI,ESI
+1000ec07 MOV dword ptr [EBP + 0x140],0x100654d8
+1000ec11 MOV EBX,0xfffffffe
+1000ec16 MOV dword ptr [EBP + 0x144],0x100654c8
+1000ec20 MOV dword ptr [ESP + 0x1f8],ESI
+1000ec27 MOV dword ptr [EBP + 0x1e8],ESI
+1000ec2d MOV dword ptr [EBP + 0x1ec],EBX
+1000ec33 LEA EAX,[EBP + 0x214]
+1000ec39 MOV ECX,0x3
+1000ec3e OR EDX,0xffffffff
+1000ec41 MOV dword ptr [EAX],ESI
+1000ec43 MOV dword ptr [EAX + 0x4],EBX
+1000ec46 MOV dword ptr [EAX + 0x8],EDX
+1000ec49 MOV dword ptr [EAX + 0xc],EDX
+1000ec4c MOV dword ptr [EAX + 0x10],EDX
+1000ec4f ADD EAX,0x14
+1000ec52 DEC ECX
+1000ec53 JNZ 0x1000ec41
+1000ec55 PUSH 0x1f40
+1000ec5a CALL 0x100597e7
+1000ec5f ADD ESP,0x4
+1000ec62 MOV dword ptr [EBP + 0x278],EAX
+1000ec68 MOV dword ptr [EBP + 0x280],0x3e8
+1000ec72 MOV dword ptr [EBP + 0x27c],ESI
+1000ec78 MOV EBX,0x64
+1000ec7d MOV byte ptr [ESP + 0x1f8],0x1
+1000ec85 LEA ESI,[EBP + 0x2fc]
+1000ec8b MOV dword ptr [ESP + 0x10],EBX
+1000ec8f PUSH 0x1000da50
+1000ec94 PUSH 0x8
+1000ec96 PUSH 0xc
+1000ec98 PUSH ESI
+1000ec99 CALL 0x10001330
+1000ec9e MOV EAX,dword ptr [ESP + 0x10]
+1000eca2 ADD ESI,0xd4
+1000eca8 DEC EAX
+1000eca9 MOV dword ptr [ESP + 0x10],EAX
+1000ecad JNZ 0x1000ec8f
+1000ecaf PUSH 0x190
+1000ecb4 CALL 0x100597e7
+1000ecb9 XOR ESI,ESI
+1000ecbb MOV dword ptr [EBP + 0x7b74],EAX
+1000ecc1 MOV dword ptr [EBP + 0x7b7c],EBX
+1000ecc7 MOV dword ptr [EBP + 0x7b78],ESI
+1000eccd PUSH 0xfa0
+1000ecd2 MOV byte ptr [ESP + 0x200],0x2
+1000ecda CALL 0x100597e7
+1000ecdf MOV dword ptr [EBP + 0x7c00],EAX
+1000ece5 MOV dword ptr [EBP + 0x7c08],0x3e8
+1000ecef MOV dword ptr [EBP + 0x7c04],ESI
+1000ecf5 PUSH 0x190
+1000ecfa MOV byte ptr [ESP + 0x204],0x3
+1000ed02 CALL 0x100597e7
+1000ed07 MOV dword ptr [EBP + 0x7c0c],EAX
+1000ed0d MOV dword ptr [EBP + 0x7c14],EBX
+1000ed13 MOV dword ptr [EBP + 0x7c10],ESI
+1000ed19 PUSH 0x190
+1000ed1e MOV byte ptr [ESP + 0x208],0x4
+1000ed26 CALL 0x100597e7
+1000ed2b MOV dword ptr [EBP + 0x7c2c],EAX
+1000ed31 MOV dword ptr [EBP + 0x7c34],EBX
+1000ed37 MOV dword ptr [EBP + 0x7c30],ESI
+1000ed3d PUSH 0xa0
+1000ed42 MOV byte ptr [ESP + 0x20c],0x5
+1000ed4a CALL 0x100597e7
+1000ed4f MOV dword ptr [EBP + 0x7c84],EAX
+1000ed55 MOV dword ptr [EBP + 0x7c8c],0x28
+1000ed5f MOV dword ptr [EBP + 0x7c88],ESI
+1000ed65 MOV dword ptr [EBP + 0x7c98],0x1
+1000ed6f MOV dword ptr [EBP + 0x7c9c],ESI
+1000ed75 MOV dword ptr [EBP + 0x7ca0],ESI
+1000ed7b MOV dword ptr [EBP + 0x7ca4],ESI
+1000ed81 MOV dword ptr [EBP + 0x7ca8],ESI
+1000ed87 MOV dword ptr [EBP + 0x7cac],ESI
+1000ed8d MOV dword ptr [EBP + 0x7cb8],ESI
+1000ed93 MOV dword ptr [EBP + 0x7cb4],ESI
+1000ed99 MOV dword ptr [EBP + 0x7cb0],ESI
+1000ed9f MOV dword ptr [EBP + 0x7cc4],ESI
+1000eda5 MOV dword ptr [EBP + 0x7cc0],ESI
+1000edab MOV dword ptr [EBP + 0x7cbc],ESI
+1000edb1 MOV dword ptr [EBP + 0x7cc8],0xbf800000
+1000edbb MOV dword ptr [EBP + 0x7ccc],ESI
+1000edc1 MOV dword ptr [EBP + 0x7cd0],ESI
+1000edc7 MOV dword ptr [EBP + 0x7cd4],ESI
+1000edcd MOV dword ptr [EBP + 0x7cd8],ESI
+1000edd3 MOV ESI,dword ptr [ESP + 0x218]
+1000edda MOV dword ptr [EBP],0x100654c0
+1000ede1 MOV dword ptr [EBP + 0x4],0x10065464
+1000ede8 MOV dword ptr [EBP + 0x134],0x10065434
+1000edf2 MOV dword ptr [EBP + 0x138],0x100653f4
+1000edfc MOV dword ptr [EBP + 0x13c],0x100653c0
+1000ee06 MOV dword ptr [EBP + 0x140],0x1006536c
+1000ee10 MOV dword ptr [EBP + 0x144],0x1006535c
+1000ee1a MOV dword ptr [EBP + 0x274],EDI
+1000ee20 MOV EDI,ESI
+1000ee22 OR ECX,0xffffffff
+1000ee25 XOR EAX,EAX
+1000ee27 MOV byte ptr [ESP + 0x20c],0x6
+1000ee2f SCASB.REPNE ES:EDI
+1000ee31 NOT ECX
+1000ee33 ADD ECX,0x4
+1000ee36 LEA EBX,[EBP + 0x7ce0]
+1000ee3c PUSH ECX
+1000ee3d CALL 0x100597e7
+1000ee42 MOV dword ptr [ESP + 0x80],EAX
+1000ee49 MOV EDI,ESI
+1000ee4b OR ECX,0xffffffff
+1000ee4e XOR EAX,EAX
+1000ee50 SCASB.REPNE ES:EDI
+1000ee52 NOT ECX
+1000ee54 ADD ECX,0x5
+1000ee57 PUSH ECX
+1000ee58 CALL 0x100597e7
+1000ee5d MOV dword ptr [ESP + 0x80],EAX
+1000ee64 MOV EDI,ESI
+1000ee66 OR ECX,0xffffffff
+1000ee69 XOR EAX,EAX
+1000ee6b SCASB.REPNE ES:EDI
+1000ee6d NOT ECX
+1000ee6f ADD ECX,0x5
+1000ee72 PUSH ECX
+1000ee73 CALL 0x100597e7
+1000ee78 MOV dword ptr [ESP + 0x38],EAX
+1000ee7c MOV EDI,ESI
+1000ee7e OR ECX,0xffffffff
+1000ee81 XOR EAX,EAX
+1000ee83 SCASB.REPNE ES:EDI
+1000ee85 NOT ECX
+1000ee87 ADD ECX,0x4
+1000ee8a PUSH ECX
+1000ee8b CALL 0x100597e7
+1000ee90 MOV dword ptr [ESP + 0x34],EAX
+1000ee94 OR ECX,0xffffffff
+1000ee97 MOV EDI,ESI
+1000ee99 XOR EAX,EAX
+1000ee9b ADD ESP,0x24
+1000ee9e MOV EDX,dword ptr [ESP + 0x68]
+1000eea2 SCASB.REPNE ES:EDI
+1000eea4 NOT ECX
+1000eea6 SUB EDI,ECX
+1000eea8 MOV EAX,ECX
+1000eeaa MOV ESI,EDI
+1000eeac SHR ECX,0x2
+1000eeaf MOV EDI,EDX
+1000eeb1 MOVSD.REP ES:EDI,ESI
+1000eeb3 MOV ECX,EAX
+1000eeb5 XOR EAX,EAX
+1000eeb7 AND ECX,0x3
+1000eeba MOVSB.REP ES:EDI,ESI
+1000eebc MOV EDI,0x1006bfb4
+1000eec1 OR ECX,0xffffffff
+1000eec4 SCASB.REPNE ES:EDI
+1000eec6 NOT ECX
+1000eec8 SUB EDI,ECX
+1000eeca MOV EAX,ECX
+1000eecc MOV ESI,EDI
+1000eece MOV EDI,EDX
+1000eed0 MOV EDX,EAX
+1000eed2 OR ECX,0xffffffff
+1000eed5 XOR EAX,EAX
+1000eed7 SCASB.REPNE ES:EDI
+1000eed9 MOV ECX,EDX
+1000eedb DEC EDI
+1000eedc SHR ECX,0x2
+1000eedf MOVSD.REP ES:EDI,ESI
+1000eee1 MOV ECX,EDX
+1000eee3 MOV EDX,dword ptr [ESP + 0x64]
+1000eee7 AND ECX,0x3
+1000eeea MOVSB.REP ES:EDI,ESI
+1000eeec MOV EDI,dword ptr [ESP + 0x204]
+1000eef3 OR ECX,0xffffffff
+1000eef6 SCASB.REPNE ES:EDI
+1000eef8 NOT ECX
+1000eefa SUB EDI,ECX
+1000eefc MOV EAX,ECX
+1000eefe MOV ESI,EDI
+1000ef00 MOV EDI,EDX
+1000ef02 SHR ECX,0x2
+1000ef05 MOVSD.REP ES:EDI,ESI
+1000ef07 MOV ECX,EAX
+1000ef09 XOR EAX,EAX
+1000ef0b AND ECX,0x3
+1000ef0e MOVSB.REP ES:EDI,ESI
+1000ef10 MOV EDI,0x1006bfac
+1000ef15 OR ECX,0xffffffff
+1000ef18 SCASB.REPNE ES:EDI
+1000ef1a NOT ECX
+1000ef1c SUB EDI,ECX
+1000ef1e MOV EAX,ECX
+1000ef20 MOV ESI,EDI
+1000ef22 OR ECX,0xffffffff
+1000ef25 MOV dword ptr [ESP + 0x14],EAX
+1000ef29 MOV EDI,EDX
+1000ef2b XOR EAX,EAX
+1000ef2d MOV EDX,dword ptr [ESP + 0x14]
+1000ef31 SCASB.REPNE ES:EDI
+1000ef33 MOV ECX,EDX
+1000ef35 DEC EDI
+1000ef36 SHR ECX,0x2
+1000ef39 MOVSD.REP ES:EDI,ESI
+1000ef3b MOV ECX,EDX
+1000ef3d MOV EDX,dword ptr [ESP + 0x18]
+1000ef41 AND ECX,0x3
+1000ef44 MOVSB.REP ES:EDI,ESI
+1000ef46 MOV EDI,dword ptr [ESP + 0x204]
+1000ef4d OR ECX,0xffffffff
+1000ef50 SCASB.REPNE ES:EDI
+1000ef52 NOT ECX
+1000ef54 SUB EDI,ECX
+1000ef56 MOV EAX,ECX
+1000ef58 MOV ESI,EDI
+1000ef5a SHR ECX,0x2
+1000ef5d MOV EDI,EDX
+1000ef5f MOVSD.REP ES:EDI,ESI
+1000ef61 MOV ECX,EAX
+1000ef63 XOR EAX,EAX
+1000ef65 AND ECX,0x3
+1000ef68 MOVSB.REP ES:EDI,ESI
+1000ef6a OR ECX,0xffffffff
+1000ef6d MOV EDI,0x1006bfa4
+1000ef72 SCASB.REPNE ES:EDI
+1000ef74 NOT ECX
+1000ef76 SUB EDI,ECX
+1000ef78 MOV EAX,ECX
+1000ef7a MOV ESI,EDI
+1000ef7c OR ECX,0xffffffff
+1000ef7f MOV EDI,EDX
+1000ef81 MOV EDX,EAX
+1000ef83 XOR EAX,EAX
+1000ef85 SCASB.REPNE ES:EDI
+1000ef87 MOV ECX,EDX
+1000ef89 DEC EDI
+1000ef8a SHR ECX,0x2
+1000ef8d MOVSD.REP ES:EDI,ESI
+1000ef8f MOV ECX,EDX
+1000ef91 MOV EDX,dword ptr [ESP + 0x10]
+1000ef95 AND ECX,0x3
+1000ef98 MOVSB.REP ES:EDI,ESI
+1000ef9a MOV EDI,dword ptr [ESP + 0x204]
+1000efa1 OR ECX,0xffffffff
+1000efa4 SCASB.REPNE ES:EDI
+1000efa6 NOT ECX
+1000efa8 SUB EDI,ECX
+1000efaa MOV EAX,ECX
+1000efac MOV ESI,EDI
+1000efae MOV EDI,EDX
+1000efb0 SHR ECX,0x2
+1000efb3 MOVSD.REP ES:EDI,ESI
+1000efb5 MOV ECX,EAX
+1000efb7 XOR EAX,EAX
+1000efb9 AND ECX,0x3
+1000efbc MOVSB.REP ES:EDI,ESI
+1000efbe MOV EDI,0x1006bf9c
+1000efc3 OR ECX,0xffffffff
+1000efc6 SCASB.REPNE ES:EDI
+1000efc8 NOT ECX
+1000efca SUB EDI,ECX
+1000efcc MOV EAX,ECX
+1000efce MOV ESI,EDI
+1000efd0 MOV EDI,EDX
+1000efd2 MOV EDX,EAX
+1000efd4 OR ECX,0xffffffff
+1000efd7 XOR EAX,EAX
+1000efd9 SCASB.REPNE ES:EDI
+1000efdb MOV ECX,EDX
+1000efdd DEC EDI
+1000efde SHR ECX,0x2
+1000efe1 MOVSD.REP ES:EDI,ESI
+1000efe3 MOV ECX,EDX
+1000efe5 AND ECX,0x3
+1000efe8 MOVSB.REP ES:EDI,ESI
+1000efea CALL 0x10056568
+1000efef MOV dword ptr [EBP + 0x7c1c],EAX
+1000eff5 TEST EAX,EAX
+1000eff7 JNZ 0x1000f00d
+1000eff9 PUSH 0x1006bf7c
+1000effe MOV EDX,0x1006bf60
+1000f003 MOV ECX,0x1006b3f4
+1000f008 CALL 0x10051b20
+1000f00d CALL 0x10056562
+1000f012 TEST EAX,EAX
+1000f014 MOV dword ptr [EBP + 0x7bf8],EAX
+1000f01a JNZ 0x1000f030
+1000f01c PUSH 0x1006bf40
+1000f021 MOV EDX,0x1006bf60
+1000f026 MOV ECX,0x1006b3f4
+1000f02b CALL 0x10051b20
+1000f030 MOV ECX,dword ptr [EBP + 0x7bf8]
+1000f036 MOV EAX,EBP
+1000f038 NEG EAX
+1000f03a MOV EDX,dword ptr [ECX]
+1000f03c LEA ESI,[EBP + 0x4]
+1000f03f SBB EAX,EAX
+1000f041 AND EAX,ESI
+1000f043 PUSH EAX
+1000f044 PUSH 0x0
+1000f046 PUSH 0x0
+1000f048 PUSH ECX
+1000f049 CALL dword ptr [EDX + 0x10]
+1000f04c MOV dword ptr [EBP + 0x7bf4],EAX
+1000f052 MOV EAX,dword ptr [EBP + 0x7c1c]
+1000f058 TEST EAX,EAX
+1000f05a JZ 0x1000f08f
+1000f05c MOV EAX,EBP
+1000f05e MOV EDI,dword ptr [ESP + 0x200]
+1000f065 NEG EAX
+1000f067 SBB EAX,EAX
+1000f069 AND EAX,ESI
+1000f06b PUSH EAX
+1000f06c MOV EAX,dword ptr [ESP + 0x68]
+1000f070 PUSH EAX
+1000f071 PUSH EDI
+1000f072 CALL 0x1005658c
+1000f077 MOV EDX,dword ptr [ESP + 0x18]
+1000f07b MOV dword ptr [EBP + 0x7be0],EAX
+1000f081 MOV ECX,dword ptr [EAX]
+1000f083 PUSH EDX
+1000f084 PUSH EDI
+1000f085 PUSH EAX
+1000f086 CALL dword ptr [ECX + 0x18]
+1000f089 MOV dword ptr [EBP + 0x7be4],EAX
+1000f08f MOV EAX,EBP
+1000f091 NEG EAX
+1000f093 SBB EAX,EAX
+1000f095 AND EAX,ESI
+1000f097 PUSH EAX
+1000f098 PUSH 0x0
+1000f09a PUSH 0x0
+1000f09c CALL 0x1004d7d0
+1000f0a1 MOV dword ptr [EBP + 0x7bfc],EAX
+1000f0a7 MOV EAX,EBP
+1000f0a9 NEG EAX
+1000f0ab SBB EAX,EAX
+1000f0ad AND EAX,ESI
+1000f0af PUSH EAX
+1000f0b0 CALL 0x10057a5c
+1000f0b5 MOV EDI,dword ptr [EAX]
+1000f0b7 LEA ECX,[EBP + 0x7bf0]
+1000f0bd PUSH ECX
+1000f0be MOV EDX,0x203
+1000f0c3 MOV ECX,EAX
+1000f0c5 CALL dword ptr [EDI]
+1000f0c7 TEST EAX,EAX
+1000f0c9 JNZ 0x1000f0df
+1000f0cb PUSH 0x1006bf18
+1000f0d0 MOV EDX,0x1006bf60
+1000f0d5 MOV ECX,0x1006b3f4
+1000f0da CALL 0x10051b20
+1000f0df MOV EAX,EBP
+1000f0e1 NEG EAX
+1000f0e3 SBB EAX,EAX
+1000f0e5 AND EAX,ESI
+1000f0e7 PUSH EAX
+1000f0e8 PUSH 0x0
+1000f0ea PUSH 0x0
+1000f0ec CALL 0x10057a56
+1000f0f1 MOV EDI,dword ptr [EAX]
+1000f0f3 LEA EDX,[EBP + 0x7be8]
+1000f0f9 PUSH EDX
+1000f0fa MOV EDX,0x13
+1000f0ff MOV ECX,EAX
+1000f101 CALL dword ptr [EDI]
+1000f103 TEST EAX,EAX
+1000f105 JNZ 0x1000f11b
+1000f107 PUSH 0x1006beec
+1000f10c MOV EDX,0x1006bf60
+1000f111 MOV ECX,0x1006b3f4
+1000f116 CALL 0x10051b20
+1000f11b MOV EAX,EBP
+1000f11d NEG EAX
+1000f11f SBB EAX,EAX
+1000f121 AND EAX,ESI
+1000f123 PUSH EAX
+1000f124 MOV EAX,dword ptr [ESP + 0x14]
+1000f128 PUSH EAX
+1000f129 PUSH 0x0
+1000f12b CALL 0x10057a50
+1000f130 MOV ESI,dword ptr [EAX]
+1000f132 LEA ECX,[EBP + 0x7bec]
+1000f138 PUSH ECX
+1000f139 MOV EDX,0x302
+1000f13e MOV ECX,EAX
+1000f140 CALL dword ptr [ESI]
+1000f142 TEST EAX,EAX
+1000f144 JNZ 0x1000f15a
+1000f146 PUSH 0x1006bec0
+1000f14b MOV EDX,0x1006bf60
+1000f150 MOV ECX,0x1006b3f4
+1000f155 CALL 0x10051b20
+1000f15a MOV EDX,dword ptr [ESP + 0x68]
+1000f15e PUSH EDX
+1000f15f CALL 0x1005655c
+1000f164 TEST EAX,EAX
+1000f166 MOV dword ptr [EBP + 0x7c28],EAX
+1000f16c JNZ 0x1000f182
+1000f16e PUSH 0x1006bea8
+1000f173 MOV EDX,0x1006bf60
+1000f178 MOV ECX,0x1006b3f4
+1000f17d CALL 0x10051b20
+1000f182 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f188 PUSH EAX
+1000f189 MOV ECX,dword ptr [EAX]
+1000f18b CALL dword ptr [ECX + 0x14]
+1000f18e MOV dword ptr [ESP + 0x14],EAX
+1000f192 MOV dword ptr [EBP + 0x284],0x1
+1000f19c MOV EAX,dword ptr [EBP + 0x7c28]
+1000f1a2 PUSH 0x3
+1000f1a4 PUSH EAX
+1000f1a5 MOV EDX,dword ptr [EAX]
+1000f1a7 CALL dword ptr [EDX + 0x20]
+1000f1aa MOV ESI,EAX
+1000f1ac CMP ESI,-0x1
+1000f1af JNZ 0x1000f1c5
+1000f1b1 PUSH 0x1006be94
+1000f1b6 MOV EDX,0x1006bf60
+1000f1bb MOV ECX,0x1006b3f4
+1000f1c0 CALL 0x10051b20
+1000f1c5 MOV ECX,dword ptr [ESP + 0x14]
+1000f1c9 MOV EAX,ESI
+1000f1cb SHL EAX,0x6
+1000f1ce PUSH 0x1
+1000f1d0 PUSH ESI
+1000f1d1 MOV EDX,dword ptr [EAX + ECX*0x1 + 0x4]
+1000f1d5 MOV dword ptr [EBP + 0x288],EDX
+1000f1db MOV EAX,dword ptr [EBP + 0x7c28]
+1000f1e1 PUSH EAX
+1000f1e2 MOV ECX,dword ptr [EAX]
+1000f1e4 CALL dword ptr [ECX + 0x18]
+1000f1e7 MOV dword ptr [EBP + 0x294],EAX
+1000f1ed MOV dword ptr [EBP + 0x298],0xc
+1000f1f7 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f1fd MOV EDI,0x4
+1000f202 PUSH EDI
+1000f203 PUSH EAX
+1000f204 MOV EDX,dword ptr [EAX]
+1000f206 CALL dword ptr [EDX + 0x20]
+1000f209 MOV ESI,EAX
+1000f20b CMP ESI,-0x1
+1000f20e JNZ 0x1000f224
+1000f210 PUSH 0x1006be94
+1000f215 MOV EDX,0x1006bf60
+1000f21a MOV ECX,0x1006b3f4
+1000f21f CALL 0x10051b20
+1000f224 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f22a PUSH 0x1
+1000f22c PUSH ESI
+1000f22d PUSH EAX
+1000f22e MOV ECX,dword ptr [EAX]
+1000f230 CALL dword ptr [ECX + 0x18]
+1000f233 MOV dword ptr [EBP + 0x29c],EAX
+1000f239 MOV dword ptr [EBP + 0x2a0],EDI
+1000f23f MOV EAX,dword ptr [EBP + 0x7c28]
+1000f245 PUSH 0x5
+1000f247 PUSH EAX
+1000f248 MOV EDX,dword ptr [EAX]
+1000f24a CALL dword ptr [EDX + 0x20]
+1000f24d MOV ESI,EAX
+1000f24f CMP ESI,-0x1
+1000f252 JNZ 0x1000f268
+1000f254 PUSH 0x1006be94
+1000f259 MOV EDX,0x1006bf60
+1000f25e MOV ECX,0x1006b3f4
+1000f263 CALL 0x10051b20
+1000f268 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f26e PUSH 0x1
+1000f270 PUSH ESI
+1000f271 PUSH EAX
+1000f272 MOV ECX,dword ptr [EAX]
+1000f274 CALL dword ptr [ECX + 0x18]
+1000f277 MOV dword ptr [EBP + 0x2b4],EAX
+1000f27d MOV dword ptr [EBP + 0x2b8],EDI
+1000f283 MOV dword ptr [EBP + 0x2bc],0x0
+1000f28d MOV EAX,dword ptr [EBP + 0x7c28]
+1000f293 PUSH 0x12
+1000f295 PUSH EAX
+1000f296 MOV EDX,dword ptr [EAX]
+1000f298 CALL dword ptr [EDX + 0x20]
+1000f29b MOV ESI,EAX
+1000f29d CMP ESI,-0x1
+1000f2a0 JNZ 0x1000f2b6
+1000f2a2 PUSH 0x1006be68
+1000f2a7 MOV EDX,0x1006bf60
+1000f2ac MOV ECX,0x1006b3f4
+1000f2b1 CALL 0x10051b20
+1000f2b6 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f2bc PUSH 0x1
+1000f2be PUSH ESI
+1000f2bf PUSH EAX
+1000f2c0 MOV ECX,dword ptr [EAX]
+1000f2c2 CALL dword ptr [ECX + 0x18]
+1000f2c5 MOV dword ptr [EBP + 0x2bc],EAX
+1000f2cb MOV dword ptr [EBP + 0x2c0],EDI
+1000f2d1 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f2d7 PUSH 0xe
+1000f2d9 PUSH EAX
+1000f2da MOV EDX,dword ptr [EAX]
+1000f2dc CALL dword ptr [EDX + 0x20]
+1000f2df CMP EAX,-0x1
+1000f2e2 JNZ 0x1000f2ee
+1000f2e4 XOR EAX,EAX
+1000f2e6 MOV dword ptr [EBP + 0x2ec],EAX
+1000f2ec JMP 0x1000f30b
+1000f2ee MOV ECX,dword ptr [EBP + 0x7c28]
+1000f2f4 PUSH 0x1
+1000f2f6 PUSH EAX
+1000f2f7 PUSH ECX
+1000f2f8 MOV EDX,dword ptr [ECX]
+1000f2fa CALL dword ptr [EDX + 0x18]
+1000f2fd MOV dword ptr [EBP + 0x2ec],EAX
+1000f303 MOV dword ptr [EBP + 0x2f0],EDI
+1000f309 XOR EAX,EAX
+1000f30b MOV dword ptr [EBP + 0x2a4],EAX
+1000f311 MOV dword ptr [EBP + 0x2ac],EAX
+1000f317 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f31d PUSH 0x15
+1000f31f PUSH EAX
+1000f320 MOV ECX,dword ptr [EAX]
+1000f322 CALL dword ptr [ECX + 0x20]
+1000f325 MOV ESI,EAX
+1000f327 CMP ESI,-0x1
+1000f32a JNZ 0x1000f340
+1000f32c PUSH 0x1006be94
+1000f331 MOV EDX,0x1006bf60
+1000f336 MOV ECX,0x1006b3f4
+1000f33b CALL 0x10051b20
+1000f340 MOV EAX,dword ptr [ESP + 0x14]
+1000f344 MOV EDX,ESI
+1000f346 SHL EDX,0x6
+1000f349 PUSH 0x1
+1000f34b PUSH ESI
+1000f34c MOV ECX,dword ptr [EDX + EAX*0x1 + 0x4]
+1000f350 MOV dword ptr [EBP + 0x28c],ECX
+1000f356 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f35c PUSH EAX
+1000f35d MOV EDX,dword ptr [EAX]
+1000f35f CALL dword ptr [EDX + 0x18]
+1000f362 MOV dword ptr [EBP + 0x2f4],EAX
+1000f368 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f36e PUSH 0x2
+1000f370 PUSH EAX
+1000f371 MOV ECX,dword ptr [EAX]
+1000f373 CALL dword ptr [ECX + 0x20]
+1000f376 MOV ESI,EAX
+1000f378 CMP ESI,-0x1
+1000f37b JNZ 0x1000f391
+1000f37d PUSH 0x1006be94
+1000f382 MOV EDX,0x1006bf60
+1000f387 MOV ECX,0x1006b3f4
+1000f38c CALL 0x10051b20
+1000f391 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f397 PUSH 0x0
+1000f399 PUSH ESI
+1000f39a PUSH EAX
+1000f39b MOV EDX,dword ptr [EAX]
+1000f39d CALL dword ptr [EDX + 0x18]
+1000f3a0 PUSH 0x28
+1000f3a2 MOV dword ptr [EBP + 0x14c],EAX
+1000f3a8 CALL 0x100597e7
+1000f3ad MOV dword ptr [EBP + 0x7b60],EAX
+1000f3b3 MOV ESI,dword ptr [EBP + 0x14c]
+1000f3b9 MOV ECX,0x18
+1000f3be LEA EDI,[EBP + 0x7b80]
+1000f3c4 MOVSD.REP ES:EDI,ESI
+1000f3c6 MOV EAX,dword ptr [EBP + 0x14c]
+1000f3cc MOV ECX,dword ptr [EBP + 0x7b60]
+1000f3d2 ADD ESP,0x4
+1000f3d5 MOV EDX,dword ptr [EAX]
+1000f3d7 MOV dword ptr [ECX + 0x4],EDX
+1000f3da MOV EAX,dword ptr [EBP + 0x14c]
+1000f3e0 MOV ECX,dword ptr [EBP + 0x7b60]
+1000f3e6 PUSH 0x1
+1000f3e8 MOV EDX,dword ptr [EAX + 0x4]
+1000f3eb MOV dword ptr [ECX + 0x8],EDX
+1000f3ee MOV EAX,dword ptr [EBP + 0x7c28]
+1000f3f4 PUSH EAX
+1000f3f5 MOV ECX,dword ptr [EAX]
+1000f3f7 CALL dword ptr [ECX + 0x20]
+1000f3fa MOV ESI,EAX
+1000f3fc CMP ESI,-0x1
+1000f3ff JNZ 0x1000f415
+1000f401 PUSH 0x1006be94
+1000f406 MOV EDX,0x1006bf60
+1000f40b MOV ECX,0x1006b3f4
+1000f410 CALL 0x10051b20
+1000f415 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f41b PUSH 0x0
+1000f41d PUSH ESI
+1000f41e PUSH EAX
+1000f41f MOV EDX,dword ptr [EAX]
+1000f421 CALL dword ptr [EDX + 0x18]
+1000f424 MOV dword ptr [EBP + 0x148],EAX
+1000f42a MOV EAX,dword ptr [ESP + 0x14]
+1000f42e MOV ECX,dword ptr [EBP + 0x7b60]
+1000f434 SHL ESI,0x6
+1000f437 ADD EAX,ESI
+1000f439 MOV EDX,dword ptr [EAX + 0x4]
+1000f43c MOV dword ptr [ECX + 0x24],EDX
+1000f43f MOV ECX,dword ptr [EBP + 0x7b60]
+1000f445 MOV EDX,dword ptr [EAX + 0x8]
+1000f448 MOV dword ptr [ECX + 0x1c],EDX
+1000f44b MOV ECX,dword ptr [EBP + 0x7b60]
+1000f451 MOV EAX,dword ptr [ECX + 0x24]
+1000f454 CDQ
+1000f455 IDIV dword ptr [ECX + 0x1c]
+1000f458 MOV dword ptr [ECX + 0x20],EAX
+1000f45b MOV ESI,dword ptr [EBP + 0x14c]
+1000f461 ADD ESI,0x94
+1000f467 MOV EAX,dword ptr [ESI + 0x8]
+1000f46a MOV ECX,dword ptr [ESI + 0x4]
+1000f46d MOV EDX,dword ptr [ESI]
+1000f46f PUSH EAX
+1000f470 PUSH ECX
+1000f471 PUSH EDX
+1000f472 LEA ECX,[ESP + 0xc0]
+1000f479 CALL 0x1000e230
+1000f47e MOV ECX,dword ptr [EAX]
+1000f480 MOV dword ptr [ESP + 0x124],ECX
+1000f487 MOV ECX,dword ptr [ESI + 0x8]
+1000f48a MOV EDX,dword ptr [EAX + 0x4]
+1000f48d PUSH ECX
+1000f48e MOV dword ptr [ESP + 0x12c],EDX
+1000f495 MOV EDX,dword ptr [ESI + 0x4]
+1000f498 MOV EAX,dword ptr [EAX + 0x8]
+1000f49b PUSH EDX
+1000f49c MOV dword ptr [ESP + 0x134],EAX
+1000f4a3 MOV EAX,dword ptr [ESI + 0xc]
+1000f4a6 PUSH EAX
+1000f4a7 LEA ECX,[ESP + 0xcc]
+1000f4ae CALL 0x1000e230
+1000f4b3 MOV ECX,dword ptr [ESI + 0x8]
+1000f4b6 MOV EDX,dword ptr [ESI + 0x10]
+1000f4b9 MOV EAX,dword ptr [ESI + 0xc]
+1000f4bc PUSH ECX
+1000f4bd PUSH EDX
+1000f4be PUSH EAX
+1000f4bf LEA ECX,[ESP + 0xb4]
+1000f4c6 CALL 0x1000e230
+1000f4cb MOV ECX,dword ptr [ESI + 0x14]
+1000f4ce MOV EDX,dword ptr [ESI + 0x10]
+1000f4d1 MOV EAX,dword ptr [ESI + 0xc]
+1000f4d4 PUSH ECX
+1000f4d5 PUSH EDX
+1000f4d6 PUSH EAX
+1000f4d7 LEA ECX,[ESP + 0x9c]
+1000f4de CALL 0x1000e230
+1000f4e3 MOV ECX,dword ptr [EAX]
+1000f4e5 MOV dword ptr [ESP + 0x178],ECX
+1000f4ec MOV ECX,dword ptr [ESI + 0x14]
+1000f4ef MOV EDX,dword ptr [EAX + 0x4]
+1000f4f2 PUSH ECX
+1000f4f3 MOV dword ptr [ESP + 0x180],EDX
+1000f4fa MOV EDX,dword ptr [ESI + 0x10]
+1000f4fd MOV EAX,dword ptr [EAX + 0x8]
+1000f500 PUSH EDX
+1000f501 MOV dword ptr [ESP + 0x188],EAX
+1000f508 MOV EAX,dword ptr [ESI]
+1000f50a PUSH EAX
+1000f50b LEA ECX,[ESP + 0x84]
+1000f512 CALL 0x1000e230
+1000f517 MOV ECX,dword ptr [ESI + 0x14]
+1000f51a MOV EDX,dword ptr [ESI + 0x4]
+1000f51d MOV EAX,dword ptr [ESI]
+1000f51f PUSH ECX
+1000f520 PUSH EDX
+1000f521 PUSH EAX
+1000f522 LEA ECX,[ESP + 0xa8]
+1000f529 CALL 0x1000e230
+1000f52e MOV ECX,dword ptr [ESI + 0x8]
+1000f531 MOV EDX,dword ptr [ESI + 0x10]
+1000f534 MOV EAX,dword ptr [ESI]
+1000f536 PUSH ECX
+1000f537 PUSH EDX
+1000f538 PUSH EAX
+1000f539 LEA ECX,[ESP + 0x78]
+1000f53d CALL 0x1000e230
+1000f542 MOV ECX,dword ptr [ESI + 0x14]
+1000f545 MOV EDX,dword ptr [ESI + 0x4]
+1000f548 MOV EAX,dword ptr [ESI + 0xc]
+1000f54b PUSH ECX
+1000f54c PUSH EDX
+1000f54d PUSH EAX
+1000f54e LEA ECX,[ESP + 0x90]
+1000f555 CALL 0x1000e230
+1000f55a FLD float ptr [ESP + 0x178]
+1000f561 FSUB float ptr [ESP + 0x124]
+1000f568 MOV ECX,dword ptr [EBP + 0x7b60]
+1000f56e PUSH 0xb
+1000f570 FSTP float ptr [ECX + 0xc]
+1000f573 FLD float ptr [ESP + 0x180]
+1000f57a FSUB float ptr [ESP + 0x12c]
+1000f581 MOV EDX,dword ptr [EBP + 0x7b60]
+1000f587 FSTP float ptr [EDX + 0x10]
+1000f58a MOV EAX,dword ptr [EBP + 0x7b60]
+1000f590 FLD float ptr [0x1006516c]
+1000f596 FDIV float ptr [EAX + 0xc]
+1000f599 FSTP float ptr [EAX + 0x14]
+1000f59c MOV EAX,dword ptr [EBP + 0x7b60]
+1000f5a2 FLD float ptr [0x1006516c]
+1000f5a8 FDIV float ptr [EAX + 0x10]
+1000f5ab FSTP float ptr [EAX + 0x18]
+1000f5ae MOV EAX,dword ptr [EBP + 0x7c28]
+1000f5b4 PUSH EAX
+1000f5b5 MOV ECX,dword ptr [EAX]
+1000f5b7 CALL dword ptr [ECX + 0x20]
+1000f5ba MOV ESI,EAX
+1000f5bc CMP ESI,-0x1
+1000f5bf JNZ 0x1000f5d5
+1000f5c1 PUSH 0x1006be94
+1000f5c6 MOV EDX,0x1006bf60
+1000f5cb MOV ECX,0x1006b3f4
+1000f5d0 CALL 0x10051b20
+1000f5d5 MOV EAX,dword ptr [EBP + 0x7c28]
+1000f5db PUSH 0x1
+1000f5dd PUSH ESI
+1000f5de PUSH EAX
+1000f5df MOV EDX,dword ptr [EAX]
+1000f5e1 CALL dword ptr [EDX + 0x18]
+1000f5e4 MOV dword ptr [EBP + 0x150],EAX
+1000f5ea MOV EAX,dword ptr [ESP + 0x68]
+1000f5ee PUSH EAX
+1000f5ef CALL 0x10059600
+1000f5f4 MOV ECX,dword ptr [ESP + 0x68]
+1000f5f8 PUSH ECX
+1000f5f9 CALL 0x10059600
+1000f5fe MOV EDX,dword ptr [ESP + 0x20]
+1000f602 PUSH EDX
+1000f603 CALL 0x10059600
+1000f608 MOV EAX,dword ptr [ESP + 0x1c]
+1000f60c PUSH EAX
+1000f60d CALL 0x10059600
+1000f612 MOV dword ptr [EBP + 0x7cdc],0xbf800000
+1000f61c MOV EAX,dword ptr [EBP + 0x28c]
+1000f622 ADD ESP,0x10
+1000f625 XOR ECX,ECX
+1000f627 TEST EAX,EAX
+1000f629 JBE 0x1000f661
+1000f62b MOV EDX,dword ptr [EBP + 0x2f4]
+1000f631 TEST dword ptr [EDX],0x20000
+1000f637 JNZ 0x1000f643
+1000f639 INC ECX
+1000f63a ADD EDX,0x1c
+1000f63d CMP ECX,EAX
+1000f63f JC 0x1000f631
+1000f641 JMP 0x1000f661
+1000f643 XOR EAX,EAX
+1000f645 MOV ECX,dword ptr [EBP + 0x294]
+1000f64b MOV AX,word ptr [EDX + 0x8]
+1000f64f IMUL EAX,dword ptr [EBP + 0x298]
+1000f656 ADD EAX,ECX
+1000f658 MOV ECX,dword ptr [EAX + 0x8]
+1000f65b MOV dword ptr [EBP + 0x7cdc],ECX
+1000f661 MOV ECX,0x18
+1000f666 MOV ESI,0x10070950
+1000f66b MOV EDI,EBX
+1000f66d XOR EAX,EAX
+1000f66f MOVSD.REP ES:EDI,ESI
+1000f671 MOV ECX,dword ptr [EBP + 0x28c]
+1000f677 MOV dword ptr [ESP + 0x10],EAX
+1000f67b CMP ECX,EAX
+1000f67d JBE 0x1000fe21
+1000f683 MOV dword ptr [ESP + 0x18],EAX
+1000f687 ADD EAX,dword ptr [EBP + 0x2f4]
+1000f68d TEST dword ptr [EAX],0x20000
+1000f693 JZ 0x1000fdff
+1000f699 MOV EDX,dword ptr [EBP + 0x298]
+1000f69f XOR ECX,ECX
+1000f6a1 MOV CX,word ptr [EAX + 0x8]
+1000f6a5 XOR ESI,ESI
+1000f6a7 MOV SI,word ptr [EAX + 0xa]
+1000f6ab IMUL ECX,EDX
+1000f6ae IMUL ESI,EDX
+1000f6b1 MOV EDI,dword ptr [EBP + 0x294]
+1000f6b7 ADD ECX,EDI
+1000f6b9 ADD ESI,EDI
+1000f6bb XOR EDI,EDI
+1000f6bd MOV DI,word ptr [EAX + 0xc]
+1000f6c1 MOV EAX,dword ptr [EBP + 0x294]
+1000f6c7 IMUL EDI,EDX
+1000f6ca FLD float ptr [ECX]
+1000f6cc MOV EDX,EBX
+1000f6ce ADD EDI,EAX
+1000f6d0 MOV EAX,dword ptr [EDX]
+1000f6d2 MOV dword ptr [ESP + 0x1c],EAX
+1000f6d6 MOV EAX,dword ptr [EDX + 0x4]
+1000f6d9 MOV dword ptr [ESP + 0x20],EAX
+1000f6dd LEA EAX,[EBX + 0x54]
+1000f6e0 MOV EDX,dword ptr [EDX + 0x8]
+1000f6e3 FCOMP float ptr [ESP + 0x1c]
+1000f6e7 MOV dword ptr [ESP + 0x24],EDX
+1000f6eb MOV EDX,dword ptr [EAX]
+1000f6ed MOV dword ptr [ESP + 0x34],EDX
+1000f6f1 MOV EDX,dword ptr [EAX + 0x4]
+1000f6f4 MOV dword ptr [ESP + 0x38],EDX
+1000f6f8 MOV EAX,dword ptr [EAX + 0x8]
+1000f6fb MOV dword ptr [ESP + 0x3c],EAX
+1000f6ff FNSTSW AX
+1000f701 TEST AH,0x1
+1000f704 JZ 0x1000f70c
+1000f706 MOV EDX,dword ptr [ECX]
+1000f708 MOV dword ptr [ESP + 0x1c],EDX
+1000f70c FLD float ptr [ECX + 0x4]
+1000f70f FCOMP float ptr [ESP + 0x20]
+1000f713 FNSTSW AX
+1000f715 TEST AH,0x1
+1000f718 JZ 0x1000f721
+1000f71a MOV EAX,dword ptr [ECX + 0x4]
+1000f71d MOV dword ptr [ESP + 0x20],EAX
+1000f721 FLD float ptr [ECX + 0x8]
+1000f724 FCOMP float ptr [ESP + 0x24]
+1000f728 FNSTSW AX
+1000f72a TEST AH,0x1
+1000f72d JZ 0x1000f736
+1000f72f MOV EDX,dword ptr [ECX + 0x8]
+1000f732 MOV dword ptr [ESP + 0x24],EDX
+1000f736 FLD float ptr [ECX]
+1000f738 FCOMP float ptr [ESP + 0x34]
+1000f73c FNSTSW AX
+1000f73e TEST AH,0x41
+1000f741 JNZ 0x1000f749
+1000f743 MOV EAX,dword ptr [ECX]
+1000f745 MOV dword ptr [ESP + 0x34],EAX
+1000f749 FLD float ptr [ECX + 0x4]
+1000f74c FCOMP float ptr [ESP + 0x38]
+1000f750 FNSTSW AX
+1000f752 TEST AH,0x41
+1000f755 JNZ 0x1000f75e
+1000f757 MOV EDX,dword ptr [ECX + 0x4]
+1000f75a MOV dword ptr [ESP + 0x38],EDX
+1000f75e FLD float ptr [ECX + 0x8]
+1000f761 FCOMP float ptr [ESP + 0x3c]
+1000f765 FNSTSW AX
+1000f767 TEST AH,0x41
+1000f76a JNZ 0x1000f773
+1000f76c MOV EAX,dword ptr [ECX + 0x8]
+1000f76f MOV dword ptr [ESP + 0x3c],EAX
+1000f773 FLD float ptr [ESP + 0x1c]
+1000f777 FSTP float ptr [ESP + 0x114]
+1000f77e FLD float ptr [ESP + 0x20]
+1000f782 FSTP float ptr [ESP + 0x118]
+1000f789 FLD float ptr [ESP + 0x24]
+1000f78d FSTP float ptr [ESP + 0x11c]
+1000f794 FLD float ptr [ESP + 0x34]
+1000f798 FSTP float ptr [ESP + 0x108]
+1000f79f FLD float ptr [ESP + 0x20]
+1000f7a3 FSTP float ptr [ESP + 0x10c]
+1000f7aa FLD float ptr [ESP + 0x24]
+1000f7ae FSTP float ptr [ESP + 0x110]
+1000f7b5 FLD float ptr [ESP + 0x34]
+1000f7b9 MOV EDX,dword ptr [ESP + 0x114]
+1000f7c0 MOV EAX,dword ptr [ESP + 0x118]
+1000f7c7 FSTP float ptr [ESP + 0xf0]
+1000f7ce FLD float ptr [ESP + 0x38]
+1000f7d2 FSTP float ptr [ESP + 0xf4]
+1000f7d9 FLD float ptr [ESP + 0x24]
+1000f7dd MOV ECX,EBX
+1000f7df FSTP float ptr [ESP + 0xf8]
+1000f7e6 FLD float ptr [ESP + 0x34]
+1000f7ea MOV dword ptr [ECX],EDX
+1000f7ec MOV EDX,dword ptr [ESP + 0x11c]
+1000f7f3 FSTP float ptr [ESP + 0xfc]
+1000f7fa FLD float ptr [ESP + 0x38]
+1000f7fe MOV dword ptr [ECX + 0x4],EAX
+1000f801 LEA EAX,[EBX + 0xc]
+1000f804 FSTP float ptr [ESP + 0x100]
+1000f80b MOV dword ptr [ECX + 0x8],EDX
+1000f80e MOV ECX,dword ptr [ESP + 0x108]
+1000f815 MOV EDX,dword ptr [ESP + 0x10c]
+1000f81c MOV dword ptr [EAX],ECX
+1000f81e MOV ECX,dword ptr [ESP + 0x110]
+1000f825 FLD float ptr [ESP + 0x3c]
+1000f829 MOV dword ptr [EAX + 0x4],EDX
+1000f82c LEA EDX,[EBX + 0x18]
+1000f82f FSTP float ptr [ESP + 0x104]
+1000f836 FLD float ptr [ESP + 0x1c]
+1000f83a MOV dword ptr [EAX + 0x8],ECX
+1000f83d MOV EAX,dword ptr [ESP + 0xf0]
+1000f844 MOV ECX,dword ptr [ESP + 0xf4]
+1000f84b MOV dword ptr [EDX],EAX
+1000f84d MOV EAX,dword ptr [ESP + 0xf8]
+1000f854 MOV dword ptr [EDX + 0x4],ECX
+1000f857 MOV ECX,dword ptr [ESP + 0xfc]
+1000f85e FSTP float ptr [ESP + 0xd8]
+1000f865 FLD float ptr [ESP + 0x38]
+1000f869 MOV dword ptr [EDX + 0x8],EAX
+1000f86c MOV EDX,dword ptr [ESP + 0x100]
+1000f873 MOV EAX,dword ptr [ESP + 0x104]
+1000f87a MOV dword ptr [EBX + 0x54],ECX
+1000f87d FSTP float ptr [ESP + 0xdc]
+1000f884 FLD float ptr [ESP + 0x3c]
+1000f888 MOV dword ptr [EBX + 0x58],EDX
+1000f88b MOV EDX,dword ptr [ESP + 0xd8]
+1000f892 LEA ECX,[EBX + 0x30]
+1000f895 MOV dword ptr [EBX + 0x5c],EAX
+1000f898 MOV EAX,dword ptr [ESP + 0xdc]
+1000f89f MOV dword ptr [ECX],EDX
+1000f8a1 FSTP float ptr [ESP + 0xe0]
+1000f8a8 MOV EDX,dword ptr [ESP + 0xe0]
+1000f8af MOV dword ptr [ECX + 0x4],EAX
+1000f8b2 FLD float ptr [ESP + 0x1c]
+1000f8b6 MOV dword ptr [ECX + 0x8],EDX
+1000f8b9 FSTP float ptr [ESP + 0xe4]
+1000f8c0 FLD float ptr [ESP + 0x20]
+1000f8c4 MOV ECX,dword ptr [ESP + 0xe4]
+1000f8cb LEA EAX,[EBX + 0x3c]
+1000f8ce FSTP float ptr [ESP + 0xe8]
+1000f8d5 FLD float ptr [ESP + 0x3c]
+1000f8d9 MOV EDX,dword ptr [ESP + 0xe8]
+1000f8e0 MOV dword ptr [EAX],ECX
+1000f8e2 FSTP float ptr [ESP + 0xec]
+1000f8e9 MOV ECX,dword ptr [ESP + 0xec]
+1000f8f0 MOV dword ptr [EAX + 0x4],EDX
+1000f8f3 MOV EDX,dword ptr [ESP + 0x24]
+1000f8f7 MOV dword ptr [EAX + 0x8],ECX
+1000f8fa MOV EAX,dword ptr [ESP + 0x38]
+1000f8fe MOV ECX,dword ptr [ESP + 0x1c]
+1000f902 PUSH EDX
+1000f903 PUSH EAX
+1000f904 PUSH ECX
+1000f905 LEA ECX,[ESP + 0x1f0]
+1000f90c CALL 0x1000e230
+1000f911 MOV ECX,dword ptr [EAX]
+1000f913 LEA EDX,[EBX + 0x24]
+1000f916 MOV dword ptr [EBX + 0x24],ECX
+1000f919 MOV ECX,dword ptr [EAX + 0x4]
+1000f91c MOV dword ptr [EDX + 0x4],ECX
+1000f91f MOV EAX,dword ptr [EAX + 0x8]
+1000f922 MOV ECX,dword ptr [ESP + 0x3c]
+1000f926 MOV dword ptr [EDX + 0x8],EAX
+1000f929 MOV EDX,dword ptr [ESP + 0x20]
+1000f92d MOV EAX,dword ptr [ESP + 0x34]
+1000f931 PUSH ECX
+1000f932 PUSH EDX
+1000f933 PUSH EAX
+1000f934 LEA ECX,[ESP + 0x190]
+1000f93b CALL 0x1000e230
+1000f940 MOV EDX,dword ptr [EAX]
+1000f942 LEA ECX,[EBX + 0x48]
+1000f945 MOV dword ptr [EBX + 0x48],EDX
+1000f948 MOV EDX,dword ptr [EAX + 0x4]
+1000f94b MOV dword ptr [ECX + 0x4],EDX
+1000f94e MOV EAX,dword ptr [EAX + 0x8]
+1000f951 MOV dword ptr [ECX + 0x8],EAX
+1000f954 MOV ECX,EBX
+1000f956 FLD float ptr [ESI]
+1000f958 MOV EDX,dword ptr [ECX]
+1000f95a MOV dword ptr [ESP + 0x28],EDX
+1000f95e MOV EAX,dword ptr [ECX + 0x4]
+1000f961 FCOMP float ptr [ESP + 0x28]
+1000f965 MOV ECX,dword ptr [ECX + 0x8]
+1000f968 MOV dword ptr [ESP + 0x2c],EAX
+1000f96c MOV dword ptr [ESP + 0x30],ECX
+1000f970 LEA ECX,[EBX + 0x54]
+1000f973 MOV EDX,ECX
+1000f975 MOV EAX,dword ptr [EDX]
+1000f977 MOV dword ptr [ESP + 0x40],EAX
+1000f97b MOV EAX,dword ptr [EDX + 0x4]
+1000f97e MOV dword ptr [ESP + 0x44],EAX
+1000f982 MOV EDX,dword ptr [EDX + 0x8]
+1000f985 FNSTSW AX
+1000f987 MOV dword ptr [ESP + 0x48],EDX
+1000f98b TEST AH,0x1
+1000f98e JZ 0x1000f996
+1000f990 MOV EAX,dword ptr [ESI]
+1000f992 MOV dword ptr [ESP + 0x28],EAX
+1000f996 FLD float ptr [ESI + 0x4]
+1000f999 FCOMP float ptr [ESP + 0x2c]
+1000f99d FNSTSW AX
+1000f99f TEST AH,0x1
+1000f9a2 JZ 0x1000f9ab
+1000f9a4 MOV EDX,dword ptr [ESI + 0x4]
+1000f9a7 MOV dword ptr [ESP + 0x2c],EDX
+1000f9ab FLD float ptr [ESI + 0x8]
+1000f9ae FCOMP float ptr [ESP + 0x30]
+1000f9b2 FNSTSW AX
+1000f9b4 TEST AH,0x1
+1000f9b7 JZ 0x1000f9c0
+1000f9b9 MOV EAX,dword ptr [ESI + 0x8]
+1000f9bc MOV dword ptr [ESP + 0x30],EAX
+1000f9c0 FLD float ptr [ESI]
+1000f9c2 FCOMP float ptr [ESP + 0x40]
+1000f9c6 FNSTSW AX
+1000f9c8 TEST AH,0x41
+1000f9cb JNZ 0x1000f9d3
+1000f9cd MOV EDX,dword ptr [ESI]
+1000f9cf MOV dword ptr [ESP + 0x40],EDX
+1000f9d3 FLD float ptr [ESI + 0x4]
+1000f9d6 FCOMP float ptr [ESP + 0x44]
+1000f9da FNSTSW AX
+1000f9dc TEST AH,0x41
+1000f9df JNZ 0x1000f9e8
+1000f9e1 MOV EAX,dword ptr [ESI + 0x4]
+1000f9e4 MOV dword ptr [ESP + 0x44],EAX
+1000f9e8 FLD float ptr [ESI + 0x8]
+1000f9eb FCOMP float ptr [ESP + 0x48]
+1000f9ef FNSTSW AX
+1000f9f1 TEST AH,0x41
+1000f9f4 JNZ 0x1000f9fd
+1000f9f6 MOV EDX,dword ptr [ESI + 0x8]
+1000f9f9 MOV dword ptr [ESP + 0x48],EDX
+1000f9fd FLD float ptr [ESP + 0x28]
+1000fa01 FSTP float ptr [ESP + 0xcc]
+1000fa08 FLD float ptr [ESP + 0x2c]
+1000fa0c FSTP float ptr [ESP + 0xd0]
+1000fa13 FLD float ptr [ESP + 0x30]
+1000fa17 FSTP float ptr [ESP + 0xd4]
+1000fa1e FLD float ptr [ESP + 0x40]
+1000fa22 FSTP float ptr [ESP + 0x84]
+1000fa29 FLD float ptr [ESP + 0x2c]
+1000fa2d FSTP float ptr [ESP + 0x88]
+1000fa34 FLD float ptr [ESP + 0x30]
+1000fa38 MOV EDX,dword ptr [ESP + 0xcc]
+1000fa3f MOV EAX,EBX
+1000fa41 FSTP float ptr [ESP + 0x8c]
+1000fa48 FLD float ptr [ESP + 0x40]
+1000fa4c FSTP float ptr [ESP + 0x6c]
+1000fa50 FLD float ptr [ESP + 0x44]
+1000fa54 MOV dword ptr [EAX],EDX
+1000fa56 MOV EDX,dword ptr [ESP + 0xd0]
+1000fa5d FSTP float ptr [ESP + 0x70]
+1000fa61 FLD float ptr [ESP + 0x30]
+1000fa65 MOV dword ptr [EAX + 0x4],EDX
+1000fa68 MOV EDX,dword ptr [ESP + 0xd4]
+1000fa6f FSTP float ptr [ESP + 0x74]
+1000fa73 FLD float ptr [ESP + 0x40]
+1000fa77 MOV dword ptr [EAX + 0x8],EDX
+1000fa7a MOV EDX,dword ptr [ESP + 0x84]
+1000fa81 LEA EAX,[EBX + 0xc]
+1000fa84 MOV ESI,dword ptr [ESP + 0x48]
+1000fa88 FSTP float ptr [ESP + 0x9c]
+1000fa8f FLD float ptr [ESP + 0x44]
+1000fa93 MOV dword ptr [EAX],EDX
+1000fa95 MOV EDX,dword ptr [ESP + 0x88]
+1000fa9c FSTP float ptr [ESP + 0xa0]
+1000faa3 MOV dword ptr [EAX + 0x4],EDX
+1000faa6 MOV EDX,dword ptr [ESP + 0x8c]
+1000faad FLD float ptr [ESP + 0x48]
+1000fab1 MOV dword ptr [EAX + 0x8],EDX
+1000fab4 MOV EDX,dword ptr [ESP + 0x6c]
+1000fab8 LEA EAX,[EBX + 0x18]
+1000fabb PUSH ESI
+1000fabc FSTP float ptr [ESP + 0xa8]
+1000fac3 FLD float ptr [ESP + 0x2c]
+1000fac7 MOV dword ptr [EAX],EDX
+1000fac9 MOV EDX,dword ptr [ESP + 0x74]
+1000facd FSTP float ptr [ESP + 0x7c]
+1000fad1 MOV dword ptr [EAX + 0x4],EDX
+1000fad4 MOV EDX,dword ptr [ESP + 0x78]
+1000fad8 FLD float ptr [ESP + 0x48]
+1000fadc MOV dword ptr [EAX + 0x8],EDX
+1000fadf MOV EAX,dword ptr [ESP + 0xa0]
+1000fae6 MOV EDX,dword ptr [ESP + 0xa4]
+1000faed MOV dword ptr [ECX],EAX
+1000faef MOV EAX,dword ptr [ESP + 0xa8]
+1000faf6 MOV dword ptr [ECX + 0x4],EDX
+1000faf9 MOV EDX,dword ptr [ESP + 0x7c]
+1000fafd MOV dword ptr [ECX + 0x8],EAX
+1000fb00 FSTP float ptr [ESP + 0x80]
+1000fb07 FLD float ptr [ESP + 0x4c]
+1000fb0b MOV EAX,dword ptr [ESP + 0x80]
+1000fb12 LEA ECX,[EBX + 0x30]
+1000fb15 FSTP float ptr [ESP + 0x84]
+1000fb1c MOV dword ptr [ECX],EDX
+1000fb1e MOV EDX,dword ptr [ESP + 0x84]
+1000fb25 MOV dword ptr [ECX + 0x4],EAX
+1000fb28 MOV dword ptr [ECX + 0x8],EDX
+1000fb2b MOV EAX,dword ptr [ESP + 0x30]
+1000fb2f MOV ECX,dword ptr [ESP + 0x2c]
+1000fb33 PUSH EAX
+1000fb34 PUSH ECX
+1000fb35 LEA ECX,[ESP + 0x1cc]
+1000fb3c CALL 0x1000e230
+1000fb41 MOV ECX,dword ptr [EAX]
+1000fb43 LEA EDX,[EBX + 0x3c]
+1000fb46 MOV dword ptr [EBX + 0x3c],ECX
+1000fb49 MOV ECX,dword ptr [EAX + 0x4]
+1000fb4c MOV dword ptr [EDX + 0x4],ECX
+1000fb4f MOV EAX,dword ptr [EAX + 0x8]
+1000fb52 MOV ECX,dword ptr [ESP + 0x30]
+1000fb56 MOV dword ptr [EDX + 0x8],EAX
+1000fb59 MOV EDX,dword ptr [ESP + 0x44]
+1000fb5d MOV EAX,dword ptr [ESP + 0x28]
+1000fb61 PUSH ECX
+1000fb62 PUSH EDX
+1000fb63 PUSH EAX
+1000fb64 LEA ECX,[ESP + 0x1b4]
+1000fb6b CALL 0x1000e230
+1000fb70 MOV EDX,dword ptr [EAX]
+1000fb72 LEA ECX,[EBX + 0x24]
+1000fb75 PUSH ESI
+1000fb76 MOV dword ptr [ECX],EDX
+1000fb78 MOV EDX,dword ptr [EAX + 0x4]
+1000fb7b MOV dword ptr [ECX + 0x4],EDX
+1000fb7e MOV EAX,dword ptr [EAX + 0x8]
+1000fb81 MOV EDX,dword ptr [ESP + 0x44]
+1000fb85 MOV dword ptr [ECX + 0x8],EAX
+1000fb88 MOV ECX,dword ptr [ESP + 0x30]
+1000fb8c PUSH ECX
+1000fb8d PUSH EDX
+1000fb8e LEA ECX,[ESP + 0x1e4]
+1000fb95 CALL 0x1000e230
+1000fb9a MOV EDX,dword ptr [EAX]
+1000fb9c LEA ECX,[EBX + 0x48]
+1000fb9f MOV dword ptr [EBX + 0x48],EDX
+1000fba2 MOV EDX,dword ptr [EAX + 0x4]
+1000fba5 MOV dword ptr [ECX + 0x4],EDX
+1000fba8 MOV EAX,dword ptr [EAX + 0x8]
+1000fbab MOV dword ptr [ECX + 0x8],EAX
+1000fbae MOV ECX,EBX
+1000fbb0 FLD float ptr [EDI]
+1000fbb2 MOV EDX,dword ptr [ECX]
+1000fbb4 MOV dword ptr [ESP + 0x4c],EDX
+1000fbb8 MOV EAX,dword ptr [ECX + 0x4]
+1000fbbb FCOMP float ptr [ESP + 0x4c]
+1000fbbf MOV ECX,dword ptr [ECX + 0x8]
+1000fbc2 MOV dword ptr [ESP + 0x50],EAX
+1000fbc6 MOV dword ptr [ESP + 0x54],ECX
+1000fbca LEA ECX,[EBX + 0x54]
+1000fbcd MOV EDX,ECX
+1000fbcf MOV EAX,dword ptr [EDX]
+1000fbd1 MOV dword ptr [ESP + 0x58],EAX
+1000fbd5 MOV EAX,dword ptr [EDX + 0x4]
+1000fbd8 MOV dword ptr [ESP + 0x5c],EAX
+1000fbdc MOV ESI,dword ptr [EDX + 0x8]
+1000fbdf FNSTSW AX
+1000fbe1 MOV dword ptr [ESP + 0x60],ESI
+1000fbe5 TEST AH,0x1
+1000fbe8 JZ 0x1000fbf0
+1000fbea MOV EDX,dword ptr [EDI]
+1000fbec MOV dword ptr [ESP + 0x4c],EDX
+1000fbf0 FLD float ptr [EDI + 0x4]
+1000fbf3 FCOMP float ptr [ESP + 0x50]
+1000fbf7 FNSTSW AX
+1000fbf9 TEST AH,0x1
+1000fbfc JZ 0x1000fc05
+1000fbfe MOV EAX,dword ptr [EDI + 0x4]
+1000fc01 MOV dword ptr [ESP + 0x50],EAX
+1000fc05 FLD float ptr [EDI + 0x8]
+1000fc08 FCOMP float ptr [ESP + 0x54]
+1000fc0c FNSTSW AX
+1000fc0e TEST AH,0x1
+1000fc11 JZ 0x1000fc1a
+1000fc13 MOV EDX,dword ptr [EDI + 0x8]
+1000fc16 MOV dword ptr [ESP + 0x54],EDX
+1000fc1a FLD float ptr [EDI]
+1000fc1c FCOMP float ptr [ESP + 0x58]
+1000fc20 FNSTSW AX
+1000fc22 TEST AH,0x41
+1000fc25 JNZ 0x1000fc2d
+1000fc27 MOV EAX,dword ptr [EDI]
+1000fc29 MOV dword ptr [ESP + 0x58],EAX
+1000fc2d FLD float ptr [EDI + 0x4]
+1000fc30 FCOMP float ptr [ESP + 0x5c]
+1000fc34 FNSTSW AX
+1000fc36 TEST AH,0x41
+1000fc39 JNZ 0x1000fc42
+1000fc3b MOV EDX,dword ptr [EDI + 0x4]
+1000fc3e MOV dword ptr [ESP + 0x5c],EDX
+1000fc42 FLD float ptr [EDI + 0x8]
+1000fc45 FCOMP float ptr [ESP + 0x60]
+1000fc49 FNSTSW AX
+1000fc4b TEST AH,0x41
+1000fc4e JNZ 0x1000fc59
+1000fc50 MOV EAX,dword ptr [EDI + 0x8]
+1000fc53 MOV dword ptr [ESP + 0x60],EAX
+1000fc57 MOV ESI,EAX
+1000fc59 FLD float ptr [ESP + 0x4c]
+1000fc5d FSTP float ptr [ESP + 0x90]
+1000fc64 FLD float ptr [ESP + 0x50]
+1000fc68 FSTP float ptr [ESP + 0x94]
+1000fc6f FLD float ptr [ESP + 0x54]
+1000fc73 FSTP float ptr [ESP + 0x98]
+1000fc7a FLD float ptr [ESP + 0x58]
+1000fc7e FSTP float ptr [ESP + 0xa8]
+1000fc85 FLD float ptr [ESP + 0x50]
+1000fc89 MOV EAX,dword ptr [ESP + 0x90]
+1000fc90 MOV EDX,EBX
+1000fc92 FSTP float ptr [ESP + 0xac]
+1000fc99 FLD float ptr [ESP + 0x54]
+1000fc9d FSTP float ptr [ESP + 0xb0]
+1000fca4 FLD float ptr [ESP + 0x58]
+1000fca8 MOV dword ptr [EDX],EAX
+1000fcaa MOV EAX,dword ptr [ESP + 0x94]
+1000fcb1 FSTP float ptr [ESP + 0xc0]
+1000fcb8 FLD float ptr [ESP + 0x5c]
+1000fcbc MOV dword ptr [EDX + 0x4],EAX
+1000fcbf MOV EAX,dword ptr [ESP + 0x98]
+1000fcc6 FSTP float ptr [ESP + 0xc4]
+1000fccd FLD float ptr [ESP + 0x54]
+1000fcd1 MOV dword ptr [EDX + 0x8],EAX
+1000fcd4 MOV EAX,dword ptr [ESP + 0xa8]
+1000fcdb LEA EDX,[EBX + 0xc]
+1000fcde MOV EDI,dword ptr [ESP + 0x4c]
+1000fce2 FSTP float ptr [ESP + 0xc8]
+1000fce9 FLD float ptr [ESP + 0x58]
+1000fced MOV dword ptr [EDX],EAX
+1000fcef MOV EAX,dword ptr [ESP + 0xac]
+1000fcf6 FSTP float ptr [ESP + 0xb4]
+1000fcfd MOV dword ptr [EDX + 0x4],EAX
+1000fd00 MOV EAX,dword ptr [ESP + 0xb0]
+1000fd07 FLD float ptr [ESP + 0x5c]
+1000fd0b MOV dword ptr [EDX + 0x8],EAX
+1000fd0e MOV EAX,dword ptr [ESP + 0xc0]
+1000fd15 LEA EDX,[EBX + 0x18]
+1000fd18 PUSH ESI
+1000fd19 FSTP float ptr [ESP + 0xbc]
+1000fd20 FLD float ptr [ESP + 0x64]
+1000fd24 MOV dword ptr [EDX],EAX
+1000fd26 MOV EAX,dword ptr [ESP + 0xc8]
+1000fd2d FSTP float ptr [ESP + 0xc0]
+1000fd34 MOV dword ptr [EDX + 0x4],EAX
+1000fd37 MOV EAX,dword ptr [ESP + 0xcc]
+1000fd3e MOV dword ptr [EDX + 0x8],EAX
+1000fd41 MOV EDX,dword ptr [ESP + 0xb8]
+1000fd48 MOV EAX,dword ptr [ESP + 0xbc]
+1000fd4f MOV dword ptr [ECX],EDX
+1000fd51 MOV EDX,dword ptr [ESP + 0xc0]
+1000fd58 MOV dword ptr [ECX + 0x4],EAX
+1000fd5b MOV EAX,dword ptr [ESP + 0x60]
+1000fd5f MOV dword ptr [ECX + 0x8],EDX
+1000fd62 PUSH EAX
+1000fd63 PUSH EDI
+1000fd64 LEA ECX,[ESP + 0x19c]
+1000fd6b CALL 0x1000e230
+1000fd70 MOV EDX,dword ptr [EAX]
+1000fd72 LEA ECX,[EBX + 0x30]
+1000fd75 PUSH ESI
+1000fd76 MOV dword ptr [ECX],EDX
+1000fd78 MOV EDX,dword ptr [EAX + 0x4]
+1000fd7b MOV dword ptr [ECX + 0x4],EDX
+1000fd7e MOV EAX,dword ptr [EAX + 0x8]
+1000fd81 MOV dword ptr [ECX + 0x8],EAX
+1000fd84 MOV ECX,dword ptr [ESP + 0x54]
+1000fd88 PUSH ECX
+1000fd89 PUSH EDI
+1000fd8a LEA ECX,[ESP + 0x1a8]
+1000fd91 CALL 0x1000e230
+1000fd96 MOV ECX,dword ptr [EAX]
+1000fd98 LEA EDX,[EBX + 0x3c]
+1000fd9b MOV dword ptr [EBX + 0x3c],ECX
+1000fd9e MOV ECX,dword ptr [EAX + 0x4]
+1000fda1 MOV dword ptr [EDX + 0x4],ECX
+1000fda4 MOV EAX,dword ptr [EAX + 0x8]
+1000fda7 MOV ECX,dword ptr [ESP + 0x54]
+1000fdab MOV dword ptr [EDX + 0x8],EAX
+1000fdae MOV EDX,dword ptr [ESP + 0x5c]
+1000fdb2 PUSH ECX
+1000fdb3 PUSH EDX
+1000fdb4 PUSH EDI
+1000fdb5 LEA ECX,[ESP + 0x1c0]
+1000fdbc CALL 0x1000e230
+1000fdc1 MOV EDX,dword ptr [EAX]
+1000fdc3 LEA ECX,[EBX + 0x24]
+1000fdc6 PUSH ESI
+1000fdc7 MOV dword ptr [ECX],EDX
+1000fdc9 MOV EDX,dword ptr [EAX + 0x4]
+1000fdcc MOV dword ptr [ECX + 0x4],EDX
+1000fdcf MOV EAX,dword ptr [EAX + 0x8]
+1000fdd2 MOV EDX,dword ptr [ESP + 0x5c]
+1000fdd6 MOV dword ptr [ECX + 0x8],EAX
+1000fdd9 MOV ECX,dword ptr [ESP + 0x54]
+1000fddd PUSH ECX
+1000fdde PUSH EDX
+1000fddf LEA ECX,[ESP + 0x1d8]
+1000fde6 CALL 0x1000e230
+1000fdeb MOV EDX,dword ptr [EAX]
+1000fded LEA ECX,[EBX + 0x48]
+1000fdf0 MOV dword ptr [EBX + 0x48],EDX
+1000fdf3 MOV EDX,dword ptr [EAX + 0x4]
+1000fdf6 MOV dword ptr [ECX + 0x4],EDX
+1000fdf9 MOV EAX,dword ptr [EAX + 0x8]
+1000fdfc MOV dword ptr [ECX + 0x8],EAX
+1000fdff MOV ECX,dword ptr [ESP + 0x10]
+1000fe03 MOV EAX,dword ptr [ESP + 0x18]
+1000fe07 MOV EDX,dword ptr [EBP + 0x28c]
+1000fe0d INC ECX
+1000fe0e ADD EAX,0x1c
+1000fe11 CMP ECX,EDX
+1000fe13 MOV dword ptr [ESP + 0x10],ECX
+1000fe17 MOV dword ptr [ESP + 0x18],EAX
+1000fe1b JC 0x1000f687
+1000fe21 MOV ECX,dword ptr [EBP + 0x7b60]
+1000fe27 MOV ESI,dword ptr [ECX + 0x24]
+1000fe2a LEA EDX,[ESI + ESI*0x2]
+1000fe2d LEA EAX,[EDX*0x4 + 0x4]
+1000fe34 PUSH EAX
+1000fe35 CALL 0x100597e7
+1000fe3a ADD ESP,0x4
+1000fe3d MOV dword ptr [ESP + 0x10],EAX
+1000fe41 XOR EBX,EBX
+1000fe43 MOV byte ptr [ESP + 0x1f8],0x7
+1000fe4b CMP EAX,EBX
+1000fe4d JZ 0x1000fe69
+1000fe4f PUSH 0x10044900
+1000fe54 PUSH 0x10015d00
+1000fe59 LEA EDI,[EAX + 0x4]
+1000fe5c PUSH ESI
+1000fe5d PUSH 0xc
+1000fe5f PUSH EDI
+1000fe60 MOV dword ptr [EAX],ESI
+1000fe62 CALL 0x10059d5f
+1000fe67 JMP 0x1000fe6b
+1000fe69 XOR EDI,EDI
+1000fe6b MOV ECX,dword ptr [EBP + 0x7b60]
+1000fe71 MOV dword ptr [EBP + 0x7b64],EDI
+1000fe77 MOV byte ptr [ESP + 0x1f8],0x6
+1000fe7f MOV ESI,dword ptr [ECX + 0x24]
+1000fe82 LEA EDX,[ESI + ESI*0x2]
+1000fe85 LEA EAX,[EDX*0x4 + 0x4]
+1000fe8c PUSH EAX
+1000fe8d CALL 0x100597e7
+1000fe92 ADD ESP,0x4
+1000fe95 MOV dword ptr [ESP + 0x10],EAX
+1000fe99 CMP EAX,EBX
+1000fe9b MOV byte ptr [ESP + 0x1f8],0x8
+1000fea3 JZ 0x1000febf
+1000fea5 PUSH 0x10044900
+1000feaa PUSH 0x10015c50
+1000feaf LEA EDI,[EAX + 0x4]
+1000feb2 PUSH ESI
+1000feb3 PUSH 0xc
+1000feb5 PUSH EDI
+1000feb6 MOV dword ptr [EAX],ESI
+1000feb8 CALL 0x10059d5f
+1000febd JMP 0x1000fec1
+1000febf XOR EDI,EDI
+1000fec1 MOV ECX,dword ptr [EBP + 0x7b60]
+1000fec7 MOV dword ptr [EBP + 0x7b70],EDI
+1000fecd MOV byte ptr [ESP + 0x1f8],0x6
+1000fed5 MOV ESI,dword ptr [ECX + 0x24]
+1000fed8 LEA EDX,[ESI + ESI*0x2]
+1000fedb LEA EAX,[EDX*0x4 + 0x4]
+1000fee2 PUSH EAX
+1000fee3 CALL 0x100597e7
+1000fee8 ADD ESP,0x4
+1000feeb MOV dword ptr [ESP + 0x10],EAX
+1000feef CMP EAX,EBX
+1000fef1 MOV byte ptr [ESP + 0x1f8],0x9
+1000fef9 JZ 0x1000ff17
+1000fefb PUSH 0x10044900
+1000ff00 PUSH 0x10015d30
+1000ff05 LEA EDI,[EAX + 0x4]
+1000ff08 PUSH ESI
+1000ff09 PUSH 0xc
+1000ff0b PUSH EDI
+1000ff0c MOV dword ptr [EAX],ESI
+1000ff0e CALL 0x10059d5f
+1000ff13 MOV EAX,EDI
+1000ff15 JMP 0x1000ff19
+1000ff17 XOR EAX,EAX
+1000ff19 MOV dword ptr [EBP + 0x7b68],EAX
+1000ff1f LEA EAX,[EBP + 0x7b3c]
+1000ff25 MOV EDX,dword ptr [EBP + 0x7be4]
+1000ff2b MOV dword ptr [EBP + 0x194],EAX
+1000ff31 LEA EAX,[EBP + 0x7b48]
+1000ff37 MOV dword ptr [EBP + 0x1c4],EDX
+1000ff3d MOV dword ptr [EBP + 0x198],EAX
+1000ff43 LEA EAX,[EBP + 0x7c54]
+1000ff49 MOV dword ptr [EBP + 0x160],EAX
+1000ff4f LEA EAX,[EBP + 0x7c5c]
+1000ff55 MOV dword ptr [EBP + 0x164],EAX
+1000ff5b LEA EDX,[EBP + 0x7b54]
+1000ff61 LEA EAX,[EBP + 0x7c6c]
+1000ff67 MOV dword ptr [EBP + 0x19c],EDX
+1000ff6d MOV dword ptr [EBP + 0x1c8],EAX
+1000ff73 LEA EDX,[EBP + 0x7c64]
+1000ff79 LEA EAX,[EBP + 0x7c74]
+1000ff7f MOV dword ptr [EBP + 0x168],EDX
+1000ff85 MOV dword ptr [EBP + 0x1cc],EAX
+1000ff8b OR ECX,0xffffffff
+1000ff8e LEA EDX,[EBP + 0x7c7c]
+1000ff94 LEA EAX,[EBP + 0x7c48]
+1000ff9a MOV dword ptr [EBP + 0x1a0],ECX
+1000ffa0 MOV dword ptr [EBP + 0x1a8],EBX
+1000ffa6 MOV dword ptr [EBP + 0x1d0],EDX
+1000ffac MOV dword ptr [EBP + 0x170],EAX
+1000ffb2 MOV dword ptr [EBP + 0x1dc],ECX
+1000ffb8 MOV dword ptr [EBP + 0x1e4],ECX
+1000ffbe MOV dword ptr [EBP + 0x1f4],EBX
+1000ffc4 MOV dword ptr [EBP + 0x1e8],EBX
+1000ffca MOV dword ptr [EBP + 0x1ec],0xfffffffe
+1000ffd4 MOV dword ptr [EBP + 0x1f0],EBX
+1000ffda MOV dword ptr [EBP + 0x1f8],EBX
+1000ffe0 MOV dword ptr [EBP + 0x1fc],EBX
+1000ffe6 MOV dword ptr [EBP + 0x200],EBX
+1000ffec MOV dword ptr [EBP + 0x204],EBX
+1000fff2 MOV EAX,dword ptr [EBP + 0x278]
+1000fff8 MOV ESI,dword ptr [EBP + 0x28c]
+1000fffe CMP EAX,EBX
+10010000 MOV byte ptr [ESP + 0x1f8],0x6
+10010008 MOV dword ptr [ESP + 0x18],ESI
+1001000c JNZ 0x10010021
+1001000e PUSH 0x1f40
+10010013 CALL 0x100597e7
+10010018 ADD ESP,0x4
+1001001b MOV dword ptr [EBP + 0x278],EAX
+10010021 MOV ECX,dword ptr [EBP + 0x27c]
+10010027 LEA EAX,[ESI + ECX*0x1]
+1001002a MOV ECX,dword ptr [EBP + 0x280]
+10010030 CMP EAX,ECX
+10010032 JLE 0x10010092
+10010034 LEA EDX,[EAX*0x8 + 0x320]
+1001003b PUSH EDX
+1001003c CALL 0x100597e7
+10010041 MOV ECX,dword ptr [EBP + 0x280]
+10010047 MOV ESI,dword ptr [EBP + 0x278]
+1001004d SHL ECX,0x3
+10010050 MOV dword ptr [ESP + 0x14],EAX
+10010054 MOV EDI,EAX
+10010056 MOV EAX,ECX
+10010058 SHR ECX,0x2
+1001005b MOVSD.REP ES:EDI,ESI
+1001005d MOV ECX,EAX
+1001005f AND ECX,0x3
+10010062 MOVSB.REP ES:EDI,ESI
+10010064 MOV ECX,dword ptr [EBP + 0x278]
+1001006a PUSH ECX
+1001006b CALL 0x10059600
+10010070 MOV EAX,dword ptr [EBP + 0x27c]
+10010076 MOV ECX,dword ptr [ESP + 0x20]
+1001007a MOV EDX,dword ptr [ESP + 0x18]
+1001007e ADD ESP,0x8
+10010081 ADD EAX,ECX
+10010083 MOV dword ptr [EBP + 0x278],EDX
+10010089 LEA EDX,[EAX + 0x64]
+1001008c MOV dword ptr [EBP + 0x280],EDX
+10010092 MOV dword ptr [EBP + 0x27c],EAX
+10010098 MOV ECX,dword ptr [EBP + 0x28c]
+1001009e XOR EAX,EAX
+100100a0 CMP ECX,EBX
+100100a2 JBE 0x100100d2
+100100a4 XOR ECX,ECX
+100100a6 MOV ESI,dword ptr [EBP + 0x2f4]
+100100ac MOV EDX,ECX
+100100ae ADD EDX,ESI
+100100b0 MOV ESI,dword ptr [EBP + 0x278]
+100100b6 ADD ECX,0x1c
+100100b9 MOV dword ptr [ESI + EAX*0x8],EDX
+100100bc MOV EDX,dword ptr [EBP + 0x278]
+100100c2 MOV byte ptr [EDX + EAX*0x8 + 0x4],0x0
+100100c7 MOV EDX,dword ptr [EBP + 0x28c]
+100100cd INC EAX
+100100ce CMP EAX,EDX
+100100d0 JC 0x100100a6
+100100d2 LEA EDI,[EBP + 0x5558]
+100100d8 MOV ECX,0x19
+100100dd XOR EAX,EAX
+100100df STOSD.REP ES:EDI
+100100e1 MOV dword ptr [EBP + 0x7c90],EBX
+100100e7 CALL 0x100282c0
+100100ec MOV ECX,dword ptr [ESP + 0x1f0]
+100100f3 MOV dword ptr [EBP + 0x7c18],EAX
+100100f9 POP EDI
+100100fa MOV dword ptr [EBP + 0x7c20],EBX
+10010100 MOV dword ptr [EBP + 0x7c24],0x10
+1001010a MOV dword ptr [EBP + 0x7c94],0x2
+10010114 MOV EAX,EBP
+10010116 POP ESI
+10010117 POP EBP
+10010118 POP EBX
+10010119 MOV dword ptr FS:[0x0],ECX
+10010120 ADD ESP,0x1ec
+10010126 RET 0x10
\ No newline at end of file
diff --git a/ParkanPlayground/from_ghidra/CLandscape_typedef.c b/ParkanPlayground/from_ghidra/CLandscape_typedef.c
new file mode 100644
index 0000000..9d02d0c
--- /dev/null
+++ b/ParkanPlayground/from_ghidra/CLandscape_typedef.c
@@ -0,0 +1,60 @@
+typedef struct CLandscape {
+ IComponent * IComponent;
+ CGameObject game_object;
+ ITerrain * ITerrain;
+ IMesh2 * IMesh2;
+ I0x1 * I0x1;
+ IControl * IControl;
+ I0x22 * IUnknown_0x22;
+ undefined4 01_data_ptr;
+ MSH_02_file * msh_02_data_ptr;
+ undefined4 0b_data_ptr;
+// collapse unknown fields
+ int[3][5] field_532;
+// collapse unknown fields
+ undefined4 IComponent_owner;
+ KindaArray array_0x278;
+ int _count_unk_obj_array_elemsize_212;
+ undefined4 vertices_count;
+ uint 15_element_count;
+// collapse unknown fields
+ Vector3 * 03_vertices_data_ptr;
+ int 03_vertices_stride;
+ undefined4 04_data_ptr;
+ undefined4 04_stride;
+// collapse unknown fields
+ undefined4 05_data_ptr;
+ undefined4 05_stride;
+ undefined4 12_microtexture_mapping_data_ptr;
+ undefined4 12_microtexture_mapping_stride;
+// collapse unknown fields
+ MshMetaForLandscape * mshmeta_ptr;
+// collapse unknown fields
+ KindaArray array_0x7a40;
+ BoundingBox bounding_box_from_msh_02;
+ IMatManager * * IMatManager;
+ undefined4 wear_ptr;
+ IEffectManager * * ResolvedIEffectManager;
+ ISystemArealMap * * ResolvedISystemArealMap;
+ ICollManager * * ResolvedICollManager;
+ ISoundPool * * ISoundPool;
+ I3DSound * * I3DSound;
+ ILightManager * * ILightManager_owned;
+ KindaArray array_0x7c00;
+ KindaArray array_0x7c0c;
+ CShade * Shade;
+ undefined4 I3DRender??;
+ undefined4 field_31776;
+ undefined4 flags_of_mesh_part;
+ INResFile * * INResFile;
+ KindaArray array_0x7c2c;
+ undefined4 current_visible_primitives_count;
+ IMesh2 * * meshes;
+ IGameObject * * game_objects;
+// collapse unknown fields
+ KindaArray array_0x7c84;
+ undefined4 * field_31888;
+ undefined4 _CheckMaxBasementAngleStep;
+ CollisionContext m_CollisionContext;
+ BoundingBox bounding_box;
+} CLandscape;
\ No newline at end of file
diff --git a/ParkanPlayground/from_ghidra/IMesh2_of_CLandscape_Render.c b/ParkanPlayground/from_ghidra/IMesh2_of_CLandscape_Render.c
new file mode 100644
index 0000000..65fb1bd
--- /dev/null
+++ b/ParkanPlayground/from_ghidra/IMesh2_of_CLandscape_Render.c
@@ -0,0 +1,1232 @@
+// Decompiled C Code:
+
+/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
+/* WARNING: Enum "DRAW_PRIMITIVE_FLAGS": Some values do not have unique names */
+/* WARNING: Exceeded maximum restarts with more pending */
+
+void IMesh2_of_CLandscape::Render
+ (IMesh2_of_CLandscape this,CBufferingCamera *camera,uint param_3,int **param_4)
+
+{
+ MshMetaForLandscape *pMVar1;
+ uint uVar2;
+ ICPrimBuffer *usePass2;
+ bool bVar3;
+ CShade *pCVar4;
+ int iVar5;
+ CameraFrustum *this_00;
+ CShade *pCVar6;
+ ENewLogicID iVar8;
+ int iVar7;
+ int *piVar8;
+ uint *puVar9;
+ undefined4 *puVar10;
+ float *pfVar11;
+ CShade **ppCVar12;
+ undefined4 extraout_ECX;
+ IMesh2_of_CLandscape this_01;
+ int iVar13;
+ Vector3 *pVVar14;
+ int iVar15;
+ float *pfVar16;
+ Plane *pPVar17;
+ float10 fVar18;
+ RECT *viewportOverride;
+ char cVar19;
+ ClipPlanes_WeirdAllignment **outPlanes;
+ Vector3 **outVertices;
+ undefined4 uVar20;
+ MSH_02_element *pMVar21;
+ CPrimBuffer *pCVar22;
+ CPrimitiveContents *primitiveContents;
+ CPrimBuffer **ppCVar23;
+ CShade *pCVar24;
+ CPrimBuffer *pCStack_6f4;
+ CShade *pCStack_6f0;
+ CShade *pCStack_6ec;
+ CShade *pCStack_6e8;
+ CPrimBuffer *pCStack_6e4;
+ undefined1 *puStack_6e0;
+ int iStack_6dc;
+ Vector3 *pVStack_6d8;
+ IShade *pIStack_6d4;
+ IBufferingCamera **piStack_6d0;
+ IGameObject ***ppIStack_6cc;
+ CShade *pCStack_6c8;
+ IGameObject **ppIStack_6c4;
+ CShade *pCStack_6c0;
+ int iStack_6bc;
+ CShade *pCStack_6b8;
+ ClipPlanes_WeirdAllignment *pCStack_6b4;
+ GetFrustumLayerConfig get_frustum_layer_config;
+ CPrimBuffer *pCStack_6a8;
+ undefined1 uStack_6a4;
+ int iStack_6a0;
+ int iStack_69c;
+ int iStack_698;
+ int iStack_694;
+ float afStack_690 [5];
+ undefined4 uStack_67c;
+ undefined4 uStack_670;
+ undefined4 uStack_664;
+ undefined4 uStack_658;
+ undefined4 uStack_64c;
+ undefined4 uStack_640;
+ undefined4 uStack_634;
+ float afStack_630 [24];
+ undefined1 auStack_5d0 [96];
+ CameraFrustum camera_frustum;
+ undefined4 uStack_4;
+
+ if (ADJ(this)->field9833_0x7c20 == 0) {
+ ADJ(this)->field9833_0x7c20 = 1;
+ ppIStack_6c4 = (IGameObject **)(param_3 & 0x40);
+ if ((ppIStack_6c4 == (IGameObject **)0x0) && (iVar13 = 0, 0 < (ADJ(this)->array_0x7a40).count))
+ {
+ do {
+ iVar5 = (*(code *)**(undefined4 **)(ADJ(this)->array_0x7a40).data[iVar13])();
+ if (iVar5 != 0) {
+ (**(code **)(*(int *)pIStack_6d4 + 0x2c))();
+ }
+ iVar13 = iVar13 + 1;
+ } while (iVar13 < (ADJ(this)->array_0x7a40).count);
+ }
+ (ADJ(this)->array_0x7c84).count = 0;
+ ppIStack_6cc = (IGameObject ***)(uint)((param_3 & 9) == 0);
+ pIStack_6d4 = ADJ(this)->Shade->vptr;
+ iVar13 = (*pIStack_6d4->CollectVisiblePrimitivesAndGetCount)
+ (ADJ(this)->Shade,
+ (IComponent **)(-(uint)(this != (IMesh2_of_CLandscape)0x138) & (uint)this),
+ (uint)camera,(ICamera ***)0x0,&ADJ(this)->meshes,&ADJ(this)->game_objects);
+ ADJ(this)->current_visible_primitives_count = iVar13;
+ (*ADJ(this)->Shade->vptr->StartMeshRender)
+ (ADJ(this)->Shade,camera,
+ (IMesh2 **)(-(uint)(this != (IMesh2_of_CLandscape)0x138) & (uint)this),
+ ADJ(this)->IMatManager,0);
+ (*(camera->vptr->IComponent).QueryInterface)(camera,IBufferingCamera,&piStack_6d0);
+ outVertices = &pVStack_6d8;
+ outPlanes = &pCStack_6b4;
+ primitiveContents = (CPrimitiveContents *)&DAT_100708d0;
+ get_frustum_layer_config.usePass2 = 0;
+ get_frustum_layer_config.index = 0;
+ viewportOverride = (RECT *)0x0;
+ this_00 = (CameraFrustum *)
+ (*(*piStack_6d0)->GetFrustum)
+ (piStack_6d0,(BOOL)&camera_frustum,(int)&get_frustum_layer_config);
+ CameraFrustum::method_58ed0(this_00,viewportOverride,outPlanes,outVertices,primitiveContents);
+ iVar13 = 5;
+ puStack_6e0 = &DAT_7f7fffff;
+ pCStack_6e4 = (CPrimBuffer *)&DAT_7f7fffff;
+ pCVar24 = (CShade *)0x800000;
+ pCStack_6e8 = (CShade *)0x800000;
+ pCVar6 = (CShade *)ppIStack_6cc;
+ pVVar14 = pVStack_6d8;
+ do {
+ if (pVVar14->x < (float)pCStack_6e4) {
+ pCStack_6e4 = (CPrimBuffer *)pVVar14->x;
+ fVar18 = floor((double)((pVVar14->x - (float)ADJ(this)->mshmeta_ptr->min_x) *
+ ADJ(this)->mshmeta_ptr->inv_width));
+ pCVar6 = (CShade *)round((double)fVar18);
+ }
+ if (pVVar14->y < (float)puStack_6e0) {
+ puStack_6e0 = (undefined1 *)pVVar14->y;
+ fVar18 = floor((double)((pVVar14->y - (float)ADJ(this)->mshmeta_ptr->min_y) *
+ ADJ(this)->mshmeta_ptr->inv_height));
+ pCStack_6ec = (CShade *)round((double)fVar18);
+ }
+ if ((float)pCStack_6e8 < pVVar14->x) {
+ pCStack_6e8 = (CShade *)pVVar14->x;
+ fVar18 = floor((double)((pVVar14->x - (float)ADJ(this)->mshmeta_ptr->min_x) *
+ ADJ(this)->mshmeta_ptr->inv_width));
+ pCStack_6f4 = (CPrimBuffer *)round((double)fVar18);
+ }
+ if ((float)pCVar24 < pVVar14->y) {
+ pCVar24 = (CShade *)pVVar14->y;
+ fVar18 = floor((double)((pVVar14->y - (float)ADJ(this)->mshmeta_ptr->min_y) *
+ ADJ(this)->mshmeta_ptr->inv_height));
+ pCStack_6f0 = (CShade *)round((double)fVar18);
+ }
+ pVVar14 = pVVar14 + 1;
+ iVar13 = iVar13 + -1;
+ } while (iVar13 != 0);
+ if ((int)pCVar6 < 0) {
+ pCVar6 = (CShade *)0x0;
+ }
+ pMVar1 = ADJ(this)->mshmeta_ptr;
+ iVar13 = pMVar1->_1_magic1;
+ if (iVar13 <= (int)pCVar6) {
+ pCVar6 = (CShade *)(iVar13 + -1);
+ }
+ if ((int)pCStack_6ec < 0) {
+ pCStack_6ec = (CShade *)0x0;
+ }
+ uVar2 = pMVar1->_1_element_count_magic1;
+ if ((int)uVar2 <= (int)pCStack_6ec) {
+ pCStack_6ec = (CShade *)(uVar2 - 1);
+ }
+ if ((int)pCStack_6f4 < 0) {
+ pCStack_6f4 = (CPrimBuffer *)0x0;
+ }
+ if (iVar13 <= (int)pCStack_6f4) {
+ pCStack_6f4 = (CPrimBuffer *)(iVar13 + -1);
+ }
+ if ((int)pCStack_6f0 < 0) {
+ pCStack_6f0 = (CShade *)0x0;
+ }
+ if ((int)uVar2 <= (int)pCStack_6f0) {
+ pCStack_6f0 = (CShade *)(uVar2 - 1);
+ }
+ iVar5 = ((int)pCStack_6f0 + (1 - (int)pCStack_6ec)) * ((int)pCStack_6f4 + (1 - (int)pCVar6));
+ fVar18 = floor((double)((pVStack_6d8->x - (float)pMVar1->min_x) * pMVar1->inv_width));
+ iVar13 = round((double)fVar18);
+ iStack_6a0 = iVar13;
+ fVar18 = floor((double)((pVStack_6d8->y - (float)ADJ(this)->mshmeta_ptr->min_y) *
+ ADJ(this)->mshmeta_ptr->inv_height));
+ iStack_69c = round((double)fVar18);
+ iStack_698 = ADJ(this)->mshmeta_ptr->_1_element_count_magic1 * iVar13 + iStack_69c;
+ if ((int)pCStack_6f4 - iVar13 < iVar13 - (int)pCVar6) {
+ iStack_6bc = -1;
+ pCVar6 = (CShade *)pCStack_6f4;
+ }
+ else {
+ iStack_6bc = 1;
+ }
+ if ((int)pCStack_6f0 - iStack_69c < iStack_69c - (int)pCStack_6ec) {
+ puStack_6e0 = (undefined1 *)0xffffffff;
+ pCStack_6e8 = pCStack_6ec;
+ pCStack_6ec = pCStack_6f0;
+ }
+ else {
+ puStack_6e0 = (undefined1 *)0x1;
+ pCStack_6e8 = pCStack_6f0;
+ }
+ pCStack_6f0 = pCStack_6ec;
+ pCStack_6c0 = pCStack_6ec;
+ if ((DAT_100708cc & 1) == 0) {
+ DAT_100708cc = DAT_100708cc | 1;
+ pCStack_6ec = pCVar6;
+ FUN_100156f0((int *)&DAT_100708c0);
+ atexit(&LAB_10011fd0);
+ pCVar6 = pCStack_6ec;
+ }
+ pCStack_6ec = pCVar6;
+ if (DAT_100708c4 != 0) {
+ FUN_10015d60((undefined4 *)DAT_100708c0->IShadowProcessor);
+ DAT_100708c0->IShadeStatsBuilder = (IShadeStatsBuilder *)DAT_100708c0;
+ DAT_100708c0->IShadowProcessor = (IShadowProcessor *)0x0;
+ DAT_100708c0->activeICamera = (ICamera **)DAT_100708c0;
+ DAT_100708c4 = 0;
+ }
+ iVar13 = (*((ADJ(this)->game_object).vptr)->QueryChildren)
+ (&ADJ(this)->game_object,&ppIStack_6c4);
+ iVar15 = 0;
+ if (0 < iVar13) {
+ do {
+ iVar8 = (**(code **)((ppIStack_6c4[iVar15]->IComponent).QueryInterface + 0x2c))();
+ if ((iVar8 == BULL_Agent) &&
+ (iVar7 = (**(code **)(ppIStack_6c4[iVar15]->IComponent).QueryInterface)(), iVar7 != 0)) {
+ piVar8 = (int *)FUN_10038580(&DAT_100708c0,(int *)&pCStack_6b8,(uint *)&pCStack_6f4);
+ pCVar6 = (CShade *)*piVar8;
+ if ((pCVar6 == DAT_100708c0) || (pCStack_6f4 < pCVar6->PrimBufferOfBufferingCamera)) {
+ puVar9 = FUN_10015900(&pCStack_6a8,&pCStack_6f4,&stack0xfffff906);
+ uVar20 = extraout_ECX;
+ FUN_10037e80(&stack0xfffff8ec,(undefined4 *)&stack0xfffff908);
+ puVar10 = (undefined4 *)FUN_100158b0(&DAT_100708c0,&pCStack_6c8,uVar20,puVar9);
+ pCVar6 = (CShade *)*puVar10;
+ }
+ *(undefined1 *)&(pCVar6->m_CameraFrustum).cameraPosMatrixPtr = 0;
+ }
+ iVar15 = iVar15 + 1;
+ } while (iVar15 < iVar13);
+ }
+ if (0 < iVar5) {
+ pCStack_6c8 = (CShade *)
+ ((int)(pCStack_6e8->m_CameraFrustum).pad_004 + (int)puStack_6e0 + -0x18);
+ iStack_6dc = iVar5;
+ do {
+ iVar5 = (int)(pCStack_6f0->m_CameraFrustum).pad_004 +
+ ADJ(this)->mshmeta_ptr->_1_element_count_magic1 * (int)pCStack_6ec + -0x18;
+ pVVar14 = &ADJ(this)->msh_02_data_ptr->elements
+ [*(ushort *)(ADJ(this)->_1_data_ptr + 8 + iVar5 * 0x26)].local_minimum;
+ pfVar11 = (float *)FUN_10015580(auStack_5d0,&pVVar14->x,&pVVar14[1].x);
+ pfVar16 = afStack_630;
+ for (iVar13 = 0x18; iVar13 != 0; iVar13 = iVar13 + -1) {
+ *pfVar16 = *pfVar11;
+ pfVar11 = pfVar11 + 1;
+ pfVar16 = pfVar16 + 1;
+ }
+ pfVar11 = afStack_630;
+ pfVar16 = afStack_690;
+ for (iVar13 = 0x18; iVar13 != 0; iVar13 = iVar13 + -1) {
+ *pfVar16 = *pfVar11;
+ pfVar11 = pfVar11 + 1;
+ pfVar16 = pfVar16 + 1;
+ }
+ uStack_64c = 0x43fa0000;
+ uStack_658 = 0x43fa0000;
+ uStack_640 = 0x43fa0000;
+ uStack_634 = 0x43fa0000;
+ afStack_690[2] = -100.0;
+ uStack_664 = 0xc2c80000;
+ uStack_67c = 0xc2c80000;
+ uStack_670 = 0xc2c80000;
+ pCStack_6f4 = (CPrimBuffer *)
+ (uint)(8 < ((int)pCStack_6f0 - iStack_69c) * ((int)pCStack_6f0 - iStack_69c) +
+ ((int)pCStack_6ec - iStack_6a0) * ((int)pCStack_6ec - iStack_6a0));
+ fVar18 = (float10)(*(*piStack_6d0)->GetFOV_into_ST0)();
+ if (fVar18 < (float10)FLOAT_100651fc) {
+ pCStack_6f4 = (CPrimBuffer *)0x0;
+ }
+ pCStack_6f0 = (CShade *)
+ ((int)(pCStack_6f0->m_CameraFrustum).pad_004 + (int)puStack_6e0 + -0x18);
+ if (pCStack_6f0 == pCStack_6c8) {
+ pCStack_6f0 = pCStack_6c0;
+ pCStack_6ec = (CShade *)((int)&pCStack_6ec->vptr + iStack_6bc);
+ }
+ if (iStack_698 == iVar5) {
+ bVar3 = false;
+ }
+ else {
+ pCVar6 = (CShade *)0x0;
+ pPVar17 = pCStack_6b4->p_m_currentFrustumPlanes;
+ do {
+ bVar3 = true;
+ pfVar11 = afStack_690 + 1;
+ iVar13 = 8;
+ do {
+ if (_DAT_10065158 <=
+ *pfVar11 * pPVar17->nY + pfVar11[1] * pPVar17->nZ + pfVar11[-1] * pPVar17->nX +
+ pPVar17->d) {
+ bVar3 = false;
+ }
+ pfVar11 = pfVar11 + 3;
+ iVar13 = iVar13 + -1;
+ } while (iVar13 != 0);
+ if (bVar3) goto LAB_10011de5;
+ pPVar17 = pPVar17 + 1;
+ pCVar6 = (CShade *)((int)&pCVar6->vptr + 1);
+ } while ((int)pCVar6 < 6);
+ }
+ if (pIStack_6d4 != (IShade *)0x0) {
+ pfVar11 = afStack_690;
+ cVar19 = (char)((uint)ADJ(this)->field9840_0x7c44 >> 0x10);
+ (*(code *)ADJ(this)->Shade->vptr->method19)
+ (ADJ(this)->Shade,ADJ(this)->current_visible_primitives_count,ADJ(this)->meshes,
+ ADJ(this)->game_objects);
+ if ((ADJ(this)->field9816_0x7b68[iVar5 * 3 + 1] != 0) ||
+ (*(short *)(ADJ(this)->_1_data_ptr + 8 + ((int)pfVar11 + iVar5 * 0x13) * 2) == 0xff)) {
+ pfVar11 = (float *)0x0;
+ }
+ pMVar21 = ADJ(this)->msh_02_data_ptr->elements +
+ *(ushort *)(ADJ(this)->_1_data_ptr + 8 + ((int)pfVar11 + iVar5 * 0x13) * 2);
+ (*ADJ(this)->Shade->vptr->SetIsJointClippedByFrustum)(ADJ(this)->Shade,cVar19 == '\0');
+ (*(code *)ADJ(this)->Shade->vptr->method3)
+ (ADJ(this)->Shade,0,pMVar21->count_in_07,
+ ADJ(this)->_b_data_ptr + (uint)(ushort)pMVar21->start_index_in_07 * 4,0);
+ if (pfVar11 == (float *)0x0) {
+ piVar8 = ADJ(this)->field9816_0x7b68 + iVar5 * 3;
+ pCVar6 = (CShade *)0x0;
+ if (0 < piVar8[1]) {
+ do {
+ iVar13 = *(int *)(*piVar8 + (int)pCVar6 * 4);
+ if (ADJ(this)->unk_obj_array_elemsize_212[99][iVar13 + 0x60] == 0) {
+ ADJ(this)->unk_obj_array_elemsize_212[99][iVar13 + 0x60] = 1;
+ (*ADJ(this)->Shade->vptr->SetIsJointClippedByFrustum)(ADJ(this)->Shade,true);
+ (*(code *)ADJ(this)->Shade->vptr->method19)
+ (ADJ(this)->Shade,ADJ(this)->current_visible_primitives_count,
+ ADJ(this)->meshes,ADJ(this)->game_objects,ADJ(this)->field9840_0x7c44);
+ (*(code *)ADJ(this)->Shade->vptr->method3)
+ (ADJ(this)->Shade,0,
+ *(undefined4 *)
+ (ADJ(this)->unk_obj_array_elemsize_212[iVar13 + -1] + 0x68),
+ *(undefined4 *)
+ (ADJ(this)->unk_obj_array_elemsize_212[iVar13 + -1] + 0xd0),0);
+ }
+ pCVar6 = (CShade *)((int)&pCVar6->vptr + 1);
+ piVar8 = ADJ(this)->field9816_0x7b68 + iVar5 * 3;
+ } while ((int)pCVar6 < piVar8[1]);
+ }
+ }
+ }
+LAB_10011de5:
+ puVar10 = ADJ(this)->field9818_0x7b70;
+ iVar13 = 0;
+ if (0 < (int)puVar10[iVar5 * 3 + 1]) {
+ do {
+ iVar15 = (**(code **)**(undefined4 **)(puVar10[iVar5 * 3] + iVar13 * 4))();
+ if (iVar15 != 0) {
+ pCVar24 = (CShade *)DAT_100708c0->IShadowProcessor;
+ pCVar6 = DAT_100708c0;
+ while (pCVar4 = pCVar24, pCVar4 != (CShade *)0x0) {
+ if (pCVar4->PrimBufferOfBufferingCamera < pCStack_6e4) {
+ pCVar24 = (CShade *)pCVar4->activeICamera;
+ }
+ else {
+ pCVar24 = (CShade *)pCVar4->IShadeStatsBuilder;
+ pCVar6 = pCVar4;
+ }
+ }
+ if ((pCVar6 == DAT_100708c0) || (pCStack_6e4 < pCVar6->PrimBufferOfBufferingCamera)) {
+ pCStack_6b8 = DAT_100708c0;
+ ppCVar12 = &pCStack_6b8;
+ }
+ else {
+ ppCVar12 = (CShade **)&stack0xfffff908;
+ }
+ pCVar6 = *ppCVar12;
+ if (DAT_100708c0 == pCVar6) {
+ piVar8 = (int *)FUN_10038580(&DAT_100708c0,&iStack_694,(uint *)&pCStack_6e4);
+ pCStack_6e8 = (CShade *)*piVar8;
+ if ((pCStack_6e8 == DAT_100708c0) ||
+ (pCStack_6e4 < pCStack_6e8->PrimBufferOfBufferingCamera)) {
+ ppCVar23 = &pCStack_6a8;
+ pCStack_6a8 = pCStack_6e4;
+ uStack_6a4 = 0;
+ pCVar22 = pCStack_6e4;
+ FUN_10037e80(&stack0xfffff8ec,&pCStack_6e8);
+ puVar10 = (undefined4 *)
+ FUN_100158b0(&DAT_100708c0,&get_frustum_layer_config.usePass2,pCVar22,
+ (uint *)ppCVar23);
+ pCStack_6e8 = (CShade *)*puVar10;
+ }
+ *(bool *)&(pCStack_6e8->m_CameraFrustum).cameraPosMatrixPtr = !bVar3;
+ }
+ else if (*(char *)&(pCVar6->m_CameraFrustum).cameraPosMatrixPtr == '\0') {
+ *(bool *)&(pCVar6->m_CameraFrustum).cameraPosMatrixPtr = !bVar3;
+ }
+ }
+ puVar10 = ADJ(this)->field9818_0x7b70;
+ iVar13 = iVar13 + 1;
+ } while (iVar13 < (int)puVar10[iVar5 * 3 + 1]);
+ }
+ iStack_6dc = iStack_6dc + -1;
+ } while (iStack_6dc != 0);
+ }
+ (*(code *)ADJ(this)->Shade->vptr->EndMeshRender)();
+ if ((piStack_6d0 == (IBufferingCamera **)0x0) &&
+ (pCVar6 = (CShade *)DAT_100708c0->IShadeStatsBuilder, pCVar6 != DAT_100708c0)) {
+ do {
+ usePass2 = pCVar6->PrimBufferOfBufferingCamera->vptr;
+ this_01 = this;
+ if (*(char *)&(pCVar6->m_CameraFrustum).cameraPosMatrixPtr == '\0') {
+ this_01 = (IMesh2_of_CLandscape)((uint)this | 1);
+ }
+ (*usePass2[2].GetLayer)(this_01,(BOOL)usePass2,(int)pCVar6->PrimBufferOfBufferingCamera);
+ pCVar24 = (CShade *)pCVar6->activeICamera;
+ if (pCVar24 == (CShade *)0x0) {
+ pCVar24 = (CShade *)pCVar6->IShadowProcessor;
+ if (pCVar6 == (CShade *)pCVar24->activeICamera) {
+ do {
+ pCVar6 = pCVar24;
+ pCVar24 = (CShade *)pCVar6->IShadowProcessor;
+ } while (pCVar6 == (CShade *)pCVar24->activeICamera);
+ }
+ if ((CShade *)pCVar6->activeICamera != pCVar24) {
+ pCVar6 = pCVar24;
+ }
+ }
+ else {
+ for (pCVar4 = (CShade *)pCVar24->IShadeStatsBuilder; pCVar6 = pCVar24,
+ pCVar4 != (CShade *)0x0; pCVar4 = (CShade *)pCVar4->IShadeStatsBuilder) {
+ pCVar24 = pCVar4;
+ }
+ }
+ } while (pCVar6 != DAT_100708c0);
+ }
+ (*(code *)ADJ(this)->Shade->vptr->method7)();
+ (*(code *)(*ADJ(this)->ResolvedIEffectManager)->Render__)
+ (ADJ(this)->ResolvedIEffectManager,uStack_4,0xfffffffe);
+ }
+ return;
+}
+
+
+
+---
+
+// Assembly:
+100115a0 SUB ESP,0x6f4
+100115a6 PUSH EBX
+100115a7 PUSH EBP
+100115a8 MOV EBP,dword ptr [ESP + 0x700]
+100115af PUSH ESI
+100115b0 PUSH EDI
+100115b1 MOV EAX,dword ptr [EBP + 0x7ae8]
+100115b7 TEST EAX,EAX
+100115b9 JNZ 0x10011fc1
+100115bf MOV EBX,dword ptr [ESP + 0x710]
+100115c6 MOV EDI,dword ptr [ESP + 0x714]
+100115cd MOV EAX,EBX
+100115cf MOV dword ptr [EBP + 0x7ae8],0x1
+100115d9 AND EAX,0x40
+100115dc MOV dword ptr [ESP + 0x40],EAX
+100115e0 JNZ 0x10011628
+100115e2 MOV EAX,dword ptr [EBP + 0x7a40]
+100115e8 XOR ESI,ESI
+100115ea TEST EAX,EAX
+100115ec JLE 0x10011628
+100115ee MOV EAX,dword ptr [EBP + 0x7a3c]
+100115f4 LEA EDX,[ESP + 0x30]
+100115f8 PUSH EDX
+100115f9 MOV EDX,0x18
+100115fe MOV ECX,dword ptr [EAX + ESI*0x4]
+10011601 MOV EAX,dword ptr [ECX]
+10011603 CALL dword ptr [EAX]
+10011605 TEST EAX,EAX
+10011607 JZ 0x1001161d
+10011609 MOV EAX,dword ptr [ESP + 0x30]
+1001160d MOV EDX,dword ptr [ESP + 0x70c]
+10011614 PUSH EDI
+10011615 PUSH EBX
+10011616 MOV ECX,dword ptr [EAX]
+10011618 PUSH EDX
+10011619 PUSH EAX
+1001161a CALL dword ptr [ECX + 0x2c]
+1001161d MOV EAX,dword ptr [EBP + 0x7a40]
+10011623 INC ESI
+10011624 CMP ESI,EAX
+10011626 JL 0x100115ee
+10011628 XOR EAX,EAX
+1001162a MOV dword ptr [ESP + 0x38],0x1
+10011632 TEST BL,0x9
+10011635 MOV dword ptr [EBP + 0x7b50],EAX
+1001163b JZ 0x10011641
+1001163d MOV dword ptr [ESP + 0x38],EAX
+10011641 MOV ECX,dword ptr [EBP + 0x7ae0]
+10011647 LEA ESI,[EBP + 0xfffffec8]
+1001164d MOV EAX,ESI
+1001164f LEA EDX,[EBP + 0x7b0c]
+10011655 MOV EBX,dword ptr [ECX]
+10011657 LEA EDI,[EBP + 0x7b08]
+1001165d NEG EAX
+1001165f PUSH EDX
+10011660 LEA EDX,[EBP + 0x7b04]
+10011666 SBB EAX,EAX
+10011668 MOV dword ptr [ESP + 0x34],EBX
+1001166c PUSH EDI
+1001166d MOV EDI,dword ptr [ESP + 0x714]
+10011674 XOR EBX,EBX
+10011676 PUSH EDX
+10011677 AND EAX,EBP
+10011679 PUSH EBX
+1001167a PUSH EDI
+1001167b PUSH EAX
+1001167c MOV EAX,dword ptr [ESP + 0x48]
+10011680 PUSH ECX
+10011681 CALL dword ptr [EAX + 0x58]
+10011684 NEG ESI
+10011686 MOV dword ptr [EBP + 0x7b00],EAX
+1001168c MOV EDX,dword ptr [EBP + 0x7aa8]
+10011692 MOV EAX,dword ptr [EBP + 0x7ae0]
+10011698 PUSH EBX
+10011699 SBB ESI,ESI
+1001169b PUSH EBX
+1001169c MOV ECX,dword ptr [EAX]
+1001169e AND ESI,EBP
+100116a0 PUSH EDX
+100116a1 PUSH ESI
+100116a2 PUSH EDI
+100116a3 PUSH EAX
+100116a4 CALL dword ptr [ECX + 0x14]
+100116a7 MOV EAX,dword ptr [EDI]
+100116a9 LEA ECX,[ESP + 0x3c]
+100116ad PUSH ECX
+100116ae MOV EDX,0x12
+100116b3 MOV ECX,EDI
+100116b5 CALL dword ptr [EAX]
+100116b7 LEA EDX,[ESP + 0x34]
+100116bb PUSH 0x100708d0
+100116c0 MOV ECX,dword ptr [ESP + 0x40]
+100116c4 LEA EAX,[ESP + 0x5c]
+100116c8 PUSH EDX
+100116c9 PUSH EAX
+100116ca LEA EDX,[ESP + 0x68]
+100116ce MOV dword ptr [ESP + 0x68],EBX
+100116d2 MOV dword ptr [ESP + 0x6c],EBX
+100116d6 MOV EAX,dword ptr [ECX]
+100116d8 PUSH EBX
+100116d9 PUSH EDX
+100116da LEA EDX,[ESP + 0x1b0]
+100116e1 CALL dword ptr [EAX + 0x4c]
+100116e4 MOV ECX,EAX
+100116e6 CALL 0x10058ed0
+100116eb MOV ESI,dword ptr [ESP + 0x34]
+100116ef MOV EDI,0x5
+100116f4 MOV EBX,dword ptr [ESP + 0x40]
+100116f8 MOV dword ptr [ESP + 0x2c],0x7f7fffff
+10011700 MOV dword ptr [ESP + 0x28],0x7f7fffff
+10011708 MOV dword ptr [ESP + 0x14],0x800000
+10011710 MOV dword ptr [ESP + 0x24],0x800000
+10011718 FLD float ptr [ESI]
+1001171a FCOMP float ptr [ESP + 0x28]
+1001171e FNSTSW AX
+10011720 TEST AH,0x1
+10011723 JZ 0x1001174e
+10011725 MOV EAX,dword ptr [ESI]
+10011727 SUB ESP,0x8
+1001172a FLD float ptr [ESI]
+1001172c MOV dword ptr [ESP + 0x30],EAX
+10011730 MOV EAX,dword ptr [EBP + 0x7a28]
+10011736 FSUB float ptr [EAX + 0x4]
+10011739 FMUL float ptr [EAX + 0x14]
+1001173c FSTP double ptr [ESP]
+1001173f CALL 0x10059c87
+10011744 ADD ESP,0x8
+10011747 CALL 0x10001000
+1001174c MOV EBX,EAX
+1001174e FLD float ptr [ESI + 0x4]
+10011751 FCOMP float ptr [ESP + 0x2c]
+10011755 FNSTSW AX
+10011757 TEST AH,0x1
+1001175a JZ 0x10011789
+1001175c MOV EAX,dword ptr [EBP + 0x7a28]
+10011762 MOV ECX,dword ptr [ESI + 0x4]
+10011765 FLD float ptr [ESI + 0x4]
+10011768 FSUB float ptr [EAX + 0x8]
+1001176b SUB ESP,0x8
+1001176e MOV dword ptr [ESP + 0x34],ECX
+10011772 FMUL float ptr [EAX + 0x18]
+10011775 FSTP double ptr [ESP]
+10011778 CALL 0x10059c87
+1001177d ADD ESP,0x8
+10011780 CALL 0x10001000
+10011785 MOV dword ptr [ESP + 0x20],EAX
+10011789 FLD float ptr [ESI]
+1001178b FCOMP float ptr [ESP + 0x24]
+1001178f FNSTSW AX
+10011791 TEST AH,0x41
+10011794 JNZ 0x100117c1
+10011796 MOV EAX,dword ptr [EBP + 0x7a28]
+1001179c MOV EDX,dword ptr [ESI]
+1001179e FLD float ptr [ESI]
+100117a0 FSUB float ptr [EAX + 0x4]
+100117a3 SUB ESP,0x8
+100117a6 MOV dword ptr [ESP + 0x2c],EDX
+100117aa FMUL float ptr [EAX + 0x14]
+100117ad FSTP double ptr [ESP]
+100117b0 CALL 0x10059c87
+100117b5 ADD ESP,0x8
+100117b8 CALL 0x10001000
+100117bd MOV dword ptr [ESP + 0x18],EAX
+100117c1 FLD float ptr [ESI + 0x4]
+100117c4 FCOMP float ptr [ESP + 0x14]
+100117c8 FNSTSW AX
+100117ca TEST AH,0x41
+100117cd JNZ 0x100117fc
+100117cf MOV EAX,dword ptr [ESI + 0x4]
+100117d2 SUB ESP,0x8
+100117d5 FLD float ptr [ESI + 0x4]
+100117d8 MOV dword ptr [ESP + 0x1c],EAX
+100117dc MOV EAX,dword ptr [EBP + 0x7a28]
+100117e2 FSUB float ptr [EAX + 0x8]
+100117e5 FMUL float ptr [EAX + 0x18]
+100117e8 FSTP double ptr [ESP]
+100117eb CALL 0x10059c87
+100117f0 ADD ESP,0x8
+100117f3 CALL 0x10001000
+100117f8 MOV dword ptr [ESP + 0x1c],EAX
+100117fc ADD ESI,0xc
+100117ff DEC EDI
+10011800 JNZ 0x10011718
+10011806 TEST EBX,EBX
+10011808 JGE 0x1001180c
+1001180a XOR EBX,EBX
+1001180c MOV EAX,dword ptr [EBP + 0x7a28]
+10011812 MOV ECX,dword ptr [EAX + 0x1c]
+10011815 CMP EBX,ECX
+10011817 JL 0x1001181c
+10011819 LEA EBX,[ECX + -0x1]
+1001181c MOV EDX,dword ptr [ESP + 0x20]
+10011820 TEST EDX,EDX
+10011822 JGE 0x1001182c
+10011824 MOV dword ptr [ESP + 0x20],0x0
+1001182c MOV EDX,dword ptr [EAX + 0x20]
+1001182f MOV ESI,dword ptr [ESP + 0x20]
+10011833 CMP ESI,EDX
+10011835 JL 0x1001183e
+10011837 LEA ESI,[EDX + -0x1]
+1001183a MOV dword ptr [ESP + 0x20],ESI
+1001183e MOV ESI,dword ptr [ESP + 0x18]
+10011842 TEST ESI,ESI
+10011844 JGE 0x1001184c
+10011846 XOR ESI,ESI
+10011848 MOV dword ptr [ESP + 0x18],ESI
+1001184c CMP ESI,ECX
+1001184e JL 0x10011855
+10011850 DEC ECX
+10011851 MOV dword ptr [ESP + 0x18],ECX
+10011855 MOV ECX,dword ptr [ESP + 0x1c]
+10011859 TEST ECX,ECX
+1001185b JGE 0x10011863
+1001185d XOR ECX,ECX
+1001185f MOV dword ptr [ESP + 0x1c],ECX
+10011863 CMP ECX,EDX
+10011865 JL 0x1001186c
+10011867 DEC EDX
+10011868 MOV dword ptr [ESP + 0x1c],EDX
+1001186c MOV EDI,dword ptr [ESP + 0x1c]
+10011870 MOV EDX,dword ptr [ESP + 0x20]
+10011874 SUB EDI,EDX
+10011876 MOV EDX,dword ptr [ESP + 0x34]
+1001187a MOV ECX,dword ptr [ESP + 0x18]
+1001187e SUB ESP,0x8
+10011881 FLD float ptr [EDX]
+10011883 FSUB float ptr [EAX + 0x4]
+10011886 SUB ECX,EBX
+10011888 INC EDI
+10011889 INC ECX
+1001188a IMUL EDI,ECX
+1001188d FMUL float ptr [EAX + 0x14]
+10011890 FSTP double ptr [ESP]
+10011893 CALL 0x10059c87
+10011898 CALL 0x10001000
+1001189d MOV ECX,dword ptr [ESP + 0x3c]
+100118a1 MOV ESI,EAX
+100118a3 MOV EAX,dword ptr [EBP + 0x7a28]
+100118a9 MOV dword ptr [ESP + 0x74],ESI
+100118ad FLD float ptr [ECX + 0x4]
+100118b0 FSUB float ptr [EAX + 0x8]
+100118b3 FMUL float ptr [EAX + 0x18]
+100118b6 FSTP double ptr [ESP]
+100118b9 CALL 0x10059c87
+100118be ADD ESP,0x8
+100118c1 CALL 0x10001000
+100118c6 MOV EDX,dword ptr [EBP + 0x7a28]
+100118cc MOV dword ptr [ESP + 0x70],EAX
+100118d0 MOV ECX,dword ptr [EDX + 0x20]
+100118d3 IMUL ECX,ESI
+100118d6 ADD ECX,EAX
+100118d8 MOV dword ptr [ESP + 0x74],ECX
+100118dc MOV ECX,dword ptr [ESP + 0x18]
+100118e0 SUB ECX,ESI
+100118e2 SUB ESI,EBX
+100118e4 CMP ESI,ECX
+100118e6 JG 0x100118f4
+100118e8 MOV dword ptr [ESP + 0x50],0x1
+100118f0 MOV ESI,EBX
+100118f2 JMP 0x10011900
+100118f4 MOV ESI,dword ptr [ESP + 0x18]
+100118f8 MOV dword ptr [ESP + 0x50],0xffffffff
+10011900 MOV ECX,dword ptr [ESP + 0x1c]
+10011904 MOV EDX,dword ptr [ESP + 0x20]
+10011908 MOV EBX,ECX
+1001190a SUB EBX,EAX
+1001190c SUB EAX,EDX
+1001190e CMP EAX,EBX
+10011910 JG 0x10011926
+10011912 MOV EAX,EDX
+10011914 MOV dword ptr [ESP + 0x2c],0x1
+1001191c MOV dword ptr [ESP + 0x4c],EAX
+10011920 MOV dword ptr [ESP + 0x24],ECX
+10011924 JMP 0x10011938
+10011926 MOV EAX,ECX
+10011928 MOV dword ptr [ESP + 0x2c],0xffffffff
+10011930 MOV dword ptr [ESP + 0x4c],EAX
+10011934 MOV dword ptr [ESP + 0x24],EDX
+10011938 MOV dword ptr [ESP + 0x1c],EAX
+1001193c MOV AL,[0x100708cc]
+10011941 TEST AL,0x1
+10011943 MOV dword ptr [ESP + 0x20],ESI
+10011947 JNZ 0x1001196b
+10011949 MOV DL,AL
+1001194b MOV ECX,0x100708c0
+10011950 OR DL,0x1
+10011953 MOV byte ptr [0x100708cc],DL
+10011959 CALL 0x100156f0
+1001195e PUSH 0x10011fd0
+10011963 CALL 0x100596c8
+10011968 ADD ESP,0x4
+1001196b MOV EAX,[0x100708c4]
+10011970 XOR ESI,ESI
+10011972 CMP EAX,ESI
+10011974 JZ 0x100119a9
+10011976 MOV EDX,dword ptr [0x100708c0]
+1001197c MOV ECX,0x100708c0
+10011981 MOV EAX,dword ptr [EDX + 0x4]
+10011984 PUSH EAX
+10011985 CALL 0x10015d60
+1001198a MOV EAX,[0x100708c0]
+1001198f MOV dword ptr [EAX + 0x8],EAX
+10011992 MOV ECX,dword ptr [0x100708c0]
+10011998 MOV dword ptr [ECX + 0x4],ESI
+1001199b MOV EAX,[0x100708c0]
+100119a0 MOV dword ptr [EAX + 0xc],EAX
+100119a3 MOV dword ptr [0x100708c4],ESI
+100119a9 MOV EDX,dword ptr [EBP + 0xfffffecc]
+100119af LEA EAX,[EBP + 0xfffffecc]
+100119b5 LEA ECX,[ESP + 0x48]
+100119b9 PUSH ECX
+100119ba PUSH EAX
+100119bb CALL dword ptr [EDX + 0x18]
+100119be MOV EBX,EAX
+100119c0 XOR ESI,ESI
+100119c2 TEST EBX,EBX
+100119c4 JLE 0x10011a6f
+100119ca MOV EDX,dword ptr [ESP + 0x48]
+100119ce MOV ECX,dword ptr [EDX + ESI*0x4]
+100119d1 MOV EAX,dword ptr [ECX]
+100119d3 CALL dword ptr [EAX + 0x2c]
+100119d6 CMP EAX,0x9
+100119d9 JNZ 0x10011a66
+100119df MOV ECX,dword ptr [ESP + 0x48]
+100119e3 LEA EDX,[ESP + 0x18]
+100119e7 PUSH EDX
+100119e8 MOV EDX,0x18
+100119ed MOV ECX,dword ptr [ECX + ESI*0x4]
+100119f0 MOV EAX,dword ptr [ECX]
+100119f2 CALL dword ptr [EAX]
+100119f4 TEST EAX,EAX
+100119f6 JZ 0x10011a66
+100119f8 LEA EAX,[ESP + 0x18]
+100119fc LEA ECX,[ESP + 0x54]
+10011a00 PUSH EAX
+10011a01 PUSH ECX
+10011a02 MOV ECX,0x100708c0
+10011a07 CALL 0x10038580
+10011a0c MOV EAX,dword ptr [EAX]
+10011a0e MOV ECX,dword ptr [0x100708c0]
+10011a14 CMP EAX,ECX
+10011a16 MOV dword ptr [ESP + 0x14],EAX
+10011a1a JZ 0x10011a27
+10011a1c MOV EDX,dword ptr [ESP + 0x18]
+10011a20 MOV ECX,dword ptr [EAX + 0x10]
+10011a23 CMP EDX,ECX
+10011a25 JNC 0x10011a62
+10011a27 LEA EAX,[ESP + 0x12]
+10011a2b LEA ECX,[ESP + 0x18]
+10011a2f PUSH EAX
+10011a30 PUSH ECX
+10011a31 LEA ECX,[ESP + 0x6c]
+10011a35 MOV byte ptr [ESP + 0x1a],0x0
+10011a3a CALL 0x10015900
+10011a3f PUSH EAX
+10011a40 PUSH ECX
+10011a41 LEA EDX,[ESP + 0x1c]
+10011a45 MOV ECX,ESP
+10011a47 PUSH EDX
+10011a48 CALL 0x10037e80
+10011a4d LEA EAX,[ESP + 0x4c]
+10011a51 MOV ECX,0x100708c0
+10011a56 PUSH EAX
+10011a57 CALL 0x100158b0
+10011a5c MOV EAX,dword ptr [EAX]
+10011a5e MOV dword ptr [ESP + 0x14],EAX
+10011a62 MOV byte ptr [EAX + 0x14],0x0
+10011a66 INC ESI
+10011a67 CMP ESI,EBX
+10011a69 JL 0x100119ca
+10011a6f TEST EDI,EDI
+10011a71 JLE 0x10011f07
+10011a77 MOV ECX,dword ptr [ESP + 0x24]
+10011a7b MOV EDX,dword ptr [ESP + 0x2c]
+10011a7f ADD ECX,EDX
+10011a81 MOV dword ptr [ESP + 0x30],EDI
+10011a85 MOV dword ptr [ESP + 0x44],ECX
+10011a89 MOV EAX,dword ptr [EBP + 0x7a28]
+10011a8f MOV EDX,dword ptr [ESP + 0x1c]
+10011a93 MOV EBX,dword ptr [EAX + 0x20]
+10011a96 XOR EAX,EAX
+10011a98 IMUL EBX,dword ptr [ESP + 0x20]
+10011a9d ADD EBX,EDX
+10011a9f LEA ECX,[EBX + EBX*0x8]
+10011aa2 LEA EDX,[EBX + ECX*0x2]
+10011aa5 MOV ECX,dword ptr [EBP + 0x10]
+10011aa8 MOV AX,word ptr [ECX + EDX*0x2 + 0x8]
+10011aad MOV EDX,EAX
+10011aaf SHL EDX,0x4
+10011ab2 ADD EDX,EAX
+10011ab4 MOV EAX,dword ptr [EBP + 0x14]
+10011ab7 LEA EAX,[EAX + EDX*0x4 + 0x94]
+10011abe LEA ECX,[EAX + 0xc]
+10011ac1 PUSH ECX
+10011ac2 PUSH EAX
+10011ac3 LEA ECX,[ESP + 0x144]
+10011aca CALL 0x10015580
+10011acf MOV ECX,0x18
+10011ad4 MOV ESI,EAX
+10011ad6 LEA EDI,[ESP + 0xdc]
+10011add MOV EAX,dword ptr [ESP + 0x20]
+10011ae1 MOVSD.REP ES:EDI,ESI
+10011ae3 MOV ECX,0x18
+10011ae8 LEA ESI,[ESP + 0xdc]
+10011aef LEA EDI,[ESP + 0x7c]
+10011af3 MOVSD.REP ES:EDI,ESI
+10011af5 MOV ECX,dword ptr [ESP + 0x6c]
+10011af9 MOV EDI,dword ptr [ESP + 0x70]
+10011afd SUB EAX,ECX
+10011aff MOV ECX,dword ptr [ESP + 0x1c]
+10011b03 SUB ECX,EDI
+10011b05 MOV dword ptr [ESP + 0xc0],0x43fa0000
+10011b10 MOV EDX,ECX
+10011b12 MOV dword ptr [ESP + 0xb4],0x43fa0000
+10011b1d IMUL EDX,ECX
+10011b20 MOV ECX,EAX
+10011b22 MOV dword ptr [ESP + 0xcc],0x43fa0000
+10011b2d IMUL ECX,EAX
+10011b30 ADD EDX,ECX
+10011b32 MOV ECX,dword ptr [ESP + 0x3c]
+10011b36 XOR EAX,EAX
+10011b38 CMP EDX,0x9
+10011b3b MOV dword ptr [ESP + 0xd8],0x43fa0000
+10011b46 MOV dword ptr [ESP + 0x84],0xc2c80000
+10011b51 MOV dword ptr [ESP + 0xa8],0xc2c80000
+10011b5c MOV dword ptr [ESP + 0x90],0xc2c80000
+10011b67 MOV dword ptr [ESP + 0x9c],0xc2c80000
+10011b72 MOV EDX,dword ptr [ECX]
+10011b74 SETGE AL
+10011b77 MOV dword ptr [ESP + 0x18],EAX
+10011b7b CALL dword ptr [EDX + 0x44]
+10011b7e FCOMP float ptr [0x100651fc]
+10011b84 FNSTSW AX
+10011b86 TEST AH,0x1
+10011b89 JZ 0x10011b93
+10011b8b MOV dword ptr [ESP + 0x18],0x0
+10011b93 MOV EAX,dword ptr [ESP + 0x1c]
+10011b97 MOV EDX,dword ptr [ESP + 0x2c]
+10011b9b MOV ECX,dword ptr [ESP + 0x44]
+10011b9f ADD EAX,EDX
+10011ba1 CMP EAX,ECX
+10011ba3 MOV dword ptr [ESP + 0x1c],EAX
+10011ba7 JNZ 0x10011bbf
+10011ba9 MOV EAX,dword ptr [ESP + 0x4c]
+10011bad MOV ECX,dword ptr [ESP + 0x50]
+10011bb1 MOV dword ptr [ESP + 0x1c],EAX
+10011bb5 MOV EAX,dword ptr [ESP + 0x20]
+10011bb9 ADD EAX,ECX
+10011bbb MOV dword ptr [ESP + 0x20],EAX
+10011bbf CMP dword ptr [ESP + 0x74],EBX
+10011bc3 JZ 0x10011c40
+10011bc5 MOV EDX,dword ptr [ESP + 0x58]
+10011bc9 MOV byte ptr [ESP + 0x12],0x1
+10011bce MOV dword ptr [ESP + 0x14],0x0
+10011bd6 MOV EDI,dword ptr [EDX + 0x1f0]
+10011bdc MOV DL,0x1
+10011bde LEA ECX,[ESP + 0x80]
+10011be5 MOV byte ptr [ESP + 0x13],DL
+10011be9 MOV ESI,0x8
+10011bee FLD float ptr [ECX + -0x4]
+10011bf1 FMUL float ptr [EDI]
+10011bf3 FLD float ptr [ECX + 0x4]
+10011bf6 FMUL float ptr [EDI + 0x8]
+10011bf9 FADDP
+10011bfb FLD float ptr [ECX]
+10011bfd FMUL float ptr [EDI + 0x4]
+10011c00 FADDP
+10011c02 FADD float ptr [EDI + 0xc]
+10011c05 FCOMP float ptr [0x10065158]
+10011c0b FNSTSW AX
+10011c0d TEST AH,0x1
+10011c10 JNZ 0x10011c16
+10011c12 XOR DL,DL
+10011c14 JMP 0x10011c1b
+10011c16 MOV byte ptr [ESP + 0x12],0x0
+10011c1b ADD ECX,0xc
+10011c1e DEC ESI
+10011c1f JNZ 0x10011bee
+10011c21 TEST DL,DL
+10011c23 MOV byte ptr [ESP + 0x13],DL
+10011c27 JNZ 0x10011de5
+10011c2d MOV EAX,dword ptr [ESP + 0x14]
+10011c31 ADD EDI,0x10
+10011c34 INC EAX
+10011c35 CMP EAX,0x6
+10011c38 MOV dword ptr [ESP + 0x14],EAX
+10011c3c JL 0x10011bdc
+10011c3e JMP 0x10011c4a
+10011c40 MOV byte ptr [ESP + 0x13],0x0
+10011c45 MOV byte ptr [ESP + 0x12],0x0
+10011c4a MOV EAX,dword ptr [ESP + 0x38]
+10011c4e TEST EAX,EAX
+10011c50 JZ 0x10011de5
+10011c56 LEA EDX,[ESP + 0x7c]
+10011c5a MOV EAX,dword ptr [EBP + 0x7ae0]
+10011c60 PUSH EDX
+10011c61 MOV EDX,dword ptr [EBP + 0x7b0c]
+10011c67 PUSH 0x0
+10011c69 PUSH EDX
+10011c6a MOV EDX,dword ptr [EBP + 0x7b08]
+10011c70 MOV ECX,dword ptr [EAX]
+10011c72 PUSH EDX
+10011c73 MOV EDX,dword ptr [EBP + 0x7b04]
+10011c79 PUSH EDX
+10011c7a MOV EDX,dword ptr [EBP + 0x7b00]
+10011c80 PUSH EDX
+10011c81 PUSH EAX
+10011c82 CALL dword ptr [ECX + 0x50]
+10011c85 MOV EAX,dword ptr [EBP + 0x7a30]
+10011c8b LEA EDI,[EBX + EBX*0x2]
+10011c8e MOV ESI,dword ptr [ESP + 0x18]
+10011c92 SHL EDI,0x2
+10011c95 MOV ECX,dword ptr [EDI + EAX*0x1 + 0x4]
+10011c99 TEST ECX,ECX
+10011c9b JNZ 0x10011cb3
+10011c9d MOV EDX,ESI
+10011c9f LEA ECX,[EBX + EBX*0x8]
+10011ca2 ADD EDX,EBX
+10011ca4 LEA EAX,[EDX + ECX*0x2]
+10011ca7 MOV ECX,dword ptr [EBP + 0x10]
+10011caa CMP word ptr [ECX + EAX*0x2 + 0x8],0xff
+10011cb1 JNZ 0x10011cb5
+10011cb3 XOR ESI,ESI
+10011cb5 LEA EDX,[EBX + EBX*0x8]
+10011cb8 LEA EAX,[ESI + EBX*0x1]
+10011cbb LEA ECX,[EAX + EDX*0x2]
+10011cbe MOV EDX,dword ptr [EBP + 0x10]
+10011cc1 XOR EAX,EAX
+10011cc3 MOV AX,word ptr [EDX + ECX*0x2 + 0x8]
+10011cc8 MOV EDX,dword ptr [EBP + 0x14]
+10011ccb MOV ECX,EAX
+10011ccd SHL ECX,0x4
+10011cd0 ADD ECX,EAX
+10011cd2 LEA EAX,[EDX + ECX*0x4 + 0x8c]
+10011cd9 MOV DL,byte ptr [ESP + 0x12]
+10011cdd MOV dword ptr [ESP + 0x14],EAX
+10011ce1 MOV EAX,dword ptr [EBP + 0x7ae0]
+10011ce7 TEST DL,DL
+10011ce9 MOV ECX,dword ptr [EAX]
+10011ceb SETZ DL
+10011cee PUSH EDX
+10011cef PUSH EAX
+10011cf0 CALL dword ptr [ECX + 0x3c]
+10011cf3 MOV EAX,dword ptr [EBP + 0x7ae0]
+10011cf9 XOR EDX,EDX
+10011cfb PUSH 0x0
+10011cfd MOV ECX,dword ptr [EAX]
+10011cff MOV EAX,dword ptr [ESP + 0x18]
+10011d03 MOV DX,word ptr [EAX]
+10011d06 MOV EAX,dword ptr [EBP + 0x18]
+10011d09 LEA EDX,[EAX + EDX*0x4]
+10011d0c XOR EAX,EAX
+10011d0e PUSH EDX
+10011d0f MOV EDX,dword ptr [ESP + 0x1c]
+10011d13 MOV AX,word ptr [EDX + 0x2]
+10011d17 PUSH EAX
+10011d18 MOV EAX,dword ptr [EBP + 0x7ae0]
+10011d1e PUSH 0x0
+10011d20 PUSH EAX
+10011d21 CALL dword ptr [ECX + 0x10]
+10011d24 TEST ESI,ESI
+10011d26 JNZ 0x10011de5
+10011d2c MOV EAX,dword ptr [EBP + 0x7a30]
+10011d32 XOR ECX,ECX
+10011d34 ADD EAX,EDI
+10011d36 MOV dword ptr [ESP + 0x14],ECX
+10011d3a MOV EDX,dword ptr [EAX + 0x4]
+10011d3d TEST EDX,EDX
+10011d3f JLE 0x10011de5
+10011d45 MOV EDX,dword ptr [EAX]
+10011d47 MOV ESI,dword ptr [EDX + ECX*0x4]
+10011d4a MOV AL,byte ptr [ESI + EBP*0x1 + 0x5420]
+10011d51 TEST AL,AL
+10011d53 JNZ 0x10011dcf
+10011d55 MOV byte ptr [ESI + EBP*0x1 + 0x5420],0x1
+10011d5d MOV EAX,dword ptr [EBP + 0x7ae0]
+10011d63 PUSH 0x1
+10011d65 PUSH EAX
+10011d66 MOV ECX,dword ptr [EAX]
+10011d68 CALL dword ptr [ECX + 0x3c]
+10011d6b LEA ECX,[ESI + ESI*0x2]
+10011d6e MOV EAX,dword ptr [EBP + 0x7ae0]
+10011d74 LEA EDX,[ECX + ECX*0x8]
+10011d77 MOV ECX,dword ptr [EAX]
+10011d79 SHL EDX,0x1
+10011d7b SUB EDX,ESI
+10011d7d LEA ESI,[EBP + EDX*0x4 + 0xfffffec8]
+10011d84 LEA EDX,[ESI + 0x2fc]
+10011d8a PUSH EDX
+10011d8b MOV EDX,dword ptr [EBP + 0x7b0c]
+10011d91 PUSH 0x0
+10011d93 PUSH EDX
+10011d94 MOV EDX,dword ptr [EBP + 0x7b08]
+10011d9a PUSH EDX
+10011d9b MOV EDX,dword ptr [EBP + 0x7b04]
+10011da1 PUSH EDX
+10011da2 MOV EDX,dword ptr [EBP + 0x7b00]
+10011da8 PUSH EDX
+10011da9 PUSH EAX
+10011daa CALL dword ptr [ECX + 0x50]
+10011dad MOV EDX,dword ptr [ESI + 0x2f8]
+10011db3 MOV EAX,dword ptr [EBP + 0x7ae0]
+10011db9 PUSH 0x0
+10011dbb PUSH EDX
+10011dbc MOV EDX,dword ptr [ESI + 0x290]
+10011dc2 MOV ECX,dword ptr [EAX]
+10011dc4 PUSH EDX
+10011dc5 PUSH 0x0
+10011dc7 PUSH EAX
+10011dc8 CALL dword ptr [ECX + 0x10]
+10011dcb MOV ECX,dword ptr [ESP + 0x14]
+10011dcf MOV EAX,dword ptr [EBP + 0x7a30]
+10011dd5 INC ECX
+10011dd6 ADD EAX,EDI
+10011dd8 MOV dword ptr [ESP + 0x14],ECX
+10011ddc CMP ECX,dword ptr [EAX + 0x4]
+10011ddf JL 0x10011d45
+10011de5 MOV ECX,dword ptr [EBP + 0x7a38]
+10011deb LEA EBX,[EBX + EBX*0x2]
+10011dee SHL EBX,0x2
+10011df1 XOR EDI,EDI
+10011df3 LEA EAX,[EBX + ECX*0x1]
+10011df6 MOV ECX,dword ptr [EBX + ECX*0x1 + 0x4]
+10011dfa TEST ECX,ECX
+10011dfc JLE 0x10011ef8
+10011e02 MOV EDX,dword ptr [EAX]
+10011e04 MOV ECX,dword ptr [EDX + EDI*0x4]
+10011e07 LEA EDX,[ESP + 0x28]
+10011e0b PUSH EDX
+10011e0c MOV EDX,0x18
+10011e11 MOV EAX,dword ptr [ECX]
+10011e13 CALL dword ptr [EAX]
+10011e15 TEST EAX,EAX
+10011e17 JZ 0x10011ee2
+10011e1d MOV EDX,dword ptr [0x100708c0]
+10011e23 MOV ESI,dword ptr [ESP + 0x28]
+10011e27 MOV ECX,EDX
+10011e29 MOV EAX,dword ptr [EDX + 0x4]
+10011e2c TEST EAX,EAX
+10011e2e JZ 0x10011e43
+10011e30 CMP dword ptr [EAX + 0x10],ESI
+10011e33 JC 0x10011e3c
+10011e35 MOV ECX,EAX
+10011e37 MOV EAX,dword ptr [EAX + 0x8]
+10011e3a JMP 0x10011e3f
+10011e3c MOV EAX,dword ptr [EAX + 0xc]
+10011e3f TEST EAX,EAX
+10011e41 JNZ 0x10011e30
+10011e43 CMP ECX,EDX
+10011e45 MOV dword ptr [ESP + 0x14],ECX
+10011e49 JZ 0x10011e56
+10011e4b CMP ESI,dword ptr [ECX + 0x10]
+10011e4e JC 0x10011e56
+10011e50 LEA EAX,[ESP + 0x14]
+10011e54 JMP 0x10011e5e
+10011e56 MOV dword ptr [ESP + 0x54],EDX
+10011e5a LEA EAX,[ESP + 0x54]
+10011e5e MOV EAX,dword ptr [EAX]
+10011e60 CMP EDX,EAX
+10011e62 JNZ 0x10011ecf
+10011e64 LEA EAX,[ESP + 0x28]
+10011e68 LEA ECX,[ESP + 0x78]
+10011e6c PUSH EAX
+10011e6d PUSH ECX
+10011e6e MOV ECX,0x100708c0
+10011e73 CALL 0x10038580
+10011e78 MOV EAX,dword ptr [EAX]
+10011e7a MOV ECX,dword ptr [0x100708c0]
+10011e80 CMP EAX,ECX
+10011e82 MOV ECX,dword ptr [ESP + 0x28]
+10011e86 MOV dword ptr [ESP + 0x24],EAX
+10011e8a JZ 0x10011e91
+10011e8c CMP ECX,dword ptr [EAX + 0x10]
+10011e8f JNC 0x10011ec1
+10011e91 LEA EDX,[ESP + 0x64]
+10011e95 MOV dword ptr [ESP + 0x64],ECX
+10011e99 PUSH EDX
+10011e9a PUSH ECX
+10011e9b LEA EAX,[ESP + 0x2c]
+10011e9f MOV ECX,ESP
+10011ea1 PUSH EAX
+10011ea2 MOV byte ptr [ESP + 0x74],0x0
+10011ea7 CALL 0x10037e80
+10011eac LEA ECX,[ESP + 0x64]
+10011eb0 PUSH ECX
+10011eb1 MOV ECX,0x100708c0
+10011eb6 CALL 0x100158b0
+10011ebb MOV EAX,dword ptr [EAX]
+10011ebd MOV dword ptr [ESP + 0x24],EAX
+10011ec1 MOV CL,byte ptr [ESP + 0x13]
+10011ec5 TEST CL,CL
+10011ec7 SETZ DL
+10011eca MOV byte ptr [EAX + 0x14],DL
+10011ecd JMP 0x10011ee2
+10011ecf MOV CL,byte ptr [EAX + 0x14]
+10011ed2 TEST CL,CL
+10011ed4 JNZ 0x10011ee2
+10011ed6 MOV CL,byte ptr [ESP + 0x13]
+10011eda TEST CL,CL
+10011edc SETZ CL
+10011edf MOV byte ptr [EAX + 0x14],CL
+10011ee2 MOV EDX,dword ptr [EBP + 0x7a38]
+10011ee8 INC EDI
+10011ee9 MOV ECX,dword ptr [EBX + EDX*0x1 + 0x4]
+10011eed LEA EAX,[EBX + EDX*0x1]
+10011ef0 CMP EDI,ECX
+10011ef2 JL 0x10011e02
+10011ef8 MOV EAX,dword ptr [ESP + 0x30]
+10011efc DEC EAX
+10011efd MOV dword ptr [ESP + 0x30],EAX
+10011f01 JNZ 0x10011a89
+10011f07 MOV EAX,dword ptr [EBP + 0x7ae0]
+10011f0d MOV EBX,dword ptr [ESP + 0x710]
+10011f14 PUSH EAX
+10011f15 MOV ECX,dword ptr [EAX]
+10011f17 CALL dword ptr [ECX + 0x48]
+10011f1a MOV EAX,dword ptr [ESP + 0x40]
+10011f1e TEST EAX,EAX
+10011f20 JNZ 0x10011f9b
+10011f22 MOV EAX,[0x100708c0]
+10011f27 MOV ESI,dword ptr [EAX + 0x8]
+10011f2a CMP ESI,EAX
+10011f2c JZ 0x10011f9b
+10011f2e MOV EDI,dword ptr [ESP + 0x70c]
+10011f35 MOV AL,byte ptr [ESI + 0x14]
+10011f38 MOV ECX,dword ptr [ESP + 0x714]
+10011f3f TEST AL,AL
+10011f41 MOV EAX,dword ptr [ESI + 0x10]
+10011f44 PUSH ECX
+10011f45 MOV EDX,dword ptr [EAX]
+10011f47 JZ 0x10011f4c
+10011f49 PUSH EBX
+10011f4a JMP 0x10011f52
+10011f4c MOV ECX,EBX
+10011f4e OR ECX,0x1
+10011f51 PUSH ECX
+10011f52 PUSH EDI
+10011f53 PUSH EAX
+10011f54 CALL dword ptr [EDX + 0x2c]
+10011f57 MOV ECX,dword ptr [ESI + 0xc]
+10011f5a MOV EAX,ESI
+10011f5c TEST ECX,ECX
+10011f5e JZ 0x10011f74
+10011f60 MOV EAX,ECX
+10011f62 MOV ECX,dword ptr [EAX + 0x8]
+10011f65 TEST ECX,ECX
+10011f67 JZ 0x10011f8d
+10011f69 MOV EAX,ECX
+10011f6b MOV ECX,dword ptr [EAX + 0x8]
+10011f6e TEST ECX,ECX
+10011f70 JNZ 0x10011f69
+10011f72 JMP 0x10011f8d
+10011f74 MOV ECX,dword ptr [ESI + 0x4]
+10011f77 CMP ESI,dword ptr [ECX + 0xc]
+10011f7a JNZ 0x10011f86
+10011f7c MOV EAX,ECX
+10011f7e MOV ECX,dword ptr [ECX + 0x4]
+10011f81 CMP EAX,dword ptr [ECX + 0xc]
+10011f84 JZ 0x10011f7c
+10011f86 CMP dword ptr [EAX + 0xc],ECX
+10011f89 JZ 0x10011f8d
+10011f8b MOV EAX,ECX
+10011f8d MOV ECX,dword ptr [0x100708c0]
+10011f93 MOV ESI,EAX
+10011f95 CMP EAX,ECX
+10011f97 JNZ 0x10011f35
+10011f99 JMP 0x10011fa2
+10011f9b MOV EDI,dword ptr [ESP + 0x70c]
+10011fa2 MOV ECX,dword ptr [EBP + 0x7ae0]
+10011fa8 XOR EDX,EDX
+10011faa MOV EAX,dword ptr [ECX]
+10011fac CALL dword ptr [EAX + 0x20]
+10011faf MOV EBP,dword ptr [EBP + 0x7ab0]
+10011fb5 PUSH 0x1
+10011fb7 PUSH -0x2
+10011fb9 PUSH EDI
+10011fba MOV ECX,dword ptr [EBP]
+10011fbd PUSH EBP
+10011fbe CALL dword ptr [ECX + 0xc]
+10011fc1 POP EDI
+10011fc2 POP ESI
+10011fc3 POP EBP
+10011fc4 POP EBX
+10011fc5 ADD ESP,0x6f4
+10011fcb RET 0x10
\ No newline at end of file