Upward Timers in GTA 2 Mission Scripts

Faking an upward timer is possible by using ADD_TIME_TO_TIMER once per second in a WHILE_EXEC loop. Normally, a timer will lose 1 second per second. Simply add 2 seconds during each second and it will count upwards!

This code runs in a separate thread, so you can add it to any level. Check for naming conflicts, then adjust the coordinates for the PLAYER_PED. Make sure the THREAD_TRIGGER covers the start point for the first player, as that's the only player who will definitely be in the level.

You can see it working in Army Base and few of my other levels where you must complete a mission.

Complete Code Example

This can be added to any existing script. If your level has a main loop, use that instead of the COUNTER called loopage.

First published on GTAMP Forum by me. That thread has lots of re-usable code samples.

// Your other objects go here.

// Player:
PLAYER_PED p1 = (202.5,240.0,2.0) 07 000 // Yellow

// Upward Timer
// http://projectcerbera.com/gta/2/tutorials/upward-timers
FORWARD upward_timer:
COUNTER loopage = 1 // main loop
COUNTER stage = 1 // tracks the thing we are timing
COUNTER timer = 3 // count frames from 1-30 every second
// Note: Starting at 2 or 3 removes flicker from the timer.
TIMER_DATA time_taken // display the time taken
THREAD_TRIGGER upward_trigger = THREAD_WAIT_FOR_CHAR_IN_AREA_ANY_MEANS(
                                p1, 202.0,242.0,2.0, 4.0,4.0, upward_timer:) 
upward_timer:
 // Setup
 DELAY_HERE (330) // wait for Time Limit to go away
 DISPLAY_TIMER (time_taken, 12) // 330 frames = 11 seconds
 
 // Remove
 WHILE_EXEC (stage = 0) // don't want it any more
  CLEAR_TIMER (time_taken)
 ENDWHILE
 
 // Display and Update
 WHILE_EXEC (stage = 1) // until JOB COMPLETE
  IF (timer = 30) // once per second
   SET timer = 1 // reset interval
   ADD_TIME_TO_TIMER (time_taken, 2)
  ELSE
   ++timer // count 1 frame
  ENDIF
 ENDWHILE
 
 // Pause Timer
 // Note: Lets players see how long they took to complete.
 WHILE_EXEC (stage = 2)
  IF (timer = 30) // once per second
   SET timer = 1 // reset interval
   ADD_TIME_TO_TIMER (time_taken, 1)
  ELSE
   ++timer // count by 1 frame
  ENDIF
 ENDWHILE
RETURN


LEVELSTART


// Your other commands go here.
DO_NOWT


LEVELEND

This timer starts as soon as the level begins. It pauses if any part of your script does SET stage = 2. You can remove the timer with SET stage = 0 anywhere in your code. Feel free to integrate it however you like, though.

Why the DELAY_HERE?

In multiplayer games, you can set a Time Limit. GTA2 displays this when the game starts but it will delete any mission script timer. You have to wait 11 seconds for it to go away. That was discovered by Elypter, IIRC.

Time Limit reminders later on in the game will not delete your timers.