- first step of replacing hitinfo.hitsect with a pointer.

This takes care of easy to handle common patterns
This commit is contained in:
Christoph Oelckers 2021-11-24 23:47:22 +01:00
parent 1162442068
commit f495097663
8 changed files with 46 additions and 37 deletions

View file

@ -285,7 +285,7 @@ int CanHitPlayer(DSWActor* actor)
zvect,
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return false;
if (hitinfo.hitactor == u->targetActor)

View file

@ -3436,11 +3436,11 @@ int DoPlayerWadeSuperJump(PLAYERp pp)
bsin(pp->angle.ang.asbuild() + angs[i]), // Y vector of 3D ang
0, &hitinfo, CLIPMASK_MISSILE); // Z vector of 3D ang
if (hitinfo.hitwall >= 0 && hitinfo.hitsect >= 0)
if (hitinfo.hitwall >= 0 && hitinfo.sector() != nullptr)
{
hitinfo.hitsect = hitinfo.wall()->nextsector;
hitinfo.setSector(hitinfo.wall()->nextSector());
if (hitinfo.hitsect >= 0 && labs(hitinfo.sector()->floorz - pp->posz) < Z(50))
if (hitinfo.sector() != nullptr && labs(hitinfo.sector()->floorz - pp->posz) < Z(50))
{
if (Distance(pp->posx, pp->posy, hitinfo.pos.x, hitinfo.pos.y) < ((((int)pp->Actor()->s().clipdist)<<2) + 256))
return true;

View file

@ -951,7 +951,7 @@ int InitRipperHang(DSWActor* actor)
&hitinfo, CLIPMASK_MISSILE);
//ASSERT(hitinfo.sect >= 0);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
continue;
dist = Distance(sp->x, sp->y, hitinfo.pos.x, hitinfo.pos.y);

View file

@ -953,7 +953,7 @@ int InitRipper2Hang(DSWActor* actor)
0, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
continue;
dist = Distance(sp->x, sp->y, hitinfo.pos.x, hitinfo.pos.y);

View file

@ -2089,7 +2089,7 @@ bool NearThings(PLAYERp pp)
0, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return false;
if (Distance(hitinfo.pos.x, hitinfo.pos.y, pp->posx, pp->posy) > 1500)

View file

@ -200,6 +200,7 @@ inline int Collision::setFromEngine(int value)
struct HITINFO {
DSWActor* hitactor;
sectortype* hitSector;
int hitsect;
int hitwall;
short hitsprite;
@ -211,18 +212,26 @@ struct HITINFO {
hitsect = hitwall = -1;
hitsprite = -1;
hitactor = nullptr;
hitSector = nullptr;
}
void set(hitdata_t* hit)
{
hitsect = hit->sect;
hitSector = &::sector[hit->sect];
hitwall = hit->wall;
hitsprite = hit->sprite;
hitactor = hit->sprite >= 0 ? &swActors[hit->sprite] : nullptr;
pos = hit->pos;
}
void setSector(sectortype* sect)
{
hitSector = sect;
hitsect = sectnum(sect);
}
walltype* wall() const { return hitwall == -1? nullptr : &::wall[hitwall]; }
sectortype* sector() const { return hitsect == -1 ? nullptr : &::sector[hitsect]; }
sectortype* sector() const { return hitSector; }
};

View file

@ -3142,7 +3142,7 @@ bool ActorTrackDecide(TRACK_POINTp tpoint, DSWActor* actor)
SET(sp->cstat, CSTAT_SPRITE_BLOCK);
ASSERT(hitinfo.hitsect >= 0);
ASSERT(hitinfo.sector() != nullptr);
if (hitinfo.hitactor != nullptr)
return false;

View file

@ -12548,7 +12548,7 @@ int InitSwordAttack(PLAYERp pp)
daz, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return 0;
if (FindDistance3D(pp->posx - hitinfo.pos.x, pp->posy - hitinfo.pos.y, pp->posz - hitinfo.pos.z) < 700)
@ -12738,7 +12738,7 @@ int InitFistAttack(PLAYERp pp)
daz, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return 0;
if (FindDistance3D(pp->posx - hitinfo.pos.x, pp->posy - hitinfo.pos.y, pp->posz - hitinfo.pos.z) < 700)
@ -13508,18 +13508,18 @@ int ContinueHitscan(PLAYERp pp, short sectnum, int x, int y, int z, short ang, i
xvect, yvect, zvect,
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return 0;
if (hitinfo.hitactor == nullptr && hitinfo.hitwall < 0)
{
if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].ceilingz) <= Z(1))
if (labs(hitinfo.pos.z - hitinfo.sector()->ceilingz) <= Z(1))
{
hitinfo.pos.z += Z(16);
if (TEST(sector[hitinfo.hitsect].ceilingstat, CEILING_STAT_PLAX))
if (TEST(hitinfo.sector()->ceilingstat, CEILING_STAT_PLAX))
return 0;
}
else if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].floorz) <= Z(1))
else if (labs(hitinfo.pos.z - hitinfo.sector()->floorz) <= Z(1))
{
}
}
@ -13642,19 +13642,19 @@ int InitShotgun(PLAYERp pp)
xvect, yvect, zvect,
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
{
continue;
}
if (hitinfo.hitactor == nullptr && hitinfo.hitwall < 0)
{
if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].ceilingz) <= Z(1))
if (labs(hitinfo.pos.z - hitinfo.sector()->ceilingz) <= Z(1))
{
hitinfo.pos.z += Z(16);
SET(cstat, CSTAT_SPRITE_YFLIP);
if (TEST(sector[hitinfo.hitsect].ceilingstat, CEILING_STAT_PLAX))
if (TEST(hitinfo.sector()->ceilingstat, CEILING_STAT_PLAX))
continue;
if (SectorIsUnderwaterArea(hitinfo.sector()))
@ -13664,9 +13664,9 @@ int InitShotgun(PLAYERp pp)
continue;
}
}
else if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].floorz) <= Z(1))
else if (labs(hitinfo.pos.z - hitinfo.sector()->floorz) <= Z(1))
{
if (TEST(sector[hitinfo.hitsect].extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
if (TEST(hitinfo.sector()->extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
{
SpawnSplashXY(hitinfo.pos.x,hitinfo.pos.y,hitinfo.pos.z,hitinfo.hitsect);
@ -16201,7 +16201,7 @@ int InitUzi(PLAYERp pp)
xvect,yvect,zvect,
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
{
return 0;
}
@ -16211,12 +16211,12 @@ int InitUzi(PLAYERp pp)
// check to see what you hit
if (hitinfo.hitactor == nullptr && hitinfo.hitwall < 0)
{
if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].ceilingz) <= Z(1))
if (labs(hitinfo.pos.z - hitinfo.sector()->ceilingz) <= Z(1))
{
hitinfo.pos.z += Z(16);
SET(cstat, CSTAT_SPRITE_YFLIP);
if (TEST(sector[hitinfo.hitsect].ceilingstat, CEILING_STAT_PLAX))
if (TEST(hitinfo.sector()->ceilingstat, CEILING_STAT_PLAX))
return 0;
if (SectorIsUnderwaterArea(hitinfo.sector()))
@ -16226,9 +16226,9 @@ int InitUzi(PLAYERp pp)
return 0;
}
}
else if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].floorz) <= Z(1))
else if (labs(hitinfo.pos.z - hitinfo.sector()->floorz) <= Z(1))
{
if (TEST(sector[hitinfo.hitsect].extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
if (TEST(hitinfo.sector()->extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
{
SpawnSplashXY(hitinfo.pos.x,hitinfo.pos.y,hitinfo.pos.z,hitinfo.hitsect);
@ -16749,24 +16749,24 @@ int InitSobjMachineGun(DSWActor* actor, PLAYERp pp)
daz, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
{
return 0;
}
if (hitinfo.hitactor == nullptr && hitinfo.hitwall < 0)
{
if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].ceilingz) <= Z(1))
if (labs(hitinfo.pos.z - hitinfo.sector()->ceilingz) <= Z(1))
{
hitinfo.pos.z += Z(16);
SET(cstat, CSTAT_SPRITE_YFLIP);
if (TEST(sector[hitinfo.hitsect].ceilingstat, CEILING_STAT_PLAX))
if (TEST(hitinfo.sector()->ceilingstat, CEILING_STAT_PLAX))
return 0;
}
else if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].floorz) <= Z(1))
else if (labs(hitinfo.pos.z - hitinfo.sector()->floorz) <= Z(1))
{
if (TEST(sector[hitinfo.hitsect].extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
if (TEST(hitinfo.sector()->extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
{
SpawnSplashXY(hitinfo.pos.x,hitinfo.pos.y,hitinfo.pos.z,hitinfo.hitsect);
return 0;
@ -17158,22 +17158,22 @@ int InitTurretMgun(SECTOR_OBJECTp sop)
xvect>>4, yvect>>4, zvect>>4);
}
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
continue;
if (hitinfo.hitactor == nullptr && hitinfo.hitwall < 0)
{
if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].ceilingz) <= Z(1))
if (labs(hitinfo.pos.z - hitinfo.sector()->ceilingz) <= Z(1))
{
hitinfo.pos.z += Z(16);
SET(cstat, CSTAT_SPRITE_YFLIP);
if (TEST(sector[hitinfo.hitsect].ceilingstat, CEILING_STAT_PLAX))
if (TEST(hitinfo.sector()->ceilingstat, CEILING_STAT_PLAX))
continue;
}
else if (labs(hitinfo.pos.z - sector[hitinfo.hitsect].floorz) <= Z(1))
else if (labs(hitinfo.pos.z - hitinfo.sector()->floorz) <= Z(1))
{
if (TEST(sector[hitinfo.hitsect].extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
if (TEST(hitinfo.sector()->extra, SECTFX_LIQUID_MASK) != SECTFX_LIQUID_NONE)
{
SpawnSplashXY(hitinfo.pos.x,hitinfo.pos.y,hitinfo.pos.z,hitinfo.hitsect);
continue;
@ -17297,7 +17297,7 @@ int InitEnemyUzi(DSWActor* actor)
daz, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return 0;
if (RANDOM_P2(1024<<4)>>4 > 700)
@ -18912,7 +18912,7 @@ DSWActor* QueueWallBlood(DSWActor* actor, short ang)
daz, // Z vector of 3D ang
&hitinfo, CLIPMASK_MISSILE);
if (hitinfo.hitsect < 0)
if (hitinfo.sector() == nullptr)
return nullptr;
const int WALLBLOOD_DIST_MAX = 2500;