Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }