From 89ef1c09618073c53494459fb80829e8e08577c2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 1 Nov 2021 19:49:11 +0100 Subject: [PATCH] - DoPlayerZRange + DoPlayerSlide. --- source/games/sw/src/player.cpp | 75 +++++++++++++--------------------- 1 file changed, 28 insertions(+), 47 deletions(-) diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 0deaf522f..b113e8c68 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -1495,31 +1495,6 @@ void DoPlayerTurn(PLAYERp pp, float const avel, double const scaleAdjust) UpdatePlayerSpriteAngle(pp); } -#if 0 -void DoPlayerTurnBoat(PLAYERp pp, float avel) -{ - SECTOR_OBJECTp sop = pp->sop; - - if (sop->drive_angspeed) - { - float drive_oavel = pp->drive_avel; - pp->drive_avel = (MulScaleF(avel, sop->drive_angspeed) + (drive_oavel * (sop->drive_angslide - 1)), 16) / sop->drive_angslide; - - avel = pp->drive_avel; - } - else - { - avel *= synctics * 0.65625; - } - - if (avel != 0) - { - pp->angle.ang += degang(avel); - sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild(); - } -} -#endif - void DoPlayerTurnVehicle(PLAYERp pp, float avel, int z, int floor_dist) { SECTOR_OBJECTp sop = pp->sop; @@ -1542,7 +1517,7 @@ void DoPlayerTurnVehicle(PLAYERp pp, float avel, int z, int floor_dist) if (MultiClipTurn(pp, NORM_ANGLE(sum.asbuild()), z, floor_dist)) { pp->angle.ang = sum; - sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild(); + pp->Actor()->s().ang = pp->angle.ang.asbuild(); } } } @@ -1570,7 +1545,7 @@ void DoPlayerTurnVehicleRect(PLAYERp pp, int *x, int *y, int *ox, int *oy) if (RectClipTurn(pp, NORM_ANGLE(sum.asbuild()), x, y, ox, oy)) { pp->angle.ang = sum; - sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild(); + pp->Actor()->s().ang = pp->angle.ang.asbuild(); } } } @@ -1610,7 +1585,7 @@ void DoPlayerTurnTurret(PLAYERp pp, float avel) } pp->angle.ang = new_ang; - sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild(); + pp->Actor()->s().ang = pp->angle.ang.asbuild(); } OperateSectorObject(pp->sop, pp->angle.ang.asbuild(), pp->sop->xmid, pp->sop->ymid); @@ -1806,7 +1781,7 @@ void UpdatePlayerSprite(PLAYERp pp) if (TEST(pp->Flags, PF_DEAD)) { ChangeActorSect(pp->Actor(), pp->cursectnum); - sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild(); + sp->ang = pp->angle.ang.asbuild(); UpdatePlayerUnderSprite(pp); return; } @@ -1881,9 +1856,9 @@ void UpdatePlayerSprite(PLAYERp pp) UpdatePlayerUnderSprite(pp); - sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild(); + sp->ang = pp->angle.ang.asbuild(); } - + void DoPlayerZrange(PLAYERp pp) { int ceilhit, florhit; @@ -1893,12 +1868,16 @@ void DoPlayerZrange(PLAYERp pp) // Don't let you fall if you're just slightly over a cliff // This function returns the highest and lowest z's // for an entire box, NOT just a point. -Useful for clipping - bakcstat = pp->SpriteP->cstat; - RESET(pp->SpriteP->cstat, CSTAT_SPRITE_BLOCK); + auto sp = &pp->Actor()->s(); + bakcstat = sp->cstat; + RESET(sp->cstat, CSTAT_SPRITE_BLOCK); vec3_t pos = pp->pos; pos.z += Z(8); - FAFgetzrange(pos, pp->cursectnum, &pp->hiz, &ceilhit, &pp->loz, &florhit, ((int)pp->SpriteP->clipdist<<2) - GETZRANGE_CLIP_ADJ, CLIPMASK_PLAYER); - pp->SpriteP->cstat = bakcstat; + FAFgetzrange(pos, pp->cursectnum, &pp->hiz, &ceilhit, &pp->loz, &florhit, ((int)sp->clipdist<<2) - GETZRANGE_CLIP_ADJ, CLIPMASK_PLAYER); + sp->cstat = bakcstat; + + Collision ceilColl(ceilhit); + Collision floorColl(florhit); // 16384+sector (sector first touched) or // 49152+spritenum (sprite first touched) @@ -1907,35 +1886,37 @@ void DoPlayerZrange(PLAYERp pp) pp->lowActor = nullptr; pp->highActor = nullptr; - if (TEST(ceilhit, 0xc000) == 49152) + if (ceilColl.type == kHitSprite) { - pp->highActor = &swActors[ceilhit & 4095]; + pp->highActor = ceilColl.actor; } else { - pp->hi_sectp = §or[ceilhit & 4095]; + pp->hi_sectp = §or[ceilColl.index]; } - if (TEST(florhit, 0xc000) == 49152) + if (floorColl.type == kHitSprite) { - pp->lowActor = &swActors[florhit & 4095]; + pp->lowActor = floorColl.actor; // prevent player from standing on Zombies - if (pp->lowActor->s().statnum == STAT_ENEMY && pp->lowActor->u()->ID == ZOMBIE_RUN_R0) + auto fsp = &floorColl.actor->s(); + if (fsp->statnum == STAT_ENEMY && floorColl.actor->u()->ID == ZOMBIE_RUN_R0) { - pp->lo_sectp = §or[pp->lowActor->s().sectnum]; - pp->loz = pp->lowActor->s().z; + pp->lo_sectp = §or[fsp->sectnum]; + pp->loz = fsp->z; pp->lowActor = nullptr; } } else { - pp->lo_sectp = §or[florhit & 4095]; + pp->lo_sectp = §or[floorColl.index]; } } void DoPlayerSlide(PLAYERp pp) { + auto sp = &pp->Actor()->s(); USERp u = pp->Actor()->u(); int push_ret; @@ -1951,7 +1932,7 @@ void DoPlayerSlide(PLAYERp pp) if (labs(pp->slide_xvect) < 12800 && labs(pp->slide_yvect) < 12800) pp->slide_xvect = pp->slide_yvect = 0; - push_ret = pushmove(&pp->pos, &pp->cursectnum, ((int)pp->SpriteP->clipdist<<2), pp->ceiling_dist, pp->floor_dist, CLIPMASK_PLAYER); + push_ret = pushmove(&pp->pos, &pp->cursectnum, ((int)sp->clipdist<<2), pp->ceiling_dist, pp->floor_dist, CLIPMASK_PLAYER); if (push_ret < 0) { if (!TEST(pp->Flags, PF_DEAD)) @@ -1964,9 +1945,9 @@ void DoPlayerSlide(PLAYERp pp) } return; } - clipmove(&pp->pos, &pp->cursectnum, pp->slide_xvect, pp->slide_yvect, ((int)pp->SpriteP->clipdist<<2), pp->ceiling_dist, pp->floor_dist, CLIPMASK_PLAYER); + clipmove(&pp->pos, &pp->cursectnum, pp->slide_xvect, pp->slide_yvect, ((int)sp->clipdist<<2), pp->ceiling_dist, pp->floor_dist, CLIPMASK_PLAYER); PlayerCheckValidMove(pp); - push_ret = pushmove(&pp->pos, &pp->cursectnum, ((int)pp->SpriteP->clipdist<<2), pp->ceiling_dist, pp->floor_dist, CLIPMASK_PLAYER); + push_ret = pushmove(&pp->pos, &pp->cursectnum, ((int)sp->clipdist<<2), pp->ceiling_dist, pp->floor_dist, CLIPMASK_PLAYER); if (push_ret < 0) { if (!TEST(pp->Flags, PF_DEAD))