Add gravity and gravity flip flag.

This commit is contained in:
Nev3r 2019-12-16 12:10:06 +01:00
parent 4bbfd36999
commit 31108219c2
6 changed files with 25 additions and 29 deletions

View file

@ -11559,10 +11559,7 @@ void A_BrakLobShot(mobj_t *actor)
return; // Don't even bother if we've got nothing to aim at.
// Look up actor's current gravity situation
if (actor->subsector->sector->gravity)
g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000)));
else
g = gravity;
g = FixedMul(gravity, P_GetSectorGravity(actor->subsector->sector));
// Look up distance between actor and its target
x = P_AproxDistance(actor->target->x - actor->x, actor->target->y - actor->y);
@ -11676,10 +11673,7 @@ void A_NapalmScatter(mobj_t *actor)
airtime = 16<<FRACBITS;
// Look up actor's current gravity situation
if (actor->subsector->sector->gravity)
g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000)));
else
g = gravity;
g = FixedMul(gravity, P_GetSectorGravity(actor->subsector->sector));
// vy = (g*(airtime-1))/2
vy = FixedMul(g,(airtime-(1<<FRACBITS)))>>1;
@ -12402,10 +12396,7 @@ void A_Boss5Jump(mobj_t *actor)
return; // Don't even bother if we've got nothing to aim at.
// Look up actor's current gravity situation
if (actor->subsector->sector->gravity)
g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000)));
else
g = gravity;
g = FixedMul(gravity, P_GetSectorGravity(actor->subsector->sector));
// Look up distance between actor and its tracer
x = P_AproxDistance(actor->tracer->x - actor->x, actor->tracer->y - actor->y);

View file

@ -1480,11 +1480,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER))
goopgravity = true;
if (!(rover->master->frontsector->gravity))
continue;
gravityadd = -FixedMul(gravity,
(FixedDiv(*rover->master->frontsector->gravity>>FRACBITS, 1000)));
gravityadd = -FixedMul(gravity, P_GetSectorGravity(rover->master->frontsector));
if (rover->master->frontsector->verticalflip && gravityadd > 0)
mo->eflags |= MFE_VERTICALFLIP;
@ -1496,11 +1492,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
if (no3dfloorgrav)
{
if (mo->subsector->sector->gravity)
gravityadd = -FixedMul(gravity,
(FixedDiv(*mo->subsector->sector->gravity>>FRACBITS, 1000)));
else
gravityadd = -gravity;
gravityadd = -FixedMul(gravity, P_GetSectorGravity(mo->subsector->sector));
if (mo->subsector->sector->verticalflip && gravityadd > 0)
mo->eflags |= MFE_VERTICALFLIP;

View file

@ -831,8 +831,8 @@ static void GeneralDefaults(void)
// Defaults.
sc->floor_xoffs = sc->ceiling_xoffs = sc->floor_yoffs = sc->ceiling_yoffs = 0;
sc->floorpic_angle = sc->ceilingpic_angle = 0;
//sc->gravity = FRACUNIT;
sc->gravity = NULL;
sc->gravity = FRACUNIT;
sc->gravityptr = NULL;
sc->verticalflip = false;
// sc->udmfflags = 0;
@ -930,7 +930,7 @@ static void TextmapDefaults (void)
sc->floor_xoffs = sc->floor_yoffs = sc->ceiling_xoffs = sc->ceiling_yoffs = 0;
sc->floorpic_angle = sc->ceilingpic_angle = 0;
// sc->gravity = FRACUNIT;
sc->gravity = FRACUNIT;
sc->verticalflip = false;
// sc->udmfflags = 0;
@ -1064,11 +1064,11 @@ static void TextmapSector(UINT32 i, char *param)
sectors[i].floorpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(M_GetToken(NULL))));
else if (fastcmp(param, "rotationceiling"))
sectors[i].ceilingpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(M_GetToken(NULL))));
#ifdef ADVUDMF
else if (fastcmp(param, "gravity"))
sectors[i].gravity = FLOAT_TO_FIXED(atof(M_GetToken(NULL)));
else if (fastcmp(param, "flip") && fastcmp("true", M_GetToken(NULL)))
sectors[i].verticalflip = true;
#ifdef ADVUDMF
else if (fastcmp(param, "heatwave") && fastcmp("true", M_GetToken(NULL)))
sectors[i].udmfflags |= SFU_HEATWAVE;
#endif

View file

@ -975,6 +975,15 @@ static sector_t *P_FindModelCeilingSector(fixed_t ceildestheight, INT32 secnum)
}
#endif
// Calculates the per-sector gravity.
fixed_t P_GetSectorGravity(sector_t *sec)
{
if (sec->gravityptr)
return FixedDiv(*sec->gravityptr >> FRACBITS, 1000);
else
return sec->gravity;
}
/** Searches the tag lists for the next sector tagged to a line.
*
* \param line Tagged line used as a reference.
@ -6576,6 +6585,9 @@ void P_SpawnSpecials(INT32 fromnetsave)
sector = sectors;
for (i = 0; i < numsectors; i++, sector++)
{
if (sector->verticalflip)
CheckForReverseGravity = true;
if (!sector->special)
continue;
@ -6691,12 +6703,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
INT32 s;
size_t sec;
ffloortype_e ffloorflags;
case 1: // Definable gravity per sector
sec = sides[*lines[i].sidenum].sector - sectors;
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
{
sectors[s].gravity = &sectors[sec].floorheight; // This allows it to change in realtime!
sectors[s].gravityptr = &sectors[sec].floorheight; // This allows it to change in realtime!
if (lines[i].flags & ML_NOCLIMB)
sectors[s].verticalflip = true;

View file

@ -53,6 +53,8 @@ fixed_t P_FindNextLowestFloor(sector_t *sec, fixed_t currentheight);
fixed_t P_FindLowestCeilingSurrounding(sector_t *sec);
fixed_t P_FindHighestCeilingSurrounding(sector_t *sec);
fixed_t P_GetSectorGravity(sector_t *sec);
INT32 P_FindSectorFromLineTag(line_t *line, INT32 start);
INT32 P_FindSectorFromTag(INT16 tag, INT32 start);
INT32 P_FindSpecialLineFromTag(INT16 special, INT16 tag, INT32 start);

View file

@ -372,7 +372,7 @@ typedef struct sector_s
#endif // ----- end special tricks -----
// This points to the master's floorheight, so it can be changed in realtime!
fixed_t *gravity; // per-sector gravity
fixed_t gravity; // per-sector gravity
fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector
boolean verticalflip; // If gravity < 0, then allow flipped physics
sectorflags_t flags;