From 70d35bf1d62690724267ee72b32f84372bc6c474 Mon Sep 17 00:00:00 2001 From: MaxED Date: Tue, 11 Oct 2016 12:58:35 +0000 Subject: [PATCH] Added, Edit Sectors window: added UI for floor/ceiling portals. Updated ZDoom_DECORATE.cfg. Updated documentation ("Game Configuration - Sectors Settings" page). --- .../Configurations/Includes/ZDoom_common.cfg | 25 + Build/Scripting/ZDoom_DECORATE.cfg | 2 + Documents/udmf_zdoom.txt | 13 + Help/gc_sectorsettings.html | 10 + Source/Core/Config/GameConfiguration.cs | 12 + Source/Core/Controls/SectorInfoPanel.cs | 10 + .../Controls/SectorSlopeControl.Designer.cs | 67 +- Source/Core/IO/ClipboardStreamReader.cs | 10 + Source/Core/IO/ClipboardStreamWriter.cs | 4 + Source/Core/IO/UniversalStreamReader.cs | 8 + Source/Core/IO/UniversalStreamWriter.cs | 4 + Source/Core/Resources/UDMF_UI.cfg | 4 + .../Windows/SectorEditFormUDMF.Designer.cs | 202 +++++- Source/Core/Windows/SectorEditFormUDMF.cs | 196 ++++-- Source/Core/Windows/SectorEditFormUDMF.resx | 30 + .../BuilderModes/ClassicModes/LinedefsMode.cs | 14 +- .../BuilderModes/ClassicModes/SectorsMode.cs | 4 +- .../BuilderModes/ClassicModes/ThingsMode.cs | 14 +- .../BuilderModes/ClassicModes/VerticesMode.cs | 10 +- .../FindReplace/FindSectorFlags.cs | 28 +- .../BuilderModes/General/CopyStructures.cs | 584 ++++++++++-------- .../VisualModes/BaseVisualGeometrySector.cs | 2 +- .../VisualModes/BaseVisualGeometrySidedef.cs | 4 +- .../VisualModes/BaseVisualThing.cs | 2 +- .../VisualModes/BaseVisualVertex.cs | 2 +- 25 files changed, 862 insertions(+), 399 deletions(-) diff --git a/Build/Configurations/Includes/ZDoom_common.cfg b/Build/Configurations/Includes/ZDoom_common.cfg index 34112caf..3c7eb748 100644 --- a/Build/Configurations/Includes/ZDoom_common.cfg +++ b/Build/Configurations/Includes/ZDoom_common.cfg @@ -389,6 +389,31 @@ mapformat_udmf include("UDMF_misc.cfg", "sectorflags"); } + // Sector portal flags (ceiling) + ceilingportalflags + { + portal_ceil_disabled = "Disabled"; + portal_ceil_blocksound = "Block sound"; + portal_ceil_nopass = "Impassable"; + portal_ceil_norender = "Not rendered"; + } + + // Sector portal flags (floor) + floorportalflags + { + portal_floor_disabled = "Disabled"; + portal_floor_blocksound = "Block sound"; + portal_floor_nopass = "Impassable"; + portal_floor_norender = "Not rendered"; + } + + // Sector portal renderstyles + sectorportalrenderstyles + { + translucent = "Translucent"; + additive = "Additive"; + } + // DEFAULT SECTOR BRIGHTNESS LEVELS sectorbrightness { diff --git a/Build/Scripting/ZDoom_DECORATE.cfg b/Build/Scripting/ZDoom_DECORATE.cfg index 357933fb..e2805c55 100644 --- a/Build/Scripting/ZDoom_DECORATE.cfg +++ b/Build/Scripting/ZDoom_DECORATE.cfg @@ -451,6 +451,8 @@ keywords GetZAt = "float GetZAt([float x = 0.0[, float y = 0.0[, float angle = 0.0[, int flags = 0[, int pick_pointer = AAPTR_TARGET]]]]])"; IsPointerEqual = "bool IsPointerEqual(int ptr1, int ptr2)"; OverlayID = "int OverlayID()"; + OverlayX = "float OverlayX([int layer = 0])"; + OverlayY = "float OverlayY([int layer = 0])"; } properties diff --git a/Documents/udmf_zdoom.txt b/Documents/udmf_zdoom.txt index 611a667a..9662af1b 100644 --- a/Documents/udmf_zdoom.txt +++ b/Documents/udmf_zdoom.txt @@ -214,6 +214,19 @@ Note: All fields default to false unless mentioned otherwise. damagehazard = ; // Changes damage model to Strife's delayed damage for the given sector. Default = false. floorterrain = ; // Sets the terrain for the sector's floor. Default = 'use the flat texture's terrain definition.' ceilingterrain = ; // Sets the terrain for the sector's ceiling. Default = 'use the flat texture's terrain definition.' + + portal_ceil_alpha = // translucency of ceiling portal (default is 0 (not visible)) + portal_ceil_blocksound = // ceiling portal blocks sound. + portal_ceil_disabled = // ceiling portal disabled. + portal_ceil_nopass = // ceiling portal blocks movement if true. + portal_ceil_norender = // ceiling portal not rendered. + portal_ceil_overlaytype = // defines translucency style, can either be "translucent" or "additive". Default is "translucent". + portal_floor_alpha = // translucency of floor portal (default is 0 (not visible)) + portal_floor_blocksound = // floor portal blocks sound. + portal_floor_disabled = // floor portal disabled. + portal_floor_nopass = // ceiling portal blocks movement if true. + portal_floor_norender = // ceiling portal not rendered. + portal_floor_overlaytype = // defines translucency style, can either be "translucent" or "additive". Default is "translucent". * Note about dropactors diff --git a/Help/gc_sectorsettings.html b/Help/gc_sectorsettings.html index 42acce68..18143ddd 100644 --- a/Help/gc_sectorsettings.html +++ b/Help/gc_sectorsettings.html @@ -22,6 +22,12 @@ sectorflags (structure) - GZDB only, UDMF only.
Lists the options that can be set on a sector.

+ ceilingportalflags (structure) - GZDB only, UDMF only.
+ Lists the options that can be set on a sector's ceiling portal.
+
+ floorportalflags (structure) - GZDB only, UDMF only.
+ Lists the options that can be set on a sector's floor portal.
+
sectorrenderstyles (structure) - GZDB only, UDMF only.
Lists the renderstyles that can be set on a sector.

@@ -33,6 +39,10 @@ sectorrenderstyles add = "Additive"; } +
+ sectorportalrenderstyles (structure) - GZDB only, UDMF only.
+ Same as sectorrenderstyles, but for floor/ceiling portals.
+
sectorbrightness (structure)
This structure provides Doom Builder with a list of sector brightness levels that are most common. Doom Builder will use these levels to increase/decrease the brightness quickly. The structure must contain numeric setting names for the brightness levels. The settings don't need a value and any value will be ignored by Doom Builder.

diff --git a/Source/Core/Config/GameConfiguration.cs b/Source/Core/Config/GameConfiguration.cs index a15e8647..93f7d7bf 100644 --- a/Source/Core/Config/GameConfiguration.cs +++ b/Source/Core/Config/GameConfiguration.cs @@ -136,11 +136,14 @@ namespace CodeImp.DoomBuilder.Config // Sectors private readonly Dictionary sectorflags; //mxd + private readonly Dictionary ceilportalflags; //mxd + private readonly Dictionary floorportalflags; //mxd private readonly Dictionary sectoreffects; private readonly List sortedsectoreffects; private readonly List geneffectoptions; private readonly StepsList brightnesslevels; private readonly Dictionary sectorrenderstyles; //mxd + private readonly Dictionary sectorportalrenderstyles; //mxd // Universal fields private readonly List linedeffields; @@ -263,11 +266,14 @@ namespace CodeImp.DoomBuilder.Config // Sectors public IDictionary SectorFlags { get { return sectorflags; } } //mxd + public IDictionary CeilingPortalFlags { get { return ceilportalflags; } } //mxd + public IDictionary FloorPortalFlags { get { return floorportalflags; } } //mxd public IDictionary SectorEffects { get { return sectoreffects; } } public List SortedSectorEffects { get { return sortedsectoreffects; } } public List GenEffectOptions { get { return geneffectoptions; } } public StepsList BrightnessLevels { get { return brightnesslevels; } } public Dictionary SectorRenderStyles { get { return sectorrenderstyles; } } //mxd + public Dictionary SectorPortalRenderStyles { get { return sectorportalrenderstyles; } } //mxd // Universal fields public List LinedefFields { get { return linedeffields; } } @@ -314,6 +320,8 @@ namespace CodeImp.DoomBuilder.Config this.sidedefflags = new Dictionary(StringComparer.Ordinal); //mxd this.genactioncategories = new List(); this.sectorflags = new Dictionary(StringComparer.Ordinal); //mxd + this.ceilportalflags = new Dictionary(StringComparer.Ordinal); //mxd + this.floorportalflags = new Dictionary(StringComparer.Ordinal); //mxd this.sectoreffects = new Dictionary(); this.sortedsectoreffects = new List(); this.geneffectoptions = new List(); @@ -330,6 +338,7 @@ namespace CodeImp.DoomBuilder.Config this.makedoorflags = new Dictionary(StringComparer.Ordinal); this.linedefrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd this.sectorrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd + this.sectorportalrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd this.thingrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd this.defaultskytextures = new Dictionary(StringComparer.OrdinalIgnoreCase); //mxd @@ -447,10 +456,13 @@ namespace CodeImp.DoomBuilder.Config // Sectors LoadStringDictionary(sectorflags, "sectorflags"); //mxd + LoadStringDictionary(ceilportalflags, "ceilingportalflags"); //mxd + LoadStringDictionary(floorportalflags, "floorportalflags"); //mxd LoadBrightnessLevels(); LoadSectorEffects(); LoadSectorGeneralizedEffects(); LoadStringDictionary(sectorrenderstyles, "sectorrenderstyles"); //mxd + LoadStringDictionary(sectorportalrenderstyles, "sectorportalrenderstyles"); //mxd // Universal fields linedeffields = LoadUniversalFields("linedef"); diff --git a/Source/Core/Controls/SectorInfoPanel.cs b/Source/Core/Controls/SectorInfoPanel.cs index 2baa6c1f..e114e7b6 100644 --- a/Source/Core/Controls/SectorInfoPanel.cs +++ b/Source/Core/Controls/SectorInfoPanel.cs @@ -306,6 +306,16 @@ namespace CodeImp.DoomBuilder.Controls if(s.Flags.ContainsKey(group.Key) && s.Flags[group.Key]) flags.Items.Add(new ListViewItem(group.Value) { Checked = true }); } + foreach(KeyValuePair group in General.Map.Config.CeilingPortalFlags) + { + if(s.Flags.ContainsKey(group.Key) && s.Flags[group.Key]) + flags.Items.Add(new ListViewItem(group.Value + " (ceil. portal)") { Checked = true }); + } + foreach(KeyValuePair group in General.Map.Config.FloorPortalFlags) + { + if(s.Flags.ContainsKey(group.Key) && s.Flags[group.Key]) + flags.Items.Add(new ListViewItem(group.Value + " (floor portal)") { Checked = true }); + } //mxd. Flags panel visibility and size flagsPanel.Visible = (flags.Items.Count > 0); diff --git a/Source/Core/Controls/SectorSlopeControl.Designer.cs b/Source/Core/Controls/SectorSlopeControl.Designer.cs index 85b8a521..15490ec1 100644 --- a/Source/Core/Controls/SectorSlopeControl.Designer.cs +++ b/Source/Core/Controls/SectorSlopeControl.Designer.cs @@ -35,35 +35,35 @@ this.angletrackbar = new System.Windows.Forms.TrackBar(); this.label1 = new System.Windows.Forms.Label(); this.pivotmodeselector = new System.Windows.Forms.ComboBox(); + this.cbuselineangles = new System.Windows.Forms.CheckBox(); this.rotationcontrol = new CodeImp.DoomBuilder.Controls.AngleControlEx(); this.slopeangle = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); this.sloperotation = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); this.slopeoffset = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); - this.cbuselineangles = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.angletrackbar)).BeginInit(); this.SuspendLayout(); // // label23 // - this.label23.Location = new System.Drawing.Point(3, 83); + this.label23.Location = new System.Drawing.Point(31, 75); this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(76, 14); + this.label23.Size = new System.Drawing.Size(72, 14); this.label23.TabIndex = 28; this.label23.Text = "Slope angle:"; this.label23.TextAlign = System.Drawing.ContentAlignment.TopRight; // // label24 // - this.label24.Location = new System.Drawing.Point(3, 53); + this.label24.Location = new System.Drawing.Point(47, 44); this.label24.Name = "label24"; - this.label24.Size = new System.Drawing.Size(76, 14); + this.label24.Size = new System.Drawing.Size(56, 14); this.label24.TabIndex = 26; this.label24.Text = "Rotation:"; this.label24.TextAlign = System.Drawing.ContentAlignment.TopRight; // // reset // - this.reset.Location = new System.Drawing.Point(85, 138); + this.reset.Location = new System.Drawing.Point(107, 130); this.reset.Name = "reset"; this.reset.Size = new System.Drawing.Size(82, 23); this.reset.TabIndex = 25; @@ -73,9 +73,9 @@ // // label18 // - this.label18.Location = new System.Drawing.Point(3, 113); + this.label18.Location = new System.Drawing.Point(31, 105); this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(76, 14); + this.label18.Size = new System.Drawing.Size(72, 14); this.label18.TabIndex = 23; this.label18.Text = "Height offset:"; this.label18.TextAlign = System.Drawing.ContentAlignment.TopRight; @@ -83,20 +83,20 @@ // angletrackbar // this.angletrackbar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.angletrackbar.Location = new System.Drawing.Point(173, 82); + this.angletrackbar.Location = new System.Drawing.Point(175, 72); this.angletrackbar.Maximum = 85; this.angletrackbar.Minimum = -85; this.angletrackbar.Name = "angletrackbar"; - this.angletrackbar.Size = new System.Drawing.Size(175, 45); + this.angletrackbar.Size = new System.Drawing.Size(113, 45); this.angletrackbar.TabIndex = 57; this.angletrackbar.TickFrequency = 10; this.angletrackbar.ValueChanged += new System.EventHandler(this.angletrackbar_ValueChanged); // // label1 // - this.label1.Location = new System.Drawing.Point(3, 12); + this.label1.Location = new System.Drawing.Point(34, 6); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(76, 14); + this.label1.Size = new System.Drawing.Size(72, 14); this.label1.TabIndex = 58; this.label1.Text = "Pivot:"; this.label1.TextAlign = System.Drawing.ContentAlignment.TopRight; @@ -109,17 +109,30 @@ "World origin", "Selection center", "Sector center"}); - this.pivotmodeselector.Location = new System.Drawing.Point(85, 9); + this.pivotmodeselector.Location = new System.Drawing.Point(107, 3); this.pivotmodeselector.Name = "pivotmodeselector"; this.pivotmodeselector.Size = new System.Drawing.Size(132, 21); this.pivotmodeselector.TabIndex = 59; this.pivotmodeselector.SelectedIndexChanged += new System.EventHandler(this.pivotmodeselector_SelectedIndexChanged); // + // cbuselineangles + // + this.cbuselineangles.AutoSize = true; + this.cbuselineangles.Location = new System.Drawing.Point(175, 44); + this.cbuselineangles.Name = "cbuselineangles"; + this.cbuselineangles.Size = new System.Drawing.Size(113, 17); + this.cbuselineangles.TabIndex = 60; + this.cbuselineangles.Tag = ""; + this.cbuselineangles.Text = "Use linedef angles"; + this.cbuselineangles.UseVisualStyleBackColor = true; + this.cbuselineangles.CheckedChanged += new System.EventHandler(this.cbuselineangles_CheckedChanged); + // // rotationcontrol // this.rotationcontrol.Angle = 0; this.rotationcontrol.AngleOffset = 0; - this.rotationcontrol.Location = new System.Drawing.Point(173, 36); + this.rotationcontrol.DoomAngleClamping = false; + this.rotationcontrol.Location = new System.Drawing.Point(5, 28); this.rotationcontrol.Name = "rotationcontrol"; this.rotationcontrol.Size = new System.Drawing.Size(44, 44); this.rotationcontrol.TabIndex = 56; @@ -136,9 +149,9 @@ this.slopeangle.ButtonStepSmall = 0.1F; this.slopeangle.ButtonStepsUseModifierKeys = true; this.slopeangle.ButtonStepsWrapAround = false; - this.slopeangle.Location = new System.Drawing.Point(85, 78); + this.slopeangle.Location = new System.Drawing.Point(107, 70); this.slopeangle.Name = "slopeangle"; - this.slopeangle.Size = new System.Drawing.Size(82, 24); + this.slopeangle.Size = new System.Drawing.Size(62, 24); this.slopeangle.StepValues = null; this.slopeangle.TabIndex = 29; this.slopeangle.WhenTextChanged += new System.EventHandler(this.slopeangle_WhenTextChanged); @@ -154,9 +167,9 @@ this.sloperotation.ButtonStepSmall = 0.1F; this.sloperotation.ButtonStepsUseModifierKeys = true; this.sloperotation.ButtonStepsWrapAround = false; - this.sloperotation.Location = new System.Drawing.Point(85, 48); + this.sloperotation.Location = new System.Drawing.Point(107, 40); this.sloperotation.Name = "sloperotation"; - this.sloperotation.Size = new System.Drawing.Size(82, 24); + this.sloperotation.Size = new System.Drawing.Size(62, 24); this.sloperotation.StepValues = null; this.sloperotation.TabIndex = 27; this.sloperotation.WhenTextChanged += new System.EventHandler(this.sloperotation_WhenTextChanged); @@ -173,25 +186,13 @@ this.slopeoffset.ButtonStepSmall = 1F; this.slopeoffset.ButtonStepsUseModifierKeys = true; this.slopeoffset.ButtonStepsWrapAround = false; - this.slopeoffset.Location = new System.Drawing.Point(85, 108); + this.slopeoffset.Location = new System.Drawing.Point(107, 100); this.slopeoffset.Name = "slopeoffset"; - this.slopeoffset.Size = new System.Drawing.Size(82, 24); + this.slopeoffset.Size = new System.Drawing.Size(62, 24); this.slopeoffset.StepValues = null; this.slopeoffset.TabIndex = 24; this.slopeoffset.WhenTextChanged += new System.EventHandler(this.slopeoffset_WhenTextChanged); // - // cbuselineangles - // - this.cbuselineangles.AutoSize = true; - this.cbuselineangles.Location = new System.Drawing.Point(226, 52); - this.cbuselineangles.Name = "cbuselineangles"; - this.cbuselineangles.Size = new System.Drawing.Size(113, 17); - this.cbuselineangles.TabIndex = 60; - this.cbuselineangles.Tag = ""; - this.cbuselineangles.Text = "Use linedef angles"; - this.cbuselineangles.UseVisualStyleBackColor = true; - this.cbuselineangles.CheckedChanged += new System.EventHandler(this.cbuselineangles_CheckedChanged); - // // SectorSlopeControl // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); @@ -209,7 +210,7 @@ this.Controls.Add(this.slopeoffset); this.Controls.Add(this.label18); this.Name = "SectorSlopeControl"; - this.Size = new System.Drawing.Size(353, 169); + this.Size = new System.Drawing.Size(298, 160); ((System.ComponentModel.ISupportInitialize)(this.angletrackbar)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); diff --git a/Source/Core/IO/ClipboardStreamReader.cs b/Source/Core/IO/ClipboardStreamReader.cs index e348f789..d6173df2 100644 --- a/Source/Core/IO/ClipboardStreamReader.cs +++ b/Source/Core/IO/ClipboardStreamReader.cs @@ -165,6 +165,16 @@ namespace CodeImp.DoomBuilder.IO if(stringflags.ContainsKey(flag.Key)) continue; stringflags.Add(flag.Key, false); } + foreach(KeyValuePair flag in General.Map.Config.CeilingPortalFlags) + { + if(stringflags.ContainsKey(flag.Key)) continue; + stringflags.Add(flag.Key, false); + } + foreach(KeyValuePair flag in General.Map.Config.FloorPortalFlags) + { + if(stringflags.ContainsKey(flag.Key)) continue; + stringflags.Add(flag.Key, false); + } // Create new item Dictionary fields = ReadCustomFields(reader); diff --git a/Source/Core/IO/ClipboardStreamWriter.cs b/Source/Core/IO/ClipboardStreamWriter.cs index 6c229b93..c3b728ed 100644 --- a/Source/Core/IO/ClipboardStreamWriter.cs +++ b/Source/Core/IO/ClipboardStreamWriter.cs @@ -66,6 +66,10 @@ namespace CodeImp.DoomBuilder.IO //mxd. Add sector flags foreach(KeyValuePair flag in General.Map.Config.SectorFlags) config.WriteSetting("managedfields.sector." + flag.Key, true); + foreach(KeyValuePair flag in General.Map.Config.CeilingPortalFlags) + config.WriteSetting("managedfields.sector." + flag.Key, true); + foreach(KeyValuePair flag in General.Map.Config.FloorPortalFlags) + config.WriteSetting("managedfields.sector." + flag.Key, true); // Add thing flags foreach(KeyValuePair flag in General.Map.Config.ThingFlags) diff --git a/Source/Core/IO/UniversalStreamReader.cs b/Source/Core/IO/UniversalStreamReader.cs index 1474bc76..baac4c6e 100644 --- a/Source/Core/IO/UniversalStreamReader.cs +++ b/Source/Core/IO/UniversalStreamReader.cs @@ -104,6 +104,10 @@ namespace CodeImp.DoomBuilder.IO //mxd. Add sector flags foreach(KeyValuePair flag in General.Map.Config.SectorFlags) config.WriteSetting("managedfields.sector." + flag.Key, true); + foreach(KeyValuePair flag in General.Map.Config.CeilingPortalFlags) + config.WriteSetting("managedfields.sector." + flag.Key, true); + foreach(KeyValuePair flag in General.Map.Config.FloorPortalFlags) + config.WriteSetting("managedfields.sector." + flag.Key, true); // Add thing flags foreach(KeyValuePair flag in General.Map.Config.ThingFlags) @@ -413,6 +417,10 @@ namespace CodeImp.DoomBuilder.IO Dictionary stringflags = new Dictionary(StringComparer.Ordinal); foreach(KeyValuePair flag in General.Map.Config.SectorFlags) stringflags[flag.Key] = GetCollectionEntry(c, flag.Key, false, false, where); + foreach(KeyValuePair flag in General.Map.Config.CeilingPortalFlags) + stringflags[flag.Key] = GetCollectionEntry(c, flag.Key, false, false, where); + foreach(KeyValuePair flag in General.Map.Config.FloorPortalFlags) + stringflags[flag.Key] = GetCollectionEntry(c, flag.Key, false, false, where); // Create new item Sector s = map.CreateSector(); diff --git a/Source/Core/IO/UniversalStreamWriter.cs b/Source/Core/IO/UniversalStreamWriter.cs index 48cc306d..e9a3016e 100644 --- a/Source/Core/IO/UniversalStreamWriter.cs +++ b/Source/Core/IO/UniversalStreamWriter.cs @@ -90,6 +90,10 @@ namespace CodeImp.DoomBuilder.IO //mxd. Add sector flags foreach(KeyValuePair flag in General.Map.Config.SectorFlags) config.WriteSetting("managedfields.sector." + flag.Key, true); + foreach(KeyValuePair flag in General.Map.Config.CeilingPortalFlags) + config.WriteSetting("managedfields.sector." + flag.Key, true); + foreach(KeyValuePair flag in General.Map.Config.FloorPortalFlags) + config.WriteSetting("managedfields.sector." + flag.Key, true); // Add thing flags foreach(KeyValuePair flag in General.Map.Config.ThingFlags) diff --git a/Source/Core/Resources/UDMF_UI.cfg b/Source/Core/Resources/UDMF_UI.cfg index 7598f473..944659af 100644 --- a/Source/Core/Resources/UDMF_UI.cfg +++ b/Source/Core/Resources/UDMF_UI.cfg @@ -64,6 +64,10 @@ uifields leakiness = 0; floorterrain = 2; ceilingterrain = 2; + portal_ceil_alpha = 1; + portal_floor_alpha = 1; + portal_ceil_overlaytype = 2; + portal_floor_overlaytype = 2; } thing diff --git a/Source/Core/Windows/SectorEditFormUDMF.Designer.cs b/Source/Core/Windows/SectorEditFormUDMF.Designer.cs index 8786a591..c78069a2 100644 --- a/Source/Core/Windows/SectorEditFormUDMF.Designer.cs +++ b/Source/Core/Windows/SectorEditFormUDMF.Designer.cs @@ -124,6 +124,18 @@ this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); this.tooltip = new System.Windows.Forms.ToolTip(this.components); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.ceilportalrenderstylelabel = new System.Windows.Forms.Label(); + this.ceilportalrenderstyle = new System.Windows.Forms.ComboBox(); + this.label21 = new System.Windows.Forms.Label(); + this.ceilportalalpha = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); + this.ceilportalflags = new CodeImp.DoomBuilder.Controls.CheckboxArrayControl(); + this.groupBox7 = new System.Windows.Forms.GroupBox(); + this.floorportalflags = new CodeImp.DoomBuilder.Controls.CheckboxArrayControl(); + this.label22 = new System.Windows.Forms.Label(); + this.floorportalalpha = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); + this.floorportalrenderstylelabel = new System.Windows.Forms.Label(); + this.floorportalrenderstyle = new System.Windows.Forms.ComboBox(); groupaction = new System.Windows.Forms.GroupBox(); groupeffect = new System.Windows.Forms.GroupBox(); label14 = new System.Windows.Forms.Label(); @@ -154,6 +166,8 @@ this.groupBox4.SuspendLayout(); this.tabcomment.SuspendLayout(); this.tabcustom.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.groupBox7.SuspendLayout(); this.SuspendLayout(); // // groupaction @@ -550,7 +564,7 @@ this.tabs.Location = new System.Drawing.Point(10, 10); this.tabs.Margin = new System.Windows.Forms.Padding(1); this.tabs.Name = "tabs"; - this.tabs.Padding = new System.Drawing.Point(24, 3); + this.tabs.Padding = new System.Drawing.Point(20, 3); this.tabs.SelectedIndex = 0; this.tabs.Size = new System.Drawing.Size(511, 504); this.tabs.TabIndex = 1; @@ -803,7 +817,7 @@ // // floorAngleControl // - this.floorAngleControl.Angle = 0; + this.floorAngleControl.Angle = -270; this.floorAngleControl.AngleOffset = 90; this.floorAngleControl.DoomAngleClamping = false; this.floorAngleControl.Location = new System.Drawing.Point(6, 156); @@ -1084,7 +1098,7 @@ // // ceilAngleControl // - this.ceilAngleControl.Angle = 0; + this.ceilAngleControl.Angle = -270; this.ceilAngleControl.AngleOffset = 90; this.ceilAngleControl.DoomAngleClamping = false; this.ceilAngleControl.Location = new System.Drawing.Point(6, 156); @@ -1261,6 +1275,8 @@ // // tabslopes // + this.tabslopes.Controls.Add(this.groupBox7); + this.tabslopes.Controls.Add(this.groupBox6); this.tabslopes.Controls.Add(this.groupBox5); this.tabslopes.Controls.Add(this.groupBox4); this.tabslopes.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -1268,7 +1284,7 @@ this.tabslopes.Name = "tabslopes"; this.tabslopes.Size = new System.Drawing.Size(503, 478); this.tabslopes.TabIndex = 3; - this.tabslopes.Text = "Slopes"; + this.tabslopes.Text = "Slopes / Portals"; this.tabslopes.UseVisualStyleBackColor = true; // // groupBox5 @@ -1276,16 +1292,16 @@ this.groupBox5.Controls.Add(this.floorslopecontrol); this.groupBox5.Location = new System.Drawing.Point(3, 239); this.groupBox5.Name = "groupBox5"; - this.groupBox5.Size = new System.Drawing.Size(497, 230); + this.groupBox5.Size = new System.Drawing.Size(298, 230); this.groupBox5.TabIndex = 1; this.groupBox5.TabStop = false; - this.groupBox5.Text = " Floor "; + this.groupBox5.Text = " Floor slope "; // // floorslopecontrol // - this.floorslopecontrol.Location = new System.Drawing.Point(6, 19); + this.floorslopecontrol.Location = new System.Drawing.Point(4, 19); this.floorslopecontrol.Name = "floorslopecontrol"; - this.floorslopecontrol.Size = new System.Drawing.Size(431, 178); + this.floorslopecontrol.Size = new System.Drawing.Size(290, 178); this.floorslopecontrol.TabIndex = 0; this.floorslopecontrol.UseLineAngles = false; this.floorslopecontrol.OnUseLineAnglesChanged += new System.EventHandler(this.floorslopecontrol_OnUseLineAnglesChanged); @@ -1298,16 +1314,16 @@ this.groupBox4.Controls.Add(this.ceilingslopecontrol); this.groupBox4.Location = new System.Drawing.Point(3, 3); this.groupBox4.Name = "groupBox4"; - this.groupBox4.Size = new System.Drawing.Size(497, 230); + this.groupBox4.Size = new System.Drawing.Size(298, 230); this.groupBox4.TabIndex = 0; this.groupBox4.TabStop = false; - this.groupBox4.Text = " Ceiling "; + this.groupBox4.Text = " Ceiling slope "; // // ceilingslopecontrol // - this.ceilingslopecontrol.Location = new System.Drawing.Point(6, 19); + this.ceilingslopecontrol.Location = new System.Drawing.Point(4, 19); this.ceilingslopecontrol.Name = "ceilingslopecontrol"; - this.ceilingslopecontrol.Size = new System.Drawing.Size(431, 178); + this.ceilingslopecontrol.Size = new System.Drawing.Size(290, 178); this.ceilingslopecontrol.TabIndex = 1; this.ceilingslopecontrol.UseLineAngles = false; this.ceilingslopecontrol.OnUseLineAnglesChanged += new System.EventHandler(this.ceilingslopecontrol_OnUseLineAnglesChanged); @@ -1396,6 +1412,154 @@ this.tooltip.InitialDelay = 10; this.tooltip.ReshowDelay = 100; // + // groupBox6 + // + this.groupBox6.Controls.Add(this.ceilportalflags); + this.groupBox6.Controls.Add(this.label21); + this.groupBox6.Controls.Add(this.ceilportalalpha); + this.groupBox6.Controls.Add(this.ceilportalrenderstylelabel); + this.groupBox6.Controls.Add(this.ceilportalrenderstyle); + this.groupBox6.Location = new System.Drawing.Point(307, 3); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(193, 230); + this.groupBox6.TabIndex = 2; + this.groupBox6.TabStop = false; + this.groupBox6.Text = " Ceiling portal "; + // + // ceilportalrenderstylelabel + // + this.ceilportalrenderstylelabel.Location = new System.Drawing.Point(6, 26); + this.ceilportalrenderstylelabel.Name = "ceilportalrenderstylelabel"; + this.ceilportalrenderstylelabel.Size = new System.Drawing.Size(72, 14); + this.ceilportalrenderstylelabel.TabIndex = 56; + this.ceilportalrenderstylelabel.Tag = ""; + this.ceilportalrenderstylelabel.Text = "Render style:"; + this.ceilportalrenderstylelabel.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // ceilportalrenderstyle + // + this.ceilportalrenderstyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.ceilportalrenderstyle.FormattingEnabled = true; + this.ceilportalrenderstyle.Location = new System.Drawing.Point(84, 22); + this.ceilportalrenderstyle.Name = "ceilportalrenderstyle"; + this.ceilportalrenderstyle.Size = new System.Drawing.Size(103, 21); + this.ceilportalrenderstyle.TabIndex = 55; + // + // label21 + // + this.label21.Location = new System.Drawing.Point(6, 54); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(72, 14); + this.label21.TabIndex = 58; + this.label21.Tag = ""; + this.label21.Text = "Alpha:"; + this.label21.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // ceilportalalpha + // + this.ceilportalalpha.AllowDecimal = true; + this.ceilportalalpha.AllowNegative = false; + this.ceilportalalpha.AllowRelative = false; + this.ceilportalalpha.ButtonStep = 1; + this.ceilportalalpha.ButtonStepBig = 0.25F; + this.ceilportalalpha.ButtonStepFloat = 0.1F; + this.ceilportalalpha.ButtonStepSmall = 0.01F; + this.ceilportalalpha.ButtonStepsUseModifierKeys = true; + this.ceilportalalpha.ButtonStepsWrapAround = false; + this.ceilportalalpha.Location = new System.Drawing.Point(84, 49); + this.ceilportalalpha.Name = "ceilportalalpha"; + this.ceilportalalpha.Size = new System.Drawing.Size(62, 24); + this.ceilportalalpha.StepValues = null; + this.ceilportalalpha.TabIndex = 57; + this.ceilportalalpha.Tag = ""; + // + // ceilportalflags + // + this.ceilportalflags.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ceilportalflags.AutoScroll = true; + this.ceilportalflags.Columns = 2; + this.ceilportalflags.Location = new System.Drawing.Point(6, 79); + this.ceilportalflags.Name = "ceilportalflags"; + this.ceilportalflags.Size = new System.Drawing.Size(181, 145); + this.ceilportalflags.TabIndex = 59; + this.ceilportalflags.VerticalSpacing = 1; + // + // groupBox7 + // + this.groupBox7.Controls.Add(this.floorportalflags); + this.groupBox7.Controls.Add(this.label22); + this.groupBox7.Controls.Add(this.floorportalalpha); + this.groupBox7.Controls.Add(this.floorportalrenderstylelabel); + this.groupBox7.Controls.Add(this.floorportalrenderstyle); + this.groupBox7.Location = new System.Drawing.Point(307, 239); + this.groupBox7.Name = "groupBox7"; + this.groupBox7.Size = new System.Drawing.Size(193, 230); + this.groupBox7.TabIndex = 60; + this.groupBox7.TabStop = false; + this.groupBox7.Text = " Floor portal "; + // + // floorportalflags + // + this.floorportalflags.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.floorportalflags.AutoScroll = true; + this.floorportalflags.Columns = 2; + this.floorportalflags.Location = new System.Drawing.Point(6, 79); + this.floorportalflags.Name = "floorportalflags"; + this.floorportalflags.Size = new System.Drawing.Size(181, 145); + this.floorportalflags.TabIndex = 59; + this.floorportalflags.VerticalSpacing = 1; + // + // label22 + // + this.label22.Location = new System.Drawing.Point(6, 54); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(72, 14); + this.label22.TabIndex = 58; + this.label22.Tag = ""; + this.label22.Text = "Alpha:"; + this.label22.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // floorportalalpha + // + this.floorportalalpha.AllowDecimal = true; + this.floorportalalpha.AllowNegative = false; + this.floorportalalpha.AllowRelative = false; + this.floorportalalpha.ButtonStep = 1; + this.floorportalalpha.ButtonStepBig = 0.25F; + this.floorportalalpha.ButtonStepFloat = 0.1F; + this.floorportalalpha.ButtonStepSmall = 0.01F; + this.floorportalalpha.ButtonStepsUseModifierKeys = true; + this.floorportalalpha.ButtonStepsWrapAround = false; + this.floorportalalpha.Location = new System.Drawing.Point(84, 49); + this.floorportalalpha.Name = "floorportalalpha"; + this.floorportalalpha.Size = new System.Drawing.Size(62, 24); + this.floorportalalpha.StepValues = null; + this.floorportalalpha.TabIndex = 57; + this.floorportalalpha.Tag = ""; + // + // floorportalrenderstylelabel + // + this.floorportalrenderstylelabel.Location = new System.Drawing.Point(6, 26); + this.floorportalrenderstylelabel.Name = "floorportalrenderstylelabel"; + this.floorportalrenderstylelabel.Size = new System.Drawing.Size(72, 14); + this.floorportalrenderstylelabel.TabIndex = 56; + this.floorportalrenderstylelabel.Tag = ""; + this.floorportalrenderstylelabel.Text = "Render style:"; + this.floorportalrenderstylelabel.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // floorportalrenderstyle + // + this.floorportalrenderstyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.floorportalrenderstyle.FormattingEnabled = true; + this.floorportalrenderstyle.Location = new System.Drawing.Point(84, 22); + this.floorportalrenderstyle.Name = "floorportalrenderstyle"; + this.floorportalrenderstyle.Size = new System.Drawing.Size(103, 21); + this.floorportalrenderstyle.TabIndex = 55; + // // SectorEditFormUDMF // this.AcceptButton = this.apply; @@ -1436,6 +1600,8 @@ this.groupBox4.ResumeLayout(false); this.tabcomment.ResumeLayout(false); this.tabcustom.ResumeLayout(false); + this.groupBox6.ResumeLayout(false); + this.groupBox7.ResumeLayout(false); this.ResumeLayout(false); } @@ -1522,5 +1688,17 @@ private System.Windows.Forms.ComboBox damagetype; private System.Windows.Forms.Button resetfloorterrain; private System.Windows.Forms.Button resetceilterrain; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.Label ceilportalrenderstylelabel; + private System.Windows.Forms.ComboBox ceilportalrenderstyle; + private System.Windows.Forms.Label label21; + private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox ceilportalalpha; + private CodeImp.DoomBuilder.Controls.CheckboxArrayControl ceilportalflags; + private System.Windows.Forms.GroupBox groupBox7; + private CodeImp.DoomBuilder.Controls.CheckboxArrayControl floorportalflags; + private System.Windows.Forms.Label label22; + private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox floorportalalpha; + private System.Windows.Forms.Label floorportalrenderstylelabel; + private System.Windows.Forms.ComboBox floorportalrenderstyle; } } \ No newline at end of file diff --git a/Source/Core/Windows/SectorEditFormUDMF.cs b/Source/Core/Windows/SectorEditFormUDMF.cs index 62182325..29b0725b 100644 --- a/Source/Core/Windows/SectorEditFormUDMF.cs +++ b/Source/Core/Windows/SectorEditFormUDMF.cs @@ -36,7 +36,8 @@ namespace CodeImp.DoomBuilder.Windows private bool preventchanges; //mxd private bool undocreated; //mxd private StepsList anglesteps; //mxd - private readonly string[] renderstyles; //mxd + private readonly List renderstyles; //mxd + private readonly List portalrenderstyles; //mxd //mxd. Persistent settings private static bool linkCeilingScale; @@ -187,19 +188,60 @@ namespace CodeImp.DoomBuilder.Windows flags.Add(lf.Value, lf.Key); flags.Enabled = General.Map.Config.SectorFlags.Count > 0; + // Fill floor protal flags list + foreach(KeyValuePair lf in General.Map.Config.FloorPortalFlags) + floorportalflags.Add(lf.Value, lf.Key); + floorportalflags.Enabled = General.Map.Config.FloorPortalFlags.Count > 0; + + // Fill ceiling protal flags list + foreach(KeyValuePair lf in General.Map.Config.CeilingPortalFlags) + ceilportalflags.Add(lf.Value, lf.Key); + ceilportalflags.Enabled = General.Map.Config.CeilingPortalFlags.Count > 0; + // Setup renderstyles - renderstyles = new string[General.Map.Config.SectorRenderStyles.Count]; - General.Map.Config.SectorRenderStyles.Keys.CopyTo(renderstyles, 0); - floorRenderStyle.Enabled = (General.Map.Config.SectorRenderStyles.Count > 0); - labelfloorrenderstyle.Enabled = (General.Map.Config.SectorRenderStyles.Count > 0); - ceilRenderStyle.Enabled = (General.Map.Config.SectorRenderStyles.Count > 0); - labelceilrenderstyle.Enabled = (General.Map.Config.SectorRenderStyles.Count > 0); + if(General.Map.Config.SectorRenderStyles.Count > 0) + { + string[] rskeys = new string[General.Map.Config.SectorRenderStyles.Count]; + General.Map.Config.SectorRenderStyles.Keys.CopyTo(rskeys, 0); + renderstyles = new List(rskeys); + } + else + { + renderstyles = new List(); + } + floorRenderStyle.Enabled = (renderstyles.Count > 0); + labelfloorrenderstyle.Enabled = (renderstyles.Count > 0); + ceilRenderStyle.Enabled = (renderstyles.Count > 0); + labelceilrenderstyle.Enabled = (renderstyles.Count > 0); // Fill renderstyles - foreach(KeyValuePair lf in General.Map.Config.SectorRenderStyles) + foreach(string name in General.Map.Config.SectorRenderStyles.Values) { - floorRenderStyle.Items.Add(lf.Value); - ceilRenderStyle.Items.Add(lf.Value); + floorRenderStyle.Items.Add(name); + ceilRenderStyle.Items.Add(name); + } + + // Setup portal renderstyles + if(General.Map.Config.SectorPortalRenderStyles.Count > 0) + { + string[] rskeys = new string[General.Map.Config.SectorPortalRenderStyles.Count]; + General.Map.Config.SectorPortalRenderStyles.Keys.CopyTo(rskeys, 0); + portalrenderstyles = new List(rskeys); + } + else + { + portalrenderstyles = new List(); + } + floorportalrenderstyle.Enabled = (portalrenderstyles.Count > 0); + floorportalrenderstylelabel.Enabled = (portalrenderstyles.Count > 0); + ceilportalrenderstyle.Enabled = (portalrenderstyles.Count > 0); + ceilportalrenderstylelabel.Enabled = (portalrenderstyles.Count > 0); + + // Fill portal renderstyles + foreach(string name in General.Map.Config.SectorPortalRenderStyles.Values) + { + floorportalrenderstyle.Items.Add(name); + ceilportalrenderstyle.Items.Add(name); } // Fill effects list @@ -277,6 +319,12 @@ namespace CodeImp.DoomBuilder.Windows foreach(CheckBox c in flags.Checkboxes) if(sc.Flags.ContainsKey(c.Tag.ToString())) c.Checked = sc.Flags[c.Tag.ToString()]; + // Portal flags + foreach(CheckBox c in floorportalflags.Checkboxes) + if(sc.Flags.ContainsKey(c.Tag.ToString())) c.Checked = sc.Flags[c.Tag.ToString()]; + foreach(CheckBox c in ceilportalflags.Checkboxes) + if(sc.Flags.ContainsKey(c.Tag.ToString())) c.Checked = sc.Flags[c.Tag.ToString()]; + // Effects effect.Value = sc.Effect; brightness.Text = sc.Brightness.ToString(); @@ -316,9 +364,17 @@ namespace CodeImp.DoomBuilder.Windows ceilAlpha.Text = General.Clamp(sc.Fields.GetValue("alphaceiling", 1.0f), 0f, 1f).ToString(); floorAlpha.Text = General.Clamp(sc.Fields.GetValue("alphafloor", 1.0f), 0f, 1f).ToString(); + // Portal alpha + ceilportalalpha.Text = General.Clamp(sc.Fields.GetValue("portal_ceil_alpha", 1.0f), 0f, 1f).ToString(); + floorportalalpha.Text = General.Clamp(sc.Fields.GetValue("portal_floor_alpha", 1.0f), 0f, 1f).ToString(); + //Render style - ceilRenderStyle.SelectedIndex = Array.IndexOf(renderstyles, sc.Fields.GetValue("renderstyleceiling", "translucent")); - floorRenderStyle.SelectedIndex = Array.IndexOf(renderstyles, sc.Fields.GetValue("renderstylefloor", "translucent")); + ceilRenderStyle.SelectedIndex = renderstyles.IndexOf(sc.Fields.GetValue("renderstyleceiling", "translucent")); + floorRenderStyle.SelectedIndex = renderstyles.IndexOf(sc.Fields.GetValue("renderstylefloor", "translucent")); + + // Portal render style + ceilportalrenderstyle.SelectedIndex = portalrenderstyles.IndexOf(sc.Fields.GetValue("portal_ceil_overlaytype", "translucent")); + floorportalrenderstyle.SelectedIndex = portalrenderstyles.IndexOf(sc.Fields.GetValue("portal_floor_overlaytype", "translucent")); //Damage damagetype.Text = sc.Fields.GetValue("damagetype", NO_DAMAGETYPE); @@ -359,15 +415,9 @@ namespace CodeImp.DoomBuilder.Windows foreach(Sector s in sectors) { // Flags - foreach(CheckBox c in flags.Checkboxes) - { - if(c.CheckState == CheckState.Indeterminate) continue; //mxd - if(s.IsFlagSet(c.Tag.ToString()) != c.Checked) - { - c.ThreeState = true; - c.CheckState = CheckState.Indeterminate; - } - } + SetupFlags(flags, s); + SetupFlags(ceilportalflags, s); + SetupFlags(floorportalflags, s); // Effects if(s.Effect != effect.Value) effect.Empty = true; @@ -427,12 +477,22 @@ namespace CodeImp.DoomBuilder.Windows if(s.Fields.GetValue("alphaceiling", 1.0f).ToString() != ceilAlpha.Text) ceilAlpha.Text = ""; if(s.Fields.GetValue("alphafloor", 1.0f).ToString() != floorAlpha.Text) floorAlpha.Text = ""; + // Portal alpha + if(s.Fields.GetValue("portal_ceil_alpha", 1.0f).ToString() != ceilportalalpha.Text) ceilportalalpha.Text = ""; + if(s.Fields.GetValue("portal_floor_alpha", 1.0f).ToString() != floorportalalpha.Text) floorportalalpha.Text = ""; + //Render style - if(ceilRenderStyle.SelectedIndex > -1 && ceilRenderStyle.SelectedIndex != Array.IndexOf(renderstyles, s.Fields.GetValue("renderstyleceiling", "translucent"))) + if(ceilRenderStyle.SelectedIndex > -1 && ceilRenderStyle.SelectedIndex != renderstyles.IndexOf(s.Fields.GetValue("renderstyleceiling", "translucent"))) ceilRenderStyle.SelectedIndex = -1; - if(floorRenderStyle.SelectedIndex > -1 && floorRenderStyle.SelectedIndex != Array.IndexOf(renderstyles, s.Fields.GetValue("renderstylefloor", "translucent"))) + if(floorRenderStyle.SelectedIndex > -1 && floorRenderStyle.SelectedIndex != renderstyles.IndexOf(s.Fields.GetValue("renderstylefloor", "translucent"))) floorRenderStyle.SelectedIndex = -1; + // Portal render style + if(ceilportalrenderstyle.SelectedIndex > -1 && ceilportalrenderstyle.SelectedIndex != portalrenderstyles.IndexOf(s.Fields.GetValue("portal_ceil_overlaytype", "translucent"))) + ceilportalrenderstyle.SelectedIndex = -1; + if(floorportalrenderstyle.SelectedIndex > -1 && floorportalrenderstyle.SelectedIndex != portalrenderstyles.IndexOf(s.Fields.GetValue("portal_floor_overlaytype", "translucent"))) + floorportalrenderstyle.SelectedIndex = -1; + //Damage if(damagetype.SelectedIndex > -1 && s.Fields.GetValue("damagetype", NO_DAMAGETYPE) != damagetype.Text) damagetype.SelectedIndex = -1; @@ -512,6 +572,43 @@ namespace CodeImp.DoomBuilder.Windows preventchanges = false; //mxd } + //mxd + private static void SetupFlags(CheckboxArrayControl control, Sector s) + { + foreach(CheckBox c in control.Checkboxes) + { + if(c.CheckState == CheckState.Indeterminate) continue; //mxd + if(s.IsFlagSet(c.Tag.ToString()) != c.Checked) + { + c.ThreeState = true; + c.CheckState = CheckState.Indeterminate; + } + } + } + + //mxd + private static void ApplyFlags(CheckboxArrayControl control, Sector s) + { + foreach(CheckBox c in control.Checkboxes) + { + switch(c.CheckState) + { + case CheckState.Checked: s.SetFlag(c.Tag.ToString(), true); break; + case CheckState.Unchecked: s.SetFlag(c.Tag.ToString(), false); break; + } + } + } + + //mxd + private static void ApplyAlpha(ButtonsNumericTextbox control, Sector s, string key) + { + if(!string.IsNullOrEmpty(control.Text)) + { + float ceilAlphaVal = General.Clamp(control.GetResultFloat(s.Fields.GetValue(key, 1.0f)), 0f, 1f); + UniFields.SetFloat(s.Fields, key, ceilAlphaVal, 1.0f); + } + } + //mxd private void MakeUndo() { @@ -684,28 +781,15 @@ namespace CodeImp.DoomBuilder.Windows return; } - //mxd - string[] rskeys = null; - if(General.Map.Config.SectorRenderStyles.Count > 0) - { - rskeys = new string[General.Map.Config.SectorRenderStyles.Count]; - General.Map.Config.SectorRenderStyles.Keys.CopyTo(rskeys, 0); - } - MakeUndo(); //mxd // Go for all sectors foreach(Sector s in sectors) { // Apply all flags - foreach(CheckBox c in flags.Checkboxes) - { - switch(c.CheckState) - { - case CheckState.Checked: s.SetFlag(c.Tag.ToString(), true); break; - case CheckState.Unchecked: s.SetFlag(c.Tag.ToString(), false); break; - } - } + ApplyFlags(flags, s); + ApplyFlags(ceilportalflags, s); + ApplyFlags(floorportalflags, s); // Effects if(!effect.Empty) s.Effect = effect.Value; @@ -717,25 +801,29 @@ namespace CodeImp.DoomBuilder.Windows commenteditor.Apply(s.Fields); // Alpha - if(!string.IsNullOrEmpty(ceilAlpha.Text)) + ApplyAlpha(ceilAlpha, s, "alphaceiling"); + ApplyAlpha(floorAlpha, s, "alphafloor"); + + // Portal alpha + ApplyAlpha(ceilportalalpha, s, "portal_ceil_alpha"); + ApplyAlpha(floorportalalpha, s, "portal_floor_alpha"); + + // Renderstyle + if(renderstyles.Count > 0) { - float ceilAlphaVal = General.Clamp(ceilAlpha.GetResultFloat(s.Fields.GetValue("alphaceiling", 1.0f)), 0f, 1f); - UniFields.SetFloat(s.Fields, "alphaceiling", ceilAlphaVal, 1.0f); - } - - if(!string.IsNullOrEmpty(floorAlpha.Text)) - { - float floorAlphaVal = General.Clamp(floorAlpha.GetResultFloat(s.Fields.GetValue("alphafloor", 1.0f)), 0f, 1f); - UniFields.SetFloat(s.Fields, "alphafloor", floorAlphaVal, 1.0f); + if(ceilRenderStyle.SelectedIndex > -1) + UniFields.SetString(s.Fields, "renderstyleceiling", renderstyles[ceilRenderStyle.SelectedIndex], "translucent"); + if(floorRenderStyle.SelectedIndex > -1) + UniFields.SetString(s.Fields, "renderstylefloor", renderstyles[floorRenderStyle.SelectedIndex], "translucent"); } - //renderstyle - if(rskeys != null) + // Portal renderstyles + if(portalrenderstyles.Count > 0) { - if(ceilRenderStyle.SelectedIndex > -1) - UniFields.SetString(s.Fields, "renderstyleceiling", rskeys[ceilRenderStyle.SelectedIndex], "translucent"); - if(floorRenderStyle.SelectedIndex > -1) - UniFields.SetString(s.Fields, "renderstylefloor", rskeys[floorRenderStyle.SelectedIndex], "translucent"); + if(ceilportalrenderstyle.SelectedIndex > -1) + UniFields.SetString(s.Fields, "portal_ceil_overlaytype", portalrenderstyles[ceilportalrenderstyle.SelectedIndex], "translucent"); + if(floorportalrenderstyle.SelectedIndex > -1) + UniFields.SetString(s.Fields, "portal_floor_overlaytype", portalrenderstyles[floorportalrenderstyle.SelectedIndex], "translucent"); } //Damage diff --git a/Source/Core/Windows/SectorEditFormUDMF.resx b/Source/Core/Windows/SectorEditFormUDMF.resx index 57617bae..c2cb3618 100644 --- a/Source/Core/Windows/SectorEditFormUDMF.resx +++ b/Source/Core/Windows/SectorEditFormUDMF.resx @@ -138,12 +138,36 @@ False + + False + + + False + + + False + + + False + + + False + False False + + False + + + False + + + False + 17, 17 @@ -174,4 +198,10 @@ True + + True + + + 17, 17 + \ No newline at end of file diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs index 59b920be..ed5fd062 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs @@ -1233,11 +1233,8 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single linedef" : sel.Count + " linedefs"); //mxd General.Map.UndoRedo.CreateUndo("Paste properties to " + rest); - foreach(Linedef l in sel) - { - BuilderPlug.Me.CopiedLinedefProps.Apply(l, false); - l.UpdateCache(); - } + BuilderPlug.Me.CopiedLinedefProps.Apply(sel, false); + foreach(Linedef l in sel) l.UpdateCache(); General.Interface.DisplayStatus(StatusType.Action, "Pasted properties to " + rest + "."); // Update and redraw @@ -1278,11 +1275,8 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single linedef" : sel.Count + " linedefs"); General.Map.UndoRedo.CreateUndo("Paste properties with options to " + rest); - foreach(Linedef l in sel) - { - BuilderPlug.Me.CopiedLinedefProps.Apply(l, true); - l.UpdateCache(); - } + BuilderPlug.Me.CopiedLinedefProps.Apply(sel, true); + foreach(Linedef l in sel) l.UpdateCache(); General.Interface.DisplayStatus(StatusType.Action, "Pasted properties with options to " + rest + "."); // Update and redraw diff --git a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs index 42499a17..5b9ad7a9 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs @@ -1497,9 +1497,9 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single sector" : sel.Count + " sectors"); //mxd General.Map.UndoRedo.CreateUndo("Paste properties to " + rest); + BuilderPlug.Me.CopiedSectorProps.Apply(sel, false); foreach(Sector s in sel) { - BuilderPlug.Me.CopiedSectorProps.Apply(s, false); s.UpdateCeilingSurface(); s.UpdateFloorSurface(); } @@ -1544,9 +1544,9 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single sector" : sel.Count + " sectors"); General.Map.UndoRedo.CreateUndo("Paste properties with options to " + rest); + BuilderPlug.Me.CopiedSectorProps.Apply(sel, true); foreach(Sector s in sel) { - BuilderPlug.Me.CopiedSectorProps.Apply(s, true); s.UpdateCeilingSurface(); s.UpdateFloorSurface(); } diff --git a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs index efbf0d6f..4d7e50bc 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs @@ -1260,11 +1260,8 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single thing" : sel.Count + " things"); //mxd General.Map.UndoRedo.CreateUndo("Paste properties to " + rest); - foreach(Thing t in sel) - { - BuilderPlug.Me.CopiedThingProps.Apply(t, false); - t.UpdateConfiguration(); - } + BuilderPlug.Me.CopiedThingProps.Apply(sel, false); + foreach(Thing t in sel) t.UpdateConfiguration(); General.Interface.DisplayStatus(StatusType.Action, "Pasted properties to" + rest + "."); // Update @@ -1310,11 +1307,8 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single thing" : sel.Count + " things"); General.Map.UndoRedo.CreateUndo("Paste properties with options to " + rest); - foreach(Thing t in sel) - { - BuilderPlug.Me.CopiedThingProps.Apply(t, true); - t.UpdateConfiguration(); - } + BuilderPlug.Me.CopiedThingProps.Apply(sel, true); + foreach(Thing t in sel) t.UpdateConfiguration(); General.Interface.DisplayStatus(StatusType.Action, "Pasted properties with options to " + rest + "."); // Update diff --git a/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs b/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs index dbf3f1de..82e82aec 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs @@ -742,10 +742,7 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single vertex" : sel.Count + " vertices"); //mxd General.Map.UndoRedo.CreateUndo("Paste properties to " + rest); - foreach(Vertex v in sel) - { - BuilderPlug.Me.CopiedVertexProps.Apply(v, false); - } + BuilderPlug.Me.CopiedVertexProps.Apply(sel, false); General.Interface.DisplayStatus(StatusType.Action, "Pasted properties to " + rest + "."); // Update and redraw @@ -785,10 +782,7 @@ namespace CodeImp.DoomBuilder.BuilderModes // Apply properties to selection string rest = (sel.Count == 1 ? "a single vertex" : sel.Count + " vertices"); General.Map.UndoRedo.CreateUndo("Paste properties with options to " + rest); - foreach(Vertex v in sel) - { - BuilderPlug.Me.CopiedVertexProps.Apply(v, true); - } + BuilderPlug.Me.CopiedVertexProps.Apply(sel, true); General.Interface.DisplayStatus(StatusType.Action, "Pasted properties with options to " + rest + "."); // Update and redraw diff --git a/Source/Plugins/BuilderModes/FindReplace/FindSectorFlags.cs b/Source/Plugins/BuilderModes/FindReplace/FindSectorFlags.cs index 0cc2b44b..2de9b307 100644 --- a/Source/Plugins/BuilderModes/FindReplace/FindSectorFlags.cs +++ b/Source/Plugins/BuilderModes/FindReplace/FindSectorFlags.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; using System.Windows.Forms; using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.Map; @@ -26,13 +27,15 @@ namespace CodeImp.DoomBuilder.BuilderModes // This is called to test if the item should be displayed public override bool DetermineVisiblity() { - return General.Map.Config.SectorFlags.Count > 0; + return General.Map.Config.SectorFlags.Count > 0 + || General.Map.Config.CeilingPortalFlags.Count > 0 + || General.Map.Config.FloorPortalFlags.Count > 0; } // This is called when the browse button is pressed public override string Browse(string initialvalue) { - return FlagsForm.ShowDialog(Form.ActiveForm, initialvalue, General.Map.Config.SectorFlags); + return FlagsForm.ShowDialog(Form.ActiveForm, initialvalue, GetAllFlags()); } // This is called to perform a search (and replace) @@ -45,6 +48,9 @@ namespace CodeImp.DoomBuilder.BuilderModes // Where to search? ICollection list = withinselection ? General.Map.Map.GetSelectedSectors(true) : General.Map.Map.Sectors; + // Combine all sector flags... + Dictionary allflags = GetAllFlags(); + // Find what? (mxd) Dictionary findflagslist = new Dictionary(); foreach(string flag in value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) @@ -57,7 +63,7 @@ namespace CodeImp.DoomBuilder.BuilderModes f = f.Substring(1, f.Length - 1); } - if(General.Map.Config.SectorFlags.ContainsKey(f)) findflagslist.Add(f, setflag); + if(allflags.ContainsKey(f)) findflagslist.Add(f, setflag); } if(findflagslist.Count == 0) { @@ -80,7 +86,7 @@ namespace CodeImp.DoomBuilder.BuilderModes f = f.Substring(1, f.Length - 1); } - if(!General.Map.Config.SectorFlags.ContainsKey(f)) + if(!allflags.ContainsKey(f)) { MessageBox.Show("Invalid replace value \"" + f + "\" for this search type!", "Find and Replace", MessageBoxButtons.OK, MessageBoxIcon.Error); return objs.ToArray(); @@ -127,6 +133,20 @@ namespace CodeImp.DoomBuilder.BuilderModes return objs.ToArray(); } + private static Dictionary GetAllFlags() + { + // Combine all sector flags... + Dictionary allflags = new Dictionary(General.Map.Config.SectorFlags); + + foreach(var group in General.Map.Config.CeilingPortalFlags) + allflags[group.Key] = group.Value + " (ceil. portal)"; + + foreach(var group in General.Map.Config.FloorPortalFlags) + allflags[group.Key] = group.Value + " (floor portal)"; + + return allflags; + } + #endregion } } diff --git a/Source/Plugins/BuilderModes/General/CopyStructures.cs b/Source/Plugins/BuilderModes/General/CopyStructures.cs index 60a55bd2..6c891b2d 100644 --- a/Source/Plugins/BuilderModes/General/CopyStructures.cs +++ b/Source/Plugins/BuilderModes/General/CopyStructures.cs @@ -36,13 +36,25 @@ namespace CodeImp.DoomBuilder.BuilderModes private bool hexen = true; private bool udmf = true; private string description = "Unnamed field"; + private string fieldname1; + private string fieldname2; public bool DOOM { get { return doom; } set { doom = value; } } public bool HEXEN { get { return hexen; } set { hexen = value; } } public bool UDMF { get { return udmf; } set { udmf = value; } } public string Description { get { return description; } set { description = value; } } + public string Field1 { get { return fieldname1; } set { fieldname1 = value; } } + public string Field2 { get { return fieldname2; } set { fieldname2 = value; } } - public bool SupportsCurrentMapFormat { get { return General.Map != null && (General.Map.DOOM && doom || General.Map.HEXEN && hexen || General.Map.UDMF && udmf); } } + public bool SupportsCurrentMapFormat + { + get + { + if(General.Map == null) return false; + if(!string.IsNullOrEmpty(fieldname1) || !string.IsNullOrEmpty(fieldname2)) return General.Map.UDMF; + return (General.Map.DOOM && doom || General.Map.HEXEN && hexen || General.Map.UDMF && udmf); + } + } } public abstract class MapElementPropertiesCopySettings @@ -55,11 +67,9 @@ namespace CodeImp.DoomBuilder.BuilderModes { foreach(Attribute attr in Attribute.GetCustomAttributes(prop)) { - if(attr.GetType() == typeof(FieldDescription)) - { - FieldDescription fd = (FieldDescription)attr; - prop.SetValue(this, fd.SupportsCurrentMapFormat); - } + if(attr.GetType() != typeof(FieldDescription)) continue; + FieldDescription fd = (FieldDescription)attr; + prop.SetValue(this, fd.SupportsCurrentMapFormat); } } } @@ -90,6 +100,28 @@ namespace CodeImp.DoomBuilder.BuilderModes } } + protected void ApplyUIFields(ICollection collection, MapElementPropertiesCopySettings settings) where T : MapElement + { + FieldInfo[] props = settings.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); + foreach(FieldInfo prop in props) + { + // Property set? + if(!(bool)prop.GetValue(settings)) continue; + foreach(Attribute attr in Attribute.GetCustomAttributes(prop)) + { + if(attr.GetType() != typeof(FieldDescription)) continue; + FieldDescription fd = (FieldDescription)attr; + if(fd.SupportsCurrentMapFormat && !string.IsNullOrEmpty(fd.Field1)) + { + if(!string.IsNullOrEmpty(fd.Field2)) + foreach(T me in collection) Apply(me.Fields, fd.Field1, fd.Field2); + else + foreach(T me in collection) Apply(me.Fields, fd.Field1); + } + } + } + } + protected void Apply(UniFields other, string key) { if(uifields.ContainsKey(key)) other[key] = new UniValue(uifields[key]); @@ -125,13 +157,13 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd public class VertexPropertiesCopySettings : MapElementPropertiesCopySettings { - [FieldDescription(Description = "Vertex Floor Height", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Vertex floor height", Field1 = "zfloor")] public bool ZFloor = true; - - [FieldDescription(Description = "Vertex Ceiling Height", DOOM = false, HEXEN = false)] + + [FieldDescription(Description = "Vertex ceiling height", Field1 = "zceiling")] public bool ZCeiling = true; - [FieldDescription(Description = "Custom Fields", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Custom fields", DOOM = false, HEXEN = false)] public bool Fields = true; } @@ -151,20 +183,23 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Applies coped properties - public void Apply(Vertex v, bool usecopysettings) + public void Apply(ICollection verts, bool usecopysettings) { - Apply(v, (usecopysettings ? CopySettings : defaultsettings)); + Apply(verts, (usecopysettings ? CopySettings : defaultsettings)); } //mxd. Applies coped properties using selected settings - public void Apply(Vertex v, VertexPropertiesCopySettings settings) + public void Apply(ICollection verts, VertexPropertiesCopySettings settings) { - if(settings.ZCeiling) v.ZCeiling = zceiling; - if(settings.ZFloor) v.ZFloor = zfloor; - if(settings.Fields) + foreach(Vertex v in verts) { - v.Fields.BeforeFieldsChange(); - ApplyCustomFields(v.Fields); + if(settings.ZCeiling) v.ZCeiling = zceiling; + if(settings.ZFloor) v.ZFloor = zfloor; + if(settings.Fields) + { + v.Fields.BeforeFieldsChange(); + ApplyCustomFields(v.Fields); + } } } } @@ -176,62 +211,80 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd public class SectorPropertiesCopySettings : MapElementPropertiesCopySettings { - [FieldDescription(Description = "Floor Height")] + [FieldDescription(Description = "Floor height")] public bool FloorHeight = true; - [FieldDescription(Description = "Ceiling Height")] + [FieldDescription(Description = "Ceiling height")] public bool CeilingHeight = true; - [FieldDescription(Description = "Floor Texture")] + [FieldDescription(Description = "Floor texture")] public bool FloorTexture = true; - [FieldDescription(Description = "Ceiling Texture")] + [FieldDescription(Description = "Ceiling texture")] public bool CeilingTexture = true; - [FieldDescription(Description = "Floor Texture Offset", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor texture offsets", Field1 = "xpanningfloor", Field2 = "ypanningfloor")] public bool FloorTextureOffset = true; - [FieldDescription(Description = "Ceiling Texture Offset", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling texture offsets", Field1 = "xpanningceiling", Field2 = "ypanningceiling")] public bool CeilingTextureOffset = true; - [FieldDescription(Description = "Floor Texture Scale", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor texture scale", Field1 = "xscalefloor", Field2 = "yscalefloor")] public bool FloorTextureScale = true; - [FieldDescription(Description = "Ceiling Texture Scale", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling texture scale", Field1 = "xscaleceiling", Field2 = "yscaleceiling")] public bool CeilingTextureScale = true; - [FieldDescription(Description = "Floor Texture Rotation", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor texture rotation", Field1 = "rotationfloor")] public bool FloorTextureRotation = true; - [FieldDescription(Description = "Ceiling Texture Rotation", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling texture rotation", Field1 = "rotationceiling")] public bool CeilingTextureRotation = true; - [FieldDescription(Description = "Floor Alpha", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor alpha", Field1 = "alphafloor")] public bool FloorAlpha = true; - [FieldDescription(Description = "Ceiling Alpha", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling alpha", Field1 = "alphaceiling")] public bool CeilingAlpha = true; - [FieldDescription(Description = "Sector Brightness")] + [FieldDescription(Description = "Floor portal alpha", Field1 = "portal_floor_alpha")] + public bool FloorPortalAlpha = true; + + [FieldDescription(Description = "Ceiling portal alpha", Field1 = "portal_ceil_alpha")] + public bool CeilingPortalAlpha = true; + + [FieldDescription(Description = "Sector brightness")] public bool Brightness = true; - [FieldDescription(Description = "Floor Brightness", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor brightness", Field1 = "lightfloor", Field2 = "lightfloorabsolute")] public bool FloorBrightness = true; - [FieldDescription(Description = "Ceiling Brightness", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling brightness", Field1 = "lightceiling", Field2 = "lightceilingabsolute")] public bool CeilingBrightness = true; - [FieldDescription(Description = "Floor Render Style", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor render style", Field1 = "renderstylefloor")] public bool FloorRenderStyle = true; - [FieldDescription(Description = "Ceiling Render Style", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling render style", Field1 = "renderstyleceiling")] public bool CeilingRenderStyle = true; + + [FieldDescription(Description = "Floor portal render style", Field1 = "portal_floor_overlaytype")] + public bool FloorPortalRenderStyle = true; + + [FieldDescription(Description = "Ceiling portal render style", Field1 = "portal_ceil_overlaytype")] + public bool CeilingPortalRenderStyle = true; - [FieldDescription(Description = "Floor Slope", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Floor slope", DOOM = false, HEXEN = false)] public bool FloorSlope = true; - [FieldDescription(Description = "Ceiling Slope", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Ceiling slope", DOOM = false, HEXEN = false)] public bool CeilingSlope = true; + + [FieldDescription(Description = "Floor terrain", Field1 = "floorterrain")] + public bool FloorTerrain = true; + + [FieldDescription(Description = "Ceiling terrain", Field1 = "ceilingterrain")] + public bool CeilingTerrain = true; [FieldDescription(Description = "Tags")] public bool Tag = true; @@ -242,25 +295,37 @@ namespace CodeImp.DoomBuilder.BuilderModes [FieldDescription(Description = "Flags", DOOM = false, HEXEN = false)] public bool Flags = true; - [FieldDescription(Description = "Light Color", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Light color", Field1 = "lightcolor")] public bool LightColor = true; - [FieldDescription(Description = "Fade Color", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Fade color", Field1 = "fadecolor")] public bool FadeColor = true; - [FieldDescription(Description = "Desaturation", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Desaturation", Field1 = "desaturation")] public bool Desaturation = true; - [FieldDescription(Description = "Sound Sequence", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Damage type", Field1 = "damagetype")] + public bool DamageType = true; + + [FieldDescription(Description = "Damage amount", Field1 = "damageamount")] + public bool DamageAmount = true; + + [FieldDescription(Description = "Damage interval", Field1 = "damageinterval")] + public bool DamageInterval = true; + + [FieldDescription(Description = "Damage leakiness", Field1 = "leakiness")] + public bool DamageLeakiness = true; + + [FieldDescription(Description = "Sound sequence", Field1 = "soundsequence")] public bool SoundSequence = true; - [FieldDescription(Description = "Gravity", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Gravity", Field1 = "gravity")] public bool Gravity = true; - [FieldDescription(Description = "Custom Fields", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Custom fields", DOOM = false, HEXEN = false)] public bool Fields = true; - [FieldDescription(Description = "Comment", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Comment", Field1 = "comment")] public bool Comment = true; } @@ -301,66 +366,53 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Applies coped properties - public void Apply(Sector s, bool usecopysettings) + public void Apply(ICollection sectors, bool usecopysettings) { - Apply(s, (usecopysettings ? CopySettings : defaultsettings)); + Apply(sectors, (usecopysettings ? CopySettings : defaultsettings)); } //mxd. Applies coped properties using selected settings - public void Apply(Sector s, SectorPropertiesCopySettings settings) + public void Apply(ICollection sectors, SectorPropertiesCopySettings settings) { - if(settings.FloorHeight) s.FloorHeight = floorheight; - if(settings.CeilingHeight) s.CeilHeight = ceilheight; - if(settings.FloorTexture) s.SetFloorTexture(floortexture); - if(settings.CeilingTexture) s.SetCeilTexture(ceilingtexture); - if(settings.Brightness) s.Brightness = brightness; - if(settings.Tag) s.Tags = new List(tags); //mxd - if(settings.Special) s.Effect = effect; - if(settings.CeilingSlope) + foreach(Sector s in sectors) { - s.CeilSlopeOffset = ceilslopeoffset; - s.CeilSlope = ceilslope; - } - if(settings.FloorSlope) - { - s.FloorSlopeOffset = floorslopeoffset; - s.FloorSlope = floorslope; - } - if(settings.Flags) - { - s.ClearFlags(); //mxd - foreach(KeyValuePair f in flags) //mxd - s.SetFlag(f.Key, f.Value); + if(settings.FloorHeight) s.FloorHeight = floorheight; + if(settings.CeilingHeight) s.CeilHeight = ceilheight; + if(settings.FloorTexture) s.SetFloorTexture(floortexture); + if(settings.CeilingTexture) s.SetCeilTexture(ceilingtexture); + if(settings.Brightness) s.Brightness = brightness; + if(settings.Tag) s.Tags = new List(tags); //mxd + if(settings.Special) s.Effect = effect; + if(settings.CeilingSlope) + { + s.CeilSlopeOffset = ceilslopeoffset; + s.CeilSlope = ceilslope; + } + if(settings.FloorSlope) + { + s.FloorSlopeOffset = floorslopeoffset; + s.FloorSlope = floorslope; + } + if(settings.Flags) + { + s.ClearFlags(); //mxd + foreach(KeyValuePair f in flags) //mxd + s.SetFlag(f.Key, f.Value); + } } // Should we bother? if(!General.Map.UDMF) return; - // Apply fields - s.Fields.BeforeFieldsChange(); + // Apply custom fields + foreach(Sector s in sectors) + { + s.Fields.BeforeFieldsChange(); + if(settings.Fields) ApplyCustomFields(s.Fields); + } // Apply UI fields - if(settings.FloorTextureOffset) Apply(s.Fields, "xpanningfloor", "ypanningfloor"); - if(settings.CeilingTextureOffset) Apply(s.Fields, "xpanningceiling", "ypanningceiling"); - if(settings.FloorTextureScale) Apply(s.Fields, "xscalefloor", "yscalefloor"); - if(settings.CeilingTextureScale) Apply(s.Fields, "xscaleceiling", "yscaleceiling"); - if(settings.FloorTextureRotation) Apply(s.Fields, "rotationfloor"); - if(settings.CeilingTextureRotation) Apply(s.Fields, "rotationceiling"); - if(settings.FloorBrightness) Apply(s.Fields, "lightfloor", "lightfloorabsolute"); - if(settings.CeilingBrightness) Apply(s.Fields, "lightceiling", "lightceilingabsolute"); - if(settings.FloorAlpha) Apply(s.Fields, "alphafloor"); - if(settings.CeilingAlpha) Apply(s.Fields, "alphaceiling"); - if(settings.FloorRenderStyle) Apply(s.Fields, "renderstylefloor"); - if(settings.CeilingRenderStyle) Apply(s.Fields, "renderstyleceiling"); - if(settings.Gravity) Apply(s.Fields, "gravity"); - if(settings.LightColor) Apply(s.Fields, "lightcolor"); - if(settings.FadeColor) Apply(s.Fields, "fadecolor"); - if(settings.Desaturation) Apply(s.Fields, "desaturation"); - if(settings.SoundSequence) Apply(s.Fields, "soundsequence"); - if(settings.Comment) Apply(s.Fields, "comment"); - - // Apply custom fields - if(settings.Fields) ApplyCustomFields(s.Fields); + ApplyUIFields(sectors, settings); } } @@ -371,46 +423,46 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd public class SidedefPropertiesCopySettings : MapElementPropertiesCopySettings { - [FieldDescription(Description = "Upper Texture")] + [FieldDescription(Description = "Upper texture")] public bool UpperTexture = true; - [FieldDescription(Description = "Middle Texture")] + [FieldDescription(Description = "Middle texture")] public bool MiddleTexture = true; - [FieldDescription(Description = "Lower Texture")] + [FieldDescription(Description = "Lower texture")] public bool LowerTexture = true; - [FieldDescription(Description = "Texture Offset X")] + [FieldDescription(Description = "Texture offset X")] public bool OffsetX = true; - [FieldDescription(Description = "Texture Offset Y")] + [FieldDescription(Description = "Texture offset Y")] public bool OffsetY = true; - [FieldDescription(Description = "Upper Texture Offset", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Upper texture offsets", Field1 = "offsetx_top", Field2 = "offsety_top")] public bool UpperTextureOffset = true; - [FieldDescription(Description = "Middle Texture Offset", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Middle texture offsets", Field1 = "offsetx_mid", Field2 = "offsety_mid")] public bool MiddleTextureOffset = true; - [FieldDescription(Description = "Lower Texture Offset", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Lower texture offsets", Field1 = "offsetx_bottom", Field2 = "offsety_bottom")] public bool LowerTextureOffset = true; - [FieldDescription(Description = "Upper Texture Scale", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Upper texture scale", Field1 = "scalex_top", Field2 = "scaley_top")] public bool UpperTextureScale = true; - [FieldDescription(Description = "Middle Texture Scale", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Middle texture scale", Field1 = "scalex_mid", Field2 = "scaley_mid")] public bool MiddleTextureScale = true; - [FieldDescription(Description = "Lower Texture Scale", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Lower texture scale", Field1 = "scalex_bottom", Field2 = "scaley_bottom")] public bool LowerTextureScale = true; - [FieldDescription(Description = "Brightness", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Brightness", Field1 = "light", Field2 = "lightabsolute")] public bool Brightness = true; [FieldDescription(Description = "Flags", DOOM = false, HEXEN = false)] public bool Flags = true; - [FieldDescription(Description = "Custom Fields", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Custom fields", DOOM = false, HEXEN = false)] public bool Fields = true; } @@ -439,43 +491,41 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Applies coped properties with all settings enabled - public void Apply(Sidedef s, bool usecopysettings) + public void Apply(ICollection sides, bool usecopysettings) { - Apply(s, (usecopysettings ? CopySettings : DefaultSettings)); + Apply(sides, (usecopysettings ? CopySettings : DefaultSettings)); } //mxd. Applies selected settings - public void Apply(Sidedef s, SidedefPropertiesCopySettings settings) + public void Apply(ICollection sides, SidedefPropertiesCopySettings settings) { - if(settings.UpperTexture) s.SetTextureHigh(hightexture); - if(settings.MiddleTexture) s.SetTextureMid(middletexture); - if(settings.LowerTexture) s.SetTextureLow(lowtexture); - if(settings.OffsetX) s.OffsetX = offsetx; - if(settings.OffsetY) s.OffsetY = offsety; - if(settings.Flags) + foreach(Sidedef s in sides) { - s.ClearFlags(); //mxd - foreach(KeyValuePair f in flags) //mxd - s.SetFlag(f.Key, f.Value); + if(settings.UpperTexture) s.SetTextureHigh(hightexture); + if(settings.MiddleTexture) s.SetTextureMid(middletexture); + if(settings.LowerTexture) s.SetTextureLow(lowtexture); + if(settings.OffsetX) s.OffsetX = offsetx; + if(settings.OffsetY) s.OffsetY = offsety; + if(settings.Flags) + { + s.ClearFlags(); //mxd + foreach(KeyValuePair f in flags) //mxd + s.SetFlag(f.Key, f.Value); + } } // Should we bother? if(!General.Map.UDMF) return; // Apply fields - s.Fields.BeforeFieldsChange(); + foreach(Sidedef s in sides) + { + s.Fields.BeforeFieldsChange(); + if(settings.Fields) ApplyCustomFields(s.Fields); + } // Apply UI fields - if(settings.UpperTextureOffset) Apply(s.Fields, "offsetx_top", "offsety_top"); - if(settings.MiddleTextureOffset) Apply(s.Fields, "offsetx_mid", "offsety_mid"); - if(settings.LowerTextureOffset) Apply(s.Fields, "offsetx_bottom", "offsety_bottom"); - if(settings.UpperTextureScale) Apply(s.Fields, "scalex_top", "scaley_top"); - if(settings.MiddleTextureScale) Apply(s.Fields, "scalex_mid", "scaley_mid"); - if(settings.LowerTextureScale) Apply(s.Fields, "scalex_bottom", "scaley_bottom"); - if(settings.Brightness) Apply(s.Fields, "light", "lightabsolute"); - - // Apply custom fields - if(settings.Fields) ApplyCustomFields(s.Fields); + ApplyUIFields(sides, settings); } } @@ -489,7 +539,7 @@ namespace CodeImp.DoomBuilder.BuilderModes [FieldDescription(Description = "Action")] public bool Action = true; - [FieldDescription(Description = "Action Arguments", DOOM = false)] + [FieldDescription(Description = "Action arguments", DOOM = false)] public bool Arguments = true; [FieldDescription(Description = "Activation", DOOM = false, UDMF = false)] @@ -501,19 +551,19 @@ namespace CodeImp.DoomBuilder.BuilderModes [FieldDescription(Description = "Flags")] public bool Flags = true; - [FieldDescription(Description = "Alpha", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Alpha", Field1 = "alpha")] public bool Alpha = true; - [FieldDescription(Description = "Render Style", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Render style", Field1 = "renderstyle")] public bool RenderStyle = true; - [FieldDescription(Description = "Lock Number", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Lock number", Field1 = "locknumber")] public bool LockNumber = true; - [FieldDescription(Description = "Custom Fields", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Custom fields", DOOM = false, HEXEN = false)] public bool Fields = true; - [FieldDescription(Description = "Comment", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Comment", Field1 = "comment")] public bool Comment = true; } @@ -545,64 +595,74 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Applies coped properties with all settings enabled - public void Apply(Linedef l, bool usecopysettings) { Apply(l, usecopysettings, true); } - public void Apply(Linedef l, bool usecopysettings, bool applytosidedefs) + public void Apply(ICollection lines, bool usecopysettings) { Apply(lines, usecopysettings, true); } + public void Apply(ICollection lines, bool usecopysettings, bool applytosidedefs) { if(usecopysettings) - Apply(l, CopySettings, (applytosidedefs ? SidedefProperties.CopySettings : null)); + Apply(lines, CopySettings, (applytosidedefs ? SidedefProperties.CopySettings : null)); else - Apply(l, defaultsettings, (applytosidedefs ? SidedefProperties.DefaultSettings : null)); + Apply(lines, defaultsettings, (applytosidedefs ? SidedefProperties.DefaultSettings : null)); } //mxd. Applies selected linededf and sidedef settings - public void Apply(Linedef l, LinedefPropertiesCopySettings settings, SidedefPropertiesCopySettings sidesettings) + public void Apply(ICollection lines, LinedefPropertiesCopySettings settings, SidedefPropertiesCopySettings sidesettings) { - if(sidesettings != null) + List frontsides = new List(lines.Count); + List backsides = new List(lines.Count); + foreach(Linedef l in lines) { - if((front != null) && (l.Front != null)) front.Apply(l.Front, sidesettings); - if((back != null) && (l.Back != null)) back.Apply(l.Back, sidesettings); - } - if(settings.Flags) - { - l.ClearFlags(); - foreach(KeyValuePair f in flags) - l.SetFlag(f.Key, f.Value); - } - if(settings.Activation) l.Activate = activate; - if(settings.Tag) l.Tags = new List(tags); //mxd - if(settings.Action) l.Action = action; - if(settings.Arguments) - { - for(int i = 0; i < l.Args.Length; i++) - l.Args[i] = args[i]; + if(settings.Flags) + { + l.ClearFlags(); + foreach(KeyValuePair f in flags) + l.SetFlag(f.Key, f.Value); + } + if(settings.Activation) l.Activate = activate; + if(settings.Tag) l.Tags = new List(tags); //mxd + if(settings.Action) l.Action = action; + if(settings.Arguments) + { + for(int i = 0; i < l.Args.Length; i++) + l.Args[i] = args[i]; + } + + if(l.Front != null) frontsides.Add(l.Front); + if(l.Back != null) backsides.Add(l.Back); } // Should we bother? if(!General.Map.UDMF) return; // Apply fields - l.Fields.BeforeFieldsChange(); - - // Apply string arguments - if(settings.Arguments) + foreach(Linedef l in lines) { - Apply(l.Fields, "arg0str"); + l.Fields.BeforeFieldsChange(); + + // Apply string arguments + if(settings.Arguments) + { + Apply(l.Fields, "arg0str"); - //TODO: re-enable when UI part is ready - //Apply(l.Fields, "arg1str"); - //Apply(l.Fields, "arg2str"); - //Apply(l.Fields, "arg3str"); - //Apply(l.Fields, "arg4str"); + //TODO: re-enable when UI part is ready + //Apply(l.Fields, "arg1str"); + //Apply(l.Fields, "arg2str"); + //Apply(l.Fields, "arg3str"); + //Apply(l.Fields, "arg4str"); + } + + // Apply custom fields + if(settings.Fields) ApplyCustomFields(l.Fields); } // Apply UI fields - if(settings.Alpha) Apply(l.Fields, "alpha"); - if(settings.RenderStyle) Apply(l.Fields, "renderstyle"); - if(settings.LockNumber) Apply(l.Fields, "locknumber"); - if(settings.Comment) Apply(l.Fields, "comment"); + ApplyUIFields(lines, settings); - // Apply custom fields - if(settings.Fields) ApplyCustomFields(l.Fields); + // Apply sidedef settings + if(sidesettings != null) + { + if(front != null) front.Apply(frontsides, sidesettings); + if(back != null) back.Apply(backsides, sidesettings); + } } } @@ -619,7 +679,7 @@ namespace CodeImp.DoomBuilder.BuilderModes [FieldDescription(Description = "Angle")] public bool Angle = true; - [FieldDescription(Description = "Z Height", DOOM = false)] + [FieldDescription(Description = "Z-height", DOOM = false)] public bool ZHeight = true; [FieldDescription(Description = "Pitch", DOOM = false, HEXEN = false)] @@ -634,7 +694,7 @@ namespace CodeImp.DoomBuilder.BuilderModes [FieldDescription(Description = "Action", DOOM = false)] public bool Action = true; - [FieldDescription(Description = "Action Arguments", DOOM = false)] + [FieldDescription(Description = "Action arguments", DOOM = false)] public bool Arguments = true; [FieldDescription(Description = "Tag", DOOM = false)] @@ -643,31 +703,34 @@ namespace CodeImp.DoomBuilder.BuilderModes [FieldDescription(Description = "Flags")] public bool Flags = true; - [FieldDescription(Description = "Conversation ID", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Conversation ID", Field1 = "conversation")] public bool Conversation = true; - [FieldDescription(Description = "Gravity", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Gravity", Field1 = "gravity")] public bool Gravity = true; - [FieldDescription(Description = "Health Multiplier", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Health multiplier", Field1 = "health")] public bool Health = true; - [FieldDescription(Description = "Score", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Score", Field1 = "score")] public bool Score = true; - [FieldDescription(Description = "Alpha", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Float bob phase", Field1 = "floatbobphase")] + public bool FloatBobPhase = true; + + [FieldDescription(Description = "Alpha", Field1 = "alpha")] public bool Alpha = true; - [FieldDescription(Description = "Fill Color", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Fill color", Field1 = "fillcolor")] public bool FillColor = true; - [FieldDescription(Description = "Render Style", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Render style", Field1 = "renderstyle")] public bool RenderStyle = true; - [FieldDescription(Description = "Custom Fields", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Custom fields", DOOM = false, HEXEN = false)] public bool Fields = true; - [FieldDescription(Description = "Comment", DOOM = false, HEXEN = false)] + [FieldDescription(Description = "Comment", Field1 = "comment")] public bool Comment = true; } @@ -706,64 +769,63 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Applies coped properties with all settings enabled - public void Apply(Thing t, bool usecopysettings) + public void Apply(ICollection things, bool usecopysettings) { - Apply(t, (usecopysettings ? CopySettings : defaultsettings)); + Apply(things, (usecopysettings ? CopySettings : defaultsettings)); } //mxd. Applies selected settings - public void Apply(Thing t, ThingPropertiesCopySettings settings) + public void Apply(ICollection things, ThingPropertiesCopySettings settings) { - if(settings.Type) t.Type = type; - if(settings.Angle) t.Rotate(angle); - if(settings.ZHeight) t.Move(t.Position.x, t.Position.y, zheight); - if(settings.Pitch) t.SetPitch(pitch); - if(settings.Roll) t.SetRoll(roll); - if(settings.Scale) t.SetScale(scalex, scaley); - if(settings.Flags) + foreach(Thing t in things) { - t.ClearFlags(); - foreach(KeyValuePair f in flags) - t.SetFlag(f.Key, f.Value); - } - if(settings.Tag) t.Tag = tag; - if(settings.Action) t.Action = action; - if(settings.Arguments) - { - for(int i = 0; i < t.Args.Length; i++) - t.Args[i] = args[i]; + if(settings.Type) t.Type = type; + if(settings.Angle) t.Rotate(angle); + if(settings.ZHeight) t.Move(t.Position.x, t.Position.y, zheight); + if(settings.Pitch) t.SetPitch(pitch); + if(settings.Roll) t.SetRoll(roll); + if(settings.Scale) t.SetScale(scalex, scaley); + if(settings.Flags) + { + t.ClearFlags(); + foreach(KeyValuePair f in flags) + t.SetFlag(f.Key, f.Value); + } + if(settings.Tag) t.Tag = tag; + if(settings.Action) t.Action = action; + if(settings.Arguments) + { + for(int i = 0; i < t.Args.Length; i++) + t.Args[i] = args[i]; + } } // Should we bother? if(!General.Map.UDMF) return; - // Apply fields - t.Fields.BeforeFieldsChange(); - - // Apply string arguments - if(settings.Arguments) + foreach(Thing t in things) { - Apply(t.Fields, "arg0str"); + // Apply fields + t.Fields.BeforeFieldsChange(); - //TODO: re-enable when UI part is ready - //Apply(t.Fields, "arg1str"); - //Apply(t.Fields, "arg2str"); - //Apply(t.Fields, "arg3str"); - //Apply(t.Fields, "arg4str"); + // Apply string arguments + if(settings.Arguments) + { + Apply(t.Fields, "arg0str"); + + //TODO: re-enable when UI part is ready + //Apply(t.Fields, "arg1str"); + //Apply(t.Fields, "arg2str"); + //Apply(t.Fields, "arg3str"); + //Apply(t.Fields, "arg4str"); + } + + // Apply custom fields + if(settings.Fields) ApplyCustomFields(t.Fields); } // Apply UI fields - if(settings.Conversation) Apply(t.Fields, "conversation"); - if(settings.Gravity) Apply(t.Fields, "gravity"); - if(settings.Health) Apply(t.Fields, "health"); - if(settings.FillColor) Apply(t.Fields, "fillcolor"); - if(settings.Alpha) Apply(t.Fields, "alpha"); - if(settings.Score) Apply(t.Fields, "score"); - if(settings.RenderStyle) Apply(t.Fields, "renderstyle"); - if(settings.Comment) Apply(t.Fields, "comment"); - - // Apply custom fields - if(settings.Fields) ApplyCustomFields(t.Fields); + ApplyUIFields(things, settings); } } @@ -822,24 +884,7 @@ namespace CodeImp.DoomBuilder.BuilderModes if(!General.Map.UDMF) return true; // UI fields - if(flags.FloorTextureOffset && !UniFields.ValuesMatch("xpanningfloor", "ypanningfloor", source, target)) return false; - if(flags.CeilingTextureOffset && !UniFields.ValuesMatch("xpanningceiling", "ypanningceiling", source, target)) return false; - if(flags.FloorTextureScale && !UniFields.ValuesMatch("xscalefloor", "yscalefloor", source, target)) return false; - if(flags.CeilingTextureScale && !UniFields.ValuesMatch("xscaleceiling", "yscaleceiling", source, target)) return false; - if(flags.FloorTextureRotation && !UniFields.ValuesMatch("rotationfloor", source, target)) return false; - if(flags.CeilingTextureRotation && !UniFields.ValuesMatch("rotationceiling", source, target)) return false; - if(flags.FloorBrightness && !UniFields.ValuesMatch("lightfloor", "lightfloorabsolute", source, target)) return false; - if(flags.CeilingBrightness && !UniFields.ValuesMatch("lightceiling", "lightceilingabsolute", source, target)) return false; - if(flags.FloorAlpha && !UniFields.ValuesMatch("alphafloor", source, target)) return false; - if(flags.CeilingAlpha && !UniFields.ValuesMatch("alphaceiling", source, target)) return false; - if(flags.FloorRenderStyle && !UniFields.ValuesMatch("renderstylefloor", source, target)) return false; - if(flags.CeilingRenderStyle && !UniFields.ValuesMatch("renderstyleceiling", source, target)) return false; - if(flags.Gravity && !UniFields.ValuesMatch("gravity", source, target)) return false; - if(flags.LightColor && !UniFields.ValuesMatch("lightcolor", source, target)) return false; - if(flags.FadeColor && !UniFields.ValuesMatch("fadecolor", source, target)) return false; - if(flags.Desaturation && !UniFields.ValuesMatch("desaturation", source, target)) return false; - if(flags.SoundSequence && !UniFields.ValuesMatch("soundsequence", source, target)) return false; - if(flags.Comment && !UniFields.ValuesMatch("comment", source, target)) return false; + if(!UIFieldsMatch(flags, source, target)) return false; // Custom fields return !flags.Fields || UniFields.CustomFieldsMatch(source.Fields, target.Fields); @@ -876,10 +921,7 @@ namespace CodeImp.DoomBuilder.BuilderModes if(General.Map.UDMF) { // UI fields - if(linedefflags.Alpha && !UniFields.ValuesMatch("alpha", source, target)) return false; - if(linedefflags.RenderStyle && !UniFields.ValuesMatch("renderstyle", source, target)) return false; - if(linedefflags.LockNumber && !UniFields.ValuesMatch("locknumber", source, target)) return false; - if(linedefflags.Comment && !UniFields.ValuesMatch("comment", source, target)) return false; + if(!UIFieldsMatch(linedefflags, source, target)) return false; // Custom fields if(linedefflags.Fields && !UniFields.CustomFieldsMatch(source.Fields, target.Fields)) return false; @@ -910,13 +952,7 @@ namespace CodeImp.DoomBuilder.BuilderModes if(flags.Flags && !FlagsMatch(source.GetEnabledFlags(), target.GetEnabledFlags())) return false; // UI fields - if(flags.UpperTextureScale && !UniFields.ValuesMatch("scalex_top", "scaley_top", source, target)) return false; - if(flags.MiddleTextureScale && !UniFields.ValuesMatch("scalex_mid", "scaley_mid", source, target)) return false; - if(flags.LowerTextureScale && !UniFields.ValuesMatch("scalex_bottom", "scaley_bottom", source, target)) return false; - if(flags.UpperTextureOffset && !UniFields.ValuesMatch("offsetx_top", "offsety_top", source, target)) return false; - if(flags.MiddleTextureOffset && !UniFields.ValuesMatch("offsetx_mid", "offsety_mid", source, target)) return false; - if(flags.LowerTextureOffset && !UniFields.ValuesMatch("offsetx_bottom", "offsety_bottom", source, target)) return false; - if(flags.Brightness && !UniFields.ValuesMatch("light", "lightabsolute", source, target)) return false; + if(!UIFieldsMatch(flags, source, target)) return false; // Custom fields return !flags.Fields || UniFields.CustomFieldsMatch(source.Fields, target.Fields); @@ -958,14 +994,7 @@ namespace CodeImp.DoomBuilder.BuilderModes if(flags.Scale && (source.ScaleX != target.ScaleX) || (source.ScaleY != target.ScaleY)) return false; // UI fields - if(flags.Conversation && !UniFields.ValuesMatch("conversation", source, target)) return false; - if(flags.Gravity && !UniFields.ValuesMatch("gravity", source, target)) return false; - if(flags.Health && !UniFields.ValuesMatch("health", source, target)) return false; - if(flags.FillColor && !UniFields.ValuesMatch("fillcolor", source, target)) return false; - if(flags.Alpha && !UniFields.ValuesMatch("alpha", source, target)) return false; - if(flags.Score && !UniFields.ValuesMatch("score", source, target)) return false; - if(flags.RenderStyle && !UniFields.ValuesMatch("renderstyle", source, target)) return false; - if(flags.Comment && !UniFields.ValuesMatch("comment", source, target)) return false; + if(!UIFieldsMatch(flags, source, target)) return false; // Custom fields return !flags.Fields || UniFields.CustomFieldsMatch(source.Fields, target.Fields); @@ -973,6 +1002,8 @@ namespace CodeImp.DoomBuilder.BuilderModes #endregion + #region Utility + private static bool FlagsMatch(HashSet flags1, HashSet flags2) { if(flags1.Count != flags2.Count) return false; @@ -1006,6 +1037,37 @@ namespace CodeImp.DoomBuilder.BuilderModes return count.Values.All(c => c == 0); } + + private static bool UIFieldsMatch(MapElementPropertiesCopySettings settings, MapElement first, MapElement second) + { + FieldInfo[] props = settings.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); + foreach(FieldInfo prop in props) + { + // Property set? + if(!(bool)prop.GetValue(settings)) continue; + + foreach(Attribute attr in Attribute.GetCustomAttributes(prop)) + { + if(attr.GetType() != typeof(FieldDescription)) continue; + FieldDescription fd = (FieldDescription)attr; + if(fd.SupportsCurrentMapFormat && !string.IsNullOrEmpty(fd.Field1)) + { + if(!string.IsNullOrEmpty(fd.Field2)) + { + if(!UniFields.ValuesMatch(fd.Field1, fd.Field2, first, second)) return false; + } + else + { + if(!UniFields.ValuesMatch(fd.Field1, first, second)) return false; + } + } + } + } + + return true; + } + + #endregion } #endregion diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs index 1cc5944f..7ccc7b83 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs @@ -689,7 +689,7 @@ namespace CodeImp.DoomBuilder.BuilderModes mode.SetActionResult("Pasted sector properties."); //mxd. Added "usecopysettings" - BuilderPlug.Me.CopiedSectorProps.Apply(level.sector, usecopysettings); + BuilderPlug.Me.CopiedSectorProps.Apply(new List { level.sector }, usecopysettings); if(mode.VisualSectorExists(level.sector)) { diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs index 72e0a9a4..1cfc43ed 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs @@ -1206,8 +1206,8 @@ namespace CodeImp.DoomBuilder.BuilderModes string pastetarget = (pastesideprops ? "linedef and sidedef" : "linedef"); //mxd mode.CreateUndo("Paste " + pastetarget + " properties"); mode.SetActionResult("Pasted " + pastetarget + " properties."); - BuilderPlug.Me.CopiedLinedefProps.Apply(Sidedef.Line, usecopysettings, false); //mxd - if(pastesideprops) BuilderPlug.Me.CopiedSidedefProps.Apply(Sidedef, usecopysettings); //mxd. Added "usecopysettings" + BuilderPlug.Me.CopiedLinedefProps.Apply(new List { Sidedef.Line }, usecopysettings, false); //mxd + if(pastesideprops) BuilderPlug.Me.CopiedSidedefProps.Apply(new List { Sidedef }, usecopysettings); //mxd. Added "usecopysettings" // Update sectors on both sides BaseVisualSector front = (BaseVisualSector)mode.GetVisualSector(Sidedef.Sector); diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs index 9dd61ceb..85edd65a 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs @@ -693,7 +693,7 @@ namespace CodeImp.DoomBuilder.BuilderModes { mode.CreateUndo("Paste thing properties"); mode.SetActionResult("Pasted thing properties."); - BuilderPlug.Me.CopiedThingProps.Apply(Thing, usecopysettings); //mxd. Added "usecopysettings" + BuilderPlug.Me.CopiedThingProps.Apply(new List { Thing }, usecopysettings); //mxd. Added "usecopysettings" Thing.UpdateConfiguration(); this.Rebuild(); mode.ShowTargetInfo(); diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs index 214dc934..4175b9e9 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs @@ -296,7 +296,7 @@ namespace CodeImp.DoomBuilder.BuilderModes { mode.CreateUndo("Paste vertex properties"); mode.SetActionResult("Pasted vertex properties."); - BuilderPlug.Me.CopiedVertexProps.Apply(vertex, usecopysettings); + BuilderPlug.Me.CopiedVertexProps.Apply(new List { vertex }, usecopysettings); //update affected sectors UpdateGeometry(vertex);