UltimateZoneBuilder/Source/Core/ZDoom/ReverbsParser.cs
MaxED 0f7aa9f827 Added, Sector Edit window, UDMF: added UI for sector damage-realted properties.
Added, DECORATE parser: damage types are now parsed.
Added: the editor now reports duplicate textures/flats/patches/sprites/colormaps/voxels in the loaded wads.
Added, all text parsers: added #region/#endregion support.
Added TERRAIN parser.
Added, Script Editor: added special handling for DECORATE special comments.
Added, Sector Edit window, UDMF: Soundsequence value was setup incorrectly when showing the window for multiple sectors with mixed Soundsequence value. 
Fixed, Map Options window: "Strictly load patches between P_START and P_END" was not applied when applying the changes.
Fixed, MAPINFO parser: MapInfo should be treated as defined when a map MAPINFO block corresponding to current map is encountered even if it doesn't define any properties recognized by the editor.
Fixed, all text parsers: in some cases error line was calculated incorrectly when reporting an error detected by a text parser.
Cosmetic: changed ' to " in the rest of Error and Warning messages.
Internal: added text resource tracking.
Updated ZDoom_DECORATE.cfg.
Updated documentation ("Game Configuration - Basic Settings" page).
2016-02-22 12:33:19 +00:00

134 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.Data;
namespace CodeImp.DoomBuilder.ZDoom
{
internal sealed class ReverbsParser : ZDTextParser
{
internal override ScriptType ScriptType { get { return ScriptType.REVERBS; } }
private readonly List<string> names;
private readonly List<int> firstargs;
private readonly List<int> secondargs;
private readonly List<int> combinedargs;
public ReverbsParser()
{
names = new List<string>();
firstargs = new List<int>();
secondargs = new List<int>();
combinedargs = new List<int>();
}
public override bool Parse(TextResourceData data, bool clearerrors)
{
//mxd. Already parsed?
if(!base.AddTextResource(data))
{
if(clearerrors) ClearError();
return true;
}
// Cannot process?
if(!base.Parse(data, clearerrors)) return false;
// Continue until at the end of the stream
while(SkipWhitespace(true))
{
string token = ReadToken();
if(!string.IsNullOrEmpty(token))
{
if(token == "{")
{
// Skip inner properties
do
{
SkipWhitespace(true);
token = ReadToken();
} while(!string.IsNullOrEmpty(token) && token != "}");
}
else
{
//this should be reverb name and args
string name = StripTokenQuotes(token);
if(string.IsNullOrEmpty(name))
{
ReportError("Expected sound environment name");
return false;
}
// Read first part of the ID
SkipWhitespace(true);
token = StripTokenQuotes(ReadToken());
int arg1;
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out arg1))
{
ReportError("Expected first part of \"" + name + "\" sound environment ID, but got \"" + token + "\"");
return false;
}
// Read second part of the ID
SkipWhitespace(true);
token = StripTokenQuotes(ReadToken());
int arg2;
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out arg2))
{
ReportError("Expected second part of \"" + name + "\" sound environment ID, but got \"" + token + "\"");
return false;
}
int combined = arg1 * 1000000 + arg2 * 1000;
int combinedindex = combinedargs.IndexOf(combined);
if(combinedindex != -1)
{
LogWarning("\"" + names[combinedindex] + "\" and \"" + name + "\" sound environments share the same ID (" + arg1 + " " + arg2 + ")");
}
else
{
combinedargs.Add(combined);
// Add to collections
if(names.Contains(name))
{
LogWarning("\"" + name + "\" sound environment is double defined");
int index = names.IndexOf(name);
firstargs[index] = arg1;
secondargs[index] = arg2;
}
else
{
names.Add(name);
firstargs.Add(arg1);
secondargs.Add(arg2);
}
}
}
}
}
return true;
}
internal Dictionary<string, KeyValuePair<int, int>> GetReverbs()
{
string[] sortednames = new string[names.Count];
names.CopyTo(sortednames);
Array.Sort(sortednames);
Dictionary<string, KeyValuePair<int, int>> result = new Dictionary<string, KeyValuePair<int, int>>(names.Count);
foreach(string name in sortednames)
{
int index = names.IndexOf(name);
result.Add(name, new KeyValuePair<int, int>(firstargs[index], secondargs[index]));
}
return result;
}
}
}