diff --git a/GameVersion.cpp b/GameVersion.cpp index 1ba6f644..1a577a93 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -55,8 +55,8 @@ #endif -CHAR8 czVersionNumber[16] = { "Build 18.31.10" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 18.03.11" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; -CHAR16 zRevisionNumber[16] = { L"Revision 8633" }; +CHAR16 zRevisionNumber[16] = { L"Revision 8634" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/Laptop/insurance Contract.cpp b/Laptop/insurance Contract.cpp index 82516bbd..8bda3d60 100644 --- a/Laptop/insurance Contract.cpp +++ b/Laptop/insurance Contract.cpp @@ -1204,7 +1204,7 @@ INT32 CalculateInsuranceContractCost( INT32 iLength, UINT8 ubMercID ) } // premium depend on merc's salary, the base insurance rate, and the individual's risk factor at this time - uiDailyInsurancePremium = (UINT32) (((pProfile->sSalary * INSURANCE_PREMIUM_RATE * flRiskFactor) / 100) + 0.5); + uiDailyInsurancePremium = (UINT32) (pProfile->sSalary * INSURANCE_PREMIUM_RATE * flRiskFactor / 100.0f + 0.5f); // multiply by the insurance contract length uiTotalInsurancePremium = uiDailyInsurancePremium * iLength; diff --git a/Laptop/personnel.cpp b/Laptop/personnel.cpp index 344b1aa1..a29ba2e2 100644 --- a/Laptop/personnel.cpp +++ b/Laptop/personnel.cpp @@ -8986,7 +8986,7 @@ INT8 CalculateMercsAchievementPercentage( INT32 ubProfile ) // Calculate percentage if( ulTotalMercPoints != 0 ) { - uiMercPercentage = (UINT32)(((100 * uiMercPoints)/ulTotalMercPoints)+ 0.5); + uiMercPercentage = (UINT32)(100.0f * (FLOAT)uiMercPoints / (FLOAT)ulTotalMercPoints + 0.5f); uiMercPercentage = min( 100, uiMercPercentage ); diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index c42ec607..ba1041d1 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -4453,7 +4453,7 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) } else if ((HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT )) && ( gGameOptions.fNewTraitSystem )) { - sAPCost += max( 1, (INT16)((APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/ 100) + 0.5)); + sAPCost += max( 1, (INT16)(APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)); } else { diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp index 08c61712..4131959d 100644 --- a/Tactical/Interface Enhanced.cpp +++ b/Tactical/Interface Enhanced.cpp @@ -8175,13 +8175,13 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) else if( Weapon[ gpItemDescObject->usItem ].ubWeaponType == GUN_SHOTGUN && Weapon[gpItemDescObject->usItem].swapClips != 1 ) iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max(0,(100 - gSkillTraitValues.ubRAReloadSpeedShotgunsManual * NUM_SKILL_TRAITS( gpItemDescSoldier, RANGER_NT ) - - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT ) ) ) / 100.0 + 0.5f ); + - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT ) ) ) / 100.0f + 0.5f ); // ambidextrous reload bullets else if( Weapon[gpItemDescObject->usItem].swapClips != 1 ) - iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) )/100 + 0.5); + iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) ) / 100.0f + 0.5f); // ambidextrous reload magazines else - iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) )/100 + 0.5); + iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) ) / 100.0f + 0.5f); } // Get base Reload Cost @@ -8220,13 +8220,13 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) else if( Weapon[ gpComparedItemDescObject->usItem ].ubWeaponType == GUN_SHOTGUN && Weapon[gpComparedItemDescObject->usItem].swapClips != 1 ) iComparedFinalReloadAPCost = (INT16)( (FLOAT)iComparedFinalReloadAPCost * max(0,(100 - gSkillTraitValues.ubRAReloadSpeedShotgunsManual * NUM_SKILL_TRAITS( gpItemDescSoldier, RANGER_NT ) - - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT ) ) ) / 100.0 + 0.5f ); + - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT ) ) ) / 100.0f + 0.5f ); // ambidextrous reload bullets else if( Weapon[gpComparedItemDescObject->usItem].swapClips != 1 ) - iComparedFinalReloadAPCost = (INT16)( (FLOAT)iComparedFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) )/100 + 0.5); + iComparedFinalReloadAPCost = (INT16)( (FLOAT)iComparedFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) ) / 100.0f + 0.5f); // ambidextrous reload magazines else - iComparedFinalReloadAPCost = (INT16)( (FLOAT)iComparedFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) )/100 + 0.5); + iComparedFinalReloadAPCost = (INT16)( (FLOAT)iComparedFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) ) / 100.0f + 0.5f); } // Get base Reload Cost @@ -8272,10 +8272,10 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject ) - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT ) ) ) / 100.0 + 0.5f ); // ambidextrous reload bullets else if( Weapon[gpComparedItemDescObject->usItem].swapClips != 1 ) - iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) )/100 + 0.5); + iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedLoose * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) ) / 100.0f + 0.5f); // ambidextrous reload magazines else - iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) )/100 + 0.5); + iFinalReloadAPCost = (INT16)( (FLOAT)iFinalReloadAPCost * max( 0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines * NUM_SKILL_TRAITS( gpItemDescSoldier, AMBIDEXTROUS_NT )) ) / 100.0f + 0.5f); } // Get base Reload Cost diff --git a/Tactical/Interface Panels.cpp b/Tactical/Interface Panels.cpp index 3eb6d402..5febb3e4 100644 --- a/Tactical/Interface Panels.cpp +++ b/Tactical/Interface Panels.cpp @@ -4088,7 +4088,7 @@ BOOLEAN ChangeZipperStatus(SOLDIERTYPE *pSoldier, BOOLEAN newStatus) sAPCost = (newStatus) ? APBPConstants[AP_CLOSE_ZIPPER] : APBPConstants[AP_OPEN_ZIPPER]; // SANDRO - ambidextrous bonus to handle things faster if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - sAPCost = (INT16)((sAPCost * (100 - gSkillTraitValues.ubAMWorkBackpackAPsReduction) / 100) + 0.5); + sAPCost = (INT16)(sAPCost * (100 - gSkillTraitValues.ubAMWorkBackpackAPsReduction) / 100.0f + 0.5f); //Are we currently in combat? if(gTacticalStatus.uiFlags & INCOMBAT) diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index cccc3b39..b5a7c836 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -6439,10 +6439,10 @@ void NCTHImprovedAPColor( SOLDIERTYPE* pSoldier, OBJECTTYPE* pWeapon ) { // Sniper trait makes chambering a round faster if (( Weapon[Item[pWeapon->usItem].ubClassIndex].ubWeaponType == GUN_SN_RIFLE || Weapon[Item[pWeapon->usItem].ubClassIndex].ubWeaponType == GUN_RIFLE ) && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT )) - sModifiedReloadAP = (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )))/100) + 0.5); + sModifiedReloadAP = (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )) / 100.0f + 0.5f); // Ranger trait makes pumping shotguns faster else if (( Weapon[Item[pWeapon->usItem].ubClassIndex].ubWeaponType == GUN_SHOTGUN ) && HAS_SKILL_TRAIT( pSoldier, RANGER_NT )) - sModifiedReloadAP = (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )))/100) + 0.5); + sModifiedReloadAP = (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )) / 100.0f + 0.5f); } } INT16 sPointsToShoot = CalcTotalAPsToAttack( pSoldier, gCTHDisplay.iTargetGridNo, 0, pSoldier->aiData.bShownAimTime ) + sModifiedReloadAP; diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index a1451778..e7c6e3fd 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -2271,7 +2271,7 @@ UINT8 AttachmentAPCost( UINT16 usAttachment, UINT16 usItem, SOLDIERTYPE * pSoldi { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) { - ubAPCost = (UINT8)((ubAPCost * (100 - gSkillTraitValues.ubAMAttachingItemsAPsReduction) / 100) + 0.5); + ubAPCost = (UINT8)(ubAPCost * (100 - gSkillTraitValues.ubAMAttachingItemsAPsReduction) / 100.0f + 0.5f); } } @@ -2290,7 +2290,7 @@ UINT8 AttachmentAPCost( UINT16 usAttachment, OBJECTTYPE * pObj, SOLDIERTYPE * pS { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) { - ubAPCost = (UINT8)((ubAPCost * (100 - gSkillTraitValues.ubAMAttachingItemsAPsReduction) / 100) + 0.5); + ubAPCost = (UINT8)(ubAPCost * (100 - gSkillTraitValues.ubAMAttachingItemsAPsReduction) / 100.0f + 0.5f); } } diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 1bf5fae0..27bffd35 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -10997,21 +10997,21 @@ INT8 CalcEffectiveShockLevel( SOLDIERTYPE * pSoldier ) // Squadleader's resistance to cowering if ( HAS_SKILL_TRAIT( pSoldier, SQUADLEADER_NT )) { - bShockForCower = (INT8)((bShockForCower * (100 - gSkillTraitValues.ubSLFearResistance * NUM_SKILL_TRAITS( pSoldier, SQUADLEADER_NT )) /100) + 0.5); + bShockForCower = (INT8)(bShockForCower * (100 - gSkillTraitValues.ubSLFearResistance * NUM_SKILL_TRAITS( pSoldier, SQUADLEADER_NT )) / 100.0f + 0.5f); } // Check for character traits if ( DoesMercHavePersonality( pSoldier, CHAR_TRAIT_INTELLECTUAL ) ) { - bShockForCower = (INT8)((bShockForCower * 23 / 20 ) + 0.5); // +15% as shock + bShockForCower = (INT8)(bShockForCower * 23.0f / 20.0f + 0.5f); // +15% as shock } else if ( DoesMercHavePersonality( pSoldier, CHAR_TRAIT_DAUNTLESS ) ) { - bShockForCower = (INT8)((bShockForCower * 17 / 20 ) + 0.5); // -15% as shock + bShockForCower = (INT8)(bShockForCower * 17.0f / 20.0f + 0.5f); // -15% as shock } // Flugente: personal fear resistance - bShockForCower = (INT8)((bShockForCower * (100 - pSoldier->GetFearResistanceBonus()) / 100 ) + 0.5); + bShockForCower = (INT8)(bShockForCower * (100 - pSoldier->GetFearResistanceBonus()) / 100.0f + 0.5f); } return bShockForCower; diff --git a/Tactical/PATHAI.cpp b/Tactical/PATHAI.cpp index 2b407652..058675ef 100644 --- a/Tactical/PATHAI.cpp +++ b/Tactical/PATHAI.cpp @@ -3629,7 +3629,7 @@ if(!GridNoOnVisibleWorldTile(iDestination)) // SANDRO - STOMP traits - Athletics trait decreases movement cost if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( s, ATHLETICS_NT )) { - ubAPCost = max(1, (INT16)((ubAPCost * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); + ubAPCost = max(1, (INT16)(ubAPCost * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f + 0.5f)); } // Moa: scuba fins and swimming background @@ -4441,31 +4441,30 @@ void ErasePath(char bEraseOldOne) INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPlot, INT8 bStayOn, UINT16 usMovementMode, INT8 bStealth, INT8 bReverse , INT16 sAPBudget) { - INT16 sTileCost,sPoints=0,sAnimCost=0; + INT16 sTileCost,sPoints=0,sAnimCost=0; INT16 sPointsWalk=0,sPointsCrawl=0,sPointsRun=0,sPointsSwat=0; INT16 sExtraCostStand,sExtraCostSwat,sExtraCostCrawl; - INT16 sMovementAPsCost = 0; // added by SANDRO - INT32 iLastGrid, sTempGrid; + FLOAT sMovementAPsCost = 0; // added by SANDRO + INT32 iLastGrid, sTempGrid; INT32 iCnt; - INT32 sOldGrid=0; + INT32 sOldGrid=0; INT16 sFootOrderIndex; INT16 sSwitchValue; - INT16 sFootOrder[5] = { GREENSTEPSTART, PURPLESTEPSTART, BLUESTEPSTART, - ORANGESTEPSTART, REDSTEPSTART }; - UINT16 usTileIndex; - UINT16 usTileNum; - LEVELNODE *pNode; + INT16 sFootOrder[5] = { GREENSTEPSTART, PURPLESTEPSTART, BLUESTEPSTART, ORANGESTEPSTART, REDSTEPSTART }; + UINT16 usTileIndex; + UINT16 usTileNum; + LEVELNODE *pNode; UINT16 usMovementModeToUseForAPs; BOOLEAN bIgnoreNextCost = FALSE; - INT32 sTestGridNo; + INT32 sTestGridNo; if ( bPlot && gusPathShown ) { ErasePath(FALSE); } - gusAPtsToMove = 0; - sTempGrid = pSold->sGridNo; + gusAPtsToMove = 0; + sTempGrid = pSold->sGridNo; sFootOrderIndex = 0; @@ -4528,14 +4527,10 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl // sAnimCost = APBPConstants[AP_CROUCH]; // break; } -*/ + sPoints = sPoints + sAnimCost; - gusAPtsToMove = gusAPtsToMove + sAnimCost; - - - - + gusAPtsToMove = gusAPtsToMove + sAnimCost;*/ if (bStayOn) { @@ -4580,68 +4575,21 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl sTileCost = TerrainActionPoints( pSold, sTempGrid, (INT8)guiPathingData[iCnt], pSold->pathing.bLevel ); - if ( bIgnoreNextCost ) - { - bIgnoreNextCost = FALSE; - } - else - { - // ATE: If we have a 'special cost, like jump fence... - if ( sSwitchValue == TRAVELCOST_FENCE ) + if ( bIgnoreNextCost ) { - sPoints = sPoints + sTileCost; - - bIgnoreNextCost = TRUE; - - // If we are changeing stance ( either before or after getting there.... - // We need to reflect that... - switch( usMovementModeToUseForAPs ) - { - case RUNNING: - case WALKING : - case WALKING_WEAPON_RDY: - case WALKING_DUAL_RDY: - case WALKING_ALTERNATIVE_RDY : - - // Add here cost to go from crouch to stand AFTER fence hop.... - // Since it's AFTER.. make sure we will be moving after jump... - if ( ( iCnt + 2 ) < iLastGrid ) - { - sExtraCostStand += GetAPsCrouch(pSold, TRUE); - - // ATE: if running, charge extra point to srart again - if ( usMovementModeToUseForAPs== RUNNING ) - { - sExtraCostStand++; - } - - sPoints = sPoints + sExtraCostStand; - } - break; - - case SWATTING: - case CROUCHEDMOVE_RIFLE_READY: - case CROUCHEDMOVE_PISTOL_READY: - case CROUCHEDMOVE_DUAL_READY: - - // Add cost to stand once there BEFORE.... - sExtraCostSwat += GetAPsCrouch(pSold, TRUE); - sPoints = sPoints + sExtraCostSwat; - break; - - case CRAWLING: - - // Can't do it here..... - break; - - } + bIgnoreNextCost = FALSE; } - else if (sTileCost > 0) + else { - // else, movement is adjusted based on mode... - - if (sSwitchValue == TRAVELCOST_NOT_STANDING) + // ATE: If we have a 'special cost, like jump fence... + if ( sSwitchValue == TRAVELCOST_FENCE ) { + sPoints = sPoints + sTileCost; + + bIgnoreNextCost = TRUE; + + // If we are changeing stance ( either before or after getting there.... + // We need to reflect that... switch( usMovementModeToUseForAPs ) { case RUNNING: @@ -4649,148 +4597,198 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl case WALKING_WEAPON_RDY: case WALKING_DUAL_RDY: case WALKING_ALTERNATIVE_RDY : - // charge crouch APs for ducking head! - sExtraCostStand += GetAPsCrouch(pSold, TRUE); + + // Add here cost to go from crouch to stand AFTER fence hop.... + // Since it's AFTER.. make sure we will be moving after jump... + if ( ( iCnt + 2 ) < iLastGrid ) + { + sExtraCostStand += GetAPsCrouch(pSold, TRUE); + + // ATE: if running, charge extra point to srart again + if ( usMovementModeToUseForAPs== RUNNING ) + { + sExtraCostStand++; + } + + sPoints = sPoints + sExtraCostStand; + } break; - default: + case SWATTING: + case CROUCHEDMOVE_RIFLE_READY: + case CROUCHEDMOVE_PISTOL_READY: + case CROUCHEDMOVE_DUAL_READY: + + // Add cost to stand once there BEFORE.... + sExtraCostSwat += GetAPsCrouch(pSold, TRUE); + sPoints = sPoints + sExtraCostSwat; break; + + case CRAWLING: + + // Can't do it here..... + break; + } } - - // so, then we must modify it for other movement styles and accumulate - // CHRISL: Force display path to calculate AP cost differently if we're wearing a backpack - /////////////////////////////////////////////////////////////////////////////////////////////////////////// - // SANDRO - This part have been modified "a bit" (see also "TerrainActionPoints" in "points.cpp") - // Check movement modifiers - switch( usMovementModeToUseForAPs ) + else if (sTileCost > 0) { - case RUNNING: - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_RUN]; - break; - case WALKING: - if ( 0 && !(pSold->MercInWater()) && ( (gAnimControl[ pSold->usAnimState ].uiFlags & ANIM_FIREREADY ) || (gAnimControl[ pSold->usAnimState ].uiFlags & ANIM_FIRE ) )) + // else, movement is adjusted based on mode... + + if (sSwitchValue == TRAVELCOST_NOT_STANDING) + { + switch( usMovementModeToUseForAPs ) { - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK] + APBPConstants[AP_MODIFIER_READY]; + case RUNNING: + case WALKING : + case WALKING_WEAPON_RDY: + case WALKING_DUAL_RDY: + case WALKING_ALTERNATIVE_RDY : + // charge crouch APs for ducking head! + sExtraCostStand += GetAPsCrouch(pSold, TRUE); + break; + + default: + break; + } + } + + // so, then we must modify it for other movement styles and accumulate + // CHRISL: Force display path to calculate AP cost differently if we're wearing a backpack + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SANDRO - This part have been modified "a bit" (see also "TerrainActionPoints" in "points.cpp") + // Check movement modifiers + switch( usMovementModeToUseForAPs ) + { + case RUNNING: + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_RUN]; + break; + case WALKING: + if ( 0 && !(pSold->MercInWater()) && ( (gAnimControl[ pSold->usAnimState ].uiFlags & ANIM_FIREREADY ) || (gAnimControl[ pSold->usAnimState ].uiFlags & ANIM_FIRE ) )) + { + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK] + APBPConstants[AP_MODIFIER_READY]; + } + else + { + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK]; + } + break; + case WALKING_ALTERNATIVE_RDY : + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK]; + break; + case WALKING_WEAPON_RDY: + case WALKING_DUAL_RDY: + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK] + APBPConstants[AP_MODIFIER_READY]; + break; + case SWATTING: + case SIDE_STEP_CROUCH_RIFLE: + case SIDE_STEP_CROUCH_PISTOL: + case SIDE_STEP_CROUCH_DUAL: + case CROUCHEDMOVE_RIFLE_READY: + case CROUCHEDMOVE_PISTOL_READY: + case CROUCHEDMOVE_DUAL_READY: + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_SWAT]; + break; + case CRAWLING: + sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_CRAWL]; + break; + default: + sMovementAPsCost = sTileCost; + break; + } + + // Check for reverse mode + if ( pSold->bReverse || bReverse ) + sMovementAPsCost += APBPConstants[AP_REVERSE_MODIFIER]; + + // STOMP traits - Athletics trait decreases movement cost + if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSold, ATHLETICS_NT )) + { + sMovementAPsCost = max(1, (sMovementAPsCost * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f) ); + } + + // Moa: scuba fins and swimming background + if ( pSold->inv[LEGPOS].exists() && HasItemFlag( pSold->inv[LEGPOS].usItem, SCUBA_FINS ) ) + { + if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) + sMovementAPsCost /= 2; + else + sMovementAPsCost *= 2; + } + if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) + sMovementAPsCost = sMovementAPsCost * (100 + pSold->GetBackgroundValue(BG_SWIMMING)) / 100.0f; + + // Check if doors if not player's merc (they have to open them manually) + if ( sSwitchValue == TRAVELCOST_DOOR && pSold->bTeam != gbPlayerNum ) + { + sMovementAPsCost += GetAPsToOpenDoor( pSold ) + GetAPsToOpenDoor( pSold ); // Include open and close costs! + } + // Check for stealth mode + if ( pSold->bStealthMode || bStealth ) + { + // STOMP traits - Stealthy trait decreases stealth AP modifier + if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSold, STEALTHY_NT )) + { + sMovementAPsCost += max(0, (APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100.0f) ); } else { - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK]; + sMovementAPsCost += APBPConstants[AP_STEALTH_MODIFIER]; } - break; - case WALKING_ALTERNATIVE_RDY : - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK]; - break; - case WALKING_WEAPON_RDY: - case WALKING_DUAL_RDY: - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_WALK] + APBPConstants[AP_MODIFIER_READY]; - break; - case SWATTING: - case SIDE_STEP_CROUCH_RIFLE: - case SIDE_STEP_CROUCH_PISTOL: - case SIDE_STEP_CROUCH_DUAL: - case CROUCHEDMOVE_RIFLE_READY: - case CROUCHEDMOVE_PISTOL_READY: - case CROUCHEDMOVE_DUAL_READY: - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_SWAT]; - break; - case CRAWLING: - sMovementAPsCost = sTileCost + APBPConstants[AP_MODIFIER_CRAWL]; - break; - default: - sMovementAPsCost = sTileCost; - break; - } - - // Check for reverse mode - if ( pSold->bReverse || bReverse ) - sMovementAPsCost += APBPConstants[AP_REVERSE_MODIFIER]; - - // STOMP traits - Athletics trait decreases movement cost - if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSold, ATHLETICS_NT )) - { - sMovementAPsCost = max(1, (INT16)((sMovementAPsCost * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); - } - - // Moa: scuba fins and swimming background - if ( pSold->inv[LEGPOS].exists() && HasItemFlag( pSold->inv[LEGPOS].usItem, SCUBA_FINS ) ) - { - if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) - sMovementAPsCost /= 2; - else - sMovementAPsCost *= 2; - } - if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) - sMovementAPsCost = (sMovementAPsCost * (100 + pSold->GetBackgroundValue(BG_SWIMMING))) / 100; - - // Check if doors if not player's merc (they have to open them manually) - if ( sSwitchValue == TRAVELCOST_DOOR && pSold->bTeam != gbPlayerNum ) - { - sMovementAPsCost += GetAPsToOpenDoor( pSold ) + GetAPsToOpenDoor( pSold ); // Include open and close costs! - } - // Check for stealth mode - if ( pSold->bStealthMode || bStealth ) - { - // STOMP traits - Stealthy trait decreases stealth AP modifier - if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSold, STEALTHY_NT )) - { - sMovementAPsCost += (max(0, (INT16)((APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100) + 0.5))); } - else + + // Flugente: riot shields lower movement speed + if ( pSold->IsRiotShieldEquipped( ) ) { - sMovementAPsCost += APBPConstants[AP_STEALTH_MODIFIER]; + sMovementAPsCost *= gItemSettings.fShieldMovementAPCostModifier; } - } - - // Flugente: riot shields lower movement speed - if ( pSold->IsRiotShieldEquipped( ) ) - { - sMovementAPsCost *= gItemSettings.fShieldMovementAPCostModifier; - } - // Flugente: dragging someone - if ( pSold->IsDraggingSomeone( ) ) - { - sMovementAPsCost *= gItemSettings.fDragAPCostModifier; - } - - // Check for backpack - //if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSold ) != ITEM_NOT_FOUND ) - // sMovementAPsCost += APBPConstants[AP_MODIFIER_PACK]; - if ( UsingNewInventorySystem() == true && gGameExternalOptions.fBackPackWeightLowersAP ) - { - INT8 bSlot= FindBackpackOnSoldier( pSold ); - if ( bSlot != ITEM_NOT_FOUND ) + // Flugente: dragging someone + if ( pSold->IsDraggingSomeone( ) ) { - UINT16 usBPPenalty = APBPConstants[AP_MODIFIER_PACK]; - if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back + sMovementAPsCost *= gItemSettings.fDragAPCostModifier; + } + + // Check for backpack + //if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSold ) != ITEM_NOT_FOUND ) + // sMovementAPsCost += APBPConstants[AP_MODIFIER_PACK]; + if ( UsingNewInventorySystem() == true && gGameExternalOptions.fBackPackWeightLowersAP ) + { + INT8 bSlot= FindBackpackOnSoldier( pSold ); + if ( bSlot != ITEM_NOT_FOUND ) { - OBJECTTYPE * pObj = &( pSold->inv[ BPACKPOCKPOS ] ); - UINT16 usBackPackWeight = CalculateObjectWeight( pObj ); - // CalculateObjectWeight checks for active LBE gear. Unfortunatly our backpack is not active since we are carying it. - // Sounds not intuitive at all, active means the LBE caries items (marked with blue *), but when put on the LBE adittional slots of our soldier - // are activated where something can be carried. So we have to add the weights of those slots as well. - std::vector vbLBESlots; - GetLBESlots( BPACKPOCKPOS, vbLBESlots ); - for ( UINT8 i = 0; i < vbLBESlots.size() ; i++ ) + UINT16 usBPPenalty = APBPConstants[AP_MODIFIER_PACK]; + if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back { - pObj = &( pSold->inv[ vbLBESlots[ i ] ] ); - usBackPackWeight += CalculateObjectWeight( pObj ); + OBJECTTYPE * pObj = &( pSold->inv[ BPACKPOCKPOS ] ); + UINT16 usBackPackWeight = CalculateObjectWeight( pObj ); + // CalculateObjectWeight checks for active LBE gear. Unfortunatly our backpack is not active since we are carying it. + // Sounds not intuitive at all, active means the LBE caries items (marked with blue *), but when put on the LBE adittional slots of our soldier + // are activated where something can be carried. So we have to add the weights of those slots as well. + std::vector vbLBESlots; + GetLBESlots( BPACKPOCKPOS, vbLBESlots ); + for ( UINT8 i = 0; i < vbLBESlots.size() ; i++ ) + { + pObj = &( pSold->inv[ vbLBESlots[ i ] ] ); + usBackPackWeight += CalculateObjectWeight( pObj ); + } + usBPPenalty = min( ( usBackPackWeight / 50 ), usBPPenalty ); //1 AP penalty for each 5kg of weight up to the penalty defined by AP_MODIFIER_PACK (default = 4) } - usBPPenalty = min( ( usBackPackWeight / 50 ), usBPPenalty ); //1 AP penalty for each 5kg of weight up to the penalty defined by AP_MODIFIER_PACK (default = 4) + else //Backpack caried not on back (maybe somewhere inside another LBE or in Hand?) + { + //apply full penalty + } + sMovementAPsCost += usBPPenalty; } - else //Backpack caried not on back (maybe somewhere inside another LBE or in Hand?) - { - //apply full penalty - } - sMovementAPsCost += usBPPenalty; } - } + // moving diagonally + if (guiPathingData[iCnt] & 1) + sMovementAPsCost *= 1.4f; - sPoints += sMovementAPsCost + sExtraCostStand; - /////////////////////////////////////////////////////////////////////////////////////////////////////////// - } - } + sPoints += (INT16)(sMovementAPsCost + 0.5f) + sExtraCostStand; + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + } + } // THIS NEXT SECTION ONLY NEEDS TO HAPPEN FOR CURSOR UI FEEDBACK, NOT ACTUAL COSTING @@ -4812,10 +4810,10 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl // STOMP traits - Athletics trait decreases movement cost if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSold, ATHLETICS_NT )) { - sPointsWalk += max(1, (INT16)(((sMovementAPsCost + APBPConstants[AP_MODIFIER_WALK]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); - sPointsCrawl += max(1, (INT16)(((sMovementAPsCost + APBPConstants[AP_MODIFIER_CRAWL]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); - sPointsSwat += max(1, (INT16)(((sMovementAPsCost + APBPConstants[AP_MODIFIER_SWAT]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); - sPointsRun += max(1, (INT16)(((sMovementAPsCost + APBPConstants[AP_MODIFIER_RUN]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); + sPointsWalk += max(1, (INT16)((sMovementAPsCost + APBPConstants[AP_MODIFIER_WALK]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f + 0.5f)); + sPointsCrawl += max(1, (INT16)((sMovementAPsCost + APBPConstants[AP_MODIFIER_CRAWL]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f + 0.5f)); + sPointsSwat += max(1, (INT16)((sMovementAPsCost + APBPConstants[AP_MODIFIER_SWAT]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f + 0.5f)); + sPointsRun += max(1, (INT16)((sMovementAPsCost + APBPConstants[AP_MODIFIER_RUN]) * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f + 0.5f)); } // Specify movement modes else @@ -4862,10 +4860,10 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl // STOMP traits - Stealthy trait decreases stealth AP modifier if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSold, STEALTHY_NT )) { - sPointsWalk += (max(0, (INT16)((APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100) + 0.5))); - sPointsCrawl += (max(0, (INT16)((APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100) + 0.5))); - sPointsSwat += (max(0, (INT16)((APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100) + 0.5))); - sPointsRun += (max(0, (INT16)((APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100) + 0.5))); + sPointsWalk += (max(0, (INT16)(APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100.0f + 0.5f))); + sPointsCrawl += (max(0, (INT16)(APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100.0f + 0.5f))); + sPointsSwat += (max(0, (INT16)(APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100.0f + 0.5f))); + sPointsRun += (max(0, (INT16)(APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100.0f + 0.5f))); } else { diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index ef21b61a..83ba852c 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -200,11 +200,13 @@ INT16 TerrainActionPoints( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, INT8 } - // SANDRO - note: as it is, the modifiers for walking/running/etc are not multiplied for diagonal movement, but is it intentional? + // silversurfer: don't multiply here or the following bonus/penalty calculations will all be wrong and cause our mercs to spend too many APs + // direction is now taken into account in function "ActionPointCost" +/* // SANDRO - note: as it is, the modifiers for walking/running/etc are not multiplied for diagonal movement, but is it intentional? if (bDir & 1) { sAPCost = (sAPCost * 14) / 10; - } + }*/ return(sAPCost); @@ -249,7 +251,7 @@ INT16 BreathPointAdjustmentForCarriedWeight( SOLDIERTYPE * pSoldier ) INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT32 sGridNo, INT8 bDir, UINT16 usMovementMode) { - INT32 iPoints=0; + FLOAT iPoints = 0; UINT8 ubMovementCost; ubMovementCost = gubWorldMovementCosts[sGridNo][bDir][0]; @@ -262,7 +264,7 @@ INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT32 sGridNo, INT8 bDir, UINT { ubTerrainID = FLAT_GROUND; - // WANNE.WATER.BUGFIX: If we "walk on water", take the travecost_flat BPs instead of the high swimming BPs ... + // WANNE.WATER.BUGFIX: If we "walk on water", take the travelcost_flat BPs instead of the high swimming BPs ... ubMovementCost = TRAVELCOST_FLAT; } @@ -303,7 +305,7 @@ INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT32 sGridNo, INT8 bDir, UINT iPoints += APBPConstants[BP_MOVEMENT_READY]; } - iPoints = iPoints * BreathPointAdjustmentForCarriedWeight( pSoldier ) / 100; + iPoints = iPoints * BreathPointAdjustmentForCarriedWeight( pSoldier ) / 100.0f; // ATE - MAKE MOVEMENT ALWAYS WALK IF IN WATER if ( TERRAIN_IS_WATER( ubTerrainID) ) @@ -350,7 +352,7 @@ INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT32 sGridNo, INT8 bDir, UINT // SANDRO - STOMP traits - Athletics reduce breath points spent for moving if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT )) { - iPoints = max(1, (INT16)((iPoints * (100 - gSkillTraitValues.ubATBPsMovementReduction) / 100) + 0.5)); + iPoints = max(1, (iPoints * (100 - gSkillTraitValues.ubATBPsMovementReduction) / 100.0f) ); } // Flugente: scuba fins reduce movement cost in water, but increase cost on land @@ -368,7 +370,7 @@ INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT32 sGridNo, INT8 bDir, UINT // Flugente: backgrounds if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) - iPoints = (iPoints * (100 + pSoldier->GetBackgroundValue(BG_SWIMMING))) / 100; + iPoints = iPoints * ( 100 + pSoldier->GetBackgroundValue(BG_SWIMMING) ) / 100.0f; // ATE: Adjust these by realtime movement if (!(gTacticalStatus.uiFlags & TURNBASED) || !(gTacticalStatus.uiFlags & INCOMBAT ) ) @@ -376,18 +378,21 @@ INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT32 sGridNo, INT8 bDir, UINT // ATE: ADJUST FOR RT - MAKE BREATH GO A LITTLE FASTER! // silversurfer: now externalized to APBPConstants.ini //iPoints = (INT32)( iPoints * TB_BREATH_DEDUCT_MODIFIER ); - iPoints = (INT32)( iPoints * APBPConstants[BP_RT_BREATH_DEDUCT_MODIFIER] / 100 ); + iPoints = iPoints * APBPConstants[BP_RT_BREATH_DEDUCT_MODIFIER] / 100.0f; } - return( (INT16) iPoints); + // moving diagonally + if (bDir & 1) + iPoints *= 1.4f; + + return( (INT16)iPoints); } INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 usMovementMode ) { - INT16 sTileCost, sPoints, sSwitchValue; - - sPoints = 0; + INT16 sTileCost, sSwitchValue; + FLOAT sPoints = 0; // get the tile cost for that tile based on WALKING sTileCost = TerrainActionPoints( pSoldier, sGridNo, bDir, pSoldier->pathing.bLevel ); @@ -487,7 +492,7 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 u // STOMP traits - Athletics trait decreases movement cost if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT )) { - sPoints = max(1, (INT16)((sPoints * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); + sPoints = max(1.0f, ( sPoints * (100 - (FLOAT)gSkillTraitValues.ubATAPsMovementReduction) / 100.0f ) ); } // Flugente: riot shields lower movement speed @@ -513,7 +518,7 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 u // Flugente: swimming background if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) - sPoints = (sPoints * (100 + pSoldier->GetBackgroundValue(BG_SWIMMING))) / 100; + sPoints = sPoints * ( 100 + pSoldier->GetBackgroundValue(BG_SWIMMING) ) / 100.0f; // Check if doors if not player's merc (they have to open them manually) if ( sSwitchValue == TRAVELCOST_DOOR && pSoldier->bTeam != gbPlayerNum ) @@ -526,7 +531,7 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 u // STOMP traits - Stealthy trait decreases stealth AP modifier if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, STEALTHY_NT )) { - sPoints += (max(0, (INT16)((APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100) + 0.5))); + sPoints += max(0, (FLOAT)( APBPConstants[AP_STEALTH_MODIFIER] * (100 - gSkillTraitValues.ubSTStealthModeSpeedBonus) / 100.0f) ); } else { @@ -592,7 +597,11 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 u } } - return( sPoints ); + // moving diagonally + if (bDir & 1) + sPoints *= 1.4f; + + return( (INT16)(sPoints + 0.5f) ); } INT16 EstimateActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 usMovementMode, INT8 bPathIndex, INT8 bPathLength ) @@ -1152,7 +1161,7 @@ void DeductPoints( SOLDIERTYPE *pSoldier, INT16 sAPCost, INT32 iBPCost, UINT8 ub else ubPointsRegistered = max( 10, min( 100, ubPointsRegistered ) ); // 10% is minimum on hearing ubPointsRegistered = min( 100, ubPointsRegistered ); // 100% is maximum ofc - ubPointsRegistered = (UINT8)((sAPCost * ubPointsRegistered / 100) + 0.5); // now calc how many APs we will award + ubPointsRegistered = (UINT8)(sAPCost * ubPointsRegistered / 100.0f + 0.5f); // now calc how many APs we will award // increase the counter if ( ubPointsRegistered ) @@ -2388,7 +2397,7 @@ INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, if ( HAS_SKILL_TRAIT( pSoldier, HEAVY_WEAPONS_NT ) && gGameOptions.fNewTraitSystem ) { // bAPCost = (INT16)((bAPCost * (100 - gSkillTraitValues.ubHWGrenadeLaunchersAPsReduction * NUM_SKILL_TRAITS( pSoldier, HEAVY_WEAPONS_NT ) ) / 100)+ 0.5); - bAPCost = (INT16)(bAPCost * GetAttackAPTraitMultiplier( pSoldier, pObjUsed, pSoldier->bWeaponMode ) + 0.5); + bAPCost = (INT16)(bAPCost * GetAttackAPTraitMultiplier( pSoldier, pObjUsed, pSoldier->bWeaponMode ) + 0.5f); } } else if ( pSoldier->IsValidSecondHandShot( ) ) @@ -2398,8 +2407,8 @@ INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, // SANDRO - gunslinger check for firing speed // if ( HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) && gGameOptions.fNewTraitSystem ) // { - INT16 bcst1 = (INT16)(BaseAPsToShootOrStab( bFullAPs, bAimSkill, &(pSoldier->inv[HANDPOS]), pSoldier ) * GetAttackAPTraitMultiplier( pSoldier, pObjUsed, pSoldier->bWeaponMode ) + 0.5); - INT16 bcst2 = (INT16)(BaseAPsToShootOrStab( bFullAPs, bAimSkill, &(pSoldier->inv[SECONDHANDPOS]), pSoldier ) * GetAttackAPTraitMultiplier( pSoldier, pSecondObjUsed, pSoldier->bWeaponMode ) + 0.5); + INT16 bcst1 = (INT16)(BaseAPsToShootOrStab( bFullAPs, bAimSkill, &(pSoldier->inv[HANDPOS]), pSoldier ) * GetAttackAPTraitMultiplier( pSoldier, pObjUsed, pSoldier->bWeaponMode ) + 0.5f); + INT16 bcst2 = (INT16)(BaseAPsToShootOrStab( bFullAPs, bAimSkill, &(pSoldier->inv[SECONDHANDPOS]), pSoldier ) * GetAttackAPTraitMultiplier( pSoldier, pSecondObjUsed, pSoldier->bWeaponMode ) + 0.5f); // if ( Weapon[ usItem ].ubWeaponType == GUN_PISTOL ) // bcst1 = (INT16)((bcst1 * ( 100 - gSkillTraitValues.ubGSFiringSpeedBonusPistols) / 100)+ 0.5); // if ( Weapon[ pSoldier->inv[SECONDHANDPOS].usItem ].ubWeaponType == GUN_PISTOL ) @@ -2429,7 +2438,7 @@ INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, // If we are using alternative weapon holding (from hip rifle/one-handed pistol), the shot can be faster if set in the ini if ( gGameExternalOptions.ubAltWeaponHoldingFireSpeedBonus > 0 && pSoldier->IsValidAlternativeFireMode( bAimTime, sGridNo )) { - bAPCost = (INT16)((bAPCost * (100 - gGameExternalOptions.ubAltWeaponHoldingFireSpeedBonus ) / 100)+ 0.5); + bAPCost = (INT16)(bAPCost * (100 - gGameExternalOptions.ubAltWeaponHoldingFireSpeedBonus ) / 100.0f + 0.5f); } ///////////////////////////////////////////////////////////////////////////////////// // SANDRO - STOMP traits @@ -2437,7 +2446,7 @@ INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, if ( gGameOptions.fNewTraitSystem ) { // silversurfer: new function to handle all modifiers - bAPCost = (INT16)(bAPCost * GetAttackAPTraitMultiplier( pSoldier, pObjUsed, pSoldier->bWeaponMode ) + 0.5); + bAPCost = (INT16)(bAPCost * GetAttackAPTraitMultiplier( pSoldier, pObjUsed, pSoldier->bWeaponMode ) + 0.5f); /* // Decreased APs needed for LMG - Auto Weapons if (Weapon[usUBItem].ubWeaponType == GUN_LMG && (pSoldier->bDoBurst || pSoldier->bDoAutofire) && ( HAS_SKILL_TRAIT( pSoldier, AUTO_WEAPONS_NT ) ) ) @@ -2614,7 +2623,7 @@ INT16 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTurningCost bAPCost += BaseAPsToShootOrStab(bFullAPs, bAimSkill, pObjUsed, pSoldier); // Decreased APs needed for melee attacks - Melee (Blade only) if(Item[usItem].usItemClass == IC_BLADE && (HAS_SKILL_TRAIT(pSoldier, MELEE_NT))) - bAPCost = (INT16)((bAPCost * (100 - gSkillTraitValues.ubMEBladesAPsReduction) / 100) + 0.5); + bAPCost = (INT16)(bAPCost * (100 - gSkillTraitValues.ubMEBladesAPsReduction) / 100.0f + 0.5f); } // sevenfm: check enemy only if we have correct gridNo if( !TileIsOutOfBounds(sGridNo) ) @@ -2668,7 +2677,7 @@ INT16 ApsToPunch( SOLDIERTYPE *pSoldier ) { if (gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT )) { - return ( max( 1, (INT16)((APBPConstants[AP_PUNCH] * (100 - gSkillTraitValues.ubMAPunchAPsReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/ 100) + 0.5)) ); + return ( max( 1, (INT16)(APBPConstants[AP_PUNCH] * (100 - gSkillTraitValues.ubMAPunchAPsReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)) ); } else { @@ -3046,10 +3055,10 @@ INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJEC { // if pistol or revolver if ( HAS_SKILL_TRAIT( pSoldier, GUNSLINGER_NT ) && ( Weapon[ pGun->usItem ].ubWeaponType == GUN_PISTOL || Weapon[ pGun->usItem ].ubWeaponType == GUN_M_PISTOL ) ) - return(INT16)(( GetAPsToReload(pGun) * max(0,(100 - gSkillTraitValues.ubGSRealoadSpeedHandgunsBonus * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ) - (HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ? gSkillTraitValues.ubAMReloadSpeedMagazines : 0 )))/100 ) + 0.5); + return(INT16)( GetAPsToReload(pGun) * max(0,(100 - gSkillTraitValues.ubGSRealoadSpeedHandgunsBonus * NUM_SKILL_TRAITS( pSoldier, GUNSLINGER_NT ) - (HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ? gSkillTraitValues.ubAMReloadSpeedMagazines : 0 ))) / 100.0f + 0.5f); // other weapons for ambidextrous else if (HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT )) - return(INT16)(( GetAPsToReload(pGun) * max(0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines ))/100) + 0.5); + return(INT16)( GetAPsToReload(pGun) * max(0,(100 - gSkillTraitValues.ubAMReloadSpeedMagazines )) / 100.0f + 0.5f ); // normal case else return GetAPsToReload(pGun); @@ -3061,9 +3070,9 @@ INT16 GetAPsToReloadGunWithAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE * pGun, OBJEC { // wrong size ammo item if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) // SANDRO - added Ambidextrous check - return (INT16)((((GetAPsToReload(pGun) * APBPConstants[AP_WRONG_MAG])/10)*(100 - gSkillTraitValues.ubAMReloadSpeedLoose)/100) + 0.5); + return (INT16)((GetAPsToReload(pGun) * APBPConstants[AP_WRONG_MAG] / 10.0f) * (100 - gSkillTraitValues.ubAMReloadSpeedLoose) / 100.0f + 0.5f); else - return (INT16)((GetAPsToReload(pGun) * APBPConstants[AP_WRONG_MAG])/10); + return (INT16)((GetAPsToReload(pGun) * APBPConstants[AP_WRONG_MAG] / 10.0f) + 0.5f); } else { @@ -3156,10 +3165,10 @@ INT16 GetAPsToAutoReload( SOLDIERTYPE * pSoldier ) { // Sniper trait makes chambering a round faster if (( Weapon[Item[(pObj)->usItem].ubClassIndex].ubWeaponType == GUN_SN_RIFLE || Weapon[Item[(pObj)->usItem].ubClassIndex].ubWeaponType == GUN_RIFLE ) && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT )) - return ( (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )))/100) + 0.5)); + return ( (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )) / 100.0f + 0.5f)); // Ranger trait makes pumping shotguns faster else if (( Weapon[Item[(pObj)->usItem].ubClassIndex].ubWeaponType == GUN_SHOTGUN ) && HAS_SKILL_TRAIT( pSoldier, RANGER_NT )) - return ( (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )))/100) + 0.5)); + return ( (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )) / 100.0f + 0.5f)); else return (sModifiedReloadAP); } @@ -3340,14 +3349,14 @@ INT16 GetAPsToLook( SOLDIERTYPE *pSoldier ) // Now change to appropriate animation case ANIM_STAND: if (HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - return( max( 1, (INT16)((APBPConstants[AP_LOOK_STANDING] * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); + return( max( 1, (INT16)(APBPConstants[AP_LOOK_STANDING] * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ) ) ); else return( APBPConstants[AP_LOOK_STANDING] ); break; case ANIM_CROUCH: if (HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - return( max( 1, (INT16)((APBPConstants[AP_LOOK_CROUCHED] * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); + return( max( 1, (INT16)(APBPConstants[AP_LOOK_CROUCHED] * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ) ) ); else return( APBPConstants[AP_LOOK_CROUCHED] ); break; @@ -3357,7 +3366,7 @@ INT16 GetAPsToLook( SOLDIERTYPE *pSoldier ) // crouched, turn, and then go back down. Hence you go up (APBPConstants[AP_PRONE]), turn (APBPConstants[AP_LOOK_PRONE]) and down (APBPConstants[AP_PRONE]). //dnl ch70 160913 because of backpack cost for going up is 2 if (HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - return( max( 1, (INT16)((APBPConstants[AP_LOOK_PRONE] * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)) + GetAPsProne(pSoldier, TRUE) + GetAPsProne(pSoldier, TRUE*2) ); + return( max( 1, (INT16)(APBPConstants[AP_LOOK_PRONE] * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)) + GetAPsProne(pSoldier, TRUE) + GetAPsProne(pSoldier, TRUE*2) ); else return( APBPConstants[AP_LOOK_PRONE] + GetAPsProne(pSoldier, TRUE) + GetAPsProne(pSoldier, TRUE*2) ); break; @@ -3549,7 +3558,7 @@ INT16 GetAPsToClimbRoof( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown ) if ( !fClimbDown ) { if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - iAPsToClimb = max( 1, (INT16)((APBPConstants[AP_CLIMBROOF] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait + iAPsToClimb = max( 1, (INT16)(APBPConstants[AP_CLIMBROOF] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)); // -25% per trait else iAPsToClimb = APBPConstants[AP_CLIMBROOF]; @@ -3559,7 +3568,7 @@ INT16 GetAPsToClimbRoof( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown ) else { if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - iAPsToClimb = max( 1, (INT16)((APBPConstants[AP_CLIMBOFFROOF] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait + iAPsToClimb = max( 1, (INT16)(APBPConstants[AP_CLIMBOFFROOF] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)); // -25% per trait else iAPsToClimb = APBPConstants[AP_CLIMBOFFROOF]; @@ -3583,7 +3592,7 @@ INT16 GetAPsToJumpWall( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown ) if ( !fClimbDown ) { if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - iAPsToClimb = max( 1, (INT16)((APBPConstants[AP_JUMPWALL] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait + iAPsToClimb = max( 1, (INT16)(APBPConstants[AP_JUMPWALL] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)); // -25% per trait else iAPsToClimb = APBPConstants[AP_JUMPWALL]; @@ -3593,7 +3602,7 @@ INT16 GetAPsToJumpWall( SOLDIERTYPE *pSoldier, BOOLEAN fClimbDown ) else { if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - iAPsToClimb = max( 1, (INT16)((APBPConstants[AP_JUMPOFFWALL] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5)); // -25% per trait + iAPsToClimb = max( 1, (INT16)(APBPConstants[AP_JUMPOFFWALL] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)); // -25% per trait else iAPsToClimb = APBPConstants[AP_JUMPOFFWALL]; @@ -3615,7 +3624,7 @@ INT16 GetAPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack ) if ( !fWithBackpack ) { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT )) - return( max( 1, (INT16)((APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); // -25% per trait + return( max( 1, (INT16)(APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ) ) ); // -25% per trait else return( APBPConstants[AP_JUMPWINDOW] ); @@ -3623,7 +3632,7 @@ INT16 GetAPsToJumpThroughWindows( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack ) else { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT )) - return( max( 1, (INT16)((APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); // -25% per trait + return( max( 1, (INT16)(APBPConstants[AP_JUMPWINDOW] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ) ) ); // -25% per trait else return( APBPConstants[AP_JUMPWINDOW] ); } @@ -3657,7 +3666,7 @@ INT16 GetAPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack ) if ( !fWithBackpack ) { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT )) - return( max( 1, (INT16)((APBPConstants[AP_JUMPFENCE] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); // -25% per trait + return( max( 1, (INT16)(APBPConstants[AP_JUMPFENCE] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ) ) ); // -25% per trait else return( APBPConstants[AP_JUMPFENCE] ); @@ -3665,7 +3674,7 @@ INT16 GetAPsToJumpFence( SOLDIERTYPE *pSoldier, BOOLEAN fWithBackpack ) else { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT )) - return( max( 1, (INT16)((APBPConstants[AP_JUMPFENCEBPACK] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ))); // -25% per trait + return( max( 1, (INT16)(APBPConstants[AP_JUMPFENCEBPACK] * ( 100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ) ) ); // -25% per trait else return( APBPConstants[AP_JUMPFENCEBPACK] ); } @@ -3908,7 +3917,7 @@ INT16 GetAPsToDropBomb( SOLDIERTYPE *pSoldier ) { // SANDRO - STOMP traits - Ambidextrous bonus if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_DROP_BOMB] * (100 - gSkillTraitValues.ubAMHandleBombsAPsReduction)/100 ) + 0.5)) ); + return( max( 1, (INT16)(APBPConstants[AP_DROP_BOMB] * (100 - gSkillTraitValues.ubAMHandleBombsAPsReduction) / 100.0f + 0.5f)) ); else return( APBPConstants[AP_DROP_BOMB] ); } @@ -3917,7 +3926,7 @@ INT16 GetAPsToPlantMine( SOLDIERTYPE *pSoldier ) { // SANDRO - STOMP traits - Ambidextrous bonus if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_BURY_MINE] * (100 - gSkillTraitValues.ubAMHandleBombsAPsReduction)/100 ) + 0.5)) ); + return( max( 1, (INT16)(APBPConstants[AP_BURY_MINE] * (100 - gSkillTraitValues.ubAMHandleBombsAPsReduction) / 100.0f + 0.5f)) ); else return( APBPConstants[AP_BURY_MINE] ); } @@ -3965,7 +3974,7 @@ INT16 GetAPsToStealItem( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pTargetSoldier, INT } else if (HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && ( gGameOptions.fNewTraitSystem )) { - sAPCost += max( 1, (INT16)((APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/ 100) + 0.5)); + sAPCost += max( 1, (INT16)(APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/ 100.0f + 0.5f)); } else { @@ -4104,7 +4113,7 @@ INT16 GetAPsToJumpOver( SOLDIERTYPE *pSoldier ) { // -25% APs needed to for MA traits if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - return( GetAPsToChangeStance( pSoldier, ANIM_STAND ) + max( 1, (INT16)((APBPConstants[AP_JUMP_OVER] * (100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/100) + 0.5))); + return( GetAPsToChangeStance( pSoldier, ANIM_STAND ) + max( 1, (INT16)(APBPConstants[AP_JUMP_OVER] * (100 - gSkillTraitValues.ubMAAPsClimbOrJumpReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f) ) ); else return( GetAPsToChangeStance( pSoldier, ANIM_STAND ) + APBPConstants[AP_JUMP_OVER] ); } @@ -4226,7 +4235,7 @@ INT16 GetAPsCrouch( SOLDIERTYPE *pSoldier, BOOLEAN fBackpackCheck ) // -x% APs needed to change stance for MA trait if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && ( gGameOptions.fNewTraitSystem )) - iFinalAPsToCrouch = (INT16)((iFinalAPsToCrouch * ( 100 - gSkillTraitValues.ubMAAPsChangeStanceReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ); + iFinalAPsToCrouch = (INT16)(iFinalAPsToCrouch * ( 100 - gSkillTraitValues.ubMAAPsChangeStanceReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ); if (iFinalAPsToCrouch < 1 ) iFinalAPsToCrouch = 1; @@ -4246,7 +4255,7 @@ INT16 GetAPsProne( SOLDIERTYPE *pSoldier, BOOLEAN fBackpackCheck ) // -x% APs needed to change stance for MA trait if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && ( gGameOptions.fNewTraitSystem )) - iFinalAPsToLieDown = (INT16)((iFinalAPsToLieDown * ( 100 - gSkillTraitValues.ubMAAPsChangeStanceReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5 ); + iFinalAPsToLieDown = (INT16)(iFinalAPsToLieDown * ( 100 - gSkillTraitValues.ubMAAPsChangeStanceReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f ); if (iFinalAPsToLieDown < 1 ) iFinalAPsToLieDown = 1; @@ -4267,7 +4276,7 @@ INT16 GetAPsStartRun( SOLDIERTYPE *pSoldier ) // Athletics trait if( HAS_SKILL_TRAIT( pSoldier, ATHLETICS_NT ) && gGameOptions.fNewTraitSystem ) - val = max( 1, (INT16)((val * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5) ); + val = max( 1, (INT16)(val * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100.0f + 0.5f) ); return val; } @@ -4276,7 +4285,7 @@ INT16 GetAPsStartRun( SOLDIERTYPE *pSoldier ) INT16 GetAPsToOpenDoor( SOLDIERTYPE *pSoldier ) { if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_OPEN_DOOR] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction)/100) + 0.5 )) ); + return( max( 1, (INT16)(APBPConstants[AP_OPEN_DOOR] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction) / 100.0f + 0.5f )) ); else return( APBPConstants[AP_OPEN_DOOR] ); } @@ -4285,7 +4294,7 @@ INT16 GetAPsToOpenDoor( SOLDIERTYPE *pSoldier ) INT16 GetAPsToPicklock( SOLDIERTYPE *pSoldier ) { if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_PICKLOCK] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction)/100) + 0.5 )) ); + return( max( 1, (INT16)(APBPConstants[AP_PICKLOCK] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction) / 100.0f + 0.5f )) ); else return( APBPConstants[AP_PICKLOCK] ); } @@ -4294,7 +4303,7 @@ INT16 GetAPsToPicklock( SOLDIERTYPE *pSoldier ) INT16 GetAPsToBombDoor( SOLDIERTYPE *pSoldier ) { if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_EXPLODE_DOOR] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction)/100) + 0.5 )) ); + return( max( 1, (INT16)(APBPConstants[AP_EXPLODE_DOOR] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction) / 100.0f + 0.5f )) ); else return( APBPConstants[AP_EXPLODE_DOOR] ); } @@ -4303,7 +4312,7 @@ INT16 GetAPsToBombDoor( SOLDIERTYPE *pSoldier ) INT16 GetAPsToUntrapDoor( SOLDIERTYPE *pSoldier ) { if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_UNTRAP_DOOR] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction)/100) + 0.5 )) ); + return( max( 1, (INT16)(APBPConstants[AP_UNTRAP_DOOR] * (100 - gSkillTraitValues.ubAMHandleDoorsAPsReduction) / 100.0f + 0.5f )) ); else return( APBPConstants[AP_UNTRAP_DOOR] ); } @@ -4312,7 +4321,7 @@ INT16 GetAPsToUntrapDoor( SOLDIERTYPE *pSoldier ) INT16 GetBasicAPsToPickupItem( SOLDIERTYPE *pSoldier ) { if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_PICKUP_ITEM] * (100 - gSkillTraitValues.ubAMPickItemsAPsReduction)/100) + 0.5 )) ); + return( max( 1, (INT16)(APBPConstants[AP_PICKUP_ITEM] * (100 - gSkillTraitValues.ubAMPickItemsAPsReduction) / 100.0f + 0.5f )) ); else return( APBPConstants[AP_PICKUP_ITEM] ); } @@ -4321,7 +4330,7 @@ INT16 GetBasicAPsToPickupItem( SOLDIERTYPE *pSoldier ) INT16 GetAPsToDisarmMine( SOLDIERTYPE *pSoldier ) { if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, AMBIDEXTROUS_NT ) ) - return( max( 1, (INT16)((APBPConstants[AP_DISARM_MINE] * (100 - gSkillTraitValues.ubAMHandleBombsAPsReduction)/100) + 0.5 )) ); + return( max( 1, (INT16)(APBPConstants[AP_DISARM_MINE] * (100 - gSkillTraitValues.ubAMHandleBombsAPsReduction) / 100.0f + 0.5f )) ); else return( APBPConstants[AP_DISARM_MINE] ); } diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 36444af8..ef0275df 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -7560,7 +7560,7 @@ void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNe } // martial artists can turn faster if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && gGameOptions.fNewTraitSystem ) - sAPCost = max( 1, (INT16)((sAPCost * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100) + 0.5) ); + sAPCost = max( 1, (INT16)(sAPCost * (100 - gSkillTraitValues.ubMAApsTurnAroundReduction * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f) ); // SANDRO: get BP cost for weapon manipulating if ( gGameExternalOptions.ubEnergyCostForWeaponWeight ) diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index ade66a37..024b3960 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -3668,7 +3668,7 @@ BOOLEAN UseHandToHand( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, BOOLEAN fStea { if (HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && ( gGameOptions.fNewTraitSystem )) { - DeductPoints( pSoldier, max( 1, (INT16)((APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/ 100) + 0.5)), 200, AFTERACTION_INTERRUPT ); + DeductPoints( pSoldier, max( 1, (INT16)(APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)), 200, AFTERACTION_INTERRUPT ); } else { @@ -3685,7 +3685,7 @@ BOOLEAN UseHandToHand( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, BOOLEAN fStea { if (HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) && ( gGameOptions.fNewTraitSystem )) { - DeductPoints( pSoldier, max( 1, (INT16)((APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ))/ 100) + 0.5)), 0, AFTERACTION_INTERRUPT ); + DeductPoints( pSoldier, max( 1, (INT16)(APBPConstants[AP_STEAL_ITEM] * (100 - gSkillTraitValues.ubMAReducedAPsToSteal * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT )) / 100.0f + 0.5f)), 0, AFTERACTION_INTERRUPT ); } else { diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index d064b9ad..e8d923ec 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -2285,7 +2285,7 @@ INT32 EstimateStabDamage( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, if ( HAS_SKILL_TRAIT( pSoldier, MARTIAL_ARTS_NT ) ) { // also add breath damage bonus into consideration - iImpact = (INT32)((iImpact * ( 100 + (gSkillTraitValues.ubMABonusDamageHandToHand + gSkillTraitValues.ubMABonusBreathDamageHandToHand) * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ) ) / 100) + 0.5); + iImpact = (INT32)(iImpact * ( 100 + (gSkillTraitValues.ubMABonusDamageHandToHand + gSkillTraitValues.ubMABonusBreathDamageHandToHand) * NUM_SKILL_TRAITS( pSoldier, MARTIAL_ARTS_NT ) ) / 100.0f + 0.5f); // The Spinning kicks or aimed punch bonus - SANDRO @@ -2300,7 +2300,7 @@ INT32 EstimateStabDamage( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, // +30% damage of blunt weapons for melee character if (HAS_SKILL_TRAIT( pSoldier, MELEE_NT )) { - iImpact = (INT32)((iImpact * (100 + gSkillTraitValues.ubMEDamageBonusBlunt)/100) + 0.5); + iImpact = (INT32)(iImpact * (100 + gSkillTraitValues.ubMEDamageBonusBlunt) / 100.0f + 0.5f); //if (pSoldier->aiData.bAimTime > 0) //{ @@ -2313,11 +2313,11 @@ INT32 EstimateStabDamage( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, { if ( HAS_SKILL_TRAIT( pSoldier, MARTIALARTS_OT ) ) { - iImpact = (INT32)((iImpact * (100 + gbSkillTraitBonus[MARTIALARTS_OT] * NUM_SKILL_TRAITS( pSoldier, MARTIALARTS_OT ) ) / 100) + 0.5); + iImpact = (INT32)(iImpact * (100 + gbSkillTraitBonus[MARTIALARTS_OT] * NUM_SKILL_TRAITS( pSoldier, MARTIALARTS_OT ) ) / 100.0f + 0.5f); } if ( HAS_SKILL_TRAIT( pSoldier, HANDTOHAND_OT ) ) { - iImpact = (INT32)((iImpact * (100 + gbSkillTraitBonus[HANDTOHAND_OT] * NUM_SKILL_TRAITS( pSoldier, HANDTOHAND_OT ) ) / 100) + 0.5); + iImpact = (INT32)(iImpact * (100 + gbSkillTraitBonus[HANDTOHAND_OT] * NUM_SKILL_TRAITS( pSoldier, HANDTOHAND_OT ) ) / 100.0f + 0.5f); } } // SANDRO - Enhanced Close Combat System - aiming at body parts makes difference @@ -2404,10 +2404,10 @@ INT8 TryToReload( SOLDIERTYPE * pSoldier ) { // Sniper trait makes chambering a round faster if (( Weapon[Item[(pObj)->usItem].ubClassIndex].ubWeaponType == GUN_SN_RIFLE || Weapon[Item[(pObj)->usItem].ubClassIndex].ubWeaponType == GUN_RIFLE ) && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT )) - DeductPoints(pSoldier, (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )))/100) + 0.5), 0); + DeductPoints(pSoldier, (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )) / 100.0f + 0.5f), 0); // Ranger trait makes pumping shotguns faster else if (( Weapon[Item[(pObj)->usItem].ubClassIndex].ubWeaponType == GUN_SHOTGUN ) && HAS_SKILL_TRAIT( pSoldier, RANGER_NT )) - DeductPoints(pSoldier, (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )))/100) + 0.5), 0); + DeductPoints(pSoldier, (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )) / 100.0f + 0.5f), 0); else DeductPoints(pSoldier, sModifiedReloadAP, 0); } @@ -2457,10 +2457,10 @@ INT8 TryToReload( SOLDIERTYPE * pSoldier ) { // Sniper trait makes chambering a round faster if (( Weapon[Item[(pObj2)->usItem].ubClassIndex].ubWeaponType == GUN_SN_RIFLE || Weapon[Item[(pObj2)->usItem].ubClassIndex].ubWeaponType == GUN_RIFLE ) && HAS_SKILL_TRAIT( pSoldier, SNIPER_NT )) - DeductPoints(pSoldier, (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )))/100) + 0.5), 0); + DeductPoints(pSoldier, (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubSNChamberRoundAPsReduction * NUM_SKILL_TRAITS( pSoldier, SNIPER_NT )) / 100.0f + 0.5f), 0); // Ranger trait makes pumping shotguns faster else if (( Weapon[Item[(pObj2)->usItem].ubClassIndex].ubWeaponType == GUN_SHOTGUN ) && HAS_SKILL_TRAIT( pSoldier, RANGER_NT )) - DeductPoints(pSoldier, (INT16)(((sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )))/100) + 0.5), 0); + DeductPoints(pSoldier, (INT16)(sModifiedReloadAP * (100 - gSkillTraitValues.ubRAPumpShotgunsAPsReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT )) / 100.0f + 0.5f), 0); else DeductPoints(pSoldier, sModifiedReloadAP, 0); } diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index 987351cd..e86a7463 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -1632,13 +1632,13 @@ BOOLEAN DamageSoldierFromBlast( UINT8 ubPerson, UINT8 ubOwner, INT32 sBombGridNo Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_NORMAL && Item[usItem].usItemClass == IC_BOMB && (!Item[usItem].attachment || Item[usItem].mine )) { - sNewWoundAmt = (INT16)(((sNewWoundAmt * (100 + gSkillTraitValues.ubDEDamageOfBombsAndMines)) / 100) + 0.5); + sNewWoundAmt = (INT16)(sNewWoundAmt * (100 + gSkillTraitValues.ubDEDamageOfBombsAndMines) / 100.0f + 0.5f); } // Heavy Weapons trait bonus damage to tanks if ( HAS_SKILL_TRAIT( MercPtrs[ubOwner], HEAVY_WEAPONS_NT ) && ARMED_VEHICLE( pSoldier ) && Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_NORMAL ) { - sNewWoundAmt = (INT16)(((sNewWoundAmt * (100 + gSkillTraitValues.ubHWDamageTanksBonusPercent * NUM_SKILL_TRAITS( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT ))) / 100) + 0.5); // +30% + sNewWoundAmt = (INT16)(sNewWoundAmt * (100 + gSkillTraitValues.ubHWDamageTanksBonusPercent * NUM_SKILL_TRAITS( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT )) / 100.0f + 0.5f); // +30% } // Heavy Weapons trait bonus damage with rocket, grenade launchers and mortar else if ( HAS_SKILL_TRAIT( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT ) && @@ -1647,7 +1647,7 @@ BOOLEAN DamageSoldierFromBlast( UINT8 ubPerson, UINT8 ubOwner, INT32 sBombGridNo (Item[usItem].usItemClass == IC_GRENADE && (Item[usItem].glgrenade || Item[usItem].electronic) ) || // rockets for rocketlaunchers (I haven't found any other way) (Item[usItem].usItemClass == IC_LAUNCHER ) || Item[usItem].rocketlauncher || Item[usItem].singleshotrocketlauncher ) ) { - sNewWoundAmt = (INT16)(((sNewWoundAmt * (100 + gSkillTraitValues.ubHWDamageBonusPercentForHW * NUM_SKILL_TRAITS( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT ))) / 100) + 0.5); // +15% + sNewWoundAmt = (INT16)(sNewWoundAmt * (100 + gSkillTraitValues.ubHWDamageBonusPercentForHW * NUM_SKILL_TRAITS( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT )) / 100.0f + 0.5f); // +15% } }