Exemple #1
0
        private double refitCost(Design fromDesign, Design toDesign, ShipFormulaSet shipFormulas)
        {
            double cost     = 0;
            var    hullVars = new Var(AComponentType.LevelKey, toDesign.Hull.Level).Get;

            var hullCost = refitComponentCost(fromDesign.Hull, toDesign.Hull, x => x.Cost, null, shipFormulas);

            if (hullCost > 0)
            {
                cost += hullCost;
            }
            else
            {
                hullCost = toDesign.Hull.TypeInfo.Cost.Evaluate(new Var(AComponentType.LevelKey, toDesign.Hull.Level).Get);
                cost    += hullCost * shipFormulas.ArmorCostPortion * refitComponentCost(fromDesign.Armor, toDesign.Armor, x => new Formula(1), null, shipFormulas);
                cost    += hullCost * shipFormulas.ReactorCostPortion * refitComponentCost(fromDesign.Reactor, toDesign.Reactor, x => new Formula(1), null, shipFormulas);
                cost    += hullCost * shipFormulas.SensorCostPortion * refitComponentCost(fromDesign.Sensors, toDesign.Sensors, x => new Formula(1), null, shipFormulas);
                cost    += hullCost * shipFormulas.ThrustersCostPortion * refitComponentCost(fromDesign.Thrusters, toDesign.Thrusters, x => new Formula(1), null, shipFormulas);
            }

            cost += refitComponentCost(fromDesign.IsDrive, toDesign.IsDrive, x => x.Cost, new Var(AComponentType.SizeKey, toDesign.Hull.TypeInfo.SizeIS.Evaluate(hullVars)), shipFormulas);
            cost += refitComponentCost(fromDesign.Shield, toDesign.Shield, x => x.Cost, new Var(AComponentType.SizeKey, toDesign.Hull.TypeInfo.SizeShield.Evaluate(hullVars)), shipFormulas);
            cost += refitComponentCost(fromDesign.MissionEquipment, toDesign.MissionEquipment, x => x.Cost, null, shipFormulas);
            cost += refitComponentCost(fromDesign.SpecialEquipment, toDesign.SpecialEquipment, x => x.Cost, new Var(AComponentType.SizeKey, toDesign.Hull.TypeInfo.Size.Evaluate(hullVars)), shipFormulas);

            return(cost);
        }
Exemple #2
0
        private void calcRefitCosts(Design design, ShipFormulaSet shipFormulas)
        {
            this.RefitCosts.Add(design, new Dictionary <Design, double>());

            var otherDesigns = this.DesignStats.Keys.Where(x => x.Hull.TypeInfo == design.Hull.TypeInfo && x != design).ToList();

            foreach (var otherDesign in otherDesigns)
            {
                this.RefitCosts[design].Add(otherDesign, refitCost(design, otherDesign, shipFormulas));
                this.RefitCosts[otherDesign].Add(design, refitCost(otherDesign, design, shipFormulas));
            }
        }
Exemple #3
0
        private double refitComponentCost <T>(List <Component <T> > fromComponents, List <Component <T> > toComponents, Func <T, Formula> costFormula, Var extraVars, ShipFormulaSet shipFormulas) where T : AComponentType
        {
            double cost = 0;

            var oldEquipment = fromComponents.
                               GroupBy(x => x).
                               ToDictionary(
                x => x.Key.TypeInfo,
                x => new Component <T>(x.Key.TypeInfo, x.Key.Level, x.Sum(y => y.Quantity))
                );

            foreach (var equip in toComponents)
            {
                var similarQuantity = 0;
                var oldEquip        = oldEquipment.ContainsKey(equip.TypeInfo) ? oldEquipment[equip.TypeInfo] : null;

                if (oldEquip != null)
                {
                    similarQuantity = Math.Min(oldEquip.Quantity, equip.Quantity);

                    if (similarQuantity < oldEquip.Quantity)
                    {
                        oldEquipment[equip.TypeInfo] = new Component <T>(equip.TypeInfo, oldEquip.Level, oldEquip.Quantity - similarQuantity);
                    }
                    else
                    {
                        oldEquipment.Remove(equip.TypeInfo);
                    }
                }

                cost += similarQuantity * refitComponentCost(oldEquip, equip, costFormula, extraVars, shipFormulas);
                cost += (equip.Quantity - similarQuantity) * refitComponentCost(null, equip, costFormula, extraVars, shipFormulas);
            }

            return(cost);
        }
Exemple #4
0
        private double refitComponentCost <T>(Component <T> fromComponent, Component <T> toComponent, Func <T, Formula> costFormula, Var extraVars, ShipFormulaSet shipFormulas) where T : AComponentType
        {
            if (toComponent == null)
            {
                return(0);
            }

            if (extraVars == null)
            {
                extraVars = new Var();
            }
            var fullCost = costFormula(toComponent.TypeInfo).Evaluate(new Var(AComponentType.LevelKey, toComponent.Level).UnionWith(extraVars.Get).Get);

            if (fromComponent == null || fromComponent.TypeInfo != toComponent.TypeInfo)
            {
                return(fullCost);
            }

            if (fromComponent.Level < toComponent.Level)
            {
                return(fullCost * shipFormulas.LevelRefitCost.Evaluate(new Var(AComponentType.LevelKey, toComponent.Level - fromComponent.Level).Get));
            }

            //refit from higher to lower or the same level is free
            return(0);
        }
Exemple #5
0
        private static double calculateCost(Design design, IDictionary <string, double> shipVars, ShipFormulaSet formulas)
        {
            var    hullVars = new Var(AComponentType.LevelKey, design.Hull.Level).Get;
            double hullCost = design.Hull.TypeInfo.Cost.Evaluate(hullVars);
            double hullSize = design.Hull.TypeInfo.SpaceFree.Evaluate(hullVars);

            double isDriveCost = design.IsDrive == null ? 0 :
                                 design.IsDrive.TypeInfo.Cost.Evaluate(
                new Var(AComponentType.LevelKey, design.IsDrive.Level).
                And(IsDriveType.SizeKey, formulas.IsDriveSize.Evaluate(shipVars)).Get
                );

            double shieldCost = design.Shield == null ? 0 :
                                design.Shield.TypeInfo.Cost.Evaluate(
                new Var(AComponentType.LevelKey, design.Shield.Level).
                And(ShieldType.SizeKey, formulas.ShieldSize.Evaluate(shipVars)).Get
                );

            double weaponsCost = design.MissionEquipment.Sum(
                x => x.Quantity * x.TypeInfo.Cost.Evaluate(
                    new Var(AComponentType.LevelKey, x.Level).Get
                    )
                );

            double specialsCost = design.SpecialEquipment.Sum(
                x => x.Quantity * x.TypeInfo.Cost.Evaluate(
                    new Var(AComponentType.LevelKey, x.Level).
                    And(HullType.SizeKey, hullSize).Get
                    )
                );

            return(hullCost + isDriveCost + shieldCost + weaponsCost + specialsCost);
        }