From 3e8d264a2d4b14ad6ed43f379e2af2ddc7d3965b Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 31 Mar 2018 00:40:41 -0400 Subject: [PATCH 1/9] 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 cd7573550b99d76fbdf03d21f717bf7f7583e9ad Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 31 Mar 2018 01:15:24 -0400 Subject: [PATCH 2/9] 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 73e4cab1e48b84e5a31b45a69f1323feb126b234 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 6 Apr 2018 22:34:45 -0400 Subject: [PATCH 3/9] 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 afa0aae131ff2bfce85fa047b943d5990fbdcb30 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Fri, 6 Apr 2018 23:14:48 -0400 Subject: [PATCH 4/9] 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 27ca70d06968f4d6faf62c30472f0d3d00c90510 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 7 Apr 2018 05:52:01 -0400 Subject: [PATCH 5/9] 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 bd6276a39ec2210776a80a333c897fbd46648561 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 7 Apr 2018 07:09:04 -0400 Subject: [PATCH 6/9] 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 004cbe6a3d90b6391d38537bb144da51c0818168 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 13 Aug 2018 22:10:16 -0400 Subject: [PATCH 7/9] 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 841c31a6ba9fc81a418abf14c0d00536b237d4e2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 13 Aug 2018 22:17:58 -0400 Subject: [PATCH 8/9] 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 931297e2d72d56f57d9179624f30f37f1606d3a9 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 14 Aug 2018 10:18:08 -0400 Subject: [PATCH 9/9] 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);