From c50512ea52f228fe79232e786b7cff1e519cde6f Mon Sep 17 00:00:00 2001 From: bird_egop Date: Thu, 28 Nov 2024 05:07:17 +0300 Subject: [PATCH] add gameobjects view --- MissionTmaLib/ClanType.cs | 15 -- MissionTmaLib/Extensions.cs | 28 ++++ MissionTmaLib/LodeInfo.cs | 2 +- NResUI/ImGuiUI/MissionTmaExplorer.cs | 224 +++++++++++++++++++++++++-- 4 files changed, 240 insertions(+), 29 deletions(-) create mode 100644 MissionTmaLib/Extensions.cs diff --git a/MissionTmaLib/ClanType.cs b/MissionTmaLib/ClanType.cs index d694c69..bc0faff 100644 --- a/MissionTmaLib/ClanType.cs +++ b/MissionTmaLib/ClanType.cs @@ -6,19 +6,4 @@ public enum ClanType Player = 1, AI = 2, Neutral = 3 -} - -public static class Extensions -{ - public static string ToReadableString(this ClanType clanType) - { - return clanType switch - { - ClanType.Environment => $"Окружение ({clanType:D})", - ClanType.Player => $"Игрок ({clanType:D})", - ClanType.AI => $"AI ({clanType:D})", - ClanType.Neutral => $"Нейтральный ({clanType:D})", - _ => $"Неизвестный ({clanType:D})" - }; - } } \ No newline at end of file diff --git a/MissionTmaLib/Extensions.cs b/MissionTmaLib/Extensions.cs new file mode 100644 index 0000000..b7b75c9 --- /dev/null +++ b/MissionTmaLib/Extensions.cs @@ -0,0 +1,28 @@ +namespace MissionTmaLib; + +public static class Extensions +{ + public static string ToReadableString(this ClanType clanType) + { + return clanType switch + { + ClanType.Environment => $"Окружение ({clanType:D})", + ClanType.Player => $"Игрок ({clanType:D})", + ClanType.AI => $"AI ({clanType:D})", + ClanType.Neutral => $"Нейтральный ({clanType:D})", + _ => $"Неизвестный ({clanType:D})" + }; + } + + public static string ToReadableString(this GameObjectType type) + { + return type switch + { + GameObjectType.Building => $"Строение {type:D}", + GameObjectType.Warbot => $"Варбот {type:D}", + GameObjectType.Tree => $"Дерево {type:D}", + GameObjectType.Stone => $"Камень {type:D}", + _ => $"Неизвестный ({type:D})" + }; + } +} \ No newline at end of file diff --git a/MissionTmaLib/LodeInfo.cs b/MissionTmaLib/LodeInfo.cs index aa98163..b308f64 100644 --- a/MissionTmaLib/LodeInfo.cs +++ b/MissionTmaLib/LodeInfo.cs @@ -1,3 +1,3 @@ namespace MissionTmaLib; -public record LodeInfo(Vector3 UnknownVector, int UnknownInt1, int UnknownInt2, float UnknownFloat, int UnknownInt3); \ No newline at end of file +public record LodeInfo(Vector3 UnknownVector, int UnknownInt1, int UnknownFlags2, float UnknownFloat, int UnknownInt3); \ No newline at end of file diff --git a/NResUI/ImGuiUI/MissionTmaExplorer.cs b/NResUI/ImGuiUI/MissionTmaExplorer.cs index 1d730b5..bcdfcb4 100644 --- a/NResUI/ImGuiUI/MissionTmaExplorer.cs +++ b/NResUI/ImGuiUI/MissionTmaExplorer.cs @@ -21,6 +21,8 @@ public class MissionTmaExplorer : IImGuiPanel var mission = _viewModel.Mission; if (_viewModel.HasFile && mission is not null) { + ImGui.Columns(2); + ImGui.Text("Путь к файлу: "); ImGui.SameLine(); ImGui.Text(_viewModel.Path); @@ -65,32 +67,44 @@ public class MissionTmaExplorer : IImGuiPanel { ImGui.TableNextRow(); ImGui.TableNextColumn(); - ImGui.Text(arealInfo.Coords[k].X.ToString("F2")); + ImGui.Text( + arealInfo.Coords[k] + .X.ToString("F2") + ); ImGui.TableNextColumn(); - ImGui.Text(arealInfo.Coords[k].Y.ToString("F2")); + ImGui.Text( + arealInfo.Coords[k] + .Y.ToString("F2") + ); ImGui.TableNextColumn(); - ImGui.Text(arealInfo.Coords[k].Z.ToString("F2")); + ImGui.Text( + arealInfo.Coords[k] + .Z.ToString("F2") + ); } ImGui.EndTable(); } + ImGui.TreePop(); } } + ImGui.TreePop(); } + ImGui.TreePop(); } if (ImGui.TreeNodeEx("Кланы")) { var (clanFeatureSet, clanCount, clanInfos) = mission.ClansData; - + ImGui.Text("Фиче-сет: "); Utils.ShowHint("Магическое число из файла, на основе которого игра читает разные секции о клане"); ImGui.SameLine(); ImGui.Text(clanFeatureSet.ToString()); - + ImGui.Text("Количество кланов: "); ImGui.SameLine(); ImGui.Text(clanCount.ToString()); @@ -113,11 +127,11 @@ public class MissionTmaExplorer : IImGuiPanel ImGui.Text(" Y: "); ImGui.SameLine(); ImGui.Text(clanInfo.Y.ToString()); - + ImGui.Text("Тип клана: "); ImGui.SameLine(); ImGui.Text(clanInfo.ClanType.ToReadableString()); - + ImGui.Text("Неизвестная строка 1: "); Utils.ShowHint("Кажется это путь к файлу поведения (Behavior), но пока не понятно. Обычно пути соответствуют 2 файла."); ImGui.SameLine(); @@ -166,7 +180,7 @@ public class MissionTmaExplorer : IImGuiPanel Utils.ShowHint("Не до конца понятно, что означает, вероятно это NRes с деревом исследований"); ImGui.SameLine(); ImGui.Text(clanInfo.ResearchNResPath); - + ImGui.Text("Неизвестное число 3: "); ImGui.SameLine(); ImGui.Text(clanInfo.UnkInt3.ToString()); @@ -178,20 +192,23 @@ public class MissionTmaExplorer : IImGuiPanel ImGui.TableSetupColumn("Клан"); ImGui.TableSetupColumn("Союзник?"); ImGui.TableHeadersRow(); - + foreach (var alliesMapKey in clanInfo.AlliesMap.Keys) { ImGui.TableNextRow(); ImGui.TableNextColumn(); ImGui.Text(alliesMapKey); ImGui.TableNextColumn(); - ImGui.Text(clanInfo.AlliesMap[alliesMapKey].ToString()); + ImGui.Text( + clanInfo.AlliesMap[alliesMapKey] + .ToString() + ); } - + ImGui.EndTable(); } - - + + ImGui.TreePop(); } } @@ -204,8 +221,189 @@ public class MissionTmaExplorer : IImGuiPanel if (ImGui.TreeNodeEx("Объекты")) { + var gameObjectsData = mission.GameObjectsData; + + ImGui.Text("Фиче-сет: "); + Utils.ShowHint("Магическое число из файла, на основе которого игра читает разные секции об объекте"); + ImGui.SameLine(); + ImGui.Text(gameObjectsData.GameObjectsFeatureSet.ToString()); + + ImGui.Text("Кол-во объектов: "); + ImGui.SameLine(); + ImGui.Text(gameObjectsData.GameObjectsCount.ToString()); + + for (var i = 0; i < gameObjectsData.GameObjectInfos.Count; i++) + { + var gameObjectInfo = gameObjectsData.GameObjectInfos[i]; + if (ImGui.TreeNodeEx($"Объект {i} - {gameObjectInfo.DatString}")) + { + ImGui.Text("Тип объекта: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.Type.ToReadableString()); + + ImGui.Text("Неизвестные флаги: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.UnknownFlags.ToString("X8")); + + ImGui.Text("Путь к файлу .dat: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.DatString); + + ImGui.Text("Индекс владеющего клана: "); + Utils.ShowHint("-1 если объект никому не принадлежит"); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.OwningClanIndex.ToString()); + + ImGui.Text("Неизвестное число 3: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.UnknownInt3.ToString()); + + ImGui.Text("Вектор позиции: "); + ImGui.SameLine(); + ImGui.Text($"{gameObjectInfo.Position.X} : {gameObjectInfo.Position.Y} : {gameObjectInfo.Position.Z}"); + + ImGui.Text("Вектор поворота: "); + ImGui.SameLine(); + ImGui.Text($"{gameObjectInfo.Rotation.X} : {gameObjectInfo.Rotation.Y} : {gameObjectInfo.Rotation.Z}"); + + ImGui.Text("Вектор масштаба: "); + ImGui.SameLine(); + ImGui.Text($"{gameObjectInfo.Scale.X} : {gameObjectInfo.Scale.Y} : {gameObjectInfo.Scale.Z}"); + + ImGui.Text("Неизвестная строка 2: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.UnknownString2); + + ImGui.Text("Неизвестное число 4: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.UnknownInt4.ToString()); + + ImGui.Text("Неизвестное число 5: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.UnknownInt5.ToString()); + + ImGui.Text("Неизвестное число 6: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.UnknownInt6.ToString()); + + if (ImGui.TreeNodeEx("Настройки")) + { + ImGui.Text("Неиспользуемый заголовок: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.Settings.Unused.ToString()); + ImGui.Text("Кол-во настроек: "); + ImGui.SameLine(); + ImGui.Text(gameObjectInfo.Settings.SettingsCount.ToString()); + ImGui.Text("0 - дробное число, 1 - целое число"); + if (ImGui.BeginTable("Настройки", 5, ImGuiTableFlags.Borders | ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.NoHostExtendX)) + { + ImGui.TableSetupColumn("Тип"); + ImGui.TableSetupColumn("Число 1"); + ImGui.TableSetupColumn("Число 2"); + ImGui.TableSetupColumn("Число 3"); + ImGui.TableSetupColumn("Название"); + ImGui.TableHeadersRow(); + + for (var i1 = 0; i1 < gameObjectInfo.Settings.Settings.Count; i1++) + { + var setting = gameObjectInfo.Settings.Settings[i1]; + + ImGui.TableNextRow(); + ImGui.TableNextColumn(); + ImGui.Text(setting.SettingType.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(setting.SettingType == 0 ? setting.Unk1.AsFloat.ToString() : setting.Unk1.AsInt.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(setting.SettingType == 0 ? setting.Unk1.AsFloat.ToString() : setting.Unk1.AsInt.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(setting.SettingType == 0 ? setting.Unk1.AsFloat.ToString() : setting.Unk1.AsInt.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(setting.Name); + } + + ImGui.EndTable(); + } + + ImGui.TreePop(); + } + + ImGui.TreePop(); + } + } + + ImGui.Text("LAND строка: "); + Utils.ShowHint("Видимо это путь к настройкам поверхности"); + ImGui.SameLine(); + ImGui.Text(gameObjectsData.LandString); + + ImGui.Text("Неизвестное число: "); + ImGui.SameLine(); + ImGui.Text(gameObjectsData.UnknownInt.ToString()); + + ImGui.Text("Техническое описание: "); + ImGui.SameLine(); + ImGui.Text(gameObjectsData.MissionTechDescription?.Replace((char)0xcd, '.') ?? "Отсутствует"); + + var lodeData = gameObjectsData.LodeData; + if (lodeData is not null) + { + ImGui.Text("Информация о LOD-ах"); + + ImGui.Text("Неиспользуемый заголовок: "); + ImGui.SameLine(); + ImGui.Text(lodeData.Unused.ToString()); + + ImGui.Text("Кол-во LOD-ов: "); + ImGui.SameLine(); + ImGui.Text(lodeData.LodeCount.ToString()); + + if (ImGui.BeginTable("Информация о лодах", 7, ImGuiTableFlags.Borders | ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.NoHostExtendX)) + { + ImGui.TableSetupColumn("X"); + ImGui.TableSetupColumn("Y"); + ImGui.TableSetupColumn("Z"); + ImGui.TableSetupColumn("Число 1"); + ImGui.TableSetupColumn("Флаги 2"); + ImGui.TableSetupColumn("Число 3"); + ImGui.TableSetupColumn("Число 4"); + ImGui.TableHeadersRow(); + + for (var i1 = 0; i1 < lodeData.Lodes.Count; i1++) + { + var lode = lodeData.Lodes[i1]; + + ImGui.TableNextRow(); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownVector.X.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownVector.Y.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownVector.Z.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownInt1.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownFlags2.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownFloat.ToString()); + ImGui.TableNextColumn(); + ImGui.Text(lode.UnknownInt3.ToString()); + } + + ImGui.EndTable(); + } + } + else + { + ImGui.Text("Информаия о LOD-ах отсутствует"); + } + + ImGui.TreePop(); } + + ImGui.NextColumn(); + + ImGui.Text("Тут хочу сделать карту"); } else {