U2 Time Gate Bug

U2 Timegate FixBesides having a reputation as the black sheep of the series, Ultima 2 has several bugs that have persisted over the years. One of them occurs somewhat infrequently when entering a time gate. When it happens, the time gate will teleport you to the wrong location for its position. But the more noticeable side effect is when it also changes the terrain type underneath it. Two common ways I’ve seen it manifest is as a forest tile in B.C. Canada, or a grass tile in A.D. Argentina.

The root cause is that the game actually tracks the state of the time gate in multiple places, and they are not all updated at the same time.

  1. As variables which store the current time gate number and the terrain tile under the gate. These values are actually part of the PLAYER file (the save game).
  2. A set of variables containing the tiles directly north, south, east, and west of the player. The game code uses this to determine what’s in the location the player is moving to. This is so that if it were say, a mountain or a time gate, the game can behave accordingly.
  3. The “rendered view” of which tiles appear on the player’s screen, used to output the view.

U2 Timegate BugState #1 is updated first, while states #2 and #3 are updated at effectively the same time. Between states #1 and #2, however, the game also checks to see if the player has any input (e.g. movement). If so, it acts on that input before updating #2 and #3. So when the player enters the time gate right as it’s about to update to a different location, if state #2 has not yet updated it will find a time gate tile present. It then teleports the player to the “next” time gate destination, also restoring the terrain tile for the next gate. The upgrade’s frame limiter magnifies this problem, creating a wider opportunity for players to enter the gate at that time.

U2UP v2.0 resolves this. In this case, the fix is to ensure that when state #1 gets updated, #2 and #3 also get updated before accepting input.

Leave a Reply

Your email address will not be published. Required fields are marked *