public static ShotReport HitReportFor(Thing caster, Verb verb, LocalTargetInfo target) { IntVec3 cell = target.Cell; ShotReport result = default(ShotReport); result.distance = (cell - caster.Position).LengthHorizontal; result.target = target.ToTargetInfo(caster.Map); result.factorFromShooterAndDist = HitFactorFromShooter(caster, result.distance); result.factorFromEquipment = verb.verbProps.GetHitChanceFactor(verb.EquipmentSource, result.distance); result.covers = CoverUtility.CalculateCoverGiverSet(target, caster.Position, caster.Map); result.coversOverallBlockChance = CoverUtility.CalculateOverallBlockChance(target, caster.Position, caster.Map); result.coveringGas = null; if (verb.TryFindShootLineFromTo(verb.caster.Position, target, out result.shootLine)) { foreach (IntVec3 item in result.shootLine.Points()) { Thing gas = item.GetGas(caster.Map); if (gas != null && (result.coveringGas == null || result.coveringGas.gas.accuracyPenalty < gas.def.gas.accuracyPenalty)) { result.coveringGas = gas.def; } } } else { result.shootLine = new ShootLine(IntVec3.Invalid, IntVec3.Invalid); } if (!caster.Position.Roofed(caster.Map) || !target.Cell.Roofed(caster.Map)) { result.factorFromWeather = caster.Map.weatherManager.CurWeatherAccuracyMultiplier; } else { result.factorFromWeather = 1f; } if (target.HasThing) { Pawn pawn = target.Thing as Pawn; if (pawn != null) { result.factorFromTargetSize = pawn.BodySize; } else { result.factorFromTargetSize = target.Thing.def.fillPercent * (float)target.Thing.def.size.x * (float)target.Thing.def.size.z * 2.5f; } result.factorFromTargetSize = Mathf.Clamp(result.factorFromTargetSize, 0.5f, 2f); } else { result.factorFromTargetSize = 1f; } result.forcedMissRadius = verb.verbProps.forcedMissRadius; return(result); }
public static List <CoverInfo> CalculateCoverGiverSet(IntVec3 targetLoc, IntVec3 shooterLoc, Map map) { List <CoverInfo> list = new List <CoverInfo>(); for (int i = 0; i < 8; i++) { IntVec3 intVec = targetLoc + GenAdj.AdjacentCells[i]; CoverInfo item = default(CoverInfo); if (intVec.InBounds(map) && CoverUtility.TryFindAdjustedCoverInCell(shooterLoc, targetLoc, intVec, map, out item)) { list.Add(item); } } return(list); }
public static float CalculateOverallBlockChance(IntVec3 targetLoc, IntVec3 shooterLoc, Map map) { float num = 0f; for (int i = 0; i < 8; i++) { IntVec3 intVec = targetLoc + GenAdj.AdjacentCells[i]; CoverInfo coverInfo = default(CoverInfo); if (intVec.InBounds(map) && CoverUtility.TryFindAdjustedCoverInCell(shooterLoc, targetLoc, intVec, map, out coverInfo)) { num = (float)(num + (1.0 - num) * coverInfo.BlockChance); } } return(num); }
public static float CalculateOverallBlockChance(LocalTargetInfo target, IntVec3 shooterLoc, Map map) { IntVec3 cell = target.Cell; float num = 0f; for (int i = 0; i < 8; i++) { IntVec3 intVec = cell + GenAdj.AdjacentCells[i]; if (intVec.InBounds(map)) { CoverInfo coverInfo; if (CoverUtility.TryFindAdjustedCoverInCell(shooterLoc, target, intVec, map, out coverInfo)) { num += (1f - num) * coverInfo.BlockChance; } } } return(num); }
public static List <CoverInfo> CalculateCoverGiverSet(LocalTargetInfo target, IntVec3 shooterLoc, Map map) { IntVec3 cell = target.Cell; List <CoverInfo> list = new List <CoverInfo>(); for (int i = 0; i < 8; i++) { IntVec3 intVec = cell + GenAdj.AdjacentCells[i]; if (intVec.InBounds(map)) { CoverInfo item; if (CoverUtility.TryFindAdjustedCoverInCell(shooterLoc, target, intVec, map, out item) && item.BlockChance > 0f) { list.Add(item); } } } return(list); }
public static ShotReport HitReportFor(Thing caster, Verb verb, LocalTargetInfo target) { Pawn pawn = caster as Pawn; IntVec3 cell = target.Cell; ShotReport result; result.distance = (cell - caster.Position).LengthHorizontal; result.target = target.ToTargetInfo(caster.Map); float f; if (pawn != null) { f = pawn.GetStatValue(StatDefOf.ShootingAccuracy, true); } else { f = 0.96f; } result.factorFromShooterAndDist = Mathf.Pow(f, result.distance); if (result.factorFromShooterAndDist < 0.0201f) { result.factorFromShooterAndDist = 0.0201f; } result.factorFromEquipment = verb.verbProps.GetHitChanceFactor(verb.ownerEquipment, result.distance); result.covers = CoverUtility.CalculateCoverGiverSet(cell, caster.Position, caster.Map); result.coversOverallBlockChance = CoverUtility.CalculateOverallBlockChance(cell, caster.Position, caster.Map); result.coveringGas = null; ShootLine shootLine; if (verb.TryFindShootLineFromTo(verb.caster.Position, target, out shootLine)) { foreach (IntVec3 current in shootLine.Points()) { Thing gas = current.GetGas(caster.Map); if (gas != null && (result.coveringGas == null || result.coveringGas.gas.accuracyPenalty < gas.def.gas.accuracyPenalty)) { result.coveringGas = gas.def; } } } if (!caster.Position.Roofed(caster.Map) && !target.Cell.Roofed(caster.Map)) { result.factorFromWeather = caster.Map.weatherManager.CurWeatherAccuracyMultiplier; } else { result.factorFromWeather = 1f; } result.factorFromTargetSize = 1f; if (target.HasThing) { Pawn pawn2 = target.Thing as Pawn; if (pawn2 != null) { result.factorFromTargetSize = pawn2.BodySize; } else { result.factorFromTargetSize = target.Thing.def.fillPercent * 1.7f; } result.factorFromTargetSize = Mathf.Clamp(result.factorFromTargetSize, 0.5f, 2f); } result.forcedMissRadius = verb.verbProps.forcedMissRadius; return(result); }