diff --git a/.gitignore b/.gitignore index 729c0934..0219dd18 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ WarpPlugin.dll *.mu *.mbm *.ogg -*.psd \ No newline at end of file +*.psd +bin diff --git a/FNPlugin/FNGenerator.cs b/FNPlugin/FNGenerator.cs index dda778f3..c5fcb898 100644 --- a/FNPlugin/FNGenerator.cs +++ b/FNPlugin/FNGenerator.cs @@ -225,7 +225,7 @@ public float getMaxPowerOutput() { } public void updateGeneratorPower() { - hotBathTemp = myAttachedReactor.getCoreTemp(); + hotBathTemp = myAttachedReactor.getThermalTemp(); maxThermalPower = myAttachedReactor.getThermalPower(); coldBathTemp = FNRadiator.getAverageRadiatorTemperatureForVessel (vessel); } diff --git a/FNPlugin/FNNozzleController.cs b/FNPlugin/FNNozzleController.cs index b138ec1b..c58ce2fd 100644 --- a/FNPlugin/FNNozzleController.cs +++ b/FNPlugin/FNNozzleController.cs @@ -308,7 +308,7 @@ public void updateIspEngineParams() { // recaculate ISP based on power and core temp available FloatCurve newISP = new FloatCurve(); FloatCurve vCurve = new FloatCurve (); - maxISP = (float)(Math.Sqrt ((double)myAttachedReactor.getCoreTemp ()) * 17.0 * ispMultiplier); + maxISP = (float)(Math.Sqrt ((double)myAttachedReactor.getThermalTemp ()) * 17.0 * ispMultiplier); if (!currentpropellant_is_jet) { minISP = maxISP * 0.4f; newISP.Add (0, maxISP, 0, 0); @@ -369,12 +369,10 @@ public bool hasStarted() { public override void OnFixedUpdate() { //tell static helper methods we are currently updating things - - + if (!myAttachedReactor.isActive()) { + myAttachedReactor.enableIfPossible(); + } if (myAttachedEngine.isOperational && myAttachedEngine.currentThrottle > 0 && myAttachedReactor != null) { - if (!myAttachedReactor.isActive()) { - myAttachedReactor.enableIfPossible(); - } updateIspEngineParams (); float curve_eval_point = (float)Math.Min (FlightGlobals.getStaticPressure (vessel.transform.position), 1.0); float currentIsp = myAttachedEngine.atmosphereCurve.Evaluate (curve_eval_point); @@ -453,7 +451,7 @@ public override void OnFixedUpdate() { if (myAttachedReactor == null && myAttachedEngine.isOperational && myAttachedEngine.currentThrottle > 0) { myAttachedEngine.Events ["Shutdown"].Invoke (); - ScreenMessages.PostScreenMessage ("Engine Shutdown: No reactor attached!", 5.0f, ScreenMessageStyle.UPPER_CENTER); + ScreenMessages.PostScreenMessage ("Engine Shutdown: No thermal power source attached!", 5.0f, ScreenMessageStyle.UPPER_CENTER); } } diff --git a/FNPlugin/FNReactor.cs b/FNPlugin/FNReactor.cs index 729ce5ff..81fdc30f 100644 --- a/FNPlugin/FNReactor.cs +++ b/FNPlugin/FNReactor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -22,11 +22,11 @@ class FNReactor : FNResourceSuppliableModule, FNThermalSource { // Persistent False [KSPField(isPersistant = false)] - public float ReactorTemp; + public float ThermalTemp; [KSPField(isPersistant = false)] public float ThermalPower; [KSPField(isPersistant = false)] - public float upgradedReactorTemp; + public float upgradedThermalTemp; [KSPField(isPersistant = false)] public float upgradedThermalPower; [KSPField(isPersistant = false)] @@ -134,7 +134,7 @@ public void ToggleReactorAction(KSPActionParam param) { public override void OnLoad(ConfigNode node) { if (isupgraded) { ThermalPower = upgradedThermalPower; - ReactorTemp = upgradedReactorTemp; + ThermalTemp = upgradedThermalTemp; reactorType = upgradedName; resourceRate = upgradedResourceRate; }else { @@ -146,7 +146,7 @@ public override void OnLoad(ConfigNode node) { public void upgradePart() { isupgraded = true; ThermalPower = upgradedThermalPower; - ReactorTemp = upgradedReactorTemp; + ThermalTemp = upgradedThermalTemp; reactorType = upgradedName; resourceRate = upgradedResourceRate; } @@ -296,8 +296,8 @@ public override void OnUpdate() { } } - public float getCoreTemp() { - return ReactorTemp; + public float getThermalTemp() { + return ThermalTemp; } public float getThermalPower() { @@ -425,8 +425,8 @@ public static double getTemperatureofHottestReactor(Vessel vess) { double temp = 0; foreach (FNReactor reactor in reactors) { if (reactor != null) { - if (reactor.getCoreTemp () > temp) { - temp = reactor.getCoreTemp (); + if (reactor.getThermalTemp () > temp) { + temp = reactor.getThermalTemp (); } } } diff --git a/FNPlugin/FNThermalHeatExchanger.cs b/FNPlugin/FNThermalHeatExchanger.cs index c4d8ad9a..9bb6a02d 100644 --- a/FNPlugin/FNThermalHeatExchanger.cs +++ b/FNPlugin/FNThermalHeatExchanger.cs @@ -82,8 +82,8 @@ public override void OnFixedUpdate() { setupThermalPower (); } - public float getCoreTemp() { - return 1500; + public float getThermalTemp() { + return 1500f; } public float getThermalPower() { @@ -102,6 +102,9 @@ public bool isActive() { return IsEnabled; } + public bool getIsThermalHeatExchanger() { + return true; + } public void enableIfPossible() { IsEnabled = true; } diff --git a/FNPlugin/FNThermalSource.cs b/FNPlugin/FNThermalSource.cs index 2411aa9d..f2608f83 100644 --- a/FNPlugin/FNThermalSource.cs +++ b/FNPlugin/FNThermalSource.cs @@ -3,12 +3,14 @@ namespace FNPlugin{ public interface FNThermalSource{ - float getCoreTemp(); + float getThermalTemp(); float getThermalPower(); bool getIsNuclear(); + bool getIsThermalHeatExchanger(); + float getRadius(); bool isActive(); diff --git a/FNPlugin/MicrowavePowerReceiver.cs b/FNPlugin/MicrowavePowerReceiver.cs index 9171e88b..20e0e565 100644 --- a/FNPlugin/MicrowavePowerReceiver.cs +++ b/FNPlugin/MicrowavePowerReceiver.cs @@ -1,276 +1,493 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine; - -namespace FNPlugin { - class MicrowavePowerReceiver : FNResourceSuppliableModule{ - [KSPField(isPersistant = false, guiActive = true, guiName = "Input Power")] - public string beamedpower; - [KSPField(isPersistant = false, guiActive = true, guiName = "Satellites Connected")] - public string connectedsats; - [KSPField(isPersistant = false, guiActive = true, guiName = "Relay Connected")] - public string connectedrelays; - [KSPField(isPersistant = false, guiActive = true, guiName = "Total Efficiency")] - public string toteff; - [KSPField(isPersistant = true)] - bool IsEnabled; - bool aIsRelay; - public float powerInput; - private int connectedsatsf = 0; - private int connectedrelaysf = 0; - private int activeCount = 0; - private static int dishcount; - private int mycount = -1; - private float totefff; - private float rangelosses; - const float angle = 3.64773814E-10f; - const float efficiency = 0.85f; - - [KSPField(isPersistant = false)] - public string animName; - [KSPField(isPersistant = false)] - public float collectorArea = 1; - - protected Animation anim; - protected int deactivate_timer = 0; - - //protected bool responsible_for_megajoulemanager; - //protected FNResourceManager megamanager; - - protected bool play_down = true; - protected bool play_up = true; - - [KSPEvent(guiActive = true, guiName = "Activate Receiver", active = true)] - public void ActivateReceiver() { - IsEnabled = true; - } - - [KSPEvent(guiActive = true, guiName = "Disable Receiver", active = true)] - public void DisableReceiver() { - IsEnabled = false; - } - - [KSPAction("Activate Receiver")] - public void ActivateReceiverAction(KSPActionParam param) { - ActivateReceiver(); - } - - [KSPAction("Disable Receiver")] - public void DisableReceiverAction(KSPActionParam param) { - DisableReceiver(); - } - - [KSPAction("Toggle Receiver")] - public void ToggleReceiverAction(KSPActionParam param) { - IsEnabled = !IsEnabled; - } - - public override void OnStart(PartModule.StartState state) { - Actions["ActivateReceiverAction"].guiName = Events["ActivateReceiver"].guiName = String.Format("Activate Receiver"); - Actions["DisableReceiverAction"].guiName = Events["DisableReceiver"].guiName = String.Format("Disable Receiver"); - Actions["ToggleReceiverAction"].guiName = String.Format("Toggle Receiver"); - - base.OnStart (state); - if (state == StartState.Editor) { return; } - this.part.force_activate(); - - anim = part.FindModelAnimators (animName).FirstOrDefault (); - if (anim != null) { - anim [animName].layer = 1; - if (connectedsatsf > 0 || connectedrelaysf > 0) { - anim [animName].normalizedTime = 1f; - anim [animName].speed = -1f; - - } else { - anim [animName].normalizedTime = 0f; - anim [animName].speed = 1f; - - } - anim.Play (); - } - - if (mycount == -1) { - mycount = dishcount; - dishcount++; - } - } - - public override void OnUpdate() { - Events["ActivateReceiver"].active = !IsEnabled; - Events["DisableReceiver"].active = IsEnabled; - Fields["toteff"].guiActive = (connectedsatsf > 0 || connectedrelaysf > 0); - - if (IsEnabled) { - if (powerInput > 1000) { - beamedpower = (powerInput/1000).ToString () + "MW"; - } else { - beamedpower = powerInput.ToString () + "KW"; - } - } else { - beamedpower = "Offline."; - } - connectedsats = connectedsatsf.ToString(); - connectedrelays = connectedrelaysf.ToString(); - toteff = totefff.ToString() + "%"; - - if (connectedsatsf > 0 || connectedrelaysf > 0) { - if (play_up) { - play_down = true; - play_up = false; - anim [animName].speed = 1f; - anim [animName].normalizedTime = 0f; - anim.Blend (animName, 2f); - } - } else { - if (play_down) { - play_down = false; - play_up = true; - anim [animName].speed = -1f; - anim [animName].normalizedTime = 1f; - anim.Blend (animName, 2f); - } - - } - } - - public override void OnFixedUpdate() { - String[] resources_to_supply = {FNResourceManager.FNRESOURCE_MEGAJOULES,FNResourceManager.FNRESOURCE_WASTEHEAT}; - this.resources_to_supply = resources_to_supply; - - base.OnFixedUpdate (); - - ConfigNode config = PluginHelper.getPluginSaveFile(); - float powerInputIncr = 0; - float powerInputRelay = 0; - int activeSatsIncr = 0; - float rangelosses = 0; - if (config != null && IsEnabled) { - if (getResourceBarRatio (FNResourceManager.FNRESOURCE_WASTEHEAT) >= 0.95) { - IsEnabled = false; - deactivate_timer++; - if (FlightGlobals.ActiveVessel == vessel && deactivate_timer > 2) { - ScreenMessages.PostScreenMessage ("Warning Dangerous Overheating Detected: Emergency microwave power shutdown occuring NOW!", 5.0f, ScreenMessageStyle.UPPER_CENTER); - } - return; - } - deactivate_timer = 0; - - //Check to see if active vessel is a relay - for now we do not want a relay to connect to another relay to prevent energy loops - String aid = vessel.id.ToString (); - if (config.HasValue (aid) == true) { - String agenType = config.GetValue (aid + "type"); - if (agenType == "relay") { - aIsRelay = true; - } else { - aIsRelay = false; - } - } - - //if (activeCount % 100 == 0) { - List vessels = FlightGlobals.Vessels; - //print(vessels.Count.ToString() + "\n"); - - //loop through vessels and attempt to add any active sattilites - foreach (Vessel vess in vessels) { - String vid = vess.id.ToString(); - String vname = vess.vesselName.ToString().ToLower(); - //print(vid + "\n"); - - //prevent adding active vessel as sat, skip calculations on debris, only add vessels with config value and line of sight to active vessel - if (vess.isActiveVessel == false && vname.IndexOf("debris") == -1 && config.HasValue(vid) == true && lineOfSightTo(vess) == true) { - String powerinputsat = config.GetValue (vid); - String vgenType = config.GetValue (vid + "type"); - // if sat is not relay/nuclear check that it has line of site to sun - // NOTE: we need to add a check for relay to check lineOfSiteToSource(vess), and if solar a lineOfSiteFromSourceToSun - to check that the source which it is relaying is still attached to it, and if it is a solar source that it is recieving solar energy - if((vgenType == "solar" && PluginHelper.lineOfSightToSun(vess)) || vgenType == "relay" || vgenType == "nuclear") { - float inputPowerFixedAlt = float.Parse (powerinputsat) * PluginHelper.getSatFloatCurve ().Evaluate ((float)FlightGlobals.Bodies [0].GetAltitude (vess.transform.position)); - float distance = (float)Vector3d.Distance (vessel.transform.position, vess.transform.position); - float powerdissip = (float)(Math.Tan (angle) * distance * Math.Tan (angle) * distance); - powerdissip = Math.Max (powerdissip/collectorArea, 1); - if (vgenType != "relay" && inputPowerFixedAlt > 0) { - rangelosses += powerdissip; - //Scale energy reception based on angle of reciever to transmitter - Vector3d direction_vector = (vess.transform.position-vessel.transform.position).normalized; - float facing_factor = Vector3.Dot (part.transform.up, direction_vector); - facing_factor = Mathf.Max (0, facing_factor); - powerInputIncr += inputPowerFixedAlt / powerdissip*facing_factor; - activeSatsIncr++; - connectedrelaysf = 0; - //print ("warp: sat added - genType: " + vgenType); - } - // only attach to one relay IF no sattilites are available for direct connection - else if(aIsRelay == false && activeSatsIncr < 1 && inputPowerFixedAlt > 0){ - rangelosses = powerdissip; - //Scale energy reception based on angle of reciever to transmitter - Vector3d direction_vector = (vess.transform.position-vessel.transform.position).normalized; - float facing_factor = Vector3.Dot (part.transform.up, direction_vector); - facing_factor = Mathf.Max (0, facing_factor); - powerInputRelay = inputPowerFixedAlt / powerdissip*facing_factor; - connectedrelaysf = 1; - activeSatsIncr = 0; - //print ("warp: relay added"); - } - } - } - } - - float atmosphericefficiency = (float) Math.Exp(-FlightGlobals.getStaticPressure(vessel.transform.position) / 5); - - if (activeSatsIncr > 0 && powerInputIncr > 0) { - this.rangelosses = rangelosses / activeSatsIncr; - totefff = efficiency * atmosphericefficiency*100/rangelosses; - powerInput = powerInputIncr * efficiency * atmosphericefficiency; - connectedsatsf = activeSatsIncr; - //print ("warp: connected sat"); - } - else if (connectedrelaysf > 0 && powerInputRelay > 0) { - this.rangelosses = rangelosses / connectedrelaysf; - totefff = efficiency * atmosphericefficiency*100/rangelosses; - powerInput = powerInputRelay * efficiency * atmosphericefficiency; - connectedsatsf = 0; - //print("warp: connected relay"); - } - else { - connectedrelaysf = 0; - connectedsatsf = 0; - powerInput = 0; - //print ("warp: no active sats or relays available"); - } - //} - }else{ - connectedrelaysf = 0; - connectedsatsf = 0; - powerInput = 0; - } - - - float powerInputMegajoules = powerInput/1000.0f; - supplyFNResource(powerInputMegajoules * TimeWarp.fixedDeltaTime,FNResourceManager.FNRESOURCE_MEGAJOULES); - float waste_head_production = powerInput/1000.0f/ efficiency * (1.0f - efficiency); - supplyFNResource (waste_head_production * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_WASTEHEAT); - //activeCount++; - } - - protected bool lineOfSightTo(Vessel vess) { - Vector3d a = vessel.transform.position; - Vector3d b = vess.transform.position; - foreach (CelestialBody referenceBody in FlightGlobals.Bodies) { - Vector3d refminusa = referenceBody.position - a; - Vector3d bminusa = b - a; - if (Vector3d.Dot(refminusa, bminusa) > 0) { - if (Vector3d.Dot(refminusa, bminusa.normalized) < bminusa.magnitude) { - Vector3d tang = refminusa - Vector3d.Dot(refminusa, bminusa.normalized) * bminusa.normalized; - if (tang.magnitude < referenceBody.Radius) { - return false; - } - } - } - } - return true; - } - } - - -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace FNPlugin { + class MicrowavePowerReceiver : FNResourceSuppliableModule, FNThermalSource { + [KSPField(isPersistant = false, guiActive = true, guiName = "Input Power")] + public string beamedpower; + [KSPField(isPersistant = false, guiActive = true, guiName = "Satellites Connected")] + public string connectedsats; + [KSPField(isPersistant = false, guiActive = true, guiName = "Relay Connected")] + public string connectedrelays; + [KSPField(isPersistant = false, guiActive = true, guiName = "Total Efficiency")] + public string toteff; + [KSPField(isPersistant = true)] + public bool IsEnabled; + bool aIsRelay; + private int connectedsatsf = 0; + private int connectedrelaysf = 0; + private int activeReceivers = 0; + private int activeThermalReceivers = 0; + private float totefff; + private float rangelosses; + const float angle = 3.64773814E-10f; + const float efficiency = 0.85f; + const float alpha = 0.00399201596806387225548902195609f; + + [KSPField(isPersistant = true)] + public float powerInput; + [KSPField(isPersistant = true)] + public float maxPowerAvailable = 0; + + [KSPField(isPersistant = false)] + public string animName; + [KSPField(isPersistant = false)] + public string animTName; + [KSPField(isPersistant = false)] + public float collectorArea = 1; + [KSPField(isPersistant = false)] + public bool isThermalReceiver = false; + [KSPField(isPersistant = false)] + public bool isInlineReceiver = false; + + + [KSPField(isPersistant = false)] + public float ThermalTemp; + [KSPField(isPersistant = false)] + public float ThermalPower; + [KSPField(isPersistant = false)] + public float radius; + + protected String maxRelaySource; + protected float maxRelaySourcePower; + + protected Animation anim; + protected Animation animT; + + protected float tTime = 0; + + protected int deactivate_timer = 0; + + //protected bool responsible_for_megajoulemanager; + //protected FNResourceManager megamanager; + + protected bool play_down = true; + protected bool play_up = true; + + [KSPEvent(guiActive = true, guiName = "Activate Receiver", active = true)] + public void ActivateReceiver() { + IsEnabled = true; + } + + [KSPEvent(guiActive = true, guiName = "Disable Receiver", active = true)] + public void DisableReceiver() { + IsEnabled = false; + } + + [KSPAction("Activate Receiver")] + public void ActivateReceiverAction(KSPActionParam param) { + ActivateReceiver(); + } + + [KSPAction("Disable Receiver")] + public void DisableReceiverAction(KSPActionParam param) { + DisableReceiver(); + } + + [KSPAction("Toggle Receiver")] + public void ToggleReceiverAction(KSPActionParam param) { + IsEnabled = !IsEnabled; + } + + public override void OnStart(PartModule.StartState state) { + Actions["ActivateReceiverAction"].guiName = Events["ActivateReceiver"].guiName = String.Format("Activate Receiver"); + Actions["DisableReceiverAction"].guiName = Events["DisableReceiver"].guiName = String.Format("Disable Receiver"); + Actions["ToggleReceiverAction"].guiName = String.Format("Toggle Receiver"); + + base.OnStart (state); + if (state == StartState.Editor) { return; } + this.part.force_activate(); + + if (isThermalReceiver) { + animT = part.FindModelAnimators (animTName).FirstOrDefault (); + if (animT != null) { + animT [animTName].layer = 1; + animT [animTName].normalizedTime = 0f; + animT [animTName].speed = 1f; + animT.Play (); + } + } + + anim = part.FindModelAnimators (animName).FirstOrDefault (); + if (anim != null) { + anim [animName].layer = 1; + if (connectedsatsf > 0 || connectedrelaysf > 0) { + anim [animName].normalizedTime = 1f; + anim [animName].speed = -1f; + + } else { + anim [animName].normalizedTime = 0f; + anim [animName].speed = 1f; + + } + anim.Play (); + } + + } + + public override void OnUpdate() { + Events["ActivateReceiver"].active = !IsEnabled; + Events["DisableReceiver"].active = IsEnabled; + Fields["toteff"].guiActive = (connectedsatsf > 0 || connectedrelaysf > 0); + + if (IsEnabled) { + if (powerInput > 1000) { + beamedpower = (powerInput/1000).ToString () + "MW"; + } else { + beamedpower = powerInput.ToString () + "KW"; + } + } else { + beamedpower = "Offline."; + } + connectedsats = connectedsatsf.ToString(); + connectedrelays = connectedrelaysf.ToString(); + toteff = totefff.ToString() + "%"; + + if (connectedsatsf > 0 || connectedrelaysf > 0) { + if (play_up) { + play_down = true; + play_up = false; + anim [animName].speed = 1f; + anim [animName].normalizedTime = 0f; + anim.Blend (animName, 2f); + } + } else { + if (play_down) { + play_down = false; + play_up = true; + anim [animName].speed = -1f; + anim [animName].normalizedTime = 1f; + anim.Blend (animName, 2f); + } + } + } + + public override void OnFixedUpdate() { + if (vessel != FlightGlobals.ActiveVessel) + { + return; + } + + String[] resources_to_supply = {FNResourceManager.FNRESOURCE_MEGAJOULES,FNResourceManager.FNRESOURCE_WASTEHEAT,FNResourceManager.FNRESOURCE_THERMALPOWER}; + this.resources_to_supply = resources_to_supply; + + base.OnFixedUpdate (); + + // get number of active receivers + activeReceivers = 0; + activeThermalReceivers = 0; + List mprs = vessel.FindPartModulesImplementing(); + foreach (MicrowavePowerReceiver mpr in mprs) { + if (mpr.IsEnabled) { + if (mpr.isThermalReceiver) { + activeThermalReceivers++; + } else { + activeReceivers++; + } + } + } + + // adjust collector area based on active receivers + float totalCollectorArea = collectorArea; + float totalThermalCollectorArea = collectorArea; + if(activeReceivers > 1){ + totalCollectorArea = 0; + foreach (MicrowavePowerReceiver mpr in mprs) { + if (mpr.IsEnabled) { + totalCollectorArea += mpr.collectorArea; + } + } + } + if(activeThermalReceivers > 1){ + totalThermalCollectorArea = 0; + foreach (MicrowavePowerReceiver mpr in mprs) { + if (mpr.IsEnabled) { + totalThermalCollectorArea += mpr.collectorArea; + } + } + } + + ConfigNode config = PluginHelper.getPluginSaveFile(); + float satInput = 0; + float relayInput = 0; + int activeSats = 0; + rangelosses = 0; + if (config != null && IsEnabled) { + if (getResourceBarRatio (FNResourceManager.FNRESOURCE_WASTEHEAT) >= 0.95 && !isThermalReceiver) { + IsEnabled = false; + deactivate_timer++; + if (deactivate_timer > 2) { + ScreenMessages.PostScreenMessage ("Warning Dangerous Overheating Detected: Emergency microwave power shutdown occuring NOW!", 5.0f, ScreenMessageStyle.UPPER_CENTER); + } + return; + } + deactivate_timer = 0; + + //Check to see if active vessel is a relay - for now we do not want a relay to connect to another relay to prevent energy loops + String aid = vessel.id.ToString (); + if (config.HasValue (aid) == true) { + String agenType = config.GetValue (aid + "type"); + if (agenType == "relay") { + aIsRelay = true; + } else { + aIsRelay = false; + } + } + + //if (activeCount % 100 == 0) { + List vessels = FlightGlobals.Vessels; + //print(vessels.Count.ToString() + "\n"); + + //loop through vessels and attempt to add any active sattilites + foreach (Vessel vess in vessels) { + String vid = vess.id.ToString (); + String vname = vess.vesselName.ToString ().ToLower (); + //print(vid + "\n"); + + //prevent adding active vessel as sat, skip calculations on debris, only add vessels with config value and line of sight to active vessel + if (vess.isActiveVessel == false && vname.IndexOf ("debris") == -1 && config.HasValue (vid) == true && lineOfSightTo (vess) == true) { + String powerinputsat = config.GetValue (vid); + String vgenType = config.GetValue (vid + "type"); + // if sat is not relay/nuclear check that it has line of site to sun + // NOTE: we need to add a check for relay to check lineOfSiteToSource(vess), and if solar a lineOfSiteFromSourceToSun - to check that the source which it is relaying is still attached to it, and if it is a solar source that it is recieving solar energy + if ((vgenType == "solar" && PluginHelper.lineOfSightToSun (vess)) || vgenType == "relay" || vgenType == "nuclear") { + float inputPowerFixedAlt = float.Parse (powerinputsat) * PluginHelper.getSatFloatCurve ().Evaluate ((float)FlightGlobals.Bodies [0].GetAltitude (vess.transform.position)); + float distance = (float)Vector3d.Distance (vessel.transform.position, vess.transform.position); + float powerdissip = (float)(Math.Tan (angle) * distance * Math.Tan (angle) * distance); + if (isThermalReceiver) { + powerdissip = Math.Max (powerdissip / totalThermalCollectorArea, 1); + } else { + powerdissip = Math.Max (powerdissip / totalCollectorArea, 1); + } + if (vgenType != "relay" && inputPowerFixedAlt > 0) { + rangelosses += powerdissip; + if (!isInlineReceiver) { + //Scale energy reception based on angle of receiver to transmitter + Vector3d direction_vector = (vess.transform.position - vessel.transform.position).normalized; + float facing_factor = Vector3.Dot (part.transform.up, direction_vector); + facing_factor = Mathf.Max (0, facing_factor); + satInput += inputPowerFixedAlt / powerdissip * facing_factor; + } else { + Vector3d direction_vector = (vess.transform.position - vessel.transform.position).normalized; + float facing_factorl = Vector3.Dot (-part.transform.right, direction_vector); + float facing_factorf = Vector3.Dot (part.transform.forward, direction_vector); + float facing_factorr = Vector3.Dot (part.transform.right, direction_vector); + float facing_factorb = Vector3.Dot (-part.transform.forward, direction_vector); + facing_factorl = Mathf.Max (0, facing_factorl); + facing_factorf = Mathf.Max (0, facing_factorf); + facing_factorr = Mathf.Max (0, facing_factorr); + facing_factorb = Mathf.Max (0, facing_factorb); + float facing_factor = facing_factorl + facing_factorf + facing_factorr + facing_factorb; + + satInput += inputPowerFixedAlt / powerdissip * facing_factor; + } + activeSats++; + } + if (aIsRelay == false && vgenType == "relay" && inputPowerFixedAlt > 0) { + rangelosses = powerdissip; + if (!isInlineReceiver) { + //Scale energy reception based on angle of receiver to transmitter + Vector3d direction_vector = (vess.transform.position - vessel.transform.position).normalized; + float facing_factor = Vector3.Dot (part.transform.up, direction_vector); + facing_factor = Mathf.Max (0, facing_factor); + relayInput = inputPowerFixedAlt / powerdissip * facing_factor; + } else { + Vector3d direction_vector = (vess.transform.position - vessel.transform.position).normalized; + float facing_factorl = Vector3.Dot (-part.transform.right, direction_vector); + float facing_factorf = Vector3.Dot (part.transform.forward, direction_vector); + float facing_factorr = Vector3.Dot (part.transform.right, direction_vector); + float facing_factorb = Vector3.Dot (-part.transform.forward, direction_vector); + facing_factorl = Mathf.Max (0, facing_factorl); + facing_factorf = Mathf.Max (0, facing_factorf); + facing_factorr = Mathf.Max (0, facing_factorr); + facing_factorb = Mathf.Max (0, facing_factorb); + float facing_factor = facing_factorl + facing_factorf + facing_factorr + facing_factorb; + + relayInput = inputPowerFixedAlt / powerdissip * facing_factor; + } + + if (relayInput > maxRelaySourcePower) { + maxRelaySourcePower = relayInput; + maxRelaySource = vid; + } else if (maxRelaySource == vid) { + maxRelaySourcePower = relayInput; + } + } + } + } + } + + float atmosphericefficiency = (float) Math.Exp(-FlightGlobals.getStaticPressure(vessel.transform.position) / 5); + + if (activeSats > 0 && satInput > 0 && satInput > maxRelaySourcePower) { + this.rangelosses = rangelosses / activeSats; + totefff = efficiency * atmosphericefficiency * 100 / rangelosses; + powerInput = satInput * efficiency * atmosphericefficiency; + if (powerInput > 0) { + maxPowerAvailable = powerInput; + } + connectedsatsf = activeSats; + connectedrelaysf = 0; + } else if (maxRelaySourcePower > 0) { + this.rangelosses = rangelosses; + totefff = efficiency * atmosphericefficiency * 100 / rangelosses; + powerInput = maxRelaySourcePower * efficiency * atmosphericefficiency; + if (powerInput > 0) { + maxPowerAvailable = powerInput; + } + connectedsatsf = 0; + connectedrelaysf = 1; + } else { + connectedrelaysf = 0; + connectedsatsf = 0; + powerInput = 0; + } + }else{ + connectedrelaysf = 0; + connectedsatsf = 0; + powerInput = 0; + } + + // equalize powerInput between active receivers + if(activeReceivers > 1 || activeThermalReceivers > 1 || (activeReceivers == 1 && activeThermalReceivers == 1)){ + float totalPower = 0; + float totalThermalPower = 0; + foreach (MicrowavePowerReceiver mpr in mprs) { + if (mpr.IsEnabled) { + if (mpr.powerInput > 0){ + if (mpr.isThermalReceiver) { + totalThermalPower += mpr.powerInput; + } else { + totalPower += mpr.powerInput; + } + } + } + } + + if (totalPower > maxPowerAvailable) { + totalPower = maxPowerAvailable; + } + if (totalThermalPower > maxPowerAvailable) { + totalThermalPower = maxPowerAvailable; + } + + float equalizedPower = totalPower/activeReceivers; + float equalizedThermalPower = totalThermalPower / activeThermalReceivers; + foreach (MicrowavePowerReceiver mpr in mprs) { + if (mpr.IsEnabled) { + if (mpr.isThermalReceiver) { + mpr.powerInput = equalizedThermalPower; + } else { + mpr.powerInput = equalizedPower; + } + } + } + print ("Power input: " + powerInput + " EP " + equalizedPower + " TP " + totalPower + " AR " + activeReceivers + " CA " + totalCollectorArea + " TCA " + totalThermalCollectorArea); + if (isThermalReceiver) { + powerInput = equalizedThermalPower; + } else { + powerInput = equalizedPower; + } + } + + + float powerInputMegajoules = powerInput/1000.0f; + + if (!isThermalReceiver) { + supplyFNResource (powerInputMegajoules * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); + float waste_head_production = powerInputMegajoules / efficiency * (1.0f - efficiency); + supplyFNResource (waste_head_production * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_WASTEHEAT); + //activeCount++; + } else { + float animateTemp = powerInputMegajoules / 3000; //3000K is max temp + if (animateTemp > 1) { + animateTemp = 1; + } + + if (animateTemp > tTime) { + tTime += 0.01f; + animT [animTName].speed = 0.01f; + animT [animTName].normalizedTime = tTime; + animT.Blend (animTName, 2f); + } else { + tTime -= 0.01f; + animT [animTName].speed = -0.01f; + animT [animTName].normalizedTime = tTime; + animT.Blend (animTName, 2f); + } + + ThermalPower = powerInputMegajoules; + float cur_thermal_power; + if (ThermalPower - 1 > 0) { + cur_thermal_power = supplyFNResource ((powerInputMegajoules-1) * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_THERMALPOWER)/TimeWarp.fixedDeltaTime; + ThermalPower = cur_thermal_power * alpha + (1.0f - alpha) * ThermalPower; + //supplyFNResource (ThermalPower - 1 * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_THERMALPOWER); + supplyFNResource (1 * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); //revise this later to only supply megajoules as needed + } else { + cur_thermal_power = supplyFNResource (powerInputMegajoules * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_THERMALPOWER)/TimeWarp.fixedDeltaTime; + ThermalPower = cur_thermal_power * alpha + (1.0f - alpha) * ThermalPower; + } + //if(ThermalPower > 3000) { ThermalTemp = 3000; } else { ThermalTemp = ThermalPower; }; + //vessel.FindPartModulesImplementing ().ForEach (fnnc => fnnc.setupPropellants ()); + } + + } + + public float getMegajoules() { + return powerInput/1000; + } + + public float getThermalTemp() { + return 3000f; + } + + public float getThermalPower() { + return ThermalPower; + } + + public bool getIsNuclear() { + return false; + } + + public bool getIsThermalHeatExchanger() { + return false; + } + + public float getRadius() { + return radius; + } + + public bool isActive() { + return IsEnabled; + } + + public void enableIfPossible() { + if (!IsEnabled) { + IsEnabled = true; + } + } + + protected bool lineOfSightTo(Vessel vess) { + Vector3d a = vessel.transform.position; + Vector3d b = vess.transform.position; + foreach (CelestialBody referenceBody in FlightGlobals.Bodies) { + Vector3d refminusa = referenceBody.position - a; + Vector3d bminusa = b - a; + if (Vector3d.Dot(refminusa, bminusa) > 0) { + if (Vector3d.Dot(refminusa, bminusa.normalized) < bminusa.magnitude) { + Vector3d tang = refminusa - Vector3d.Dot(refminusa, bminusa.normalized) * bminusa.normalized; + if (tang.magnitude < referenceBody.Radius) { + return false; + } + } + } + } + return true; + } + } + + +} diff --git a/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor125.cfg b/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor125.cfg index 78cac32e..9a50f182 100644 --- a/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor125.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor125.cfg @@ -36,12 +36,12 @@ maxTemp = 3600 MODULE { name = FNAntimatterReactor - ReactorTemp = 11600 + ThermalTemp = 11600 ThermalPower = 5000 resourceRate = 0.1385 originalName = 5GW Gas Core AM Reactor upgradedName = 15GW Plasma Core AM Reactor - upgradedReactorTemp = 242933 + upgradedThermalTemp = 242933 upgradedThermalPower = 15000 upgradeCost = 120 upgradedResourceRate = 0.4155 diff --git a/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor250.cfg b/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor250.cfg index ac83b210..0428c37e 100644 --- a/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor250.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor250.cfg @@ -36,12 +36,12 @@ maxTemp = 3600 MODULE { name = FNAntimatterReactor - ReactorTemp = 26000 + ThermalTemp = 26000 ThermalPower = 40000 resourceRate = 1.108 originalName = 40GW Gas Core AM Reactor upgradedName = 120GW Plasma Core AM Reactor - upgradedReactorTemp = 710000 + upgradedThermalTemp = 710000 upgradedThermalPower = 120000 upgradeCost = 150 upgradedResourceRate = 3.324 diff --git a/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor375.cfg b/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor375.cfg index 00484d5d..95f300d1 100644 --- a/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor375.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/AntimatterReactors/AntimatterReactor375.cfg @@ -36,12 +36,12 @@ maxTemp = 3600 MODULE { name = FNAntimatterReactor - ReactorTemp = 41000 + ThermalTemp = 41000 ThermalPower = 135000 resourceRate = 3.7395 originalName = 135GW Gas Core AM Reactor upgradedName = 405GW Plasma Core AM Reactor - upgradedReactorTemp = 1119000 + upgradedThermalTemp = 1119000 upgradedThermalPower = 405000 upgradeCost = 180 upgradedResourceRate = 11.2185 diff --git a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor125/25-25.cfg b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor125/25-25.cfg index f7df43c0..a2ca54bf 100644 --- a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor125/25-25.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor125/25-25.cfg @@ -35,10 +35,10 @@ maxTemp = 3600 MODULE { name = FNNuclearReactor - ReactorTemp = 2900 + ThermalTemp = 2900 ThermalPower = 40 resourceRate = 9.6223232E-10 - upgradedReactorTemp = 27000 + upgradedThermalTemp = 27000 upgradedThermalPower = 120 upgradedResourceRate = 2.88669696E-9 upgradedName = 120MW Gas Core Reactor diff --git a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-1500.cfg b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-1500.cfg index e307e7b8..7532c564 100644 --- a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-1500.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-1500.cfg @@ -34,10 +34,10 @@ maxTemp = 3600 MODULE { name = FNNuclearReactor - ReactorTemp = 2900 + ThermalTemp = 2900 ThermalPower = 3000 resourceRate = 7.21674276E-8 - upgradedReactorTemp = 27000 + upgradedThermalTemp = 27000 upgradedThermalPower = 7500 upgradedName = 9GW Gas Core Reactor originalName = 3GW Molten Salt Reactor diff --git a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-300.cfg b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-300.cfg index ffc84b91..4df3bdc9 100644 --- a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-300.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor1Sphere/25-300.cfg @@ -35,10 +35,10 @@ maxTemp = 3600 MODULE { name = FNNuclearReactor - ReactorTemp = 2900 + ThermalTemp = 2900 ThermalPower = 500 resourceRate = 1.202790467E-8 - upgradedReactorTemp = 27000 + upgradedThermalTemp = 27000 upgradedThermalPower = 1500 upgradedResourceRate = 3.6083714E-8 upgradedName = 1.5GW Gas Core Reactor diff --git a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor3Spheres/25-1-125.cfg b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor3Spheres/25-1-125.cfg index b387a10c..99ade1cf 100644 --- a/GameData/WarpPlugin/Parts/Electrical/NuclearReactor3Spheres/25-1-125.cfg +++ b/GameData/WarpPlugin/Parts/Electrical/NuclearReactor3Spheres/25-1-125.cfg @@ -35,10 +35,10 @@ maxTemp = 3600 MODULE { name = FNNuclearReactor - ReactorTemp = 2900 + ThermalTemp = 2900 ThermalPower = 1.5 resourceRate = 9.052503997736874E-11 - upgradedReactorTemp = 27000 + upgradedThermalTemp = 27000 upgradedThermalPower = 4.5 upgradedResourceRate = 2.71575119993210622E-10 upgradedName = 4.5MW Gas Core Reactor diff --git a/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-L.cfg b/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-L.cfg new file mode 100755 index 00000000..79eafc78 --- /dev/null +++ b/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-L.cfg @@ -0,0 +1,64 @@ +PART +{ +name = microwaveThermalEnergyReceiverL +module = Part +author = Conti + +MODEL +{ + model = WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-L +} + +scale = 1 +rescaleFactor = 1 + +node_stack_top = 0.0, 1.875, 0.0, 0.0, 1.0, 0.0 +node_stack_bottom = 0.0, -1.875, 0.0, 0.0, 1.0, 0.0 + +// --- editor parameters --- +cost = 3000 +category = Science +subcategory = 0 +title = MTER-L Microwave Thermal Receiver +manufacturer = Continuum Interplanetary +description = The MTER-L supplies thermal energy from received microwave power to thermal engines. Part must be attached directly to engine. Designed for 3.75m thermal engine parts. + +// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision +attachRules = 1,0,1,1,0 + +// --- standard part parameters --- +mass = 3.5 +dragModelType = default +maximum_drag = 0.2 +minimum_drag = 0.2 +angularDrag = 2 +crashTolerance = 7 +breakingForce = 50 +breakingTorque = 50 +maxTemp = 3000 + + +RESOURCE +{ + name = Megajoules + amount = 0 + maxAmount = 10 +} + +RESOURCE +{ + name = ThermalPower + amount = 0 + maxAmount = 10 +} + +MODULE +{ + name = MicrowavePowerReceiver + isThermalReceiver = true + isInlineReceiver = true + animTName = mterGlow + collectorArea = 2.34375015603056 //This is per FACE, the facing factor will multiply this to scale for total surface area of the cylinder. + radius = 3.75 +} +} diff --git a/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-M.cfg b/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-M.cfg new file mode 100755 index 00000000..2e278f2e --- /dev/null +++ b/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-M.cfg @@ -0,0 +1,64 @@ +PART +{ +name = microwaveThermalEnergyReceiverM +module = Part +author = Conti + +MODEL +{ + model = WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-M +} + +scale = 1 +rescaleFactor = 1 + +node_stack_top = 0.0, 1.25, 0.0, 0.0, 1.0, 0.0 +node_stack_bottom = 0.0, -1.25, 0.0, 0.0, 1.0, 0.0 + +// --- editor parameters --- +cost = 1600 +category = Science +subcategory = 0 +title = MTER-M Microwave Thermal Receiver +manufacturer = Continuum Interplanetary +description = The MTER-M supplies thermal energy from received microwave power to thermal engines. Part must be attached directly to engine. Designed for 2.5m thermal engine parts. + +// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision +attachRules = 1,0,1,1,0 + +// --- standard part parameters --- +mass = 2 +dragModelType = default +maximum_drag = 0.2 +minimum_drag = 0.2 +angularDrag = 2 +crashTolerance = 7 +breakingForce = 50 +breakingTorque = 50 +maxTemp = 3000 + + +RESOURCE +{ + name = Megajoules + amount = 0 + maxAmount = 10 +} + +RESOURCE +{ + name = ThermalPower + amount = 0 + maxAmount = 10 +} + +MODULE +{ + name = MicrowavePowerReceiver + isThermalReceiver = true + isInlineReceiver = true + animTName = mterGlow + collectorArea = 1.04166673601358 //This is per FACE, the facing factor will multiply this to scale for total surface area of the cylinder. + radius = 2.5 +} +} diff --git a/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-S.cfg b/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-S.cfg new file mode 100755 index 00000000..e9d669d3 --- /dev/null +++ b/GameData/WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-S.cfg @@ -0,0 +1,66 @@ +PART +{ +// --- general parameters --- +name = microwaveThermalEnergyReceiverS +module = Part +author = Conti + +MODEL +{ + model = WarpPlugin/Parts/Utility/MicrowaveThermalPowerReceiver/MTER-S +} + +scale = 1 +rescaleFactor = 1 + +node_stack_top = 0.0, 0.625, 0.0, 0.0, 1.0, 0.0 +node_stack_bottom = 0.0, -0.625, 0.0, 0.0, 1.0, 0.0 + +// --- editor parameters --- +cost = 800 +category = Science +subcategory = 0 +title = MTER-S Microwave Thermal Receiver +manufacturer = Continuum Interplanetary +description = The MTER-S supplies thermal energy from received microwave power to thermal engines. Part must be attached directly to engine. Designed for 1.25m engine parts. + +// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision +attachRules = 1,0,1,0,0 + +// --- standard part parameters --- +mass = 1 +dragModelType = default +maximum_drag = 0.2 +minimum_drag = 0.2 +angularDrag = 2 +crashTolerance = 7 +breakingForce = 50 +breakingTorque = 50 +maxTemp = 3000 + + +RESOURCE +{ + name = Megajoules + amount = 0 + maxAmount = 10 +} + +RESOURCE +{ + name = ThermalPower + amount = 0 + maxAmount = 10 +} + +MODULE +{ + name = MicrowavePowerReceiver + isThermalReceiver = true + isInlineReceiver = true + animTName = mterGlow + collectorArea = 0.2604166840034 //This is per FACE, the facing factor will multiply this to scale for total surface area of the cylinder. + radius = 1.25 +} + +}