From 73dc6f250d1b62badb60a800f565484c29e3735e Mon Sep 17 00:00:00 2001 From: Wanne Date: Sat, 15 Oct 2011 19:57:54 +0000 Subject: [PATCH] - Bugfix: AI acts strange (does not shoot out of weapon range, ...) when NCTH is enabled o AICalcChanceToHitGun the change to hit is reduced to zero if the AI exceeds the gun range by 10% and is only 50% when in that range. o I've changed that code to use externalize the parameters to the CTHConstants.ini file. o The result is no change in how actual code runs but now those hard coded parameters should be modifiable. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4713 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 5 +++-- GameSettings.h | 3 +++ Tactical/Weapons.cpp | 16 +++++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index f39816039..9c94a5b43 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2236,8 +2236,9 @@ void LoadCTHConstants() gGameCTHConstants.NORMAL_RECOIL_DISTANCE = iniReader.ReadInteger("Shooting Mechanism","NORMAL_RECOIL_DISTANCE",140, 10, 10000); gGameCTHConstants.MAX_BULLET_DEV = iniReader.ReadFloat("Shooting Mechanism","MAX_BULLET_DEV ",10.0, -1000.0, 1000.0); gGameCTHConstants.RANGE_EFFECTS_DEV = iniReader.ReadBoolean("Shooting Mechanism","RANGE_EFFECTS_DEV", TRUE ); - - + gGameCTHConstants.MAX_EFFECTIVE_RANGE_MULTIPLIER = iniReader.ReadFloat("Shooting Mechanism","MAX_EFFECTIVE_RANGE_MULTIPLIER",1.1f, 0.5f, 10.0f); + gGameCTHConstants.MAX_EFFECTIVE_RANGE_REDUCTION = iniReader.ReadFloat("Shooting Mechanism","MAX_EFFECTIVE_RANGE_REDUCTION",0.5f, 0.0f, 1.0f); + gGameCTHConstants.MAX_EFFECTIVE_USE_GRADIENT = iniReader.ReadBoolean("Shooting Mechanism","MAX_EFFECTIVE_USE_GRADIENT", FALSE ); } void FreeGameExternalOptions() diff --git a/GameSettings.h b/GameSettings.h index da5b8e8b8..883988608 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1344,6 +1344,9 @@ typedef struct UINT32 NORMAL_RECOIL_DISTANCE; FLOAT MAX_BULLET_DEV; BOOLEAN RANGE_EFFECTS_DEV; + FLOAT MAX_EFFECTIVE_RANGE_MULTIPLIER; + FLOAT MAX_EFFECTIVE_RANGE_REDUCTION; + BOOLEAN MAX_EFFECTIVE_USE_GRADIENT; } CTH_CONSTANTS; diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 0acfbbb26..cdb682373 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -8045,15 +8045,25 @@ UINT32 AICalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTim } FLOAT dGunRange = (FLOAT)(GunRange( &(pSoldier->inv[pSoldier->ubAttackingHand]), pSoldier ) ); - if ( (dGunRange * 1.1f) < d2DDistance) + FLOAT dMaxGunRange = dGunRange * gGameCTHConstants.MAX_EFFECTIVE_RANGE_MULTIPLIER; + if ( dMaxGunRange < d2DDistance) { // Weapon out of conceivable hit range. Reduce chance to hit to 0! return (0); } else if ( dGunRange < d2DDistance) { - // Just outside range. Reduce considerably! - return (uiChance / 2); + FLOAT dChance = (FLOAT)uiChance; + FLOAT dMaxChanceReduction = (dChance * gGameCTHConstants.MAX_EFFECTIVE_RANGE_REDUCTION); + if (gGameCTHConstants.MAX_EFFECTIVE_USE_GRADIENT) + { + // Just outside range. Reduce considerably! + return min(uiChance, (UINT)(dChance - (dMaxChanceReduction * ((d2DDistance - dGunRange) / (dMaxGunRange - dGunRange))))); + } + else + { + return (UINT)(dChance - dMaxChanceReduction); + } } } return( uiChance );