private void PowerAllDevices() { foreach (var device in DepoweredDevices) { device.Powered = true; } DepoweredDevices.Clear(); }
/// <summary> /// Register a continuous load from a device connected to the powernet /// </summary> public void AddDevice(PowerDeviceComponent device) { Deviceloadlist.Add(device); Load += device.Load; if (!device.Powered) { DepoweredDevices.Add(device); } }
/// <summary> /// Kills a powernet after it is marked dirty and its component have already been regenerated by the powernet system /// </summary> public void DirtyKill() { Wirelist.Clear(); while (Nodelist.Count != 0) { Nodelist[0].DisconnectFromPowernet(); } Generatorlist.Clear(); Deviceloadlist.Clear(); DepoweredDevices.Clear(); PowerStorageSupplierlist.Clear(); PowerStorageConsumerlist.Clear(); RemoveFromSystem(); }
/// <summary> /// Remove a continuous load from a device connected to the powernet /// </summary> public void RemoveDevice(PowerDeviceComponent device) { if (Deviceloadlist.Contains(device)) { Load -= device.Load; Deviceloadlist.Remove(device); if (DepoweredDevices.Contains(device)) { DepoweredDevices.Remove(device); } } else { var name = device.Owner.Prototype.Name; Logger.Log(String.Format("We tried to remove a device twice from the same powernet somehow, prototype {0}", name)); } }
/// <summary> /// Combines two powernets when they connect via powertransfer components /// </summary> public void MergePowernets(Powernet toMerge) { //TODO: load balance reconciliation between powernets on merge tick here foreach (var wire in toMerge.Wirelist) { wire.Parent = this; } Wirelist.AddRange(toMerge.Wirelist); toMerge.Wirelist.Clear(); foreach (var node in toMerge.Nodelist) { node.Parent = this; } Nodelist.AddRange(toMerge.Nodelist); toMerge.Nodelist.Clear(); foreach (var generator in toMerge.Generatorlist) { Generatorlist.Add(generator.Key, generator.Value); } toMerge.Generatorlist.Clear(); foreach (var device in toMerge.Deviceloadlist) { Deviceloadlist.Add(device); } toMerge.Deviceloadlist.Clear(); DepoweredDevices.AddRange(toMerge.DepoweredDevices); toMerge.DepoweredDevices.Clear(); PowerStorageSupplierlist.AddRange(toMerge.PowerStorageSupplierlist); toMerge.PowerStorageSupplierlist.Clear(); PowerStorageConsumerlist.AddRange(toMerge.PowerStorageConsumerlist); toMerge.PowerStorageConsumerlist.Clear(); toMerge.RemoveFromSystem(); }
public void Update(float frametime) { float activesupply = Supply; float activeload = Load; float storagedemand = 0; foreach (var supply in PowerStorageConsumerlist) { storagedemand += supply.RequestCharge(); } float passivesupply = 0; float passivedemand = 0; foreach (var supply in PowerStorageSupplierlist) { passivesupply += supply.AvailableCharge(); passivedemand += supply.RequestCharge(); } //If we have enough power to feed all load and storage demand, then feed everything if (activesupply > activeload + storagedemand + passivedemand) { PowerAllDevices(); ChargeActiveStorage(); ChargePassiveStorage(); } //We don't have enough power for the storage powernet suppliers, ignore powering them else if (activesupply > activeload + storagedemand) { PowerAllDevices(); ChargeActiveStorage(); } //We require the storage powernet suppliers to power the remaining storage components and device load else if (activesupply + passivesupply > activeload + storagedemand) { PowerAllDevices(); ChargeActiveStorage(); RetrievePassiveStorage(); } //We cant afford to fund the storage components, so lets try to power the basic load using our supply and storage supply else if (activesupply + passivesupply > activeload) { PowerAllDevices(); RetrievePassiveStorage(); } //We cant even cover the basic device load, start disabling devices in order of priority until the remaining load is lowered enough to be met else if (activesupply + passivesupply < activeload) { PowerAllDevices(); //This merely makes our inevitable betrayal all the sweeter RetrievePassiveStorage(); var depowervalue = activeload - (activesupply + passivesupply); //Providers use same method to recreate functionality foreach (var device in Deviceloadlist) { device.Powered = false; DepoweredDevices.Add(device); depowervalue -= device.Load; if (depowervalue < 0) { break; } } } }