The Intricacies of TF2 Timers

why managing them is so much of an issue

tsc

Timing in Team Fortress 2 (as far as competitive goes) has always been something of a delicate issue. The round timer is a perfect example of it - decrease the timer, and defenders have even more of a reason to attempt to slow down the game even more; increase the timer, and attackers have no reason to push forward until they can create the perfect storm.

I’m not really here to discuss the metagame issues, though, but rather to look at the complex technical issues surrounding them. In order to do that, let’s look at how another game handles timers compared to TF2. In Counter-Strike: Global Offensive, there is no timer for the map. Each round has timers which limit the round’s length to a maximum of three minutes. This is in contrast to TF2, which has a map timer set to thirty minutes (usually) and a round timer set to ten minutes which is reset every time a control point is captured.

This begins to manifest as a huge disparity in how much time teams have to coordinate strategy for a round. Excluding halftime (which is globally standard for CS:GO but only present in one major region in TF2), TF2 preround strategy time across an hour-long match hovers around thirty seconds, depending on how many rounds are played, whereas CS:GO preround strategy time can be as much as seven and a half minutes. In addition, the TF2 preround also requires teams to roll out in order to contest mid, whereas CS:GO prerounds only have teams buying weapons, and can additionally be extended by a freezetime pause. Given this, it’s quite apparent why players are calling for increases in time between rounds so that teams can more effectively plan strategy.

However, the major issue with doing so is the map timer. In the Source Engine, the map timer is implemented very differently from regular timers used for rounds - it is in the game rules entity (CTeamplayRoundBasedRules, with the TF2-specific version being CTFGameRules) represented by m_flMapResetTime, the time at which the map started. Time left is then calculated by subtracting the current time from the map start time and comparing it to the timelimit set by mp_timelimit. Thus, it is impossible to “pause” the timer with pausing the entire server, which causes many issues in and of itself. Given that time continues to tick on the server in between rounds, increasing this time would decrease the time available to play the round, which can drastically affect the outcome of a very close match. We already are seeing this in action, given that about half a minute of each game is run off for bonus time after a team wins a round. This structural limitation makes it very difficult to add time between rounds.

Even if the general competitive scene would agree to exchange some clock time for extra time to strategize during the match, there is another issue of how to implement this time. Most would agree that such time should come in between the bonus time after a round end and the preround time before a round begins, but TF2 does not actually have functionality for such time outside of Mann vs. Machine mode. The expected command to do this, mp_enableroundwaittime, is actually misnamed, controlling the preround time when the round timer is already running and teams are rolling out to mid. Increasing this time is not a viable option since teams could use the extra time to jump even further to mid, which essentially forces all teams to do this. Thus, the only way left to accomplish this is is to increase the bonus round time via mp_bonusroundtime, which actually doesn’t affect anything other than the map timer as discussed above. However, there is something to be said for wanting the map to be reset before having to plan for the next round, especially as a member of the losing team having to listen to the losing jeers and watching the opposing team tear through the map with guns sparkling.

The most effective approach that would not run into any of these issues would be to hack into the game and adjust everything so that there is a way to have proper time between rounds and so that the map timer does not tick down during bonus time, time between rounds, and preround time. That’s a plan for another day, however…