From 64789b9111aabca4f3c568badba339676411c893 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 29 Dec 2009 04:50:56 +0000 Subject: [PATCH] - Fixed: Shooting up and down with AArtiPoisonBag3::Use() was completely broken. I don't know what I thinking when I plugged in 2*finesine[pitch] for Hexen's lookdir, because that's totally wrong. Not only is the magnitude far too low, but it also aims in the opposite direction you are looking. The new code only attempts to be close to Hexen's original while looking straight ahead and extrapolates that to other angles using proper 3D math. SVN r2057 (trunk) --- docs/rh-log.txt | 9 +++++++++ src/g_hexen/a_flechette.cpp | 35 ++++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 8c676eb35..ab9dbf4dd 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,12 @@ +December 28, 2009 +- Fixed: Shooting up and down with AArtiPoisonBag3::Use() was completely + broken. I don't know what I thinking when I plugged in 2*finesine[pitch] + for Hexen's lookdir, because that's totally wrong. Not only is the + magnitude far too low, but it also aims in the opposite direction you + are looking. The new code only attempts to be close to Hexen's original + while looking straight ahead and extrapolates that to other angles using + proper 3D math. + December 28, 2009 (Changes by Graf Zahl) - Added full sound definitions for Heretic's ChickenPlayer and Hexen's PigPlayer (submitted by NeuralStunner.) diff --git a/src/g_hexen/a_flechette.cpp b/src/g_hexen/a_flechette.cpp index 884e356fd..ea72cb208 100644 --- a/src/g_hexen/a_flechette.cpp +++ b/src/g_hexen/a_flechette.cpp @@ -104,21 +104,38 @@ bool AArtiPoisonBag3::Use (bool pickup) { AActor *mo; - mo = Spawn ("ThrowingBomb", Owner->x, Owner->y, + mo = Spawn("ThrowingBomb", Owner->x, Owner->y, Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0), ALLOW_REPLACE); if (mo) { - angle_t pitch = (angle_t)Owner->pitch >> ANGLETOFINESHIFT; + mo->angle = Owner->angle + (((pr_poisonbag()&7) - 4) << 24); + + /* Original flight code from Hexen + * mo->momz = 4*FRACUNIT+((player->lookdir)<<(FRACBITS-4)); + * mo->z += player->lookdir<<(FRACBITS-4); + * P_ThrustMobj(mo, mo->angle, mo->info->speed); + * mo->momx += player->mo->momx>>1; + * mo->momy += player->mo->momy>>1; + */ + + // When looking straight ahead, it uses a z velocity of 4 while the xy velocity + // is as set by the projectile. To accomodate this with a proper trajectory, we + // aim the projectile ~20 degrees higher than we're looking at and increase the + // speed we fire at accordingly. + angle_t orgpitch = angle_t(-Owner->pitch) >> ANGLETOFINESHIFT; + angle_t modpitch = angle_t(0xDC00000 - Owner->pitch) >> ANGLETOFINESHIFT; + angle_t angle = mo->angle >> ANGLETOFINESHIFT; + fixed_t speed = fixed_t(sqrt((double)mo->Speed*mo->Speed + (4.0*65536*4*65536))); + fixed_t xyscale = FixedMul(speed, finecosine[modpitch]); + + mo->velz = FixedMul(speed, finesine[modpitch]); + mo->velx = FixedMul(xyscale, finecosine[angle]) + (Owner->velx >> 1); + mo->vely = FixedMul(xyscale, finesine[angle]) + (Owner->vely >> 1); + mo->z += FixedMul(mo->Speed, finesine[orgpitch]); - mo->angle = Owner->angle+(((pr_poisonbag()&7)-4)<<24); - mo->velz = 4*FRACUNIT + 2*finesine[pitch]; - mo->z += 2*finesine[pitch]; - P_ThrustMobj (mo, mo->angle, mo->Speed); - mo->velx += Owner->velx >> 1; - mo->vely += Owner->vely >> 1; mo->target = Owner; mo->tics -= pr_poisonbag()&3; - P_CheckMissileSpawn (mo); + P_CheckMissileSpawn(mo); return true; } return false;