From 8ef0c1e3535bf6966da56169ef51f5f4fe962ecc Mon Sep 17 00:00:00 2001 From: silversurfer Date: Fri, 20 Mar 2015 21:26:28 +0000 Subject: [PATCH] Fix: It's not allowed to use scope modes other than iron sight and alternative weapon holding anymore when dual wielding guns. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7792 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Interface Items.cpp | 2 +- Tactical/Interface.cpp | 2 +- Tactical/Items.cpp | 37 ++++++++++++++++++++---------------- Tactical/Items.h | 2 +- Tactical/Soldier Control.cpp | 2 +- Tactical/Weapons.cpp | 6 +++--- TacticalAI/Attacks.cpp | 4 ++-- 7 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index 72cd855a..34c7af02 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -4036,7 +4036,7 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec } std::map ObjList; - GetScopeLists(&pSoldier->inv[HANDPOS], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[HANDPOS], ObjList); if ( pSoldier->bScopeMode == USE_ALT_WEAPON_HOLD ) { diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index df419370..8df1abde 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -6778,7 +6778,7 @@ void NCTHDrawScopeModeIcon( SOLDIERTYPE* pSoldier, INT16 sNewX, INT16 sNewY ) AddVideoObject( &VObjectDesc, &uiItemInfoAdvancedIcon); std::map ObjList; - GetScopeLists(&pSoldier->inv[HANDPOS], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[HANDPOS], ObjList); if ( pSoldier->bScopeMode == USE_ALT_WEAPON_HOLD ) { diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 95f36350..dbbbc089 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -10205,7 +10205,7 @@ INT16 GetAimBonus( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, INT32 iRange, INT1 if ( gGameExternalOptions.fScopeModes && pSoldier && Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD) @@ -10496,7 +10496,7 @@ INT32 GetObjectModifier( SOLDIERTYPE* pSoldier, OBJECTTYPE *pObj, UINT8 ubStance if ( pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL ) @@ -10836,7 +10836,7 @@ INT16 GetPercentAPReduction( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj ) if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -11082,7 +11082,7 @@ INT16 GetVisionRangeBonus( SOLDIERTYPE * pSoldier ) if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -11190,7 +11190,7 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -11289,7 +11289,7 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -11401,7 +11401,7 @@ INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -11502,7 +11502,7 @@ INT16 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -11652,7 +11652,7 @@ UINT8 GetPercentTunnelVision( SOLDIERTYPE * pSoldier ) if ( Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -12859,7 +12859,7 @@ INT16 GetMinRangeForAimBonus( SOLDIERTYPE* pSoldier, OBJECTTYPE * pObj ) if ( gGameExternalOptions.fScopeModes && pSoldier && pSoldier->bTeam == gbPlayerNum && Item[pObj->usItem].usItemClass == IC_GUN ) { std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -12895,7 +12895,7 @@ FLOAT GetScopeMagnificationFactor( SOLDIERTYPE *pSoldier, OBJECTTYPE * pObj, FLO { // Flugente: check for scope mode std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObj && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -12948,7 +12948,7 @@ FLOAT GetBestScopeMagnificationFactor( SOLDIERTYPE *pSoldier, OBJECTTYPE * pObj, { // Flugente: check for scope mode std::map ObjList; - GetScopeLists(pObjUsed, ObjList); + GetScopeLists(pSoldier, pObjUsed, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pObjUsed && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -13077,7 +13077,7 @@ FLOAT GetScopeModeProjectionFactor( SOLDIERTYPE *pSoldier, OBJECTTYPE * pObj ) // Flugente: check for scope mode std::map ObjList; - GetScopeLists(pObj, ObjList); + GetScopeLists(pSoldier, pObj, ObjList); FLOAT BestFactor = 1.0; @@ -13414,7 +13414,7 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) { // Flugente: check for scope mode std::map ObjList; - GetScopeLists(&pSoldier->inv[pSoldier->ubAttackingHand], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[pSoldier->ubAttackingHand], ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == &pSoldier->inv[pSoldier->ubAttackingHand] && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -13489,7 +13489,7 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) { // Flugente: check for scope mode std::map ObjList; - GetScopeLists(pAttackingWeapon, ObjList); + GetScopeLists(pSoldier, pAttackingWeapon, ObjList); // only use scope mode if gun is in hand, otherwise an error might occur! if ( (&pSoldier->inv[HANDPOS]) == pAttackingWeapon && ObjList[pSoldier->bScopeMode] != NULL && pSoldier->bScopeMode != USE_ALT_WEAPON_HOLD ) @@ -14346,7 +14346,7 @@ FLOAT GetItemCooldownFactor( OBJECTTYPE * pObj ) return cooldownfactor; } -void GetScopeLists( OBJECTTYPE * pObj, std::map& arScopeMap ) +void GetScopeLists( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, std::map& arScopeMap ) { // build a list of all available scopes and sights ( we always have at least one: our weapon's iron sights) arScopeMap[USE_BEST_SCOPE] = pObj; @@ -14356,6 +14356,11 @@ void GetScopeLists( OBJECTTYPE * pObj, std::map& arScopeMap arScopeMap[i] = NULL; } + // dual wielding only allows iron sights + if( (Item[pSoldier->inv[HANDPOS].usItem].usItemClass & IC_GUN && !Item[pSoldier->inv[HANDPOS].usItem].twohanded) + && (Item[pSoldier->inv[SECONDHANDPOS].usItem].usItemClass & IC_GUN && !Item[pSoldier->inv[SECONDHANDPOS].usItem].twohanded) ) + return; + // certain attachments prohibit the use of an iron sight once they are installed (flip-up built-in sights) BOOLEAN noironsight = ( Item[pObj->usItem].blockironsight == TRUE ); diff --git a/Tactical/Items.h b/Tactical/Items.h index bbf86ff6..ac90bc0c 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -463,7 +463,7 @@ BOOLEAN UseTotalMedicalKitPoints( SOLDIERTYPE * pSoldier, UINT16 usPointsToConsu // Flugente FLOAT GetItemCooldownModificator( OBJECTTYPE * pObj ); FLOAT GetItemCooldownFactor( OBJECTTYPE * pObj ); -void GetScopeLists( OBJECTTYPE * pObj, std::map& arScopeMap ); +void GetScopeLists( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, std::map& arScopeMap ); // check if item belongs to a specific attachment class BOOLEAN IsAttachmentClass( UINT16 usItem, UINT32 aFlag ); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index f8e04fee..20f5601b 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -13663,7 +13663,7 @@ void SOLDIERTYPE::ReLoadSoldierAnimationDueToHandItemChange( UINT16 usOldItem, U if ( (Item[inv[HANDPOS].usItem].usItemClass & IC_WEAPON) && (Item[inv[SECONDHANDPOS].usItem].usItemClass & IC_WEAPON) ) { std::map ObjList; - GetScopeLists( &inv[HANDPOS], ObjList ); + GetScopeLists( this, &inv[HANDPOS], ObjList ); std::map::iterator itend = ObjList.end( ); for ( std::map::iterator it = ObjList.begin( ); it != itend; ++it ) diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 6bc1217f..b52ec2eb 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -7264,7 +7264,7 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime, if ( Item[(&(pSoldier->inv[pSoldier->ubAttackingHand]))->usItem].usItemClass == IC_GUN && !pSoldier->IsValidAlternativeFireMode( ubAimTime, sGridNo ) ) { std::map ObjList; - GetScopeLists((&(pSoldier->inv[pSoldier->ubAttackingHand])), ObjList); + GetScopeLists(pSoldier, (&(pSoldier->inv[pSoldier->ubAttackingHand])), ObjList); if ( ObjList[pSoldier->bScopeMode] != NULL ) { @@ -11379,7 +11379,7 @@ void HandleTacticalEffectsOfEquipmentChange( SOLDIERTYPE *pSoldier, UINT32 uiInv if ( (Item[ pSoldier->inv[ HANDPOS ].usItem ].usItemClass & IC_WEAPON) && (Item[ pSoldier->inv[ SECONDHANDPOS ].usItem ].usItemClass & IC_WEAPON) ) { std::map ObjList; - GetScopeLists(&pSoldier->inv[ HANDPOS ], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[ HANDPOS ], ObjList); std::map::iterator itend = ObjList.end(); for (std::map::iterator it = ObjList.begin(); it != itend; ++it) @@ -11907,7 +11907,7 @@ void ChangeScopeMode( SOLDIERTYPE * pSoldier, INT32 iTrgGridNo ) else { std::map ObjList; - GetScopeLists(&pSoldier->inv[HANDPOS], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[HANDPOS], ObjList); do { diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index e84ba036..4a39ffe0 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -179,7 +179,7 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns pSoldier->bWeaponMode = WM_NORMAL; #ifdef dnlCALCBESTSHOT//dnl ch69 130913 rather setup available scopes here then in later inside loop std::map ObjList; - GetScopeLists(&pSoldier->inv[HANDPOS], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[HANDPOS], ObjList); pSoldier->bScopeMode = USE_BEST_SCOPE; pSoldier->bDoBurst = 0; pSoldier->bDoAutofire = 0; @@ -349,7 +349,7 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns { ubChanceToHit = (INT16) AICalcChanceToHitGun(pSoldier, pOpponent->sGridNo, AllowedAimingLevels( pSoldier, pOpponent->sGridNo ), AIM_SHOT_TORSO, pOpponent->pathing.bLevel, STANDING);//dnl ch59 130813 std::map ObjList; - GetScopeLists(&pSoldier->inv[HANDPOS], ObjList); + GetScopeLists(pSoldier, &pSoldier->inv[HANDPOS], ObjList); do { pSoldier->bScopeMode++;