From a7d7f4b93bba2daeb963be3fb2f566a28560bda8 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 19 Jun 2021 10:27:13 +0000 Subject: [PATCH] Fix: crash due to overflow as a result of very low reliability values git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9088 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/LOS.cpp | 9 ++++++--- Tactical/Weapons.cpp | 35 +++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index ae0c0b74..c2bfd602 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -6296,17 +6296,20 @@ INT8 FireBulletGivenTargetTrapOnly( SOLDIERTYPE* pThrower, OBJECTTYPE* pObj, INT // Flugente : Added a malus to reliability for overheated guns // HEADROCK HAM 5: Variable NCTH base change UINT32 uiDepreciateTest = 0; + INT32 depreciatetest = 0; if ( UsingNewCTHSystem() == true) { UINT16 usBaseChance = gGameCTHConstants.BASIC_RELIABILITY_ODDS; FLOAT dReliabilityRatio = 3.0f * ((FLOAT)usBaseChance / (FLOAT)gItemSettings.usBasicDeprecateChance); // Compare original odds to new odds. - uiDepreciateTest = usBaseChance + (INT16)( dReliabilityRatio * GetReliability( pObj ) - iOverheatReliabilityMalus); - uiDepreciateTest = max(0, uiDepreciateTest); + depreciatetest = usBaseChance + (INT16)( dReliabilityRatio * GetReliability( pObj ) - iOverheatReliabilityMalus); } else { - uiDepreciateTest = max( gItemSettings.usBasicDeprecateChance + 3 * GetReliability( pObj ) - iOverheatReliabilityMalus, 0 ); + depreciatetest = gItemSettings.usBasicDeprecateChance + 3 * GetReliability( pObj ) - iOverheatReliabilityMalus; } + + uiDepreciateTest = min( 100, max( 0, depreciatetest ) ); + if ( !PreRandom( uiDepreciateTest ) && ( (*pObj)[0]->data.objectStatus > 1) ) { (*pObj)[0]->data.objectStatus--; diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 5aa7f48b..d14a73ce 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -2536,17 +2536,20 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo ) { INT16 ammoReliability = Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].bReliability; // HEADROCK HAM 5: Variable base chance + INT32 depreciatetest = 0; if ( UsingNewCTHSystem() == true) { UINT16 usBaseChance = gGameCTHConstants.BASIC_RELIABILITY_ODDS; FLOAT dReliabilityRatio = 3.0f * ((FLOAT)usBaseChance / (FLOAT)gItemSettings.usBasicDeprecateChance); // Compare original odds to new odds. - uiDepreciateTest = usBaseChance + (INT16)( dReliabilityRatio * (Item[ iter->usItem ].bReliability + ammoReliability) ); - uiDepreciateTest = max(0, uiDepreciateTest); + depreciatetest = usBaseChance + (INT16)( dReliabilityRatio * (Item[ iter->usItem ].bReliability + ammoReliability) ); } else { - uiDepreciateTest = max( 0, gItemSettings.usBasicDeprecateChance + 3 * (Item[iter->usItem].bReliability + ammoReliability) ); + depreciatetest = gItemSettings.usBasicDeprecateChance + 3 * (Item[iter->usItem].bReliability + ammoReliability); } + + uiDepreciateTest = min( 100, max( 0, depreciatetest ) ); + if ( !PreRandom( uiDepreciateTest ) && ( (*pObjAttHand)[0]->data.objectStatus > 1) ) { (*pA)[0]->data.objectStatus--; @@ -3039,18 +3042,20 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo ) // Flugente: Added a malus to reliability for overheated guns // HEADROCK HAM 5: Variable NCTH base change + INT32 depreciatetest = 0; if ( UsingNewCTHSystem() == true) { UINT16 usBaseChance = gGameCTHConstants.BASIC_RELIABILITY_ODDS; FLOAT dReliabilityRatio = 3.0f * ((FLOAT)usBaseChance / (FLOAT)gItemSettings.usBasicDeprecateChance); // Compare original odds to new odds. - uiDepreciateTest = (UINT32)((usBaseChance + (INT16)( dReliabilityRatio * GetReliability( &(pSoldier->inv[pSoldier->ubAttackingHand]) ) - iOverheatReliabilityMalus)) / dirtincreasefactor); - uiDepreciateTest = max(0, uiDepreciateTest); + uiDepreciateTest = (usBaseChance + (INT16)( dReliabilityRatio * GetReliability( &(pSoldier->inv[pSoldier->ubAttackingHand]) ) - iOverheatReliabilityMalus)) / dirtincreasefactor; } else { - uiDepreciateTest = max( (UINT32)((gItemSettings.usBasicDeprecateChance + 3 * GetReliability( pObjAttHand ) - iOverheatReliabilityMalus) / dirtincreasefactor), 0 ); + depreciatetest = ( gItemSettings.usBasicDeprecateChance + 3 * GetReliability( pObjAttHand ) - iOverheatReliabilityMalus ) / dirtincreasefactor; } + uiDepreciateTest = min( 100, max( 0, depreciatetest ) ); + if ( !PreRandom( uiDepreciateTest ) && ( (*pObjAttHand)[0]->data.objectStatus > 1) ) { (*pObjAttHand)[0]->data.objectStatus--; @@ -3266,17 +3271,21 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo ) { INT16 ammoReliability = Item[(*pObjUsed)[0]->data.gun.usGunAmmoItem].bReliability; // HEADROCK HAM 5: Variable base chance + + INT32 depreciatetest = 0; if ( UsingNewCTHSystem() == true ) { UINT16 usBaseChance = gGameCTHConstants.BASIC_RELIABILITY_ODDS; FLOAT dReliabilityRatio = 3.0f * ((FLOAT)usBaseChance / (FLOAT)gItemSettings.usBasicDeprecateChance); // Compare original odds to new odds. - uiDepreciateTest = usBaseChance + (INT16)( dReliabilityRatio * (Item[ iter->usItem ].bReliability + ammoReliability) ); - uiDepreciateTest = __max(0, uiDepreciateTest); + depreciatetest = usBaseChance + (INT16)( dReliabilityRatio * (Item[ iter->usItem ].bReliability + ammoReliability) ); } else { - uiDepreciateTest = __max( 0, gItemSettings.usBasicDeprecateChance + 3 * (Item[iter->usItem].bReliability + ammoReliability) ); + depreciatetest = gItemSettings.usBasicDeprecateChance + 3 * (Item[iter->usItem].bReliability + ammoReliability); } + + uiDepreciateTest = min( 100, max( 0, depreciatetest ) ); + if ( !PreRandom( uiDepreciateTest ) && ( (*pObjUsed)[0]->data.objectStatus > 1) ) { (*pA)[0]->data.objectStatus--; @@ -3803,18 +3812,20 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo ) } // Flugente: Added a malus to reliability for overheated guns + INT32 depreciatetest = 0; if ( UsingNewCTHSystem() == true ) { UINT16 usBaseChance = gGameCTHConstants.BASIC_RELIABILITY_ODDS; FLOAT dReliabilityRatio = 3.0f * ((FLOAT)usBaseChance / (FLOAT)gItemSettings.usBasicDeprecateChance); // Compare original odds to new odds. - uiDepreciateTest = (UINT32)(usBaseChance + (INT16)( dReliabilityRatio * GetReliability( &(pSoldier->inv[ pSoldier->ubAttackingHand ])) - iOverheatReliabilityMalus) / dirtincreasefactor); - uiDepreciateTest = max(0, uiDepreciateTest); + uiDepreciateTest = usBaseChance + (INT16)( dReliabilityRatio * GetReliability( &(pSoldier->inv[ pSoldier->ubAttackingHand ])) - iOverheatReliabilityMalus) / dirtincreasefactor; } else { - uiDepreciateTest = max( (UINT32)((gItemSettings.usBasicDeprecateChance + 3 * (GetReliability( pObjUsed )) - iOverheatReliabilityMalus) / dirtincreasefactor), 0 ); + depreciatetest = (gItemSettings.usBasicDeprecateChance + 3 * (GetReliability( pObjUsed )) - iOverheatReliabilityMalus) / dirtincreasefactor; } + uiDepreciateTest = min( 100, max( 0, depreciatetest ) ); + if ( !PreRandom( uiDepreciateTest ) && ( (*pObjUsed)[0]->data.objectStatus > 1) ) { (*pObjUsed)[0]->data.objectStatus--;