From 3332298f9e48a33ec311000977f09a383c810ffc Mon Sep 17 00:00:00 2001 From: Marco Z Date: Fri, 30 Mar 2018 15:27:37 -0400 Subject: [PATCH 01/78] Define fader thinker names --- src/p_saveg.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/p_spec.c | 33 +++++++++++++++++++++++++++++++++ src/p_spec.h | 16 ++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index 029df08f4..5542b3cda 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -988,6 +988,7 @@ typedef enum tc_noenemies, tc_eachtime, tc_disappear, + tc_fade, tc_planedisplace, #ifdef POLYOBJECTS tc_polyrotate, // haleyjd 03/26/06: polyobjects @@ -1552,6 +1553,25 @@ static void SaveDisappearThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->exists); } +// +// SaveFadeThinker +// +// Saves a fade_t thinker +// +static void SaveFadeThinker(const thinker_t *th, const UINT8 type) +{ + const fade_t *ht = (const void *)th; + // \todo fields + WRITEUINT8(save_p, type); + WRITEUINT32(save_p, ht->appeartime); + WRITEUINT32(save_p, ht->disappeartime); + WRITEUINT32(save_p, ht->offset); + WRITEUINT32(save_p, ht->timer); + WRITEINT32(save_p, ht->affectee); + WRITEINT32(save_p, ht->sourceline); + WRITEINT32(save_p, ht->exists); +} + // // SavePlaneDisplaceThinker // @@ -1854,6 +1874,11 @@ static void P_NetArchiveThinkers(void) SaveDisappearThinker(th, tc_disappear); continue; } + else if (th->function.acp1 == (actionf_p1)T_Fade) + { + SaveFadeThinker(th, tc_fade); + continue; + } else if (th->function.acp1 == (actionf_p1)T_PlaneDisplace) { @@ -2530,6 +2555,26 @@ static inline void LoadDisappearThinker(actionf_p1 thinker) P_AddThinker(&ht->thinker); } +// +// LoadFadeThinker +// +// Loads a fade_t thinker +// +static inline void LoadFadeThinker(actionf_p1 thinker) +{ + fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); + ht->thinker.function.acp1 = thinker; + // \todo fields + ht->appeartime = READUINT32(save_p); + ht->disappeartime = READUINT32(save_p); + ht->offset = READUINT32(save_p); + ht->timer = READUINT32(save_p); + ht->affectee = READINT32(save_p); + ht->sourceline = READINT32(save_p); + ht->exists = READINT32(save_p); + P_AddThinker(&ht->thinker); +} + // // LoadPlaneDisplaceThinker // @@ -2833,6 +2878,10 @@ static void P_NetUnArchiveThinkers(void) LoadDisappearThinker((actionf_p1)T_Disappear); break; + case tc_fade: + LoadFadeThinker((actionf_p1)T_Fade); + break; + case tc_planedisplace: LoadPlaneDisplaceThinker((actionf_p1)T_PlaneDisplace); break; diff --git a/src/p_spec.c b/src/p_spec.c index 0b005baff..b1ede46d8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7056,6 +7056,39 @@ void T_Disappear(disappear_t *d) } } +/** Adds master fader thinker. + * + * \param appeartime tics to be existent + * \param disappeartime tics to be nonexistent + * \param sector pointer to control sector + */ +static void P_AddMasterFader(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline) +{ + fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); + + // \todo fields + d->thinker.function.acp1 = (actionf_p1)T_Disappear; + d->appeartime = appeartime; + d->disappeartime = disappeartime; + d->offset = offset; + d->affectee = line; + d->sourceline = sourceline; + d->exists = true; + d->timer = 1; + + P_AddThinker(&d->thinker); +} + +/** Makes a FOF fade + * + * \param d Fade thinker. + * \sa P_AddMasterFader + */ +void T_Fade(fade_t *d) +{ + // \todo everything +} + /* SoM: 3/8/2000: Friction functions start. Add_Friction, diff --git a/src/p_spec.h b/src/p_spec.h index c4e05e072..3ed66f149 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -449,6 +449,22 @@ typedef struct void T_Disappear(disappear_t *d); +// Model for fading FOFs +typedef struct +{ + // \todo fields + thinker_t thinker; ///< Thinker structure for effect. + tic_t appeartime; ///< Tics to be appeared for + tic_t disappeartime;///< Tics to be disappeared for + tic_t offset; ///< Time to wait until thinker starts + tic_t timer; ///< Timer between states + INT32 affectee; ///< Number of affected line + INT32 sourceline; ///< Number of source line + INT32 exists; ///< Exists toggle +} fade_t; + +void T_Fade(fade_t *d); + // Prototype functions for pushers void T_Pusher(pusher_t *p); mobj_t *P_GetPushThing(UINT32 s); From 0c63e44cea863248034fc16219188d4ac2420e0e Mon Sep 17 00:00:00 2001 From: Marco Z Date: Fri, 30 Mar 2018 16:17:35 -0400 Subject: [PATCH 02/78] fade_t fields --- src/p_saveg.c | 20 ++++++-------------- src/p_spec.c | 19 ++++++++----------- src/p_spec.h | 10 +++------- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 5542b3cda..eb76fede5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1561,15 +1561,11 @@ static void SaveDisappearThinker(const thinker_t *th, const UINT8 type) static void SaveFadeThinker(const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; - // \todo fields WRITEUINT8(save_p, type); - WRITEUINT32(save_p, ht->appeartime); - WRITEUINT32(save_p, ht->disappeartime); - WRITEUINT32(save_p, ht->offset); - WRITEUINT32(save_p, ht->timer); WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->sourceline); - WRITEINT32(save_p, ht->exists); + WRITEINT32(save_p, ht->destvalue); + WRITEINT32(save_p, ht->speed); + WRITEUINT8(save_p, ht->ignoreflags); } // @@ -2564,14 +2560,10 @@ static inline void LoadFadeThinker(actionf_p1 thinker) { fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - // \todo fields - ht->appeartime = READUINT32(save_p); - ht->disappeartime = READUINT32(save_p); - ht->offset = READUINT32(save_p); - ht->timer = READUINT32(save_p); ht->affectee = READINT32(save_p); - ht->sourceline = READINT32(save_p); - ht->exists = READINT32(save_p); + ht->destvalue = READINT32(save_p); + ht->speed = READINT32(save_p); + ht->ignoreflags = READUINT8(save_p); P_AddThinker(&ht->thinker); } diff --git a/src/p_spec.c b/src/p_spec.c index b1ede46d8..43dba0dc3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7058,23 +7058,20 @@ void T_Disappear(disappear_t *d) /** Adds master fader thinker. * - * \param appeartime tics to be existent - * \param disappeartime tics to be nonexistent - * \param sector pointer to control sector + * \param destvalue transparency value to fade to + * \param speed speed to fade by + * \param ignoreexists do not handle FF_EXISTS + * \param line line to target FOF */ -static void P_AddMasterFader(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline) +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - // \todo fields d->thinker.function.acp1 = (actionf_p1)T_Disappear; - d->appeartime = appeartime; - d->disappeartime = disappeartime; - d->offset = offset; d->affectee = line; - d->sourceline = sourceline; - d->exists = true; - d->timer = 1; + d->destvalue = destvalue; + d->speed = speed; + d->ignoreflags = (UINT8)ignoreflags; P_AddThinker(&d->thinker); } diff --git a/src/p_spec.h b/src/p_spec.h index 3ed66f149..355f0c111 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -452,15 +452,11 @@ void T_Disappear(disappear_t *d); // Model for fading FOFs typedef struct { - // \todo fields thinker_t thinker; ///< Thinker structure for effect. - tic_t appeartime; ///< Tics to be appeared for - tic_t disappeartime;///< Tics to be disappeared for - tic_t offset; ///< Time to wait until thinker starts - tic_t timer; ///< Timer between states INT32 affectee; ///< Number of affected line - INT32 sourceline; ///< Number of source line - INT32 exists; ///< Exists toggle + INT32 destvalue; ///< Transparency value to fade to + INT32 speed; ///< Speed to fade by + UINT8 ignoreflags; ///< Do not handle FF_EXISTS } fade_t; void T_Fade(fade_t *d); From 1f2a15889f37f53500b4820f75ac5826ff3004de Mon Sep 17 00:00:00 2001 From: Marco Z Date: Fri, 30 Mar 2018 16:17:35 -0400 Subject: [PATCH 03/78] Initial logic attempt * Front X offset: ffloor alpha target (1-256) * Front Y offset: Speed, alpha per tic (1+) * MF_BLOCKMONSTERS: Do not handle FF_EXISTS --- src/p_spec.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 43dba0dc3..2c0418847 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -102,6 +102,7 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3092,6 +3093,20 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; } + case 452: // Fade FOF + { + //CONS_Printf("Hello! Found a Fade special!\n"); + INT32 s, j; + for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) + for (j = 0; (unsigned)j < sectors[s].linecount; j++) + if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) + P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), (INT32)(sectors[s].lines[j]-lines)); + break; + } + + case 453: // Stop fading FOF + break; + #ifdef POLYOBJECTS case 480: // Polyobj_DoorSlide case 481: // Polyobj_DoorSwing @@ -7067,13 +7082,17 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - d->thinker.function.acp1 = (actionf_p1)T_Disappear; + //CONS_Printf("Adding fader | Dest %i | Speed %i | Ignore %i\n", destvalue, speed, ignoreflags); + + d->thinker.function.acp1 = (actionf_p1)T_Fade; d->affectee = line; - d->destvalue = destvalue; - d->speed = speed; + d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 + d->speed = max(1, speed); // minimum speed 1/tic d->ignoreflags = (UINT8)ignoreflags; P_AddThinker(&d->thinker); + + //CONS_Printf("Added fader | Dest %i | Speed %i | Ignore %i\n", d->destvalue, d->speed, d->ignoreflags); } /** Makes a FOF fade @@ -7083,7 +7102,69 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT */ void T_Fade(fade_t *d) { - // \todo everything + ffloor_t *rover; + register INT32 s; + INT32 affectedffloors = 0; + + for (s = -1; (s = P_FindSectorFromLineTag(&lines[d->affectee], s)) >= 0 ;) + { + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != &lines[d->affectee]) + continue; + + // fade out + //CONS_Printf("Fading from %i to %i\n", rover->alpha, d->destvalue); + if (rover->alpha > d->destvalue) + { + // we'll reach our destvalue + if (rover->alpha - d->speed <= d->destvalue + d->speed) + { + //CONS_Printf("Finished fading out\n"); + rover->alpha = d->destvalue; + if (!d->ignoreflags && rover->alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + } + else + { + //CONS_Printf("Fading out...\n"); + rover->alpha -= d->speed; + if (!d->ignoreflags) + rover->flags |= FF_EXISTS; + affectedffloors++; + } + } + else // fade in + { + // we'll reach our destvalue + if (rover->alpha + d->speed >= d->destvalue - d->speed) + { + //CONS_Printf("Finished fading in\n"); + rover->alpha = d->destvalue; + if (!d->ignoreflags) + rover->flags |= FF_EXISTS; + } + else + { + //CONS_Printf("Fading in...\n"); + rover->alpha += d->speed; + if (!d->ignoreflags) + rover->flags |= FF_EXISTS; + affectedffloors++; + } + } + } + } + + // no more ffloors to fade? remove myself + if (affectedffloors == 0) + { + //CONS_Printf("No more FOFs to fade!\n"); + // \todo how to erase the fade_t struct? + P_RemoveThinker(&d->thinker); + } } /* From 1df029ccade0a465d6cb82bd2e458ae3bab28bd6 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 30 Mar 2018 14:36:49 -0400 Subject: [PATCH 04/78] Add predefined behaviors for fading FOF flags * ML_BLOCKMONSTERS: Handle FF_EXISTS * ML_NOCLIMB: Handle FF_SOLID * ML_EFFECT1: Don't handle FF_TRANSLUCENT --- src/p_saveg.c | 4 +- src/p_spec.c | 118 ++++++++++++++++++++++++++++++++++++++++++-------- src/p_spec.h | 2 +- 3 files changed, 102 insertions(+), 22 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index eb76fede5..aa48afde1 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1565,7 +1565,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->affectee); WRITEINT32(save_p, ht->destvalue); WRITEINT32(save_p, ht->speed); - WRITEUINT8(save_p, ht->ignoreflags); + WRITEUINT8(save_p, ht->handleflags); } // @@ -2563,7 +2563,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->affectee = READINT32(save_p); ht->destvalue = READINT32(save_p); ht->speed = READINT32(save_p); - ht->ignoreflags = READUINT8(save_p); + ht->handleflags = READUINT8(save_p); P_AddThinker(&ht->thinker); } diff --git a/src/p_spec.c b/src/p_spec.c index 2c0418847..6b9b9499f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -102,7 +102,7 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT32 line); +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3100,7 +3100,12 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) for (j = 0; (unsigned)j < sectors[s].linecount; j++) if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), (INT32)(sectors[s].lines[j]-lines)); + P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, + sides[line->sidenum[0]].rowoffset>>FRACBITS, + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + (line->flags & ML_NOCLIMB), // handle FF_SOLID + !(line->flags & ML_EFFECT1), // do not handle FF_TRANSLUCENT + (INT32)(sectors[s].lines[j]-lines)); break; } @@ -7075,24 +7080,37 @@ void T_Disappear(disappear_t *d) * * \param destvalue transparency value to fade to * \param speed speed to fade by - * \param ignoreexists do not handle FF_EXISTS + * \param handleexist handle FF_EXISTS + * \param handlesolid handle FF_SOLID + * \param handletrans do not handle FF_TRANSLUCENT * \param line line to target FOF */ -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT32 line) +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - //CONS_Printf("Adding fader | Dest %i | Speed %i | Ignore %i\n", destvalue, speed, ignoreflags); + //CONS_Printf("Adding fader | Dest %i | Speed %i | Ignore %i\n", destvalue, speed, handleflags); d->thinker.function.acp1 = (actionf_p1)T_Fade; d->affectee = line; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 d->speed = max(1, speed); // minimum speed 1/tic - d->ignoreflags = (UINT8)ignoreflags; + + // combine the flags-to-handle, this is more convenient than separate BOOLS + d->handleflags = 0; + + if (handleexist) + d->handleflags |= FF_EXISTS; + + if (handlesolid) + d->handleflags |= FF_SOLID; + + if (handletrans) + d->handleflags |= FF_TRANSLUCENT; P_AddThinker(&d->thinker); - //CONS_Printf("Added fader | Dest %i | Speed %i | Ignore %i\n", d->destvalue, d->speed, d->ignoreflags); + //CONS_Printf("Added fader | Dest %i | Speed %i | Ignore %i\n", d->destvalue, d->speed, d->handleflags); } /** Makes a FOF fade @@ -7120,19 +7138,49 @@ void T_Fade(fade_t *d) // we'll reach our destvalue if (rover->alpha - d->speed <= d->destvalue + d->speed) { - //CONS_Printf("Finished fading out\n"); - rover->alpha = d->destvalue; - if (!d->ignoreflags && rover->alpha <= 1) - rover->flags &= ~FF_EXISTS; - else - rover->flags |= FF_EXISTS; + if (rover->alpha != d->destvalue) + { + //CONS_Printf("Finished fading out\n"); + rover->alpha = d->destvalue; + + if (d->handleflags & FF_EXISTS) + { + if (rover->alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + } + + if ((d->handleflags & FF_SOLID) + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags &= ~FF_SOLID; // make intangible at end of fade-out + + if (d->handleflags & FF_TRANSLUCENT) + { + if (rover->alpha >= 256) + rover->flags &= ~FF_TRANSLUCENT; + else + rover->flags |= FF_TRANSLUCENT; + } + } } else { //CONS_Printf("Fading out...\n"); rover->alpha -= d->speed; - if (!d->ignoreflags) + + if (d->handleflags & FF_EXISTS) rover->flags |= FF_EXISTS; + + if ((d->handleflags & FF_SOLID) + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags |= FF_SOLID; // keep solid during fade + + if (d->handleflags & FF_TRANSLUCENT) + rover->flags |= FF_TRANSLUCENT; // assume we're not completely opaque + affectedffloors++; } } @@ -7141,17 +7189,49 @@ void T_Fade(fade_t *d) // we'll reach our destvalue if (rover->alpha + d->speed >= d->destvalue - d->speed) { - //CONS_Printf("Finished fading in\n"); - rover->alpha = d->destvalue; - if (!d->ignoreflags) - rover->flags |= FF_EXISTS; + if (rover->alpha != d->destvalue) + { + //CONS_Printf("Finished fading in\n"); + rover->alpha = d->destvalue; + + if (d->handleflags & FF_EXISTS) + { + if (rover->alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + } + + if ((d->handleflags & FF_SOLID) + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags |= FF_SOLID; // make solid at end of fade-in + + if (d->handleflags & FF_TRANSLUCENT) + { + if (rover->alpha >= 256) + rover->flags &= ~FF_TRANSLUCENT; + else + rover->flags |= FF_TRANSLUCENT; + } + } } else { //CONS_Printf("Fading in...\n"); rover->alpha += d->speed; - if (!d->ignoreflags) + + if (d->handleflags & FF_EXISTS) rover->flags |= FF_EXISTS; + + if ((d->handleflags & FF_SOLID) + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags |= FF_SOLID; // keep solid during fade + + if (d->handleflags & FF_TRANSLUCENT) + rover->flags |= FF_TRANSLUCENT; // assume we're not completely opaque + affectedffloors++; } } diff --git a/src/p_spec.h b/src/p_spec.h index 355f0c111..9c0b3c2c5 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -456,7 +456,7 @@ typedef struct INT32 affectee; ///< Number of affected line INT32 destvalue; ///< Transparency value to fade to INT32 speed; ///< Speed to fade by - UINT8 ignoreflags; ///< Do not handle FF_EXISTS + UINT8 handleflags; ///< Do not handle FF_EXISTS } fade_t; void T_Fade(fade_t *d); From 8f149075a6a16006996a8982abb9e77f3244a23a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 30 Mar 2018 22:56:43 -0400 Subject: [PATCH 05/78] Maybe let's not handle FF_TRANSLUCENT for fade FOF. Why: FF_TRANSLUCENT is often packaged with flags FF_EXTRA, FF_CUTEXTRA; for intangibles, FF_CUTSPIRTES; in some cases (?), FF_CUTLEVEL. I *think* the rules are consistent amongst predefined FOFs, but maybe there are exceptions? There's too much that can go wrong with assuming too many flags for an FOF. Just make it the modder's responsibility to tag this special to the proper translucent FOF. --- src/p_spec.c | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 6b9b9499f..249d50f7d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -102,7 +102,7 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line); +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3104,7 +3104,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS (line->flags & ML_NOCLIMB), // handle FF_SOLID - !(line->flags & ML_EFFECT1), // do not handle FF_TRANSLUCENT (INT32)(sectors[s].lines[j]-lines)); break; } @@ -7082,10 +7081,9 @@ void T_Disappear(disappear_t *d) * \param speed speed to fade by * \param handleexist handle FF_EXISTS * \param handlesolid handle FF_SOLID - * \param handletrans do not handle FF_TRANSLUCENT * \param line line to target FOF */ -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line) +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7105,9 +7103,6 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOO if (handlesolid) d->handleflags |= FF_SOLID; - if (handletrans) - d->handleflags |= FF_TRANSLUCENT; - P_AddThinker(&d->thinker); //CONS_Printf("Added fader | Dest %i | Speed %i | Ignore %i\n", d->destvalue, d->speed, d->handleflags); @@ -7155,14 +7150,6 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags &= ~FF_SOLID; // make intangible at end of fade-out - - if (d->handleflags & FF_TRANSLUCENT) - { - if (rover->alpha >= 256) - rover->flags &= ~FF_TRANSLUCENT; - else - rover->flags |= FF_TRANSLUCENT; - } } } else @@ -7178,9 +7165,6 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // keep solid during fade - if (d->handleflags & FF_TRANSLUCENT) - rover->flags |= FF_TRANSLUCENT; // assume we're not completely opaque - affectedffloors++; } } @@ -7206,14 +7190,6 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // make solid at end of fade-in - - if (d->handleflags & FF_TRANSLUCENT) - { - if (rover->alpha >= 256) - rover->flags &= ~FF_TRANSLUCENT; - else - rover->flags |= FF_TRANSLUCENT; - } } } else @@ -7229,9 +7205,6 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // keep solid during fade - if (d->handleflags & FF_TRANSLUCENT) - rover->flags |= FF_TRANSLUCENT; // assume we're not completely opaque - affectedffloors++; } } From 4675062cca6cb6978dec144b6239423bd5eb8be2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 30 Mar 2018 22:59:33 -0400 Subject: [PATCH 06/78] Remove log comments for Fade FOF --- src/p_spec.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 2c0418847..a5c040892 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3095,7 +3095,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 452: // Fade FOF { - //CONS_Printf("Hello! Found a Fade special!\n"); INT32 s, j; for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) for (j = 0; (unsigned)j < sectors[s].linecount; j++) @@ -7082,8 +7081,6 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - //CONS_Printf("Adding fader | Dest %i | Speed %i | Ignore %i\n", destvalue, speed, ignoreflags); - d->thinker.function.acp1 = (actionf_p1)T_Fade; d->affectee = line; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 @@ -7091,8 +7088,6 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL ignoreflags, INT d->ignoreflags = (UINT8)ignoreflags; P_AddThinker(&d->thinker); - - //CONS_Printf("Added fader | Dest %i | Speed %i | Ignore %i\n", d->destvalue, d->speed, d->ignoreflags); } /** Makes a FOF fade @@ -7114,22 +7109,19 @@ void T_Fade(fade_t *d) continue; // fade out - //CONS_Printf("Fading from %i to %i\n", rover->alpha, d->destvalue); if (rover->alpha > d->destvalue) { // we'll reach our destvalue if (rover->alpha - d->speed <= d->destvalue + d->speed) { - //CONS_Printf("Finished fading out\n"); rover->alpha = d->destvalue; if (!d->ignoreflags && rover->alpha <= 1) rover->flags &= ~FF_EXISTS; else rover->flags |= FF_EXISTS; } - else + else // continue fading out { - //CONS_Printf("Fading out...\n"); rover->alpha -= d->speed; if (!d->ignoreflags) rover->flags |= FF_EXISTS; @@ -7141,14 +7133,12 @@ void T_Fade(fade_t *d) // we'll reach our destvalue if (rover->alpha + d->speed >= d->destvalue - d->speed) { - //CONS_Printf("Finished fading in\n"); rover->alpha = d->destvalue; if (!d->ignoreflags) rover->flags |= FF_EXISTS; } - else + else // continue fading in { - //CONS_Printf("Fading in...\n"); rover->alpha += d->speed; if (!d->ignoreflags) rover->flags |= FF_EXISTS; @@ -7161,7 +7151,6 @@ void T_Fade(fade_t *d) // no more ffloors to fade? remove myself if (affectedffloors == 0) { - //CONS_Printf("No more FOFs to fade!\n"); // \todo how to erase the fade_t struct? P_RemoveThinker(&d->thinker); } From f0504c0edde44d5326ddbe0a0aed29e4c6005ebb Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 30 Mar 2018 23:29:41 -0400 Subject: [PATCH 07/78] Bring back FF_TRANSLUCENT processing for fade FOF The rules for accompanying flags are: * If FF_TRANSLUCENT, deflag FF_CUTLEVEL and flag FF_EXTRA | FF_CUTEXTRA. * If not FF_TRANSLUCENT, flag FF_CUTLEVEL and deflag FF_EXTRA | FF_CUTEXTRA * If FF_SOLID, deflag FF_CUTSPRITES * If not FF_SOLID, flag FF_CUTSPRITES This reverts commit 8f149075a6a16006996a8982abb9e77f3244a23a. --- src/p_spec.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 02233cf92..412ac6185 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -102,7 +102,7 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, INT32 line); +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3103,6 +3103,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS (line->flags & ML_NOCLIMB), // handle FF_SOLID + !(line->flags & ML_EFFECT1), // do not handle FF_TRANSLUCENT (INT32)(sectors[s].lines[j]-lines)); break; } @@ -7080,9 +7081,10 @@ void T_Disappear(disappear_t *d) * \param speed speed to fade by * \param handleexist handle FF_EXISTS * \param handlesolid handle FF_SOLID + * \param handletrans do not handle FF_TRANSLUCENT * \param line line to target FOF */ -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, INT32 line) +static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7100,6 +7102,9 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOO if (handlesolid) d->handleflags |= FF_SOLID; + if (handletrans) + d->handleflags |= FF_TRANSLUCENT; + P_AddThinker(&d->thinker); } @@ -7143,6 +7148,25 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags &= ~FF_SOLID; // make intangible at end of fade-out + + if (d->handleflags & FF_TRANSLUCENT) + { + if (rover->alpha >= 256) + { + rover->flags |= FF_CUTLEVEL; + rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); + } + else + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + } + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } } } else // continue fading out @@ -7157,6 +7181,17 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // keep solid during fade + if (d->handleflags & FF_TRANSLUCENT) + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } + affectedffloors++; } } @@ -7181,6 +7216,25 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // make solid at end of fade-in + + if (d->handleflags & FF_TRANSLUCENT) + { + if (rover->alpha >= 256) + { + rover->flags |= FF_CUTLEVEL; + rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); + } + else + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + } + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } } } else // continue fading in @@ -7195,6 +7249,17 @@ void T_Fade(fade_t *d) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // keep solid during fade + if (d->handleflags & FF_TRANSLUCENT) + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } + affectedffloors++; } } From 7d5b40a306bc6354916ba049d334be1ad4849363 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 31 Mar 2018 00:02:37 -0400 Subject: [PATCH 08/78] Fix fade_t handleflags to UINT32 --- src/p_saveg.c | 4 ++-- src/p_spec.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index aa48afde1..d07644c53 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1565,7 +1565,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->affectee); WRITEINT32(save_p, ht->destvalue); WRITEINT32(save_p, ht->speed); - WRITEUINT8(save_p, ht->handleflags); + WRITEUINT32(save_p, ht->handleflags); } // @@ -2563,7 +2563,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->affectee = READINT32(save_p); ht->destvalue = READINT32(save_p); ht->speed = READINT32(save_p); - ht->handleflags = READUINT8(save_p); + ht->handleflags = READUINT32(save_p); P_AddThinker(&ht->thinker); } diff --git a/src/p_spec.h b/src/p_spec.h index 9c0b3c2c5..e59e2ea0f 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -456,7 +456,7 @@ typedef struct INT32 affectee; ///< Number of affected line INT32 destvalue; ///< Transparency value to fade to INT32 speed; ///< Speed to fade by - UINT8 handleflags; ///< Do not handle FF_EXISTS + UINT32 handleflags; ///< FOF flags to handle } fade_t; void T_Fade(fade_t *d); From 88be5fe27c6fd8fdac68ac53702fc426c17661c5 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 31 Mar 2018 00:10:46 -0400 Subject: [PATCH 09/78] Better fading comments --- src/p_spec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 412ac6185..de11369f9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7129,7 +7129,7 @@ void T_Fade(fade_t *d) // fade out if (rover->alpha > d->destvalue) { - // we'll reach our destvalue + // finish fading out if (rover->alpha - d->speed <= d->destvalue + d->speed) { if (rover->alpha != d->destvalue) @@ -7197,7 +7197,7 @@ void T_Fade(fade_t *d) } else // fade in { - // we'll reach our destvalue + // finish fading in if (rover->alpha + d->speed >= d->destvalue - d->speed) { if (rover->alpha != d->destvalue) From 378fdf0177355521ce613185d9762d85f5138be4 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 31 Mar 2018 00:40:41 -0400 Subject: [PATCH 10/78] Add fadingdata to sector_t --- src/p_saveg.c | 7 ++++++- src/p_setup.c | 1 + src/r_defs.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index d07644c53..b22b6495e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2564,6 +2564,11 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->destvalue = READINT32(save_p); ht->speed = READINT32(save_p); ht->handleflags = READUINT32(save_p); + + sector_t *ffloorsector = LoadSector(ht->affectee); + if (ffloorsector) + ffloorsector->fadingdata = ht; + P_AddThinker(&ht->thinker); } @@ -2753,7 +2758,7 @@ static void P_NetUnArchiveThinkers(void) // clear sector thinker pointers so they don't point to non-existant thinkers for all of eternity for (i = 0; i < numsectors; i++) { - sectors[i].floordata = sectors[i].ceilingdata = sectors[i].lightingdata = NULL; + sectors[i].floordata = sectors[i].ceilingdata = sectors[i].lightingdata = sectors[i].fadingdata = NULL; } // read in saved thinkers diff --git a/src/p_setup.c b/src/p_setup.c index a9fc57652..3edae5655 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -693,6 +693,7 @@ static void P_LoadRawSectors(UINT8 *data, size_t i) ss->floordata = NULL; ss->ceilingdata = NULL; ss->lightingdata = NULL; + ss->fadingdata = NULL; ss->linecount = 0; ss->lines = NULL; diff --git a/src/r_defs.h b/src/r_defs.h index 7c8f2a73f..b4c7d2112 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -308,6 +308,7 @@ typedef struct sector_s void *floordata; // floor move thinker void *ceilingdata; // ceiling move thinker void *lightingdata; // lighting change thinker + void *fadingdata; // fading FOF thinker // floor and ceiling texture offsets fixed_t floor_xoffs, floor_yoffs; From c9b6c2e02637019904c1e68c2735d5de3da81521 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 31 Mar 2018 01:15:24 -0400 Subject: [PATCH 11/78] Remove fader thinkers by stored pointers in fadingdata --- src/p_spec.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index de11369f9..789ab6c43 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -102,6 +102,8 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); +static void P_ResetFading(line_t *line, fade_t *data); +#define P_RemoveFading(l) P_ResetFading(l, NULL); static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); @@ -3109,7 +3111,14 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } case 453: // Stop fading FOF + { + INT32 s, j; + for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) + for (j = 0; (unsigned)j < sectors[s].linecount; j++) + if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) + P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); break; + } #ifdef POLYOBJECTS case 480: // Polyobj_DoorSlide @@ -7075,6 +7084,35 @@ void T_Disappear(disappear_t *d) } } +/** Removes fadingdata from FOF control sector + * + * \param line line to search for target faders + * \param data pointer to set new fadingdata to. Can be NULL to erase. + */ +static void P_ResetFading(line_t *line, fade_t *data) +{ + ffloor_t *rover; + register INT32 s; + + // find any existing thinkers and remove them, then replace with new data + for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) + { + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != line) + continue; + + if(((fade_t *)rover->master->frontsector->fadingdata) != data) + { + if(&((fade_t *)rover->master->frontsector->fadingdata)->thinker) + P_RemoveThinker(&((fade_t *)rover->master->frontsector->fadingdata)->thinker); + + rover->master->frontsector->fadingdata = data; + } + } + } +} + /** Adds master fader thinker. * * \param destvalue transparency value to fade to @@ -7105,6 +7143,9 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOO if (handletrans) d->handleflags |= FF_TRANSLUCENT; + // find any existing thinkers and remove them, then replace with new data + P_ResetFading(&lines[d->affectee], d); + P_AddThinker(&d->thinker); } @@ -7268,10 +7309,7 @@ void T_Fade(fade_t *d) // no more ffloors to fade? remove myself if (affectedffloors == 0) - { - // \todo how to erase the fade_t struct? - P_RemoveThinker(&d->thinker); - } + P_RemoveFading(&lines[d->affectee]); } /* From 91fbffe73da51d574c5dfa8864a9067c3b96c998 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 6 Apr 2018 22:34:45 -0400 Subject: [PATCH 12/78] Little adjustments * Swap MF_NOCLIMB and MF_EFFECT1 * Implement if Front Y Offset < 1 (== 0), then set alpha immediately --- src/p_spec.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 0f0a2996d..c60771dbf 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3105,8 +3105,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - (line->flags & ML_NOCLIMB), // handle FF_SOLID - !(line->flags & ML_EFFECT1), // do not handle FF_TRANSLUCENT + (line->flags & ML_EFFECT1), // handle FF_SOLID + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT (INT32)(sectors[s].lines[j]-lines)); break; } @@ -7130,7 +7130,7 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOO d->thinker.function.acp1 = (actionf_p1)T_Fade; d->affectee = line; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 - d->speed = max(1, speed); // minimum speed 1/tic + d->speed = speed; // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker // combine the flags-to-handle, this is more convenient than separate BOOLS d->handleflags = 0; @@ -7172,7 +7172,7 @@ void T_Fade(fade_t *d) if (rover->alpha > d->destvalue) { // finish fading out - if (rover->alpha - d->speed <= d->destvalue + d->speed) + if (d->speed < 1 || rover->alpha - d->speed <= d->destvalue + d->speed) { if (rover->alpha != d->destvalue) { @@ -7240,7 +7240,7 @@ void T_Fade(fade_t *d) else // fade in { // finish fading in - if (rover->alpha + d->speed >= d->destvalue - d->speed) + if (d->speed < 1 || rover->alpha + d->speed >= d->destvalue - d->speed) { if (rover->alpha != d->destvalue) { From ef733de6787ee075af2a405da8f9e9bdc599b6ce Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 6 Apr 2018 23:14:48 -0400 Subject: [PATCH 13/78] Refactor flag handling toggles --- src/p_saveg.c | 12 ++++++++-- src/p_spec.c | 61 ++++++++++++++++++++++++++------------------------- src/p_spec.h | 6 ++++- 3 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index b22b6495e..e8643b6b1 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1565,7 +1565,11 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->affectee); WRITEINT32(save_p, ht->destvalue); WRITEINT32(save_p, ht->speed); - WRITEUINT32(save_p, ht->handleflags); + WRITEUINT8(save_p, ht->doexists); + WRITEUINT8(save_p, ht->dotranslucent); + WRITEUINT8(save_p, ht->dosolid); + WRITEUINT8(save_p, ht->dospawnflags); + WRITEUINT8(save_p, ht->dofadeinonly); } // @@ -2563,7 +2567,11 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->affectee = READINT32(save_p); ht->destvalue = READINT32(save_p); ht->speed = READINT32(save_p); - ht->handleflags = READUINT32(save_p); + ht->doexists = READUINT8(save_p); + ht->dotranslucent = READUINT8(save_p); + ht->dosolid = READUINT8(save_p); + ht->dospawnflags = READUINT8(save_p); + ht->dofadeinonly = READUINT8(save_p); sector_t *ffloorsector = LoadSector(ht->affectee); if (ffloorsector) diff --git a/src/p_spec.c b/src/p_spec.c index c60771dbf..f1425d857 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -105,7 +105,9 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFading(line_t *line, fade_t *data); #define P_RemoveFading(l) P_ResetFading(l, NULL); -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line); +static void P_AddMasterFader(INT32 destvalue, INT32 speed, + BOOL doexists, BOOL dotranslucent, BOOL dosolid, BOOL dospawnflags + , BOOL dofadeinonly, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3105,8 +3107,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - (line->flags & ML_EFFECT1), // handle FF_SOLID !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only (INT32)(sectors[s].lines[j]-lines)); break; } @@ -7118,12 +7122,16 @@ static void P_ResetFading(line_t *line, fade_t *data) * * \param destvalue transparency value to fade to * \param speed speed to fade by - * \param handleexist handle FF_EXISTS - * \param handlesolid handle FF_SOLID - * \param handletrans do not handle FF_TRANSLUCENT + * \param doexists handle FF_EXISTS + * \param dotranslucent handle FF_TRANSLUCENT + * \param dosolid handle FF_SOLID + * \param dospawnflags handle spawnflags + * \param dofadeinonly enable flags when fade-in is finished; never on fade-out * \param line line to target FOF */ -static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOOL handlesolid, BOOL handletrans, INT32 line) +static void P_AddMasterFader(INT32 destvalue, INT32 speed, + BOOL doexists, BOOL dotranslucent, BOOL dosolid, BOOL dospawnflags + , BOOL dofadeinonly, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7131,18 +7139,11 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, BOOL handleexist, BOO d->affectee = line; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 d->speed = speed; // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker - - // combine the flags-to-handle, this is more convenient than separate BOOLS - d->handleflags = 0; - - if (handleexist) - d->handleflags |= FF_EXISTS; - - if (handlesolid) - d->handleflags |= FF_SOLID; - - if (handletrans) - d->handleflags |= FF_TRANSLUCENT; + d->doexists = doexists; + d->dotranslucent = dotranslucent; + d->dosolid = dosolid; + d->dospawnflags = dospawnflags; + d->dofadeinonly = dofadeinonly; // find any existing thinkers and remove them, then replace with new data P_ResetFading(&lines[d->affectee], d); @@ -7178,7 +7179,7 @@ void T_Fade(fade_t *d) { rover->alpha = d->destvalue; - if (d->handleflags & FF_EXISTS) + if (d->doexists) { if (rover->alpha <= 1) rover->flags &= ~FF_EXISTS; @@ -7186,12 +7187,12 @@ void T_Fade(fade_t *d) rover->flags |= FF_EXISTS; } - if ((d->handleflags & FF_SOLID) + if (d->dosolid && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags &= ~FF_SOLID; // make intangible at end of fade-out - if (d->handleflags & FF_TRANSLUCENT) + if (d->dotranslucent) { if (rover->alpha >= 256) { @@ -7215,15 +7216,15 @@ void T_Fade(fade_t *d) { rover->alpha -= d->speed; - if (d->handleflags & FF_EXISTS) + if (d->doexists) rover->flags |= FF_EXISTS; - if ((d->handleflags & FF_SOLID) + if (d->dosolid && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // keep solid during fade - if (d->handleflags & FF_TRANSLUCENT) + if (d->dotranslucent) { rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; rover->flags &= ~FF_CUTLEVEL; @@ -7246,7 +7247,7 @@ void T_Fade(fade_t *d) { rover->alpha = d->destvalue; - if (d->handleflags & FF_EXISTS) + if (d->doexists) { if (rover->alpha <= 1) rover->flags &= ~FF_EXISTS; @@ -7254,12 +7255,12 @@ void T_Fade(fade_t *d) rover->flags |= FF_EXISTS; } - if ((d->handleflags & FF_SOLID) + if (d->dosolid && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // make solid at end of fade-in - if (d->handleflags & FF_TRANSLUCENT) + if (d->dotranslucent) { if (rover->alpha >= 256) { @@ -7283,15 +7284,15 @@ void T_Fade(fade_t *d) { rover->alpha += d->speed; - if (d->handleflags & FF_EXISTS) + if (d->doexists) rover->flags |= FF_EXISTS; - if ((d->handleflags & FF_SOLID) + if (d->dosolid && !(rover->flags & FF_SWIMMABLE) && !(rover->flags & FF_QUICKSAND)) rover->flags |= FF_SOLID; // keep solid during fade - if (d->handleflags & FF_TRANSLUCENT) + if (d->dotranslucent) { rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; rover->flags &= ~FF_CUTLEVEL; diff --git a/src/p_spec.h b/src/p_spec.h index e59e2ea0f..670fe116e 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -456,7 +456,11 @@ typedef struct INT32 affectee; ///< Number of affected line INT32 destvalue; ///< Transparency value to fade to INT32 speed; ///< Speed to fade by - UINT32 handleflags; ///< FOF flags to handle + boolean doexists; ///< Handle FF_EXISTS handling + boolean dotranslucent; ///< Handle FF_TRANSLUCENT handling + boolean dosolid; ///< Handle FF_SOLID handling + boolean dospawnflags; ///< Enable spawnflags handling + boolean dofadeinonly; ///< Set flags only when fade-in is finished; never during fade-out } fade_t; void T_Fade(fade_t *d); From acb4322f1d71fd220bd091ef80b963042d2f7d6b Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 7 Apr 2018 05:52:01 -0400 Subject: [PATCH 14/78] checkpoint --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index f1425d857..66097740a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7138,7 +7138,7 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, d->thinker.function.acp1 = (actionf_p1)T_Fade; d->affectee = line; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 - d->speed = speed; // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker + d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->doexists = doexists; d->dotranslucent = dotranslucent; d->dosolid = dosolid; From 94bea03ae5c3daacc3eb4fc4459d0380cfae0de0 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 7 Apr 2018 07:09:04 -0400 Subject: [PATCH 15/78] Allow immediate alpha setting when speed = 0; refactoring * Separate fade logic into P_FindFakeFloorsDoAlpha, P_DoFakeFloorAlpha * Change INT32 destvalue and speed to INT16 --- src/p_saveg.c | 8 +- src/p_spec.c | 364 +++++++++++++++++++++++++++----------------------- src/p_spec.h | 4 +- 3 files changed, 206 insertions(+), 170 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index e8643b6b1..e8e5b4eb6 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1563,8 +1563,8 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) const fade_t *ht = (const void *)th; WRITEUINT8(save_p, type); WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->destvalue); - WRITEINT32(save_p, ht->speed); + WRITEINT16(save_p, ht->destvalue); + WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dosolid); @@ -2565,8 +2565,8 @@ static inline void LoadFadeThinker(actionf_p1 thinker) fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; ht->affectee = READINT32(save_p); - ht->destvalue = READINT32(save_p); - ht->speed = READINT32(save_p); + ht->destvalue = READINT16(save_p); + ht->speed = READINT16(save_p); ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); ht->dosolid = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 66097740a..f3ea699d6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -105,9 +105,12 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFading(line_t *line, fade_t *data); #define P_RemoveFading(l) P_ResetFading(l, NULL); -static void P_AddMasterFader(INT32 destvalue, INT32 speed, - BOOL doexists, BOOL dotranslucent, BOOL dosolid, BOOL dospawnflags - , BOOL dofadeinonly, INT32 line); +static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, + boolean dofadeinonly, INT32 line); +static void P_AddMasterFader(INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, + boolean dofadeinonly, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3104,14 +3107,29 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) for (j = 0; (unsigned)j < sectors[s].linecount; j++) if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, - sides[line->sidenum[0]].rowoffset>>FRACBITS, - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(sectors[s].lines[j]-lines)); + { + if (sides[line->sidenum[0]].rowoffset>>FRACBITS > 0) + P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, + sides[line->sidenum[0]].rowoffset>>FRACBITS, + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only + (INT32)(sectors[s].lines[j]-lines)); + else + { + P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); + P_FindFakeFloorsDoAlpha(sides[line->sidenum[0]].textureoffset>>FRACBITS, + 0, // set alpha immediately + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only + (INT32)(sectors[s].lines[j]-lines)); + } + } break; } @@ -7118,6 +7136,171 @@ static void P_ResetFading(line_t *line, fade_t *data) } } +static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, + boolean dofadeinonly) +{ + boolean result = false; + + if (rover->alpha == destvalue) + return result; + // fade out + else if (rover->alpha > destvalue) + { + // finish fading out + if (speed < 1 || rover->alpha - speed <= destvalue + speed) + { + rover->alpha = destvalue; + + if (doexists) + { + if (rover->alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + } + + if (dosolid + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags &= ~FF_SOLID; // make intangible at end of fade-out + + if (dotranslucent) + { + if (rover->alpha >= 256) + { + rover->flags |= FF_CUTLEVEL; + rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); + } + else + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + } + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } + } + else // continue fading out + { + rover->alpha -= speed; + + if (doexists) + rover->flags |= FF_EXISTS; + + if (dosolid + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags |= FF_SOLID; // keep solid during fade + + if (dotranslucent) + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } + + result = true; + } + } + else // fade in + { + // finish fading in + if (speed < 1 || rover->alpha + speed >= destvalue - speed) + { + rover->alpha = destvalue; + + if (doexists) + { + if (rover->alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + } + + if (dosolid + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags |= FF_SOLID; // make solid at end of fade-in + + if (dotranslucent) + { + if (rover->alpha >= 256) + { + rover->flags |= FF_CUTLEVEL; + rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); + } + else + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + } + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } + } + else // continue fading in + { + rover->alpha += speed; + + if (doexists) + rover->flags |= FF_EXISTS; + + if (dosolid + && !(rover->flags & FF_SWIMMABLE) + && !(rover->flags & FF_QUICKSAND)) + rover->flags |= FF_SOLID; // keep solid during fade + + if (dotranslucent) + { + rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + rover->flags &= ~FF_CUTLEVEL; + + if (rover->flags & FF_SOLID) + rover->flags &= ~FF_CUTSPRITES; + else + rover->flags |= FF_CUTSPRITES; + } + + result = true; + } + } + + return result; +} + +static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, + boolean dofadeinonly, INT32 line) +{ + ffloor_t *rover; + register INT32 s; + INT32 affectedffloors = 0; + + for (s = -1; (s = P_FindSectorFromLineTag(&lines[line], s)) >= 0 ;) + { + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != &lines[line]) + continue; + + affectedffloors += (INT32)P_DoFakeFloorAlpha(rover, destvalue, speed, doexists, dotranslucent, dosolid, dospawnflags, dofadeinonly); + } + } + + return affectedffloors; +} + /** Adds master fader thinker. * * \param destvalue transparency value to fade to @@ -7129,9 +7312,9 @@ static void P_ResetFading(line_t *line, fade_t *data) * \param dofadeinonly enable flags when fade-in is finished; never on fade-out * \param line line to target FOF */ -static void P_AddMasterFader(INT32 destvalue, INT32 speed, - BOOL doexists, BOOL dotranslucent, BOOL dosolid, BOOL dospawnflags - , BOOL dofadeinonly, INT32 line) +static void P_AddMasterFader(INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, + boolean dofadeinonly, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7158,156 +7341,9 @@ static void P_AddMasterFader(INT32 destvalue, INT32 speed, */ void T_Fade(fade_t *d) { - ffloor_t *rover; - register INT32 s; - INT32 affectedffloors = 0; - - for (s = -1; (s = P_FindSectorFromLineTag(&lines[d->affectee], s)) >= 0 ;) - { - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != &lines[d->affectee]) - continue; - - // fade out - if (rover->alpha > d->destvalue) - { - // finish fading out - if (d->speed < 1 || rover->alpha - d->speed <= d->destvalue + d->speed) - { - if (rover->alpha != d->destvalue) - { - rover->alpha = d->destvalue; - - if (d->doexists) - { - if (rover->alpha <= 1) - rover->flags &= ~FF_EXISTS; - else - rover->flags |= FF_EXISTS; - } - - if (d->dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags &= ~FF_SOLID; // make intangible at end of fade-out - - if (d->dotranslucent) - { - if (rover->alpha >= 256) - { - rover->flags |= FF_CUTLEVEL; - rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); - } - else - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - } - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; - } - } - } - else // continue fading out - { - rover->alpha -= d->speed; - - if (d->doexists) - rover->flags |= FF_EXISTS; - - if (d->dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags |= FF_SOLID; // keep solid during fade - - if (d->dotranslucent) - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; - } - - affectedffloors++; - } - } - else // fade in - { - // finish fading in - if (d->speed < 1 || rover->alpha + d->speed >= d->destvalue - d->speed) - { - if (rover->alpha != d->destvalue) - { - rover->alpha = d->destvalue; - - if (d->doexists) - { - if (rover->alpha <= 1) - rover->flags &= ~FF_EXISTS; - else - rover->flags |= FF_EXISTS; - } - - if (d->dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags |= FF_SOLID; // make solid at end of fade-in - - if (d->dotranslucent) - { - if (rover->alpha >= 256) - { - rover->flags |= FF_CUTLEVEL; - rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); - } - else - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - } - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; - } - } - } - else // continue fading in - { - rover->alpha += d->speed; - - if (d->doexists) - rover->flags |= FF_EXISTS; - - if (d->dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags |= FF_SOLID; // keep solid during fade - - if (d->dotranslucent) - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; - } - - affectedffloors++; - } - } - } - } + INT32 affectedffloors = P_FindFakeFloorsDoAlpha(d->destvalue, d->speed, + d->doexists, d->dotranslucent, d->dosolid, d->dospawnflags, + d->dofadeinonly, d->affectee); // no more ffloors to fade? remove myself if (affectedffloors == 0) diff --git a/src/p_spec.h b/src/p_spec.h index 670fe116e..c8607f868 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -454,8 +454,8 @@ typedef struct { thinker_t thinker; ///< Thinker structure for effect. INT32 affectee; ///< Number of affected line - INT32 destvalue; ///< Transparency value to fade to - INT32 speed; ///< Speed to fade by + INT16 destvalue; ///< Transparency value to fade to + INT16 speed; ///< Speed to fade by boolean doexists; ///< Handle FF_EXISTS handling boolean dotranslucent; ///< Handle FF_TRANSLUCENT handling boolean dosolid; ///< Handle FF_SOLID handling From baa5d41dcaabdaf5f9486a6b5152a725e0422c1d Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 19:19:41 -0400 Subject: [PATCH 16/78] totalmarescore player variable for NiGHTS scoring --- src/d_player.h | 1 + src/lua_playerlib.c | 4 ++++ src/p_saveg.c | 2 ++ src/p_setup.c | 4 ++-- src/p_user.c | 2 ++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 7bee5f337..bc6a171d9 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -465,6 +465,7 @@ typedef struct player_s INT16 finishedrings; // The rings/stars you had left upon finishing the mare UINT32 marescore; // score for this nights stage UINT32 lastmarescore; // score for the last mare + UINT32 totalmarescore; // score for all mares UINT8 lastmare; // previous mare INT32 maxlink; // maximum link obtained UINT8 texttimer; // nights_texttime should not be local diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index ff62f2459..504097558 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -304,6 +304,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->marescore); else if (fastcmp(field,"lastmarescore")) lua_pushinteger(L, plr->lastmarescore); + else if (fastcmp(field,"totalmarescore")) + lua_pushinteger(L, plr->totalmarescore); else if (fastcmp(field,"lastmare")) lua_pushinteger(L, plr->lastmare); else if (fastcmp(field,"maxlink")) @@ -584,6 +586,8 @@ static int player_set(lua_State *L) plr->marescore = (UINT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"lastmarescore")) plr->lastmarescore = (UINT32)luaL_checkinteger(L, 3); + else if (fastcmp(field,"totalmarescore")) + plr->totalmarescore = (UINT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"lastmare")) plr->lastmare = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"maxlink")) diff --git a/src/p_saveg.c b/src/p_saveg.c index 7cf437384..6b2b61048 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -206,6 +206,7 @@ static void P_NetArchivePlayers(void) WRITEINT16(save_p, players[i].finishedrings); WRITEUINT32(save_p, players[i].marescore); WRITEUINT32(save_p, players[i].lastmarescore); + WRITEUINT32(save_p, players[i].totalmarescore); WRITEUINT8(save_p, players[i].lastmare); WRITEINT32(save_p, players[i].maxlink); WRITEUINT8(save_p, players[i].texttimer); @@ -395,6 +396,7 @@ static void P_NetUnArchivePlayers(void) players[i].finishedrings = READINT16(save_p); players[i].marescore = READUINT32(save_p); players[i].lastmarescore = READUINT32(save_p); + players[i].totalmarescore = READUINT32(save_p); players[i].lastmare = READUINT8(save_p); players[i].maxlink = READINT32(save_p); players[i].texttimer = READUINT8(save_p); diff --git a/src/p_setup.c b/src/p_setup.c index c62f281b3..285e4d22d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2385,8 +2385,8 @@ static void P_LevelInitStuff(void) players[i].texttimer = players[i].linkcount =\ players[i].linktimer = players[i].flyangle =\ players[i].anotherflyangle = players[i].nightstime =\ - players[i].mare = players[i].realtime =\ - players[i].exiting = 0; + players[i].mare = players[i].totalmarescore =\ + players[i].realtime = players[i].exiting = 0; // i guess this could be part of the above but i feel mildly uncomfortable implicitly casting players[i].gotcontinue = false; diff --git a/src/p_user.c b/src/p_user.c index fd09b0847..6728a3c54 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -725,6 +725,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) G_AddTempNightsRecords(players[i].marescore, leveltime - player->marebegunat, players[i].mare + 1); // transfer scores anyway + players[i].totalmarescore += players[i].marescore; players[i].lastmarescore = players[i].marescore; players[i].marescore = 0; @@ -748,6 +749,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) G_AddTempNightsRecords(player->marescore, leveltime - player->marebegunat, (UINT8)(oldmare + 1)); // Starting a new mare, transfer scores + player->totalmarescore += players[i].marescore; player->lastmarescore = player->marescore; player->marescore = 0; player->marebegunat = leveltime; From c51e84fdfe60b766f3c5dbaf9eb56b41a19dd1f2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 19:23:23 -0400 Subject: [PATCH 17/78] NiGHTS bonus implementation --- src/dehacked.c | 3 +++ src/y_inter.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index fb0f958c3..35b0ce4b1 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1196,6 +1196,9 @@ static void readlevelheader(MYFILE *f, INT32 num) else if (fastcmp(word2, "NORMAL")) i = 0; else if (fastcmp(word2, "BOSS")) i = 1; else if (fastcmp(word2, "ERZ3")) i = 2; + else if (fastcmp(word2, "NIGHTS")) i = 3; + else if (fastcmp(word2, "NIGHTSLINK")) i = 4; + else if (fastcmp(word2, "NIGHTSALL")) i = 5; if (i >= -1 && i <= 2) // -1 for no bonus. Max is 2. mapheaderinfo[num-1]->bonustype = (SINT8)i; diff --git a/src/y_inter.c b/src/y_inter.c index 68dda198c..b3603bb34 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1754,6 +1754,16 @@ static void Y_SetRingBonus(player_t *player, y_bonus_t *bstruct) bstruct->points = max(0, (player->rings) * 100); } +// +// Y_SetNightsBonus +// +static void Y_SetNightsBonus(player_t *player, y_bonus_t *bstruct) +{ + strncpy(bstruct->patch, "YB_NIGHT", sizeof(bstruct->patch)); + bstruct->display = true; + bstruct->points = player->totalmarescore; +} + // // Y_SetLinkBonus // @@ -1815,7 +1825,7 @@ static void Y_SetPerfectBonus(player_t *player, y_bonus_t *bstruct) // This list can be extended in the future with SOC/Lua, perhaps. typedef void (*bonus_f)(player_t *, y_bonus_t *); -bonus_f bonuses_list[4][4] = { +bonus_f bonuses_list[7][4] = { { Y_SetNullBonus, Y_SetNullBonus, @@ -1840,6 +1850,24 @@ bonus_f bonuses_list[4][4] = { Y_SetRingBonus, Y_SetPerfectBonus, }, + { + Y_SetNullBonus, + Y_SetNightsBonus, + Y_SetNullBonus, + Y_SetNullBonus, + }, + { + Y_SetNullBonus, + Y_SetLinkBonus, + Y_SetNullBonus, + Y_SetNullBonus, + }, + { + Y_SetNullBonus, + Y_SetNightsBonus, + Y_SetLinkBonus, + Y_SetNullBonus, + }, }; From 417d7d105e039f8b3041a779d2821086cd4b3dfd Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 19:26:18 -0400 Subject: [PATCH 18/78] Totalmarescore typo --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 6728a3c54..d8f096109 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -749,7 +749,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) G_AddTempNightsRecords(player->marescore, leveltime - player->marebegunat, (UINT8)(oldmare + 1)); // Starting a new mare, transfer scores - player->totalmarescore += players[i].marescore; + player->totalmarescore += player->marescore; player->lastmarescore = player->marescore; player->marescore = 0; player->marebegunat = leveltime; From 8d40d8ea4394f2682631f5ef8e7cf5124621887f Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 19:29:35 -0400 Subject: [PATCH 19/78] BONUSTYPE typo; bonus alignment --- src/dehacked.c | 2 +- src/y_inter.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 35b0ce4b1..41d41405c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1200,7 +1200,7 @@ static void readlevelheader(MYFILE *f, INT32 num) else if (fastcmp(word2, "NIGHTSLINK")) i = 4; else if (fastcmp(word2, "NIGHTSALL")) i = 5; - if (i >= -1 && i <= 2) // -1 for no bonus. Max is 2. + if (i >= -1 && i <= 5) // -1 for no bonus. Max is 2. mapheaderinfo[num-1]->bonustype = (SINT8)i; else deh_warning("Level header %d: invalid bonus type number %d", num, i); diff --git a/src/y_inter.c b/src/y_inter.c index b3603bb34..de0335523 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1852,14 +1852,14 @@ bonus_f bonuses_list[7][4] = { }, { Y_SetNullBonus, - Y_SetNightsBonus, Y_SetNullBonus, + Y_SetNightsBonus, Y_SetNullBonus, }, { Y_SetNullBonus, - Y_SetLinkBonus, Y_SetNullBonus, + Y_SetLinkBonus, Y_SetNullBonus, }, { From d83b96c126ba166ac1a55b5096051030db141669 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 19:45:34 -0400 Subject: [PATCH 20/78] NiGHTS lap score bonus --- src/dehacked.c | 6 ++++-- src/y_inter.c | 26 ++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 41d41405c..c672cbee4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1198,9 +1198,11 @@ static void readlevelheader(MYFILE *f, INT32 num) else if (fastcmp(word2, "ERZ3")) i = 2; else if (fastcmp(word2, "NIGHTS")) i = 3; else if (fastcmp(word2, "NIGHTSLINK")) i = 4; - else if (fastcmp(word2, "NIGHTSALL")) i = 5; + else if (fastcmp(word2, "NIGHTSLAP")) i = 5; + else if (fastcmp(word2, "NIGHTSLINKLAP")) i = 6; + else if (fastcmp(word2, "NIGHTSALL")) i = 7; - if (i >= -1 && i <= 5) // -1 for no bonus. Max is 2. + if (i >= -1 && i <= 7) // -1 for no bonus. Max is 2. mapheaderinfo[num-1]->bonustype = (SINT8)i; else deh_warning("Level header %d: invalid bonus type number %d", num, i); diff --git a/src/y_inter.c b/src/y_inter.c index de0335523..f34bc06c0 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1764,6 +1764,16 @@ static void Y_SetNightsBonus(player_t *player, y_bonus_t *bstruct) bstruct->points = player->totalmarescore; } +// +// Y_SetLapBonus +// +static void Y_SetLapBonus(player_t *player, y_bonus_t *bstruct) +{ + strncpy(bstruct->patch, "YB_LAP", sizeof(bstruct->patch)); + bstruct->display = true; + bstruct->points = max(0, (player->totalmarebonuslap) * 100); +} + // // Y_SetLinkBonus // @@ -1825,7 +1835,7 @@ static void Y_SetPerfectBonus(player_t *player, y_bonus_t *bstruct) // This list can be extended in the future with SOC/Lua, perhaps. typedef void (*bonus_f)(player_t *, y_bonus_t *); -bonus_f bonuses_list[7][4] = { +bonus_f bonuses_list[9][4] = { { Y_SetNullBonus, Y_SetNullBonus, @@ -1862,11 +1872,23 @@ bonus_f bonuses_list[7][4] = { Y_SetLinkBonus, Y_SetNullBonus, }, + { + Y_SetNullBonus, + Y_SetNullBonus, + Y_SetLapBonus, + Y_SetNullBonus, + }, + { + Y_SetNullBonus, + Y_SetLinkBonus, + Y_SetLapBonus, + Y_SetNullBonus, + }, { Y_SetNullBonus, Y_SetNightsBonus, Y_SetLinkBonus, - Y_SetNullBonus, + Y_SetLapBonus, }, }; From b9b2f7cfa7f798727a8d16d3107eede6ebf01be5 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 20:08:17 -0400 Subject: [PATCH 21/78] Make lap bonus more valuable --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index f34bc06c0..9c0cc758d 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1771,7 +1771,7 @@ static void Y_SetLapBonus(player_t *player, y_bonus_t *bstruct) { strncpy(bstruct->patch, "YB_LAP", sizeof(bstruct->patch)); bstruct->display = true; - bstruct->points = max(0, (player->totalmarebonuslap) * 100); + bstruct->points = max(0, player->totalmarebonuslap * 1000); } // From 8ec0865170353bdf2f0cbd0b51c0b3077a2ee9dd Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 20:25:35 -0400 Subject: [PATCH 22/78] Have just one NiGHTS bonus option: NIGHTS and LINK together --- src/dehacked.c | 4 +--- src/y_inter.c | 14 +------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 41d41405c..70a19eadc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1197,10 +1197,8 @@ static void readlevelheader(MYFILE *f, INT32 num) else if (fastcmp(word2, "BOSS")) i = 1; else if (fastcmp(word2, "ERZ3")) i = 2; else if (fastcmp(word2, "NIGHTS")) i = 3; - else if (fastcmp(word2, "NIGHTSLINK")) i = 4; - else if (fastcmp(word2, "NIGHTSALL")) i = 5; - if (i >= -1 && i <= 5) // -1 for no bonus. Max is 2. + if (i >= -1 && i <= 3) // -1 for no bonus. Max is 3. mapheaderinfo[num-1]->bonustype = (SINT8)i; else deh_warning("Level header %d: invalid bonus type number %d", num, i); diff --git a/src/y_inter.c b/src/y_inter.c index de0335523..2cafed8ca 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1825,7 +1825,7 @@ static void Y_SetPerfectBonus(player_t *player, y_bonus_t *bstruct) // This list can be extended in the future with SOC/Lua, perhaps. typedef void (*bonus_f)(player_t *, y_bonus_t *); -bonus_f bonuses_list[7][4] = { +bonus_f bonuses_list[5][4] = { { Y_SetNullBonus, Y_SetNullBonus, @@ -1850,18 +1850,6 @@ bonus_f bonuses_list[7][4] = { Y_SetRingBonus, Y_SetPerfectBonus, }, - { - Y_SetNullBonus, - Y_SetNullBonus, - Y_SetNightsBonus, - Y_SetNullBonus, - }, - { - Y_SetNullBonus, - Y_SetNullBonus, - Y_SetLinkBonus, - Y_SetNullBonus, - }, { Y_SetNullBonus, Y_SetNightsBonus, From 83d3099fe3313c378b2732a7142664e01f2232bb Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 12 Aug 2018 20:36:53 -0400 Subject: [PATCH 23/78] Change special stage bonus to NiGHTS in-level score, per MB --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index 2cafed8ca..915d6b810 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1930,7 +1930,7 @@ static void Y_AwardSpecialStageBonus(void) if (!playeringame[i] || players[i].lives < 1) // not active or game over Y_SetNullBonus(&players[i], &localbonus); else if (maptol & TOL_NIGHTS) // Link instead of Rings - Y_SetLinkBonus(&players[i], &localbonus); + Y_SetNightsBonus(&players[i], &localbonus); else Y_SetRingBonus(&players[i], &localbonus); players[i].score += localbonus.points; From 2a2569155a5b4d1cf4db352881acdb51bc6dde9a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 13 Aug 2018 11:12:53 -0400 Subject: [PATCH 24/78] Deduct marescore when player hits ground * ~~For speedrunning~~: Land on the Drone, keep your points! --- src/p_inter.c | 10 ++++------ src/p_user.c | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index ce8bba6b6..120f17569 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3311,12 +3311,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } else if (player->powers[pw_carry] == CR_NIGHTSFALL) { - if (player->spheres > 0) - { - damage = player->spheres; - P_RingDamage(player, inflictor, source, damage, damagetype, true); - damage = 0; - } + // always damage so we can recoil upon losing points + damage = player->spheres; + P_RingDamage(player, inflictor, source, damage, damagetype, true); + damage = 0; } else if (player->rings > 0) // No shield but have rings. { diff --git a/src/p_user.c b/src/p_user.c index fd09b0847..140c60acd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -590,10 +590,6 @@ static void P_DeNightserizePlayer(player_t *player) else if (player == &players[secondarydisplayplayer]) localaiming2 = 0; - // If you screwed up, kiss your score and ring bonus goodbye. - player->marescore = 0; - player->rings = 0; - P_SetPlayerMobjState(player->mo, S_PLAY_FALL); // If in a special stage, add some preliminary exit time. @@ -605,6 +601,11 @@ static void P_DeNightserizePlayer(player_t *player) players[i].nightstime = 1; // force everyone else to fall too. player->exiting = 3*TICRATE; stagefailed = true; // NIGHT OVER + + // If you screwed up, kiss your score and ring bonus goodbye. + // But don't do this yet if not in special stage! Wait til we hit the ground. + player->marescore = 0; + player->rings = 0; } // Check to see if the player should be killed. @@ -7030,8 +7031,14 @@ static void P_MovePlayer(player_t *player) if (playeringame[i]) players[i].exiting = (14*TICRATE)/5 + 1; } - else if (player->spheres > 0) + else { + // Damage whether or not we have spheres, as player should recoil upon losing points P_DamageMobj(player->mo, NULL, NULL, 1, 0); + + // Now deduct our mare score! + player->marescore = 0; + player->rings = 0; + } player->powers[pw_carry] = CR_NONE; } } From b658598a96d479277eb017f8d1bb83adaeedbdc2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 13 Aug 2018 22:10:16 -0400 Subject: [PATCH 25/78] Whitespace --- src/p_spec.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index ea09bfe04..06bc55c50 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -105,10 +105,10 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFading(line_t *line, fade_t *data); #define P_RemoveFading(l) P_ResetFading(l, NULL); -static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, +static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, boolean dofadeinonly, INT32 line); -static void P_AddMasterFader(INT16 destvalue, INT16 speed, +static void P_AddMasterFader(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, boolean dofadeinonly, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); @@ -3109,8 +3109,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) { if (sides[line->sidenum[0]].rowoffset>>FRACBITS > 0) - P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, - sides[line->sidenum[0]].rowoffset>>FRACBITS, + P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, + sides[line->sidenum[0]].rowoffset>>FRACBITS, (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT (line->flags & ML_BOUNCY), // handle FF_SOLID @@ -3120,8 +3120,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) else { P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); - P_FindFakeFloorsDoAlpha(sides[line->sidenum[0]].textureoffset>>FRACBITS, - 0, // set alpha immediately + P_FindFakeFloorsDoAlpha(sides[line->sidenum[0]].textureoffset>>FRACBITS, + 0, // set alpha immediately (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT (line->flags & ML_BOUNCY), // handle FF_SOLID @@ -3132,7 +3132,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } break; } - + case 453: // Stop fading FOF { INT32 s, j; @@ -7145,7 +7145,7 @@ void T_Disappear(disappear_t *d) } /** Removes fadingdata from FOF control sector - * + * * \param line line to search for target faders * \param data pointer to set new fadingdata to. Can be NULL to erase. */ @@ -7161,7 +7161,7 @@ static void P_ResetFading(line_t *line, fade_t *data) { if (rover->master != line) continue; - + if(((fade_t *)rover->master->frontsector->fadingdata) != data) { if(&((fade_t *)rover->master->frontsector->fadingdata)->thinker) @@ -7253,7 +7253,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, if (speed < 1 || rover->alpha + speed >= destvalue - speed) { rover->alpha = destvalue; - + if (doexists) { if (rover->alpha <= 1) @@ -7289,7 +7289,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, else // continue fading in { rover->alpha += speed; - + if (doexists) rover->flags |= FF_EXISTS; @@ -7316,7 +7316,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, return result; } -static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, +static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, boolean dofadeinonly, INT32 line) { @@ -7349,7 +7349,7 @@ static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, * \param dofadeinonly enable flags when fade-in is finished; never on fade-out * \param line line to target FOF */ -static void P_AddMasterFader(INT16 destvalue, INT16 speed, +static void P_AddMasterFader(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, boolean dofadeinonly, INT32 line) { @@ -7378,7 +7378,7 @@ static void P_AddMasterFader(INT16 destvalue, INT16 speed, */ void T_Fade(fade_t *d) { - INT32 affectedffloors = P_FindFakeFloorsDoAlpha(d->destvalue, d->speed, + INT32 affectedffloors = P_FindFakeFloorsDoAlpha(d->destvalue, d->speed, d->doexists, d->dotranslucent, d->dosolid, d->dospawnflags, d->dofadeinonly, d->affectee); From 4f5ca26ce5f918fdb1abde04b5087e5814951000 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 13 Aug 2018 22:17:58 -0400 Subject: [PATCH 26/78] Attach fade_t thinker to proper control sector upon savegame load --- src/p_saveg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 50d636280..a1ce9c4b5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2577,9 +2577,9 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->dospawnflags = READUINT8(save_p); ht->dofadeinonly = READUINT8(save_p); - sector_t *ffloorsector = LoadSector(ht->affectee); - if (ffloorsector) - ffloorsector->fadingdata = ht; + line_t *ffloorline = LoadLine(ht->affectee); + if (ffloorline && ffloorline->frontsector) + ffloorline->frontsector->fadingdata = ht; P_AddThinker(&ht->thinker); } From a2883009ed66c7c950eed4dacb730306d25c5b4c Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 14 Aug 2018 10:20:56 -0400 Subject: [PATCH 27/78] Preproc comment out Y_SetLinkBonus because unused --- src/y_inter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/y_inter.c b/src/y_inter.c index d2fa2e668..3fdf5f7a9 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1774,6 +1774,7 @@ static void Y_SetLapBonus(player_t *player, y_bonus_t *bstruct) bstruct->points = max(0, player->totalmarebonuslap * 1000); } +#if 0 // // Y_SetLinkBonus // @@ -1783,6 +1784,7 @@ static void Y_SetLinkBonus(player_t *player, y_bonus_t *bstruct) bstruct->display = true; bstruct->points = max(0, (player->maxlink - 1) * 100); } +#endif // // Y_SetGuardBonus From 9f9bf86d2b8903e5abd463da18ebc2f5ab396bbf Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 14 Aug 2018 10:18:08 -0400 Subject: [PATCH 28/78] Rename dofadeinonly to doghostfade * Ghost fading: when transitioning to/from alpha=0, don't set solid/tangibility until fade is finished --- src/p_saveg.c | 4 ++-- src/p_spec.c | 18 +++++++++--------- src/p_spec.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index a1ce9c4b5..70c6b411e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1573,7 +1573,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dosolid); WRITEUINT8(save_p, ht->dospawnflags); - WRITEUINT8(save_p, ht->dofadeinonly); + WRITEUINT8(save_p, ht->doghostfade); } // @@ -2575,7 +2575,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->dotranslucent = READUINT8(save_p); ht->dosolid = READUINT8(save_p); ht->dospawnflags = READUINT8(save_p); - ht->dofadeinonly = READUINT8(save_p); + ht->doghostfade = READUINT8(save_p); line_t *ffloorline = LoadLine(ht->affectee); if (ffloorline && ffloorline->frontsector) diff --git a/src/p_spec.c b/src/p_spec.c index 06bc55c50..0fa16f9f4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -107,10 +107,10 @@ static void P_ResetFading(line_t *line, fade_t *data); #define P_RemoveFading(l) P_ResetFading(l, NULL); static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean dofadeinonly, INT32 line); + boolean doghostfade, INT32 line); static void P_AddMasterFader(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean dofadeinonly, INT32 line); + boolean doghostfade, INT32 line); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -7175,7 +7175,7 @@ static void P_ResetFading(line_t *line, fade_t *data) static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean dofadeinonly) + boolean doghostfade) { boolean result = false; @@ -7318,7 +7318,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean dofadeinonly, INT32 line) + boolean doghostfade, INT32 line) { ffloor_t *rover; register INT32 s; @@ -7331,7 +7331,7 @@ static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, if (rover->master != &lines[line]) continue; - affectedffloors += (INT32)P_DoFakeFloorAlpha(rover, destvalue, speed, doexists, dotranslucent, dosolid, dospawnflags, dofadeinonly); + affectedffloors += (INT32)P_DoFakeFloorAlpha(rover, destvalue, speed, doexists, dotranslucent, dosolid, dospawnflags, doghostfade); } } @@ -7346,12 +7346,12 @@ static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, * \param dotranslucent handle FF_TRANSLUCENT * \param dosolid handle FF_SOLID * \param dospawnflags handle spawnflags - * \param dofadeinonly enable flags when fade-in is finished; never on fade-out + * \param doghostfade enable flags when fade-in is finished; never on fade-out * \param line line to target FOF */ static void P_AddMasterFader(INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean dofadeinonly, INT32 line) + boolean doghostfade, INT32 line) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7363,7 +7363,7 @@ static void P_AddMasterFader(INT16 destvalue, INT16 speed, d->dotranslucent = dotranslucent; d->dosolid = dosolid; d->dospawnflags = dospawnflags; - d->dofadeinonly = dofadeinonly; + d->doghostfade = doghostfade; // find any existing thinkers and remove them, then replace with new data P_ResetFading(&lines[d->affectee], d); @@ -7380,7 +7380,7 @@ void T_Fade(fade_t *d) { INT32 affectedffloors = P_FindFakeFloorsDoAlpha(d->destvalue, d->speed, d->doexists, d->dotranslucent, d->dosolid, d->dospawnflags, - d->dofadeinonly, d->affectee); + d->doghostfade, d->affectee); // no more ffloors to fade? remove myself if (affectedffloors == 0) diff --git a/src/p_spec.h b/src/p_spec.h index c8607f868..672b96f30 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -460,7 +460,7 @@ typedef struct boolean dotranslucent; ///< Handle FF_TRANSLUCENT handling boolean dosolid; ///< Handle FF_SOLID handling boolean dospawnflags; ///< Enable spawnflags handling - boolean dofadeinonly; ///< Set flags only when fade-in is finished; never during fade-out + boolean doghostfade; ///< Set flags only when fade-in is finished; never during fade-out } fade_t; void T_Fade(fade_t *d); From c56dc6d0c7d925edeca13b99f6157f6c373a5a0d Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 00:32:20 -0400 Subject: [PATCH 29/78] Checkpoint: Move fadingdata to line_t (or ffloor_t?) --- src/p_saveg.c | 4 +- src/p_spec.c | 110 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 80 insertions(+), 34 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 70c6b411e..eeb05d328 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2578,8 +2578,8 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->doghostfade = READUINT8(save_p); line_t *ffloorline = LoadLine(ht->affectee); - if (ffloorline && ffloorline->frontsector) - ffloorline->frontsector->fadingdata = ht; + if (ffloorline) + ffloorline->fadingdata = ht; P_AddThinker(&ht->thinker); } diff --git a/src/p_spec.c b/src/p_spec.c index 0fa16f9f4..89caf41f3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3103,43 +3103,89 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 452: // Fade FOF { - INT32 s, j; - for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - { - if (sides[line->sidenum[0]].rowoffset>>FRACBITS > 0) - P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, - sides[line->sidenum[0]].rowoffset>>FRACBITS, - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(sectors[s].lines[j]-lines)); - else - { - P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); - P_FindFakeFloorsDoAlpha(sides[line->sidenum[0]].textureoffset>>FRACBITS, - 0, // set alpha immediately - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(sectors[s].lines[j]-lines)); - } - } + INT16 destvalue = (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS); + INT16 speed = (INT16)(sides[line->sidenum[1]].rowoffset>>FRACBITS); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to crumble + + for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (rover->master->frontsector->tag == foftag) + break; + } + + if (!rover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + + if (speed > 0) + P_AddMasterFader(destvalue, speed, + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only + (INT32)(rover->master-lines)); + else + { + P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); + P_FindFakeFloorsDoAlpha(destvalue, 0, // set alpha immediately + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only + (INT32)(sectors[s].lines[j]-lines)); + } + } break; } case 453: // Stop fading FOF { - INT32 s, j; - for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to crumble + + for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (rover->master->frontsector->tag == foftag) + break; + } + + if (!rover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + + P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); + } break; } From 52f7b009f01b4cfecd17df90e1f56e389f4d89c2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 00:32:20 -0400 Subject: [PATCH 30/78] Move fadingdata (fade_t thinker) to line_t --- src/p_saveg.c | 12 +++-- src/p_setup.c | 3 +- src/p_spec.c | 132 ++++++++++++++++++++++++++++++++------------------ src/r_defs.h | 3 +- 4 files changed, 97 insertions(+), 53 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 70c6b411e..f30c52bda 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2578,8 +2578,8 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->doghostfade = READUINT8(save_p); line_t *ffloorline = LoadLine(ht->affectee); - if (ffloorline && ffloorline->frontsector) - ffloorline->frontsector->fadingdata = ht; + if (ffloorline) + ffloorline->fadingdata = ht; P_AddThinker(&ht->thinker); } @@ -2770,7 +2770,13 @@ static void P_NetUnArchiveThinkers(void) // clear sector thinker pointers so they don't point to non-existant thinkers for all of eternity for (i = 0; i < numsectors; i++) { - sectors[i].floordata = sectors[i].ceilingdata = sectors[i].lightingdata = sectors[i].fadingdata = NULL; + sectors[i].floordata = sectors[i].ceilingdata = sectors[i].lightingdata = NULL; + } + + // same for line thinker pointers + for (i = 0; i < numlines; i++) + { + lines[i].fadingdata = NULL; } // read in saved thinkers diff --git a/src/p_setup.c b/src/p_setup.c index 67dbb8db7..5259394ee 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -693,7 +693,6 @@ static void P_LoadRawSectors(UINT8 *data, size_t i) ss->floordata = NULL; ss->ceilingdata = NULL; ss->lightingdata = NULL; - ss->fadingdata = NULL; ss->linecount = 0; ss->lines = NULL; @@ -1311,6 +1310,8 @@ static void P_LoadRawLineDefs(UINT8 *data, size_t i) #ifdef POLYOBJECTS ld->polyobj = NULL; #endif + + ld->fadingdata = NULL; } } diff --git a/src/p_spec.c b/src/p_spec.c index 0fa16f9f4..6f392bbfe 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3103,43 +3103,91 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 452: // Fade FOF { - INT32 s, j; - for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - { - if (sides[line->sidenum[0]].rowoffset>>FRACBITS > 0) - P_AddMasterFader(sides[line->sidenum[0]].textureoffset>>FRACBITS, - sides[line->sidenum[0]].rowoffset>>FRACBITS, - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(sectors[s].lines[j]-lines)); - else - { - P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); - P_FindFakeFloorsDoAlpha(sides[line->sidenum[0]].textureoffset>>FRACBITS, - 0, // set alpha immediately - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(sectors[s].lines[j]-lines)); - } - } + INT16 destvalue = (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS); + INT16 speed = (INT16)(sides[line->sidenum[1]].rowoffset>>FRACBITS); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to crumble + + for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (rover->master->frontsector->tag == foftag) + break; + } + + if (!rover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + + if (speed > 0) + P_AddMasterFader(destvalue, speed, + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only + (INT32)(rover->master-lines)); + else + { + P_RemoveFading(&lines[(INT32)(rover->master-lines)]); + P_FindFakeFloorsDoAlpha(destvalue, 0, // set alpha immediately + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2), // enable flags on fade-in finish only + (INT32)(rover->master-lines)); + } + break; + } break; } case 453: // Stop fading FOF { - INT32 s, j; - for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - P_RemoveFading(&lines[(INT32)(sectors[s].lines[j]-lines)]); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to crumble + + for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (rover->master->frontsector->tag == foftag) + break; + } + + if (!rover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + + P_RemoveFading(&lines[(INT32)(rover->master-lines)]); + break; + } break; } @@ -7151,25 +7199,13 @@ void T_Disappear(disappear_t *d) */ static void P_ResetFading(line_t *line, fade_t *data) { - ffloor_t *rover; - register INT32 s; - // find any existing thinkers and remove them, then replace with new data - for (s = -1; (s = P_FindSectorFromLineTag(line, s)) >= 0 ;) + if(((fade_t *)line->fadingdata) != data) { - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != line) - continue; + if(&((fade_t *)line->fadingdata)->thinker) + P_RemoveThinker(&((fade_t *)line->fadingdata)->thinker); - if(((fade_t *)rover->master->frontsector->fadingdata) != data) - { - if(&((fade_t *)rover->master->frontsector->fadingdata)->thinker) - P_RemoveThinker(&((fade_t *)rover->master->frontsector->fadingdata)->thinker); - - rover->master->frontsector->fadingdata = data; - } - } + line->fadingdata = data; } } diff --git a/src/r_defs.h b/src/r_defs.h index b4c7d2112..c425f3a3b 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -308,7 +308,6 @@ typedef struct sector_s void *floordata; // floor move thinker void *ceilingdata; // ceiling move thinker void *lightingdata; // lighting change thinker - void *fadingdata; // fading FOF thinker // floor and ceiling texture offsets fixed_t floor_xoffs, floor_yoffs; @@ -444,6 +443,8 @@ typedef struct line_s char *text; // a concatination of all front and back texture names, for linedef specials that require a string. INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0 + + void *fadingdata; // fading FOF thinker } line_t; // From 1f51c8e076ebee2d8a4d133607aff8e77d4defc9 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 02:28:52 -0400 Subject: [PATCH 31/78] Move fading thinker to ffloor_t.fadingdata --- src/p_saveg.c | 31 ++++++++++------ src/p_setup.c | 2 - src/p_spec.c | 101 +++++++++++++++++++------------------------------- src/p_spec.h | 6 ++- src/r_defs.h | 4 +- 5 files changed, 65 insertions(+), 79 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index f30c52bda..daa6bb937 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1566,7 +1566,8 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->affectee); + WRITEINT32(save_p, ht->sectornum); + WRITEINT32(save_p, ht->ffloornum); WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, ht->doexists); @@ -2568,7 +2569,8 @@ static inline void LoadFadeThinker(actionf_p1 thinker) { fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->affectee = READINT32(save_p); + ht->sectornum = READINT32(save_p); + ht->ffloornum = READINT32(save_p); ht->destvalue = READINT16(save_p); ht->speed = READINT16(save_p); ht->doexists = READUINT8(save_p); @@ -2577,9 +2579,22 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->dospawnflags = READUINT8(save_p); ht->doghostfade = READUINT8(save_p); - line_t *ffloorline = LoadLine(ht->affectee); - if (ffloorline) - ffloorline->fadingdata = ht; + sector_t *ss = LoadSector(ht->sectornum); + if (ss) + { + size_t j = 0; // ss->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc + ffloor_t *rover; + for (rover = ss->ffloors; rover; rover = rover->next) + { + if (j == ht->ffloornum) + { + ht->rover = rover; + rover->fadingdata = ht; + break; + } + j++; + } + } P_AddThinker(&ht->thinker); } @@ -2773,12 +2788,6 @@ static void P_NetUnArchiveThinkers(void) sectors[i].floordata = sectors[i].ceilingdata = sectors[i].lightingdata = NULL; } - // same for line thinker pointers - for (i = 0; i < numlines; i++) - { - lines[i].fadingdata = NULL; - } - // read in saved thinkers for (;;) { diff --git a/src/p_setup.c b/src/p_setup.c index 5259394ee..c62f281b3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1310,8 +1310,6 @@ static void P_LoadRawLineDefs(UINT8 *data, size_t i) #ifdef POLYOBJECTS ld->polyobj = NULL; #endif - - ld->fadingdata = NULL; } } diff --git a/src/p_spec.c b/src/p_spec.c index 6f392bbfe..20f034ac8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -103,14 +103,15 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_ResetFading(line_t *line, fade_t *data); +static void P_ResetFading(ffloor_t *rover, fade_t *data); #define P_RemoveFading(l) P_ResetFading(l, NULL); -static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, +static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade, INT32 line); -static void P_AddMasterFader(INT16 destvalue, INT16 speed, + boolean doghostfade); +static void P_AddMasterFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, + INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade, INT32 line); + boolean doghostfade); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3109,6 +3110,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible in ffloor_t *rover; // FOF that we are going to crumble + size_t j = 0; // sec->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) { @@ -3124,6 +3126,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { if (rover->master->frontsector->tag == foftag) break; + j++; } if (!rover) @@ -3133,25 +3136,24 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } if (speed > 0) - P_AddMasterFader(destvalue, speed, - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(rover->master-lines)); + P_AddMasterFader(rover, secnum, j, + destvalue, speed, + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2)); // enable flags on fade-in finish only else { - P_RemoveFading(&lines[(INT32)(rover->master-lines)]); - P_FindFakeFloorsDoAlpha(destvalue, 0, // set alpha immediately - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2), // enable flags on fade-in finish only - (INT32)(rover->master-lines)); + P_RemoveFading(rover); + P_DoFakeFloorAlpha(rover, + destvalue, 0, // set alpha immediately + (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + (line->flags & ML_BOUNCY), // handle FF_SOLID + (line->flags & ML_EFFECT1), // handle spawnflags + (line->flags & ML_EFFECT2)); // enable flags on fade-in finish only } - break; } break; } @@ -3185,8 +3187,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) return; } - P_RemoveFading(&lines[(INT32)(rover->master-lines)]); - break; + P_RemoveFading(rover); } break; } @@ -5036,7 +5037,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f ffloor->spawnflags = ffloor->flags = flags; ffloor->master = master; ffloor->norender = INFTICS; - + ffloor->fadingdata = NULL; // Scan the thinkers to check for special conditions applying to this FOF. // If we have thinkers sorted by sector, just check the relevant ones; @@ -7197,15 +7198,15 @@ void T_Disappear(disappear_t *d) * \param line line to search for target faders * \param data pointer to set new fadingdata to. Can be NULL to erase. */ -static void P_ResetFading(line_t *line, fade_t *data) +static void P_ResetFading(ffloor_t *rover, fade_t *data) { // find any existing thinkers and remove them, then replace with new data - if(((fade_t *)line->fadingdata) != data) + if(((fade_t *)rover->fadingdata) != data) { - if(&((fade_t *)line->fadingdata)->thinker) - P_RemoveThinker(&((fade_t *)line->fadingdata)->thinker); + if(&((fade_t *)rover->fadingdata)->thinker) + P_RemoveThinker(&((fade_t *)rover->fadingdata)->thinker); - line->fadingdata = data; + rover->fadingdata = data; } } @@ -7352,28 +7353,6 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, return result; } -static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade, INT32 line) -{ - ffloor_t *rover; - register INT32 s; - INT32 affectedffloors = 0; - - for (s = -1; (s = P_FindSectorFromLineTag(&lines[line], s)) >= 0 ;) - { - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != &lines[line]) - continue; - - affectedffloors += (INT32)P_DoFakeFloorAlpha(rover, destvalue, speed, doexists, dotranslucent, dosolid, dospawnflags, doghostfade); - } - } - - return affectedffloors; -} - /** Adds master fader thinker. * * \param destvalue transparency value to fade to @@ -7385,14 +7364,17 @@ static INT32 P_FindFakeFloorsDoAlpha(INT16 destvalue, INT16 speed, * \param doghostfade enable flags when fade-in is finished; never on fade-out * \param line line to target FOF */ -static void P_AddMasterFader(INT16 destvalue, INT16 speed, +static void P_AddMasterFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, + INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade, INT32 line) + boolean doghostfade) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); d->thinker.function.acp1 = (actionf_p1)T_Fade; - d->affectee = line; + d->rover = rover; + d->sectornum = (INT32)sectornum; + d->ffloornum = (INT32)ffloornum; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->doexists = doexists; @@ -7402,7 +7384,7 @@ static void P_AddMasterFader(INT16 destvalue, INT16 speed, d->doghostfade = doghostfade; // find any existing thinkers and remove them, then replace with new data - P_ResetFading(&lines[d->affectee], d); + P_ResetFading(rover, d); P_AddThinker(&d->thinker); } @@ -7414,13 +7396,8 @@ static void P_AddMasterFader(INT16 destvalue, INT16 speed, */ void T_Fade(fade_t *d) { - INT32 affectedffloors = P_FindFakeFloorsDoAlpha(d->destvalue, d->speed, - d->doexists, d->dotranslucent, d->dosolid, d->dospawnflags, - d->doghostfade, d->affectee); - - // no more ffloors to fade? remove myself - if (affectedffloors == 0) - P_RemoveFading(&lines[d->affectee]); + if (d->rover && !P_DoFakeFloorAlpha(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->dosolid, d->dospawnflags, d->doghostfade)) + P_RemoveFading(d->rover); } /* diff --git a/src/p_spec.h b/src/p_spec.h index 672b96f30..fcced9cea 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -453,14 +453,16 @@ void T_Disappear(disappear_t *d); typedef struct { thinker_t thinker; ///< Thinker structure for effect. - INT32 affectee; ///< Number of affected line + ffloor_t *rover; ///< Target ffloor + INT32 sectornum; ///< Number of ffloor target sector + INT32 ffloornum; ///< Number of ffloor of target sector INT16 destvalue; ///< Transparency value to fade to INT16 speed; ///< Speed to fade by boolean doexists; ///< Handle FF_EXISTS handling boolean dotranslucent; ///< Handle FF_TRANSLUCENT handling boolean dosolid; ///< Handle FF_SOLID handling boolean dospawnflags; ///< Enable spawnflags handling - boolean doghostfade; ///< Set flags only when fade-in is finished; never during fade-out + boolean doghostfade; ///< Set flags only when fade-in is finished; never during fade-out } fade_t; void T_Fade(fade_t *d); diff --git a/src/r_defs.h b/src/r_defs.h index c425f3a3b..ea5db3947 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -177,6 +177,8 @@ typedef struct ffloor_s // these are saved for netgames, so do not let Lua touch these! ffloortype_e spawnflags; // flags the 3D floor spawned with INT32 spawnalpha; // alpha the 3D floor spawned with + + void *fadingdata; // fading FOF thinker } ffloor_t; @@ -443,8 +445,6 @@ typedef struct line_s char *text; // a concatination of all front and back texture names, for linedef specials that require a string. INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0 - - void *fadingdata; // fading FOF thinker } line_t; // From 9b88c25fdae9f3365a9578c4b2a8a766b51cac7a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 14:49:33 -0400 Subject: [PATCH 32/78] Revised and re-organized P_DoFakeFloorAlpha fading procedure * dosolid routine now refers to spawnflags --- src/p_spec.c | 203 +++++++++++++++++++++++++-------------------------- 1 file changed, 98 insertions(+), 105 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 20f034ac8..9fe25bcba 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7214,74 +7214,34 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, boolean doghostfade) { - boolean result = false; + boolean stillfading = false; + // routines specific to fade in and fade out if (rover->alpha == destvalue) - return result; - // fade out - else if (rover->alpha > destvalue) + return stillfading; + else if (rover->alpha > destvalue) // fade out { // finish fading out if (speed < 1 || rover->alpha - speed <= destvalue + speed) { rover->alpha = destvalue; - if (doexists) + if (dosolid) { - if (rover->alpha <= 1) - rover->flags &= ~FF_EXISTS; - else - rover->flags |= FF_EXISTS; - } - - if (dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags &= ~FF_SOLID; // make intangible at end of fade-out - - if (dotranslucent) - { - if (rover->alpha >= 256) - { - rover->flags |= FF_CUTLEVEL; - rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); - } - else - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - } - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; + if (rover->spawnflags & FF_SOLID) + rover->flags &= ~FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags &= ~FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags &= ~FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags &= ~FF_BUSTUP; } } else // continue fading out { rover->alpha -= speed; - - if (doexists) - rover->flags |= FF_EXISTS; - - if (dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags |= FF_SOLID; // keep solid during fade - - if (dotranslucent) - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; - } - - result = true; + stillfading = true; } } else // fade in @@ -7291,66 +7251,99 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, { rover->alpha = destvalue; - if (doexists) + if (dosolid) { - if (rover->alpha <= 1) - rover->flags &= ~FF_EXISTS; - else - rover->flags |= FF_EXISTS; - } - - if (dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags |= FF_SOLID; // make solid at end of fade-in - - if (dotranslucent) - { - if (rover->alpha >= 256) - { - rover->flags |= FF_CUTLEVEL; - rover->flags &= ~(FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA); - } - else - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - } - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; + if (rover->spawnflags & FF_SOLID) + rover->flags |= FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags |= FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags |= FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags |= FF_BUSTUP; } } else // continue fading in { rover->alpha += speed; - - if (doexists) - rover->flags |= FF_EXISTS; - - if (dosolid - && !(rover->flags & FF_SWIMMABLE) - && !(rover->flags & FF_QUICKSAND)) - rover->flags |= FF_SOLID; // keep solid during fade - - if (dotranslucent) - { - rover->flags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - rover->flags &= ~FF_CUTLEVEL; - - if (rover->flags & FF_SOLID) - rover->flags &= ~FF_CUTSPRITES; - else - rover->flags |= FF_CUTSPRITES; - } - - result = true; + stillfading = true; } } - return result; + // routines common to both fade in and fade out + if (!stillfading) + { + if (doexists) + { + if (rover->alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + } + + if (dotranslucent) + { + if (rover->alpha >= 256) + { + //rover->flags |= FF_CUTLEVEL; + rover->flags &= ~FF_TRANSLUCENT; + } + else + { + rover->flags |= FF_TRANSLUCENT; + //rover->flags &= ~FF_CUTLEVEL; + } + + // if (rover->flags & FF_SOLID) + // rover->flags &= ~FF_CUTSPRITES; + // else + // rover->flags |= FF_CUTSPRITES; + } + } + else + { + if (doexists) + rover->flags |= FF_EXISTS; + + if (dotranslucent) + { + rover->flags |= FF_TRANSLUCENT; + //rover->flags &= ~FF_CUTLEVEL; + + // if (rover->flags & FF_SOLID) + // rover->flags &= ~FF_CUTSPRITES; + // else + // rover->flags |= FF_CUTSPRITES; + } + + if (dosolid) + { + if (doghostfade) // remove interaction flags during fade + { + if (rover->spawnflags & FF_SOLID) + rover->flags &= ~FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags &= ~FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags &= ~FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags &= ~FF_BUSTUP; + } + else // keep interaction during fade + { + if (rover->spawnflags & FF_SOLID) + rover->flags |= FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags |= FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags |= FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags |= FF_BUSTUP; + } + } + } + + return stillfading; } /** Adds master fader thinker. From 5a3499f833d299f6c2472b6509305dfdacc35f87 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 15:13:05 -0400 Subject: [PATCH 33/78] Refactor function and variable names; change defaults for fake floor fader line flags --- src/p_saveg.c | 8 ++--- src/p_spec.c | 87 ++++++++++++++++++++++++--------------------------- src/p_spec.h | 10 +++--- 3 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index daa6bb937..c2158aa0d 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1572,9 +1572,9 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); - WRITEUINT8(save_p, ht->dosolid); - WRITEUINT8(save_p, ht->dospawnflags); + WRITEUINT8(save_p, ht->docollision); WRITEUINT8(save_p, ht->doghostfade); + WRITEUINT8(save_p, ht->exactalpha); } // @@ -2575,9 +2575,9 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->speed = READINT16(save_p); ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); - ht->dosolid = READUINT8(save_p); - ht->dospawnflags = READUINT8(save_p); + ht->docollision = READUINT8(save_p); ht->doghostfade = READUINT8(save_p); + ht->exactalpha = READUINT8(save_p); sector_t *ss = LoadSector(ht->sectornum); if (ss) diff --git a/src/p_spec.c b/src/p_spec.c index 9fe25bcba..4694eb015 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -103,15 +103,13 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_ResetFading(ffloor_t *rover, fade_t *data); -#define P_RemoveFading(l) P_ResetFading(l, NULL); -static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade); -static void P_AddMasterFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, +static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data); +#define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL); +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha); +static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade); + boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3136,23 +3134,23 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } if (speed > 0) - P_AddMasterFader(rover, secnum, j, + P_AddFakeFloorFader(rover, secnum, j, destvalue, speed, - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2)); // enable flags on fade-in finish only + !(line->flags & ML_BOUNCY), // do not handle interactive flags + (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) + (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) else { - P_RemoveFading(rover); - P_DoFakeFloorAlpha(rover, - destvalue, 0, // set alpha immediately - (line->flags & ML_BLOCKMONSTERS), // handle FF_EXISTS + P_RemoveFakeFloorFader(rover); + P_FadeFakeFloor(rover, + destvalue, 0, // set alpha immediately + !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - (line->flags & ML_BOUNCY), // handle FF_SOLID - (line->flags & ML_EFFECT1), // handle spawnflags - (line->flags & ML_EFFECT2)); // enable flags on fade-in finish only + !(line->flags & ML_BOUNCY), // do not handle interactive flags + (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) + (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) } } break; @@ -3187,7 +3185,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) return; } - P_RemoveFading(rover); + P_RemoveFakeFloorFader(rover); } break; } @@ -7198,7 +7196,7 @@ void T_Disappear(disappear_t *d) * \param line line to search for target faders * \param data pointer to set new fadingdata to. Can be NULL to erase. */ -static void P_ResetFading(ffloor_t *rover, fade_t *data) +static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data) { // find any existing thinkers and remove them, then replace with new data if(((fade_t *)rover->fadingdata) != data) @@ -7210,9 +7208,8 @@ static void P_ResetFading(ffloor_t *rover, fade_t *data) } } -static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade) +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, + boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha) { boolean stillfading = false; @@ -7226,7 +7223,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, { rover->alpha = destvalue; - if (dosolid) + if (docollision) { if (rover->spawnflags & FF_SOLID) rover->flags &= ~FF_SOLID; @@ -7251,7 +7248,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, { rover->alpha = destvalue; - if (dosolid) + if (docollision) { if (rover->spawnflags & FF_SOLID) rover->flags |= FF_SOLID; @@ -7316,7 +7313,7 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, // rover->flags |= FF_CUTSPRITES; } - if (dosolid) + if (docollision) { if (doghostfade) // remove interaction flags during fade { @@ -7346,21 +7343,19 @@ static boolean P_DoFakeFloorAlpha(ffloor_t *rover, INT16 destvalue, INT16 speed, return stillfading; } -/** Adds master fader thinker. +/** Adds fake floor fader thinker. * - * \param destvalue transparency value to fade to - * \param speed speed to fade by - * \param doexists handle FF_EXISTS - * \param dotranslucent handle FF_TRANSLUCENT - * \param dosolid handle FF_SOLID - * \param dospawnflags handle spawnflags - * \param doghostfade enable flags when fade-in is finished; never on fade-out - * \param line line to target FOF + * \param destvalue transparency value to fade to + * \param speed speed to fade by + * \param doexists handle FF_EXISTS + * \param dotranslucent handle FF_TRANSLUCENT + * \param docollision handle interactive flags + * \param doghostfade no interactive flags during fading + * \param exactalpha use exact alpha values (opengl) */ -static void P_AddMasterFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, +static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean dosolid, boolean dospawnflags, - boolean doghostfade) + boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7372,12 +7367,12 @@ static void P_AddMasterFader(ffloor_t *rover, size_t sectornum, size_t ffloornum d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->doexists = doexists; d->dotranslucent = dotranslucent; - d->dosolid = dosolid; - d->dospawnflags = dospawnflags; + d->docollision = docollision; d->doghostfade = doghostfade; + d->exactalpha = exactalpha; // find any existing thinkers and remove them, then replace with new data - P_ResetFading(rover, d); + P_ResetFakeFloorFader(rover, d); P_AddThinker(&d->thinker); } @@ -7385,12 +7380,12 @@ static void P_AddMasterFader(ffloor_t *rover, size_t sectornum, size_t ffloornum /** Makes a FOF fade * * \param d Fade thinker. - * \sa P_AddMasterFader + * \sa P_AddFakeFloorFader */ void T_Fade(fade_t *d) { - if (d->rover && !P_DoFakeFloorAlpha(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->dosolid, d->dospawnflags, d->doghostfade)) - P_RemoveFading(d->rover); + if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->docollision, d->doghostfade, d->exactalpha)) + P_RemoveFakeFloorFader(d->rover); } /* diff --git a/src/p_spec.h b/src/p_spec.h index fcced9cea..b4e9594d2 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -458,11 +458,11 @@ typedef struct INT32 ffloornum; ///< Number of ffloor of target sector INT16 destvalue; ///< Transparency value to fade to INT16 speed; ///< Speed to fade by - boolean doexists; ///< Handle FF_EXISTS handling - boolean dotranslucent; ///< Handle FF_TRANSLUCENT handling - boolean dosolid; ///< Handle FF_SOLID handling - boolean dospawnflags; ///< Enable spawnflags handling - boolean doghostfade; ///< Set flags only when fade-in is finished; never during fade-out + boolean doexists; ///< Handle FF_EXISTS + boolean dotranslucent; ///< Handle FF_TRANSLUCENT + boolean docollision; ///< Handle interactive flags + boolean doghostfade; ///< No interactive flags during fading + boolean exactalpha; ///< Use exact alpha values (opengl) } fade_t; void T_Fade(fade_t *d); From 81d7039f8ed1256ba24d9f17ba69802f439e9b8e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 15:59:34 -0400 Subject: [PATCH 34/78] Cleanup fade fake floor code --- src/p_spec.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 4694eb015..ec07003bd 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7282,19 +7282,14 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, { if (rover->alpha >= 256) { - //rover->flags |= FF_CUTLEVEL; + //rover->flags |= (FF_CUTLEVEL | FF_CUTEXTRA); rover->flags &= ~FF_TRANSLUCENT; } else { rover->flags |= FF_TRANSLUCENT; - //rover->flags &= ~FF_CUTLEVEL; + //rover->flags &= ~(FF_CUTLEVEL | FF_CUTEXTRA); } - - // if (rover->flags & FF_SOLID) - // rover->flags &= ~FF_CUTSPRITES; - // else - // rover->flags |= FF_CUTSPRITES; } } else @@ -7305,17 +7300,12 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, if (dotranslucent) { rover->flags |= FF_TRANSLUCENT; - //rover->flags &= ~FF_CUTLEVEL; - - // if (rover->flags & FF_SOLID) - // rover->flags &= ~FF_CUTSPRITES; - // else - // rover->flags |= FF_CUTSPRITES; + //rover->flags &= ~(FF_CUTLEVEL | FF_CUTEXTRA); } if (docollision) { - if (doghostfade) // remove interaction flags during fade + if (doghostfade) // remove collision flags during fade { if (rover->spawnflags & FF_SOLID) rover->flags &= ~FF_SOLID; @@ -7326,7 +7316,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, if (rover->spawnflags & FF_BUSTUP) rover->flags &= ~FF_BUSTUP; } - else // keep interaction during fade + else // keep collision during fade { if (rover->spawnflags & FF_SOLID) rover->flags |= FF_SOLID; From ccf5a0a8108a2100a7391d022a0b740873f5c02e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 17 Aug 2018 16:27:32 -0400 Subject: [PATCH 35/78] Add alpha clamping so OpenGL conforms to Software's translucent levels --- src/p_saveg.c | 2 ++ src/p_spec.c | 59 ++++++++++++++++++++++++++++++++++++++++++--------- src/p_spec.h | 1 + 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index c2158aa0d..c1af4167b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1568,6 +1568,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, type); WRITEINT32(save_p, ht->sectornum); WRITEINT32(save_p, ht->ffloornum); + WRITEINT32(save_p, ht->alpha); WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, ht->doexists); @@ -2571,6 +2572,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->thinker.function.acp1 = thinker; ht->sectornum = READINT32(save_p); ht->ffloornum = READINT32(save_p); + ht->alpha = READINT32(save_p); ht->destvalue = READINT16(save_p); ht->speed = READINT16(save_p); ht->doexists = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index ec07003bd..50cf049ff 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7212,16 +7212,23 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha) { boolean stillfading = false; + INT32 alpha; + fade_t *fadingdata = (fade_t *)rover->fadingdata; + + if (fadingdata) + alpha = fadingdata->alpha; + else + alpha = rover->alpha; // routines specific to fade in and fade out - if (rover->alpha == destvalue) + if (alpha == destvalue) return stillfading; - else if (rover->alpha > destvalue) // fade out + else if (alpha > destvalue) // fade out { // finish fading out - if (speed < 1 || rover->alpha - speed <= destvalue + speed) + if (speed < 1 || alpha - speed <= destvalue + speed) { - rover->alpha = destvalue; + alpha = destvalue; if (docollision) { @@ -7237,16 +7244,16 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } else // continue fading out { - rover->alpha -= speed; + alpha -= speed; stillfading = true; } } else // fade in { // finish fading in - if (speed < 1 || rover->alpha + speed >= destvalue - speed) + if (speed < 1 || alpha + speed >= destvalue - speed) { - rover->alpha = destvalue; + alpha = destvalue; if (docollision) { @@ -7262,7 +7269,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } else // continue fading in { - rover->alpha += speed; + alpha += speed; stillfading = true; } } @@ -7272,7 +7279,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, { if (doexists) { - if (rover->alpha <= 1) + if (alpha <= 1) rover->flags &= ~FF_EXISTS; else rover->flags |= FF_EXISTS; @@ -7280,7 +7287,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, if (dotranslucent) { - if (rover->alpha >= 256) + if (alpha >= 256) { //rover->flags |= (FF_CUTLEVEL | FF_CUTEXTRA); rover->flags &= ~FF_TRANSLUCENT; @@ -7330,6 +7337,37 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } } + if (!stillfading || exactalpha) + rover->alpha = alpha; + else // clamp fadingdata->alpha to software's alpha levels + { + if (alpha < 12) + rover->alpha = destvalue < 12 ? destvalue : 1; // Don't even draw it + else if (alpha < 38) + rover->alpha = destvalue >= 12 && destvalue < 38 ? destvalue : 25; + else if (alpha < 64) + rover->alpha = destvalue >=38 && destvalue < 64 ? destvalue : 51; + else if (alpha < 89) + rover->alpha = destvalue >= 64 && destvalue < 89 ? destvalue : 76; + else if (alpha < 115) + rover->alpha = destvalue >= 89 && destvalue < 115 ? destvalue : 102; + else if (alpha < 140) + rover->alpha = destvalue >= 115 && destvalue < 140 ? destvalue : 128; + else if (alpha < 166) + rover->alpha = destvalue >= 140 && destvalue < 166 ? destvalue : 154; + else if (alpha < 192) + rover->alpha = destvalue >= 166 && destvalue < 192 ? destvalue : 179; + else if (alpha < 217) + rover->alpha = destvalue >= 192 && destvalue < 217 ? destvalue : 204; + else if (alpha < 243) + rover->alpha = destvalue >= 217 && destvalue < 243 ? destvalue : 230; + else // Opaque + rover->alpha = destvalue >= 243 ? destvalue : 256; + } + + if (fadingdata) + fadingdata->alpha = alpha; + return stillfading; } @@ -7353,6 +7391,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->rover = rover; d->sectornum = (INT32)sectornum; d->ffloornum = (INT32)ffloornum; + d->alpha = rover->alpha; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->doexists = doexists; diff --git a/src/p_spec.h b/src/p_spec.h index b4e9594d2..dc2ab0e6a 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -456,6 +456,7 @@ typedef struct ffloor_t *rover; ///< Target ffloor INT32 sectornum; ///< Number of ffloor target sector INT32 ffloornum; ///< Number of ffloor of target sector + INT32 alpha; ///< Internal alpha counter INT16 destvalue; ///< Transparency value to fade to INT16 speed; ///< Speed to fade by boolean doexists; ///< Handle FF_EXISTS From 95a6299ff660d1ce453ee8e3f692f57119e5e7fd Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 18 Aug 2018 05:31:41 -0400 Subject: [PATCH 36/78] P_ResetFakeFloorFader: Unclamp rover->alpha from software levels --- src/p_spec.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 50cf049ff..8ad69d872 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7199,10 +7199,13 @@ void T_Disappear(disappear_t *d) static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data) { // find any existing thinkers and remove them, then replace with new data - if(((fade_t *)rover->fadingdata) != data) + if (((fade_t *)rover->fadingdata) != data) { - if(&((fade_t *)rover->fadingdata)->thinker) + if (&((fade_t *)rover->fadingdata)->thinker) + { + rover->alpha = ((fade_t *)rover->fadingdata)->alpha; // unclamp from software levels P_RemoveThinker(&((fade_t *)rover->fadingdata)->thinker); + } rover->fadingdata = data; } From 3488501b0354614b780633047540d09de73de416 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 18 Aug 2018 05:55:49 -0400 Subject: [PATCH 37/78] Add "finalize" flag to Type 453 Stop Fade --- src/p_spec.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 8ad69d872..687ebdbba 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -103,8 +103,8 @@ static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data); -#define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL); +static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); +#define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, @@ -3107,7 +3107,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to crumble + ffloor_t *rover; // FOF that we are going to operate size_t j = 0; // sec->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) @@ -3161,7 +3161,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to crumble + ffloor_t *rover; // FOF that we are going to operate for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) { @@ -3185,7 +3185,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) return; } - P_RemoveFakeFloorFader(rover); + P_ResetFakeFloorFader(rover, NULL, + !(line->flags & ML_BLOCKMONSTERS)); // do not finalize collision flags } break; } @@ -7196,15 +7197,28 @@ void T_Disappear(disappear_t *d) * \param line line to search for target faders * \param data pointer to set new fadingdata to. Can be NULL to erase. */ -static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data) +static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize) { + fade_t *fadingdata = (fade_t *)rover->fadingdata; // find any existing thinkers and remove them, then replace with new data - if (((fade_t *)rover->fadingdata) != data) + if (fadingdata != data) { - if (&((fade_t *)rover->fadingdata)->thinker) + if (&fadingdata->thinker) { - rover->alpha = ((fade_t *)rover->fadingdata)->alpha; // unclamp from software levels - P_RemoveThinker(&((fade_t *)rover->fadingdata)->thinker); + if (finalize) + P_FadeFakeFloor(rover, + fadingdata->alpha >= fadingdata->destvalue ? + fadingdata->alpha - 1 : // trigger fade-out finish + fadingdata->alpha + 1, // trigger fade-in finish + 0, + fadingdata->doexists, + fadingdata->dotranslucent, + fadingdata->docollision, + fadingdata->doghostfade, + fadingdata->exactalpha); + rover->alpha = fadingdata->alpha; + + P_RemoveThinker(&fadingdata->thinker); } rover->fadingdata = data; @@ -7404,7 +7418,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->exactalpha = exactalpha; // find any existing thinkers and remove them, then replace with new data - P_ResetFakeFloorFader(rover, d); + P_ResetFakeFloorFader(rover, d, false); P_AddThinker(&d->thinker); } From 3f971ee92141464d0fc4961627722826c11dffd9 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 7 Sep 2018 08:19:22 -0400 Subject: [PATCH 38/78] Deduct marescore immediately on instakill * Deduct player->spheres too, missed that one --- src/p_user.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index e1480a47d..806fc5da0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -609,9 +609,9 @@ static void P_DeNightserizePlayer(player_t *player) stagefailed = true; // NIGHT OVER // If you screwed up, kiss your score and ring bonus goodbye. - // But don't do this yet if not in special stage! Wait til we hit the ground. - player->marescore = 0; - player->rings = 0; + // But only do this in special stage (and instakill!) In regular stages, wait til we hit the ground. + player->marescore = player->spheres =\ + player->rings = 0; } // Check to see if the player should be killed. @@ -625,7 +625,11 @@ static void P_DeNightserizePlayer(player_t *player) continue; if (mo2->flags2 & MF2_AMBUSH) + { + player->marescore = player->spheres =\ + player->rings = 0; P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); + } break; } @@ -7083,8 +7087,8 @@ static void P_MovePlayer(player_t *player) P_DamageMobj(player->mo, NULL, NULL, 1, 0); // Now deduct our mare score! - player->marescore = 0; - player->rings = 0; + player->marescore = player->spheres =\ + player->rings = 0; } player->powers[pw_carry] = CR_NONE; } From 61960937b0b41c8c1d8d385ca4a9641b91e01285 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 01:12:34 -0400 Subject: [PATCH 39/78] Fix Mario block triggering during ghost fade --- src/p_spec.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index 6ba73f98d..1a0fa91b0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7485,6 +7485,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->flags &= ~FF_QUICKSAND; if (rover->spawnflags & FF_BUSTUP) rover->flags &= ~FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags &= ~FF_MARIO; } } else // continue fading out @@ -7510,6 +7512,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->flags |= FF_QUICKSAND; if (rover->spawnflags & FF_BUSTUP) rover->flags |= FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags |= FF_MARIO; } } else // continue fading in @@ -7567,6 +7571,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->flags &= ~FF_QUICKSAND; if (rover->spawnflags & FF_BUSTUP) rover->flags &= ~FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags &= ~FF_MARIO; } else // keep collision during fade { @@ -7578,6 +7584,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->flags |= FF_QUICKSAND; if (rover->spawnflags & FF_BUSTUP) rover->flags |= FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags |= FF_MARIO; } } } From 2a89fcfc872ead5be006479a03e53e749828ade8 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 01:23:15 -0400 Subject: [PATCH 40/78] Never handle FF_EXISTS if FF_BUSTUP --- src/p_spec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 1a0fa91b0..9a1ed4e9f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7526,7 +7526,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, // routines common to both fade in and fade out if (!stillfading) { - if (doexists) + if (doexists && !(rover->spawnflags & FF_BUSTUP)) { if (alpha <= 1) rover->flags &= ~FF_EXISTS; @@ -7550,7 +7550,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } else { - if (doexists) + if (doexists && !(rover->spawnflags & FF_BUSTUP)) rover->flags |= FF_EXISTS; if (dotranslucent) From 8ad62de04483799fba4500f6bba378996981f500 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 01:33:12 -0400 Subject: [PATCH 41/78] Disable FadeFakeFloor for laser block --- src/p_spec.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index 9a1ed4e9f..307cca05f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7460,6 +7460,9 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, INT32 alpha; fade_t *fadingdata = (fade_t *)rover->fadingdata; + if (rover->master->special == 258) // Laser block + return false; + if (fadingdata) alpha = fadingdata->alpha; else From 6cd3fd8c7d3a342615da91560993cd05a7766cd9 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 08:46:56 -0400 Subject: [PATCH 42/78] Enable FF_CUTSOLIDS handling and updating by sector->moved --- src/p_spec.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 307cca05f..78c78d5e0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7541,13 +7541,23 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, { if (alpha >= 256) { - //rover->flags |= (FF_CUTLEVEL | FF_CUTEXTRA); + if (!(rover->flags & FF_CUTSOLIDS) && + (rover->spawnflags & FF_CUTSOLIDS)) + { + rover->flags |= FF_CUTSOLIDS; + rover->target->moved = true; + } rover->flags &= ~FF_TRANSLUCENT; } else { rover->flags |= FF_TRANSLUCENT; - //rover->flags &= ~(FF_CUTLEVEL | FF_CUTEXTRA); + if ((rover->flags & FF_CUTSOLIDS) && + (rover->spawnflags & FF_CUTSOLIDS)) + { + rover->flags &= ~FF_CUTSOLIDS; + rover->target->moved = true; + } } } } @@ -7559,7 +7569,12 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, if (dotranslucent) { rover->flags |= FF_TRANSLUCENT; - //rover->flags &= ~(FF_CUTLEVEL | FF_CUTEXTRA); + if ((rover->flags & FF_CUTSOLIDS) && + (rover->spawnflags & FF_CUTSOLIDS)) + { + rover->flags &= ~FF_CUTSOLIDS; + rover->target->moved = true; + } } if (docollision) From bbdf09f19e63b18e558ea8be1fdf0e80920ec7af Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 09:08:32 -0400 Subject: [PATCH 43/78] Handle rendering flags for invisible FOFs --- src/p_spec.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index 78c78d5e0..62959dcce 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7547,11 +7547,13 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->flags |= FF_CUTSOLIDS; rover->target->moved = true; } + rover->flags &= ~FF_TRANSLUCENT; } else { rover->flags |= FF_TRANSLUCENT; + if ((rover->flags & FF_CUTSOLIDS) && (rover->spawnflags & FF_CUTSOLIDS)) { @@ -7559,6 +7561,15 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->target->moved = true; } } + + if (!(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES)) + { + if (rover->alpha > 1) + rover->flags |= FF_RENDERALL; + else + rover->flags &= ~FF_RENDERALL; + } } } else @@ -7569,12 +7580,17 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, if (dotranslucent) { rover->flags |= FF_TRANSLUCENT; + if ((rover->flags & FF_CUTSOLIDS) && (rover->spawnflags & FF_CUTSOLIDS)) { rover->flags &= ~FF_CUTSOLIDS; rover->target->moved = true; } + + if (!(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES)) + rover->flags |= FF_RENDERALL; } if (docollision) From c6ffa6fbe57c72209952e3466227c1842ae1e989 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 09:31:23 -0400 Subject: [PATCH 44/78] Initialize invisible FOF alpha to 1 on first fade --- src/p_spec.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index 62959dcce..88506f0fe 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7463,6 +7463,14 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, if (rover->master->special == 258) // Laser block return false; + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + if (dotranslucent && + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + if (fadingdata) alpha = fadingdata->alpha; else @@ -7678,6 +7686,15 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->rover = rover; d->sectornum = (INT32)sectornum; d->ffloornum = (INT32)ffloornum; + + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + if (dotranslucent && + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + d->alpha = rover->alpha; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker From e78ce5fdc31044430aff2fc690ca4f21198199ea Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 20:06:48 -0400 Subject: [PATCH 45/78] When detecting invisible FOFs, don't include light blocks --- src/p_spec.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 88506f0fe..bf3f58697 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7466,6 +7466,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 if (dotranslucent && + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES) && !(rover->flags & FF_RENDERALL)) @@ -7570,7 +7571,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } } - if (!(rover->spawnflags & FF_RENDERSIDES) && + if ((rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES)) { if (rover->alpha > 1) @@ -7596,7 +7598,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->target->moved = true; } - if (!(rover->spawnflags & FF_RENDERSIDES) && + if ((rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES)) rover->flags |= FF_RENDERALL; } @@ -7690,6 +7693,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 if (dotranslucent && + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES) && !(rover->flags & FF_RENDERALL)) From 47dce92d8bbc83ab2d5bc657fb7cd8f2aaf9c32f Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 20:41:45 -0400 Subject: [PATCH 46/78] Add dolighting flag to FadeFakeFloor thinker --- src/p_saveg.c | 2 ++ src/p_spec.c | 14 +++++++++----- src/p_spec.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 3b726b97d..05501ccc0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1592,6 +1592,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->docollision); + WRITEUINT8(save_p, ht->dolighting); WRITEUINT8(save_p, ht->doghostfade); WRITEUINT8(save_p, ht->exactalpha); } @@ -2596,6 +2597,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); ht->docollision = READUINT8(save_p); + ht->dolighting = READUINT8(save_p); ht->doghostfade = READUINT8(save_p); ht->exactalpha = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index bf3f58697..c73118515 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -106,10 +106,10 @@ static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t o static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha); + boolean doexists, boolean dotranslucent, boolean docollision, boolean dolighting, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha); + boolean doexists, boolean dotranslucent, boolean docollision, boolean dolighting, boolean doghostfade, boolean exactalpha); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3356,6 +3356,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_BOUNCY), // do not handle interactive flags + !(line->flags & ML_EFFECT2), // do not handle lighting (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) else @@ -3366,6 +3367,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_BOUNCY), // do not handle interactive flags + !(line->flags & ML_EFFECT2), // do not handle lighting (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) } @@ -7442,6 +7444,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz fadingdata->doexists, fadingdata->dotranslucent, fadingdata->docollision, + fadingdata->dolighting, fadingdata->doghostfade, fadingdata->exactalpha); rover->alpha = fadingdata->alpha; @@ -7454,7 +7457,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz } static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha) + boolean doexists, boolean dotranslucent, boolean docollision, boolean dolighting, boolean doghostfade, boolean exactalpha) { boolean stillfading = false; INT32 alpha; @@ -7681,7 +7684,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, */ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean doghostfade, boolean exactalpha) + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); @@ -7705,6 +7708,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->doexists = doexists; d->dotranslucent = dotranslucent; d->docollision = docollision; + d->dolighting = dolighting; d->doghostfade = doghostfade; d->exactalpha = exactalpha; @@ -7721,7 +7725,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor */ void T_Fade(fade_t *d) { - if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->docollision, d->doghostfade, d->exactalpha)) + if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->docollision, d->dolighting, d->doghostfade, d->exactalpha)) P_RemoveFakeFloorFader(d->rover); } diff --git a/src/p_spec.h b/src/p_spec.h index f00a1cdbd..df400fac1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -466,6 +466,7 @@ typedef struct boolean doexists; ///< Handle FF_EXISTS boolean dotranslucent; ///< Handle FF_TRANSLUCENT boolean docollision; ///< Handle interactive flags + boolean dolighting; ///< Handle shadows and light blocks boolean doghostfade; ///< No interactive flags during fading boolean exactalpha; ///< Use exact alpha values (opengl) } fade_t; From b74fa1e9c87eaa430a94b0fe9cad3bfbdaa45fde Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 20:49:32 -0400 Subject: [PATCH 47/78] Re-render lighting when setting FF_EXISTS --- src/p_spec.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index c73118515..7ee047afb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7547,6 +7547,10 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, rover->flags &= ~FF_EXISTS; else rover->flags |= FF_EXISTS; + + // Re-render lighting at end of fade + if (dolighting && !(rover->spawnflags & FF_NOSHADE) && !(rover->flags & FF_EXISTS)) + rover->target->moved = true; } if (dotranslucent) @@ -7588,7 +7592,13 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, else { if (doexists && !(rover->spawnflags & FF_BUSTUP)) + { + // Re-render lighting if we haven't yet set FF_EXISTS (beginning of fade) + if (dolighting && !(rover->spawnflags & FF_NOSHADE) && !(rover->flags & FF_EXISTS)) + rover->target->moved = true; + rover->flags |= FF_EXISTS; + } if (dotranslucent) { From deb0ba1648ff7b7ba05038679045afffbe0e2d71 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 23:44:29 -0400 Subject: [PATCH 48/78] Add light fading to FadeFakeFloor * Declare P_RemoveLighting in header for p_spec.c use --- src/p_lights.c | 2 +- src/p_spec.c | 13 +++++++++++++ src/p_spec.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/p_lights.c b/src/p_lights.c index b2934b792..02221d197 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -25,7 +25,7 @@ * * \param sector The sector to remove effects from. */ -static void P_RemoveLighting(sector_t *sector) +void P_RemoveLighting(sector_t *sector) { if (sector->lightingdata) { diff --git a/src/p_spec.c b/src/p_spec.c index 1f8f1c2b0..a1465b0e7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7453,6 +7453,12 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz fadingdata->exactalpha); rover->alpha = fadingdata->alpha; + if (fadingdata->dolighting) + { + P_RemoveLighting(§ors[rover->secnum]); + §ors[rover->secnum].lightlevel = rover->target->lightlevel; // \todo get fade light level destvalue + } + P_RemoveThinker(&fadingdata->thinker); } @@ -7729,6 +7735,13 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor // find any existing thinkers and remove them, then replace with new data P_ResetFakeFloorFader(rover, d, false); + // Set a separate thinker for shadow fading + if (dolighting && !(rover->flags & FF_NOSHADE)) + P_FadeLightBySector(§ors[rover->secnum], + rover->target->lightlevel, // (shadowlight - targetlight) * destvalue/256 // \todo get fade light level destvalue + FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, + true, exactalpha); + P_AddThinker(&d->thinker); } diff --git a/src/p_spec.h b/src/p_spec.h index ec1911df3..0d118168b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -154,6 +154,8 @@ typedef struct #define FASTDARK 15 #define SLOWDARK 35 +void P_RemoveLighting(sector_t *sector); + void T_FireFlicker(fireflicker_t *flick); fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *minsector, sector_t *maxsector, INT32 length); void T_LightningFlash(lightflash_t *flash); From a177548da6f8382588a59b2cadd377d102d8bb9a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 01:13:02 -0400 Subject: [PATCH 49/78] Added NIGHTSLINK bonus type for the 2.1 Link Bonus --- src/dehacked.c | 3 ++- src/y_inter.c | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 70a19eadc..1f56210ac 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1197,8 +1197,9 @@ static void readlevelheader(MYFILE *f, INT32 num) else if (fastcmp(word2, "BOSS")) i = 1; else if (fastcmp(word2, "ERZ3")) i = 2; else if (fastcmp(word2, "NIGHTS")) i = 3; + else if (fastcmp(word2, "NIGHTSLINK")) i = 4; - if (i >= -1 && i <= 3) // -1 for no bonus. Max is 3. + if (i >= -1 && i <= 4) // -1 for no bonus. Max is 3. mapheaderinfo[num-1]->bonustype = (SINT8)i; else deh_warning("Level header %d: invalid bonus type number %d", num, i); diff --git a/src/y_inter.c b/src/y_inter.c index 3fdf5f7a9..2c77a577a 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1774,7 +1774,6 @@ static void Y_SetLapBonus(player_t *player, y_bonus_t *bstruct) bstruct->points = max(0, player->totalmarebonuslap * 1000); } -#if 0 // // Y_SetLinkBonus // @@ -1784,7 +1783,6 @@ static void Y_SetLinkBonus(player_t *player, y_bonus_t *bstruct) bstruct->display = true; bstruct->points = max(0, (player->maxlink - 1) * 100); } -#endif // // Y_SetGuardBonus @@ -1837,7 +1835,7 @@ static void Y_SetPerfectBonus(player_t *player, y_bonus_t *bstruct) // This list can be extended in the future with SOC/Lua, perhaps. typedef void (*bonus_f)(player_t *, y_bonus_t *); -bonus_f bonuses_list[5][4] = { +bonus_f bonuses_list[6][4] = { { Y_SetNullBonus, Y_SetNullBonus, @@ -1868,6 +1866,12 @@ bonus_f bonuses_list[5][4] = { Y_SetLapBonus, Y_SetNullBonus, }, + { + Y_SetNullBonus, + Y_SetLinkBonus, + Y_SetLapBonus, + Y_SetNullBonus, + }, }; From baeb1f2aa5eba91da874351d8c5a59dd0e0957a3 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 08:10:45 -0400 Subject: [PATCH 50/78] Don't add a thinker if alpha is already equal --- src/p_spec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index a1465b0e7..d33ad873c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7706,6 +7706,10 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor INT16 destvalue, INT16 speed, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { + // already equal, nothing to do + if (rover->alpha == max(1, min(256, destvalue))) + return; + fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); d->thinker.function.acp1 = (actionf_p1)T_Fade; From 888ea233dcfb1f278e1b98a46ff6a0b99d40bfd5 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 12:44:35 -0400 Subject: [PATCH 51/78] Add spawn_lightlevel to sector_t --- src/p_setup.c | 1 + src/r_defs.h | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index 2361d1efd..0119e6584 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -678,6 +678,7 @@ static void P_LoadRawSectors(UINT8 *data, size_t i) ss->ceilingpic = P_AddLevelFlat(ms->ceilingpic, foundflats); ss->lightlevel = SHORT(ms->lightlevel); + ss->spawn_lightlevel = SHORT(ms->lightlevel); ss->special = SHORT(ms->special); ss->tag = SHORT(ms->tag); ss->nexttag = ss->firsttag = -1; diff --git a/src/r_defs.h b/src/r_defs.h index ea5db3947..65f8ee5c6 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -385,6 +385,9 @@ typedef struct sector_s boolean hasslope; // The sector, or one of its visible FOFs, contains a slope #endif + // for fade thinker + INT16 spawn_lightlevel; + // these are saved for netgames, so do not let Lua touch these! INT32 spawn_nexttag, spawn_firsttag; // the actual nexttag/firsttag values may differ if the sector's tag was changed From 4e3f0c9a8420562b1b672bbfa83630e49bb025bc Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 15:41:30 -0400 Subject: [PATCH 52/78] Fade FOF lighting fixes; properly calculate destlightvalue --- src/p_spec.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index d4b60c70c..5c171c3d6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3358,8 +3358,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) destvalue, speed, !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - !(line->flags & ML_BOUNCY), // do not handle interactive flags !(line->flags & ML_EFFECT2), // do not handle lighting + !(line->flags & ML_BOUNCY), // do not handle interactive flags (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) else @@ -3369,8 +3369,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) destvalue, 0, // set alpha immediately !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - !(line->flags & ML_BOUNCY), // do not handle interactive flags !(line->flags & ML_EFFECT2), // do not handle lighting + !(line->flags & ML_BOUNCY), // do not handle interactive flags (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) } @@ -7453,10 +7453,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz rover->alpha = fadingdata->alpha; if (fadingdata->dolighting) - { P_RemoveLighting(§ors[rover->secnum]); - §ors[rover->secnum].lightlevel = rover->target->lightlevel; // \todo get fade light level destvalue - } P_RemoveThinker(&fadingdata->thinker); } @@ -7697,6 +7694,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, * \param speed speed to fade by * \param doexists handle FF_EXISTS * \param dotranslucent handle FF_TRANSLUCENT + * \param dolighting fade FOF light * \param docollision handle interactive flags * \param doghostfade no interactive flags during fading * \param exactalpha use exact alpha values (opengl) @@ -7740,10 +7738,24 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor // Set a separate thinker for shadow fading if (dolighting && !(rover->flags & FF_NOSHADE)) + { + UINT16 lightdelta = abs(sectors[rover->secnum].spawn_lightlevel - rover->target->lightlevel); + fixed_t alphapercent = FixedDiv(d->destvalue, rover->spawnalpha); + fixed_t adjustedlightdelta = FixedMul(lightdelta, alphapercent); + INT16 destlightvalue; + + if (rover->target->lightlevel >= sectors[rover->secnum].spawn_lightlevel) // fading out, get lighter + destlightvalue = rover->target->lightlevel - adjustedlightdelta; + else // fading in, get darker + destlightvalue = rover->target->lightlevel + adjustedlightdelta; + + //CONS_Printf("%d| LightDelta %d> AlphaPct %d> AdjLiDel %d> DestLight %d\n", gametic, lightdelta, FixedMul(alphapercent, 100), adjustedlightdelta, destlightvalue); + P_FadeLightBySector(§ors[rover->secnum], - rover->target->lightlevel, // (shadowlight - targetlight) * destvalue/256 // \todo get fade light level destvalue + destlightvalue, FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, - true, exactalpha); + true); + } P_AddThinker(&d->thinker); } From 44ba282d5f07df24424f9848cff331cb484b0be0 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 17:19:49 -0400 Subject: [PATCH 53/78] Finalize light level on fade finish (not forced stop) * Added destlightlevel property to fade_t * Fixed dotranslucent, dolighting, docollision order weirdness in function calls --- src/p_saveg.c | 6 ++++-- src/p_spec.c | 35 ++++++++++++++++++++--------------- src/p_spec.h | 3 ++- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index be0363d05..334279a9a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1591,11 +1591,12 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->ffloornum); WRITEINT32(save_p, ht->alpha); WRITEINT16(save_p, ht->destvalue); + WRITEINT16(save_p, ht->destlightlevel); WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); - WRITEUINT8(save_p, ht->docollision); WRITEUINT8(save_p, ht->dolighting); + WRITEUINT8(save_p, ht->docollision); WRITEUINT8(save_p, ht->doghostfade); WRITEUINT8(save_p, ht->exactalpha); } @@ -2599,11 +2600,12 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->ffloornum = READINT32(save_p); ht->alpha = READINT32(save_p); ht->destvalue = READINT16(save_p); + ht->destlightlevel = READINT16(save_p); ht->speed = READINT16(save_p); ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); - ht->docollision = READUINT8(save_p); ht->dolighting = READUINT8(save_p); + ht->docollision = READUINT8(save_p); ht->doghostfade = READUINT8(save_p); ht->exactalpha = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 5c171c3d6..d291d1e3b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -106,10 +106,10 @@ static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t o static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean dolighting, boolean doghostfade, boolean exactalpha); + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean dolighting, boolean doghostfade, boolean exactalpha); + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3359,8 +3359,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting - !(line->flags & ML_BOUNCY), // do not handle interactive flags - (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) + !(line->flags & ML_BOUNCY), // do not handle collision + (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) else { @@ -3370,8 +3370,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting - !(line->flags & ML_BOUNCY), // do not handle interactive flags - (line->flags & ML_EFFECT1), // do ghost fade (no interactive flags during fade) + !(line->flags & ML_BOUNCY), // do not handle collision + (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) } } @@ -7463,7 +7463,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz } static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, - boolean doexists, boolean dotranslucent, boolean docollision, boolean dolighting, boolean doghostfade, boolean exactalpha) + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { boolean stillfading = false; INT32 alpha; @@ -7728,8 +7728,8 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->doexists = doexists; d->dotranslucent = dotranslucent; - d->docollision = docollision; d->dolighting = dolighting; + d->docollision = docollision; d->doghostfade = doghostfade; d->exactalpha = exactalpha; @@ -7742,20 +7742,19 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor UINT16 lightdelta = abs(sectors[rover->secnum].spawn_lightlevel - rover->target->lightlevel); fixed_t alphapercent = FixedDiv(d->destvalue, rover->spawnalpha); fixed_t adjustedlightdelta = FixedMul(lightdelta, alphapercent); - INT16 destlightvalue; if (rover->target->lightlevel >= sectors[rover->secnum].spawn_lightlevel) // fading out, get lighter - destlightvalue = rover->target->lightlevel - adjustedlightdelta; + d->destlightlevel = rover->target->lightlevel - adjustedlightdelta; else // fading in, get darker - destlightvalue = rover->target->lightlevel + adjustedlightdelta; - - //CONS_Printf("%d| LightDelta %d> AlphaPct %d> AdjLiDel %d> DestLight %d\n", gametic, lightdelta, FixedMul(alphapercent, 100), adjustedlightdelta, destlightvalue); + d->destlightlevel = rover->target->lightlevel + adjustedlightdelta; P_FadeLightBySector(§ors[rover->secnum], - destlightvalue, + d->destlightlevel, FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, true); } + else + d->destlightlevel = -1; P_AddThinker(&d->thinker); } @@ -7767,8 +7766,14 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor */ void T_Fade(fade_t *d) { - if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->docollision, d->dolighting, d->doghostfade, d->exactalpha)) + if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->dolighting, d->docollision, d->doghostfade, d->exactalpha)) + { + // Finalize lighting, copypasta from P_AddFakeFloorFader + if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1) + sectors[d->rover->secnum].lightlevel = d->destlightlevel; + P_RemoveFakeFloorFader(d->rover); + } } /* diff --git a/src/p_spec.h b/src/p_spec.h index aefb024af..461ae876b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -470,11 +470,12 @@ typedef struct INT32 ffloornum; ///< Number of ffloor of target sector INT32 alpha; ///< Internal alpha counter INT16 destvalue; ///< Transparency value to fade to + INT16 destlightlevel; ///< Light level to fade to INT16 speed; ///< Speed to fade by boolean doexists; ///< Handle FF_EXISTS boolean dotranslucent; ///< Handle FF_TRANSLUCENT - boolean docollision; ///< Handle interactive flags boolean dolighting; ///< Handle shadows and light blocks + boolean docollision; ///< Handle interactive flags boolean doghostfade; ///< No interactive flags during fading boolean exactalpha; ///< Use exact alpha values (opengl) } fade_t; From f77957ddf006e64f09ae2dfe88a440b537981f33 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 19:31:32 -0400 Subject: [PATCH 54/78] Added tic-based logic to FOF fade (ML_EFFECT5) --- src/p_saveg.c | 6 ++++++ src/p_spec.c | 53 ++++++++++++++++++++++++++++++++++++++++----------- src/p_spec.h | 3 +++ 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 334279a9a..162241573 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1593,6 +1593,9 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->destlightlevel); WRITEINT16(save_p, ht->speed); + WRITEINT32(save_p, ht->duration); + WRITEUINT32(save_p, ht->interval); + WRITEUINT32(save_p, (UINT32)ht->firsttic); WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dolighting); @@ -2602,6 +2605,9 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->destvalue = READINT16(save_p); ht->destlightlevel = READINT16(save_p); ht->speed = READINT16(save_p); + ht->duration = READINT32(save_p); + ht->interval = READUINT32(save_p); + ht->firsttic = (tic_t)READUINT32(save_p); ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); ht->dolighting = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index d291d1e3b..8d1f4f295 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -105,10 +105,10 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, INT32 duration, UINT32 interval, tic_t firsttic, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, - INT16 destvalue, INT16 speed, + INT16 destvalue, INT16 speed, boolean ticbased, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); @@ -3356,6 +3356,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (speed > 0) P_AddFakeFloorFader(rover, secnum, j, destvalue, speed, + (line->flags & ML_EFFECT5), // tic-based logic !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -3367,6 +3368,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, destvalue, 0, // set alpha immediately + -1, 0, 0, // tic-based logic !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -7444,6 +7446,9 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz fadingdata->alpha - 1 : // trigger fade-out finish fadingdata->alpha + 1, // trigger fade-in finish 0, + fadingdata->duration, + fadingdata->interval, + fadingdata->firsttic, fadingdata->doexists, fadingdata->dotranslucent, fadingdata->docollision, @@ -7462,9 +7467,10 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz } } -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, INT32 duration, UINT32 interval, tic_t firsttic, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { + boolean ticbased = (duration > -1); boolean stillfading = false; INT32 alpha; fade_t *fadingdata = (fade_t *)rover->fadingdata; @@ -7492,7 +7498,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, else if (alpha > destvalue) // fade out { // finish fading out - if (speed < 1 || alpha - speed <= destvalue + speed) + if (speed < 1 || (!ticbased && alpha - speed <= destvalue + speed) || + (ticbased && (gametic - firsttic >= duration || alpha <= destvalue))) { alpha = destvalue; @@ -7512,14 +7519,18 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } else // continue fading out { - alpha -= speed; + if (!ticbased) + alpha -= speed; + else if (ticbased && !((gametic - firsttic) % interval)) + alpha = max(alpha - speed, destvalue); stillfading = true; } } else // fade in { // finish fading in - if (speed < 1 || alpha + speed >= destvalue - speed) + if (speed < 1 || (!ticbased && alpha + speed >= destvalue - speed) || + (ticbased && (gametic - firsttic >= duration || alpha >= destvalue))) { alpha = destvalue; @@ -7539,7 +7550,10 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, } else // continue fading in { - alpha += speed; + if (!ticbased) + alpha += speed; + else if (ticbased && !((gametic - firsttic) % interval)) + alpha = min(alpha + speed, destvalue); stillfading = true; } } @@ -7692,6 +7706,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, * * \param destvalue transparency value to fade to * \param speed speed to fade by + * \param ticbased tic-based logic, speed = duration * \param doexists handle FF_EXISTS * \param dotranslucent handle FF_TRANSLUCENT * \param dolighting fade FOF light @@ -7700,7 +7715,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, * \param exactalpha use exact alpha values (opengl) */ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, - INT16 destvalue, INT16 speed, + INT16 destvalue, INT16 speed, boolean ticbased, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { // already equal, nothing to do @@ -7725,7 +7740,21 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->alpha = rover->alpha; d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 - d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker + + if (ticbased) + { + d->duration = abs(speed); + d->speed = max(abs(FixedFloor(FixedDiv(d->destvalue - d->alpha, d->duration))/FRACUNIT), 1); + d->interval = max(FixedFloor(FixedDiv(d->duration, abs(d->destvalue - d->alpha)))/FRACUNIT, 1); + d->firsttic = gametic; + } + else + { + d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker + d->duration = -1; + d->interval = d->firsttic = 0; + } + d->doexists = doexists; d->dotranslucent = dotranslucent; d->dolighting = dolighting; @@ -7750,7 +7779,8 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor P_FadeLightBySector(§ors[rover->secnum], d->destlightlevel, - FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, + ticbased ? d->duration : + FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, true); } else @@ -7766,7 +7796,8 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor */ void T_Fade(fade_t *d) { - if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->doexists, d->dotranslucent, d->dolighting, d->docollision, d->doghostfade, d->exactalpha)) + if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->duration, d->interval, d->firsttic, + d->doexists, d->dotranslucent, d->dolighting, d->docollision, d->doghostfade, d->exactalpha)) { // Finalize lighting, copypasta from P_AddFakeFloorFader if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1) diff --git a/src/p_spec.h b/src/p_spec.h index 461ae876b..93d113be3 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -472,6 +472,9 @@ typedef struct INT16 destvalue; ///< Transparency value to fade to INT16 destlightlevel; ///< Light level to fade to INT16 speed; ///< Speed to fade by + INT32 duration; ///< Duration for tic-based logic, > -1 means use tic-based + UINT32 interval; ///< Skip interval for tic-based logic + tic_t firsttic; ///< First tic for tic-based logic boolean doexists; ///< Handle FF_EXISTS boolean dotranslucent; ///< Handle FF_TRANSLUCENT boolean dolighting; ///< Handle shadows and light blocks From 295ff73e70f121c79e8965e06eab6f34bf40fad6 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 19:44:35 -0400 Subject: [PATCH 55/78] Cap lightlevel fading at spawn_lightlevel (don't make darker) --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 8d1f4f295..de61064fd 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7769,7 +7769,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor if (dolighting && !(rover->flags & FF_NOSHADE)) { UINT16 lightdelta = abs(sectors[rover->secnum].spawn_lightlevel - rover->target->lightlevel); - fixed_t alphapercent = FixedDiv(d->destvalue, rover->spawnalpha); + fixed_t alphapercent = min(FixedDiv(d->destvalue, rover->spawnalpha), 1*FRACUNIT); // don't make darker than spawn_lightlevel fixed_t adjustedlightdelta = FixedMul(lightdelta, alphapercent); if (rover->target->lightlevel >= sectors[rover->secnum].spawn_lightlevel) // fading out, get lighter From bb55774171d96da185ec1bc9765736c167685afc Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 19:57:41 -0400 Subject: [PATCH 56/78] Fix tic-based bug returning early --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index de61064fd..8b5b0c1c4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7493,7 +7493,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, IN alpha = rover->alpha; // routines specific to fade in and fade out - if (alpha == destvalue) + if (!ticbased && alpha == destvalue) return stillfading; else if (alpha > destvalue) // fade out { From ecfc2e66f1d232f55fe7f1dcb4bafc9d65b8c5c2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 20:45:12 -0400 Subject: [PATCH 57/78] Replace firsttic with timer increment --- src/p_saveg.c | 8 ++++---- src/p_spec.c | 36 ++++++++++++++++++------------------ src/p_spec.h | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 8ec35a0d6..a3790d6f0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1593,9 +1593,9 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->destlightlevel); WRITEINT16(save_p, ht->speed); - WRITEINT32(save_p, ht->duration); + WRITEUINT8(save_p, (UINT8)ht->ticbased); + WRITEINT32(save_p, ht->timer); WRITEUINT32(save_p, ht->interval); - WRITEUINT32(save_p, (UINT32)ht->firsttic); WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dolighting); @@ -2605,9 +2605,9 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->destvalue = READINT16(save_p); ht->destlightlevel = READINT16(save_p); ht->speed = READINT16(save_p); - ht->duration = READINT32(save_p); + ht->ticbased = (boolean)READUINT8(save_p); + ht->timer = READINT32(save_p); ht->interval = READUINT32(save_p); - ht->firsttic = (tic_t)READUINT32(save_p); ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); ht->dolighting = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 8b5b0c1c4..1bc60cc71 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -105,7 +105,7 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, INT32 duration, UINT32 interval, tic_t firsttic, +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, UINT32 interval, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, boolean ticbased, @@ -3368,7 +3368,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, destvalue, 0, // set alpha immediately - -1, 0, 0, // tic-based logic + false, NULL, 0, // tic-based logic !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -7446,9 +7446,9 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz fadingdata->alpha - 1 : // trigger fade-out finish fadingdata->alpha + 1, // trigger fade-in finish 0, - fadingdata->duration, + fadingdata->ticbased, + &fadingdata->timer, fadingdata->interval, - fadingdata->firsttic, fadingdata->doexists, fadingdata->dotranslucent, fadingdata->docollision, @@ -7467,10 +7467,9 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz } } -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, INT32 duration, UINT32 interval, tic_t firsttic, +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, UINT32 interval, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { - boolean ticbased = (duration > -1); boolean stillfading = false; INT32 alpha; fade_t *fadingdata = (fade_t *)rover->fadingdata; @@ -7499,7 +7498,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, IN { // finish fading out if (speed < 1 || (!ticbased && alpha - speed <= destvalue + speed) || - (ticbased && (gametic - firsttic >= duration || alpha <= destvalue))) + (ticbased && (--(*timer) <= 0 || alpha <= destvalue))) { alpha = destvalue; @@ -7521,7 +7520,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, IN { if (!ticbased) alpha -= speed; - else if (ticbased && !((gametic - firsttic) % interval)) + else if (ticbased && !((*timer) % interval)) alpha = max(alpha - speed, destvalue); stillfading = true; } @@ -7530,7 +7529,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, IN { // finish fading in if (speed < 1 || (!ticbased && alpha + speed >= destvalue - speed) || - (ticbased && (gametic - firsttic >= duration || alpha >= destvalue))) + (ticbased && (--(*timer) <= 0|| alpha >= destvalue))) { alpha = destvalue; @@ -7552,7 +7551,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, IN { if (!ticbased) alpha += speed; - else if (ticbased && !((gametic - firsttic) % interval)) + else if (ticbased && !((*timer) % interval)) alpha = min(alpha + speed, destvalue); stillfading = true; } @@ -7743,16 +7742,17 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor if (ticbased) { - d->duration = abs(speed); - d->speed = max(abs(FixedFloor(FixedDiv(d->destvalue - d->alpha, d->duration))/FRACUNIT), 1); - d->interval = max(FixedFloor(FixedDiv(d->duration, abs(d->destvalue - d->alpha)))/FRACUNIT, 1); - d->firsttic = gametic; + d->ticbased = true; + d->timer = abs(speed); + d->speed = max(abs(FixedFloor(FixedDiv(d->destvalue - d->alpha, d->timer))/FRACUNIT), 1); + d->interval = max(FixedFloor(FixedDiv(d->timer, abs(d->destvalue - d->alpha)))/FRACUNIT, 1); } else { d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker - d->duration = -1; - d->interval = d->firsttic = 0; + d->ticbased = false; + d->timer = -1; + d->interval = 0; } d->doexists = doexists; @@ -7779,7 +7779,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor P_FadeLightBySector(§ors[rover->secnum], d->destlightlevel, - ticbased ? d->duration : + ticbased ? d->timer : FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, true); } @@ -7796,7 +7796,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor */ void T_Fade(fade_t *d) { - if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->duration, d->interval, d->firsttic, + if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->ticbased, &d->timer, d->interval, d->doexists, d->dotranslucent, d->dolighting, d->docollision, d->doghostfade, d->exactalpha)) { // Finalize lighting, copypasta from P_AddFakeFloorFader diff --git a/src/p_spec.h b/src/p_spec.h index 2499ddcba..9e602b192 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -472,9 +472,9 @@ typedef struct INT16 destvalue; ///< Transparency value to fade to INT16 destlightlevel; ///< Light level to fade to INT16 speed; ///< Speed to fade by - INT32 duration; ///< Duration for tic-based logic, > -1 means use tic-based + boolean ticbased; ///< Tic-based logic toggle + INT32 timer; ///< Timer for tic-based logic UINT32 interval; ///< Skip interval for tic-based logic - tic_t firsttic; ///< First tic for tic-based logic boolean doexists; ///< Handle FF_EXISTS boolean dotranslucent; ///< Handle FF_TRANSLUCENT boolean dolighting; ///< Handle shadows and light blocks From ca0d6fd0c2f4741c098c7355242a907919a071b7 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 22:14:24 -0400 Subject: [PATCH 58/78] Fix fog visual glitch with fading --- src/p_spec.c | 58 ++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 1bc60cc71..0346bdd3d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7481,6 +7481,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo // initialize its alpha to 1 if (dotranslucent && (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->flags & FF_FOG) && // do not include fog !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES) && !(rover->flags & FF_RENDERALL)) @@ -7572,7 +7573,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo rover->target->moved = true; } - if (dotranslucent) + if (dotranslucent && !(rover->flags & FF_FOG)) { if (alpha >= 256) { @@ -7619,7 +7620,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo rover->flags |= FF_EXISTS; } - if (dotranslucent) + if (dotranslucent && !(rover->flags & FF_FOG)) { rover->flags |= FF_TRANSLUCENT; @@ -7667,32 +7668,35 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo } } - if (!stillfading || exactalpha) - rover->alpha = alpha; - else // clamp fadingdata->alpha to software's alpha levels + if (!(rover->flags & FF_FOG)) // don't set FOG alpha { - if (alpha < 12) - rover->alpha = destvalue < 12 ? destvalue : 1; // Don't even draw it - else if (alpha < 38) - rover->alpha = destvalue >= 12 && destvalue < 38 ? destvalue : 25; - else if (alpha < 64) - rover->alpha = destvalue >=38 && destvalue < 64 ? destvalue : 51; - else if (alpha < 89) - rover->alpha = destvalue >= 64 && destvalue < 89 ? destvalue : 76; - else if (alpha < 115) - rover->alpha = destvalue >= 89 && destvalue < 115 ? destvalue : 102; - else if (alpha < 140) - rover->alpha = destvalue >= 115 && destvalue < 140 ? destvalue : 128; - else if (alpha < 166) - rover->alpha = destvalue >= 140 && destvalue < 166 ? destvalue : 154; - else if (alpha < 192) - rover->alpha = destvalue >= 166 && destvalue < 192 ? destvalue : 179; - else if (alpha < 217) - rover->alpha = destvalue >= 192 && destvalue < 217 ? destvalue : 204; - else if (alpha < 243) - rover->alpha = destvalue >= 217 && destvalue < 243 ? destvalue : 230; - else // Opaque - rover->alpha = destvalue >= 243 ? destvalue : 256; + if (!stillfading || exactalpha) + rover->alpha = alpha; + else // clamp fadingdata->alpha to software's alpha levels + { + if (alpha < 12) + rover->alpha = destvalue < 12 ? destvalue : 1; // Don't even draw it + else if (alpha < 38) + rover->alpha = destvalue >= 12 && destvalue < 38 ? destvalue : 25; + else if (alpha < 64) + rover->alpha = destvalue >=38 && destvalue < 64 ? destvalue : 51; + else if (alpha < 89) + rover->alpha = destvalue >= 64 && destvalue < 89 ? destvalue : 76; + else if (alpha < 115) + rover->alpha = destvalue >= 89 && destvalue < 115 ? destvalue : 102; + else if (alpha < 140) + rover->alpha = destvalue >= 115 && destvalue < 140 ? destvalue : 128; + else if (alpha < 166) + rover->alpha = destvalue >= 140 && destvalue < 166 ? destvalue : 154; + else if (alpha < 192) + rover->alpha = destvalue >= 166 && destvalue < 192 ? destvalue : 179; + else if (alpha < 217) + rover->alpha = destvalue >= 192 && destvalue < 217 ? destvalue : 204; + else if (alpha < 243) + rover->alpha = destvalue >= 217 && destvalue < 243 ? destvalue : 230; + else // Opaque + rover->alpha = destvalue >= 243 ? destvalue : 256; + } } if (fadingdata) From 1c878ccce157adf8caf0713aefc93b5696b32f39 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 9 Sep 2018 23:52:36 -0400 Subject: [PATCH 59/78] Store sectornum/ffloornum as UINT32, not INT32 --- src/p_saveg.c | 8 ++++---- src/p_spec.c | 4 ++-- src/p_spec.h | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index a3790d6f0..24d0d699b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1587,8 +1587,8 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->sectornum); - WRITEINT32(save_p, ht->ffloornum); + WRITEUINT32(save_p, ht->sectornum); + WRITEUINT32(save_p, ht->ffloornum); WRITEINT32(save_p, ht->alpha); WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->destlightlevel); @@ -2599,8 +2599,8 @@ static inline void LoadFadeThinker(actionf_p1 thinker) { fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sectornum = READINT32(save_p); - ht->ffloornum = READINT32(save_p); + ht->sectornum = READUINT32(save_p); + ht->ffloornum = READUINT32(save_p); ht->alpha = READINT32(save_p); ht->destvalue = READINT16(save_p); ht->destlightlevel = READINT16(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 0346bdd3d..4cd9e5cb8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7729,8 +7729,8 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->thinker.function.acp1 = (actionf_p1)T_Fade; d->rover = rover; - d->sectornum = (INT32)sectornum; - d->ffloornum = (INT32)ffloornum; + d->sectornum = (UINT32)sectornum; + d->ffloornum = (UINT32)ffloornum; // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 diff --git a/src/p_spec.h b/src/p_spec.h index 9e602b192..b4577ff88 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -466,8 +466,8 @@ typedef struct { thinker_t thinker; ///< Thinker structure for effect. ffloor_t *rover; ///< Target ffloor - INT32 sectornum; ///< Number of ffloor target sector - INT32 ffloornum; ///< Number of ffloor of target sector + UINT32 sectornum; ///< Number of ffloor target sector + UINT32 ffloornum; ///< Number of ffloor of target sector INT32 alpha; ///< Internal alpha counter INT16 destvalue; ///< Transparency value to fade to INT16 destlightlevel; ///< Light level to fade to From 583262d073d5f5c003f5602752b3b1d18c974c0a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 10 Sep 2018 09:48:24 -0400 Subject: [PATCH 60/78] Add relative destvalue calc (ML_EFFECT4) * rover->alpha init fixes with invisible FOFs --- src/p_spec.c | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 4cd9e5cb8..713291e15 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -108,7 +108,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, UINT32 interval, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, - INT16 destvalue, INT16 speed, boolean ticbased, + INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); @@ -3357,6 +3357,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_AddFakeFloorFader(rover, secnum, j, destvalue, speed, (line->flags & ML_EFFECT5), // tic-based logic + (line->flags & ML_EFFECT4), // Relative destvalue !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -3365,10 +3366,20 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) else { + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + if (!(line->flags & ML_NOCLIMB) && // do translucent + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, - destvalue, 0, // set alpha immediately - false, NULL, 0, // tic-based logic + max(1, min(256, (line->flags & ML_EFFECT4) ? rover->alpha + destvalue : destvalue)), + 0, // set alpha immediately + false, NULL, 0, // tic-based logic !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -7710,6 +7721,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo * \param destvalue transparency value to fade to * \param speed speed to fade by * \param ticbased tic-based logic, speed = duration + * \param relative Destvalue is relative to rover->alpha * \param doexists handle FF_EXISTS * \param dotranslucent handle FF_TRANSLUCENT * \param dolighting fade FOF light @@ -7718,20 +7730,9 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo * \param exactalpha use exact alpha values (opengl) */ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, - INT16 destvalue, INT16 speed, boolean ticbased, + INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { - // already equal, nothing to do - if (rover->alpha == max(1, min(256, destvalue))) - return; - - fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - - d->thinker.function.acp1 = (actionf_p1)T_Fade; - d->rover = rover; - d->sectornum = (UINT32)sectornum; - d->ffloornum = (UINT32)ffloornum; - // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 if (dotranslucent && @@ -7741,8 +7742,19 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor !(rover->flags & FF_RENDERALL)) rover->alpha = 1; + // already equal, nothing to do + if (rover->alpha == max(1, min(256, relative ? rover->alpha + destvalue : destvalue))) + return; + + fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); + + d->thinker.function.acp1 = (actionf_p1)T_Fade; + d->rover = rover; + d->sectornum = (UINT32)sectornum; + d->ffloornum = (UINT32)ffloornum; + d->alpha = rover->alpha; - d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 + d->destvalue = max(1, min(256, relative ? rover->alpha + destvalue : destvalue)); // ffloor->alpha is 1-256 if (ticbased) { From fe813bff478286b8ec55f469ab7e717a166581a2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 10 Sep 2018 09:49:52 -0400 Subject: [PATCH 61/78] Add distance-based params and make default (ML_DONTPEGBOTTOM to use back offsets) --- src/p_spec.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 713291e15..0afb267df 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3322,8 +3322,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 452: // Fade FOF { - INT16 destvalue = (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS); - INT16 speed = (INT16)(sides[line->sidenum[1]].rowoffset>>FRACBITS); + INT16 destvalue = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? + (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); + INT16 speed = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? + (INT16)(sides[line->sidenum[1]].rowoffset>>FRACBITS) : (INT16)(abs(line->dy)>>FRACBITS); INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible in @@ -3355,7 +3357,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (speed > 0) P_AddFakeFloorFader(rover, secnum, j, - destvalue, speed, + destvalue, + speed, (line->flags & ML_EFFECT5), // tic-based logic (line->flags & ML_EFFECT4), // Relative destvalue !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS From eb7a5fc0cf3307d0bc16be7d5eb0f2c5a1603b3e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 10 Sep 2018 10:09:02 -0400 Subject: [PATCH 62/78] Add type 452 Set FOF Alpha * Fade FOF moved to type 453 * Stop Fade FOF moved to type 454 --- src/p_spec.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 0afb267df..fe742457e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3320,7 +3320,63 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; } - case 452: // Fade FOF + case 452: // Set FOF alpha + { + INT16 destvalue = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? + (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to operate + + for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (rover->master->frontsector->tag == foftag) + break; + } + + if (!rover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + // for relative alpha calc + if (!(line->flags & ML_NOCLIMB) && // do translucent + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + + P_RemoveFakeFloorFader(rover); + P_FadeFakeFloor(rover, + max(1, min(256, (line->flags & ML_EFFECT4) ? rover->alpha + destvalue : destvalue)), + 0, // set alpha immediately + false, NULL, 0, // tic-based logic + false, // do not handle FF_EXISTS + true, // handle FF_TRANSLUCENT + false, // do not handle lighting + false, // do not handle collision + false, // do not do ghost fade (no collision during fade) + true); // use exact alpha values (for opengl) + } + break; + } + + case 453: // Fade FOF { INT16 destvalue = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); @@ -3338,7 +3394,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!sec->ffloors) { - CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Target sector #%d has no FOFs.\n", secnum); + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Target sector #%d has no FOFs.\n", secnum); return; } @@ -3351,7 +3407,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!rover) { - CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Can't find a FOF control sector with tag %d\n", foftag); + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Can't find a FOF control sector with tag %d\n", foftag); return; } @@ -3371,6 +3427,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 + // for relative alpha calc if (!(line->flags & ML_NOCLIMB) && // do translucent (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE !(rover->spawnflags & FF_RENDERSIDES) && @@ -3394,7 +3451,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; } - case 453: // Stop fading FOF + case 454: // Stop fading FOF { INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); @@ -3407,7 +3464,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!sec->ffloors) { - CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Target sector #%d has no FOFs.\n", secnum); + CONS_Debug(DBG_GAMELOGIC, "Line type 454 Executor: Target sector #%d has no FOFs.\n", secnum); return; } @@ -3419,7 +3476,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!rover) { - CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Can't find a FOF control sector with tag %d\n", foftag); + CONS_Debug(DBG_GAMELOGIC, "Line type 454 Executor: Can't find a FOF control sector with tag %d\n", foftag); return; } From 88e22b73a917b5d9112c72cd53b75e8adcc31d59 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 10 Sep 2018 10:11:27 -0400 Subject: [PATCH 63/78] Default to using back offset params if back linedef exists; else fallback to distance-based params --- src/p_spec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index fe742457e..f5915b4d6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3322,8 +3322,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 452: // Set FOF alpha { - INT16 destvalue = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? - (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); + INT16 destvalue = line->sidenum[1] != 0xffff ? + (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(P_AproxDistance(line->dx, line->dy)>>FRACBITS); INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible in @@ -3378,9 +3378,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 453: // Fade FOF { - INT16 destvalue = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? + INT16 destvalue = line->sidenum[1] != 0xffff ? (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); - INT16 speed = (line->flags & ML_DONTPEGBOTTOM) && line->sidenum[1] != 0xffff ? + INT16 speed = line->sidenum[1] != 0xffff ? (INT16)(sides[line->sidenum[1]].rowoffset>>FRACBITS) : (INT16)(abs(line->dy)>>FRACBITS); INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); From 38a63c5d8f00990c690b613ab6a2eb40ad10f56b Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 10 Sep 2018 10:17:39 -0400 Subject: [PATCH 64/78] Use ML_NOCLIMB for FF_TRANSLUCENT handling in type 452 --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index f5915b4d6..f397f5b75 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3367,7 +3367,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) 0, // set alpha immediately false, NULL, 0, // tic-based logic false, // do not handle FF_EXISTS - true, // handle FF_TRANSLUCENT + !(line->flags & ML_NOCLIMB), // handle FF_TRANSLUCENT false, // do not handle lighting false, // do not handle collision false, // do not do ghost fade (no collision during fade) From fc6b599bbcb1ac99466b6883b7e9c9e218a91fa9 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 10 Sep 2018 12:00:15 -0400 Subject: [PATCH 65/78] Move tic-based to EFFECT4, relative calc to EFFECT3 --- src/p_spec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index f397f5b75..3a27cd987 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3363,7 +3363,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, - max(1, min(256, (line->flags & ML_EFFECT4) ? rover->alpha + destvalue : destvalue)), + max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), 0, // set alpha immediately false, NULL, 0, // tic-based logic false, // do not handle FF_EXISTS @@ -3415,8 +3415,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_AddFakeFloorFader(rover, secnum, j, destvalue, speed, - (line->flags & ML_EFFECT5), // tic-based logic - (line->flags & ML_EFFECT4), // Relative destvalue + (line->flags & ML_EFFECT4), // tic-based logic + (line->flags & ML_EFFECT3), // Relative destvalue !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -3437,7 +3437,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, - max(1, min(256, (line->flags & ML_EFFECT4) ? rover->alpha + destvalue : destvalue)), + max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), 0, // set alpha immediately false, NULL, 0, // tic-based logic !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS From 31ee9df9b99f17565fd2e794a85d01d8b48ecd32 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 11 Sep 2018 10:28:24 -0400 Subject: [PATCH 66/78] Use percentage calc instead of interval decrement for tic-based fading --- src/p_saveg.c | 4 ++-- src/p_spec.c | 41 ++++++++++++++++++++++++----------------- src/p_spec.h | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index cafd05ea3..5550c7a8b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1590,12 +1590,12 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEUINT32(save_p, ht->sectornum); WRITEUINT32(save_p, ht->ffloornum); WRITEINT32(save_p, ht->alpha); + WRITEINT16(save_p, ht->sourcevalue); WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->destlightlevel); WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, (UINT8)ht->ticbased); WRITEINT32(save_p, ht->timer); - WRITEUINT32(save_p, ht->interval); WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dolighting); @@ -2602,12 +2602,12 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->sectornum = READUINT32(save_p); ht->ffloornum = READUINT32(save_p); ht->alpha = READINT32(save_p); + ht->sourcevalue = READINT16(save_p); ht->destvalue = READINT16(save_p); ht->destlightlevel = READINT16(save_p); ht->speed = READINT16(save_p); ht->ticbased = (boolean)READUINT8(save_p); ht->timer = READINT32(save_p); - ht->interval = READUINT32(save_p); ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); ht->dolighting = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 8d42ef575..cd63191c9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -105,7 +105,7 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, UINT32 interval, +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, @@ -3363,9 +3363,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, + rover->alpha, max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), 0, // set alpha immediately - false, NULL, 0, // tic-based logic + false, NULL, // tic-based logic false, // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // handle FF_TRANSLUCENT false, // do not handle lighting @@ -3437,9 +3438,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, + rover->alpha, max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), 0, // set alpha immediately - false, NULL, 0, // tic-based logic + false, NULL, // tic-based logic !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting @@ -7513,13 +7515,13 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz { if (finalize) P_FadeFakeFloor(rover, + fadingdata->sourcevalue, fadingdata->alpha >= fadingdata->destvalue ? fadingdata->alpha - 1 : // trigger fade-out finish fadingdata->alpha + 1, // trigger fade-in finish 0, fadingdata->ticbased, &fadingdata->timer, - fadingdata->interval, fadingdata->doexists, fadingdata->dotranslucent, fadingdata->docollision, @@ -7538,7 +7540,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz } } -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, UINT32 interval, +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) { boolean stillfading = false; @@ -7592,8 +7594,12 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo { if (!ticbased) alpha -= speed; - else if (ticbased && !((*timer) % interval)) - alpha = max(alpha - speed, destvalue); + else + { + INT16 delta = abs(destvalue - sourcevalue); + fixed_t factor = min(FixedDiv(speed - (*timer), speed), 1*FRACUNIT); + alpha = max(min(alpha, sourcevalue - (INT16)FixedMul(delta, factor)), destvalue); + } stillfading = true; } } @@ -7601,7 +7607,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo { // finish fading in if (speed < 1 || (!ticbased && alpha + speed >= destvalue - speed) || - (ticbased && (--(*timer) <= 0|| alpha >= destvalue))) + (ticbased && (--(*timer) <= 0 || alpha >= destvalue))) { alpha = destvalue; @@ -7623,8 +7629,12 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed, bo { if (!ticbased) alpha += speed; - else if (ticbased && !((*timer) % interval)) - alpha = min(alpha + speed, destvalue); + else + { + INT16 delta = abs(destvalue - sourcevalue); + fixed_t factor = min(FixedDiv(speed - (*timer), speed), 1*FRACUNIT); + alpha = min(max(alpha, sourcevalue + (INT16)FixedMul(delta, factor)), destvalue); + } stillfading = true; } } @@ -7813,22 +7823,19 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->sectornum = (UINT32)sectornum; d->ffloornum = (UINT32)ffloornum; - d->alpha = rover->alpha; + d->alpha = d->sourcevalue = rover->alpha; d->destvalue = max(1, min(256, relative ? rover->alpha + destvalue : destvalue)); // ffloor->alpha is 1-256 if (ticbased) { d->ticbased = true; - d->timer = abs(speed); - d->speed = max(abs(FixedFloor(FixedDiv(d->destvalue - d->alpha, d->timer))/FRACUNIT), 1); - d->interval = max(FixedFloor(FixedDiv(d->timer, abs(d->destvalue - d->alpha)))/FRACUNIT, 1); + d->timer = d->speed = abs(speed); // use d->speed as total duration } else { - d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->ticbased = false; + d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker d->timer = -1; - d->interval = 0; } d->doexists = doexists; @@ -7872,7 +7879,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor */ void T_Fade(fade_t *d) { - if (d->rover && !P_FadeFakeFloor(d->rover, d->destvalue, d->speed, d->ticbased, &d->timer, d->interval, + if (d->rover && !P_FadeFakeFloor(d->rover, d->sourcevalue, d->destvalue, d->speed, d->ticbased, &d->timer, d->doexists, d->dotranslucent, d->dolighting, d->docollision, d->doghostfade, d->exactalpha)) { // Finalize lighting, copypasta from P_AddFakeFloorFader diff --git a/src/p_spec.h b/src/p_spec.h index 25f6218dd..1970aeb6b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -469,12 +469,12 @@ typedef struct UINT32 sectornum; ///< Number of ffloor target sector UINT32 ffloornum; ///< Number of ffloor of target sector INT32 alpha; ///< Internal alpha counter + INT16 sourcevalue; ///< Transparency value to fade from INT16 destvalue; ///< Transparency value to fade to INT16 destlightlevel; ///< Light level to fade to INT16 speed; ///< Speed to fade by boolean ticbased; ///< Tic-based logic toggle INT32 timer; ///< Timer for tic-based logic - UINT32 interval; ///< Skip interval for tic-based logic boolean doexists; ///< Handle FF_EXISTS boolean dotranslucent; ///< Handle FF_TRANSLUCENT boolean dolighting; ///< Handle shadows and light blocks From 59b7a64eaf46dfe043b38687994cda4ed8c17ad7 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Wed, 12 Sep 2018 12:40:56 -0400 Subject: [PATCH 67/78] P_ResetFakeFloorFader: Argument order error with dolighting --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index cd63191c9..56c10a4a1 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7524,8 +7524,8 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz &fadingdata->timer, fadingdata->doexists, fadingdata->dotranslucent, - fadingdata->docollision, fadingdata->dolighting, + fadingdata->docollision, fadingdata->doghostfade, fadingdata->exactalpha); rover->alpha = fadingdata->alpha; From 3d03964bb9454a51220a326865feb5358603e8d8 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Wed, 12 Sep 2018 16:57:35 -0400 Subject: [PATCH 68/78] Fade FOF colormap support --- src/p_saveg.c | 4 +++ src/p_spec.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++---- src/p_spec.h | 2 ++ 3 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 5550c7a8b..0f81da5ac 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1587,6 +1587,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; WRITEUINT8(save_p, type); + SaveExtraColormap(save_p, ht->dest_exc); WRITEUINT32(save_p, ht->sectornum); WRITEUINT32(save_p, ht->ffloornum); WRITEINT32(save_p, ht->alpha); @@ -1599,6 +1600,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, ht->doexists); WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dolighting); + WRITEUINT8(save_p, ht->docolormap); WRITEUINT8(save_p, ht->docollision); WRITEUINT8(save_p, ht->doghostfade); WRITEUINT8(save_p, ht->exactalpha); @@ -2599,6 +2601,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) { fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; + ht->dest_exc = LoadExtraColormap(save_p); ht->sectornum = READUINT32(save_p); ht->ffloornum = READUINT32(save_p); ht->alpha = READINT32(save_p); @@ -2611,6 +2614,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->doexists = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p); ht->dolighting = READUINT8(save_p); + ht->docolormap = READUINT8(save_p); ht->docollision = READUINT8(save_p); ht->doghostfade = READUINT8(save_p); ht->exactalpha = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 56c10a4a1..c37ee954c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -106,10 +106,15 @@ static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t o static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha); static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha); + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha); +static void P_ResetColormapFader(sector_t *sector); +static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, extracolormap_t *dest_exc, + INT32 duration); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); @@ -3370,6 +3375,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) false, // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // handle FF_TRANSLUCENT false, // do not handle lighting + false, // do not handle colormap false, // do not handle collision false, // do not do ghost fade (no collision during fade) true); // use exact alpha values (for opengl) @@ -3421,6 +3427,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting + !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) !(line->flags & ML_BOUNCY), // do not handle collision (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) @@ -3445,6 +3452,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_EFFECT2), // do not handle lighting + !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) !(line->flags & ML_BOUNCY), // do not handle collision (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) @@ -7525,6 +7533,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz fadingdata->doexists, fadingdata->dotranslucent, fadingdata->dolighting, + fadingdata->docolormap, fadingdata->docollision, fadingdata->doghostfade, fadingdata->exactalpha); @@ -7533,6 +7542,9 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz if (fadingdata->dolighting) P_RemoveLighting(§ors[rover->secnum]); + if (fadingdata->docolormap) + P_ResetColormapFader(§ors[rover->secnum]); + P_RemoveThinker(&fadingdata->thinker); } @@ -7541,7 +7553,8 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz } static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha) { boolean stillfading = false; INT32 alpha; @@ -7801,7 +7814,8 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destval */ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha) { // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 @@ -7841,6 +7855,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor d->doexists = doexists; d->dotranslucent = dotranslucent; d->dolighting = dolighting; + d->docolormap = docolormap; d->docollision = docollision; d->doghostfade = doghostfade; d->exactalpha = exactalpha; @@ -7869,6 +7884,54 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor else d->destlightlevel = -1; + // Set a separate thinker for colormap fading + if (docolormap && !(rover->flags & FF_NOSHADE) && sectors[rover->secnum].spawn_extra_colormap) + { + extracolormap_t *dest_exc, + *source_exc = sectors[rover->secnum].extra_colormap ? sectors[rover->secnum].extra_colormap : R_GetDefaultColormap(); + + INT32 colordelta = R_GetRgbaA(sectors[rover->secnum].spawn_extra_colormap->rgba); // alpha is from 0 + fixed_t alphapercent = min(FixedDiv(d->destvalue, rover->spawnalpha), 1*FRACUNIT); // don't make darker than spawn_lightlevel + fixed_t adjustedcolordelta = FixedMul(colordelta, alphapercent); + INT32 coloralpha; + + coloralpha = adjustedcolordelta; + + dest_exc = R_CopyColormap(sectors[rover->secnum].spawn_extra_colormap, false); + dest_exc->rgba = R_GetRgbaRGB(dest_exc->rgba) + R_PutRgbaA(coloralpha); + + if (!(d->dest_exc = R_GetColormapFromList(dest_exc))) + { + dest_exc->colormap = R_CreateLightTable(dest_exc); + R_AddColormapToList(dest_exc); + d->dest_exc = dest_exc; + } + else + Z_Free(dest_exc); + + // If fading from 0, set source_exc rgb same to dest_exc + if (!R_CheckDefaultColormap(d->dest_exc, true, false, false) + && R_CheckDefaultColormap(source_exc, true, false, false)) + { + extracolormap_t *exc = R_CopyColormap(source_exc, false); + exc->rgba = R_GetRgbaRGB(d->dest_exc->rgba) + R_PutRgbaA(R_GetRgbaA(source_exc->rgba)); + exc->fadergba = R_GetRgbaRGB(d->dest_exc->rgba) + R_PutRgbaA(R_GetRgbaA(source_exc->fadergba)); + + if (!(source_exc = R_GetColormapFromList(exc))) + { + exc->colormap = R_CreateLightTable(exc); + R_AddColormapToList(exc); + source_exc = exc; + } + else + Z_Free(exc); + } + + Add_ColormapFader(§ors[rover->secnum], source_exc, d->dest_exc, + ticbased ? d->timer : + FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT); + } + P_AddThinker(&d->thinker); } @@ -7880,12 +7943,16 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor void T_Fade(fade_t *d) { if (d->rover && !P_FadeFakeFloor(d->rover, d->sourcevalue, d->destvalue, d->speed, d->ticbased, &d->timer, - d->doexists, d->dotranslucent, d->dolighting, d->docollision, d->doghostfade, d->exactalpha)) + d->doexists, d->dotranslucent, d->dolighting, d->docolormap, d->docollision, d->doghostfade, d->exactalpha)) { // Finalize lighting, copypasta from P_AddFakeFloorFader if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1) sectors[d->rover->secnum].lightlevel = d->destlightlevel; + // Finalize colormap + if (d->docolormap && !(d->rover->flags & FF_NOSHADE) && sectors[d->rover->secnum].spawn_extra_colormap) + sectors[d->rover->secnum].extra_colormap = d->dest_exc; + P_RemoveFakeFloorFader(d->rover); } } diff --git a/src/p_spec.h b/src/p_spec.h index 1970aeb6b..189823435 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -466,6 +466,7 @@ typedef struct { thinker_t thinker; ///< Thinker structure for effect. ffloor_t *rover; ///< Target ffloor + extracolormap_t *dest_exc; ///< Colormap to fade to UINT32 sectornum; ///< Number of ffloor target sector UINT32 ffloornum; ///< Number of ffloor of target sector INT32 alpha; ///< Internal alpha counter @@ -478,6 +479,7 @@ typedef struct boolean doexists; ///< Handle FF_EXISTS boolean dotranslucent; ///< Handle FF_TRANSLUCENT boolean dolighting; ///< Handle shadows and light blocks + boolean docolormap; ///< Handle colormaps boolean docollision; ///< Handle interactive flags boolean doghostfade; ///< No interactive flags during fading boolean exactalpha; ///< Use exact alpha values (opengl) From 95aeb78550806b6c485d6d45065b91d0f634ca58 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 15 Sep 2018 01:04:15 -0400 Subject: [PATCH 69/78] 453: Mixed D+C fixes; unused param cast in P_FadeFakeFloor --- src/p_saveg.c | 3 ++- src/p_spec.c | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 5b1cc5b27..7d6215643 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2621,6 +2621,7 @@ static inline void LoadDisappearThinker(actionf_p1 thinker) // static inline void LoadFadeThinker(actionf_p1 thinker) { + sector_t *ss; fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; ht->dest_exc = LoadExtraColormap(save_p); @@ -2641,7 +2642,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) ht->doghostfade = READUINT8(save_p); ht->exactalpha = READUINT8(save_p); - sector_t *ss = LoadSector(ht->sectornum); + ss = LoadSector(ht->sectornum); if (ss) { size_t j = 0; // ss->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc diff --git a/src/p_spec.c b/src/p_spec.c index 87146ab54..30eb393dd 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7574,6 +7574,7 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destval boolean stillfading = false; INT32 alpha; fade_t *fadingdata = (fade_t *)rover->fadingdata; + (void)docolormap; // *shrug* maybe we can use this in the future. For now, let's be consistent with our other function params if (rover->master->special == 258) // Laser block return false; @@ -7832,6 +7833,8 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, boolean docollision, boolean doghostfade, boolean exactalpha) { + fade_t *d; + // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 if (dotranslucent && @@ -7845,7 +7848,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor if (rover->alpha == max(1, min(256, relative ? rover->alpha + destvalue : destvalue))) return; - fade_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); + d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); d->thinker.function.acp1 = (actionf_p1)T_Fade; d->rover = rover; From a19c44d21f76e897678dd9fd1012b322484ee486 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 15 Sep 2018 02:15:37 -0400 Subject: [PATCH 70/78] 453: P_ResetFakeFloorFader stray & address if condition --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 30eb393dd..bb464c0dc 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7534,7 +7534,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz // find any existing thinkers and remove them, then replace with new data if (fadingdata != data) { - if (&fadingdata->thinker) + if (fadingdata->thinker) { if (finalize) P_FadeFakeFloor(rover, From e01fd1f3a36308328dcf60be292b884fd772d785 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 15 Sep 2018 02:24:44 -0400 Subject: [PATCH 71/78] 453: Try ResetFakeFloorFader if condition again --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index bb464c0dc..8cbe2e369 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7534,7 +7534,7 @@ static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finaliz // find any existing thinkers and remove them, then replace with new data if (fadingdata != data) { - if (fadingdata->thinker) + if (fadingdata) { if (finalize) P_FadeFakeFloor(rover, From 3ce5362a1de0655fbb54e0249bb8bf67f0decd33 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 15 Sep 2018 20:34:19 -0400 Subject: [PATCH 72/78] 453: Extra parameter for Add_ColormapFader --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 8cbe2e369..b5607e2b2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7945,7 +7945,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor Z_Free(exc); } - Add_ColormapFader(§ors[rover->secnum], source_exc, d->dest_exc, + Add_ColormapFader(§ors[rover->secnum], source_exc, d->dest_exc, true, ticbased ? d->timer : FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT); } From 70a672229c97add10297934784cbcc528015d587 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 17 Sep 2018 00:34:03 -0400 Subject: [PATCH 73/78] 453: Use new colormap netsync for fade FOF thinker --- src/p_saveg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index f57b44817..f4f698d4f 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1609,7 +1609,7 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; WRITEUINT8(save_p, type); - SaveExtraColormap(save_p, ht->dest_exc); + WRITEUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); WRITEUINT32(save_p, ht->sectornum); WRITEUINT32(save_p, ht->ffloornum); WRITEINT32(save_p, ht->alpha); @@ -2624,7 +2624,7 @@ static inline void LoadFadeThinker(actionf_p1 thinker) sector_t *ss; fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->dest_exc = LoadExtraColormap(save_p); + ht->dest_exc = GetNetColormapFromList(READUINT32(save_p)); ht->sectornum = READUINT32(save_p); ht->ffloornum = READUINT32(save_p); ht->alpha = READINT32(save_p); From 2fac7c36ade42b1f45b38ed10e7606b2b2178b8c Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 17 Sep 2018 21:03:51 -0400 Subject: [PATCH 74/78] 453: Don't interrupt current FOF fade unless EFFECT5 --- src/p_spec.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index b5607e2b2..e53d386cf 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3403,7 +3403,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 destvalue = line->sidenum[1] != 0xffff ? (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); INT16 speed = line->sidenum[1] != 0xffff ? - (INT16)(sides[line->sidenum[1]].rowoffset>>FRACBITS) : (INT16)(abs(line->dy)>>FRACBITS); + (INT16)(abs(sides[line->sidenum[1]].rowoffset>>FRACBITS)) : (INT16)(abs(line->dy)>>FRACBITS); INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible in @@ -3433,6 +3433,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) return; } + // Prevent continuous execs from interfering on an existing fade + if (!(line->flags & ML_EFFECT5) + && rover->fadingdata) + continue; + if (speed > 0) P_AddFakeFloorFader(rover, secnum, j, destvalue, From dfaf0b00d4b6d583f0f3e58f5b030fcc8e9b3e84 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 18 Sep 2018 05:50:14 -0400 Subject: [PATCH 75/78] 453: Commented out, but allow existing fade overlap of 2 tics (or speed*2) --- src/p_spec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index e53d386cf..5a42cefed 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3436,7 +3436,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // Prevent continuous execs from interfering on an existing fade if (!(line->flags & ML_EFFECT5) && rover->fadingdata) + //&& ((fade_t*)rover->fadingdata)->timer > (ticbased ? 2 : speed*2)) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Fade FOF thinker already exists, timer: %d", ((fade_t*)rover->fadingdata)->timer); continue; + } if (speed > 0) P_AddFakeFloorFader(rover, secnum, j, From aa9da189a6cb17a3aaa4d2073dd7f6c0390dde01 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 18 Sep 2018 07:07:46 -0400 Subject: [PATCH 76/78] 453: A line break --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 5a42cefed..06ef4839b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3438,7 +3438,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) && rover->fadingdata) //&& ((fade_t*)rover->fadingdata)->timer > (ticbased ? 2 : speed*2)) { - CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Fade FOF thinker already exists, timer: %d", ((fade_t*)rover->fadingdata)->timer); + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Fade FOF thinker already exists, timer: %d\n", ((fade_t*)rover->fadingdata)->timer); continue; } From eb307a4066c0e657d85be742c9923301b3059e24 Mon Sep 17 00:00:00 2001 From: Digiku Date: Wed, 19 Sep 2018 10:45:51 -0400 Subject: [PATCH 77/78] Nights intermission dehacked: a comment --- src/dehacked.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index 1f56210ac..ae1be6da2 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1199,7 +1199,7 @@ static void readlevelheader(MYFILE *f, INT32 num) else if (fastcmp(word2, "NIGHTS")) i = 3; else if (fastcmp(word2, "NIGHTSLINK")) i = 4; - if (i >= -1 && i <= 4) // -1 for no bonus. Max is 3. + if (i >= -1 && i <= 4) // -1 for no bonus. Max is 4. mapheaderinfo[num-1]->bonustype = (SINT8)i; else deh_warning("Level header %d: invalid bonus type number %d", num, i); From 96f61d8ae6f3ce120493f716dbbe442404693832 Mon Sep 17 00:00:00 2001 From: Digiku Date: Wed, 19 Sep 2018 10:53:11 -0400 Subject: [PATCH 78/78] Nights intermission bonus y_inter.c: A comment --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index 2c77a577a..45ecd49e6 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1945,7 +1945,7 @@ static void Y_AwardSpecialStageBonus(void) if (!playeringame[i] || players[i].lives < 1) // not active or game over Y_SetNullBonus(&players[i], &localbonus); - else if (maptol & TOL_NIGHTS) // Link instead of Rings + else if (maptol & TOL_NIGHTS) // Mare score instead of Rings Y_SetNightsBonus(&players[i], &localbonus); else Y_SetRingBonus(&players[i], &localbonus);