#region ================== Copyright (c) 2007 Pascal vd Heiden /* * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com * This program is released under GNU General Public License * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #endregion #region ================== Namespaces using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using CodeImp.DoomBuilder.Map; using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.GZBuilder.Data; //mxd using CodeImp.DoomBuilder.Types; using CodeImp.DoomBuilder.GZBuilder.Tools; using CodeImp.DoomBuilder.GZBuilder.Controls; //mxd #endregion namespace CodeImp.DoomBuilder.Windows { internal partial class LinedefEditForm : DelayedForm { #region ================== Events public event EventHandler OnValuesChanged; //mxd #endregion #region ================== Constants #endregion #region ================== Variables private ICollection lines; private List linedefProps; //mxd private bool preventchanges = false; private string arg0str; //mxd private bool haveArg0Str; //mxd //Value linking private static bool linkFrontTopScale; private static bool linkFrontMidScale; private static bool linkFrontBottomScale; private static bool linkBackTopScale; private static bool linkBackMidScale; private static bool linkBackBottomScale; private List frontUdmfControls; //mxd private List backUdmfControls; //mxd private struct LinedefProperties //mxd { public Dictionary Flags; public float Alpha; public SidedefProperties Front; public SidedefProperties Back; public LinedefProperties(Linedef line) { Front = (line.Front != null ? new SidedefProperties(line.Front) : null); Back = (line.Back != null ? new SidedefProperties(line.Back) : null); Alpha = UDMFTools.GetFloat(line.Fields, "alpha", 1.0f); Flags = line.GetFlags(); } } private class SidedefProperties //mxd { public Dictionary Flags; public float ScaleTopX; public float ScaleTopY; public float ScaleMidX; public float ScaleMidY; public float ScaleBottomX; public float ScaleBottomY; public int OffsetX; public int OffsetY; public float OffsetTopX; public float OffsetTopY; public float OffsetMidX; public float OffsetMidY; public float OffsetBottomX; public float OffsetBottomY; public int Brightness; public bool AbsoluteBrightness; public string TextureTop; public string TextureMid; public string TextureLow; public SidedefProperties(Sidedef side) { Flags = side.GetFlags(); //offset OffsetX = side.OffsetX; OffsetY = side.OffsetY; Brightness = UDMFTools.GetInteger(side.Fields, "light", 0); AbsoluteBrightness = side.Fields.GetValue("lightabsolute", false); //scales ScaleTopX = UDMFTools.GetFloat(side.Fields, "scalex_top", 1.0f); ScaleTopY = UDMFTools.GetFloat(side.Fields, "scaley_top", 1.0f); ScaleMidX = UDMFTools.GetFloat(side.Fields, "scalex_mid", 1.0f); ScaleMidY = UDMFTools.GetFloat(side.Fields, "scaley_mid", 1.0f); ScaleBottomX = UDMFTools.GetFloat(side.Fields, "scalex_bottom", 1.0f); ScaleBottomY = UDMFTools.GetFloat(side.Fields, "scaley_bottom", 1.0f); //offsets OffsetTopX = UDMFTools.GetFloat(side.Fields, "offsetx_top", 0f); OffsetTopY = UDMFTools.GetFloat(side.Fields, "offsety_top", 0f); OffsetMidX = UDMFTools.GetFloat(side.Fields, "offsetx_mid", 0f); OffsetMidY = UDMFTools.GetFloat(side.Fields, "offsety_mid", 0f); OffsetBottomX = UDMFTools.GetFloat(side.Fields, "offsetx_bottom", 0f); OffsetBottomY = UDMFTools.GetFloat(side.Fields, "offsety_bottom", 0f); //textures TextureTop = side.HighTexture; TextureMid = side.MiddleTexture; TextureLow = side.LowTexture; } } #endregion #region ================== Constructor public LinedefEditForm() { // Initialize InitializeComponent(); // Fill flags lists foreach(KeyValuePair lf in General.Map.Config.LinedefFlags) flags.Add(lf.Value, lf.Key); //mxd foreach(KeyValuePair lf in General.Map.Config.SidedefFlags) { flagsFront.Add(lf.Value, lf.Key); flagsBack.Add(lf.Value, lf.Key); } // Fill actions list action.GeneralizedCategories = General.Map.Config.GenActionCategories; action.AddInfo(General.Map.Config.SortedLinedefActions.ToArray()); // Fill activations list activation.Items.AddRange(General.Map.Config.LinedefActivates.ToArray()); foreach(LinedefActivateInfo ai in General.Map.Config.LinedefActivates) udmfactivates.Add(ai.Title, ai); // Initialize image selectors fronthigh.Initialize(); frontmid.Initialize(); frontlow.Initialize(); backhigh.Initialize(); backmid.Initialize(); backlow.Initialize(); //mxd. Setup script numbers scriptNumbers.Location = arg0.Location; foreach(ScriptItem si in General.Map.NumberedScripts) scriptNumbers.Items.Add(si); if(General.Map.FormatInterface.HasCustomFields) { //mxd //mxd. Setup script names scriptNames.Location = arg0.Location; foreach(ScriptItem nsi in General.Map.NamedScripts) scriptNames.Items.Add(nsi); // Initialize custom fields editor fieldslist.Setup("linedef"); // Fill universal fields list fieldslist.ListFixedFields(General.Map.Config.LinedefFields); //initialize controls frontUdmfControls = new List() { pfcFrontOffsetTop, pfcFrontOffsetMid, pfcFrontOffsetBottom, pfcFrontScaleTop, pfcFrontScaleMid, pfcFrontScaleBottom }; backUdmfControls = new List() { pfcBackOffsetTop, pfcBackOffsetMid, pfcBackOffsetBottom, pfcBackScaleTop, pfcBackScaleMid, pfcBackScaleBottom }; //Restore value linking pfcFrontScaleTop.LinkValues = linkFrontTopScale; pfcFrontScaleMid.LinkValues = linkFrontMidScale; pfcFrontScaleBottom.LinkValues = linkFrontBottomScale; pfcBackScaleTop.LinkValues = linkBackTopScale; pfcBackScaleMid.LinkValues = linkBackMidScale; pfcBackScaleBottom.LinkValues = linkBackBottomScale; } else { //Hide unused controls tabs.TabPages.Remove(tabcustom); settingsGroup.Visible = false; customfrontbutton.Visible = false; custombackbutton.Visible = false; labelLightFront.Visible = false; lightFront.Visible = false; cbLightAbsoluteFront.Visible = false; labelLightBack.Visible = false; lightBack.Visible = false; cbLightAbsoluteBack.Visible = false; udmfPropertiesFront.Visible = false; udmfPropertiesBack.Visible = false; } // Mixed activations? (UDMF) if(General.Map.FormatInterface.HasMixedActivations) udmfpanel.Visible = true; else if(General.Map.FormatInterface.HasPresetActivations) hexenpanel.Visible = true; // Action arguments? if(General.Map.FormatInterface.HasActionArgs) argspanel.Visible = true; // Arrange panels if(General.Map.FormatInterface.HasPresetActivations) { //mxd actiongroup.Top = settingsGroup.Top; actiongroup.Height = hexenpanel.Location.Y + hexenpanel.Height; this.Height = heightpanel1.Height; } else if(!General.Map.FormatInterface.HasMixedActivations && !General.Map.FormatInterface.HasActionArgs && !General.Map.FormatInterface.HasPresetActivations) { actiongroup.Top = settingsGroup.Top; actiongroup.Height = action.Bottom + action.Top + (actiongroup.Width - actiongroup.ClientRectangle.Width); this.Height = heightpanel2.Height; } // Tag? if(General.Map.FormatInterface.HasLinedefTag) { // Match position after the action group idgroup.Top = actiongroup.Bottom + actiongroup.Margin.Bottom + idgroup.Margin.Top; } else { idgroup.Visible = false; } } #endregion #region ================== Methods // This sets up the form to edit the given lines public void Setup(ICollection lines) { LinedefActivateInfo sai; Linedef fl; preventchanges = true; // Keep this list this.lines = lines; if(lines.Count > 1) this.Text = "Edit Linedefs (" + lines.Count + ")"; linedefProps = new List(); //mxd. Make undo string undodesc = "linedef"; if(lines.Count > 1) undodesc = lines.Count + " linedefs"; General.Map.UndoRedo.CreateUndo("Edit " + undodesc); //////////////////////////////////////////////////////////////////////// // Set all options to the first linedef properties //////////////////////////////////////////////////////////////////////// // Get first line fl = General.GetByIndex(lines, 0); // Flags foreach(CheckBox c in flags.Checkboxes) if(fl.Flags.ContainsKey(c.Tag.ToString())) c.Checked = fl.Flags[c.Tag.ToString()]; // Activations foreach(LinedefActivateInfo ai in activation.Items) if((fl.Activate & ai.Index) == ai.Index) activation.SelectedItem = ai; // UDMF Activations foreach(CheckBox c in udmfactivates.Checkboxes) { LinedefActivateInfo ai = (c.Tag as LinedefActivateInfo); if(fl.Flags.ContainsKey(ai.Key)) c.Checked = fl.Flags[ai.Key]; } //mxd. UDMF Settings if(General.Map.FormatInterface.HasCustomFields) { fieldslist.SetValues(fl.Fields, true); // Custom fields string renderStyle = fl.Fields.GetValue("renderstyle", ""); cbRenderStyle.SelectedIndex = (renderStyle == "add" ? 1 : 0); alpha.Text = General.Clamp(fl.Fields.GetValue("alpha", 1.0f), 0f, 1f).ToString(); lockNumber.Text = fl.Fields.GetValue("locknumber", 0).ToString(); arg0str = fl.Fields.GetValue("arg0str", string.Empty); haveArg0Str = !string.IsNullOrEmpty(arg0str); } // Action/tags action.Value = fl.Action; if(General.Map.FormatInterface.HasLinedefTag) {//mxd tagSelector.Setup(); tagSelector.SetTag(fl.Tag); } arg0.SetValue(fl.Args[0]); arg1.SetValue(fl.Args[1]); arg2.SetValue(fl.Args[2]); arg3.SetValue(fl.Args[3]); arg4.SetValue(fl.Args[4]); // Front side and back side checkboxes frontside.Checked = (fl.Front != null); backside.Checked = (fl.Back != null); // Front settings if(fl.Front != null) { fronthigh.TextureName = fl.Front.HighTexture; frontmid.TextureName = fl.Front.MiddleTexture; frontlow.TextureName = fl.Front.LowTexture; fronthigh.Required = fl.Front.HighRequired(); frontmid.Required = fl.Front.MiddleRequired(); frontlow.Required = fl.Front.LowRequired(); frontsector.Text = fl.Front.Sector.Index.ToString(); //mxd if(General.Map.FormatInterface.HasCustomFields) { //front settings foreach(PairedFieldsControl pfc in frontUdmfControls) pfc.SetValuesFrom(fl.Front.Fields, true); lightFront.Text = UDMFTools.GetInteger(fl.Front.Fields, "light", 0).ToString(); cbLightAbsoluteFront.Checked = fl.Front.Fields.GetValue("lightabsolute", false); //flags foreach(CheckBox c in flagsFront.Checkboxes) if(fl.Front.Flags.ContainsKey(c.Tag.ToString())) c.Checked = fl.Front.Flags[c.Tag.ToString()]; } frontTextureOffset.SetValues(fl.Front.OffsetX, fl.Front.OffsetY); //mxd } // Back settings if(fl.Back != null) { backhigh.TextureName = fl.Back.HighTexture; backmid.TextureName = fl.Back.MiddleTexture; backlow.TextureName = fl.Back.LowTexture; backhigh.Required = fl.Back.HighRequired(); backmid.Required = fl.Back.MiddleRequired(); backlow.Required = fl.Back.LowRequired(); backsector.Text = fl.Back.Sector.Index.ToString(); //mxd if(General.Map.FormatInterface.HasCustomFields) { //front settings foreach(PairedFieldsControl pfc in backUdmfControls) pfc.SetValuesFrom(fl.Back.Fields, true); lightBack.Text = UDMFTools.GetInteger(fl.Back.Fields, "light", 0).ToString(); cbLightAbsoluteBack.Checked = fl.Back.Fields.GetValue("lightabsolute", false); //flags foreach(CheckBox c in flagsBack.Checkboxes) if(fl.Back.Flags.ContainsKey(c.Tag.ToString())) c.Checked = fl.Back.Flags[c.Tag.ToString()]; } backTextureOffset.SetValues(fl.Back.OffsetX, fl.Back.OffsetY); //mxd } //////////////////////////////////////////////////////////////////////// // Now go for all lines and change the options when a setting is different //////////////////////////////////////////////////////////////////////// // Go for all lines foreach(Linedef l in lines) { // Flags foreach(CheckBox c in flags.Checkboxes) { if(l.Flags.ContainsKey(c.Tag.ToString())) { if(l.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } // Activations if(activation.Items.Count > 0) { sai = (activation.Items[0] as LinedefActivateInfo); foreach(LinedefActivateInfo ai in activation.Items) if((l.Activate & ai.Index) == ai.Index) sai = ai; if(sai != activation.SelectedItem) activation.SelectedIndex = -1; } // UDMF Activations foreach(CheckBox c in udmfactivates.Checkboxes) { LinedefActivateInfo ai = (c.Tag as LinedefActivateInfo); if(l.Flags.ContainsKey(ai.Key)) { if(c.Checked != l.Flags[ai.Key]) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } //mxd. UDMF Settings if(General.Map.FormatInterface.HasCustomFields) { int i = (l.Fields.GetValue("renderstyle", "") == "add" ? 1 : 0); if(cbRenderStyle.SelectedIndex != -1 && i != cbRenderStyle.SelectedIndex) cbRenderStyle.SelectedIndex = -1; if(!string.IsNullOrEmpty(alpha.Text) && General.Clamp(alpha.GetResultFloat(1.0f), 0f, 1f) != l.Fields.GetValue("alpha", 1.0f)) alpha.Text = ""; if(!string.IsNullOrEmpty(lockNumber.Text) && lockNumber.GetResult(0) != l.Fields.GetValue("locknumber", 0)) lockNumber.Text = ""; if(arg0str != l.Fields.GetValue("arg0str", string.Empty)) { haveArg0Str = true; arg0str = string.Empty; } l.Fields.BeforeFieldsChange(); fieldslist.SetValues(l.Fields, false); } // Action/tags if(l.Action != action.Value) action.Empty = true; if(General.Map.FormatInterface.HasLinedefTag && l.Tag != fl.Tag) tagSelector.ClearTag(); //mxd if(l.Args[0] != arg0.GetResult(-1)) arg0.ClearValue(); if(l.Args[1] != arg1.GetResult(-1)) arg1.ClearValue(); if(l.Args[2] != arg2.GetResult(-1)) arg2.ClearValue(); if(l.Args[3] != arg3.GetResult(-1)) arg3.ClearValue(); if(l.Args[4] != arg4.GetResult(-1)) arg4.ClearValue(); // Front side checkbox if((l.Front != null) != frontside.Checked) { frontside.ThreeState = true; frontside.CheckState = CheckState.Indeterminate; frontside.AutoCheck = false; } // Back side checkbox if((l.Back != null) != backside.Checked) { backside.ThreeState = true; backside.CheckState = CheckState.Indeterminate; backside.AutoCheck = false; } // Front settings if(l.Front != null) { if(fronthigh.TextureName != l.Front.HighTexture) fronthigh.TextureName = ""; if(frontmid.TextureName != l.Front.MiddleTexture) frontmid.TextureName = ""; if(frontlow.TextureName != l.Front.LowTexture) frontlow.TextureName = ""; if(fronthigh.Required != l.Front.HighRequired()) fronthigh.Required = false; if(frontmid.Required != l.Front.MiddleRequired()) frontmid.Required = false; if(frontlow.Required != l.Front.LowRequired()) frontlow.Required = false; if(frontsector.Text != l.Front.Sector.Index.ToString()) frontsector.Text = ""; //mxd if(General.Map.FormatInterface.HasCustomFields) { foreach(PairedFieldsControl pfc in frontUdmfControls) pfc.SetValuesFrom(l.Front.Fields, false); if(!string.IsNullOrEmpty(lightFront.Text)) { int light = UDMFTools.GetInteger(l.Front.Fields, "light", 0); if(light != lightFront.GetResult(light)) lightFront.Text = ""; } if(l.Front.Fields.GetValue("lightabsolute", false) != cbLightAbsoluteFront.Checked) { cbLightAbsoluteFront.ThreeState = true; cbLightAbsoluteFront.CheckState = CheckState.Indeterminate; } //flags foreach(CheckBox c in flagsFront.Checkboxes) { if(c.CheckState == CheckState.Indeterminate) continue; if(l.Front.Flags.ContainsKey(c.Tag.ToString())) { if(l.Front.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } } l.Front.Fields.BeforeFieldsChange(); //mxd frontTextureOffset.SetValues(l.Front.OffsetX, l.Front.OffsetY); //mxd } // Back settings if(l.Back != null) { if(backhigh.TextureName != l.Back.HighTexture) backhigh.TextureName = ""; if(backmid.TextureName != l.Back.MiddleTexture) backmid.TextureName = ""; if(backlow.TextureName != l.Back.LowTexture) backlow.TextureName = ""; if(backhigh.Required != l.Back.HighRequired()) backhigh.Required = false; if(backmid.Required != l.Back.MiddleRequired()) backmid.Required = false; if(backlow.Required != l.Back.LowRequired()) backlow.Required = false; if(backsector.Text != l.Back.Sector.Index.ToString()) backsector.Text = ""; //mxd if(General.Map.FormatInterface.HasCustomFields) { foreach(PairedFieldsControl pfc in backUdmfControls) pfc.SetValuesFrom(l.Back.Fields, false); if(!string.IsNullOrEmpty(lightBack.Text)) { int light = UDMFTools.GetInteger(l.Back.Fields, "light", 0); if(light != lightBack.GetResult(light)) lightBack.Text = ""; } if(l.Back.Fields.GetValue("lightabsolute", false) != cbLightAbsoluteBack.Checked) { cbLightAbsoluteBack.ThreeState = true; cbLightAbsoluteBack.CheckState = CheckState.Indeterminate; } //flags foreach(CheckBox c in flagsBack.Checkboxes) { if(c.CheckState == CheckState.Indeterminate) continue; if(l.Back.Flags.ContainsKey(c.Tag.ToString())) { if(l.Back.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } } l.Back.Fields.BeforeFieldsChange(); //mxd backTextureOffset.SetValues(l.Back.OffsetX, l.Back.OffsetY); //mxd } //mxd linedefProps.Add(new LinedefProperties(l)); } // Refresh controls so that they show their image backhigh.Refresh(); backmid.Refresh(); backlow.Refresh(); fronthigh.Refresh(); frontmid.Refresh(); frontlow.Refresh(); preventchanges = false; updateScriptControls(); //mxd //mxd. Set intial script-related values, if required if(Array.IndexOf(GZBuilder.GZGeneral.ACS_SPECIALS, action.Value) != -1) { if(haveArg0Str) { scriptNames.Text = arg0str; arg0label.Text = "Script Name:"; } else { int a0 = arg0.GetResult(0); if(a0 > 0) { for(int i = 0; i < General.Map.NumberedScripts.Count; i++) { if(General.Map.NumberedScripts[i].Index == a0) { scriptNumbers.SelectedIndex = i; break; } } if(scriptNumbers.SelectedIndex == -1) { scriptNumbers.Items.Add(new ScriptItem(a0, "Script " + a0)); scriptNumbers.SelectedIndex = scriptNumbers.Items.Count - 1; } } else { scriptNumbers.Text = arg0.Text; } } } else { scriptNumbers.Text = "0"; } } //mxd private void updateScriptControls() { if(Array.IndexOf(GZBuilder.GZGeneral.ACS_SPECIALS, action.Value) != -1) { bool showNamedScripts = General.Map.UDMF && haveArg0Str; cbArgStr.Visible = General.Map.UDMF; cbArgStr.Checked = showNamedScripts; scriptNames.Visible = showNamedScripts; scriptNumbers.Visible = !showNamedScripts; } else { cbArgStr.Visible = false; scriptNames.Visible = false; scriptNumbers.Visible = false; cbArgStr.Checked = false; } } #endregion #region ================== Events // Apply clicked private void apply_Click(object sender, EventArgs e) { Sector s; int index; // Verify the tag if(General.Map.FormatInterface.HasLinedefTag) { tagSelector.ValidateTag(); //mxd if(((tagSelector.GetTag(0) < General.Map.FormatInterface.MinTag) || (tagSelector.GetTag(0) > General.Map.FormatInterface.MaxTag))) { General.ShowWarningMessage("Linedef tag must be between " + General.Map.FormatInterface.MinTag + " and " + General.Map.FormatInterface.MaxTag + ".", MessageBoxButtons.OK); return; } } // Verify the action if((action.Value < General.Map.FormatInterface.MinAction) || (action.Value > General.Map.FormatInterface.MaxAction)) { General.ShowWarningMessage("Linedef action must be between " + General.Map.FormatInterface.MinAction + " and " + General.Map.FormatInterface.MaxAction + ".", MessageBoxButtons.OK); return; } //mxd bool hasAcs = !action.Empty && Array.IndexOf(GZBuilder.GZGeneral.ACS_SPECIALS, action.Value) != -1; int lockNum = lockNumber.GetResult(0); // Go for all the lines foreach(Linedef l in lines) { // Apply chosen activation flag if(activation.SelectedIndex > -1) l.Activate = (activation.SelectedItem as LinedefActivateInfo).Index; // UDMF activations foreach(CheckBox c in udmfactivates.Checkboxes) { LinedefActivateInfo ai = (c.Tag as LinedefActivateInfo); if(c.CheckState == CheckState.Checked) l.SetFlag(ai.Key, true); else if(c.CheckState == CheckState.Unchecked) l.SetFlag(ai.Key, false); } // Action/tags l.Tag = tagSelector.GetTag(l.Tag); //mxd if(!action.Empty) { l.Action = action.Value; //mxd. Script name/number handling if(hasAcs) { if(!cbArgStr.Checked) { //apply script number if(!string.IsNullOrEmpty(scriptNumbers.Text)) { if(scriptNumbers.SelectedItem != null) l.Args[0] = ((ScriptItem)scriptNumbers.SelectedItem).Index; else if(!int.TryParse(scriptNumbers.Text.Trim(), out l.Args[0])) l.Args[0] = 0; if(l.Fields.ContainsKey("arg0str")) l.Fields.Remove("arg0str"); } } else { //apply arg0str if(!string.IsNullOrEmpty(scriptNames.Text)) l.Fields["arg0str"] = new UniValue(UniversalType.String, scriptNames.Text); } } else { l.Args[0] = arg0.GetResult(l.Args[0]); if(l.Fields.ContainsKey("arg0str")) l.Fields.Remove("arg0str"); } }else{ l.Args[0] = arg0.GetResult(l.Args[0]); } l.Args[1] = arg1.GetResult(l.Args[1]); l.Args[2] = arg2.GetResult(l.Args[2]); l.Args[3] = arg3.GetResult(l.Args[3]); l.Args[4] = arg4.GetResult(l.Args[4]); // Remove front side? if((l.Front != null) && (frontside.CheckState == CheckState.Unchecked)) { l.Front.Dispose(); } // Create or modify front side? else if(frontside.CheckState == CheckState.Checked) { // Make sure we have a valid sector (make a new one if needed) if(l.Front != null) index = l.Front.Sector.Index; else index = -1; index = frontsector.GetResult(index); if((index > -1) && (index < General.Map.Map.Sectors.Count)) { s = General.Map.Map.GetSectorByIndex(index); if(s == null) s = General.Map.Map.CreateSector(); if(s != null) { // Create new sidedef? if(l.Front == null) General.Map.Map.CreateSidedef(l, true, s); // Change sector? if(l.Front != null && l.Front.Sector != s) l.Front.SetSector(s); } } } // Remove back side? if((l.Back != null) && (backside.CheckState == CheckState.Unchecked)) { l.Back.Dispose(); } // Create or modify back side? else if(backside.CheckState == CheckState.Checked) { // Make sure we have a valid sector (make a new one if needed) if(l.Back != null) index = l.Back.Sector.Index; else index = -1; index = backsector.GetResult(index); if((index > -1) && (index < General.Map.Map.Sectors.Count)) { s = General.Map.Map.GetSectorByIndex(index); if(s == null) s = General.Map.Map.CreateSector(); if(s != null) { // Create new sidedef? if(l.Back == null) General.Map.Map.CreateSidedef(l, false, s); // Change sector? if(l.Back != null && l.Back.Sector != s) l.Back.SetSector(s); } } } //mxd. UDMF Settings if(General.Map.FormatInterface.HasCustomFields) { fieldslist.Apply(l.Fields); UDMFTools.SetInteger(l.Fields, "locknumber", lockNum, 0); } } //mxd. Store value linking linkFrontTopScale = pfcFrontScaleTop.LinkValues; linkFrontMidScale = pfcFrontScaleMid.LinkValues; linkFrontBottomScale = pfcFrontScaleBottom.LinkValues; linkBackTopScale = pfcBackScaleTop.LinkValues; linkBackMidScale = pfcBackScaleMid.LinkValues; linkBackBottomScale = pfcBackScaleBottom.LinkValues; // Update the used textures General.Map.Data.UpdateUsedTextures(); // Done General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); //mxd this.DialogResult = DialogResult.OK; this.Close(); } // Cancel clicked private void cancel_Click(object sender, EventArgs e) { //mxd. Let's pretend nothing of this really happened... General.Map.UndoRedo.WithdrawUndo(); // Be gone this.DialogResult = DialogResult.Cancel; this.Close(); } // Front side (un)checked private void frontside_CheckStateChanged(object sender, EventArgs e) { // Enable/disable panel // NOTE: Also enabled when checkbox is grayed! frontgroup.Enabled = (frontside.CheckState != CheckState.Unchecked); } // Back side (un)checked private void backside_CheckStateChanged(object sender, EventArgs e) { // Enable/disable panel // NOTE: Also enabled when checkbox is grayed! backgroup.Enabled = (backside.CheckState != CheckState.Unchecked); } // Action changes private void action_ValueChanges(object sender, EventArgs e) { int showaction = 0; // Only when line type is known if(General.Map.Config.LinedefActions.ContainsKey(action.Value)) showaction = action.Value; // Change the argument descriptions arg0label.Text = General.Map.Config.LinedefActions[showaction].Args[0].Title + ":"; arg1label.Text = General.Map.Config.LinedefActions[showaction].Args[1].Title + ":"; arg2label.Text = General.Map.Config.LinedefActions[showaction].Args[2].Title + ":"; arg3label.Text = General.Map.Config.LinedefActions[showaction].Args[3].Title + ":"; arg4label.Text = General.Map.Config.LinedefActions[showaction].Args[4].Title + ":"; arg0label.Enabled = General.Map.Config.LinedefActions[showaction].Args[0].Used; arg1label.Enabled = General.Map.Config.LinedefActions[showaction].Args[1].Used; arg2label.Enabled = General.Map.Config.LinedefActions[showaction].Args[2].Used; arg3label.Enabled = General.Map.Config.LinedefActions[showaction].Args[3].Used; arg4label.Enabled = General.Map.Config.LinedefActions[showaction].Args[4].Used; if(arg0label.Enabled) arg0.ForeColor = SystemColors.WindowText; else arg0.ForeColor = SystemColors.GrayText; if(arg1label.Enabled) arg1.ForeColor = SystemColors.WindowText; else arg1.ForeColor = SystemColors.GrayText; if(arg2label.Enabled) arg2.ForeColor = SystemColors.WindowText; else arg2.ForeColor = SystemColors.GrayText; if(arg3label.Enabled) arg3.ForeColor = SystemColors.WindowText; else arg3.ForeColor = SystemColors.GrayText; if(arg4label.Enabled) arg4.ForeColor = SystemColors.WindowText; else arg4.ForeColor = SystemColors.GrayText; arg0.Setup(General.Map.Config.LinedefActions[showaction].Args[0]); arg1.Setup(General.Map.Config.LinedefActions[showaction].Args[1]); arg2.Setup(General.Map.Config.LinedefActions[showaction].Args[2]); arg3.Setup(General.Map.Config.LinedefActions[showaction].Args[3]); arg4.Setup(General.Map.Config.LinedefActions[showaction].Args[4]); // mxd. Apply action's default arguments if(!preventchanges) { if(showaction != 0 && General.Map.Config.LinedefActions.ContainsKey(showaction)) { arg0.SetDefaultValue(); arg1.SetDefaultValue(); arg2.SetDefaultValue(); arg3.SetDefaultValue(); arg4.SetDefaultValue(); } else { //or set them to 0 arg0.SetValue(0); arg1.SetValue(0); arg2.SetValue(0); arg3.SetValue(0); arg4.SetValue(0); } } if(!preventchanges) updateScriptControls(); //mxd } // Browse Action clicked private void browseaction_Click(object sender, EventArgs e) { action.Value = ActionBrowserForm.BrowseAction(this, action.Value); } //mxd private void cbArgStr_CheckedChanged(object sender, EventArgs e) { if(!cbArgStr.Visible) return; scriptNames.Visible = cbArgStr.Checked; scriptNumbers.Visible = !cbArgStr.Checked; arg0label.Text = cbArgStr.Checked ? "Script Name:" : "Script Number:"; } //mxd private void tabcustom_MouseEnter(object sender, EventArgs e) { fieldslist.Focus(); } // Help! private void LinedefEditForm_HelpRequested(object sender, HelpEventArgs hlpevent) { General.ShowHelp("w_linedefedit.html"); hlpevent.Handled = true; } #endregion #region ================== mxd. Realtime events (linedef) private void cbRenderStyle_SelectedIndexChanged(object sender, EventArgs e) { if(preventchanges) return; //update values if(cbRenderStyle.SelectedIndex == 1) { //add foreach(Linedef l in lines) l.Fields["renderstyle"] = new UniValue(UniversalType.String, "add"); } else { foreach(Linedef l in lines) if(l.Fields.ContainsKey("renderstyle")) l.Fields.Remove("renderstyle"); } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void alpha_WhenTextChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; //restore values if(string.IsNullOrEmpty(alpha.Text)) { foreach(Linedef l in lines) UDMFTools.SetFloat(l.Fields, "alpha", linedefProps[i++].Alpha, 1.0f); //update values } else { foreach(Linedef l in lines) { float value = General.Clamp(alpha.GetResultFloat(l.Fields.GetValue("alpha", 1.0f)), 0f, 1.0f); UDMFTools.SetFloat(l.Fields, "alpha", value, 1.0f); } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void flags_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { // Apply all flags foreach(CheckBox c in flags.Checkboxes) { if(c.CheckState == CheckState.Checked) l.SetFlag(c.Tag.ToString(), true); else if(c.CheckState == CheckState.Unchecked) l.SetFlag(c.Tag.ToString(), false); else l.SetFlag(c.Tag.ToString(), linedefProps[i].Flags[c.Tag.ToString()]); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Reltime events (sides) #region Custom fields changed // Custom fields on front sides private void customfrontbutton_Click(object sender, EventArgs e) { // Make collection of front sides List sides = new List(lines.Count); foreach(Linedef l in lines) if(l.Front != null) sides.Add(l.Front); if(!CustomFieldsForm.ShowDialog(this, "Front side custom fields", "sidedef", sides, General.Map.Config.SidedefFields)) return; //Apply values Sidedef fs = General.GetByIndex(sides, 0) as Sidedef; //..to the first side foreach(PairedFieldsControl pfc in frontUdmfControls) pfc.SetValuesFrom(fs.Fields, true); lightFront.Text = UDMFTools.GetInteger(fs.Fields, "light", 0).ToString(); cbLightAbsoluteFront.ThreeState = false; cbLightAbsoluteFront.Checked = fs.Fields.GetValue("lightabsolute", false); //flags foreach(CheckBox c in flagsFront.Checkboxes) if(fs.Flags.ContainsKey(c.Tag.ToString())) c.Checked = fs.Flags[c.Tag.ToString()]; //..then to all of them foreach(Sidedef s in sides){ foreach(PairedFieldsControl pfc in frontUdmfControls) pfc.SetValuesFrom(s.Fields, false); if(!string.IsNullOrEmpty(lightFront.Text)) { int light = UDMFTools.GetInteger(s.Fields, "light", 0); if(light != lightFront.GetResult(light)) lightFront.Text = ""; } if(s.Fields.GetValue("lightabsolute", false) != cbLightAbsoluteFront.Checked) { cbLightAbsoluteFront.ThreeState = true; cbLightAbsoluteFront.CheckState = CheckState.Indeterminate; } //flags foreach(CheckBox c in flagsFront.Checkboxes) { if(c.CheckState == CheckState.Indeterminate) continue; if(s.Flags.ContainsKey(c.Tag.ToString())) { if(s.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } // Custom fields on back sides private void custombackbutton_Click(object sender, EventArgs e) { // Make collection of back sides List sides = new List(lines.Count); foreach(Linedef l in lines) if(l.Back != null) sides.Add(l.Back); // Edit these if(!CustomFieldsForm.ShowDialog(this, "Back side custom fields", "sidedef", sides, General.Map.Config.SidedefFields)) return; //Apply values Sidedef fs = General.GetByIndex(sides, 0) as Sidedef; //..to the first side foreach(PairedFieldsControl pfc in backUdmfControls) pfc.SetValuesFrom(fs.Fields, true); lightBack.Text = UDMFTools.GetInteger(fs.Fields, "light", 0).ToString(); cbLightAbsoluteBack.ThreeState = false; cbLightAbsoluteBack.Checked = fs.Fields.GetValue("lightabsolute", false); //flags foreach(CheckBox c in flagsBack.Checkboxes) if(fs.Flags.ContainsKey(c.Tag.ToString())) c.Checked = fs.Flags[c.Tag.ToString()]; //..then to all of them foreach(Sidedef s in sides) { foreach(PairedFieldsControl pfc in backUdmfControls) pfc.SetValuesFrom(s.Fields, false); if(!string.IsNullOrEmpty(lightBack.Text)) { int light = UDMFTools.GetInteger(s.Fields, "light", 0); if(light != lightBack.GetResult(light)) lightBack.Text = ""; } if(s.Fields.GetValue("lightabsolute", false) != cbLightAbsoluteBack.Checked) { cbLightAbsoluteBack.ThreeState = true; cbLightAbsoluteBack.CheckState = CheckState.Indeterminate; } //flags foreach(CheckBox c in flagsBack.Checkboxes) { if(c.CheckState == CheckState.Indeterminate) continue; if(s.Flags.ContainsKey(c.Tag.ToString())) { if(s.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Texture changed private void fronthigh_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; //restore values if(string.IsNullOrEmpty(fronthigh.TextureName)) { int i = 0; foreach(Linedef l in lines) { if(l.Front != null) l.Front.SetTextureHigh(linedefProps[i].Front != null ? linedefProps[i].Front.TextureTop : "-"); i++; } //update values } else { foreach(Linedef l in lines) if(l.Front != null) l.Front.SetTextureHigh(fronthigh.GetResult(l.Front.HighTexture)); } // Update the used textures General.Map.Data.UpdateUsedTextures(); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void frontmid_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; //restore values if(string.IsNullOrEmpty(frontmid.TextureName)) { int i = 0; foreach(Linedef l in lines) { if(l.Front != null) l.Front.SetTextureMid(linedefProps[i].Front != null ? linedefProps[i].Front.TextureMid : "-"); i++; } //update values } else { foreach(Linedef l in lines) if(l.Front != null) l.Front.SetTextureMid(frontmid.GetResult(l.Front.MiddleTexture)); } // Update the used textures General.Map.Data.UpdateUsedTextures(); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void frontlow_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; //restore values if(string.IsNullOrEmpty(frontlow.TextureName)) { int i = 0; foreach(Linedef l in lines) { if(l.Front != null) l.Front.SetTextureLow(linedefProps[i].Front != null ? linedefProps[i].Front.TextureLow : "-"); i++; } //update values } else { foreach(Linedef l in lines) if(l.Front != null) l.Front.SetTextureLow(frontlow.GetResult(l.Front.LowTexture)); } // Update the used textures General.Map.Data.UpdateUsedTextures(); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void backhigh_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; //restore values if(string.IsNullOrEmpty(backhigh.TextureName)) { int i = 0; foreach(Linedef l in lines) { if(l.Back != null) l.Back.SetTextureHigh(linedefProps[i].Back != null ? linedefProps[i].Back.TextureTop : "-"); i++; } //update values } else { foreach(Linedef l in lines) if(l.Back != null) l.Back.SetTextureHigh(backhigh.GetResult(l.Back.HighTexture)); } // Update the used textures General.Map.Data.UpdateUsedTextures(); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void backmid_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; //restore values if(string.IsNullOrEmpty(backmid.TextureName)) { int i = 0; foreach(Linedef l in lines) { if(l.Back != null) l.Back.SetTextureMid(linedefProps[i].Back != null ? linedefProps[i].Back.TextureMid : "-"); i++; } //update values } else { foreach(Linedef l in lines) if(l.Back != null) l.Back.SetTextureMid(backmid.GetResult(l.Back.MiddleTexture)); } // Update the used textures General.Map.Data.UpdateUsedTextures(); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void backlow_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; //restore values if(string.IsNullOrEmpty(backlow.TextureName)) { int i = 0; foreach(Linedef l in lines) { if(l.Back != null) l.Back.SetTextureLow(linedefProps[i].Back != null ? linedefProps[i].Back.TextureLow : "-"); i++; } //update values } else { foreach(Linedef l in lines) if(l.Back != null) l.Back.SetTextureLow(backlow.GetResult(l.Back.LowTexture)); } // Update the used textures General.Map.Data.UpdateUsedTextures(); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Brightness changed private void lightFront_WhenTextChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; //restore values if(string.IsNullOrEmpty(lightFront.Text)) { foreach(Linedef l in lines) { if(l.Front != null) UDMFTools.SetInteger(l.Front.Fields, "light", (linedefProps[i].Front != null ? linedefProps[i].Front.Brightness : 0), 0); i++; } //update values } else { foreach(Linedef l in lines) { if(l.Front != null) { bool absolute = false; if(cbLightAbsoluteFront.CheckState == CheckState.Indeterminate) { absolute = l.Front.Fields.GetValue("lightabsolute", false); } else if(cbLightAbsoluteFront.CheckState == CheckState.Checked) { absolute = true; } int value = General.Clamp(lightFront.GetResult((linedefProps[i].Front != null ? linedefProps[i].Front.Brightness : 0)), (absolute ? 0 : -255), 255); UDMFTools.SetInteger(l.Front.Fields, "light", value, 0); } i++; } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void lightBack_WhenTextChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; //restore values if(string.IsNullOrEmpty(lightBack.Text)) { foreach(Linedef l in lines) { if(l.Back != null) UDMFTools.SetInteger(l.Back.Fields, "light", (linedefProps[i].Back != null ? linedefProps[i].Back.Brightness : 0), 0); i++; } //update values } else { foreach(Linedef l in lines) { if(l.Back != null) { bool absolute = false; if(cbLightAbsoluteBack.CheckState == CheckState.Indeterminate) { absolute = l.Back.Fields.GetValue("lightabsolute", false); } else if(cbLightAbsoluteBack.CheckState == CheckState.Checked) { absolute = true; } int value = General.Clamp(lightBack.GetResult((linedefProps[i].Back != null ? linedefProps[i].Back.Brightness : 0)), (absolute ? 0 : -255), 255); UDMFTools.SetInteger(l.Back.Fields, "light", value, 0); } i++; } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void cbLightAbsoluteFront_CheckedChanged(object sender, EventArgs e) { if(preventchanges) return; if(cbLightAbsoluteFront.Checked) { foreach(Linedef l in lines) { if(l.Front == null) continue; l.Front.Fields["lightabsolute"] = new UniValue(UniversalType.Boolean, true); } } else if(cbLightAbsoluteFront.CheckState == CheckState.Indeterminate) { int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { if(linedefProps[i].Front != null && linedefProps[i].Front.AbsoluteBrightness) { l.Front.Fields["lightabsolute"] = new UniValue(UniversalType.Boolean, true); } else if(l.Front.Fields.ContainsKey("lightabsolute")) { l.Front.Fields.Remove("lightabsolute"); } } i++; } } else { foreach(Linedef l in lines) { if(l.Front == null) continue; if(l.Front.Fields.ContainsKey("lightabsolute")) l.Front.Fields.Remove("lightabsolute"); } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void cbLightAbsoluteBack_CheckedChanged(object sender, EventArgs e) { if(preventchanges) return; if(cbLightAbsoluteBack.Checked) { foreach(Linedef l in lines) { if(l.Back == null) continue; l.Back.Fields["lightabsolute"] = new UniValue(UniversalType.Boolean, true); } } else if(cbLightAbsoluteBack.CheckState == CheckState.Indeterminate) { int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { if(linedefProps[i].Back != null && linedefProps[i].Back.AbsoluteBrightness) { l.Back.Fields["lightabsolute"] = new UniValue(UniversalType.Boolean, true); } else if(l.Back.Fields.ContainsKey("lightabsolute")) { l.Back.Fields.Remove("lightabsolute"); } } i++; } } else { foreach(Linedef l in lines) { if(l.Back == null) continue; if(l.Back.Fields.ContainsKey("lightabsolute")) l.Back.Fields.Remove("lightabsolute"); } } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Global texture offsets changed private void frontTextureOffset_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { if(linedefProps[i].Front != null) { l.Front.OffsetX = frontTextureOffset.GetValue1(linedefProps[i].Front.OffsetX); l.Front.OffsetY = frontTextureOffset.GetValue2(linedefProps[i].Front.OffsetY); } else { l.Front.OffsetX = frontTextureOffset.GetValue1(0); l.Front.OffsetY = frontTextureOffset.GetValue2(0); } } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void backTextureOffset_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { if(linedefProps[i].Back != null) { l.Back.OffsetX = backTextureOffset.GetValue1(linedefProps[i].Back.OffsetX); l.Back.OffsetY = backTextureOffset.GetValue2(linedefProps[i].Back.OffsetY); } else { l.Back.OffsetX = backTextureOffset.GetValue1(0); l.Back.OffsetY = backTextureOffset.GetValue2(0); } } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Texture offsets changed private void pfcFrontOffsetTop_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { float oldX = linedefProps[i].Front != null ? linedefProps[i].Front.OffsetTopX : 0f; float oldY = linedefProps[i].Front != null ? linedefProps[i].Front.OffsetTopY : 0f; pfcFrontOffsetTop.ApplyTo(l.Front.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcFrontOffsetMid_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { float oldX = linedefProps[i].Front != null ? linedefProps[i].Front.OffsetMidX : 0f; float oldY = linedefProps[i].Front != null ? linedefProps[i].Front.OffsetMidY : 0f; pfcFrontOffsetMid.ApplyTo(l.Front.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcFrontOffsetBottom_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { float oldX = linedefProps[i].Front != null ? linedefProps[i].Front.OffsetBottomX : 0f; float oldY = linedefProps[i].Front != null ? linedefProps[i].Front.OffsetBottomY : 0f; pfcFrontOffsetBottom.ApplyTo(l.Front.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcBackOffsetTop_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { float oldX = linedefProps[i].Back != null ? linedefProps[i].Back.OffsetTopX : 0f; float oldY = linedefProps[i].Back != null ? linedefProps[i].Back.OffsetTopY : 0f; pfcBackOffsetTop.ApplyTo(l.Back.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcBackOffsetMid_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { float oldX = linedefProps[i].Back != null ? linedefProps[i].Back.OffsetMidX : 0f; float oldY = linedefProps[i].Back != null ? linedefProps[i].Back.OffsetMidY : 0f; pfcBackOffsetMid.ApplyTo(l.Back.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcBackOffsetBottom_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { float oldX = linedefProps[i].Back != null ? linedefProps[i].Back.OffsetBottomX : 0f; float oldY = linedefProps[i].Back != null ? linedefProps[i].Back.OffsetBottomY : 0f; pfcBackOffsetBottom.ApplyTo(l.Back.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Scale changed private void pfcFrontScaleTop_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { float oldX = linedefProps[i].Front != null ? linedefProps[i].Front.ScaleTopX : 1.0f; float oldY = linedefProps[i].Front != null ? linedefProps[i].Front.ScaleTopY : 1.0f; pfcFrontScaleTop.ApplyTo(l.Front.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcFrontScaleMid_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { float oldX = linedefProps[i].Front != null ? linedefProps[i].Front.ScaleMidX : 1.0f; float oldY = linedefProps[i].Front != null ? linedefProps[i].Front.ScaleMidY : 1.0f; pfcFrontScaleMid.ApplyTo(l.Front.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcFrontScaleBottom_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front != null) { float oldX = linedefProps[i].Front != null ? linedefProps[i].Front.ScaleBottomX : 1.0f; float oldY = linedefProps[i].Front != null ? linedefProps[i].Front.ScaleBottomY : 1.0f; pfcFrontScaleBottom.ApplyTo(l.Front.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcBackScaleTop_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { float oldX = linedefProps[i].Back != null ? linedefProps[i].Back.ScaleTopX : 1.0f; float oldY = linedefProps[i].Back != null ? linedefProps[i].Back.ScaleTopY : 1.0f; pfcBackScaleTop.ApplyTo(l.Back.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcBackScaleMid_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { float oldX = linedefProps[i].Back != null ? linedefProps[i].Back.ScaleMidX : 1.0f; float oldY = linedefProps[i].Back != null ? linedefProps[i].Back.ScaleMidY : 1.0f; pfcBackScaleMid.ApplyTo(l.Back.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void pfcBackScaleBottom_OnValuesChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back != null) { float oldX = linedefProps[i].Back != null ? linedefProps[i].Back.ScaleBottomX : 1.0f; float oldY = linedefProps[i].Back != null ? linedefProps[i].Back.ScaleBottomY : 1.0f; pfcBackScaleBottom.ApplyTo(l.Back.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset, oldX, oldY); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #region Flags cahnged private void flagsFront_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Front == null) continue; // Apply all flags foreach(CheckBox c in flagsFront.Checkboxes) { if(c.CheckState == CheckState.Checked) l.Front.SetFlag(c.Tag.ToString(), true); else if(c.CheckState == CheckState.Unchecked) l.Front.SetFlag(c.Tag.ToString(), false); else l.Front.SetFlag(c.Tag.ToString(), linedefProps[i].Front.Flags[c.Tag.ToString()]); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } private void flagsBack_OnValueChanged(object sender, EventArgs e) { if(preventchanges) return; int i = 0; foreach(Linedef l in lines) { if(l.Back == null) continue; // Apply all flags foreach(CheckBox c in flagsBack.Checkboxes) { if(c.CheckState == CheckState.Checked) l.Back.SetFlag(c.Tag.ToString(), true); else if(c.CheckState == CheckState.Unchecked) l.Back.SetFlag(c.Tag.ToString(), false); else l.Back.SetFlag(c.Tag.ToString(), linedefProps[i].Back.Flags[c.Tag.ToString()]); } i++; } General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); } #endregion #endregion } }