From ed82841e3c7b97edf2151565df92cc817813c913 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 24 Jul 2021 19:15:18 +0000 Subject: [PATCH] Fix: when using two guns, both are reloaded on the reload cursor prompt, even if one of them still has ammo. This has been changed so that now only empty guns get reloaded git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9146 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Strategic/Auto Resolve.cpp | 2 +- Tactical/Items.cpp | 61 +++++++++++++++++++---------------- Tactical/Items.h | 2 +- Tactical/Points.cpp | 14 +++++--- Tactical/Points.h | 2 +- Tactical/Turn Based Input.cpp | 8 ++--- Tactical/UI Cursors.cpp | 6 ++-- 7 files changed, 54 insertions(+), 41 deletions(-) diff --git a/Strategic/Auto Resolve.cpp b/Strategic/Auto Resolve.cpp index da548e23..08dd4efa 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 ded638d9..2226681c 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 a2df8d46..29271e66 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 c483d990..e304527e 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 0c79078d..b1e49603 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 2e88315e..aea1a91d 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 b6121043..3e035934 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;