public int UpdateSymmetryCounterparts() { int i = 0; foreach (Part sPart in part.symmetryCounterparts) { ModuleFuelTanks fuel = (ModuleFuelTanks)sPart.Modules["ModuleFuelTanks"]; if (fuel) { i++; foreach (ModuleFuelTanks.FuelTank tank in fuel.fuelList) { tank.amount = 0; tank.maxAmount = 0; } foreach (ModuleFuelTanks.FuelTank tank in this.fuelList) { if (tank.maxAmount > 0) { ModuleFuelTanks.FuelTank pTank = fuel.fuelList.Find(t => t.name.Equals(tank.name)); if (pTank) { pTank.maxAmount = tank.maxAmount; pTank.amount = tank.amount; } } } } } return(i); }
private void fuelManagerGUI(int WindowID) { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Current mass: " + ModuleFuelTanks.RoundTo4SigFigs(part.mass + part.GetResourceMass()) + " Ton(s)"); GUILayout.Label("Dry mass: " + Math.Round(1000 * part.mass) / 1000.0 + " Ton(s)"); GUILayout.EndHorizontal(); if (fuelList.Count == 0) { GUILayout.BeginHorizontal(); GUILayout.Label("This fuel tank cannot hold resources."); GUILayout.EndHorizontal(); return; } print("fuelManagerGUI Row 2"); GUILayout.BeginHorizontal(); GUILayout.Label("Available volume: " + availableVolume + " / " + volume); GUILayout.EndHorizontal(); int text_field = 0; foreach (ModuleFuelTanks.FuelTank tank in fuelList) { print("fuelManagerGUI Row 3." + tank.ToString()); GUILayout.BeginHorizontal(); int amountField = text_field; text_field++; if (textFields.Count < text_field) { textFields.Add(""); textFields[amountField] = tank.amount.ToString(); } int maxAmountField = text_field; text_field++; if (textFields.Count < text_field) { textFields.Add(""); textFields[maxAmountField] = tank.maxAmount.ToString(); } GUILayout.Label(" " + tank, GUILayout.Width(120)); if (part.Resources.Contains(tank) && part.Resources[tank].maxAmount > 0.0) { double amount = ModuleFuelTanks.RoundTo4SigFigs(part.Resources[tank].amount); double maxAmount = ModuleFuelTanks.RoundTo4SigFigs(part.Resources[tank].maxAmount); GUIStyle color = new GUIStyle(GUI.skin.textField); if (textFields[amountField].Trim().Equals("")) // I'm not sure why this happens, but we'll fix it here. { textFields[amountField] = tank.amount.ToString(); } else if (textFields[amountField].Equals(amount.ToString())) { color.normal.textColor = Color.white; } else { color.normal.textColor = Color.yellow; } textFields[amountField] = GUILayout.TextField(textFields[amountField], color, GUILayout.Width(65)); GUILayout.Label("/", GUILayout.Width(5)); color = new GUIStyle(GUI.skin.textField); if (textFields[maxAmountField].Equals(maxAmount.ToString())) { color.normal.textColor = Color.white; } else { color.normal.textColor = Color.yellow; } textFields[maxAmountField] = GUILayout.TextField(textFields[maxAmountField], color, GUILayout.Width(65)); GUILayout.Label(" ", GUILayout.Width(5)); if (GUILayout.Button("Update", GUILayout.Width(60))) { double newMaxAmount = maxAmount; if (!double.TryParse(textFields[maxAmountField], out newMaxAmount)) { newMaxAmount = maxAmount; } double newAmount = amount; if (!double.TryParse(textFields[amountField], out newAmount)) { newAmount = amount; } if (newMaxAmount != maxAmount) { tank.maxAmount = newMaxAmount; } if (newAmount != amount) { tank.amount = newAmount; } textFields[amountField] = tank.amount.ToString(); textFields[maxAmountField] = tank.maxAmount.ToString(); if (part.symmetryCounterparts.Count > 0) { UpdateSymmetryCounterparts(); } } if (GUILayout.Button("Remove", GUILayout.Width(60))) { tank.maxAmount = 0; textFields.Clear(); if (part.symmetryCounterparts.Count > 0) { UpdateSymmetryCounterparts(); } } } else if (availableVolume >= 0.001) { string extraData = "Max: " + ModuleFuelTanks.RoundTo4SigFigs(availableVolume * tank.efficiency).ToString() + " (+" + ModuleFuelTanks.RoundTo4SigFigs(availableVolume * tank.efficiency * tank.mass) + " tons)"; GUILayout.Label(extraData, GUILayout.Width(150)); if (GUILayout.Button("Add", GUILayout.Width(130))) { tank.maxAmount = Math.Floor(1000 * availableVolume * tank.efficiency) / 1000.0; tank.amount = tank.maxAmount; textFields.Clear(); if (part.symmetryCounterparts.Count > 0) { UpdateSymmetryCounterparts(); } } } else { GUILayout.Label(" No room for tank.", GUILayout.Width(150)); } GUILayout.EndHorizontal(); } print("fuelManagerGUI Row 4"); GUILayout.BeginHorizontal(); if (GUILayout.Button("Remove All Tanks")) { textFields.Clear(); foreach (ModuleFuelTanks.FuelTank tank in fuelList) { tank.amount = 0; tank.maxAmount = 0; } if (part.symmetryCounterparts.Count > 0) { UpdateSymmetryCounterparts(); } } GUILayout.EndHorizontal(); if (GetEnginesFedBy(part).Count > 0) { List <string> check_dupes = new List <string>(); print("fuelManagerGUI Row 5"); GUILayout.BeginHorizontal(); GUILayout.Label("Configure remaining volume for engines:"); GUILayout.EndHorizontal(); foreach (Part engine in GetEnginesFedBy(part)) { double ratio_factor = 0.0; double inefficiency = 0.0; ModuleEngines thruster = (ModuleEngines)engine.Modules["ModuleEngines"]; // tank math: // inefficiency = sum[(1 - efficiency) * ratio] // fluid_v = v * (1 - inefficiency) // f = fluid_v * ratio foreach (ModuleEngines.Propellant tfuel in thruster.propellants) { if (PartResourceLibrary.Instance.GetDefinition(tfuel.name) == null) { print("Unknown RESOURCE {" + tfuel.name + "}"); ratio_factor = 0.0; break; } else if (PartResourceLibrary.Instance.GetDefinition(tfuel.name).resourceTransferMode == ResourceTransferMode.NONE) { //ignore this propellant, since it isn't serviced by fuel tanks } else { ModuleFuelTanks.FuelTank tank = fuelList.Find(f => f.ToString().Equals(tfuel.name)); if (tank) { inefficiency += (1 - tank.efficiency) * tfuel.ratio; ratio_factor += tfuel.ratio; } else { ratio_factor = 0.0; break; } } } if (ratio_factor > 0.0) { string label = ""; foreach (ModuleEngines.Propellant tfuel in thruster.propellants) { if (PartResourceLibrary.Instance.GetDefinition(tfuel.name).resourceTransferMode != ResourceTransferMode.NONE) { if (label.Length > 0) { label += " / "; } label += Math.Round(100 * tfuel.ratio / ratio_factor).ToString() + "% " + tfuel.name; } } if (!check_dupes.Contains(label)) { check_dupes.Add(label); print("fuelManagerGUI Row 6." + label); GUILayout.BeginHorizontal(); if (GUILayout.Button(label)) { textFields.Clear(); double total_volume = availableVolume * (1 - inefficiency / ratio_factor); foreach (ModuleEngines.Propellant tfuel in thruster.propellants) { if (PartResourceLibrary.Instance.GetDefinition(tfuel.name).resourceTransferMode != ResourceTransferMode.NONE) { ModuleFuelTanks.FuelTank tank = fuelList.Find(t => t.name.Equals(tfuel.name)); if (tank) { tank.maxAmount += Math.Floor(1000 * total_volume * tfuel.ratio / ratio_factor) / 1000.0; tank.amount += Math.Floor(1000 * total_volume * tfuel.ratio / ratio_factor) / 1000.0; } } } if (part.symmetryCounterparts.Count > 0) { UpdateSymmetryCounterparts(); } } GUILayout.EndHorizontal(); } } } } GUILayout.EndVertical(); print("fuelManagerGUI Done."); }