diff --git a/src/War3App.MapAdapter.EtoForms.Gtk/War3App.MapAdapter.EtoForms.Gtk.csproj b/src/War3App.MapAdapter.EtoForms.Gtk/War3App.MapAdapter.EtoForms.Gtk.csproj index 59b22b2..d50744d 100644 --- a/src/War3App.MapAdapter.EtoForms.Gtk/War3App.MapAdapter.EtoForms.Gtk.csproj +++ b/src/War3App.MapAdapter.EtoForms.Gtk/War3App.MapAdapter.EtoForms.Gtk.csproj @@ -5,7 +5,7 @@ 9.0 enable WinExe - 1.5.2 + 1.6.0 diff --git a/src/War3App.MapAdapter.EtoForms/War3App.MapAdapter.EtoForms.csproj b/src/War3App.MapAdapter.EtoForms/War3App.MapAdapter.EtoForms.csproj index 7e01b83..11dfcc5 100644 --- a/src/War3App.MapAdapter.EtoForms/War3App.MapAdapter.EtoForms.csproj +++ b/src/War3App.MapAdapter.EtoForms/War3App.MapAdapter.EtoForms.csproj @@ -4,7 +4,7 @@ net6.0 9.0 enable - 1.5.2 + 1.6.0 diff --git a/src/War3App.MapAdapter.WinForms/War3App.MapAdapter.WinForms.csproj b/src/War3App.MapAdapter.WinForms/War3App.MapAdapter.WinForms.csproj index b6f5c4a..716b4d7 100644 --- a/src/War3App.MapAdapter.WinForms/War3App.MapAdapter.WinForms.csproj +++ b/src/War3App.MapAdapter.WinForms/War3App.MapAdapter.WinForms.csproj @@ -7,7 +7,7 @@ enable true WinExe - 1.5.2 + 1.6.0 diff --git a/src/War3App.MapAdapter/Environment/MapEnvironmentAdapter.cs b/src/War3App.MapAdapter/Environment/MapEnvironmentAdapter.cs index abe038c..99f82a8 100644 --- a/src/War3App.MapAdapter/Environment/MapEnvironmentAdapter.cs +++ b/src/War3App.MapAdapter/Environment/MapEnvironmentAdapter.cs @@ -6,6 +6,7 @@ using War3Net.Build.Common; using War3Net.Build.Environment; using War3Net.Build.Extensions; +using War3Net.Common.Providers; namespace War3App.MapAdapter.Environment { @@ -40,7 +41,24 @@ public AdaptResult AdaptFile(Stream stream, AdaptFileContext context) return context.ReportParseError(e); } - return MapFileStatus.Compatible; + if (!mapEnvironment.Adapt(context, out var status)) + { + return status; + } + + try + { + var memoryStream = new MemoryStream(); + + using var writer = new BinaryWriter(memoryStream, UTF8EncodingProvider.StrictUTF8, true); + writer.Write(mapEnvironment); + + return AdaptResult.Create(memoryStream, status); + } + catch (Exception e) + { + return context.ReportSerializeError(e); + } } public string SerializeFileToJson(Stream stream, GamePatch gamePatch, JsonSerializerOptions options) diff --git a/src/War3App.MapAdapter/Environment/MapEnvironmentExtensions.cs b/src/War3App.MapAdapter/Environment/MapEnvironmentExtensions.cs new file mode 100644 index 0000000..dd3dbc7 --- /dev/null +++ b/src/War3App.MapAdapter/Environment/MapEnvironmentExtensions.cs @@ -0,0 +1,62 @@ +using War3Net.Build.Common; +using War3Net.Build.Environment; + +namespace War3App.MapAdapter.Environment +{ + public static class MapEnvironmentExtensions + { + public static bool Adapt(this MapEnvironment mapEnvironment, AdaptFileContext context, out MapFileStatus status) + { + if (mapEnvironment.GetMinimumPatch() <= context.TargetPatch.Patch) + { + status = MapFileStatus.Compatible; + return false; + } + + status = mapEnvironment.TryDowngrade(context.TargetPatch.Patch) + ? MapFileStatus.Compatible + : MapFileStatus.Incompatible; + + return status == MapFileStatus.Compatible; + } + + public static bool TryDowngrade(this MapEnvironment mapEnvironment, GamePatch targetPatch) + { + try + { + while (mapEnvironment.GetMinimumPatch() > targetPatch) + { + mapEnvironment.DowngradeOnce(); + } + + return true; + } + catch + { + throw; + } + } + + public static void DowngradeOnce(this MapEnvironment mapEnvironment) + { + switch (mapEnvironment.FormatVersion) + { + case MapEnvironmentFormatVersion.v12: + mapEnvironment.FormatVersion = MapEnvironmentFormatVersion.v11; + break; + + default: + break; + } + } + + public static GamePatch GetMinimumPatch(this MapEnvironment mapEnvironment) + { + return mapEnvironment.FormatVersion switch + { + MapEnvironmentFormatVersion.v11 => GamePatch.v1_00, + MapEnvironmentFormatVersion.v12 => GamePatch.v2_0_3, + }; + } + } +} \ No newline at end of file diff --git a/src/War3App.MapAdapter/War3App.MapAdapter.csproj b/src/War3App.MapAdapter/War3App.MapAdapter.csproj index 6c809ab..f16fe51 100644 --- a/src/War3App.MapAdapter/War3App.MapAdapter.csproj +++ b/src/War3App.MapAdapter/War3App.MapAdapter.csproj @@ -4,13 +4,13 @@ net6.0 9.0 enable - 1.5.2 + 1.6.0 - +