public void powerDraw(ORSX_ResourceSuppliable pm, double power_draw) { if (power_draws.ContainsKey(pm)) { power_draw = power_draw / TimeWarp.fixedDeltaTime + power_draws[pm]; power_draws[pm] = power_draw; } else { power_draws.Add(pm, power_draw / TimeWarp.fixedDeltaTime); } }
public void update() { stored_supply = powersupply; stored_stable_supply = stable_supply; stored_resource_demand = current_resource_demand; double stored_current_demand = current_resource_demand; double stored_current_hp_demand = high_priority_resource_demand; double stored_current_charge_demand = charge_resource_demand; stored_charge_demand = charge_resource_demand; current_resource_demand = 0; high_priority_resource_demand = 0; charge_resource_demand = 0; //Debug.Log ("Early:" + powersupply); //stored power List <PartResource> partresources = my_part.GetConnectedResources(resource_name).ToList(); double currentmegajoules = 0; double maxmegajoules = 0; foreach (PartResource partresource in partresources) { currentmegajoules += partresource.amount; maxmegajoules += partresource.maxAmount; } if (maxmegajoules > 0) { resource_bar_ratio = currentmegajoules / maxmegajoules; } else { resource_bar_ratio = 0; } double missingmegajoules = maxmegajoules - currentmegajoules; powersupply += currentmegajoules; //Debug.Log ("Current:" + currentmegajoules); double demand_supply_ratio = 0; double high_priority_demand_supply_ratio = 0; if (high_priority_resource_demand > 0) { high_priority_demand_supply_ratio = Math.Min((powersupply - stored_current_charge_demand) / stored_current_hp_demand, 1.0); } else { high_priority_demand_supply_ratio = 1.0; } if (stored_current_demand > 0) { demand_supply_ratio = Math.Min( (powersupply - stored_current_charge_demand - stored_current_hp_demand) / stored_current_demand, 1.0); } else { demand_supply_ratio = 1.0; } //Prioritise supplying stock ElectricCharge resource if (String.Equals(resource_name, FNRESOURCE_MEGAJOULES) && stored_stable_supply > 0) { List <PartResource> electric_charge_resources = my_part.GetConnectedResources("ElectricCharge").ToList(); double stock_electric_charge_needed = 0; foreach (PartResource partresource in electric_charge_resources) { stock_electric_charge_needed += partresource.maxAmount - partresource.amount; } double power_supplied = Math.Min(powersupply * 1000 * TimeWarp.fixedDeltaTime, stock_electric_charge_needed); if (stock_electric_charge_needed > 0) { current_resource_demand += stock_electric_charge_needed / 1000.0 / TimeWarp.fixedDeltaTime; charge_resource_demand += stock_electric_charge_needed / 1000.0 / TimeWarp.fixedDeltaTime; } if (power_supplied > 0) { powersupply += my_part.RequestResource("ElectricCharge", -power_supplied) / 1000 / TimeWarp.fixedDeltaTime; } } //sort by power draw //var power_draw_items = from pair in power_draws orderby pair.Value ascending select pair; List <KeyValuePair <ORSX_ResourceSuppliable, double> > power_draw_items = power_draws.ToList(); power_draw_items.Sort( delegate(KeyValuePair <ORSX_ResourceSuppliable, double> firstPair, KeyValuePair <ORSX_ResourceSuppliable, double> nextPair) { return(firstPair.Value.CompareTo(nextPair.Value)); }); power_draw_list_archive = power_draw_items.ToList(); power_draw_list_archive.Reverse(); // check engines foreach (var power_kvp in power_draw_items) { ORSX_ResourceSuppliable ms = power_kvp.Key; if (ms.getPowerPriority() == 1) { double power = power_kvp.Value; current_resource_demand += power; high_priority_resource_demand += power; if (flow_type == FNRESOURCE_FLOWTYPE_EVEN) { power = power * high_priority_demand_supply_ratio; } double power_supplied = Math.Max(Math.Min(powersupply, power), 0.0); //Debug.Log (power + ", " + powersupply + "::: " + power_supplied); powersupply -= power_supplied; //notify of supply ms.receiveFNResource(power_supplied, resource_name); } } // check others foreach (var power_kvp in power_draw_items) { ORSX_ResourceSuppliable ms = power_kvp.Key; if (ms.getPowerPriority() == 2) { double power = power_kvp.Value; current_resource_demand += power; if (flow_type == FNRESOURCE_FLOWTYPE_EVEN) { power = power * demand_supply_ratio; } double power_supplied = Math.Max(Math.Min(powersupply, power), 0.0); powersupply -= power_supplied; //notify of supply ms.receiveFNResource(power_supplied, resource_name); } } // check radiators foreach (var power_kvp in power_draw_items) { ORSX_ResourceSuppliable ms = power_kvp.Key; if (ms.getPowerPriority() == 3) { double power = power_kvp.Value; current_resource_demand += power; if (flow_type == FNRESOURCE_FLOWTYPE_EVEN) { power = power * demand_supply_ratio; } double power_supplied = Math.Max(Math.Min(powersupply, power), 0.0); powersupply -= power_supplied; //notify of supply ms.receiveFNResource(power_supplied, resource_name); } } powersupply -= Math.Max(currentmegajoules, 0.0); internl_power_extract = -powersupply * TimeWarp.fixedDeltaTime; pluginSpecificImpl(); if (internl_power_extract > 0) { internl_power_extract = Math.Min(internl_power_extract, currentmegajoules); } else if (internl_power_extract < 0) { internl_power_extract = Math.Max(internl_power_extract, -missingmegajoules); } //my_part.RequestResource(this.resource_name, internl_power_extract); ORSX_Helper.fixedRequestResource(my_part, resource_name, internl_power_extract); powersupply = 0; stable_supply = 0; power_supplies.Clear(); power_draws.Clear(); }
public void powerDraw(ORSX_ResourceSuppliable pm, double power_draw) { if (power_draws.ContainsKey(pm)) { power_draw = power_draw/TimeWarp.fixedDeltaTime + power_draws[pm]; power_draws[pm] = power_draw; } else { power_draws.Add(pm, power_draw/TimeWarp.fixedDeltaTime); } }