simpler no-line-of-sight which also accounts for existing cover, higher resolution far cover

rohan
Sep 14, 2022, 9:32 AM
ZC7RMRAEGOJTHV4EZMR5MWIIRNT3BN4DXLXERJSAFRTNP5JUVAEQC

Dependencies

  • [2] CBG5GWG7 peeking over an overhang doesn't work - add a little height to the firing location
  • [3] WVILZZOZ far cover correctly accounts for standard cover
  • [4] MPALURGP maximum far cover is low cover malus
  • [5] UA2L2WYU use correct config file
  • [6] 6GNTEDE4 use real LOS functions to determine Far Cover (automatically accounts for roof edge protection)
  • [7] VHVL5HH4 simplify far cover by starting at only the peek tile
  • [8] 6BFPFEMC correctly scale far cover for oversize targets
  • [9] 7GQHYDUF XCom are always at red alert
  • [10] JSCVVDFD remove commented code and excess tabs
  • [11] X4IR7ZAH baseline from krumiro's [WotC] RW Realistic Aiming Angles

Change contents

  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 525
    [4.56][4.0:56]()
    local TTile PeekHead, LosTile, TargetPeekTile;
    [4.56]
    [4.122]
    local TTile ShooterPeekTile, LosTile, TargetPeekTile;
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 530
    [4.46386]
    [4.46386]
    local bool NoLineOfSight;
    local vector ShooterPeekVec, LosVec;
    local int floor;
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 703
    [4.55927]
    [4.2633]
    // FIXME this can be covered by far cover instead
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 773
    [4.634][2.0:152](),[2.152][4.859:949](),[4.164][4.859:949](),[4.859][4.859:949]()
    PeekHead = VisInfo.SourceTile;
    `log("PeekTile:"@PeekHead.X@","@PeekHead.Y@","@PeekHead.Z, true, 'XCom_HitRolls');
    PeekHead.Z += 1;
    `log("PeekHead:"@PeekHead.X@","@PeekHead.Y@","@PeekHead.Z, true, 'XCom_HitRolls');
    [4.634]
    [4.949]
    ShooterPeekTile = VisInfo.SourceTile;
    ShooterPeekTile.Z += 1;
    `log("ShooterPeekTile:"@ShooterPeekTile.X@","@ShooterPeekTile.Y@","@ShooterPeekTile.Z, true, 'XCom_HitRolls');
    `log("Shooter floor:"@`XWORLD.GetFloorTileZ(ShooterTile));
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 781
    [4.1205]
    [4.1205]
    `log("Target floor:"@`XWORLD.GetFloorTileZ(TargetTile));
    `log("Target peek floor:"@`XWORLD.GetFloorTileZ(TargetPeekTile));
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 784
    [4.1282][4.64789:64791](),[4.5172][4.64789:64791](),[4.64789][4.64789:64791]()
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 785
    [4.66768][4.1283:1431]()
    // FarCover to a tile which may already be granting cover
    LosTile = TargetTile;
    LosTile.Z = `XWORLD.GetFloorTileZ(TargetTile);
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 800
    [3.493][3.493:550]()
    for (i=ExistingCoverHeight; i<=TargetHeight; i++)
    [3.493]
    [4.7955]
    // FarCover to a tile which may already be granting cover
    FarCover = 0;
    NoLineOfSight = true;
    ShooterPeekVec = `XWORLD.GetPositionFromTileCoordinates(ShooterPeekTile);
    LosTile = TargetTile;
    LosTile.Z = `XWORLD.GetFloorTileZ(TargetTile);
    LosVec = `XWORLD.GetPositionFromTileCoordinates(LosTile);
    Floor = LosVec.Z;
    for (i = 16; i<TargetState.UnitHeight * 64; i += 16)
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 812
    [4.1803][4.1803:1873]()
    if (`XWORLD.VoxelRaytrace_Tiles(PeekHead, LosTile, RayTrace))
    [4.7964]
    [4.827]
    LosVec.Z = Floor + i;
    if (`XWORLD.VoxelRaytrace_Locations(ShooterPeekVec, LosVec, RayTrace))
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 815
    [4.837][3.551:801]()
    `log("LOS blocked by far cover:"@i@","@VisInfo.TargetCover, true, 'XCom_HitRolls');
    `log("Blocking tile:"@RayTrace.BlockedTile.X@","@RayTrace.BlockedTile.Y@","@RayTrace.BlockedTile.Z, true, 'XCom_HitRolls');
    FarCover += 1;
    [4.837]
    [4.1090]
    // Don't apply far cover to existing cover or above the target's head
    if (i > ExistingCoverHeight*64 && i <= TargetHeight*64)
    {
    `log("LOS blocked by far cover vector:"@i@","@VisInfo.TargetCover, true, 'XCom_HitRolls');
    FarCover += 1;
    }
    else if (i <= ExistingCoverHeight*64)
    {
    `log("Hit existing cover:"@RayTrace.BlockedTile.X@","@RayTrace.BlockedTile.Y@","@RayTrace.BlockedTile.Z, true, 'XCom_HitRolls');
    }
    }
    else if (i <= TargetHeight*64)
    {
    NoLineOfSight = false;
  • edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 831
    [4.74012][4.1190:1192](),[4.1192][4.2123:2144]()
    LosTile.Z++;
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 836
    [4.2307][3.802:888]()
    for (i=0; i<=TargetState.UnitHeight; i++) // Target not crouched when peeking
    [4.2307]
    [4.1240]
    LosVec = `XWORLD.GetPositionFromTileCoordinates(LosTile);
    Floor = LosVec.Z;
    for (i=16; i<TargetState.UnitHeight * 64; i += 16)
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 840
    [4.2542][4.2542:2612]()
    if (`XWORLD.VoxelRaytrace_Tiles(PeekHead, LosTile, RayTrace))
    [4.1249]
    [4.1277]
    LosVec.Z = Floor + i;
    if (`XWORLD.VoxelRaytrace_Locations(ShooterPeekVec, LosVec, RayTrace))
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 843
    [4.1287][4.2613:2682]()
    `log("LOS blocked by far cover:"@i, true, 'XCom_HitRolls');
    [4.1287]
    [3.889]
    `log("LOS blocked by far cover vector:"@i, true, 'XCom_HitRolls');
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 847
    [4.1298][4.2707:2730]()
    LosTile.Z++;
    [4.1298]
    [4.2730]
    else // Target is always standing when peeking
    {
    NoLineOfSight = false;
    }
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 859
    [4.2935][4.369:476]()
    if (default.GiveHitChanceZeroWhenTargetableEnemiesAreInsteadNotTrulyInLineOfSight && FarCover == 6)
    [4.2935]
    [4.3043]
    if (default.GiveHitChanceZeroWhenTargetableEnemiesAreInsteadNotTrulyInLineOfSight && NoLineOfSight)
  • replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 867
    [4.3593][4.477:569]()
    FarCoverBonus = FarCover * HIGH_COVER_BONUS / 6; // 6 is the maximum considered ray
    [4.3593]
    [4.3687]
    FarCoverBonus = FarCover * HIGH_COVER_BONUS / 14; // 14 is the maximum considered ray