From fe795e6cfbb344f5c02a6de403d1e765a8fa6d0e Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 23 Nov 2022 18:19:12 +1100 Subject: [PATCH] - SW: Remove `PLAYER::posZset()` in favour of new utilities. --- source/games/sw/src/game.h | 54 +++++++++++- source/games/sw/src/player.cpp | 157 +++++++++------------------------ source/games/sw/src/track.cpp | 6 +- 3 files changed, 95 insertions(+), 122 deletions(-) diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index 04fc15d08..3a07e156e 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -1896,10 +1896,6 @@ struct PLAYER return actor->spr.pos.XY(); } - void posZset(const double val) - { - actor->spr.pos.Z = val - actor->viewzoffset; - } void posZadd(const double val) { actor->spr.pos.Z += val; @@ -1954,6 +1950,56 @@ struct PLAYER { return PlayerOldPosition; } + + void setHeightAndZ(const double newz, const double newheight) + { + actor->spr.pos.Z = newz; + height = newheight; + } + + bool belowFloorZ(const double floorz, const double newheight = DBL_MAX) + { + if (newheight == DBL_MAX) + { + if (actor->getOffsetZ() > floorz) + { + actor->spr.pos.Z = floorz - actor->viewzoffset; + return true; + } + } + else + { + if (actor->spr.pos.Z > floorz) + { + setHeightAndZ(floorz, newheight); + return true; + } + } + + return false; + } + + bool aboveCeilZ(const double ceilz, const double newheight = DBL_MAX) + { + if (newheight == DBL_MAX) + { + if (actor->getOffsetZ() < ceilz) + { + actor->spr.pos.Z = ceilz - actor->viewzoffset; + return true; + } + } + else + { + if (actor->spr.pos.Z < ceilz) + { + setHeightAndZ(ceilz, newheight); + return true; + } + } + + return false; + } }; extern PLAYER Player[MAX_SW_PLAYERS_REG+1]; diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index e80522945..45684e42c 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -1498,9 +1498,8 @@ void DoPlayerJumpHeight(PLAYER* pp) { if (pp->lo_sectp && (pp->lo_sectp->extra & SECTFX_DYNAMIC_AREA)) { - if (pp->posZget() + PLAYER_HEIGHTF > pp->loz) + if (pp->belowFloorZ(pp->loz, PLAYER_HEIGHTF)) { - pp->posZset(pp->loz - PLAYER_HEIGHTF); DoPlayerBeginRun(pp); } } @@ -2059,12 +2058,8 @@ void PlayerSectorBound(PLAYER* pp, double amt) calcSlope(pp->cursector, pp->posGet(), &cz, &fz); - if (pp->posZget() > fz - amt) - pp->posZset(fz - amt); - - if (pp->posZget() < cz + amt) - pp->posZset(cz + amt); - + pp->belowFloorZ(fz - amt); + pp->aboveCeilZ(cz + amt); } //--------------------------------------------------------------------------- @@ -2229,19 +2224,13 @@ void DoPlayerMove(PLAYER* pp) { if (pp->Flags & (PF_FLYING|PF_JUMPING|PF_FALLING)) { - if (pp->posZget() > pp->loz) - pp->posZset(pp->loz - PLAYER_HEIGHTF); - - if (pp->posZget() < pp->hiz) - pp->posZset(pp->hiz + PLAYER_HEIGHTF); + pp->belowFloorZ(pp->loz, PLAYER_HEIGHTF); + pp->aboveCeilZ(pp->hiz, PLAYER_HEIGHTF); } else if (pp->Flags & (PF_SWIMMING|PF_DIVING)) { - if (pp->posZget() > pp->loz) - pp->posZset(pp->loz - PLAYER_SWIM_HEIGHTF); - - if (pp->posZget() < pp->hiz) - pp->posZset(pp->hiz + PLAYER_SWIM_HEIGHTF); + pp->belowFloorZ(pp->loz, PLAYER_SWIM_HEIGHTF); + pp->aboveCeilZ(pp->hiz, PLAYER_SWIM_HEIGHTF); } } } @@ -2306,11 +2295,8 @@ void DoPlayerSectorUpdatePostMove(PLAYER* pp) // adjust the posz to be in a sector calcSlope(pp->cursector, pp->posGet(), &cz, &fz); - if (pp->posZget() > fz) - pp->posZset(fz); - - if (pp->posZget() < cz) - pp->posZset(cz); + pp->belowFloorZ(fz); + pp->aboveCeilZ(cz); // try again updatesectorz(pp->posGet(), &pp->cursector); @@ -2920,22 +2906,6 @@ void DoPlayerBeginForceJump(PLAYER* pp) // //--------------------------------------------------------------------------- -bool PlayerCeilingHit(PLAYER* pp, double zlimit) -{ - return (pp->posZget() < zlimit); -} - -bool PlayerFloorHit(PLAYER* pp, double zlimit) -{ - return (pp->posZget() > zlimit); -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void DoPlayerJump(PLAYER* pp) { short i; @@ -2972,11 +2942,8 @@ void DoPlayerJump(PLAYER* pp) pp->posZadd(pp->jump_speed * JUMP_FACTOR); // if player gets to close the ceiling while jumping - if (PlayerCeilingHit(pp, pp->hiz + 4)) + if (pp->aboveCeilZ(pp->hiz + 4)) { - // put player at the ceiling - pp->posZset(pp->hiz + 4); - // reverse your speed to falling pp->jump_speed = -pp->jump_speed; @@ -2989,10 +2956,8 @@ void DoPlayerJump(PLAYER* pp) // added this because jumping up to slopes or jumping on steep slopes // sometimes caused the view to go into the slope // if player gets to close the floor while jumping - if (PlayerFloorHit(pp, pp->loz - pp->p_floor_dist)) + if (pp->belowFloorZ(pp->loz - pp->p_floor_dist)) { - pp->posZset(pp->loz - pp->p_floor_dist); - pp->jump_speed = 0; PlayerSectorBound(pp, 1); DoPlayerBeginRun(pp); @@ -3046,12 +3011,8 @@ void DoPlayerForceJump(PLAYER* pp) pp->posZadd(pp->jump_speed * JUMP_FACTOR); // if player gets to close the ceiling while jumping - //if (pp->posGet()z < pp->hiz + Z(4)) - if (PlayerCeilingHit(pp, pp->hiz + 4)) + if (pp->aboveCeilZ(pp->hiz + 4)) { - // put player at the ceiling - pp->posZset(pp->hiz + 4); - // reverse your speed to falling pp->jump_speed = -pp->jump_speed; @@ -3173,15 +3134,9 @@ void DoPlayerFall(PLAYER* pp) // need a test for head hits a sloped ceiling while falling // if player gets to close the Ceiling while Falling - if (PlayerCeilingHit(pp, pp->hiz + pp->p_ceiling_dist)) - { - // put player at the ceiling - pp->posZset(pp->hiz + pp->p_ceiling_dist); - // don't return or anything - allow to fall until - // hit floor - } + pp->aboveCeilZ(pp->hiz + pp->p_ceiling_dist); - if (PlayerFloorHit(pp, pp->loz - PLAYER_HEIGHTF + recoil_amnt)) + if (pp->actor->spr.pos.Z > pp->loz + recoil_amnt) { sectortype* sectp = pp->cursector; @@ -3203,7 +3158,7 @@ void DoPlayerFall(PLAYER* pp) // i any kind of crawl key get rid of recoil if (DoPlayerTestCrawl(pp) || (pp->input.actions & SB_CROUCH)) { - pp->posZset(pp->loz - PLAYER_CRAWL_HEIGHTF); + pp->setHeightAndZ(pp->loz, PLAYER_CRAWL_HEIGHTF); } else { @@ -3383,18 +3338,16 @@ void DoPlayerClimb(PLAYER* pp) pp->climb_ndx &= 1023; // if player gets to close the ceiling while climbing - if (PlayerCeilingHit(pp, pp->hiz)) + if (pp->aboveCeilZ(pp->hiz)) { - // put player at the hiz - pp->posZset(pp->hiz); NewStateGroup(pp->actor, sg_PlayerNinjaClimb); } // if player gets to close the ceiling while climbing - if (PlayerCeilingHit(pp, pp->hiz + 4)) + if (pp->aboveCeilZ(pp->hiz + 4)) { // put player at the ceiling - pp->posZset(pp->LadderSector->ceilingz + 4); + plActor->spr.pos.Z = pp->LadderSector->ceilingz + 4 - plActor->viewzoffset; NewStateGroup(pp->actor, sg_PlayerNinjaClimb); } @@ -3417,11 +3370,8 @@ void DoPlayerClimb(PLAYER* pp) pp->climb_ndx &= 1023; // if you are touching the floor - if (PlayerFloorHit(pp, pp->loz - 4 - PLAYER_HEIGHTF)) + if (pp->belowFloorZ(pp->loz - 4, PLAYER_HEIGHTF)) { - // stand on floor - pp->posZset(pp->loz - 4 - PLAYER_HEIGHTF); - // if moving backwards start running if (climbVel < 0) { @@ -3437,8 +3387,6 @@ void DoPlayerClimb(PLAYER* pp) NewStateGroup(pp->actor, sg_PlayerNinjaClimb); } - // setsprite to players location - plActor->spr.pos.Z = pp->posZget() + PLAYER_HEIGHTF; ChangeActorSect(pp->actor, pp->cursector); if (!SyncInput()) @@ -3619,7 +3567,7 @@ void DoPlayerCrawl(PLAYER* pp) if (FAF_ConnectArea(pp->cursector)) { // adjust the z - pp->posZset(pp->cursector->ceilingz + 12); + plActor->spr.pos.Z = pp->cursector->ceilingz + 12 - plActor->viewzoffset; } DoPlayerBeginDiveNoWarp(pp); @@ -3673,7 +3621,7 @@ void DoPlayerCrawl(PLAYER* pp) if (pp->insector() && (pp->cursector->extra & SECTFX_DYNAMIC_AREA)) { - pp->posZset(pp->loz - PLAYER_CRAWL_HEIGHTF); + pp->setHeightAndZ(pp->loz, PLAYER_CRAWL_HEIGHTF); } DoPlayerBob(pp); @@ -3757,17 +3705,9 @@ void DoPlayerFly(PLAYER* pp) // Make the min distance from the ceiling/floor match bobbing amount // so the player never goes into the ceiling/floor - // Only get so close to the ceiling - if (PlayerCeilingHit(pp, pp->hiz + PLAYER_FLY_BOB_AMT + 8)) + // Only get so close to the ceiling or floor + if (pp->aboveCeilZ(pp->hiz + PLAYER_FLY_BOB_AMT + 8) || pp->belowFloorZ(pp->loz - PLAYER_FLY_BOB_AMT, PLAYER_HEIGHTF)) { - pp->posZset(pp->hiz + PLAYER_FLY_BOB_AMT + 8); - pp->z_speed = 0; - } - - // Only get so close to the floor - if (PlayerFloorHit(pp, pp->loz - PLAYER_HEIGHTF - PLAYER_FLY_BOB_AMT)) - { - pp->posZset(pp->loz - PLAYER_HEIGHTF - PLAYER_FLY_BOB_AMT); pp->z_speed = 0; } @@ -3991,7 +3931,7 @@ int PlayerCanDiveNoWarp(PLAYER* pp) if (SectorIsUnderwaterArea(sect)) { pp->setcursector(sect); - pp->posZset(sect->ceilingz + 20); + pp->actor->spr.pos.Z = sect->ceilingz + 20 - pp->actor->viewzoffset; pp->z_speed = 20; pp->jump_speed = 0; @@ -4243,7 +4183,7 @@ void DoPlayerWarpToUnderwater(PLAYER* pp) else pp->setcursector(over); - pp->posZset(under_act->sector()->ceilingz + 6); + plActor->spr.pos.Z = under_act->sector()->ceilingz + 6 - plActor->viewzoffset; pp->posprevSet(pp->posGet()); @@ -4313,7 +4253,7 @@ void DoPlayerWarpToSurface(PLAYER* pp) pp->setcursector(over); } - pp->posZset(over_act->sector()->floorz - 2); + plActor->spr.pos.Z = over_act->sector()->floorz - 2 - plActor->viewzoffset; // set z range and wade depth so we know how high to set view DoPlayerZrange(pp); @@ -4660,7 +4600,7 @@ void DoPlayerDive(PLAYER* pp) { // if not underwater sector we must surface // force into above sector - pp->posZset(pp->cursector->ceilingz- 8); + plActor->spr.pos.Z = pp->cursector->ceilingz - 8 - plActor->viewzoffset; pp->setcursector(sect); DoPlayerStopDiveNoWarp(pp); DoPlayerBeginRun(pp); @@ -4675,10 +4615,7 @@ void DoPlayerDive(PLAYER* pp) if (sectu && (sectu->number == 0 || (sectu->flags & SECTFU_CANT_SURFACE))) { // for room over room water the hiz will be the top rooms ceiling - if (pp->posZget() < pp->hiz + pp->p_ceiling_dist) - { - pp->posZset(pp->hiz + pp->p_ceiling_dist); - } + pp->aboveCeilZ(pp->hiz + pp->p_ceiling_dist); } else { @@ -4694,10 +4631,7 @@ void DoPlayerDive(PLAYER* pp) } // Only get so close to the floor - if (pp->posZget() >= pp->loz - PLAYER_DIVE_HEIGHTF) - { - pp->posZset(pp->loz - PLAYER_DIVE_HEIGHTF); - } + pp->belowFloorZ(pp->loz, PLAYER_DIVE_HEIGHTF); // make player bob if sitting still if (!PLAYER_MOVING(pp) && pp->z_speed == 0) @@ -5209,7 +5143,7 @@ void DoPlayerBeginOperate(PLAYER* pp) pp->posXY() = sop->pmid.XY(); updatesector(pp->posGet(), &pp->cursector); calcSlope(pp->cursector, pp->posGet(), &cz, &fz); - pp->posZset(fz - PLAYER_HEIGHTF); + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); pp->Flags &= ~(PF_CRAWLING|PF_JUMPING|PF_FALLING|PF_LOCK_CRAWL); @@ -5234,7 +5168,7 @@ void DoPlayerBeginOperate(PLAYER* pp) PlaySOsound(pp->sop->mid_sector, SO_DRIVE_SOUND); else PlaySOsound(pp->sop->mid_sector, SO_IDLE_SOUND); - pp->posZset(fz - PLAYER_HEIGHTF); + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); DoPlayerBeginOperateVehicle(pp); break; case SO_TURRET_MGUN: @@ -5243,7 +5177,7 @@ void DoPlayerBeginOperate(PLAYER* pp) PlaySOsound(pp->sop->mid_sector, SO_DRIVE_SOUND); else PlaySOsound(pp->sop->mid_sector, SO_IDLE_SOUND); - pp->posZset(fz - PLAYER_HEIGHTF); + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); DoPlayerBeginOperateTurret(pp); break; #if 0 @@ -5252,7 +5186,7 @@ void DoPlayerBeginOperate(PLAYER* pp) PlaySOsound(pp->sop->mid_sector, SO_DRIVE_SOUND); else PlaySOsound(pp->sop->mid_sector, SO_IDLE_SOUND); - pp->pos.Z = fz - PLAYER_HEIGHTF; + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); DoPlayerBeginOperateBoat(pp); break; #endif @@ -5299,7 +5233,7 @@ void DoPlayerBeginRemoteOperate(PLAYER* pp, SECTOR_OBJECT* sop) pp->posXY() = sop->pmid.XY(); updatesector(pp->posGet(), &pp->cursector); calcSlope(pp->cursector, pp->posGet(), &cz, &fz); - pp->posZset(fz - PLAYER_HEIGHTF); + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); pp->Flags &= ~(PF_CRAWLING|PF_JUMPING|PF_FALLING|PF_LOCK_CRAWL); @@ -5327,7 +5261,7 @@ void DoPlayerBeginRemoteOperate(PLAYER* pp, SECTOR_OBJECT* sop) PlaySOsound(pp->sop->mid_sector, SO_DRIVE_SOUND); else PlaySOsound(pp->sop->mid_sector, SO_IDLE_SOUND); - pp->posZset(fz - PLAYER_HEIGHTF); + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); DoPlayerBeginOperateVehicle(pp); break; case SO_TURRET_MGUN: @@ -5336,7 +5270,7 @@ void DoPlayerBeginRemoteOperate(PLAYER* pp, SECTOR_OBJECT* sop) PlaySOsound(pp->sop->mid_sector, SO_DRIVE_SOUND); else PlaySOsound(pp->sop->mid_sector, SO_IDLE_SOUND); - pp->posZset(fz - PLAYER_HEIGHTF); + pp->setHeightAndZ(fz, PLAYER_HEIGHTF); DoPlayerBeginOperateTurret(pp); break; default: @@ -5383,7 +5317,7 @@ void PlayerRemoteReset(PLAYER* pp, sectortype* sect) auto rsp = pp->remoteActor; pp->posXY() = rsp->spr.pos.XY(); - pp->posZset(sect->floorz - PLAYER_HEIGHTF); + pp->setHeightAndZ(sect->floorz, PLAYER_HEIGHTF); pp->vect.Zero(); pp->ovect.Zero(); @@ -5549,11 +5483,8 @@ void DoPlayerDeathJump(PLAYER* pp) // if player gets to close the ceiling while jumping //if (pp->posz < pp->hiz + Z(4)) - if (PlayerCeilingHit(pp, pp->hiz + 4)) + if (pp->aboveCeilZ(pp->hiz + 4)) { - // put player at the ceiling - pp->posZset(pp->hiz + 4); - // reverse your speed to falling pp->jump_speed = -pp->jump_speed; @@ -5591,7 +5522,7 @@ void DoPlayerDeathFall(PLAYER* pp) else loz = pp->loz; - if (PlayerFloorHit(pp, loz - PLAYER_DEATH_HEIGHTF)) + if (pp->belowFloorZ(loz, PLAYER_DEATH_HEIGHTF)) { if (loz != pp->loz) SpawnSplash(pp->actor); @@ -5601,7 +5532,6 @@ void DoPlayerDeathFall(PLAYER* pp) else PlaySound(DIGI_BODYFALL2, pp, v3df_dontpan); - pp->posZset(loz - PLAYER_DEATH_HEIGHTF); pp->Flags &= ~(PF_FALLING); } } @@ -6074,7 +6004,7 @@ void DoPlayerDeathCheckKeys(PLAYER* pp) { // Spawn a dead LoWang body for non-head deaths // Hey Frank, if you think of a better check, go ahead and put it in. - if (PlayerFloorHit(pp, pp->loz - PLAYER_HEIGHTF)) + if (plActor->spr.pos.Z > pp->loz) { if (pp->DeathType == PLAYER_DEATH_FLIP || pp->DeathType == PLAYER_DEATH_RIPPER) QueueLoWangs(pp->actor); @@ -6345,9 +6275,8 @@ void DoPlayerDeathDrown(PLAYER* pp) pp->posZadd(2); // Stick like glue when you hit the ground - if (pp->posZget() > pp->loz - PLAYER_DEATH_HEIGHTF) + if (pp->belowFloorZ(pp->loz, PLAYER_DEATH_HEIGHTF)) { - pp->posZset(pp->loz - PLAYER_DEATH_HEIGHTF); pp->Flags &= ~(PF_FALLING); } } @@ -6600,7 +6529,7 @@ void DoPlayerRun(PLAYER* pp) //DoPlayerHeight(pp); //DoPlayerHeight(pp); //DoPlayerHeight(pp); - pp->posZset(pp->loz - PLAYER_HEIGHTF); + pp->setHeightAndZ(pp->loz, PLAYER_HEIGHTF); DoPlayerBeginJump(pp); return; } @@ -6695,7 +6624,7 @@ void DoPlayerRun(PLAYER* pp) if ((pp->cursector && pp->cursector->extra & SECTFX_DYNAMIC_AREA)) { - pp->posZset(pp->loz - PLAYER_HEIGHTF); + pp->setHeightAndZ(pp->loz, PLAYER_HEIGHTF); } // Adjust height moving up and down sectors diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp index de4b6e070..fce49f17f 100644 --- a/source/games/sw/src/track.cpp +++ b/source/games/sw/src/track.cpp @@ -1743,8 +1743,7 @@ PlayerPart: { // move up some for really fast moving plats DoPlayerZrange(pp); - pp->posZset(pp->loz - PLAYER_CRAWL_HEIGHTF); - pp->actor->spr.pos.Z = pp->loz; + pp->setHeightAndZ(pp->loz, PLAYER_CRAWL_HEIGHTF); } else { @@ -1753,8 +1752,7 @@ PlayerPart: if (!(pp->Flags & (PF_JUMPING | PF_FALLING | PF_FLYING))) { - pp->posZset(pp->loz - PLAYER_HEIGHTF); - pp->actor->spr.pos.Z = pp->loz; + pp->setHeightAndZ(pp->loz, PLAYER_HEIGHTF); } } }