From d29bd54034fcf109ffe69c2b9f9ea4136f4372cf Mon Sep 17 00:00:00 2001
From: MascaraSnake <jonassauer27@gmail.com>
Date: Wed, 28 Dec 2022 23:04:32 +0100
Subject: [PATCH] Refactor code that relies on the number of action args being
 exactly 5

---
 Source/Core/Config/GameConfiguration.cs       |  2 +-
 Source/Core/Config/LinedefActionInfo.cs       |  4 +-
 Source/Core/Config/ProgramConfiguration.cs    | 14 ++--
 Source/Core/Config/ThingTypeInfo.cs           | 10 +--
 Source/Core/Controls/ArgumentsControl.cs      | 66 +++++++------------
 Source/Core/Controls/LinedefInfoPanel.cs      | 49 ++++----------
 Source/Core/Controls/ThingInfoPanel.cs        | 29 ++++----
 Source/Core/Editing/ThingsFilter.cs           | 14 ++--
 Source/Core/Geometry/Tools.cs                 |  4 +-
 Source/Core/IO/ClipboardStreamReader.cs       |  4 +-
 Source/Core/IO/UniversalStreamReader.cs       | 14 ++--
 Source/Core/IO/UniversalStreamWriter.cs       | 18 +++--
 Source/Core/Map/Linedef.cs                    |  2 +-
 Source/Core/Map/MapSet.cs                     |  4 +-
 Source/Core/Map/Thing.cs                      |  2 +-
 Source/Plugins/3DFloorMode/ThreeDFloor.cs     |  2 +-
 .../BuilderModes/ClassicModes/SectorsMode.cs  |  2 +-
 .../FindReplace/FindLinedefSectorRef.cs       |  2 +-
 .../FindReplace/FindLinedefThingRef.cs        |  2 +-
 .../FindReplace/FindThingSectorRef.cs         |  2 +-
 .../FindReplace/FindThingThingRef.cs          |  2 +-
 .../BuilderModes/General/Association.cs       | 31 ++++-----
 22 files changed, 107 insertions(+), 172 deletions(-)

diff --git a/Source/Core/Config/GameConfiguration.cs b/Source/Core/Config/GameConfiguration.cs
index 63cb92972..cf29f2b26 100755
--- a/Source/Core/Config/GameConfiguration.cs
+++ b/Source/Core/Config/GameConfiguration.cs
@@ -464,7 +464,7 @@ namespace CodeImp.DoomBuilder.Config
 			planeequationsupport = cfg.ReadSetting("planeequationsupport", false);
 			distinctfloorandceilingbrightness = cfg.ReadSetting("distinctfloorandceilingbrightness", false);
 			distinctwallbrightness = cfg.ReadSetting("distinctwallbrightness", false);
-			for (int i = 0; i < Linedef.NUM_ARGS; i++) makedoorargs[i] = cfg.ReadSetting("makedoorarg" + i.ToString(CultureInfo.InvariantCulture), 0);
+			for (int i = 0; i < makedoorargs.Length; i++) makedoorargs[i] = cfg.ReadSetting("makedoorarg" + i.ToString(CultureInfo.InvariantCulture), 0);
 
 			//mxd. Update map format flags
 			universalmapformat = (formatinterface == "UniversalMapSetIO");
diff --git a/Source/Core/Config/LinedefActionInfo.cs b/Source/Core/Config/LinedefActionInfo.cs
index e3b6ab902..941e57dab 100755
--- a/Source/Core/Config/LinedefActionInfo.cs
+++ b/Source/Core/Config/LinedefActionInfo.cs
@@ -122,7 +122,7 @@ namespace CodeImp.DoomBuilder.Config
 			this.errorcheckerexemptions.FloorRaiseToHighest = cfg.ReadSetting(actionsetting + ".errorchecker.floorraisetohighest", false);
 
 			// Read the args
-			for (int i = 0; i < Linedef.NUM_ARGS; i++)
+			for (int i = 0; i < this.args.Length; i++)
 				this.args[i] = new ArgumentInfo(cfg, actionsetting, i, enums);
 			
 			// We have no destructor
@@ -138,7 +138,7 @@ namespace CodeImp.DoomBuilder.Config
 			this.requiresactivation = true; //mxd. Unused, set for consistency sake.
 			this.title = title;
 			this.args = new ArgumentInfo[Linedef.NUM_ARGS];
-			for(int i = 0; i < Linedef.NUM_ARGS; i++)
+			for(int i = 0; i < this.args.Length; i++)
 				this.args[i] = new ArgumentInfo(i);
 		}
 
diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs
index 57e41880b..5cb092ea7 100755
--- a/Source/Core/Config/ProgramConfiguration.cs
+++ b/Source/Core/Config/ProgramConfiguration.cs
@@ -734,11 +734,8 @@ namespace CodeImp.DoomBuilder.Config
 			ThingTypeInfo tti = General.Map.Data.GetThingInfoEx(t.Type);
 			if(tti != null) 
 			{
-				t.Args[0] = (int)tti.Args[0].DefaultValue;
-				t.Args[1] = (int)tti.Args[1].DefaultValue;
-				t.Args[2] = (int)tti.Args[2].DefaultValue;
-				t.Args[3] = (int)tti.Args[3].DefaultValue;
-				t.Args[4] = (int)tti.Args[4].DefaultValue;
+				for (int i = 0; i < t.Args.Length; i++)
+					t.Args[i] = (int)tti.Args[i].DefaultValue;
 			}
 		}
 
@@ -764,11 +761,8 @@ namespace CodeImp.DoomBuilder.Config
 			ThingTypeInfo tti = General.Map.Data.GetThingInfoEx(t.Type);
 			if (tti != null)
 			{
-				t.Args[0] = (int)tti.Args[0].DefaultValue;
-				t.Args[1] = (int)tti.Args[1].DefaultValue;
-				t.Args[2] = (int)tti.Args[2].DefaultValue;
-				t.Args[3] = (int)tti.Args[3].DefaultValue;
-				t.Args[4] = (int)tti.Args[4].DefaultValue;
+				for (int i = 0; i < t.Args.Length; i++)
+					t.Args[i] = (int)tti.Args[i].DefaultValue;
 			}
 		}
 
diff --git a/Source/Core/Config/ThingTypeInfo.cs b/Source/Core/Config/ThingTypeInfo.cs
index bd30aabeb..b14c4797d 100755
--- a/Source/Core/Config/ThingTypeInfo.cs
+++ b/Source/Core/Config/ThingTypeInfo.cs
@@ -261,7 +261,7 @@ namespace CodeImp.DoomBuilder.Config
 			}
 			
 			// Read the args
-			for(int i = 0; i < Linedef.NUM_ARGS; i++)
+			for(int i = 0; i < this.args.Length; i++)
 				this.args[i] = new ArgumentInfo(cfg, "thingtypes." + cat.Name + "." + key, i, enums);
 			
 			// Safety
@@ -294,7 +294,7 @@ namespace CodeImp.DoomBuilder.Config
 			this.bright = false; //mxd
 			this.distancechecksq = double.MaxValue;
 			this.args = new ArgumentInfo[Linedef.NUM_ARGS];
-			for(int i = 0; i < Linedef.NUM_ARGS; i++) this.args[i] = new ArgumentInfo(i);
+			for(int i = 0; i < this.args.Length; i++) this.args[i] = new ArgumentInfo(i);
 			
 			// Read properties
 			this.sprite = cat.Sprite;
@@ -341,7 +341,7 @@ namespace CodeImp.DoomBuilder.Config
 			this.bright = false; //mxd
 			this.distancechecksq = double.MaxValue;
 			this.args = new ArgumentInfo[Linedef.NUM_ARGS];
-			for(int i = 0; i < Linedef.NUM_ARGS; i++) this.args[i] = new ArgumentInfo(i);
+			for(int i = 0; i < this.args.Length; i++) this.args[i] = new ArgumentInfo(i);
 			
 			// Read properties
 			this.sprite = cat.Sprite;
@@ -390,7 +390,7 @@ namespace CodeImp.DoomBuilder.Config
 			this.bright = false; //mxd
 			this.distancechecksq = double.MaxValue;
 			this.args = new ArgumentInfo[Linedef.NUM_ARGS];
-			for(int i = 0; i < Linedef.NUM_ARGS; i++) this.args[i] = new ArgumentInfo(i);
+			for(int i = 0; i < this.args.Length; i++) this.args[i] = new ArgumentInfo(i);
 
 			// Read properties
 			this.sprite = cat.Sprite;
@@ -438,7 +438,7 @@ namespace CodeImp.DoomBuilder.Config
 			this.classname = other.classname; //mxd
 			this.isknown = true;
 			this.args = new ArgumentInfo[Linedef.NUM_ARGS];
-			for(int i = 0; i < Linedef.NUM_ARGS; i++)
+			for(int i = 0; i < this.args.Length; i++)
 				this.args[i] = other.args[i];
 
 			// Copy properties
diff --git a/Source/Core/Controls/ArgumentsControl.cs b/Source/Core/Controls/ArgumentsControl.cs
index 77dd699af..0455e3a49 100755
--- a/Source/Core/Controls/ArgumentsControl.cs
+++ b/Source/Core/Controls/ArgumentsControl.cs
@@ -45,7 +45,9 @@ namespace CodeImp.DoomBuilder.Controls
 		private int action;
 		private ArgumentInfo[] arginfo;
 		private ArgZeroMode argzeromode;
-        private ArgZeroMode Arg0Mode
+		private Label[] labels;
+		private ArgumentBox[] args;
+		private ArgZeroMode Arg0Mode
         {
             get { return argzeromode; }
             set
@@ -64,13 +66,16 @@ namespace CodeImp.DoomBuilder.Controls
 			InitializeComponent();
 
             Reset();
+
+			labels = new Label[] { arg0label, arg1label, arg2label, arg3label, arg4label };
+			args = new ArgumentBox[] { arg0, arg1, arg2, arg3, arg4 };
 		}
 
-        #endregion
+		#endregion
 
-        #region ================== Setup
+		#region ================== Setup
 
-        public void Reset()
+		public void Reset()
         {
             // Only when running (this.DesignMode won't do when not this, but one of parent controls is in design mode)
             if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
@@ -89,7 +94,7 @@ namespace CodeImp.DoomBuilder.Controls
 			SetValue(t.Fields, t.Args, first);
 		}
 
-		private void SetValue(UniFields fields, int[] args, bool first)
+		private void SetValue(UniFields fields, int[] newargs, bool first)
 		{
 			if(first)
 			{
@@ -100,11 +105,8 @@ namespace CodeImp.DoomBuilder.Controls
 				}
 
 				// Update arguments
-				arg0.SetValue(args[0]);
-				arg1.SetValue(args[1]);
-				arg2.SetValue(args[2]);
-				arg3.SetValue(args[3]);
-				arg4.SetValue(args[4]);
+				for (int i = 0; i < args.Length; i++)
+					args[i].SetValue(newargs[i]);
 			}
 			else
 			{
@@ -118,11 +120,8 @@ namespace CodeImp.DoomBuilder.Controls
 				}
 
 				// Update arguments
-				if(!string.IsNullOrEmpty(arg0.Text) && args[0] != arg0.GetResult(int.MinValue)) arg0.ClearValue();
-				if(!string.IsNullOrEmpty(arg1.Text) && args[1] != arg1.GetResult(int.MinValue)) arg1.ClearValue();
-				if(!string.IsNullOrEmpty(arg2.Text) && args[2] != arg2.GetResult(int.MinValue)) arg2.ClearValue();
-				if(!string.IsNullOrEmpty(arg3.Text) && args[3] != arg3.GetResult(int.MinValue)) arg3.ClearValue();
-				if(!string.IsNullOrEmpty(arg4.Text) && args[4] != arg4.GetResult(int.MinValue)) arg4.ClearValue();
+				for (int i = 0; i < args.Length; i++)
+					if (!string.IsNullOrEmpty(args[i].Text) && newargs[i] != args[i].GetResult(int.MinValue)) args[i].ClearValue();
 			}
 		}
 
@@ -178,10 +177,8 @@ namespace CodeImp.DoomBuilder.Controls
 			}
 
 			// Apply the rest of args
-			l.Args[1] = arg1.GetResult(l.Args[1], step);
-			l.Args[2] = arg2.GetResult(l.Args[2], step);
-			l.Args[3] = arg3.GetResult(l.Args[3], step);
-			l.Args[4] = arg4.GetResult(l.Args[4], step);
+			for (int i = 1; i < args.Length; i++)
+				l.Args[i] = args[i].GetResult(l.Args[i], step);
 		}
 
 		public void Apply(Thing t, int step)
@@ -231,11 +228,9 @@ namespace CodeImp.DoomBuilder.Controls
                 default: throw new NotImplementedException("Unknown ArgZeroMode");
             }
 
-            // Apply the rest of args
-            t.Args[1] = arg1.GetResult(t.Args[1], step);
-			t.Args[2] = arg2.GetResult(t.Args[2], step);
-			t.Args[3] = arg3.GetResult(t.Args[3], step);
-			t.Args[4] = arg4.GetResult(t.Args[4], step);
+			// Apply the rest of args
+			for (int i = 1; i < args.Length; i++)
+				t.Args[i] = args[i].GetResult(t.Args[i], step);
 		}
 
 		#endregion
@@ -269,30 +264,21 @@ namespace CodeImp.DoomBuilder.Controls
 			// Change the argument descriptions
 			this.BeginUpdate();
 
-			UpdateArgument(arg0, arg0label, arginfo[0]);
-			UpdateArgument(arg1, arg1label, arginfo[1]);
-			UpdateArgument(arg2, arg2label, arginfo[2]);
-			UpdateArgument(arg3, arg3label, arginfo[3]);
-			UpdateArgument(arg4, arg4label, arginfo[4]);
+			for (int i = 0; i < args.Length; i++)
+				UpdateArgument(args[i], labels[i], arginfo[i]);
 
 			if(!setuponly)
 			{
 				// Apply action's or thing's default arguments
 				if(showaction != 0 || info != null)
 				{
-					arg0.SetDefaultValue();
-                    arg1.SetDefaultValue();
-					arg2.SetDefaultValue();
-					arg3.SetDefaultValue();
-					arg4.SetDefaultValue();
+					for (int i = 0; i < args.Length; i++)
+						args[i].SetDefaultValue();
 				}
 				else //or set them to 0
 				{
-					arg0.SetValue(0);
-                    arg1.SetValue(0);
-					arg2.SetValue(0);
-					arg3.SetValue(0);
-					arg4.SetValue(0);
+					for (int i = 0; i < args.Length; i++)
+						args[i].SetValue(0);
 				}
                 // arg0str currently can't have any default
                 arg0named.Text = arg0strval = " ";
@@ -436,8 +422,6 @@ namespace CodeImp.DoomBuilder.Controls
 
 		private void UpdateScriptArguments(ScriptItem item)
 		{
-			Label[] labels = { arg0label, arg1label, arg2label, arg3label, arg4label };
-			ArgumentBox[] args = { arg0, arg1, arg2, arg3, arg4 };
 			if(item != null)
 			{
                 int first;
diff --git a/Source/Core/Controls/LinedefInfoPanel.cs b/Source/Core/Controls/LinedefInfoPanel.cs
index 642f0ec56..f2a62e94f 100755
--- a/Source/Core/Controls/LinedefInfoPanel.cs
+++ b/Source/Core/Controls/LinedefInfoPanel.cs
@@ -36,7 +36,9 @@ namespace CodeImp.DoomBuilder.Controls
 	{
 		private readonly int hexenformatwidth;
 		private readonly int doomformatwidth;
-		
+		private Label[] arglabels;
+		private Label[] args;
+
 		// Constructor
 		public LinedefInfoPanel()
 		{
@@ -48,6 +50,9 @@ namespace CodeImp.DoomBuilder.Controls
 			hexenformatwidth = infopanel.Width;
 			doomformatwidth = infopanel.Width - 190;
 
+			arglabels = new Label[] { arglbl1, arglbl2, arglbl3, arglbl4, arglbl5 };
+			args = new Label[] { arg1, arg2, arg3, arg4, arg5 };
+
 			// We have to set the parernt (and subsequently the new location relative to the parent) here since
 			// we can't set the parent in the designer. And if the parent is not set to the ConfigurablePictureBox
 			// the Label's background alpha will not work correctly
@@ -78,36 +83,15 @@ namespace CodeImp.DoomBuilder.Controls
 		public void ShowInfo(Linedef l, Sidedef highlightside)
 		{
 			string peggedness;
-			
+
 			// Show/hide stuff depending on format
-			if(!General.Map.FormatInterface.HasActionArgs)
+			bool hasArgs = General.Map.FormatInterface.HasActionArgs;
+			for (int i = 0; i < args.Length; i++)
 			{
-				arglbl1.Visible = false;
-				arglbl2.Visible = false;
-				arglbl3.Visible = false;
-				arglbl4.Visible = false;
-				arglbl5.Visible = false;
-				arg1.Visible = false;
-				arg2.Visible = false;
-				arg3.Visible = false;
-				arg4.Visible = false;
-				arg5.Visible = false;
-				infopanel.Width = doomformatwidth;
-			}
-			else
-			{
-				arglbl1.Visible = true;
-				arglbl2.Visible = true;
-				arglbl3.Visible = true;
-				arglbl4.Visible = true;
-				arglbl5.Visible = true;
-				arg1.Visible = true;
-				arg2.Visible = true;
-				arg3.Visible = true;
-				arg4.Visible = true;
-				arg5.Visible = true;
-				infopanel.Width = hexenformatwidth;
+				arglabels[i].Visible = hasArgs;
+				args[i].Visible = hasArgs;
 			}
+			infopanel.Width = (hasArgs ? hexenformatwidth : doomformatwidth);
 
 			//mxd. Hide activation or tag and rearrange labels 
 			if(!General.Map.FormatInterface.HasBuiltInActivations && General.Map.FormatInterface.HasNumericLinedefActivations) //Hexen map format?
@@ -251,9 +235,6 @@ namespace CodeImp.DoomBuilder.Controls
 			}
 
 			// Apply script args?
-			Label[] arglabels = { arglbl1, arglbl2, arglbl3, arglbl4, arglbl5 };
-			Label[] args = { arg1, arg2, arg3, arg4, arg5 };
-
 			if(scriptitem != null)
 			{
                 int first;
@@ -302,10 +283,8 @@ namespace CodeImp.DoomBuilder.Controls
 			//mxd. Set argument value and label
 			if(isarg0str) arg1.Text = arg0str;
 			else SetArgumentText(act.Args[0], arg1, l.Args[0]);
-			SetArgumentText(act.Args[1], arg2, l.Args[1]);
-			SetArgumentText(act.Args[2], arg3, l.Args[2]);
-			SetArgumentText(act.Args[3], arg4, l.Args[3]);
-			SetArgumentText(act.Args[4], arg5, l.Args[4]);
+			for (int i = 1; i < args.Length; i++)
+				SetArgumentText(act.Args[i], args[i], l.Args[i]);
 
 			// Front side available?
 			if(l.Front != null)
diff --git a/Source/Core/Controls/ThingInfoPanel.cs b/Source/Core/Controls/ThingInfoPanel.cs
index 200f2add6..82bcf7e96 100755
--- a/Source/Core/Controls/ThingInfoPanel.cs
+++ b/Source/Core/Controls/ThingInfoPanel.cs
@@ -36,6 +36,8 @@ namespace CodeImp.DoomBuilder.Controls
 	{
 		private readonly int hexenformatwidth;
 		private readonly int doomformatwidth;
+		private Label[] arglabels;
+		private Label[] args;
 
 		// Constructor
 		public ThingInfoPanel()
@@ -47,6 +49,9 @@ namespace CodeImp.DoomBuilder.Controls
 			// Hide stuff when in Doom format
 			hexenformatwidth = infopanel.Width;
 			doomformatwidth = infopanel.Width - 190;
+
+			arglabels = new Label[] { arglbl1, arglbl2, arglbl3, arglbl4, arglbl5 };
+			args = new Label[] { arg1, arg2, arg3, arg4, arg5 };
 		}
 
 		// This shows the info
@@ -54,16 +59,11 @@ namespace CodeImp.DoomBuilder.Controls
 		{
 			// Show/hide stuff depending on format
 			bool hasArgs = General.Map.FormatInterface.HasActionArgs;
-			arglbl1.Visible = hasArgs;
-			arglbl2.Visible = hasArgs;
-			arglbl3.Visible = hasArgs;
-			arglbl4.Visible = hasArgs;
-			arglbl5.Visible = hasArgs;
-			arg1.Visible = hasArgs;
-			arg2.Visible = hasArgs;
-			arg3.Visible = hasArgs;
-			arg4.Visible = hasArgs;
-			arg5.Visible = hasArgs;
+			for (int i = 0; i < args.Length; i++)
+			{
+				arglabels[i].Visible = hasArgs;
+				args[i].Visible = hasArgs;
+			}
 			infopanel.Width = (hasArgs ? hexenformatwidth : doomformatwidth);
 
 			//mxd
@@ -158,9 +158,6 @@ namespace CodeImp.DoomBuilder.Controls
             }
 
             // Apply script args?
-            Label[] arglabels = { arglbl1, arglbl2, arglbl3, arglbl4, arglbl5 };
-            Label[] args = { arg1, arg2, arg3, arg4, arg5 };
-
             if (scriptitem != null)
             {
                 int first;
@@ -209,10 +206,8 @@ namespace CodeImp.DoomBuilder.Controls
             //mxd. Set argument value and label
             if (isarg0str) arg1.Text = arg0str;
             else SetArgumentText(act.Args[0], arg1, t.Args[0]);
-            SetArgumentText(arginfo[1], arg2, t.Args[1]);
-			SetArgumentText(arginfo[2], arg3, t.Args[2]);
-			SetArgumentText(arginfo[3], arg4, t.Args[3]);
-			SetArgumentText(arginfo[4], arg5, t.Args[4]);
+			for (int i = 1; i < args.Length; i++)
+				SetArgumentText(arginfo[i], args[i], t.Args[i]);
 
 			//mxd. Flags
 			flags.Items.Clear();
diff --git a/Source/Core/Editing/ThingsFilter.cs b/Source/Core/Editing/ThingsFilter.cs
index 80071c2e7..f1a6d8623 100755
--- a/Source/Core/Editing/ThingsFilter.cs
+++ b/Source/Core/Editing/ThingsFilter.cs
@@ -93,7 +93,7 @@ namespace CodeImp.DoomBuilder.Editing
 		internal int ThingAngle { get { return thingangle; } set { thingangle = value; } }
 		internal int ThingZHeight { get { return thingzheight; } set { thingzheight = value; } }
 		internal int ThingAction { get { return thingaction; } set { thingaction = value; } }
-		internal int[] ThingArgs { get { return thingargs; } set { Array.Copy(value, thingargs, Thing.NUM_ARGS); } }
+		internal int[] ThingArgs { get { return thingargs; } set { Array.Copy(value, thingargs, thingargs.Length); } }
 		internal int ThingTag { get { return thingtag; } set { thingtag = value; } }
 		internal UniFields ThingCustomFields { get { return customfields; } set { customfields = new UniFields(value); } }
 		internal ICollection<string> RequiredFields { get { return requiredfields; } }
@@ -120,7 +120,7 @@ namespace CodeImp.DoomBuilder.Editing
 			thingangle = f.thingangle;
 			thingaction = f.thingaction;
 			thingargs = new int[Thing.NUM_ARGS];
-			Array.Copy(f.thingargs, thingargs, Thing.NUM_ARGS);
+			Array.Copy(f.thingargs, thingargs, thingargs.Length);
 			thingtag = f.thingtag;
 			customfields = new UniFields(f.customfields);
 			requiredfields = new List<string>(f.requiredfields);
@@ -150,7 +150,7 @@ namespace CodeImp.DoomBuilder.Editing
 			thingangle = cfg.ReadSetting(path + ".angle", -1);
 			thingzheight = cfg.ReadSetting(path + ".zheight", int.MinValue);
 			thingaction = cfg.ReadSetting(path + ".action", -1);
-			for(int i = 0; i < Thing.NUM_ARGS; i++)
+			for(int i = 0; i < thingargs.Length; i++)
 				thingargs[i] = cfg.ReadSetting(path + ".arg" + i.ToString(CultureInfo.InvariantCulture), -1);
 			thingtag = cfg.ReadSetting(path + ".tag", -1);
 			
@@ -194,7 +194,7 @@ namespace CodeImp.DoomBuilder.Editing
 			thingzheight = int.MinValue;
 			thingaction = -1;
 			thingargs = new int[Thing.NUM_ARGS];
-			for(int i = 0 ; i < Thing.NUM_ARGS; i++) thingargs[i] = -1;
+			for(int i = 0 ; i < thingargs.Length; i++) thingargs[i] = -1;
 			thingtag = -1;
 			name = DEFAULT_NAME;
 			
@@ -233,7 +233,7 @@ namespace CodeImp.DoomBuilder.Editing
 				if(!General.Map.FormatInterface.HasThingTag) thingtag = -1;
 				if(!General.Map.FormatInterface.HasActionArgs)
 				{
-					for(int i = 0; i < Thing.NUM_ARGS; i++) thingargs[i] = -1;
+					for(int i = 0; i < thingargs.Length; i++) thingargs[i] = -1;
 				}
 				if(!General.Map.FormatInterface.HasCustomFields) customfields.Clear();
 			}
@@ -309,7 +309,7 @@ namespace CodeImp.DoomBuilder.Editing
 			cfg.WriteSetting(path + ".angle", thingangle);
 			cfg.WriteSetting(path + ".zheight", thingzheight);
 			cfg.WriteSetting(path + ".action", thingaction);
-			for(int i = 0; i < Thing.NUM_ARGS; i++)
+			for(int i = 0; i < thingargs.Length; i++)
 				cfg.WriteSetting(path + ".arg" + i.ToString(CultureInfo.InvariantCulture), thingargs[i]);
 			cfg.WriteSetting(path + ".tag", thingtag);
 			
@@ -369,7 +369,7 @@ namespace CodeImp.DoomBuilder.Editing
 				qualifies &= (thingzheight == int.MinValue) || ((int)(t.Position.z) == thingzheight);
 				qualifies &= (thingaction == -1) || (t.Action == thingaction);
 				qualifies &= (thingtag == -1) || (t.Tag == thingtag);
-				for(int i = 0; i < Thing.NUM_ARGS; i++)
+				for(int i = 0; i < thingargs.Length; i++)
 					qualifies &= (thingargs[i] == -1) || (t.Args[i] == thingargs[i]);
 				
 				// Still qualifies?
diff --git a/Source/Core/Geometry/Tools.cs b/Source/Core/Geometry/Tools.cs
index 732ab3475..941267ab7 100755
--- a/Source/Core/Geometry/Tools.cs
+++ b/Source/Core/Geometry/Tools.cs
@@ -2087,7 +2087,7 @@ namespace CodeImp.DoomBuilder.Geometry
 				if(t.Marked)
 				{
 					t.Action = 0;
-					for(int i = 0; i < Thing.NUM_ARGS; i++) t.Args[i] = 0;
+					for(int i = 0; i < t.Args.Length; i++) t.Args[i] = 0;
 				}
 			}
 			
@@ -2097,7 +2097,7 @@ namespace CodeImp.DoomBuilder.Geometry
 				if(l.Marked)
 				{
 					l.Action = 0;
-					for(int i = 0; i < Linedef.NUM_ARGS; i++) l.Args[i] = 0;
+					for(int i = 0; i < l.Args.Length; i++) l.Args[i] = 0;
 				}
 			}
 		}
diff --git a/Source/Core/IO/ClipboardStreamReader.cs b/Source/Core/IO/ClipboardStreamReader.cs
index ce4106d84..2256daab5 100755
--- a/Source/Core/IO/ClipboardStreamReader.cs
+++ b/Source/Core/IO/ClipboardStreamReader.cs
@@ -214,7 +214,7 @@ namespace CodeImp.DoomBuilder.IO
 				int s1 = reader.ReadInt32();
 				int s2 = reader.ReadInt32();
 				int special = reader.ReadInt32();
-				for(int a = 0; a < Linedef.NUM_ARGS; a++) args[a] = reader.ReadInt32();
+				for(int a = 0; a < args.Length; a++) args[a] = reader.ReadInt32();
 				int numtags = reader.ReadInt32(); //mxd
 				List<int> tags = new List<int>(numtags); //mxd
 				for(int a = 0; a < numtags; a++) tags.Add(reader.ReadInt32()); //mxd
@@ -362,7 +362,7 @@ namespace CodeImp.DoomBuilder.IO
 				double scaleY = reader.ReadDouble(); //mxd
 				int type = reader.ReadInt32();
 				int special = reader.ReadInt32();
-				for(int a = 0; a < Linedef.NUM_ARGS; a++) args[a] = reader.ReadInt32();
+				for(int a = 0; a < args.Length; a++) args[a] = reader.ReadInt32();
 
 				//flags
 				Dictionary<string, bool> stringflags = new Dictionary<string, bool>(StringComparer.Ordinal);
diff --git a/Source/Core/IO/UniversalStreamReader.cs b/Source/Core/IO/UniversalStreamReader.cs
index e31fe56c3..1c24956da 100755
--- a/Source/Core/IO/UniversalStreamReader.cs
+++ b/Source/Core/IO/UniversalStreamReader.cs
@@ -194,11 +194,8 @@ namespace CodeImp.DoomBuilder.IO
 				double scale = GetCollectionEntry(c, "scale", false, 0.0, where); //mxd
 				int type = GetCollectionEntry(c, "type", true, 0, where);
 				int special = GetCollectionEntry(c, "special", false, 0, where);
-				args[0] = GetCollectionEntry(c, "arg0", false, 0, where);
-				args[1] = GetCollectionEntry(c, "arg1", false, 0, where);
-				args[2] = GetCollectionEntry(c, "arg2", false, 0, where);
-				args[3] = GetCollectionEntry(c, "arg3", false, 0, where);
-				args[4] = GetCollectionEntry(c, "arg4", false, 0, where);
+				for (int j = 0; j < args.Length; j++)
+					args[j] = GetCollectionEntry(c, "arg" + j, false, 0, where);
 
 				if(scale != 0) //mxd
 				{
@@ -256,11 +253,8 @@ namespace CodeImp.DoomBuilder.IO
 
 				int tag = GetCollectionEntry(lc, "id", false, 0, where);
 				int special = GetCollectionEntry(lc, "special", false, 0, where);
-				args[0] = GetCollectionEntry(lc, "arg0", false, 0, where);
-				args[1] = GetCollectionEntry(lc, "arg1", false, 0, where);
-				args[2] = GetCollectionEntry(lc, "arg2", false, 0, where);
-				args[3] = GetCollectionEntry(lc, "arg3", false, 0, where);
-				args[4] = GetCollectionEntry(lc, "arg4", false, 0, where);
+				for (int j = 0; j < args.Length; j++)
+					args[j] = GetCollectionEntry(lc, "arg" + j, false, 0, where);
 				int s1 = GetCollectionEntry(lc, "sidefront", false, -1, where);
 				int s2 = GetCollectionEntry(lc, "sideback", false, -1, where);
 
diff --git a/Source/Core/IO/UniversalStreamWriter.cs b/Source/Core/IO/UniversalStreamWriter.cs
index d6e06eb4f..d0a6d588b 100755
--- a/Source/Core/IO/UniversalStreamWriter.cs
+++ b/Source/Core/IO/UniversalStreamWriter.cs
@@ -224,11 +224,10 @@ namespace CodeImp.DoomBuilder.IO
 				
 				// Special
 				if(l.Action != 0) coll.Add("special", l.Action);
-				if(l.Args[0] != 0) coll.Add("arg0", l.Args[0]);
-				if(l.Args[1] != 0) coll.Add("arg1", l.Args[1]);
-				if(l.Args[2] != 0) coll.Add("arg2", l.Args[2]);
-				if(l.Args[3] != 0) coll.Add("arg3", l.Args[3]);
-				if(l.Args[4] != 0) coll.Add("arg4", l.Args[4]);
+				for (int i = 0; i < l.Args.Length; i++)
+				{
+					if (l.Args[i] != 0) coll.Add("arg" + i, l.Args[i]);
+				}
 
 				// Flags
 				foreach(KeyValuePair<string, bool> flag in l.Flags)
@@ -346,11 +345,10 @@ namespace CodeImp.DoomBuilder.IO
 				if(t.ScaleY != 0 && t.ScaleY != 1.0f) coll.Add("scaley", t.ScaleY); //mxd
 				coll.Add("type", t.Type);
 				if(t.Action != 0) coll.Add("special", t.Action);
-				if(t.Args[0] != 0) coll.Add("arg0", t.Args[0]);
-				if(t.Args[1] != 0) coll.Add("arg1", t.Args[1]);
-				if(t.Args[2] != 0) coll.Add("arg2", t.Args[2]);
-				if(t.Args[3] != 0) coll.Add("arg3", t.Args[3]);
-				if(t.Args[4] != 0) coll.Add("arg4", t.Args[4]);
+				for (int i = 0; i < t.Args.Length; i++)
+				{
+					if (t.Args[i] != 0) coll.Add("arg" + i, t.Args[i]);
+				}
 				coll.Comment = t.Index.ToString();
 
 				// Flags
diff --git a/Source/Core/Map/Linedef.cs b/Source/Core/Map/Linedef.cs
index fc27cc30b..531e4df10 100755
--- a/Source/Core/Map/Linedef.cs
+++ b/Source/Core/Map/Linedef.cs
@@ -247,7 +247,7 @@ namespace CodeImp.DoomBuilder.Map
 				}
 			}
 
-			for(int i = 0; i < NUM_ARGS; i++) s.rwInt(ref args[i]);
+			for(int i = 0; i < args.Length; i++) s.rwInt(ref args[i]);
 
 			//mxd
 			if(!s.IsWriting) UpdateColorPreset();
diff --git a/Source/Core/Map/MapSet.cs b/Source/Core/Map/MapSet.cs
index 0ff4ff1bf..83a673fdb 100755
--- a/Source/Core/Map/MapSet.cs
+++ b/Source/Core/Map/MapSet.cs
@@ -3923,7 +3923,7 @@ namespace CodeImp.DoomBuilder.Map
 					if(t.Marked == marked)
 					{
 						LinedefActionInfo info = General.Map.Config.GetLinedefActionInfo(t.Action);
-						for(int i = 0; i < Thing.NUM_ARGS; i++)
+						for(int i = 0; i < info.Args.Length; i++)
 						{
 							if(info.Args[i].Used && CheckIsTagType(info.Args[i].Type))
 							{
@@ -3971,7 +3971,7 @@ namespace CodeImp.DoomBuilder.Map
 					if(l.Marked == marked)
 					{
 						LinedefActionInfo info = General.Map.Config.GetLinedefActionInfo(l.Action);
-						for(int i = 0; i < Linedef.NUM_ARGS; i++)
+						for(int i = 0; i < info.Args.Length; i++)
 						{
 							if(info.Args[i].Used && CheckIsTagType(info.Args[i].Type))
 							{
diff --git a/Source/Core/Map/Thing.cs b/Source/Core/Map/Thing.cs
index 2925ee26e..fa929814b 100755
--- a/Source/Core/Map/Thing.cs
+++ b/Source/Core/Map/Thing.cs
@@ -220,7 +220,7 @@ namespace CodeImp.DoomBuilder.Map
 			s.rwDouble(ref scaleY); //mxd
 			s.rwInt(ref tag);
 			s.rwInt(ref action);
-			for(int i = 0; i < NUM_ARGS; i++) s.rwInt(ref args[i]);
+			for(int i = 0; i < args.Length; i++) s.rwInt(ref args[i]);
 
 			if(!s.IsWriting) 
 			{
diff --git a/Source/Plugins/3DFloorMode/ThreeDFloor.cs b/Source/Plugins/3DFloorMode/ThreeDFloor.cs
index 76c934142..a48487fdf 100644
--- a/Source/Plugins/3DFloorMode/ThreeDFloor.cs
+++ b/Source/Plugins/3DFloorMode/ThreeDFloor.cs
@@ -319,7 +319,7 @@ namespace CodeImp.DoomBuilder.ThreeDFloorMode
 				{
 					sd.Line.Action = 0;
 
-					for (int i = 0; i < 5; i++)
+					for (int i = 0; i < sd.Line.Args.Length; i++)
 						sd.Line.Args[i] = 0;
 				}
 
diff --git a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
index 7a3a6bcb1..bcf81fee3 100755
--- a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
@@ -1884,7 +1884,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 								}
 
 								// Set the linedef args
-								for(int i = 0; i < Linedef.NUM_ARGS; i++)
+								for(int i = 0; i < General.Map.Config.MakeDoorArgs.Length; i++)
 								{
 									// A -1 arg indicates that the arg must be set to the new sector tag
 									// and only in this case we set the tag on the sector, because only
diff --git a/Source/Plugins/BuilderModes/FindReplace/FindLinedefSectorRef.cs b/Source/Plugins/BuilderModes/FindReplace/FindLinedefSectorRef.cs
index 973de0792..a8c2c80eb 100755
--- a/Source/Plugins/BuilderModes/FindReplace/FindLinedefSectorRef.cs
+++ b/Source/Plugins/BuilderModes/FindReplace/FindLinedefSectorRef.cs
@@ -91,7 +91,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					if(info.IsKnown && !info.IsNull)
 					{
 						// Go for all args
-						for(int i = 0; i < Linedef.NUM_ARGS; i++)
+						for(int i = 0; i < info.Args.Length; i++)
 						{
 							// Argument type matches?
 							if(info.Args[i].Used && (info.Args[i].Type == (int)UniversalType.SectorTag))
diff --git a/Source/Plugins/BuilderModes/FindReplace/FindLinedefThingRef.cs b/Source/Plugins/BuilderModes/FindReplace/FindLinedefThingRef.cs
index e14bffa29..8a68adbcc 100755
--- a/Source/Plugins/BuilderModes/FindReplace/FindLinedefThingRef.cs
+++ b/Source/Plugins/BuilderModes/FindReplace/FindLinedefThingRef.cs
@@ -91,7 +91,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					if(info.IsKnown && !info.IsNull)
 					{
 						// Go for all args
-						for(int i = 0; i < Linedef.NUM_ARGS; i++)
+						for(int i = 0; i < info.Args.Length; i++)
 						{
 							// Argument type matches?
 							if(info.Args[i].Used && (info.Args[i].Type == (int)UniversalType.ThingTag))
diff --git a/Source/Plugins/BuilderModes/FindReplace/FindThingSectorRef.cs b/Source/Plugins/BuilderModes/FindReplace/FindThingSectorRef.cs
index bd8d15569..0ab62bf3c 100755
--- a/Source/Plugins/BuilderModes/FindReplace/FindThingSectorRef.cs
+++ b/Source/Plugins/BuilderModes/FindReplace/FindThingSectorRef.cs
@@ -94,7 +94,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					if(info.IsKnown && !info.IsNull)
 					{
 						// Go for all args
-						for(int i = 0; i < Linedef.NUM_ARGS; i++)
+						for(int i = 0; i < info.Args.Length; i++)
 						{
 							// Argument type matches?
 							if(info.Args[i].Used && (info.Args[i].Type == (int)UniversalType.SectorTag))
diff --git a/Source/Plugins/BuilderModes/FindReplace/FindThingThingRef.cs b/Source/Plugins/BuilderModes/FindReplace/FindThingThingRef.cs
index e051d5a92..ba05574ce 100755
--- a/Source/Plugins/BuilderModes/FindReplace/FindThingThingRef.cs
+++ b/Source/Plugins/BuilderModes/FindReplace/FindThingThingRef.cs
@@ -94,7 +94,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					if(info.IsKnown && !info.IsNull)
 					{
 						// Go for all args
-						for(int i = 0; i < Linedef.NUM_ARGS; i++)
+						for(int i = 0; i < info.Args.Length; i++)
 						{
 							// Argument type matches?
 							if(info.Args[i].Used && (info.Args[i].Type == (int)UniversalType.ThingTag))
diff --git a/Source/Plugins/BuilderModes/General/Association.cs b/Source/Plugins/BuilderModes/General/Association.cs
index 30bb0ef24..49b91bfff 100755
--- a/Source/Plugins/BuilderModes/General/Association.cs
+++ b/Source/Plugins/BuilderModes/General/Association.cs
@@ -525,7 +525,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			{
 				// Collect what map element the action arguments are referencing. Ignore the argument if it's 0, so that they
 				// are not associated to everything untagged
-				for (int i = 0; i < Linedef.NUM_ARGS; i++)
+				for (int i = 0; i < action.Args.Length; i++)
 				{
 					if ((action.Args[i].Type == (int)UniversalType.SectorTag ||
 						action.Args[i].Type == (int)UniversalType.LinedefTag ||
@@ -548,7 +548,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 				if (ti != null && directlinktype >= 0 && Math.Abs(directlinktype) != t.Type)
 				{
-					for (int i = 0; i < Linedef.NUM_ARGS; i++)
+					for (int i = 0; i < ti.Args.Length; i++)
 					{
 						if ((ti.Args[i].Type == (int)UniversalType.SectorTag ||
 							ti.Args[i].Type == (int)UniversalType.LinedefTag ||
@@ -585,13 +585,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if ((linedef.Action > 0) && General.Map.Config.LinedefActions.ContainsKey(linedef.Action))
 			{
 				LinedefActionInfo action = General.Map.Config.LinedefActions[linedef.Action];
-				if (((action.Args[0].Type == (int)type) && (linedef.Args[0] != 0) && (tags.Contains(linedef.Args[0]))) ||
-					((action.Args[1].Type == (int)type) && (linedef.Args[1] != 0) && (tags.Contains(linedef.Args[1]))) ||
-					((action.Args[2].Type == (int)type) && (linedef.Args[2] != 0) && (tags.Contains(linedef.Args[2]))) ||
-					((action.Args[3].Type == (int)type) && (linedef.Args[3] != 0) && (tags.Contains(linedef.Args[3]))) ||
-					((action.Args[4].Type == (int)type) && (linedef.Args[4] != 0) && (tags.Contains(linedef.Args[4]))))
+				for (int i = 0; i < action.Args.Length; i++)
 				{
-					return true;
+					if ((action.Args[i].Type == (int)type) && (linedef.Args[i] != 0) && (tags.Contains(linedef.Args[i])))
+						return true;
 				}
 			}
 
@@ -617,13 +614,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					return false;
 
 				LinedefActionInfo action = General.Map.Config.LinedefActions[thing.Action];
-				if (((action.Args[0].Type == (int)type) && (tags.Contains(thing.Args[0]))) ||
-					 ((action.Args[1].Type == (int)type) && (tags.Contains(thing.Args[1]))) ||
-					 ((action.Args[2].Type == (int)type) && (tags.Contains(thing.Args[2]))) ||
-					 ((action.Args[3].Type == (int)type) && (tags.Contains(thing.Args[3]))) ||
-					 ((action.Args[4].Type == (int)type) && (tags.Contains(thing.Args[4]))))
+				for (int i = 0; i < ti.Args.Length; i++)
 				{
-					return true;
+					if ((action.Args[i].Type == (int)type) && (tags.Contains(thing.Args[i])))
+						return true;
 				}
 
 				//If there is a link setup on this thing, and it matches the association, then draw a direct link to any matching tag
@@ -639,13 +633,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				// This prevents a reverse link to a thing via an argument, when it should be a direct tag-to-tag link instead.
 				if (ti != null && directlinktype >= 0 && Math.Abs(directlinktype) != thing.Type)
 				{
-					if (((ti.Args[0].Type == (int)type) && (tags.Contains(thing.Args[0]))) ||
-						 ((ti.Args[1].Type == (int)type) && (tags.Contains(thing.Args[1]))) ||
-						 ((ti.Args[2].Type == (int)type) && (tags.Contains(thing.Args[2]))) ||
-						 ((ti.Args[3].Type == (int)type) && (tags.Contains(thing.Args[3]))) ||
-						 ((ti.Args[4].Type == (int)type) && (tags.Contains(thing.Args[4]))))
+					for (int i = 0; i < ti.Args.Length; i++)
 					{
-						return true;
+						if ((ti.Args[i].Type == (int)type) && (tags.Contains(thing.Args[i])))
+							return true;
 					}
 				}
 			}
-- 
GitLab