public static float CostOfSimulation(CelestialBody body, string simulationLength, ShipConstruct ship, int SimCount, bool landed) { if (simulationLength == "" || simulationLength == "-1") simulationLength = "31536000000"; //1000 Earth years CelestialBody Kerbin = Planetarium.fetch.Home; double length = MagiCore.Utilities.ParseTimeString(simulationLength, false); length = Math.Min(length, 31536000000.0); if (length == 0) length = 31536000000.0; if (length < 0) //An error while parsing the value return -1; Dictionary<string, string> vars = new Dictionary<string, string>(); vars.Add("L", length.ToString()); //Sim length in seconds vars.Add("M", body.Mass.ToString()); //Body mass vars.Add("KM", Kerbin.Mass.ToString()); //Kerbin mass vars.Add("A", body.atmosphere ? "1" : "0"); //Presence of atmosphere vars.Add("S", (body != Planetarium.fetch.Sun && body.referenceBody != Planetarium.fetch.Sun) ? "1" : "0"); //Is a moon (satellite) float out1, out2; vars.Add("m", ship.GetTotalMass().ToString()); //Vessel loaded mass vars.Add("C", ship.GetShipCosts(out out1, out out2).ToString()); //Vessel loaded cost vars.Add("s", SimCount.ToString()); //Number of times simulated this editor session CelestialBody Parent = body; if (Parent != Planetarium.fetch.Sun) { while (Parent.referenceBody != Planetarium.fetch.Sun) { Parent = Parent.referenceBody; } } double orbitRatio = 1; if (Parent.orbit != null) { if (Parent.orbit.semiMajorAxis >= Kerbin.orbit.semiMajorAxis) orbitRatio = Parent.orbit.semiMajorAxis / Kerbin.orbit.semiMajorAxis; else orbitRatio = Kerbin.orbit.semiMajorAxis / Parent.orbit.semiMajorAxis; } vars.Add("SMA", orbitRatio.ToString()); vars.Add("PM", Parent.Mass.ToString()); if ((body == Kerbin) && landed) { return (float)(KCT_MathParsing.GetStandardFormulaValue("KerbinSimCost", vars)); } else { return (float)(KCT_MathParsing.GetStandardFormulaValue("SimCost", vars)); } /*float timeMultiplier = 13; if (TimeMultipliers.ContainsKey(simulationLength)) timeMultiplier = TimeMultipliers[simulationLength]; if (orbitBody == Planetarium.fetch.Sun) return 10000 * timeMultiplier; float atmosphereMult = orbitBody.atmosphere ? 1.1f : 1f; bool isMoon = orbitBody.referenceBody != Planetarium.fetch.Sun; CelestialBody Parent = orbitBody; while (Parent.referenceBody != Planetarium.fetch.Sun) { Parent = Parent.referenceBody; } CelestialBody Kerbin = GetBodyByName("Kerbin"); if (Kerbin == null) Kerbin = GetBodyByName("Earth"); double orbitRatio = 1; if (Parent.orbit.semiMajorAxis >= Kerbin.orbit.semiMajorAxis) orbitRatio = Parent.orbit.semiMajorAxis / Kerbin.orbit.semiMajorAxis; else orbitRatio = Kerbin.orbit.semiMajorAxis / Parent.orbit.semiMajorAxis; double cost = Math.Pow(orbitRatio,2) * 500 * (Parent.atmosphere ? 1.1 : 1); if (isMoon) cost *= atmosphereMult * 1.1; cost *= timeMultiplier; return (float)cost;*/ }
void OnVesselLaunched(ShipConstruct vVessel) { if (DebugMode) Debug.Log("KK: OnVesselLaunched"); if (!MiscUtils.CareerStrategyEnabled(HighLogic.CurrentGame)) { return; } else { if (DebugMode) Debug.Log("KK: OnVesselLaunched is Career"); PersistenceUtils.savePersistenceBackup(); string sitename = EditorLogic.fetch.launchSiteName; if (sitename == "Runway") return; if (sitename == "LaunchPad") return; if (sitename == "KSC") return; if (sitename == "") return; LaunchSite lsSite = LaunchSiteManager.getLaunchSiteByName(sitename); float fMissionCount = lsSite.missioncount; lsSite.missioncount = fMissionCount + 1; double dSecs = HighLogic.CurrentGame.UniversalTime; double hours = dSecs / 60.0 / 60.0; double kHours = Math.Floor(hours % 6.0); double kMinutes = Math.Floor((dSecs / 60.0) % 60.0); double kSeconds = Math.Floor(dSecs % 60.0); double kYears = Math.Floor(hours / 2556.5402) + 1; // Kerbin year is 2556.5402 hours double kDays = Math.Floor(hours % 2556.5402 / 6.0) + 1; string sDate = "Y" + kYears.ToString() + " D" + kDays.ToString() + " " + " " + kHours.ToString("00") + ":" + kMinutes.ToString("00") + ":" + kSeconds.ToString("00"); string sCraft = vVessel.shipName; string sWeight = vVessel.GetTotalMass().ToString(); string sLogEntry = lsSite.missionlog + sDate + ", Launched " + sCraft + ", Mass " +sWeight + " t|"; lsSite.missionlog = sLogEntry; List<LaunchSite> sites = LaunchSiteManager.getLaunchSites(); PersistenceFile<LaunchSite>.SaveList(sites, "LAUNCHSITES", "KK"); VesselLaunched = true; float dryCost = 0f; float fuelCost = 0f; float total = vVessel.GetShipCosts(out dryCost, out fuelCost); var cm = CurrencyModifierQuery.RunQuery(TransactionReasons.VesselRollout, total, 0f, 0f); total += cm.GetEffectDelta(Currency.Funds); double launchcost = total; float fRefund = 0f; LaunchSiteManager.getSiteLaunchRefund((string)EditorLogic.fetch.launchSiteName, out fRefund); if (fRefund < 1) return; RefundAmount = (launchcost / 100) * fRefund; VesselCost = launchcost - (RefundAmount); if (fRefund > 0) { string sMessage = "This launch normally costs " + launchcost.ToString("#0") + " but " + sitename + " provides a " + fRefund + "% refund. \n\nSo " + RefundAmount.ToString("#0") + " funds has been credited to you. \n\nEnjoy and thanks for using " + sitename + ". Have a safe flight."; MiscUtils.PostMessage("Launch Refund", sMessage, MessageSystemButton.MessageButtonColor.GREEN, MessageSystemButton.ButtonIcons.ALERT); Funding.Instance.AddFunds(RefundAmount, TransactionReasons.Cheating); } } }