From d8c79675e73cb4e8b806b0827d53d811031d0ef9 Mon Sep 17 00:00:00 2001 From: Flugente Date: Thu, 26 May 2016 19:05:58 +0000 Subject: [PATCH] Fix: armour comparison compares helmet with vest/legs and is unsafe git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8238 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- TacticalAI/FindLocations.cpp | 44 +++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/TacticalAI/FindLocations.cpp b/TacticalAI/FindLocations.cpp index 8f788fff..b2086672 100644 --- a/TacticalAI/FindLocations.cpp +++ b/TacticalAI/FindLocations.cpp @@ -1981,48 +1981,56 @@ INT8 SearchForItems( SOLDIERTYPE * pSoldier, INT8 bReason, UINT16 usItem ) } else if (pItem->usItemClass == IC_ARMOUR && (*pObj)[0]->data.objectStatus >= MINIMUM_REQUIRED_STATUS ) { + INT32 effectivearmour_obj = EffectiveArmour( pObj ); + INT32 effectivearmour_currentpos = 0; + + iTempValue = 0; + switch( Armour[pItem->ubClassIndex].ubArmourClass ) { case ARMOURCLASS_HELMET: if (pSoldier->inv[HELMETPOS].exists() == false) { - iTempValue = 200 + EffectiveArmour( pObj ); - } - else if ( EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ) > EffectiveArmour( pObj ) ) - { - iTempValue = 100 * EffectiveArmour( pObj ) / EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ); + iTempValue = 200 + effectivearmour_obj; } else { - iTempValue = 0; + effectivearmour_currentpos = EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ); + + if ( effectivearmour_currentpos > 0 && effectivearmour_currentpos > effectivearmour_obj ) + { + iTempValue = 100 * effectivearmour_obj / effectivearmour_currentpos; + } } break; case ARMOURCLASS_VEST: if (pSoldier->inv[VESTPOS].exists() == false) { - iTempValue = 200 + EffectiveArmour( pObj ); - } - else if ( EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ) > EffectiveArmour( pObj ) ) - { - iTempValue = 100 * EffectiveArmour( pObj ) / EffectiveArmour( &(pSoldier->inv[VESTPOS]) ); + iTempValue = 200 + effectivearmour_obj; } else { - iTempValue = 0; + effectivearmour_currentpos = EffectiveArmour( &(pSoldier->inv[VESTPOS]) ); + + if ( effectivearmour_currentpos > 0 && effectivearmour_currentpos > effectivearmour_obj ) + { + iTempValue = 100 * effectivearmour_obj / effectivearmour_currentpos; + } } break; case ARMOURCLASS_LEGGINGS: if (pSoldier->inv[LEGPOS].exists() == false) { - iTempValue = 200 + EffectiveArmour( pObj ); - } - else if ( EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ) > EffectiveArmour( pObj ) ) - { - iTempValue = 100 * EffectiveArmour( pObj ) / EffectiveArmour( &(pSoldier->inv[LEGPOS]) ); + iTempValue = 200 + effectivearmour_obj; } else { - iTempValue = 0; + effectivearmour_currentpos = EffectiveArmour( &(pSoldier->inv[LEGPOS]) ); + + if ( effectivearmour_currentpos > 0 && effectivearmour_currentpos > effectivearmour_obj ) + { + iTempValue = 100 * effectivearmour_obj / effectivearmour_currentpos; + } } break; default: