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
-
+