123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- //**************************************************************************
- //**
- //** p_tick.c : Heretic 2 : Raven Software, Corp.
- //**
- //** $RCSfile: p_tick.c,v $
- //** $Revision: 1.5 $
- //** $Date: 95/10/08 21:53:00 $
- //** $Author: bgokey $
- //**
- //**************************************************************************
- // HEADER FILES ------------------------------------------------------------
- #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;
- }
|