private void AttemptTransfer() { Part targetPart = GetPartClicked(); // No part was clicked if (targetPart == null) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoPartSelected"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); EndTransfer(); } else { // part cannot be on another vessel if (!VesselConnected(targetPart)) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortUnconnected"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); EndTransfer(); return; } RadioactiveStorageContainer container = targetPart.GetComponent <RadioactiveStorageContainer>(); if (container == null) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoRadStorage"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); EndTransfer(); } else { ModuleResourceConverter converter = container.GetComponent <ModuleResourceConverter>(); FissionReactor reactor = container.GetComponent <FissionReactor>(); if (core != null && core.CoreTemperature > container.MaxTempForTransfer) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortTooHot", container.MaxTempForTransfer.ToString("F0")), 5.0f, ScreenMessageStyle.UPPER_CENTER)); } else if (converter != null && converter.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortToRunningConverter"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); } else if (reactor != null && reactor.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortToRunningReactor"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); } else { // get available space in the target container double availableSpace = container.GetResourceAmount(curTransferType, true) - container.GetResourceAmount(curTransferType); double availableResource = this.GetResourceAmount(curTransferType); // transfer as much as possible double amount = this.part.RequestResource(curTransferType, availableSpace); container.part.RequestResource(curTransferType, -amount); ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_Success", amount.ToString("F1"), curTransferType.ToString()), 5.0f, ScreenMessageStyle.UPPER_CENTER)); transferring = false; curTransferType = ""; } } } }
public void FixedUpdate() { if (HighLogic.LoadedScene == GameScenes.FLIGHT) { if (reactor != null) { float maxFlowScalar = 0f; for (int i = 0; i < engineData.Count; i++) { // If the engine is off, it will have the maximum Isp available if (!engineData[i].engineFX.isActiveAndEnabled || (engineData[i].engineFX.isActiveAndEnabled && engineData[i].engineFX.throttleSetting <= 0f)) { engineData[i].engineFX.atmosphereCurve = engineData[i].ispCurve; maxFlowScalar = Mathf.Max(maxFlowScalar, 0.0f); } else { float CoreTemperatureRatio = TempIspScale.Evaluate((float)core.CoreTemperature); float reactorRatio = reactor.ActualPowerPercent / 100f * reactor.CoreIntegrity / 100f; if (!reactor.ModuleIsActive()) { reactorRatio = 0f; } float ispRatio = CoreTemperatureRatio * reactorRatio; engineData[i].engineFX.atmosphereCurve = new FloatCurve(); engineData[i].engineFX.atmosphereCurve.Add(0f, engineData[i].ispCurve.Evaluate(0f) * ispRatio); engineData[i].engineFX.atmosphereCurve.Add(1f, engineData[i].ispCurve.Evaluate(1f) * ispRatio); engineData[i].engineFX.atmosphereCurve.Add(4f, engineData[i].ispCurve.Evaluate(4f) * ispRatio); //Utils.Log(String.Format("{0} ui {1} max {2} reqested", engineData[i].engineFX.fuelFlowGui, engineData[i].engineFX.maxFuelFlow, engineData[i].engineFX.requestedMassFlow)); //Utils.Log(String.Format("{0} t_setting {1} normTr {2} normout", engineData[i].engineFX.throttleSetting, engineData[i].engineFX.normalizedThrustOutput, engineData[i].engineFX.normalizedOutput)); maxFlowScalar = Mathf.Max(maxFlowScalar, (engineData[i].engineFX.throttleSetting)); } } float heat = reactor.ActualPowerPercent / 100f * reactor.HeatGeneration / 50f * reactor.CoreIntegrity / 100f; //flowRadiator.ChangeRadiatorTransfer(Mathf.Max(base.CurrentHeatUsed, heat) * maxFlowScalar); float exhaustCooling = flowRadiator.ChangeRadiatorTransfer(maxFlowScalar); core.MaxCoolant = Mathf.Clamp(heat - exhaustCooling, 0.0f, heat); } } }
public void FixedUpdate() { if (HighLogic.LoadedScene == GameScenes.FLIGHT) { if (reactor != null) { float maxFlowScalar = 0f; foreach (EngineBaseData eData in engineData) { // If the engine is off, it will have the maximum Isp available if (!eData.engineFX.isActiveAndEnabled || (eData.engineFX.isActiveAndEnabled && eData.engineFX.throttleSetting <= 0f)) { eData.engineFX.atmosphereCurve = eData.ispCurve; maxFlowScalar = Mathf.Max(maxFlowScalar, 0.0f); } else { float CoreTemperatureRatio = TempIspScale.Evaluate((float)core.CoreTemperature); float reactorRatio = reactor.CurrentPowerPercent / 100f; if (!reactor.ModuleIsActive()) { reactorRatio = 0f; } float ispRatio = CoreTemperatureRatio * reactorRatio; eData.engineFX.atmosphereCurve = new FloatCurve(); eData.engineFX.atmosphereCurve.Add(0f, eData.ispCurve.Evaluate(0f) * ispRatio); eData.engineFX.atmosphereCurve.Add(1f, eData.ispCurve.Evaluate(1f) * ispRatio); eData.engineFX.atmosphereCurve.Add(4f, eData.ispCurve.Evaluate(4f) * ispRatio); //Utils.Log(String.Format("{0} ui {1} max {2} reqested",eData.engineFX.fuelFlowGui,eData.engineFX.maxFuelFlow,eData.engineFX.requestedMassFlow)); maxFlowScalar = Mathf.Max(maxFlowScalar, (eData.engineFX.requestedMassFlow / eData.engineFX.maxFuelFlow)); } } float heat = reactor.CurrentPowerPercent / 100f * reactor.HeatGeneration / 50f * reactor.CoreIntegrity / 100f; flowRadiator.ChangeRadiatorTransfer(Mathf.Max(base.CurrentHeatUsed, heat) * maxFlowScalar); } } }
public bool PartCanTransferResource(string nm) { // Some modules need to be off. ModuleResourceConverter converter = GetComponent <ModuleResourceConverter>(); FissionReactor reactor = GetComponent <FissionReactor>(); if (converter != null && converter.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortFromRunningConverter"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } if (reactor != null && reactor.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortFromRunningReactor"), 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } // Fail if the part is too hot if (core != null && core.CoreTemperature > MaxTempForTransfer) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortTooHot", MaxTempForTransfer.ToString("F0")), 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } // Fail if that part can't contain this resource if ((GetResourceAmount(nm, true) <= 0d)) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoResource", nm), 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } // Fail if this part has no resource if (GetResourceAmount(nm) <= 0d) { ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoResource", nm), 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } return(true); }
public bool PartCanTransferResource(string nm) { // Some modules need to be off. ModuleResourceConverter converter = GetComponent <ModuleResourceConverter>(); FissionReactor reactor = GetComponent <FissionReactor>(); if (converter != null && converter.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer from a running converter!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } if (reactor != null && reactor.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer from a running reactor! Seriously a bad idea!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } // Fail if the part is too hot if (part.temperature > MaxTempForTransfer) { ScreenMessages.PostScreenMessage(new ScreenMessage(String.Format("This part must be below {0:F0} K to transfer!", MaxTempForTransfer), 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } // Fail if that part can't contain this resource if ((GetResourceAmount(nm, true) <= 0d)) { ScreenMessages.PostScreenMessage(new ScreenMessage("This part has no " + nm + " to transfer!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } // Fail if this part has no resource if (GetResourceAmount(nm) <= 0d) { ScreenMessages.PostScreenMessage(new ScreenMessage("This part has no " + nm + " to transfer!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); return(false); } return(true); }
private void DrawReactor(FissionReactor reactor) { FissionGenerator gen = reactor.GetComponent<FissionGenerator>(); GUILayout.BeginHorizontal(gui_bg); GUILayout.BeginVertical(); // Capacitor Name Field GUILayout.Label(reactor.part.partInfo.title, gui_header, GUILayout.MaxHeight(32f), GUILayout.MinHeight(32f), GUILayout.MaxWidth(150f), GUILayout.MinWidth(150f)); GUILayout.Space(10f); GUILayout.BeginHorizontal(); bool y = reactor.ModuleIsActive(); bool x = GUILayout.Toggle(reactor.ModuleIsActive(),"Active",gui_toggle); if (x != y) { reactor.ToggleResourceConverterAction( new KSPActionParam(0,KSPActionType.Activate) ); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); // Changeables GUILayout.BeginVertical(); //GUILayout.Label("Core Temperature", gui_text, GUILayout.MaxWidth(150f), GUILayout.MinWidth(150f)); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); GUILayout.Label("Reactor Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); if (reactor.FollowThrottle) { GUILayout.Label(String.Format("Actual: {0:F0}%", reactor.ActualPowerPercent), gui_text); } GUILayout.EndVertical(); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); reactor.CurrentPowerPercent = GUILayout.HorizontalSlider(reactor.CurrentPowerPercent, 0f, 100f, GUILayout.MinWidth(150f)); GUILayout.Label(String.Format("{0:F0}%", reactor.CurrentPowerPercent), gui_text); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("Heat Output: {0:F1} kW", reactor.AvailablePower), gui_text, GUILayout.MaxWidth(120f), GUILayout.MinWidth(120f)); if (gen != null) { GUILayout.Label(String.Format("Power Output: {0:F1} Ec/s", gen.CurrentGeneration), gui_text, GUILayout.MaxWidth(140f), GUILayout.MinWidth(140f)); } else { GUILayout.Label(String.Format("Power Output: No Generator"), gui_text, GUILayout.MaxWidth(100f), GUILayout.MinWidth(100f)); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Core Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); float coreTemp = (float)reactor.GetCoreTemperature(); float meltdownTemp = reactor.MaximumTemperature; float nominalTemp = reactor.NominalTemperature; float criticalTemp = reactor.CriticalTemperature; float tempAreaWidth = 250f; float tempBarWidth = 210f; Rect tempArea = GUILayoutUtility.GetRect(tempAreaWidth, 60f); Rect barArea = new Rect(20f, 20f, tempBarWidth, 40f); float nominalXLoc = nominalTemp / meltdownTemp * tempBarWidth; float criticalXLoc = criticalTemp / meltdownTemp * tempBarWidth; float tempBarFGSize = tempBarWidth*(coreTemp/meltdownTemp); Color barColor = new Color(); if (coreTemp <= nominalTemp) barColor = Color.green; else if (coreTemp <= criticalTemp) barColor = Color.Lerp(Color.green, new Color(1.0f, 102f / 255f, 0f), (coreTemp - nominalTemp) / (criticalTemp - nominalTemp)); else barColor = Color.Lerp(new Color(1.0f, 102f / 255f, 0f), Color.red, (coreTemp - criticalTemp) / (meltdownTemp - criticalTemp)); GUI.BeginGroup(tempArea); GUI.Box(new Rect(0f,10f,tempBarWidth,10f),"", progressBarBG); GUI.color = barColor; GUI.Box(new Rect(0f, 11f, tempBarFGSize, 7f), "", progressBarFG); GUI.color = Color.white; GUI.Label(new Rect(tempBarWidth+7f, 8f, 40f, 20f), String.Format("{0:F0} K", coreTemp), gui_text); GUI.Label(new Rect(0f + nominalXLoc - 13f, 16f, 22f, 25f), notchTexture); GUI.Label(new Rect(0f + criticalXLoc - 13f, 16f, 22f, 25f), notchTexture); GUI.Label(new Rect(nominalXLoc - 46f, 25f, 40f, 20f), String.Format("{0:F0} K", nominalTemp), gui_text); GUI.Label(new Rect(9f + criticalXLoc, 25f, 40f, 20f), String.Format("{0:F0} K", criticalTemp), gui_text); // GUI.Label(new Rect(20f+tempBarWidth, 30f, 40f, 20f), String.Format("{0:F0} K", meltdownTemp), gui_text); GUI.EndGroup(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Safety Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); reactor.CurrentSafetyOverride = GUILayout.HorizontalSlider(reactor.CurrentSafetyOverride, 700f, reactor.MaximumTemperature, GUILayout.MinWidth(150f)); GUILayout.Label(String.Format("{0:F0} K", reactor.CurrentSafetyOverride), gui_text); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Fuel Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); GUILayout.Label(reactor.FuelStatus, gui_text); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); }
private void AttemptTransfer() { Part targetPart = GetPartClicked(); // No part was clicked if (targetPart == null) { ScreenMessages.PostScreenMessage(new ScreenMessage("No part selected, exiting transfer mode...", 5.0f, ScreenMessageStyle.UPPER_CENTER)); EndTransfer(); } else { // part cannot be on another vessel if (!VesselConnected(targetPart)) { ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer to an unconnected vessel, exiting transfer mode...", 5.0f, ScreenMessageStyle.UPPER_CENTER)); EndTransfer(); return; } RadioactiveStorageContainer container = targetPart.GetComponent <RadioactiveStorageContainer>(); if (container == null) { ScreenMessages.PostScreenMessage(new ScreenMessage("Selected part can't handle radioactive storage, exiting transfer mode...", 5.0f, ScreenMessageStyle.UPPER_CENTER)); EndTransfer(); } else { Debug.Log("A"); ModuleResourceConverter converter = container.GetComponent <ModuleResourceConverter>(); FissionReactor reactor = container.GetComponent <FissionReactor>(); Debug.Log("B"); if (part.temperature > container.MaxTempForTransfer) { ScreenMessages.PostScreenMessage(new ScreenMessage(String.Format("Selected part must be below {0:F0} K to transfer!", container.MaxTempForTransfer), 5.0f, ScreenMessageStyle.UPPER_CENTER)); } else if (converter != null && converter.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer into a running converter!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); } else if (reactor != null && reactor.ModuleIsActive()) { ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer into a running reactor! Seriously a bad idea!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); } else { Debug.Log("s"); // get available space in the target container double availableSpace = container.GetResourceAmount(curTransferType, true) - container.GetResourceAmount(curTransferType); double availableResource = this.GetResourceAmount(curTransferType); Debug.Log("1"); // transfer as much as possible double amount = this.part.RequestResource(curTransferType, availableSpace); container.part.RequestResource(curTransferType, -amount); Debug.Log("2"); ScreenMessages.PostScreenMessage(new ScreenMessage(String.Format("Transferred {0:F0} ", amount) + curTransferType + " to container!", 5.0f, ScreenMessageStyle.UPPER_CENTER)); } } } }
private void DrawReactor(FissionReactor reactor) { FissionGenerator gen = reactor.GetComponent <FissionGenerator>(); GUILayout.BeginHorizontal(gui_bg); GUILayout.BeginVertical(); // Capacitor Name Field GUILayout.Label(reactor.part.partInfo.title, gui_header, GUILayout.MaxHeight(32f), GUILayout.MinHeight(32f), GUILayout.MaxWidth(150f), GUILayout.MinWidth(150f)); GUILayout.Space(10f); GUILayout.BeginHorizontal(); bool y = reactor.ModuleIsActive(); bool x = GUILayout.Toggle(reactor.ModuleIsActive(), "Active", gui_toggle); if (x != y) { reactor.ToggleResourceConverterAction(new KSPActionParam(0, KSPActionType.Activate)); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); // Changeables GUILayout.BeginVertical(); //GUILayout.Label("Core Temperature", gui_text, GUILayout.MaxWidth(150f), GUILayout.MinWidth(150f)); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); GUILayout.Label("Reactor Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); if (reactor.FollowThrottle) { GUILayout.Label(String.Format("Actual: {0:F0}%", reactor.ActualPowerPercent), gui_text); } GUILayout.EndVertical(); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); reactor.CurrentPowerPercent = GUILayout.HorizontalSlider(reactor.CurrentPowerPercent, 0f, 100f, GUILayout.MinWidth(150f)); GUILayout.Label(String.Format("{0:F0}%", reactor.CurrentPowerPercent), gui_text); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("Heat Output: {0:F1} kW", reactor.AvailablePower), gui_text, GUILayout.MaxWidth(120f), GUILayout.MinWidth(120f)); if (gen != null) { GUILayout.Label(String.Format("Power Output: {0:F1} Ec/s", gen.CurrentGeneration), gui_text, GUILayout.MaxWidth(140f), GUILayout.MinWidth(140f)); } else { GUILayout.Label(String.Format("Power Output: No Generator"), gui_text, GUILayout.MaxWidth(100f), GUILayout.MinWidth(100f)); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Core Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); float coreTemp = (float)reactor.GetCoreTemperature(); float meltdownTemp = reactor.MaximumTemperature; float nominalTemp = reactor.NominalTemperature; float criticalTemp = reactor.CriticalTemperature; float tempAreaWidth = 250f; float tempBarWidth = 210f; Rect tempArea = GUILayoutUtility.GetRect(tempAreaWidth, 60f); Rect barArea = new Rect(20f, 20f, tempBarWidth, 40f); float nominalXLoc = nominalTemp / meltdownTemp * tempBarWidth; float criticalXLoc = criticalTemp / meltdownTemp * tempBarWidth; float tempBarFGSize = tempBarWidth * (coreTemp / meltdownTemp); Color barColor = new Color(); if (coreTemp <= nominalTemp) { barColor = Color.green; } else if (coreTemp <= criticalTemp) { barColor = Color.Lerp(Color.green, new Color(1.0f, 102f / 255f, 0f), (coreTemp - nominalTemp) / (criticalTemp - nominalTemp)); } else { barColor = Color.Lerp(new Color(1.0f, 102f / 255f, 0f), Color.red, (coreTemp - criticalTemp) / (meltdownTemp - criticalTemp)); } GUI.BeginGroup(tempArea); GUI.Box(new Rect(0f, 10f, tempBarWidth, 10f), "", progressBarBG); GUI.color = barColor; GUI.Box(new Rect(0f, 11f, tempBarFGSize, 7f), "", progressBarFG); GUI.color = Color.white; GUI.Label(new Rect(tempBarWidth + 7f, 8f, 40f, 20f), String.Format("{0:F0} K", coreTemp), gui_text); GUI.Label(new Rect(0f + nominalXLoc - 13f, 16f, 22f, 25f), notchTexture); GUI.Label(new Rect(0f + criticalXLoc - 13f, 16f, 22f, 25f), notchTexture); GUI.Label(new Rect(nominalXLoc - 46f, 25f, 40f, 20f), String.Format("{0:F0} K", nominalTemp), gui_text); GUI.Label(new Rect(9f + criticalXLoc, 25f, 40f, 20f), String.Format("{0:F0} K", criticalTemp), gui_text); // GUI.Label(new Rect(20f+tempBarWidth, 30f, 40f, 20f), String.Format("{0:F0} K", meltdownTemp), gui_text); GUI.EndGroup(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Safety Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); reactor.CurrentSafetyOverride = GUILayout.HorizontalSlider(reactor.CurrentSafetyOverride, 700f, reactor.MaximumTemperature, GUILayout.MinWidth(150f)); GUILayout.Label(String.Format("{0:F0} K", reactor.CurrentSafetyOverride), gui_text); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Fuel Status", gui_header2, GUILayout.MaxWidth(110f), GUILayout.MinWidth(110f)); GUILayout.Label(reactor.FuelStatus, gui_text); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); }