ref: 8bd16fed5b196ae0d0c05e2d8412b2e7b08901ba
dir: /p_tick.c/
//************************************************************************** //** //** p_tick.c : Heretic 2 : Raven Software, Corp. //** //** $Revision: 373 $ //** $Date: 2009-05-19 21:14:28 +0300 (Tue, 19 May 2009) $ //** //************************************************************************** // HEADER FILES ------------------------------------------------------------ #include "h2stdinc.h" #include "h2def.h" #include "p_local.h" // MACROS ------------------------------------------------------------------ // TYPES ------------------------------------------------------------------- // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- static void RunThinkers(void); // EXTERNAL DATA DECLARATIONS ---------------------------------------------- // PUBLIC DATA DEFINITIONS ------------------------------------------------- int leveltime; int TimerGame; thinker_t thinkercap; /* The head and tail of the thinker list */ // PRIVATE DATA DEFINITIONS ------------------------------------------------ // CODE -------------------------------------------------------------------- //========================================================================== // // P_Ticker // //========================================================================== void P_Ticker(void) { int i; if (paused) { return; } for (i = 0; i < MAXPLAYERS; i++) { if (playeringame[i]) { P_PlayerThink(&players[i]); } } if (TimerGame) { if (!--TimerGame) { G_Completed(P_TranslateMap(P_GetMapNextMap(gamemap)), 0); } } RunThinkers(); P_UpdateSpecials(); P_AnimateSurfaces(); leveltime++; } //========================================================================== // // RunThinkers // //========================================================================== static void RunThinkers(void) { thinker_t *currentthinker; currentthinker = thinkercap.next; while (currentthinker != &thinkercap) { if (currentthinker->function == (think_t)-1) { // Time to remove it currentthinker->next->prev = currentthinker->prev; currentthinker->prev->next = currentthinker->next; Z_Free(currentthinker); } else if (currentthinker->function) { currentthinker->function(currentthinker); } currentthinker = currentthinker->next; } } //========================================================================== // // P_InitThinkers // //========================================================================== void P_InitThinkers(void) { thinkercap.prev = thinkercap.next = &thinkercap; } //========================================================================== // // P_AddThinker // // Adds a new thinker at the end of the list. // //========================================================================== void P_AddThinker(thinker_t *thinker) { thinkercap.prev->next = thinker; thinker->next = &thinkercap; thinker->prev = thinkercap.prev; thinkercap.prev = thinker; } //========================================================================== // // P_RemoveThinker // // Deallocation is lazy -- it will not actually be freed until its // thinking turn comes up. // //========================================================================== void P_RemoveThinker(thinker_t *thinker) { thinker->function = (think_t)-1; }