So I went a little overboard and created a Tower Defense system with your maps design in mind.
I'd fully understand if you didn't want to use it, as it's a bit intimidating to look at and is using somewhat advanced techniques. I tried to add a lot of comments explaining what's going on so that should help.
That being said, I think you'll like it a lot if you take the time to understand it. I'm using techniques that others in this post have already mentioned which will make your life A LOT easier. The thing with Tower Defense maps is that you're often doing the same thing for every Player, which opens up the door to use Arrays and Hashtables which will remove a lot of the redundancy.
For example, in this SINGLE trigger from my map you can setup every single Wave (Unit Spawn):
-
SETUP Waves
-

Events
-

Conditions
-

Actions
-


-------- === Required Variables === --------
-


-------- Wave_Level = Set this to the desired Wave Level. --------
-


-------- Wave_Unit = The unit that will spawn. --------
-


-------- Wave_Count = The number of units that will spawn in total. --------
-


-------- Wave_Interval = The interval between spawning another unit. --------
-


-------- Wave_Start_Delay = After the last unit has spawned for a wave, this is how long until the next wave starts. --------
-


-------- Wave_Lives_Lost = How many lives the player will lose when the unit reaches the end. --------
-


-------- --------
-


-------- === Optional Variables === --------
-


-------- Wave_Start_Text = The text that appears when a wave starts. (Optional) --------
-


-------- Wave_End_Text = The text that appears at the end of a wave. (Optional) --------
-


-------- Wave_Start_Trigger = A trigger that will run when a wave starts. (Optional) --------
-


-------- Wave_End_Trigger = A trigger that will run when a wave ends. (Optional) --------
-


-------- --------
-


-------- Note: If you don't set Wave_Count, Wave_Interval, Wave_Lives_Lost, and/or Wave_Start_Delay then their DEFAULT values will be used. --------
-


-------- DEFAULT values are determined in the Variable Editor. Press Control + B to open it. (There's a bug when editing variables outside of the variable editor so don't do that) --------
-


-------- --------
-


-------- Wave Configuration: --------
-


Set VariableSet Wave_Level = 1
-


Set VariableSet Wave_Unit[Wave_Level] = Wave 1 - Footman
-


Set VariableSet Wave_Count[Wave_Level] = 10
-


Set VariableSet Wave_Interval[Wave_Level] = 0.25
-


Set VariableSet Wave_Start_Delay[Wave_Level] = 5.00
-


Set VariableSet Wave_Lives_Lost[Wave_Level] = 1
-


-------- --------
-


Set VariableSet Wave_Level = 2
-


Set VariableSet Wave_Unit[Wave_Level] = Wave 2 - Rifleman
-


Set VariableSet Wave_Count[Wave_Level] = 10
-


Set VariableSet Wave_Interval[Wave_Level] = 0.25
-


Set VariableSet Wave_Start_Delay[Wave_Level] = 5.00
-


Set VariableSet Wave_Lives_Lost[Wave_Level] = 1
-


-------- --------
-


Set VariableSet Wave_Level = 3
-


Set VariableSet Wave_Unit[Wave_Level] = Wave 3 - Knight
-


Set VariableSet Wave_Count[Wave_Level] = 10
-


Set VariableSet Wave_Interval[Wave_Level] = 0.25
-


Set VariableSet Wave_Start_Delay[Wave_Level] = 5.00
-


Set VariableSet Wave_Lives_Lost[Wave_Level] = 1
Simply copy and paste the Variables, adjust their values to what you desire, and that's it. The system will handle the rest for you.
The Optional variables add room for things like Text Messages as well as for running specific triggers, which is useful for doing anything that the system doesn't already provide. For example, if you wanted to add Gold to each player at the end of a Wave, you could create a new Trigger that does exactly that. Now all you have to do is reference that trigger in the
SETUP Waves trigger. You would do this by setting the variable
Wave_End_Trigger[Wave_Level] to be equal to your Gold trigger. Now, when that specific Wave ends, the Gold trigger will run. That being said, I'd reserve the Start/End triggers for things that aren't common. If you ALWAYS add Gold at the end of a Wave then it'd probably make more sense to create a new variable array like Wave_Gold_Reward[] and incorporate that into the system.
This type of design should be used whenever possible since it will save you hours of work in the long run and will make your map 100x more organized. It's also very efficient and will help with map performance.
If you end up wanting to use it let me know, I can help you integrate it into your map.