UltimateZoneBuilder/Source/Core/Windows/LinedefEditForm.cs
MaxED bafb8ed511 UDMF: sidedef flags are now defined in game configuration instead of being hardcoded.
Texture scale controls now have "Link" button. 
Thing, Sector (UDMF) and Linedef edit forms now work in realtime mode.
Some more fixes in Edit form realtime update stuff.
Removed some unused variables and functions.
2013-07-19 15:30:58 +00:00

1739 lines
58 KiB
C#

#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
private const string EMPTY_TEXTURE = "-";
#endregion
#region ================== Variables
private ICollection<Linedef> lines;
private List<LinedefProperties> linedefProps; //mxd
private bool preventchanges = false;
//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<PairedFieldsControl> frontUdmfControls; //mxd
private List<PairedFieldsControl> backUdmfControls; //mxd
private struct LinedefProperties //mxd
{
public Dictionary<string, bool> 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<string, bool> 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<string, string> lf in General.Map.Config.LinedefFlags)
flags.Add(lf.Value, lf.Key);
//mxd
foreach(KeyValuePair<string, string> 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);
// Fill universal fields list
fieldslist.ListFixedFields(General.Map.Config.LinedefFields);
// Initialize image selectors
fronthigh.Initialize();
frontmid.Initialize();
frontlow.Initialize();
backhigh.Initialize();
backmid.Initialize();
backlow.Initialize();
// Initialize custom fields editor
fieldslist.Setup("linedef");
// 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;
}
//mxd. Setup UDMF controls
if(!General.Map.FormatInterface.HasCustomFields) {
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;
} else {
frontUdmfControls = new List<PairedFieldsControl>() { pfcFrontOffsetTop, pfcFrontOffsetMid, pfcFrontOffsetBottom, pfcFrontScaleTop, pfcFrontScaleMid, pfcFrontScaleBottom };
backUdmfControls = new List<PairedFieldsControl>() { 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;
}
}
#endregion
#region ================== Methods
// This sets up the form to edit the given lines
public void Setup(ICollection<Linedef> 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<LinedefProperties>();
//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. setup arg0str
arg0str.Location = arg0.Location;
// Custom fields
fieldslist.SetValues(fl.Fields, true);
//mxd. UDMF Settings
if(General.Map.FormatInterface.HasCustomFields) {
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();
}
// 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 = "";
}
// 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();
//mxd. Check if we have different arg0str values
if(Array.IndexOf(GZBuilder.GZGeneral.ACS_SPECIALS, action.Value) != -1 && cbArgStr.Checked && !string.IsNullOrEmpty(arg0str.Text) && l.Fields.ContainsKey("arg0str") && l.Fields["arg0str"].Value.ToString() != arg0str.Text) {
arg0str.SelectedIndex = -1;
arg0str.Text = string.Empty;
}
// 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) && lightBack.Text != UDMFTools.GetInteger(fl.Back.Fields, "light", 0).ToString())
//lightBack.Text = "";
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));
// Custom fields
l.Fields.BeforeFieldsChange(); //mxd
fieldslist.SetValues(l.Fields, false);
}
// Refresh controls so that they show their image
backhigh.Refresh();
backmid.Refresh();
backlow.Refresh();
fronthigh.Refresh();
frontmid.Refresh();
frontlow.Refresh();
preventchanges = false;
}
//mxd
private void setNumberedScripts(Linedef l) {
arg0str.Items.Clear();
if (General.Map.NumberedScripts.Count > 0) {
foreach (ScriptItem si in General.Map.NumberedScripts) {
arg0str.Items.Add(si);
if (si.Index == l.Args[0])
arg0str.SelectedIndex = arg0str.Items.Count - 1;
}
//script number is not among known scripts...
if (arg0str.SelectedIndex == -1 && l.Args[0] > 0) {
arg0str.Items.Add(new ScriptItem(l.Args[0], "Script " + l.Args[0]));
arg0str.SelectedIndex = arg0str.Items.Count - 1;
}
} else if (l.Args[0] > 0) {
arg0str.Items.Add(new ScriptItem(l.Args[0], "Script " + l.Args[0]));
arg0str.SelectedIndex = 0;
}
}
//mxd
private void setNamedScripts(string selectedValue) {
arg0str.Items.Clear();
//update arg0str items
if (General.Map.NamedScripts.Count > 0) {
ScriptItem[] sn = new ScriptItem[General.Map.NamedScripts.Count];
General.Map.NamedScripts.CopyTo(sn, 0);
arg0str.Items.AddRange(sn);
for (int i = 0; i < sn.Length; i++) {
if (sn[i].Name == selectedValue) {
arg0str.SelectedIndex = i;
break;
}
}
} else {
arg0str.Text = selectedValue;
}
}
#endregion
// This selects all text in a textbox
/*private void SelectAllText(object sender, EventArgs e)
{
(sender as TextBox).SelectAll();
}*/
#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;
bool hasArg0str = General.Map.UDMF && hasAcs && !string.IsNullOrEmpty(arg0str.Text);
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
if (hasAcs && !cbArgStr.Checked) {
if (arg0str.SelectedItem != null)
l.Args[0] = ((ScriptItem)arg0str.SelectedItem).Index;
else if (!int.TryParse(arg0str.Text.Trim(), out l.Args[0]))
l.Args[0] = 0;
} 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)
UDMFTools.SetInteger(l.Fields, "locknumber", lockNum, 0, false);
//mxd. apply arg0str
if(cbArgStr.Visible && cbArgStr.Checked && hasArg0str) {
l.Fields["arg0str"] = new UniValue(UniversalType.String, arg0str.Text);
} else if(l.Fields.ContainsKey("arg0str") && (string.IsNullOrEmpty(l.Fields["arg0str"].Value.ToString()) || !hasAcs || (hasAcs && !cbArgStr.Checked))) {
l.Fields.Remove("arg0str");
}
}
//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);
}
}
//mxd. update arg0str
if (Array.IndexOf(GZBuilder.GZGeneral.ACS_SPECIALS, showaction) != -1) {
arg0str.Visible = true;
if (General.Map.UDMF && fieldslist.GetValue("arg0str") != null) {
cbArgStr.Visible = true;
cbArgStr.Checked = true;
setNamedScripts((string)fieldslist.GetValue("arg0str"));
} else { //use script numbers
cbArgStr.Visible = General.Map.UDMF;
cbArgStr.Checked = false;
Linedef l = General.GetByIndex(lines, 0);
setNumberedScripts(l);
}
} else {
if(cbArgStr.Checked) cbArgStr.Checked = false;
cbArgStr.Visible = false;
arg0label.Text = General.Map.Config.LinedefActions[showaction].Args[0].Title + ":";
arg0str.Visible = false;
}
}
// 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) {
arg0str.Text = "";
if (cbArgStr.Checked) {
setNamedScripts((string)fieldslist.GetValue("arg0str"));
} else if (!cbArgStr.Checked) {
setNumberedScripts(General.GetByIndex(lines, 0));
}
arg0label.Text = cbArgStr.Checked ? "Script name:" : "Script number:";
}
//mxd
private void arg0str_Leave(object sender, EventArgs e) {
if (cbArgStr.Checked) fieldslist.SetValue("arg0str", arg0str.Text, UniversalType.String);
}
//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, false);
//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, false);
}
}
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);
}
private void fieldslist_OnFieldValueChanged(string fieldname) {
if(preventchanges) return;
Linedef fl = null;
foreach(Linedef l in lines) {
fieldslist.Apply(l.Fields);
if(fl == null) fl = l;
}
if(fl == null) return;
//update interface... yaaaay...
switch(fieldname) {
case "arg0str":
if(cbArgStr.Checked) arg0str.Text = (string)fieldslist.GetValue(fieldname);
break;
case "alpha":
alpha.Text = (string)fieldslist.GetValue(fieldname);
break;
case "locknumber":
lockNumber.Text = (string)fieldslist.GetValue(fieldname);
break;
case "renderstyle":
string renderstyle = (string)fieldslist.GetValue(fieldname);
if(renderstyle == "add") {
cbRenderStyle.SelectedIndex = 1;
} else if(renderstyle == "translucent") {
cbRenderStyle.SelectedIndex = 0;
} else {
cbRenderStyle.SelectedIndex = -1;
}
break;
}
}
#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<MapElement> sides = new List<MapElement>(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<MapElement> sides = new List<MapElement>(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;
//General.Map.UndoRedo.WithdrawUndo();
//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 : EMPTY_TEXTURE);
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 : EMPTY_TEXTURE);
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 : EMPTY_TEXTURE);
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 : EMPTY_TEXTURE);
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 : EMPTY_TEXTURE);
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 : EMPTY_TEXTURE);
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, false);
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, false);
}
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, false);
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, false);
}
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
}
}