diff --git a/.editorconfig b/.editorconfig index fc333823..f7246e25 100644 --- a/.editorconfig +++ b/.editorconfig @@ -49,3 +49,9 @@ dotnet_naming_style.begins_with_i.capitalization = pascal_case generated_code = true dotnet_diagnostic.CS8019.severity = none dotnet_analyzer_diagnostic.severity = none + +# Generated Code +[**/FlatSharp.generated.cs] +generated_code = true +dotnet_diagnostic.CS8019.severity = none +dotnet_analyzer_diagnostic.severity = none diff --git a/pkNX.WinForms/Subforms/MapViewer9.Designer.cs b/pkNX.WinForms/Subforms/MapViewer9.Designer.cs index 54ddb9b6..d8545bfb 100644 --- a/pkNX.WinForms/Subforms/MapViewer9.Designer.cs +++ b/pkNX.WinForms/Subforms/MapViewer9.Designer.cs @@ -42,7 +42,7 @@ private void InitializeComponent() this.pictureBox1.Size = new System.Drawing.Size(597, 591); this.pictureBox1.TabIndex = 0; this.pictureBox1.TabStop = false; - this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove); + this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Map_MouseMove); // // CB_Map // diff --git a/pkNX.WinForms/Subforms/MapViewer9.cs b/pkNX.WinForms/Subforms/MapViewer9.cs index c514740c..1021084b 100644 --- a/pkNX.WinForms/Subforms/MapViewer9.cs +++ b/pkNX.WinForms/Subforms/MapViewer9.cs @@ -14,108 +14,20 @@ namespace pkNX.WinForms.Subforms; public partial class MapViewer9 : Form { private readonly GameManagerSV ROM; - private readonly bool Loading = true; - private readonly List AreaNames; - private readonly Dictionary Areas; - private readonly Dictionary AreaCollisionTrees; - private readonly Dictionary AreaCollisionBoxes; - - private readonly IList MainAreas; - private readonly IList SubAreas; - private readonly IList InsideAreas; - private readonly IList DungeonAreas; - private readonly IList FieldLocations; + private readonly bool Loading; + private readonly PaldeaMap Map; public MapViewer9(GameManagerSV rom) { - ROM = rom; - - MainAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_main_area/field_main_area_array.bin")).Table; - SubAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_sub_area/field_sub_area_array.bin")).Table; - InsideAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_inside_area/field_inside_area_array.bin")).Table; - DungeonAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_dungeon_area/field_dungeon_area_array.bin")).Table; - FieldLocations = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_location/field_location_array.bin")).Table; - - var area_management = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile(0x0573CA323061A2D3)); - - AreaNames = new(); - Areas = new(); - AreaCollisionTrees = new(); - AreaCollisionBoxes = new(); + Map = new(ROM = rom); InitializeComponent(); - - foreach (var obj in area_management.Objects) - { - if (obj.Type == "trinity_SceneObject" && obj.SubObjects.Count > 0 && obj.SubObjects[0].Type == "trinity_CollisionComponent") - { - var sceneObject = FlatBufferConverter.DeserializeFrom(obj.Data); - var collisionComponent = FlatBufferConverter.DeserializeFrom(obj.SubObjects[0].Data); - - AreaNames.Add(sceneObject.ObjectName); - var areaInfo = FindAreaInfo(sceneObject.ObjectName); - - var shape = collisionComponent.Shape; - if (shape.TryGet(out Box? box)) - { - // Box collision, obj.ObjectPosition.Field_02 is pos, box.Field_01 is size of box - AreaCollisionBoxes[sceneObject.ObjectName] = new BoxCollision9 - { - Position = sceneObject.ObjectPosition.Field02, - Size = box.Field01, - }; - } - if (shape.TryGet(out Havok? havok)) - { - var havokData = ROM.GetPackedFile(havok.TrcolFilePath); - AreaCollisionTrees[sceneObject.ObjectName] = HavokCollision.ParseAABBTree(havokData); - } - - Areas[sceneObject.ObjectName] = new AreaDef9 - { - SceneObject = sceneObject, - CollisionComponent = collisionComponent, - Info = areaInfo, - }; - } - } - - CB_Map.Items.AddRange(AreaNames.Select(z => z).ToArray()); - + Loading = true; + CB_Map.Items.AddRange(Map.AreaNames.Select(z => z).ToArray()); Loading = false; CB_Map.SelectedIndex = 0; } - private AreaInfo FindAreaInfo(string name) - { - foreach (var area in MainAreas) - { - if (area.Name == name) - return area.Info; - } - foreach (var area in SubAreas) - { - if (area.Name == name) - return area.Info; - } - foreach (var area in InsideAreas) - { - if (area.Name == name) - return area.Info; - } - foreach (var area in DungeonAreas) - { - if (area.Name == name) - return area.Info; - } - foreach (var area in FieldLocations) - { - if (area.Name == name) - return area.Info; - } - throw new ArgumentException($"Unknown area {name}"); - } - private class ComboItem { public ComboItem(string text, int value) @@ -143,7 +55,7 @@ private void UpdateMap(int map) if (Loading) return; - var areaName = AreaNames[map]; + var areaName = Map.AreaNames[map]; var mapImagePath = System.IO.Path.GetFullPath(GetMapImagePath()); if (System.IO.File.Exists(mapImagePath)) @@ -170,7 +82,7 @@ private void UpdateMap(int map) double ConvertX(double x) => (4096.0 / 5000.0) * x; double ConvertZ(double z) => (4096.0 / 5000.0) * (z + 5500.0); - if (AreaCollisionTrees.TryGetValue(areaName, out var colTree)) + if (Map.AreaCollisionTrees.TryGetValue(areaName, out var colTree)) { var brush = new SolidBrush(Color.FromArgb(25, 0, 0, 255)); @@ -179,7 +91,7 @@ private void UpdateMap(int map) gr.FillRectangle(brush, new RectangleF((float)ConvertX(rect.Left), (float)ConvertZ(rect.Top), (float)ConvertX(rect.Width), (float)ConvertX(rect.Height))); } } - else if (AreaCollisionBoxes.TryGetValue(areaName, out var colBox)) + else if (Map.AreaCollisionBoxes.TryGetValue(areaName, out var colBox)) { var center_x = colBox.Position.X; var center_z = colBox.Position.Z; @@ -191,7 +103,7 @@ private void UpdateMap(int map) } } - private void pictureBox1_MouseMove(object sender, MouseEventArgs e) + private void Map_MouseMove(object sender, MouseEventArgs e) { var x = ((e.X * 5000.0f) / pictureBox1.Width); var z = ((e.Y * 5000.0f) / pictureBox1.Height) - 5500f; @@ -199,6 +111,106 @@ private void pictureBox1_MouseMove(object sender, MouseEventArgs e) } } +public class PaldeaMap +{ + public readonly List AreaNames = new(); + private readonly Dictionary Areas = new(); + public readonly Dictionary AreaCollisionTrees = new(); + public readonly Dictionary AreaCollisionBoxes = new(); + + private readonly IList MainAreas; + private readonly IList SubAreas; + private readonly IList InsideAreas; + private readonly IList DungeonAreas; + private readonly IList FieldLocations; + + public PaldeaMap(GameManagerSV ROM) + { + MainAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_main_area/field_main_area_array.bin")).Table; + SubAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_sub_area/field_sub_area_array.bin")).Table; + InsideAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_inside_area/field_inside_area_array.bin")).Table; + DungeonAreas = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_dungeon_area/field_dungeon_area_array.bin")).Table; + FieldLocations = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile("world/data/field/area/field_location/field_location_array.bin")).Table; + + LoadScene(ROM); + } + + private void LoadScene(GameManagerSV ROM) + { + var area_management = FlatBufferConverter.DeserializeFrom(ROM.GetPackedFile(0x0573CA323061A2D3)); + + foreach (var obj in area_management.Objects) + { + if (obj is not { Type: "trinity_SceneObject", SubObjects.Count: > 0 }) + continue; + if (obj.SubObjects[0].Type != "trinity_CollisionComponent") + continue; + + var sceneObject = FlatBufferConverter.DeserializeFrom(obj.Data); + var trcData = obj.SubObjects[0].Data; + var trc = FlatBufferConverter.DeserializeFrom(trcData); + var collisionComponent = trc.Component.CollisionComponent; + + AreaNames.Add(sceneObject.ObjectName); + var areaInfo = FindAreaInfo(sceneObject.ObjectName); + + var shape = collisionComponent.Shape; + if (shape.TryGet(out Box? box)) + { + // Box collision, obj.ObjectPosition.Field_02 is pos, box.Field_01 is size of box + AreaCollisionBoxes[sceneObject.ObjectName] = new BoxCollision9 + { + Position = sceneObject.ObjectPosition.Field02, + Size = box.Field01, + }; + } + + if (shape.TryGet(out Havok? havok)) + { + var havokData = ROM.GetPackedFile(havok.TrcolFilePath); + AreaCollisionTrees[sceneObject.ObjectName] = HavokCollision.ParseAABBTree(havokData); + } + + Areas[sceneObject.ObjectName] = new AreaDef9 + { + SceneObject = sceneObject, + CollisionComponent = collisionComponent, + Info = areaInfo, + }; + } + } + + public AreaInfo FindAreaInfo(string name) + { + foreach (var area in MainAreas) + { + if (area.Name == name) + return area.Info; + } + foreach (var area in SubAreas) + { + if (area.Name == name) + return area.Info; + } + foreach (var area in InsideAreas) + { + if (area.Name == name) + return area.Info; + } + foreach (var area in DungeonAreas) + { + if (area.Name == name) + return area.Info; + } + foreach (var area in FieldLocations) + { + if (area.Name == name) + return area.Info; + } + throw new ArgumentException($"Unknown area {name}"); + } +} + public class AreaDef9 { public required TrinitySceneObject SceneObject;