diff --git a/Strategic/Auto Resolve.cpp b/Strategic/Auto Resolve.cpp index da548e231..08dd4efa9 100644 --- a/Strategic/Auto Resolve.cpp +++ b/Strategic/Auto Resolve.cpp @@ -92,7 +92,7 @@ extern UINT8 gubReinforcementMinEnemyStaticGroupSize; extern BOOLEAN gfStrategicMilitiaChangesMade; extern void ResetMilitia(); -extern BOOLEAN AutoReload( SOLDIERTYPE *pSoldier ); +extern BOOLEAN AutoReload( SOLDIERTYPE *pSoldier, bool aReloadEvenIfNotEmpty ); extern HVSURFACE ghFrameBuffer; BOOLEAN gfTransferTacticalOppositionToAutoResolve = FALSE; diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index ded638d9f..2226681ca 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -3889,12 +3889,12 @@ INT8 FindAmmoToReload( SOLDIERTYPE * pSoldier, INT8 bWeaponIn, INT8 bExcludeSlot } } -BOOLEAN AutoReload( SOLDIERTYPE * pSoldier ) +BOOLEAN AutoReload( SOLDIERTYPE * pSoldier, bool aReloadEvenIfNotEmpty ) { OBJECTTYPE *pObj, *pObj2; INT8 bSlot; INT16 bAPCost; - BOOLEAN fRet; + BOOLEAN fRet = FALSE; CHECKF( pSoldier ); @@ -3996,38 +3996,45 @@ BOOLEAN AutoReload( SOLDIERTYPE * pSoldier ) if (Item[pObj->usItem].usItemClass == IC_GUN || Item[pObj->usItem].usItemClass == IC_LAUNCHER) { - bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT ); - if (bSlot != NO_SLOT) + // Flugente: only reload if it's empty, or we really want to + if ( aReloadEvenIfNotEmpty || !EnoughAmmo( pSoldier, FALSE, HANDPOS ) ) { - // reload using this ammo! - fRet = ReloadGun( pSoldier, pObj, &(pSoldier->inv[bSlot]) ); - // if we are valid for two-pistol shooting (reloading) and we have enough APs still - // then do a reload of both guns! - if ( (fRet == TRUE) && pSoldier->IsValidSecondHandShotForReloadingPurposes( ) ) + bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT ); + if ( bSlot != NO_SLOT ) { - // Flugente: check for underbarrel weapons and use that object if necessary - pObj = pSoldier->GetUsedWeapon( &(pSoldier->inv[SECONDHANDPOS]) ); + // reload using this ammo! + fRet = ReloadGun( pSoldier, pObj, &( pSoldier->inv[bSlot] ) ); + } + } - bSlot = FindAmmoToReload( pSoldier, SECONDHANDPOS, NO_SLOT ); - if (bSlot != NO_SLOT) + // if we are valid for two-pistol shooting (reloading) and we have enough APs still + // then do a reload of both guns! + // Flugente: only reload if it's empty, or we really want to + if ( pSoldier->IsValidSecondHandShotForReloadingPurposes() + && ( aReloadEvenIfNotEmpty || !EnoughAmmo( pSoldier, FALSE, SECONDHANDPOS ) ) ) + { + // Flugente: check for underbarrel weapons and use that object if necessary + pObj = pSoldier->GetUsedWeapon( &( pSoldier->inv[SECONDHANDPOS] ) ); + + bSlot = FindAmmoToReload( pSoldier, SECONDHANDPOS, NO_SLOT ); + if ( bSlot != NO_SLOT ) + { + // ce would reload using this ammo! + bAPCost = GetAPsToReloadGunWithAmmo( pSoldier, pObj, &( pSoldier->inv[bSlot] ) ); + if ( EnoughPoints( pSoldier, (INT16)bAPCost, 0, FALSE ) ) { - // ce would reload using this ammo! - bAPCost = GetAPsToReloadGunWithAmmo( pSoldier, pObj, &(pSoldier->inv[bSlot] ) ); - if ( EnoughPoints( pSoldier, (INT16) bAPCost, 0, FALSE ) ) - { - // reload the 2nd gun too - fRet = ReloadGun( pSoldier, pObj, &(pSoldier->inv[bSlot]) ); - } - else - { - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[ STR_RELOAD_ONLY_ONE_GUN ], pSoldier->GetName() ); - } + // reload the 2nd gun too + fRet = ReloadGun( pSoldier, pObj, &( pSoldier->inv[bSlot] ) ); + } + else + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_RELOAD_ONLY_ONE_GUN], pSoldier->GetName() ); } } - - DirtyMercPanelInterface( pSoldier, DIRTYLEVEL2 ); - return( fRet ); } + + DirtyMercPanelInterface( pSoldier, DIRTYLEVEL2 ); + return( fRet ); } // couldn't reload diff --git a/Tactical/Items.h b/Tactical/Items.h index a2df8d467..29271e666 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -198,7 +198,7 @@ BOOLEAN EvaluateValidMerge( UINT16 usMerge, UINT16 usItem, UINT16 * pusResult, U // is the item passed a medical/ first aid kit? and what type? INT8 IsMedicalKitItem( OBJECTTYPE *pObject ); -BOOLEAN AutoReload( SOLDIERTYPE * pSoldier ); +BOOLEAN AutoReload( SOLDIERTYPE * pSoldier, bool aReloadEvenIfNotEmpty = true ); INT8 FindAmmoToReload( SOLDIERTYPE * pSoldier, INT8 bWeaponIn, INT8 bExcludeSlot ); void SwapOutHandItem( SOLDIERTYPE * pSoldier ); diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index c483d9906..e304527e9 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -3157,7 +3157,7 @@ INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJEC return GetAPsToReload(pGun); // added by SANDRO - safety check } -INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier ) +INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier, bool aReloadEvenIfNotEmpty ) { OBJECTTYPE * pObj; INT8 bSlot, bSlot2, bExcludeSlot; @@ -3205,11 +3205,17 @@ INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier ) bSlot = FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT ); if (bSlot != NO_SLOT) { - // we would reload using this ammo! - bAPCost += GetAPsToReloadGunWithAmmo( pSoldier, pObj, &(pSoldier->inv[bSlot] ) ); + // Flugente: only reload if it's empty, or we really want to + if ( aReloadEvenIfNotEmpty || !EnoughAmmo( pSoldier, FALSE, HANDPOS ) ) + { + // we would reload using this ammo! + bAPCost += GetAPsToReloadGunWithAmmo( pSoldier, pObj, &( pSoldier->inv[bSlot] ) ); + } } - if ( pSoldier->IsValidSecondHandShotForReloadingPurposes( ) ) + // Flugente: only reload if it's empty, or we really want to + if ( pSoldier->IsValidSecondHandShotForReloadingPurposes() + && ( aReloadEvenIfNotEmpty || !EnoughAmmo( pSoldier, FALSE, SECONDHANDPOS ) ) ) { // Flugente: check for underbarrel weapons and use that object if necessary pObj = pSoldier->GetUsedWeapon( &(pSoldier->inv[SECONDHANDPOS]) ); diff --git a/Tactical/Points.h b/Tactical/Points.h index 0c79078d7..b1e496036 100644 --- a/Tactical/Points.h +++ b/Tactical/Points.h @@ -365,7 +365,7 @@ void GetAPChargeForShootOrStabWRTGunRaises( SOLDIERTYPE *pSoldier, INT32 sGridNo UINT16 GetAPsToReloadRobot( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pRobot ); INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJECTTYPE * pAmmo, BOOLEAN usAllAPs = TRUE ); -INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier ); +INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier, bool aReloadEvenIfNotEmpty = true ); INT32 CalcAPCostForAiming( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAimTime ); INT8 CalcAimingLevelsAvailableWithAP( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bAPsLeft ); diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 2e88315e7..aea1a91de 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -5999,12 +5999,12 @@ BOOLEAN HandleUIReloading( SOLDIERTYPE *pSoldier ) if ( guiCurrentUICursor == GOOD_RELOAD_UICURSOR ) { // Check APs to reload... - bAPs = GetAPsToAutoReload( pSoldier ); + bAPs = GetAPsToAutoReload( pSoldier, false ); if ( EnoughPoints( pSoldier, bAPs, 0,TRUE ) ) { // OK, we have some ammo we can reload.... reload now! - if ( !AutoReload( pSoldier ) ) + if ( !AutoReload( pSoldier, false ) ) { // Do we say we could not reload gun...? } @@ -8949,12 +8949,12 @@ void HandleTacticalReload() // Do we have the ammo to reload? // Check APs to reload... - bAPs = GetAPsToAutoReload(pSoldier); + bAPs = GetAPsToAutoReload(pSoldier, false); if (EnoughPoints(pSoldier, bAPs, 0, TRUE)) { // OK, we have some ammo we can reload.... reload now! - if (!AutoReload(pSoldier)) + if ( !AutoReload(pSoldier, false) ) { // Do we say we could not reload gun...? pSoldier->DoMercBattleSound(BATTLE_SOUND_CURSE1); diff --git a/Tactical/UI Cursors.cpp b/Tactical/UI Cursors.cpp index b61210433..3e035934f 100644 --- a/Tactical/UI Cursors.cpp +++ b/Tactical/UI Cursors.cpp @@ -1248,7 +1248,7 @@ UINT8 HandleNonActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos , BO //CHRISL: We need to only check the second hand if the weapon in the second hand is onehanded // Check for enough ammo... - if ( !EnoughAmmo( pSoldier, FALSE, HANDPOS ) || (pSoldier->IsValidSecondHandShotForReloadingPurposes( ) && !EnoughAmmo( pSoldier, FALSE, SECONDHANDPOS) && !Item[pSoldier->inv[SECONDHANDPOS].usItem].twohanded ) ) + if ( !EnoughAmmo( pSoldier, FALSE, HANDPOS ) || (pSoldier->IsValidSecondHandShotForReloadingPurposes( ) && !Item[pSoldier->inv[SECONDHANDPOS].usItem].twohanded && !EnoughAmmo( pSoldier, FALSE, SECONDHANDPOS) ) ) { // Check if ANY ammo exists..... if ( FindAmmoToReload( pSoldier, HANDPOS, NO_SLOT ) == NO_SLOT ) @@ -1259,7 +1259,7 @@ UINT8 HandleNonActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos , BO else { // Check APs to reload... - gsCurrentActionPoints = GetAPsToAutoReload( pSoldier ); + gsCurrentActionPoints = GetAPsToAutoReload( pSoldier, false ); gfUIDisplayActionPoints = TRUE; //gUIDisplayActionPointsOffX = 14; @@ -1972,7 +1972,7 @@ UINT8 HandleNonActivatedTossCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEA else { // Check APs to reload... - gsCurrentActionPoints = GetAPsToAutoReload( pSoldier ); + gsCurrentActionPoints = GetAPsToAutoReload( pSoldier, false ); gfUIDisplayActionPoints = TRUE; //gUIDisplayActionPointsOffX = 14;