- cleaned up drug code

- moved trait cth modifiers into a SOLDIERTYPE member function

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5989 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2013-04-08 21:13:54 +00:00
parent d0b9c0a032
commit a466e7348a
6 changed files with 231 additions and 436 deletions
+6 -339
View File
@@ -4989,179 +4989,8 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
iBaseModifier += (FLOAT)(iCurrentMorale * gGameCTHConstants.BASE_LOW_MORALE);
}
if ( gGameOptions.fNewTraitSystem )
{
iTraitModifier = 0;
// Bonus for heavy weapons moved here from above to get instant CtH bonus and not marksmanship bonus,
// which is supressed by weapon condition
if (Item[usInHand].rocketlauncher || Item[usInHand].singleshotrocketlauncher)
{
iTraitModifier += gSkillTraitValues.bCtHModifierRocketLaunchers; // -25% for untrained mercs !!!
if (HAS_SKILL_TRAIT( pSoldier, HEAVY_WEAPONS_NT ))
iTraitModifier += gSkillTraitValues.ubHWBonusCtHRocketLaunchers * NUM_SKILL_TRAITS( pSoldier, HEAVY_WEAPONS_NT ); // +25% per trait
}
// Added CtH bonus for Gunslinger trait on pistols and machine-pistols
else if ( Weapon[usItemAttHand].ubWeaponType == GUN_PISTOL )
{
iTraitModifier += gSkillTraitValues.bCtHModifierPistols; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iTraitModifier += gSkillTraitValues.ubGSBonusCtHPistols * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ); // +10% per trait
}
else if ( Weapon[usItemAttHand].ubWeaponType == GUN_M_PISTOL )
{
iTraitModifier += gSkillTraitValues.bCtHModifierMachinePistols; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) && ((pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0) || !gSkillTraitValues.ubGSCtHMPExcludeAuto))
iTraitModifier += gSkillTraitValues.ubGSBonusCtHMachinePistols * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ); // +5% per trait
}
// Added CtH bonus for Machinegunner skill on assault rifles, SMGs and LMGs
else if ( Weapon[usItemAttHand].ubWeaponType == GUN_AS_RIFLE )
{
iTraitModifier += gSkillTraitValues.bCtHModifierAssaultRifles; // -5% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) )
iTraitModifier += gSkillTraitValues.ubAWBonusCtHAssaultRifles * NUM_SKILL_TRAITS( pSoldier, AUTO_WEAPONS_NT ); // +5% per trait
}
else if ( Weapon[usItemAttHand].ubWeaponType == GUN_SMG )
{
iTraitModifier += gSkillTraitValues.bCtHModifierSMGs; // -5% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) )
iTraitModifier += gSkillTraitValues.ubAWBonusCtHSMGs * NUM_SKILL_TRAITS( pSoldier, AUTO_WEAPONS_NT ); // +5% per trait
}
else if ( Weapon[usItemAttHand].ubWeaponType == GUN_LMG )
{
iTraitModifier += gSkillTraitValues.bCtHModifierLMGs; // -10% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) )
iTraitModifier += gSkillTraitValues.ubAWBonusCtHLMGs * NUM_SKILL_TRAITS( pSoldier, AUTO_WEAPONS_NT ); // +5% per trait
}
// Added CtH bonus for Gunslinger trait on pistols and machine-pistols
else if ( Weapon[usItemAttHand].ubWeaponType == GUN_SN_RIFLE )
{
iTraitModifier += gSkillTraitValues.bCtHModifierSniperRifles; // -10% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iTraitModifier += gSkillTraitValues.ubSNBonusCtHSniperRifles * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ); // +5% per trait
}
// Added CtH bonus for Ranger skill on rifles and shotguns
else if ( Weapon[usInHand].ubWeaponType == GUN_RIFLE )
{
iTraitModifier += gSkillTraitValues.bCtHModifierRifles; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iTraitModifier += gSkillTraitValues.ubRABonusCtHRifles * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); // +5% per trait
//CHRISL: Why wouldn't sniper training include standard rifles which are often used as "poor-man sniper rifles"
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iTraitModifier += gSkillTraitValues.ubSNBonusCtHRifles * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ); // +5% per trait
}
else if ( Weapon[usInHand].ubWeaponType == GUN_SHOTGUN )
{
iTraitModifier += gSkillTraitValues.bCtHModifierShotguns; // -5% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
iTraitModifier += gSkillTraitValues.ubRABonusCtHShotguns * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); // +10% per trait
}
// SANDRO - added Throwing trait support on knives
if ( Item[ usInHand ].usItemClass == IC_THROWING_KNIFE )
{
iTraitModifier += gSkillTraitValues.bCtHModifierThrowingKnives; // -15% for untrained mercs
if ( HAS_SKILL_TRAIT( pSoldier, THROWING_NT ) )
iTraitModifier += gSkillTraitValues.ubTHBladesCtHBonus * 2;
//+ (gSkillTraitValues.ubTHBladesCtHBonusPerClick * pSoldier->aiData.bAimTime) );
}
// Added small CtH penalty for robot if controller hasn't the Technician trait
if( AM_A_ROBOT( pSoldier ) )
{
iTraitModifier += gSkillTraitValues.bCtHModifierRobot; // -10%
if ( HAS_SKILL_TRAIT( pSoldier->GetRobotController(), TECHNICIAN_NT ) )
iTraitModifier += gSkillTraitValues.ubTECtHControlledRobotBonus * NUM_SKILL_TRAITS( pSoldier->GetRobotController(), TECHNICIAN_NT ); // +10% per trait
}
// Added character traits influence
if ( pSoldier->ubProfile != NO_PROFILE )
{
// Sociable - better performance in groups
if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_SOCIABLE )
{
INT8 bNumMercs = CheckMercsNearForCharTraits( pSoldier->ubProfile, CHAR_TRAIT_SOCIABLE );
if ( bNumMercs > 2 )
iTraitModifier += 5;
else if ( bNumMercs > 0 )
iTraitModifier += 2;
}
// Loner - better performance when alone
else if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_LONER )
{
INT8 bNumMercs = CheckMercsNearForCharTraits( pSoldier->ubProfile, CHAR_TRAIT_LONER );
if ( bNumMercs == 0 )
iTraitModifier += 5;
else if ( bNumMercs <= 1 )
iTraitModifier += 2;
}
// Aggressive - bonus on bursts/autofire
else if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_AGGRESSIVE )
{
if (( pSoldier->bDoBurst || pSoldier->bDoAutofire ) && !ubAimTime )
iTraitModifier += 10;
}
// Show-off - better performance if some babes around to impress
else if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_SHOWOFF )
{
INT8 bNumMercs = CheckMercsNearForCharTraits( pSoldier->ubProfile, CHAR_TRAIT_SHOWOFF );
if ( bNumMercs > 1 )
iTraitModifier += 5;
else if ( bNumMercs > 0 )
iTraitModifier += 2;
}
// Added disabilities
if ( pSoldier->ubProfile != NO_PROFILE )
{
// Heat intolerant penalty
if ( MercIsHot( pSoldier ) )
{
iTraitModifier -= 15;
}
// Small penalty for fear of insects in tropical sectors
// Flugente: drugs can temporarily cause a merc get a new disability
else if ( ( (gMercProfiles[ pSoldier->ubProfile ].bDisability == FEAR_OF_INSECTS) || MercUnderTheInfluence(pSoldier, DRUG_TYPE_FEAROFINSECTS) )&& MercIsInTropicalSector( pSoldier ) )
{
// fear of insects, and we are in tropical sector
iTraitModifier -= 5;
}
}
}
// Dauntless - penalty for not taking proper cover
if (pTarget != NULL)
{
if ( pTarget->ubProfile != NO_PROFILE )
{
if ( gMercProfiles[ pTarget->ubProfile ].bCharacterTrait == CHAR_TRAIT_DAUNTLESS )
iTraitModifier += 5;
}
}
//Give 40% the normal stomp modifier as a base mod
iBaseModifier += (FLOAT)iTraitModifier * 0.4f;
}
else
{
// PSYCHO
// Flugente: drugs can temporarily cause a merc to go psycho
if ( pSoldier->ubProfile != NO_PROFILE && (gMercProfiles[ pSoldier->ubProfile ].bDisability == PSYCHO || MercUnderTheInfluence(pSoldier, DRUG_TYPE_PSYCHO) ) )
{
iBaseModifier += (FLOAT)gGameCTHConstants.BASE_PSYCHO;
}
}
// Flugente: moved trait modifiers into a member function
iTraitModifier = pSoldier->GetTraitCTHModifier( usInHand, ubAimTime, pTarget->ubProfile );
// SHOOTING AT SAME TARGET AGAIN
if (sGridNo == pSoldier->sLastTarget )
@@ -6629,166 +6458,9 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime,
/////////////////////////////////////////////////////////////////////////////////////
// Modify for traits
if( gGameOptions.fNewTraitSystem )
{
// Bonus for heavy weapons moved here from above to get instant CtH bonus and not marksmanship bonus,
// which is supressed by weapon condition
if (Item[usInHand].rocketlauncher || Item[usInHand].singleshotrocketlauncher)
{
iChance += gSkillTraitValues.bCtHModifierRocketLaunchers; // -25% for untrained mercs !!!
if (HAS_SKILL_TRAIT( pSoldier, HEAVY_WEAPONS_NT ))
iChance += gSkillTraitValues.ubHWBonusCtHRocketLaunchers * NUM_SKILL_TRAITS( pSoldier, HEAVY_WEAPONS_NT ); // +25% per trait
}
// Added CtH bonus for Gunslinger trait on pistols and machine-pistols
else if ( Weapon[usInHand].ubWeaponType == GUN_PISTOL )
{
iChance += gSkillTraitValues.bCtHModifierPistols; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iChance += gSkillTraitValues.ubGSBonusCtHPistols * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ); // +10% per trait
}
else if ( Weapon[usInHand].ubWeaponType == GUN_M_PISTOL )
{
iChance += gSkillTraitValues.bCtHModifierMachinePistols; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) && ((pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0) || !gSkillTraitValues.ubGSCtHMPExcludeAuto))
iChance += gSkillTraitValues.ubGSBonusCtHMachinePistols * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ); // +5% per trait
}
// Added CtH bonus for Machinegunner skill on assault rifles, SMGs and LMGs
else if ( Weapon[usInHand].ubWeaponType == GUN_AS_RIFLE )
{
iChance += gSkillTraitValues.bCtHModifierAssaultRifles; // -5% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) )
iChance += gSkillTraitValues.ubAWBonusCtHAssaultRifles * NUM_SKILL_TRAITS( pSoldier, AUTO_WEAPONS_NT ); // +5% per trait
}
else if ( Weapon[usInHand].ubWeaponType == GUN_SMG )
{
iChance += gSkillTraitValues.bCtHModifierSMGs; // -5% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) )
iChance += gSkillTraitValues.ubAWBonusCtHSMGs * NUM_SKILL_TRAITS( pSoldier, AUTO_WEAPONS_NT ); // +5% per trait
}
else if ( Weapon[usInHand].ubWeaponType == GUN_LMG )
{
iChance += gSkillTraitValues.bCtHModifierLMGs; // -10% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) )
iChance += gSkillTraitValues.ubAWBonusCtHLMGs * NUM_SKILL_TRAITS( pSoldier, AUTO_WEAPONS_NT ); // +5% per trait
}
// Added CtH bonus for Gunslinger trait on pistols and machine-pistols
else if ( Weapon[usInHand].ubWeaponType == GUN_SN_RIFLE )
{
iChance += gSkillTraitValues.bCtHModifierSniperRifles; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iChance += gSkillTraitValues.ubSNBonusCtHSniperRifles * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ); // +5% per trait
}
// Added CtH bonus for Ranger skill on rifles and shotguns
else if ( Weapon[usInHand].ubWeaponType == GUN_RIFLE )
{
iChance += gSkillTraitValues.bCtHModifierRifles; // -5% for untrained mercs.
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iChance += gSkillTraitValues.ubRABonusCtHRifles * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); // +5% per trait
//CHRISL: Why wouldn't sniper training include standard rifles which are often used as "poor-man sniper rifles"
// this bonus is applied only on single shots!
if ( HAS_SKILL_TRAIT( pSoldier, SNIPER_NT ) && pSoldier->bDoBurst == 0 && pSoldier->bDoAutofire == 0 )
iChance += gSkillTraitValues.ubSNBonusCtHRifles * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT ); // +5% per trait
}
else if ( Weapon[usInHand].ubWeaponType == GUN_SHOTGUN )
{
iChance += gSkillTraitValues.bCtHModifierShotguns; // -5% for untrained mercs.
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
iChance += gSkillTraitValues.ubRABonusCtHShotguns * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ); // +10% per trait
}
// Added small CtH penalty for robot if controller hasn't the Technician trait
if( AM_A_ROBOT( pSoldier ) )
{
iChance += gSkillTraitValues.bCtHModifierRobot; // -10%
if ( HAS_SKILL_TRAIT( pSoldier->GetRobotController(), TECHNICIAN_NT ) )
iChance += gSkillTraitValues.ubTECtHControlledRobotBonus * NUM_SKILL_TRAITS( pSoldier->GetRobotController(), TECHNICIAN_NT ); // +10% per trait
}
// Added character traits influence
if ( pSoldier->ubProfile != NO_PROFILE )
{
// Sociable - better performance in groups
if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_SOCIABLE )
{
INT8 bNumMercs = CheckMercsNearForCharTraits( pSoldier->ubProfile, CHAR_TRAIT_SOCIABLE );
if ( bNumMercs > 2 )
iChance += 5;
else if ( bNumMercs > 0 )
iChance += 2;
}
// Loner - better performance when alone
else if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_LONER )
{
INT8 bNumMercs = CheckMercsNearForCharTraits( pSoldier->ubProfile, CHAR_TRAIT_LONER );
if ( bNumMercs == 0 )
iChance += 5;
else if ( bNumMercs <= 1 )
iChance += 2;
}
// Aggressive - bonus on bursts/autofire
else if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_AGGRESSIVE )
{
if (( pSoldier->bDoBurst || pSoldier->bDoAutofire ) && !ubAimTime )
iChance += 10;
}
// Show-off - better performance if some babes around to impress
else if ( gMercProfiles[ pSoldier->ubProfile ].bCharacterTrait == CHAR_TRAIT_SHOWOFF )
{
INT8 bNumMercs = CheckMercsNearForCharTraits( pSoldier->ubProfile, CHAR_TRAIT_SHOWOFF );
if ( bNumMercs > 1 )
iChance += 5;
else if ( bNumMercs > 0 )
iChance += 2;
}
// Added disabilities
if ( pSoldier->ubProfile != NO_PROFILE )
{
// Heat intolerant penalty
if ( MercIsHot( pSoldier ) )
{
iChance -= 15;
}
// Small penalty for fear of insects in tropical sectors
// Flugente: drugs can temporarily cause a merc get a new disability
else if ( ( (gMercProfiles[ pSoldier->ubProfile ].bDisability == FEAR_OF_INSECTS) || MercUnderTheInfluence(pSoldier, DRUG_TYPE_FEAROFINSECTS) )&& MercIsInTropicalSector( pSoldier ) )
{
// fear of insects, and we are in tropical sector
iChance -= 5;
}
}
}
// Dauntless - penalty for not taking proper cover
if (pTarget != NULL)
{
if ( pTarget->ubProfile != NO_PROFILE )
{
if ( gMercProfiles[ pTarget->ubProfile ].bCharacterTrait == CHAR_TRAIT_DAUNTLESS )
iChance += 5;
}
}
}
else
{
// this rather unlogical bonus for psychotic characters applies only with old traits
if ( pSoldier->ubProfile != NO_PROFILE && gMercProfiles[ pSoldier->ubProfile ].bDisability == PSYCHO )
{
iChance += AIM_BONUS_PSYCHO;
}
}
// Flugente: moved trait modifiers into a member function
iChance += pSoldier->GetTraitCTHModifier( usInHand, ubAimTime, pTarget->ubProfile );
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
@@ -9021,12 +8693,7 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget,
pTarget->bSoldierFlagMask |= SOLDIER_DRUGGED;
// Add lifedamage effects
pTarget->drugs.bFutureDrugEffect[ DRUG_TYPE_LIFEDAMAGE ] = min(pTarget->drugs.bFutureDrugEffect[ DRUG_TYPE_LIFEDAMAGE ] + 3, 127);
pTarget->drugs.bDrugEffectRate[DRUG_TYPE_LIFEDAMAGE] = 1;
pTarget->drugs.bDrugEffect[DRUG_TYPE_LIFEDAMAGE] = 0;
pTarget->drugs.bDrugSideEffectRate[DRUG_TYPE_LIFEDAMAGE] = 0;
pTarget->drugs.bDrugSideEffect[DRUG_TYPE_LIFEDAMAGE] = 127;
pTarget->drugs.bTimesDrugUsedSinceSleep[ DRUG_TYPE_LIFEDAMAGE ]++;
pTarget->AddDrugValues( DRUG_TYPE_LIFEDAMAGE, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugEffect, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugTravelRate, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugSideEffect );
}
else if ( AmmoTypes[ubAmmoType].dart && sHitBy > 20 )
{