143 lines
3.4 KiB
C
143 lines
3.4 KiB
C
|
|
||
|
//**************************************************************************
|
||
|
//**
|
||
|
//** 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;
|
||
|
}
|