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