diff --git a/source/games/sw/src/ai.cpp b/source/games/sw/src/ai.cpp index 364d1087e..67457b495 100644 --- a/source/games/sw/src/ai.cpp +++ b/source/games/sw/src/ai.cpp @@ -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) diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 252f1f464..4089e90d8 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -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; diff --git a/source/games/sw/src/ripper.cpp b/source/games/sw/src/ripper.cpp index c93977cf8..dba944f2f 100644 --- a/source/games/sw/src/ripper.cpp +++ b/source/games/sw/src/ripper.cpp @@ -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); diff --git a/source/games/sw/src/ripper2.cpp b/source/games/sw/src/ripper2.cpp index 71e5a7fe0..4d4d99b21 100644 --- a/source/games/sw/src/ripper2.cpp +++ b/source/games/sw/src/ripper2.cpp @@ -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); diff --git a/source/games/sw/src/sector.cpp b/source/games/sw/src/sector.cpp index 834ce4c7d..6dbe518a7 100644 --- a/source/games/sw/src/sector.cpp +++ b/source/games/sw/src/sector.cpp @@ -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) diff --git a/source/games/sw/src/swactor.h b/source/games/sw/src/swactor.h index 39e733e15..682c76774 100644 --- a/source/games/sw/src/swactor.h +++ b/source/games/sw/src/swactor.h @@ -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; } }; diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp index d0b0d83fc..01cbf2aad 100644 --- a/source/games/sw/src/track.cpp +++ b/source/games/sw/src/track.cpp @@ -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; diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp index 80373a37d..5693d1c2d 100644 --- a/source/games/sw/src/weapon.cpp +++ b/source/games/sw/src/weapon.cpp @@ -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;