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
This commit is contained in:
silversurfer
2015-02-28 17:08:37 +00:00
parent f6f19d01cd
commit 4b70b1e400
16 changed files with 166 additions and 46 deletions
+3 -1
View File
@@ -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);
+2
View File
@@ -1616,6 +1616,8 @@ typedef struct
UINT8 ubRAPumpShotgunsAPsReduction;
UINT8 ubRAFiringSpeedBonusShotguns;
UINT8 ubRAAimClicksAdded;
UINT8 ubRAEffectiveRangeBonusShotguns;
UINT8 ubRAReloadSpeedShotgunsManual;
// GUNSLINGER
UINT8 ubGSFiringSpeedBonusPistols;
+20 -3
View File
@@ -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;
+3 -3
View File
@@ -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 );
}
+34 -2
View File
@@ -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
+34 -20
View File
@@ -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
+23 -10
View File
@@ -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
+8 -1
View File
@@ -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;
+4
View File
@@ -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[]=
{
+4
View File
@@ -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[]=
+4
View File
@@ -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[]=
+5
View File
@@ -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",
+10 -6
View File
@@ -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[]=
+4
View File
@@ -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[]=
+4
View File
@@ -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[]=
+4
View File
@@ -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[]=
{