From 6694480f68c21c442a5081ed9ba87682fe834872 Mon Sep 17 00:00:00 2001 From: RedEnchilada Date: Mon, 27 Apr 2015 13:20:50 -0500 Subject: [PATCH] Overhaul slope collision (NOT PHYSICS) to work almost perfectly --- src/p_enemy.c | 10 ++---- src/p_floor.c | 13 +++----- src/p_map.c | 70 ++++++++-------------------------------- src/p_maputl.c | 87 +++++++++++++++++++------------------------------- src/p_spec.c | 12 ++----- 5 files changed, 56 insertions(+), 136 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 1271c875d..43c0f5057 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -28,7 +28,7 @@ #include "hardware/hw3sound.h" #endif -#ifdef ESLOPE +#ifdef SPRINGCLEAN// ESLOPE #include "p_slopes.h" #endif @@ -5611,12 +5611,8 @@ void A_MixUp(mobj_t *actor) P_SetThingPosition(players[i].mo); #ifdef ESLOPE - players[i].mo->floorz = (players[i].mo->subsector->sector->f_slope ? - P_GetZAt(players[i].mo->subsector->sector->f_slope, players[i].mo->x, players[i].mo->y) : - players[i].mo->subsector->sector->floorheight); - players[i].mo->ceilingz = (players[i].mo->subsector->sector->c_slope ? - P_GetZAt(players[i].mo->subsector->sector->c_slope, players[i].mo->x, players[i].mo->y) : - players[i].mo->subsector->sector->ceilingheight); + players[i].mo->floorz = P_GetFloorZ(players[i].mo, players[i].mo->subsector->sector, players[i].mo->x, players[i].mo->y, NULL); + players[i].mo->ceilingz = P_GetCeilingZ(players[i].mo, players[i].mo->subsector->sector, players[i].mo->x, players[i].mo->y, NULL); #else players[i].mo->floorz = players[i].mo->subsector->sector->floorheight; players[i].mo->ceilingz = players[i].mo->subsector->sector->ceilingheight; diff --git a/src/p_floor.c b/src/p_floor.c index 23c460244..0d68becbf 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -19,7 +19,7 @@ #include "z_zone.h" #include "g_game.h" #include "r_main.h" -#ifdef ESLOPE +#ifdef SPRINGCLEAN// ESLOPE #include "p_slopes.h" #endif @@ -1177,18 +1177,15 @@ void T_SpikeSector(levelspecthink_t *spikes) if (affectsec == spikes->sector) // Applied to an actual sector { - fixed_t affectpoint = affectsec->floorheight; + fixed_t affectfloor = P_GetFloorZ(thing, affectsec, thing->x, thing->y, NULL); + fixed_t affectceil = P_GetCeilingZ(thing, affectsec, thing->x, thing->y, NULL); -#ifdef ESLOPE - if (affectsec->f_slope) - affectpoint = P_GetZAt(affectsec->f_slope, thing->x, thing->y); -#endif if (affectsec->flags & SF_FLIPSPECIAL_FLOOR) { if (!(thing->eflags & MFE_VERTICALFLIP) && thing->momz > 0) continue; - if (thing->z == affectpoint) + if (thing->z == affectfloor) dothepain = true; } @@ -1197,7 +1194,7 @@ void T_SpikeSector(levelspecthink_t *spikes) if ((thing->eflags & MFE_VERTICALFLIP) && thing->momz < 0) continue; - if (thing->z + thing->height == affectsec->ceilingheight) + if (thing->z + thing->height == affectceil) dothepain = true; } } diff --git a/src/p_map.c b/src/p_map.c index 565569844..50f172798 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -27,7 +27,7 @@ #include "r_splats.h" -#ifdef ESLOPE +#ifdef SPRINGCLEAN// ESLOPE #include "p_slopes.h" #endif @@ -125,7 +125,7 @@ void P_DoSpring(mobj_t *spring, mobj_t *object) /*Someone want to make these work like bumpers?*/ return; } - + object->eflags |= MFE_SPRUNG; // apply this flag asap! spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify @@ -1208,21 +1208,8 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y) // that contains the point. // Any contacted lines the step closer together // will adjust them. -#ifdef ESLOPE - if (newsubsec->sector->f_slope) - { - tmfloorz = tmdropoffz = P_GetZAt(newsubsec->sector->f_slope, thing->x, thing->y); - } - else -#endif - tmfloorz = tmdropoffz = newsubsec->sector->floorheight; - -#ifdef ESLOPE - if (newsubsec->sector->c_slope) - tmceilingz = P_GetZAt(newsubsec->sector->c_slope, thing->x, thing->y); - else -#endif - tmceilingz = newsubsec->sector->ceilingheight; + tmfloorz = tmdropoffz = P_GetFloorZ(thing, newsubsec->sector, thing->x, thing->y, NULL); //newsubsec->sector->floorheight; + tmceilingz = P_GetCeilingZ(thing, newsubsec->sector, thing->x, thing->y, NULL); //newsubsec->sector->ceilingheight; // Check list of fake floors and see if tmfloorz/tmceilingz need to be altered. if (newsubsec->sector->ffloors) @@ -1535,7 +1522,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) fixed_t topheight = *rover->topheight; fixed_t bottomheight = *rover->bottomheight; - + /*#ifdef ESLOPE if (rover->t_slope) topheight = P_GetZAt(rover->t_slope, thiscam->x, thiscam->y); @@ -2033,7 +2020,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) // Link the thing into its new position P_UnsetThingPosition(thing); -#ifdef ESLOPE +#ifdef SRPINGCLEAN// ESLOPE // By virtue of being derived from SRB2 code, Kalaron's physics are GPL. if (P_IsObjectOnSlope(thing, false)) { @@ -2112,32 +2099,9 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) } #endif - // P_CheckPosition sets the tmfloorz with slopes, but after P_UnsetThingPosition, recheck the function here - // TODO: Make a function for floor/ceilingz auto check with slopes? -#ifdef ESLOPE - if (thing->subsector->sector->f_slope) - { - // TODO: Support a mobj's gravity for this too - if (P_GetZAt(thing->subsector->sector->f_slope, thing->x+thing->momx, thing->y+thing->momy) > P_GetZAt(thing->subsector->sector->f_slope, thing->x, thing->y)) - thing->floorz = P_GetZAt(thing->subsector->sector->f_slope, thing->x+thing->momx, thing->y+thing->momy); - else - thing->floorz = P_GetZAt(thing->subsector->sector->f_slope, thing->x, thing->y); - } - else -#endif - thing->floorz = tmfloorz; -#ifdef ESLOPE - if (thing->subsector->sector->c_slope) - { - // SRB2CBTODO: Support a mobj's gravity for this too - if (P_GetZAt(thing->subsector->sector->c_slope, thing->x+thing->momx, thing->y+thing->momy) < P_GetZAt(thing->subsector->sector->c_slope, thing->x, thing->y)) - thing->ceilingz = P_GetZAt(thing->subsector->sector->c_slope, thing->x, thing->y); - else - thing->ceilingz = P_GetZAt(thing->subsector->sector->c_slope, thing->x+thing->momx, thing->y+thing->momy); - } - else -#endif - thing->ceilingz = tmceilingz; + thing->floorz = tmfloorz; + thing->ceilingz = tmceilingz; + thing->x = x; thing->y = y; @@ -2494,16 +2458,8 @@ static boolean P_IsClimbingValid(player_t *player, angle_t angle) glidesector = R_PointInSubsector(player->mo->x + platx, player->mo->y + platy); - floorz = glidesector->sector->floorheight; -#ifdef ESLOPE - if (glidesector->sector->f_slope) - floorz = P_GetZAt(glidesector->sector->f_slope, player->mo->x + platx, player->mo->y + platy); -#endif - ceilingz = glidesector->sector->ceilingheight; -#ifdef ESLOPE - if (glidesector->sector->c_slope) - ceilingz = P_GetZAt(glidesector->sector->c_slope, player->mo->x + platx, player->mo->y + platy); -#endif + floorz = P_GetFloorZ(player->mo, glidesector->sector, player->mo->x + platx, player->mo->y + platy, NULL); + ceilingz = P_GetCeilingZ(player->mo, glidesector->sector, player->mo->x + platx, player->mo->y + platy, NULL); if (glidesector->sector != player->mo->subsector->sector) { @@ -2519,7 +2475,7 @@ static boolean P_IsClimbingValid(player_t *player, angle_t angle) fixed_t topheight = *rover->topheight; fixed_t bottomheight = *rover->bottomheight; - + /*#ifdef ESLOPE if (rover->t_slope) topheight = P_GetZAt(rover->t_slope, player->mo->x, player->mo->y); @@ -4046,7 +4002,7 @@ fixed_t P_FloorzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height) fixed_t topheight = *rover->topheight; fixed_t bottomheight = *rover->bottomheight; - + /*#ifdef ESLOPE if (rover->t_slope) topheight = P_GetZAt(rover->t_slope, x, y); diff --git a/src/p_maputl.c b/src/p_maputl.c index f0a08883c..7641dd1eb 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -21,7 +21,7 @@ #include "p_maputl.h" #include "p_polyobj.h" #include "z_zone.h" -#ifdef ESLOPE +#ifdef SPRINGCLEAN// ESLOPE #include "p_slopes.h" #endif @@ -557,26 +557,36 @@ void P_LineOpening(line_t *linedef) I_Assert(front != NULL); I_Assert(back != NULL); - if (front->ceilingheight < back->ceilingheight) - { - opentop = front->ceilingheight; - highceiling = back->ceilingheight; - } - else - { - opentop = back->ceilingheight; - highceiling = front->ceilingheight; - } + { // Set open and high/low values here + fixed_t frontheight, backheight; - if (front->floorheight > back->floorheight) - { - openbottom = front->floorheight; - lowfloor = back->floorheight; - } - else - { - openbottom = back->floorheight; - lowfloor = front->floorheight; + frontheight = P_GetCeilingZ(tmthing, front, tmthing->x, tmthing->y, linedef); + backheight = P_GetCeilingZ(tmthing, back, tmthing->x, tmthing->y, linedef); + + if (frontheight < backheight) + { + opentop = frontheight; + highceiling = backheight; + } + else + { + opentop = backheight; + highceiling = frontheight; + } + + frontheight = P_GetFloorZ(tmthing, front, tmthing->x, tmthing->y, linedef); + backheight = P_GetFloorZ(tmthing, back, tmthing->x, tmthing->y, linedef); + + if (frontheight > backheight) + { + openbottom = frontheight; + lowfloor = backheight; + } + else + { + openbottom = backheight; + lowfloor = frontheight; + } } if (tmthing) @@ -627,32 +637,6 @@ void P_LineOpening(line_t *linedef) openbottom = textop; } } -#ifdef ESLOPE - // I suspect the math here is wrong and we should be comparing the slope Zs - // if either are slopes. - // -- Fury - if (front->c_slope && front->ceilingheight < back->ceilingheight) - { - opentop = P_GetZAt(front->c_slope, tmthing->x, tmthing->y); - if (back->c_slope) highceiling = P_GetZAt(back->c_slope, tmthing->x, tmthing->y); - } - else if (back->c_slope && front->ceilingheight >= back->ceilingheight) - { - opentop = P_GetZAt(back->c_slope, tmthing->x, tmthing->y); - if (front->c_slope) highceiling = P_GetZAt(front->c_slope, tmthing->x, tmthing->y); - } - - if (front->f_slope && front->floorheight < back->floorheight) - { - openbottom = P_GetZAt(front->f_slope, tmthing->x, tmthing->y); - if (back->f_slope) lowfloor = P_GetZAt(back->f_slope, tmthing->x, tmthing->y); - } - if (back->f_slope && front->floorheight >= back->floorheight) - { - openbottom = P_GetZAt(back->f_slope, tmthing->x, tmthing->y); - if (front->f_slope) lowfloor = P_GetZAt(back->f_slope, tmthing->x, tmthing->y); - } -#endif // Check for fake floors in the sector. if (front->ffloors || back->ffloors @@ -889,14 +873,9 @@ void P_SetThingPosition(mobj_t *thing) ss = thing->subsector = R_PointInSubsector(thing->x, thing->y); fixed_t tfloorz, tceilz; - tfloorz = ss->sector->floorheight; - tceilz = ss->sector->ceilingheight; -#ifdef ESLOPE - if (ss->sector->f_slope) - tfloorz = P_GetZAt(ss->sector->f_slope, thing->x, thing->y); - if (ss->sector->c_slope) - tceilz = P_GetZAt(ss->sector->c_slope, thing->x, thing->y); -#endif + + tfloorz = P_GetFloorZ(thing, ss->sector, thing->x, thing->y, NULL); + tceilz = P_GetCeilingZ(thing, ss->sector, thing->x, thing->y, NULL); if (!(thing->flags & MF_NOSECTOR)) { diff --git a/src/p_spec.c b/src/p_spec.c index e33dd474c..fe3deba30 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4584,16 +4584,8 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector) return; } - fixed_t f_affectpoint = sector->floorheight; - fixed_t c_affectpoint = sector->ceilingheight; - -#ifdef ESLOPE - if (sector->f_slope) - f_affectpoint = P_GetZAt(sector->f_slope, player->mo->x, player->mo->y); - - if (sector->c_slope) - c_affectpoint = P_GetZAt(sector->c_slope, player->mo->x, player->mo->y); -#endif + fixed_t f_affectpoint = P_GetFloorZ(player->mo, sector, player->mo->x, player->mo->y, NULL);//sector->floorheight; + fixed_t c_affectpoint = P_GetCeilingZ(player->mo, sector, player->mo->x, player->mo->y, NULL);//sector->ceilingheight; // Only go further if on the ground if ((sector->flags & SF_FLIPSPECIAL_FLOOR) && !(sector->flags & SF_FLIPSPECIAL_CEILING) && player->mo->z != f_affectpoint)