/// <summary>
        /// Returns a string that provides a breakdown of both accuracy and DPS over the full range of the given weapon.
        /// Shooter is optional, and if provided the DPS is adjusted to account for the shooter's shooting accuracy.
        /// </summary>
        /// <returns>A string providing a breakdown of the performance of the given weapon at various ranges.</returns>
        /// <param name="gun">The gun to caluclate a breakdown for.</param>
        /// <param name="shooter">(Optional) The shooter (pawn or turret) using the weapon.</param>
        protected static string DPSRangeBreakdown(RangedWeaponStats gun, Thing shooter = null)
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("StatsReport_RangedDPSAccuracy".Translate());

            // Min Range
            float minRange          = Math.Max(gun.MinRange, 1f);
            float minRangeHitChance = gun.GetAdjustedHitChanceFactor(minRange, shooter);
            float minRangeDps       = gun.GetAdjustedDPS(minRange, shooter);

            stringBuilder.AppendLine(FormatDPSRangeString(minRange, minRangeDps, minRangeHitChance));

            // Ranges between Min - Max, in steps of 5
            float startRange = (float)Math.Ceiling(minRange / 5) * 5;

            for (float range = startRange; range < gun.MaxRange; range += 5)
            {
                float hitChance = gun.GetAdjustedHitChanceFactor(range, shooter);
                float dps       = gun.GetAdjustedDPS(range, shooter);
                stringBuilder.AppendLine(FormatDPSRangeString(range, dps, hitChance));
            }

            // Max Range
            float maxRangeHitChance = gun.GetAdjustedHitChanceFactor(gun.MaxRange, shooter);
            float maxRangeDps       = gun.GetAdjustedDPS(gun.MaxRange, shooter);

            stringBuilder.AppendLine(FormatDPSRangeString(gun.MaxRange, maxRangeDps, maxRangeHitChance));

            return(stringBuilder.ToString());
        }
Exemplo n.º 2
0
        public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true)
        {
            Building_TurretGun turret      = GetTurret(optionalReq);
            RangedWeaponStats  weaponStats = GetTurretStats(optionalReq);

            int optimalRange = (int)weaponStats.FindOptimalRange(turret);

            return(string.Format("{0} ({1})",
                                 value.ToStringByStyle(stat.toStringStyle, numberSense),
                                 string.Format("StatsReport_RangedDPSOptimalRange".Translate(), optimalRange)));
        }
        public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true)
        {
            Pawn pawn = optionalReq.Thing as Pawn;
            RangedWeaponStats weaponStats = GetWeaponStats(GetPawnWeapon(pawn));

            int optimalRange = (int)weaponStats.FindOptimalRange(pawn);

            return(string.Format("{0} ({1})",
                                 value.ToStringByStyle(stat.toStringStyle, numberSense),
                                 string.Format("StatsReport_RangedDPSOptimalRange".Translate(), optimalRange)));
        }
Exemplo n.º 4
0
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {
            if (!ShouldShowFor(req))
            {
                return("");
            }

            Building_TurretGun turret      = GetTurret(req);
            RangedWeaponStats  weaponStats = GetTurretStats(req);

            return(DPSRangeBreakdown(weaponStats, turret));
        }
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {
            if (!ShouldShowFor(req))
            {
                return("");
            }

            Pawn pawn = req.Thing as Pawn;
            RangedWeaponStats weaponStats = GetWeaponStats(GetPawnWeapon(pawn));

            return(DPSRangeBreakdown(weaponStats, pawn));
        }
Exemplo n.º 6
0
        public override float GetValueUnfinalized(StatRequest req, bool applyPostProcess = true)
        {
            if (!ShouldShowFor(req))
            {
                return(0f);
            }

            Building_TurretGun turret      = GetTurret(req);
            RangedWeaponStats  weaponStats = GetTurretStats(req);

            float optimalRange = weaponStats.FindOptimalRange(turret);

            return(weaponStats.GetAdjustedDPS(optimalRange, turret));
        }
        public override float GetValueUnfinalized(StatRequest req, bool applyPostProcess = true)
        {
            if (!ShouldShowFor(req))
            {
                return(0f);
            }

            Pawn pawn = req.Thing as Pawn;
            RangedWeaponStats weaponStats = GetWeaponStats(GetPawnWeapon(pawn));

            float optimalRange = weaponStats.FindOptimalRange(pawn);

            return(weaponStats.GetAdjustedDPS(optimalRange, pawn));
        }
        public override float GetValueUnfinalized(StatRequest req, bool applyPostProcess = true)
        {
            if (!ShouldShowFor(req))
            {
                return(0f);
            }

            RangedWeaponStats weaponStats = GetTurretStats(req);

            float bestAccuracy = new[] {
                weaponStats.AccuracyTouch,
                weaponStats.AccuracyShort,
                weaponStats.AccuracyMedium,
                weaponStats.AccuracyLong
            }.Max();

            return(weaponStats.GetRawDPS() * Math.Min(bestAccuracy, 1f));
        }
        public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true)
        {
            RangedWeaponStats weaponStats = GetTurretStats(optionalReq);

            (float, int)optimalRange = new[] {