- adapted all SW hitscan calls outside of FAFhitscan.

This commit is contained in:
Christoph Oelckers 2021-11-26 01:01:16 +01:00
parent 4bfb03b6b3
commit 3f43f48b57
7 changed files with 74 additions and 64 deletions

View file

@ -107,6 +107,14 @@ struct HitInfoBase
return kHitSector; return kHitSector;
} }
int setSector(sectortype* num)
{
*this = {};
type = kHitSector;
hitSector = num;
return kHitSector;
}
int setWall(int num) int setWall(int num)
{ {
*this = {}; *this = {};
@ -115,6 +123,14 @@ struct HitInfoBase
return kHitWall; return kHitWall;
} }
int setWall(walltype* num)
{
*this = {};
type = kHitWall;
hitWall = num;
return kHitWall;
}
int setSprite(int num) int setSprite(int num)
{ {
*this = {}; *this = {};

View file

@ -903,9 +903,8 @@ post_analyzesprites(spritetype* tsprite, int& spritesortcnt)
void void
CircleCamera(int *nx, int *ny, int *nz, sectortype** vsect, binangle *nang, fixed_t q16horiz) CircleCamera(int *nx, int *ny, int *nz, sectortype** vsect, binangle *nang, fixed_t q16horiz)
{ {
vec3_t n = { *nx, *ny, *nz };
SPRITEp sp; SPRITEp sp;
hitdata_t hit_info; HitInfo hit;
int i, vx, vy, vz, hx, hy; int i, vx, vy, vz, hx, hy;
int bakcstat, daang; int bakcstat, daang;
PLAYERp pp = &Player[screenpeek]; PLAYERp pp = &Player[screenpeek];
@ -932,23 +931,22 @@ CircleCamera(int *nx, int *ny, int *nz, sectortype** vsect, binangle *nang, fixe
// Make sure sector passed to hitscan is correct // Make sure sector passed to hitscan is correct
//updatesector(*nx, *ny, vsect); //updatesector(*nx, *ny, vsect);
hitscan(&n, sectnum(*vsect), vx, vy, vz, &hit_info, CLIPMASK_MISSILE); hitscan({ *nx, *ny, *nz }, *vsect, { vx, vy, vz }, hit, CLIPMASK_MISSILE);
HITINFO hitinfo; hitinfo.set(&hit_info);
sp->cstat = bakcstat; // Restore cstat sp->cstat = bakcstat; // Restore cstat
//ASSERT(hitinfo.sect >= 0); //ASSERT(hitinfo.sect >= 0);
hx = hitinfo.pos.x - (*nx); hx = hit.hitpos.x - (*nx);
hy = hitinfo.pos.y - (*ny); hy = hit.hitpos.y - (*ny);
// If something is in the way, make pp->circle_camera_dist lower if necessary // If something is in the way, make pp->circle_camera_dist lower if necessary
if (abs(vx) + abs(vy) > abs(hx) + abs(hy)) if (abs(vx) + abs(vy) > abs(hx) + abs(hy))
{ {
if (hitinfo.wall()) // Push you a little bit off the wall if (hit.hitWall) // Push you a little bit off the wall
{ {
*vsect = hitinfo.sector(); *vsect = hit.hitSector;
daang = getangle(hitinfo.wall()->delta()); daang = getangle(hit.hitWall->delta());
i = vx * bsin(daang) + vy * -bcos(daang); i = vx * bsin(daang) + vy * -bcos(daang);
if (abs(vx) > abs(vy)) if (abs(vx) > abs(vy))
@ -956,9 +954,9 @@ CircleCamera(int *nx, int *ny, int *nz, sectortype** vsect, binangle *nang, fixe
else else
hy -= MulScale(vy, i, 28); hy -= MulScale(vy, i, 28);
} }
else if (hitinfo.hitactor == nullptr) // Push you off the ceiling/floor else if (hit.actor() == nullptr) // Push you off the ceiling/floor
{ {
*vsect = hitinfo.sector(); *vsect = hit.hitSector;
if (abs(vx) > abs(vy)) if (abs(vx) > abs(vy))
hx -= (vx >> 5); hx -= (vx >> 5);
@ -967,7 +965,7 @@ CircleCamera(int *nx, int *ny, int *nz, sectortype** vsect, binangle *nang, fixe
} }
else else
{ {
SPRITEp hsp = &hitinfo.hitactor->s(); SPRITEp hsp = &hit.actor()->s();
int flag_backup; int flag_backup;
// if you hit a sprite that's not a wall sprite - try again // if you hit a sprite that's not a wall sprite - try again

View file

@ -2651,7 +2651,7 @@ void DoPlayerMoveVehicle(PLAYERp pp)
if (RectClip) if (RectClip)
{ {
hitdata_t hitinfo; HitInfo hit;
int vel; int vel;
int ret; int ret;
@ -2671,17 +2671,16 @@ void DoPlayerMoveVehicle(PLAYERp pp)
{ {
vec3_t hit_pos = { DIV2(x[0] + x[1]), DIV2(y[0] + y[1]), pp->cursector()->floorz - Z(10) }; vec3_t hit_pos = { DIV2(x[0] + x[1]), DIV2(y[0] + y[1]), pp->cursector()->floorz - Z(10) };
hitscan(&hit_pos, pp->cursectnum, hitscan(hit_pos, pp->cursector(),
//pp->xvect, pp->yvect, 0, { MOVEx(256, pp->angle.ang.asbuild()), MOVEy(256, pp->angle.ang.asbuild()), 0 },
MOVEx(256, pp->angle.ang.asbuild()), MOVEy(256, pp->angle.ang.asbuild()), 0, hit, CLIPMASK_PLAYER);
&hitinfo, CLIPMASK_PLAYER);
if (FindDistance2D(hitinfo.pos.x - hit_pos.x, hitinfo.pos.y - hit_pos.y) < 800) if (FindDistance2D(hit.hitpos.x - hit_pos.x, hit.hitpos.y - hit_pos.y) < 800)
{ {
if (hitinfo.wall >= 0) if (hit.hitWall)
u->coll.setWall(hitinfo.wall); u->coll.setWall(wallnum(hit.hitWall));
else if (hitinfo.sprite >= 0) else if (hit.actor())
u->coll.setSprite(&swActors[hitinfo.sprite]); u->coll.setSprite(hit.actor());
else else
u->coll.setNone(); u->coll.setNone();

View file

@ -294,31 +294,29 @@ bool FAFcansee(int32_t xs, int32_t ys, int32_t zs, sectortype* sects,
else else
zvect = 0; zvect = 0;
hitdata_t e_hitinfo; HitInfo hit;
hitscan(&s, sectnum(sects), xvect, yvect, zvect, &e_hitinfo, CLIPMASK_MISSILE); hitscan(s, sects, { xvect, yvect, zvect }, hit, CLIPMASK_MISSILE);
HITINFO hitinfo;
hitinfo.set(&e_hitinfo);
if (hitinfo.sector() == nullptr) if (hit.hitSector == nullptr)
return false; return false;
// make sure it hit JUST a sector before doing a check // make sure it hit JUST a sector before doing a check
if (hitinfo.wall() == nullptr && hitinfo.hitactor == nullptr) if (hit.hitWall == nullptr && hit.actor() == nullptr)
{ {
getzsofslopeptr(hitinfo.sector(), hitinfo.pos.x, hitinfo.pos.y, &hiz, &loz); getzsofslopeptr(hit.hitSector, hit.hitpos.x, hit.hitpos.y, &hiz, &loz);
if (labs(hitinfo.pos.z - loz) < Z(4)) if (labs(hit.hitpos.z - loz) < Z(4))
{ {
if (FAF_ConnectFloor(hitinfo.sector())) if (FAF_ConnectFloor(hit.hitSector))
{ {
updatesectorz(hitinfo.pos.x, hitinfo.pos.y, hitinfo.pos.z + Z(12), &newsect); updatesectorz(hit.hitpos.x, hit.hitpos.y, hit.hitpos.z + Z(12), &newsect);
plax_found = true; plax_found = true;
} }
} }
else if (labs(hitinfo.pos.z - hiz) < Z(4)) else if (labs(hit.hitpos.z - hiz) < Z(4))
{ {
if (FAF_ConnectCeiling(hitinfo.sector())) if (FAF_ConnectCeiling(hit.hitSector))
{ {
updatesectorz(hitinfo.pos.x, hitinfo.pos.y, hitinfo.pos.z - Z(12), &newsect); updatesectorz(hit.hitpos.x, hit.hitpos.y, hit.hitpos.z - Z(12), &newsect);
plax_found = true; plax_found = true;
} }
} }
@ -329,7 +327,7 @@ bool FAFcansee(int32_t xs, int32_t ys, int32_t zs, sectortype* sects,
} }
if (plax_found) if (plax_found)
return !!cansee(hitinfo.pos.x,hitinfo.pos.y,hitinfo.pos.z,newsect,xe,ye,ze,secte); return !!cansee(hit.hitpos.x, hit.hitpos.y, hit.hitpos.z, newsect, xe, ye, ze, secte);
return false; return false;
} }

View file

@ -1940,21 +1940,18 @@ void SpriteSetup(void)
case SECT_WALL_PAN_SPEED: case SECT_WALL_PAN_SPEED:
{ {
vec3_t hit_pos = { sp->x, sp->y, sp->z - Z(8) }; vec3_t hit_pos = { sp->x, sp->y, sp->z - Z(8) };
hitdata_t hitinfo; HitInfo hit;
hitscan(&hit_pos, sp->sectnum, // Start position hitscan(hit_pos, sp->sector(), // Start position
bcos(sp->ang), // X vector of 3D ang { bcos(sp->ang), bsin(sp->ang), 0 }, hit, CLIPMASK_MISSILE);
bsin(sp->ang), // Y vector of 3D ang
0, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.wall == -1) if (hit.hitWall == nullptr)
{ {
KillActor(actor); KillActor(actor);
break; break;
} }
actor->tempwall = &wall[hitinfo.wall]; actor->tempwall = hit.hitWall;
// if moves with SO // if moves with SO
if (TEST_BOOL1(sp)) if (TEST_BOOL1(sp))
sp->xvel = 0; sp->xvel = 0;
@ -1962,9 +1959,9 @@ void SpriteSetup(void)
sp->xvel = sp->lotag; sp->xvel = sp->lotag;
sp->ang = SP_TAG6(sp); sp->ang = SP_TAG6(sp);
// attach to the sector that contains the wall // attach to the sector that contains the wall
ChangeActorSect(actor, hitinfo.sect); ChangeActorSect(actor, hit.hitSector);
StartInterpolation(hitinfo.wall, Interp_Wall_PanX); StartInterpolation(hit.hitWall, Interp_Wall_PanX);
StartInterpolation(hitinfo.wall, Interp_Wall_PanY); StartInterpolation(hit.hitWall, Interp_Wall_PanY);
change_actor_stat(actor, STAT_WALL_PAN); change_actor_stat(actor, STAT_WALL_PAN);
break; break;
} }
@ -1972,21 +1969,18 @@ void SpriteSetup(void)
case WALL_DONT_STICK: case WALL_DONT_STICK:
{ {
vec3_t hit_pos = { sp->x, sp->y, sp->z - Z(8) }; vec3_t hit_pos = { sp->x, sp->y, sp->z - Z(8) };
hitdata_t hitinfo; HitInfo hit;
hitscan(&hit_pos, sp->sectnum, // Start position hitscan(hit_pos, sp->sector(), // Start position
bcos(sp->ang), // X vector of 3D ang { bcos(sp->ang), bsin(sp->ang), 0 }, hit, CLIPMASK_MISSILE);
bcos(sp->ang), // Y vector of 3D ang
0, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.wall == -1) if (hit.hitWall == nullptr)
{ {
KillActor(actor); KillActor(actor);
break; break;
} }
SET(wall[hitinfo.wall].extra, WALLFX_DONT_STICK); SET(hit.hitWall->extra, WALLFX_DONT_STICK);
KillActor(actor); KillActor(actor);
break; break;
} }

View file

@ -46,6 +46,15 @@ extern DSWActor swActors[MAXSPRITES];
inline DSWActor* DSWActor::base() { return swActors; } inline DSWActor* DSWActor::base() { return swActors; }
// subclassed to add a game specific actor() method
struct HitInfo : public HitInfoBase
{
DSWActor* actor() const
{
return static_cast<DSWActor*>(hitActor);
}
};
// Iterator wrappers that return an actor pointer, not an index. // Iterator wrappers that return an actor pointer, not an index.
class SWStatIterator : public StatIterator class SWStatIterator : public StatIterator
{ {

View file

@ -4478,21 +4478,17 @@ bool WeaponMoveHit(DSWActor* actor)
// clipmove does not correctly return the sprite for WALL sprites // clipmove does not correctly return the sprite for WALL sprites
// on walls, so look with hitscan // on walls, so look with hitscan
hitdata_t hitinfo; HitInfo hit;
hitscan(&sp->pos, sp->sectnum, // Start position hitscan(sp->pos, sp->sector(), { bcos(sp->ang), bsin(sp->ang), sp->zvel }, hit, CLIPMASK_MISSILE);
bcos(sp->ang), // X vector of 3D ang
bsin(sp->ang), // Y vector of 3D ang
sp->zvel, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.sect < 0) if (!hit.hitSector)
{ {
return false; return false;
} }
if (hitinfo.sprite >= 0) if (hit.actor())
{ {
auto hitActor = &swActors[hitinfo.sprite]; auto hitActor = hit.actor();
SPRITEp hsp = &hitActor->s(); SPRITEp hsp = &hitActor->s();
if (hsp->lotag == TAG_SPRITE_HIT_MATCH) if (hsp->lotag == TAG_SPRITE_HIT_MATCH)