From 4b70b1e40055c6cf5d14247fce6e899f8629b97f Mon Sep 17 00:00:00 2001 From: silversurfer Date: Sat, 28 Feb 2015 17:08:37 +0000 Subject: [PATCH] Fix: mouse position was not restored after a message box was closed Modified the Ranger trait to make it more useful after loosing all survival bonuses: - aim click bonus for shotguns is now again 1 (hunter) or 2 (ranger) - new aim click bonus for rifles that is half the shotgun bonus. With the default value of "1" this means 0 for hunter and 1 for ranger. This does NOT stack with the sniper bonus! It's one or the other depending on which is higher. - new speed bonus to reloading single shells into shotguns - new range bonus for shotguns of 10% (hunter) or 20% (ranger) EDB now displays the trait modified values for: - Gun Range - Draw Cost git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7761 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 4 ++- GameSettings.h | 2 ++ Laptop/personnel.cpp | 23 ++++++++++++-- MessageBoxScreen.cpp | 6 ++-- Tactical/Interface Enhanced.cpp | 36 ++++++++++++++++++++-- Tactical/Items.cpp | 54 +++++++++++++++++++++------------ Tactical/Points.cpp | 33 ++++++++++++++------ Tactical/Weapons.cpp | 9 +++++- Utils/_Ja25ChineseText.cpp | 4 +++ Utils/_Ja25DutchText.cpp | 4 +++ Utils/_Ja25EnglishText.cpp | 4 +++ Utils/_Ja25FrenchText.cpp | 5 +++ Utils/_Ja25GermanText.cpp | 16 ++++++---- Utils/_Ja25ItalianText.cpp | 4 +++ Utils/_Ja25PolishText.cpp | 4 +++ Utils/_Ja25RussianText.cpp | 4 +++ 16 files changed, 166 insertions(+), 46 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 5707ff36..2836cd4f 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2320,10 +2320,12 @@ void LoadSkillTraitsExternalSettings() gSkillTraitValues.ubRAPumpShotgunsAPsReduction = iniReader.ReadInteger("Ranger","PUMP_SHOTGUNS_APS_REDUCTION", 25, 0, 45); gSkillTraitValues.ubRAFiringSpeedBonusShotguns = iniReader.ReadInteger("Ranger","FIRING_SPEED_BONUS_SHOTGUNS", 10, 0, 45); gSkillTraitValues.ubRAAimClicksAdded = iniReader.ReadInteger("Ranger","POSSIBLE_AIM_CLICK_ADDED_SHOTGUNS", 1, 0, 3); + gSkillTraitValues.ubRAEffectiveRangeBonusShotguns = iniReader.ReadInteger("Ranger","EFFECTIVE_RANGE_BONUS_SHOTGUNS", 10, 0, 100); + gSkillTraitValues.ubRAReloadSpeedShotgunsManual = iniReader.ReadInteger("Ranger","RELOAD_SPEED_SHOTGUNS_MANUAL", 15, 0, 30); // GUNSLINGER gSkillTraitValues.ubGSFiringSpeedBonusPistols = iniReader.ReadInteger("Gunslinger","FIRING_SPEED_BONUS_PISTOLS", 15, 0, 45); - gSkillTraitValues.ubGSEffectiveRangeBonusPistols = iniReader.ReadInteger("Gunslinger","FEFFECTIVE_RANGE_BONUS_PISTOLS", 10, 0, 100); + gSkillTraitValues.ubGSEffectiveRangeBonusPistols = iniReader.ReadInteger("Gunslinger","EFFECTIVE_RANGE_BONUS_PISTOLS", 10, 0, 100); gSkillTraitValues.ubGSBonusCtHPistols = iniReader.ReadInteger("Gunslinger","BONUS_CTH_PISTOLS", 10, 0, 100); gSkillTraitValues.ubGSBonusCtHMachinePistols = iniReader.ReadInteger("Gunslinger","BONUS_CTH_MACHINE_PISTOLS", 5, 0, 100); gSkillTraitValues.ubGSCtHMPExcludeAuto = iniReader.ReadBoolean("Gunslinger","CTH_MP_EXCLUDE_AUTOFIRE", TRUE); diff --git a/GameSettings.h b/GameSettings.h index de535988..d4a641ab 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1616,6 +1616,8 @@ typedef struct UINT8 ubRAPumpShotgunsAPsReduction; UINT8 ubRAFiringSpeedBonusShotguns; UINT8 ubRAAimClicksAdded; + UINT8 ubRAEffectiveRangeBonusShotguns; + UINT8 ubRAReloadSpeedShotgunsManual; // GUNSLINGER UINT8 ubGSFiringSpeedBonusPistols; diff --git a/Laptop/personnel.cpp b/Laptop/personnel.cpp index 176ae0c4..16fa9ae8 100644 --- a/Laptop/personnel.cpp +++ b/Laptop/personnel.cpp @@ -7444,14 +7444,31 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[3], ( gSkillTraitValues.ubRAFiringSpeedBonusShotguns * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]); wcscat( apStr, atStr ); } + if( gSkillTraitValues.ubRAReloadSpeedShotgunsManual != 0 ) + { + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[7], ( gSkillTraitValues.ubRAReloadSpeedShotgunsManual * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]); + wcscat( apStr, atStr ); + } if( gSkillTraitValues.ubRAAimClicksAdded != 0 ) { - if( (gSkillTraitValues.ubRAAimClicksAdded >= 2 && !fExpertLevel) || (gSkillTraitValues.ubRAAimClicksAdded == 1 && fExpertLevel) ) - swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[4], (UINT8)( gSkillTraitValues.ubRAAimClicksAdded * (fExpertLevel ? 2 : 1) / 2.0f)); + if( gSkillTraitValues.ubRAAimClicksAdded == 1 && !fExpertLevel ) + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[4], (UINT8)( gSkillTraitValues.ubRAAimClicksAdded * (fExpertLevel ? 2 : 1) ) ); else - swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[5], (UINT8)( gSkillTraitValues.ubRAAimClicksAdded * (fExpertLevel ? 2 : 1) / 2.0f)); + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[5], (UINT8)( gSkillTraitValues.ubRAAimClicksAdded * (fExpertLevel ? 2 : 1) ) ); wcscat( apStr, atStr ); + // half of the above bonus also applies to rifles + if( (gSkillTraitValues.ubRAAimClicksAdded >= 2 && !fExpertLevel) || (gSkillTraitValues.ubRAAimClicksAdded == 1 && fExpertLevel) ) + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[8], (UINT8)( gSkillTraitValues.ubRAAimClicksAdded * (fExpertLevel ? 2 : 1) / 2.0f)); + else + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[9], (UINT8)( gSkillTraitValues.ubRAAimClicksAdded * (fExpertLevel ? 2 : 1) / 2.0f)); + + wcscat( apStr, atStr ); + } + if( gSkillTraitValues.ubRAEffectiveRangeBonusShotguns != 0 ) + { + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[6], ( gSkillTraitValues.ubRAEffectiveRangeBonusShotguns * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]); + wcscat( apStr, atStr ); } break; diff --git a/MessageBoxScreen.cpp b/MessageBoxScreen.cpp index c07a29ed..9f8ed0eb 100644 --- a/MessageBoxScreen.cpp +++ b/MessageBoxScreen.cpp @@ -1240,9 +1240,9 @@ UINT32 ExitMsgBox( INT8 ubExitCode ) if( fCursorLockedToArea == TRUE ) { - GetMousePos( &pPosition ); - - if( ( pPosition.iX > MessageBoxRestrictedCursorRegion.iRight ) || ( pPosition.iX > MessageBoxRestrictedCursorRegion.iLeft ) && ( pPosition.iY < MessageBoxRestrictedCursorRegion.iTop ) && ( pPosition.iY > MessageBoxRestrictedCursorRegion.iBottom ) ) + // silversurfer: Why would we only reset cursor position if it is outside of some boundary? If "fCursorLockedToArea" is set we put the cursor back to its old position no matter where it is! + //GetMousePos( &pPosition ); + //if( ( pPosition.iX > MessageBoxRestrictedCursorRegion.iRight ) || ( pPosition.iX > MessageBoxRestrictedCursorRegion.iLeft ) && ( pPosition.iY < MessageBoxRestrictedCursorRegion.iTop ) && ( pPosition.iY > MessageBoxRestrictedCursorRegion.iBottom ) ) { SimulateMouseMovement( pOldMousePosition.iX , pOldMousePosition.iY ); } diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp index 3946caae..5eb5c390 100644 --- a/Tactical/Interface Enhanced.cpp +++ b/Tactical/Interface Enhanced.cpp @@ -6737,7 +6737,7 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) iRangeValue *= ( (FLOAT)(gGameExternalOptions.iGunRangeModifier / 100) * gItemSettings.fRangeModifierLauncher); // Get Final Range value - UINT16 iFinalRangeValue = GunRange( gpItemDescObject, NULL ); + UINT16 iFinalRangeValue = GunRange( gpItemDescObject, gpItemDescSoldier ); // Get difference INT16 iRangeModifier = iFinalRangeValue - iRangeValue; @@ -6761,7 +6761,7 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) else if ( Item[ gpComparedItemDescObject->usItem ].usItemClass & IC_LAUNCHER ) iComparedRangeValue *= ( (FLOAT)(gGameExternalOptions.iGunRangeModifier / 100) * gItemSettings.fRangeModifierLauncher); // Get Final Range value - UINT16 iComparedFinalRangeValue = GunRange( gpComparedItemDescObject, NULL ); + UINT16 iComparedFinalRangeValue = GunRange( gpComparedItemDescObject, gpItemDescSoldier ); // Get difference INT16 iComparedRangeModifier = iComparedFinalRangeValue - iComparedRangeValue; // Print difference in base value @@ -7709,6 +7709,16 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) // Get final Draw Cost INT16 iFinalDrawAPCost = (Weapon[ gpItemDescObject->usItem ].ubReadyTime * (100 - GetPercentReadyTimeAPReduction(gpItemDescObject)) / 100); + // final draw cost modified by traits + if( gGameOptions.fNewTraitSystem ) + { + // LMGs + if( Weapon[gpItemDescObject->usItem].ubWeaponType == GUN_LMG && HAS_SKILL_TRAIT(gpItemDescSoldier, AUTO_WEAPONS_NT) ) + iFinalDrawAPCost = (FLOAT)iFinalDrawAPCost * __max(0, (FLOAT)(100 - gSkillTraitValues.ubAWPercentReadyLMGReduction * NUM_SKILL_TRAITS(gpItemDescSoldier, AUTO_WEAPONS_NT) ) / 100.0 ); + // Pistols and Revolvers + else if( Weapon[gpItemDescObject->usItem].ubWeaponType == GUN_PISTOL && HAS_SKILL_TRAIT(gpItemDescSoldier, GUNSLINGER_NT) ) + iFinalDrawAPCost = (FLOAT)iFinalDrawAPCost * __max(0, (FLOAT)(100 - gSkillTraitValues.ubGSPercentReadyPistolsReduction * NUM_SKILL_TRAITS(gpItemDescSoldier, GUNSLINGER_NT) ) / 100.0 ); + } // Get base Draw Cost INT16 iDrawAPCost = Weapon[ gpItemDescObject->usItem ].ubReadyTime; @@ -7729,6 +7739,17 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) { // Get final Draw Cost INT16 iComparedFinalDrawAPCost = (Weapon[ gpComparedItemDescObject->usItem ].ubReadyTime * (100 - GetPercentReadyTimeAPReduction(gpComparedItemDescObject)) / 100); + // final draw cost modified by traits + if( gGameOptions.fNewTraitSystem ) + { + // LMGs + if( Weapon[gpItemDescObject->usItem].ubWeaponType == GUN_LMG && HAS_SKILL_TRAIT(gpItemDescSoldier, AUTO_WEAPONS_NT) ) + iComparedFinalDrawAPCost = (FLOAT)iComparedFinalDrawAPCost * __max(0, (FLOAT)(100 - gSkillTraitValues.ubAWPercentReadyLMGReduction * NUM_SKILL_TRAITS(gpItemDescSoldier, AUTO_WEAPONS_NT) ) / 100.0 ); + // Pistols and Revolvers + else if( Weapon[gpItemDescObject->usItem].ubWeaponType == GUN_PISTOL && HAS_SKILL_TRAIT(gpItemDescSoldier, GUNSLINGER_NT) ) + iComparedFinalDrawAPCost = (FLOAT)iComparedFinalDrawAPCost * __max(0, (FLOAT)(100 - gSkillTraitValues.ubGSPercentReadyPistolsReduction * NUM_SKILL_TRAITS(gpItemDescSoldier, GUNSLINGER_NT) ) / 100.0 ); + } + // Get base Draw Cost INT16 iComparedDrawAPCost = Weapon[ gpComparedItemDescObject->usItem ].ubReadyTime; // Get Draw Cost Modifier @@ -7746,6 +7767,17 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) ubNumLine = 13; // Get final Draw Cost INT16 iFinalDrawAPCost = (Weapon[ gpComparedItemDescObject->usItem ].ubReadyTime * (100 - GetPercentReadyTimeAPReduction(gpComparedItemDescObject)) / 100); + // final draw cost modified by traits + if( gGameOptions.fNewTraitSystem ) + { + // LMGs + if( Weapon[gpItemDescObject->usItem].ubWeaponType == GUN_LMG && HAS_SKILL_TRAIT(gpItemDescSoldier, AUTO_WEAPONS_NT) ) + iFinalDrawAPCost = (FLOAT)iFinalDrawAPCost * __max(0, (FLOAT)(100 - gSkillTraitValues.ubAWPercentReadyLMGReduction * NUM_SKILL_TRAITS(gpItemDescSoldier, AUTO_WEAPONS_NT) ) / 100.0 ); + // Pistols and Revolvers + else if( Weapon[gpItemDescObject->usItem].ubWeaponType == GUN_PISTOL && HAS_SKILL_TRAIT(gpItemDescSoldier, GUNSLINGER_NT) ) + iFinalDrawAPCost = (FLOAT)iFinalDrawAPCost * __max(0, (FLOAT)(100 - gSkillTraitValues.ubGSPercentReadyPistolsReduction * NUM_SKILL_TRAITS(gpItemDescSoldier, GUNSLINGER_NT) ) / 100.0 ); + } + // Get base Draw Cost INT16 iDrawAPCost = Weapon[ gpComparedItemDescObject->usItem ].ubReadyTime; // Get Draw Cost Modifier diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 0e252f0c..a530c8b7 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -10482,8 +10482,10 @@ INT32 GetAimLevelsTraitModifier( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj ) if ( Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_PISTOL || Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_M_PISTOL ) ubSkillModifier -= gSkillTraitValues.ubGSAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ); else if ( Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_SHOTGUN ) - ubSkillModifier -= (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f); - else + ubSkillModifier -= gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); + else if ( Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_RIFLE ) + ubSkillModifier -= __max( (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f), gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ) ); + else if ( Weapon[Item[pObj->usItem].ubClassIndex].ubWeaponType == GUN_SN_RIFLE ) ubSkillModifier -= gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ); } else @@ -13339,9 +13341,9 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) // silversurfer added this - STOMP traits - Ranger bonus aim clicks if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) ) { - maxAimForType += (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f); - aimLevels += (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f); - maxAimWithoutBipod += (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f); + maxAimForType += gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); + aimLevels += gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); + maxAimWithoutBipod += gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); } } else if (weaponType == GUN_LMG || (weaponType == GUN_SMG && fTwoHanded == 1)) @@ -13356,12 +13358,12 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) aimLevels = 2; maxAimWithoutBipod = 3; - // SANDRO - STOMP traits - Sniper bonus aim clicks - if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) ) + // SANDRO - STOMP traits - Sniper and Ranger bonus aim clicks + if ( gGameOptions.fNewTraitSystem && weaponType == GUN_RIFLE ) { - maxAimForType += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); - aimLevels += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); - maxAimWithoutBipod += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); + maxAimForType += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); + aimLevels += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); + maxAimWithoutBipod += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); } } else if (((weaponType == GUN_AS_RIFLE || weaponType == GUN_RIFLE) && weaponRange > 500) || @@ -13370,12 +13372,22 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) maxAimForType = 6; aimLevels = 3; maxAimWithoutBipod = 4; - // SANDRO - STOMP traits - Sniper bonus aim clicks - if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) ) + // SANDRO - STOMP traits - Sniper and Ranger bonus aim clicks + if ( gGameOptions.fNewTraitSystem ) { - maxAimForType += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); - aimLevels += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); - maxAimWithoutBipod += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); + if( weaponType == GUN_RIFLE ) + { + maxAimForType += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); + aimLevels += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); + maxAimWithoutBipod += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); + } + else if( weaponType == GUN_SN_RIFLE ) + { + maxAimForType += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); + aimLevels += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); + maxAimWithoutBipod += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); + + } } } else if (weaponType == GUN_SN_RIFLE && weaponRange > 500) @@ -13520,11 +13532,13 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) aimLevels += 2; } - // SANDRO - STOMP traits - Sniper bonus aim clicks - if ((weaponType == GUN_AS_RIFLE || weaponType == GUN_RIFLE || weaponType == GUN_SN_RIFLE) && - gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) ) + // SANDRO - STOMP traits - Sniper and Ranger bonus aim clicks + if (gGameOptions.fNewTraitSystem ) { - aimLevels += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); + if( weaponType == GUN_RIFLE ) + aimLevels += __max( (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )), (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f) ); + else if( weaponType == GUN_SN_RIFLE ) + aimLevels += (gSkillTraitValues.ubSNAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )); } } // SANDRO - STOMP traits - Gunslinger bonus aim clicks @@ -13538,7 +13552,7 @@ UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier, INT32 sGridNo) if ( weaponType == GUN_SHOTGUN && gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) ) { - aimLevels += (gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 2.0f); + aimLevels += gSkillTraitValues.ubRAAimClicksAdded * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); } // SANDRO - if using alternative weapon holding, we reduce the aim levels available diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index 0416da33..ce216a3d 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -3008,20 +3008,33 @@ INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJEC // individually loaded guns int reload = 0; int rounds = __min((GetMagSize(pGun)-(*pGun)[0]->data.gun.ubGunShotsLeft), Magazine[Item[pAmmo->usItem].ubClassIndex].ubMagSize); + FLOAT fSpeedBonus = 1.0; + + // Ambidextrous check + if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) + fSpeedBonus *= (FLOAT)(100 - gSkillTraitValues.ubAMReloadSpeedLoose) / 100.0; + + // Ranger bonus to reload shotgun shells manually + if( Weapon[ pGun->usItem ].ubWeaponType == GUN_SHOTGUN && HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) ) + fSpeedBonus *= (FLOAT)(100 - gSkillTraitValues.ubRAReloadSpeedShotgunsManual * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) ) / 100.0; + + // limit bonus to proper values + fSpeedBonus = __min( 1.0, __max( 0.1, fSpeedBonus ) ); + if(!((*pGun)[0]->data.gun.ubGunState & GS_WEAPON_BEING_RELOADED)) { - reload = GetAPsToReload(pGun); - // SANDRO - added Ambidextrous check + reload = GetAPsToReload(pGun) * fSpeedBonus; +/* // SANDRO - added Ambidextrous check if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) { reload = (INT16)(reload * (100 - gSkillTraitValues.ubAMReloadSpeedMagazines)/100); - } + }*/ } if(usAllAPs == 1) { for(int i = 1; i <= rounds; i++) { - // SANDRO - added Ambidextrous check +/* // SANDRO - added Ambidextrous check if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) { if(EnoughPoints(pSoldier,(reload + (i * (INT16)((APBPConstants[AP_RELOAD_LOOSE]*(100 - gSkillTraitValues.ubAMReloadSpeedLoose)/100) + 0.5))),0,FALSE) == FALSE) @@ -3031,23 +3044,23 @@ INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJEC } } else - { - if(EnoughPoints(pSoldier,(reload + (i * APBPConstants[AP_RELOAD_LOOSE])),0,FALSE) == FALSE) + {*/ + if(EnoughPoints(pSoldier,(reload + (i * (INT16)(APBPConstants[AP_RELOAD_LOOSE] * fSpeedBonus + 0.5))),0,FALSE) == FALSE) { rounds = i-1; break; } - } +// } } } else if (usAllAPs == 2) rounds = 1; - // SANDRO - added Ambidextrous check +/* // SANDRO - added Ambidextrous check if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) return (reload + ((INT16) (rounds * (APBPConstants[AP_RELOAD_LOOSE]*(100 - gSkillTraitValues.ubAMReloadSpeedLoose)/100) + 0.5))); - else - return (reload + (rounds * APBPConstants[AP_RELOAD_LOOSE])); + else*/ + return (reload + (rounds * (INT16)(APBPConstants[AP_RELOAD_LOOSE] * fSpeedBonus + 0.5))); } return GetAPsToReload(pGun); // added by SANDRO - safety check diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 70205fe5..c085df93 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -963,14 +963,21 @@ UINT16 GunRange( OBJECTTYPE * pObj, SOLDIERTYPE * pSoldier ) // SANDRO - added a rng = (usRange * GetPercentRangeBonus(pObj))/10000; rng += GetRangeBonus(pObj); - // SANDRO - STOMP traits - Gunslinger bonus range with pistols + // SANDRO - STOMP traits if ( pSoldier != NULL && Item[ pObj->usItem ].usItemClass & IC_GUN ) { + // Gunslinger bonus range with pistols if ((Weapon[ pObj->usItem ].ubWeaponType == GUN_PISTOL || Weapon[ pObj->usItem ].ubWeaponType == GUN_M_PISTOL) && gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) ) { rng += (rng * gSkillTraitValues.ubGSEffectiveRangeBonusPistols * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ) / 100 ); } + // Ranger bonus range with shotguns + else if ( Weapon[ pObj->usItem ].ubWeaponType == GUN_SHOTGUN && + gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) ) + { + rng += (rng * gSkillTraitValues.ubRAEffectiveRangeBonusShotguns * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) / 100 ); + } } return rng; diff --git a/Utils/_Ja25ChineseText.cpp b/Utils/_Ja25ChineseText.cpp index 84af9684..f686bb53 100644 --- a/Utils/_Ja25ChineseText.cpp +++ b/Utils/_Ja25ChineseText.cpp @@ -150,6 +150,10 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"使用散弹枪时-%d%s APs\n", //L"-%d%s APs to fire Shotguns\n", L"使用散弹枪增加%d次瞄准次数\n", //L"Adds %d more aim click for Shotguns\n", L"使用散弹枪增加%d次瞄准次数\n", //L"Adds %d more aim clicks for Shotguns\n", + L"+%d%s effective range with Shotguns\n", // TODO.Translate + L"-%d%s APs to reload single Shotgun shells\n", // TODO.Translate + L"Adds %d more aim click for Rifles\n", // TODO.Translate + L"Adds %d more aim clicks for Rifles\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= { diff --git a/Utils/_Ja25DutchText.cpp b/Utils/_Ja25DutchText.cpp index 92c1e9bf..57758302 100644 --- a/Utils/_Ja25DutchText.cpp +++ b/Utils/_Ja25DutchText.cpp @@ -150,6 +150,10 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s APs to fire Shotguns\n", L"Adds %d more aim click for Shotguns\n", L"Adds %d more aim clicks for Shotguns\n", + L"+%d%s effective range with Shotguns\n", + L"-%d%s APs to reload single Shotgun shells\n", + L"Adds %d more aim click for Rifles\n", + L"Adds %d more aim clicks for Rifles\n", }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25EnglishText.cpp b/Utils/_Ja25EnglishText.cpp index 8f101755..b166f504 100644 --- a/Utils/_Ja25EnglishText.cpp +++ b/Utils/_Ja25EnglishText.cpp @@ -150,6 +150,10 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s APs to fire Shotguns\n", L"Adds %d more aim click for Shotguns\n", L"Adds %d more aim clicks for Shotguns\n", + L"+%d%s effective range with Shotguns\n", + L"-%d%s APs to reload single Shotgun shells\n", + L"Adds %d more aim click for Rifles\n", + L"Adds %d more aim clicks for Rifles\n", }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25FrenchText.cpp b/Utils/_Ja25FrenchText.cpp index 830f4182..8b0b0027 100644 --- a/Utils/_Ja25FrenchText.cpp +++ b/Utils/_Ja25FrenchText.cpp @@ -151,7 +151,12 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s PA pour tirer avec les fusils à pompe\n", L"Ajoute un niveau de visée pour les fusils à pompe\n", L"Ajoute %d niveaux de visée pour les fusils à pompe\n", + L"+%d%s effective range with Shotguns\n", // TODO.Translate + L"-%d%s APs to reload single Shotgun shells\n", // TODO.Translate + L"Adds %d more aim click for Rifles\n", // TODO.Translate + L"Adds %d more aim clicks for Rifles\n", // TODO.Translate }; + STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= { L"-%d%s du nombre de PA nécessaire pour tirer avec un pistolet ou un revolver\n", diff --git a/Utils/_Ja25GermanText.cpp b/Utils/_Ja25GermanText.cpp index ebeba0fd..9b219163 100644 --- a/Utils/_Ja25GermanText.cpp +++ b/Utils/_Ja25GermanText.cpp @@ -144,12 +144,16 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]= }; STR16 gzIMPMajorTraitsHelpTextsRanger[]= { - L"+%d%s Trefferchance mit Büchsen\n", - L"+%d%s Trefferchance mit Flinten\n", - L"-%d%s APs benötigt um Flinten zu repetieren\n", - L"-%d%s APs benötigt um Flinten abzufeuern\n", - L"Gibt Flinten einen weiteren Zielklick\n", - L"%d weitere Zielklicks für Flinten\n", + L"+%d%s Trefferchance mit Gewehren\n", + L"+%d%s Trefferchance mit Schrotflinten\n", + L"-%d%s APs benötigt, um Schrotflinten zu repetieren\n", + L"-%d%s APs benötigt, um Schrotflinten abzufeuern\n", + L"Gibt Schrotflinten einen weiteren Zielklick\n", + L"%d weitere Zielklicks für Schrotflinten\n", + L"+%d%s effektive Reichweite mit Schrotflinten\n", + L"-%d%s APs benötigt, um einzelne Schrotpatronen zu laden\n", + L"Gibt Gewehren einen weiteren Zielklick\n", + L"%d weitere Zielklicks für Gewehre\n", }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25ItalianText.cpp b/Utils/_Ja25ItalianText.cpp index bda00f54..938ef4c3 100644 --- a/Utils/_Ja25ItalianText.cpp +++ b/Utils/_Ja25ItalianText.cpp @@ -148,6 +148,10 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s APs to fire Shotguns\n", L"Adds %d more aim click for Shotguns\n", L"Adds %d more aim clicks for Shotguns\n", + L"+%d%s effective range with Shotguns\n", + L"-%d%s APs to reload single Shotgun shells\n", + L"Adds %d more aim click for Rifles\n", + L"Adds %d more aim clicks for Rifles\n", }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25PolishText.cpp b/Utils/_Ja25PolishText.cpp index af07b556..9de19bb9 100644 --- a/Utils/_Ja25PolishText.cpp +++ b/Utils/_Ja25PolishText.cpp @@ -150,6 +150,10 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s APs to fire Shotguns\n", L"Adds %d more aim click for Shotguns\n", L"Adds %d more aim clicks for Shotguns\n", + L"+%d%s effective range with Shotguns\n", + L"-%d%s APs to reload single Shotgun shells\n", + L"Adds %d more aim click for Rifles\n", + L"Adds %d more aim clicks for Rifles\n", }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25RussianText.cpp b/Utils/_Ja25RussianText.cpp index c43a19b0..6bb7752a 100644 --- a/Utils/_Ja25RussianText.cpp +++ b/Utils/_Ja25RussianText.cpp @@ -150,6 +150,10 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s ОД на выстрел из дробовика\n", L"+%d клик прицеливания для дробовиков\n", L"+%d кликов прицеливания для дробовиков\n", + L"+%d%s effective range with Shotguns\n", // TODO.Translate + L"-%d%s APs to reload single Shotgun shells\n", // TODO.Translate + L"Adds %d more aim click for Rifles\n", // TODO.Translate + L"Adds %d more aim clicks for Rifles\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= {