From 2470880bae57c673f04a75c637bdf66bebe4a35c Mon Sep 17 00:00:00 2001 From: Flugente Date: Thu, 21 May 2015 21:24:03 +0000 Subject: [PATCH] Fix: absurd stat gains when hitting a target in NCTH git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7873 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/LOS.cpp | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index 9e60562c..71db90fe 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -2899,30 +2899,36 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend if ( UsingNewCTHSystem() && pBullet->ubFirerID != NOBODY && pFirer->bTeam == gbPlayerNum && pBullet->fAimed) // Only for single shot, first bullet in volley, or first bullet in spread. { UINT16 usExpGain = 10; - usExpGain = (usExpGain * pBullet->sHitBy) / 100; - if ( pTarget->ubBodyType == COW || pTarget->ubBodyType == CROW ) + // Flugente: as pBullet->sHitBy can be negative, usExpGain would roll over - negative values become very high positive ones + // This will then cause absurd stat gains. So let'S not do that, okay? + if ( pBullet->sHitBy > 0.0 ) { - usExpGain /= 2; - } - else if ( pTarget->flags.uiStatusFlags & SOLDIER_VEHICLE || AM_A_ROBOT( pTarget ) || TANK( pTarget ) ) - { - // no exp from shooting a vehicle that you can't damage and can't move! - usExpGain = 0; - } + usExpGain = (usExpGain * pBullet->sHitBy) / 100; - if (!(pBullet->usFlags & BULLET_FLAG_KNIFE)) - { - // MARKSMANSHIP/DEXTERITY GAIN: gun attack - StatChange( pFirer, MARKAMT, ( UINT16 )( (usExpGain * 2) / 3 ), FROM_SUCCESS ); - StatChange( pFirer, DEXTAMT, ( UINT16 )( usExpGain / 3 ), FROM_SUCCESS ); - } - else - { - // MARKSMANSHIP/DEXTERITY/AGILITY GAIN: throwing knife attack - StatChange( pFirer, MARKAMT, ( UINT16 )( usExpGain / 5 ), FROM_SUCCESS ); - StatChange( pFirer, DEXTAMT, ( UINT16 )( (usExpGain * 2) / 5 ), FROM_SUCCESS ); - StatChange( pFirer, AGILAMT, ( UINT16 )( (usExpGain * 2) / 5 ), FROM_SUCCESS ); + if ( pTarget->ubBodyType == COW || pTarget->ubBodyType == CROW ) + { + usExpGain /= 2; + } + else if ( pTarget->flags.uiStatusFlags & SOLDIER_VEHICLE || AM_A_ROBOT( pTarget ) || TANK( pTarget ) ) + { + // no exp from shooting a vehicle that you can't damage and can't move! + usExpGain = 0; + } + + if (!(pBullet->usFlags & BULLET_FLAG_KNIFE)) + { + // MARKSMANSHIP/DEXTERITY GAIN: gun attack + StatChange( pFirer, MARKAMT, ( UINT16 )( (usExpGain * 2) / 3 ), FROM_SUCCESS ); + StatChange( pFirer, DEXTAMT, ( UINT16 )( usExpGain / 3 ), FROM_SUCCESS ); + } + else + { + // MARKSMANSHIP/DEXTERITY/AGILITY GAIN: throwing knife attack + StatChange( pFirer, MARKAMT, ( UINT16 )( usExpGain / 5 ), FROM_SUCCESS ); + StatChange( pFirer, DEXTAMT, ( UINT16 )( (usExpGain * 2) / 5 ), FROM_SUCCESS ); + StatChange( pFirer, AGILAMT, ( UINT16 )( (usExpGain * 2) / 5 ), FROM_SUCCESS ); + } } } }