diff --git a/source/core/coreactor.h b/source/core/coreactor.h index df8e3605f..5847d7083 100644 --- a/source/core/coreactor.h +++ b/source/core/coreactor.h @@ -117,6 +117,10 @@ public: spr.__int_angle = int16_t(a); } + void add_int_ang(int a) + { + spr.__int_angle += int16_t(a); + } // Same as above but with invertex y and z axes to match the renderer's coordinate system. DVector3 render_pos() const diff --git a/source/core/maptypes.h b/source/core/maptypes.h index e1cf39d3c..2092cbc6b 100644 --- a/source/core/maptypes.h +++ b/source/core/maptypes.h @@ -503,6 +503,11 @@ struct spritetypebase __int_angle = int16_t(a); } + void copy_ang(const spritetypebase* other) + { + __int_angle = other->int_ang(); + } + }; diff --git a/source/core/rendering/scene/hw_walls.cpp b/source/core/rendering/scene/hw_walls.cpp index 0f0670eb0..4eee3c118 100644 --- a/source/core/rendering/scene/hw_walls.cpp +++ b/source/core/rendering/scene/hw_walls.cpp @@ -1102,7 +1102,7 @@ void HWWall::Process(HWDrawInfo* di, walltype* wal, sectortype* frontsector, sec int HWWall::CheckWallSprite(tspritetype* spr, tspritetype* last) { // If the position changed we need to recalculate everything. - if (spr->pos.XY() != last->pos.XY() || spr->sectp != last->sectp || spr->__int_angle != last->int_ang()) return 3; + if (spr->pos.XY() != last->pos.XY() || spr->sectp != last->sectp || spr->int_ang() != last->int_ang()) return 3; // if the horizontal orientation changes we need to recalculate the walls this attaches to, but not the positioning. if (spr->xrepeat != last->xrepeat || spr->xoffset != last->xoffset || spr->picnum != last->picnum || ((spr->cstat ^ last->cstat) & CSTAT_SPRITE_XFLIP)) return 2; diff --git a/source/games/blood/src/animatesprite.cpp b/source/games/blood/src/animatesprite.cpp index 7edd58ba1..cf368e222 100644 --- a/source/games/blood/src/animatesprite.cpp +++ b/source/games/blood/src/animatesprite.cpp @@ -101,7 +101,7 @@ tspritetype* viewInsertTSprite(tspriteArray& tsprites, sectortype* pSector, int { pos = parentTSprite->pos; pTSprite->ownerActor = parentTSprite->ownerActor; - pTSprite->__int_angle = parentTSprite->int_ang(); + pTSprite->copy_ang(parentTSprite); } pos.X += gCameraAng.fcos() * 2; pos.Y += gCameraAng.fsin() * 2; @@ -451,7 +451,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF pNSprite->pal = 2; pNSprite->xrepeat = pNSprite->yrepeat = 64; pNSprite->cstat |= CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR | CSTAT_SPRITE_YFLIP | CSTAT_SPRITE_TRANSLUCENT; - pNSprite->__int_angle = pTSprite->int_ang(); + pNSprite->copy_ang(pTSprite); pNSprite->ownerActor = pTSprite->ownerActor; break; } @@ -469,7 +469,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF pNSprite->pal = 2; pNSprite->xrepeat = pNSprite->yrepeat = nShade; pNSprite->cstat |= CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR | CSTAT_SPRITE_TRANSLUCENT; - pNSprite->__int_angle = pTSprite->int_ang(); + pNSprite->copy_ang(pTSprite); pNSprite->ownerActor = pTSprite->ownerActor; break; } @@ -507,7 +507,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF auto& nVoxel = voxelIndex[nTile]; if (cl_showweapon == 2 && r_voxels && nVoxel != -1) { - pNSprite->__int_angle = (gView->actor->int_ang() + 512) & 2047; // always face viewer + pNSprite->set_int_ang((gView->actor->int_ang() + 512) & 2047); // always face viewer pNSprite->cstat |= CSTAT_SPRITE_ALIGNMENT_SLAB; pNSprite->cstat &= ~CSTAT_SPRITE_YFLIP; pNSprite->picnum = nVoxel; @@ -517,7 +517,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF pNSprite->add_int_y(MulScale(128, Sin(gView->actor->int_ang()), 30)); } if ((pPlayer->curWeapon == kWeapLifeLeech) || (pPlayer->curWeapon == kWeapVoodooDoll)) // make lifeleech/voodoo doll always face viewer like sprite - pNSprite->__int_angle = (pNSprite->int_ang() + 512) & 2047; // offset angle 90 degrees + pNSprite->set_int_ang((pNSprite->int_ang() + 512) & 2047); // offset angle 90 degrees } break; } @@ -579,7 +579,7 @@ void viewProcessSprites(tspriteArray& tsprites, int32_t cX, int32_t cY, int32_t if (cl_interpolate && owneractor->interpolated && !(pTSprite->flags & 512)) { pTSprite->pos = owneractor->interpolatedvec3(gInterpolate); - pTSprite->__int_angle = owneractor->interpolatedang(gInterpolate); + pTSprite->set_int_ang(owneractor->interpolatedang(gInterpolate)); } int nAnim = 0; switch (picanm[nTile].extra & 7) { @@ -669,7 +669,7 @@ void viewProcessSprites(tspriteArray& tsprites, int32_t cX, int32_t cY, int32_t pTSprite->picnum = voxelIndex[pTSprite->picnum]; if ((picanm[nTile].extra & 7) == 7) { - pTSprite->__int_angle = myclock & 2047; + pTSprite->set_int_ang( myclock & 2047); } } } diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index 25eb14d31..5974a4177 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -1357,7 +1357,7 @@ void nnExtProcessSuperSprites() if (debrisactor->vel.X || debrisactor->vel.Y) debrisactor->xspr.goalAng = getangle(debrisactor->vel.X, debrisactor->vel.Y) & 2047; - int ang = debrisactor->spr.__int_angle & 2047; + int ang = debrisactor->int_ang() & 2047; if ((uwater = spriteIsUnderwater(debrisactor)) == false) evKillActor(debrisactor, kCallbackEnemeyBubble); else if (Chance(0x1000 - mass)) { @@ -4604,7 +4604,7 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH) switch (cond) { default: break; - case 0: return condCmp((arg3 == 0) ? (objActor->spr.__int_angle & 2047) : objActor->int_ang(), arg1, arg2, cmpOp); + case 0: return condCmp((arg3 == 0) ? (objActor->int_ang() & 2047) : objActor->int_ang(), arg1, arg2, cmpOp); case 5: return condCmp(objActor->spr.statnum, arg1, arg2, cmpOp); case 6: return ((objActor->spr.flags & kHitagRespawn) || objActor->spr.statnum == kStatRespawn); case 7: return condCmp(spriteGetSlope(objActor), arg1, arg2, cmpOp); @@ -8098,7 +8098,7 @@ void aiPatrolStop(DBloodActor* actor, DBloodActor* targetactor, bool alarm) if (mytarget && mytarget->spr.type == kMarkerPath) { - if (targetactor == nullptr) actor->set_int_ang(mytarget->spr.__int_angle & 2047); + if (targetactor == nullptr) actor->set_int_ang(mytarget->int_ang() & 2047); actor->SetTarget(nullptr); } diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index 3df2a5bbe..ea2706027 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -2661,7 +2661,7 @@ void handle_se00(DDukeActor* actor) return; } - if (Owner->spr.__int_angle > 1024) + if (Owner->int_ang() > 1024) l = -1; else l = 1; if (actor->temp_data[3] == 0) @@ -4497,7 +4497,7 @@ void handle_se32(DDukeActor *actor) return; } - if ((actor->spr.__int_angle & 2047) == 1536) + if ((actor->int_ang() & 2047) == 1536) { if (abs(sc->int_ceilingz() - actor->int_pos().Z) < (actor->spr.yvel << 1)) { @@ -4721,7 +4721,7 @@ void handle_se31(DDukeActor* actor, bool choosedir) return; } - if ((actor->spr.__int_angle & 2047) == 1536) + if ((actor->int_ang() & 2047) == 1536) { if (abs(actor->int_pos().Z - sec->int_floorz()) < actor->spr.yvel) { diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index a298e4aa0..599273722 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -1049,7 +1049,7 @@ void checkhitsprite_d(DDukeActor* targ, DDukeActor* proj) if (proj->spr.picnum == QUEBALL || proj->spr.picnum == STRIPEBALL) { proj->spr.xvel = (targ->spr.xvel >> 1) + (targ->spr.xvel >> 2); - proj->spr.__int_angle -= (targ->spr.__int_angle << 1) + 1024; + proj->spr.__int_angle -= (targ->int_ang() << 1) + 1024; targ->set_int_ang(getangle(targ->int_pos().X - proj->int_pos().X, targ->int_pos().Y - proj->int_pos().Y) - 512); if (S_CheckSoundPlaying(POOLBALLHIT) < 2) S_PlayActorSound(POOLBALLHIT, targ); diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index e55345430..1adc9189e 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -2076,7 +2076,7 @@ void checkhitsprite_r(DDukeActor* targ, DDukeActor* proj) if (proj->spr.picnum == QUEBALL || proj->spr.picnum == STRIPEBALL) { proj->spr.xvel = (targ->spr.xvel >> 1) + (targ->spr.xvel >> 2); - proj->spr.__int_angle -= (targ->spr.__int_angle << 1) + 1024; + proj->spr.__int_angle -= (targ->int_ang() << 1) + 1024; targ->set_int_ang(getangle(targ->int_pos().X - proj->int_pos().X, targ->int_pos().Y - proj->int_pos().Y) - 512); if (S_CheckSoundPlaying(POOLBALLHIT) < 2) S_PlayActorSound(POOLBALLHIT, targ); @@ -2084,14 +2084,14 @@ void checkhitsprite_r(DDukeActor* targ, DDukeActor* proj) else if (proj->spr.picnum == BOWLINGPIN || proj->spr.picnum == BOWLINGPIN + 1) { proj->spr.xvel = (targ->spr.xvel >> 1) + (targ->spr.xvel >> 2); - proj->spr.__int_angle -= ((targ->spr.__int_angle << 1) + krand()) & 64; + proj->spr.__int_angle -= ((targ->int_ang() << 1) + krand()) & 64; targ->set_int_ang((targ->int_ang() + krand()) & 16); S_PlayActorSound(355, targ); } else if (proj->spr.picnum == HENSTAND || proj->spr.picnum == HENSTAND + 1) { proj->spr.xvel = (targ->spr.xvel >> 1) + (targ->spr.xvel >> 2); - proj->spr.__int_angle -= ((targ->spr.__int_angle << 1) + krand()) & 16; + proj->spr.__int_angle -= ((targ->int_ang() << 1) + krand()) & 16; targ->set_int_ang((targ->int_ang() + krand()) & 16); S_PlayActorSound(355, targ); } diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp index eb7af6e48..0efcf698d 100644 --- a/source/games/duke/src/spawn.cpp +++ b/source/games/duke/src/spawn.cpp @@ -899,7 +899,7 @@ void spawneffector(DDukeActor* actor, TArray* actors) break; case SE_11_SWINGING_DOOR://Pivitor rotater - if (actor->spr.__int_angle > 1024) actor->temp_data[3] = 2; + if (actor->int_ang() > 1024) actor->temp_data[3] = 2; else actor->temp_data[3] = -2; [[fallthrough]]; case SE_0_ROTATING_SECTOR: diff --git a/source/games/exhumed/src/anubis.cpp b/source/games/exhumed/src/anubis.cpp index 9115a72b0..f02378984 100644 --- a/source/games/exhumed/src/anubis.cpp +++ b/source/games/exhumed/src/anubis.cpp @@ -171,7 +171,7 @@ void AIAnubis::Tick(RunListEvent* ev) { PlotCourseToSprite(ap, pTarget); - int nAngle = ap->spr.__int_angle & 0xFFF8; + int nAngle = ap->int_ang() & 0xFFF8; ap->spr.xvel = bcos(nAngle, -2); ap->spr.yvel = bsin(nAngle, -2); } diff --git a/source/games/exhumed/src/lion.cpp b/source/games/exhumed/src/lion.cpp index f56c9e8ea..affd2a280 100644 --- a/source/games/exhumed/src/lion.cpp +++ b/source/games/exhumed/src/lion.cpp @@ -276,7 +276,7 @@ void AILion::Tick(RunListEvent* ev) { PlotCourseToSprite(pActor, pTarget); - int nAng = pActor->spr.__int_angle & 0xFFF8; + int nAng = pActor->int_ang() & 0xFFF8; if (pActor->spr.cstat & CSTAT_SPRITE_INVISIBLE) { diff --git a/source/games/exhumed/src/rex.cpp b/source/games/exhumed/src/rex.cpp index 775af43eb..10a86c624 100644 --- a/source/games/exhumed/src/rex.cpp +++ b/source/games/exhumed/src/rex.cpp @@ -257,7 +257,7 @@ void AIRex::Tick(RunListEvent* ev) { if (((PlotCourseToSprite(pActor, pTarget) >> 8) >= 60) || pActor->nCount > 0) { - int nAngle = pActor->spr.__int_angle & 0xFFF8; + int nAngle = pActor->int_ang() & 0xFFF8; pActor->spr.xvel = bcos(nAngle, -2); pActor->spr.yvel = bsin(nAngle, -2); } diff --git a/source/games/exhumed/src/set.cpp b/source/games/exhumed/src/set.cpp index f464868f9..e794111d4 100644 --- a/source/games/exhumed/src/set.cpp +++ b/source/games/exhumed/src/set.cpp @@ -390,7 +390,7 @@ void AISet::Tick(RunListEvent* ev) } // loc_338E2 - int nAngle = pActor->spr.__int_angle & 0xFFF8; + int nAngle = pActor->int_ang() & 0xFFF8; pActor->spr.xvel = bcos(nAngle, -1); pActor->spr.yvel = bsin(nAngle, -1); diff --git a/source/games/sw/src/sprite.cpp b/source/games/sw/src/sprite.cpp index 9e7557895..7ef50ec8a 100644 --- a/source/games/sw/src/sprite.cpp +++ b/source/games/sw/src/sprite.cpp @@ -4700,7 +4700,7 @@ int DoGrating(DSWActor* actor) const int GRATE_FACTOR = 3; // reduce to 0 to 3 value - dir = actor->spr.__int_angle >> 9; + dir = actor->int_ang() >> 9; int x = 0, y = 0; if ((dir & 1) == 0) diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp index aabc3a8c4..fb6abf580 100644 --- a/source/games/sw/src/track.cpp +++ b/source/games/sw/src/track.cpp @@ -1457,7 +1457,7 @@ void PlaceActorsOnTracks(void) actor->user.track = tag - TAG_ACTOR_TRACK_BEGIN; // if facing left go backward - if (actor->spr.__int_angle >= 513 && actor->spr.__int_angle <= 1535) + if (actor->int_ang() >= 513 && actor->int_ang() <= 1535) { actor->user.track_dir = -1; }