diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index 467f216..e7ae572 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -953,16 +953,39 @@ namespace CodeImp.DoomBuilder // Treat "save as" into the current archive as normal save. bool isSaveAs = (purpose == SavePurpose.AsNewFile) && (newfilepathname != filepathname); // On Save AS we have to copy the previous file to the new file - if(isSaveAs) + if (isSaveAs) { // Copy if original file still exists - if(File.Exists(filepathname)) File.Copy(filepathname, newfilepathname, true); + if (File.Exists(filepathname)) + File.Copy(filepathname, newfilepathname, true); } - // If the target file exists, we need to rebuild it - // [ZZ] The original code here would do some weird trickery with tempfiles. - // I'm just finding the map lumps and deleting them on later stages. - targetwad = new WAD(newfilepathname); + if (File.Exists(newfilepathname)) + { + // If the target file exists, we need to rebuild it + // biwa. This somewhat restores the behavior that was change with commit b996d8a380056ed9cb3a3f90f3c534e29e77e53c + // Not rebuilding the WAD can cause issues with WADs that do not have their directory at the bottom. + // See https://github.com/jewalky/UltimateDoomBuilder/issues/531 + origwadfile = newfilepathname + ".temp"; + File.Move(newfilepathname, origwadfile); + + // Open original file + WAD origwad = new WAD(origwadfile, true); + + // Create new target file + targetwad = new WAD(newfilepathname) { IsIWAD = origwad.IsIWAD }; //mxd. Let's preserve wad type + + CopyAllLumps(origwad, targetwad); + + // Close original file and delete it + origwad.Dispose(); + File.Delete(origwadfile); + } + else + { + // Create new target file + targetwad = new WAD(newfilepathname); + } } catch(Exception e) { @@ -1553,6 +1576,26 @@ namespace CodeImp.DoomBuilder return tgtheaderindex; } + /// + /// Copies all lumps from one WAD to another + /// + /// Source WAD + /// Target WAD + private static void CopyAllLumps(WAD source, WAD target) + { + // Go for all lumps + for (int i = 0; i < source.Lumps.Count; i++) + { + Lump srclump = source.Lumps[i]; + + // Copy lump over! + Lump tgtlump = target.Insert(srclump.Name, target.Lumps.Count, srclump.Length, false); + srclump.CopyTo(tgtlump); + } + + target.WriteHeaders(); + } + // This copies specific map lumps from one WAD to another private void CopyLumpsByType(WAD source, string sourcemapname, WAD target, string targetmapname,