diff --git a/src/p_enemy.c b/src/p_enemy.c index 74a11fe67..774dddd3b 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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<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<>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); diff --git a/src/p_mobj.c b/src/p_mobj.c index a2eaf7cf2..af349a8e0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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; diff --git a/src/p_setup.c b/src/p_setup.c index a613835c8..bd3d03e1b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -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 diff --git a/src/p_spec.c b/src/p_spec.c index 323321016..4bb5bc25b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -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 = §ors[sec].floorheight; // This allows it to change in realtime! + sectors[s].gravityptr = §ors[sec].floorheight; // This allows it to change in realtime! if (lines[i].flags & ML_NOCLIMB) sectors[s].verticalflip = true; diff --git a/src/p_spec.h b/src/p_spec.h index dcf03cbd1..6788353bf 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -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); diff --git a/src/r_defs.h b/src/r_defs.h index c0116fbc8..3d1f80a3c 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -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;