- floatified P_ChangeSector.

This commit is contained in:
Christoph Oelckers 2016-03-27 22:35:58 +02:00
parent fe744a589c
commit 8b4a33794a
4 changed files with 46 additions and 49 deletions

View file

@ -197,7 +197,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, double x, double y, double z, PCla
FTranslatedLineTarget *pLineTarget = NULL, AActor **MissileActor = NULL, bool nofreeaim = false, bool noautoaim = false, int aimflags = 0); FTranslatedLineTarget *pLineTarget = NULL, AActor **MissileActor = NULL, bool nofreeaim = false, bool noautoaim = false, int aimflags = 0);
void P_CheckFakeFloorTriggers (AActor *mo, fixed_t oldz, bool oldz_has_viewheight=false); void P_CheckFakeFloorTriggers(AActor *mo, double oldz, bool oldz_has_viewheight = false);
AActor *P_SpawnSubMissile (AActor *source, PClassActor *type, AActor *target); // Strife uses it AActor *P_SpawnSubMissile (AActor *source, PClassActor *type, AActor *target); // Strife uses it
@ -336,7 +336,11 @@ enum
}; };
void P_FindFloorCeiling (AActor *actor, int flags=0); void P_FindFloorCeiling (AActor *actor, int flags=0);
bool P_ChangeSector (sector_t* sector, int crunch, int amt, int floorOrCeil, bool isreset); bool P_ChangeSector (sector_t* sector, int crunch, double amt, int floorOrCeil, bool isreset);
inline bool P_ChangeSector(sector_t* sector, int crunch, int amt, int floorOrCeil, bool isreset)
{
return P_ChangeSector(sector, crunch, FIXED2DBL(amt), floorOrCeil, isreset);
}
DAngle P_AimLineAttack(AActor *t1, DAngle angle, double distance, FTranslatedLineTarget *pLineTarget = NULL, DAngle vrange = 0., int flags = 0, AActor *target = NULL, AActor *friender = NULL); DAngle P_AimLineAttack(AActor *t1, DAngle angle, double distance, FTranslatedLineTarget *pLineTarget = NULL, DAngle vrange = 0., int flags = 0, AActor *target = NULL, AActor *friender = NULL);

View file

@ -5250,7 +5250,7 @@ void P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, int bo
struct FChangePosition struct FChangePosition
{ {
sector_t *sector; sector_t *sector;
int moveamt; double moveamt;
int crushchange; int crushchange;
bool nofit; bool nofit;
bool movemidtex; bool movemidtex;
@ -5320,8 +5320,8 @@ void P_FindAboveIntersectors(AActor *actor)
while (it.Next(&cres)) while (it.Next(&cres))
{ {
AActor *thing = cres.thing; AActor *thing = cres.thing;
fixed_t blockdist = actor->_f_radius() + thing->_f_radius(); double blockdist = actor->radius + thing->radius;
if (abs(thing->_f_X() - cres.position.x) >= blockdist || abs(thing->_f_Y() - cres.position.y) >= blockdist) if (fabs(thing->X() - cres.Position.X) >= blockdist || fabs(thing->Y() - cres.Position.Y) >= blockdist)
continue; continue;
if (!(thing->flags & MF_SOLID)) if (!(thing->flags & MF_SOLID))
@ -5376,8 +5376,8 @@ void P_FindBelowIntersectors(AActor *actor)
while (it.Next(&cres)) while (it.Next(&cres))
{ {
AActor *thing = cres.thing; AActor *thing = cres.thing;
fixed_t blockdist = actor->_f_radius() + thing->_f_radius(); double blockdist = actor->radius + thing->radius;
if (abs(thing->_f_X() - cres.position.x) >= blockdist || abs(thing->_f_Y() - cres.position.y) >= blockdist) if (fabs(thing->X() - cres.Position.X) >= blockdist || fabs(thing->Y() - cres.Position.Y) >= blockdist)
continue; continue;
if (!(thing->flags & MF_SOLID)) if (!(thing->flags & MF_SOLID))
@ -5511,14 +5511,13 @@ int P_PushUp(AActor *thing, FChangePosition *cpos)
// Can't push bridges or things more massive than ourself // Can't push bridges or things more massive than ourself
return 2; return 2;
} }
fixed_t oldz; double oldz = intersect->Z();
oldz = intersect->_f_Z();
P_AdjustFloorCeil(intersect, cpos); P_AdjustFloorCeil(intersect, cpos);
intersect->_f_SetZ(thing->_f_Top() + 1); intersect->SetZ(thing->Top() + 1/65536.);
if (P_PushUp(intersect, cpos)) if (P_PushUp(intersect, cpos))
{ // Move blocked { // Move blocked
P_DoCrunch(intersect, cpos); P_DoCrunch(intersect, cpos);
intersect->_f_SetZ(oldz); intersect->SetZ(oldz);
return 2; return 2;
} }
} }
@ -5557,15 +5556,15 @@ int P_PushDown(AActor *thing, FChangePosition *cpos)
// Can't push bridges or things more massive than ourself // Can't push bridges or things more massive than ourself
return 2; return 2;
} }
fixed_t oldz = intersect->_f_Z(); double oldz = intersect->Z();
P_AdjustFloorCeil(intersect, cpos); P_AdjustFloorCeil(intersect, cpos);
if (oldz > thing->_f_Z() - intersect->_f_height()) if (oldz > thing->Z() - intersect->Height)
{ // Only push things down, not up. { // Only push things down, not up.
intersect->_f_SetZ(thing->_f_Z() - intersect->_f_height()); intersect->SetZ(thing->Z() - intersect->Height);
if (P_PushDown(intersect, cpos)) if (P_PushDown(intersect, cpos))
{ // Move blocked { // Move blocked
P_DoCrunch(intersect, cpos); P_DoCrunch(intersect, cpos);
intersect->_f_SetZ(oldz); intersect->SetZ(oldz);
return 2; return 2;
} }
} }
@ -5582,40 +5581,37 @@ int P_PushDown(AActor *thing, FChangePosition *cpos)
void PIT_FloorDrop(AActor *thing, FChangePosition *cpos) void PIT_FloorDrop(AActor *thing, FChangePosition *cpos)
{ {
fixed_t oldfloorz = thing->_f_floorz(); double oldfloorz = thing->floorz;
fixed_t oldz = thing->_f_Z(); double oldz = thing->Z();
P_AdjustFloorCeil(thing, cpos); P_AdjustFloorCeil(thing, cpos);
if (oldfloorz == thing->_f_floorz()) return; if (oldfloorz == thing->floorz) return;
if (thing->flags4 & MF4_ACTLIKEBRIDGE) return; // do not move bridge things if (thing->flags4 & MF4_ACTLIKEBRIDGE) return; // do not move bridge things
if (thing->_f_velz() == 0 && if (thing->Vel.Z == 0 &&
(!(thing->flags & MF_NOGRAVITY) || (!(thing->flags & MF_NOGRAVITY) ||
(thing->_f_Z() == oldfloorz && !(thing->flags & MF_NOLIFTDROP)))) (thing->Z() == oldfloorz && !(thing->flags & MF_NOLIFTDROP))))
{ {
fixed_t oldz = thing->_f_Z();
if ((thing->flags & MF_NOGRAVITY) || (thing->flags5 & MF5_MOVEWITHSECTOR) || if ((thing->flags & MF_NOGRAVITY) || (thing->flags5 & MF5_MOVEWITHSECTOR) ||
(((cpos->sector->Flags & SECF_FLOORDROP) || cpos->moveamt < 9 * FRACUNIT) (((cpos->sector->Flags & SECF_FLOORDROP) || cpos->moveamt < 9)
&& thing->_f_Z() - thing->_f_floorz() <= cpos->moveamt)) && thing->Z() - thing->floorz <= cpos->moveamt))
{ {
thing->SetZ(thing->floorz); thing->SetZ(thing->floorz);
P_CheckFakeFloorTriggers(thing, oldz); P_CheckFakeFloorTriggers(thing, oldz);
} }
} }
else if ((thing->_f_Z() != oldfloorz && !(thing->flags & MF_NOLIFTDROP))) else if ((thing->Z() != oldfloorz && !(thing->flags & MF_NOLIFTDROP)))
{ {
fixed_t oldz = thing->_f_Z();
if ((thing->flags & MF_NOGRAVITY) && (thing->flags6 & MF6_RELATIVETOFLOOR)) if ((thing->flags & MF_NOGRAVITY) && (thing->flags6 & MF6_RELATIVETOFLOOR))
{ {
thing->_f_AddZ(-oldfloorz + thing->_f_floorz()); thing->AddZ(-oldfloorz + thing->floorz);
P_CheckFakeFloorTriggers(thing, oldz); P_CheckFakeFloorTriggers(thing, oldz);
} }
} }
if (thing->player && thing->player->mo == thing) if (thing->player && thing->player->mo == thing)
{ {
//thing->player->viewz += thing->_f_Z() - oldz; thing->player->viewz += thing->Z() - oldz;
} }
} }
@ -5627,12 +5623,12 @@ void PIT_FloorDrop(AActor *thing, FChangePosition *cpos)
void PIT_FloorRaise(AActor *thing, FChangePosition *cpos) void PIT_FloorRaise(AActor *thing, FChangePosition *cpos)
{ {
fixed_t oldfloorz = thing->_f_floorz(); double oldfloorz = thing->floorz;
fixed_t oldz = thing->_f_Z(); double oldz = thing->Z();
P_AdjustFloorCeil(thing, cpos); P_AdjustFloorCeil(thing, cpos);
if (oldfloorz == thing->_f_floorz()) return; if (oldfloorz == thing->floorz) return;
// Move things intersecting the floor up // Move things intersecting the floor up
if (thing->Z() <= thing->floorz) if (thing->Z() <= thing->floorz)
@ -5650,7 +5646,7 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos)
if ((thing->flags & MF_NOGRAVITY) && (thing->flags6 & MF6_RELATIVETOFLOOR)) if ((thing->flags & MF_NOGRAVITY) && (thing->flags6 & MF6_RELATIVETOFLOOR))
{ {
intersectors.Clear(); intersectors.Clear();
thing->_f_AddZ(-oldfloorz + thing->_f_floorz()); thing->AddZ(-oldfloorz + thing->floorz);
} }
else return; else return;
} }
@ -5665,12 +5661,12 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos)
break; break;
case 2: case 2:
P_DoCrunch(thing, cpos); P_DoCrunch(thing, cpos);
thing->_f_SetZ(oldz); thing->SetZ(oldz);
break; break;
} }
if (thing->player && thing->player->mo == thing) if (thing->player && thing->player->mo == thing)
{ {
thing->player->viewz += thing->Z() - FIXED2DBL(oldz); thing->player->viewz += thing->Z() - oldz;
} }
} }
@ -5683,7 +5679,7 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos)
void PIT_CeilingLower(AActor *thing, FChangePosition *cpos) void PIT_CeilingLower(AActor *thing, FChangePosition *cpos)
{ {
bool onfloor; bool onfloor;
fixed_t oldz = thing->_f_Z(); double oldz = thing->Z();
onfloor = thing->Z() <= thing->floorz; onfloor = thing->Z() <= thing->floorz;
P_AdjustFloorCeil(thing, cpos); P_AdjustFloorCeil(thing, cpos);
@ -5696,7 +5692,6 @@ void PIT_CeilingLower(AActor *thing, FChangePosition *cpos)
return; // do not move bridge things return; // do not move bridge things
} }
intersectors.Clear(); intersectors.Clear();
fixed_t oldz = thing->_f_Z();
if (thing->ceilingz - thing->Height >= thing->floorz) if (thing->ceilingz - thing->Height >= thing->floorz)
{ {
thing->SetZ(thing->ceilingz - thing->Height); thing->SetZ(thing->ceilingz - thing->Height);
@ -5722,7 +5717,7 @@ void PIT_CeilingLower(AActor *thing, FChangePosition *cpos)
} }
if (thing->player && thing->player->mo == thing) if (thing->player && thing->player->mo == thing)
{ {
thing->player->viewz += thing->Z() - FIXED2DBL(oldz); thing->player->viewz += thing->Z() - oldz;
} }
} }
@ -5735,18 +5730,17 @@ void PIT_CeilingLower(AActor *thing, FChangePosition *cpos)
void PIT_CeilingRaise(AActor *thing, FChangePosition *cpos) void PIT_CeilingRaise(AActor *thing, FChangePosition *cpos)
{ {
bool isgood = P_AdjustFloorCeil(thing, cpos); bool isgood = P_AdjustFloorCeil(thing, cpos);
fixed_t oldz = thing->_f_Z(); double oldz = thing->Z();
if (thing->flags4 & MF4_ACTLIKEBRIDGE) return; // do not move bridge things if (thing->flags4 & MF4_ACTLIKEBRIDGE) return; // do not move bridge things
// For DOOM compatibility, only move things that are inside the floor. // For DOOM compatibility, only move things that are inside the floor.
// (or something else?) Things marked as hanging from the ceiling will // (or something else?) Things marked as hanging from the ceiling will
// stay where they are. // stay where they are.
if (thing->_f_Z() < thing->_f_floorz() && if (thing->Z() < thing->floorz &&
thing->_f_Top() >= thing->_f_ceilingz() - cpos->moveamt && thing->Top() >= thing->ceilingz - cpos->moveamt &&
!(thing->flags & MF_NOLIFTDROP)) !(thing->flags & MF_NOLIFTDROP))
{ {
fixed_t oldz = thing->_f_Z();
thing->SetZ(thing->floorz); thing->SetZ(thing->floorz);
if (thing->Top() > thing->ceilingz) if (thing->Top() > thing->ceilingz)
{ {
@ -5764,7 +5758,7 @@ void PIT_CeilingRaise(AActor *thing, FChangePosition *cpos)
} }
if (thing->player && thing->player->mo == thing) if (thing->player && thing->player->mo == thing)
{ {
thing->player->viewz += thing->Z() - FIXED2DBL(oldz); thing->player->viewz += thing->Z() - oldz;
} }
} }
@ -5778,7 +5772,7 @@ void PIT_CeilingRaise(AActor *thing, FChangePosition *cpos)
// //
//============================================================================= //=============================================================================
bool P_ChangeSector(sector_t *sector, int crunch, int amt, int floorOrCeil, bool isreset) bool P_ChangeSector(sector_t *sector, int crunch, double amt, int floorOrCeil, bool isreset)
{ {
FChangePosition cpos; FChangePosition cpos;
void(*iterator)(AActor *, FChangePosition *); void(*iterator)(AActor *, FChangePosition *);
@ -5787,7 +5781,7 @@ bool P_ChangeSector(sector_t *sector, int crunch, int amt, int floorOrCeil, bool
cpos.nofit = false; cpos.nofit = false;
cpos.crushchange = crunch; cpos.crushchange = crunch;
cpos.moveamt = abs(amt); cpos.moveamt = fabs(amt);
cpos.movemidtex = false; cpos.movemidtex = false;
cpos.sector = sector; cpos.sector = sector;
@ -5924,7 +5918,7 @@ bool P_ChangeSector(sector_t *sector, int crunch, int amt, int floorOrCeil, bool
n->visited = true; // mark thing as processed n->visited = true; // mark thing as processed
n->m_thing->UpdateWaterLevel(false); n->m_thing->UpdateWaterLevel(false);
P_CheckFakeFloorTriggers(n->m_thing, n->m_thing->_f_Z() - amt); P_CheckFakeFloorTriggers(n->m_thing, n->m_thing->Z() - amt);
} }
} }
} while (n); // repeat from scratch until all things left are marked valid } while (n); // repeat from scratch until all things left are marked valid

View file

@ -2619,12 +2619,11 @@ void P_ZMovement (AActor *mo, fixed_t oldfloorz)
} }
} }
} }
P_CheckFakeFloorTriggers (mo, oldz); P_CheckFakeFloorTriggers (mo, FIXED2DBL(oldz));
} }
void P_CheckFakeFloorTriggers (AActor *mo, fixed_t _oldz, bool oldz_has_viewheight) void P_CheckFakeFloorTriggers (AActor *mo, double oldz, bool oldz_has_viewheight)
{ {
double oldz = FIXED2FLOAT(_oldz);
if (mo->player && (mo->player->cheats & CF_PREDICTING)) if (mo->player && (mo->player->cheats & CF_PREDICTING))
{ {
return; return;

View file

@ -2268,7 +2268,7 @@ void P_CrouchMove(player_t * player, int direction)
player->crouchviewdelta = player->viewheight - player->mo->ViewHeight; player->crouchviewdelta = player->viewheight - player->mo->ViewHeight;
// Check for eyes going above/below fake floor due to crouching motion. // Check for eyes going above/below fake floor due to crouching motion.
P_CheckFakeFloorTriggers(player->mo, player->mo->_f_Z() + FLOAT2FIXED(oldheight), true); P_CheckFakeFloorTriggers(player->mo, player->mo->Z() + oldheight, true);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------