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 + KACTime.timeDateOffest.UT, KACTimeStringArray.TimeEntryPrecisionEnum.Years); if (DrawTimeEntry(ref rawDate, KACTimeStringArray.TimeEntryPrecisionEnum.Years, "Time:", 50, 35, 15)) { rawEntry.BuildFromUT(rawDate.UT - KACTime.timeDateOffest.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 KACTime(KACWorkerGameState.CurrentTime.UT + rawTime.UT); rawTimeToAlarm = new KACTime(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, Manuever" String strVesselID = ""; if (KACWorkerGameState.CurrentVessel != null && blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); Settings.Alarms.Add(new KACAlarm(strVesselID, strAlarmName, strAlarmNotes, rawTime.UT, 0, KACAlarm.AlarmType.Raw, (AddAction== KACAlarm.AlarmAction.KillWarp), (AddAction== KACAlarm.AlarmAction.PauseGame))); Settings.Save(); _ShowAddPane = false; } } catch (Exception) { GUILayout.Label("Unable to combine all text fields to date", GUILayout.ExpandWidth(true)); } }
private void WindowLayout_AddPane_Transfer() { intAddXferHeight = 317; KACTime XferCurrentTargetEventTime = null; GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Transfers", KACResources.styleHeading); //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 KACTime(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)); DebugLogFormatted("Error determining model data: {0}", ex.Message); } } GUILayout.EndHorizontal(); } else { 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(KACTime.PrintInterval(XferTargetBodies[intTarget].AlignmentTime, Settings.TimeFormat), 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)); KACTime tmpTime = new KACTime(tmpModelPoint.UT - KACWorkerGameState.CurrentTime.UT); GUILayout.Label(KACTime.PrintInterval(tmpTime, Settings.TimeFormat), KACResources.styleAddHeading, GUILayout.ExpandWidth(true), GUILayout.Height(20)); if (intTarget==intXferCurrentTarget) XferCurrentTargetEventTime = new KACTime(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)); DebugLogFormatted("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); } if (intXferCurrentParent != 0 || (!(Settings.XferUseModelData && Settings.XferModelDataLoaded))) { //Formula based - add new alarm if (DrawAddAlarm(new KACTime(KACWorkerGameState.CurrentTime.UT + XferTargetBodies[intXferCurrentTarget].AlignmentTime.UT), XferTargetBodies[intXferCurrentTarget].AlignmentTime, new KACTime(XferTargetBodies[intXferCurrentTarget].AlignmentTime.UT - timeMargin.UT))) { String strVesselID = ""; if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); Settings.Alarms.Add(new KACAlarm(strVesselID, strAlarmName, strAlarmNotes + "\r\n\tMargin: " + new KACTime(timeMargin.UT).IntervalString(), (KACWorkerGameState.CurrentTime.UT + XferTargetBodies[intXferCurrentTarget].AlignmentTime.UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmType.Transfer, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame), XferTargetBodies[intXferCurrentTarget])); Settings.Save(); _ShowAddPane = false; } } else { //Model based if (XferCurrentTargetEventTime!=null) { if (DrawAddAlarm(XferCurrentTargetEventTime, new KACTime(XferCurrentTargetEventTime.UT - KACWorkerGameState.CurrentTime.UT), new KACTime(XferCurrentTargetEventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT))) { String strVesselID = ""; if (blnAlarmAttachToVessel) strVesselID = KACWorkerGameState.CurrentVessel.id.ToString(); Settings.Alarms.Add(new KACAlarm(strVesselID, strAlarmName, strAlarmNotes + "\r\n\tMargin: " + new KACTime(timeMargin.UT).IntervalString(), (XferCurrentTargetEventTime.UT - timeMargin.UT), timeMargin.UT, KACAlarm.AlarmType.Transfer, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame), XferTargetBodies[intXferCurrentTarget])); 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"); DebugLogFormatted(ex.Message); DebugLogFormatted(ex.StackTrace); } //intAddXferHeight += intTestheight4; GUILayout.EndVertical(); }
////Variables for Node Alarms screen ////String strNodeMargin = "1"; ///// <summary> ///// Screen Layout for adding Alarm from Maneuver Node ///// </summary> private void WindowLayout_AddPane_Maneuver() { 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++) { KACTime nodeTime = new KACTime(KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes[intNode].UT); KACTime nodeInterval = new KACTime(nodeTime.UT - KACWorkerGameState.CurrentTime.UT); KACTime nodeAlarm; KACTime nodeAlarmInterval; try { nodeAlarm = new KACTime(nodeTime.UT - timeMargin.UT); nodeAlarmInterval = new KACTime(nodeTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT); } 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>(); Settings.Alarms.Add(new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, nodeAlarm.UT, timeMargin.UT, KACAlarm.AlarmType.Maneuver, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame), 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_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 = ""; KACTime eventTime = new KACTime(KACWorkerGameState.CurrentTime.UT + timeToPoint); KACTime eventInterval = new KACTime(timeToPoint); KACTime eventAlarm; KACTime eventAlarmInterval; try { eventAlarm = new KACTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KACTime(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, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame)); if (lstAlarmsWithTarget.Contains(AddType)) newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; Settings.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 Boolean DrawAddAlarm(KACTime AlarmDate, KACTime TimeToEvent, KACTime TimeToAlarm) { Boolean blnReturn = false; int intLineHeight = 18; //work out the strings GUILayout.BeginHorizontal(KACResources.styleAddAlarmArea); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Date:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(40), GUILayout.MaxWidth(40)); GUILayout.Label(KACTime.PrintDate(AlarmDate, Settings.TimeFormat), 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(KACTime.PrintInterval(TimeToEvent, Settings.TimeFormat), 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(KACTime.PrintInterval(TimeToAlarm, Settings.TimeFormat), 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(90), GUILayout.Height(intButtonHeight))) { blnReturn = true; } GUILayout.EndHorizontal(); return blnReturn; }
private void WindowLayout_AddPane_Crew() { intAddCrewHeight = 322; GUILayout.Label("Select Crew...", KACResources.styleAddSectionHeading); 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++) { //DebugLogFormatted("{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 + KACTime.timeDateOffest.UT, KACTimeStringArray.TimeEntryPrecisionEnum.Years); if (DrawTimeEntry(ref CrewDate, KACTimeStringArray.TimeEntryPrecisionEnum.Years, "Time:", 50, 35, 15)) { rawEntry.BuildFromUT(CrewDate.UT - KACTime.timeDateOffest.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 KACTime(KACWorkerGameState.CurrentTime.UT + CrewTime.UT); CrewTimeToAlarm = new KACTime(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, Manuever" KACAlarm addAlarm = new KACAlarm(pCM[intSelectedCrew].name, strAlarmName, strAlarmNotes, CrewTime.UT, 0, KACAlarm.AlarmType.Crew, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame)); if (CrewAlarmStoreNode) { if (KACWorkerGameState.ManeuverNodeExists) addAlarm.ManNodes = KACWorkerGameState.ManeuverNodesFuture; if (KACWorkerGameState.CurrentVesselTarget != null) addAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; } Settings.Alarms.Add(addAlarm); Settings.Save(); _ShowAddPane = false; } } catch (Exception) { // DebugLogFormatted(ex.Message); GUILayout.Label("Unable to combine all text fields to date", GUILayout.ExpandWidth(true)); } } }
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 = ""; KACTime eventTime = new KACTime(dblClosestUT); KACTime eventInterval = new KACTime(dblClosestUT - KACWorkerGameState.CurrentTime.UT); KACTime eventAlarm; KACTime eventAlarmInterval; try { eventAlarm = new KACTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KACTime(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, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame)); newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; newAlarm.ManNodes = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes; Settings.Alarms.Add(newAlarm); Settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Future Closest Approach found"; } if (strMarginConversion != "") GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); } } GUILayout.EndVertical(); }
private void WindowLayout_AddPane_TargetDistance() { intAddDistanceHeight = 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())) { DebugLogFormatted("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.ToInt32(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).maxAtmosphereAltitude)); if (GUILayout.Button("Set to Edge")) { dblTargetDistance = (tgtSelectedDistance as CelestialBody).maxAtmosphereAltitude; } 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 = ""; KACTime eventTime = new KACTime(dblDistanceUT); KACTime eventInterval = new KACTime(dblDistanceUT - KACWorkerGameState.CurrentTime.UT); KACTime eventAlarm; KACTime eventAlarmInterval; try { eventAlarm = new KACTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KACTime(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, (AddAction == KACAlarm.AlarmAction.KillWarp), (AddAction == KACAlarm.AlarmAction.PauseGame)); newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; newAlarm.ManNodes = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes; Settings.Alarms.Add(newAlarm); Settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Target Distance Approach found"; } if (strMarginConversion != "") GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); GUILayout.EndVertical(); }
public 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; }
public void FillEarthAlarmWindow(int WindowID) { GUILayout.BeginVertical(); intHeight_AddWindowCommon = 64; WindowLayout_CommonFields2(ref strAlarmName, ref blnAlarmAttachToVessel, ref AddAction, ref timeMargin, AddType, intHeight_AddWindowCommon); GUILayout.Label("Enter Time for reminder...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Time for Alarm (24 hour):",KACResources.styleAddHeading); GUILayout.FlexibleSpace(); if (DrawTimeField(ref strAlarmEarthHour, "", 40, 0)) { if (strAlarmEarthHour.Length > 2) strAlarmEarthHour = strAlarmEarthHour.Substring(strAlarmEarthHour.Length - 2, 2); } GUILayout.Label(":", KACResources.styleAlarmMessageTime, GUILayout.Width(3)); //strAlarmEarthMin = GUILayout.TextField(strAlarmEarthMin, KACResources.styleAddField, GUILayout.Width(40)); if (DrawTimeField(ref strAlarmEarthMin, "", 40, 0)) { if (strAlarmEarthMin.Length > 2) strAlarmEarthMin = strAlarmEarthMin.Substring(strAlarmEarthMin.Length-2, 2); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); try { DateTime dteWorking; dteWorking=DateTime.ParseExact(strAlarmEarthHour + ":" + strAlarmEarthMin,"H:m",null); TimeSpan tmAlarm = (dteWorking.TimeOfDay - DateTime.Now.TimeOfDay); if (tmAlarm.TotalSeconds < 0) tmAlarm=tmAlarm.Add(new TimeSpan(24, 0, 0)); KACTime TimeToAlarm = new KACTime(tmAlarm.TotalSeconds); //Bit at the bottom to add an alarm int intLineHeight = 18; GUILayout.BeginHorizontal(KACResources.styleAddAlarmArea); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Date:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(40), GUILayout.MaxWidth(40)); GUILayout.Label(dteWorking.ToLongTimeString(), KACResources.styleContentEarth, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Time to Alarm:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(100), GUILayout.MaxWidth(100)); GUILayout.Label(KACTime.PrintInterval(TimeToAlarm, KACTime.PrintTimeFormat.DateTimeString), KACResources.styleContentEarth, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.Space(10); int intButtonHeight = 36; if (GUILayout.Button("Add Alarm", KACResources.styleButton, GUILayout.Width(90), GUILayout.Height(intButtonHeight))) { Settings.Alarms.Add( new KACAlarm(null,strAlarmName,strAlarmNotes, EarthTimeEncode(DateTime.Now + tmAlarm), 0, KACAlarm.AlarmType.EarthTime, (AddAction== KACAlarm.AlarmAction.KillWarp), (AddAction== KACAlarm.AlarmAction.PauseGame)) ); Settings.SaveAlarms(); _ShowEarthAlarm = false; } GUILayout.EndHorizontal(); } catch (Exception) { GUILayout.Label("Unable to determine Earth Time", GUILayout.ExpandWidth(true)); } GUILayout.EndVertical(); SetTooltipText(); }
private void MonitorManNodeOnPath() { //is there an alarm KACAlarm tmpAlarm = Settings.Alarms.FirstOrDefault(a => a.TypeOfAlarm == KACAlarm.AlarmType.ManeuverAuto && a.VesselID == KACWorkerGameState.CurrentVessel.id.ToString()); //is there an alarm and no man node? if (KACWorkerGameState.ManeuverNodeExists && (KACWorkerGameState.ManeuverNodeFuture != null)) { KACTime nodeAutoAlarm; nodeAutoAlarm = new KACTime(KACWorkerGameState.ManeuverNodeFuture.UT - Settings.AlarmAddManAutoMargin); 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) { tmpAlarm.AlarmTime.UT = nodeAutoAlarm.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 Settings.Alarms.Add(new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strManNodeAlarmName, strManNodeAlarmNotes, nodeAutoAlarm.UT, Settings.AlarmAddManAutoMargin, KACAlarm.AlarmType.ManeuverAuto, (Settings.AlarmAddManAuto_Action == (int)KACAlarm.AlarmAction.KillWarp), (Settings.AlarmAddManAuto_Action == (int)KACAlarm.AlarmAction.PauseGame), manNodesToStore)); Settings.Save(); } } } else if (Settings.AlarmAddManAuto_andRemove && !KACWorkerGameState.ManeuverNodeExists) { Settings.Alarms.Remove(tmpAlarm); } }