mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2025-01-18 14:31:50 +00:00
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:
parent
118551c70d
commit
91e1fbbd53
11 changed files with 192 additions and 18 deletions
|
@ -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
|
||||
===============================================================================
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
29
Source/Core/Windows/SectorEditFormUDMF.Designer.cs
generated
29
Source/Core/Windows/SectorEditFormUDMF.Designer.cs
generated
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
91
Source/Core/ZDoom/SndSeqParser.cs
Normal file
91
Source/Core/ZDoom/SndSeqParser.cs
Normal 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
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue