public override void updateLocalElements(object sender, EventArgs e) { // Re-usable data variable for graph data List <List <KeyValuePair <double, double?> > > data = new List <List <KeyValuePair <double, double?> > >(); List <Plot.Type> types = new List <Plot.Type>(); if (form.form.connected && form.form.krpc.CurrentGameScene == GameScene.Flight) { currentStage = screenStreams.GetData(DataType.control_currentStage); MET = screenStreams.GetData(DataType.vessel_MET); parts = screenStreams.GetData(DataType.vessel_parts); vesselReferenceFrame = screenStreams.GetData(DataType.vessel_referenceFrame); bool force = false; if (currentStage != oldStage) { force = true; screenStreams.setStage(currentStage); Console.WriteLine(DateTime.Now.ToString() + "." + DateTime.Now.Millisecond.ToString() + " NEW STAGE: " + currentStage.ToString()); } getStageSupplies(force); if (LiquidFuelMax == 0) { // TRY TO WALK TROUGH THE STAGES UNTIL FUEL IS FOUND OR STAGES RUN OUT for (int s = currentStage - 1; s >= 0; s--) { screenStreams.setStage(s); Console.WriteLine(DateTime.Now.ToString() + "." + DateTime.Now.Millisecond.ToString() + " SET STREAM STAGE: " + s.ToString()); getStageSupplies(true); if (LiquidFuelMax != 0) { oldStage = currentStage; break; } } } TotLiquidFuelMax = screenStreams.GetData(DataType.resource_total_max_liquidFuel); TotLiquidFuelAmount = screenStreams.GetData(DataType.resource_total_amount_liquidFuel); TotOxidizerMax = screenStreams.GetData(DataType.resource_total_max_oxidizer); TotOxidizerAmount = screenStreams.GetData(DataType.resource_total_amount_oxidizer); TotMonoPropellantMax = screenStreams.GetData(DataType.resource_total_max_monoPropellant); TotMonoPropellantAmount = screenStreams.GetData(DataType.resource_total_amount_monoPropellant); mass = screenStreams.GetData(DataType.vessel_mass); screenLabels[2].Text = "LT: " + Helper.timeString(DateTime.Now.TimeOfDay.TotalSeconds); screenLabels[3].Text = "MET: " + Helper.timeString(MET, 3); // 0 RPC /** * Engines **/ // Get parts in current stage screenLabels[6].Text = "STAGE: " + currentStage.ToString(); // 0 RPC bool foundEngine = false; double multiplier = 91; double maxDev = 0; double stageCurThr = 0; double stageMaxThr = 0; int n = 0; if (parts != null) { // CLEAR OLD ENGINES foreach (EngineIndicator ei in screenEngines) { ei.display(false); } for (int i = currentStage; i >= 0; i--) { IList <Part> stageParts = parts.InStage(i); foreach (Part part in stageParts) { Engine eng = part.Engine; if (eng != null) { foundEngine = true; Tuple <double, double, double> pos = part.Position(vesselReferenceFrame); double left = pos.Item1; double top = pos.Item3; double devX = Math.Abs(left); if (devX > maxDev) { maxDev = devX; } double devY = Math.Abs(top); if (devY > maxDev) { maxDev = devY; } if (screenEngines.Count < (n + 1)) { screenEngines.Add(null); screenEngines[n] = Helper.CreateEngine(0, 0, (n + 1).ToString(), eng.MaxVacuumThrust); } screenEngines[n].display(true); screenEngines[n].setThrust(eng.MaxVacuumThrust); screenEngines[n].offsetX = left; screenEngines[n].offsetY = top; if (eng.Thrust > 0) { screenEngines[n].setStatus(true); } else { screenEngines[n].setStatus(false); } // Engine data screenLabels[41 + n].Text = Helper.prtlen((n + 1).ToString(), 4, Helper.Align.RIGHT) + ":" + "" + Helper.prtlen(Helper.toFixed(eng.Thrust / 1000, 1), 7, Helper.Align.RIGHT) + " " + Helper.prtlen(Helper.toFixed(eng.MaxThrust / 1000, 1), 7, Helper.Align.RIGHT) + " " + Helper.prtlen(Helper.toFixed(eng.VacuumSpecificImpulse, 1), 5, Helper.Align.RIGHT); stageCurThr += eng.Thrust; stageMaxThr += eng.MaxThrust; n++; } } if (foundEngine) { int engNum = n; // TOTAL THUST AND STUFF screenLabels[41 + n].Text = "─────────────────────────────────"; n++; screenLabels[41 + n].Text = " TOT:" + "" + Helper.prtlen(Helper.toFixed(stageCurThr / 1000, 1), 7, Helper.Align.RIGHT) + " " + Helper.prtlen(Helper.toFixed(stageMaxThr / 1000, 1), 7, Helper.Align.RIGHT); n++; // CLEAR OUT OLD LABLED while (n < 20) { screenLabels[41 + n].Text = ""; n++; } int maxSpread = 96; multiplier = maxSpread / maxDev; if (engNum == 1) { multiplier = 0; } // CENTER POINT int centerX = 184; int centerY = 214; // position indicators for (int j = 0; j < engNum; j++) { int x = (int)Math.Round(centerX + (screenEngines[j].offsetX * multiplier)); int y = (int)Math.Round(centerY + (screenEngines[j].offsetY * multiplier)); screenEngines[j].setCenterPoint(x, y); } break; } } } // Disable other engineIndicators while (n < screenEngines.Count) { screenEngines[n].Dispose(); screenEngines.RemoveAt(n); screenLabels[41 + n].Text = ""; n++; } screenEngines.TrimExcess(); // Weight and TWR double weight = mass / 1000; double TWRc = (stageCurThr / 1000) / (weight * 9.81); double TWRm = (stageMaxThr / 1000) / (weight * 9.81);; screenLabels[62].Text = " MASS: " + Helper.prtlen(Helper.toFixed(weight, 1), 5, Helper.Align.RIGHT) + "t"; screenLabels[64].Text = " TWR: " + Helper.prtlen(Helper.toFixed(TWRc, 2), 4, Helper.Align.RIGHT) + " " + Helper.prtlen(Helper.toFixed(TWRm, 2), 4, Helper.Align.RIGHT); // Supplies double mF = LiquidFuelMax; double cF = LiquidFuelAmount; double mO = OxidizerMax; double cO = OxidizerAmount; double mM = MonoPropellantMax; double cM = MonoPropellantAmount; screenLabels[70].Text = " LF LO MP"; screenLabels[71].Text = "STAGE:" + Helper.prtlen(Math.Round(cF).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Math.Round(cO).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Helper.toFixed(cM, 2), 7, Helper.Align.RIGHT); screenLabels[72].Text = " %:" + Helper.prtlen(Math.Round((cF / mF) * 100).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Math.Round((cO / mO) * 100).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Math.Round((cM / mM) * 100).ToString(), 7, Helper.Align.RIGHT); mF = TotLiquidFuelMax; cF = TotLiquidFuelAmount; mO = TotOxidizerMax; cO = TotOxidizerAmount; mM = TotMonoPropellantMax; cM = TotMonoPropellantAmount; screenLabels[74].Text = " TOT:" + Helper.prtlen(Math.Round(cF).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Math.Round(cO).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Helper.toFixed(cM, 2), 7, Helper.Align.RIGHT); screenLabels[75].Text = " %:" + Helper.prtlen(Math.Round((cF / mF) * 100).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Math.Round((cO / mO) * 100).ToString(), 7, Helper.Align.RIGHT) + Helper.prtlen(Math.Round((cM / mM) * 100).ToString(), 7, Helper.Align.RIGHT); // Delta V // TOTO: Maybe buttonifize this, so the calculations are not done every refresh. updateDeltaVStats(currentStage, parts); } }