diff --git a/source/games/duke/src/animatesprites_d.cpp b/source/games/duke/src/animatesprites_d.cpp index 033928ba5..388245fdd 100644 --- a/source/games/duke/src/animatesprites_d.cpp +++ b/source/games/duke/src/animatesprites_d.cpp @@ -46,6 +46,7 @@ BEGIN_DUKE_NS void animatesprites_d(tspriteArray& tsprites, int x, int y, int a, int smoothratio) { + DVector2 viewVec(x * inttoworld, y * inttoworld); int k, p; int l, t1, t3, t4; tspritetype* t; @@ -219,7 +220,7 @@ void animatesprites_d(tspriteArray& tsprites, int x, int y, int a, int smoothrat t->xrepeat = 0; else { - t->set_int_ang(getangle(x - t->int_pos().X, y - t->int_pos().Y)); + t->angle = VecToAngle(viewVec - t->pos.XY()); t->pos.X = OwnerAc->spr.pos.X + t->angle.Cos(); t->pos.Y = OwnerAc->spr.pos.Y + t->angle.Sin(); } @@ -260,7 +261,7 @@ void animatesprites_d(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; } - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { @@ -278,7 +279,7 @@ void animatesprites_d(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; } - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); if (h->temp_data[0] < 4) k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); else k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); @@ -510,7 +511,7 @@ void animatesprites_d(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; case 5: - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) >> 8) & 7; if (k > 4) { @@ -520,7 +521,7 @@ void animatesprites_d(tspriteArray& tsprites, int x, int y, int a, int smoothrat else t->cstat &= ~CSTAT_SPRITE_XFLIP; break; case 7: - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { diff --git a/source/games/duke/src/animatesprites_r.cpp b/source/games/duke/src/animatesprites_r.cpp index f73fdc69b..d06545e49 100644 --- a/source/games/duke/src/animatesprites_r.cpp +++ b/source/games/duke/src/animatesprites_r.cpp @@ -39,6 +39,7 @@ BEGIN_DUKE_NS void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothratio) { + DVector2 viewVec(x * inttoworld, y * inttoworld); int k, p; int l, t1, t3, t4; tspritetype* t; @@ -213,7 +214,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat t->xrepeat = 0; else { - t->set_int_ang(getangle(x - t->int_pos().X, y - t->int_pos().Y)); + t->angle = VecToAngle(viewVec - t->pos.XY()); t->pos.X = OwnerAc->spr.pos.X + t->angle.Cos(); t->pos.Y = OwnerAc->spr.pos.Y + t->angle.Sin(); } @@ -254,7 +255,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat } else if (OwnerAc->spr.picnum == MAMA) { - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) >> 8) & 7; if (k > 4) { @@ -272,7 +273,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; case EMPTYBIKE: if (!isRRRA()) goto default_case; - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { @@ -284,7 +285,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; case EMPTYBOAT: if (!isRRRA()) goto default_case; - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { @@ -295,7 +296,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat t->picnum = EMPTYBOAT + k; break; case RPG: - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { @@ -307,7 +308,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; case RPG2: if (!isRRRA()) goto default_case; - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { @@ -320,7 +321,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat case RECON: - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); if (h->temp_data[0] < 4) k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); else k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); @@ -642,7 +643,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat break; case 5: - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) >> 8) & 7; if (k > 4) { @@ -652,7 +653,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat else t->cstat &= ~CSTAT_SPRITE_XFLIP; break; case 7: - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) / 170); if (k > 6) { @@ -669,7 +670,7 @@ void animatesprites_r(tspriteArray& tsprites, int x, int y, int a, int smoothrat bg = badguy(h); if (bg && h->spr.statnum == 2 && h->spr.extra > 0) { - k = getangle(h->int_pos().X - x, h->int_pos().Y - y); + k = getangle(h->spr.pos - viewVec); k = (((h->int_ang() + 3072 + 128 - k) & 2047) >> 8) & 7; if (k > 4) {