]> icculus.org git repositories - theoddone33/hhexen.git/blob - base/p_tick.c
Round 4: Some minor build system housekeeping, as well as removing some depricated...
[theoddone33/hhexen.git] / base / p_tick.c
1
2 //**************************************************************************
3 //**
4 //** p_tick.c : Heretic 2 : Raven Software, Corp.
5 //**
6 //** $RCSfile$
7 //** $Revision$
8 //** $Date$
9 //** $Author$
10 //**
11 //**************************************************************************
12
13 // HEADER FILES ------------------------------------------------------------
14
15 #include "h2def.h"
16 #include "p_local.h"
17
18 // MACROS ------------------------------------------------------------------
19
20 // TYPES -------------------------------------------------------------------
21
22 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
23
24 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
25
26 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
27
28 static void RunThinkers(void);
29
30 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
31
32 // PUBLIC DATA DEFINITIONS -------------------------------------------------
33
34 int leveltime;
35 int TimerGame;
36 thinker_t thinkercap; // The head and tail of the thinker list
37
38 // PRIVATE DATA DEFINITIONS ------------------------------------------------
39
40 // CODE --------------------------------------------------------------------
41
42 //==========================================================================
43 //
44 // P_Ticker
45 //
46 //==========================================================================
47
48 void P_Ticker(void)
49 {
50         int i;
51
52         if(paused)
53         {
54                 return;
55         }
56         for(i = 0; i < MAXPLAYERS; i++)
57         {
58                 if(playeringame[i])
59                 {
60                         P_PlayerThink(&players[i]);
61                 }
62         }
63         if(TimerGame)
64         {
65                 if(!--TimerGame)
66                 {
67                         G_Completed(P_TranslateMap(P_GetMapNextMap(gamemap)), 0);
68                 }
69         }
70         RunThinkers();
71         P_UpdateSpecials();
72         P_AnimateSurfaces();
73         leveltime++;
74 }
75
76 //==========================================================================
77 //
78 // RunThinkers
79 //
80 //==========================================================================
81
82 static void RunThinkers(void)
83 {
84         thinker_t *currentthinker;
85
86         currentthinker = thinkercap.next;
87         while(currentthinker != &thinkercap)
88         {
89                 if(currentthinker->function == (think_t)-1)
90                 { // Time to remove it
91                         currentthinker->next->prev = currentthinker->prev;
92                         currentthinker->prev->next = currentthinker->next;
93                         Z_Free(currentthinker);
94                 }
95                 else if(currentthinker->function)
96                 {
97                         currentthinker->function(currentthinker);
98                 }
99                 currentthinker = currentthinker->next;
100         }
101 }
102
103 //==========================================================================
104 //
105 // P_InitThinkers
106 //
107 //==========================================================================
108
109 void P_InitThinkers(void)
110 {
111         thinkercap.prev = thinkercap.next  = &thinkercap;
112 }
113
114 //==========================================================================
115 //
116 // P_AddThinker
117 //
118 // Adds a new thinker at the end of the list.
119 //
120 //==========================================================================
121
122 void P_AddThinker(thinker_t *thinker)
123 {
124         thinkercap.prev->next = thinker;
125         thinker->next = &thinkercap;
126         thinker->prev = thinkercap.prev;
127         thinkercap.prev = thinker;
128 }
129
130 //==========================================================================
131 //
132 // P_RemoveThinker
133 //
134 // Deallocation is lazy -- it will not actually be freed until its
135 // thinking turn comes up.
136 //
137 //==========================================================================
138
139 void P_RemoveThinker(thinker_t *thinker)
140 {
141         thinker->function = (think_t)-1;
142 }