simpler no-line-of-sight which also accounts for existing cover, higher resolution far cover
Dependencies
- [2]
CBG5GWG7peeking over an overhang doesn't work - add a little height to the firing location - [3]
WVILZZOZfar cover correctly accounts for standard cover - [4]
MPALURGPmaximum far cover is low cover malus - [5]
UA2L2WYUuse correct config file - [6]
6GNTEDE4use real LOS functions to determine Far Cover (automatically accounts for roof edge protection) - [7]
VHVL5HH4simplify far cover by starting at only the peek tile - [8]
6BFPFEMCcorrectly scale far cover for oversize targets - [9]
7GQHYDUFXCom are always at red alert - [10]
JSCVVDFDremove commented code and excess tabs - [11]
X4IR7ZAHbaseline from krumiro's [WotC] RW Realistic Aiming Angles
Change contents
- replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 525
local TTile PeekHead, LosTile, TargetPeekTile;local TTile ShooterPeekTile, LosTile, TargetPeekTile; - edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 530
local bool NoLineOfSight;local vector ShooterPeekVec, LosVec;local int floor; - edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 703
// FIXME this can be covered by far cover instead - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 773
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');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
`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
- edit in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 785
// FarCover to a tile which may already be granting coverLosTile = TargetTile;LosTile.Z = `XWORLD.GetFloorTileZ(TargetTile); - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 800
for (i=ExistingCoverHeight; i<=TargetHeight; i++)// FarCover to a tile which may already be granting coverFarCover = 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
if (`XWORLD.VoxelRaytrace_Tiles(PeekHead, LosTile, RayTrace))LosVec.Z = Floor + i;if (`XWORLD.VoxelRaytrace_Locations(ShooterPeekVec, LosVec, RayTrace)) - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 815
`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;// Don't apply far cover to existing cover or above the target's headif (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
LosTile.Z++; - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 836
for (i=0; i<=TargetState.UnitHeight; i++) // Target not crouched when peekingLosVec = `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
if (`XWORLD.VoxelRaytrace_Tiles(PeekHead, LosTile, RayTrace))LosVec.Z = Floor + i;if (`XWORLD.VoxelRaytrace_Locations(ShooterPeekVec, LosVec, RayTrace)) - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 843
`log("LOS blocked by far cover:"@i, true, 'XCom_HitRolls');`log("LOS blocked by far cover vector:"@i, true, 'XCom_HitRolls'); - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 847
LosTile.Z++;else // Target is always standing when peeking{NoLineOfSight = false;} - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 859
if (default.GiveHitChanceZeroWhenTargetableEnemiesAreInsteadNotTrulyInLineOfSight && FarCover == 6)if (default.GiveHitChanceZeroWhenTargetableEnemiesAreInsteadNotTrulyInLineOfSight && NoLineOfSight) - replacement in RWRealisticAimingAnglesHL/Src/RWRealisticAimingAnglesHL/Classes/Override_X2AbilityToHitCalc_StandardAim.uc at line 867
FarCoverBonus = FarCover * HIGH_COVER_BONUS / 6; // 6 is the maximum considered rayFarCoverBonus = FarCover * HIGH_COVER_BONUS / 14; // 14 is the maximum considered ray