mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
211 lines
8.1 KiB
C
211 lines
8.1 KiB
C
#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
|