diff --git a/src/War3App.MapAdapter.WinForms/War3App.MapAdapter.WinForms.csproj b/src/War3App.MapAdapter.WinForms/War3App.MapAdapter.WinForms.csproj
index e373511..53a153c 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.0
+ 1.5.1
diff --git a/src/War3App.MapAdapter/Extensions/GamePatchExtensions.cs b/src/War3App.MapAdapter/Extensions/GamePatchExtensions.cs
index 1660ed4..5861aa9 100644
--- a/src/War3App.MapAdapter/Extensions/GamePatchExtensions.cs
+++ b/src/War3App.MapAdapter/Extensions/GamePatchExtensions.cs
@@ -124,19 +124,42 @@ public static int GetEditorVersion(this GamePatch gamePatch)
case GamePatch.v1_32_2:
return 6106;
- // TODO
case GamePatch.v1_32_3:
+ return 6108;
+
case GamePatch.v1_32_4:
case GamePatch.v1_32_5:
+ return 6109;
+
case GamePatch.v1_32_6:
case GamePatch.v1_32_7:
+ return 6110;
+
case GamePatch.v1_32_8:
+ return 6111;
+
case GamePatch.v1_32_9:
+ return 6112;
+
case GamePatch.v1_32_10:
- return 6106;
+ case GamePatch.v1_33_0:
+ case GamePatch.v1_34_0:
+ return 6114;
+
+ case GamePatch.v1_35_0:
+ case GamePatch.v1_35_0a:
+ case GamePatch.v1_36_1:
+ case GamePatch.v1_36_2:
+ case GamePatch.v2_0_0:
+ case GamePatch.v2_0_1:
+ case GamePatch.v2_0_2:
+ return 6115;
+
+ case GamePatch.v2_0_3:
+ return 6116;
default: throw new NotSupportedException();
- };
+ }
}
public static string PrettyPrint(this GamePatch gamePatch)
diff --git a/src/War3App.MapAdapter/Info/CampaignInfoExtensions.cs b/src/War3App.MapAdapter/Info/CampaignInfoExtensions.cs
index be88c89..3fe88ab 100644
--- a/src/War3App.MapAdapter/Info/CampaignInfoExtensions.cs
+++ b/src/War3App.MapAdapter/Info/CampaignInfoExtensions.cs
@@ -1,5 +1,6 @@
using War3App.MapAdapter.Extensions;
+using War3Net.Build.Common;
using War3Net.Build.Info;
namespace War3App.MapAdapter.Info
@@ -8,8 +9,23 @@ public static class CampaignInfoExtensions
{
public static bool Adapt(this CampaignInfo campaignInfo, AdaptFileContext context, out MapFileStatus status)
{
- status = MapFileStatus.Compatible;
+ var modified = campaignInfo.ModifyEditorVersion(context);
+ if (campaignInfo.GetMinimumPatch() <= context.TargetPatch.Patch)
+ {
+ status = MapFileStatus.Compatible;
+ return modified;
+ }
+
+ status = campaignInfo.TryDowngrade(context.TargetPatch.Patch)
+ ? MapFileStatus.Compatible
+ : MapFileStatus.Incompatible;
+
+ return status == MapFileStatus.Compatible;
+ }
+
+ public static bool ModifyEditorVersion(this CampaignInfo campaignInfo, AdaptFileContext context)
+ {
var targetPatchEditorVersion = context.TargetPatch.Patch.GetEditorVersion();
if (campaignInfo.EditorVersion == targetPatchEditorVersion)
{
@@ -19,5 +35,45 @@ public static bool Adapt(this CampaignInfo campaignInfo, AdaptFileContext contex
campaignInfo.EditorVersion = targetPatchEditorVersion;
return true;
}
+
+ public static bool TryDowngrade(this CampaignInfo campaignInfo, GamePatch targetPatch)
+ {
+ try
+ {
+ while (campaignInfo.GetMinimumPatch() > targetPatch)
+ {
+ campaignInfo.DowngradeOnce();
+ }
+
+ return true;
+ }
+ catch
+ {
+ throw;
+ }
+ }
+
+ public static void DowngradeOnce(this CampaignInfo campaignInfo)
+ {
+ switch (campaignInfo.FormatVersion)
+ {
+ case CampaignInfoFormatVersion.v2:
+ campaignInfo.BackgroundVersion = CampaignBackgroundVersion.Default;
+ campaignInfo.FormatVersion = CampaignInfoFormatVersion.v1;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ public static GamePatch GetMinimumPatch(this CampaignInfo campaignInfo)
+ {
+ return campaignInfo.FormatVersion switch
+ {
+ CampaignInfoFormatVersion.v1 => GamePatch.v1_00,
+ CampaignInfoFormatVersion.v2 => GamePatch.v2_0_3,
+ };
+ }
}
}
\ No newline at end of file
diff --git a/src/War3App.MapAdapter/Info/DiagnosticRule.cs b/src/War3App.MapAdapter/Info/DiagnosticRule.cs
index c5c977d..d950974 100644
--- a/src/War3App.MapAdapter/Info/DiagnosticRule.cs
+++ b/src/War3App.MapAdapter/Info/DiagnosticRule.cs
@@ -2,6 +2,15 @@
{
public static partial class DiagnosticRule
{
+ public static class CampaignInfo
+ {
+ public static readonly DiagnosticDescriptor NotSupported = new()
+ {
+ Severity = DiagnosticSeverity.Error,
+ Description = "The file format version {0} is not supported before {1}.",
+ };
+ }
+
public static class MapInfo
{
public static readonly DiagnosticDescriptor NotSupported = new()
diff --git a/src/War3App.MapAdapter/Info/MapInfoExtensions.cs b/src/War3App.MapAdapter/Info/MapInfoExtensions.cs
index 2f33ea1..d383a93 100644
--- a/src/War3App.MapAdapter/Info/MapInfoExtensions.cs
+++ b/src/War3App.MapAdapter/Info/MapInfoExtensions.cs
@@ -61,14 +61,19 @@ public static void DowngradeOnce(this MapInfo mapInfo)
{
switch (mapInfo.FormatVersion)
{
+ case MapInfoFormatVersion.v32:
+ case MapInfoFormatVersion.v33:
+ mapInfo.MapFlags &= ~(MapFlags.DisableDenyIcon | MapFlags.ForceDefaultCameraZoom | MapFlags.ForceMaxCameraZoom | MapFlags.ForceMinCameraZoom);
+ mapInfo.FormatVersion = MapInfoFormatVersion.v31;
+ break;
+
case MapInfoFormatVersion.v31:
mapInfo.MapFlags &= ~(MapFlags.AccurateProbabilityForCalculations | MapFlags.CustomAbilitySkin);
- mapInfo.EditorVersion = EditorVersion.v6072;
- mapInfo.GameVersion = new Version(1, 31, 1, 12173);
-
mapInfo.FormatVersion = MapInfoFormatVersion.v28;
break;
+ case MapInfoFormatVersion.v26:
+ case MapInfoFormatVersion.v27:
case MapInfoFormatVersion.v28:
if (mapInfo.ScriptLanguage == ScriptLanguage.Lua)
{
@@ -76,10 +81,11 @@ public static void DowngradeOnce(this MapInfo mapInfo)
}
mapInfo.GameVersion = null;
-
mapInfo.FormatVersion = MapInfoFormatVersion.v25;
break;
+ case MapInfoFormatVersion.v23:
+ case MapInfoFormatVersion.v24:
case MapInfoFormatVersion.v25:
if (mapInfo.Players.Count > 12 || mapInfo.Forces.Count > 12)
{
@@ -104,6 +110,7 @@ public static GamePatch GetMinimumPatch(this MapInfo mapInfo)
MapInfoFormatVersion.v25 => GamePatch.v1_07,
MapInfoFormatVersion.v28 => GamePatch.v1_31_0,
MapInfoFormatVersion.v31 => GamePatch.v1_32_0,
+ MapInfoFormatVersion.v33 => GamePatch.v2_0_3,
MapInfoFormatVersion.v8 => GamePatch.v1_00,
MapInfoFormatVersion.v10 => GamePatch.v1_00,
@@ -113,6 +120,7 @@ public static GamePatch GetMinimumPatch(this MapInfo mapInfo)
MapInfoFormatVersion.v24 => GamePatch.v1_07,
MapInfoFormatVersion.v26 => GamePatch.v1_31_0,
MapInfoFormatVersion.v27 => GamePatch.v1_31_0,
+ MapInfoFormatVersion.v32 => GamePatch.v2_0_3,
};
return minimumBySlotCounts > minimumByFormatVersion ? minimumBySlotCounts : minimumByFormatVersion;
diff --git a/src/War3App.MapAdapter/War3App.MapAdapter.csproj b/src/War3App.MapAdapter/War3App.MapAdapter.csproj
index f0ea7b5..940fe0c 100644
--- a/src/War3App.MapAdapter/War3App.MapAdapter.csproj
+++ b/src/War3App.MapAdapter/War3App.MapAdapter.csproj
@@ -8,7 +8,7 @@
-
+