Beyond_Beyaan.Equipment.GetCost C# (CSharp) Метод

GetCost() публичный Метод

public GetCost ( int>.Dictionary techLevels, int shipSize ) : float
techLevels int>.Dictionary
shipSize int
Результат float
        public float GetCost(Dictionary<TechField, int> techLevels, int shipSize)
        {
            float initialCost = 0;
            if (Technology.GenericCost == 0) //It uses the ship-specific size cost
            {
                switch (shipSize)
                {
                    case 0:
                        initialCost = UseSecondary ? Technology.SmallSecondaryCost : Technology.SmallCost;
                        break;
                    case 1:
                        initialCost = UseSecondary ? Technology.MediumSecondaryCost : Technology.MediumCost;
                        break;
                    case 2:
                        initialCost = UseSecondary ? Technology.LargeSecondaryCost : Technology.LargeCost;
                        break;
                    case 3:
                        initialCost = UseSecondary ? Technology.HugeSecondaryCost : Technology.HugeCost;
                        break;
                }
            }
            else
            {
                if (Technology.WeaponType == Technology.MISSILE_WEAPON)
                {
                    initialCost = UseSecondary ? Technology.GenericCost * 1.5f : Technology.GenericCost;
                }
                else
                {
                    initialCost = UseSecondary ? Technology.GenericSecondaryCost : Technology.GenericCost;
                }
            }
            int levelDifference = techLevels[Technology.TechField] - Technology.TechLevel;
            if (levelDifference < 0)
            {
                levelDifference = 0;
            }
            else if (levelDifference > 50)
            {
                levelDifference = 50; //Cap the miniaturization at 50 levels
            }
            return (float)(initialCost * (Math.Pow(0.5, (levelDifference / 10.0))));
        }

Usage Example

Пример #1
0
        private void UpdateValues()
        {
            //After researching or obtaining a technology, update all values
            FuelRange = 3;
            RoboticControls = 2;
            IndustryWasteRate = 1.0f;
            IndustryCleanupPerBC = 2;
            MaxTerraformPop = 0;
            TerraformCost = 6;
            CloningCost = 20;
            FactoryCost = 10;
            FactoryDiscount = 10;
            HighestPlanetaryShield = 0;
            Technology bestArmor = null;
            Technology bestBattleComputer = null;
            Technology bestMissile = null;
            Technology bestShield = null;
            Technology bestECM = null;
            int bestScanner = 0;
            foreach (var tech in ResearchedPropulsionTechs)
            {
                if (tech.FuelRange > FuelRange)
                {
                    FuelRange = tech.FuelRange;
                }
            }
            foreach (var tech in ResearchedComputerTechs)
            {
                if (tech.RoboticControl > RoboticControls)
                {
                    RoboticControls = tech.RoboticControl;
                    FactoryCost = RoboticControls * 5;
                }
                if (tech.BattleComputer > 0 && (bestBattleComputer == null || bestBattleComputer.BattleComputer < tech.BattleComputer))
                {
                    bestBattleComputer = tech;
                }
                if (tech.ECM > 0 && (bestECM == null || bestECM.ECM < tech.ECM))
                {
                    bestECM = tech;
                }
                if (tech.SpaceScanner > bestScanner)
                {
                    bestScanner = tech.SpaceScanner;
                }
            }
            switch (bestScanner)
            {
                case 0:
                    FleetRadarRange = 0;
                    PlanetRadarRange = 3;
                    ShowEnemyETA = false;
                    RadarExplorePlanets = false;
                    break;
                case Technology.DEEP_SPACE_SCANNER:
                    FleetRadarRange = 1;
                    PlanetRadarRange = 5;
                    ShowEnemyETA = false;
                    RadarExplorePlanets = false;
                    break;
                case Technology.IMPROVED_SPACE_SCANNER:
                    FleetRadarRange = 2;
                    PlanetRadarRange = 7;
                    ShowEnemyETA = true;
                    RadarExplorePlanets = false;
                    break;
                case Technology.ADVANCED_SPACE_SCANNER:
                    FleetRadarRange = 3;
                    PlanetRadarRange = 9;
                    ShowEnemyETA = true;
                    RadarExplorePlanets = true;
                    break;
            }
            foreach (var tech in ResearchedConstructionTechs)
            {
                if (tech.IndustrialWaste / 100.0f < IndustryWasteRate)
                {
                    IndustryWasteRate = tech.IndustrialWaste / 100.0f;
                }
                if (tech.IndustrialTech < FactoryDiscount)
                {
                    FactoryDiscount = tech.IndustrialTech;
                }
                if (tech.Armor > 0 && (bestArmor == null || bestArmor.Armor < tech.Armor))
                {
                    bestArmor = tech;
                }
            }
            foreach (var tech in ResearchedForceFieldTechs)
            {
                if (tech.PlanetaryShield > HighestPlanetaryShield)
                {
                    HighestPlanetaryShield = tech.PlanetaryShield;
                }
                if (tech.Shield > 0 && (bestShield == null || bestShield.Shield < tech.Shield))
                {
                    bestShield = tech;
                }
            }
            //Convert FactoryDiscount to a decimal for less math later on
            FactoryDiscount *= 0.1f;
            foreach (var tech in ResearchedPlanetologyTechs)
            {
                if (tech.EcoCleanup > IndustryCleanupPerBC)
                {
                    IndustryCleanupPerBC = tech.EcoCleanup;
                }
                if (tech.Enrichment == Technology.SOIL_ENRICHMENT)
                {
                    HasSoilEnrichment = true;
                }
                if (tech.Enrichment == Technology.ADV_SOIL_ENRICHMENT)
                {
                    HasAdvancedSoilEnrichment = true;
                }
                if (tech.Enrichment == Technology.ATMOSPHERIC_TERRAFORMING)
                {
                    HasAtmosphericTerraform = true;
                }
                if (tech.Terraforming > MaxTerraformPop)
                {
                    MaxTerraformPop = tech.Terraforming;
                }
                if (tech.TerraformCost < TerraformCost)
                {
                    TerraformCost = tech.TerraformCost;
                }
                if (tech.Cloning < CloningCost)
                {
                    CloningCost = tech.Cloning;
                }
            }

            foreach (var tech in ResearchedWeaponTechs)
            {
                if (tech.WeaponType == Technology.MISSILE_WEAPON && (bestMissile == null || bestMissile.MaximumWeaponDamage < tech.MaximumWeaponDamage))
                {
                    bestMissile = tech;
                }
            }

            //Now add up the cost for missile base this turn
            /* Missile base cost is broken down as following:
             * Battle Scanner and Subspace Interdictor are free
             * Armor = 60% of Large Ship Cost, 1/2 HP of Large Ship HP
             * Missiles = 540% of base cost, 3 missiles fired per base, +1 speed and double range
             * Shields = 61% of Large Ship Cost
             * Battle Computers = 61% of Large Ship Cost
             * ECM = 62% of Large Ship Cost
             * Base Slab (Construction Tech Level 1) = 120 BC
             * */

            Dictionary<TechField, int> techLevels = new Dictionary<TechField, int>();
            techLevels.Add(TechField.FORCE_FIELD, ForceFieldLevel);
            techLevels.Add(TechField.WEAPON, WeaponLevel);
            techLevels.Add(TechField.PROPULSION, PropulsionLevel);
            techLevels.Add(TechField.COMPUTER, ComputerLevel);
            techLevels.Add(TechField.CONSTRUCTION, ConstructionLevel);
            techLevels.Add(TechField.PLANETOLOGY, PlanetologyLevel);

            //Factor in Slab's base price of 120, minus minizaturation
            int levelDifference = ConstructionLevel;
            if (levelDifference > 50)
            {
                levelDifference = 50; //Cap the miniaturization at 50 levels
            }
            MissileBaseCost = (float)(120 * (Math.Pow(0.5, (levelDifference / 10.0))));
            if (bestArmor != null)
            {
                var armor = new Equipment(bestArmor, false);
                MissileBaseCost += armor.GetCost(techLevels, 2) * 0.6f;
            }
            if (bestMissile != null)
            {
                var missile = new Equipment(bestMissile, false);
                MissileBaseCost += missile.GetCost(techLevels, 2) * 5.4f;
            }
            if (bestBattleComputer != null)
            {
                var battleComputer = new Equipment(bestBattleComputer, false);
                MissileBaseCost += battleComputer.GetCost(techLevels, 2) * 0.61f;
            }
            if (bestECM != null)
            {
                var ecm = new Equipment(bestECM, false);
                MissileBaseCost += ecm.GetCost(techLevels, 2) * 0.62f;
            }
            MissileBaseCostInNebula = MissileBaseCost; //Since shields don't work in nebulaes, doesn't make sense to build shields
            if (bestShield != null)
            {
                var shield = new Equipment(bestShield, false);
                MissileBaseCost += shield.GetCost(techLevels, 2) * 0.61f;
            }
        }