replace good angle malus with existing far cover

rohan
Sep 16, 2022, 8:06 AM
Q5WQ6EMVCCLLA4Z4BUILW7DU2TZ6VPDACAO5RORHXLHBH3Y3K6MQC

Dependencies

  • [2] ZC7RMRAE simpler no-line-of-sight which also accounts for existing cover, higher resolution far cover
  • [3] 6GNTEDE4 use real LOS functions to determine Far Cover (automatically accounts for roof edge protection)
  • [4] UA2L2WYU use correct config file
  • [5] JSCVVDFD remove commented code and excess tabs
  • [6] X4IR7ZAH baseline from krumiro's [WotC] RW Realistic Aiming Angles
  • [7] MPALURGP maximum far cover is low cover malus

Change contents

  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 509
    [3.45045][3.45045:45181]()
    local bool bShouldAddAngleToCoverBonus;
    local TTile UnitTileLocation, TargetTileLocation;
    local ECoverType NextTileOverCoverType;
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 558
    [3.2040][3.2040:2125]()
    NextTileOverCoverType = NextTileOverCoverInSameDirection(ShooterTile, TargetTile);
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 692
    [3.55244][3.55244:55481]()
    if( VisInfo.TargetCoverAngle < 90-default.MinimumGoodAngleBonusStartsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface && (TileDistance <= MAX_TILE_DISTANCE_TO_COVER || default.ApplyGoodAngleBonusEvenFartherThan11TilesAway))
    [3.54964]
    [3.55481]
    if( VisInfo.TargetCoverAngle < 90-default.MinimumGoodAngleBonusStartsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface && (TileDistance <= MAX_TILE_DISTANCE_TO_COVER || default.ApplyGoodAngleBonusEvenFartherThan11TilesAway) && (UnitState.GetTeam() == eTeam_XCom || default.ApplyGoodAngleBonusNotOnlyForXComSoldiersButAlsoForAnyoneShooting))
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 694
    [3.55491][3.2556:2632](),[3.2632][3.55589:55927](),[3.55589][3.55589:55927](),[3.55927][2.155:214](),[2.214][3.2633:2740](),[3.55927][3.2633:2740](),[3.2740][3.56267:56420](),[3.56267][3.56267:56420](),[3.56420][3.2741:2847](),[3.2847][3.57100:57102](),[3.57100][3.57100:57102](),[3.57102][3.2848:2987](),[3.2987][3.57102:57174](),[3.57102][3.57102:57174](),[3.57174][3.2988:3092](),[3.3092][3.57445:57505](),[3.57445][3.57445:57505](),[3.57505][3.3093:3308](),[3.3308][3.57801:58035](),[3.57801][3.57801:58035](),[3.58373][3.58373:58708](),[3.58822][3.58822:58988](),[3.58988][3.3309:3378](),[3.3378][3.0:73](),[3.73][3.3378:3509](),[3.3378][3.3378:3509](),[3.3964][3.60518:60529](),[3.60518][3.60518:60529]()
    bShouldAddAngleToCoverBonus = (UnitState.GetTeam() == eTeam_XCom);
    if (default.ApplyGoodAngleBonusNotOnlyForXComSoldiersButAlsoForAnyoneShooting) bShouldAddAngleToCoverBonus = true; //GOODANGLE FOR ENEMIES TOO!!!
    // We have to avoid the weird visual situation of a unit standing behind low cover
    // and that low cover extends at least 1 tile in the direction of the attacker.
    // FIXME this can be covered by far cover instead
    if((true && VisInfo.TargetCover == CT_MidLevel) || (false && VisInfo.TargetCover == CT_Standing))
    {
    UnitState.GetKeystoneVisibilityLocation(UnitTileLocation);
    TargetState.GetKeystoneVisibilityLocation(TargetTileLocation);
    NextTileOverCoverType = NextTileOverCoverInSameDirection(UnitTileLocation, TargetTileLocation);
    if(true && VisInfo.TargetCover == CT_MidLevel && (NextTileOverCoverType == CT_MidLevel || NextTileOverCoverType == CT_Standing))
    {
    bShouldAddAngleToCoverBonus = false;
    }
    else if(false && VisInfo.TargetCover == CT_Standing && NextTileOverCoverType == CT_Standing )
    {
    bShouldAddAngleToCoverBonus = false;
    Alpha = FClamp((VisInfo.TargetCoverAngle - MIN_ANGLE_TO_COVER) / (MAX_ANGLE_TO_COVER - MIN_ANGLE_TO_COVER), 0.0, 1.0);
    AngleToCoverModifier = Lerp(MAX_ANGLE_PENALTY, MIN_ANGLE_PENALTY, Alpha);
    AddModifier(Round(-1.0 * AngleToCoverModifier), class'XLocalizedData'.default.BadAngleToTargetCover, m_ShotBreakdown, eHit_Success, bDebugLog);
    }
    }
    if( bShouldAddAngleToCoverBonus )
    {
    Alpha = FClamp((VisInfo.TargetCoverAngle - default.MaximumGoodAngleBonusEndsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface) / (default.MinimumGoodAngleBonusStartsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface - default.MaximumGoodAngleBonusEndsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface), 0.0, 1.0);
    AngleToCoverModifier = Lerp(default.MaximumGoodAngleBonusCoverReductionPercentage /100, default.MinimumGoodAngleBonusCoverReductionPercentage /100, Alpha);
    GoodAngleBonus = Round(CoverValue * AngleToCoverModifier);
    `log("GoodAngleBonus:"@GoodAngleBonus, true, 'XCom_HitRolls');
    AddModifier(GoodAngleBonus, class'XLocalizedData'.default.AngleToTargetCover, m_ShotBreakdown, eHit_Success, bDebugLog);
    }
    [3.55491]
    [3.60529]
    Alpha = FClamp((VisInfo.TargetCoverAngle - default.MaximumGoodAngleBonusEndsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface) / (default.MinimumGoodAngleBonusStartsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface - default.MaximumGoodAngleBonusEndsAtThisHorizontalAngleBetweenLineOfFireAndCoverSurface), 0.0, 1.0);
    AngleToCoverModifier = Lerp(default.MaximumGoodAngleBonusCoverReductionPercentage /100, default.MinimumGoodAngleBonusCoverReductionPercentage /100, Alpha);
    GoodAngleBonus = Round(CoverValue * AngleToCoverModifier);
    `log("GoodAngleBonus:"@GoodAngleBonus, true, 'XCom_HitRolls');
    AddModifier(GoodAngleBonus, class'XLocalizedData'.default.AngleToTargetCover, m_ShotBreakdown, eHit_Success, bDebugLog);