Added tic-based logic to FOF fade (ML_EFFECT5)

This commit is contained in:
mazmazz 2018-09-09 19:31:32 -04:00
parent 80a4a03f8e
commit c3c4a251f1
3 changed files with 51 additions and 11 deletions

View file

@ -1593,6 +1593,9 @@ static void SaveFadeThinker(const thinker_t *th, const UINT8 type)
WRITEINT16(save_p, ht->destvalue); WRITEINT16(save_p, ht->destvalue);
WRITEINT16(save_p, ht->destlightlevel); WRITEINT16(save_p, ht->destlightlevel);
WRITEINT16(save_p, ht->speed); 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->doexists);
WRITEUINT8(save_p, ht->dotranslucent); WRITEUINT8(save_p, ht->dotranslucent);
WRITEUINT8(save_p, ht->dolighting); WRITEUINT8(save_p, ht->dolighting);
@ -2602,6 +2605,9 @@ static inline void LoadFadeThinker(actionf_p1 thinker)
ht->destvalue = READINT16(save_p); ht->destvalue = READINT16(save_p);
ht->destlightlevel = READINT16(save_p); ht->destlightlevel = READINT16(save_p);
ht->speed = 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->doexists = READUINT8(save_p);
ht->dotranslucent = READUINT8(save_p); ht->dotranslucent = READUINT8(save_p);
ht->dolighting = READUINT8(save_p); ht->dolighting = READUINT8(save_p);

View file

@ -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 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); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize);
#define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); #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); 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, 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); 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_AddBlockThinker(sector_t *sec, line_t *sourceline);
static void P_AddFloatThinker(sector_t *sec, INT32 tag, 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) if (speed > 0)
P_AddFakeFloorFader(rover, secnum, j, P_AddFakeFloorFader(rover, secnum, j,
destvalue, speed, destvalue, speed,
(line->flags & ML_EFFECT5), // tic-based logic
!(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS
!(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT
!(line->flags & ML_EFFECT2), // do not handle lighting !(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_RemoveFakeFloorFader(rover);
P_FadeFakeFloor(rover, P_FadeFakeFloor(rover,
destvalue, 0, // set alpha immediately destvalue, 0, // set alpha immediately
-1, 0, 0, // tic-based logic
!(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS
!(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT
!(line->flags & ML_EFFECT2), // do not handle lighting !(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-out finish
fadingdata->alpha + 1, // trigger fade-in finish fadingdata->alpha + 1, // trigger fade-in finish
0, 0,
fadingdata->duration,
fadingdata->interval,
fadingdata->firsttic,
fadingdata->doexists, fadingdata->doexists,
fadingdata->dotranslucent, fadingdata->dotranslucent,
fadingdata->docollision, 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 doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha)
{ {
boolean ticbased = (duration > -1);
boolean stillfading = false; boolean stillfading = false;
INT32 alpha; INT32 alpha;
fade_t *fadingdata = (fade_t *)rover->fadingdata; 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 else if (alpha > destvalue) // fade out
{ {
// finish fading 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; alpha = destvalue;
@ -7512,14 +7519,18 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed,
} }
else // continue fading out else // continue fading out
{ {
if (!ticbased)
alpha -= speed; alpha -= speed;
else if (ticbased && !((gametic - firsttic) % interval))
alpha = max(alpha - speed, destvalue);
stillfading = true; stillfading = true;
} }
} }
else // fade in else // fade in
{ {
// finish fading 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; alpha = destvalue;
@ -7539,7 +7550,10 @@ static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 destvalue, INT16 speed,
} }
else // continue fading in else // continue fading in
{ {
if (!ticbased)
alpha += speed; alpha += speed;
else if (ticbased && !((gametic - firsttic) % interval))
alpha = min(alpha + speed, destvalue);
stillfading = true; 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 destvalue transparency value to fade to
* \param speed speed to fade by * \param speed speed to fade by
* \param ticbased tic-based logic, speed = duration
* \param doexists handle FF_EXISTS * \param doexists handle FF_EXISTS
* \param dotranslucent handle FF_TRANSLUCENT * \param dotranslucent handle FF_TRANSLUCENT
* \param dolighting fade FOF light * \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) * \param exactalpha use exact alpha values (opengl)
*/ */
static void P_AddFakeFloorFader(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, INT16 destvalue, INT16 speed, boolean ticbased,
boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha) boolean doexists, boolean dotranslucent, boolean dolighting, boolean docollision, boolean doghostfade, boolean exactalpha)
{ {
// already equal, nothing to do // 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->alpha = rover->alpha;
d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256 d->destvalue = max(1, min(256, destvalue)); // ffloor->alpha is 1-256
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->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->doexists = doexists;
d->dotranslucent = dotranslucent; d->dotranslucent = dotranslucent;
d->dolighting = dolighting; d->dolighting = dolighting;
@ -7750,6 +7779,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor
P_FadeLightBySector(&sectors[rover->secnum], P_FadeLightBySector(&sectors[rover->secnum],
d->destlightlevel, d->destlightlevel,
ticbased ? d->duration :
FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT,
true); true);
} }
@ -7766,7 +7796,8 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor
*/ */
void T_Fade(fade_t *d) 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 // Finalize lighting, copypasta from P_AddFakeFloorFader
if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1) if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1)

View file

@ -472,6 +472,9 @@ typedef struct
INT16 destvalue; ///< Transparency value to fade to INT16 destvalue; ///< Transparency value to fade to
INT16 destlightlevel; ///< Light level to fade to INT16 destlightlevel; ///< Light level to fade to
INT16 speed; ///< Speed to fade by 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 doexists; ///< Handle FF_EXISTS
boolean dotranslucent; ///< Handle FF_TRANSLUCENT boolean dotranslucent; ///< Handle FF_TRANSLUCENT
boolean dolighting; ///< Handle shadows and light blocks boolean dolighting; ///< Handle shadows and light blocks