Internal: some DataReaders refactoring.

Updated ZDoom_DECORATE.cfg (ALLOWTHRUFLAGS flag).
This commit is contained in:
MaxED 2016-04-29 13:42:52 +00:00
parent 70586e3538
commit 6e4540b314
12 changed files with 307 additions and 91 deletions

View file

@ -868,6 +868,7 @@ constants
STAYMORPHED;
CANBLAST;
NOBLOCKMONST;
ALLOWTHRUFLAGS;
THRUGHOST;
THRUACTORS;
THRUSPECIES;

View file

@ -292,21 +292,20 @@ namespace CodeImp.DoomBuilder.Data
// This loads all data resources
internal void Load(DataLocationList configlist, DataLocationList maplist, DataLocation maplocation)
{
DataLocationList all = DataLocationList.Combined(configlist, maplist);
all.Remove(maplocation); //mxd. If maplocation was already added as a resource, make sure it's singular and is last in the list
all.Add(maplocation);
Load(all);
//mxd. Don't modify original lists
DataLocationList configlistcopy = new DataLocationList(configlist);
DataLocationList maplistcopy = new DataLocationList(maplist);
//mxd. If maplocation was already added as a resource, make sure it's singular and is the last in the list
configlistcopy.Remove(maplocation);
maplistcopy.Remove(maplocation);
maplistcopy.Add(maplocation);
Load(configlistcopy, maplistcopy);
}
// This loads all data resources
internal void Load(DataLocationList configlist, DataLocationList maplist)
{
DataLocationList all = DataLocationList.Combined(configlist, maplist);
Load(all);
}
// This loads all data resources
private void Load(DataLocationList locations)
{
Dictionary<long, ImageData> texturesonly = new Dictionary<long, ImageData>();
Dictionary<long, ImageData> colormapsonly = new Dictionary<long, ImageData>();
@ -355,6 +354,7 @@ namespace CodeImp.DoomBuilder.Data
resourcetextures = new List<ResourceTextureSet>();
// Go for all locations
DataLocationList locations = DataLocationList.Combined(configlist, maplist); //mxd
string prevofficialiwad = string.Empty; //mxd
foreach(DataLocation dl in locations)
{
@ -372,7 +372,7 @@ namespace CodeImp.DoomBuilder.Data
{
// WAD file container
case DataLocation.RESOURCE_WAD:
c = new WADReader(dl);
c = new WADReader(dl, configlist.Contains(dl));
if(((WADReader)c).WadFile.IsOfficialIWAD) //mxd
{
if(!string.IsNullOrEmpty(prevofficialiwad))
@ -383,12 +383,12 @@ namespace CodeImp.DoomBuilder.Data
// Directory container
case DataLocation.RESOURCE_DIRECTORY:
c = new DirectoryReader(dl);
c = new DirectoryReader(dl, configlist.Contains(dl));
break;
// PK3 file container
case DataLocation.RESOURCE_PK3:
c = new PK3Reader(dl);
c = new PK3Reader(dl, configlist.Contains(dl));
break;
}
}

View file

@ -19,6 +19,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using CodeImp.DoomBuilder.Compilers;
using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.GZBuilder.Data;
using CodeImp.DoomBuilder.ZDoom;
@ -94,6 +95,7 @@ namespace CodeImp.DoomBuilder.Data
protected DataLocation location;
protected bool issuspended;
protected bool isdisposed;
protected bool isreadonly; //mxd
protected ResourceTextureSet textureset;
#endregion
@ -103,6 +105,7 @@ namespace CodeImp.DoomBuilder.Data
public DataLocation Location { get { return location; } }
public bool IsDisposed { get { return isdisposed; } }
public bool IsSuspended { get { return issuspended; } }
public bool IsReadOnly { get { return isreadonly; } } //mxd
public ResourceTextureSet TextureSet { get { return textureset; } }
#endregion
@ -110,10 +113,11 @@ namespace CodeImp.DoomBuilder.Data
#region ================== Constructor / Disposer
// Constructor
protected DataReader(DataLocation dl)
protected DataReader(DataLocation dl, bool asreadonly)
{
// Keep information
location = dl;
isreadonly = asreadonly;
textureset = new ResourceTextureSet(GetTitle(), dl);
}
@ -256,9 +260,23 @@ namespace CodeImp.DoomBuilder.Data
//mxd. When implemented, this returns the voxel lump
public abstract Stream GetVoxelData(string name);
//mxd
#endregion
#region ================== Load/Save (mxd)
internal abstract MemoryStream LoadFile(string name);
internal abstract MemoryStream LoadFile(string name, int lumpindex);
internal abstract bool SaveFile(MemoryStream stream, string name);
internal abstract bool SaveFile(MemoryStream stream, string name, int lumpindex);
internal abstract bool FileExists(string filename);
internal abstract bool FileExists(string filename, int lumpindex);
#endregion
#region ================== Compiling (mxd)
internal abstract bool CompileLump(string lumpname, out List<CompilerError> errors);
internal abstract bool CompileLump(string lumpname, int lumpindex, out List<CompilerError> errors);
#endregion
}

View file

@ -19,6 +19,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using CodeImp.DoomBuilder.Compilers;
using CodeImp.DoomBuilder.IO;
#endregion
@ -36,7 +37,7 @@ namespace CodeImp.DoomBuilder.Data
#region ================== Constructor / Disposer
// Constructor
public DirectoryReader(DataLocation dl) : base(dl)
public DirectoryReader(DataLocation dl, bool asreadonly) : base(dl, asreadonly)
{
General.WriteLogLine("Opening directory resource \"" + location.location + "\"");
@ -57,7 +58,7 @@ namespace CodeImp.DoomBuilder.Data
foreach(string wadfile in wadfiles)
{
DataLocation wdl = new DataLocation(DataLocation.RESOURCE_WAD, Path.Combine(location.location, wadfile), false, false, true);
wads.Add(new WADReader(wdl));
wads.Add(new WADReader(wdl, isreadonly));
}
}
@ -397,6 +398,7 @@ namespace CodeImp.DoomBuilder.Data
}
// This returns true if the specified file exists
internal override bool FileExists(string filename, int unused) { return files.FileExists(filename); } //mxd
internal override bool FileExists(string filename)
{
return files.FileExists(filename);
@ -473,6 +475,28 @@ namespace CodeImp.DoomBuilder.Data
return s;
}
//mxd
internal override bool SaveFile(MemoryStream stream, string filename, int unused) { return SaveFile(stream, filename); }
internal override bool SaveFile(MemoryStream stream, string filename)
{
if(isreadonly) return false;
try
{
lock(this)
{
File.WriteAllBytes(Path.Combine(location.location, filename), stream.ToArray());
}
}
catch(Exception e)
{
General.ErrorLogger.Add(ErrorType.Error, "Unable to save file: " + e.Message);
return false;
}
return true;
}
// This creates a temp file for the speciied file and return the absolute path to the temp file
// NOTE: Callers are responsible for removing the temp file when done!
protected override string CreateTempFile(string filename)
@ -484,5 +508,17 @@ namespace CodeImp.DoomBuilder.Data
}
#endregion
#region ================== Compiling (mxd)
// This compiles a script lump and returns any errors that may have occurred
// Returns true when our code worked properly (even when the compiler returned errors)
internal override bool CompileLump(string filename, int unused, out List<CompilerError> errors) { return CompileLump(filename, out errors); }
internal override bool CompileLump(string lumpname, out List<CompilerError> errors)
{
throw new NotImplementedException();
}
#endregion
}
}

View file

@ -19,8 +19,10 @@
using System;
using System.Collections.Generic;
using System.IO;
using CodeImp.DoomBuilder.Compilers;
using CodeImp.DoomBuilder.IO;
using SharpCompress.Archive; //mxd
using SharpCompress.Archive.Zip;
using SharpCompress.Common; //mxd
using SharpCompress.Reader; //mxd
@ -49,7 +51,7 @@ namespace CodeImp.DoomBuilder.Data
#region ================== Constructor / Disposer
// Constructor
public PK3Reader(DataLocation dl) : base(dl)
public PK3Reader(DataLocation dl, bool asreadonly) : base(dl, asreadonly)
{
General.WriteLogLine("Opening " + Path.GetExtension(location.location).ToUpper().Replace(".", "") + " resource \"" + location.location + "\"");
@ -66,6 +68,7 @@ namespace CodeImp.DoomBuilder.Data
// Random access of 7z archives works TERRIBLY slow in SharpCompress
if(archivetype == ArchiveType.SevenZip)
{
isreadonly = true; // Unsaveable...
sevenzipentries = new Dictionary<string, byte[]>(StringComparer.Ordinal);
IReader reader = archive.ExtractAllEntries();
@ -410,6 +413,7 @@ namespace CodeImp.DoomBuilder.Data
}
// This returns true if the specified file exists
internal override bool FileExists(string filename, int unused) { return files.FileExists(filename); }
internal override bool FileExists(string filename)
{
return files.FileExists(filename);
@ -514,6 +518,26 @@ namespace CodeImp.DoomBuilder.Data
return filedata;
}
//mxd. TODO: test this
internal override bool SaveFile(MemoryStream stream, string filename, int unused) { return SaveFile(stream, filename); }
internal override bool SaveFile(MemoryStream stream, string filename)
{
// Not implemented in SevenZipArchive...
if(isreadonly || archivetype == ArchiveType.SevenZip) return false;
// Re-open the archive
using(ZipArchive za = (ZipArchive)ArchiveFactory.Open(location.location))
{
if(za == null) return false;
// Replace entry
//TODO: Do we need to remove the old entry?
za.AddEntry(filename, stream, stream.Length, DateTime.Now);
}
return true;
}
// This creates a temp file for the speciied file and return the absolute path to the temp file
// NOTE: Callers are responsible for removing the temp file when done!
protected override string CreateTempFile(string filename)
@ -551,5 +575,17 @@ namespace CodeImp.DoomBuilder.Data
}
#endregion
#region ================== Compiling (mxd)
// This compiles a script lump and returns any errors that may have occurred
// Returns true when our code worked properly (even when the compiler returned errors)
internal override bool CompileLump(string filename, int unused, out List<CompilerError> errors) { return CompileLump(filename, out errors); }
internal override bool CompileLump(string filename, out List<CompilerError> errors)
{
throw new NotImplementedException();
}
#endregion
}
}

View file

@ -62,7 +62,7 @@ namespace CodeImp.DoomBuilder.Data
#region ================== Constructor / Disposer
// Constructor
protected PK3StructuredReader(DataLocation dl) : base(dl)
protected PK3StructuredReader(DataLocation dl, bool asreadonly) : base(dl, asreadonly)
{
// Initialize
this.roottextures = dl.option1;
@ -79,7 +79,7 @@ namespace CodeImp.DoomBuilder.Data
{
string tempfile = CreateTempFile(w);
DataLocation wdl = new DataLocation(DataLocation.RESOURCE_WAD, tempfile, Path.Combine(location.GetDisplayName(), Path.GetFileName(w)), false, false, true);
wads.Add(new WADReader(wdl));
wads.Add(new WADReader(wdl, location.type != DataLocation.RESOURCE_DIRECTORY));
}
}
@ -875,6 +875,12 @@ namespace CodeImp.DoomBuilder.Data
}
}
//mxd. Archives and Folders don't have lump indices
internal override MemoryStream LoadFile(string name, int unused)
{
return LoadFile(name);
}
#endregion
}
}

View file

@ -20,10 +20,11 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using CodeImp.DoomBuilder.Compilers;
using CodeImp.DoomBuilder.GZBuilder.Data;
using CodeImp.DoomBuilder.IO;
using CodeImp.DoomBuilder.ZDoom;
using CodeImp.DoomBuilder.GZBuilder.Data;
using System.Text.RegularExpressions;
#endregion
@ -50,17 +51,17 @@ namespace CodeImp.DoomBuilder.Data
// Source
private WAD file;
private bool is_iwad;
private readonly bool strictpatches;
private bool strictpatches;
// Lump ranges
private readonly List<LumpRange> flatranges;
private readonly List<LumpRange> invertedflatranges; //mxd
private readonly List<LumpRange> patchranges;
private readonly List<LumpRange> spriteranges;
private readonly List<LumpRange> textureranges;
private readonly List<LumpRange> hiresranges; //mxd
private readonly List<LumpRange> colormapranges;
private readonly List<LumpRange> voxelranges; //mxd
private List<LumpRange> flatranges;
private List<LumpRange> invertedflatranges; //mxd
private List<LumpRange> patchranges;
private List<LumpRange> spriteranges;
private List<LumpRange> textureranges;
private List<LumpRange> hiresranges; //mxd
private List<LumpRange> colormapranges;
private List<LumpRange> voxelranges; //mxd
#endregion
@ -74,7 +75,7 @@ namespace CodeImp.DoomBuilder.Data
#region ================== Constructor / Disposer
// Constructor
public WADReader(DataLocation dl) : base(dl)
public WADReader(DataLocation dl, bool asreadonly) : base(dl, asreadonly)
{
General.WriteLogLine("Opening WAD resource \"" + location.location + "\"");
@ -82,9 +83,41 @@ namespace CodeImp.DoomBuilder.Data
throw new FileNotFoundException("Could not find the file \"" + location.location + "\"", location.location);
// Initialize
file = new WAD(location.location, true);
is_iwad = file.IsIWAD;
file = new WAD(location.location, asreadonly);
strictpatches = dl.option1;
Initialize(); //mxd
// We have no destructor
GC.SuppressFinalize(this);
}
//mxd. Constructor
internal WADReader(DataLocation dl, bool asreadonly, bool create) : base(dl, asreadonly)
{
if(!create)
{
General.WriteLogLine("Opening WAD resource \"" + location.location + "\"");
if(!File.Exists(location.location))
throw new FileNotFoundException("Could not find the file \"" + location.location + "\"", location.location);
}
// Initialize
file = new WAD(location.location, asreadonly);
strictpatches = dl.option1;
Initialize();
// We have no destructor
GC.SuppressFinalize(this);
}
//mxd
private void Initialize()
{
is_iwad = file.IsIWAD;
isreadonly = file.IsReadOnly; // I guess opening an official IWAD in write-enabled mode is possible
// Initialize
patchranges = new List<LumpRange>();
spriteranges = new List<LumpRange>();
flatranges = new List<LumpRange>();
@ -133,9 +166,6 @@ namespace CodeImp.DoomBuilder.Data
LumpRange range = new LumpRange {start = 0, end = file.Lumps.Count - 1};
invertedflatranges.Add(range);
}
// We have no destructor
GC.SuppressFinalize(this);
}
// Disposer
@ -1081,7 +1111,10 @@ namespace CodeImp.DoomBuilder.Data
return result;
}
//mxd
#endregion
#region ================== IO (mxd)
internal override MemoryStream LoadFile(string name)
{
Lump l = file.FindLump(name);
@ -1095,10 +1128,93 @@ namespace CodeImp.DoomBuilder.Data
return null;
}
//mxd
internal override bool FileExists(string name)
internal override MemoryStream LoadFile(string name, int lumpindex)
{
return file.FindLumpIndex(name) != -1;
if(lumpindex < 0 || file.Lumps.Count <= lumpindex || file.Lumps[lumpindex].Name != name)
return null;
Lump l = file.Lumps[lumpindex];
l.Stream.Seek(0, SeekOrigin.Begin);
return new MemoryStream(l.Stream.ReadAllBytes());
}
internal override bool SaveFile(MemoryStream lumpdata, string lumpname)
{
if(isreadonly) return false;
int insertindex = file.Lumps.Count;
// Remove the lump if it already exists
int li = file.FindLumpIndex(lumpname);
if(li > -1)
{
insertindex = li;
file.RemoveAt(li);
}
// Insert new lump
Lump l = file.Insert(lumpname, insertindex, (int)lumpdata.Length);
l.Stream.Seek(0, SeekOrigin.Begin);
lumpdata.WriteTo(l.Stream);
return true;
}
internal override bool SaveFile(MemoryStream lumpdata, string lumpname, int lumpindex)
{
if(isreadonly || lumpindex < 0 || file.Lumps.Count <= lumpindex || file.Lumps[lumpindex].Name != lumpname)
return false;
// Remove the lump
file.RemoveAt(lumpindex);
// Insert new lump
Lump l = file.Insert(lumpname, lumpindex, (int)lumpdata.Length);
l.Stream.Seek(0, SeekOrigin.Begin);
lumpdata.WriteTo(l.Stream);
return true;
}
internal override bool FileExists(string lumpname)
{
return file.FindLumpIndex(lumpname) != -1;
}
internal override bool FileExists(string lumpname, int lumpindex)
{
return file.FindLumpIndex(lumpname) == lumpindex;
}
#endregion
#region ================== Compiling (mxd)
// This compiles a script lump and returns any errors that may have occurred
// Returns true when our code worked properly (even when the compiler returned errors)
internal override bool CompileLump(string lumpname, out List<CompilerError> errors)
{
int index = file.FindLumpIndex(lumpname);
if(index == -1)
{
errors = new List<CompilerError>
{
new CompilerError
{
description = "Lump \"" + lumpname + "\" does not exist",
filename = this.location.GetDisplayName()
}
};
return false;
}
return CompileLump(lumpname, index, out errors);
}
// This compiles a script lump and returns any errors that may have occurred
// Returns true when our code worked properly (even when the compiler returned errors)
internal override bool CompileLump(string lumpname, int lumpindex, out List<CompilerError> errors)
{
throw new NotImplementedException();
}
#endregion

View file

@ -75,7 +75,7 @@ namespace CodeImp.DoomBuilder
private D3DDevice graphics;
private Renderer2D renderer2d;
private Renderer3D renderer3d;
private WAD tempwad;
private WADReader tempwadreader;
private GridSetup grid;
private UndoManager undoredo;
private CopyPasteManager copypaste;
@ -122,6 +122,7 @@ namespace CodeImp.DoomBuilder
internal ScriptEditorForm ScriptEditor { get { return scriptwindow; } }
public VisualCamera VisualCamera { get { return visualcamera; } set { visualcamera = value; } }
public bool IsScriptsWindowOpen { get { return (scriptwindow != null) && !scriptwindow.IsDisposed; } }
internal WADReader TemporaryMapFile { get { return tempwadreader; } } //mxd
//mxd. Map format
public bool UDMF { get { return config.UDMF; } }
@ -193,7 +194,7 @@ namespace CodeImp.DoomBuilder
General.WriteLogLine("Unloading data resources...");
if(data != null) data.Dispose();
General.WriteLogLine("Closing temporary file...");
if(tempwad != null) tempwad.Dispose();
if(tempwadreader != null) tempwadreader.Dispose(); //mxd
General.WriteLogLine("Unloading map data...");
if(map != null) map.Dispose();
General.WriteLogLine("Stopping graphics device...");
@ -206,7 +207,7 @@ namespace CodeImp.DoomBuilder
copypaste = null;
undoredo = null;
data = null;
tempwad = null;
tempwadreader = null; //mxd
map = null;
renderer2d = null;
renderer3d = null;
@ -278,12 +279,12 @@ namespace CodeImp.DoomBuilder
map = new MapSet();
// Create temp wadfile
string tempfile = General.MakeTempFilename(temppath);
General.WriteLogLine("Creating temporary file: " + tempfile);
DataLocation templocation = new DataLocation(DataLocation.RESOURCE_WAD, General.MakeTempFilename(temppath), false, false, false); //mxd
General.WriteLogLine("Creating temporary file: " + templocation.location);
#if DEBUG
tempwad = new WAD(tempfile);
tempwadreader = new WADReader(templocation, false, true);
#else
try { tempwad = new WAD(tempfile); }
try { tempwadreader = new WADReader(templocation, false, true); }
catch(Exception e)
{
General.ShowErrorMessage("Error while creating a temporary wad file:\n" + e.GetType().Name + ": " + e.Message, MessageBoxButtons.OK);
@ -293,13 +294,13 @@ namespace CodeImp.DoomBuilder
// Read the map from temp file
General.WriteLogLine("Initializing map format interface " + config.FormatInterface + "...");
io = MapSetIO.Create(config.FormatInterface, tempwad, this);
io = MapSetIO.Create(config.FormatInterface, tempwadreader.WadFile, this);
// Create required lumps
General.WriteLogLine("Creating map data structures...");
tempwad.Insert(TEMP_MAP_HEADER, 0, 0);
tempwadreader.WadFile.Insert(TEMP_MAP_HEADER, 0, 0);
io.Write(map, TEMP_MAP_HEADER, 1);
CreateRequiredLumps(tempwad, TEMP_MAP_HEADER);
CreateRequiredLumps(tempwadreader.WadFile, TEMP_MAP_HEADER);
// Load data manager
General.WriteLogLine("Loading data resources...");
@ -373,12 +374,12 @@ namespace CodeImp.DoomBuilder
map = new MapSet();
// Create temp wadfile
string tempfile = General.MakeTempFilename(temppath);
General.WriteLogLine("Creating temporary file: " + tempfile);
DataLocation templocation = new DataLocation(DataLocation.RESOURCE_WAD, General.MakeTempFilename(temppath), false, false, false); //mxd
General.WriteLogLine("Creating temporary file: " + templocation.location);
#if DEBUG
tempwad = new WAD(tempfile);
tempwadreader = new WADReader(templocation, false, true);
#else
try { tempwad = new WAD(tempfile); } catch(Exception e)
try { tempwadreader = new WADReader(templocation, false, true); } catch(Exception e)
{
General.ShowErrorMessage("Error while creating a temporary wad file:\n" + e.GetType().Name + ": " + e.Message, MessageBoxButtons.OK);
return false;
@ -399,7 +400,7 @@ namespace CodeImp.DoomBuilder
// Copy the map lumps to the temp file
General.WriteLogLine("Copying map lumps to temporary file...");
CopyLumpsByType(mapwad, options.CurrentName, tempwad, TEMP_MAP_HEADER, REPLACE_TARGET_MAP, true, true, true, true);
CopyLumpsByType(mapwad, options.CurrentName, tempwadreader.WadFile, TEMP_MAP_HEADER, REPLACE_TARGET_MAP, true, true, true, true);
// Close the map file
mapwad.Dispose();
@ -466,14 +467,14 @@ namespace CodeImp.DoomBuilder
WAD mapwad;
// Create temp wadfile
string tempfile = General.MakeTempFilename(temppath);
General.WriteLogLine("Creating temporary file: " + tempfile);
if(tempwad != null) tempwad.Dispose();
DataLocation templocation = new DataLocation(DataLocation.RESOURCE_WAD, General.MakeTempFilename(temppath), false, false, false); //mxd
General.WriteLogLine("Creating temporary file: " + templocation.location);
if(tempwadreader != null) tempwadreader.Dispose();
#if DEBUG
tempwad = new WAD(tempfile);
tempwadreader = new WADReader(templocation, false, true);
#else
try { tempwad = new WAD(tempfile); } catch(Exception e)
try { tempwadreader = new WADReader(templocation, false, true); } catch(Exception e)
{
General.ShowErrorMessage("Error while creating a temporary wad file:\n" + e.GetType().Name + ": " + e.Message, MessageBoxButtons.OK);
return false;
@ -495,7 +496,7 @@ namespace CodeImp.DoomBuilder
// Copy the map lumps to the temp file
General.WriteLogLine("Copying map lumps to temporary file...");
CopyLumpsByType(mapwad, options.CurrentName, tempwad, TEMP_MAP_HEADER, REPLACE_TARGET_MAP, true, true, true, true);
CopyLumpsByType(mapwad, options.CurrentName, tempwadreader.WadFile, TEMP_MAP_HEADER, REPLACE_TARGET_MAP, true, true, true, true);
// Close the map file
mapwad.Dispose();
@ -559,7 +560,7 @@ namespace CodeImp.DoomBuilder
+ "Would you like to restore the map from the backup?", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
General.WriteLogLine("Initializing map format interface " + config.FormatInterface + "...");
io = MapSetIO.Create(config.FormatInterface, tempwad, this);
io = MapSetIO.Create(config.FormatInterface, tempwadreader.WadFile, this);
General.WriteLogLine("Restoring map from \"" + backuppath + "\"...");
#if DEBUG
@ -591,7 +592,7 @@ namespace CodeImp.DoomBuilder
{
newmap.BeginAddRemove();
General.WriteLogLine("Initializing map format interface " + config.FormatInterface + "...");
io = MapSetIO.Create(config.FormatInterface, tempwad, this);
io = MapSetIO.Create(config.FormatInterface, tempwadreader.WadFile, this);
General.WriteLogLine("Reading map data from file...");
#if DEBUG
newmap = io.Read(newmap, TEMP_MAP_HEADER);
@ -699,7 +700,7 @@ namespace CodeImp.DoomBuilder
// Write to temporary file
General.WriteLogLine("Writing map data structures to file...");
int index = Math.Max(0, tempwad.FindLumpIndex(TEMP_MAP_HEADER));
int index = Math.Max(0, tempwadreader.WadFile.FindLumpIndex(TEMP_MAP_HEADER));
io.Write(outputset, TEMP_MAP_HEADER, index);
outputset.Dispose();
@ -772,7 +773,7 @@ namespace CodeImp.DoomBuilder
else
{
// Check if we have nodebuilder lumps
includenodes = VerifyNodebuilderLumps(tempwad, TEMP_MAP_HEADER);
includenodes = VerifyNodebuilderLumps(tempwadreader.WadFile, TEMP_MAP_HEADER);
}
//mxd. Target file is read-only?
@ -969,7 +970,7 @@ namespace CodeImp.DoomBuilder
}
// Copy map lumps to target file
CopyLumpsByType(tempwad, TEMP_MAP_HEADER, targetwad, origmapname, mapheaderindex, true, true, includenodes, true);
CopyLumpsByType(tempwadreader.WadFile, TEMP_MAP_HEADER, targetwad, origmapname, mapheaderindex, true, true, includenodes, true);
// mxd. Was the map renamed?
if(options.LevelNameChanged)
@ -1172,14 +1173,14 @@ namespace CodeImp.DoomBuilder
#endif
// Determine source file
string sourcefile = (filepathname.Length > 0 ? filepathname : tempwad.Filename);
string sourcefile = (filepathname.Length > 0 ? filepathname : tempwadreader.WadFile.Filename);
//mxd.
RemoveUnneededLumps(tempwad, TEMP_MAP_HEADER, true);
RemoveUnneededLumps(tempwadreader.WadFile, TEMP_MAP_HEADER, true);
// Copy lumps to buildwad
General.WriteLogLine("Copying map lumps to temporary build file...");
CopyLumpsByType(tempwad, TEMP_MAP_HEADER, buildwad, BUILD_MAP_HEADER, REPLACE_TARGET_MAP, true, false, false, true);
CopyLumpsByType(tempwadreader.WadFile, TEMP_MAP_HEADER, buildwad, BUILD_MAP_HEADER, REPLACE_TARGET_MAP, true, false, false, true);
// Close buildwad
buildwad.Dispose();
@ -1224,7 +1225,7 @@ namespace CodeImp.DoomBuilder
{
// Copy nodebuilder lumps to temp file
General.WriteLogLine("Copying nodebuilder lumps to temporary file...");
CopyLumpsByType(buildwad, BUILD_MAP_HEADER, tempwad, TEMP_MAP_HEADER, REPLACE_TARGET_MAP, false, false, true, false);
CopyLumpsByType(buildwad, BUILD_MAP_HEADER, tempwadreader.WadFile, TEMP_MAP_HEADER, REPLACE_TARGET_MAP, false, false, true, false);
}
else
{
@ -1309,7 +1310,7 @@ namespace CodeImp.DoomBuilder
// This is copied from the temp wad file and returns null when the lump is not found
public MemoryStream GetLumpData(string lumpname)
{
Lump l = tempwad.FindLump(lumpname);
Lump l = tempwadreader.WadFile.FindLump(lumpname);
if(l != null)
{
l.Stream.Seek(0, SeekOrigin.Begin);
@ -1321,18 +1322,18 @@ namespace CodeImp.DoomBuilder
// This writes a copy of the data to a lump in the temp file
public void SetLumpData(string lumpname, MemoryStream lumpdata)
{
int insertindex = tempwad.Lumps.Count;
int insertindex = tempwadreader.WadFile.Lumps.Count;
// Remove the lump if it already exists
int li = tempwad.FindLumpIndex(lumpname);
int li = tempwadreader.WadFile.FindLumpIndex(lumpname);
if(li > -1)
{
insertindex = li;
tempwad.RemoveAt(li);
tempwadreader.WadFile.RemoveAt(li);
}
// Insert new lump
Lump l = tempwad.Insert(lumpname, insertindex, (int)lumpdata.Length);
Lump l = tempwadreader.WadFile.Insert(lumpname, insertindex, (int)lumpdata.Length);
l.Stream.Seek(0, SeekOrigin.Begin);
lumpdata.WriteTo(l.Stream);
@ -1343,7 +1344,7 @@ namespace CodeImp.DoomBuilder
// This checks if the specified lump exists in the temp file
public bool LumpExists(string lumpname)
{
return (tempwad.FindLumpIndex(lumpname) > -1);
return (tempwadreader.WadFile.FindLumpIndex(lumpname) > -1);
}
// This creates empty lumps for those required
@ -2002,11 +2003,11 @@ namespace CodeImp.DoomBuilder
// Find the lump
if(lumpname == CONFIG_MAP_HEADER) reallumpname = TEMP_MAP_HEADER;
Lump lump = tempwad.FindLump(reallumpname);
Lump lump = tempwadreader.WadFile.FindLump(reallumpname);
if(lump == null) throw new Exception("No such lump in temporary wad file \"" + reallumpname + "\".");
// Determine source file
string sourcefile = (filepathname.Length > 0 ? filepathname : tempwad.Filename);
string sourcefile = (filepathname.Length > 0 ? filepathname : tempwadreader.WadFile.Filename);
// New list of errors
if(clearerrors) errors.Clear();
@ -2183,7 +2184,7 @@ namespace CodeImp.DoomBuilder
};
//INFO: CompileLump() prepends lumpname with "?" to distinguish between temporary files and files compiled in place
DataLocation location = new DataLocation { location = tempwad.Filename, type = DataLocation.RESOURCE_WAD };
DataLocation location = new DataLocation { location = tempwadreader.WadFile.Filename, type = DataLocation.RESOURCE_WAD };
TextResourceData data = new TextResourceData(stream, location, "?SCRIPTS", false);
if(parser.Parse(data, scriptconfig.Compiler.Files, true, AcsParserSE.IncludeType.NONE, false))
{
@ -2431,14 +2432,14 @@ namespace CodeImp.DoomBuilder
// Setup new map format IO
General.WriteLogLine("Initializing map format interface " + config.FormatInterface + "...");
io = MapSetIO.Create(config.FormatInterface, tempwad, this);
io = MapSetIO.Create(config.FormatInterface, tempwadreader.WadFile, this);
//mxd. Some lumps may've become unneeded during map format conversion.
if(oldiotype != io.GetType())
RemoveUnneededLumps(tempwad, TEMP_MAP_HEADER, false);
RemoveUnneededLumps(tempwadreader.WadFile, TEMP_MAP_HEADER, false);
// Create required lumps if they don't exist yet
CreateRequiredLumps(tempwad, TEMP_MAP_HEADER);
CreateRequiredLumps(tempwadreader.WadFile, TEMP_MAP_HEADER);
// Let the plugins know
General.Plugins.MapReconfigure();

View file

@ -249,9 +249,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
//render hint
if(horizontalslices > 1 || verticalslices > 1)
{
hintlabel.Text = "H: " + (slicesH - 1) + "; V: " + (slicesV - 1);
if(width > hintlabel.Text.Length * vsize && height > 16 * vsize)
string text = "H: " + (slicesH - 1) + "; V: " + (slicesV - 1);
if(width > text.Length * vsize && height > 16 * vsize)
{
hintlabel.Text = text;
hintlabel.Move(start, end);
renderer.RenderText(hintlabel.TextLabel);
}

View file

@ -656,7 +656,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
l.Text = group.Value[0];
}
torender.Add(l);
if(!string.IsNullOrEmpty(l.Text)) torender.Add(l);
}
}

View file

@ -204,7 +204,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
for(int i = 0; i < s.Labels.Count; i++)
{
// Render only when enough space for the label to see
if(requiredsize < s.Labels[i].radius) torender.Add(labelarray[i]);
if(!string.IsNullOrEmpty(labelarray[i].Text) && requiredsize < s.Labels[i].radius)
torender.Add(labelarray[i]);
}
}
renderer.RenderText(torender);
@ -249,7 +250,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
l.Text = group.Value[0];
}
torender.Add(l);
if(!string.IsNullOrEmpty(l.Text)) torender.Add(l);
}
}

View file

@ -289,7 +289,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
l.Text = group.Value[0];
}
torender.Add(l);
if(!string.IsNullOrEmpty(l.Text)) torender.Add(l);
}
}