Internal: added SNDSEQ parser.

Sector Edit Form, UDMF: Sound Sequence selector is now a drop-down populated by values parsed from SNDSEQ.
Documentation: updated "(G)ZDoom text lumps support" page.
Updated udmf_zdoom.txt.
This commit is contained in:
MaxED 2015-05-28 13:45:01 +00:00
parent 118551c70d
commit 91e1fbbd53
11 changed files with 192 additions and 18 deletions

View file

@ -119,6 +119,7 @@ Note: All <bool> fields default to false unless mentioned otherwise.
blockhitscan = <bool>; // Line blocks hitscan attacks
locknumber = <int>; // Line special is locked
arg0str = <string>; // Alternate string-based version of arg0
moreids = <string>; // Additional line IDs, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
transparent = <bool>; // true = line is a Strife transparent line (alpha 0.25)
@ -201,6 +202,7 @@ Note: All <bool> fields default to false unless mentioned otherwise.
// sound sequence thing in the sector will override this property.
hidden = <bool>; // if true this sector will not be drawn on the textured automap.
waterzone = <bool>; // Sector is under water and swimmable
moreids = <string>; // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
* Note about dropactors
@ -370,6 +372,9 @@ Added transparent line property (to be folded back to core UDMF standard), and h
Added plane equations for sector slopes. (Please read carefully to ensure proper use!)
Changed language describing the DIALOGUE lump to mention USDF as an option.
1.25 19.04.2015
Added 'moreids' for linedefs and sectors.
===============================================================================
EOF
===============================================================================

View file

@ -50,6 +50,9 @@
<a name="reverbs" id="reverbs"></a>
<h2>REVERBS:</h2>
Sound environment definitions are loaded and can be used in the <a href="features/classic_modes/mode_soundenvironment.html">Sound Environment Mode</a>.
<h2>SNDSEQ:</h2>
Sound Sequence and Sound Sequence Group definitions are loaded and can be selected in the "Sound sequence" drop-down of the Edit Sector window (UDMF only).
<a name="modeldef" id="modeldef"></a>
<h2>MODELDEF:</h2>

View file

@ -953,6 +953,7 @@
<Compile Include="ZDoom\ActorStructure.cs" />
<Compile Include="ZDoom\PatchStructure.cs" />
<Compile Include="ZDoom\ReverbsParser.cs" />
<Compile Include="ZDoom\SndSeqParser.cs" />
<Compile Include="ZDoom\StateGoto.cs" />
<Compile Include="ZDoom\TexturesParser.cs" />
<Compile Include="ZDoom\TextureStructure.cs" />

View file

@ -169,7 +169,6 @@ namespace CodeImp.DoomBuilder.Controls
backbrush = new SolidBrush(SystemColors.Window);
}
}
}
// Draw item
@ -177,8 +176,11 @@ namespace CodeImp.DoomBuilder.Controls
e.Graphics.DrawString(displayname, list.Font, displaybrush, e.Bounds.X, e.Bounds.Y);
//mxd. Dispose brushes
backbrush.Dispose();
displaybrush.Dispose();
if(!this.DesignMode)
{
backbrush.Dispose();
displaybrush.Dispose();
}
}
// List closed

View file

@ -70,6 +70,7 @@ namespace CodeImp.DoomBuilder.Data
private MapInfo mapinfo;
private Dictionary<string, KeyValuePair<int, int>> reverbs; //<name, <arg1, arg2>
private Dictionary<long, GlowingFlatData> glowingflats; // Texture name hash, Glowing Flat Data
private List<string> soundsequences;
// Background loading
private Queue<ImageData> imageque;
@ -115,6 +116,7 @@ namespace CodeImp.DoomBuilder.Data
public MapInfo MapInfo { get { return mapinfo; } }
public Dictionary<string, KeyValuePair<int, int>> Reverbs { get { return reverbs; } }
public Dictionary<long, GlowingFlatData> GlowingFlats { get { return glowingflats; } }
public List<string> SoundSequences { get { return soundsequences; } }
public Playpal Palette { get { return palette; } }
public PreviewManager Previews { get { return previews; } }
@ -161,6 +163,7 @@ namespace CodeImp.DoomBuilder.Data
gldefsentries = new Dictionary<int, DynamicLightData>();
reverbs = new Dictionary<string, KeyValuePair<int, int>>();
glowingflats = new Dictionary<long, GlowingFlatData>();
soundsequences = new List<string>();
// Load special images
missingtexture3d = new ResourceImage("CodeImp.DoomBuilder.Resources.MissingTexture3D.png");
@ -331,6 +334,7 @@ namespace CodeImp.DoomBuilder.Data
//mxd. Load more stuff
LoadReverbs();
LoadSndSeq();
LoadVoxels();
Dictionary<string, List<int>> actorsbyclass = CreateActorsByClassList();
LoadModeldefs(actorsbyclass);
@ -1929,6 +1933,28 @@ namespace CodeImp.DoomBuilder.Data
reverbs = parser.GetReverbs();
}
//mxd. This loads SNDSEQ
private void LoadSndSeq()
{
SndSeqParser parser = new SndSeqParser();
soundsequences.Clear();
foreach(DataReader dr in containers)
{
currentreader = dr;
List<Stream> streams = dr.GetSndSeqData();
// Parse the data
foreach (Stream s in streams)
{
if(s != null) parser.Parse(s, "SNDSEQ");
}
}
currentreader = null;
soundsequences = parser.GetSoundSequences();
}
//mxd
internal MemoryStream LoadFile(string name)
{

View file

@ -176,6 +176,9 @@ namespace CodeImp.DoomBuilder.Data
//mxd
public virtual KeyValuePair<string, Stream> GetVoxeldefData() { return new KeyValuePair<string,Stream>(); }
//mxd. When implemented, this returns the SndSeq lump
public virtual List<Stream> GetSndSeqData() { return new List<Stream>(); }
//mxd
internal virtual MemoryStream LoadFile(string name) { return null; }
internal virtual bool FileExists(string filename) { return false; }

View file

@ -616,6 +616,34 @@ namespace CodeImp.DoomBuilder.Data
#endregion
#region ================== SndSeq
public override List<Stream> GetSndSeqData()
{
// Error when suspended
if(issuspended) throw new Exception("Data reader is suspended");
List<Stream> streams = new List<Stream>();
// Get from wads first
//TODO: is this the correct order?..
foreach(WADReader wr in wads)
{
streams.AddRange(wr.GetSndSeqData());
}
// Then from our own files
string foundfile = FindFirstFile("sndseq", false);
if(!string.IsNullOrEmpty(foundfile) && FileExists(foundfile))
{
streams.Add(LoadFile(foundfile));
}
return streams;
}
#endregion
#region ================== Methods
// This loads the images in this directory

View file

@ -928,6 +928,17 @@ namespace CodeImp.DoomBuilder.Data
return result;
}
//mxd
public override List<Stream> GetSndSeqData()
{
if(issuspended) throw new Exception("Data reader is suspended");
List<Stream> result = new List<Stream>();
Lump lump = file.FindLump("SNDSEQ");
if(lump != null) result.Add(lump.Stream);
return result;
}
//mxd
internal override MemoryStream LoadFile(string name)
{

View file

@ -46,7 +46,6 @@
this.lightColor = new CodeImp.DoomBuilder.GZBuilder.Controls.ColorFieldsControl();
this.brightness = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
this.desaturation = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
this.soundsequence = new System.Windows.Forms.TextBox();
this.gravity = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
this.browseeffect = new System.Windows.Forms.Button();
this.effect = new CodeImp.DoomBuilder.Controls.ActionSelectorControl();
@ -104,6 +103,7 @@
this.cancel = new System.Windows.Forms.Button();
this.apply = new System.Windows.Forms.Button();
this.tooltip = new System.Windows.Forms.ToolTip(this.components);
this.soundsequence = new System.Windows.Forms.ComboBox();
groupaction = new System.Windows.Forms.GroupBox();
groupeffect = new System.Windows.Forms.GroupBox();
label14 = new System.Windows.Forms.Label();
@ -153,6 +153,7 @@
//
groupeffect.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
groupeffect.Controls.Add(this.soundsequence);
groupeffect.Controls.Add(this.resetsoundsequence);
groupeffect.Controls.Add(this.fadeColor);
groupeffect.Controls.Add(this.lightColor);
@ -161,7 +162,6 @@
groupeffect.Controls.Add(label14);
groupeffect.Controls.Add(label9);
groupeffect.Controls.Add(label13);
groupeffect.Controls.Add(this.soundsequence);
groupeffect.Controls.Add(this.gravity);
groupeffect.Controls.Add(label2);
groupeffect.Controls.Add(this.browseeffect);
@ -269,15 +269,6 @@
label13.Text = "Desaturation:";
label13.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// soundsequence
//
this.soundsequence.Location = new System.Drawing.Point(125, 55);
this.soundsequence.Name = "soundsequence";
this.soundsequence.Size = new System.Drawing.Size(325, 20);
this.soundsequence.TabIndex = 2;
this.soundsequence.TextChanged += new System.EventHandler(this.soundsequence_TextChanged);
this.soundsequence.MouseDown += new System.Windows.Forms.MouseEventHandler(this.soundsequence_MouseDown);
//
// gravity
//
this.gravity.AllowDecimal = true;
@ -585,7 +576,7 @@
//
// floorAngleControl
//
this.floorAngleControl.Angle = -360;
this.floorAngleControl.Angle = 0;
this.floorAngleControl.AngleOffset = 90;
this.floorAngleControl.Location = new System.Drawing.Point(6, 132);
this.floorAngleControl.Name = "floorAngleControl";
@ -819,7 +810,7 @@
//
// ceilAngleControl
//
this.ceilAngleControl.Angle = -360;
this.ceilAngleControl.Angle = 0;
this.ceilAngleControl.AngleOffset = 90;
this.ceilAngleControl.Location = new System.Drawing.Point(6, 132);
this.ceilAngleControl.Name = "ceilAngleControl";
@ -1111,6 +1102,16 @@
this.tooltip.InitialDelay = 10;
this.tooltip.ReshowDelay = 100;
//
// soundsequence
//
this.soundsequence.FormattingEnabled = true;
this.soundsequence.Location = new System.Drawing.Point(125, 54);
this.soundsequence.Name = "soundsequence";
this.soundsequence.Size = new System.Drawing.Size(325, 21);
this.soundsequence.TabIndex = 32;
this.soundsequence.MouseDown += new System.Windows.Forms.MouseEventHandler(this.soundsequence_MouseDown);
this.soundsequence.TextChanged += new System.EventHandler(this.soundsequence_TextChanged);
//
// SectorEditFormUDMF
//
this.AcceptButton = this.apply;
@ -1201,7 +1202,6 @@
private System.Windows.Forms.GroupBox groupBox3;
private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox gravity;
private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox desaturation;
private System.Windows.Forms.TextBox soundsequence;
private CodeImp.DoomBuilder.GZBuilder.Controls.ColorFieldsControl fadeColor;
private CodeImp.DoomBuilder.GZBuilder.Controls.ColorFieldsControl lightColor;
private CodeImp.DoomBuilder.Controls.CheckboxArrayControl flags;
@ -1219,5 +1219,6 @@
private System.Windows.Forms.Label labelCeilOffsets;
private System.Windows.Forms.Label labelCeilScale;
private System.Windows.Forms.Button resetsoundsequence;
private System.Windows.Forms.ComboBox soundsequence;
}
}

View file

@ -205,6 +205,10 @@ namespace CodeImp.DoomBuilder.Windows
effect.GeneralizedOptions = General.Map.Config.GenEffectOptions; //mxd
effect.AddInfo(General.Map.Config.SortedSectorEffects.ToArray());
// Fill sound sequences list
soundsequence.Items.Add(NO_SOUND_SEQUENCE);
soundsequence.Items.AddRange(General.Map.Data.SoundSequences.ToArray());
// Initialize custom fields editor
fieldslist.Setup("sector");
@ -806,7 +810,6 @@ namespace CodeImp.DoomBuilder.Windows
private void soundsequence_TextChanged(object sender, EventArgs e)
{
soundsequence.ForeColor = (soundsequence.Text == NO_SOUND_SEQUENCE ? SystemColors.GrayText : SystemColors.WindowText);
resetsoundsequence.Enabled = (soundsequence.Text != NO_SOUND_SEQUENCE);
}

View file

@ -0,0 +1,91 @@
#region ================== Namespaces
using System.Collections.Generic;
using System.IO;
#endregion
namespace CodeImp.DoomBuilder.ZDoom
{
internal sealed class SndSeqParser : ZDTextParser
{
#region ================== Variables
private readonly List<string> sequences;
private readonly List<string> sequencegroups;
private readonly HashSet<string> seqencenames;
#endregion
#region ================== Constructor
public SndSeqParser()
{
specialtokens = "";
sequences = new List<string>();
sequencegroups = new List<string>();
seqencenames = new HashSet<string>();
}
#endregion
#region ================== Parsing
public override bool Parse(Stream stream, string sourcefilename)
{
base.Parse(stream, sourcefilename);
char[] dots = new[] { ':' };
char[] brace = new[] { '[' };
// Continue until at the end of the stream
while(SkipWhitespace(true))
{
string token = ReadToken();
if(!string.IsNullOrEmpty(token))
{
// Sound sequence definition
if(token.StartsWith(":"))
{
string val = token.TrimStart(dots);
if(!string.IsNullOrEmpty(val) && !seqencenames.Contains(val.ToUpper()))
{
sequences.Add(val);
seqencenames.Add(val.ToUpper());
}
}
// Group definition
else if(token.StartsWith("["))
{
string val = token.TrimStart(brace);
if(!string.IsNullOrEmpty(val) && !seqencenames.Contains(val.ToUpper()))
{
sequencegroups.Add(val);
seqencenames.Add(val.ToUpper());
}
}
}
}
return true;
}
internal List<string> GetSoundSequences()
{
List<string> result = new List<string>(sequencegroups.Count + sequences.Count);
// Add to the collection
sequencegroups.Sort();
result.AddRange(sequencegroups);
sequences.Sort();
result.AddRange(sequences);
// Return the collection
return result;
}
#endregion
}
}