From dbcc57b7a6361a481954d249283bc2456bc0c799 Mon Sep 17 00:00:00 2001 From: MaxED <j.maxed@gmail.com> Date: Thu, 17 Dec 2015 10:07:28 +0000 Subject: [PATCH] Fixed, Script Editor: file was marked as changed when changing script configurations. Fixed, Script Editor: in some cases clicking on an error in the errors list didn't navigate to the error location. Fixed, Script Editor: in some cases incorrect error line number was shown. Fixed, Text lump parsers: fixed a crash when trying to get a filename from a quoted string with missing closing quote. Fixed, Text lump parsers: in several cases parsing errors were ignored by overlaying data structures. Fixed: in some cases Thing Filter thing flags were cleared when switching game configurations in the "Game Configurations" window. Changed, PK3 reader: loading of files with invalid path chars is now skipped instead of skipping loading of the whole resource. Also more helpful warning message is now displayed. Updated SharpCompress library to v.0.11.2.0. --- Build/Compilers/BCC/bcc.cfg | 2 + Build/Compilers/Hexen/acc.cfg | 4 + Build/Compilers/ZDoom/acc.cfg | 4 + Build/Compilers/Zandronum/acc.cfg | 4 + Build/SharpCompress.3.5.dll | Bin 418816 -> 419328 bytes Source/Core/Builder.csproj | 5 +- Source/Core/Compilers/AccCompiler.cs | 3 +- Source/Core/Compilers/Compiler.cs | 15 +- Source/Core/Compilers/NodesCompiler.cs | 2 +- Source/Core/Config/ConfigurationInfo.cs | 9 +- Source/Core/Controls/ScriptDocumentTab.cs | 47 ++- Source/Core/Controls/ScriptEditorControl.cs | 10 +- Source/Core/Controls/ScriptFileDocumentTab.cs | 15 +- Source/Core/Data/DataManager.cs | 90 +++-- Source/Core/Data/PK3Reader.cs | 40 ++- Source/Core/Data/WADReader.cs | 45 +-- Source/Core/Editing/ThingsFilter.cs | 59 ++- Source/Core/GZBuilder/Data/ModelData.cs | 6 + Source/Core/GZBuilder/Data/TextureData.cs | 6 - Source/Core/GZBuilder/GZDoom/AcsParserSE.cs | 67 ++-- .../Core/GZBuilder/GZDoom/DecorateParserSE.cs | 46 ++- Source/Core/GZBuilder/GZDoom/GldefsParser.cs | 335 +++++++++--------- Source/Core/GZBuilder/GZDoom/MapinfoParser.cs | 145 ++++---- .../Core/GZBuilder/GZDoom/ModeldefParser.cs | 63 ++-- .../Core/GZBuilder/GZDoom/ModeldefParserSE.cs | 48 +-- .../GZBuilder/GZDoom/ModeldefStructure.cs | 210 ++++++----- .../GZBuilder/GZDoom/ScriptTypeParserSE.cs | 17 +- Source/Core/GZBuilder/md3/ModelReader.cs | 18 +- Source/Core/General/ErrorLogger.cs | 43 ++- Source/Core/General/MapManager.cs | 13 +- Source/Core/ZDoom/ActorStructure.cs | 119 +++---- Source/Core/ZDoom/DecorateParser.cs | 159 +++++---- Source/Core/ZDoom/PatchStructure.cs | 22 +- Source/Core/ZDoom/ReverbsParser.cs | 15 +- Source/Core/ZDoom/SndSeqParser.cs | 5 + Source/Core/ZDoom/StateStructure.cs | 20 +- Source/Core/ZDoom/TextureStructure.cs | 22 +- Source/Core/ZDoom/TexturesParser.cs | 191 ++++++---- Source/Core/ZDoom/VoxeldefParser.cs | 28 +- Source/Core/ZDoom/ZDTextParser.cs | 51 ++- 40 files changed, 1113 insertions(+), 890 deletions(-) delete mode 100644 Source/Core/GZBuilder/Data/TextureData.cs diff --git a/Build/Compilers/BCC/bcc.cfg b/Build/Compilers/BCC/bcc.cfg index f9f1161e0..41f747bc4 100644 --- a/Build/Compilers/BCC/bcc.cfg +++ b/Build/Compilers/BCC/bcc.cfg @@ -9,5 +9,7 @@ compilers { interface = "AccCompiler"; program = "bcc.exe"; + zcommon = "zcommon.acs"; + std = "std.acs"; } } diff --git a/Build/Compilers/Hexen/acc.cfg b/Build/Compilers/Hexen/acc.cfg index eddbd7dc7..d20ad6610 100644 --- a/Build/Compilers/Hexen/acc.cfg +++ b/Build/Compilers/Hexen/acc.cfg @@ -9,5 +9,9 @@ compilers { interface = "AccCompiler"; program = "acc.exe"; + zcommon = "common.acs"; + zdefs = "defs.acs"; + zspecial = "specials.acs"; + zwvars = "wvars.acs"; } } diff --git a/Build/Compilers/ZDoom/acc.cfg b/Build/Compilers/ZDoom/acc.cfg index c001fc7cb..b3e100301 100644 --- a/Build/Compilers/ZDoom/acc.cfg +++ b/Build/Compilers/ZDoom/acc.cfg @@ -9,5 +9,9 @@ compilers { interface = "AccCompiler"; program = "acc.exe"; + zcommon = "zcommon.acs"; + zdefs = "zdefs.acs"; + zspecial = "zspecial.acs"; + zwvars = "zwvars.acs"; } } diff --git a/Build/Compilers/Zandronum/acc.cfg b/Build/Compilers/Zandronum/acc.cfg index 869a826ca..13eddf2e8 100644 --- a/Build/Compilers/Zandronum/acc.cfg +++ b/Build/Compilers/Zandronum/acc.cfg @@ -9,5 +9,9 @@ compilers { interface = "AccCompiler"; program = "acc.exe"; + zcommon = "zcommon.acs"; + zdefs = "zdefs.acs"; + zspecial = "zspecial.acs"; + zwvars = "zwvars.acs"; } } diff --git a/Build/SharpCompress.3.5.dll b/Build/SharpCompress.3.5.dll index 103de7822c1ee7a4c39e96e2796632199595a2d1..56828e26f04d5d20322f77b963d47ca1aff95a30 100644 GIT binary patch delta 146439 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	QPBA*?U6kp;QyF}|J4Y5>#$Tx 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
~ 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 QVCBsble8~*W4`5o0o5zci2wiq delta 146098 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	{GpxMTGp;oOb#LO`=E_1$at!|5%Z_F&9 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�DxNGR`L+kyYoTMGhm= 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 diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj index 6cf6e8e6c..338f3cbef 100644 --- a/Source/Core/Builder.csproj +++ b/Source/Core/Builder.csproj @@ -533,7 +533,9 @@ </ItemGroup> <ItemGroup> <Reference Include="JetBrains.Profiler.Core.Api, Version=1.3.1661.20096, Culture=neutral, PublicKeyToken=1010a0d8d6380325" Condition=" '$(Configuration)|$(Platform)' == 'Debug + Profiler|x86' Or '$(Configuration)|$(Platform)' == 'Release + Profiler|x86' " /> - <Reference Include="SharpCompress.3.5, Version=0.11.1.0, Culture=neutral, processorArchitecture=x86" /> + <Reference Include="SharpCompress.3.5, Version=0.11.2.0, Culture=neutral, processorArchitecture=x86"> + <Private>False</Private> + </Reference> <Reference Include="SlimDX, Version=2.0.13.43, Culture=neutral, PublicKeyToken=b1b0c32fd1ffe4f9, processorArchitecture=x86" /> <Reference Include="System" /> <Reference Include="System.Core"> @@ -860,7 +862,6 @@ <Compile Include="GZBuilder\Data\ModelLoadState.cs" /> <Compile Include="GZBuilder\Data\ScriptItem.cs" /> <Compile Include="GZBuilder\Data\SharpCompressHelper.cs" /> - <Compile Include="GZBuilder\Data\TextureData.cs" /> <Compile Include="GZBuilder\Rendering\SizelessVisualThingCage.cs" /> <Compile Include="GZBuilder\Rendering\ThingBoundingBox.cs" /> <Compile Include="GZBuilder\Data\ThingCopyData.cs" /> diff --git a/Source/Core/Compilers/AccCompiler.cs b/Source/Core/Compilers/AccCompiler.cs index 7e314956b..add7b8744 100644 --- a/Source/Core/Compilers/AccCompiler.cs +++ b/Source/Core/Compilers/AccCompiler.cs @@ -17,7 +17,6 @@ #region ================== Namespaces using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using CodeImp.DoomBuilder.Config; @@ -44,7 +43,7 @@ namespace CodeImp.DoomBuilder.Compilers #region ================== Constructor // Constructor - public AccCompiler(CompilerInfo info) : base(info) + public AccCompiler(CompilerInfo info) : base(info, false) { } diff --git a/Source/Core/Compilers/Compiler.cs b/Source/Core/Compilers/Compiler.cs index 648f13b85..2dc37fc65 100644 --- a/Source/Core/Compilers/Compiler.cs +++ b/Source/Core/Compilers/Compiler.cs @@ -71,7 +71,7 @@ namespace CodeImp.DoomBuilder.Compilers #region ================== Constructor / Disposer // Constructor - protected Compiler(CompilerInfo info) + protected Compiler(CompilerInfo info, bool copyrequiredfiles) { // Initialize this.info = info; @@ -83,10 +83,15 @@ namespace CodeImp.DoomBuilder.Compilers // Create temporary directory tempdir = Directory.CreateDirectory(General.MakeTempDirname()); workingdir = tempdir.FullName; - - // Copy required files to the temp directory - General.WriteLogLine("Copying required files for compiler..."); - CopyRequiredFiles(); + + //mxd. ACC compiler itself is not copied to tempdir anymore, so we don't need to move it's include files + //but we still need tempdir to compile SCRIPTS lump. + if(copyrequiredfiles) + { + // Copy required files to the temp directory + General.WriteLogLine("Copying required files for compiler..."); + CopyRequiredFiles(); + } } // Disposer diff --git a/Source/Core/Compilers/NodesCompiler.cs b/Source/Core/Compilers/NodesCompiler.cs index 049ffa74c..5bf25d52c 100644 --- a/Source/Core/Compilers/NodesCompiler.cs +++ b/Source/Core/Compilers/NodesCompiler.cs @@ -43,7 +43,7 @@ namespace CodeImp.DoomBuilder.Compilers #region ================== Constructor / Disposer // Constructor - public NodesCompiler(CompilerInfo info) : base(info) + public NodesCompiler(CompilerInfo info) : base(info, true) { // Initialize diff --git a/Source/Core/Config/ConfigurationInfo.cs b/Source/Core/Config/ConfigurationInfo.cs index 64c04f718..45867b26b 100644 --- a/Source/Core/Config/ConfigurationInfo.cs +++ b/Source/Core/Config/ConfigurationInfo.cs @@ -454,13 +454,14 @@ namespace CodeImp.DoomBuilder.Config { // Copy the things filters from game configuration foreach(ThingsFilter f in gameconfig.ThingsFilters) - { thingsfilters.Add(new ThingsFilter(f)); - } } - //mxd. Validate filters - foreach(ThingsFilter f in thingsfilters) f.Validate(); + //mxd. Validate filters. Do it only for currently used ConfigInfo + if(General.Map != null && General.Map.ConfigSettings == this) + { + foreach(ThingsFilter f in thingsfilters) f.Validate(); + } } // Go for all available editing modes diff --git a/Source/Core/Controls/ScriptDocumentTab.cs b/Source/Core/Controls/ScriptDocumentTab.cs index 85fde7e11..3536a2c44 100644 --- a/Source/Core/Controls/ScriptDocumentTab.cs +++ b/Source/Core/Controls/ScriptDocumentTab.cs @@ -410,6 +410,7 @@ namespace CodeImp.DoomBuilder.Controls } // Put some text in the navigator (but don't actually trigger selection event) + navigator.Enabled = (navigator.Items.Count > 0); if(navigator.Items.Count > 0) { preventchanges = true; @@ -421,32 +422,43 @@ namespace CodeImp.DoomBuilder.Controls //mxd private void UpdateNavigatorDecorate(MemoryStream stream) { - if (stream == null) return; - + if(stream == null) return; navigator.Items.Clear(); DecorateParserSE parser = new DecorateParserSE(); - parser.Parse(stream, "DECORATE"); - navigator.Items.AddRange(parser.Actors.ToArray()); + if(parser.Parse(stream, "DECORATE")) + { + navigator.Items.AddRange(parser.Actors.ToArray()); + } + + if(parser.HasError) + { + panel.ShowErrors(new List<CompilerError> { new CompilerError(parser.ErrorDescription, parser.ErrorSource, parser.ErrorLine) }); + } } //mxd private void UpdateNavigatorModeldef(MemoryStream stream) { - if (stream == null) return; - + if(stream == null) return; navigator.Items.Clear(); ModeldefParserSE parser = new ModeldefParserSE(); - parser.Parse(stream, "MODELDEF"); - navigator.Items.AddRange(parser.Models.ToArray()); + if(parser.Parse(stream, "MODELDEF")) + { + navigator.Items.AddRange(parser.Models.ToArray()); + } + + if(parser.HasError) + { + panel.ShowErrors(new List<CompilerError> { new CompilerError(parser.ErrorDescription, parser.ErrorSource, parser.ErrorLine) }); + } } //mxd private void UpdateNavigatorAcs(MemoryStream stream) { - if (stream == null) return; - + if(stream == null) return; navigator.Items.Clear(); AcsParserSE parser = new AcsParserSE { AddArgumentsToScriptNames = true, IsMapScriptsLump = this is ScriptLumpDocumentTab }; @@ -456,17 +468,28 @@ namespace CodeImp.DoomBuilder.Controls navigator.Items.AddRange(parser.NumberedScripts.ToArray()); navigator.Items.AddRange(parser.Functions.ToArray()); } + + if(parser.HasError) + { + panel.ShowErrors(new List<CompilerError> { new CompilerError(parser.ErrorDescription, parser.ErrorSource, parser.ErrorLine) }); + } } //mxd internal ScriptType VerifyScriptType() { ScriptTypeParserSE parser = new ScriptTypeParserSE(); - if (parser.Parse(new MemoryStream(editor.GetText()), config.Description)) + if(parser.Parse(new MemoryStream(editor.GetText()), config.Description)) { - if (parser.ScriptType != ScriptType.UNKNOWN && config.ScriptType != parser.ScriptType) + if(parser.ScriptType != ScriptType.UNKNOWN && config.ScriptType != parser.ScriptType) return parser.ScriptType; } + + if(parser.HasError) + { + panel.ShowErrors(new List<CompilerError> { new CompilerError(parser.ErrorDescription, parser.ErrorSource, parser.ErrorLine) }); + } + return ScriptType.UNKNOWN; } diff --git a/Source/Core/Controls/ScriptEditorControl.cs b/Source/Core/Controls/ScriptEditorControl.cs index 7d337d26c..bec26f459 100644 --- a/Source/Core/Controls/ScriptEditorControl.cs +++ b/Source/Core/Controls/ScriptEditorControl.cs @@ -250,8 +250,6 @@ namespace CodeImp.DoomBuilder.Controls // This sets up the script editor with a script configuration public void SetupStyles(ScriptConfiguration config) { - Stream lexersdata; - StreamReader lexersreader; Configuration lexercfg = new Configuration(); // Make collections @@ -259,7 +257,7 @@ namespace CodeImp.DoomBuilder.Controls SortedList<string, string> autocompletelist = new SortedList<string, string>(StringComparer.Ordinal); // Keep script configuration - if(scriptconfig != config) scriptconfig = config; + scriptconfig = config; // Find a resource named Lexers.cfg string[] resnames = General.ThisAssembly.GetManifestResourceNames(); @@ -269,8 +267,8 @@ namespace CodeImp.DoomBuilder.Controls if(rn.EndsWith(LEXERS_RESOURCE, StringComparison.InvariantCultureIgnoreCase)) { // Get a stream from the resource - lexersdata = General.ThisAssembly.GetManifestResourceStream(rn); - lexersreader = new StreamReader(lexersdata, Encoding.ASCII); + Stream lexersdata = General.ThisAssembly.GetManifestResourceStream(rn); + StreamReader lexersreader = new StreamReader(lexersdata, Encoding.ASCII); // Load configuration from stream lexercfg.InputConfiguration(lexersreader.ReadToEnd()); @@ -426,8 +424,10 @@ namespace CodeImp.DoomBuilder.Controls functionbar.Visible = (scriptconfig.FunctionRegEx.Length > 0); // Rearrange the layout + bool ischanged = changed; //mxd. Don't want the "changed" status to change when changing text styles scriptedit.ClearDocumentStyle(); scriptedit.SetText(scriptedit.GetText(scriptedit.TextSize)); + changed = ischanged; //mxd this.PerformLayout(); } diff --git a/Source/Core/Controls/ScriptFileDocumentTab.cs b/Source/Core/Controls/ScriptFileDocumentTab.cs index 82e99b49e..ad2a85fc4 100644 --- a/Source/Core/Controls/ScriptFileDocumentTab.cs +++ b/Source/Core/Controls/ScriptFileDocumentTab.cs @@ -175,23 +175,24 @@ namespace CodeImp.DoomBuilder.Controls AcsParserSE parser = new AcsParserSE { OnInclude = (se, path) => se.Parse(General.Map.Data.LoadFile(path), path, true, true) }; using(FileStream stream = File.OpenRead(filepathname)) { - if(!parser.Parse(stream, inputfile, scriptconfig.Compiler.Files, true, false)) + if(!parser.Parse(stream, filepathname, scriptconfig.Compiler.Files, true, false)) { // Check for errors if(parser.HasError) { errors.Add(new CompilerError(parser.ErrorDescription, parser.ErrorSource, parser.ErrorLine)); panel.ShowErrors(errors); - compiler.Dispose(); - return; } + + compiler.Dispose(); + return; } } - // Only works for libraries + //mxd. Only works for libraries if(!parser.IsLibrary) { - errors.Add(new CompilerError("External ACS files can only be compiled as libraries!", inputfile)); + errors.Add(new CompilerError("External ACS files can only be compiled as libraries!", filepathname)); panel.ShowErrors(errors); compiler.Dispose(); return; @@ -349,6 +350,10 @@ namespace CodeImp.DoomBuilder.Controls string ext = (config.Extensions.Length > 0 ? "." + config.Extensions[0] : ""); SetTitle("Untitled" + ext); } + else + { + UpdateTitle(); //mxd + } //mxd base.ChangeScriptConfig(newconfig); diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs index 19d439fd6..4dd39e32b 100644 --- a/Source/Core/Data/DataManager.cs +++ b/Source/Core/Data/DataManager.cs @@ -1404,9 +1404,8 @@ namespace CodeImp.DoomBuilder.Data char[] catsplitter = new[] {Path.AltDirectorySeparatorChar}; //mxd // Create new parser - decorate = new DecorateParser(); - decorate.OnInclude = LoadDecorateFromLocation; - + decorate = new DecorateParser { OnInclude = LoadDecorateFromLocation }; + // Only load these when the game configuration supports the use of decorate if(!string.IsNullOrEmpty(General.Map.Config.DecorateGames)) { @@ -1423,12 +1422,11 @@ namespace CodeImp.DoomBuilder.Data group.Value.Seek(0, SeekOrigin.Begin); decorate.Parse(group.Value, group.Key, true); - // Check for errors + //mxd. DECORATE lumps are interdepandable. Can't carry on... if(decorate.HasError) { - General.ErrorLogger.Add(ErrorType.Error, "DECORATE error in '" + decorate.ErrorSource - + (decorate.ErrorLine != CompilerError.NO_LINE_NUMBER ? "', line " + decorate.ErrorLine : "'") + ". " + decorate.ErrorDescription + "."); - break; + decorate.LogError(); //mxd + return counter; } } } @@ -1823,6 +1821,13 @@ namespace CodeImp.DoomBuilder.Data } } } + + // Modeldefs are independable, so parsing fail in one file should not affect the others + if(parser.HasError) + { + parser.LogError(); + parser.ClearError(); + } } } @@ -1895,19 +1900,29 @@ namespace CodeImp.DoomBuilder.Data currentreader = dr; KeyValuePair<string, Stream> group = dr.GetVoxeldefData(); - if(group.Value != null && parser.Parse(group.Value, group.Key)) + if(group.Value != null) { - foreach(KeyValuePair<string, ModelData> entry in parser.Entries) + if(parser.Parse(group.Value, group.Key)) { - foreach(KeyValuePair<string, List<int>> sc in sprites) + foreach(KeyValuePair<string, ModelData> entry in parser.Entries) { - if(sc.Key.Contains(entry.Key)) + foreach(KeyValuePair<string, List<int>> sc in sprites) { - foreach(int id in sc.Value) modeldefentries[id] = entry.Value; - processed.Add(entry.Key, false); + if(sc.Key.Contains(entry.Key)) + { + foreach(int id in sc.Value) modeldefentries[id] = entry.Value; + processed.Add(entry.Key, false); + } } } } + + // Report errors? + if(parser.HasError) + { + parser.LogError(); + parser.ClearError(); + } } } @@ -1939,7 +1954,7 @@ namespace CodeImp.DoomBuilder.Data GldefsParser parser = new GldefsParser { OnInclude = ParseFromLocation }; - //load gldefs from resources + // Load gldefs from resources foreach(DataReader dr in containers) { currentreader = dr; @@ -1947,7 +1962,16 @@ namespace CodeImp.DoomBuilder.Data Dictionary<string, Stream> streams = dr.GetGldefsData(General.Map.Config.GameType); foreach(KeyValuePair<string, Stream> group in streams) + { parser.Parse(group.Value, group.Key); + + // Gldefs can be interdependable. Can't carry on + if(parser.HasError) + { + parser.LogError(); + return; + } + } } //create gldefsEntries dictionary @@ -1957,12 +1981,7 @@ namespace CodeImp.DoomBuilder.Data if(actorsByClass.ContainsKey(e.Key) && parser.LightsByName.ContainsKey(e.Value)) { foreach(int i in actorsByClass[e.Key]) - { - if(gldefsentries.ContainsKey(i)) - gldefsentries[i] = parser.LightsByName[e.Value]; - else - gldefsentries.Add(i, parser.LightsByName[e.Value]); - } + gldefsentries[i] = parser.LightsByName[e.Value]; } else if(!decorate.AllActorsByClass.ContainsKey(e.Key)) { @@ -1978,7 +1997,7 @@ namespace CodeImp.DoomBuilder.Data private void LoadMapInfo(out Dictionary<int, string> spawnnums, out Dictionary<int, string> doomednums) { MapinfoParser parser = new MapinfoParser { OnInclude = ParseFromLocation }; - + foreach(DataReader dr in containers) { currentreader = dr; @@ -1987,7 +2006,20 @@ namespace CodeImp.DoomBuilder.Data foreach(KeyValuePair<string, Stream> group in streams) { // Parse the data - parser.Parse(group.Value, Path.Combine(currentreader.Location.location, group.Key), General.Map.Options.LevelName); + parser.Parse(group.Value, Path.Combine(currentreader.Location.location, group.Key), General.Map.Options.LevelName); + + //MAPINFO lumps are interdependable. Can't carry on... + if(parser.HasError) + { + parser.LogError(); + + // No nulls allowed! + spawnnums = new Dictionary<int, string>(); + doomednums = new Dictionary<int, string>(); + mapinfo = new MapInfo(); + + return; + } } } @@ -2024,6 +2056,13 @@ namespace CodeImp.DoomBuilder.Data { // Parse the data parser.Parse(group.Value, group.Key); + + // Report errors? + if(parser.HasError) + { + parser.LogError(); + parser.ClearError(); + } } } @@ -2049,6 +2088,13 @@ namespace CodeImp.DoomBuilder.Data foreach(Stream s in streams) { if(s != null) parser.Parse(s, "SNDSEQ"); + + // Report errors? + if(parser.HasError) + { + parser.LogError(); + parser.ClearError(); + } } } diff --git a/Source/Core/Data/PK3Reader.cs b/Source/Core/Data/PK3Reader.cs index b94db119b..5888ed6d2 100644 --- a/Source/Core/Data/PK3Reader.cs +++ b/Source/Core/Data/PK3Reader.cs @@ -71,7 +71,7 @@ namespace CodeImp.DoomBuilder.Data IReader reader = archive.ExtractAllEntries(); while(reader.MoveToNextEntry()) { - if(reader.Entry.IsDirectory) continue; + if(reader.Entry.IsDirectory || !CheckInvalidPathChars(reader.Entry.Key)) continue; MemoryStream s = new MemoryStream(); reader.WriteEntryTo(s); @@ -83,8 +83,8 @@ namespace CodeImp.DoomBuilder.Data { foreach(IArchiveEntry entry in archive.Entries) { - if(entry.IsDirectory) continue; - fileentries.Add(new DirectoryFileEntry(entry.Key)); + if(!entry.IsDirectory && CheckInvalidPathChars(entry.Key)) + fileentries.Add(new DirectoryFileEntry(entry.Key)); } } @@ -415,18 +415,18 @@ namespace CodeImp.DoomBuilder.Data string fn = filename.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); //mxd //mxd. This works waaaaaay faster with 7z archive - if (archivetype == ArchiveType.SevenZip) + if(archivetype == ArchiveType.SevenZip) { fn = fn.ToLowerInvariant(); if (sevenzipentries.ContainsKey(fn)) filedata = new MemoryStream(sevenzipentries[fn]); } else { - lock (this) + lock(this) { UpdateArchive(true); - foreach (var entry in archive.Entries) + foreach(var entry in archive.Entries) { if(entry.IsDirectory) continue; @@ -444,7 +444,7 @@ namespace CodeImp.DoomBuilder.Data } // Nothing found? - if (filedata == null) + if(filedata == null) { //mxd General.ErrorLogger.Add(ErrorType.Error, "Cannot find the file '" + filename + "' in archive '" + location.location + "'."); @@ -466,7 +466,31 @@ namespace CodeImp.DoomBuilder.Data filedata.Dispose(); return tempfile; } - + + //mxd. This replicates System.IO.Path.CheckInvalidPathChars() internal function + private bool CheckInvalidPathChars(string path) + { + foreach(char c in path) + { + int num = c; + switch(num) + { + case 34: + case 60: + case 62: + case 124: + General.ErrorLogger.Add(ErrorType.Error, "Error in \"" + location.location + "\": unsupported character \"" + c + "\" in path \"" + path + "\". File loading was skipped."); + return false; + + default: + if(num >= 32) continue; + else goto case 34; + } + } + + return true; + } + #endregion } } diff --git a/Source/Core/Data/WADReader.cs b/Source/Core/Data/WADReader.cs index cfefe4b31..7c4b5d45d 100644 --- a/Source/Core/Data/WADReader.cs +++ b/Source/Core/Data/WADReader.cs @@ -408,21 +408,14 @@ namespace CodeImp.DoomBuilder.Data // Parse the data TexturesParser parser = new TexturesParser(); parser.Parse(stream, filename); + if(parser.HasError) parser.LogError(); //mxd // Make the textures foreach(TextureStructure t in parser.Textures) { - if(t.Name.Length > 0) - { - // Add the texture - ImageData img = t.MakeImage(); - images.Add(img); - } - else - { - // Can't load image without name - General.ErrorLogger.Add(ErrorType.Error, "Can't load an unnamed texture from \"" + filename + "\". Please consider giving names to your resources."); - } + // Add the texture + ImageData img = t.MakeImage(); + images.Add(img); } } @@ -655,21 +648,14 @@ namespace CodeImp.DoomBuilder.Data // Parse the data TexturesParser parser = new TexturesParser(); parser.Parse(stream, filename); + if(parser.HasError) parser.LogError(); //mxd // Make the textures foreach(TextureStructure t in parser.Flats) { - if(t.Name.Length > 0) - { - // Add the texture - ImageData img = t.MakeImage(); - images.Add(img); - } - else - { - // Can't load image without name - General.ErrorLogger.Add(ErrorType.Error, "Can't load an unnamed flat from \"" + filename + "\". Please consider giving names to your resources."); - } + // Add the texture + ImageData img = t.MakeImage(); + images.Add(img); } } @@ -725,21 +711,14 @@ namespace CodeImp.DoomBuilder.Data // Parse the data TexturesParser parser = new TexturesParser(); parser.Parse(stream, filename); + if(parser.HasError) parser.LogError(); //mxd // Make the textures foreach(TextureStructure t in parser.Sprites) { - if(t.Name.Length > 0) - { - // Add the sprite - ImageData img = t.MakeImage(); - images.Add(img); - } - else - { - // Can't load image without name - General.ErrorLogger.Add(ErrorType.Error, "Can't load an unnamed sprite from \"" + filename + "\". Please consider giving names to your resources."); - } + // Add the sprite + ImageData img = t.MakeImage(); + images.Add(img); } } diff --git a/Source/Core/Editing/ThingsFilter.cs b/Source/Core/Editing/ThingsFilter.cs index 75926524c..d8a2e5535 100644 --- a/Source/Core/Editing/ThingsFilter.cs +++ b/Source/Core/Editing/ThingsFilter.cs @@ -236,36 +236,6 @@ namespace CodeImp.DoomBuilder.Editing for(int i = 0; i < Thing.NUM_ARGS; i++) thingargs[i] = -1; } if(!General.Map.FormatInterface.HasCustomFields) customfields.Clear(); - - //mxd. We don't want to keep unknown flags (like flags from different map format) - if(General.Map.Config != null && General.Map.Config.ThingFlags != null) - { - List<String> unknownfields = new List<string>(); - foreach(String s in forbiddenfields) - { - if(!General.Map.Config.ThingFlags.ContainsKey(s)) - unknownfields.Add(s); - } - - if(unknownfields.Count > 0) - { - foreach(String s in unknownfields) - forbiddenfields.Remove(s); - } - - unknownfields = new List<string>(); - foreach(String s in requiredfields) - { - if(!General.Map.Config.ThingFlags.ContainsKey(s)) - unknownfields.Add(s); - } - - if(unknownfields.Count > 0) - { - foreach(String s in unknownfields) - requiredfields.Remove(s); - } - } } } @@ -274,6 +244,32 @@ namespace CodeImp.DoomBuilder.Editing { AdjustForMapFormat(); + //mxd. We don't want to keep unknown flags (like flags from different map format) + if(General.Map.Config != null && General.Map.Config.ThingFlags != null) + { + List<String> unknownfields = new List<string>(); + foreach(String s in forbiddenfields) + { + if(!General.Map.Config.ThingFlags.ContainsKey(s)) unknownfields.Add(s); + } + + if(unknownfields.Count > 0) + { + foreach(String s in unknownfields) forbiddenfields.Remove(s); + } + + unknownfields.Clear(); + foreach(String s in requiredfields) + { + if(!General.Map.Config.ThingFlags.ContainsKey(s)) unknownfields.Add(s); + } + + if(unknownfields.Count > 0) + { + foreach(String s in unknownfields) requiredfields.Remove(s); + } + } + //Integrity check if(!IsValid()) General.ErrorLogger.Add(ErrorType.Warning, "Things filter '" + name + "' has invalid properties. Configure the thing filter to fix this!"); @@ -298,8 +294,7 @@ namespace CodeImp.DoomBuilder.Editing /// </summary> public bool IsThingVisible(Thing t) { - if (t.IsDisposed) return false; //mxd - return thingsvisiblestate[t]; + return (!t.IsDisposed && thingsvisiblestate[t]); } // This writes the filter to configuration diff --git a/Source/Core/GZBuilder/Data/ModelData.cs b/Source/Core/GZBuilder/Data/ModelData.cs index d99eb9e2f..dde94fbb5 100644 --- a/Source/Core/GZBuilder/Data/ModelData.cs +++ b/Source/Core/GZBuilder/Data/ModelData.cs @@ -12,6 +12,12 @@ namespace CodeImp.DoomBuilder.GZBuilder.Data { internal sealed class ModelData { + #region ================== Constants + + public static readonly string[] SUPPORTED_TEXTURE_EXTENSIONS = { ".jpg", ".tga", ".png", ".dds", ".pcx" }; + + #endregion + #region ================== Variables private ModelLoadState loadstate; diff --git a/Source/Core/GZBuilder/Data/TextureData.cs b/Source/Core/GZBuilder/Data/TextureData.cs deleted file mode 100644 index c4a6f5059..000000000 --- a/Source/Core/GZBuilder/Data/TextureData.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CodeImp.DoomBuilder.GZBuilder.Data { - public struct TextureData { - public const string INVALID_TEXTURE = "**invalid_texture**"; - public static string[] SUPPORTED_TEXTURE_EXTENSIONS = { ".jpg", ".tga", ".png", ".dds", ".pcx" }; - } -} diff --git a/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs b/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs index 3d2db7d2a..91f6522fb 100644 --- a/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs +++ b/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs @@ -63,8 +63,6 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom base.Parse(stream, sourcefilename); - // Already parsed this? - if(parsedlumps.Contains(sourcefilename)) return false; parsedlumps.Add(sourcefilename); if(isinclude && !includes.Contains(sourcefilename)) includes.Add(sourcefilename); includestoskip = configincludes; @@ -180,46 +178,68 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom case "#library": if(IsMapScriptsLump) { - ReportError("Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": SCRIPTS lump can not be compiled as library!"); + ReportError("SCRIPTS lump can not be compiled as a library"); return false; } SkipWhitespace(true); - libraryname = ReadToken(); + libraryname = ReadToken(false); // Don't skip newline - if(string.IsNullOrEmpty(libraryname) || !libraryname.StartsWith("\"") || !libraryname.EndsWith("\"")) + if(!libraryname.StartsWith("\"") || !libraryname.EndsWith("\"")) { - ReportError("Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": invalid #library directive!"); + ReportError("#library name should be quoted"); return false; } libraryname = StripTokenQuotes(libraryname); + + if(string.IsNullOrEmpty(libraryname)) + { + ReportError("Expected library name"); + return false; + } + break; default: if(processincludes && (token == "#include" || token == "#import")) { SkipWhitespace(true); - string includelump = StripTokenQuotes(ReadToken()).ToLowerInvariant(); + string includelump = ReadToken(false); // Don't skip newline + + if(!includelump.StartsWith("\"") || !includelump.EndsWith("\"")) + { + ReportError(token + " filename should be quoted"); + return false; + } + + includelump = StripTokenQuotes(includelump).ToLowerInvariant(); - if(!string.IsNullOrEmpty(includelump)) + if(string.IsNullOrEmpty(includelump)) { - string includename = Path.GetFileName(includelump); - if(includestoskip.Contains(includename) || includes.Contains(includename)) continue; - - // Callback to parse this file - if(OnInclude != null) OnInclude(this, includelump.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)); - - // Set our buffers back to continue parsing - datastream = localstream; - datareader = localreader; - sourcename = localsourcename; - } - else + ReportError("Expected file name to " + token); + return false; + } + + string includename = Path.GetFileName(includelump); + + // Compiler files? + if(includestoskip.Contains(includename)) continue; + + // Already parsed this? + if(includes.Contains(includename)) { - ReportError("Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": got #include directive without include path!"); + ReportError("already parsed '" + includename + "'. Check your #include directives"); return false; } + + // Callback to parse this file + if(OnInclude != null) OnInclude(this, includelump.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)); + + // Set our buffers back to continue parsing + datastream = localstream; + datareader = localreader; + sourcename = localsourcename; } break; } @@ -276,5 +296,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom return "(void)"; } + + protected override string GetLanguageType() + { + return "ACS"; + } } } \ No newline at end of file diff --git a/Source/Core/GZBuilder/GZDoom/DecorateParserSE.cs b/Source/Core/GZBuilder/GZDoom/DecorateParserSE.cs index afc80a6bf..3ff98a1a8 100644 --- a/Source/Core/GZBuilder/GZDoom/DecorateParserSE.cs +++ b/Source/Core/GZBuilder/GZDoom/DecorateParserSE.cs @@ -4,6 +4,7 @@ using CodeImp.DoomBuilder.ZDoom; using CodeImp.DoomBuilder.GZBuilder.Data; //mxd. Decorate parser used to create ScriptItems for use in script editor's navigator +//Should be able to parse actor definitions even from invalid DECORATE and should never fail parsing namespace CodeImp.DoomBuilder.GZBuilder.GZDoom { internal sealed class DecorateParserSE : ZDTextParser @@ -21,38 +22,35 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom base.Parse(stream, sourcefilename); // Continue until at the end of the stream - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { string token = ReadToken(); + if(string.IsNullOrEmpty(token) || token.ToUpperInvariant() != "ACTOR") continue; - if (!string.IsNullOrEmpty(token)) + SkipWhitespace(true); + int startpos = (int)stream.Position; + + List<string> definition = new List<string>(); + + do { - token = token.ToLowerInvariant(); - - if (token == "actor") - { - SkipWhitespace(true); - int startPos = (int)stream.Position; - - List<string> definition = new List<string>(); - - do - { - token = ReadToken(); - if(string.IsNullOrEmpty(token) || token == "{") break; - definition.Add(token); - } while(SkipWhitespace(true)); - - string name = ""; - foreach (string s in definition) name += s + " "; - actors.Add(new ScriptItem(name.TrimEnd(), startPos, false)); - } - } + token = ReadToken(false); // Don't skip newline + if(string.IsNullOrEmpty(token) || token == "{" || token == "}") break; + definition.Add(token); + } while(SkipWhitespace(false)); // Don't skip newline + + string name = string.Join(" ", definition.ToArray()); + if(!string.IsNullOrEmpty(name)) actors.Add(new ScriptItem(name, startpos, false)); } - //sort nodes + // Sort nodes actors.Sort(ScriptItem.SortByName); return true; } + + protected override string GetLanguageType() + { + return "DECORATE"; + } } } diff --git a/Source/Core/GZBuilder/GZDoom/GldefsParser.cs b/Source/Core/GZBuilder/GZDoom/GldefsParser.cs index 075a11bb7..d8f10a48d 100644 --- a/Source/Core/GZBuilder/GZDoom/GldefsParser.cs +++ b/Source/Core/GZBuilder/GZDoom/GldefsParser.cs @@ -16,7 +16,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom { internal sealed class GldefsParser : ZDTextParser { - #region ================== Structs + #region ================== Constants private const int DEFAULT_GLOW_HEIGHT = 64; @@ -82,12 +82,6 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom public override bool Parse(Stream stream, string sourcefilename) { base.Parse(stream, sourcefilename); - - if (parsedlumps.IndexOf(sourcefilename) != -1) - { - General.ErrorLogger.Add(ErrorType.Error, "already parsed '" + sourcefilename + "'. Check your #include directives!"); - return false; - } parsedlumps.Add(sourcefilename); // Keep local data @@ -96,18 +90,17 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom BinaryReader localreader = datareader; // Continue until at the end of the stream - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { string token = ReadToken(); - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { token = StripTokenQuotes(token.ToLowerInvariant()); //Quotes can be anywhere! ANYWHERE!!! And GZDoom will still parse data correctly //got light structure - if (token == GldefsLightType.POINT || token == GldefsLightType.PULSE || token == GldefsLightType.FLICKER + if(token == GldefsLightType.POINT || token == GldefsLightType.PULSE || token == GldefsLightType.FLICKER || token == GldefsLightType.FLICKER2 || token == GldefsLightType.SECTOR) { - bool gotErrors = false; string lightType = token; DynamicLightData light = new DynamicLightData(); @@ -117,41 +110,39 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); string lightName = StripTokenQuotes(ReadToken()).ToLowerInvariant(); - if (!string.IsNullOrEmpty(lightName)) + if(!string.IsNullOrEmpty(lightName)) { //now find opening brace if(!NextTokenIs("{")) continue; //read gldefs light structure - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { token = ReadToken(); - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { token = token.ToLowerInvariant(); //color - if (token == "color") + if(token == "color") { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Red)) + if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Red)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Red Color value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Red color value, but got '" + token + "'"); + return false; } SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Green)) + if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Green)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Green Color value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Green color value, but got '" + token + "'"); + return false; } SkipWhitespace(true); @@ -160,128 +151,118 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Blue)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Blue Color value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Blue color value, but got '" + token + "'"); + return false; } //size } - else if (token == "size") + else if(token == "size") { - if (lightType != GldefsLightType.SECTOR) + if(lightType != GldefsLightType.SECTOR) { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.PrimaryRadius)) + if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.PrimaryRadius)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Size value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Size value, but got '" + token + "'"); + return false; } light.PrimaryRadius *= 2; } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": '" + token + "' is not valid property for " + lightType + "."); - gotErrors = true; - break; + ReportError("'" + token + "' is not valid property for " + lightType + "."); + return false; } //offset } - else if (token == "offset") + else if(token == "offset") { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!ReadSignedFloat(token, ref light.Offset.X)) + if(!ReadSignedFloat(token, ref light.Offset.X)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Offset X value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Offset X value, but got '" + token + "'"); + return false; } SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!ReadSignedFloat(token, ref light.Offset.Z)) + if(!ReadSignedFloat(token, ref light.Offset.Z)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Offset Y value, but got '" + token + "'"); - gotErrors = true; - break; + ReportError("expected Offset Y value, but got '" + token + "'"); + return false; } SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!ReadSignedFloat(token, ref light.Offset.Y)) + if(!ReadSignedFloat(token, ref light.Offset.Y)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Offset Z value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Offset Z value, but got '" + token + "'"); + return false; } //subtractive } - else if (token == "subtractive") + else if(token == "subtractive") { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); int i; - if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) + if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Subtractive value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Subtractive value, but got '" + token + "'"); + return false; } light.Subtractive = i == 1; //dontlightself } - else if (token == "dontlightself") + else if(token == "dontlightself") { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); int i; - if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) + if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Dontlightself value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Dontlightself value, but got '" + token + "'"); + return false; } light.DontLightSelf = (i == 1); //interval } - else if (token == "interval") + else if(token == "interval") { - if (lightType == GldefsLightType.PULSE || lightType == GldefsLightType.FLICKER2) + if(lightType == GldefsLightType.PULSE || lightType == GldefsLightType.FLICKER2) { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); float interval; - if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out interval)) + if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out interval)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Interval value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Interval value, but got '" + token + "'"); + return false; } - if(interval == 0) - General.ErrorLogger.Add(ErrorType.Warning, "Warning in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": Interval value should be greater than zero."); + if(interval == 0) LogWarning("Interval value should be greater than zero"); //I wrote logic for dynamic lights animation first, so here I modify gldefs settings to fit in existing logic - if (lightType == GldefsLightType.PULSE) + if(lightType == GldefsLightType.PULSE) { light.Interval = (int)(interval * 35); //measured in tics (35 per second) in PointLightPulse, measured in seconds in gldefs' PulseLight } @@ -292,50 +273,46 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": '" + token + "' is not valid property for " + lightType + "."); - gotErrors = true; - break; + ReportError("'" + token + "' is not valid property for " + lightType); + return false; } //secondarysize } - else if (token == "secondarysize") + else if(token == "secondarysize") { - if (lightType == GldefsLightType.PULSE || lightType == GldefsLightType.FLICKER || lightType == GldefsLightType.FLICKER2) + if(lightType == GldefsLightType.PULSE || lightType == GldefsLightType.FLICKER || lightType == GldefsLightType.FLICKER2) { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.SecondaryRadius)) + if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.SecondaryRadius)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected SecondarySize value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected SecondarySize value, but got '" + token + "'"); + return false; } light.SecondaryRadius *= 2; } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": '" + token + "' is not valid property for " + lightType + "."); - gotErrors = true; - break; + ReportError("'" + token + "' is not valid property for " + lightType); + return false; } //chance } - else if (token == "chance") + else if(token == "chance") { - if (lightType == GldefsLightType.FLICKER) + if(lightType == GldefsLightType.FLICKER) { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); float chance; - if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out chance)) + if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out chance)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Chance value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Chance value, but got '" + token + "'"); + return false; } //transforming from 0.0 .. 1.0 to 0 .. 359 to fit in existing logic @@ -343,33 +320,30 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": '" + token + "' is not valid property for " + lightType + "."); - gotErrors = true; - break; + ReportError("'" + token + "' is not valid property for " + lightType); + return false; } //scale } - else if (token == "scale") + else if(token == "scale") { - if (lightType == GldefsLightType.SECTOR) + if(lightType == GldefsLightType.SECTOR) { SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); float scale; - if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out scale)) + if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out scale)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected Scale value, but got '" + token + "'."); - gotErrors = true; - break; + ReportError("expected Scale value, but got '" + token + "'"); + return false; } - if (scale > 1.0f) + if(scale > 1.0f) { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": scale must be in 0.0 - 1.0 range, but is " + scale + "."); - gotErrors = true; - break; + ReportError("scale must be in 0.0 - 1.0 range, but is " + scale); + return false; } //sector light doesn't have animation, so we will store it's size in Interval @@ -378,64 +352,59 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": '" + token + "' is not valid property for " + lightType + "."); - gotErrors = true; - break; + ReportError("'" + token + "' is not valid property for " + lightType); + return false; } } //end of structure - else if (token == "}") + else if(token == "}") { - if (!gotErrors) + bool skip = false; + + //general checks + if(light.Color.Red == 0.0f && light.Color.Green == 0.0f && light.Color.Blue == 0.0f) { - //general checks - if (light.Color.Red == 0.0f && light.Color.Green == 0.0f && light.Color.Blue == 0.0f) - { - General.ErrorLogger.Add(ErrorType.Warning, "'" + sourcefilename + "', line " + GetCurrentLineNumber() + ": light Color is " + light.Color.Red + "," + light.Color.Green + "," + light.Color.Blue + ". It won't be shown in GZDoom!"); - gotErrors = true; - } + LogWarning("'" + lightName + "' light Color is " + light.Color.Red + "," + light.Color.Green + "," + light.Color.Blue + ". It won't be shown in GZDoom"); + skip = true; + } - //light-type specific checks - if (light.Type == DynamicLightType.NORMAL && light.PrimaryRadius == 0) - { - General.ErrorLogger.Add(ErrorType.Warning, "'" + sourcefilename + "', line " + GetCurrentLineNumber() + ": light Size is 0. It won't be shown in GZDoom!"); - gotErrors = true; - } + //light-type specific checks + if(light.Type == DynamicLightType.NORMAL && light.PrimaryRadius == 0) + { + LogWarning("'" + lightName + "' light Size is 0. It won't be shown in GZDoom"); + skip = true; + } - if (light.Type == DynamicLightType.FLICKER || light.Type == DynamicLightType.PULSE || light.Type == DynamicLightType.RANDOM) + if(light.Type == DynamicLightType.FLICKER || light.Type == DynamicLightType.PULSE || light.Type == DynamicLightType.RANDOM) + { + if(light.PrimaryRadius == 0 && light.SecondaryRadius == 0) { - if (light.PrimaryRadius == 0 && light.SecondaryRadius == 0) - { - General.ErrorLogger.Add(ErrorType.Warning, "'" + sourcefilename + "', line " + GetCurrentLineNumber() + ": 'Size' and 'SecondarySize' are 0. This light won't be shown in GZDoom!"); - gotErrors = true; - } + LogWarning("'" + lightName + "' light Size and SecondarySize are 0. This light won't be shown in GZDoom"); + skip = true; } + } - //offset it slightly to avoid shading glitches - if (light.Offset.Z == 0.0f) light.Offset.Z = 0.1f; + //offset it slightly to avoid shading glitches + if(light.Offset.Z == 0.0f) light.Offset.Z = 0.1f; - if (!gotErrors) - { - if (lightsByName.ContainsKey(lightName)) - lightsByName[lightName] = light; - else - lightsByName.Add(lightName, light); - } - } - break; //break out of this parsing loop + // Add to the collection? + if(!skip) lightsByName[lightName] = light; + + //break out of this parsing loop + break; } } } } } - else if (token == "object") + else if(token == "object") { SkipWhitespace(true); //read object class string objectClass = StripTokenQuotes(ReadToken()).ToLowerInvariant(); - if (!string.IsNullOrEmpty(objectClass)) + if(!string.IsNullOrEmpty(objectClass)) { //now find opening brace if(!NextTokenIs("{")) continue; @@ -445,10 +414,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom bool foundFrame = false; //read frames structure - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { token = ReadToken(); - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { token = StripTokenQuotes(token).ToLowerInvariant(); if(!foundLight && !foundFrame && token == "frame") @@ -464,29 +433,26 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); token = ReadToken().ToLowerInvariant(); //should be light name - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { - if (lightsByName.ContainsKey(token)) + if(lightsByName.ContainsKey(token)) { - if (objects.ContainsKey(objectClass)) - objects[objectClass] = token; - else - objects.Add(objectClass, token); + objects[objectClass] = token; foundLight = true; } else { - General.ErrorLogger.Add(ErrorType.Warning, "Light declaration not found for light '" + token + "' ('" + sourcefilename + "', line " + GetCurrentLineNumber()+")."); + LogWarning("Light declaration not found for light '" + token + "'"); } } } - else if (token == "{") //continue in this loop until object structure ends + else if(token == "{") //continue in this loop until object structure ends { bracesCount++; } - else if (token == "}") + else if(token == "}") { - if (--bracesCount < 1) break; //This was Cave Johnson. And we are done here. + if(--bracesCount < 1) break; //This was Cave Johnson. And we are done here. } } } @@ -549,12 +515,12 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom int color; int glowheight = DEFAULT_GLOW_HEIGHT; bool subtractivetexture = (token == "subtexture"); - string texturename = StripTokenQuotes(ReadToken()); + string texturename = StripTokenQuotes(ReadToken(false)); if(string.IsNullOrEmpty(texturename)) { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected a texture name."); - break; + ReportError("expected " + token + " name"); + return false; } // Now we should find a comma @@ -574,8 +540,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected glow color value, but got '" + token + "'."); - break; + ReportError("expected glow color value, but got '" + token + "'"); + return false; } } @@ -632,8 +598,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!fullblack && !fullbright) { string expectedflags = (subtractivetexture ? "'fullbright'" : "'fullbright' or 'fullblack'"); - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected " + expectedflags + " flag, but got '" + token + "'."); - break; + ReportError("expected " + expectedflags + " flag, but got '" + token + "'"); + return false; } // Add glow data @@ -655,25 +621,43 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(string.IsNullOrEmpty(token) || token == "}") break; } } - else if (token == "#include") + else if(token == "#include") { SkipWhitespace(true); - string includeLump = StripTokenQuotes(ReadToken()).ToLowerInvariant(); - if (!string.IsNullOrEmpty(includeLump)) + string includelump = ReadToken(false); // Don't skip newline + + // Sanity checks + if(!includelump.StartsWith("\"") || !includelump.EndsWith("\"")) { - // Callback to parse this file - if (OnInclude != null) - OnInclude(this, includeLump.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)); - - // Set our buffers back to continue parsing - datastream = localstream; - datareader = localreader; - sourcename = localsourcename; - } - else + ReportError("#include filename should be quoted"); + return false; + } + + includelump = StripTokenQuotes(includelump).ToLowerInvariant(); + + // More sanity checks + if(string.IsNullOrEmpty(includelump)) { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": got #include directive with missing or incorrect path: '" + includeLump + "'."); + ReportError("Expected file name to include"); + return false; } + + includelump = includelump.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); + + // Already parsed? + if(parsedlumps.IndexOf(includelump) != -1) + { + ReportError("already parsed '" + includelump + "'. Check your #include directives"); + return false; + } + + // Callback to parse this file + if(OnInclude != null) OnInclude(this, includelump); + + // Set our buffers back to continue parsing + datastream = localstream; + datareader = localreader; + sourcename = localsourcename; } else if(token == "$gzdb_skip") //mxd { @@ -685,21 +669,21 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom string token2; do { - if (!SkipWhitespace(true)) break; + if(!SkipWhitespace(true)) break; token2 = ReadToken(); - if (string.IsNullOrEmpty(token2)) break; + if(string.IsNullOrEmpty(token2)) break; } while (token2 != "{"); int scopelevel = 1; do { - if (!SkipWhitespace(true)) break; + if(!SkipWhitespace(true)) break; token2 = ReadToken(); if(string.IsNullOrEmpty(token2)) break; - if (token2 == "{") scopelevel++; - if (token2 == "}") scopelevel--; + if(token2 == "{") scopelevel++; + if(token2 == "}") scopelevel--; } - while (scopelevel > 0); + while(scopelevel > 0); } } } @@ -716,6 +700,11 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom parsedlumps.Clear(); } + protected override string GetLanguageType() + { + return "GLDEFS"; + } + #endregion } } \ No newline at end of file diff --git a/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs b/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs index 93c8f1950..e361b4b17 100644 --- a/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs +++ b/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs @@ -28,6 +28,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom private string mapname; private readonly Dictionary<int, string> spawnnums; private readonly Dictionary<int, string> doomednums; // <DoomEdNum, <lowercase classname, List of default arguments>> + private readonly HashSet<string> parsedlumps; #endregion @@ -50,6 +51,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom mapinfo = new MapInfo(); spawnnums = new Dictionary<int, string>(); doomednums = new Dictionary<int, string>(); + parsedlumps = new HashSet<string>(); } #endregion @@ -67,6 +69,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom { base.Parse(stream, sourcefilename); this.mapname = mapname.ToLowerInvariant(); + parsedlumps.Add(sourcefilename); while(SkipWhitespace(true)) { @@ -118,30 +121,30 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom int bracelevel = 0; //search for required keys - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { token = ReadToken().ToLowerInvariant(); //sky1 or sky2 - if (token == "sky1" || token == "sky2") + if(token == "sky1" || token == "sky2") { string skyType = token; SkipWhitespace(true); token = StripTokenQuotes(ReadToken()).ToLowerInvariant(); //new format - if (token == "=") + if(token == "=") { SkipWhitespace(true); //should be sky texture name token = StripTokenQuotes(ReadToken()); bool gotComma = (token.IndexOf(",") != -1); - if (gotComma) token = token.Replace(",", ""); + if(gotComma) token = token.Replace(",", ""); string skyTexture = StripTokenQuotes(token).ToLowerInvariant(); - if (!string.IsNullOrEmpty(skyTexture)) + if(!string.IsNullOrEmpty(skyTexture)) { - if (skyType == "sky1") + if(skyType == "sky1") mapinfo.Sky1 = skyTexture; else mapinfo.Sky2 = skyTexture; @@ -150,25 +153,24 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); token = StripTokenQuotes(ReadToken()); - if (!gotComma && token == ",") + if(!gotComma && token == ",") { gotComma = true; SkipWhitespace(true); token = ReadToken(); } - if (gotComma) + if(gotComma) { float scrollSpeed = 0; - if (!ReadSignedFloat(token, ref scrollSpeed)) + if(!ReadSignedFloat(token, ref scrollSpeed)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Warning, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected " + skyType + " scroll speed value, but got '" + token + "'"); - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again - continue; + ReportError("expected " + skyType + " scroll speed value, but got '" + token + "'"); + return false; } - if (skyType == "sky1") + if(skyType == "sky1") mapinfo.Sky1ScrollSpeed = scrollSpeed; else mapinfo.Sky2ScrollSpeed = scrollSpeed; @@ -180,17 +182,17 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected " + skyType + " texture name."); + ReportError("expected " + skyType + " texture name"); + return false; } } //old format else { //token should be sky1/2 name - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { - if (skyType == "sky1") + if(skyType == "sky1") mapinfo.Sky1 = token; else mapinfo.Sky2 = token; @@ -200,14 +202,14 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom token = StripTokenQuotes(ReadToken()); float scrollSpeed = 0; - if (!ReadSignedFloat(token, ref scrollSpeed)) + if(!ReadSignedFloat(token, ref scrollSpeed)) { // Not numeric! datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again continue; } - if (skyType == "sky1") + if(skyType == "sky1") mapinfo.Sky1ScrollSpeed = scrollSpeed; else mapinfo.Sky2ScrollSpeed = scrollSpeed; @@ -215,20 +217,20 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected " + skyType + " texture name."); + ReportError("expected " + skyType + " texture name"); + return false; } } } //fade or outsidefog - else if (token == "fade" || token == "outsidefog") + else if(token == "fade" || token == "outsidefog") { string fadeType = token; SkipWhitespace(true); token = StripTokenQuotes(ReadToken()).ToLowerInvariant(); //new format? - if (token == "=") + if(token == "=") { SkipWhitespace(true); token = ReadToken(); @@ -249,18 +251,18 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else //...or not { - General.ErrorLogger.Add(ErrorType.Error, "Failed to parse " + fadeType + " value from string '" + colorVal + "' in '" + sourcename + "' at line " + GetCurrentLineNumber()); - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again + ReportError("failed to parse " + fadeType + " value from string '" + colorVal + "'"); + return false; } } else { - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected " + fadeType + " color value."); - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again + ReportError("expected " + fadeType + " color value"); + return false; } } //vertwallshade or horizwallshade - else if (token == "vertwallshade" || token == "horizwallshade") + else if(token == "vertwallshade" || token == "horizwallshade") { string shadeType = token; SkipWhitespace(true); @@ -277,9 +279,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!ReadSignedInt(token, ref val)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected " + shadeType + " value, but got '" + token + "'"); - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again - continue; + ReportError("expected " + shadeType + " value, but got '" + token + "'"); + return false; } if(shadeType == "vertwallshade") @@ -305,23 +306,22 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out val)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected " + densityType + " value, but got '" + token + "'"); - datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again - continue; + ReportError("expected " + densityType + " value, but got '" + token + "'"); + return false; } - if (densityType == "fogdensity") + if(densityType == "fogdensity") mapinfo.FogDensity = (int)(1024 * (256.0f / val)); else mapinfo.OutsideFogDensity = (int)(1024 * (256.0f / val)); } //doublesky - else if (token == "doublesky") + else if(token == "doublesky") { mapinfo.DoubleSky = true; } //evenlighting - else if (token == "evenlighting") + else if(token == "evenlighting") { mapinfo.EvenLighting = true; } @@ -331,7 +331,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom mapinfo.SmoothLighting = true; } //block end - else if (token == "}") + else if(token == "}") { return ParseBlock(token); } @@ -356,12 +356,13 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom else if(token == "include") { SkipWhitespace(true); - string includeLump = StripTokenQuotes(ReadToken()).ToLowerInvariant(); - if(!string.IsNullOrEmpty(includeLump)) + string includelump = StripTokenQuotes(ReadToken(false)).ToLowerInvariant(); // Don't skip newline + + if(!string.IsNullOrEmpty(includelump)) { // Callback to parse this file if(OnInclude != null) - OnInclude(this, includeLump.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)); + OnInclude(this, includelump.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)); // Set our buffers back to continue parsing datastream = localstream; @@ -370,32 +371,33 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else { - General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": got #include directive with missing or incorrect path: '" + includeLump + "'."); + ReportError("got include directive with missing or incorrect path: '" + includelump + "'"); + return false; } } else if(token == "gameinfo") { - if(!NextTokenIs("{")) return true; // Finished with this file + if(!NextTokenIs("{")) return false; // Finished with this file while(SkipWhitespace(true)) { token = ReadToken(); if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Error while parisng '" + sourcename + "' at line " + GetCurrentLineNumber() + ": failed to find the end of GameInfo block"); - return true; // Finished with this file + ReportError("failed to find the end of GameInfo block"); + return false; // Finished with this file } if(token == "}") break; if(token == "skyflatname") { - if(!NextTokenIs("=")) return true; // Finished with this file + if(!NextTokenIs("=")) return false; // Finished with this file SkipWhitespace(true); string skyflatname = StripTokenQuotes(ReadToken()); if(string.IsNullOrEmpty(skyflatname)) { - General.ErrorLogger.Add(ErrorType.Error, "Error while parisng '" + sourcename + "' at line " + GetCurrentLineNumber() + ": unable to get SkyFlatName value"); - return true; // Finished with this file + ReportError("unable to get SkyFlatName value"); + return false; // Finished with this file } General.Map.Config.SkyFlatName = skyflatname.ToUpperInvariant(); @@ -404,15 +406,15 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else if(token == "doomednums") { - if(!NextTokenIs("{")) return true; // Finished with this file + if(!NextTokenIs("{")) return false; // Finished with this file while(SkipWhitespace(true)) { token = ReadToken(); if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Error while parisng '" + sourcename + "' at line " + GetCurrentLineNumber() + ": failed to find the end of DoomEdNums block"); - return true; // Finished with this file + ReportError("failed to find the end of DoomEdNums block"); + return false; // Finished with this file } if(token == "}") break; @@ -421,24 +423,24 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out id)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected DoomEdNums entry number, but got '" + token + "'"); - return true; // Finished with this file + ReportError("expected DoomEdNums entry number, but got '" + token + "'"); + return false; // Finished with this file } // Then "=" - if(!NextTokenIs("=")) return true; // Finished with this file + if(!NextTokenIs("=")) return false; // Finished with this file // Then actor class SkipWhitespace(false); string classname = StripTokenQuotes(ReadToken()); if(string.IsNullOrEmpty(classname)) { - General.ErrorLogger.Add(ErrorType.Error, "Error while parisng '" + sourcename + "' at line " + GetCurrentLineNumber() + ": unable to get DoomEdNums entry class definition"); - return true; // Finished with this file + ReportError("unable to get DoomEdNums entry class definition"); + return false; // Finished with this file } // Possible special and args. We'll skip them - for (int i = 0; i < 6; i++) + for(int i = 0; i < 6; i++) { if(!NextTokenIs(",", false)) break; @@ -452,15 +454,15 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } else if(token == "spawnnums") { - if(!NextTokenIs("{")) return true; // Finished with this file + if(!NextTokenIs("{")) return false; // Finished with this file - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { token = ReadToken(); if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Error while parisng '" + sourcename + "' at line " + GetCurrentLineNumber() + ": failed to find the end of SpawnNums block"); - return true; // Finished with this file + ReportError("failed to find the end of SpawnNums block"); + return false; // Finished with this file } if(token == "}") break; @@ -469,20 +471,20 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out id)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected SpawnNums number, but got '" + token + "'"); - return true; // Finished with this file + ReportError("expected SpawnNums number, but got '" + token + "'"); + return false; // Finished with this file } // Then "=" - if(!NextTokenIs("=")) return true; // Finished with this file + if(!NextTokenIs("=")) return false; // Finished with this file // Then actor class SkipWhitespace(false); token = StripTokenQuotes(ReadToken()); if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Error while parisng '" + sourcename + "' at line " + GetCurrentLineNumber() + ": unable to get SpawnNums entry class definition"); - return true; + ReportError("unable to get SpawnNums entry class definition"); + return false; } // Add to collection @@ -503,11 +505,11 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom private static bool GetColor(string name, ref Color4 color) { - if (name == "black") return true; + if(name == "black") return true; //probably it's a hex color (like FFCC11)? int ci; - if (int.TryParse(name, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ci)) + if(int.TryParse(name, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ci)) { color = new Color4(ci) {Alpha = 1.0f}; return true; @@ -515,7 +517,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom //probably it's a color name? Color c = Color.FromName(name); //should be similar to C++ color name detection, I suppose - if (c.IsKnownColor) + if(c.IsKnownColor) { color = new Color4(c); return true; @@ -523,6 +525,11 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom return false; } + protected override string GetLanguageType() + { + return "MAPINFO"; + } + #endregion } } diff --git a/Source/Core/GZBuilder/GZDoom/ModeldefParser.cs b/Source/Core/GZBuilder/GZDoom/ModeldefParser.cs index 65e619d32..954d16bf7 100644 --- a/Source/Core/GZBuilder/GZDoom/ModeldefParser.cs +++ b/Source/Core/GZBuilder/GZDoom/ModeldefParser.cs @@ -10,7 +10,6 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom { private Dictionary<string, ModelData> entries; //classname, entry internal Dictionary<string, ModelData> Entries { get { return entries; } } - internal string Source { get { return sourcename; } } internal ModeldefParser() { @@ -24,66 +23,88 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom entries = new Dictionary<string, ModelData>(StringComparer.Ordinal); // Continue until at the end of the stream - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { string token = ReadToken(); - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { token = StripTokenQuotes(token).ToLowerInvariant(); - if (token == "model") //model structure start + if(token == "model") //model structure start { //find classname SkipWhitespace(true); - string className = StripTokenQuotes(ReadToken(ActorStructure.ACTOR_CLASS_SPECIAL_TOKENS)).ToLowerInvariant(); + string displayclassname = StripTokenQuotes(ReadToken(ActorStructure.ACTOR_CLASS_SPECIAL_TOKENS)); + string classname = displayclassname.ToLowerInvariant(); - if(!string.IsNullOrEmpty(className) && !entries.ContainsKey(className)) + if(!string.IsNullOrEmpty(classname) && !entries.ContainsKey(classname)) { //now find opening brace SkipWhitespace(true); token = ReadToken(); - if (token != "{") + if(token != "{") { - General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '"+sourcefilename+"' at line "+GetCurrentLineNumber()+": expected '{', but got '" + token + "'"); + General.ErrorLogger.Add(ErrorType.Error, "Unexpected token found in '" + sourcefilename + "' at line " + GetCurrentLineNumber() + ": expected '{', but got '" + token + "'"); continue; //something wrong with modeldef declaration, continue to next one } ModeldefStructure mds = new ModeldefStructure(); - ModelData mde = mds.Parse(this); - if (mde != null) entries.Add(className, mde); + if(mds.Parse(this, displayclassname) && mds.ModelData != null) + { + entries.Add(classname, mds.ModelData); + } + + if(HasError) + { + LogError(); + ClearError(); + } + + // Skip untill current structure end + if(!mds.ParsingFinished) + { + while(SkipWhitespace(true)) + { + token = ReadToken(); + if(string.IsNullOrEmpty(token) || token == "}") break; + } + } } } else { // Unknown structure! string token2; - if (token != "{") + if(token != "{") { do { - if (!SkipWhitespace(true)) break; + if(!SkipWhitespace(true)) break; token2 = ReadToken(); - if (string.IsNullOrEmpty(token2)) break; + if(string.IsNullOrEmpty(token2)) break; } - while (token2 != "{"); + while(token2 != "{"); } int scopelevel = 1; do { - if (!SkipWhitespace(true)) break; + if(!SkipWhitespace(true)) break; token2 = ReadToken(); - if (string.IsNullOrEmpty(token2)) break; - if (token2 == "{") scopelevel++; - if (token2 == "}") scopelevel--; + if(string.IsNullOrEmpty(token2)) break; + if(token2 == "{") scopelevel++; + if(token2 == "}") scopelevel--; } - while (scopelevel > 0); + while(scopelevel > 0); } - } - } return entries.Count > 0; } + + protected override string GetLanguageType() + { + return "MODELDEF"; + } } } diff --git a/Source/Core/GZBuilder/GZDoom/ModeldefParserSE.cs b/Source/Core/GZBuilder/GZDoom/ModeldefParserSE.cs index e591e4533..13d3995fa 100644 --- a/Source/Core/GZBuilder/GZDoom/ModeldefParserSE.cs +++ b/Source/Core/GZBuilder/GZDoom/ModeldefParserSE.cs @@ -1,13 +1,14 @@ #region ================== Namespaces -using System.IO; using System.Collections.Generic; -using CodeImp.DoomBuilder.ZDoom; +using System.IO; using CodeImp.DoomBuilder.GZBuilder.Data; +using CodeImp.DoomBuilder.ZDoom; #endregion //mxd. Modeldef parser used to create ScriptItems for use in script editor's navigator +//Should be parse model definitions even from invalid MODELDEF and should never fail parsing namespace CodeImp.DoomBuilder.GZBuilder.GZDoom { internal sealed class ModeldefParserSE : ZDTextParser @@ -25,34 +26,39 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom base.Parse(stream, sourcefilename); // Continue until at the end of the stream - while (SkipWhitespace(true)) + while(SkipWhitespace(true)) { string token = ReadToken(); + if(string.IsNullOrEmpty(token) || token.ToUpperInvariant() != "MODEL") continue; + + SkipWhitespace(true); + int startpos = (int)stream.Position; + string modelname = ReadToken(); + + SkipWhitespace(true); + token = ReadToken(); //this should be "{" - if (!string.IsNullOrEmpty(token)) + if(token == "{") { - token = token.ToUpperInvariant(); - - if(token == "MODEL") - { - SkipWhitespace(true); - int startPos = (int)stream.Position; - string modelName = ReadToken(); - SkipWhitespace(true); - token = ReadToken(); //this should be "{" - - if (token == "{") - { - ScriptItem i = new ScriptItem(modelName, startPos, false); - models.Add(i); - } - } + ScriptItem i = new ScriptItem(modelname, startpos, false); + models.Add(i); + } + + while(SkipWhitespace(true)) + { + token = ReadToken(); + if(string.IsNullOrEmpty(token) || token == "}") break; } } - //sort nodes + // Sort nodes models.Sort(ScriptItem.SortByName); return true; } + + protected override string GetLanguageType() + { + return "MODELDEF"; + } } } diff --git a/Source/Core/GZBuilder/GZDoom/ModeldefStructure.cs b/Source/Core/GZBuilder/GZDoom/ModeldefStructure.cs index 225b764a9..a62e4ef4a 100644 --- a/Source/Core/GZBuilder/GZDoom/ModeldefStructure.cs +++ b/Source/Core/GZBuilder/GZDoom/ModeldefStructure.cs @@ -14,8 +14,12 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom internal sealed class ModeldefStructure { private const int MAX_MODELS = 4; //maximum models per modeldef entry, zero-based + private bool parsingfinished; - internal ModelData Parse(ModeldefParser parser) + internal ModelData ModelData; + internal bool ParsingFinished { get { return parsingfinished; } } + + internal bool Parse(ModeldefParser parser, string classname) { #region ================== Vars @@ -35,13 +39,12 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom bool inheritactorroll = false; string token; - bool gotErrors = false; - bool allParsed = false; #endregion //read modeldef structure contents - while(!gotErrors && !allParsed && parser.SkipWhitespace(true)) + parsingfinished = false; + while(!parsingfinished && parser.SkipWhitespace(true)) { token = parser.ReadToken(); if(!string.IsNullOrEmpty(token)) @@ -54,11 +57,11 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom case "path": parser.SkipWhitespace(true); - path = parser.StripTokenQuotes(parser.ReadToken()).Replace("/", "\\"); - if(string.IsNullOrEmpty(path)) + path = parser.StripTokenQuotes(parser.ReadToken(false)).Replace("/", "\\"); // Don't skip newline + if(string.IsNullOrEmpty(path)) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected path to model, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected model path, but got '" + token + "'"); + return false; } break; @@ -75,47 +78,42 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected model index, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected model index, but got '" + token + "'"); + return false; } if(index >= MAX_MODELS) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": GZDoom doesn't allow more than " + MAX_MODELS + " models per MODELDEF entry!"); - gotErrors = true; - break; + parser.ReportError("GZDoom doesn't allow more than " + MAX_MODELS + " models per MODELDEF entry"); + return false; } parser.SkipWhitespace(true); //model path - token = parser.StripTokenQuotes(parser.ReadToken()).ToLowerInvariant(); + token = parser.StripTokenQuotes(parser.ReadToken(false)).ToLowerInvariant(); // Don't skip newline if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected model name, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("model name required"); + return false; } - else + + //check extension + string fileExt = Path.GetExtension(token); + if(string.IsNullOrEmpty(fileExt)) { - //check extension - string fileExt = Path.GetExtension(token); - if(string.IsNullOrEmpty(fileExt)) - { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": model '" + token + "' won't be loaded. Models without extension are not supported by GZDoom."); - gotErrors = true; - break; - } - if(fileExt != ".md3" && fileExt != ".md2") - { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": model '" + token + "' won't be loaded. Only MD2 and MD3 models are supported."); - gotErrors = true; - break; - } + parser.ReportError("model '" + token + "' won't be loaded. Models without extension are not supported by GZDoom"); + return false; + } - //GZDoom allows models with identical modelIndex, it uses the last one encountered - modelNames[index] = Path.Combine(path, token); + if(fileExt != ".md3" && fileExt != ".md2") + { + parser.ReportError("model '" + token + "' won't be loaded. Only MD2 and MD3 models are supported"); + return false; } + + //GZDoom allows models with identical modelIndex, it uses the last one encountered + modelNames[index] = Path.Combine(path, token); break; #endregion @@ -131,42 +129,36 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out skinIndex)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected skin index, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected skin index, but got '" + token + "'"); + return false; } if(skinIndex >= MAX_MODELS) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": GZDoom doesn't allow more than " + MAX_MODELS + " skins per MODELDEF entry!"); - gotErrors = true; - break; + parser.ReportError("GZDoom doesn't allow more than " + MAX_MODELS + " skins per MODELDEF entry"); + return false; } parser.SkipWhitespace(true); //skin path - token = parser.StripTokenQuotes(parser.ReadToken()).ToLowerInvariant(); + token = parser.StripTokenQuotes(parser.ReadToken(false)).ToLowerInvariant(); // Don't skip newline if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected skin name, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("skin path required"); + return false; } - else + + //check extension + string ext = Path.GetExtension(token); + if(Array.IndexOf(ModelData.SUPPORTED_TEXTURE_EXTENSIONS, ext) == -1) { - //check extension - string ext = Path.GetExtension(token); - if(Array.IndexOf(TextureData.SUPPORTED_TEXTURE_EXTENSIONS, ext) == -1) - { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": image format '" + ext + "' is not supported!"); - textureNames[skinIndex] = TextureData.INVALID_TEXTURE; - } - else - { - //GZDoom allows skins with identical modelIndex, it uses the last one encountered - textureNames[skinIndex] = Path.Combine(path, token); - } - } + parser.ReportError("image format '" + ext + "' is not supported!"); + return false; + } + + //GZDoom allows skins with identical modelIndex, it uses the last one encountered + textureNames[skinIndex] = Path.Combine(path, token); break; #endregion @@ -179,9 +171,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref scale.Y)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected Scale X value, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected Scale X value, but got '" + token + "'"); + return false; } parser.SkipWhitespace(true); @@ -189,9 +180,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref scale.X)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected Scale Y value, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected Scale Y value, but got '" + token + "'"); + return false; } parser.SkipWhitespace(true); @@ -199,8 +189,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref scale.Z)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected Scale Z value, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected Scale Z value, but got '" + token + "'"); + return false; } break; @@ -214,9 +204,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref offset.X)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected Offset X value, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected Offset X value, but got '" + token + "'"); + return false; } parser.SkipWhitespace(true); @@ -224,9 +213,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref offset.Y)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected Offset Y value, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected Offset Y value, but got '" + token + "'"); + return false; } parser.SkipWhitespace(true); @@ -234,8 +222,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref offset.Z)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected Offset Z value, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected Offset Z value, but got '" + token + "'"); + return false; } break; @@ -249,8 +237,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref offset.Z)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected ZOffset value, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected ZOffset value, but got '" + token + "'"); + return false; } break; @@ -264,8 +252,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref angleOffset)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected AngleOffset value, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected AngleOffset value, but got '" + token + "'"); + return false; } break; @@ -279,8 +267,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref pitchOffset)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected PitchOffset value, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected PitchOffset value, but got '" + token + "'"); + return false; } break; @@ -294,8 +282,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedFloat(token, ref rollOffset)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected RollOffset value, but got '" + token + "'"); - gotErrors = true; + parser.ReportError("expected RollOffset value, but got '" + token + "'"); + return false; } break; @@ -322,8 +310,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom case "frameindex": case "frame": //parsed all required fields. if got more than one model - find which one(s) should be displayed - int len = modelNames.GetLength(0); - if(!gotErrors && len > 1) + if(modelNames.GetLength(0) > 1) { string spriteLump = null; string spriteFrame = null; @@ -389,23 +376,20 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out modelIndex)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected model index, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected model index, but got '" + token + "'"); + return false; } if(modelIndex >= MAX_MODELS) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": GZDoom doesn't allow more than " + MAX_MODELS + " models per MODELDEF entry!"); - gotErrors = true; - break; + parser.ReportError("GZDoom doesn't allow more than " + MAX_MODELS + " models per MODELDEF entry"); + return false; } if(modelNames[modelIndex] == null) { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": got model index, which doesn't correspond to any defined model!"); - gotErrors = true; - break; + parser.ReportError("got model index, which doesn't correspond to any defined model"); + return false; } modelsUsed[modelIndex] = true; @@ -420,9 +404,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(!parser.ReadSignedInt(token, ref frame)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected model frame index, but got '" + token + "'"); - gotErrors = true; - break; + parser.ReportError("expected model frame index, but got '" + token + "'"); + return false; } // Skip the model if frame index is -1 @@ -434,9 +417,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom if(string.IsNullOrEmpty(token)) { // Missing! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + parser.Source + " at line " + parser.GetCurrentLineNumber() + ": expected model frame name"); - gotErrors = true; - break; + parser.ReportError("expected model frame name"); + return false; } frameNames[modelIndex] = token.ToLowerInvariant(); @@ -451,7 +433,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } } - allParsed = true; + parsingfinished = true; break; #endregion @@ -467,28 +449,38 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom } // Bail out when got errors or no models are used - if(gotErrors || Array.IndexOf(modelsUsed, true) == -1) return null; + if(Array.IndexOf(modelsUsed, true) == -1) + { + parser.ReportError("no models are used by '" + classname + "'"); + return false; + } // Classname is set in ModeldefParser - ModelData mde = new ModelData(); - mde.InheritActorPitch = inheritactorpitch; - mde.InheritActorRoll = inheritactorroll; + ModelData = new ModelData(); + ModelData.InheritActorPitch = inheritactorpitch; + ModelData.InheritActorRoll = inheritactorroll; Matrix moffset = Matrix.Translation(offset.Y, -offset.X, offset.Z); // Things are complicated in GZDoom... Matrix mrotation = Matrix.RotationY(-Angle2D.DegToRad(rollOffset)) * Matrix.RotationX(-Angle2D.DegToRad(pitchOffset)) * Matrix.RotationZ(Angle2D.DegToRad(angleOffset)); - mde.SetTransform(mrotation, moffset, scale); + ModelData.SetTransform(mrotation, moffset, scale); for(int i = 0; i < modelNames.Length; i++) { if(!string.IsNullOrEmpty(modelNames[i]) && modelsUsed[i]) { - mde.TextureNames.Add(string.IsNullOrEmpty(textureNames[i]) ? string.Empty : textureNames[i].ToLowerInvariant()); - mde.ModelNames.Add(modelNames[i].ToLowerInvariant()); - mde.FrameNames.Add(frameNames[i]); - mde.FrameIndices.Add(frameIndices[i]); + ModelData.TextureNames.Add(string.IsNullOrEmpty(textureNames[i]) ? string.Empty : textureNames[i].ToLowerInvariant()); + ModelData.ModelNames.Add(modelNames[i].ToLowerInvariant()); + ModelData.FrameNames.Add(frameNames[i]); + ModelData.FrameIndices.Add(frameIndices[i]); } } - return (mde.ModelNames.Count > 0 ? mde : null); + if(ModelData.ModelNames.Count == 0) + { + parser.ReportError("'" + classname + "' has no models"); + return false; + } + + return true; } } } diff --git a/Source/Core/GZBuilder/GZDoom/ScriptTypeParserSE.cs b/Source/Core/GZBuilder/GZDoom/ScriptTypeParserSE.cs index 64e36725d..e018b9039 100644 --- a/Source/Core/GZBuilder/GZDoom/ScriptTypeParserSE.cs +++ b/Source/Core/GZBuilder/GZDoom/ScriptTypeParserSE.cs @@ -28,18 +28,18 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom { string token = ReadToken(); - if (!string.IsNullOrEmpty(token)) + if(!string.IsNullOrEmpty(token)) { token = token.ToUpperInvariant(); - if (token == "MODEL") + if(token == "MODEL") { SkipWhitespace(true); ReadToken(); //should be model name SkipWhitespace(true); token = ReadToken();//should be opening brace - if (token == "{") + if(token == "{") { scriptType = ScriptType.MODELDEF; return true; @@ -55,7 +55,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); token = ReadToken(); //should be opening brace - if (token == "{") + if(token == "{") { scriptType = ScriptType.ACS; return true; @@ -70,7 +70,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); token = ReadToken(); - if (token == ":" || token == "{" || token == "REPLACES") + if(token == ":" || token == "{" || token == "REPLACES") { scriptType = ScriptType.DECORATE; return true; @@ -79,7 +79,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); token = ReadToken(); //should be actor name - if (token == "{") + if(token == "{") { scriptType = ScriptType.DECORATE; return true; @@ -90,5 +90,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom return false; } + + protected override string GetLanguageType() + { + return "SCRIPT TYPE CHECKER"; + } } } diff --git a/Source/Core/GZBuilder/md3/ModelReader.cs b/Source/Core/GZBuilder/md3/ModelReader.cs index 18b1396d4..62f174d51 100644 --- a/Source/Core/GZBuilder/md3/ModelReader.cs +++ b/Source/Core/GZBuilder/md3/ModelReader.cs @@ -148,15 +148,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3 //load texture List<string> errors = new List<string>(); - //texture has unsupported extension? - if(mde.TextureNames[i] == TextureData.INVALID_TEXTURE) - { - for(int c = 0; c < result.Meshes.Count; c++) - mde.Model.Textures.Add(General.Map.Data.UnknownTexture3D.Texture); - - //texture not defined in MODELDEF? - } - else if(useSkins) + // Texture not defined in MODELDEF? + if(useSkins) { //try to use model's own skins for(int m = 0; m < result.Meshes.Count; m++) @@ -171,7 +164,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3 string path = result.Skins[m].Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); ext = Path.GetExtension(path); - if(Array.IndexOf(TextureData.SUPPORTED_TEXTURE_EXTENSIONS, ext) == -1) + if(Array.IndexOf(ModelData.SUPPORTED_TEXTURE_EXTENSIONS, ext) == -1) { mde.Model.Textures.Add(General.Map.Data.UnknownTexture3D.Texture); errors.Add("image format '" + ext + "' is not supported!"); @@ -193,8 +186,9 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3 mde.Model.Textures.Add(t); } - } - else //try to use texture loaded from MODELDEFS + } + //Try to use texture loaded from MODELDEFS + else { Texture t = LoadTexture(containers, mde.TextureNames[i], device); if(t == null) diff --git a/Source/Core/General/ErrorLogger.cs b/Source/Core/General/ErrorLogger.cs index a4e0c80e3..9ce3bc07a 100644 --- a/Source/Core/General/ErrorLogger.cs +++ b/Source/Core/General/ErrorLogger.cs @@ -81,29 +81,38 @@ namespace CodeImp.DoomBuilder lock(this) { - errors.Add(new ErrorItem(type, message)); - switch(type) + //mxd. Don't add duplicate messages + if(errors.Count == 0 || message != errors[errors.Count - 1].message || type != errors[errors.Count - 1].type) { - case ErrorType.Error: - erroradded = true; - prefix = "ERROR: "; + errors.Add(new ErrorItem(type, message)); + switch(type) + { + case ErrorType.Error: + erroradded = true; + prefix = "ERROR: "; #if DEBUG - DebugConsole.WriteLine(DebugMessageType.ERROR, message); + DebugConsole.WriteLine(DebugMessageType.ERROR, message); #endif - break; - - case ErrorType.Warning: - warningadded = true; - prefix = "WARNING: "; + break; + + case ErrorType.Warning: + warningadded = true; + prefix = "WARNING: "; #if DEBUG - DebugConsole.WriteLine(DebugMessageType.WARNING, message); + DebugConsole.WriteLine(DebugMessageType.WARNING, message); #endif - break; - } - changed = true; + break; + } - General.WriteLogLine(prefix + message); - General.MainWindow.SetWarningsCount(errors.Count, erroradded); //mxd + changed = true; + General.WriteLogLine(prefix + message); + General.MainWindow.SetWarningsCount(errors.Count, erroradded); //mxd + } + //mxd. But still blink the indicator on errors + else if(type == ErrorType.Error) + { + General.MainWindow.SetWarningsCount(errors.Count, true); + } } } diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index 41e88a535..058e98f1e 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -1879,10 +1879,12 @@ namespace CodeImp.DoomBuilder List<CompilerError> compilererrors = UpdateScriptNames(); if(logerrors && compilererrors.Count > 0) { + //INFO: CompileLump() prepends lumpname with "?" to distinguish between temporary files and files compiled in place + //INFO: also, error.linenumber is zero-based foreach(CompilerError error in compilererrors) { - General.ErrorLogger.Add(ErrorType.Error, "ACS error in '" + error.filename - + (error.linenumber != CompilerError.NO_LINE_NUMBER ? "', line " + error.linenumber : "'") + General.ErrorLogger.Add(ErrorType.Error, "ACS error in '" + (error.filename.StartsWith("?") ? error.filename.Replace("?", "") : error.filename) + + (error.linenumber != CompilerError.NO_LINE_NUMBER ? "', line " + (error.linenumber + 1) : "'") + ". " + error.description + "."); } } @@ -1927,15 +1929,18 @@ namespace CodeImp.DoomBuilder { // Get script names AcsParserSE parser = new AcsParserSE { OnInclude = (se, path) => se.Parse(General.Map.Data.LoadFile(path), path, true, true) }; - if(parser.Parse(stream, "SCRIPTS", scriptconfig.Compiler.Files, true, false)) + + //INFO: CompileLump() prepends lumpname with "?" to distinguish between temporary files and files compiled in place + if(parser.Parse(stream, "?SCRIPTS", scriptconfig.Compiler.Files, true, false)) { // Add them to arrays namedscriptslist.AddRange(parser.NamedScripts); numberedscriptslist.AddRange(parser.NumberedScripts); scripincludeslist.AddRange(parser.Includes); } + // Check for errors - else if(parser.HasError) + if(parser.HasError) { compilererrors.Add(new CompilerError(parser.ErrorDescription, parser.ErrorSource, parser.ErrorLine)); break; diff --git a/Source/Core/ZDoom/ActorStructure.cs b/Source/Core/ZDoom/ActorStructure.cs index 05d8cca17..c0f2ed3bd 100644 --- a/Source/Core/ZDoom/ActorStructure.cs +++ b/Source/Core/ZDoom/ActorStructure.cs @@ -109,7 +109,7 @@ namespace CodeImp.DoomBuilder.ZDoom { token = token.ToLowerInvariant(); - switch (token) + switch(token) { case ":": // The next token must be the class to inherit from @@ -123,9 +123,6 @@ namespace CodeImp.DoomBuilder.ZDoom // Find the actor to inherit from baseclass = parser.GetArchivedActorByName(inheritclass); - - //mxd. Does it exist? (We can carry on regardless, so add a warning) - if(baseclass == null) parser.ReportWarning("Parent class '" + inheritclass + "' does not exist"); break; case "replaces": @@ -171,7 +168,7 @@ namespace CodeImp.DoomBuilder.ZDoom break; } - if (done) break; //mxd + if(done) break; //mxd } else { @@ -188,7 +185,7 @@ namespace CodeImp.DoomBuilder.ZDoom string token = parser.ReadToken(); token = token.ToLowerInvariant(); - switch (token) + switch(token) { case "+": case "-": @@ -196,7 +193,7 @@ namespace CodeImp.DoomBuilder.ZDoom bool flagvalue = (token == "+"); parser.SkipWhitespace(true); string flagname = parser.ReadToken(); - if (!string.IsNullOrEmpty(flagname)) + if(!string.IsNullOrEmpty(flagname)) { // Add the flag with its value flagname = flagname.ToLowerInvariant(); @@ -212,10 +209,10 @@ namespace CodeImp.DoomBuilder.ZDoom case "action": case "native": // We don't need this, ignore up to the first next ; - while (parser.SkipWhitespace(true)) + while(parser.SkipWhitespace(true)) { string t = parser.ReadToken(); - if (string.IsNullOrEmpty(t) || t == ";") break; + if(string.IsNullOrEmpty(t) || t == ";") break; } break; @@ -225,31 +222,31 @@ namespace CodeImp.DoomBuilder.ZDoom case "states": // Now parse actor states until we reach the end of the states structure - while (parser.SkipWhitespace(true)) + while(parser.SkipWhitespace(true)) { string statetoken = parser.ReadToken(); - if (!string.IsNullOrEmpty(statetoken)) + if(!string.IsNullOrEmpty(statetoken)) { // Start of scope? - if (statetoken == "{") + if(statetoken == "{") { // This is fine } // End of scope? - else if (statetoken == "}") + else if(statetoken == "}") { // Done with the states, // break out of this parse loop break; } // State label? - else if (statetoken == ":") + else if(statetoken == ":") { - if (!string.IsNullOrEmpty(previoustoken)) + if(!string.IsNullOrEmpty(previoustoken)) { // Parse actor state StateStructure st = new StateStructure(this, parser); - if (parser.HasError) return; + if(parser.HasError) return; states[previoustoken.ToLowerInvariant()] = st; } else @@ -273,11 +270,11 @@ namespace CodeImp.DoomBuilder.ZDoom break; case "var": //mxd - while (parser.SkipWhitespace(true)) + while(parser.SkipWhitespace(true)) { string t = parser.ReadToken(); - if (string.IsNullOrEmpty(t) || t == ";") break; - if (t.StartsWith("user_") && !userVars.Contains(t)) + if(string.IsNullOrEmpty(t) || t == ";") break; + if(t.StartsWith("user_") && !userVars.Contains(t)) userVars.Add(t); } break; @@ -323,17 +320,17 @@ namespace CodeImp.DoomBuilder.ZDoom case "game": // Include all tokens on the same line List<string> games = new List<string>(); - while (parser.SkipWhitespace(false)) + while(parser.SkipWhitespace(false)) { string v = parser.ReadToken(); - if (string.IsNullOrEmpty(v)) + if(string.IsNullOrEmpty(v)) { parser.ReportError("Unexpected end of structure"); return; } - if (v == "\n") break; - if (v == "}") return; //mxd - if (v != ",") games.Add(v.ToLowerInvariant()); + if(v == "\n") break; + if(v == "}") return; //mxd + if(v != ",") games.Add(v.ToLowerInvariant()); } props[token] = games; break; @@ -341,7 +338,7 @@ namespace CodeImp.DoomBuilder.ZDoom // Property default: // Property begins with $? Then the whole line is a single value - if (token.StartsWith("$")) + if(token.StartsWith("$")) { // This is for editor-only properties such as $sprite and $category props[token] = new List<string> { (parser.SkipWhitespace(false) ? parser.ReadLine() : "") }; @@ -350,17 +347,17 @@ namespace CodeImp.DoomBuilder.ZDoom { // Next tokens up until the next newline are values List<string> values = new List<string>(); - while (parser.SkipWhitespace(false)) + while(parser.SkipWhitespace(false)) { string v = parser.ReadToken(); - if (string.IsNullOrEmpty(v)) + if(string.IsNullOrEmpty(v)) { parser.ReportError("Unexpected end of structure"); return; } - if (v == "\n") break; - if (v == "}") return; //mxd - if (v != ",") values.Add(v); + if(v == "\n") break; + if(v == "}") return; //mxd + if(v != ",") values.Add(v); } //mxd. Translate scale to xscale and yscale @@ -377,7 +374,7 @@ namespace CodeImp.DoomBuilder.ZDoom break; } - if (done) break; //mxd + if(done) break; //mxd // Keep token previoustoken = token; @@ -407,16 +404,16 @@ namespace CodeImp.DoomBuilder.ZDoom //properties if(!props.ContainsKey("height")) - props["height"] = new List<string>() { ti.Value.Height.ToString() }; + props["height"] = new List<string> { ti.Value.Height.ToString() }; if(!props.ContainsKey("radius")) - props["radius"] = new List<string>() { ti.Value.Radius.ToString() }; + props["radius"] = new List<string> { ti.Value.Radius.ToString() }; return; } } - General.ErrorLogger.Add(ErrorType.Warning, "Unable to find the DECORATE class '" + inheritclass + "' to inherit from, while parsing '" + classname + ":" + doomednum + "'"); + parser.LogWarning("Unable to find '" + inheritclass + "' class to inherit from, while parsing '" + classname + ":" + doomednum + "'"); } } @@ -438,12 +435,9 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public bool HasProperty(string propname) { - if(props.ContainsKey(propname)) - return true; - else if(!skipsuper && (baseclass != null)) - return baseclass.HasProperty(propname); - else - return false; + if(props.ContainsKey(propname)) return true; + if(!skipsuper && (baseclass != null)) return baseclass.HasProperty(propname); + return false; } /// <summary> @@ -451,12 +445,9 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public bool HasPropertyWithValue(string propname) { - if(props.ContainsKey(propname) && (props[propname].Count > 0)) - return true; - else if(!skipsuper && (baseclass != null)) - return baseclass.HasPropertyWithValue(propname); - else - return false; + if(props.ContainsKey(propname) && (props[propname].Count > 0)) return true; + if(!skipsuper && (baseclass != null)) return baseclass.HasPropertyWithValue(propname); + return false; } /// <summary> @@ -466,10 +457,9 @@ namespace CodeImp.DoomBuilder.ZDoom { if(props.ContainsKey(propname) && (props[propname].Count > 0)) return string.Join(" ", props[propname].ToArray()); - else if(!skipsuper && (baseclass != null)) + if(!skipsuper && (baseclass != null)) return baseclass.GetPropertyAllValues(propname); - else - return ""; + return ""; } /// <summary> @@ -479,10 +469,9 @@ namespace CodeImp.DoomBuilder.ZDoom { if(props.ContainsKey(propname) && (props[propname].Count > valueindex)) return props[propname][valueindex]; - else if(!skipsuper && (baseclass != null)) + if(!skipsuper && (baseclass != null)) return baseclass.GetPropertyValueString(propname, valueindex); - else - return ""; + return ""; } /// <summary> @@ -524,10 +513,8 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public bool HasFlagValue(string flag) { - if(flags.ContainsKey(flag)) - return true; - if(!skipsuper && (baseclass != null)) - return baseclass.HasFlagValue(flag); + if(flags.ContainsKey(flag)) return true; + if(!skipsuper && (baseclass != null)) return baseclass.HasFlagValue(flag); return false; } @@ -536,10 +523,8 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public bool GetFlagValue(string flag, bool defaultvalue) { - if(flags.ContainsKey(flag)) - return flags[flag]; - if(!skipsuper && (baseclass != null)) - return baseclass.GetFlagValue(flag, defaultvalue); + if(flags.ContainsKey(flag)) return flags[flag]; + if(!skipsuper && (baseclass != null)) return baseclass.GetFlagValue(flag, defaultvalue); return defaultvalue; } @@ -548,10 +533,8 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public bool HasState(string statename) { - if(states.ContainsKey(statename)) - return true; - if(!skipsuper && (baseclass != null)) - return baseclass.HasState(statename); + if(states.ContainsKey(statename)) return true; + if(!skipsuper && (baseclass != null)) return baseclass.HasState(statename); return false; } @@ -560,10 +543,8 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public StateStructure GetState(string statename) { - if(states.ContainsKey(statename)) - return states[statename]; - if(!skipsuper && (baseclass != null)) - return baseclass.GetState(statename); + if(states.ContainsKey(statename)) return states[statename]; + if(!skipsuper && (baseclass != null)) return baseclass.GetState(statename); return null; } @@ -734,7 +715,7 @@ namespace CodeImp.DoomBuilder.ZDoom if(!string.IsNullOrEmpty(result)) { - if (voxels.ContainsKey(result)) return result; + if(voxels.ContainsKey(result)) return result; // The sprite name may be incomplete. Find an existing sprite with direction. foreach(string postfix in SPRITE_POSTFIXES) diff --git a/Source/Core/ZDoom/DecorateParser.cs b/Source/Core/ZDoom/DecorateParser.cs index b87e56564..c7215d084 100644 --- a/Source/Core/ZDoom/DecorateParser.cs +++ b/Source/Core/ZDoom/DecorateParser.cs @@ -119,42 +119,56 @@ namespace CodeImp.DoomBuilder.ZDoom if(!string.IsNullOrEmpty(objdeclaration)) { objdeclaration = objdeclaration.ToLowerInvariant(); - if(objdeclaration == "actor") + switch(objdeclaration) { - // Read actor structure - ActorStructure actor = new ActorStructure(this); - if(this.HasError) break; - - // Add the actor - archivedactors[actor.ClassName.ToLowerInvariant()] = actor; - if(actor.CheckActorSupported()) - actors[actor.ClassName.ToLowerInvariant()] = actor; - - // Replace an actor? - if(actor.ReplacesClass != null) + case "actor": { - if(GetArchivedActorByName(actor.ReplacesClass) != null) - archivedactors[actor.ReplacesClass.ToLowerInvariant()] = actor; - else - General.ErrorLogger.Add(ErrorType.Warning, "Unable to find the DECORATE class '" + actor.ReplacesClass + "' to replace, while parsing '" + actor.ClassName + "'"); - + // Read actor structure + ActorStructure actor = new ActorStructure(this); + if(this.HasError) return false; + + // Add the actor + archivedactors[actor.ClassName.ToLowerInvariant()] = actor; if(actor.CheckActorSupported()) + actors[actor.ClassName.ToLowerInvariant()] = actor; + + // Replace an actor? + if(actor.ReplacesClass != null) { - if(GetActorByName(actor.ReplacesClass) != null) + if(GetArchivedActorByName(actor.ReplacesClass) != null) + archivedactors[actor.ReplacesClass.ToLowerInvariant()] = actor; + else + LogWarning("Unable to find '" + actor.ReplacesClass + "' class to replace, while parsing '" + actor.ClassName + "'"); + + if(actor.CheckActorSupported() && GetActorByName(actor.ReplacesClass) != null) actors[actor.ReplacesClass.ToLowerInvariant()] = actor; } } - } - else if(objdeclaration == "#include") - { - // Include a file - SkipWhitespace(true); - string filename = ReadToken(); - if(!string.IsNullOrEmpty(filename)) + break; + + case "#include": { + // Include a file + SkipWhitespace(true); + string filename = ReadToken(false); //mxd. Don't skip newline + + //mxd. Sanity checks + if(!filename.StartsWith("\"") || !filename.EndsWith("\"")) + { + ReportError("#include filename should be quoted"); + return false; + } + // Strip the quotes filename = filename.Replace("\"", ""); + //mxd. More sanity checks + if(string.IsNullOrEmpty(filename)) + { + ReportError("Expected file name to include"); + return false; + } + // Callback to parse this file now if(OnInclude != null) OnInclude(this, filename); @@ -162,51 +176,49 @@ namespace CodeImp.DoomBuilder.ZDoom datastream = localstream; datareader = localreader; sourcename = localsourcename; - if(HasError) break; + if(this.HasError) return false; } - else - { - ReportError("Expected file name to include"); + break; + + case "enum": + case "native": + case "const": + while(SkipWhitespace(true)) + { + string t = ReadToken(); + if(string.IsNullOrEmpty(t) || t == ";") break; + } break; - } - } - else if((objdeclaration == "const") || (objdeclaration == "native") || (objdeclaration == "enum")) - { - // We don't need this, ignore up to the first next ; - while(SkipWhitespace(true)) + + case "$gzdb_skip": break; + + default: { - string t = ReadToken(); - if(string.IsNullOrEmpty(t) || t == ";") break; + // Unknown structure! + // Best we can do now is just find the first { and then + // follow the scopes until the matching } is found + string token2; + do + { + if(!SkipWhitespace(true)) break; + token2 = ReadToken(); + if(string.IsNullOrEmpty(token2)) break; + } + while(token2 != "{"); + + int scopelevel = 1; + do + { + if(!SkipWhitespace(true)) break; + token2 = ReadToken(); + if(string.IsNullOrEmpty(token2)) break; + if(token2 == "{") scopelevel++; + if(token2 == "}") scopelevel--; + } + while(scopelevel > 0); } - } - else if(objdeclaration == "$gzdb_skip") //mxd - { break; } - else - { - // Unknown structure! - // Best we can do now is just find the first { and then - // follow the scopes until the matching } is found - string token2; - do - { - if(!SkipWhitespace(true)) break; - token2 = ReadToken(); - if(string.IsNullOrEmpty(token2)) break; - } - while(token2 != "{"); - int scopelevel = 1; - do - { - if(!SkipWhitespace(true)) break; - token2 = ReadToken(); - if(string.IsNullOrEmpty(token2)) break; - if(token2 == "{") scopelevel++; - if(token2 == "}") scopelevel--; - } - while(scopelevel > 0); - } } } @@ -224,10 +236,7 @@ namespace CodeImp.DoomBuilder.ZDoom public ActorStructure GetActorByName(string name) { name = name.ToLowerInvariant(); - if(actors.ContainsKey(name)) - return actors[name]; - else - return null; + return actors.ContainsKey(name) ? actors[name] : null; } /// <summary> @@ -235,12 +244,8 @@ namespace CodeImp.DoomBuilder.ZDoom /// </summary> public ActorStructure GetActorByDoomEdNum(int doomednum) { - ICollection<ActorStructure> collection = actors.Values; - foreach(ActorStructure a in collection) - { - if(a.DoomEdNum == doomednum) - return a; - } + foreach(ActorStructure a in actors.Values) + if(a.DoomEdNum == doomednum) return a; return null; } @@ -251,6 +256,12 @@ namespace CodeImp.DoomBuilder.ZDoom name = name.ToLowerInvariant(); return (archivedactors.ContainsKey(name) ? archivedactors[name] : null); } + + //mxd + protected override string GetLanguageType() + { + return "DECORATE"; + } #endregion } diff --git a/Source/Core/ZDoom/PatchStructure.cs b/Source/Core/ZDoom/PatchStructure.cs index fac249b72..c036d2857 100644 --- a/Source/Core/ZDoom/PatchStructure.cs +++ b/Source/Core/ZDoom/PatchStructure.cs @@ -83,7 +83,7 @@ namespace CodeImp.DoomBuilder.ZDoom // First token is the class name parser.SkipWhitespace(true); - name = parser.StripTokenQuotes(parser.ReadToken()); + name = parser.StripTokenQuotes(parser.ReadToken(false)); //mxd. Don't skip newline if(string.IsNullOrEmpty(name)) { parser.ReportError("Expected patch name"); @@ -163,36 +163,36 @@ namespace CodeImp.DoomBuilder.ZDoom break; case "rotate": - if (!ReadTokenInt(parser, token, out rotation)) return; + if(!ReadTokenInt(parser, token, out rotation)) return; rotation = rotation % 360; //Coalesce multiples - if (rotation < 0) rotation += 360; //Force positive + if(rotation < 0) rotation += 360; //Force positive - if (rotation != 0 && rotation != 90 && rotation != 180 && rotation != 270) + if(rotation != 0 && rotation != 90 && rotation != 180 && rotation != 270) { - General.ErrorLogger.Add(ErrorType.Warning, "Got unsupported rotation (" + rotation + ") in patch " + name); + parser.LogWarning("Got unsupported rotation (" + rotation + ") in patch '" + name + "'"); rotation = 0; } break; case "style": //mxd string s; - if (!ReadTokenString(parser, token, out s)) return; + if(!ReadTokenString(parser, token, out s)) return; int index = Array.IndexOf(renderStyles, s.ToLowerInvariant()); renderStyle = index == -1 ? TexturePathRenderStyle.Copy : (TexturePathRenderStyle) index; break; case "blend": //mxd int val; - if (!ReadTokenColor(parser, token, out val)) return; + if(!ReadTokenColor(parser, token, out val)) return; blendColor = PixelColor.FromInt(val); parser.SkipWhitespace(false); token = parser.ReadToken(); - if (token == ",") //read tint ammount + if(token == ",") //read tint ammount { parser.SkipWhitespace(false); - if (!ReadTokenFloat(parser, token, out tintAmmount)) return; + if(!ReadTokenFloat(parser, token, out tintAmmount)) return; tintAmmount = General.Clamp(tintAmmount, 0.0f, 1.0f); blendStyle = TexturePathBlendStyle.Tint; } @@ -278,6 +278,7 @@ namespace CodeImp.DoomBuilder.ZDoom parser.ReportError("Expected a value for property '" + propertyname + "'"); return false; } + return true; } @@ -306,7 +307,8 @@ namespace CodeImp.DoomBuilder.ZDoom { parser.ReportError("Expected color value for property '" + propertyname + "'"); return false; - } + } + return true; } diff --git a/Source/Core/ZDoom/ReverbsParser.cs b/Source/Core/ZDoom/ReverbsParser.cs index 09ffe67ac..5186a0de7 100644 --- a/Source/Core/ZDoom/ReverbsParser.cs +++ b/Source/Core/ZDoom/ReverbsParser.cs @@ -47,7 +47,7 @@ namespace CodeImp.DoomBuilder.ZDoom if(string.IsNullOrEmpty(name)) { - ReportError("Got empty sound environment name!"); + ReportError("Got empty sound environment name"); break; } @@ -57,7 +57,7 @@ namespace CodeImp.DoomBuilder.ZDoom int arg1; if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out arg1)) { - ReportError("Failed to parse the first part of '" + name + "' sound environment ID!"); + ReportError("Failed to parse the first part of '" + name + "' sound environment ID"); break; } @@ -67,7 +67,7 @@ namespace CodeImp.DoomBuilder.ZDoom int arg2; if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out arg2)) { - ReportError("Failed to parse the second part of '" + name + "' sound environment ID!"); + ReportError("Failed to parse the second part of '" + name + "' sound environment ID"); break; } @@ -75,7 +75,7 @@ namespace CodeImp.DoomBuilder.ZDoom int combinedindex = combinedargs.IndexOf(combined); if(combinedindex != -1) { - General.ErrorLogger.Add(ErrorType.Warning, "'" + names[combinedindex] + "' and '" + name + "' sound environments share the same ID (" + arg1 + " " + arg2 + ")!"); + LogWarning("'" + names[combinedindex] + "' and '" + name + "' sound environments share the same ID (" + arg1 + " " + arg2 + ")"); } else { @@ -84,7 +84,7 @@ namespace CodeImp.DoomBuilder.ZDoom // Add to collections if(names.Contains(name)) { - General.ErrorLogger.Add(ErrorType.Warning, "'" + name + "' sound environment is double-defined in '" + sourcefilename + "'!"); + LogWarning("'" + name + "' sound environment is double-defined in '" + sourcefilename + "'"); int index = names.IndexOf(name); firstargs[index] = arg1; secondargs[index] = arg2; @@ -119,5 +119,10 @@ namespace CodeImp.DoomBuilder.ZDoom return result; } + + protected override string GetLanguageType() + { + return "REVERBS"; + } } } diff --git a/Source/Core/ZDoom/SndSeqParser.cs b/Source/Core/ZDoom/SndSeqParser.cs index 791914522..3459884bd 100644 --- a/Source/Core/ZDoom/SndSeqParser.cs +++ b/Source/Core/ZDoom/SndSeqParser.cs @@ -86,6 +86,11 @@ namespace CodeImp.DoomBuilder.ZDoom return result; } + protected override string GetLanguageType() + { + return "SNDSEQ"; + } + #endregion } } \ No newline at end of file diff --git a/Source/Core/ZDoom/StateStructure.cs b/Source/Core/ZDoom/StateStructure.cs index 7d53b7a54..18f79caf3 100644 --- a/Source/Core/ZDoom/StateStructure.cs +++ b/Source/Core/ZDoom/StateStructure.cs @@ -32,9 +32,9 @@ namespace CodeImp.DoomBuilder.ZDoom #region ================== Variables // All we care about is the first sprite in the sequence - private List<string> sprites; - private StateGoto gotostate; - private DecorateParser parser; + private readonly List<string> sprites; + private readonly StateGoto gotostate; + private readonly DecorateParser parser; #endregion @@ -77,20 +77,21 @@ namespace CodeImp.DoomBuilder.ZDoom else if(token == ":") { // Rewind so that this label can be read again - parser.DataStream.Seek(-(lasttoken.Length + 1), SeekOrigin.Current); + if(!string.IsNullOrEmpty(lasttoken)) + parser.DataStream.Seek(-(lasttoken.Length + 1), SeekOrigin.Current); // Done here return; } //mxd. Start of inner scope? - else if (token == "{") + else if(token == "{") { int bracelevel = 1; while(!string.IsNullOrEmpty(token) && bracelevel > 0) { parser.SkipWhitespace(false); token = parser.ReadToken(); - switch (token) + switch(token) { case "{": bracelevel++; break; case "}": bracelevel--; break; @@ -143,7 +144,7 @@ namespace CodeImp.DoomBuilder.ZDoom spritename = spritename.ToUpperInvariant(); // Ignore some odd ZDoom things - if (!spritename.StartsWith("TNT1") && !spritename.StartsWith("----") && !spritename.Contains("#")) + if(!spritename.StartsWith("TNT1") && !spritename.StartsWith("----") && !spritename.Contains("#")) sprites.Add(spritename); } @@ -202,10 +203,7 @@ namespace CodeImp.DoomBuilder.ZDoom private string GetSprite(int index, List<StateStructure> prevstates) { // If we have sprite of our own, see if we can return this index - if(index < sprites.Count) - { - return sprites[index]; - } + if(index < sprites.Count) return sprites[index]; // Otherwise, continue searching where goto tells us to go if(gotostate != null) diff --git a/Source/Core/ZDoom/TextureStructure.cs b/Source/Core/ZDoom/TextureStructure.cs index 4dddc6cdf..63ffb76b3 100644 --- a/Source/Core/ZDoom/TextureStructure.cs +++ b/Source/Core/ZDoom/TextureStructure.cs @@ -84,20 +84,20 @@ namespace CodeImp.DoomBuilder.ZDoom // There should be 3 tokens separated by 2 commas now: // Name, Width, Height - // First token is the class name + // First token is the texture name parser.SkipWhitespace(true); - name = parser.StripTokenQuotes(parser.ReadToken()); + name = parser.StripTokenQuotes(parser.ReadToken(false)); //mxd. Don't skip newline //mxd. It can also be "optional" keyword. if(name.ToLowerInvariant() == "optional") { parser.SkipWhitespace(true); - name = parser.StripTokenQuotes(parser.ReadToken()); + name = parser.StripTokenQuotes(parser.ReadToken(false)); //mxd. Don't skip newline } if(string.IsNullOrEmpty(name)) { - parser.ReportError("Expected texture or sprite name"); + parser.ReportError("Expected " + typename + " name"); return; } @@ -153,14 +153,14 @@ namespace CodeImp.DoomBuilder.ZDoom string token = parser.ReadToken(); token = token.ToLowerInvariant(); - switch (token) + switch(token) { case "xscale": - if (!ReadTokenFloat(parser, token, out xscale)) return; + if(!ReadTokenFloat(parser, token, out xscale)) return; break; case "yscale": - if (!ReadTokenFloat(parser, token, out yscale)) return; + if(!ReadTokenFloat(parser, token, out yscale)) return; break; case "worldpanning": @@ -169,25 +169,25 @@ namespace CodeImp.DoomBuilder.ZDoom case "offset": // Read x offset - if (!ReadTokenInt(parser, token, out xoffset)) return; + if(!ReadTokenInt(parser, token, out xoffset)) return; // Now we should find a comma parser.SkipWhitespace(true); tokenstr = parser.ReadToken(); - if (tokenstr != ",") + if(tokenstr != ",") { parser.ReportError("Expected a comma"); return; } // Read y offset - if (!ReadTokenInt(parser, token, out yoffset)) return; + if(!ReadTokenInt(parser, token, out yoffset)) return; break; case "patch": // Read patch structure PatchStructure pt = new PatchStructure(parser); - if (parser.HasError) break; + if(parser.HasError) break; //mxd. Let's ignore TNT1A0 if(pt.Name == IGNORE_SPRITE) break; diff --git a/Source/Core/ZDoom/TexturesParser.cs b/Source/Core/ZDoom/TexturesParser.cs index c9ec99074..7f62efe5e 100644 --- a/Source/Core/ZDoom/TexturesParser.cs +++ b/Source/Core/ZDoom/TexturesParser.cs @@ -46,9 +46,9 @@ namespace CodeImp.DoomBuilder.ZDoom #region ================== Properties - public ICollection<TextureStructure> Textures { get { return textures.Values; } } - public ICollection<TextureStructure> Flats { get { return flats.Values; } } - public ICollection<TextureStructure> Sprites { get { return sprites.Values; } } + public IEnumerable<TextureStructure> Textures { get { return textures.Values; } } + public IEnumerable<TextureStructure> Flats { get { return flats.Values; } } + public IEnumerable<TextureStructure> Sprites { get { return sprites.Values; } } #endregion @@ -89,104 +89,139 @@ namespace CodeImp.DoomBuilder.ZDoom if(!string.IsNullOrEmpty(objdeclaration)) { objdeclaration = objdeclaration.ToLowerInvariant(); - if(objdeclaration == "texture") + switch(objdeclaration) { - // Read texture structure - TextureStructure tx = new TextureStructure(this, "texture", virtualpath); - if(this.HasError) break; - - // if a limit for the texture name length is set make sure that it's not exceeded - if(tx.Name.Length > General.Map.Config.MaxTextureNameLength) - { - General.ErrorLogger.Add(ErrorType.Error, "Texture name \"" + tx.Name + "\" too long. Texture names must have a length of " + General.Map.Config.MaxTextureNameLength + " characters or less"); - } - else + case "texture": { + // Read texture structure + TextureStructure tx = new TextureStructure(this, "texture", virtualpath); + if(this.HasError) return false; + + // if a limit for the texture name length is set make sure that it's not exceeded + if(tx.Name.Length > General.Map.Config.MaxTextureNameLength) + { + ReportError("Texture name \"" + tx.Name + "\" too long. Texture names must have a length of " + General.Map.Config.MaxTextureNameLength + " characters or less"); + return false; + } + + //mxd. Can't load image without name + if(string.IsNullOrEmpty(tx.Name)) + { + ReportError("Can't load an unnamed texture. Please consider giving names to your resources."); + return false; + } + // Add the texture textures[tx.Name] = tx; if(!General.Map.Config.MixTexturesFlats) flats[tx.Name] = tx; //mxd. If MixTexturesFlats is set, textures and flats will be mixed in DataManager anyway } - } - else if(objdeclaration == "sprite") - { - // Read sprite structure - TextureStructure tx = new TextureStructure(this, "sprite", virtualpath); - if(this.HasError) break; + break; - // if a limit for the sprite name length is set make sure that it's not exceeded - if(tx.Name.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH) - { - General.ErrorLogger.Add(ErrorType.Error, "Sprite name \"" + tx.Name + "\" too long. Sprite names must have a length of " + DataManager.CLASIC_IMAGE_NAME_LENGTH + " characters or less"); - } - else + case "sprite": { + // Read sprite structure + TextureStructure tx = new TextureStructure(this, "sprite", virtualpath); + if(this.HasError) return false; + + // if a limit for the sprite name length is set make sure that it's not exceeded + if(tx.Name.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH) + { + ReportError("Sprite name \"" + tx.Name + "\" too long. Sprite names must have a length of " + DataManager.CLASIC_IMAGE_NAME_LENGTH + " characters or less"); + return false; + } + + //mxd. Can't load image without name + if(string.IsNullOrEmpty(tx.Name)) + { + ReportError("Can't load an unnamed sprite. Please consider giving names to your resources."); + return false; + } + // Add the sprite sprites[tx.Name] = tx; } - } - else if(objdeclaration == "walltexture") - { - // Read walltexture structure - TextureStructure tx = new TextureStructure(this, "walltexture", virtualpath); - if(this.HasError) break; + break; - // if a limit for the walltexture name length is set make sure that it's not exceeded - if(tx.Name.Length > General.Map.Config.MaxTextureNameLength) - { - General.ErrorLogger.Add(ErrorType.Error, "WallTexture name \"" + tx.Name + "\" too long. WallTexture names must have a length of " + General.Map.Config.MaxTextureNameLength + " characters or less"); - } - else + case "walltexture": { + // Read walltexture structure + TextureStructure tx = new TextureStructure(this, "walltexture", virtualpath); + if(this.HasError) return false; + + // if a limit for the walltexture name length is set make sure that it's not exceeded + if(tx.Name.Length > General.Map.Config.MaxTextureNameLength) + { + ReportError("WallTexture name \"" + tx.Name + "\" too long. WallTexture names must have a length of " + General.Map.Config.MaxTextureNameLength + " characters or less"); + return false; + } + + //mxd. Can't load image without name + if(string.IsNullOrEmpty(tx.Name)) + { + ReportError("Can't load an unnamed WallTexture. Please consider giving names to your resources."); + return false; + } + // Add the walltexture if(!textures.ContainsKey(tx.Name) || (textures[tx.Name].TypeName != "texture")) textures[tx.Name] = tx; } - } - else if(objdeclaration == "flat") - { - // Read flat structure - TextureStructure tx = new TextureStructure(this, "flat", virtualpath); - if(this.HasError) break; + break; - // if a limit for the flat name length is set make sure that it's not exceeded - if(tx.Name.Length > General.Map.Config.MaxTextureNameLength) - { - General.ErrorLogger.Add(ErrorType.Error, "Flat name \"" + tx.Name + "\" too long. Flat names must have a length of " + General.Map.Config.MaxTextureNameLength + " characters or less"); - } - else + case "flat": { + // Read flat structure + TextureStructure tx = new TextureStructure(this, "flat", virtualpath); + if(this.HasError) return false; + + // if a limit for the flat name length is set make sure that it's not exceeded + if(tx.Name.Length > General.Map.Config.MaxTextureNameLength) + { + ReportError("Flat name \"" + tx.Name + "\" too long. Flat names must have a length of " + General.Map.Config.MaxTextureNameLength + " characters or less"); + return false; + } + + //mxd. Can't load image without name + if(string.IsNullOrEmpty(tx.Name)) + { + ReportError("Can't load an unnamed flat. Please consider giving names to your resources."); + return false; + } + // Add the flat if(!flats.ContainsKey(tx.Name) || (flats[tx.Name].TypeName != "texture")) flats[tx.Name] = tx; } - } - else if(objdeclaration == "$gzdb_skip") //mxd - { break; - } - else - { - // Unknown structure! - // Best we can do now is just find the first { and then - // follow the scopes until the matching } is found - string token2; - do - { - if(!SkipWhitespace(true)) break; - token2 = ReadToken(); - if(string.IsNullOrEmpty(token2)) break; - } - while(token2 != "{"); - int scopelevel = 1; - do + + case "$gzdb_skip": break; + + default: { - if(!SkipWhitespace(true)) break; - token2 = ReadToken(); - if(string.IsNullOrEmpty(token2)) break; - if(token2 == "{") scopelevel++; - if(token2 == "}") scopelevel--; + // Unknown structure! + // Best we can do now is just find the first { and then + // follow the scopes until the matching } is found + string token2; + do + { + if(!SkipWhitespace(true)) break; + token2 = ReadToken(); + if(string.IsNullOrEmpty(token2)) break; + } + while(token2 != "{"); + + int scopelevel = 1; + do + { + if(!SkipWhitespace(true)) break; + token2 = ReadToken(); + if(string.IsNullOrEmpty(token2)) break; + if(token2 == "{") scopelevel++; + if(token2 == "}") scopelevel--; + } + while(scopelevel > 0); } - while(scopelevel > 0); + break; } } } @@ -194,6 +229,12 @@ namespace CodeImp.DoomBuilder.ZDoom // Return true when no errors occurred return (ErrorDescription == null); } + + //mxd + protected override string GetLanguageType() + { + return "TEXTURES"; + } #endregion } diff --git a/Source/Core/ZDoom/VoxeldefParser.cs b/Source/Core/ZDoom/VoxeldefParser.cs index 33b338ac3..89a46d42f 100644 --- a/Source/Core/ZDoom/VoxeldefParser.cs +++ b/Source/Core/ZDoom/VoxeldefParser.cs @@ -49,17 +49,15 @@ namespace CodeImp.DoomBuilder.ZDoom if(string.IsNullOrEmpty(token)) { - General.ErrorLogger.Add(ErrorType.Error, "Unable to get voxel model name from '" + sourcefilename + "', line " + GetCurrentLineNumber()); - spriteNames.Clear(); - continue; + ReportError("Expected voxel name"); + return false; } modelName = StripTokenQuotes(token).ToLowerInvariant(); } else if(token == "{") //read the settings { - ModelData mde = new ModelData(); - mde.IsVoxel = true; + ModelData mde = new ModelData { IsVoxel = true }; float scale = 1.0f; float angleoffset = 0; @@ -109,15 +107,16 @@ namespace CodeImp.DoomBuilder.ZDoom token = StripTokenQuotes(ReadToken()); if(token != "=") { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + sourcefilename + " at line " + GetCurrentLineNumber() + ": expected '=', but got '" + token + "'"); - break; + ReportError("expected '=', but got '" + token + "'"); + return false; } token = StripTokenQuotes(ReadToken()); if(!ReadSignedFloat(token, ref angleoffset)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + sourcefilename + " at line " + GetCurrentLineNumber() + ": expected AngleOffset value, but got '" + token + "'"); + ReportError("expected AngleOffset value, but got '" + token + "'"); + return false; } } else if(token == "scale") @@ -127,17 +126,19 @@ namespace CodeImp.DoomBuilder.ZDoom token = StripTokenQuotes(ReadToken()); if(token != "=") { - General.ErrorLogger.Add(ErrorType.Error, "Error in " + sourcefilename + " at line " + GetCurrentLineNumber() + ": expected '=', but got '" + token + "'"); - break; + ReportError("expected '=', but got '" + token + "'"); + return false; } token = StripTokenQuotes(ReadToken()); if(!ReadSignedFloat(token, ref scale)) { // Not numeric! - General.ErrorLogger.Add(ErrorType.Error, "Error in " + sourcefilename + " at line " + GetCurrentLineNumber() + ": expected Scale value, but got '" + token + "'"); + ReportError("expected Scale value, but got '" + token + "'"); + return false; } } + prevToken = token.ToUpperInvariant(); } } @@ -151,5 +152,10 @@ namespace CodeImp.DoomBuilder.ZDoom return entries.Count > 0; } + + protected override string GetLanguageType() + { + return "VOXELDEF"; + } } } diff --git a/Source/Core/ZDoom/ZDTextParser.cs b/Source/Core/ZDoom/ZDTextParser.cs index d677989df..b95331b68 100644 --- a/Source/Core/ZDoom/ZDTextParser.cs +++ b/Source/Core/ZDoom/ZDTextParser.cs @@ -47,7 +47,7 @@ namespace CodeImp.DoomBuilder.ZDoom private int errorline; private string errordesc; private string errorsource; - private long prevstreamposition; //mxd. Text stream position storted before poerforming ReadToken. + private long prevstreamposition; //mxd. Text stream position storted before performing ReadToken. #endregion @@ -213,7 +213,8 @@ namespace CodeImp.DoomBuilder.ZDoom // This reads a token (all sequential non-whitespace characters or a single character) // Returns null when the end of the stream has been reached - protected internal string ReadToken() + protected internal string ReadToken() { return ReadToken(true); } //mxd. Added "multiline" param + protected internal string ReadToken(bool multiline) { //mxd. Return empty string when the end of the stream has been reached if(datastream.Position == datastream.Length) return string.Empty; @@ -228,6 +229,14 @@ namespace CodeImp.DoomBuilder.ZDoom char c = (char)datareader.ReadByte(); while(!IsWhitespace(c) || quotedstring || IsSpecialToken(c)) { + //mxd. Break at newline? + if(!multiline && c == '\r') + { + // Go one character back so line number is correct + datastream.Seek(-1, SeekOrigin.Current); + return token; + } + // Special token? if(!quotedstring && IsSpecialToken(c)) { @@ -418,7 +427,7 @@ namespace CodeImp.DoomBuilder.ZDoom if(token != expectedtoken) { - if(reporterror) General.ErrorLogger.Add(ErrorType.Error, "Error in '" + sourcename + "' at line " + GetCurrentLineNumber() + ": expected '" + expectedtoken + "', but got '" + token + "'"); + if(reporterror) ReportError("expected '" + expectedtoken + "', but got '" + token + "'"); // Rewind so this structure can be read again DataStream.Seek(-token.Length - 1, SeekOrigin.Current); @@ -469,20 +478,39 @@ namespace CodeImp.DoomBuilder.ZDoom errorsource = sourcename; } - //mxd. This reports a warning - protected internal void ReportWarning(string message) + //mxd. This adds a warning to the ErrorLogger + protected internal void LogWarning(string message) { // Add a warning - General.ErrorLogger.Add(ErrorType.Warning, "DECORATE warning in '" + sourcename + "', line " + GetCurrentLineNumber() + ". " + message + "."); + int errline = GetCurrentLineNumber(); + General.ErrorLogger.Add(ErrorType.Warning, GetLanguageType() + " warning in '" + sourcename + + (errline != CompilerError.NO_LINE_NUMBER ? "', line " + (errline + 1) : "'") + ". " + + message + "."); + } + + //mxd. This adds an error to the ErrorLogger + public void LogError() + { + General.ErrorLogger.Add(ErrorType.Error, GetLanguageType() + " error in '" + errorsource + + (errorline != CompilerError.NO_LINE_NUMBER ? "', line " + (errorline + 1) : "'") + ". " + + errordesc + "."); + } + + //mxd + internal void ClearError() + { + errorline = 0; + errordesc = null; + errorsource = null; } //mxd - protected internal int GetCurrentLineNumber() + protected int GetCurrentLineNumber() { long pos = datastream.Position; long finishpos = Math.Min(prevstreamposition, pos); long readpos = 0; - int linenumber = 0; + int linenumber = -1; // Find the line on which we found this error datastream.Seek(0, SeekOrigin.Begin); @@ -498,9 +526,12 @@ namespace CodeImp.DoomBuilder.ZDoom // Return to original position datastream.Seek(pos, SeekOrigin.Begin); - return linenumber; + return Math.Max(linenumber, 0); } - + + //mxd. Language type + protected abstract string GetLanguageType(); + #endregion } } -- GitLab