diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index a3bc5cbaf..3f98add75 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -2845,8 +2845,8 @@ static DBloodActor* actDropKey(DBloodActor* actor, int nType) { act2->addX(); act2->x().respawn = 3; - act2->hit.florhit = 0; - act2->hit.ceilhit = 0; + act2->hit.florhit.setNone(); + act2->hit.ceilhit.setNone(); } return act2; } @@ -4205,15 +4205,15 @@ static void checkCeilHit(DBloodActor* actor) auto pSprite = &actor->s(); auto pXSprite = actor->hasX() ? &actor->x() : nullptr; - Collision coll(actor->hit.ceilhit); + const auto& coll = actor->hit.ceilhit; switch (coll.type) { case kHitWall: break; case kHitSprite: - if (coll.actor->hasX()) + if (coll.actor()->hasX()) { - auto actor2 = coll.actor; + auto actor2 = coll.actor(); spritetype* pSprite2 = &actor2->s(); XSPRITE* pXSprite2 = &actor2->x(); if ((pSprite2->statnum == kStatThing || pSprite2->statnum == kStatDude) && (actor->xvel != 0 || actor->yvel != 0 || actor->zvel != 0)) @@ -4313,15 +4313,15 @@ static void checkHit(DBloodActor* actor) auto pSprite = &actor->s(); auto pXSprite = actor->hasX() ? &actor->x() : nullptr; - Collision coll(actor->hit.hit); + const auto& coll = actor->hit.ceilhit; switch (coll.type) { case kHitWall: break; case kHitSprite: - if (coll.actor->hasX()) + if (coll.actor()->hasX()) { - auto actor2 = coll.actor; + auto actor2 = coll.actor(); spritetype* pSprite2 = &actor2->s(); #ifdef NOONE_EXTENSIONS @@ -4386,18 +4386,18 @@ static void checkFloorHit(DBloodActor* actor) { auto pSprite = &actor->s(); - Collision coll(actor->hit.florhit); + const auto& coll = actor->hit.ceilhit; switch (coll.type) { case kHitWall: break; case kHitSector: - actTouchFloor(actor, coll.sector()); + actTouchFloor(actor, coll.hitSector); break; case kHitSprite: - if (coll.actor->hasX()) + if (coll.actor()->hasX()) { - auto actor2 = coll.actor; + auto actor2 = coll.actor(); spritetype* pSprite2 = &actor2->s(); XSPRITE* pXSprite2 = &actor2->x(); @@ -4528,7 +4528,7 @@ static void ProcessTouchObjects(DBloodActor* actor) { if (coll->type == kHitSprite) { - actor2 = coll->actor; + actor2 = coll->actor(); break; } } @@ -4541,11 +4541,11 @@ static void ProcessTouchObjects(DBloodActor* actor) } // Touch walls - Collision coll = actor->hit.hit; + const auto& coll = actor->hit.ceilhit; walltype* pHWall = nullptr; if (coll.type == kHitWall) { - pHWall = coll.wall(); + pHWall = coll.hitWall; if (pHWall && pHWall->hasX()) { if (pHWall->xw().triggerTouch && !pHWall->xw().isTriggered && (!pHWall->xw().dudeLockout || actor->IsPlayerActor())) @@ -4616,7 +4616,8 @@ static Collision MoveThing(DBloodActor* actor) pSprite->cstat &= ~257; if ((actor->GetOwner()) && !cl_bloodvanillaexplosions && !VanillaMode()) enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy - lhit = actor->hit.hit = ClipMove(&pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, pSprite->clipdist << 2, (pSprite->z - top) / 4, (bottom - pSprite->z) / 4, CLIPMASK0); + ClipMove(pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, pSprite->clipdist << 2, (pSprite->z - top) / 4, (bottom - pSprite->z) / 4, CLIPMASK0, lhit); + actor->hit.hit = lhit; enginecompatibility_mode = bakCompat; // restore pSprite->cstat = bakCstat; assert(pSector); @@ -4629,7 +4630,7 @@ static Collision MoveThing(DBloodActor* actor) Collision &coll = actor->hit.hit; if (coll.type == kHitWall) { - actWallBounceVector(&actor->xvel, &actor->yvel, coll.wall(), pThingInfo->elastic); + actWallBounceVector(&actor->xvel, &actor->yvel, coll.hitWall, pThingInfo->elastic); switch (pSprite->type) { case kThingZombieHead: @@ -4733,7 +4734,7 @@ static Collision MoveThing(DBloodActor* actor) } else { - actor->hit.florhit = 0; + actor->hit.florhit.setNone(); if (pSprite->flags & 2) pSprite->flags |= 4; @@ -4766,7 +4767,7 @@ static Collision MoveThing(DBloodActor* actor) } } } - else actor->hit.ceilhit = 0; + else actor->hit.ceilhit.setNone(); if (bottom >= floorZ) { @@ -4776,7 +4777,7 @@ static Collision MoveThing(DBloodActor* actor) if (coll.type == kHitSprite) { - auto hitActor = coll.actor; + auto hitActor = coll.actor(); auto hitSpr = &hitActor->s(); if ((hitSpr->cstat & 0x30) == 0) { @@ -4839,7 +4840,7 @@ void MoveDude(DBloodActor* actor) { auto bakCstat = pSprite->cstat; pSprite->cstat &= ~257; - actor->hit.hit = ClipMove(&pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, wd, tz, bz, CLIPMASK0); + ClipMove(pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, wd, tz, bz, CLIPMASK0, actor->hit.hit); if (pSector == nullptr) { pSector = pSprite->sector(); @@ -4863,34 +4864,34 @@ void MoveDude(DBloodActor* actor) { case kHitSprite: { - spritetype* pHitSprite = &coll.actor->s(); - XSPRITE* pHitXSprite = coll.actor->hasX() ? &coll.actor->x() : nullptr;; + spritetype* pHitSprite = &coll.actor()->s(); + XSPRITE* pHitXSprite = coll.actor()->hasX() ? &coll.actor()->x() : nullptr;; - auto Owner = coll.actor->GetOwner(); + auto Owner = coll.actor()->GetOwner(); if (pHitSprite->statnum == kStatProjectile && !(pHitSprite->flags & 32) && actor != Owner) { auto hitInfo = gHitInfo; gHitInfo.hitActor = actor; - actImpactMissile(coll.actor, 3); + actImpactMissile(coll.actor(), 3); gHitInfo = hitInfo; } #ifdef NOONE_EXTENSIONS if (!gModernMap && pHitXSprite && pHitXSprite->Touch && !pHitXSprite->state && !pHitXSprite->isTriggered) - trTriggerSprite(coll.actor, kCmdSpriteTouch); + trTriggerSprite(coll.actor(), kCmdSpriteTouch); #else if (pHitXSprite && pHitXSprite->Touch && !pHitXSprite->state && !pHitXSprite->isTriggered) trTriggerSprite(coll.actor, kCmdSpriteTouch); #endif if (pDudeInfo->lockOut && pHitXSprite && pHitXSprite->Push && !pHitXSprite->key && !pHitXSprite->DudeLockout && !pHitXSprite->state && !pHitXSprite->busy && !pPlayer) - trTriggerSprite(coll.actor, kCmdSpritePush); + trTriggerSprite(coll.actor(), kCmdSpritePush); break; } case kHitWall: { - walltype* pHitWall = coll.wall(); + walltype* pHitWall = coll.hitWall; XWALL* pHitXWall = nullptr; if (pHitWall->hasX()) pHitXWall = &pHitWall->xw(); @@ -5240,7 +5241,7 @@ void MoveDude(DBloodActor* actor) } else { - actor->hit.florhit = 0; + actor->hit.florhit.setNone(); if (pSprite->flags & 2) pSprite->flags |= 4; @@ -5254,7 +5255,7 @@ void MoveDude(DBloodActor* actor) actor->zvel = MulScale(-actor->zvel, 0x2000, 16); } else - actor->hit.ceilhit = 0; + actor->hit.ceilhit.setNone(); GetActorExtents(actor, &top, &bottom); @@ -5263,7 +5264,7 @@ void MoveDude(DBloodActor* actor) { if (floorColl.type == kHitSprite) { - auto hitAct = floorColl.actor; + auto hitAct = floorColl.actor(); if ((hitAct->s().cstat & 0x30) == 0) { actor->xvel += MulScale(4, pSprite->x - hitAct->s().x, 2); @@ -5347,7 +5348,8 @@ int MoveMissile(DBloodActor* actor) enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy pSprite->cstat &= ~257; // remove self collisions for accurate clipmove } - Collision clipmoveresult = ClipMove(&pos, &pSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0, 1); + Collision clipmoveresult; + ClipMove(pos, &pSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0, clipmoveresult, 1); enginecompatibility_mode = bakCompat; // restore pSprite->cstat = bakSpriteCstat; auto pSector = pSector2; @@ -5358,24 +5360,24 @@ int MoveMissile(DBloodActor* actor) } if (clipmoveresult.type == kHitSprite) { - gHitInfo.hitActor = clipmoveresult.actor; + gHitInfo.hitActor = clipmoveresult.actor(); cliptype = 3; } else if (clipmoveresult.type == kHitWall) { - gHitInfo.hitWall = clipmoveresult.wall(); + gHitInfo.hitWall = clipmoveresult.hitWall; if (!gHitInfo.hitWall->twoSided()) cliptype = 0; else { int32_t fz, cz; - getzsofslopeptr(clipmoveresult.wall()->nextSector(), pos.x, pos.y, &cz, &fz); + getzsofslopeptr(clipmoveresult.hitWall->nextSector(), pos.x, pos.y, &cz, &fz); if (pos.z <= cz || pos.z >= fz) cliptype = 0; else cliptype = 4; } } if (cliptype == 4) { - walltype* pWall = clipmoveresult.wall(); + walltype* pWall = clipmoveresult.hitWall; if (pWall->hasX()) { XWALL* pXWall = &pWall->xw(); @@ -5808,7 +5810,7 @@ static void actCheckThings() { pSprite->xrepeat = 32; pSprite->yrepeat = 32; - actDamageSprite(actor->GetOwner(), hit.actor, kDamageFall, pXSprite->data1); + actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, pXSprite->data1); } break; #endif @@ -5816,7 +5818,7 @@ static void actCheckThings() seqSpawn(24, actor, -1); if (hit.type == kHitSprite) { - actDamageSprite(actor->GetOwner(), hit.actor, kDamageFall, 12); + actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, 12); } break; @@ -5828,7 +5830,7 @@ static void actCheckThings() } else if (hit.type == kHitSprite) { - actDamageSprite(actor->GetOwner(), hit.actor, kDamageFall, 12); + actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, 12); evPostActor(actor, 0, kCallbackFXPodBloodSplat); } break; @@ -6329,8 +6331,8 @@ DBloodActor* actSpawnSprite(sectortype* pSector, int x, int y, int z, int nStat, if (setextra && !actor->hasX()) { actor->addX(); - actor->hit.florhit = 0; - actor->hit.ceilhit = 0; + actor->hit.florhit.setNone(); + actor->hit.ceilhit.setNone(); if (!VanillaMode()) actor->SetTarget(nullptr); } return actor; @@ -6356,8 +6358,8 @@ DBloodActor* actSpawnSprite(DBloodActor* source, int nStat) actor->zvel = source->zvel; pSprite->flags = 0; actor->addX(); - actor->hit.florhit = 0; - actor->hit.ceilhit = 0; + actor->hit.florhit.setNone(); + actor->hit.ceilhit.setNone(); if (!VanillaMode()) actor->SetTarget(nullptr); return actor; } @@ -7285,21 +7287,6 @@ void actBurnSprite(DBloodActor* pSource, DBloodActor* pTarget, int nTime) // //--------------------------------------------------------------------------- -FSerializer& Serialize(FSerializer& arc, const char* keyname, Collision& w, Collision* def) -{ - int empty = 0; - if (arc.isReading()) w = {}; - if (arc.BeginObject(keyname)) - { - arc("type", w.type, &empty) - ("index", w.index, &empty) - ("legacyval", w.legacyVal, &empty) - ("actor", w.actor) - .EndObject(); - } - return arc; -} - FSerializer& Serialize(FSerializer& arc, const char* keyname, SPRITEHIT& w, SPRITEHIT* def) { if (arc.BeginObject(keyname)) diff --git a/source/games/blood/src/actor.h b/source/games/blood/src/actor.h index ec73f35ba..534ed6095 100644 --- a/source/games/blood/src/actor.h +++ b/source/games/blood/src/actor.h @@ -24,9 +24,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_BLD_NS -class DBloodActor; -using HitInfo = THitInfo; - enum DAMAGE_TYPE { kDamageFall = 0, kDamageBurn, diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index 3153c33fa..09caee7af 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -142,7 +142,7 @@ bool CanMove(DBloodActor* actor, DBloodActor* target, int nAngle, int nRange) int nDist = approxDist(x - gHitInfo.hitpos.x, y - gHitInfo.hitpos.y); if (nDist - (pSprite->clipdist << 2) < nRange) { - if (gHitInfo.hitActor == nullptr || target == nullptr || target != gHitInfo.hitActor) + if (gHitInfo.actor() == nullptr || target == nullptr || target != gHitInfo.actor()) return false; return true; } diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index 3cb038ff5..4b9858f07 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -146,8 +146,8 @@ static bool genDudeAdjustSlope(DBloodActor* actor, int dist, int weaponType, int for (int i = -8191; i < 8192; i += by) { HitScan(actor, pSprite->z, bcos(pSprite->ang), bsin(pSprite->ang), i, clipMask, dist); - if (!fStart && actor->GetTarget() == gHitInfo.hitActor) fStart = i; - else if (fStart && actor->GetTarget() != gHitInfo.hitActor) + if (!fStart && actor->GetTarget() == gHitInfo.actor()) fStart = i; + else if (fStart && actor->GetTarget() != gHitInfo.actor()) { fEnd = i; break; @@ -779,7 +779,7 @@ static void unicultThinkChase(DBloodActor* actor) objDist = approxDist(gHitInfo.hitpos.x - pSprite->x, gHitInfo.hitpos.y - pSprite->y); } - if (actor != gHitInfo.hitActor && targetDist > objDist) + if (actor != gHitInfo.actor() && targetDist > objDist) { DBloodActor* hitactor = nullptr; walltype* pHWall = NULL; @@ -889,7 +889,7 @@ static void unicultThinkChase(DBloodActor* actor) { if (genDudeAdjustSlope(actor, dist, weaponType)) break; VectorScan(actor, 0, 0, bcos(pSprite->ang), bsin(pSprite->ang), actor->dudeSlope, dist, 1); - if (actor == gHitInfo.hitActor) break; + if (actor == gHitInfo.actor()) break; bool immune = nnExtIsImmune(hitactor, gVectorData[curWeapon].dmgType); if (!(pXHSprite != NULL && (!immune || (immune && pHSprite->statnum == kStatThing && pXHSprite->Vector)) && !pXHSprite->locked)) @@ -950,7 +950,7 @@ static void unicultThinkChase(DBloodActor* actor) bool masked = (pHWall->cstat & CSTAT_WALL_MASKED); if (masked) VectorScan(actor, 0, 0, bcos(pSprite->ang), bsin(pSprite->ang), actor->dudeSlope, dist, 1); - if ((actor != gHitInfo.hitActor) && (pHWall->type != kWallGib || !masked || pXHWall == NULL || !pXHWall->triggerVector || pXHWall->locked)) + if ((actor != gHitInfo.actor()) && (pHWall->type != kWallGib || !masked || pXHWall == NULL || !pXHWall->triggerVector || pXHWall->locked)) { if (spriteIsUnderwater(actor)) aiGenDudeNewState(actor, &genDudeChaseW); else aiGenDudeNewState(actor, &genDudeChaseL); diff --git a/source/games/blood/src/bloodactor.h b/source/games/blood/src/bloodactor.h index 3d0e3b861..c1455088c 100644 --- a/source/games/blood/src/bloodactor.h +++ b/source/games/blood/src/bloodactor.h @@ -6,87 +6,6 @@ BEGIN_BLD_NS class DBloodActor; -// Wrapper around the insane collision info mess from Build. -struct Collision -{ - int type; - int index; - int legacyVal; // should be removed later, but needed for converting back for unadjusted code. - DBloodActor* actor; - - Collision() = default; - Collision(int legacyval) { setFromEngine(legacyval); } - - // need forward declarations of these. - int actorIndex(DBloodActor*); - DBloodActor* Actor(int); - - int setNone() - { - type = kHitNone; - index = -1; - legacyVal = 0; - actor = nullptr; - return kHitNone; - } - - int setSector(int num) - { - type = kHitSector; - index = num; - legacyVal = type | index; - actor = nullptr; - return kHitSector; - } - int setSector(sectortype* num) - { - type = kHitSector; - index = sectnum(num); - legacyVal = type | index; - actor = nullptr; - return kHitSector; - } - int setWall(int num) - { - type = kHitWall; - index = num; - legacyVal = type | index; - actor = nullptr; - return kHitWall; - } - int setSprite(DBloodActor* num) - { - type = kHitSprite; - index = -1; - legacyVal = type | actorIndex(num); - actor = num; - return kHitSprite; - } - - int setFromEngine(int value) - { - legacyVal = value; - type = value & kHitTypeMask; - if (type == 0) { index = -1; actor = nullptr; } - else if (type != kHitSprite) { index = value & kHitIndexMask; actor = nullptr; } - else { index = -1; actor = Actor(value & kHitIndexMask); } - return type; - } - - walltype* wall() const - { - assert(type == kHitWall); - return &::wall[index]; - } - - sectortype* sector() const - { - assert(type == kHitSector); - return &::sector[index]; - } - -}; - struct SPRITEHIT { Collision hit, ceilhit, florhit; @@ -390,16 +309,6 @@ inline void ChangeActorSect(DBloodActor* actor, sectortype* stat) ChangeSpriteSect(actor->GetSpriteIndex(), sectnum(stat)); } -inline int Collision::actorIndex(DBloodActor* actor) -{ - return int(actor - bloodActors); -} - -inline DBloodActor* Collision::Actor(int a) -{ - return &bloodActors[a]; -} - inline void setActorPos(DBloodActor* actor, vec3_t* pos) { setsprite(actor->GetSpriteIndex(), pos); diff --git a/source/games/blood/src/common_game.h b/source/games/blood/src/common_game.h index b2ec64dc3..5195fe2c5 100644 --- a/source/games/blood/src/common_game.h +++ b/source/games/blood/src/common_game.h @@ -28,6 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "printf.h" #include "v_text.h" #include "seqcb.h" +#include "coreactor.h" BEGIN_BLD_NS diff --git a/source/games/blood/src/gameutil.cpp b/source/games/blood/src/gameutil.cpp index 4895cb7d6..ff18ab949 100644 --- a/source/games/blood/src/gameutil.cpp +++ b/source/games/blood/src/gameutil.cpp @@ -358,7 +358,7 @@ int HitScan(DBloodActor *actor, int z, int dx, int dy, int dz, unsigned int nMas hitscangoal.x = hitscangoal.y = 0x1ffffff; pSprite->cstat = bakCstat; - if (gHitInfo.hitActor != nullptr) + if (gHitInfo.actor() != nullptr) return 3; if (gHitInfo.hitWall != nullptr) { @@ -568,7 +568,7 @@ void GetZRange(DBloodActor *actor, int *ceilZ, Collision *ceilColl, int *floorZ, floorColl->setFromEngine(floorHit); if (floorColl->type == kHitSector) { - auto pSector = floorColl->sector(); + auto pSector = floorColl->hitSector; if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (pSector->floorstat & 1)) *floorZ = 0x7fffffff; if (pSector->hasX()) @@ -588,7 +588,7 @@ void GetZRange(DBloodActor *actor, int *ceilZ, Collision *ceilColl, int *floorZ, } if (ceilColl->type == kHitSector) { - auto pSector = ceilColl->sector(); + auto pSector = ceilColl->hitSector; if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (pSector->ceilingstat & 1)) *ceilZ = 0x80000000; auto actor = pSector->lowerLink; @@ -614,7 +614,7 @@ void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collis floorColl->setFromEngine(floorHit); if (floorColl->type == kHitSector) { - auto pSector = floorColl->sector(); + auto pSector = floorColl->hitSector; if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (pSector->floorstat & 1)) *floorZ = 0x7fffffff; if (pSector->hasX()) @@ -634,7 +634,7 @@ void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collis } if (ceilColl->type == kHitSector) { - auto pSector = ceilColl->sector(); + auto pSector = ceilColl->hitSector; if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (pSector->ceilingstat & 1)) *ceilZ = 0x80000000; auto actor = pSector->lowerLink; @@ -676,20 +676,19 @@ int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3) return approxDist(t1-x1, t2-y1); } -unsigned int ClipMove(vec3_t* pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount) +void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, Collision& hit, int tracecount) { - auto opos = *pos; + auto opos = pos; sectortype* bakSect = *pSector; - unsigned int nRes = clipmove(pos, &bakSect, xv << 14, yv << 14, wd, cd, fd, nMask, tracecount); + clipmove(pos, &bakSect, xv << 14, yv << 14, wd, cd, fd, nMask, hit, tracecount); if (bakSect == nullptr) { - *pos = opos; + pos = opos; } else { *pSector = bakSect; } - return nRes; } BitArray GetClosestSpriteSectors(sectortype* pSector, int x, int y, int nDist, TArray* pWalls, bool newSectCheckMethod) diff --git a/source/games/blood/src/gameutil.h b/source/games/blood/src/gameutil.h index bd0466043..74421c03d 100644 --- a/source/games/blood/src/gameutil.h +++ b/source/games/blood/src/gameutil.h @@ -32,7 +32,6 @@ enum { }; -struct Collision; bool FindSector(int nX, int nY, int nZ, sectortype** ppSector); bool FindSector(int nX, int nY, sectortype** ppSector); @@ -47,7 +46,7 @@ int VectorScan(DBloodActor *pSprite, int nOffset, int nZOffset, int dx, int dy, void GetZRange(DBloodActor *pSprite, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0); void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0); int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3); -unsigned int ClipMove(vec3_t* pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount = 3); +void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, Collision& hit, int tracecount = 3); BitArray GetClosestSpriteSectors(sectortype* pSector, int x, int y, int nDist, TArray* pWalls, bool newSectCheckMethod = false); int picWidth(int nPic, int repeat); int picHeight(int nPic, int repeat); diff --git a/source/games/blood/src/misc.h b/source/games/blood/src/misc.h index 4a40211d0..6f0c9de4b 100644 --- a/source/games/blood/src/misc.h +++ b/source/games/blood/src/misc.h @@ -28,6 +28,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_BLD_NS class DBloodActor; +using HitInfo = THitInfo; +using Collision = TCollision; void playlogos(); unsigned int qrand(void); @@ -110,7 +112,6 @@ extern int nPrecacheCount; void tilePrecacheTile(int nTile, int nType, int palette); -struct Collision; int tileGetSurfType(int hit); int tileGetSurfType(Collision& hit); diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index cf01ee880..45e818dd6 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -1283,7 +1283,7 @@ void nnExtProcessSuperSprites() if (!vector) pSightSpr->cstat &= ~CSTAT_SPRITE_BLOCK_HITSCAN; - if (gHitInfo.hitActor == gSightSpritesList[i]) + if (gHitInfo.actor() == gSightSpritesList[i]) { trTriggerSprite(gHitInfo.actor(), kCmdSpriteSight); break; @@ -1357,7 +1357,7 @@ void nnExtProcessSuperSprites() pPlayer = &gPlayer[a]; auto pact = pPlayer->actor; - if (pact->hit.hit.type == kHitSprite && pact->hit.hit.actor == debrisactor) + if (pact->hit.hit.type == kHitSprite && pact->hit.hit.actor() == debrisactor) { int nSpeed = approxDist(pact->xvel, pact->yvel); nSpeed = ClipLow(nSpeed - MulScale(nSpeed, mass, 6), 0x9000 - (mass << 3)); @@ -1702,8 +1702,9 @@ void debrisMove(int listIndex) auto oldcstat = pSprite->cstat; pSprite->cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN); - moveHit = actor->hit.hit = ClipMove(&pSprite->pos, &pSector, actor->xvel >> 12, - actor->yvel >> 12, clipDist, ceilDist, floorDist, CLIPMASK0); + ClipMove(pSprite->pos, &pSector, actor->xvel >> 12, + actor->yvel >> 12, clipDist, ceilDist, floorDist, CLIPMASK0, moveHit); + actor->hit.hit = moveHit; pSprite->cstat = oldcstat; if (pSprite->sector() != pSector) @@ -1722,7 +1723,7 @@ void debrisMove(int listIndex) if (actor->hit.hit.type == kHitWall) { moveHit = actor->hit.hit; - actWallBounceVector(&actor->xvel, &actor->yvel, moveHit.wall(), tmpFraction); + actWallBounceVector(&actor->xvel, &actor->yvel, moveHit.hitWall, tmpFraction); } } @@ -1883,10 +1884,10 @@ void debrisMove(int listIndex) else if (floorColl.type == kHitSprite) { - if ((floorColl.actor->s().cstat & 0x30) == 0) + if ((floorColl.actor()->s().cstat & 0x30) == 0) { - actor->xvel += MulScale(4, pSprite->x - floorColl.actor->s().x, 2); - actor->yvel += MulScale(4, pSprite->y - floorColl.actor->s().y, 2); + actor->xvel += MulScale(4, pSprite->x - floorColl.actor()->s().x, 2); + actor->yvel += MulScale(4, pSprite->y - floorColl.actor()->s().y, 2); return; } } @@ -3348,11 +3349,11 @@ void useSpriteDamager(DBloodActor* sourceactor, int objType, sectortype* targSec continue; else if (enter) damageSprites(sourceactor, iactor); - else if (floor && hit.florhit.type == kHitSector && hit.florhit.sector() == targSect) + else if (floor && hit.florhit.type == kHitSector && hit.florhit.hitSector == targSect) damageSprites(sourceactor, iactor); - else if (ceil && hit.ceilhit.type == kHitSector && hit.ceilhit.sector() == targSect) + else if (ceil && hit.ceilhit.type == kHitSector && hit.ceilhit.hitSector == targSect) damageSprites(sourceactor, iactor); - else if (wall && hit.hit.type == kHitWall && hit.hit.wall()->sectorp() == targSect) + else if (wall && hit.hit.type == kHitWall && hit.hit.hitWall->sectorp() == targSect) damageSprites(sourceactor, iactor); } break; @@ -4527,15 +4528,15 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH) return condCmp((kPercFull * pXSpr->health) / ClipLow(var, 1), arg1, arg2, cmpOp); case 55: // touching ceil of sector? if (objActor->hit.ceilhit.type != kHitSector) return false; - else if (PUSH) condPush(aCond, objActor->hit.ceilhit.sector()); + else if (PUSH) condPush(aCond, objActor->hit.ceilhit.hitSector); return true; case 56: // touching floor of sector? if (objActor->hit.florhit.type != kHitSector) return false; - else if (PUSH) condPush(aCond, objActor->hit.florhit.sector()); + else if (PUSH) condPush(aCond, objActor->hit.florhit.hitSector); return true; case 57: // touching walls of sector? if (objActor->hit.hit.type != kHitWall) return false; - else if (PUSH) condPush(aCond, objActor->hit.hit.wall()); + else if (PUSH) condPush(aCond, objActor->hit.hit.hitWall); return true; case 58: // touching another sprite? { @@ -4544,15 +4545,15 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH) { case 0: case 1: - if (objActor->hit.florhit.type == kHitSprite) actorvar = objActor->hit.florhit.actor; + if (objActor->hit.florhit.type == kHitSprite) actorvar = objActor->hit.florhit.actor(); if (arg3 || var >= 0) break; [[fallthrough]]; case 2: - if (objActor->hit.hit.type == kHitSprite) actorvar = objActor->hit.hit.actor; + if (objActor->hit.hit.type == kHitSprite) actorvar = objActor->hit.hit.actor(); if (arg3 || var >= 0) break; [[fallthrough]]; case 3: - if (objActor->hit.ceilhit.type == kHitSprite) actorvar = objActor->hit.ceilhit.actor; + if (objActor->hit.ceilhit.type == kHitSprite) actorvar = objActor->hit.ceilhit.actor(); break; } if (actorvar == nullptr) @@ -4567,15 +4568,15 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH) { case 0: case 1: - if (hit.ceilhit.type == kHitSprite && hit.ceilhit.actor == objActor) actorvar = iactor; + if (hit.ceilhit.type == kHitSprite && hit.ceilhit.actor() == objActor) actorvar = iactor; if (arg3 || actorvar) break; [[fallthrough]]; case 2: - if (hit.hit.type == kHitSprite && hit.hit.actor == objActor) actorvar = iactor; + if (hit.hit.type == kHitSprite && hit.hit.actor() == objActor) actorvar = iactor; if (arg3 || actorvar) break; [[fallthrough]]; case 3: - if (hit.florhit.type == kHitSprite && hit.florhit.actor == objActor) actorvar = iactor; + if (hit.florhit.type == kHitSprite && hit.florhit.actor() == objActor) actorvar = iactor; break; } } @@ -7498,7 +7499,7 @@ bool nnExtCanMove(DBloodActor* actor, DBloodActor* target, int nAngle, int nRang HitScan(actor, z, Cos(nAngle) >> 16, Sin(nAngle) >> 16, 0, CLIPMASK0, nRange); int nDist = approxDist(x - gHitInfo.hitpos.x, y - gHitInfo.hitpos.y); if (target != nullptr && nDist - (pSprite->clipdist << 2) < nRange) - return (target == gHitInfo.hitActor); + return (target == gHitInfo.actor()); x += MulScale(nRange, Cos(nAngle), 30); y += MulScale(nRange, Sin(nAngle), 30); @@ -8034,7 +8035,7 @@ void aiPatrolMove(DBloodActor* actor) if (actor->hit.hit.type == kHitSprite) { - auto hitactor = actor->hit.hit.actor; + auto hitactor = actor->hit.hit.actor(); hitactor->x().dodgeDir = -1; pXSprite->dodgeDir = 1; aiMoveDodge(hitactor); @@ -8184,9 +8185,9 @@ bool spritesTouching(DBloodActor *actor1, DBloodActor* actor2) auto hit = &actor1->hit; DBloodActor* hitactor = nullptr; - if (hit->hit.type == kHitSprite) hitactor = hit->hit.actor; - else if (hit->florhit.type == kHitSprite) hitactor = hit->florhit.actor; - else if (hit->ceilhit.type == kHitSprite) hitactor = hit->ceilhit.actor; + if (hit->hit.type == kHitSprite) hitactor = hit->hit.actor(); + else if (hit->florhit.type == kHitSprite) hitactor = hit->florhit.actor(); + else if (hit->ceilhit.type == kHitSprite) hitactor = hit->ceilhit.actor(); else return false; return hitactor->hasX() && hitactor == actor2; } diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp index 30daad311..8ec425c11 100644 --- a/source/games/blood/src/player.cpp +++ b/source/games/blood/src/player.cpp @@ -1251,7 +1251,7 @@ int ActionScan(PLAYER *pPlayer, HitInfo* out) { case 3: { - if (!gHitInfo.hitActor || !gHitInfo.actor()->hasX()) return -1; + if (!gHitInfo.actor() || !gHitInfo.actor()->hasX()) return -1; out->hitActor = gHitInfo.actor(); spritetype* pSprite = &gHitInfo.actor()->s(); XSPRITE* pXSprite = &gHitInfo.actor()->x(); @@ -2145,7 +2145,7 @@ void playerLandingSound(PLAYER *pPlayer) SPRITEHIT* pHit = &pPlayer->actor->hit; if (pHit->florhit.type != kHitNone) { - if (!gGameOptions.bFriendlyFire && pHit->florhit.type == kHitSprite && IsTargetTeammate(pPlayer, &pHit->florhit.actor->s())) + if (!gGameOptions.bFriendlyFire && pHit->florhit.type == kHitSprite && IsTargetTeammate(pPlayer, &pHit->florhit.actor()->s())) return; int nSurf = tileGetSurfType(pHit->florhit); if (nSurf) diff --git a/source/games/blood/src/prediction.cpp b/source/games/blood/src/prediction.cpp index fdc5e5109..9ef102771 100644 --- a/source/games/blood/src/prediction.cpp +++ b/source/games/blood/src/prediction.cpp @@ -384,7 +384,7 @@ static void fakeMoveDude(spritetype *pSprite) { auto bakCstat = pSprite->cstat; pSprite->cstat &= ~257; - predict.at75.hit = ClipMove(&predict.pos, &nSector, predict.xvel >> 12, predict.yvel >> 12, wd, tz, bz, CLIPMASK0); + ClipMove(&predict.pos, &nSector, predict.xvel >> 12, predict.yvel >> 12, wd, tz, bz, CLIPMASK0, predict.at75.hit); if (nSector == -1) nSector = predict.sectnum; diff --git a/source/games/blood/src/tile.cpp b/source/games/blood/src/tile.cpp index 2965af7ff..25caefda6 100644 --- a/source/games/blood/src/tile.cpp +++ b/source/games/blood/src/tile.cpp @@ -82,11 +82,11 @@ int tileGetSurfType(Collision& hit) default: return 0; case kHitSector: - return surfType[hit.sector()->floorpicnum]; + return surfType[hit.hitSector->floorpicnum]; case kHitWall: - return surfType[hit.wall()->picnum]; + return surfType[hit.hitWall->picnum]; case kHitSprite: - return surfType[hit.actor->s().picnum]; + return surfType[hit.actor()->s().picnum]; } }