diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp index 64cbe4b59..1721f4185 100644 --- a/Tactical/Interface Enhanced.cpp +++ b/Tactical/Interface Enhanced.cpp @@ -2691,9 +2691,9 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr } ///////////////////// AIMING LEVELS MODIFIER - if (GetAimLevelsModifier( gpItemDescObject, ANIM_STAND ) != 0 - || GetAimLevelsModifier( gpItemDescObject, ANIM_CROUCH ) != 0 - || GetAimLevelsModifier( gpItemDescObject, ANIM_PRONE ) != 0 ) + if (GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ) != 0 + || GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_CROUCH ) != 0 + || GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_PRONE ) != 0 ) { if (cnt >= sFirstLine && cnt < sLastLine) { @@ -4625,9 +4625,9 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject ) } ///////////////////// AIMING LEVELS MODIFIER - if (GetAimLevelsModifier( gpItemDescObject, ANIM_STAND ) != 0 - || GetAimLevelsModifier( gpItemDescObject, ANIM_CROUCH ) != 0 - || GetAimLevelsModifier( gpItemDescObject, ANIM_PRONE ) != 0 ) + if (GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ) != 0 + || GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_CROUCH ) != 0 + || GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_PRONE ) != 0 ) { if (cnt >= sFirstLine && cnt < sLastLine) { @@ -5907,7 +5907,7 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) UINT16 iFinalAimLevelsValue = GetAllowedAimingLevelsForItem( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ); // Get modifier - INT16 iAimLevelsModifier = GetAimLevelsModifier( gpItemDescObject, ANIM_STAND ); + INT16 iAimLevelsModifier = GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ); iAimLevelsModifier += GetAimLevelsTraitModifier( gpItemDescSoldier, gpItemDescObject ); // Get Base Value @@ -8820,9 +8820,9 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) } ///////////////////// AIMING LEVELS MODIFIER - iModifier[0] = GetAimLevelsModifier( gpItemDescObject, ANIM_STAND ); - iModifier[1] = GetAimLevelsModifier( gpItemDescObject, ANIM_CROUCH ); - iModifier[2] = GetAimLevelsModifier( gpItemDescObject, ANIM_PRONE ); + iModifier[0] = GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_STAND ); + iModifier[1] = GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_CROUCH ); + iModifier[2] = GetAimLevelsModifier( gpItemDescSoldier, gpItemDescObject, ANIM_PRONE ); if (iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0 ) { if (cnt >= sFirstLine && cnt < sLastLine) diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index f3534c055..0ceb1ab8b 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -10213,7 +10213,7 @@ INT32 GetTargetTrackingModifier( OBJECTTYPE *pObj, UINT8 ubStance ) return (iModifier); } -INT32 GetAimLevelsModifier( OBJECTTYPE *pObj, UINT8 ubStance ) +INT32 GetAimLevelsModifier( SOLDIERTYPE* pSoldier, OBJECTTYPE *pObj, UINT8 ubStance ) { INT32 iModifier=0; @@ -10222,11 +10222,36 @@ INT32 GetAimLevelsModifier( OBJECTTYPE *pObj, UINT8 ubStance ) if (pObj->exists() == true && UsingNewCTHSystem() == true) { iModifier += Item[pObj->usItem].aimlevelsmodifier[ubRef]; - for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) + + if ( gGameExternalOptions.fScopeModes && pSoldier ) { - if (iter->exists()) + for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) { - iModifier += Item[iter->usItem].aimlevelsmodifier[ubRef]; + if( iter->exists() && !IsAttachmentClass(iter->usItem, AC_SCOPE|AC_SIGHT|AC_IRONSIGHT ) ) + { + iModifier += Item[iter->usItem].aimlevelsmodifier[ubRef]; + } + } + + // Flugente: check for scope mode + if ( Item[pObj->usItem].usItemClass == IC_GUN ) + { + std::map ObjList; + GetScopeLists(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 ) + iModifier += Item[ObjList[pSoldier->bScopeMode]->usItem].aimlevelsmodifier[ubRef]; + } + } + else + { + for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) + { + if (iter->exists()) + { + iModifier += Item[iter->usItem].aimlevelsmodifier[ubRef]; + } } } } @@ -12871,8 +12896,8 @@ UINT8 AllowedAimingLevelsNCTH( SOLDIERTYPE *pSoldier, INT32 sGridNo ) if ( gGameExternalOptions.fWeaponResting && pSoldier->IsWeaponMounted() ) stance = ANIM_PRONE; - INT32 moda = GetAimLevelsModifier( &pSoldier->inv[pSoldier->ubAttackingHand], stance ); - INT32 modb = GetAimLevelsModifier( &pSoldier->inv[pSoldier->ubAttackingHand], gAnimControl[ pSoldier->usAnimState ].ubEndHeight ); + INT32 moda = GetAimLevelsModifier( pSoldier, &pSoldier->inv[pSoldier->ubAttackingHand], stance ); + INT32 modb = GetAimLevelsModifier( pSoldier, &pSoldier->inv[pSoldier->ubAttackingHand], gAnimControl[ pSoldier->usAnimState ].ubEndHeight ); aimLevels += (INT32) ((gGameExternalOptions.ubProneModifierPercentage * moda + (100 - gGameExternalOptions.ubProneModifierPercentage) * modb)/100); } @@ -13230,7 +13255,7 @@ UINT8 GetAllowedAimingLevelsForItem( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, UI } // HEADROCK HAM 4: This modifier from the weapon and its attachments replaces the generic bipod bonus. - aimLevels += GetAimLevelsModifier( pObj, ubStance ); + aimLevels += GetAimLevelsModifier( pSoldier, pObj, ubStance ); aimLevels += GetAimLevelsTraitModifier( pSoldier, pObj ); diff --git a/Tactical/Items.h b/Tactical/Items.h index 92e8191b2..119b7f5a5 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -283,7 +283,7 @@ INT32 GetCounterForceMaxModifier( OBJECTTYPE *pObj, UINT8 ubStance ); INT32 GetCounterForceAccuracyModifier( OBJECTTYPE *pObj, UINT8 ubStance ); INT32 GetCounterForceFrequencyModifier( OBJECTTYPE *pObj, UINT8 ubStance ); INT32 GetTargetTrackingModifier( OBJECTTYPE *pObj, UINT8 ubStance ); -INT32 GetAimLevelsModifier( OBJECTTYPE *pObj, UINT8 ubStance ); +INT32 GetAimLevelsModifier( SOLDIERTYPE* pSoldier, OBJECTTYPE *pObj, UINT8 ubStance ); // Flugente: added SOLDIERTYPE* argument INT32 GetAimLevelsTraitModifier( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj ); // Returns the character's stance as 0/1/2.