diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index f7753189..40a0dca5 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -3356,9 +3356,11 @@ INT16 GetAPsToReadyWeapon( SOLDIERTYPE *pSoldier, UINT16 usAnimState ) UINT16 usItem; UINT8 ubReadyAPs = 0; - if(pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO)//dnl ch72 250913 + // Don't check the ready APs of an attached underbarrel launcher; the cost of raising a weapon + // should not change with firing mode as it creates an unfun opportunity for micro-optimization + /*if(pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO)//dnl ch72 250913 usItem = GetAttachedGrenadeLauncher(&pSoldier->inv[HANDPOS]); - else + else*/ usItem = pSoldier->inv[HANDPOS].usItem; // If this is a dwel pistol anim @@ -3399,8 +3401,8 @@ INT16 GetAPsToReadyWeapon( SOLDIERTYPE *pSoldier, UINT16 usAnimState ) } else { - // CHECK FOR RIFLE - if ( Item[ usItem ].usItemClass == IC_GUN ) + // CHECK FOR RIFLE (and grenade launchers) + if ( Item[ usItem ].usItemClass & (IC_GUN | IC_LAUNCHER) ) { ubReadyAPs = Weapon[ usItem ].ubReadyTime; diff --git a/Tactical/Soldier Ani.cpp b/Tactical/Soldier Ani.cpp index f2a5dcc9..dbc0e37e 100644 --- a/Tactical/Soldier Ani.cpp +++ b/Tactical/Soldier Ani.cpp @@ -4470,13 +4470,21 @@ BOOLEAN CheckForImproperFireGunEnd( SOLDIERTYPE *pSoldier ) //dnl ch72 260913 OBJECTTYPE *pObjHand; + BOOLEAN outOfAmmo; + if(pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO) pObjHand = FindAttachment_GrenadeLauncher(&pSoldier->inv[HANDPOS]); else pObjHand = pSoldier->GetUsedWeapon(&pSoldier->inv[HANDPOS]); + // Extracted from EnoughAmmo() to avoid double calculation of pObjHand + if (Item[ pObjHand->usItem ].usItemClass & IC_LAUNCHER) + outOfAmmo = (FindAttachmentByClass( pObjHand, IC_GRENADE ) == NULL && FindAttachmentByClass( pObjHand, IC_BOMB ) == NULL); + else + outOfAmmo = (*pObjHand)[0]->data.gun.ubGunShotsLeft == 0; + // Check single hand for jammed status, ( or ammo is out.. ) - if ( (*pObjHand)[0]->data.gun.bGunAmmoStatus < 0 || (*pObjHand)[0]->data.gun.ubGunShotsLeft == 0 ) + if ( (*pObjHand)[0]->data.gun.bGunAmmoStatus < 0 || outOfAmmo ) { // If we have 2 pistols, donot go back! if ( Item[ pSoldier->inv[ SECONDHANDPOS ].usItem ].usItemClass != IC_GUN )