示例#1
0
 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);
     }
 }
示例#2
0
        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();
        }
示例#3
0
 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);
     }
 }