From c76d0e33268b059295d5ce3bee1df0dc8077a187 Mon Sep 17 00:00:00 2001
From: MascaraSnake <jonassauer27@gmail.com>
Date: Wed, 29 Dec 2021 10:42:20 +0100
Subject: [PATCH] Implement linedef executor for changing linedef args

---
 extras/conf/udb/Includes/SRB222_linedefs.cfg | 25 ++++++++++++++++++++
 src/p_spec.c                                 | 23 ++++++++++++++++++
 2 files changed, 48 insertions(+)

diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg
index b82ab30c91..b36ca21f98 100644
--- a/extras/conf/udb/Includes/SRB222_linedefs.cfg
+++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg
@@ -4584,6 +4584,31 @@ udmf
 				enum = "setadd";
 			}
 		}
+
+		468
+		{
+			title = "Change Linedef Argument";
+			prefix = "(468)";
+			arg0
+			{
+				title = "Linedef tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Argument";
+			}
+			arg2
+			{
+				title = "Value";
+			}
+			arg3
+			{
+				title = "Set/Add?";
+				type = 11;
+				enum = "setadd";
+			}
+		}
 	}
 
 	linedefexecpoly
diff --git a/src/p_spec.c b/src/p_spec.c
index ca08ad8756..5b2532f936 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -3778,6 +3778,29 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
 			}
 			break;
 
+		case 468: // Change linedef executor argument
+		{
+			INT32 linenum;
+
+			if (!udmf)
+				break;
+
+			if (line->args[1] < 0 || line->args[1] >= NUMLINEARGS)
+			{
+				CONS_Debug(DBG_GAMELOGIC, "Linedef type 468: Invalid linedef arg %d\n", line->args[1]);
+				break;
+			}
+
+			TAG_ITER_LINES(line->args[0], linenum)
+			{
+				if (line->args[3])
+					lines[linenum].args[line->args[1]] += line->args[2];
+				else
+					lines[linenum].args[line->args[1]] = line->args[2];
+			}
+		}
+		break;
+
 		case 480: // Polyobj_DoorSlide
 		case 481: // Polyobj_DoorSwing
 			PolyDoor(line);
-- 
GitLab