- more angles

This commit is contained in:
Christoph Oelckers 2022-08-16 23:25:11 +02:00
parent 2533841541
commit c2f4fa8bb5
15 changed files with 34 additions and 25 deletions

View file

@ -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

View file

@ -503,6 +503,11 @@ struct spritetypebase
__int_angle = int16_t(a);
}
void copy_ang(const spritetypebase* other)
{
__int_angle = other->int_ang();
}
};

View file

@ -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;

View file

@ -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);
}
}
}

View file

@ -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);
}

View file

@ -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)
{

View file

@ -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);

View file

@ -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);
}

View file

@ -899,7 +899,7 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* 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:

View file

@ -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);
}

View file

@ -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)
{

View file

@ -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);
}

View file

@ -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);

View file

@ -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)

View file

@ -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;
}