public void TestDateTime() { KSPDateTime dt2 = new KSPDateTime(235, 1); Double DateUT = 301.123; KSPDateTime dt = new KSPDateTime(DateUT); Assert.AreEqual(5, dt.Minute); Assert.AreEqual(1, dt.Second); Assert.AreEqual(123, dt.Millisecond); Assert.AreEqual(0, dt.Hour); Assert.AreEqual(1, dt.DayOfYear); Assert.AreEqual(1, dt.Year); dt = dt.AddMilliSeconds(456); Assert.AreEqual(5, dt.Minute); Assert.AreEqual(1, dt.Second); Assert.AreEqual(579, dt.Millisecond); dt = new KSPDateTime(2, 50, 0, 6, 8,456); Assert.AreEqual(6, dt.Minute); Assert.AreEqual(8, dt.Second); Assert.AreEqual(456, dt.Millisecond); Assert.AreEqual(2, dt.Year,"Hello"); Assert.AreEqual(50, dt.DayOfYear); }
/// <summary>Compares two KSPPluginFramework.KSPDateTime values and returns an integer that indicates whether the first value is shorter than, equal to, or longer than the second value.</summary> /// <param name="t1">A KSPPluginFramework.KSPDateTime.</param> /// <param name="t2">A KSPPluginFramework.KSPDateTime.</param> /// <returns>Value Condition -1 t1 is shorter than t20 t1 is equal to t21 t1 is longer than t2</returns> public static Int32 Compare(KSPDateTime t1, KSPDateTime t2) { if (t1.UT < t2.UT) { return(-1); } else if (t1.UT > t2.UT) { return(1); } else { return(0); } }
private void SetWindowStrings() { //KSPDateTime kTime = new KSPDateTime(DepartureMin); //strDepartureMinYear = (kTime.Year ).ToString(); //strDepartureMinDay = (kTime.Day).ToString(); //kTime.UT = DepartureMax; //strDepartureMaxYear = (kTime.Year).ToString(); //strDepartureMaxDay = (kTime.Day).ToString(); dateMinDeparture = new KSPDateTime(DepartureMin); dateMaxDeparture = new KSPDateTime(DepartureMax); KSPTimeSpan kSpan = new KSPTimeSpan(0); kSpan.UT = TravelMin; strTravelMinDays = ((Int32)kSpan.TotalDays).ToString(); kSpan.UT = TravelMax; strTravelMaxDays = ((Int32)kSpan.TotalDays).ToString(); strArrivalAltitude = (InitialOrbitAltitude / 1000).ToString(); strDepartureAltitude = (FinalOrbitAltitude / 1000).ToString(); }
public void TestEarthDateTime() { KSPDateStructure.SetEarthCalendar(); Double DateUT = 301.123; KSPDateTime dt = new KSPDateTime(DateUT); //Console.Write(dt.Day); Assert.AreEqual(5, dt.Minute); Assert.AreEqual(1, dt.Second); Assert.AreEqual(123, dt.Millisecond); Assert.AreEqual(0, dt.Hour); Assert.AreEqual(1, dt.DayOfYear); Assert.AreEqual(1951, dt.Year); dt = dt.AddMilliSeconds(456); Assert.AreEqual(5, dt.Minute); Assert.AreEqual(1, dt.Second); Assert.AreEqual(579, dt.Millisecond); //dt.Second = 68; //Assert.AreEqual(6, dt.Minute); //Assert.AreEqual(8, dt.Second); //Assert.AreEqual(456, dt.Millisecond); //dt.Year = 1969; //Assert.AreEqual(1969, dt.Year, "Hello"); //dt.DayOfYear = 50; //Assert.AreEqual(50, dt.DayOfYear); //KSPDateTimeStructure.SetCalendarTypeEarth(1951,1,1); //dt = new KSPDateTime(1951, 50, 10, 20, 30); //Assert.AreEqual(2, dt.Month); //Assert.AreEqual(19, dt.Day); }
//private void GlobalSOICatchAll(double SecondsTillNextUpdate) //{ // foreach (Vessel tmpVessel in FlightGlobals.Vessels) // { // //only track vessels, not debris, EVA, etc // //and not the current vessel // //and no SOI alarm for it within the threshold - THIS BIT NEEDS TUNING // if (settings.VesselTypesForSOI.Contains(tmpVessel.vesselType) && (tmpVessel!=KACWorkerGameState.CurrentVessel) && // (alarms.FirstOrDefault(a => // (a.VesselID == tmpVessel.id.ToString() && // (a.TypeOfAlarm == KACAlarm.AlarmType.SOIChange) && // (Math.Abs(a.Remaining.UT) < SecondsTillNextUpdate + settings.AlarmAddSOIAutoThreshold) // )) == null) // ) // { // if (lstVessels.ContainsKey(tmpVessel.id.ToString()) == false) // { // //Add new Vessels // LogFormatted(String.Format("Adding {0}-{1}-{2}-{3}", tmpVessel.id, tmpVessel.vesselName, tmpVessel.vesselType, tmpVessel.mainBody.bodyName)); // lstVessels.Add(tmpVessel.id.ToString(), new KACVesselSOI(tmpVessel.vesselName, tmpVessel.mainBody.bodyName)); // } // else // { // //get this vessel from the memory array we are keeping and compare to its SOI // if (lstVessels[tmpVessel.id.ToString()].SOIName != tmpVessel.mainBody.bodyName) // { // //Set a new alarm to display now // KACAlarm newAlarm = new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), tmpVessel.vesselName + "- SOI Catch", // tmpVessel.vesselName + " Has entered a new Sphere of Influence\r\n" + // " Old SOI: " + lstVessels[tmpVessel.id.ToString()].SOIName + "\r\n" + // " New SOI: " + tmpVessel.mainBody.bodyName, // KACWorkerGameState.CurrentTime.UT, 0, KACAlarm.AlarmType.SOIChange, // settings.AlarmOnSOIChange_Action ); // alarms.Add(newAlarm); // LogFormatted("Triggering SOI Alarm - " + newAlarm.Name); // newAlarm.Triggered = true; // newAlarm.Actioned = true; // if (settings.AlarmOnSOIChange_Action == KACAlarm.AlarmActionEnum.PauseGame) // { // LogFormatted(String.Format("{0}-Pausing Game", newAlarm.Name)); // TimeWarp.SetRate(0, true); // FlightDriver.SetPause(true); // } // else if (settings.AlarmOnSOIChange_Action != KACAlarm.AlarmActionEnum.MessageOnly) // { // LogFormatted(String.Format("{0}-Halt Warp", newAlarm.Name)); // TimeWarp.SetRate(0, true); // } // //reset the name String for next check // lstVessels[tmpVessel.id.ToString()].SOIName = tmpVessel.mainBody.bodyName; // } // } // } // } //} private void MonitorManNodeOnPath() { //is there an alarm KACAlarm tmpAlarm = alarms.FirstOrDefault(a => a.TypeOfAlarm == KACAlarm.AlarmTypeEnum.ManeuverAuto && a.VesselID == KACWorkerGameState.CurrentVessel.id.ToString()); //is there an alarm and no man node? if (KACWorkerGameState.ManeuverNodeExists && (KACWorkerGameState.ManeuverNodeFuture != null)) { KSPDateTime nodeAutoAlarm; nodeAutoAlarm = new KSPDateTime(KACWorkerGameState.ManeuverNodeFuture.UT - settings.AlarmAddManAutoMargin - GetBurnMarginSecs(settings.DefaultKERMargin)); List<ManeuverNode> manNodesToStore = KACWorkerGameState.ManeuverNodesFuture; String strManNodeAlarmName = KACWorkerGameState.CurrentVessel.vesselName; String strManNodeAlarmNotes = "Time to pay attention to\r\n " + KACWorkerGameState.CurrentVessel.vesselName + "\r\nNearing Maneuver Node"; //Are we updating an alarm if (tmpAlarm != null) { //update the margin tmpAlarm.AlarmMarginSecs = settings.AlarmAddManAutoMargin + GetBurnMarginSecs(settings.DefaultKERMargin); //and the UT tmpAlarm.AlarmTime.UT = new KSPDateTime(KACWorkerGameState.ManeuverNodeFuture.UT - tmpAlarm.AlarmMarginSecs).UT; tmpAlarm.ManNodes = manNodesToStore; } else { //dont add an alarm if we are within the threshold period if (nodeAutoAlarm.UT + settings.AlarmAddManAutoMargin - settings.AlarmAddManAutoThreshold > KACWorkerGameState.CurrentTime.UT) { //or are we setting a new one alarms.Add(new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strManNodeAlarmName, strManNodeAlarmNotes, nodeAutoAlarm.UT, settings.AlarmAddManAutoMargin + GetBurnMarginSecs(settings.DefaultKERMargin), KACAlarm.AlarmTypeEnum.ManeuverAuto, settings.AlarmAddManAuto_Action , manNodesToStore)); //settings.Save(); } } } else if (tmpAlarm!=null && settings.AlarmAddManAuto_andRemove && !KACWorkerGameState.ManeuverNodeExists) { alarms.Remove(tmpAlarm); } }
internal static Boolean DrawYearDay(ref KSPDateTime dateToDraw) { String strYear = dateToDraw.Year.ToString(); String strMonth = dateToDraw.Month.ToString(); String strDay = dateToDraw.Day.ToString(); //If the value changed Boolean blnReturn = false; if (KSPDateStructure.CalendarType==CalendarTypeEnum.Earth) { blnReturn = DrawYearMonthDay(ref strYear, ref strMonth, ref strDay); if (blnReturn) { dateToDraw = KSPDateTime.FromEarthValues(strYear, strMonth, strDay); } } else { blnReturn = DrawYearDay(ref strYear, ref strDay); if (blnReturn) { dateToDraw = new KSPDateTime(strYear, strDay); } } return blnReturn; }
/// <summary>Compares this instance to a specified KSPPluginFramework.KSPDateTime object and returns an integer that indicates whether this instance is shorter than, equal to, or longer than the KSPPluginFramework.KSPDateTime object.</summary> /// <param name="value">A KSPPluginFramework.KSPDateTime object to compare to this instance.</param> /// <returns>A signed number indicating the relative values of this instance and value.Value Description A negative integer This instance is shorter than value. Zero This instance is equal to value. A positive integer This instance is longer than value.</returns> public Int32 CompareTo(KSPDateTime value) { return(KSPDateTime.Compare(this, value)); }
/// <summary>Returns a value indicating whether two specified instances of KSPPluginFramework.KSPDateTime are equal.</summary> /// <param name="t1">A KSPPluginFramework.KSPDateTime.</param> /// <param name="t2">A DateTime.</param> /// <returns>true if the values of t1 and t2 are equal; otherwise, false.</returns> public static Boolean Equals(KSPDateTime t1, KSPDateTime t2) { return t1.UT == t2.UT; }
//public KSPDateTime() //{ // UT = 0; //} /// <summary>Initializes a new instance of the System.DateTime structure to the specified year and day.</summary> /// <param name="year">The year</param> /// <param name="dayofyear">The day of the year</param> public KSPDateTime(int year, int dayofyear) { UT = new KSPDateTime(year, dayofyear, 0, 0, 0).UT; }
/// <summary>Compares this instance to a specified KSPPluginFramework.KSPDateTime object and returns an integer that indicates whether this instance is shorter than, equal to, or longer than the KSPPluginFramework.KSPDateTime object.</summary> /// <param name="value">A KSPPluginFramework.KSPDateTime object to compare to this instance.</param> /// <returns>A signed number indicating the relative values of this instance and value.Value Description A negative integer This instance is shorter than value. Zero This instance is equal to value. A positive integer This instance is longer than value.</returns> public Int32 CompareTo(KSPDateTime value) { return KSPDateTime.Compare(this, value); }
////Variables for Node Alarms screen ////String strNodeMargin = "1"; ///// <summary> ///// Screen Layout for adding Alarm from Maneuver Node ///// </summary> private void WindowLayout_AddPane_Maneuver() { if (HighLogic.LoadedScene == GameScenes.FLIGHT && (KERWrapper.APIReady || VOIDWrapper.APIReady)) { intHeight_AddWindowKER = 73; if (KACWorkerGameState.CurrentVessel == null) { GUILayout.Label("No Active Vessel"); } else { if (!KACWorkerGameState.ManeuverNodeExists) { GUILayout.Label("No Maneuver Nodes Found", GUILayout.ExpandWidth(true)); } else { if (KERWrapper.APIReady) { KERWrapper.KER.UpdateManNodeValues(); GUILayout.Label("Kerbal Engineer Node Margin", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Add KER Burn Time: ", KACResources.styleAddHeading); ddlKERNodeMargin.DrawButton(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Enough Δv:", KACResources.styleAddHeading); GUILayout.Label(KERWrapper.KER.HasDeltaV.ToString(), KACResources.styleAddXferName); GUILayout.Label(" Burn:", KACResources.styleAddHeading); GUILayout.Label(String.Format("{0:0.0}s", KERWrapper.KER.BurnTime), KACResources.styleAddXferName); GUILayout.Label(" ½ Burn:", KACResources.styleAddHeading); GUILayout.Label(String.Format("{0:0.0}s", KERWrapper.KER.HalfBurnTime), KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.EndVertical(); } else if (VOIDWrapper.APIReady) { GUILayout.Label("VOID Node Margin", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Add VOID Burn Time: ", KACResources.styleAddHeading); ddlKERNodeMargin.DrawButton(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Enough Δv:", KACResources.styleAddHeading); GUILayout.Label(VOIDWrapper.VOID.HasDeltaV.ToString(), KACResources.styleAddXferName); GUILayout.Label(" Burn:", KACResources.styleAddHeading); GUILayout.Label(String.Format("{0:0.0}s", VOIDWrapper.VOID.BurnTime), KACResources.styleAddXferName); GUILayout.Label(" ½ Burn:", KACResources.styleAddHeading); GUILayout.Label(String.Format("{0:0.0}s", VOIDWrapper.VOID.HalfBurnTime), KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.EndVertical(); } } } } else { intHeight_AddWindowKER = 0; } GUILayout.BeginVertical(); GUILayout.Label("Node Details...", KACResources.styleAddSectionHeading); if (KACWorkerGameState.CurrentVessel == null) { GUILayout.Label("No Active Vessel"); } else { if (!KACWorkerGameState.ManeuverNodeExists) { GUILayout.Label("No Maneuver Nodes Found", GUILayout.ExpandWidth(true)); } else { Boolean blnFoundNode = false; String strMarginConversion = ""; //loop to find the first future node for (int intNode = 0; (intNode < KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes.Count) && !blnFoundNode; intNode++) { KSPDateTime nodeTime = new KSPDateTime(KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes[intNode].UT); KSPTimeSpan nodeInterval = new KSPTimeSpan(nodeTime.UT - KACWorkerGameState.CurrentTime.UT); KSPDateTime nodeAlarm; KSPTimeSpan nodeAlarmInterval; Double KERMarginAdd = GetBurnMarginSecs((Settings.BurnMarginEnum)ddlKERNodeMargin.SelectedIndex); try { nodeAlarm = new KSPDateTime(nodeTime.UT - timeMargin.UT - KERMarginAdd); nodeAlarmInterval = new KSPTimeSpan(nodeTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT - KERMarginAdd); } catch (Exception) { nodeAlarm = null; nodeAlarmInterval = null; strMarginConversion = "Unable to Add the Margin Minutes"; } if ((nodeTime.UT > KACWorkerGameState.CurrentTime.UT) && strMarginConversion == "") { if (DrawAddAlarm(nodeTime,nodeInterval,nodeAlarmInterval)) { //Get a list of all future Maneuver Nodes - thats what the skip does List<ManeuverNode> manNodesToStore = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes.Skip(intNode).ToList<ManeuverNode>(); alarms.Add(new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, nodeAlarm.UT, timeMargin.UT + KERMarginAdd, KACAlarm.AlarmTypeEnum.Maneuver, AddActions, manNodesToStore)); //settings.Save(); _ShowAddPane = false; } blnFoundNode = true; } } if (strMarginConversion != "") GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); else if (!blnFoundNode) GUILayout.Label("No Future Maneuver Nodes Found", GUILayout.ExpandWidth(true)); } } GUILayout.EndVertical(); }
private void WindowLayout_AddPane_ClosestApproach() { GUILayout.BeginVertical(); GUILayout.Label(strAlarmEventName + " Details...", KACResources.styleAddSectionHeading); if (KACWorkerGameState.CurrentVessel == null) GUILayout.Label("No Active Vessel"); else { if (!(KACWorkerGameState.CurrentVesselTarget is Vessel) && !(KACWorkerGameState.CurrentVesselTarget is ModuleDockingNode)) { GUILayout.Label("No valid Vessel Target Selected", GUILayout.ExpandWidth(true)); } else { //GUILayout.Label("Adjust Lookahead amounts...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Orbits to Search:", KACResources.styleAddHeading, GUILayout.Width(110)); GUILayout.Label(((int)Math.Round((Decimal)fltOrbits, 0)).ToString(), KACResources.styleAddXferName, GUILayout.Width(25)); fltOrbits = GUILayout.HorizontalSlider(fltOrbits, 1, 20); fltOrbits = (float)Math.Floor((Decimal)fltOrbits); GUILayout.EndHorizontal(); intOrbits = (int)fltOrbits; int intClosestOrbitPass = 0; double dblClosestDistance = Double.MaxValue; double dblClosestUT = 0; double dblOrbitTestClosest = Double.MaxValue; double dblOrbitTestClosestUT = 0; for (int intOrbitToTest = 1; intOrbitToTest <= intOrbits; intOrbitToTest++) { dblOrbitTestClosestUT = KACUtils.timeOfClosestApproach(KACWorkerGameState.CurrentVessel.orbit, KACWorkerGameState.CurrentVesselTarget.GetOrbit(), KACWorkerGameState.CurrentTime.UT, intOrbitToTest, out dblOrbitTestClosest ); if (dblOrbitTestClosest < dblClosestDistance) { dblClosestDistance = dblOrbitTestClosest; dblClosestUT = dblOrbitTestClosestUT; intClosestOrbitPass = intOrbitToTest; } } GUILayout.BeginHorizontal(); GUILayout.Label("Distance:", KACResources.styleAddHeading, GUILayout.Width(70)); String strDistance = string.Format("{0:#}m", dblClosestDistance); if (dblClosestDistance > 999) strDistance = string.Format("{0:#.0}km", dblClosestDistance / 1000); GUILayout.Label(strDistance, KACResources.styleAddXferName, GUILayout.Width(90)); GUILayout.Label("On Orbit:", KACResources.styleAddHeading); GUILayout.Label(intClosestOrbitPass.ToString(), KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.EndVertical(); String strMarginConversion = ""; KSPDateTime eventTime = new KSPDateTime(dblClosestUT); KSPTimeSpan eventInterval = new KSPTimeSpan(dblClosestUT - KACWorkerGameState.CurrentTime.UT); KSPDateTime eventAlarm; KSPTimeSpan eventAlarmInterval; try { eventAlarm = new KSPDateTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KSPTimeSpan(eventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT); } catch (Exception) { eventAlarm = null; eventAlarmInterval = null; strMarginConversion = "Unable to Add the Margin Minutes"; } if ((eventTime.UT > KACWorkerGameState.CurrentTime.UT) && strMarginConversion == "") { if (DrawAddAlarm(eventTime, eventInterval, eventAlarmInterval)) { KACAlarm newAlarm = new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, eventAlarm.UT, timeMargin.UT, AddType, AddActions); newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; newAlarm.ManNodes = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes; alarms.Add(newAlarm); //settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Future Closest Approach found"; } if (strMarginConversion != "") GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); } } GUILayout.EndVertical(); }
/// <summary>Initializes a new instance of the System.DateTime structure to the specified year, day, hour, minute, and second.</summary> /// <param name="year">The year</param> /// <param name="day">The day of the year</param> /// <param name="hour">The hour</param> /// <param name="minute">The minute</param> /// <param name="second">The second</param> public KSPDateTime(int year, int day, int hour, int minute, int second) { UT = new KSPDateTime(year, day, hour, minute, second, 0).UT; }
private void StartLongWorker() { if (CurrentPlot >= lstPlots.Count) { LogFormatted("No more plots to run"); Running = false; Done = true; return; } LogFormatted("Setting up plot:{0}", CurrentPlot); ddlOrigin.SelectedIndex = lstPlots[CurrentPlot].Source; SetupDestinationControls(); ddlDestination.SelectedIndex = lstPlots[CurrentPlot].Destination; SetupTransferParams(); strArrivalAltitude = "0"; strDepartureAltitude = "0"; dateMinDeparture = new KSPDateTime(lstPlots[CurrentPlot].DepMinYear, 1,3,0,0,0); dateMaxDeparture = new KSPDateTime(lstPlots[CurrentPlot].DepMaxYear, 1,3,0,0,0).AddDays(-1); strTravelMinDays = lstPlots[CurrentPlot].TravelMin; strTravelMaxDays = lstPlots[CurrentPlot].TravelMax; Double TravelRange = (new KSPTimeSpan(strTravelMaxDays, "0", "0", "0") - new KSPTimeSpan(strTravelMinDays, "0", "0", "0")).UT; Double DepartureRange = (dateMaxDeparture - dateMinDeparture).UT; PlotWidth = (Int32)(DepartureRange / KSPDateStructure.SecondsPerDay * mbTWP.windowDebug.intPlotDeparturePerDay) + 1; PlotHeight = (Int32)(TravelRange / KSPDateStructure.SecondsPerDay * mbTWP.windowDebug.intPlotTravelPointsPerDay) + 1; LogFormatted("Starting a LongWorker: {0}->{1}, Depart:Year {2}=>Year {3}, Travel:{4}=>{5}", cbOrigin.bodyName, cbDestination.bodyName, lstPlots[CurrentPlot].DepMinYear, lstPlots[CurrentPlot].DepMaxYear, lstPlots[CurrentPlot].TravelMin, lstPlots[CurrentPlot].TravelMax); SetWorkerVariables(); workingpercent = 0; Running = true; Done = false; bw = new BackgroundWorker(); bw.DoWork += bw_GenerateDataPorkchop; bw.RunWorkerCompleted += bw_GenerateDataPorkchopCompleted; bw.RunWorkerAsync(); }
/// <summary>Initializes a new instance of the System.DateTime structure to the specified year, day, hour, minute, and second.</summary> /// <param name="year">The year</param> /// <param name="dayofyear">The day of the year</param> /// <param name="hour">The hour</param> /// <param name="minute">The minute</param> /// <param name="second">The second</param> public KSPDateTime(String year, String day, String hour, String minute, String second) { UT = new KSPDateTime(Convert.ToInt32(year), Convert.ToInt32(day), Convert.ToInt32(hour), Convert.ToInt32(minute), Convert.ToInt32(second), 0).UT; }
/// <summary>Subtracts the specified date and time from this instance.</summary> /// <param name="value">An instance of System.DateTime.</param> /// <returns>A System.DateTime equal to the date and time represented by this instance minus the date and time represented by value.</returns> public KSPDateTime Subtract(KSPDateTime value) { return new KSPDateTime(UT - value.UT); }
/// <summary>Returns a value indicating whether this instance is equal to a specified KSPPluginFramework.KSPDateTime object.</summary> /// <param name="value">An KSPPluginFramework.KSPDateTime object to compare with this instance.</param> /// <returns>true if obj represents the same time interval as this instance; otherwise, false.</returns> public Boolean Equals(KSPDateTime value) { return KSPDateTime.Equals(this, value); }
/// <summary>Compares two KSPPluginFramework.KSPDateTime values and returns an integer that indicates whether the first value is shorter than, equal to, or longer than the second value.</summary> /// <param name="t1">A KSPPluginFramework.KSPDateTime.</param> /// <param name="t2">A KSPPluginFramework.KSPDateTime.</param> /// <returns>Value Condition -1 t1 is shorter than t20 t1 is equal to t21 t1 is longer than t2</returns> public static Int32 Compare(KSPDateTime t1, KSPDateTime t2) { if (t1.UT < t2.UT) return -1; else if (t1.UT > t2.UT) return 1; else return 0; }
public void TestMonths() { KSPDateStructure.SetCustomCalendar(); //empty months structure KSPDateTime dt = new KSPDateTime(1, 100); Assert.AreEqual(0, dt.Month); Assert.AreEqual(100, dt.Day); //set up some months KSPDateStructure.Months.Add(new KSPMonth("Billtember", 200)); KSPDateStructure.Months.Add(new KSPMonth("Jebuary", 265)); Assert.AreEqual(1, dt.Month); Assert.AreEqual(100, dt.Day); dt = dt.AddDays(100); Assert.AreEqual(1, dt.Month); Assert.AreEqual(200, dt.Day); dt = dt.AddDays(100); Assert.AreEqual(2, dt.Month); dt = dt.AddDays(100); }
private void WindowLayout_AddPane_TargetDistance() { intAddDistanceHeight = 262;// 272; GUILayout.BeginVertical(); GUILayout.Label(strAlarmEventName + " Details...", KACResources.styleAddSectionHeading); //What are the possible targets?? List<ITargetable> iTargets = new List<ITargetable>(); if (!(KACWorkerGameState.CurrentVesselTarget == null)) { iTargets.Add(KACWorkerGameState.CurrentVesselTarget); //VesselTarget } iTargets.Add(KACWorkerGameState.CurrentVessel.mainBody); //Body we are orbiting if (KACWorkerGameState.SOIPointExists) { iTargets.Add(KACWorkerGameState.CurrentVessel.orbit.nextPatch.referenceBody); //Body we will orbit next } if (intSelectediTarget > iTargets.Count - 1) intSelectediTarget = 0; intAddDistanceHeight += (iTargets.Count*30); //Now give the user the choice GUILayout.BeginHorizontal(); GUILayout.Label("Select Target:",KACResources.styleAddXferName); if (DrawRadioListVertical(ref intSelectediTarget, iTargets.Select(x => x.GetName()).ToArray())) { LogFormatted("Distance Target is:{0}", iTargets[intSelectediTarget].GetName()); } GUILayout.EndHorizontal(); //Set the tgt Object tgtSelectedDistance=iTargets[intSelectediTarget]; string strDistanceName = "Distance"; if (tgtSelectedDistance is CelestialBody) strDistanceName = "Altitude"; //Ask for the target distance/altitude GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Target {0} (m):",strDistanceName), KACResources.styleAddXferName); dblTargetDistance = Convert.ToDouble(GUILayout.TextField(dblTargetDistance.ToString(),KACResources.styleAddField)); GUILayout.EndHorizontal(); //If the body has an atmosphere then add an option to set the Altitude straight to that if (tgtSelectedDistance is CelestialBody) { if ((tgtSelectedDistance as CelestialBody).atmosphere) { GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Atmosphere: {0}", (tgtSelectedDistance as CelestialBody).atmosphereDepth)); if (GUILayout.Button("Set to Edge")) { dblTargetDistance = (tgtSelectedDistance as CelestialBody).atmosphereDepth; } GUILayout.EndHorizontal(); intAddDistanceHeight += 26; } } //For a vessel give some options for orbits to look forwards GUILayout.BeginVertical(KACResources.styleAddFieldAreas); if (!(tgtSelectedDistance is CelestialBody)) { GUILayout.BeginHorizontal(); GUILayout.Label("Orbits to Search:", KACResources.styleAddHeading, GUILayout.Width(110)); GUILayout.Label(((int)Math.Round((Decimal)fltOrbits_Distance, 0)).ToString(), KACResources.styleAddXferName, GUILayout.Width(25)); fltOrbits_Distance = GUILayout.HorizontalSlider(fltOrbits_Distance, 1, 20); fltOrbits_Distance = (float)Math.Floor((Decimal)fltOrbits_Distance); GUILayout.EndHorizontal(); intAddDistanceHeight += 18; } //What VesselOrbit do we care about Orbit VesselOrbitToCompare=KACWorkerGameState.CurrentVessel.GetOrbit(); if ((KACWorkerGameState.SOIPointExists) && ((tgtSelectedDistance as CelestialBody) == KACWorkerGameState.CurrentVessel.orbit.nextPatch.referenceBody)) { VesselOrbitToCompare = KACWorkerGameState.CurrentVessel.orbit.nextPatch; } //Get the startUT of the orbit Double VesselOrbitStartUT = KACWorkerGameState.CurrentVessel.GetOrbit().StartUT; //Set up some variables intOrbits_Distance = (int)fltOrbits_Distance; int intDistanceOrbitPass = 0; double dblClosestDistance = Double.MaxValue; double dblDistanceUT = 0; double dblOrbitTestDistance = Double.MaxValue; double dblOrbitTestDistanceUT = 0; //If its an Altitude alarm then do this if (tgtSelectedDistance is CelestialBody) { dblOrbitTestDistanceUT = KACUtils.timeOfTargetAltitude(VesselOrbitToCompare, VesselOrbitStartUT, out dblOrbitTestDistance, dblTargetDistance ); dblClosestDistance = dblOrbitTestDistance; dblDistanceUT = dblOrbitTestDistanceUT; } else { //Else Iterate through the orbits to find the target separation for (int intOrbitToTest = 1; intOrbitToTest <= intOrbits_Distance; intOrbitToTest++) { dblOrbitTestDistanceUT = KACUtils.timeOfTargetDistance(VesselOrbitToCompare, tgtSelectedDistance.GetOrbit(), KACWorkerGameState.CurrentTime.UT, intOrbitToTest, out dblOrbitTestDistance, dblTargetDistance ); if (dblOrbitTestDistance < dblClosestDistance) { dblClosestDistance = dblOrbitTestDistance; dblDistanceUT = dblOrbitTestDistanceUT; intDistanceOrbitPass = intOrbitToTest; } } } //Now display what we got GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("{0}:",strDistanceName), KACResources.styleAddHeading, GUILayout.Width(70)); String strDistance = string.Format("{0:#}m", dblClosestDistance); if (dblClosestDistance > 999) strDistance = string.Format("{0:#.0}km", dblClosestDistance / 1000); GUILayout.Label(strDistance, KACResources.styleAddXferName, GUILayout.Width(90)); if (!(tgtSelectedDistance is CelestialBody)) { GUILayout.Label("On Orbit:", KACResources.styleAddHeading); GUILayout.Label(intDistanceOrbitPass.ToString(), KACResources.styleAddXferName); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); //Now do the stuff to draw the alarm button String strMarginConversion = ""; KSPDateTime eventTime = new KSPDateTime(dblDistanceUT); KSPTimeSpan eventInterval = new KSPTimeSpan(dblDistanceUT - KACWorkerGameState.CurrentTime.UT); KSPDateTime eventAlarm; KSPTimeSpan eventAlarmInterval; try { eventAlarm = new KSPDateTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KSPTimeSpan(eventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT); } catch (Exception) { eventAlarm = null; eventAlarmInterval = null; strMarginConversion = "Unable to Add the Margin Minutes"; } if ((eventTime.UT > KACWorkerGameState.CurrentTime.UT) && strMarginConversion == "") { if (DrawAddAlarm(eventTime, eventInterval, eventAlarmInterval)) { KACAlarm newAlarm = new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, eventAlarm.UT, timeMargin.UT, AddType, AddActions); newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; newAlarm.ManNodes = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes; alarms.Add(newAlarm); //settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Target Distance Approach found"; } if (strMarginConversion != "") GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); GUILayout.EndVertical(); }
/// <summary>Initializes a new instance of the System.DateTime structure to the specified year and day.</summary> /// <param name="year">The year</param> /// <param name="dayofyear">The day of the year</param> public KSPDateTime(String year, String dayofyear) { UT = new KSPDateTime(year, dayofyear, "0", "0", "0").UT; }
public void TestFormats() { KSPDateTime dt = new KSPDateTime(1, 100); KSPDateStructure.Months = new List<KSPMonth>(); Assert.AreEqual("100/00/0001", dt.ToString("dd/MM/yyyy")); Assert.AreEqual("Year 1, Day 100 - 0h, 0m",dt.ToString()); KSPDateStructure.SetEarthCalendar(); Assert.AreEqual("25/01/1951", dt.ToString("dd/MM/yyyy")); dt = new KSPDateTime(1951,100); Assert.AreEqual("10/04/1951",dt.ToString("dd/MM/yyyy")); Assert.AreEqual("Hello there 1951",String.Format("Hello there {0:yyyy}",dt)); }
private void WindowLayout_AddPane_NodeEvent(Boolean PointFound,Double timeToPoint) { GUILayout.BeginVertical(); GUILayout.Label(strAlarmEventName + " Details...", KACResources.styleAddSectionHeading); if (lstAlarmsWithTarget.Contains(AddType)) { if (KACWorkerGameState.CurrentVesselTarget == null) GUILayout.Label("Equatorial Nodes (No Valid Target)", KACResources.styleAddXferName, GUILayout.Height(18)); else { if (KACWorkerGameState.CurrentVesselTarget is Vessel) GUILayout.Label("Target Vessel: " + KACWorkerGameState.CurrentVesselTarget.GetVessel().vesselName, KACResources.styleAddXferName,GUILayout.Height(18)); else if (KACWorkerGameState.CurrentVesselTarget is CelestialBody) GUILayout.Label("Target Body: " + ((CelestialBody)KACWorkerGameState.CurrentVesselTarget).bodyName, KACResources.styleAddXferName,GUILayout.Height(18)); else GUILayout.Label("Object Targeted", KACResources.styleAddXferName, GUILayout.Height(18)); //GUILayout.Label("Target Vessel: " + KACWorkerGameState.CurrentVesselTarget.GetVessel().vesselName, KACResources.styleAddXferName, GUILayout.Height(18)); } } if (KACWorkerGameState.CurrentVessel == null) GUILayout.Label("No Active Vessel"); else { if (!PointFound) { GUILayout.Label("No " + strAlarmEventName + " Point Found on current plan", GUILayout.ExpandWidth(true)); } else { String strMarginConversion = ""; KSPDateTime eventTime = new KSPDateTime(KACWorkerGameState.CurrentTime.UT + timeToPoint); KSPTimeSpan eventInterval = new KSPTimeSpan(timeToPoint); KSPDateTime eventAlarm; KSPTimeSpan eventAlarmInterval; try { eventAlarm = new KSPDateTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KSPTimeSpan(eventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT); } catch (Exception) { eventAlarm = null; eventAlarmInterval = null; strMarginConversion = "Unable to Add the Margin Minutes"; } if ((eventTime.UT > KACWorkerGameState.CurrentTime.UT) && strMarginConversion == "") { if (DrawAddAlarm(eventTime, eventInterval, eventAlarmInterval)) { KACAlarm newAlarm = new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, eventAlarm.UT, timeMargin.UT, AddType, AddActions); if (lstAlarmsWithTarget.Contains(AddType)) newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; if (newAlarm.SupportsRepeat) newAlarm.RepeatAlarm = blnRepeatingAlarmFlag; alarms.Add(newAlarm); //settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Future " + strAlarmEventName + "Points found"; } if (strMarginConversion != "") GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); } } GUILayout.EndVertical(); }
private void WindowLayout_AddPane_Raw() { GUILayout.Label("Enter Raw Time Values...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Time type:", KACResources.styleAddHeading, GUILayout.Width(90)); if (DrawRadioList(ref intRawType, new string[] { "Date", "Time Interval" })) { if (intRawType == 0) { rawEntry = new KACTimeStringArray(Planetarium.GetUniversalTime() + 600, KACTimeStringArray.TimeEntryPrecisionEnum.Years); } } GUILayout.EndHorizontal(); if (intRawType == 0) { //date KACTimeStringArray rawDate = new KACTimeStringArray(rawEntry.UT + KSPDateStructure.EpochAsKSPDateTime.UT, KACTimeStringArray.TimeEntryPrecisionEnum.Years); if (DrawTimeEntry(ref rawDate, KACTimeStringArray.TimeEntryPrecisionEnum.Years, "Time:", 50, 35, 15)) { rawEntry.BuildFromUT(rawDate.UT - KSPDateStructure.EpochAsKSPDateTime.UT); } } else { //interval if (DrawTimeEntry(ref rawEntry, KACTimeStringArray.TimeEntryPrecisionEnum.Years, "Time:", 50, 35, 15)) { } } GUILayout.BeginHorizontal(); GUILayout.Label("UT (raw seconds):", KACResources.styleAddHeading,GUILayout.Width(100)); strRawUT = GUILayout.TextField(strRawUT, KACResources.styleAddField); GUILayout.EndHorizontal(); GUILayout.EndVertical(); try { if (strRawUT != "") rawTime.UT = Convert.ToDouble(strRawUT); else rawTime.UT = rawEntry.UT; //If its an interval add the interval to the current time if (intRawType==1) rawTime = new KSPDateTime(KACWorkerGameState.CurrentTime.UT + rawTime.UT); rawTimeToAlarm = new KSPTimeSpan(rawTime.UT - KACWorkerGameState.CurrentTime.UT); //Draw the Add Alarm details at the bottom if (DrawAddAlarm(rawTime,null,rawTimeToAlarm)) { //"VesselID, Name, Message, AlarmTime.UT, Type, Enabled, HaltWarp, PauseGame, Maneuver" String strVesselID = ""; if (KACWorkerGameState.CurrentVessel != null && blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); KACAlarm alarmNew = new KACAlarm(strVesselID, strAlarmName, (blnRepeatingAlarmFlag ? "Alarm Repeats\r\n" : "") + strAlarmNotes, rawTime.UT, 0, KACAlarm.AlarmTypeEnum.Raw, AddActions); alarmNew.RepeatAlarm = blnRepeatingAlarmFlag; alarmNew.RepeatAlarmPeriod = new KSPTimeSpan(timeRepeatPeriod.UT); alarms.Add(alarmNew); //settings.Save(); _ShowAddPane = false; } } catch (Exception ex) { GUILayout.Label("Unable to combine all text fields to date", GUILayout.ExpandWidth(true)); LogFormatted_DebugOnly("{0}\r\n{1}", ex.Message, ex.StackTrace); } }
private void WindowLayout_AddPane_ScienceLab() { intAddScienceLabHeight = 150; if (KACWorkerGameState.CurrentVessel == null) { GUILayout.Label("No Active Vessel.", KACResources.styleLabelWarning); } else { GUILayout.Label("Select Science Lab...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); var lstScienceLabs = KACWorkerGameState.CurrentVessel.FindPartModulesImplementing<ModuleScienceLab>(); if (lstScienceLabs.Count == 0) { GUILayout.Label("No Science Labs on Active Vessel.", KACResources.styleLabelWarning); } else { intAddScienceLabHeight += (lstScienceLabs.Count * 30); GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.Label("Science Lab", KACResources.styleAddSectionHeading, GUILayout.Width(240)); GUILayout.Label("Select", KACResources.styleAddSectionHeading); GUILayout.EndHorizontal(); for (var i = 0; i < lstScienceLabs.Count; ++i) { GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.Label( string.Format( "Science Lab {0} (Science: {1:0}, Data: {2:0})", i + 1, lstScienceLabs[i].storedScience, lstScienceLabs[i].dataStored), KACResources.styleAddXferName, GUILayout.Width(240), GUILayout.Height(20)); bool blnSelected = (intSelectedScienceLab == i); if (DrawToggle(ref blnSelected, string.Empty, KACResources.styleCheckbox, GUILayout.Width(40))) { if (blnSelected) { intSelectedScienceLab = i; BuildScienceLabStrings(); } } GUILayout.EndHorizontal(); } } GUILayout.EndVertical(); if (intSelectedScienceLab >= 0 && intSelectedScienceLab < lstScienceLabs.Count) { blnClearScienceLabHighlight = false; var partToHighlight = lstScienceLabs[intSelectedScienceLab].part; if (partToHighlight != highlightedScienceLab && highlightedScienceLab != null && highlightedScienceLab.HighlightActive) { highlightedScienceLab.SetHighlightDefault(); } if (!partToHighlight.HighlightActive) { partToHighlight.SetHighlight(true, false); } partToHighlight.highlightType = Part.HighlightType.AlwaysOn; partToHighlight.SetHighlightColor(Color.yellow); highlightedScienceLab = partToHighlight; var lab = lstScienceLabs[intSelectedScienceLab]; var converter = lab.Converter; if (!converter.IsActivated) { GUILayout.Label("Science Lab is not Active.", KACResources.styleLabelWarning); } else if (Mathf.Approximately(lab.dataStored, 0f)) { GUILayout.Label("Science Lab has no Data.", KACResources.styleLabelWarning); } else if (!lab.part.protoModuleCrew.Any(c => c.trait == "Scientist")) { GUILayout.Label("Science Lab has no Scientists.", KACResources.styleLabelWarning); } else if (Mathf.Approximately(lab.storedScience, converter.scienceCap)) { GUILayout.Label("Science Lab is already full.", KACResources.styleLabelWarning); } else { intAddScienceLabHeight += 232; var fltMaxScience = Math.Min(converter.scienceCap, lab.storedScience + (lab.dataStored * converter.scienceMultiplier)); var intMinScience = (int)Math.Floor(lab.storedScience) + 1; var intMaxScience = (int)Math.Floor(fltMaxScience); GUILayout.Label("Choose Target Science Amount...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Target Science:", KACResources.styleAddXferName); DrawTextField(ref strTargetScience, "[^\\d\\.]+", true); int intTargetScience; if (!int.TryParse(strTargetScience, out intTargetScience)) { intTargetScience = intMaxScience; GUILayout.Label(new GUIContent("*", "Invalid fields treated as Max"), KACResources.styleLabelError, GUILayout.Width(8)); } GUILayout.EndHorizontal(); GUILayout.Label(string.Format("Min Target Science: {0}", intMinScience), GUILayout.Width(160)); GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Max Target Science: {0}", intMaxScience), GUILayout.Width(160)); if (GUILayout.Button("Set to Max")) { strTargetScience = intMaxScience.ToString(); } GUILayout.EndHorizontal(); intTargetScienceClamped = Math.Max((int)Math.Floor(lab.storedScience) + 1, Math.Min((int)Math.Floor(fltMaxScience), intTargetScience)); BuildScienceLabStrings(); if (intTargetScience != intTargetScienceClamped) { intAddScienceLabHeight += 25; GUILayout.Label("Selected Target is out of reach. Target Amount changed.", KACResources.styleLabelWarning); } GUILayout.EndVertical(); var fltScienceNeeded = intTargetScienceClamped - lab.storedScience; var fltDataNeeded = fltScienceNeeded / converter.scienceMultiplier; var fltFinalData = lab.dataStored - fltDataNeeded; var dblRateStart = converter.CalculateScienceRate(lab.dataStored); var dblRateEnd = converter.CalculateScienceRate(fltFinalData); var dblRateAvg = (dblRateStart + dblRateEnd) * 0.5d; var dblDaysToProcess = fltScienceNeeded / dblRateAvg; var totalResearchTime = KSPTimeSpan.FromDays(dblDaysToProcess); // var totalResearchTime = new KSPTimeSpan(converter.CalculateResearchTime(fltDataNeeded)); GUILayout.Label("Target Details...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Target Science Amount:", KACResources.styleAddHeading, GUILayout.Width(150)); GUILayout.Label(intTargetScienceClamped.ToString() + "/" + converter.scienceCap, KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Final Data Amount:", KACResources.styleAddHeading, GUILayout.Width(150)); GUILayout.Label(fltFinalData.ToString("0.00") + "/" + lab.dataStorage.ToString("0"), KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Final Data Rate:", KACResources.styleAddHeading, GUILayout.Width(150)); GUILayout.Label(dblRateEnd.ToString("0.00") + " sci/day", KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.EndVertical(); var scienceLabTime = new KSPDateTime(KACWorkerGameState.CurrentTime.UT + totalResearchTime.UT); var scienceLabToAlarm = new KSPTimeSpan(scienceLabTime.UT - KACWorkerGameState.CurrentTime.UT); if (DrawAddAlarm(scienceLabTime, null, scienceLabToAlarm)) { KACAlarm alarmNew = new KACAlarm( KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, KACWorkerGameState.CurrentTime.UT + scienceLabToAlarm.UT, 0, KACAlarm.AlarmTypeEnum.ScienceLab, AddActions); alarms.Add(alarmNew); //settings.Save(); _ShowAddPane = false; } } } } }
/// <summary>Subtracts the specified date and time from this instance.</summary> /// <param name="value">An instance of System.DateTime.</param> /// <returns>A System.DateTime equal to the date and time represented by this instance minus the date and time represented by value.</returns> public KSPDateTime Subtract(KSPDateTime value) { return(new KSPDateTime(UT - value.UT)); }
private void WindowLayout_AddPane_Transfer() { intAddXferHeight = 304;// 317; if (settings.RSSActive) { GUILayout.Label("RSS detected - it is recommended that you use the Transfer Window Planner Plugin to plan transfers", KACResources.styleAddXferName); GUILayout.Space(-8); if (GUILayout.Button("Click here to open the TWP forum thread", KACResources.styleContent)) Application.OpenURL("http://forum.kerbalspaceprogram.com/threads/93115"); intAddXferHeight += 58; } KSPDateTime XferCurrentTargetEventTime = null; List<KSPDateTime> lstXferCurrentTargetEventTime = new List<KSPDateTime>(); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Transfers", KACResources.styleAddSectionHeading, GUILayout.Width(60)); //add something here to select the modelled or formula values for Solar orbiting bodies if (settings.XferModelDataLoaded) { GUILayout.FlexibleSpace(); GUILayout.Label("Calc by:", KACResources.styleAddHeading); if (intXferCurrentParent == 0) { //intAddXferHeight += 35; if (DrawRadioList(ref intXferType, "Model", "Formula")) { settings.XferUseModelData = (intXferType == 0); settings.Save(); } } else { int zero = 0; DrawRadioList(ref zero, "Formula"); } } GUILayout.EndHorizontal(); try { GUILayout.BeginHorizontal(); GUILayout.Label("Xfer Parent:", KACResources.styleAddHeading, GUILayout.Width(80), GUILayout.Height(20)); GUILayout.Label(XferParentBodies[intXferCurrentParent].bodyName, KACResources.styleAddXferName, GUILayout.ExpandWidth(true), GUILayout.Height(20)); if (GUILayout.Button(new GUIContent("Change", "Click to cycle through Parent Bodies"), KACResources.styleAddXferOriginButton)) { intXferCurrentParent += 1; if (intXferCurrentParent >= XferParentBodies.Count) intXferCurrentParent = 0; SetupXferOrigins(); intXferCurrentOrigin = 0; SetupXFerTargets(); BuildTransferStrings(); //strAlarmNotesNew = String.Format("{0} Transfer", XferOriginBodies[intXferCurrentOrigin].bodyName); } GUILayout.Space(34); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Xfer Origin:", KACResources.styleAddHeading, GUILayout.Width(80),GUILayout.Height(20)); GUILayout.Label(XferOriginBodies[intXferCurrentOrigin].bodyName, KACResources.styleAddXferName, GUILayout.ExpandWidth(true), GUILayout.Height(20)); if (GUILayout.Button(new GUIContent("Change", "Click to cycle through Origin Bodies"), KACResources.styleAddXferOriginButton)) { intXferCurrentOrigin += 1; if (intXferCurrentOrigin >= XferOriginBodies.Count) intXferCurrentOrigin = 0; SetupXFerTargets(); BuildTransferStrings(); //strAlarmNotesNew = String.Format("{0} Transfer", XferOriginBodies[intXferCurrentOrigin].bodyName); } if (!settings.AlarmXferDisplayList) GUILayout.Space(34); else if (GUILayout.Button(new GUIContent(KACResources.btnChevronUp, "Hide Full List"), KACResources.styleSmallButton)) { settings.AlarmXferDisplayList = !settings.AlarmXferDisplayList; settings.Save(); } GUILayout.EndHorizontal(); if (!settings.AlarmXferDisplayList) { //Simple single chosen target GUILayout.BeginHorizontal(); GUILayout.Label("Xfer Target:", KACResources.styleAddHeading, GUILayout.Width(80), GUILayout.Height(20)); GUILayout.Label(XferTargetBodies[intXferCurrentTarget].Target.bodyName, KACResources.styleAddXferName, GUILayout.ExpandWidth(true), GUILayout.Height(20)); if (GUILayout.Button(new GUIContent("Change", "Click to cycle through Target Bodies"), KACResources.styleAddXferOriginButton)) { intXferCurrentTarget += 1; if (intXferCurrentTarget >= XferTargetBodies.Count) intXferCurrentTarget = 0; SetupXFerTargets(); BuildTransferStrings(); //strAlarmNotesNew = String.Format("{0} Transfer", XferTargetBodies[intXferCurrentTarget].Target.bodyName); } if (GUILayout.Button(new GUIContent(KACResources.btnChevronDown, "Show Full List"), KACResources.styleSmallButton)) { settings.AlarmXferDisplayList = !settings.AlarmXferDisplayList; settings.Save(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Phase Angle-Current:", KACResources.styleAddHeading,GUILayout.Width(130)); GUILayout.Label(String.Format("{0:0.00}", XferTargetBodies[intXferCurrentTarget].PhaseAngleCurrent), KACResources.styleContent, GUILayout.Width(67)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Phase Angle-Target:", KACResources.styleAddHeading, GUILayout.Width(130)); if (intXferCurrentParent != 0 || (!settings.XferUseModelData && settings.XferModelDataLoaded)) { //formula based GUILayout.Label(String.Format("{0:0.00}", XferTargetBodies[intXferCurrentTarget].PhaseAngleTarget), KACResources.styleContent, GUILayout.Width(67)); } else { //this is the modelled data, but only for Kerbol orbiting bodies try { KACXFerModelPoint tmpModelPoint = KACResources.lstXferModelPoints.FirstOrDefault( m => FlightGlobals.Bodies[m.Origin] == XferTargetBodies[intXferCurrentTarget].Origin && FlightGlobals.Bodies[m.Target] == XferTargetBodies[intXferCurrentTarget].Target && m.UT >= KACWorkerGameState.CurrentTime.UT); if (tmpModelPoint != null) { GUILayout.Label(String.Format("{0:0.00}", tmpModelPoint.PhaseAngle), KACResources.styleContent, GUILayout.Width(67)); XferCurrentTargetEventTime = new KSPDateTime(tmpModelPoint.UT); } else { GUILayout.Label("No future model data available for this transfer", KACResources.styleContent, GUILayout.ExpandWidth(true)); } } catch (Exception ex) { GUILayout.Label("Unable to determine model data", KACResources.styleContent, GUILayout.ExpandWidth(true)); LogFormatted("Error determining model data: {0}", ex.Message); } } GUILayout.EndHorizontal(); } else { //Build the list of model points for the add all button for (int intTarget = 0; intTarget < XferTargetBodies.Count; intTarget++) { if (!(intXferCurrentParent != 0 || (!settings.XferUseModelData && settings.XferModelDataLoaded))) { try { KACXFerModelPoint tmpModelPoint = KACResources.lstXferModelPoints.FirstOrDefault( m => FlightGlobals.Bodies[m.Origin] == XferTargetBodies[intTarget].Origin && FlightGlobals.Bodies[m.Target] == XferTargetBodies[intTarget].Target && m.UT >= KACWorkerGameState.CurrentTime.UT); if (tmpModelPoint != null) { lstXferCurrentTargetEventTime.Add(new KSPDateTime(tmpModelPoint.UT)); } } catch (Exception ex) { LogFormatted("Error determining model data: {0}", ex.Message); } } } // Now do the add all buttons intAddXferHeight += 28; if (intXferCurrentParent != 0 || (!settings.XferUseModelData && settings.XferModelDataLoaded)) { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent("Create Alarms for All", "Create Alarms for all listed transfers"), new GUIStyle(KACResources.styleAddXferOriginButton) { fixedWidth = 140 })) { for (int i = 0; i < XferTargetBodies.Count; i++) { String strVesselID = ""; if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); TransferStrings ts = BuildTransferStrings(i, false); alarms.Add(new KACAlarm(strVesselID, ts.AlarmName, ts.AlarmNotes + "\r\n\tMargin: " + new KSPTimeSpan(timeMargin.UT).ToStringStandard(TimeSpanStringFormatsEnum.IntervalLongTrimYears), (KACWorkerGameState.CurrentTime.UT + XferTargetBodies[i].AlignmentTime.UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmTypeEnum.Transfer, AddActions, XferTargetBodies[i])); } _ShowAddPane = false; } GUILayout.EndHorizontal(); } else { //Model based GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent("Create Alarms for All", "Create Alarms for all listed transfers"), new GUIStyle(KACResources.styleAddXferOriginButton) { fixedWidth = 140 })) { for (int i = 0; i < XferTargetBodies.Count; i++) { String strVesselID = ""; if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); TransferStrings ts = BuildTransferStrings(i, false); KACAlarm alarmNew = new KACAlarm(strVesselID, ts.AlarmName, (blnRepeatingAlarmFlag ? "Alarm Repeats\r\n" : "") + ts.AlarmNotes + "\r\n\tMargin: " + new KSPTimeSpan(timeMargin.UT).ToStringStandard(TimeSpanStringFormatsEnum.IntervalLongTrimYears), (lstXferCurrentTargetEventTime[i].UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmTypeEnum.TransferModelled, AddActions, XferTargetBodies[i]); alarmNew.RepeatAlarm = blnRepeatingAlarmFlag; alarms.Add(alarmNew); } _ShowAddPane = false; } GUILayout.EndHorizontal(); } GUIStyle styleTemp = new GUIStyle(); xferListScrollPosition = GUILayout.BeginScrollView(xferListScrollPosition, styleTemp); // And now the table of results GUILayout.BeginHorizontal(); GUILayout.Label("Target", KACResources.styleAddSectionHeading, GUILayout.Width(55)); GUILayout.Label(new GUIContent("Phase Angle", "Displayed as \"Current Angle (Target Angle)\""), KACResources.styleAddSectionHeading, GUILayout.Width(105)); GUILayout.Label("Time to Transfer", KACResources.styleAddSectionHeading, GUILayout.ExpandWidth(true)); //GUILayout.Label("Time to Alarm", KACResources.styleAddSectionHeading, GUILayout.ExpandWidth(true)); GUILayout.Label("Add", KACResources.styleAddSectionHeading, GUILayout.Width(30)); GUILayout.EndHorizontal(); for (int intTarget = 0; intTarget < XferTargetBodies.Count; intTarget++) { GUILayout.BeginHorizontal(); GUILayout.Label(XferTargetBodies[intTarget].Target.bodyName, KACResources.styleAddXferName, GUILayout.Width(55), GUILayout.Height(20)); if (intXferCurrentParent != 0 || (!settings.XferUseModelData && settings.XferModelDataLoaded)) { //formula based String strPhase = String.Format("{0:0.00}({1:0.00})", XferTargetBodies[intTarget].PhaseAngleCurrent, XferTargetBodies[intTarget].PhaseAngleTarget); GUILayout.Label(strPhase, KACResources.styleAddHeading, GUILayout.Width(105), GUILayout.Height(20)); GUILayout.Label(XferTargetBodies[intTarget].AlignmentTime.ToStringStandard(settings.TimeSpanFormat), KACResources.styleAddHeading, GUILayout.ExpandWidth(true), GUILayout.Height(20)); } else { try { KACXFerModelPoint tmpModelPoint = KACResources.lstXferModelPoints.FirstOrDefault( m => FlightGlobals.Bodies[m.Origin] == XferTargetBodies[intTarget].Origin && FlightGlobals.Bodies[m.Target] == XferTargetBodies[intTarget].Target && m.UT >= KACWorkerGameState.CurrentTime.UT); if (tmpModelPoint != null) { String strPhase = String.Format("{0:0.00}({1:0.00})", XferTargetBodies[intTarget].PhaseAngleCurrent, tmpModelPoint.PhaseAngle); GUILayout.Label(strPhase, KACResources.styleAddHeading, GUILayout.Width(105), GUILayout.Height(20)); KSPTimeSpan tmpTime = new KSPTimeSpan(tmpModelPoint.UT - KACWorkerGameState.CurrentTime.UT); GUILayout.Label(tmpTime.ToStringStandard(settings.TimeSpanFormat), KACResources.styleAddHeading, GUILayout.ExpandWidth(true), GUILayout.Height(20)); if (intTarget==intXferCurrentTarget) XferCurrentTargetEventTime = new KSPDateTime(tmpModelPoint.UT); // Doing this at the top of the loop now //lstXferCurrentTargetEventTime.Add(new KSPDateTime(tmpModelPoint.UT)); } else { GUILayout.Label("No future model data", KACResources.styleContent, GUILayout.ExpandWidth(true)); } } catch (Exception ex) { GUILayout.Label("Unable to determine model data", KACResources.styleContent, GUILayout.ExpandWidth(true)); LogFormatted("Error determining model data: {0}", ex.Message); } } Boolean blnSelected = (intXferCurrentTarget == intTarget); if (DrawToggle(ref blnSelected, "", KACResources.styleCheckbox, GUILayout.Width(42))) { if (blnSelected) { intXferCurrentTarget = intTarget; BuildTransferStrings(); } } GUILayout.EndHorizontal(); } intAddXferHeight += -56 + ( XferTargetBodies.Count * 30); GUILayout.EndScrollView(); intAddXferHeight += 2; //For the scroll bar } if(intXferCurrentParent != 0 || (!settings.XferUseModelData && settings.XferModelDataLoaded)) { ////Formula based - Add All Alarms //if (settings.AlarmXferDisplayList) //{ // intAddXferHeight += 28; // GUILayout.BeginHorizontal(); // GUILayout.FlexibleSpace(); // if (GUILayout.Button(new GUIContent("Create Alarms for All", "Create Alarms for all listed transfers"), new GUIStyle(KACResources.styleAddXferOriginButton) {fixedWidth=140 })) // { // for (int i = 0; i < XferTargetBodies.Count; i++) // { // String strVesselID = ""; // if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); // TransferStrings ts = BuildTransferStrings(i, false); // alarms.Add(new KACAlarm(strVesselID, ts.AlarmName, ts.AlarmNotes + "\r\n\tMargin: " + new KSPTimeSpan(timeMargin.UT).ToStringStandard(TimeSpanStringFormatsEnum.IntervalLongTrimYears), // (KACWorkerGameState.CurrentTime.UT + XferTargetBodies[i].AlignmentTime.UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmTypeEnum.Transfer, // AddActions, XferTargetBodies[i])); // } // _ShowAddPane = false; // } // GUILayout.EndHorizontal(); //} //Formula based - add new alarm if (DrawAddAlarm(new KSPDateTime(KACWorkerGameState.CurrentTime.UT + XferTargetBodies[intXferCurrentTarget].AlignmentTime.UT), XferTargetBodies[intXferCurrentTarget].AlignmentTime, new KSPTimeSpan(XferTargetBodies[intXferCurrentTarget].AlignmentTime.UT - timeMargin.UT))) { String strVesselID = ""; if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); alarms.Add(new KACAlarm(strVesselID, strAlarmName, strAlarmNotes + "\r\n\tMargin: " + new KSPTimeSpan(timeMargin.UT).ToStringStandard(TimeSpanStringFormatsEnum.IntervalLongTrimYears), (KACWorkerGameState.CurrentTime.UT + XferTargetBodies[intXferCurrentTarget].AlignmentTime.UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmTypeEnum.Transfer, AddActions, XferTargetBodies[intXferCurrentTarget])); //settings.Save(); _ShowAddPane = false; } } else { //Model based if (XferCurrentTargetEventTime!=null) { ////Formula based - Add All Alarms //if (settings.AlarmXferDisplayList) //{ // intAddXferHeight += 28; // GUILayout.BeginHorizontal(); // GUILayout.FlexibleSpace(); // if (GUILayout.Button(new GUIContent("Create Alarms for All", "Create Alarms for all listed transfers"), new GUIStyle(KACResources.styleAddXferOriginButton) { fixedWidth = 140 })) // { // for (int i = 0; i < XferTargetBodies.Count; i++) // { // String strVesselID = ""; // if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); // TransferStrings ts = BuildTransferStrings(i, false); // KACAlarm alarmNew = new KACAlarm(strVesselID, ts.AlarmName, (blnRepeatingAlarmFlag ? "Alarm Repeats\r\n" : "") + ts.AlarmNotes + "\r\n\tMargin: " + new KSPTimeSpan(timeMargin.UT).ToStringStandard(TimeSpanStringFormatsEnum.IntervalLongTrimYears), // (lstXferCurrentTargetEventTime[i].UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmTypeEnum.TransferModelled, // AddActions, XferTargetBodies[i]); // alarmNew.RepeatAlarm = blnRepeatingAlarmFlag; // alarms.Add(alarmNew); // } // _ShowAddPane = false; // } // GUILayout.EndHorizontal(); //} if (DrawAddAlarm(XferCurrentTargetEventTime, new KSPTimeSpan(XferCurrentTargetEventTime.UT - KACWorkerGameState.CurrentTime.UT), new KSPTimeSpan(XferCurrentTargetEventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT), true)) { String strVesselID = ""; if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); KACAlarm alarmNew = new KACAlarm(strVesselID, strAlarmName, (blnRepeatingAlarmFlag ? "Alarm Repeats\r\n" : "") + strAlarmNotes + "\r\n\tMargin: " + new KSPTimeSpan(timeMargin.UT).ToStringStandard(TimeSpanStringFormatsEnum.IntervalLongTrimYears), (XferCurrentTargetEventTime.UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmTypeEnum.TransferModelled, AddActions, XferTargetBodies[intXferCurrentTarget]); alarmNew.RepeatAlarm = blnRepeatingAlarmFlag; alarms.Add(alarmNew); //settings.Save(); _ShowAddPane = false; } } else{ GUILayout.Label("Selected a transfer with no event date",GUILayout.ExpandWidth(true)); } } } catch (Exception ex) { if (intXferCurrentTarget >= XferTargetBodies.Count) intXferCurrentTarget = 0; GUILayout.Label("Something weird has happened"); LogFormatted(ex.Message); LogFormatted(ex.StackTrace); } //intAddXferHeight += intTestheight4; GUILayout.EndVertical(); }
/// <summary>Returns a value indicating whether this instance is equal to a specified KSPPluginFramework.KSPDateTime object.</summary> /// <param name="value">An KSPPluginFramework.KSPDateTime object to compare with this instance.</param> /// <returns>true if obj represents the same time interval as this instance; otherwise, false.</returns> public Boolean Equals(KSPDateTime value) { return(KSPDateTime.Equals(this, value)); }
private Boolean DrawAddAlarm(KSPDateTime AlarmDate, KSPTimeSpan TimeToEvent, KSPTimeSpan TimeToAlarm, Boolean ForceShowRepeat = false) { Boolean blnReturn = false; intHeight_AddWindowRepeat = 0; int intLineHeight = 18; GUILayout.BeginVertical(); //Do we show repeating options if (KACAlarm.AlarmTypeSupportsRepeat.Contains(AddType) || ForceShowRepeat) { intHeight_AddWindowRepeat += 53; GUILayout.Label("Alarm Repeat Options...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); DrawCheckbox(ref blnRepeatingAlarmFlag, new GUIContent("Make this alarm repeat when triggered", "If enabled then when one alarm fires another will be created based on the existing alarm")); if (KACAlarm.AlarmTypeSupportsRepeatPeriod.Contains(AddType)) { intHeight_AddWindowRepeat += 24; DrawTimeEntry(ref timeRepeatPeriod, KACTimeStringArray.TimeEntryPrecisionEnum.Days, "Repeat After:", 90); } GUILayout.EndVertical(); } //Now for the add area GUILayout.BeginHorizontal(KACResources.styleAddAlarmArea); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Date:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(40), GUILayout.MaxWidth(40)); GUILayout.Label(AlarmDate.ToStringStandard(DateStringFormatsEnum.DateTimeFormat), KACResources.styleContent, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); if (TimeToEvent != null) { GUILayout.BeginHorizontal(); //GUILayout.Label("Time to " + strAlarmEventName + ":", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(120), GUILayout.MaxWidth(120)); GUILayout.Label("Time to " + strAlarmEventName + ":", KACResources.styleAddHeading, GUILayout.Height(intLineHeight)); GUILayout.Label(TimeToEvent.ToStringStandard(settings.TimeSpanFormat), KACResources.styleContent, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); //GUILayout.Label("Time to Alarm:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(120), GUILayout.MaxWidth(120)); GUILayout.Label("Time to Alarm:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight)); GUILayout.Label(TimeToAlarm.ToStringStandard(settings.TimeSpanFormat), KACResources.styleContent, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.Space(10); int intButtonHeight = 36; if (TimeToEvent != null) intButtonHeight += 22; if (GUILayout.Button("Add Alarm", KACResources.styleButton, GUILayout.Width(75), GUILayout.Height(intButtonHeight))) { blnReturn = true; } GUILayout.EndHorizontal(); GUILayout.EndVertical(); return blnReturn; }
/// <summary>Returns a value indicating whether two specified instances of KSPPluginFramework.KSPDateTime are equal.</summary> /// <param name="t1">A KSPPluginFramework.KSPDateTime.</param> /// <param name="t2">A DateTime.</param> /// <returns>true if the values of t1 and t2 are equal; otherwise, false.</returns> public static Boolean Equals(KSPDateTime t1, KSPDateTime t2) { return(t1.UT == t2.UT); }
private void WindowLayout_AddPane_Contract() { GUILayout.Label("Select Contract...", KACResources.styleAddSectionHeading); if (Contracts.ContractSystem.Instance == null) { GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.Label("Jebediah digs around in the Sandbox, but can't\nfind any contracts in this game mode", KACResources.styleContent); GUILayout.EndVertical(); } else { if (lstContracts.Count == 0) { GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.Label("No Contracts Offered or Active", KACResources.styleContent); GUILayout.EndVertical(); } else { scrollContract = GUILayout.BeginScrollView(scrollContract, KACResources.styleAddFieldAreas); //If the selected contract is already an alarm then move the selected one if (intSelectedContract == -1 || alarms.Any(a => a.ContractGUID == lstContracts[intSelectedContract].ContractGuid)){ intSelectedContract = -1; for (int i = 0; i < lstContracts.Count; i++) { if(!alarms.Any(a => a.ContractGUID == lstContracts[i].ContractGuid)){ intSelectedContract = i; BuildContractStringsAndMargin(); break; } } } //Loop through the contracts to draw the lines for (Int32 intTarget = 0; intTarget < lstContracts.Count; intTarget++) { Contract c = lstContracts[intTarget]; Boolean AlarmExists = alarms.Any(a => a.ContractGUID == c.ContractGuid); GUILayout.BeginHorizontal(); //Appropriate icon GUILayout.Space(5); if (AlarmExists) { GUILayout.Label(new GUIContent(KACResources.iconRaw, "Alarm Exists"), GUILayout.Width(20), GUILayout.Height(25)); } else if (c.ContractState == Contract.State.Active) { GUILayout.Label(new GUIContent(KACResources.iconContract, "Active"), GUILayout.Width(20), GUILayout.Height(25)); } else { GUILayout.Space(24); } //What style should the name be GUIStyle styleContLabel = KACResources.styleContractLabelOffer; if (c.ContractState == Contract.State.Active) styleContLabel = KACResources.styleContractLabelActive; else if (AlarmExists) styleContLabel = KACResources.styleContractLabelAlarmExists; if (GUILayout.Button(c.Title, styleContLabel, GUILayout.Width(243))) { if (!AlarmExists) { intSelectedContract = intTarget; BuildContractStringsAndMargin(); } }; //Is the check box on? Boolean blnSelected = (intSelectedContract == intTarget); if (!AlarmExists) { if (DrawToggle(ref blnSelected, "", KACResources.styleCheckbox, GUILayout.Width(20))) { if (blnSelected) { intSelectedContract = intTarget; BuildContractStringsAndMargin(); } } } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); if (intSelectedContract < 0) { GUILayout.Label("All Contracts Have alarms set already", KACResources.styleContent); } else { //Draw the Add Alarm details at the bottom //If its an interval add the interval to the current time ContractTime = new KSPDateTime(lstContracts[intSelectedContract].DateNext()); ContractTimeToEvent = new KSPTimeSpan(lstContracts[intSelectedContract].DateNext() - KACWorkerGameState.CurrentTime.UT); ContractTimeToAlarm = new KSPTimeSpan(ContractTimeToEvent.UT - timeMargin.UT); if (DrawAddAlarm(ContractTime, ContractTimeToEvent, ContractTimeToAlarm)) { //"VesselID, Name, Message, AlarmTime.UT, Type, Enabled, HaltWarp, PauseGame, Maneuver" String strVesselID = ""; if (KACWorkerGameState.CurrentVessel != null && blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); KACAlarm tmpAlarm = new KACAlarm(strVesselID, strAlarmName, strAlarmNotes, KACWorkerGameState.CurrentTime.UT + ContractTimeToAlarm.UT, timeMargin.UT, KACAlarm.AlarmTypeEnum.Contract, AddActions); tmpAlarm.ContractGUID = lstContracts[intSelectedContract].ContractGuid; tmpAlarm.ContractAlarmType = lstContracts[intSelectedContract].AlarmType(); alarms.Add(tmpAlarm); //settings.Save(); _ShowAddPane = false; } } } } }
private Boolean CreateAlarmRepeats(KACAlarm alarmToCheck, out KACAlarm alarmToAdd) { if (alarmToCheck.RepeatAlarm){ if (alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.TransferModelled) { try { LogFormatted("Adding repeat alarm for ({0}->{1})", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName); //find the next transfer from the modelled data KACXFerModelPoint tmpModelPoint = KACResources.lstXferModelPoints.FirstOrDefault( m => FlightGlobals.Bodies[m.Origin].bodyName == alarmToCheck.XferOriginBodyName && FlightGlobals.Bodies[m.Target].bodyName == alarmToCheck.XferTargetBodyName && m.UT > alarmToCheck.AlarmTime.UT + alarmToCheck.AlarmMarginSecs); if (tmpModelPoint != null) { KSPDateTime XferNextTargetEventTime = new KSPDateTime(tmpModelPoint.UT); if (!alarms.Any(a => a.TypeOfAlarm == KACAlarm.AlarmTypeEnum.TransferModelled && a.XferOriginBodyName == alarmToCheck.XferOriginBodyName && a.XferTargetBodyName == alarmToCheck.XferTargetBodyName && a.AlarmTime.UT == tmpModelPoint.UT)) { alarmToAdd=alarmToCheck.Duplicate(XferNextTargetEventTime.UT - alarmToCheck.AlarmMarginSecs); return true; } else { LogFormatted("Alarm already exists, not adding repeat({0}->{1}): UT={2}", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName, XferNextTargetEventTime.UT); } } else { LogFormatted("Unable to find a future model data point for this transfer({0}->{1})", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName); } } catch (Exception ex) { LogFormatted("Unable to find a future model data point for this transfer({0}->{1})\r\n{2}", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName, ex.Message); } } else if (alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.Apoapsis || alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.Periapsis) { try { Vessel v = FindVesselForAlarm(alarmToCheck); if(v == null) { LogFormatted("Unable to find the vessel to work out the repeat ({0})", alarmToCheck.VesselID); } else { LogFormatted("Adding repeat alarm for Ap/Pe ({0})", alarmToCheck.VesselID); //get the time of the next node if the margin is greater than 0 Double nextApPe = Planetarium.GetUniversalTime() + v.orbit.timeToAp + (alarmToCheck.AlarmMarginSecs>0?v.orbit.period:0); if (alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.Periapsis) nextApPe = Planetarium.GetUniversalTime() + v.orbit.timeToPe + +(alarmToCheck.AlarmMarginSecs > 0 ? v.orbit.period : 0); if (!alarms.Any(a => a.TypeOfAlarm == alarmToCheck.TypeOfAlarm && a.AlarmTime.UT == nextApPe)) { alarmToAdd = alarmToCheck.Duplicate(nextApPe); return true; } else { LogFormatted("Alarm already exists, not adding repeat ({0}): UT={1}", alarmToCheck.VesselID, nextApPe); } alarmToAdd = alarmToCheck.Duplicate(nextApPe); return true; } } catch (Exception ex) { LogFormatted("Unable to add a repeat alarm ({0})\r\n{1}", alarmToCheck.VesselID, ex.Message); } } else if (alarmToCheck.RepeatAlarmPeriod.UT > 0) { LogFormatted("Adding repeat alarm for {0}:{1}-{2}+{3}", alarmToCheck.TypeOfAlarm, alarmToCheck.Name, alarmToCheck.AlarmTime.UT, alarmToCheck.RepeatAlarmPeriod.UT); alarmToAdd = alarmToCheck.Duplicate(alarmToCheck.AlarmTime.UT + alarmToCheck.RepeatAlarmPeriod.UT); return true; } } alarmToAdd = null; return false; }
private void WindowLayout_AddPane_Crew() { intAddCrewHeight = 304;// 322; GUILayout.Label("Select Crew...", KACResources.styleAddSectionHeading); if (KACWorkerGameState.CurrentVessel == null) { GUILayout.Label("No Active Vessel"); } else { GUILayout.BeginVertical(KACResources.styleAddFieldAreas); //get the kerbals in the current vessel List<ProtoCrewMember> pCM = KACWorkerGameState.CurrentVessel.GetVesselCrew(); intAddCrewHeight += (pCM.Count * 30); if (pCM.Count == 0) { //Draw something about no crew present GUILayout.Label("No Kerbals present in this vessel", KACResources.styleContent, GUILayout.ExpandWidth(true)); } else { GUILayout.BeginHorizontal(); GUILayout.Label("Kerbal Name", KACResources.styleAddSectionHeading, GUILayout.Width(267)); GUILayout.Label("Add", KACResources.styleAddSectionHeading);//, GUILayout.Width(30)); GUILayout.EndHorizontal(); for (int intTarget = 0; intTarget < pCM.Count; intTarget++) { //LogFormatted("{2}", pCM[intTarget].name); GUILayout.BeginHorizontal(); // //draw a line and a radio button for selecting Crew GUILayout.Space(20); GUILayout.Label(pCM[intTarget].name, KACResources.styleAddXferName, GUILayout.Width(240), GUILayout.Height(20)); // //when they are selected adjust message to have a name of the crew member, and message of vessel when alarm was set Boolean blnSelected = (intSelectedCrew == intTarget); if (DrawToggle(ref blnSelected, "", KACResources.styleCheckbox, GUILayout.Width(40))) { if (blnSelected) { intSelectedCrew = intTarget; BuildCrewStrings(); } } GUILayout.EndHorizontal(); } DrawCheckbox(ref CrewAlarmStoreNode, "Store Man Node/Target with Crew Alarm"); } GUILayout.EndVertical(); if (pCM.Count > 0) { //Now the time entry area GUILayout.Label("Enter Time Values...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Time type:", KACResources.styleAddHeading, GUILayout.Width(90)); if (DrawRadioList(ref intCrewType, new string[] { "Date", "Time Interval" })) { if (intRawType == 0) { rawEntry = new KACTimeStringArray(Planetarium.GetUniversalTime() + 600, KACTimeStringArray.TimeEntryPrecisionEnum.Years); } } GUILayout.EndHorizontal(); if (intCrewType == 0) { //date KACTimeStringArray CrewDate = new KACTimeStringArray(CrewEntry.UT + KSPDateStructure.EpochAsKSPDateTime.UT, KACTimeStringArray.TimeEntryPrecisionEnum.Years); if (DrawTimeEntry(ref CrewDate, KACTimeStringArray.TimeEntryPrecisionEnum.Years, "Time:", 50, 35, 15)) { rawEntry.BuildFromUT(CrewDate.UT - KSPDateStructure.EpochAsKSPDateTime.UT); } } else { //interval if (DrawTimeEntry(ref CrewEntry, KACTimeStringArray.TimeEntryPrecisionEnum.Years, "Time:", 50, 35, 15)) { } } GUILayout.BeginHorizontal(); GUILayout.Label("UT (raw seconds):", KACResources.styleAddHeading, GUILayout.Width(100)); strCrewUT = GUILayout.TextField(strCrewUT, KACResources.styleAddField); GUILayout.EndHorizontal(); GUILayout.EndVertical(); try { if (strCrewUT != "") CrewTime.UT = Convert.ToDouble(strCrewUT); else CrewTime.UT = CrewEntry.UT; //If its an interval add the interval to the current time if (intCrewType == 1) CrewTime = new KSPDateTime(KACWorkerGameState.CurrentTime.UT + CrewTime.UT); CrewTimeToAlarm = new KSPTimeSpan(CrewTime.UT - KACWorkerGameState.CurrentTime.UT); //Draw the Add Alarm details at the bottom if (DrawAddAlarm(CrewTime, null, CrewTimeToAlarm)) { //"VesselID, Name, Message, AlarmTime.UT, Type, Enabled, HaltWarp, PauseGame, Maneuver" KACAlarm addAlarm = new KACAlarm(pCM[intSelectedCrew].name, strAlarmName, (blnRepeatingAlarmFlag ? "Alarm Repeats\r\n" : "") + strAlarmNotes, CrewTime.UT, 0, KACAlarm.AlarmTypeEnum.Crew, AddActions); if (CrewAlarmStoreNode) { if (KACWorkerGameState.ManeuverNodeExists) addAlarm.ManNodes = KACWorkerGameState.ManeuverNodesFuture; if (KACWorkerGameState.CurrentVesselTarget != null) addAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; } addAlarm.RepeatAlarm = blnRepeatingAlarmFlag; addAlarm.RepeatAlarmPeriod = new KSPTimeSpan(timeRepeatPeriod.UT); alarms.Add(addAlarm); //settings.Save(); _ShowAddPane = false; } } catch (Exception) { // LogFormatted(ex.Message); GUILayout.Label("Unable to combine all text fields to date", GUILayout.ExpandWidth(true)); } } } }
private void SetDepartureMinToYesterday() { //Set the Departure min to be yesterday dateMinDeparture = new KSPDateTime(Planetarium.GetUniversalTime()).Date; DepartureMin = dateMinDeparture.UT; }
internal static void SetLastFlightStatesToCurrent() { KACWorkerGameState.LastSaveGameName =KACWorkerGameState.CurrentSaveGameName; KACWorkerGameState.LastTime =KACWorkerGameState.CurrentTime; if (LastVessel != CurrentVessel) { if (VesselChanged != null) VesselChanged(LastVessel, CurrentVessel); } KACWorkerGameState.LastVessel = KACWorkerGameState.CurrentVessel; KACWorkerGameState.LastSOIBody =KACWorkerGameState.CurrentSOIBody; KACWorkerGameState.LastVesselTarget =KACWorkerGameState.CurrentVesselTarget; }