Wait blocks

**Wait blocks** are trigger-related issues in *StarCraft* maps. They occur when the game tries to execute two Wait actions at the same time. Only one Wait action may be run at a time, so if a second is encountered, it is forcibly delayed until the first completes.

Wait blocks commonly occur when a map's triggers use both Waits and Wait-based hyper triggers.

## Inner workings of the Wait action

Wait actions do more than just delaying other trigger actions by a given amount of milliseconds. When *StarCraft* runs a trigger for a player and encounters a Wait action, it takes the triggers that it has already processed for that player, and re-processes them all. *Then*, the game delays the actions following the Wait. Consider a map with the following two triggers:

*StarCraft* Trigger [template]
Description
Create a Marine every trigger cycle.
Players

* Player 1

Conditions

* Always

Actions

* Create 1 Terran Marine at Anywhere for Player 1.
* Preserve trigger.

*StarCraft* Trigger [template]
Description
Display a message, wait a full second, and display another message.
Players

* Player 1

Conditions

* Always

Actions

* Display for current player:Hello!
* Wait 1000 milliseconds.
* Display for current player:Goodbye!
* Preserve trigger.

When those triggers are processed, *StarCraft* will do the following:

* Create a Terran Marine for Player 1.
* Display "Hello!" on Player 1's screen.
* Process the Wait action, by re-executing all Player 1 triggers.
	+ Create a Terran Marine for Player 1.
	+ Wait for a full second.
* Display "Goodbye!" on Player 1's screen.

That would be one trigger cycle.

## Wait blocks

The problems come when two Waits exist for the same player. Consider *these* triggers:

*StarCraft* Trigger [template]
Description
TRIGGER 1. Create a Marine, wait a full second, and create another Marine.
Players

* Player 1

Conditions

* Always

Actions

* Create 1 Terran Marine at Anywhere for Player 1.
* Wait 1000 milliseconds.
* Create 1 Terran SCV at Anywhere for Player 1.
* Preserve trigger.

*StarCraft* Trigger [template]
Description
TRIGGER 2. Display a message, wait a full second, and display another message.
Players

* Player 1

Conditions

* Always

Actions

* Display for current player:Hello!
* Wait 1000 milliseconds.
* Display for current player:Goodbye!
* Preserve trigger.

**When *StarCraft* processes those triggers, it will do the following:**

* First trigger round
* Create a Terran Marine for Player 1.
	+ Increase wait timer by 1000 (TRIGGER 1)
* Display "Hello!" on Player 1's screen.
	+ There is already a wait on the wait timer, so wait until it's over to continue
* Wait for a full second. (TRIGGER 1)
* Create a Terran SCV for Player 1.
	+ Increase wait timer by 1000 (TRIGGER 2)
* Next trigger round
* Create a Terran Marine for Player 1.
	+ There is already a wait on the wait timer, but it's from a previous round, so increase wait timer by 1000 (Trigger 1)
* Wait for 2 seconds. (TRIGGER 1+2)
* Next trigger round
* Create a Terran SCV for Player 1.
* Display for current player:Goodbye!

* + The Wait action here cannot be processed, because the game is already processing a Wait action. This Wait and any remaining actions in this trigger (TRIGGER 1) will be delayed.
	+ Wait for a full second.
	+ Execute any delayed trigger actions.
		- Process the delayed Wait from TRIGGER 1.
			* There are no Player 1 triggers before TRIGGER 1.
			* Wait for a full second.
		- Create a Terran Marine for Player 1.
* Display "Goodbye!" on Player 1's screen.

**That is a full trigger cycle. In simpler terms, here is what happens:**

* Create a Terran Marine for Player 1.
* Display "Hello!"
* Wait for a full second. (TRIGGER 1)
* Create a Terran SCV for Player 1.
* Create a Terran Marine for Player 1.
* Wait for a full second. (TRIGGER 2)
* Wait for a full second. (TRIGGER 1)
	+ Essentially, the two waits are combined.
* Create a Terran SCV for Player 1.
* Display "Goodbye!"

In simple systems, this is often only a minor annoyance... But when large amounts of waits are used (as is the case when using Wait-based hyper triggers), the combined Wait time can cause a massive (or even infinitely long) wait block, completely breaking the map's triggers.

## Why do Waits behave this way?

The reason that previous triggers are re-processed when a Wait is run is to prevent problems in the trigger system. If triggers were not re-processed, then for the above example, there would be *a full second where no triggers can run*. (This would translate to a full second in which no Marines are created.) In maps that need to detect things like unit locations and deaths, this would be a catastrophic delay. Any kind of map that requires precision or timing would end up completely broken. By re-processing the trigger list, *StarCraft* is able to delay trigger actions without breaking the trigger system. Wait blocks are simply an unanticipated problem in this system.

## Solutions

* When using Wait-based hyper triggers, set them up properly. Alternatively, switch to "complex" hyper triggers, which are (ironically) much easier to set up and maintain.
* Avoid situations where a player could end up running multiple Waits at once.
* Use different methods to keep track of time. Timers can use death counters, countdown timers, the movement of a unit from one location to another, or even the burning and destruction of a badly-damaged Terran building (using the death counters or Extended Unit Deaths to detect certain values.)

## External links

* A YouTube video illustrating how waits are processed, using some of the example triggers in this article.