diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp index 6db1a79b..388fceca 100644 --- a/Tactical/DisplayCover.cpp +++ b/Tactical/DisplayCover.cpp @@ -604,7 +604,7 @@ static void CalculateCoverFromEnemies() } pOpponents.push_back(pOpponent); - bCowering.push_back(CoweringShockLevel(pOpponent)); + bCowering.push_back(pOpponent->IsCowering()); tunnelVision.push_back(GetPercentTunnelVision(pOpponent)); } diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index 694efec7..b8a06317 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -3620,7 +3620,7 @@ void DrawBarsInUIBox( SOLDIERTYPE *pSoldier , INT16 sXPos, INT16 sYPos, INT16 sW // draw suppression shock bar if( gGameExternalOptions.ubShowHealthBarsOnHead > 1 ) { - dPercentage = (FLOAT)( __min(100, ( (FLOAT)100 * CalcEffectiveShockLevel( pSoldier ) ) / CalcSuppressionTolerance( pSoldier ) ) ) / (FLOAT)100; + dPercentage = (min(100.0f, 100.0f * CalcEffectiveShockLevel(pSoldier) / max(1.0f, CalcSuppressionTolerance(pSoldier)))) / 100.0f; dWidth = dPercentage * sWidth; DrawBar( sXPos+3, sYPos+1+2*interval, (INT32)dWidth, sHeight, COLOR_ORANGE, Get16BPPColor( FROMRGB( 220, 140, 0 ) ), pDestBuf ); } diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 85aeff83..a18aaffc 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -11800,7 +11800,7 @@ UINT8 GetPercentTunnelVision( SOLDIERTYPE * pSoldier ) IS_MERC_BODY_TYPE(pSoldier) && (pSoldier->bTeam == ENEMY_TEAM || pSoldier->bTeam == MILITIA_TEAM || pSoldier->bTeam == gbPlayerNum) ) { // Make sure character is cowering. - if ( CoweringShockLevel(pSoldier) && gGameExternalOptions.ubMaxSuppressionShock > 0 && + if ( pSoldier->IsCowering() && gGameExternalOptions.ubMaxSuppressionShock > 0 && bonus < 100 ) { // Calculates a "Flat" tunnel vision percentage diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 473ef4de..fdb6b31a 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -10907,21 +10907,23 @@ INT8 CheckStatusNearbyFriendliesSimple(SOLDIERTYPE *pSoldier) INT16 sDistance; INT16 sMinDistance = TACTICAL_RANGE / 4; - if (!pSoldier || !IS_MERC_BODY_TYPE(pSoldier) || pSoldier->stats.bLife < OKLIFE || pSoldier->IsCowering() || pSoldier->IsUnconscious()) + if (!pSoldier || !pSoldier->bActive || TileIsOutOfBounds(pSoldier->sGridNo) || !IS_MERC_BODY_TYPE(pSoldier) || pSoldier->stats.bLife < OKLIFE || pSoldier->IsCowering() || pSoldier->IsUnconscious()) { return 0; } // Run through each friendly. - for (UINT8 iCounter = gTacticalStatus.Team[ pSoldier->bTeam ].bFirstID ; iCounter <= gTacticalStatus.Team[ pSoldier->bTeam ].bLastID ; iCounter ++) + for (UINT8 ubFriend = gTacticalStatus.Team[ pSoldier->bTeam ].bFirstID ; ubFriend <= gTacticalStatus.Team[ pSoldier->bTeam ].bLastID ; ubFriend ++) { - pFriend = MercPtrs[ iCounter ]; + pFriend = MercPtrs[ ubFriend ]; // Make sure that character is alive and active if (pFriend && pFriend != pSoldier && pFriend->bActive && IS_MERC_BODY_TYPE(pFriend) && + !TileIsOutOfBounds(pFriend->sGridNo) && + //LocationToLocationLineOfSightTest(pSoldier->sGridNo, pSoldier->pathing.bLevel, pFriend->sGridNo, pFriend->pathing.bLevel, TRUE, CALC_FROM_ALL_DIRS)) SoldierToSoldierLineOfSightTest(pSoldier, pFriend, TRUE, CALC_FROM_ALL_DIRS)) { sDistance = PythSpacesAway(pSoldier->sGridNo, pFriend->sGridNo); diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index 1b67b607..bc9c26a4 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -1182,10 +1182,10 @@ INT16 SOLDIERTYPE::GetMaxDistanceVisible(INT32 sGridNo, INT8 bLevel, int calcAsT if (calcAsType == CALC_FROM_ALL_DIRS) { - return DistanceVisible( this, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sGridNo, bLevel, CoweringShockLevel(this), GetPercentTunnelVision(this) ); + return DistanceVisible( this, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sGridNo, bLevel, this->IsCowering(), GetPercentTunnelVision(this) ); } - return DistanceVisible( this, (SoldierHasLimitedVision(this) ? this->pathing.bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, sGridNo, bLevel, CoweringShockLevel(this), GetPercentTunnelVision(this)); + return DistanceVisible( this, (SoldierHasLimitedVision(this) ? this->pathing.bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, sGridNo, bLevel, this->IsCowering(), GetPercentTunnelVision(this)); } INT16 DistanceVisible(SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, INT32 sSubjectGridNo, INT8 bLevel, const BOOLEAN& isCowering, const UINT8& tunnelVision) @@ -2097,7 +2097,7 @@ INT16 ManLooksForMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ubCall // BIG NOTE: must use desdir instead of direction, since in a projected // situation, the direction may still be changing if it's one of the first // few animation steps when this guy's turn to do his stepped look comes up - sDistVisible = DistanceVisible(pSoldier, pSoldier->pathing.bDesiredDirection, bDir, pOpponent->sGridNo, pOpponent->pathing.bLevel, CoweringShockLevel(pSoldier), GetPercentTunnelVision(pSoldier)); + sDistVisible = DistanceVisible(pSoldier, pSoldier->pathing.bDesiredDirection, bDir, pOpponent->sGridNo, pOpponent->pathing.bLevel, pSoldier->IsCowering(), GetPercentTunnelVision(pSoldier)); //if (pSoldier->ubID == 0) //sprintf(gDebugStr,"dist visible %d: my dir %d to him %d",sDistVisible,pSoldier->bDesiredDirection,bDir); } @@ -7543,7 +7543,7 @@ void CheckForAlertWhenEnemyDies( SOLDIERTYPE * pDyingSoldier ) // distance we "see" then depends on the direction he is located from us bDir = atan8(pSoldier->sX,pSoldier->sY,pDyingSoldier->sX,pDyingSoldier->sY); - sDistVisible = DistanceVisible( pSoldier, pSoldier->pathing.bDesiredDirection, bDir, pDyingSoldier->sGridNo, pDyingSoldier->pathing.bLevel, CoweringShockLevel(pSoldier), GetPercentTunnelVision(pSoldier)); + sDistVisible = DistanceVisible( pSoldier, pSoldier->pathing.bDesiredDirection, bDir, pDyingSoldier->sGridNo, pDyingSoldier->pathing.bLevel, pSoldier->IsCowering(), GetPercentTunnelVision(pSoldier)); sDistAway = PythSpacesAway( pSoldier->sGridNo, pDyingSoldier->sGridNo ); // if we see close enough to see the soldier diff --git a/TacticalAI/AIUtils.cpp b/TacticalAI/AIUtils.cpp index 9d3ef320..c577b762 100644 --- a/TacticalAI/AIUtils.cpp +++ b/TacticalAI/AIUtils.cpp @@ -4248,7 +4248,7 @@ BOOLEAN ProneSightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlim else { gbForceWeaponReady = true; - iDistanceVisible = DistanceVisible(pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sSpot, pSoldier->pathing.bLevel, CoweringShockLevel(pSoldier), GetPercentTunnelVision(pSoldier)); + iDistanceVisible = DistanceVisible(pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sSpot, pSoldier->pathing.bLevel, pSoldier->IsCowering(), GetPercentTunnelVision(pSoldier)); gbForceWeaponReady = false; //iDistanceVisible = pSoldier->GetMaxDistanceVisible(sSpot, pSoldier->pathing.bLevel, CALC_FROM_WANTED_DIR); } @@ -4338,7 +4338,7 @@ BOOLEAN SightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlimited) else { gbForceWeaponReady = true; - iDistanceVisible = DistanceVisible(pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sSpot, pSoldier->pathing.bLevel, CoweringShockLevel(pSoldier), GetPercentTunnelVision(pSoldier)); + iDistanceVisible = DistanceVisible(pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sSpot, pSoldier->pathing.bLevel, pSoldier->IsCowering(), GetPercentTunnelVision(pSoldier)); gbForceWeaponReady = false; //iDistanceVisible = pSoldier->GetMaxDistanceVisible(sSpot, pSoldier->pathing.bLevel, CALC_FROM_WANTED_DIR); } diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index f70eb02e..ac946ad5 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -337,7 +337,7 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot) (pOpponent->stats.bLife < OKLIFE || pOpponent->bCollapsed && pOpponent->bBreath == 0 || pOpponent->IsCowering() || - CoweringShockLevel(pOpponent) || + pOpponent->IsCowering() || pOpponent->IsZombie() || !IS_MERC_BODY_TYPE(pOpponent))) { @@ -1146,7 +1146,7 @@ void CalcBestThrow(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow) Explosive[Item[usGrenade].ubClassIndex].ubType == EXPLOSV_SMOKE && (FindAIUsableObjClass(pOpponent, IC_GUN) == NO_SLOT || (pSoldier->usAnimState == COWERING || pSoldier->usAnimState == COWERING_PRONE) || - CoweringShockLevel(pOpponent) > 50 || + pOpponent->ShockLevelPercent() > 50 || EffectiveMarksmanship(pOpponent) < 90 && !IsScoped(&pOpponent->inv[HANDPOS]) && !pOpponent->aiData.bLastAttackHit)) { continue; diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp index c88e1c9a..5732115d 100644 --- a/TacticalAI/DecideAction.cpp +++ b/TacticalAI/DecideAction.cpp @@ -8589,7 +8589,7 @@ INT8 ArmedVehicleDecideActionRed( SOLDIERTYPE *pSoldier) //&& Menptr[BestShot.ubOpponent].pathing.bLevel == 0 && pSoldier->aiData.bOrders != SNIPER && BestShot.ubFriendlyFireChance < 5 && - !CoweringShockLevel( MercPtrs[BestShot.ubOpponent] ) && + !MercPtrs[BestShot.ubOpponent]->IsCowering() && !AICheckIsFlanking( pSoldier ) && LocationToLocationLineOfSightTest( pSoldier->sGridNo, pSoldier->pathing.bLevel, MercPtrs[BestShot.ubOpponent]->sGridNo, MercPtrs[BestShot.ubOpponent]->pathing.bLevel, TRUE, NO_DISTANCE_LIMIT ) && //Weapon[pSoldier->inv[BestShot.bWeaponIn].usItem].ubWeaponType == GUN_LMG ) && //Weapon[usInHand].ubWeaponClass == MGCLASS