From b3ac590e5eed98ec5f2c6ba9f5bb8f5bd7a35df4 Mon Sep 17 00:00:00 2001 From: Nev3r Date: Sat, 20 Apr 2019 13:06:06 +0200 Subject: [PATCH] Add a slope thinker queue. Signed-off-by: Nev3r --- src/p_saveg.c | 2 -- src/p_setup.c | 1 + src/p_slopes.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- src/p_slopes.h | 2 ++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 10c761753..2aa7da726 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1997,8 +1997,6 @@ static inline void SaveDynamicSlopeThinker(const thinker_t *th, const UINT8 type { const dynplanethink_t* ht = (const void*)th; - CONS_Printf("Number of slopes: %d\n", slopecount); - WRITEUINT8(save_p, type); WRITEUINT8(save_p, ht->type); WRITEUINT32(save_p, SaveSlope(ht->slope)); diff --git a/src/p_setup.c b/src/p_setup.c index 229ae734d..7da992dc8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2912,6 +2912,7 @@ boolean P_SetupLevel(boolean skipprecip) #ifdef ESLOPE P_ResetDynamicSlopes(fromnetsave); + P_LinkSlopeThinkers(); // Spawn slope thinkers just after plane move thinkers to avoid movement/update delays. #endif P_LoadThings(loademblems); diff --git a/src/p_slopes.c b/src/p_slopes.c index 7f389c16d..9ccd96df2 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -28,6 +28,46 @@ pslope_t *slopelist = NULL; UINT16 slopecount = 0; +thinker_t *dynthinklist; +size_t dynthinknum; + +/// Links previously queued thinker list to the main thinker list. +void P_LinkSlopeThinkers (void) +{ + size_t i; + thinker_t *th = dynthinklist; + + CONS_Printf("Number of dynamic thinkers: %d\n", dynthinknum); + + for (i = 0; i < dynthinknum; i++) + { + thinker_t *next = th->next; + P_AddThinker(th); + th = next; + } +} + +/// Queues a thinker to a partial linked list to be immediately incorporated later via P_LinkSlopeThinkers(). +static void P_QueueSlopeThinker (thinker_t* th) +{ + thinker_t* last = dynthinklist; + + // First entry. + if (!last) + { + dynthinklist = th; + dynthinknum++; + return; + } + + while (last->next) + last = last->next; + + last->next = th; + + dynthinknum++; +} + // Calculate line normal void P_CalculateSlopeNormal(pslope_t *slope) { slope->normal.z = FINECOSINE(slope->zangle>>ANGLETOFINESHIFT); @@ -171,7 +211,7 @@ static inline void P_AddDynSlopeThinker (pslope_t* slope, dynplanetype_t type, l th->slope = slope; th->type = type; - P_AddThinker(&th->thinker); + P_QueueSlopeThinker(&th->thinker); } @@ -556,6 +596,9 @@ void P_ResetDynamicSlopes(const UINT32 fromsave) { slopelist = NULL; slopecount = 0; + dynthinklist = NULL; + dynthinknum = 0; + // We'll handle copy slopes later, after all the tag lists have been made. // Yes, this means copied slopes won't affect things' spawning heights. Too bad for you. for (i = 0; i < numlines; i++) diff --git a/src/p_slopes.h b/src/p_slopes.h index 65b5eeb4c..c5acd4e42 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -17,6 +17,8 @@ extern pslope_t *slopelist; extern UINT16 slopecount; +void P_LinkSlopeThinkers (void); + void P_CalculateSlopeNormal(pslope_t *slope); void P_ResetDynamicSlopes(const UINT32 fromsave);