Help with TD

W

Warren X

Guest
Ok, so I'm working on a tower defense. I want to make a tower that has a splash effect of 150 at full range, and has the ability to slow all targets in that range by 20%, for 10 seconds. Doesn't sound too hard, right?
- Well, I can't use frost attack as a base ability because it won't let me modify the slowing factor(I don't think. Correct me if I'm wrong and we can circumvent the rest of this post.)
- I can't use slow poison as a base ability because it won't splash on the enemy, even if I give it an AOE effect radius.
- I can't use cripple as a base ability because I want the tower to always do this ability when attacking, not be castable.
- I can't trigger the ability in to splash a radius because when I apply the slowing trigger, it functions fine, but I can't find a way to count off 10 seconds and have the affected unit's speed reverted to normal. I have tried using wait time, wait game time, and counting off "custom values" on units afflicted. Nothing is working for me. I'm not sure if I'm implementing it wrong, but I sure am frustrated. Please help if you can!

- Warren X
 
That won't work...

u can change the frost attack slow factor under gameplay constraints.

I would do that if you could change the frost slowing for different custom abilities you make. Unfortunately I have towers relying on the frost attack ability for slowing already, so changing that would change their slowing properties as well. =/ But I will sign up for tower defense help, thanks for the suggestion. Where do I find that forum?
 
He ment you should be registered before deciding to ask a question about something that would make alot more questions.

The truth is you get more awnsers if your registered.
 
I've registered, should I repost as the registered name?

Ah, gotcha. Well, I've since registered for the site. I've even tried going to a few posts and seeing if I had any insight into another's issues so I feel I'm giving something back to the forums. Still haven't heard anything though, keep on trying new different things and not getting anywhere :banghead:
 
I've looked there...

I already looked at the TD FAQ. Despite the immense amount of ideas and help I've received just by looking over the FAQ, it hasn't helped me with my problem. Take a look at my original post.
 
Have you just tried basing your towers off of the towers which already have these abilitiles and modifying them? I know there is atleast a cold tower...
 
Hmmm, interesting...

Not a bad thought, I'll have to tinker with that. I don't see any adjustment for the slowing amount on the tower's specs though, and if it uses the frost attack's generic value, that idea's out since I already have towers based off of the 50% slowing, and it's a single value in the game constants so you can't really make a new frost ability and change the value(I don't think). I'm beginning to think this isn't doable :( I'll even settle for an aura effect at this point...any way to make an aura effect to slow creeps by 20%?
 
Complete Guide to Making TD Maps
By D’vorjakque

Since my map Azure Tower Defense was selected as a winner for the Frozen Throne map contest, I have been asked by many people to teach them how to make TD maps. Therefore, I have made this tutorial and guide. It is a complete reference on everything you ever wanted to know about making traditional TD maps (and more). I will assume that you have basic knowledge of the World Editor interface and of how to make triggers and variables. If you do not, there are many tutorials on this very site which deal with those concepts in detail.

First off, if you don’t know what a TD map is, then you need to play some TD maps first before you design your own in the World Editor. TD stands for Tower Defense, and the first thing you should do before making your own, is to become familiar with this style of map on battle.net, and there are a ton of excellent TD maps that you can download from the Defense download section of this site to facilitate that purpose.

TD maps can be extremely fun maps to create, not only because they are so different from the standard and traditional Warcraft melee, but because they offer you a big chance to be creative. Perhaps the best thing about making TD maps is that there is no need for any MPQ editing of any sort. There is, however, the difficulty of making a multiplayer map though. Multiplayer maps can be tricky to make in any style because of stability issues. I will discuss this thoroughly later on.

Now, before you begin doing anything in the World Editor, first thing is first. Brainstorming. You need to develop within your mind a concrete idea of what you want your map to be like. Create some kind of background story. Determine a setting. And above all else, determine how you want the gameplay to be. You can have monsters follow a set narrow path through the players’ towers. You can have a wide path that the monsters travel on which the players build towers in a maze. Or you can come up with whatever you want. You also want to think about the towers themselves. How will the towers the players can build improve throughout the game? You can have players train builders from “town hall” style buildings that level up 3 times, each time offering more builders to train. You can have the towers themselves upgrade to better towers like the Scout Tower upgrades to a Cannon Tower. You can have players research upgrades at some structure that will change all of a certain tower into a more powerful version of that tower. Or come up with some other scheme. Once these decisions have been made, it is time to open up the World Editor.

Now, before you start doing any editing, you must resign yourself to the fact that if you want to make a quality map, it will require tons of time. So just suck it up and deal with it. The first thing you will want to do is to make the terrain. Now, you want things to be very simple, but don’t skimp on your attention to detail. By simple, I simply mean make the map layout very clear cut and easily understandable. The first thing that contributes to a TD map being bad is confusion. And your map layout plays an important role in either dispelling this confusion or furthering it. Make the paths that the monsters will follow clearly defined, such as by using cliffs on the edges for example. Make any structures that players possess at the beginning of the game (if you want such structures) clearly visible to the players. Grouping these structures for each player in their own spot and then putting the player start location for that player there can best accomplish this. Make the spot or spots where monsters will spawn clearly identifiable, such as by using menacing doodads for example. I highly recommend spending some time making all of the terrain in the map look interesting, however you MUST keep the terrain where the players build towers and the monsters walk completely flat. I’m not talking about cliffs here, however. I am talking about using the plateau brush in the terrain menu to flatten all of the land down. This is necessary so that players will actually be able to build on this terrain and so that monsters will actually be able to walk on this terrain. You can check pathing by going to the View menu and checking the pathing option. All areas displayed in blue cannot be built upon by the player. All areas is pink cannot be built upon AND allow no ground unit movement. Make sure, by using the plateau brush, that all areas where the monsters will travel can indeed be traveled upon, and make sure that all areas where the players can build can indeed be built upon.

Once the terrain is built, we need to set up some of the map properties. Specifically here, you need to create forces so that you can place player start locations and such. Go into the scenario properties dialog box to the Players tab. Here, assign a user player to each color for as many players as you are using in your map. Personally, I recommend using no more than 8 players, since games with more players than that can be very difficult to fill in battle.net. Also, it is incredibly difficult with that many players to see to it that each player gets a sizeable cut of the action in the map. Now, select one additional color to be the computer player. This computer player will control all of the monsters that the people will face. Make sure that they all have fixed start locations. Now go to the Forces tab. Select both Use Custom Forces and Fixed Player Settings. Now, you will need to create 2 forces: one for the players, and one for the computer player that controls the monsters. Make sure that the team for the players has Allied and Allied Victory check-marked. In the Upgrades tab, any abilities you want to use that normally need to be researched in a regular game of Warcraft III will have to be set to Researched.

Ok. Once the forces have been set up, you will need to establish a series of regions in order to control the monster movement. Disregarding the monster spawn points for now, place a region at the corner of each monster path, or at each location in the path that the monsters will or might change direction. Do not make these regions be large regions. Make them fairly small. If you are designing the map such the players build towers in a maze on the same path that the monsters follow, then make sure that these regions are on unbuildable terrain, such as rocks. When you name these regions, name them according to the following scheme: 1, 2, 3, 4, 5, etc. Just use plain numbers like that to name each region you make. The reason will be explained shortly. Next, place a region in each monster spawn location. Then place a second region in each monster spawn location that is slightly larger than the first you placed there. Also create a region at the end of each path that the monsters follow.

At this point, go ahead and create the first monster or monsters that you want to have spawn on the first round. When creating monsters, keep these few things in mind. Set their collision size to 0, and set their mana max to something high like 1000, set their initial mana to 0, and set their mana regen to 0. And never make a unit based off of a hero, since they would then have an intelligence stat which would provide some mana regen. The reason for this is that we will be using mana to keep track of where the monsters are to be moving next. You can still use hero models, just make sure that you start with a base normal unit.

Once the monsters for the first round are made, let’s make some triggers! You can finish making your monsters later. Open the trigger editor and delete everything that is there. First let us make what I will call a “map properties” trigger. So make a trigger and set the trigger event to be map initialization. In this map properties trigger, you will need to do several things. First, you must establish visibility across the whole map. To do this, create an initially enabled visibility modifier emitting visibility across the playable map area for all players. The second thing to do, is to disable the day and night cycle. Set the time of day to be 12 (since it is bright then which serves to help prevent player confusion), and disable dawn and dusk sounds. You will need to turn bounty on for the computer player to which the spawned monsters will belong.

Once this is done, let’s go ahead and write triggers that will control monster movement. First create a region array variable and call it Regions, and make a new trigger that will initialize this variable. Make this new trigger happen at map initialization, and in it assign the regions you created in the monster path to the corresponding index of the Regions array. In other words, set variable Regions[1] = 1 , set variable Regions[2] = 2 , set variable Regions[3] = 3 , etc. On the left side of the equal sign is your region array. An array is a list of variables, each referred to by a numerical index, which is the number in the brackets. On the right side of the equal sign is one of the regions that you created. Basically what you are doing is making a huge list of regions, and saying that the first item in my list is region 1. The second item in my list is region 2. The third item in my list is region 3. And so on.

Next, let’s write triggers that physically order monsters to move. Remember that you created two regions in each place that the monsters spawn? The smaller region is the region that you will tell monsters to actually spawn in. Don’t worry about it for now. The larger region will be the one that will actually tell the monsters to move to their first location. Why use two regions? Because when monsters spawn, sometimes they spawn slightly outside of the region you tell them to appear in, and if that same region controls the monsters first movement order, then if a monster were to appear outside of that region, if would cease to get that order and just stand there. Now make a trigger for each of these larger regions where monsters spawn. In this trigger you will need to include the following:

Event:
A unit enters region Y (Region Y is whichever of the larger regions you are making the trigger for)

Condition:
Owner of triggering unit is player X (Player X is the player which controls the monsters)

Actions:
- Set mana of triggering unit to Z
- Order triggering unit to move to center of regions[Z]
(Z is the name of the next region that the monster is supposed to travel to.)

Basically what you are doing is telling a monster to move to the next region, and keeping track of whatever region a monster is supposed to be moving to by setting its mana equal to the name of that region. Now simply create triggers similar to this for each region that you created in the monsters’ path.

Many things can occur to stop monster movement. To get them back on track, there are several useful triggers that you can write. Firstly, create a new trigger with the event: A unit owned by player X is issued an order with no target. For the action of that trigger, do the following: Unit – order (triggering unit) to move to (center of Regions[(Integer(Mana of (triggering unit)))]). You might also want to create a trigger that randomly selects several units every 2 or 3 seconds and issues that same order: Unit – order (triggering unit) to move to (center of Regions[(Integer(Mana of (triggering unit)))]). That kind of trigger is especially important to implement if you are creating a TD where players build towers in the very path of the monsters. You will probably want to do it more frequently, and with a greater number of monsters. Furthermore, you can create what are generally termed anti-stuck towers. These are basically towers with really long range that do like 1 damage and serve no purpose other than to prompt monsters along their path. I recommend disguising these towers as part of the scenery, such as by making them look like Elven farms for example, and giving their attack no animation.

Presto! Just like that, your monsters will move wherever you want them to! So let’s make triggers for when the monsters reach the end of the path when the players fail to kill them off. First, make an integer variable that will represent the number of lives (or whatever you are using) that the players possess and give it the appropriate initial value that corresponds to how many lives (or whatever) that the players begin with. Next make a boolean variable and call it End and give it the initial value of false. Now, for each region that you have at the end of the monsters path(s), create a new trigger. Have this trigger activate when a unit enters the region controlled by the computer player which owns the monsters (just like you did for the previous triggers). Then for the actions simply decrement your lives variable and remove the triggering unit from the game. You will then probably want to update your scoreboard if you have one (I will explain how to make one later) and give a text message to all players saying that a life (or whatever your plot is using) has been lost. For the condition of these triggers check to see if your boolean variable End is false. When the last life has been lost, set the variable End to true. This will prevent lives going into negative numbers when more monsters enter the last region of the path after the final life has been lost. Also, include in these triggers an action that checks if End is true. If it is, then run a trigger (which I will leave you to devise on your own) that will end the map. Keep in mind this tip however, if you end with a cinematic that disables user control, be sure to re-enable user control before you do the defeat/victory action, or else the players will not have a mouse pointer to select the quit option in the defeat dialog. An example of a possible way to write one of these triggers follows:

Event:
A unit enters region Y (Region Y is a region at the end of a path)

Conditions:
- Owner of triggering unit is player X
- End equal to false

Actions:
- Unit – Remove (triggering unit) from the game
- Set Lives = (Lives – 1)
- If (Lives less than equal to 0) then do (Set End = True) else do (Do nothing)
- If (Lives less than equal to 0) then do (Trigger – Run Z ) else do (Do nothing)
- Game – Display to (All Players) the text: ((String(Lives)) + lives remaining!) - Leaderboard – Change the value for Player X in (Last created leaderboard) to Lives

(Player X is the player which controls the monsters)
(Lives is the variable which represents how many lives(or whatever your are using) the players have remaining)
(Trigger Z is a trigger that defeats all the players, perhaps ending with a real short camera shot)

This is of course a very generalized way to make this trigger. Feel free to use your creativity to change this around any way you see fit.

I referenced the leaderboard in that last trigger, so let’s talk about how to set one up. Basically, the function of a leaderboard, or scoreboard, is to keep track of how many kills each player has and how many lives have been lost. It can also be used to keep track of players leaving the game. So let’s create a trigger and call it Create Leaderboard. Set the event as map initialization and have no conditions. For the first action, do wait 1 second. For some reason, leaderboards will not show up unless you create them after waiting. If you create them immediately after the map loads up, they will not work. Ok, to create the leaderboard, write the following line:

Leaderboard – Create a leaderboard for (All players) titled Y (Y is any title you want for your leaderboard, such as Scoreboard, or Player Kills)

Now, for each player you can write a line such as this:

If (((Player 1 (Red) slot status) Equal to Is playing) and ((Player 1 (Red) controller) equal to User)) then do (Leaderboard – Add Player 1 (Red) to (last created leaderboard) with label (Name of Player 1 (Red)) and value 0) else do (Do nothing)

Do that for each color of player you have in your map. It’s tedious, I know, but is necessary. Next do:

Leaderboard – Add Player X to (last created leaderboard) with label Lives and value Z (Player X is the player who controls the monsters and Z is how many lives you want the players to have.)

Again, you don’t have do set it up strictly this way. Feel free to use your creativity. For example, you can assign the neutral hostile or neutral passive players to the leaderboard, and use them as blank space or as a line of dashes ----------------- in order to make the leaderboard more visually appealing. The last thing you need to do is to is this:

Leaderboard – Show (last created leaderboard)

And BOOM! Just like that you have a nice lovely scoreboard. To update this scoreboard when a player kills a monster, write 2 triggers as follows and create an integer array variable called Kills.

Event:
Map Initialization

Actions:
- Set Kills[1] = 0
- Set Kills[2] = 0
- Set Kills[3] = 0
- Etc.

(The index of Kills refers to a player. 1 would be player red, for example. 2 would be player blue. So do that for however many players you have.)

Next trigger:

Event:
A unit owned by player X dies

Actions:
- Set Kills[(Player number of (Owner of (Killing unit)))] = (Kills[(Player number of (Owner of (Killing unit)))] + 1)
- Leaderboard – Change the value for (Owner of (Killing unit)) in (last created leaderboard) to Kills[(Player number of (Owner of (Killing unit)))]
- Leaderboard – Remove Player X from (last created leaderboard)
- Leaderboard – Sort (last created leaderboard) by Value in Descending order
- Leaderboard – Add Player X to (last created leaderboard) with label Lives and value Lives
- Wait 5 seconds
- Unit – Remove (triggering unit) from the game

(Player X is the player which controls the monsters)
(Lives is the variable which represents how many lives the players have remaining) (The reason that we remove player X before sorting and then re-add player X is so that the lives is always at the bottom and never gets put somewhere in the middle because a player has less kills than the number of lives remaining!)
(It is important to remove units from the game even after they are killed, because they actually stay in memory for quite awhile (in case they might get resurrected or turned into skeletons) and can contribute to lag and poor battle.net performance of your map. It is good to wait a few seconds before removing them though, else their death animation will not play and they will simply disappear when they die (which looks rather silly).)

In order to detect if players are still in the game and show to the players still playing if any losers quit, make a trigger as follows:

Event:
Time – Every 30 Seconds of game time

Actions:
- If (((Player 1 (Red) slot status) Equal to Is playing) and ((Player 1 (Red) controller) equal to User)) then do (Do nothing) else do (Change the label for Player 1 (Red) in (last created leaderboard) to ---- GONE ----)

(Do that for each player you have that might be in the game. And of course, you can have anything you want instead of ---- GONE ----, such as DISCONNECTED, or THE NEWB LEFT!)

There you go! A fully functional leaderboard!

Well we have tons of stuff but no way to spawn the monsters yet! So let’s create now a system for spawning monsters and advancing in map levels or rounds. Go ahead and create your monsters for about the first 3 levels or so of the map so that we have something to work with. And be creative. Most TD maps have but one monster type per level. But you can have as many different monsters as you want for each level, as long as you have the time to make them. I highly recommend that you rename the monsters to make them more interesting for the players. It’s always more fun to be attacked by Spirits of the Abyss rather than Wisps, for example. To remind you, all of your monsters should have their collision set to 0, shout not be based off of a hero slot, and should have some value for their food used. Also, make their mana max high, give them 0 initial mana, and no mana regen.

Ok. To begin with we need to create a variable to represent which map level the players are on. Name this variable Round, or Level, or something appropriate and set its initial value to 0. Now create the following 2 triggers (these are generalized) and a unit array variable called Monsters.

Event:
Map Initialization

Actions:
- Set Monsters[1] = A
- Set Monsters[2] = B
- Set Monsters[3] = C
- Etc.

(The Monsters array index represents what round the players are on. A, B, and C are whatever monsters you want to have spawn for those rounds. This assumes you are only doing 1 monster type per round. If you want to do more, simply create another unit array variable and call it Monsters2 or something and set it up just the same. In this way, you can have as many monster types per level as you want.)

Next trigger:

Event:
Player X’s Food used becomes Equal to 0
Time – Elapsed game time is Y

Conditions:
- Lives Greater than 0

Actions:
- Set Round = (Round + 1)
- Leaderboard – Change the title of (last created leaderboard) to (Scoreboard – Round (String(Round)))
- Game – Display to (All players) the text (Round + ((String (Round)) + will begin shortly!))
- Wait Z seconds
- For each (Integer A) from 1 to M, do (Unit – create 1 Monsters[Round] for Player X at (Random point in J)
- For each (Integer A) from 1 to M, do (Unit – create 1 Monsters[Round] for Player X at (Random point in K)
- For each (Integer A) from 1 to M, do (Unit – create 1 Monsters[Round] for Player X at (Random point in L)
- Etc.

(Player X is the player which controls the monsters)
(Y is how many seconds you want at the beginning of the map before the first round of monsters advance. I recommend at least a full minute in order to give players time to become acquainted with the layout of the map and the different towers they can build.)
(Round is your variable representing what round of monsters the players are on.)
(Lives is your variable representing how many lives the players have left.)
(Z is how many seconds you want in between rounds of monsters. Here, I recommend at least 30 seconds.)
(M is a number indicating how many monsters of a specific type you want to have spawn at a particular spawn point at the beginning of a path.)
(J, K, and L represent the smaller spawn regions at the beginning of each monster path. You obviously only need to write this kind of line once for each path you have.)

Again, do not be restricted by this. Be creative. You don’t have to change the leaderboard title to represent what round the players are on (though I recommend it). You can do whatever you think is interesting. Say whatever you want to at the beginning of each round. Spawn the monsters however you want to. The way I have it up there spawns all of the monsters at once. But you could instead spawn them individually with a second or so of time between each spawn, for example. Do it however you wish. One additional thing that is great to add to this trigger is a countdown timer that represents the time left before the monsters spawn between rounds. Simply create a timer variable called Timer and insert the following lines before “Wait Z seconds” in the above trigger:

Countdown timer – Start Timer as a One-Shot timer that will expire in Z seconds
Countdown timer – Create a timer window for (Last started timer) with title (Round + ((String(Round)) + Spawn:))

Then after the line “Wait Z seconds”, simply insert the following:

Countdown timer – Destroy (Last created timer window)

And there you go! Another good thing to do in this trigger is to give gold to each player. You can have it always be the same amount of gold per round, or you can increase the gold for each round by a line such as the following:

Player Group – Pick every player in (All players) and do (Player – Add (Round * X) to (Picked player) Current gold)

In that line, X is the multiplication factor for how much gold you want your players to get each level. If X is 10, then the players would get 10 gold on round 1, 20 gold on round 2, 30 gold on round 3, etc. for example.

Now believe it or not, just like that you veritably have a working tower defense map. Do you see how the system works? This monster spawning trigger activates for the first time after a set period of time expires. Then a whole bunch of units get spawned and those units immediately become under the governance of the region and trigger system you set up earlier to control monster movement. And when all of those monsters go away and it’s time for the next round, the computer player’s food used will be 0 and this last trigger will run again. It will increment the round and spawn different monsters. All the while the leaderboard will behave appropriately and the players’ lives will be kept track of and decreased as needed.

All that is left to do is end the tower defense. So create monsters for as many levels as you want. I suggest creating something especially impressive for the last level.

Should the players manage to defeat the last level, then this is how you end the map. Let us just suppose that the last round of the map is round 40. In the above monster spawning trigger, insert the following 2 lines before “Set Round = (Round + 1)”:

If (Round equal to 40) then do (Trigger – Run Z)
If (Round equal to 40) then do (Skip remaining actions)

Here, Trigger Z is a trigger that gives victory to all the players after perhaps a short dramatic camera shot in cinematic mode (I’ll let you design this one on your own). Keep in mind this tip however, if you end with a cinematic that disables user control, be sure to re-enable user control before you do the defeat/victory action, or else the players will not have a mouse pointer to select the quit option in the victory dialog.

Presto! Just like that you have a completely working tower defense map! Those are all the necessary and fundamental things you need to do!

Only thing left to do now is go test your map! And you will need to test LOTS LOTS LOTS!!! You will not believe all of the unforeseen bugs and general game-play imbalances and mistakes that will crop up. But fear not! For this is the beginning of the really fun part!

In order to spice your map up a little let me explain how you can do a few cool things!

If you want to create researchable upgrades for your towers that will replace all of a certain tower for a player with a better version, then this is how that can be done. Firstly, create 2 or more versions of the specific tower. Each one of these versions needs to have a unit requirement. This unit requirement actually represents the level of technology a player has researched in regard to this specific tower. For example, let us suppose you have 3 types of lightning towers. Something like Wimpy Lit Tower, Powerful Lit Tower, and Lit Tower of the Gods, for example. Now create three more custom units. Name these units something like Lit Technology 1, Lit Technology 2, and Lit Technology 3 and give them a really inconspicuous graphic like a stag, sheep, or seal. Make Lit Technology 1 a unit requirement for Lit Technology 2 and your Wimpy Lit Tower, and make Lit Technology 2 a requirement for Lit Technology 3 and your Powerful Lit Tower, and make Lit Technology 3 a requirement for your Lit Tower of the Gods. Lastly, make those 3 custom units invulnerable and flying and maybe even invisible, and give them the same interface icon as the actual lightning towers. Now on the map, place a Lit Technology 1 unit in some obscure location for each player. Then give some structure that the player has or can build the ability to train Lit Technology 2 and Lit Technology 3. Now for each player, create the following 2 triggers:

Event:
A unit owned by Player 1 (Red) finishes training a unit

Conditions:
- (Trained unit-type) Equal to Lit Technology 2

Actions:
- Unit Group – Pick every unit in (Units owned by Player 1 (Red) of type Lit Technology 1) and do (Replace picked unit with a Lit Technology 2 using The new unit’s default life and mana)
- Unit – Remove (Trained unit) from the game
- Unit Group – Pick every unit in (Units owned by Player 1 (Red) of type Wimpy Lit Tower) and do (Replace picked unit with a Powerful Lit Tower using The old unit’s relative life and mana).

Next trigger:

Event:
A unit owned by Player 1 (Red) finishes training a unit

Conditions:
- (Trained unit-type) Equal to Lit Technology 3

Actions:
- Unit Group – Pick every unit in (Units owned by Player 1 (Red) of type Lit Technology 2) and do (Replace picked unit with a Lit Technology 3 using The new unit’s default life and mana)
- Unit – Remove (Trained unit) from the game
- Unit Group – Pick every unit in (Units owned by Player 1 (Red) of type Powerful Lit Tower) and do (Replace picked unit with a Lit Tower of the Gods using The old unit’s relative life and mana).

And just like that, you can implement a blanket upgrade system for multiple towers at the same time using this technique. You will just need a worker unit that can build all three of those towers, and he will only be able to build whichever one you have the technology for.

You can also do the simpler more traditional tower upgrades on an individual tower basis. Like Scout Towers upgrading into Cannon Towers. This is very easy to do and can be done in the unit editor. Know this though, units upgraded in this manner do not gain extra abilities when the upgrade is done, even if the upgraded unit is given those abilities in the unit editor. For example, if you want a Cannon Tower to have critical strike, but the scout tower doesn’t have that, first give critical strike to the Cannon Tower in the unit editor. When the player upgrades to the Cannon Tower in game, it will not have critical strike. You must use a trigger to replace the Cannon Tower with a new Cannon Tower, and then it will actually acquire critical strike. Such a trigger would need to be written for each player, and it would generally look like this:

Event:
A unit owned by Player 1 (Red) finishes an upgrade

Actions:
- Wait 1 seconds
- Unit Group – Pick every unit in (Units owned by Player 1 (Red) of type Cannon Tower) and do (Replace picked unit with a Cannon Tower using The old unit’s relative life and mana)

You can easily add on to this trigger any additional such towers that gain new abilities upon upgrades.

Let me explain how to implement a selling system now, if you want to add one of those in your map. First create a custom unit and call it Sell. Give it a coin like interface icon and make it a flying unit. Next, simply create the following general trigger for each player:

Event:
A unit owned by Player 1 (Red) finishes training a unit

Conditions:
- (Trained unit-type) Equal to Sell

Actions:
- If (unit-type of (Triggering unit) Equal to Scout Tower) then do (Player – Add (25) to Player 1 (Red) Current gold)
- If (unit-type of (Triggering unit) Equal to Cannon Tower) then do (Player – Add (50) to Player 1 (Red) Current gold)
- Unit – Remove (Trained unit) from the game
- Unit – Remove (Triggering unit) from the game

You will need to add in a line for each different type of tower that the player can build, and each of these towers will have to be able to train the unit Sell. It’s a cumbersome task, but it can be done if you want that feature in your TD map.

It would probably be a wise thing to remove any player units and structures from the map if that player does not actually enter the game. To do this simply create a trigger with the event map initialization and the following action for each player: If (((Player 1 (Red) slot status) Equal to Is playing) and ((Player 1 (Red) controller) equal to User)) then do (Do nothing) else do (Unit Group – Pick every unit in (Units owned by Player 1 (Red)) and do (Unit – Remove (Picked unit) from the game)).

GAME STABILITY

This section is crucial and it applies to any multiplayer map, regardless of whether or not it is a TD style map. On battle.net, there are many things that can cause spontaneous player disconnects or even splits of a game. Not all of the causes of these errors are known, but I can confirm several causes and give several suggestions.

Firstly, every server split and spontaneous disconnect issue I have ever had in a multiplayer map, I can confirm has been related to certain “tainted” units. I don’t know what all of these units are, but I know of several. Basically, the mere presence of these units in the map can contribute to these errors. I can confirm that there are two units you definitely want to stay away from. And those units are the Murloc Nightcrawler and the Rogue. There are others I am sure, but I do not know specifically what they are. So the first thing you want to look for if you experience server splits or random disconnects in your map is if they occur at any specific spot or time consistently. Then see if there are units relevant to that time or spot and experiment with recreating those units. This applies only to the base unit slot in the editor. Not unit models.

Another big thing is to be sure and destroy certain variables after using them. For example, always be sure to destroy an expired timer. If you are using special effects, always be sure to destroy them when the effect is done. Weather too. Destroy a weather effect if you are not using it. Actually, I would not recommend using weather effects in a TD map at all.

I also recommend staying away from fractional time lengths in the wait action in triggers.

Stay away from spawning too many units in one instant.

Stay away from heavily graphic laden animations in areas of intense action, such as disease cloud and water.

Turn off water waves in the map properties dialog box.

Lastly, keep the number of periodic time event triggers to an absolute minimum.

GENERAL TIPS

Spend quality time designing your towers. Don’t make too few, as that would be boring, but don’t make too many either, as that would be overwhelming. Make sure that there are really good and accurate descriptions of the towers. Be sure to tell the players exactly what the towers do.

Try to design the layout of your map such that not only do all players get a nice amount of action, but that all the players can interact with and help each other out. In other words, stay away from making separate monster paths for each player, for this basically defeats the purpose of making a multiplayer map.

If you want to make a tower fire off lightning like a chimaera, you must include the lightning attack ability in the abilities list of that tower.

If you want a tower to use slow poison, that tower cannot posses a splash attack and it must also have the missile type of attack.

In order to use the moon glaive type bouncing ability, a tower must have the missile (bounce) attack type. It must also have a full area of effect radius, which determines the range of the missile bounce.

Use different armor types like light, heavy, fortified, and hero on the monsters. Also give towers different attack types like piercing, siege, normal, and chaos. This promotes intrigue in your map and increases gameplay value.

If you have towers with area of effect damage, I STRONGLY suggest that you put the Enemy flag in their area of effects target list. This will prevent them from damaging your own units.

I suggest you make any worker units invulnerable, and I suggest that you base them off the undead acolyte so that players can summon the towers. This makes things less annoying for players.

I strongly suggest that you make all of your build and upgrade times relatively quick, as this makes your map less annoying for players.

Include heroes! They can be fun and add a whole other degree of gameplay value and intrigue to your map. Good hero abilities for this kind of map style are entangling roots, storm bolt, bash, earthquake, and death and decay, to name a couple. And include items for your heroes as well! You can do this with stores, or even write triggers to have monsters sometimes drop random items!

Every once and a while, have an exciting boss monster to spice things up.

Make use of the in-game music in your map to spice things up. I don’t recommend inserting your own, since for battle.net multiplayer maps, low file size is very important.

Don’t go overboard with cinematic scenes, especially at the beginning. These can get very annoying for players if they have seen them already.

When editing tower range, be sure to not only edit just the range, but the acquisition radius. A tower will not attack unless a unit is within its acquisition range.

Unless you specifically want monsters to be able to attack, I would advise removing the attack ability from the monsters altogether.

You might want to write a trigger to give a player’s structures to other players if they leave. This can be pretty easily done.

Make all descriptions, directions, and comments VERY clear and easily understandable.

Use your trigger writing knowledge that you have gained thus far to try implementing interesting ideas or features beyond the standard run-of-the-mill TD map.

Lastly, this has been a generalized guide for traditional tower defense maps. However, this guide can still be used as an excellent base guide for creating any variety of tower defense map, such as Team maps or Tower War type maps. All of the basic principles of TD design as discussed in this guide hold true in any of these styles.

I had fun writing this! I hope you learned a lot and good luck!

- D’vorjakque

If that answers any of your questions I'm glad. Gotta run (to school) - cya!
 
maybe
unit-unit is attacked.
condition-attacker=type of tower
action-unit speed = from X to X

something like that.
you couldmake it so when the unit is attacked by that tower and replace it with a different, slower unit but the same model file for a few seconds.
 
ok for slowing unis heres a trigger i used fir my td, should work

Poison Tower
Events
Unit - A unit Is attacked
Conditions
(Unit-type of (Attacking unit)) Equal to (tower unit)
((Triggering unit) is Poisoned) Equal to False
Actions
Unit - Set (Attacked unit) movement speed to ((Current movement speed of (Attacked unit)) - ((Default movement speed of (Attacked unit)) / 4.00))
Unit - Add Poisoned classification to (Attacked unit)
Wait 5.00 seconds
Unit - Set (Attacked unit) movement speed to ((Current movement speed of (Attacked unit)) + ((Default movement speed of (Attacked unit)) / 4.00))
Unit - Remove Poisoned classification from (Attacked unit)
if you want to change the slow % then change 4 to whatever, higher for less slow and lower for more slow.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Varine Varine:
    Today I had to scramble, I didn't work most of dinner service and no one told me shit. They had a rough few hours lol
  • Varine Varine:
    I have two salmon, Sockeye and Atlantic. Atlantic is used for the kids salmon and the salmon and beet salad, and can also be added onto any dish or just as a side. Atlantic salmon will almost exclusively ever be FARMED, as it is endangered in the wild, and we ALWAYS cut them to 4 ounces.
  • Varine Varine:
    SOCKEYE salmon, very different and this IS wild caught. We have an ENTREE version, and an add on version. The entree is 7 ounces, the add on is 4. Why? Because that is how someone that wasn't me set up the computer.
  • Varine Varine:
    I had to have this conversation like ten fucking times tonight
  • Varine Varine:
    The issue being, I came into work and had none of this whatsoever
  • Varine Varine:
    No one told me shit
  • Varine Varine:
    So, taking into consideration that what I typed out up there is kind of some fucking nonsense that under normal circumstances no one really needs to fucking be able to explain in any rational way
  • Varine Varine:
    Let alone trying to figure it out from a wildly stressed out me that is also on a phone call trying to get something to show up from Seattle tomorrow while trying to explain this salmon situation, that also is barely solved in maybe a few hours and and but I am bulking it with a few steelhead filets I have and that is a WHOLE fucking different thing to the 19 year old server that got put on day shift C crew that doesn't know who I am.
  • Varine Varine:
    I did however really want days. I like getting off at 4 half the time, and that makes it worth it!
  • Varine Varine:
    Also I hate my job right now but I think that was the hard part. Now it's just work
  • Varine Varine:
    @jonas I'm sorry? I don't know what you're referring to.
  • Varine Varine:
    Once we hit winter I feel like I get to back to having a pretty cool job. Like I bitch about it all the time, but it's work. I'm still gonna bitch
  • Varine Varine:
    All in all though I think this summer is going really well. Some complicated things, but at the end of the day it isn't THAT big of a deal. Not all of our servers have quite realized they are technically sales
  • Varine Varine:
    Like yeah it is a substitute, but FOMO. Chef isn't getting this again this year, he has to figure it out, so it's slightly off on the menu, but that is more or less the LOWEST quality and price. Right now, steelhead is a real stealhear, right?
  • Varine Varine:
    Like fuck off even I can do it
  • Varine Varine:
    I am going to get one of my servers to do that in her server voice and you'll see my point
  • Varine Varine:
    Maybe the bartender. Idk, it's one of my favorite things to hear them go from calm to customer service voice. They will translate it to like "The chef is trying to change that a bit right now so he does have a Alaskan river steelhead. Yeah like the one you might fish probably!" And then the girls can bat their eyes and do pretty girl server shit
  • Varine Varine:
    At least that's how imagine some of them. Did you know mayonnaise is dairy free? A suprisingly amount of people don't\
  • The Helper The Helper:
    mayo is eggs right?
  • The Helper The Helper:
    Seems I never watched the Witcher - looks like i have a lot of content
  • The Helper The Helper:
    Season 1 Episode 8 the marathon continues...
  • jonas jonas:
    mayo is eggs & oil
    +1
  • The Helper The Helper:
    I got halfway season 2 on The Witcher and it lost me. I am going to have to pick this one up again later.
  • jonas jonas:
    season 2 is with the new actor right? it's so far below the first one
  • The Helper The Helper:
    first season was good the 2nd season is bleh I hope I can make it through it for 3

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials
      Top