Yes, I can see a lot of flaws. That's to be expected, pretty much everyone makes the same mistakes you're making right now when they're just getting started.
I'm going to start out some things that
have to be changed.
Array Sizes:
In the variable editor, you have the option to increase the array size. This doesn't actually increase anything: the array size always goes from 0 to 8191 (that's 8192 values).
What it actually does, is initialize those variables. Now you've got some variables where you set the array size to 50 or higher, that means that all those variables will be initialized while loading.
This increases loading time (and saving time as well I believe?).
Short story: array size must be kept at 1,
except for dialog and timer-variables.
Leaks
You may or may not have heard from them, but leaks are everywhere in your map.
Leaks are basically bits of data that Warcraft uses, but never removes.
Say you use the location "Center of map". Warcraft will remember that location, but never use it again. If you then use "Center of map" again (the second time), it will store it
again (so now it has stored the same location twice, for no real reason).
If too much data gets stored, Warcraft will get some trouble and will slow down.
I don't know how old/young you are, but in the past many maps became unplayable after 30 minutes, mostly TD's (those have a lot of locations and groups).
It will take a while to explain leaks, but you absolutely must be able to clean them before you can get to the bigger work. It's also a good idea to clean a leak the moment you see one, not afterward. Even when I'm creating a map that will only live for 10 minutes (never saved), I will clean those leaks.
Leaks tutorial.
Loops/Arrays:
You obviously know what arrays are and how they work, but you're not always using them the way you should.
You mostly use them as a way to store more things, while they're the key component of turning a lot of triggers into a single trigger.
The entire category "Unit Triggers" can be compressed to 2 triggers (3 or 4 is also fine, don't be too stressed by maximum efficiency at the moment).
As you may have noticed, you're actually repeating the exact same code 60-ish times while slightly modifying a few values.
Think about this: what if you use an array variable, say "waveType" to store the unit-type of the current level in? Like, waveType[5] would be "Runner 05".
And players have numbers (Red is Player 1, Blue is Player 2), so you can use those numbers to identify them.
waveType[ level[Player number] ] could hold the unit-type of the level "Player" is currently in.
Now that that's done, let's review some other things:
The checkers-thing really doesn't look good, I'm sorry.
I highly recommend you remove the entire category and re-do everything.
Checker boards have 2 dimensions (1 to 8 and A to H), you can create your own 2-dimensional arrays with a few tricks.
Variable[ (8 * row) + column ]
That's a fake 2-dimensional array that can be used for a checkerboard (could be read as Variable[row][column]).
So instead of storing information for each piece, you store information for each square.
An example:
"checkerUnit[ (8 * 3) + 4 ] = queen" / "checkerPlayer[ (8 * 3) + 4] = 1"
Would mean that at D3, there's a queen belonging to Red.
You also have to work with substrings (like when a player says "-move D4 C8", you register that string and divide it into "-move "; "D"; "4"; "C" and "8".
You then transform "D" into 4 and you can use the 2D-array to see which unit is in square (4, 4).
Oh, and for your question: you mean that the DPS shown is incorrect, or what exactly?
(Also, I love Power Towers TD - I've re-made that power-drain system some years back).