The thinker is entirely unified now, and there is no difference in the light levels between the "old" behavior and this one now.

This commit is contained in:
Nev3r 2018-09-15 12:21:25 +02:00
parent d939e597a5
commit 350cd1435b
3 changed files with 28 additions and 29 deletions

View file

@ -355,17 +355,21 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean
ll->sourcelevel = sector->lightlevel; ll->sourcelevel = sector->lightlevel;
ll->destlevel = destvalue; ll->destlevel = destvalue;
ll->fixedcurlevel = sector->lightlevel<<FRACBITS;
if (ticbased) if (ticbased)
{ {
ll->ticbased = true; // Speed means duration.
ll->timer = ll->duration = abs(speed); // speed means duration ll->timer = abs(speed);
ll->fixedpertic = FixedDiv((destvalue<<FRACBITS) - ll->fixedcurlevel, speed<<FRACBITS);
} }
else else
{ {
ll->ticbased = false; // Speed means increment per tic (literally speed).
ll->timer = abs(ll->destlevel - ll->sourcelevel); ll->timer = FixedDiv((destvalue<<FRACBITS) - ll->fixedcurlevel, speed<<FRACBITS)>>FRACBITS;
ll->duration = abs(speed); // ll->duration is used as speed ll->fixedpertic = speed<<FRACBITS;
} }
CONS_Printf("Light level %d - %d, speed aprox. %d, tics %d, revised new thinker\n", ll->sector->lightlevel, destvalue, ll->fixedpertic>>FRACBITS, ll->timer);
} }
void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased)
@ -383,20 +387,15 @@ void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased)
*/ */
void T_LightFade(lightlevel_t *ll) void T_LightFade(lightlevel_t *ll)
{ {
if ((ll->ticbased && --ll->timer <= 0) if (--ll->timer <= 0)
|| (!ll->ticbased && (ll->timer -= ll->duration) <= 0))
{ {
ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel
P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker
CONS_Printf("End tic, final light value: %d\n", ll->sector->lightlevel);
return;
} }
else
{ ll->fixedcurlevel = ll->fixedcurlevel + ll->fixedpertic;
INT16 delta = abs(ll->destlevel - ll->sourcelevel); ll->sector->lightlevel = (ll->fixedcurlevel)>>FRACBITS;
INT32 duration = ll->ticbased ? ll->duration : delta; // speed-based: timer's initial value is equal to delta CONS_Printf("Light %d\n", ll->sector->lightlevel);
fixed_t factor = min(FixedDiv(duration - ll->timer, duration), 1*FRACUNIT);
if (ll->destlevel < ll->sourcelevel)
ll->sector->lightlevel = max(min(ll->sector->lightlevel, ll->sourcelevel - (INT16)FixedMul(delta, factor)), ll->destlevel);
else if (ll->destlevel > ll->sourcelevel)
ll->sector->lightlevel = min(max(ll->sector->lightlevel, ll->sourcelevel + (INT16)FixedMul(delta, factor)), ll->destlevel);
}
} }

View file

@ -1561,8 +1561,8 @@ static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type)
WRITEUINT32(save_p, SaveSector(ht->sector)); WRITEUINT32(save_p, SaveSector(ht->sector));
WRITEINT16(save_p, ht->sourcelevel); WRITEINT16(save_p, ht->sourcelevel);
WRITEINT16(save_p, ht->destlevel); WRITEINT16(save_p, ht->destlevel);
WRITEUINT8(save_p, (UINT8)ht->ticbased); WRITEFIXED(save_p, ht->fixedcurlevel);
WRITEINT16(save_p, ht->duration); WRITEFIXED(save_p, ht->fixedpertic);
WRITEINT32(save_p, ht->timer); WRITEINT32(save_p, ht->timer);
} }
@ -2537,8 +2537,8 @@ static inline void LoadLightlevelThinker(actionf_p1 thinker)
ht->sector = LoadSector(READUINT32(save_p)); ht->sector = LoadSector(READUINT32(save_p));
ht->sourcelevel = READINT16(save_p); ht->sourcelevel = READINT16(save_p);
ht->destlevel = READINT16(save_p); ht->destlevel = READINT16(save_p);
ht->ticbased = (boolean)READUINT8(save_p); ht->fixedcurlevel = READFIXED(save_p);
ht->duration = READINT16(save_p); ht->fixedpertic = READFIXED(save_p);
ht->timer = READINT32(save_p); ht->timer = READINT32(save_p);
if (ht->sector) if (ht->sector)
ht->sector->lightingdata = ht; ht->sector->lightingdata = ht;

View file

@ -134,15 +134,15 @@ typedef struct
*/ */
typedef struct typedef struct
{ {
thinker_t thinker; ///< Thinker in use for the effect. thinker_t thinker; ///< Thinker in use for the effect.
sector_t *sector; ///< Sector where action is taking place. sector_t *sector; ///< Sector where action is taking place.
INT16 sourcelevel; ///< Light level we're fading from. INT16 sourcelevel; ///< Light level we're fading from.
INT16 destlevel; ///< Light level we're fading to. INT16 destlevel; ///< Light level we're fading to.
// Tic-based behavior fixed_t fixedcurlevel; ///< Fixed point for current light level.
boolean ticbased; ///< Tic-based logic fixed_t fixedpertic; ///< Fixed point for increment per tic.
INT16 duration; ///< If tic-based: duration of effect. If speed-based: amount to increment // The reason for those two above to be fixed point is to deal with decimal values that would otherwise get trimmed away.
INT32 timer; ///< Internal timer INT32 timer; ///< Internal timer.
} lightlevel_t; } lightlevel_t;
#define GLOWSPEED 8 #define GLOWSPEED 8