mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-23 10:41:51 +00:00
Add gravity and gravity flip flag.
This commit is contained in:
parent
4bbfd36999
commit
31108219c2
6 changed files with 25 additions and 29 deletions
|
@ -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);
|
||||
|
|
12
src/p_mobj.c
12
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;
|
||||
|
|
|
@ -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
|
||||
|
|
15
src/p_spec.c
15
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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue