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); }
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)); } }
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); }
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); }
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); }