Basic multiple thinker list implementation

Set up a main thinker list and a polyobject mover list to test things up. Works so far, networking as well.

Signed-off-by: Nev3r <apophycens@gmail.com>
This commit is contained in:
Nev3r 2019-04-20 22:37:19 +02:00
parent c688291cde
commit 39ba20be6b
24 changed files with 659 additions and 649 deletions

View File

@ -4228,12 +4228,12 @@ static INT16 Consistancy(void)
ret += P_GetRandSeed(); ret += P_GetRandSeed();
#ifdef MOBJCONSISTANCY #ifdef MOBJCONSISTANCY
if (!thinkercap.next) if (!thlist[THINK_MAIN].next)
{ {
DEBFILE(va("Consistancy = %u\n", ret)); DEBFILE(va("Consistancy = %u\n", ret));
return ret; return ret;
} }
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -4260,7 +4260,7 @@ static void Command_Archivetest_f(void)
// assign mobjnum // assign mobjnum
i = 1; i = 1;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
if (th->function.acp1 == (actionf_p1)P_MobjThinker) if (th->function.acp1 == (actionf_p1)P_MobjThinker)
((mobj_t *)th)->mobjnum = i++; ((mobj_t *)th)->mobjnum = i++;

View File

@ -1661,7 +1661,7 @@ void F_TitleScreenTicker(boolean run)
mobj_t *mo2; mobj_t *mo2;
mobj_t *cameraref = NULL; mobj_t *cameraref = NULL;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;

View File

@ -2557,7 +2557,7 @@ void G_ChangePlayerReferences(mobj_t *oldmo, mobj_t *newmo)
I_Assert((oldmo != NULL) && (newmo != NULL)); I_Assert((oldmo != NULL) && (newmo != NULL));
// scan all thinkers // scan all thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -4455,7 +4455,7 @@ void G_ConsGhostTic(void)
demo_p += sizeof(angle_t); // angle, unnecessary for cons. demo_p += sizeof(angle_t); // angle, unnecessary for cons.
mobj = NULL; mobj = NULL;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5851,7 +5851,7 @@ void G_DoPlayMetal(void)
metalbuffer = metal_p = W_CacheLumpNum(l, PU_STATIC); metalbuffer = metal_p = W_CacheLumpNum(l, PU_STATIC);
// find metal sonic // find metal sonic
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -1335,7 +1335,7 @@ static void HWR_SearchLightsInMobjs(void)
//mobj_t * mobj; //mobj_t * mobj;
// search in the list of thinkers // search in the list of thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
// a mobj ? // a mobj ?
if (th->function.acp1 == (actionf_p1)P_MobjThinker) if (th->function.acp1 == (actionf_p1)P_MobjThinker)

View File

@ -421,7 +421,7 @@ void LUA_InvalidateLevel(void)
if (!gL) if (!gL)
return; return;
for (th = thinkercap.next; th && th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th && th != &thlist[THINK_MAIN]; th = th->next)
LUA_InvalidateUserdata(th); LUA_InvalidateUserdata(th);
LUA_InvalidateMapthings(); LUA_InvalidateMapthings();
@ -1127,7 +1127,7 @@ void LUA_Archive(void)
ArchiveExtVars(&players[i], "player"); ArchiveExtVars(&players[i], "player");
} }
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
if (th->function.acp1 == (actionf_p1)P_MobjThinker) if (th->function.acp1 == (actionf_p1)P_MobjThinker)
{ {
// archive function will determine when to skip mobjs, // archive function will determine when to skip mobjs,
@ -1161,7 +1161,7 @@ void LUA_UnArchive(void)
do { do {
mobjnum = READUINT32(save_p); // read a mobjnum mobjnum = READUINT32(save_p); // read a mobjnum
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
if (th->function.acp1 == (actionf_p1)P_MobjThinker if (th->function.acp1 == (actionf_p1)P_MobjThinker
&& ((mobj_t *)th)->mobjnum == mobjnum) // find matching mobj && ((mobj_t *)th)->mobjnum == mobjnum) // find matching mobj
UnArchiveExtVars(th); // apply variables UnArchiveExtVars(th); // apply variables

View File

@ -64,7 +64,7 @@ static int lib_iterateThinkers(lua_State *L)
lua_settop(L, 2); lua_settop(L, 2);
if (lua_isnil(L, 2)) if (lua_isnil(L, 2))
th = &thinkercap; th = &thlist[THINK_MAIN];
else if (lua_isuserdata(L, 2)) else if (lua_isuserdata(L, 2))
{ {
if (lua_islightuserdata(L, 2)) if (lua_islightuserdata(L, 2))
@ -94,11 +94,11 @@ static int lib_iterateThinkers(lua_State *L)
if (!next) if (!next)
return luaL_error(L, "next thinker invalidated during iteration"); return luaL_error(L, "next thinker invalidated during iteration");
for (; next != &thinkercap; next = next->next) for (; next != &thlist[THINK_MAIN]; next = next->next)
if (!it->filter || next->function.acp1 == it->filter) if (!it->filter || next->function.acp1 == it->filter)
{ {
push_thinker(next); push_thinker(next);
if (next->next != &thinkercap) if (next->next != &thlist[THINK_MAIN])
{ {
push_thinker(next->next); push_thinker(next->next);
it->next = luaL_ref(L, LUA_REGISTRYINDEX); it->next = luaL_ref(L, LUA_REGISTRYINDEX);

View File

@ -577,7 +577,7 @@ void Command_Teleport_f(void)
INT32 starpostmax = 0; INT32 starpostmax = 0;
intz = starpostpath; // variable reuse - counting down for selection purposes intz = starpostpath; // variable reuse - counting down for selection purposes
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -600,7 +600,7 @@ void Command_Teleport_f(void)
break; break;
} }
if (th == &thinkercap) if (th == &thlist[THINK_MAIN])
{ {
if (intz == starpostpath) if (intz == starpostpath)
CONS_Alert(CONS_NOTICE, M_GetText("No starpost of position %d found (%d max).\n"), starpostnum, starpostmax); CONS_Alert(CONS_NOTICE, M_GetText("No starpost of position %d found (%d max).\n"), starpostnum, starpostmax);
@ -1069,7 +1069,7 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c
thinker_t *th; thinker_t *th;
mobj_t *mo; mobj_t *mo;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -409,7 +409,7 @@ INT32 EV_DoCeiling(line_t *line, ceiling_e type)
// new door thinker // new door thinker
rtn = 1; rtn = 1;
ceiling = Z_Calloc(sizeof (*ceiling), PU_LEVSPEC, NULL); ceiling = Z_Calloc(sizeof (*ceiling), PU_LEVSPEC, NULL);
P_AddThinker(&ceiling->thinker); P_AddThinker(THINK_MAIN, &ceiling->thinker);
sec->ceilingdata = ceiling; sec->ceilingdata = ceiling;
ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling; ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling;
ceiling->sector = sec; ceiling->sector = sec;
@ -629,7 +629,7 @@ INT32 EV_DoCrush(line_t *line, ceiling_e type)
// new door thinker // new door thinker
rtn = 1; rtn = 1;
ceiling = Z_Calloc(sizeof (*ceiling), PU_LEVSPEC, NULL); ceiling = Z_Calloc(sizeof (*ceiling), PU_LEVSPEC, NULL);
P_AddThinker(&ceiling->thinker); P_AddThinker(THINK_MAIN, &ceiling->thinker);
sec->ceilingdata = ceiling; sec->ceilingdata = ceiling;
ceiling->thinker.function.acp1 = (actionf_p1)T_CrushCeiling; ceiling->thinker.function.acp1 = (actionf_p1)T_CrushCeiling;
ceiling->sector = sec; ceiling->sector = sec;

View File

@ -3514,7 +3514,7 @@ void A_BossDeath(mobj_t *mo)
// scan the remaining thinkers to see // scan the remaining thinkers to see
// if all bosses are dead // if all bosses are dead
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -3573,7 +3573,7 @@ bossjustdie:
// Flee! Flee! Find a point to escape to! If none, just shoot upward! // Flee! Flee! Find a point to escape to! If none, just shoot upward!
// scan the thinkers to find the runaway point // scan the thinkers to find the runaway point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5759,7 +5759,7 @@ void A_RingExplode(mobj_t *actor)
S_StartSound(actor, sfx_prloop); S_StartSound(actor, sfx_prloop);
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -7435,7 +7435,7 @@ void A_Boss3Path(mobj_t *actor)
// scan the thinkers // scan the thinkers
// to find a point that matches // to find a point that matches
// the number // the number
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -7826,7 +7826,7 @@ void A_FindTarget(mobj_t *actor)
CONS_Debug(DBG_GAMELOGIC, "A_FindTarget called from object type %d, var1: %d, var2: %d\n", actor->type, locvar1, locvar2); CONS_Debug(DBG_GAMELOGIC, "A_FindTarget called from object type %d, var1: %d, var2: %d\n", actor->type, locvar1, locvar2);
// scan the thinkers // scan the thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -7891,7 +7891,7 @@ void A_FindTracer(mobj_t *actor)
CONS_Debug(DBG_GAMELOGIC, "A_FindTracer called from object type %d, var1: %d, var2: %d\n", actor->type, locvar1, locvar2); CONS_Debug(DBG_GAMELOGIC, "A_FindTracer called from object type %d, var1: %d, var2: %d\n", actor->type, locvar1, locvar2);
// scan the thinkers // scan the thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -8454,7 +8454,7 @@ void A_RemoteAction(mobj_t *actor)
fixed_t dist1 = 0, dist2 = 0; fixed_t dist1 = 0, dist2 = 0;
// scan the thinkers // scan the thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -8720,7 +8720,7 @@ void A_SetObjectTypeState(mobj_t *actor)
return; return;
#endif #endif
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -9358,7 +9358,7 @@ void A_CheckThingCount(mobj_t *actor)
return; return;
#endif #endif
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -1981,7 +1981,7 @@ void T_ThwompSector(levelspecthink_t *thwomp)
if (!rover || (rover->flags & FF_EXISTS)) if (!rover || (rover->flags & FF_EXISTS))
{ {
// scan the thinkers to find players! // scan the thinkers to find players!
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -2701,7 +2701,7 @@ INT32 EV_DoFloor(line_t *line, floor_e floortype)
// new floor thinker // new floor thinker
rtn = 1; rtn = 1;
dofloor = Z_Calloc(sizeof (*dofloor), PU_LEVSPEC, NULL); dofloor = Z_Calloc(sizeof (*dofloor), PU_LEVSPEC, NULL);
P_AddThinker(&dofloor->thinker); P_AddThinker(THINK_MAIN, &dofloor->thinker);
// make sure another floor thinker won't get started over this one // make sure another floor thinker won't get started over this one
sec->floordata = dofloor; sec->floordata = dofloor;
@ -2922,7 +2922,7 @@ INT32 EV_DoElevator(line_t *line, elevator_e elevtype, boolean customspeed)
// create and initialize new elevator thinker // create and initialize new elevator thinker
rtn = 1; rtn = 1;
elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL); elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL);
P_AddThinker(&elevator->thinker); P_AddThinker(THINK_MAIN, &elevator->thinker);
sec->floordata = elevator; sec->floordata = elevator;
sec->ceilingdata = elevator; sec->ceilingdata = elevator;
elevator->thinker.function.acp1 = (actionf_p1)T_MoveElevator; elevator->thinker.function.acp1 = (actionf_p1)T_MoveElevator;
@ -3149,7 +3149,7 @@ INT32 EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline)
return 0; return 0;
bouncer = Z_Calloc(sizeof (*bouncer), PU_LEVSPEC, NULL); bouncer = Z_Calloc(sizeof (*bouncer), PU_LEVSPEC, NULL);
P_AddThinker(&bouncer->thinker); P_AddThinker(THINK_MAIN, &bouncer->thinker);
sec->ceilingdata = bouncer; sec->ceilingdata = bouncer;
bouncer->thinker.function.acp1 = (actionf_p1)T_BounceCheese; bouncer->thinker.function.acp1 = (actionf_p1)T_BounceCheese;
@ -3183,7 +3183,7 @@ INT32 EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, bool
// create and initialize new thinker // create and initialize new thinker
faller = Z_Calloc(sizeof (*faller), PU_LEVSPEC, NULL); faller = Z_Calloc(sizeof (*faller), PU_LEVSPEC, NULL);
P_AddThinker(&faller->thinker); P_AddThinker(THINK_MAIN, &faller->thinker);
faller->thinker.function.acp1 = (actionf_p1)T_ContinuousFalling; faller->thinker.function.acp1 = (actionf_p1)T_ContinuousFalling;
// set up the fields // set up the fields
@ -3232,7 +3232,7 @@ INT32 EV_StartCrumble(sector_t *sec, ffloor_t *rover, boolean floating,
// create and initialize new elevator thinker // create and initialize new elevator thinker
elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL); elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL);
P_AddThinker(&elevator->thinker); P_AddThinker(THINK_MAIN, &elevator->thinker);
elevator->thinker.function.acp1 = (actionf_p1)T_StartCrumble; elevator->thinker.function.acp1 = (actionf_p1)T_StartCrumble;
// Does this crumbler return? // Does this crumbler return?
@ -3311,7 +3311,7 @@ INT32 EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
// create and initialize new elevator thinker // create and initialize new elevator thinker
block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL); block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL);
P_AddThinker(&block->thinker); P_AddThinker(THINK_MAIN, &block->thinker);
roversec->floordata = block; roversec->floordata = block;
roversec->ceilingdata = block; roversec->ceilingdata = block;
block->thinker.function.acp1 = (actionf_p1)T_MarioBlock; block->thinker.function.acp1 = (actionf_p1)T_MarioBlock;

View File

@ -97,7 +97,7 @@ void P_ClearStarPost(INT32 postnum)
mobj_t *mo2; mobj_t *mo2;
// scan the thinkers // scan the thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -126,7 +126,7 @@ void P_ResetStarposts(void)
thinker_t *th; thinker_t *th;
mobj_t *post; mobj_t *post;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -807,7 +807,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
// The player might have two Ideyas: toucher->tracer and toucher->tracer->hnext // The player might have two Ideyas: toucher->tracer and toucher->tracer->hnext
// so handle their anchorpoints accordingly. // so handle their anchorpoints accordingly.
// scan the thinkers to find the corresponding anchorpoint // scan the thinkers to find the corresponding anchorpoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -901,7 +901,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
count = 1; count = 1;
// scan the remaining thinkers // scan the remaining thinkers
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -951,7 +951,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
// Now we RE-scan all the thinkers to find close objects to pull // Now we RE-scan all the thinkers to find close objects to pull
// in from the paraloop. Isn't this just so efficient? // in from the paraloop. Isn't this just so efficient?
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -1325,7 +1325,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
EV_DoElevator(&junk, bridgeFall, false); EV_DoElevator(&junk, bridgeFall, false);
// scan the remaining thinkers to find koopa // scan the remaining thinkers to find koopa
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -1424,7 +1424,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
thinker_t *th; thinker_t *th;
mobj_t *mo2; mobj_t *mo2;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -2461,7 +2461,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
// scan the thinkers to make sure all the old pinch dummies are gone on death // scan the thinkers to make sure all the old pinch dummies are gone on death
// this can happen if the boss was hurt earlier than expected // this can happen if the boss was hurt earlier than expected
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -76,7 +76,7 @@ fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *minsector, sector_t *maxse
P_RemoveLighting(maxsector); // out with the old, in with the new P_RemoveLighting(maxsector); // out with the old, in with the new
flick = Z_Calloc(sizeof (*flick), PU_LEVSPEC, NULL); flick = Z_Calloc(sizeof (*flick), PU_LEVSPEC, NULL);
P_AddThinker(&flick->thinker); P_AddThinker(THINK_MAIN, &flick->thinker);
flick->thinker.function.acp1 = (actionf_p1)T_FireFlicker; flick->thinker.function.acp1 = (actionf_p1)T_FireFlicker;
flick->sector = maxsector; flick->sector = maxsector;
@ -155,7 +155,7 @@ void P_SpawnLightningFlash(sector_t *sector)
flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL); flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
P_AddThinker(&flash->thinker); P_AddThinker(THINK_MAIN, &flash->thinker);
flash->thinker.function.acp1 = (actionf_p1)T_LightningFlash; flash->thinker.function.acp1 = (actionf_p1)T_LightningFlash;
flash->sector = sector; flash->sector = sector;
@ -214,7 +214,7 @@ strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector,
P_RemoveLighting(maxsector); // out with the old, in with the new P_RemoveLighting(maxsector); // out with the old, in with the new
flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL); flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
P_AddThinker(&flash->thinker); P_AddThinker(THINK_MAIN, &flash->thinker);
flash->sector = maxsector; flash->sector = maxsector;
flash->darktime = darktime; flash->darktime = darktime;
@ -289,7 +289,7 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector,
P_RemoveLighting(maxsector); // out with the old, in with the new P_RemoveLighting(maxsector); // out with the old, in with the new
g = Z_Calloc(sizeof (*g), PU_LEVSPEC, NULL); g = Z_Calloc(sizeof (*g), PU_LEVSPEC, NULL);
P_AddThinker(&g->thinker); P_AddThinker(THINK_MAIN, &g->thinker);
g->sector = maxsector; g->sector = maxsector;
g->minlight = minsector->lightlevel; g->minlight = minsector->lightlevel;
@ -349,7 +349,7 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean
ll->thinker.function.acp1 = (actionf_p1)T_LightFade; ll->thinker.function.acp1 = (actionf_p1)T_LightFade;
sector->lightingdata = ll; // set it to the lightlevel_t sector->lightingdata = ll; // set it to the lightlevel_t
P_AddThinker(&ll->thinker); // add thinker P_AddThinker(THINK_MAIN, &ll->thinker); // add thinker
ll->sector = sector; ll->sector = sector;
ll->sourcelevel = sector->lightlevel; ll->sourcelevel = sector->lightlevel;

View File

@ -61,15 +61,16 @@
#define P_GetPlayerHeight(player) FixedMul(player->height, player->mo->scale) #define P_GetPlayerHeight(player) FixedMul(player->height, player->mo->scale)
#define P_GetPlayerSpinHeight(player) FixedMul(player->spinheight, player->mo->scale) #define P_GetPlayerSpinHeight(player) FixedMul(player->spinheight, player->mo->scale)
//
// P_TICK
//
// both the head and tail of the thinker list // both the head and tail of the thinker list
extern thinker_t thinkercap; typedef enum{
THINK_POLYOBJ,
THINK_MAIN,
NUM_THINKERLISTS
} thinklistnum_t; /**< Thinker lists. */
extern thinker_t thlist[];
void P_InitThinkers(void); void P_InitThinkers(void);
void P_AddThinker(thinker_t *thinker); void P_AddThinker(const thinklistnum_t n, thinker_t *thinker);
void P_RemoveThinker(thinker_t *thinker); void P_RemoveThinker(thinker_t *thinker);
// //

View File

@ -3872,7 +3872,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush)
thinker_t *think; thinker_t *think;
elevator_t *crumbler; elevator_t *crumbler;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)T_StartCrumble) if (think->function.acp1 != (actionf_p1)T_StartCrumble)
continue; continue;

View File

@ -713,7 +713,7 @@ void P_EmeraldManager(void)
spawnpoints[i] = NULL; spawnpoints[i] = NULL;
} }
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -3699,7 +3699,7 @@ void P_DestroyRobots(void)
mobj_t *mo; mobj_t *mo;
thinker_t *think; thinker_t *think;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -4483,7 +4483,7 @@ static void P_Boss3Thinker(mobj_t *mobj)
// scan the thinkers to make sure all the old pinch dummies are gone before making new ones // scan the thinkers to make sure all the old pinch dummies are gone before making new ones
// this can happen if the boss was hurt earlier than expected // this can happen if the boss was hurt earlier than expected
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -4574,7 +4574,7 @@ static void P_Boss3Thinker(mobj_t *mobj)
// scan the thinkers // scan the thinkers
// to find a point that matches // to find a point that matches
// the number // the number
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5195,7 +5195,7 @@ static void P_Boss7Thinker(mobj_t *mobj)
closestdist = INT32_MAX; // Just in case... closestdist = INT32_MAX; // Just in case...
// Find waypoint he is closest to // Find waypoint he is closest to
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5250,7 +5250,7 @@ static void P_Boss7Thinker(mobj_t *mobj)
// scan the thinkers to find // scan the thinkers to find
// the waypoint to use // the waypoint to use
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5382,7 +5382,7 @@ static void P_Boss9Thinker(mobj_t *mobj)
// Run through the thinkers ONCE and find all of the MT_BOSS9GATHERPOINT in the map. // Run through the thinkers ONCE and find all of the MT_BOSS9GATHERPOINT in the map.
// Build a hoop linked list of 'em! // Build a hoop linked list of 'em!
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5848,7 +5848,7 @@ mobj_t *P_GetClosestAxis(mobj_t *source)
fixed_t dist1, dist2 = 0; fixed_t dist1, dist2 = 0;
// scan the thinkers to find the closest axis point // scan the thinkers to find the closest axis point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -9047,7 +9047,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
} }
if (!(mobj->flags & MF_NOTHINK)) if (!(mobj->flags & MF_NOTHINK))
P_AddThinker(&mobj->thinker); P_AddThinker(THINK_MAIN, &mobj->thinker);
// Call action functions when the state is set // Call action functions when the state is set
if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC)) if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC))
@ -9122,7 +9122,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype
mobj->momz = mobjinfo[type].speed; mobj->momz = mobjinfo[type].speed;
mobj->thinker.function.acp1 = (actionf_p1)P_NullPrecipThinker; mobj->thinker.function.acp1 = (actionf_p1)P_NullPrecipThinker;
P_AddThinker(&mobj->thinker); P_AddThinker(THINK_MAIN, &mobj->thinker);
CalculatePrecipFloor(mobj); CalculatePrecipFloor(mobj);
@ -9246,7 +9246,7 @@ void P_RemoveMobj(mobj_t *mobj)
else else
{ // Add thinker just to delay removing it until refrences are gone. { // Add thinker just to delay removing it until refrences are gone.
mobj->flags &= ~MF_NOTHINK; mobj->flags &= ~MF_NOTHINK;
P_AddThinker((thinker_t *)mobj); P_AddThinker(THINK_MAIN, (thinker_t *)mobj);
#ifdef SCRAMBLE_REMOVED #ifdef SCRAMBLE_REMOVED
// Invalidate mobj_t data to cause crashes if accessed! // Invalidate mobj_t data to cause crashes if accessed!
memset((UINT8 *)mobj + sizeof(thinker_t), 0xff, sizeof(mobj_t) - sizeof(thinker_t)); memset((UINT8 *)mobj + sizeof(thinker_t), 0xff, sizeof(mobj_t) - sizeof(thinker_t));
@ -11085,7 +11085,7 @@ ML_EFFECT4 : Don't clip inside the ground
mobj->health = (mthing->angle / 360) + 1; mobj->health = (mthing->angle / 360) + 1;
// See if other starposts exist in this level that have the same value. // See if other starposts exist in this level that have the same value.
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -146,16 +146,6 @@ FUNCINLINE static ATTRINLINE void Polyobj_vecSub2(vertex_t *dst, vertex_t *v1, v
dst->y = v1->y - v2->y; dst->y = v1->y - v2->y;
} }
// Add the polyobject's thinker to the thinker list
// Unlike P_AddThinker, this adds it to the front of the list instead of the back, so that carrying physics can work right. -Red
FUNCINLINE static ATTRINLINE void PolyObj_AddThinker(thinker_t *th)
{
thinkercap.next->prev = th;
th->next = thinkercap.next;
th->prev = &thinkercap;
thinkercap.next = th;
}
// //
// P_PointInsidePolyobj // P_PointInsidePolyobj
// //
@ -1518,7 +1508,7 @@ void Polyobj_InitLevel(void)
// run down the thinker list, count the number of spawn points, and save // run down the thinker list, count the number of spawn points, and save
// the mobj_t pointers on a queue for use below. // the mobj_t pointers on a queue for use below.
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 == (actionf_p1)P_MobjThinker) if (th->function.acp1 == (actionf_p1)P_MobjThinker)
{ {
@ -1826,7 +1816,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
// Find out target first. // Find out target first.
// We redo this each tic to make savegame compatibility easier. // We redo this each tic to make savegame compatibility easier.
for (wp = thinkercap.next; wp != &thinkercap; wp = wp->next) for (wp = thlist[THINK_MAIN].next; wp != &thlist[THINK_MAIN]; wp = wp->next)
{ {
if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -1907,7 +1897,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
CONS_Debug(DBG_POLYOBJ, "Looking for next waypoint...\n"); CONS_Debug(DBG_POLYOBJ, "Looking for next waypoint...\n");
// Find next waypoint // Find next waypoint
for (wp = thinkercap.next; wp != &thinkercap; wp = wp->next) for (wp = thlist[THINK_MAIN].next; wp != &thlist[THINK_MAIN]; wp = wp->next)
{ {
if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -1946,7 +1936,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
th->stophere = true; th->stophere = true;
} }
for (wp = thinkercap.next; wp != &thinkercap; wp = wp->next) for (wp = thlist[THINK_MAIN].next; wp != &thlist[THINK_MAIN]; wp = wp->next)
{ {
if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -1983,7 +1973,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
if (!th->continuous) if (!th->continuous)
th->comeback = false; th->comeback = false;
for (wp = thinkercap.next; wp != &thinkercap; wp = wp->next) for (wp = thlist[THINK_MAIN].next; wp != &thlist[THINK_MAIN]; wp = wp->next)
{ {
if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -2390,7 +2380,7 @@ INT32 EV_DoPolyObjRotate(polyrotdata_t *prdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polyrotate_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polyrotate_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjRotate; th->thinker.function.acp1 = (actionf_p1)T_PolyObjRotate;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields
@ -2455,7 +2445,7 @@ INT32 EV_DoPolyObjMove(polymovedata_t *pmdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polymove_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polymove_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjMove; th->thinker.function.acp1 = (actionf_p1)T_PolyObjMove;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields
@ -2516,7 +2506,7 @@ INT32 EV_DoPolyObjWaypoint(polywaypointdata_t *pwdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polywaypoint_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polywaypoint_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjWaypoint; th->thinker.function.acp1 = (actionf_p1)T_PolyObjWaypoint;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields
@ -2534,7 +2524,7 @@ INT32 EV_DoPolyObjWaypoint(polywaypointdata_t *pwdata)
th->stophere = false; th->stophere = false;
// Find the first waypoint we need to use // Find the first waypoint we need to use
for (wp = thinkercap.next; wp != &thinkercap; wp = wp->next) for (wp = thlist[THINK_MAIN].next; wp != &thlist[THINK_MAIN]; wp = wp->next)
{ {
if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -2605,7 +2595,7 @@ INT32 EV_DoPolyObjWaypoint(polywaypointdata_t *pwdata)
// Find the actual target movement waypoint // Find the actual target movement waypoint
target = first; target = first;
/*for (wp = thinkercap.next; wp != &thinkercap; wp = wp->next) /*for (wp = thlist[THINK_MAIN].next; wp != &thlist[THINK_MAIN]; wp = wp->next)
{ {
if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (wp->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -2662,7 +2652,7 @@ static void Polyobj_doSlideDoor(polyobj_t *po, polydoordata_t *doordata)
// allocate and add a new slide door thinker // allocate and add a new slide door thinker
th = Z_Malloc(sizeof(polyslidedoor_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polyslidedoor_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyDoorSlide; th->thinker.function.acp1 = (actionf_p1)T_PolyDoorSlide;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
// point the polyobject to this thinker // point the polyobject to this thinker
po->thinker = &th->thinker; po->thinker = &th->thinker;
@ -2710,7 +2700,7 @@ static void Polyobj_doSwingDoor(polyobj_t *po, polydoordata_t *doordata)
// allocate and add a new swing door thinker // allocate and add a new swing door thinker
th = Z_Malloc(sizeof(polyswingdoor_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polyswingdoor_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyDoorSwing; th->thinker.function.acp1 = (actionf_p1)T_PolyDoorSwing;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
// point the polyobject to this thinker // point the polyobject to this thinker
po->thinker = &th->thinker; po->thinker = &th->thinker;
@ -2792,7 +2782,7 @@ INT32 EV_DoPolyObjDisplace(polydisplacedata_t *prdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polydisplace_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polydisplace_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjDisplace; th->thinker.function.acp1 = (actionf_p1)T_PolyObjDisplace;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields
@ -2838,7 +2828,7 @@ INT32 EV_DoPolyObjRotDisplace(polyrotdisplacedata_t *prdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polyrotdisplace_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polyrotdisplace_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjRotDisplace; th->thinker.function.acp1 = (actionf_p1)T_PolyObjRotDisplace;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields
@ -2939,7 +2929,7 @@ INT32 EV_DoPolyObjFlag(line_t *pfdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polymove_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polymove_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjFlag; th->thinker.function.acp1 = (actionf_p1)T_PolyObjFlag;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields
@ -3089,7 +3079,7 @@ INT32 EV_DoPolyObjFade(polyfadedata_t *pfdata)
// create a new thinker // create a new thinker
th = Z_Malloc(sizeof(polyfade_t), PU_LEVSPEC, NULL); th = Z_Malloc(sizeof(polyfade_t), PU_LEVSPEC, NULL);
th->thinker.function.acp1 = (actionf_p1)T_PolyObjFade; th->thinker.function.acp1 = (actionf_p1)T_PolyObjFade;
PolyObj_AddThinker(&th->thinker); P_AddThinker(THINK_POLYOBJ, &th->thinker);
po->thinker = &th->thinker; po->thinker = &th->thinker;
// set fields // set fields

File diff suppressed because it is too large Load Diff

View File

@ -814,7 +814,7 @@ void P_ReloadRings(void)
mapthing_t *mt = mapthings; mapthing_t *mt = mapthings;
// scan the thinkers to find rings/spheres/hoops to unset // scan the thinkers to find rings/spheres/hoops to unset
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -883,7 +883,7 @@ void P_SwitchSpheresBonusMode(boolean bonustime)
#endif #endif
// scan the thinkers to find spheres to switch // scan the thinkers to find spheres to switch
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -2298,7 +2298,7 @@ void P_LoadThingsOnly(void)
} }
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker

View File

@ -1644,7 +1644,7 @@ static void P_AddExecutorDelay(line_t *line, mobj_t *mobj, sector_t *sector)
e->sector = sector; e->sector = sector;
e->timer = (line->backsector->ceilingheight>>FRACBITS)+(line->backsector->floorheight>>FRACBITS); e->timer = (line->backsector->ceilingheight>>FRACBITS)+(line->backsector->floorheight>>FRACBITS);
P_SetTarget(&e->caller, mobj); // Use P_SetTarget to make sure the mobj doesn't get freed while we're delaying. P_SetTarget(&e->caller, mobj); // Use P_SetTarget to make sure the mobj doesn't get freed while we're delaying.
P_AddThinker(&e->thinker); P_AddThinker(THINK_MAIN, &e->thinker);
} }
/** Used by P_RunTriggerLinedef to check a NiGHTS trigger linedef's conditions /** Used by P_RunTriggerLinedef to check a NiGHTS trigger linedef's conditions
@ -2253,7 +2253,7 @@ void P_SwitchWeather(INT32 weathernum)
thinker_t *think; thinker_t *think;
precipmobj_t *precipmobj; precipmobj_t *precipmobj;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker) if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker)
continue; // not a precipmobj thinker continue; // not a precipmobj thinker
@ -2269,7 +2269,7 @@ void P_SwitchWeather(INT32 weathernum)
precipmobj_t *precipmobj; precipmobj_t *precipmobj;
state_t *st; state_t *st;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker) if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker)
continue; // not a precipmobj thinker continue; // not a precipmobj thinker
@ -3136,7 +3136,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
scroll_t *scroller; scroll_t *scroller;
thinker_t *th; thinker_t *th;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)T_Scroll) if (th->function.acp1 != (actionf_p1)T_Scroll)
continue; continue;
@ -3972,7 +3972,7 @@ void P_SetupSignExit(player_t *player)
// didn't find any signposts in the exit sector. // didn't find any signposts in the exit sector.
// spin all signposts in the level then. // spin all signposts in the level then.
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -4004,7 +4004,7 @@ boolean P_IsFlagAtBase(mobjtype_t flag)
mobj_t *mo; mobj_t *mo;
INT32 specialnum = 0; INT32 specialnum = 0;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -4437,7 +4437,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
// Find the center of the Eggtrap and release all the pretty animals! // Find the center of the Eggtrap and release all the pretty animals!
// The chimps are my friends.. heeheeheheehehee..... - LouisJM // The chimps are my friends.. heeheeheheehehee..... - LouisJM
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -4743,7 +4743,7 @@ DoneSection2:
// scan the thinkers // scan the thinkers
// to find the first waypoint // to find the first waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -4822,7 +4822,7 @@ DoneSection2:
// scan the thinkers // scan the thinkers
// to find the last waypoint // to find the last waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -4974,7 +4974,7 @@ DoneSection2:
// scan the thinkers // scan the thinkers
// to find the first waypoint // to find the first waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5012,7 +5012,7 @@ DoneSection2:
} }
// Find waypoint before this one (waypointlow) // Find waypoint before this one (waypointlow)
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5039,7 +5039,7 @@ DoneSection2:
} }
// Find waypoint after this one (waypointhigh) // Find waypoint after this one (waypointhigh)
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5758,7 +5758,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
// Just initialise both of these to placate the compiler. // Just initialise both of these to placate the compiler.
i = 0; i = 0;
th = thinkercap.next; th = thlist[THINK_MAIN].next;
for(;;) for(;;)
{ {
@ -5768,7 +5768,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
th = secthinkers[sec2num].thinkers[i]; th = secthinkers[sec2num].thinkers[i];
else break; else break;
} }
else if (th == &thinkercap) else if (th == &thlist[THINK_MAIN])
break; break;
// Should this FOF have spikeness? // Should this FOF have spikeness?
@ -5858,7 +5858,7 @@ static void P_AddSpikeThinker(sector_t *sec, INT32 referrer)
// create and initialize new thinker // create and initialize new thinker
spikes = Z_Calloc(sizeof (*spikes), PU_LEVSPEC, NULL); spikes = Z_Calloc(sizeof (*spikes), PU_LEVSPEC, NULL);
P_AddThinker(&spikes->thinker); P_AddThinker(THINK_MAIN, &spikes->thinker);
spikes->thinker.function.acp1 = (actionf_p1)T_SpikeSector; spikes->thinker.function.acp1 = (actionf_p1)T_SpikeSector;
@ -5880,7 +5880,7 @@ static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline)
// create and initialize new thinker // create and initialize new thinker
floater = Z_Calloc(sizeof (*floater), PU_LEVSPEC, NULL); floater = Z_Calloc(sizeof (*floater), PU_LEVSPEC, NULL);
P_AddThinker(&floater->thinker); P_AddThinker(THINK_MAIN, &floater->thinker);
floater->thinker.function.acp1 = (actionf_p1)T_FloatSector; floater->thinker.function.acp1 = (actionf_p1)T_FloatSector;
@ -5904,7 +5904,7 @@ static inline void P_AddBridgeThinker(line_t *sourceline, sector_t *sec)
// create an initialize new thinker // create an initialize new thinker
bridge = Z_Calloc(sizeof (*bridge), PU_LEVSPEC, NULL); bridge = Z_Calloc(sizeof (*bridge), PU_LEVSPEC, NULL);
P_AddThinker(&bridge->thinker); P_AddThinker(THINK_MAIN, &bridge->thinker);
bridge->thinker.function.acp1 = (actionf_p1)T_BridgeThinker; bridge->thinker.function.acp1 = (actionf_p1)T_BridgeThinker;
@ -5940,7 +5940,7 @@ static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control,
// create and initialize new displacement thinker // create and initialize new displacement thinker
displace = Z_Calloc(sizeof (*displace), PU_LEVSPEC, NULL); displace = Z_Calloc(sizeof (*displace), PU_LEVSPEC, NULL);
P_AddThinker(&displace->thinker); P_AddThinker(THINK_MAIN, &displace->thinker);
displace->thinker.function.acp1 = (actionf_p1)T_PlaneDisplace; displace->thinker.function.acp1 = (actionf_p1)T_PlaneDisplace;
displace->affectee = affectee; displace->affectee = affectee;
@ -5967,7 +5967,7 @@ static void P_AddBlockThinker(sector_t *sec, line_t *sourceline)
// create and initialize new elevator thinker // create and initialize new elevator thinker
block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL); block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL);
P_AddThinker(&block->thinker); P_AddThinker(THINK_MAIN, &block->thinker);
block->thinker.function.acp1 = (actionf_p1)T_MarioBlockChecker; block->thinker.function.acp1 = (actionf_p1)T_MarioBlockChecker;
block->sourceline = sourceline; block->sourceline = sourceline;
@ -5996,7 +5996,7 @@ static void P_AddRaiseThinker(sector_t *sec, line_t *sourceline)
levelspecthink_t *raise; levelspecthink_t *raise;
raise = Z_Calloc(sizeof (*raise), PU_LEVSPEC, NULL); raise = Z_Calloc(sizeof (*raise), PU_LEVSPEC, NULL);
P_AddThinker(&raise->thinker); P_AddThinker(THINK_MAIN, &raise->thinker);
raise->thinker.function.acp1 = (actionf_p1)T_RaiseSector; raise->thinker.function.acp1 = (actionf_p1)T_RaiseSector;
@ -6035,7 +6035,7 @@ static void P_AddOldAirbob(sector_t *sec, line_t *sourceline, boolean noadjust)
levelspecthink_t *airbob; levelspecthink_t *airbob;
airbob = Z_Calloc(sizeof (*airbob), PU_LEVSPEC, NULL); airbob = Z_Calloc(sizeof (*airbob), PU_LEVSPEC, NULL);
P_AddThinker(&airbob->thinker); P_AddThinker(THINK_MAIN, &airbob->thinker);
airbob->thinker.function.acp1 = (actionf_p1)T_RaiseSector; airbob->thinker.function.acp1 = (actionf_p1)T_RaiseSector;
@ -6096,7 +6096,7 @@ static inline void P_AddThwompThinker(sector_t *sec, sector_t *actionsector, lin
// create and initialize new elevator thinker // create and initialize new elevator thinker
thwomp = Z_Calloc(sizeof (*thwomp), PU_LEVSPEC, NULL); thwomp = Z_Calloc(sizeof (*thwomp), PU_LEVSPEC, NULL);
P_AddThinker(&thwomp->thinker); P_AddThinker(THINK_MAIN, &thwomp->thinker);
thwomp->thinker.function.acp1 = (actionf_p1)T_ThwompSector; thwomp->thinker.function.acp1 = (actionf_p1)T_ThwompSector;
@ -6132,7 +6132,7 @@ static inline void P_AddNoEnemiesThinker(sector_t *sec, line_t *sourceline)
// create and initialize new thinker // create and initialize new thinker
nobaddies = Z_Calloc(sizeof (*nobaddies), PU_LEVSPEC, NULL); nobaddies = Z_Calloc(sizeof (*nobaddies), PU_LEVSPEC, NULL);
P_AddThinker(&nobaddies->thinker); P_AddThinker(THINK_MAIN, &nobaddies->thinker);
nobaddies->thinker.function.acp1 = (actionf_p1)T_NoEnemiesSector; nobaddies->thinker.function.acp1 = (actionf_p1)T_NoEnemiesSector;
@ -6154,7 +6154,7 @@ static inline void P_AddEachTimeThinker(sector_t *sec, line_t *sourceline)
// create and initialize new thinker // create and initialize new thinker
eachtime = Z_Calloc(sizeof (*eachtime), PU_LEVSPEC, NULL); eachtime = Z_Calloc(sizeof (*eachtime), PU_LEVSPEC, NULL);
P_AddThinker(&eachtime->thinker); P_AddThinker(THINK_MAIN, &eachtime->thinker);
eachtime->thinker.function.acp1 = (actionf_p1)T_EachTimeThinker; eachtime->thinker.function.acp1 = (actionf_p1)T_EachTimeThinker;
@ -6176,7 +6176,7 @@ static inline void P_AddCameraScanner(sector_t *sourcesec, sector_t *actionsecto
// create and initialize new elevator thinker // create and initialize new elevator thinker
elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL); elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL);
P_AddThinker(&elevator->thinker); P_AddThinker(THINK_MAIN, &elevator->thinker);
elevator->thinker.function.acp1 = (actionf_p1)T_CameraScanner; elevator->thinker.function.acp1 = (actionf_p1)T_CameraScanner;
elevator->type = elevateBounce; elevator->type = elevateBounce;
@ -6272,7 +6272,7 @@ static inline void EV_AddLaserThinker(sector_t *sec, sector_t *sec2, line_t *lin
flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL); flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
P_AddThinker(&flash->thinker); P_AddThinker(THINK_MAIN, &flash->thinker);
flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash; flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash;
flash->ffloor = ffloor; flash->ffloor = ffloor;
@ -6441,7 +6441,7 @@ void P_SpawnSpecials(INT32 fromnetsave)
secthinkers = Z_Calloc(numsectors * sizeof(thinkerlist_t), PU_STATIC, NULL); secthinkers = Z_Calloc(numsectors * sizeof(thinkerlist_t), PU_STATIC, NULL);
// Firstly, find out how many there are in each sector // Firstly, find out how many there are in each sector
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 == (actionf_p1)T_SpikeSector) if (th->function.acp1 == (actionf_p1)T_SpikeSector)
secthinkers[((levelspecthink_t *)th)->sector - sectors].count++; secthinkers[((levelspecthink_t *)th)->sector - sectors].count++;
@ -6461,7 +6461,7 @@ void P_SpawnSpecials(INT32 fromnetsave)
} }
// Finally, populate the lists. // Finally, populate the lists.
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
size_t secnum = (size_t)-1; size_t secnum = (size_t)-1;
@ -7723,7 +7723,7 @@ static void Add_Scroller(INT32 type, fixed_t dx, fixed_t dy, INT32 control, INT3
if ((s->control = control) != -1) if ((s->control = control) != -1)
s->last_height = sectors[control].floorheight + sectors[control].ceilingheight; s->last_height = sectors[control].floorheight + sectors[control].ceilingheight;
s->affectee = affectee; s->affectee = affectee;
P_AddThinker(&s->thinker); P_AddThinker(THINK_MAIN, &s->thinker);
} }
/** Initializes the scrollers. /** Initializes the scrollers.
@ -7892,7 +7892,7 @@ static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t o
d->exists = true; d->exists = true;
d->timer = 1; d->timer = 1;
P_AddThinker(&d->thinker); P_AddThinker(THINK_MAIN, &d->thinker);
} }
/** Makes a FOF appear/disappear /** Makes a FOF appear/disappear
@ -8381,7 +8381,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor
FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT); FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT);
} }
P_AddThinker(&d->thinker); P_AddThinker(THINK_MAIN, &d->thinker);
} }
/** Makes a FOF fade /** Makes a FOF fade
@ -8451,7 +8451,7 @@ static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, ext
} }
sector->fadecolormapdata = d; sector->fadecolormapdata = d;
P_AddThinker(&d->thinker); // add thinker P_AddThinker(THINK_MAIN, &d->thinker); // add thinker
} }
void T_FadeColormap(fadecolormap_t *d) void T_FadeColormap(fadecolormap_t *d)
@ -8570,7 +8570,7 @@ static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32
else else
f->roverfriction = false; f->roverfriction = false;
P_AddThinker(&f->thinker); P_AddThinker(THINK_MAIN, &f->thinker);
} }
/** Applies friction to all things in a sector. /** Applies friction to all things in a sector.
@ -8736,7 +8736,7 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *
p->z = p->source->z; p->z = p->source->z;
} }
p->affectee = affectee; p->affectee = affectee;
P_AddThinker(&p->thinker); P_AddThinker(THINK_MAIN, &p->thinker);
} }

View File

@ -35,8 +35,8 @@ tic_t leveltime;
// but the first element must be thinker_t. // but the first element must be thinker_t.
// //
// Both the head and tail of the thinker list. // The entries will behave like both the head and tail of the lists.
thinker_t thinkercap; thinker_t thlist[NUM_THINKERLISTS];
void Command_Numthinkers_f(void) void Command_Numthinkers_f(void)
{ {
@ -102,7 +102,7 @@ void Command_Numthinkers_f(void)
return; return;
} }
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != action) if (think->function.acp1 != action)
continue; continue;
@ -139,7 +139,7 @@ void Command_CountMobjs_f(void)
count = 0; count = 0;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -159,7 +159,7 @@ void Command_CountMobjs_f(void)
{ {
count = 0; count = 0;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -178,19 +178,18 @@ void Command_CountMobjs_f(void)
// //
void P_InitThinkers(void) void P_InitThinkers(void)
{ {
thinkercap.prev = thinkercap.next = &thinkercap; UINT8 i;
for (i = 0; i < NUM_THINKERLISTS; i++)
thlist[i].prev = thlist[i].next = &thlist[i];
} }
//
// P_AddThinker
// Adds a new thinker at the end of the list. // Adds a new thinker at the end of the list.
// void P_AddThinker(const thinklistnum_t n, thinker_t *thinker)
void P_AddThinker(thinker_t *thinker)
{ {
thinkercap.prev->next = thinker; thlist[n].prev->next = thinker;
thinker->next = &thinkercap; thinker->next = &thlist[n];
thinker->prev = thinkercap.prev; thinker->prev = thlist[n].prev;
thinkercap.prev = thinker; thlist[n].prev = thinker;
thinker->references = 0; // killough 11/98: init reference counter to 0 thinker->references = 0; // killough 11/98: init reference counter to 0
} }
@ -296,11 +295,17 @@ if ((*mop = targ) != NULL) // Set new target and if non-NULL, increase its count
// //
static inline void P_RunThinkers(void) static inline void P_RunThinkers(void)
{ {
for (currentthinker = thinkercap.next; currentthinker != &thinkercap; currentthinker = currentthinker->next) size_t i;
for (i = 0; i < NUM_THINKERLISTS; i++)
{ {
if (currentthinker->function.acp1) //CONS_Printf("Running thinker list %d.\n", i);
currentthinker->function.acp1(currentthinker); for (currentthinker = thlist[i].next; currentthinker != &thlist[i]; currentthinker = currentthinker->next)
{
if (currentthinker->function.acp1)
currentthinker->function.acp1(currentthinker);
}
} }
} }
// //

View File

@ -343,7 +343,7 @@ UINT8 P_FindLowestMare(void)
// scan the thinkers // scan the thinkers
// to find the egg capsule with the lowest mare // to find the egg capsule with the lowest mare
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -392,7 +392,7 @@ boolean P_TransferToNextMare(player_t *player)
// scan the thinkers // scan the thinkers
// to find the closest axis point // to find the closest axis point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -443,7 +443,7 @@ static mobj_t *P_FindAxis(INT32 mare, INT32 axisnum)
// scan the thinkers // scan the thinkers
// to find the closest axis point // to find the closest axis point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -476,7 +476,7 @@ static mobj_t *P_FindAxisTransfer(INT32 mare, INT32 axisnum, mobjtype_t type)
// scan the thinkers // scan the thinkers
// to find the closest axis point // to find the closest axis point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -515,7 +515,7 @@ void P_TransferToAxis(player_t *player, INT32 axisnum)
// scan the thinkers // scan the thinkers
// to find the closest axis point // to find the closest axis point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -615,7 +615,7 @@ static void P_DeNightserizePlayer(player_t *player)
} }
// Check to see if the player should be killed. // Check to see if the player should be killed.
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -1567,7 +1567,7 @@ void P_SpawnShieldOrb(player_t *player)
} }
// blaze through the thinkers to see if an orb already exists! // blaze through the thinkers to see if an orb already exists!
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -3057,7 +3057,7 @@ static void P_DoClimbing(player_t *player)
angle_t sideangle; angle_t sideangle;
fixed_t dx, dy; fixed_t dx, dy;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)T_Scroll) if (think->function.acp1 != (actionf_p1)T_Scroll)
continue; continue;
@ -4438,7 +4438,7 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
if (player->powers[pw_super]) // increase range when super if (player->powers[pw_super]) // increase range when super
range *= 2; range *= 2;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -5635,7 +5635,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
fixed_t truexspeed = xspeed*(!(player->pflags & PF_TRANSFERTOCLOSEST) && player->mo->target->flags2 & MF2_AMBUSH ? -1 : 1); fixed_t truexspeed = xspeed*(!(player->pflags & PF_TRANSFERTOCLOSEST) && player->mo->target->flags2 & MF2_AMBUSH ? -1 : 1);
// Find next waypoint // Find next waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -5671,7 +5671,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
// Look for a wrapper point. // Look for a wrapper point.
if (!transfer1) if (!transfer1)
{ {
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -5699,7 +5699,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
} }
if (!transfer2) if (!transfer2)
{ {
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -6406,7 +6406,7 @@ static void P_NiGHTSMovement(player_t *player)
// scan the thinkers // scan the thinkers
// to find the closest axis point // to find the closest axis point
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -7216,7 +7216,7 @@ static void P_MovePlayer(player_t *player)
thinker_t *th; thinker_t *th;
mobj_t *mo2; mobj_t *mo2;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -8124,7 +8124,7 @@ static void P_DoZoomTube(player_t *player)
CONS_Debug(DBG_GAMELOGIC, "Looking for next waypoint...\n"); CONS_Debug(DBG_GAMELOGIC, "Looking for next waypoint...\n");
// Find next waypoint // Find next waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -8258,7 +8258,7 @@ static void P_DoRopeHang(player_t *player)
CONS_Debug(DBG_GAMELOGIC, "Looking for next waypoint...\n"); CONS_Debug(DBG_GAMELOGIC, "Looking for next waypoint...\n");
// Find next waypoint // Find next waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -8283,7 +8283,7 @@ static void P_DoRopeHang(player_t *player)
CONS_Debug(DBG_GAMELOGIC, "Next waypoint not found, wrapping to start...\n"); CONS_Debug(DBG_GAMELOGIC, "Next waypoint not found, wrapping to start...\n");
// Wrap around back to first waypoint // Wrap around back to first waypoint
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker if (th->function.acp1 != (actionf_p1)P_MobjThinker) // Not a mobj thinker
continue; continue;
@ -8349,7 +8349,7 @@ static void P_NukeAllPlayers(player_t *player)
mobj_t *mo; mobj_t *mo;
thinker_t *think; thinker_t *think;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -8397,7 +8397,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
} }
} }
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -8448,7 +8448,7 @@ mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet)
const angle_t span = (bullet ? ANG30 : ANGLE_90); const angle_t span = (bullet ? ANG30 : ANGLE_90);
fixed_t dist, closestdist = 0; fixed_t dist, closestdist = 0;
for (think = thinkercap.next; think != &thinkercap; think = think->next) for (think = thlist[THINK_MAIN].next; think != &thlist[THINK_MAIN]; think = think->next)
{ {
if (think->function.acp1 != (actionf_p1)P_MobjThinker) if (think->function.acp1 != (actionf_p1)P_MobjThinker)
continue; // not a mobj thinker continue; // not a mobj thinker
@ -8587,7 +8587,7 @@ void P_FindEmerald(void)
// scan the remaining thinkers // scan the remaining thinkers
// to find all emeralds // to find all emeralds
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;
@ -10013,7 +10013,7 @@ void P_PlayerThink(player_t *player)
fixed_t y = player->mo->y; fixed_t y = player->mo->y;
fixed_t z = player->mo->z; fixed_t z = player->mo->z;
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;

View File

@ -2242,7 +2242,7 @@ void R_PrecacheLevel(void)
spritepresent = calloc(numsprites, sizeof (*spritepresent)); spritepresent = calloc(numsprites, sizeof (*spritepresent));
if (spritepresent == NULL) I_Error("%s: Out of memory looking up sprites", "R_PrecacheLevel"); if (spritepresent == NULL) I_Error("%s: Out of memory looking up sprites", "R_PrecacheLevel");
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
if (th->function.acp1 == (actionf_p1)P_MobjThinker) if (th->function.acp1 == (actionf_p1)P_MobjThinker)
spritepresent[((mobj_t *)th)->sprite] = 1; spritepresent[((mobj_t *)th)->sprite] = 1;

View File

@ -2289,7 +2289,7 @@ static void ST_doItemFinderIconsAndSound(void)
return; return;
// Scan thinkers to find emblem mobj with these ids // Scan thinkers to find emblem mobj with these ids
for (th = thinkercap.next; th != &thinkercap; th = th->next) for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next)
{ {
if (th->function.acp1 != (actionf_p1)P_MobjThinker) if (th->function.acp1 != (actionf_p1)P_MobjThinker)
continue; continue;