#ifndef __WORLD_CLOCK #define __WORLD_CLOCK //Moa: renderable area should match the background area where ClockString gets rendered, !use even numbers! #define CLOCK_AREA_HEIGHT 14 //hight of renderable area should match the background area where ClockString gets rendered #define CLOCK_AREA_WIDTH 66 //x boundary //Clock coords moved from Interface Panels.cpp, gets initialized in InitializeSMPanelCoordsNew()/InitializeSMPanelCoordsOld() extern INT16 INTERFACE_CLOCK_X; // xPos of Left Top edge of boundary extern INT16 INTERFACE_CLOCK_Y; //the mouse region around the clock (bigger), actual region position depends on parameters given to CreateMouseRegionForPauseOfClock(INT16,INT16) #define CLOCK_REGION_OFFSET_X 1 #define CLOCK_REGION_OFFSET_Y 1 // CHRISL: Added new "TM" variables to allow team and inventory screens to place the clock independantly of each other @see Interface Panels.cpp->InitializeTEAMPanelCoords() extern INT16 INTERFACE_CLOCK_TM_X; extern INT16 INTERFACE_CLOCK_TM_Y; #define NUM_SEC_IN_DAY 86400 #define NUM_SEC_IN_HOUR 3600 #define NUM_SEC_IN_MIN 60 #define ROUNDTO_MIN 5 #define NUM_MIN_IN_DAY 1440 #define NUM_MIN_IN_HOUR 60 //Kris: //This is the plan for game time... //Game time should be restricted to outside code. Think of it as encapsulation. Anyway, using these //simple functions, you will be able to change the amount of time that passes per frame. The gameloop will //automatically update the clock once per cycle, regardless of the mode you are in. //This does pose potential problems in modes such as the editor, or similar where time shouldn't pass, and //isn't currently handled. The best thing to do in these cases is call the PauseGame() function when entering //such a mode, and UnPauseGame() when finished. Everything will be restored just the way you left it. This //is much simpler to handle in the overall scheme of things. //PAUSE FEATURES //Pauses and unpauses the game. It sets and clears a flag which preserves the time rate. extern void PauseGame(); extern void UnPauseGame(); extern void TogglePause(); extern BOOLEAN GamePaused(); extern void LockPauseState( UINT32 uiUniqueReasonId ); extern void UnLockPauseState(); extern BOOLEAN PauseStateLocked(); //USING HIGH RESOLUTION TIME RATE MANIPULATION/ACCESS //Allows external code to change the time rate. void SetGameHoursPerSecond( UINT32 uiGameHoursPerSecond ); void SetGameMinutesPerSecond( UINT32 uiGameMinutesPerSecond ); void SetGameSecondsPerSecond( UINT32 uiGameSecondsPerSecond ); //Allows access to the current time rate. UINT32 GetGameSecondsPerFrame(); void RenderPausedGameBox( void ); void StopTimeCompression( void ); void StartTimeCompression( void ); BOOLEAN IsTimeBeingCompressed( void ); // returns FALSE if time isn't currently being compressed for ANY reason (various pauses, etc.) BOOLEAN IsTimeCompressionOn( void ); // returns TRUE if the player currently wants time to be compressing //USING TIME COMPRESSION //Allows the setting/changing/access of time rate via predefined compression values. //These functions change the index in giTimeCompressSpeeds which aren't in any //particular mathematical pattern. The higher the index, the faster the time is processed //per frame. These functions have their limits, so game time will also be between //TIME_COMPRESS_X1 to TIME_COMPRESS_X8 based in the laptop time compression. void SetGameTimeCompressionLevel( UINT32 uiCompressionRate ); void DecreaseGameTimeCompressionRate(); void IncreaseGameTimeCompressionRate(); //USING CLOCK RESOLUTION //Note, that changing the clock resolution doesn't effect the amount of game time that passes per //real second, but how many times per second the clock is updated. This rate will break up the actual //time slices per second into smaller chunks. This is useful for animating strategic movement under //fast time compression, so objects don't warp around. void SetClockResolutionToDefault(); //1 time per second //Valid range is 1 - 60 times per second. void SetClockResolutionPerSecond( UINT8 ubNumTimesPerSecond ); //Function for accessing the current rate UINT8 ClockResolution(); //time compression defines enum { NOT_USING_TIME_COMPRESSION = -1, TIME_COMPRESS_X0, TIME_COMPRESS_X1, TIME_COMPRESS_5MINS, TIME_COMPRESS_30MINS, TIME_COMPRESS_60MINS, TIME_SUPER_COMPRESS, NUM_TIME_COMPRESS_SPEEDS }; //dereferenced with the above enumerations to provide the actual time compression rate. extern INT32 giTimeCompressSpeeds[ NUM_TIME_COMPRESS_SPEEDS ]; //Lalien: externalized game starting time //#define STARTING_TIME ( ( 1 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) + NUM_SEC_IN_DAY ) // 1am //#define FIRST_ARRIVAL_DELAY ( ( 6 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) ) // 7am ( 6hours later) #define WORLDTIMESTR gswzWorldTimeStr // compress mode now in use extern INT32 giTimeCompressMode; // run time compression till next hour extern bool stopTimeCompressionNextHour; enum { WARPTIME_NO_PROCESSING_OF_EVENTS, WARPTIME_PROCESS_EVENTS_NORMALLY, WARPTIME_PROCESS_TARGET_TIME_FIRST, }; void WarpGameTime( UINT32 uiAdjustment, UINT8 ubWarpCode ); void AdvanceToNextDay(); //This function is called once per cycle in the game loop. This determine how often the clock should be //as well as how much to update the clock by. void UpdateClock(); extern CHAR16 gswzWorldTimeStr[ 20 ]; //Day 99, 23:55 extern UINT32 guiDay; extern UINT32 guiHour; extern UINT32 guiMin; //Advanced function used by certain event callbacks. In the case where time is warped, certain event //need to know how much time was warped since the last query to the event list. //This function returns that value extern UINT32 guiTimeOfLastEventQuery; //This value represents the time that the sector was loaded. If you are in sector A9, and leave //the game clock at that moment will get saved into the temp file associated with it. The next time you //enter A9, this value will contain that time. Used for scheduling purposes. extern UINT32 guiTimeCurrentSectorWasLastLoaded; // is the current pause state due to the player? extern BOOLEAN gfPauseDueToPlayerGamePause; // we've just clued up a pause by the player, the tactical screen will need a full one shot refresh to remove a 2 frame update problem extern BOOLEAN gfJustFinishedAPause; extern BOOLEAN gfResetAllPlayerKnowsEnemiesFlags; extern UINT32 guiLockPauseStateLastReasonId; UINT32 GetWorldTotalMin( ); UINT32 GetWorldTotalSeconds( ); UINT32 GetWorldHour( ); UINT32 GetWorldDay( ); UINT32 GetWorldMinutesInDay( ); UINT32 GetWorldDayInSeconds( ); UINT32 GetWorldDayInMinutes( ); UINT32 GetFutureDayInMinutes( UINT32 uiDay ); UINT32 GetMidnightOfFutureDayInMinutes( UINT32 uiDay ); BOOLEAN DayTime(); BOOLEAN NightTime(); void InitNewGameClock( ); void GotoNextTimeOfDay( UINT32 uiTOD ); void RenderClock( INT16 sX, INT16 sY ); void ToggleSuperCompression(); //IMPORTANT FUNCTION: Used whenever an event or situation is deemed important enough to cancel the //further processing of time in this current time slice! This can only be used inside of event callback //functions -- otherwise, it'll be ignored and automatically reset. An example of this would be when arriving //in a new sector and being prompted to attack or retreat. void InterruptTime(); void PauseTimeForInterupt(); extern BOOLEAN gfTimeInterrupt; BOOLEAN DidGameJustStart(); BOOLEAN SaveGameClock( HWFILE hFile, BOOLEAN fGamePaused, BOOLEAN fLockPauseState ); BOOLEAN LoadGameClock( HWFILE hFile ); // time compress flag stuff BOOLEAN HasTimeCompressOccured( void ); void ResetTimeCompressHasOccured( void ); void SetFactTimeCompressHasOccured( void ); // create mouse region to pause game void CreateMouseRegionForPauseOfClock( INT16 sX, INT16 sY ); // remove mouse region for pause game void RemoveMouseRegionForPauseOfClock( void ); // handle pausing and unpausing of game void HandlePlayerPauseUnPauseOfGame( void ); void ClearTacticalStuffDueToTimeCompression( void ); #endif